{"version":3,"sources":["script.full.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","DG","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","_dereq_","css","createStyle","href","insertAt","browserify-css","2","process","toPoint","x","y","round","Point","Util","isArray","undefined","Array","prototype","reduce","callback","opt_initialValue","TypeError","index","value","isValueSet","arguments","hasOwnProperty","forEach","thisArg","T","k","kValue","O","Object","len","toString","keys","hasDontEnumBug","propertyIsEnumerable","dontEnums","dontEnumsLength","obj","prop","result","push","some","fun","map","res","filter","val","Function","bind","oThis","aArgs","slice","fToBind","fNOP","fBound","apply","concat","indexOf","searchElement","fromIndex","Math","abs","Infinity","Promise","requireModule","requirejs","registry","seen","name","deps","resolve","child","charAt","parts","split","parentBase","l","part","pop","join","_eak_seen","mod","reified","__dependency1__","__exports__","all","promises","reject","resolver","resolveAll","results","remaining","promise","isFunction","then","useNextTick","nextTick","flush","useMutationObserver","iterations","observer","BrowserMutationObserver","node","document","createTextNode","observe","characterData","data","useSetTimeout","local","setTimeout","queue","tuple","arg","asap","scheduleFlush","browserGlobal","MutationObserver","WebKitMutationObserver","configure","config","instrument","__dependency2__","polyfill","es6PromiseSupport","RSVPPromise","__dependency3__","__dependency4__","__dependency5__","__dependency6__","__dependency7__","_subscribers","invokeResolver","resolvePromise","rejectPromise","reason","invokeCallback","settled","detail","error","succeeded","failed","hasCallback","handleThenable","FULFILLED","REJECTED","subscribe","parent","onFulfillment","onRejection","subscribers","publish","_detail","resolved","objectOrFunction","fulfill","_state","PENDING","SEALED","async","publishFulfillment","publishRejection","now","race","staticResolve","staticReject","constructor","thenPromise","callbacks","catch","Date","getTime","oldDG","DgApi","DgApiCore","L","__dgApi__","version","Icon","Default","imagePath","Map","addInitHook","inited","s","m","q","createElement","getElementsByTagName","src","parentNode","insertBefore","googleAnalytics","ga","gaCode","storage","gaName","sampleRate","include","addHandler","HandlerClass","options","param","handler","_handlers","enable","Browser","touchEnabled","DomUtil","addClass","_container","handlers","chain","err","console","plugin","plugins","count","jsReg","RegExp","cssReg","checkLoading","appendJS","link","js","setAttribute","onload","onerror","onreadystatechange","readyState","appendChild","appendCSS","isJs","url","test","isCss","appendAsset","asset","ajax","handleReadyState","success","_aborted","request","noop","twoHundo","status","setHeaders","http","h","headers","Accept","defaultHeaders","accept","dataType","crossDomain","requestedWith","contentType","setRequestHeader","setCredentials","withCredentials","generalCallback","lastValue","urlappend","handleJsonp","fn","reqId","uniqid","cbkey","jsonpCallback","cbval","jsonpCallbackName","callbackPrefix","cbreg","match","script","doc","loaded","isIE10","navigator","userAgent","replace","win","type","event","htmlFor","id","head","removeChild","onclick","abort","getRequest","method","toUpperCase","processData","Ajax","toQueryString","sendWait","xhr","open","xDomainRequest","onprogress","ontimeout","send","buildParams","prefix","traditional","add","v","rbracket","setType","isCrossDomain","rurl","exec","toLowerCase","ajaxLocParts","doRequest","complete","resp","timeout","clearTimeout","_erred","filteredResponse","globalSetupOptions","dataFilter","responseText","JSON","parse","eval","responseXML","parseError","errorCode","_responseArgs","msg","requestPromise","resultPromise","ajaxLocation","byTag","xmlHttpRequest","*","xml","html","text","json","XMLHttpRequest","XDomainRequest","location","setup","trad","enc","encodeURIComponent","key","testxhr","corsSupport","ie","host","search","Wkt","toGeoJSON","$","re","substring","crs","srid","properties","white","multicoords","elem","depth","rings","stack","pointer","parseFloat","coords","item","pt","list","point","coordinates","multipoint","multilinestring","linestring","polygon","multipolygon","geometrycollection","geometry","geometries","root","shift","geoJsonLayer","opts","geoJson","_coordsToLatLngs","GeoJSON","coordsToLatLng","el","arr","coord","toLatLngs","toPoints","pointsToLatLngOnMap","wkt","parsePoints","points","containerPointToLatLng","ProjectDetector","Handler","extend","initialize","_map","_osmViewport","_project","_loadProjectList","addHooks","_projectWatch","on","removeHooks","off","getProject","getProjectsList","_projectList","isProjectHere","project","checkMethod","LatLng","LatLngBounds","latLng","latLngBounds","getSouthWest","wrap","getNorthEast","_testProjectIntersects","_testProjectContains","_loaded","_centerInProject","attributionControl","_update","_zoomInProject","_searchProject","country_code","_checkProjectData","check","bounds","domain","flags","zoom_level","min","max","time_zone","offset","fallbackProjectsList","projectsList","bound","geoJSON","getBounds","defaultPos","default_pos","lat","lon","minZoom","maxZoom","timeOffset","traffic","transport","public_transport","roads","road_network","filteredByZoom","foundProjects","mapBounds","mapCenter","getCenter","neareastProject","currentProject","distanceTo","newProject","fire","intersects","latlng","PolyUtil","inside","lng","getZoom","mergeOptions","projectDetector","Metric","Segments","getLength","getReverse","segments","getIndex","getSegRatio","sub","getSegLength","VertexTransform","Class","vertices","_vertices","_scale","_angle","_trans","_matrix","load","vertex","clone","save","setScale","scale","getScale","setAngle","angle","getAngle","setTranslation","trans","getTranslation","setMatrix","matrix","getMatrix","unScale","rotate","cos","sin","unRotate","translate","dx","dy","unTranslate","transform","b","d","statics","vt","rx","ry","vec1","vec2","sqrt","getScaled","origin","sp","x1","y1","x2","y2","getAnglesSum","angle1","angle2","getAnglesDif","ArrowPathTransform","path","_lengths","_drawings","_setPath","subPath","ax","bx","cx","angles","drawings","width","arcs","lengths","getAngles","cot","tan","reverse","fullAngle","_arcs","ArcBezier","_setAngleAndDisplacement","vL","vR","displ","pathRatio","vertexLeft","vertexRight","segIndex","segRatio","vertexIndexLeft","vertexIndexRight","drawingIndexLeft","drawingIndexRight","arc","aed","getCurveBefore","getTbyL","absSin","temp","sign","splice","getTranslatedPath","latlngs","vector","ring","j","ArrowTipTransform","shape","_setShape","pl","subShape","ComplexPath","Path","fill","fillOpacity","interactive","setOptions","_empty","_pxEmpty","_pxBounds","getEvents","zoom","weight","visibility","isShown","setStyle","toFixed","_updatePath","_renderer","_updateComplexPath","Canvas","layer","closed","_x","_y","$x","$y","ctx","_ctx","_drawnLayers","_leaflet_id","beginPath","moveTo","lineTo","bezierCurveTo","quadraticCurveTo","closePath","_fillStroke","SVG","complexPointsToPath","str","svg","Bezier","dpoints","_getDerivatives","order","_lut","getPoint","mt","mt2","t2","derivative","w_i","WEIGHT","x_i","ABSCISSA","z","sum","z2","z3","mz","mz2","mz3","b$3","b$4","c$4","curve","getCurveAfter","getLUT","steps","_setLUT3","_setLUT2","lut","bezier","TimeBezier","controlPoint1","controlPoint2","START","END","getYbyX","mid","_setLutLengths","et","dt","pow","Animation","Evented","_animID","_startTime","_running","_animation","_durations","start","stop","_prepare","_animate","_run","animation","duration","requestAnimFrame","elapsed","progress","_step","_getFrameValues","_complete","cancelAnimFrame","fr","to","frames","from","LINEAR","EASE","EASE_IN","EASE_IN_OUT","EASE_OUT","Entrance","FeatureGroup","vectors","fillColor","strokeColor","enableAnimation","autoClose","LayerGroup","_bounds","_animations","bounce","BOUNCE_ANIMATION","PATH_ANIMATION","_initArrows","_isShown","onAdd","show","onRemove","hide","events","_removeEntrance","fitBounds","_layers","eachLayer","arrow","setVisibility","setFillColor","color","setStrokeColor","base","create","distance","addLayer","entrance","fitZoom","contains","_isAllowedZoom","_getFitZoom","once","setZoom","setView","animate","SHOW_FROM_ZOOM","Popup","remove","function","Arrow","_progress","_distance","_visibility","_position","_shape","SHAPE","_apt","_att","beforeAdd","preferCanvas","ielt9","projection","lineCap","lineJoin","zoomend","moveend","viewreset","_reset","lastPoint","prevPoint","_mapToAdd","latLngToLayerPoint","_setBounds","invoke","_resetBounds","pp","apt","att","Bounds","16","17","18","19","Label","Layer","className","zIndexOffset","textDirection","_typeOfString","_defaultZIndex","content","_animated","any3d","_content","_el","_initDOM","_visible","setContent","_onViewReset","_onZoomAnimation","falseFn","offsetWidth","getPanes","tooltipPane","style","zIndex","DomEvent","disableClickPropagation","stopPropagation","_latlng","setPosition","opt","_latLngToNewLayerPoint","center","setOffset","setZIndexOffset","isNaN","innerHTML","label","Marker","bindLabel","_label","unbindLabel","_onMarkerRemove","showLabel","_mouseOverLabel","_mouseOutLabel","_dragStartLabel","_dragEndLabel","_updateLabelZIndex","hideLabel","_updatePosition","getLabel","_originalUpdateZIndex","_updateZIndex","_zIndex","_icon","getLatLng","removeLayer","isMarkerDragging","isMouseOverMarker","_labelEvents","mouseover","mousemove","mouseout","configTheme","balloonOptions","offsetX","offsetY","originalInitialize","originalInitLayout","_initLayout","originalOnAdd","graf","baron","noConflict","BaronDomHelper","element","getAttribute","removeAttribute","getStyle","border","mapControlsWidth","_headerContent","_footerContent","_scroller","_scrollerBar","_barWrapper","_baron","_isBaronExist","_popupShowClass","_popupHideClass","_popupTipClass","_tipSVGPath","_isAutoPanPaddingUserDefined","source","_popupStructure","entranceshow","_closePopup","resize","_animateOpening","_animateClosing","TRANSITION","_removeTimeout","popup","_source","_isNode","_bodyContent","update","setHeaderContent","setFooterContent","getContent","getHeaderContent","getFooterContent","clear","_clearElement","clearHeader","clearFooter","findElement","_contentNode","querySelector","_innerContainer","removeClass","closePopup","nodeName","_onCloseButtonClick","_close","mobile","geoclicker","closeOnClick","closePopupOnClick","popupWasOpen","eventPath","composedPath","target","preventDefault","closeButton","_detachEl","_closeButton","_wrapper","tip","_tipContainer","svgClass","_updateScrollPosition","scrolled","_updateLayout","scrollTop","innerHeight","maxHeight","_getDelta","_scrollerWrapper","height","_isContentHeightEnough","_initBaronScroller","_initBaron","_onScroll","_adjustPan","_bindAdjustPanOnTransitionEnd","propertyName","TRANSITION_END","autoPan","containerHeight","offsetHeight","containerWidth","_containerWidth","layerPos","_containerLeft","_containerBottom","_zoomAnimated","_add","getPosition","autoPanPadding","maxWidth","containerPos","layerPointToContainerPoint","padding","paddingTL","autoPanPaddingTopLeft","paddingBR","autoPanPaddingBottomRight","size","getSize","panBy","popupHeight","body","contentNode","scrollerWrapper","scroller","barWrapper","_switchEvents","originalEvent","_onClick","srcElement","_moving","_onStart","_moved","first","touches","_startPoint","clientX","clientY","_toggleTouchEvents","_onEnd","_onMove","newPoint","subtract","context","bar","track","selector","func","mode","_initHeader","header","_initFooter","footer","_initBodyContainer","wrapper","_clearNode","_updatePopupStructure","delta","wrapperStyle","scrolledClass","margin","availableWidth","sprawling","minWidth","whiteSpace","_insertContent","hasChildNodes","firstChild","switcher","touch","_markerClass","_markerShowClass","_markerHideClass","_dgHideClass","openPopup","setLatLng","hasLayer","_popup","_shadow","Dictionary","ru","pluralRules","en","it","cs","es","ar","Locale","argument","dictionaryMsg","exp","lang","getLang","msgIsset","defaultLang","parseInt","template","setLang","currentLang","documentElement","getAttributeNS","RoundControl","Control","includes","Mixin","Events","position","iconClass","controlClass","_controlCLass","controlIconClass","_controlIconCLass","container","_disable","_link","_renderTranslation","_toggleControl","fireEvent","setState","state","roundControl","ie9","div","Boolean","safari51","safari","wasPreviouslyDisabled","localStorage","getItem","museum","opera12","Museum","wearesorry","_element","_text","children","getContainer","setItem","disable","markersData","iconSize","iconAnchor","bounceAtZoomLimits","controlAddTo","addTo","DivIcon","createIcon","oldIcon","tagName","Element","empty","bgPos","backgroundPosition","_setIconStyles","msPointer","msPointerEnabled","msMaxTouchPoints","PointerEvent","pointerEnabled","maxTouchPoints","documentTouch","DocumentTouch","icon","divIcon","utilSetOptions","clickable","nonBubblingEvents","_initContainer","_onMouseMove","_handleMouseOut","getContext","pathInitialize","loggedGeometryTypes","Rectangle","Circle","CircleMarker","Polygon","Polyline","initMap","getBoundsZoom","setMaxZoom","_tileLayersNumber","_mapMaxZoomCache","wheelPxPerZoomLevel","metaLayers","reset","_lastMetalayer","entity","_restrictZoom","_zoom","_limitZoom","_limitCenter","maxBounds","_testAnimation","_stop","pan","animated","_tryAnimatedZoom","_tryAnimatedPan","_sizeTimer","_resetView","getTileLayersNumber","enabled","projectFrom","projectTo","_updateTileLayers","TileLayer","_isDg","_getNewBounds","screenSize","divideBy","sw","unproject","ne","mapOptions","isMapMaxZoom","dgTileLayer","baseLayer","detectRetina","retina","projectLeaveMaxZoom","maxNativeZoom","_updateZoomLevels","_fireDOMEvent","targets","keyCode","synth","_stopped","_findEventTargets","listens","eventTargets","eventTargetsMapIndex","isMarker","containerPoint","latLngToContainerPoint","mouseEventToContainerPoint","layerPoint","containerPointToLayerPoint","layerPointToLatLng","metalayer","_getCurrentMetaLayer","_fireMetalayerEvent","eventTarget","isClick","metaEntity","getHoveredObject","listener","mapEvents","dragging","tap","updateTileUrl","errorTileUrl","errorUrl","errorRuUrl","currentTilesLang","setUrl","arabicTileUrl","setPreviewUrl","arabicPreviewTileUrl","tileUrl","previewTileUrl","protocol","baseUrl","MobileTileLayer","BaseLayer","getTiles","_tiles","retinaTileServer","tileServer","arabicRetinaTileServer","arabicTileServer","previewRetinaTileServer","previewTileServer","arabicPreviewRetinaTileServer","arabicPreviewTileServer","subdomains","updateWhenIdle","previewUrl","langchange","projectchange","projectleave","tilesCheck","TilesCheck","_layer","_moveStartEventCounter","_moveEndEventCounter","_loadingEventCounter","_loadEventCounter","_mapEvents","_layerEvents","layeradd","layerremove","movestart","_stopWaiting","_isWaiting","_isMoveEnd","_checkWaiting","loading","_isLoad","_resetCounters","_checkTiles","tileZoom","_tileZoom","tiles","zoomOut","onDragEnd","Drag","_onDragEnd","_rememberTimeAndPosition","time","_lastTime","pos","_lastPos","_draggable","_absPos","_newPos","_positions","_times","_onDrag","inertia","pointReduce","_defaultPointReduce","polys","insidePoly","_inRing","inHole","isInside","pi","pj","xi","yi","xj","yj","intersect","Draggable","_simulated","_enabled","clickTolerance","_startPos","_lastTarget","SVGElementInstance","correspondingUseElement","_round","_animRequest","_lastEvent","noInertia","direction","ease","easeLinearity","speedVector","multiplyBy","speed","limitedSpeed","inertiaMaxSpeed","limitedSpeedVector","decelerationDuration","_limitOffset","noMoveStart","_previewUrl","redraw","createTile","done","tile","_tileOnLoad","_tileOnError","crossOrigin","alt","getTileUrl","_initTile","tileSize","getTileSize","pointerEvents","onselectstart","onmousemove","android","android23","WebkitBackfaceVisibility","_updateLevels","_levels","_removeTilesAtZoom","level","getPixelOrigin","_setZoomTransform","_level","pixelBounds","_getTiledPixelBounds","tileRange","_pxBoundsToTileRange","tileCenter","keepBuffer","noPruneRange","getBottomLeft","getTopRight","current","_setView","_isValidTile","_tileCoordsToKey","sort","_loading","_addTile","_needPreviewTile","_existTileFromLowerZoom","_existTilesFromHigherZoom","coords2","_floor","preview","tilePos","_getTilePos","wrapCoords","_wrapCoords","needPreview","_url","_tileReady","originalEl","replaceChild","active","_pruneTiles","_noTilesToLoad","_fadeAnimated","_getSubdomain","_getZoomForUrl","infinite","invertedY","_globalTileRange","tms","Zoom","zoomName","buttonTemplate","_zoomInButton","_createButton","_zoomIn","_zoomOutButton","_zoomOut","_updateDisabled","_originalCreateButton","args","linkActiveClass","iconActiveClass","title","zoom_in","zoom_out","dust","render","Attribution","_getLink","linkType","dictionary","copyright_logo","copyright_apilink","copyright_license","cz","cl","cy","ae","countryCode","_countryCode","_copyright","_first","getAttribution","addAttribution","osm","_osm","attribs","_attributions","prefixAndAttribs","copyright","_getAttributionHTML","_getData","work_on","work_on_with_osm","license_agreement","dir","control","attribution","Location","drawCircle","follow","stopFollowingOnDrag","metric","onLocationError","onLocationOutsideMapBounds","locateOptions","geolocation","_event","_locateOptions","watch","maximumAge","_resetVariables","click","_handleLocate","_initLocate","locationfound","_onLocationFound","locationerror","_onLocationError","_active","_isOutsideMapBounds","_stopLocate","_locateOnNextLocationFound","locate","_startFollowing","_clearError","_visualizeLocation","accuracy","_following","_stopFollowing","radius","opacity","_circle","setRadius","circle","markerClass","_marker","marker","stopLocate","clearLayers","_error","_errorText","locationControl","addControl","cant_find","you_are_here","button_title","Screenfull","_apiMap","api","_api","requestFullscreen","ALLOW_KEYBOARD_INPUT","exit","exitFullscreen","isFullscreen","fullscreenElement","isAvailable","apiMap","screenfull","Fullscreen","_isFullscreen","_toggleFullscreen","_toggle","invalidateSize","isEnabled","fullscreenchange","_onFullScreenStateChange","fullscreen","fullscreenControl","title_max","title_min","Meta","zoomOffset","eventBubbling","_currentTileKey","_currentTileData","_lastEntity","_dispatchMouseEvents","_origin","getOrigin","_disableDispatchMouseEvents","_enableDispatchMouseEvents","isPoi","_onTileLoadStart","viewprereset","_invalidateAll","_onMoveEnd","setURL","tileKey","mouseEventToLayerPoint","tileOriginPoint","tileCoord","unscaleBy","floor","mouseTileOffset","getTileKey","_getHoveredObject","getTileData","tileData","_removeAllTiles","GridLayer","_resetGrid","_animatingZoom","onTileData","currentTileData","_mouseDown","_requests","_tileStorage","dblclick","mousedown","contextmenu","mouseEvent","meta","mouseEventToLatLng","isDragging","_pointReduceHelper","noPrune","noUpdate","tileZoomChanged","Origin","clb","currentRequest","_requestData","setTileData","_performRequest","_prepareURL","poi","Poi","disableLabel","retinaPoiMetaServer","poiMetaServer","_metaLayer","poiLayerMinZoom","_processData","_currentTilesLang","_labelHelper","_layerEventsListeners","_updateUrl","getMetaLayer","arabicUrl","arabicRetinaPoiMetaServer","arabicPoiMetaServer","scaleBy","polygonLngLatToPoints","_polygonLngLatToPoints","hovers","hover","hint","links","linked","originPoint","contour","lngLat","_setCursor","cursor","Geoclicker","clickCount","pendingClick","_controller","Controller","_toggleEvents","_pause","_unpause","_checkOpenPopup","flag","_mapEventsListeners","_onMetaClick","getController","reinvokeHandler","popupclose","handlePopupClose","_singleClick","handleClick","clampHelper","lineClamp","measure","lineWidth","lineStart","lineCount","wordStart","line","lineText","wasNewLine","ce","ctn","ownerDocument","clientWidth","textContent","innerText","substr","Provider","CatalogApi","apiUrl","webApiServer","webApiVersion","_urlGeoSearch","_urlGeoGet","_urlDetails","_urlFirmsInHouse","_key","geoclickerCatalogApiKey","_geoFields","geoAdditionalFields","_firmInfoFields","firmInfoFields","getLocations","beforeRequest","types","getTypesByZoom","geoSearch","_filterResponse","firmsInHouse","houseId","parameters","params","building_id","page","getFirmInfo","firmId","fields","zoomlevel","geoGet","cancelLastRequest","_lastRequest","adm_div.settlement","adm_div.city","adm_div.division","adm_div.district","street","building","adm_div.place","attraction","selectedTypes","format","_timeoutMs","response","allowedTypes","found","_isNotFound","items","subtype","_eventHandlers","controller","view","_view","handle","tmpl","addClickEvent","_runEventHandlers","_removeClickEvent","_addEventHandler","eventClass","_clearEventHandlers","_getDirectionsUrl","ppnotLink","projectCode","rsType","_getDrilldown","object","admDivs","adm_div","admDiv","address","postcode","HandlerExample","ApiError","CityArea","_polylineStyleDefault","noClip","_polylineStyles","11","12","13","_stylesInited","_initStyles","_geometry","getPopup","_geometryZoomStyle","_getPolyStyleNum","selection","_updateGeometry","_clearPopup","_fillCityAreaObject","drilldown","purpose","mapZoom","newStyle","House","_firmsOnPage","_scrollThrottleInterval","_scrollHeightReserve","showBooklet","showPhotos","showRouteSearch","firmCard","_page","_houseObject","_firmList","_firmListObject","_firmCardObject","_isFirmlistOpen","_id","_totalPages","getCatalogApi","_initedPopupClose","_directionsUrl","_firmListLoader","initLoader","_fillHouseObject","_isRouteSearchAllowed","getMap","_firmCardSetup","renderTemplate","timezoneOffset","isMobile","showEntrance","gotoUrl","onFirmReady","_onFirmReady","onToggle","_fillFirmCardObject","FirmCard","_initPopupClose","_firmListSetup","backBtn","_showHousePopup","onFirmClick","_onFirmListClick","onShowLess","pasteLoader","_pasteLoader","firmlistItemTmpl","onListReady","_renderFirmList","_initShortFirmList","firms","_shortFirmList","List","renderList","_initFirmList","_showListPopup","_toggleEventHandlers","_fillFirmListObject","_clearAndRenderPopup","firmList","_header","btns","afterRender","firmContentObject","headerTitle","webkit","loaderWrapper","loader","_onPopupClose","throttle","_handlePopupScroll","clearList","_firmId","_initShowMore","popupObject","renderPopup","_appendFirmList","addFirms","scrollHeight","_handlePaging","_getAddressString","house","components","component","number","_fillBody","filials","branches","building_name","purpose_name","floors","ground_count","ceil","attractions","_fillHeader","_fillFooter","houseFilials","_getShowAllData","filialsCount","reference","Sight","_fillSightObject","buildingName","subtype_name","description","drillDown","_checkDescFieldHeight","showMoreText","_needShowMore","_showMoreText","_desc","desc","View","minHeight","isSmall","small","anim","_detectCssAnimation","showPopup","openOn","beforeRender","domPrefixes","elm","animationName","handlersSequence","default","apiError","_options","_catalogApi","_renderHandlerResult","_lastHandleClickArguments","handleResponse","_runHandler","findHandler","_initHandlerOnce","handlerResult","apiErrorTitle","apiErrorBody","we_have_not","noname","go_to","show_organization_in_building","show_more_about_sight","back_button","n_floors","firm","_setOptions","_firmContentObject","_schedule","Schedule","localLang","dict","_renderCardById","getSchedule","_firmData","_convertWebsite","_renderFirmCard","_renderError","_createFirmContainer","_getPaymentTypes","groupName","attribute_groups","group","attributes","attr","tag","_groupRubrics","primary","additional","rubrics","rubric","kind","contact_groups","contacts","contact","firmCardBody","schedule","forecast","paymentTypes","zoneOffset","apiLang","_buildFirmCardBody","_getConfigFirmCardBody","_fillHeaderLinks","_fillFooterButtons","firmName","_footerContainer","address_name","comment","address_comment","groups","payments","entrances","booklet","reviewData","reviews","external_content","is_reviewable","rating","review_count","DataHelper","getFlampUrl","photos","externalContent","photosLink","_events","dg-popup__button_name_firm-card-back","dg-popup__button_name_show-entrance","ent","dg-schedule__today","_onToggleSchedule","_onClose","showClass","display","option","_hasTouch","payMethods","_msgs","flampUrl","flampGoogleAnalytics","log","getProjectTime","utc","getTimezoneOffset","_firms","_eventHandlersInited","_firmCard","_createFirm","_processFirms","action","_isArray","removeFirms","newLang","_clearContainer","_removeFirm","_addFirm","firmData","domFirm","_createListItem","insertAdjacentHTML","_isEmptyObj","dg-popup__link","dg-building-callout__list-item","dg-popup__button_name_back","model","capitaliseFirstLetter","string","getHours","getMinutes","formatTime","hours","dayNum","getArrayLast","isEqual","obj1","obj2","range","step","idx","fillDefaults","sortBy","iterator","pluck","criteria","left","right","rv","getSortedTimePoints","day","deltaHours","deltaMinutes","working_hours","getTimeStamps","timePoints","timestamps","out","num","weekKeys","todayKey","tsp","setDate","getDate","setHours","setMinutes","ts","timestamp","whenOpenInverse","minHoursToDisplayClosure","dayInterval","timestampEnd","dateStart","diff","oneDay","dateEnd","setTodayString","today","periods","always","dayNow","nowIsOpen","lunch","will","willType","willWhen","when","getDay","willTill","strHours","strMinutes","till","alltime","alltimeStr","lunchStr","makeTable","column","hasLunch","dayKey","lunchMaxLength","weekKeysLocal","col","table","makeSimpleString","dayList","lunchesTime","round_the_clock","holiday","groupWorkingDays","flow","numKey","weekFullKeysLocal","firstdayOffset","lastDay","budni","localWorkingDays","everyday","holidayStr","makeAdvancedString","days","weekKeysShort","weekKeysFull","apiDifferentDays","apiScheduleDaysCount","apiDifferentDaysCount","differentWorkingHoursCount","week","evently","apiSortedDifferentDays","nowText","interval","maxHours","btnBack","btnFindWay","btnEntrance","linkReviews","linkPhoto","linkBooklet","tommorow","afterTommorow","afterWeek","nextSun","nextMon","nextTue","nextWed","nextThu","nextFri","nextSat","willOpen","willClose","isOpen","openTill","closeIn","openAt","openIn","nHours","nMins","Lunch","workingDays","weekdays","restDay","reviewsOnFlamp","writeReviewOnFlamp","payment","worksAroundTheClock","aroundTheClock","knowMore","toClose","monday","tuesday","wednesday","thursday","friday","saturday","sunday","mon","tue","wed","thu","fri","sat","sun","toLunch","lessThenHour","youCouldLate","workingTime","showAllOrgInRubric","todayIsRestDay","internet","noncash","goldcrown","dinersclub","mastercard","maestrocard","visa","cash","americanexpress","hour","less","_in","isClosingOnDinner","Traffic","period","_tileUrl","retinaTrafficTileServer","trafficTileServer","_metaUrl","retinaTrafficMetaServer","trafficMetaServer","_timeUrl","trafficTimestampServer","_updateInterval","trafficLayerUpdateInterval","_layersOptions","trafficLayerMinZoom","_isOnRequest","_onTimer","timestampString","_onAddSetParams","_getTimestampString","_removeZoomLimit","clearInterval","_updateTimer","_onMapProjectChange","_updateLang","_prepareMetaURL","getSubdomain","random","trafficData","hints","graph_id","speed_text","_updateLayerProject","setInterval","speed_unit_km_h","_trafficClass","_controlHideClass","_trafficLayer","_controlEvents","_updateControlVisibility","_showTraffic","_hideTraffic","_updateTrafficScore","_handleDom","score","_scoreRate","_getTrafficColor","projectHasTraffic","_getTrafficScore","trafficScoreServer","trafficControl","Ruler","editable","back","middle","front","mouse","_points","_layersContainer","featureGroup","_lineMouseEvents","setLatLngs","_updateDistance","getPane","createPane","getTotalDistance","_calcDistance","spliceLatLngs","oldLength","mutationStart","removed","LayeredMarker","_createPoint","iconStyles","large","_pointEvents","_addCloseHandler","_legs","_addLegs","setPointStyle","_pos","_removeLegs","collapse","_updateLegs","_normalizeRulerPoints","_lineMarkerHelper","_fireChangeEvent","addLatLng","_normalizeLatLng","getLatLngs","unshift","_morphingNow","setText","_getFormatedDistance","insertPos","_point","_hovered","_addRunningLabel","_nearestPoint","originalEv","relatedTarget","_removeRunningLabel","bringToFront","previousPoint","pane","lastElementChild","_insertPointInLine","createEvent","initMouseEvent","defaultView","dispatchEvent","createEventObject","button","bubbles","cancelable","polyline","minDistance","closestSegmentIndex","linePoints","LineUtil","pointToSegmentDistance","closestPoint","closestPointOnSegment","_unproject","_deletePoint","pointStyle","layers","circleMarker","layeredMarker","draggable","curr","newLng","currPoint","normalized","changedPoints","equals","previous","skipPrevious","drag","dragend","dragstart","_degToRad","deg","PI","_radToDeg","rad","CRS","EPSG3857","latLngToPoint","pointToLatLng","_calcAngle","point1","point2","dotProduct","mag1","mag2","acos","_calcMidPoint","latlng1","latlng2","lon1","lat1","lon2","lat2","A","B","atan2","_adaptiveSample","leftMiddle","rightMiddle","angle3","minAngle","_calcGreatCircle","latitude","pathStyles","greatCirclePoints","_clearRemovingPointLegs","newPoints","nextPoint","finishPoint","tail","calcTo","units","ruler","keyboard","riseOnHover","iconHTML","domClass","_viewport","_style","_iconCollapsed","expand","_iconNodes","spacer","_initIcon","_setPos","_afterInit","rulerRenderer","hoverRenderer","renderer","smoothFactor","vml","km","delimiter","_drawingHelper","_geoclickerNeedRestore","_startDrawing","_finishDrawing","_handleMapClick","rulerControl","body_0","chk","w","get","else","body_1","block","body_2","register","__dustBody","getPath","body_3","body_4","body_6","body_8","body_9","body_5","body_7","body_10","nx","body_12","body_11","body_13","body_14","body_22","body_15","body_16","body_17","body_18","body_19","body_21","body_20","body_23","body_24","body_25","cond","body_26","body_27","body_28","body_29","body_30","body_33","body_34","body_31","body_32","port","defaultSkin","webApiKey","regionListFields","loadProjectListTimeout","../../../dist/css/styles.full.dark.css","../../../vendors/baron","_process","dustjs-helpers","dustjs-linkedin","html5shiv","leaflet","3","styleElementsInsertedAtTop","insertStyleElement","styleElement","lastStyleElementInsertedAtTop","nextSibling","createLink","rel","cssText","extraOptions","sheet","styleSheet","4","factory","helper","_deprecated","_deprecatedCache","isSelect","__select__","getSelectState","addSelectState","newContext","rebase","isPending","isResolved","isDeferredComplete","deferreds","of","resolveSelectDeferreds","isDeferredPending","jsonFilter","truthTest","chunk","bodies","helperName","willResolve","skip","selectState","coerce","String","helpers","input","sep","last","contextDump","output","stringify","write","math","operand","select","eq","lt","lte","gt","gte","any","end","none","isFinite","5","getTemplate","nameOrTemplate","loadFromCache","isTemplateFn","cache","setError","Context","templateName","onLoad","srcOrTemplate","compile","loadSource","blocks","Stack","_isContext","getWithResolvedData","cur","down","_get","isObject","Stub","Chunk","Stream","next","taps","flushable","Tap","NONE","ERROR","WARN","INFO","DEBUG","EMPTY_FUNC","whitespace","cjs","_aliases","section","exists","notexists","partial","consoleLog","loggingLevels","message","debugLevel","env","stream","isEmpty","isEmptyObject","isThenable","isStreamable","pipe","auto","filters","escapeHtml","escapeJs","encodeURI","uc","escapeJSON","jp","makeBase","isContext","ctxThis","getTemplateName","getBlock","shiftBlocks","locals","newBlocks","emit","destEnded","go","branch","untap","await","$len","$idx","partialContext","capture","ret","thenable","errorBody","ended","thunk","stub","HCHARS","AMP","LT","GT","QUOT","SQUOT","BS","FS","CR","LS","PS","NL","LF","SQ","DQ","TB","6","addStyleSheet","lastChild","getElements","elements","html5","addElements","newElements","shivDocument","getExpandoData","expandoData","expando","expanID","supportsUnknownElements","cloneNode","saveClones","createElem","canHaveChildren","reSkip","tagUrn","frag","createDocumentFragment","elems","shivMethods","createFrag","shivCSS","supportsHtml5Styles","hasCSS","childNodes","7","expose","oldL","dest","F","proto","stamp","lastId","lock","wrapperFn","later","wrapNum","includeMax","formatNum","digits","trim","splitWords","getParamString","existingUrl","uppercase","templateRe","array","emptyImageUrl","getPrefixed","timeoutDefer","timeToCall","lastTime","requestFn","requestAnimationFrame","cancelFn","cancelAnimationFrame","immediate","props","NewClass","callInitHooks","parentProto","__super__","_initHooks","_initHooksCalled","init","_on","_off","typeListeners","newListener","listeners","_firingCount","propagate","_propagateEvent","_eventParents","addEventParent","removeEventParent","addEventListener","removeEventListener","clearAllEventListeners","addOneTimeEventListener","hasEventListeners","ua","phantomjs","chrome","gecko","opera","platform","orientation","MSPointerEvent","ie3d","webkit3d","WebKitCSSMatrix","gecko3d","L_NO_TOUCH","edge","L_DISABLE_3D","mobileWebkit","mobileWebkit3d","mobileOpera","mobileGecko","devicePixelRatio","screen","deviceXDPI","logicalXDPI","_subtract","_divideBy","_multiplyBy","_ceil","min2","max2","xIntersects","yIntersects","overlaps","xOverlaps","yOverlaps","isValid","Transformation","_a","_b","_c","_d","_transform","untransform","getElementById","currentStyle","getComputedStyle","toFront","toBack","hasClass","classList","getClass","classes","setClass","baseVal","setOpacity","_setOpacityIE","filterName","Enabled","Opacity","testProp","setTransform","TRANSFORM","_leaflet_pos","top","transition","disableTextSelection","enableTextSelection","userSelectProperty","_userSelect","disableImageDrag","enableImageDrag","preventOutline","tabIndex","restoreOutline","_outlineElement","_outlineStyle","outline","maxMargin","precision","other","Earth","wrapLatLng","toBounds","sizeInMeters","latAccuracy","lngAccuracy","southWest","northEast","sw2","ne2","_southWest","_northEast","pad","bufferRatio","heightBuffer","widthBuffer","getNorthWest","getNorth","getWest","getSouthEast","getSouth","getEast","latIntersects","lngIntersects","latOverlaps","lngOverlaps","toBBoxString","Projection","LonLat","SphericalMercator","R","MAX_LATITUDE","atan","projectedPoint","transformation","untransformedPoint","LN2","getProjectedBounds","wrapLng","wrapLat","Simple","EPSG900913","EPSG4326","fadeAnimation","markerZoomAnimation","transform3DLimit","zoomSnap","zoomDelta","trackResize","_onResize","_initEvents","setMaxBounds","_zoomBoundLayers","_sizeChanged","_addLayers","zoomIn","setZoomAround","getZoomScale","viewHalf","centerOffset","newCenter","_getBoundsCenterZoom","paddingTopLeft","paddingBottomRight","paddingOffset","swPoint","nePoint","fitWorld","panTo","_rawPanBy","_panInsideMaxBounds","setMinZoom","panInsideBounds","_enforcingBounds","oldSize","_lastCenter","newSize","oldCenter","debounceMoveend","_containerId","_mapPane","_clearControlPos","_clearHandlers","_panes","_checkIfLoaded","_getCenterLayerPoint","getPixelBounds","getMinZoom","_layersMinZoom","getMaxZoom","_layersMaxZoom","nw","se","boundsSize","snap","getScaleZoom","_size","clientHeight","topLeftPoint","_getTopLeftPoint","_pixelOrigin","getPixelWorldBounds","toZoom","fromZoom","_getMapPanePos","getMousePosition","addListener","_initPanes","_initControlPos","panes","_paneRenderers","markerPane","shadowPane","zoomChanged","_moveStart","_move","_moveEnd","_getNewPixelOrigin","pinch","_flyToFrame","_panAnim","_getZoomSpan","_targets","onOff","_handleDOMEvent","_resizeRequest","scrollLeft","isHover","_draggableMoved","_isExternalTarget","_skipped","moved","boxZoom","whenReady","pixelOrigin","topLeft","_getCenterOffset","centerPoint","viewBounds","_getBoundsOffset","newBounds","pxBounds","projectedMaxBounds","minOffset","maxOffset","_rebound","removeFrom","addInteractiveTarget","targetEl","removeInteractiveTarget","_layerAdd","removeAttribution","_addZoomLimit","oldZoomSpan","Mercator","R_MINOR","tmp","con","phi","dphi","EPSG3395","updateWhenZooming","updateInterval","noWrap","_setAutoZIndex","bringToBack","_updateOpacity","setZIndex","isLoading","move","zoomanim","_animateZoom","compare","edgeZIndex","nextFrame","willPrune","fade","_noPrune","_fadeFrame","retain","_retainParent","_retainChildren","_removeTile","animating","flyTo","_abortLoading","_setZoomTransforms","_tileSize","_wrapX","_wrapY","_animateToZoom","pixelCenter","halfSize","fragment","tileBounds","_tileCoordsToBounds","_keyToBounds","_keyToTileCoords","nwPoint","sePoint","newCoords","gridLayer","zoomReverse","_onTileRemove","noRedraw","zoomN","tilePoint","tileLayer","WMS","defaultWmsParams","service","styles","transparent","wmsParams","_crs","_wmsVersion","projectionKey","bbox","setParams","wms","ImageOverlay","_image","_initImage","styleOpts","setBounds","getElement","img","image","imageOverlay","_createIcon","createShadow","_getIconUrl","_createImg","sizeOption","anchor","shadowAnchor","marginLeft","marginTop","iconUrl","iconRetinaUrl","shadowUrl","popupAnchor","tooltipAnchor","shadowSize","_detectIconPath","riseOffset","_removeIcon","_removeShadow","oldLatLng","setIcon","bindPopup","classToAdd","addIcon","_bringToFront","_resetZIndex","newShadow","addShadow","_initInteraction","MarkerDrag","DivOverlay","_updateContent","_getAnchor","bottom","keepInView","preclick","disableScrollPropagation","_tip","_inProgress","marginBottom","_getPopupAnchor","_popupHandlersAdded","_openPopup","_movePopup","unbindPopup","togglePopup","isPopupOpen","setPopupContent","Tooltip","permanent","sticky","tooltip","closeTooltip","_setPosition","tooltipPoint","tooltipWidth","tooltipHeight","_getTooltipAnchor","openTooltip","bindTooltip","_tooltip","_initTooltipInteractions","unbindTooltip","_tooltipHandlersAdded","_moveTooltip","_openTooltip","toggleTooltip","isTooltipOpen","setTooltipContent","getTooltip","getLayerId","methodName","getLayer","getLayers","layerGroup","Renderer","_onZoom","_onAnimZoom","ev","_updateTransform","currentCenterPoint","_center","destCenterPoint","topLeftOffset","getRenderer","_getPaneRenderer","canvas","stroke","dashArray","dashOffset","fillRule","_initPath","_addPath","_removePath","_updateStyle","_bringToBack","_path","_clickTolerance","simplify","tolerance","sqTolerance","_reducePoints","_simplifyDP","p1","p2","_sqClosestPointOnSegment","ArrayConstructor","Uint8Array","markers","_simplifyDPStep","sqDist","maxSqDist","reducedPoints","prev","_sqDist","clipSegment","useLastCode","codeOut","newCode","codeA","_lastCode","_getBitCode","codeB","_getEdgeIntersection","dot","_setLatLngs","_latlngs","closestLayerPoint","minPoint","closest","jLen","_parts","halfDist","segDist","dist","ratio","_rings","_defaultShape","_convertLatLngs","_flat","flat","_projectLatlngs","projectedBounds","_clipPoints","len2","segment","_simplifyPoints","_updatePoly","clipPolygon","clippedPoints","edges","lu","_code","area","clipped","_boundsToLatLngs","rectangle","_radius","getRadius","_updateBounds","r2","_radiusY","_updateCircle","legacyOptions","_mRadius","half","latR","lngR","zoomstart","_onZoomStart","_rootGroup","_svgSize","pointsToPath","createElementNS","createSVGRect","behavior","adj","coordsize","_stroke","_fill","stroked","filled","dashStyle","endcap","joinstyle","namespaces","_draw","_updateDashArray","_removed","_requestRedraw","_redrawBounds","Number","_dashArray","_redrawRequest","_redraw","_clear","rect","clip","restore","setLineDash","globalCompositeOperation","globalAlpha","fillStyle","_prevWeight","strokeStyle","_containsPoint","_fakeStop","_fireEvent","moving","_handleMouseHover","_hoveredLayer","geojson","addData","feature","features","geometryToLayer","asFeature","defaultOptions","resetStyle","onEachFeature","_setLayerStyle","pointToLayer","coordsToLatLngs","levelsDeep","latLngToCoords","latLngsToCoords","getFeature","newGeometry","PointToGeoJSON","multi","holes","toMultiPoint","isGeometryCollection","jsons","eventsKey","originalHandler","addPointerListener","addDoubleTapListener","_filterClick","attachEvent","removePointerListener","removeDoubleTapListener","detachEvent","cancelBubble","returnValue","getBoundingClientRect","clientLeft","clientTop","_wheelPxFactor","getWheelDelta","wheelDeltaY","deltaY","deltaMode","deltaX","deltaZ","wheelDelta","_skipEvents","skipped","related","timeStamp","_lastClick","_simulatedClick","removeListener","touchstart","pointerdown","MSPointerDown","MOVE","dragStartTarget","_dragStartTarget","_preventOutline","_onDown","_dragging","shiftKey","which","_onUp","inertiaDeceleration","worldCopyJump","maxBoundsViscosity","_onDragStart","_onPreDragLimit","_onPreDragWrap","_onZoomEnd","_offsetLimit","_viscosity","pxCenter","pxWorldCenter","_initialWorldOffset","_worldWidth","_viscousLimit","threshold","limit","worldWidth","halfWidth","newX1","newX2","newX","doubleClickZoom","DoubleClickZoom","_onDoubleClick","oldZoom","scrollWheelZoom","wheelDebounceTime","ScrollWheelZoom","_onWheelScroll","_delta","debounce","_lastMousePos","_timer","_performZoom","d2","d3","d4","PosAnimation","run","newPos","_duration","_easeOutPower","_offset","_animId","_runFrame","_easeOut","_onPanTransitionStep","_onPanTransitionEnd","zoomAnimation","zoomAnimationThreshold","zoomAnimated","_createAnimProxy","_proxy","_catchTransitionEnd","proxy","mapPane","_onZoomTransitionEnd","_nothingToAnimate","getElementsByClassName","startAnim","_animateToCenter","targetCenter","targetZoom","s1","s2","w1","w0","t1","rho2","u1","b1","sq","sinh","cosh","tanh","r0","rho","easeOut","frame","S","startZoom","flyToBounds","_touchstart","_touchend","onTouchStart","_pointersCount","doubleTap","delay","onTouchEnd","newTouch","pre","touchend","POINTER_DOWN","POINTER_MOVE","POINTER_UP","POINTER_CANCEL","TAG_WHITE_LIST","_pointers","_addPointerStart","_addPointerMove","_addPointerEnd","onDown","pointerType","MSPOINTER_TYPE_MOUSE","_handlePointer","_pointerDocListener","pointerUp","_globalPointerUp","_globalPointerDown","_globalPointerMove","pointerId","changedTouches","onMove","buttons","onUp","touchZoom","TouchZoom","_onTouchStart","_zooming","_centerPoint","_startLatLng","_pinchStartLatLng","_startDist","_startZoom","_onTouchMove","_onTouchEnd","moveFn","tapTolerance","_fireClick","_holdTimeout","_isTapValid","_simulateEvent","touchmove","simulatedEvent","screenX","screenY","BoxZoom","_pane","overlayPane","_onMouseDown","_resetState","mouseup","_onMouseUp","keydown","_onKeyDown","_box","_finish","boxZoomBounds","keyboardPanDelta","Keyboard","keyCodes","up","_setPanDelta","_setZoomDelta","focus","_onFocus","blur","_onBlur","_addHooks","_removeHooks","_focused","docEl","scrollTo","panDelta","_panKeys","codes","_zoomKeys","altKey","ctrlKey","metaKey","_oldLatLng","shadow","iconPos","removeControl","corner","_controlCorners","_refocusOnMap","createCorner","vSide","hSide","corners","_controlContainer","zoomInText","zoomInTitle","zoomOutText","zoomOutTitle","_disabled","zoomControl","setPrefix","Scale","imperial","_addScales","_mScale","_iScale","maxMeters","_updateScales","_updateMetric","_updateImperial","meters","_getRoundNum","_updateScale","maxMiles","miles","feet","maxFeet","pow10","Layers","collapsed","autoZIndex","hideSingleBase","baseLayers","overlays","_lastZIndex","_handlingClick","_addLayer","_checkDisabledLayers","_onLayerChange","addBaseLayer","addOverlay","_getLayer","_form","acceptableHeight","offsetTop","form","mouseenter","mouseleave","_layersLink","_onInputClick","_baseLayersList","_separator","_overlaysList","overlay","baseLayersPresent","overlaysPresent","baseLayersCount","_addItem","_createRadioElement","checked","radioHtml","radioFragment","defaultChecked","layerId","holder","inputs","addedLayers","removedLayers","disabled","_expand","_collapse","_defaultLocateOptions","_handleGeolocationError","onResponse","_handleGeolocationResponse","onError","_locationWatchId","watchPosition","getCurrentPosition","clearWatch","longitude","8","defaultSetTimout","defaultClearTimeout","runTimeout","cachedSetTimeout","runClearTimeout","cachedClearTimeout","cleanUpNextTick","draining","currentQueue","queueIndex","drainQueue","Item","browser","argv","versions","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","umask","9","manageEvents","eventManager","scroll","_pos0","each","manageAttr","attrName","validate","eventName","jQuery","crossPos","crossSize","client","crossClient","crossOffset","offsetPos","scrollSize","roots","jQueryMode","localParams","dispose","_chain","getNode","sel","setBarSize","barMinSize","posBar","barTopLimit","relToPos","posToRel","dontPosSelect","barPos","scrollerPos0","resizePauseTimer","scrollPauseTimer","pause","scrollLastFire","resizeLastFire","clipper","barOnCls","rpos","free","barOn","upd","freeze","newBarSize","oldBarSize","names","userArg","fix","userParams","fixElement","viewPortSize","minView","outside","bubbleWheel","initWebKitWheelEvent","wheelDeltaX","_params","headerTops","topFixHeights","topRealHeights","limiter","before","after","past","future","fixState","hTop","fixFlag","change","updParams","controls","forward","backward","xBar","pull","getContentSize","getScrollerSize","force","toggle","_interval","op4","scrollInProgress","_insistence","property","inProgress","onCollapse","_waiting","onExpand","_onExpandCalled","_zeroXCount","waiting"],"mappings":"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","file":"script.full.js","sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.DG = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(_dereq_,module,exports){\nvar css = \".leaflet-image-layer,.leaflet-layer,.leaflet-map-pane canvas,.leaflet-map-pane svg,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane,.leaflet-tile,.leaflet-tile-container,.leaflet-zoom-box{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden;outline:0;font:12px/1.5 \\\"Helvetica Neue\\\",Arial,Helvetica,sans-serif}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile{-webkit-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-drag{-ms-touch-action:none;touch-action:none}.leaflet-tile{-webkit-filter:inherit;filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:800;border:2px dotted #38f;background:rgba(255,255,255,.5)}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto;float:left;clear:both}.leaflet-bottom,.leaflet-top{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-right .leaflet-control{float:right;margin-right:10px}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-fade-anim .leaflet-tile{will-change:opacity}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.leaflet-zoom-anim .leaflet-zoom-animated{will-change:transform;-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1),-webkit-transform .25s cubic-bezier(0,0,.25,1)}.leaflet-pan-anim .leaflet-tile,.leaflet-zoom-anim .leaflet-tile{-webkit-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-control,.leaflet-popup-pane{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}.leaflet-image-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-image-layer.leaflet-interactive,.leaflet-marker-icon.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container a{color:#0078A8}.leaflet-container a.leaflet-active{outline:orange solid 2px}.leaflet-bar{-webkit-box-shadow:0 1px 5px rgba(0,0,0,.65);box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:700 18px 'Lucida Console',Monaco,monospace;text-indent:1px}.leaflet-control-zoom-out{font-size:20px}.leaflet-touch .leaflet-control-zoom-in{font-size:22px}.leaflet-touch .leaflet-control-zoom-out{font-size:24px}.leaflet-control-layers{-webkit-box-shadow:0 1px 5px rgba(0,0,0,.4);box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(dist/css/images/layers.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(dist/css/images/layers-2x.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(dist/css/images/marker-icon.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,.7);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;background:#fff;background:rgba(255,255,255,.5)}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers{-webkit-box-shadow:none;box-shadow:none}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-layers{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center}.dg-schedule__string,.leaflet-popup-content-wrapper,[class^=dg-] caption,[class^=dg-] th{text-align:left}.leaflet-popup-tip-container{width:40px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;-webkit-box-shadow:0 3px 14px rgba(0,0,0,.4);box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{border:none;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;background:0 0}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-oldie .leaflet-popup-content-wrapper{zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:\\\"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)\\\";filter:progid:DXImageTransform.Microsoft.Matrix(M11=.70710678, M12=.70710678, M21=-.70710678, M22=.70710678)}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.4);box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-clickable{cursor:pointer;pointer-events:auto}.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before,.leaflet-tooltip-top:before{position:absolute;pointer-events:none;border:6px solid transparent;background:0 0;content:\\\"\\\"}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}[class^=dg-],[class^=dg-]:after,[class^=dg-]:before{-webkit-box-sizing:content-box;box-sizing:content-box;margin:0;padding:0;vertical-align:baseline;font-weight:inherit;font-style:inherit;font-size:1em;font-family:inherit;line-height:1.2}[class^=dg-]>[class^=dg-]:last-child{margin-bottom:0}[class^=dg-] abbr,[class^=dg-] fieldset,[class^=dg-] img{border:0}[class^=dg-] blockquote,[class^=dg-] q{quotes:none}[class^=dg-] blockquote:after,[class^=dg-] blockquote:before,[class^=dg-] q:after,[class^=dg-] q:before{content:'';content:none}[class^=dg-] ol,[class^=dg-] ul{list-style:none}[class^=dg-] table{border-spacing:0;border-collapse:collapse}[class^=dg-] td,[class^=dg-] th{vertical-align:middle}[class^=dg-] button::-moz-focus-inner,[class^=dg-] input::-moz-focus-inner{padding:0;border:0}.dg-label{position:absolute;top:0;left:0;max-width:none;max-height:none;width:300px;-webkit-user-select:none;-ms-user-select:none;user-select:none}.dg-label__content{display:inline-block;overflow:hidden;padding:3px 7px;min-width:30px;max-width:300px;width:auto;border-width:1px;border-style:solid;border-radius:2px;vertical-align:top;font-size:12px;border-color:#323232;border-color:rgba(50,50,50,.85);background:#323232;background:rgba(50,50,50,.85);color:#ffd26e}.leaflet-top .dg-label_name_location-error{top:5px}.leaflet-right .dg-label_name_location-error{right:40px;left:auto;text-align:right}.leaflet-bottom .dg-label_name_location-error{top:4px}.leaflet-left .dg-label_name_location-error{left:40px}.leaflet-popup{margin-bottom:0}.leaflet-popup-tip-container{height:0}.leaflet-popup-content-wrapper{overflow:hidden;padding:0;min-width:60px;min-height:50px;border:0;border-radius:3px;-webkit-box-shadow:none;box-shadow:none;color:#e6e6e6;font-size:14px;-webkit-transition:opacity ease-out .2s,max-height ease-out .2s,height ease-out .2s;transition:opacity ease-out .2s,max-height ease-out .2s,height ease-out .2s;-webkit-transform-origin:50% 100%;-ms-transform-origin:50% 100%;transform-origin:50% 100%;background:rgba(50,50,50,.9)}.leaflet-popup-content-wrapper:before{float:right;width:30px;height:17px;content:''}.leaflet-popup-content{position:relative;margin:16px;width:auto;line-height:1.4}.leaflet-popup a{outline:0}.leaflet-popup-content p{margin:0}.leaflet-popup-scrolled{overflow:visible;border:0}.leaflet-popup-inner{position:relative;z-index:0}.leaflet-popup_show_true{-webkit-transition:opacity ease-in-out .2s,height ease-out .2s,-webkit-transform ease-in-out .2s;transition:opacity ease-in-out .2s,height ease-out .2s,-webkit-transform ease-in-out .2s;transition:transform ease-in-out .2s,opacity ease-in-out .2s,height ease-out .2s;transition:transform ease-in-out .2s,opacity ease-in-out .2s,height ease-out .2s,-webkit-transform ease-in-out .2s;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.leaflet-popup_show_false{opacity:0!important;-webkit-transition:all ease-in-out .1s;transition:all ease-in-out .1s;-webkit-transform:scale(.2);-ms-transform:scale(.2);transform:scale(.2)}.leaflet-popup_preloader_true{width:384px;height:52px}.leaflet-map-pane .leaflet-popup-tip-container{position:absolute;top:auto;bottom:0;left:50%;margin-left:-29px;width:58px;height:47px;background-repeat:no-repeat;-webkit-transform:translateY(47px);-ms-transform:translateY(47px);transform:translateY(47px);pointer-events:none}.leaflet-popup-tip{display:none}.leaflet-popup-tip-container_svg{background-repeat:no-repeat;background-image:url(https://maps.api.2gis.ru/2.0/img/DGPopup__popupShadow.png);background-position:50% 95%;background-size:36px 12px}.leaflet-retina .leaflet-popup-tip-container_svg{background-image:url(https://maps.api.2gis.ru/2.0/img/DGPopup__popupShadow@2x.png)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:3px;right:3px;z-index:1;overflow:hidden;padding:0;width:30px;height:30px;text-align:center;font-weight:400;font-size:18px;line-height:30px;cursor:pointer}.no-touch .leaflet-container a.leaflet-popup-close-button:hover{border-radius:2px;-webkit-transition:all .2s;transition:all .2s;background-color:#222;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.5);box-shadow:0 1px 3px rgba(0,0,0,.5)}.leaflet-container a.leaflet-popup-close-button:active{color:#777}.leaflet-container a.leaflet-popup-close-button:after{position:absolute;z-index:2;content:'';top:-3px;right:-5px;width:40px;height:40px}.leaflet-popup-tip-container_image{background-repeat:no-repeat;background-image:url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2258%22%20height%3D%2247%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M0%200c12.643%200%2028%207.115%2028%2044h2c0-36.885%2015.358-44%2028-44h-58z%22%20fill%3D%22rgba(50%2C50%2C50%2C.9)%22%3E%3C%2Fpath%3E%0A%3C%2Fsvg%3E%0A')}.leaflet-map-pane .leaflet-popup-tip-container_svg{fill:rgba(50,50,50,.9)}.dg-wrapper{position:relative;overflow:hidden}.dg-scroller{height:100%;overflow-y:scroll;border:0}.dg-scroller::-webkit-scrollbar{width:0}.dg-scroller__bar{z-index:1;right:0;background:#999}.dg-scroller__bar_h{bottom:2px;height:8px}.dg-header__title{width:100%;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;background:#999}.dg-header__title_state_fixed{position:absolute;z-index:1}.dg-scroller_hidden_true{overflow:auto}.dg-scroller__wrapper{position:relative;overflow:hidden}.dg-scroller__bar-wrapper{position:absolute;top:18px;right:3px;bottom:4px;width:7px;border-radius:5px}.dg-scroller_hidden_true .dg-scroller__bar-wrapper{visibility:hidden}.dg-popup__header+.dg-popup__container-wrapper .dg-scroller__bar-wrapper{top:4px}.dg-scroller__bar{position:absolute;min-height:20px;width:7px;border-radius:3px;pointer-events:auto}.leaflet-popup-scrolled .dg-popup__footer:before,.leaflet-popup-scrolled .dg-popup__header:after{display:block;width:100%;height:1px;content:''}.scroller__bar-wrapper .scroller__bar{background-color:#665b4f}.scroller__bar-wrapper:hover .scroller__bar{background-color:#897a6b}.dg-popup__container{margin:0}.leaflet-popup-scrolled .dg-popup__container{padding:8px 14px 8px 0}.dg-popup__header{position:relative;padding-bottom:12px}.leaflet-popup-scrolled .dg-popup__header:after{position:relative;top:12px}.dg-popup__footer{position:relative;bottom:0;overflow:hidden}.dg-popup_hidden_true{display:none}.leaflet-popup-scrolled .dg-popup__footer:before,.leaflet-popup-scrolled .dg-popup__header:after{border-bottom:1px solid #636363;background-color:#494949}.dg-control-round{position:relative;padding:5px;width:30px;height:30px;border-radius:50%;cursor:default}.dg-control-round__icon{position:relative;display:block;width:30px;height:30px;border-radius:50%;background-color:#f0f0f0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),to(#e0e0e0));background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);color:#2b2a29;text-align:center;text-decoration:none;text-shadow:0 1px 0 #fff;font-size:22px;line-height:30px;cursor:pointer}.no-touch .dg-control-round__icon:hover{background-color:#f5f5f5;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ebebeb),to(#fff));background-image:-webkit-linear-gradient(top,#ebebeb 0,#fff 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#fff 100%)}.dg-control-round__icon:active,.dg-control-round__icon_state_active,.no-touch .dg-control-round__icon:active{background-color:#ebebeb;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#d6d6d6),to(#fff));background-image:-webkit-linear-gradient(top,#d6d6d6 0,#fff 100%);background-image:linear-gradient(to bottom,#d6d6d6 0,#fff 100%)}.leaflet-touch .dg-control-round__icon:before{position:absolute;top:-10px;right:-15px;bottom:-10px;left:-15px;content:''}.dg-control-round_is-hidden_true{display:none}.dg-control-round{background-color:#3d3d3d;-webkit-box-shadow:0 3px 5px 0 rgba(0,0,0,.3);box-shadow:0 3px 5px 0 rgba(0,0,0,.3)}.dg-control-round__icon{-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,.4);box-shadow:0 2px 2px 0 rgba(0,0,0,.4)}.no-touch .dg-control-round__icon:hover{-webkit-box-shadow:inset 0 1px #fff,0 0 0 1px rgba(0,0,0,.3),0 1px 0 1px rgba(0,0,0,.4);box-shadow:inset 0 1px #fff,0 0 0 1px rgba(0,0,0,.3),0 1px 0 1px rgba(0,0,0,.4)}.dg-control-round__icon:active,.dg-control-round__icon_state_active,.no-touch .dg-control-round__icon:active{-webkit-box-shadow:inset 0 1px 1px 1px rgba(0,0,0,.2),0 0 0 1px rgba(0,0,0,.3),0 -1px 1px 0 #000;box-shadow:inset 0 1px 1px 1px rgba(0,0,0,.2),0 0 0 1px rgba(0,0,0,.3),0 -1px 1px 0 #000}.leaflet-disabled .dg-control-round__icon,.leaflet-disabled .dg-control-round__icon:active,.no-touch .leaflet-disabled .dg-control-round__icon:hover{background-image:none;cursor:default;background-color:#b8b8b8;-webkit-box-shadow:none;box-shadow:none}.dg-museum{position:absolute;top:0;left:0;right:0;z-index:1500;padding:4px 5px 8px;background:#333;color:#fff;opacity:.97;text-align:center}.dg-museum-browser{position:relative;top:4px;display:inline-block;width:16px;height:16px;margin:0 4px;background:url(https://maps.api.2gis.ru/2.0/img/DGMuseum.jpg) left top no-repeat}.dg-museum__chrome{background-position:0 0}.dg-museum__chrome:hover{background-position:0 -16px}.dg-museum__firefox{background-position:-16px 0}.dg-museum__firefox:hover{background-position:-16px -16px}.dg-museum__safari{background-position:-32px 0}.dg-museum__safari:hover{background-position:-32px -16px}.dg-museum__opera{width:15px;background-position:-48px 0}.dg-museum__opera:hover{background-position:-48px -16px}.dg-museum__ie{width:17px;background-position:-63px 0}.dg-museum__ie:hover{background-position:-63px -16px}.dg-museum__close{display:inline-block;margin:0 4px;width:9px;height:9px;background:url(https://maps.api.2gis.ru/2.0/img/DGMuseum_close.gif) top left no-repeat;cursor:pointer}.dg-museum__close:hover{opacity:.6}.leaflet-container{z-index:0;background:#f7f3df;cursor:default}.leaflet-container:-webkit-full-screen{width:100%!important;height:100%!important}.leaflet-container:-ms-fullscreen{width:100%!important;height:100%!important}.leaflet-container:fullscreen{width:100%!important;height:100%!important}.leaflet-dragging,.leaflet-dragging .leaflet-clickable,.leaflet-dragging .leaflet-container{cursor:move}.leaflet-control a,.leaflet-control a:focus{outline:0!important}.leaflet-container .leaflet-control-attribution{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.dg-customization__marker{background-repeat:no-repeat}.dg-customization__marker:before{position:absolute;top:0;left:0;width:100%;height:100%;background-image:inherit;background-size:contain;background-repeat:no-repeat;-webkit-transition:opacity ease-in-out .2s,-webkit-transform ease-in-out .2s;transition:opacity ease-in-out .2s,-webkit-transform ease-in-out .2s;transition:opacity ease-in-out .2s,transform ease-in-out .2s;transition:opacity ease-in-out .2s,transform ease-in-out .2s,-webkit-transform ease-in-out .2s;-webkit-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);-webkit-transform-origin:50% 100%;-ms-transform-origin:50% 100%;transform-origin:50% 100%}.dg-customization__marker_type_mushroom{background-repeat:no-repeat;background-image:url(https://maps.api.2gis.ru/2.0/img/DGCustomization__marker.png);background-size:22px 34px;width:22px;height:34px;-webkit-transform-origin:50% 100%;-ms-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-animation:dg-customization__show-marker .2s;animation:dg-customization__show-marker .2s}.leaflet-retina .dg-customization__marker_type_mushroom{background-image:url(https://maps.api.2gis.ru/2.0/img/DGCustomization__marker@2x.png)}.dg-customization__marker_type_mushroom:focus{outline:0}.no-touch .dg-customization__marker_type_mushroom:hover{background-repeat:no-repeat;background-image:url(https://maps.api.2gis.ru/2.0/img/DGCustomization__markerHover.png);background-size:22px 34px}.leaflet-retina .no-touch .dg-customization__marker_type_mushroom:hover{background-image:url(https://maps.api.2gis.ru/2.0/img/DGCustomization__markerHover@2x.png)}.dg-customization__marker_type_mushroom:active,.no-touch .dg-customization__marker_type_mushroom:active{background-repeat:no-repeat;background-image:url(https://maps.api.2gis.ru/2.0/img/DGCustomization__markerActive.png);background-size:22px 34px}.leaflet-retina .dg-customization__marker_type_mushroom:active,.leaflet-retina .no-touch .dg-customization__marker_type_mushroom:active{background-image:url(https://maps.api.2gis.ru/2.0/img/DGCustomization__markerActive@2x.png)}@-webkit-keyframes dg-customization__show-marker{from{opacity:0}to{opacity:1}}@keyframes dg-customization__show-marker{from{opacity:0}to{opacity:1}}.dg-customization__marker_appear{background-position:999px}.dg-customization__marker_appear:before{content:''}.dg-customization__marker_disappear{background-position:999px;pointer-events:none}.dg-customization__marker_disappear:before{visibility:hidden;content:'';opacity:0;-webkit-transform:scale(1.2,1.8);-ms-transform:scale(1.2,1.8);transform:scale(1.2,1.8);-webkit-animation:dg-customization__marker-to-callout .2s;animation:dg-customization__marker-to-callout .2s}@-webkit-keyframes dg-customization__marker-to-callout{0%{visibility:visible;opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1)}100%{visibility:visible;opacity:0;-webkit-transform:scale(1.2,1.8);transform:scale(1.2,1.8)}}@keyframes dg-customization__marker-to-callout{0%{visibility:visible;opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1)}100%{visibility:visible;opacity:0;-webkit-transform:scale(1.2,1.8);transform:scale(1.2,1.8)}}.dg-dragging-false{touch-action:auto;-ms-touch-action:auto}.dg-zoom{width:40px;height:74px}.dg-zoom__in{position:absolute;top:0;left:0}.leaflet-touch .dg-zoom__in:before{position:absolute;top:-5px;right:-10px;bottom:0;left:-10px;content:''}.dg-zoom__in:after{position:absolute;right:0;bottom:-1px;left:0;z-index:-1;margin:auto;width:12px;height:2px;-webkit-box-shadow:0 0 3px 2px rgba(0,0,0,.3);box-shadow:0 0 3px 2px rgba(0,0,0,.3);content:''}.dg-zoom__button_type_in:after,.dg-zoom__button_type_in:before,.leaflet-touch .dg-zoom__button_type_in:before{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;width:14px;height:2px;background-color:#7a7a7a;-webkit-box-shadow:0 1px #fff;box-shadow:0 1px #fff;content:''}.dg-zoom__button_type_in:after{width:2px;height:14px}.no-touch .dg-zoom__button_type_in:hover:after,.no-touch .dg-zoom__button_type_in:hover:before{background-color:#616161}.dg-zoom__button_type_in:active:after,.dg-zoom__button_type_in:active:before,.no-touch .dg-zoom__button_type_in:active:after,.no-touch .dg-zoom__button_type_in:active:before{background-color:#575757}.leaflet-disabled .dg-zoom__button_type_in:active:after,.leaflet-disabled .dg-zoom__button_type_in:active:before,.leaflet-disabled .dg-zoom__button_type_in:after,.leaflet-disabled .dg-zoom__button_type_in:before,.no-touch .leaflet-disabled .dg-zoom__button_type_in:hover:after,.no-touch .leaflet-disabled .dg-zoom__button_type_in:hover:before{-webkit-box-shadow:none;box-shadow:none}.dg-zoom__out{position:absolute;top:40px;right:0;left:0;margin:auto;width:22px;height:22px}.dg-zoom__out:after{position:absolute;top:-1px;right:0;left:0;margin:auto;width:12px;height:2px;content:''}.dg-zoom__button_type_out{width:22px;height:22px}.leaflet-touch .dg-zoom__button_type_out:before{top:-5px;right:-19px;bottom:-19px;left:-19px}.dg-control-round__icon_name_fullscreen:after,.dg-control-round__icon_name_locate:after,.dg-zoom__button_type_out:after{top:0;right:0;left:0;margin:auto;content:'';bottom:0}.dg-zoom__button_type_out:after{position:absolute;width:10px;height:2px;background:#7a7a7a;-webkit-box-shadow:0 1px #fff;box-shadow:0 1px #fff}.no-touch .dg-zoom__button_type_out:hover:after{background:#616161}.dg-zoom__button_type_out:active:after,.no-touch .dg-zoom__button_type_out:active:after{background:#575757}.leaflet-disabled .dg-zoom__button_type_out:active:after,.leaflet-disabled .dg-zoom__button_type_out:after,.no-touch .leaflet-disabled .dg-zoom__button_type_out:hover:after{-webkit-box-shadow:none;box-shadow:none}.dg-zoom__out{-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.3);box-shadow:0 2px 3px 0 rgba(0,0,0,.3)}.dg-zoom__out:after{background-color:#3d3d3d}.leaflet-disabled .dg-zoom__button_type_in:active:after,.leaflet-disabled .dg-zoom__button_type_in:active:before,.leaflet-disabled .dg-zoom__button_type_in:after,.leaflet-disabled .dg-zoom__button_type_in:before,.leaflet-disabled .dg-zoom__button_type_out:active:after,.leaflet-disabled .dg-zoom__button_type_out:after,.no-touch .leaflet-disabled .dg-zoom__button_type_in:hover:after,.no-touch .leaflet-disabled .dg-zoom__button_type_in:hover:before,.no-touch .leaflet-disabled .dg-zoom__button_type_out:hover:after{background-color:#707070}.dg-attribution{background-color:transparent!important}.dg-attribution__copyright{margin:0 55px 5px 0;text-align:right;white-space:nowrap;font-size:9px;font-family:Helvetica,Arial,sans-serif}.dg-attribution__links{display:inline-block;margin:0;padding:0 5px 0 0}.dg-attribution__link-item{padding:0;list-style-type:none}.leaflet-container .dg-attribution__link{background:-webkit-gradient(linear,left top,right top,from(rgba(8,8,8,.3)),to(rgba(8,8,8,.3))) 0 95%/10px 1px repeat-x;background:-webkit-linear-gradient(left,rgba(8,8,8,.3),rgba(8,8,8,.3) 100%) 0 95%/10px 1px repeat-x;background:linear-gradient(to right,rgba(8,8,8,.3),rgba(8,8,8,.3) 100%) 0 95%/10px 1px repeat-x;color:#333;text-decoration:none;font-size:9px;font-family:Helvetica,Arial,sans-serif;cursor:pointer}.leaflet-container .dg-attribution__link:hover{background-image:-webkit-gradient(linear,left top,right top,from(#080808),to(#080808));background-image:-webkit-linear-gradient(left,#080808,#080808 100%);background-image:linear-gradient(to right,#080808,#080808 100%);color:#333;text-decoration:none}.dg-attribution__logo-url{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2224%22%20width%3D%2255%22%3E%0A%20%3Cpath%20fill%3D%22%23a2c124%22%20d%3D%22m24.395%2012c0-1.4545-0.22177-2.6545-0.66532-4-0.14785%204.2545-4.879%207.8182-7.4664%2010h6.7641c0.70229-2%201.3676-3.9273%201.3676-6m-4.731-9.3455c-2.033-1.6-4.62-2.6545-7.466-2.6545-6.7276%200-12.198%205.4182-12.198%2012s5.4704%2012%2012.198%2012c3.1048%200%205.9509-1.4545%208.1317-3.3455h-8.797v-2.6545c5.3595-4.5455%208.797-7.3455%208.797-10%200-1.1273-0.81317-2.6545-2.6983-2.6545-1.4785%200-2.6983%201.3455-2.6983%204.6545h-3.4005c-0.73925-4.2182%201.8481-7.6727%206.2466-7.6727%200.66532%200%201.2567%200.21818%201.8851%200.32727%22%2F%3E%0A%20%3Cpath%20fill%3D%22%233c4347%22%20d%3D%22m36.593%209.3455h1.3676c0-2-0.66532-5.1273-4.7312-5.2727-4.732-0.2183-6.1%202.6181-6.1%205.9272v5.3455c0%204.4%203.4375%205.3455%206.0988%205.3455%201.5524%200%203.4005-0.87273%204.7312-2v-6.6909h-5.4335v2.6545h2.6983v2.6545c-1.3676%201.3455-5.4335%201.3455-5.4335-2.6545v-5.3091c0-4%205.9509-4.1455%205.6183%200h1.1828zm18.296%206.6545c0-5.8182-6.9859-4.0727-6.9859-7.6%200-1.2%200.81317-2%202.1808-2%201.4415%200%202.2547%201.0182%202.2547%202.9818h2.5874c0-2-0.66532-5.3455-4.7312-5.3455-2.7722%200-4.879%201.4182-4.879%204.3273%200%206.0727%207.1707%204.0727%207.0598%207.6727-0.07392%201.4545-1.1458%202.0727-2.3656%202.0727-1.4415%200-2.6983-0.72727-2.4395-3.3818h-2.6613c-0.25874%203.3455%201.4415%206%205.3595%206%202.699%200%204.732-2.145%204.732-5.345l-0.111%200.618zm-12.198%204h-2.6983v-16h2.6983v16z%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:55px;height:24px;background-size:55px 24px;position:absolute;margin:0 3px 0 0}.dg-location__pin{background-repeat:no-repeat;width:20px;height:20px;background-image:url(https://maps.api.2gis.ru/2.0/img/sprite.basic.png);background-position:-22px -24px;background-size:87px 74px}.leaflet-retina .dg-location__pin{background-image:url(https://maps.api.2gis.ru/2.0/img/sprite@2x.basic.png);background-position:-21px -24px;background-size:91px 71.5px}.dg-location__pin_state_following{background-repeat:no-repeat;width:20px;height:20px;background-image:url(https://maps.api.2gis.ru/2.0/img/sprite.basic.png);background-position:-55px 0;background-size:87px 74px}.leaflet-retina .dg-location__pin_state_following{background-image:url(https://maps.api.2gis.ru/2.0/img/sprite@2x.basic.png);background-position:-55px 0;background-size:91px 71.5px}.dg-control-round__icon_state_active.dg-control-round__icon_name_locate:active:after,.dg-control-round__icon_state_active.dg-control-round__icon_name_locate:after,.no-touch .dg-control-round__icon_state_active.dg-control-round__icon_name_locate:hover:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2218%22%20height%3D%2218%22%3E%0A%20%20%20%20%3Cg%20fill%3D%22%2323a5d4%22%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2017%2C8%20H%2015.92%20C%2015.48%2C4.937%2013.064%2C2.52%2010%2C2.08%20V%201%20C%2010%2C0.448%209.553%2C0%209%2C0%208.447%2C0%208%2C0.448%208%2C1%20V%202.08%20C%204.936%2C2.52%202.52%2C4.937%202.08%2C8%20H%201%20C%200.447%2C8%200%2C8.448%200%2C9%200%2C9.553%200.447%2C10%201%2C10%20H%202.08%20C%202.52%2C13.063%204.936%2C15.48%208%2C15.92%20V%2017%20c%200%2C0.553%200.447%2C1%201%2C1%200.553%2C0%201%2C-0.447%201%2C-1%20V%2015.92%20C%2013.064%2C15.481%2015.48%2C13.064%2015.92%2C10%20H%2017%20C%2017.553%2C10%2018%2C9.553%2018%2C9%2018%2C8.448%2017.553%2C8%2017%2C8%20z%20M%209%2C14%20C%206.24%2C14%204%2C11.762%204%2C9%204%2C6.238%206.24%2C4%209%2C4%20c%202.761%2C0%205%2C2.238%205%2C5%200%2C2.762%20-2.239%2C5%20-5%2C5%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Ccircle%20cx%3D%229%22%20cy%3D%229%22%20r%3D%223%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%2014%2C10.004%20C%2014%2C9.834%2013.991%2C9.667%2013.975%2C9.502%2013.723%2C12.027%2011.592%2C14%209%2C14%206.408%2C14%204.277%2C12.027%204.025%2C9.502%204.009%2C9.667%204%2C9.834%204%2C10.004%20c%200%2C2.762%202.24%2C5%205%2C5%202.761%2C0%205%2C-2.238%205%2C-5%20z%20M%2010%2C3.083%20c%203.064%2C0.439%205.48%2C2.856%205.92%2C5.921%20H%2017%20c%200.369%2C0%200.688%2C0.201%200.86%2C0.498%20C%2017.947%2C9.354%2018%2C9.184%2018%2C9%2018%2C8.448%2017.553%2C8%2017%2C8%20H%2015.92%20C%2015.48%2C4.937%2013.064%2C2.52%2010%2C2.08%20V%203.083%20z%20M%201%2C9.004%20H%202.08%20C%202.52%2C5.939%204.936%2C3.522%208%2C3.083%20V%202.08%20C%204.936%2C2.52%202.52%2C4.937%202.08%2C8%20H%201%20C%200.447%2C8%200%2C8.448%200%2C9%200%2C9.184%200.053%2C9.354%200.14%2C9.502%200.312%2C9.205%200.631%2C9.004%201%2C9.004%20z%20m%208%2C-8%20c%200.553%2C0%201%2C0.447%201%2C1%20V%201%20C%2010%2C0.448%209.553%2C0%209%2C0%208.447%2C0%208%2C0.448%208%2C1%20v%201.004%20c%200%2C-0.553%200.447%2C-1%201%2C-1%20z%22%20fill%3D%22%232685aa%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%209%2C7%20c%201.486%2C0%202.717%2C1.082%202.955%2C2.5%20C%2011.982%2C9.337%2012%2C9.171%2012%2C9%2012%2C7.344%2010.656%2C6%209%2C6%207.344%2C6%206%2C7.344%206%2C9%206%2C9.171%206.018%2C9.337%206.045%2C9.5%206.283%2C8.082%207.514%2C7%209%2C7%20z%22%20fill%3D%22%231c85ab%22%2F%3E%0A%3C%2Fsvg%3E%0A)}@-webkit-keyframes DGLocation__locateIconRequestingAnim{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes DGLocation__locateIconRequestingAnim{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.dg-control-round__icon_name_locate:after{position:absolute;background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2218%22%20height%3D%2218%22%3E%0A%20%20%20%20%3Cg%20fill%3D%22%23616161%22%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2017%2C8%20H%2015.92%20C%2015.48%2C4.937%2013.064%2C2.52%2010%2C2.08%20V%201%20C%2010%2C0.448%209.553%2C0%209%2C0%208.447%2C0%208%2C0.448%208%2C1%20V%202.08%20C%204.936%2C2.52%202.52%2C4.937%202.08%2C8%20H%201%20C%200.447%2C8%200%2C8.448%200%2C9%200%2C9.553%200.447%2C10%201%2C10%20H%202.08%20C%202.52%2C13.063%204.936%2C15.48%208%2C15.92%20V%2017%20c%200%2C0.553%200.447%2C1%201%2C1%200.553%2C0%201%2C-0.447%201%2C-1%20V%2015.92%20C%2013.064%2C15.481%2015.48%2C13.064%2015.92%2C10%20H%2017%20C%2017.553%2C10%2018%2C9.553%2018%2C9%2018%2C8.448%2017.553%2C8%2017%2C8%20z%20M%209%2C14%20C%206.24%2C14%204%2C11.762%204%2C9%204%2C6.238%206.24%2C4%209%2C4%20c%202.761%2C0%205%2C2.238%205%2C5%200%2C2.762%20-2.239%2C5%20-5%2C5%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Ccircle%20cx%3D%229%22%20cy%3D%229%22%20r%3D%223%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cg%20fill%3D%22%23444%22%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2014%2C10.004%20C%2014%2C9.834%2013.991%2C9.667%2013.975%2C9.502%2013.723%2C12.027%2011.592%2C14%209%2C14%206.408%2C14%204.277%2C12.027%204.025%2C9.502%204.009%2C9.667%204%2C9.834%204%2C10.004%20c%200%2C2.762%202.24%2C5%205%2C5%202.761%2C0%205%2C-2.238%205%2C-5%20z%20M%2010%2C3.083%20c%203.064%2C0.439%205.48%2C2.856%205.92%2C5.921%20H%2017%20c%200.369%2C0%200.688%2C0.201%200.86%2C0.498%20C%2017.947%2C9.354%2018%2C9.184%2018%2C9%2018%2C8.448%2017.553%2C8%2017%2C8%20H%2015.92%20C%2015.48%2C4.937%2013.064%2C2.52%2010%2C2.08%20V%203.083%20z%20M%201%2C9.004%20H%202.08%20C%202.52%2C5.939%204.936%2C3.522%208%2C3.083%20V%202.08%20C%204.936%2C2.52%202.52%2C4.937%202.08%2C8%20H%201%20C%200.447%2C8%200%2C8.448%200%2C9%200%2C9.184%200.053%2C9.354%200.14%2C9.502%200.312%2C9.205%200.631%2C9.004%201%2C9.004%20z%20m%208%2C-8%20c%200.553%2C0%201%2C0.447%201%2C1%20V%201%20C%2010%2C0.448%209.553%2C0%209%2C0%208.447%2C0%208%2C0.448%208%2C1%20v%201.004%20c%200%2C-0.553%200.447%2C-1%201%2C-1%20z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%209%2C7%20c%201.486%2C0%202.717%2C1.082%202.955%2C2.5%20C%2011.982%2C9.337%2012%2C9.171%2012%2C9%2012%2C7.344%2010.656%2C6%209%2C6%207.344%2C6%206%2C7.344%206%2C9%206%2C9.171%206.018%2C9.337%206.045%2C9.5%206.283%2C8.082%207.514%2C7%209%2C7%20z%22%20fill%3D%22%23444%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:18px;height:18px;background-size:18px 18px}.dg-control-round__icon_name_locate:active:after,.no-touch .dg-control-round__icon_name_locate:hover:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2218%22%20height%3D%2218%22%3E%0A%20%20%20%20%3Cg%20fill%3D%22%23424242%22%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2017%2C8%20H%2015.92%20C%2015.48%2C4.937%2013.064%2C2.52%2010%2C2.08%20V%201%20C%2010%2C0.448%209.553%2C0%209%2C0%208.447%2C0%208%2C0.448%208%2C1%20V%202.08%20C%204.936%2C2.52%202.52%2C4.937%202.08%2C8%20H%201%20C%200.447%2C8%200%2C8.448%200%2C9%200%2C9.553%200.447%2C10%201%2C10%20H%202.08%20C%202.52%2C13.063%204.936%2C15.48%208%2C15.92%20V%2017%20c%200%2C0.553%200.447%2C1%201%2C1%200.553%2C0%201%2C-0.447%201%2C-1%20V%2015.92%20C%2013.064%2C15.481%2015.48%2C13.064%2015.92%2C10%20H%2017%20C%2017.553%2C10%2018%2C9.553%2018%2C9%2018%2C8.448%2017.553%2C8%2017%2C8%20z%20M%209%2C14%20C%206.24%2C14%204%2C11.762%204%2C9%204%2C6.238%206.24%2C4%209%2C4%20c%202.761%2C0%205%2C2.238%205%2C5%200%2C2.762%20-2.239%2C5%20-5%2C5%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Ccircle%20cx%3D%229%22%20cy%3D%229%22%20r%3D%223%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cg%20fill%3D%22%232e2e2e%22%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2014%2C10.004%20C%2014%2C9.834%2013.991%2C9.667%2013.975%2C9.502%2013.723%2C12.027%2011.592%2C14%209%2C14%206.408%2C14%204.277%2C12.027%204.025%2C9.502%204.009%2C9.667%204%2C9.834%204%2C10.004%20c%200%2C2.762%202.24%2C5%205%2C5%202.761%2C0%205%2C-2.238%205%2C-5%20z%20M%2010%2C3.083%20c%203.064%2C0.439%205.48%2C2.856%205.92%2C5.921%20H%2017%20c%200.369%2C0%200.688%2C0.201%200.86%2C0.498%20C%2017.947%2C9.354%2018%2C9.184%2018%2C9%2018%2C8.448%2017.553%2C8%2017%2C8%20H%2015.92%20C%2015.48%2C4.937%2013.064%2C2.52%2010%2C2.08%20V%203.083%20z%20M%201%2C9.004%20H%202.08%20C%202.52%2C5.939%204.936%2C3.522%208%2C3.083%20V%202.08%20C%204.936%2C2.52%202.52%2C4.937%202.08%2C8%20H%201%20C%200.447%2C8%200%2C8.448%200%2C9%200%2C9.184%200.053%2C9.354%200.14%2C9.502%200.312%2C9.205%200.631%2C9.004%201%2C9.004%20z%20m%208%2C-8%20c%200.553%2C0%201%2C0.447%201%2C1%20V%201%20C%2010%2C0.448%209.553%2C0%209%2C0%208.447%2C0%208%2C0.448%208%2C1%20v%201.004%20c%200%2C-0.553%200.447%2C-1%201%2C-1%20z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%209%2C7%20c%201.486%2C0%202.717%2C1.082%202.955%2C2.5%20C%2011.982%2C9.337%2012%2C9.171%2012%2C9%2012%2C7.344%2010.656%2C6%209%2C6%207.344%2C6%206%2C7.344%206%2C9%206%2C9.171%206.018%2C9.337%206.045%2C9.5%206.283%2C8.082%207.514%2C7%209%2C7%20z%22%20fill%3D%22%232e2e2e%22%2F%3E%0A%3C%2Fsvg%3E%0A)}.dg-control-round__icon_state_requesting.dg-control-round__icon_name_locate:active:after,.dg-control-round__icon_state_requesting.dg-control-round__icon_name_locate:after,.no-touch .dg-control-round__icon_state_requesting.dg-control-round__icon_name_locate:hover:after{background-repeat:no-repeat;width:24px;height:24px;background-image:url(https://maps.api.2gis.ru/2.0/img/sprite.dark.png);background-position:0 0;background-size:78px 65px;-webkit-animation:DGLocation__locateIconRequestingAnim 1s linear infinite;animation:DGLocation__locateIconRequestingAnim 1s linear infinite;image-rendering:optimizeQuality}.leaflet-retina .dg-control-round__icon_state_requesting.dg-control-round__icon_name_locate:active:after,.leaflet-retina .dg-control-round__icon_state_requesting.dg-control-round__icon_name_locate:after,.leaflet-retina .no-touch .dg-control-round__icon_state_requesting.dg-control-round__icon_name_locate:hover:after{background-image:url(https://maps.api.2gis.ru/2.0/img/sprite@2x.dark.png);background-position:0 0;background-size:78px 65px}.dg-control-round__icon_state_active.dg-control-round__icon_name_fullscreen:active:after,.dg-control-round__icon_state_active.dg-control-round__icon_name_fullscreen:after,.no-touch .dg-control-round__icon_state_active.dg-control-round__icon_name_fullscreen:hover:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%206%2C1%20H%201%20V%206%20H%203%20V%203%20h%203%20z%20m%204%2C14%20h%205%20v%20-5%20h%20-2%20v%203%20H%2010%20z%20M%2015%2C6%20V%201%20h%20-5%20v%202%20h%203%20V%206%20z%20M%201%2C10%20v%205%20H%206%20V%2013%20H%203%20v%20-3%20z%22%20fill%3D%22%230da4d4%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%201%2C1%20H%206%20V%202%20H%201%20z%20m%209%2C0%20h%205%20v%201%20h%20-5%20z%20m%203%2C9%20h%202%20v%201%20h%20-2%20z%20m%20-3%2C3%20h%203%20v%201%20h%20-3%20z%20m%20-7%2C0%20h%203%20v%201%20H%203%20z%20M%201%2C10%20h%202%20v%201%20H%201%20z%22%20fill%3D%22%230a84ab%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%201%2C6%20H%203%20V%207%20H%201%20z%20m%2012%2C0%20h%202%20V%207%20H%2013%20z%20M%201%2C15%20h%205%20v%201%20H%201%20z%20m%209%2C0%20h%205%20v%201%20h%20-5%20z%22%20fill%3D%22%23fff%22%2F%3E%0A%3C%2Fsvg%3E%0A)}.dg-control-round__icon_name_fullscreen:after{position:absolute;background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%201%2C3%20H%206%20V%204%20H%201%20z%22%20fill%3D%22%23fff%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%206%2C1%20H%201%20V%206%20H%203%20V%203%20h%203%20z%20m%204%2C14%20h%205%20v%20-5%20h%20-2%20v%203%20h%20-3%20z%22%20fill%3D%22%236c6c6c%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%2010%2C3%20h%205%20v%201%20h%20-5%20z%22%20fill%3D%22%23fff%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%2015%2C6%20V%201%20h%20-5%20v%202%20h%203%20V%206%20z%20M%201%2C10%20v%205%20H%206%20V%2013%20H%203%20v%20-3%20z%22%20fill%3D%22%236c6c6c%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%201%2C1%20H%206%20V%202%20H%201%20z%20m%209%2C0%20h%205%20v%201%20h%20-5%20z%20m%203%2C9%20h%202%20v%201%20h%20-2%20z%20m%20-3%2C3%20h%203%20v%201%20h%20-3%20z%20m%20-7%2C0%20h%203%20v%201%20H%203%20z%20M%201%2C10%20h%202%20v%201%20H%201%20z%22%20fill%3D%22%234b4b4b%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%201%2C6%20H%203%20V%207%20H%201%20z%20m%2012%2C0%20h%202%20V%207%20H%2013%20z%20M%201%2C15%20h%205%20v%201%20H%201%20z%20m%209%2C0%20h%205%20v%201%20h%20-5%20z%22%20fill%3D%22%23fff%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:16px;height:16px;background-size:16px 16px}.dg-map-geoclicker__address+.dg-map-geoclicker__purpose,.dg-map-geoclicker__purpose+.dg-map-geoclicker__address{margin-top:-6px}.dg-control-round__icon_name_fullscreen:active:after,.no-touch .dg-control-round__icon_name_fullscreen:hover:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%2012%2C9%20h%204%20v%207%20h%20-4%20z%20m%20-3%2C3%20h%205%20v%204%20H%209%20z%22%20fill%3D%22%23fff%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%2010%2C15%20h%205%20v%20-5%20h%20-2%20v%203%20h%20-3%20z%22%20fill%3D%22%23282828%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%200%2C9%20h%204%20v%207%20H%200%20z%20m%202%2C3%20h%205%20v%204%20H%202%20z%22%20fill%3D%22%23fff%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%201%2C10%20v%205%20H%206%20V%2013%20H%203%20v%20-3%20z%22%20fill%3D%22%23282828%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%200%2C0%20H%204%20V%207%20H%200%20z%20m%209%2C0%20h%205%20V%204%20H%209%20z%20m%203%2C0%20h%204%20v%207%20h%20-4%20z%22%20fill%3D%22%23fff%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%2015%2C6%20V%201%20h%20-5%20v%202%20h%203%20v%203%20z%22%20fill%3D%22%23282828%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%202%2C0%20H%207%20V%204%20H%202%20z%22%20fill%3D%22%23fff%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%206%2C1%20H%201%20V%206%20H%203%20V%203%20h%203%20z%22%20fill%3D%22%23282828%22%2F%3E%0A%3C%2Fsvg%3E%0A)}.dg-building-callout__body{position:relative}.dg-building-callout__list{margin-bottom:8px;padding-left:24px;color:#ffe6aa;list-style:none}.dg-building-callout__list-item{position:relative;margin-bottom:4px;font-size:12px}.dg-building-callout__list-item:before{position:absolute;top:5px;left:-21px;content:'';background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%226%22%20height%3D%226%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%203%2C-0.002%20C%204.654%2C-0.002%205.994%2C1.342%205.994%2C3%205.994%2C4.658%204.655%2C6.002%203%2C6.002%201.345%2C6.002%200.005%2C4.658%200.005%2C3%200.005%2C1.342%201.346%2C-0.002%203%2C-0.002%20z%22%20fill%3D%22%23aaa%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:6px;height:6px;background-size:6px 6px}.dg-map-geoclicker__address{margin-bottom:10px;font-size:16px}.dg-map-geoclicker__address-header{position:relative;margin-bottom:4px;padding-left:24px}.dg-map-geoclicker__address-header:first-child:before{position:absolute;top:5px;left:1px;content:''}.dg-map-geoclicker__address-drilldown{position:relative;margin-bottom:4px;padding-left:24px;color:#aaa;font-size:12px}.dg-map-geoclicker__address-drilldown:first-child:before{position:absolute;top:2px;left:1px;content:''}.dg-map-geoclicker__purpose{position:relative;margin-bottom:10px;padding-left:24px;font-size:16px}.dg-map-geoclicker__purpose:before{position:absolute;top:4px;left:2px;content:''}.dg-map-geoclicker__sight-description{overflow:hidden;padding:.5em 0 0 24px;max-height:3.6em}a.dg-map-geoclicker__show-more-sights-link{position:relative;margin-left:24px;border-bottom:1px dotted;text-decoration:none;color:#ffe6aa}.dg-preloader_animation_true:after,.dg-preloader_animation_true:before,a.dg-map-geoclicker__show-more-sights-link:after{position:absolute;content:''}a.dg-map-geoclicker__show-more-sights-link:after{top:4px;margin-left:5px;width:6px;height:10px;font-weight:700}.dg-map-geoclicker__clamped-line{display:block;white-space:nowrap}.dg-map-geoclicker__clamped-line_last{overflow:hidden;width:100%;text-overflow:ellipsis}.dg-map-geoclicker__preloader-wrapper{display:table-cell;vertical-align:middle;text-align:center}.dg-map-geoclicker__address-drilldown:first-child:before,.dg-map-geoclicker__address-header:first-child:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%229%22%20height%3D%2211%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%204.958%2C11%20C%204.958%2C9.036%206.756%2C6.751%208.719%2C6.751%208.885%2C6.223%209%2C5.656%209%2C5.063%209%2C2.267%206.985%2C0%204.5%2C0%202.015%2C0%200%2C2.267%200%2C5.063%200%2C5.656%200.114%2C6.222%200.28%2C6.751%202.243%2C6.751%204.018%2C9.012%204.018%2C11%20h%200.94%20z%22%20fill%3D%22%23a0a0a0%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:9px;height:11px;background-size:9px 11px}.dg-map-geoclicker__purpose:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%228%22%20height%3D%2212%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%203.582%2C8%20c%200.211%2C0%200.798%2C0.035%201%2C0%20v%204%20l%20-2%2C-1%20V%208%20c%200.372%2C0.066%200.861%2C0%201%2C0%20z%20M%200.44%2C5.384%20C%200.163%2C4.866%200%2C4.276%200%2C3.646%200%2C1.633%201.604%2C0.002%203.582%2C0.002%20c%201.978%2C0%203.582%2C1.631%203.582%2C3.644%200%2C0.647%20-0.169%2C1.254%20-0.461%2C1.781%20L%206.641%2C5.495%206.618%2C5.567%20C%205.954%2C6.549%204.844%2C7.192%203.584%2C7.192%202.25%2C7.192%201.084%2C6.467%200.44%2C5.384%20z%20M%202.613%2C1.276%20c%20-0.549%2C0%20-0.995%2C0.453%20-0.995%2C1.013%200%2C0.559%200.446%2C1.013%200.995%2C1.013%200.551%2C0%200.996%2C-0.454%200.996%2C-1.013%200%2C-0.56%20-0.445%2C-1.013%20-0.996%2C-1.013%20z%22%20fill%3D%22%23a0a0a0%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:8px;height:12px;background-size:8px 12px}.dg-map-geoclicker__purpose_type_street:before{top:4px;background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2212%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%208.8%2C0%20H%203.199%20L%200%2C12%20H%2012%20L%208.8%2C0%20z%20M%207%2C12%20H%205%20V%209%20h%202%20v%203%20z%20M%207%2C8%20H%205%20V%206%20H%207%20V%208%20z%20M%207%2C5%20H%205%20V%203%20H%207%20V%205%20z%20M%207%2C2%20H%205%20V%200%20h%202%20v%202%20z%22%20fill%3D%22%23a0a0a0%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:12px;height:12px;background-size:12px 12px}.dg-preloader_animation_true:after,.dg-preloader_animation_true:before{top:50%;left:50%;outline:transparent solid 1px;image-rendering:optimizeQuality}.dg-map-geoclicker__purpose_type_sight:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%228%22%20height%3D%2212%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%207%2C0%20H%202.547%20C%200.547%2C0%200%2C0.828%200%2C2.5%200%2C3.734%200.5%2C5%202%2C5%203.359%2C5%204%2C3.844%204%2C3%204%2C2.281%202.859%2C2%202%2C2%202%2C2.766%202.234%2C3%203%2C3%203%2C3.69%202.48%2C4%202%2C4%201.234%2C4%201%2C3.329%201%2C2.5%201%2C1.693%201.375%2C1%202.5%2C1%204.391%2C1%205%2C1.656%205%2C3%205%2C4.6%204.338%2C5.119%203%2C6%20v%204%20H%202%20v%202%20H%208%20V%201%20L%207%2C0%20z%20M%204%2C10%20V%206%20l%201%2C1%20v%203%20H%204%20z%20m%202%2C0%20V%206%20l%201%2C1%20v%203%20H%206%20z%22%20fill%3D%22%23aaa%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:8px;height:12px;background-size:8px 12px}.dg-map-geoclicker__purpose_type_settlement:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2212%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%209%2C9%20C%208.235%2C9%207.762%2C9.522%207.259%2C10.022%207.795%2C10.38%208.051%2C11.05%207.879%2C12%20H%2012%20C%2012%2C10.46%2010.535%2C9%209%2C9%20z%20m%20-2.868%2C1.248%20c%20-0.965%2C0%20-1.747%2C0.784%20-1.747%2C1.751%20h%203.494%20c%200%2C-0.967%20-0.782%2C-1.751%20-1.747%2C-1.751%20z%20M%2010%2C1%20V%200%20H%207%20V%201%20H%205%20V%206%20L%206%2C7%20V%202%20H%207%20V%207%20L%208%2C8%20V%202%20h%201%20v%206%20h%201%20V%202%20h%201%20v%207%20l%201%2C0.607%20V%201%20H%2010%20z%20M%206.66%2C9.539%206.721%2C9.479%20C%206.903%2C9.297%207.104%2C9.14%207.314%2C9.004%20V%208.414%20L%206.131%2C7.187%203%2C8%20v%204%20H%203.62%20C%203.62%2C10.612%204.747%2C9.483%206.132%2C9.483%206.312%2C9.482%206.49%2C9.502%206.66%2C9.539%20z%20M%202%2C12%20z%20M%201%2C2%200%2C5%20v%207%20H%202%20V%205%20L%201%2C2%20z%20M%201.111%2C6.955%20C%200.804%2C6.955%200.556%2C6.706%200.556%2C6.4%20c%200%2C-0.307%200.248%2C-0.555%200.555%2C-0.555%200.307%2C0%200.554%2C0.248%200.554%2C0.555%200%2C0.306%20-0.247%2C0.555%20-0.554%2C0.555%20z%22%20fill%3D%22%23a0a0a0%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:12px;height:12px;background-size:12px 12px}.no-touch a.dg-map-geoclicker__show-more-sights-link:hover{color:#9cd}a.dg-map-geoclicker__show-more-sights-link:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%226%22%20height%3D%2210%22%20viewBox%3D%220%200%206%2010%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%206%2C5%20V%205.4%20L%201.4%2C10%20H%200%20L%200%2C8.6%203.6%2C5%200%2C1.4%200%2C0%201.4%2C0%206%2C4.6%20V%205%20l%200%2C0%200%2C0%200%2C0%200%2C0%200%2C0%20z%22%20fill%3D%22%23aaa%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A)}.dg-map-geoclicker__drilldown{margin-bottom:10px;color:#aaa}.dg-preloader{position:relative;margin:0 auto;width:200px;height:44px;vertical-align:middle}.dg-preloader_animation_false{background-repeat:no-repeat;background-image:url(https://maps.api.2gis.ru/2.0/img/DGPreloader__preloader.gif);background-size:100px 26px;background-attachment:scroll;background-position:50% 50%}.dg-preloader_animation_true:before{margin:-22px 0 0 -22px;width:44px;height:44px;-webkit-animation:dg-preloader__outer 5s linear infinite;animation:dg-preloader__outer 5s linear infinite}.dg-preloader_animation_true.dg-preloader_size_small:before{margin:-12px 0 0 -12px;width:24px;height:24px}.dg-preloader_animation_true.dg-preloader_scheme_regular:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2244%22%20height%3D%2244%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%2035.68%2C10.32%20C%2038.368%2C13.465%2040%2C17.539%2040%2C22%2040%2C31.941%2031.941%2C40%2022%2C40%2012.059%2C40%204%2C31.941%204%2C22%204%2C17.539%205.632%2C13.465%208.32%2C10.32%20L%205.48%2C7.48%20C%202.07%2C11.354%200%2C16.434%200%2C22%200%2C34.15%209.85%2C44%2022%2C44%2034.15%2C44%2044%2C34.15%2044%2C22%2044%2C16.434%2041.93%2C11.354%2038.52%2C7.48%20l%20-2.84%2C2.84%20z%22%20fill%3D%22%230da5d5%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%209.271%2C9.272%20C%2012.529%2C6.015%2017.029%2C4%2022%2C4%2026.971%2C4%2031.471%2C6.015%2034.729%2C9.272%20L%2037.557%2C6.444%20C%2033.575%2C2.462%2028.075%2C0%2022%2C0%2015.925%2C0%2010.425%2C2.462%206.443%2C6.444%20l%202.828%2C2.828%20z%22%20fill%3D%22%23a6cd2a%22%2F%3E%0A%3C%2Fsvg%3E%0A);background-size:44px 44px}.dg-preloader_animation_true.dg-preloader_scheme_regular.dg-preloader_size_small:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%2018.564%2C7.435%20C%2019.467%2C8.73%2020%2C10.302%2020%2C12%2020%2C16.418%2016.418%2C20%2012%2C20%207.582%2C20%204%2C16.418%204%2C12%204%2C10.302%204.533%2C8.73%205.436%2C7.435%20L%202.581%2C4.581%20C%200.969%2C6.623%200%2C9.195%200%2C12%200%2C18.627%205.373%2C24%2012%2C24%2018.627%2C24%2024%2C18.627%2024%2C12%2024%2C9.195%2023.031%2C6.623%2021.419%2C4.581%20l%20-2.855%2C2.854%20z%22%20fill%3D%22%230da5d5%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%2012%2C0%20C%208.686%2C0%205.686%2C1.343%203.516%2C3.515%20L%206.343%2C6.343%20C%207.791%2C4.895%209.791%2C4%2012%2C4%20c%202.209%2C0%204.209%2C0.895%205.657%2C2.343%20L%2020.484%2C3.515%20C%2018.314%2C1.343%2015.314%2C0%2012%2C0%20z%22%20fill%3D%22%23a6cd2a%22%2F%3E%0A%3C%2Fsvg%3E%0A);background-size:24px 24px}.dg-preloader_animation_true:after{margin:-16px 0 0 -16px;width:32px;height:32px;-webkit-animation:dg-preloader__inner 4s linear infinite;animation:dg-preloader__inner 4s linear infinite}.dg-preloader_animation_true.dg-preloader_size_small:after{margin:-6px 0 0 -6px;width:12px;height:12px}.dg-preloader_animation_true.dg-preloader_scheme_regular:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2232%22%20height%3D%2232%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%206.581%2C23.419%20C%204.969%2C21.377%204%2C18.804%204%2C16%204%2C9.373%209.373%2C4%2016%2C4%20c%206.627%2C0%2012%2C5.373%2012%2C12%200%2C2.804%20-0.969%2C5.377%20-2.581%2C7.419%20l%202.847%2C2.847%20C%2030.594%2C23.487%2032%2C19.909%2032%2C16%2032%2C7.163%2024.837%2C0%2016%2C0%207.163%2C0%200%2C7.163%200%2C16%20c%200%2C3.909%201.406%2C7.487%203.734%2C10.266%20l%202.847%2C-2.847%20z%22%20fill%3D%22%23a6cd2a%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%2027.314%2C27.314%2024.486%2C24.486%20C%2022.314%2C26.657%2019.314%2C28%2016%2C28%2012.686%2C28%209.686%2C26.657%207.516%2C24.485%20L%204.688%2C27.313%20C%207.582%2C30.209%2011.582%2C32%2016%2C32%20c%204.418%2C0%208.418%2C-1.791%2011.314%2C-4.686%20z%22%20fill%3D%22%230da5d5%22%2F%3E%0A%3C%2Fsvg%3E%0A);background-size:32px 32px}.dg-preloader_animation_true.dg-preloader_scheme_regular.dg-preloader_size_small:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2212%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%203.141%2C6.86%20C%203.059%2C6.586%203%2C6.301%203%2C6%203%2C4.343%204.343%2C3%206%2C3%207.657%2C3%209%2C4.343%209%2C6%209%2C6.301%208.941%2C6.586%208.859%2C6.86%20l%202.26%2C2.259%20C%2011.674%2C8.209%2012%2C7.144%2012%2C6%2012%2C2.686%209.314%2C0%206%2C0%202.686%2C0%200%2C2.686%200%2C6%200%2C7.144%200.326%2C8.209%200.881%2C9.119%20L%203.141%2C6.86%20z%22%20fill%3D%22%23a6cd2a%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%206%2C12%20c%201.657%2C0%203.157%2C-0.672%204.243%2C-1.757%20L%208.122%2C8.122%20C%207.578%2C8.664%206.828%2C9%206%2C9%205.172%2C9%204.422%2C8.664%203.879%2C8.121%20L%201.758%2C10.242%20C%202.843%2C11.328%204.343%2C12%206%2C12%20z%22%20fill%3D%22%230da5d5%22%2F%3E%0A%3C%2Fsvg%3E%0A);background-size:12px 12px}@-webkit-keyframes dg-preloader__outer{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dg-preloader__outer{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dg-preloader__inner{to{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes dg-preloader__inner{to{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}.dg-popup__footer-buttons{display:table;margin-top:10px;width:100%}.dg-popup__footer-button-wrapper{display:table-cell}.dg-popup__footer-button{position:relative;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;margin-left:5%;width:95%;border-radius:2px;text-align:center;text-decoration:none;font:12px/24px Arial,sans-serif;cursor:pointer;-webkit-transition:all .1s;transition:all .1s}.dg-popup__footer-button-wrapper:first-child .dg-popup__footer-button{margin:0;width:100%}.dg-popup__footer-icon-button:before{display:inline-block;margin:-2px 5px 0 0;width:12px;height:12px;background-size:contain;background-repeat:no-repeat;content:'';vertical-align:middle}.dg-popup__button_name_back:before,.dg-popup__button_name_firm-card-back:before,.dg-popup__button_name_firm-list-back:before{width:9px;height:6px}.dg-popup__show-less-house-link{position:relative;top:6px;margin:0 15px 10px;color:#0070c0;text-decoration:none;font-size:12px;line-height:24px}.dg-popup__header-links{margin:8px 18px 0 0}.dg-popup__header-title_for_firmcard{position:relative;overflow:hidden;max-height:3.4em}.dg-popup__header-teaser{display:-webkit-box;height:3.3em;-webkit-line-clamp:3;-webkit-box-orient:vertical}.dg-popup__header-title{display:block;white-space:normal;font:22px/24px 'Arial narrow',Arial,sans-serif}.dg-popup__header-link,.dg-popup__rating{display:inline-block;vertical-align:middle}.dg-firm-card__link,.dg-popup__header-link,.dg-schedule__string-time,.dg-schedule__table-cell-group,.dg-schedule__today-inner{white-space:nowrap}.dg-popup__header-link{margin-left:2.6em}.dg-popup__header-link:first-child{margin-left:1.2em}.dg-popup__rating{margin:0 .4em 3px 0;width:70px;height:14px}.dg-popup__rating-stars{background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2214%22%20height%3D%2214%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%206.999%2C0%208.748%2C4.989%2013.997%2C4.991%209.83%2C8.708%2011.324%2C14.002%206.999%2C10.871%202.674%2C14.002%204.168%2C8.708%200%2C4.991%205.249%2C4.989%206.999%2C0%20z%22%20fill%3D%22%23ffc84b%22%2F%3E%0A%3C%2Fsvg%3E%0A);float:left;height:100%}.dg-popup__link{position:relative;background-position:center bottom;background-size:10px 1px;background-repeat:repeat-x;text-decoration:none;-webkit-tap-highlight-color:transparent}.dg-popup__link_type_booklet:before,.dg-popup__link_type_photos:before{position:absolute;top:2px;left:-18px;display:inherit;content:'';width:12px;height:10px}.dg-popup__link_type_flamp_reviews{margin-left:.1em}.dg-popup__link_type_booklet:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2210%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%200%2C8%203%2C2%20V%202%20L%200%2C0%20V%208%20z%20M%204%2C10%208%2C8%20V%200%20L%204%2C2%20v%208%20z%20M%209%2C0%20v%208%20l%203%2C2%20V%202%20L%209%2C0%20z%22%20fill%3D%22%237dc814%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A);background-size:12px 10px}a.dg-popup__link{background-image:-webkit-gradient(linear,left top,right top,from(rgba(255,230,170,.3)),to(rgba(255,230,170,.3)));background-image:-webkit-linear-gradient(left,rgba(255,230,170,.3),rgba(255,230,170,.3) 100%);background-image:linear-gradient(to right,rgba(255,230,170,.3),rgba(255,230,170,.3) 100%);color:#ffe6aa}.no-touch .dg-firm-card__link a:hover,.no-touch a.dg-popup__link:hover{background-image:-webkit-gradient(linear,left top,right top,from(rgba(153,204,221,.3)),to(rgba(153,204,221,.3)));background-image:-webkit-linear-gradient(left,rgba(153,204,221,.3),rgba(153,204,221,.3) 100%)}.no-touch a.dg-popup__link:hover{background-image:linear-gradient(to right,rgba(153,204,221,.3),rgba(153,204,221,.3) 100%);color:#9cd}.dg-popup__header-title{color:#ffc84b}.dg-popup__footer-button-wrapper .dg-popup__footer-button,.dg-popup__footer-button-wrapper .dg-popup__footer-button:hover{color:#e6e6e6}.dg-popup__footer-button{background:rgba(0,0,0,.2);-webkit-box-shadow:0 1px rgba(0,0,0,.1);box-shadow:0 1px rgba(0,0,0,.1)}.no-touch .dg-popup__footer-button:hover{-webkit-transition:all .2s;transition:all .2s;background:#222;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.5);box-shadow:0 1px 3px rgba(0,0,0,.5)}.dg-popup__rating{background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2214%22%20height%3D%2214%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%207.002%2C0%208.751%2C4.989%2014%2C4.991%209.833%2C8.708%2011.327%2C14.002%207.002%2C10.871%202.677%2C14.002%204.171%2C8.708%200.003%2C4.991%205.252%2C4.989%207.002%2C0%20z%22%20fill%3D%22%23aaa%22%2F%3E%0A%3C%2Fsvg%3E%0A)}.dg-popup__link_type_photos:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2210%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%2011%2C1%20H%2010%20L%209%2C0%20H%206%20L%205%2C1%20H%201%20L%200%2C2%20v%207%20l%201%2C1%20H%2011%20L%2012%2C9%20V%202%20L%2011%2C1%20z%20M%203%2C4%20H%202%20V%203%20h%201%20v%201%20z%20m%204.518%2C3.992%20c%20-1.381%2C0%20-2.5%2C-1.119%20-2.5%2C-2.5%200%2C-1.38%201.119%2C-2.5%202.5%2C-2.5%201.38%2C0%202.5%2C1.12%202.5%2C2.5%200%2C1.381%20-1.121%2C2.5%20-2.5%2C2.5%20z%22%20fill%3D%22%2379b0bc%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A);background-size:12px 10px}.dg-popup__button_name_back:before,.dg-popup__button_name_firm-card-back:before,.dg-popup__button_name_firm-list-back:before{background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%229%22%20height%3D%226%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%200%2C3%204%2C6%20V%204%20H%209%20V%202%20H%204%20V%200%20z%22%20fill%3D%22%239f9f9f%22%2F%3E%0A%3C%2Fsvg%3E%0A);background-repeat:no-repeat}.dg-popup__button_name_back:before{width:9px;height:6px;background-size:9px 6px}.dg-popup__button_name_goto:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2220%22%20height%3D%227%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%2016.5%2C0%20C%2014.738%2C0%2013.295%2C1.306%2013.051%2C3%20H%204.949%20C%204.718%2C1.858%203.71%2C1%202.5%2C1%201.119%2C1%200%2C2.119%200%2C3.5%200%2C4.881%201.119%2C6%202.5%2C6%203.71%2C6%204.718%2C5.142%204.949%2C4%20h%208.102%20C%2013.295%2C5.693%2014.739%2C7%2016.5%2C7%2018.433%2C7%2020%2C5.433%2020%2C3.5%2020%2C1.566%2018.433%2C0%2016.5%2C0%20z%22%20fill%3D%22%239f9f9f%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:20px;height:7px;background-size:20px 7px}.dg-popup__button_name_show-entrance:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2212%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%205%2C9%209%2C6%205%2C3%20V%205%20H%200%20V%207%20H%205%20V%209%20z%20M%209.6%2C0%20H%202.4%20C%201.074%2C0%200%2C1.074%200%2C2.4%20V%204%20H%202%20V%203.6%20C%202%2C2.716%202.716%2C2%203.6%2C2%20H%208.4%20C%209.283%2C2%2010%2C2.716%2010%2C3.6%20V%208.4%20C%2010%2C9.284%209.283%2C10%208.4%2C10%20H%203.6%20C%202.716%2C10%202%2C9.284%202%2C8.4%20V%208%20H%200%20V%209.6%20C%200%2C10.925%201.074%2C12%202.4%2C12%20H%209.6%20C%2010.926%2C12%2012%2C10.925%2012%2C9.6%20V%202.4%20C%2012%2C1.074%2010.926%2C0%209.6%2C0%20z%22%20fill%3D%22%23a0a0a0%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A)}.dg-firm-card__icon{position:relative;padding-left:24px}.dg-firm-card__address:before,.dg-firm-card__icon:before{position:absolute;content:''}.dg-firm-card__icon:before{top:0;left:0;margin:auto;background-position:0 50%;background-repeat:no-repeat}.dg-firm-card__link{overflow:hidden;margin-bottom:4px;text-overflow:ellipsis;word-wrap:normal;line-height:16px}.dg-firm-card__link a{background-position:center bottom;background-size:10px 1px;background-repeat:repeat-x;text-decoration:none;background-image:-webkit-gradient(linear,left top,right top,from(rgba(255,230,170,.3)),to(rgba(255,230,170,.3)));background-image:-webkit-linear-gradient(left,rgba(255,230,170,.3),rgba(255,230,170,.3) 100%);background-image:linear-gradient(to right,rgba(255,230,170,.3),rgba(255,230,170,.3) 100%);color:#ffe6aa}.dg-firm-card__address{margin-bottom:10px;font-size:16px}.dg-firm-card__address:before{top:5px;left:1px}.dg-firm-card__comment{position:relative;margin-left:5px;font-size:12px}.dg-firm-card__phone{overflow:hidden;margin-bottom:4px;text-overflow:ellipsis;line-height:16px}.dg-firm-card__phone:before{top:3px;left:1px}.dg-firm-card__site:before{top:3px}.dg-firm-card__rubrics{overflow:hidden;margin-bottom:4px;font-size:12px;line-height:16px}.dg-firm-card__rubrics-list{margin:0;padding:0;list-style:none}.dg-firm-card__rubrics-list-item{display:inline;cursor:default}.dg-firm-card__rubrics-list-item:before{display:inline-block;margin:0 4px;content:'•'}.dg-firm-card__rubrics-list-item:first-child:before{margin:0;content:''}.dg-firm-card__aa{margin:0 0 4px;padding:0 0 0 24px;font-size:12px}.dg-firm-card__aa-list{display:inline;margin:0;padding:0;list-style:none;line-height:16px}.dg-firm-card__aa-list-item{display:inline;-webkit-box-sizing:border-box;box-sizing:border-box;max-width:100%;cursor:default}.dg-firm-card__aa-list-item:before{display:inline-block;margin:0 4px;content:'•'}.dg-control-round__icon_name_ruler:after,.dg-control-round__icon_name_traffic:after,.dg-firm-card__aa-list-item:first-child:before,.dg-schedule__today:after,.dg-schedule__today:before{content:''}.dg-firm-card__aa-list-item:first-child:before{margin:0}.dg-firm-card__aa-list-additional{display:inline;margin:0;padding:0;list-style:none;line-height:16px}.dg-firm-card__schedule{margin-bottom:10px}.no-touch .dg-firm-card__link a:hover{background-image:linear-gradient(to right,rgba(153,204,221,.3),rgba(153,204,221,.3) 100%);color:#9cd}.dg-firm-card__comment,.dg-firm-card__rubrics{color:#aaa}.dg-firm-card__rubrics-list-item:after{color:#6e6964}.dg-firm-card__aa-list-item:after{color:#e6e6e6}.dg-firm-card__address:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%229%22%20height%3D%2211%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%204.958%2C11%20C%204.958%2C9.036%206.756%2C6.751%208.719%2C6.751%208.885%2C6.223%209%2C5.656%209%2C5.063%209%2C2.267%206.985%2C0%204.5%2C0%202.015%2C0%200%2C2.267%200%2C5.063%200%2C5.656%200.114%2C6.222%200.28%2C6.751%202.243%2C6.751%204.018%2C9.012%204.018%2C11%20h%200.94%20z%22%20fill%3D%22%23a0a0a0%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:9px;height:11px;background-size:9px 11px}.dg-firm-card__phone:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%209.181%2C9.05%20C%208.673%2C9.556%208.047%2C9.873%207.391%2C10%206.156%2C9.841%205.008%2C9.417%203.998%2C8.788%20L%201.293%2C6.092%20C%200.639%2C5.053%200.203%2C3.865%200.052%2C2.589%200.19%2C1.964%200.494%2C1.368%200.983%2C0.882%20L%201.803%2C0.065%203.987%2C2.241%20V%202.79%20L%203.441%2C3.332%20c%20-0.452%2C0.451%20-0.453%2C1.183%200%2C1.634%20L%205.082%2C6.6%20c%200.452%2C0.451%201.187%2C0.451%201.639%2C0%20L%207.244%2C6.079%20H%207.838%20L%2010%2C8.233%209.181%2C9.05%20z%22%20fill%3D%22%23a0a0a0%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:10px;height:10px;background-size:10px 10px}.dg-firm-card__site:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2211%22%20height%3D%2211%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%205.5%2C11%20C%202.463%2C11%200%2C8.538%200%2C5.5%200%2C2.462%202.463%2C0%205.5%2C0%208.537%2C0%2011%2C2.462%2011%2C5.5%2011%2C8.538%208.537%2C11%205.5%2C11%20z%20m%200%2C-9%20C%203.566%2C2%202%2C3.567%202%2C5.5%202%2C7.433%203.566%2C9%205.5%2C9%205.655%2C9%205.804%2C8.974%205.954%2C8.954%20L%203%2C6%20V%205%20L%205.571%2C3.286%205.984%2C2.049%20C%205.824%2C2.026%205.666%2C2%205.5%2C2%20z%20M%208.949%2C5%20H%207.375%20C%207.021%2C5.505%206.545%2C6.082%206%2C6.497%20V%208.95%20C%207.693%2C8.705%209%2C7.262%209%2C5.5%209%2C5.329%208.974%2C5.165%208.949%2C5%20z%22%20fill%3D%22%23a0a0a0%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:11px;height:11px;background-size:11px 11px}.dg-firm-card__email:before{top:5px;background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2211%22%20height%3D%227%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%2011%2C1.555%20v%203.89%20C%2011%2C6.303%2010.242%2C7%209.309%2C7%20H%201.692%20C%200.758%2C7%200%2C6.303%200%2C5.444%20V%201.554%20L%205.5%2C4.826%2011%2C1.555%20z%20M%200.191%2C0%20H%2010.808%20L%205.5%2C3.111%200.191%2C0%20z%22%20fill%3D%22%23aaa%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:11px;height:7px;background-size:11px 7px}.dg-schedule__today{position:relative;display:inline-block;margin-left:24px;max-width:84%;background-position:center bottom;background-size:2px 1px;background-repeat:repeat-x;font-size:14px;line-height:16px;cursor:pointer}.dg-schedule__today:before{position:absolute;top:3px;left:-24px}.dg-schedule__today-inner{overflow:hidden;width:100%;text-overflow:ellipsis}.dg-schedule_works-everyday_true .dg-schedule__today{background-image:none;cursor:default}.dg-schedule_works-everyday_true .dg-schedule__today:after{background-image:none}.dg-schedule_open_true .dg-schedule__today:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2211%22%20height%3D%2211%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%205.5%2C11%20C%202.463%2C11%200%2C8.537%200%2C5.5%200%2C2.462%202.463%2C0%205.5%2C0%208.537%2C0%2011%2C2.462%2011%2C5.5%2011%2C8.537%208.537%2C11%205.5%2C11%20z%20M%206%2C5.293%20V%202%20H%205%20V%205.707%20L%207.646%2C8.353%208.353%2C7.646%206%2C5.293%20z%22%20fill%3D%22%2370bf00%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:11px;height:11px;background-size:11px 11px}.dg-schedule__now{margin:2px 7px 0 36px;font-size:12px}.dg-schedule__string{padding:3px 16px 3px 24px;font-size:14px}.dg-schedule__table{display:none;text-align:center;font-size:0}.dg-schedule__tc{display:inline-block;padding:2px 0 15px;width:44px;vertical-align:top;white-space:normal;font-size:14px}.dg-schedule__tc_pre{width:19px}.dg-schedule__day-name{margin:0;color:#8c8782;text-transform:capitalize}.dg-schedule__td{margin:10px 0 0}.dg-schedule_state_expanded .dg-schedule__popup{display:block;visibility:visible;max-height:1000px;opacity:1}.dg-schedule__table-clock{margin:13px 0 0}.dg-schedule__today{background-image:-webkit-gradient(linear,left top,right top,from(rgba(230,230,230,.55)),color-stop(50%,rgba(230,230,230,.55)),color-stop(51%,rgba(0,0,0,0)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(left,rgba(230,230,230,.55),rgba(230,230,230,.55) 50%,rgba(0,0,0,0) 51%,rgba(0,0,0,0) 100%);background-image:linear-gradient(to right,rgba(230,230,230,.55),rgba(230,230,230,.55) 50%,rgba(0,0,0,0) 51%,rgba(0,0,0,0) 100%)}.dg-schedule__now{color:#aaa}.dg-schedule__string-time,.dg-schedule__td{color:#e6e6e6}.dg-schedule__tc_active_true{background:rgba(255,255,255,.1)}.dg-schedule__table-clock{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2211%22%20height%3D%2211%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%205.5%2C11%20C%202.463%2C11%200%2C8.537%200%2C5.5%200%2C2.462%202.463%2C0%205.5%2C0%208.537%2C0%2011%2C2.462%2011%2C5.5%2011%2C8.537%208.537%2C11%205.5%2C11%20z%20M%206%2C5.293%20V%202%20H%205%20V%205.707%20L%207.646%2C8.353%208.353%2C7.646%206%2C5.293%20z%22%20fill%3D%22%23a0a0a0%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:11px;height:11px;background-size:11px 11px}.dg-schedule__table-lunch{margin:31px 0 0;background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2211%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%204%2C7%20H%208%20C%208.58%2C7%209.461%2C6.084%209.826%2C4.977%20V%205%20C%2011.047%2C5%2012%2C3.453%2012%2C2.031%2012%2C1.453%2011.531%2C1%2011.016%2C1%20H%2010%20C%2010%2C0.188%209.781%2C0%209%2C0%20H%203%20C%202.297%2C0%202%2C0.188%202%2C1%20v%203%20c%200%2C1.49%201.137%2C3%202%2C3%20z%20m%206%2C-5%20h%200.5%20C%2010.875%2C2%2011%2C2.219%2011%2C2.5%2011%2C3.625%2010.562%2C4%2010%2C4%20V%202%20z%20M%200%2C9%20c%200%2C0.448%201.791%2C1%203%2C1%200%2C0.405%200.646%2C1%201%2C1%20h%204%20c%200.354%2C0%201%2C-0.595%201%2C-1%201.208%2C0%203%2C-0.552%203%2C-1%20V%208%20H%200%20v%201%20z%22%20fill%3D%22%23aaa5a0%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:12px;height:11px;background-size:12px 11px}.dg-schedule_open_false .dg-schedule__today:before{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2211%22%20height%3D%2211%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%205.5%2C11%20C%202.463%2C11%200%2C8.537%200%2C5.5%200%2C2.462%202.463%2C0%205.5%2C0%208.537%2C0%2011%2C2.462%2011%2C5.5%2011%2C8.537%208.537%2C11%205.5%2C11%20z%20M%206%2C5.293%20V%202%20H%205%20V%205.707%20L%207.646%2C8.353%208.353%2C7.646%206%2C5.293%20z%22%20fill%3D%22%23a0a0a0%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:11px;height:11px;background-size:11px 11px}.dg-schedule__today:after,.dg-schedule__today_shown_true:after{background-repeat:no-repeat;height:6px;background-size:10px 6px;width:10px}.dg-schedule__today:after{position:absolute;right:-15px;bottom:4px;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%226%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%205%2C6%20H%204.586%20L%200%2C1.414%20V%200%20H%201.414%20L%205%2C3.586%208.586%2C0%20H%2010%20V%201.414%20L%205.414%2C6%20H%205%20z%22%20fill%3D%22%23a5a09c%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A)}.dg-schedule__today_shown_true:after{background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%226%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%205%2C0%20H%205.414%20L%2010%2C4.586%20V%206%20H%208.586%20L%205%2C2.414%201.414%2C6%20H%200%20V%204.586%20L%204.586%2C0%20H%205%20z%22%20fill%3D%22%23a5a09c%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A)}.dg-link,.dg-link:hover{background-position:0 95%;background-size:10px 1px;background-repeat:repeat-x}.dg-link_type_local{background:-webkit-gradient(linear,left top,right top,from(#9cd),color-stop(50%,#9cd),color-stop(50%,transparent));background:-webkit-linear-gradient(left,#9cd,#9cd 50%,transparent 50%);background:linear-gradient(to right,#9cd,#9cd 50%,transparent 50%)}.no-touch .dg-link_type_local:hover{background:-webkit-gradient(linear,left top,right top,from(#9bc),color-stop(50%,#9bc),color-stop(50%,transparent));background:-webkit-linear-gradient(left,#9bc,#9bc 50%,transparent 50%);background:linear-gradient(to right,#9bc,#9bc 50%,transparent 50%)}.dg-link.dg-link_type_local,.dg-link.dg-link_type_local:hover{background-size:6px 1px}.dg-control-round__icon_name_traffic:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2220%22%20height%3D%2214%22%20viewBox%3D%220%200%2020%2014%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%2018%2C5%20C%2018%2C4%2017%2C1%2015%2C1%20H%2012%2010%20C%208%2C1%207%2C4%207%2C5%20H%205%20v%202%20h%201%20v%204%20c%200%2C0.6%200%2C1%201%2C1%20v%202%20h%202%20v%20-2%20h%207%20v%202%20h%202%20v%20-2%20c%201%2C0%201%2C-0.4%201%2C-1%20V%207%20h%201%20V%205%20H%2018%20z%20M%2010%2C3%20h%202%203%20c%202%2C0%202%2C1%202%2C3%20H%208%20C%208%2C4%208%2C3%2010%2C3%20z%20M%209%2C10%20H%208%20C%207.4%2C10%207%2C9.6%207%2C9%207%2C8.4%207.4%2C8%208%2C8%20h%201%20c%200.6%2C0%201%2C0.4%201%2C1%200%2C0.6%20-0.4%2C1%20-1%2C1%20z%20m%208%2C0%20H%2016%20C%2015.4%2C10%2015%2C9.6%2015%2C9%2015%2C8.4%2015.4%2C8%2016%2C8%20h%201%20c%200.6%2C0%201%2C0.4%201%2C1%200%2C0.6%20-0.4%2C1%20-1%2C1%20z%20M%204%2C4%20H%206%20V%203%20H%204%20C%201%2C3%201%2C6%201%2C7%20H%200%20v%201%20h%201%20v%204%20H%203%20V%2011%20H%205%20V%207%20H%202%20C%202%2C6%202%2C4%204%2C4%20z%20M%203%2C9%204%2C10%20H%202%20V%209%20h%201%20z%22%20fill%3D%22%23616161%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%20%20%20%20%3Cg%20fill%3D%22%23fff%22%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22m%2016%2C8%20h%201%20c%200.4%2C0%200.7%2C0.2%200.8%2C0.5%20C%2017.9%2C8.4%2018%2C8.2%2018%2C8%2018%2C7.4%2017.6%2C7%2017%2C7%20h%20-1%20c%20-0.6%2C0%20-1%2C0.4%20-1%2C1%200%2C0.2%200.1%2C0.4%200.2%2C0.5%20C%2015.3%2C8.2%2015.6%2C8%2016%2C8%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208%2C8%20H%209%20C%209.4%2C8%209.7%2C8.2%209.8%2C8.5%209.9%2C8.4%2010%2C8.2%2010%2C8%2010%2C7.4%209.6%2C7%209%2C7%20H%208%20C%207.4%2C7%207%2C7.4%207%2C8%207%2C8.2%207.1%2C8.4%207.2%2C8.5%207.3%2C8.2%207.6%2C8%208%2C8%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206%2C3%20H%204%20C%204%2C3%204%2C3%204%2C3%202%2C3%202%2C5%202%2C6%20H%202%20C%202.1%2C5%202.5%2C4%204%2C4%20H%205%206%20V%203%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M0%207H1V8H0z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2015%2C2%20H%2012%2010%20C%208%2C2%208%2C3%208%2C5%20H%208%20C%208%2C3.7%208.3%2C3%2010%2C3%20h%202%203%20c%201.7%2C0%201.9%2C0.7%202%2C2%20h%200%20C%2017%2C3%2017%2C2%2015%2C2%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M3%209L4%209%203%208%202%208%202%209%202%209%202%209%203%209z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207%2C11%20C%206%2C11%206%2C10.6%206%2C10%20v%201%20c%200%2C0.6%200%2C1%201%2C1%20v%20-1%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22m%2018%2C11%20v%201%20c%201%2C0%201%2C-0.4%201%2C-1%20v%20-1%20c%200%2C0.6%200%2C1%20-1%2C1%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M19%206H20V7H19z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M3%2011L1%2011%201%2012%203%2012%203%2011%205%2011%205%207%205%207%205%2010%203%2010z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M16%2013H18V14H16z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M5%206H6V7H5z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M9%2013L7%2013%207%2014%209%2014%209%2012%2016%2012%2016%2011%209%2011z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cg%20fill%3D%22%23444%22%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202%2C6%20C%202%2C6.4%202%2C6.7%202%2C7%20H%205%20V%206%20H%202%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M2%209L2%2010%204%2010%203%209z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204%2C3%20H%206%20V%202%20H%204%20C%201%2C2%201%2C5%201%2C6%20H%200%20V%207%20H%201%20C%201%2C6%201%2C3%204%2C3%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2018%2C4%20C%2018%2C3%2017%2C0%2015%2C0%20H%2012%2010%20C%208%2C0%207%2C3%207%2C4%20H%206%205%20V%205%20H%207%20C%207%2C4%208%2C1%2010%2C1%20h%202%203%20c%202%2C0%203%2C3%203%2C4%20h%202%20V%204%20h%20-2%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208%2C10%20H%209%20C%209.6%2C10%2010%2C9.6%2010%2C9%2010%2C8.8%209.9%2C8.6%209.8%2C8.5%209.7%2C8.8%209.4%2C9%209%2C9%20H%208%20C%207.6%2C9%207.3%2C8.8%207.2%2C8.5%207.1%2C8.6%207%2C8.8%207%2C9%20c%200%2C0.6%200.4%2C1%201%2C1%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2017%2C6%20C%2017%2C5.6%2017%2C5.3%2017%2C5%20H%208%20c%200%2C0.3%200%2C0.6%200%2C1%20h%209%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2017.8%2C8.5%20C%2017.7%2C8.8%2017.4%2C9%2017%2C9%20H%2016%20C%2015.6%2C9%2015.3%2C8.8%2015.2%2C8.5%2015.1%2C8.6%2015%2C8.8%2015%2C9%20c%200%2C0.6%200.4%2C1%201%2C1%20h%201%20c%200.6%2C0%201%2C-0.4%201%2C-1%200%2C-0.2%20-0.1%2C-0.4%20-0.2%2C-0.5%20z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A);width:20px;height:14px;background-size:20px 14px;position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.dg-control-round__icon_name_traffic:active:after,.no-touch .dg-control-round__icon_name_traffic:hover:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2220%22%20height%3D%2214%22%20viewBox%3D%220%200%2020%2014%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%2018%2C5%20C%2018%2C4%2017%2C1%2015%2C1%20H%2012%2010%20C%208%2C1%207%2C4%207%2C5%20H%205%20v%202%20h%201%20v%204%20c%200%2C0.6%200%2C1%201%2C1%20v%202%20h%202%20v%20-2%20h%207%20v%202%20h%202%20v%20-2%20c%201%2C0%201%2C-0.4%201%2C-1%20V%207%20h%201%20V%205%20H%2018%20z%20M%2010%2C3%20h%202%203%20c%202%2C0%202%2C1%202%2C3%20H%208%20C%208%2C4%208%2C3%2010%2C3%20z%20M%209%2C10%20H%208%20C%207.4%2C10%207%2C9.6%207%2C9%207%2C8.4%207.4%2C8%208%2C8%20h%201%20c%200.6%2C0%201%2C0.4%201%2C1%200%2C0.6%20-0.4%2C1%20-1%2C1%20z%20m%208%2C0%20H%2016%20C%2015.4%2C10%2015%2C9.6%2015%2C9%2015%2C8.4%2015.4%2C8%2016%2C8%20h%201%20c%200.6%2C0%201%2C0.4%201%2C1%200%2C0.6%20-0.4%2C1%20-1%2C1%20z%20M%204%2C4%20H%206%20V%203%20H%204%20C%201%2C3%201%2C6%201%2C7%20H%200%20v%201%20h%201%20v%204%20H%203%20V%2011%20H%205%20V%207%20H%202%20C%202%2C6%202%2C4%204%2C4%20z%20M%203%2C9%204%2C10%20H%202%20V%209%20h%201%20z%22%20fill%3D%22%23424242%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%20%20%20%20%3Cg%20fill%3D%22%23fff%22%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22m%2016%2C8%20h%201%20c%200.4%2C0%200.7%2C0.2%200.8%2C0.5%20C%2017.9%2C8.4%2018%2C8.2%2018%2C8%2018%2C7.4%2017.6%2C7%2017%2C7%20h%20-1%20c%20-0.6%2C0%20-1%2C0.4%20-1%2C1%200%2C0.2%200.1%2C0.4%200.2%2C0.5%20C%2015.3%2C8.2%2015.6%2C8%2016%2C8%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208%2C8%20H%209%20C%209.4%2C8%209.7%2C8.2%209.8%2C8.5%209.9%2C8.4%2010%2C8.2%2010%2C8%2010%2C7.4%209.6%2C7%209%2C7%20H%208%20C%207.4%2C7%207%2C7.4%207%2C8%207%2C8.2%207.1%2C8.4%207.2%2C8.5%207.3%2C8.2%207.6%2C8%208%2C8%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206%2C3%20H%204%20C%204%2C3%204%2C3%204%2C3%202%2C3%202%2C5%202%2C6%20H%202%20C%202.1%2C5%202.5%2C4%204%2C4%20H%205%206%20V%203%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M0%207H1V8H0z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2015%2C2%20H%2012%2010%20C%208%2C2%208%2C3%208%2C5%20H%208%20C%208%2C3.7%208.3%2C3%2010%2C3%20h%202%203%20c%201.7%2C0%201.9%2C0.7%202%2C2%20h%200%20C%2017%2C3%2017%2C2%2015%2C2%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M3%209L4%209%203%208%202%208%202%209%202%209%202%209%203%209z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207%2C11%20C%206%2C11%206%2C10.6%206%2C10%20v%201%20c%200%2C0.6%200%2C1%201%2C1%20v%20-1%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22m%2018%2C11%20v%201%20c%201%2C0%201%2C-0.4%201%2C-1%20v%20-1%20c%200%2C0.6%200%2C1%20-1%2C1%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M19%206H20V7H19z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M3%2011L1%2011%201%2012%203%2012%203%2011%205%2011%205%207%205%207%205%2010%203%2010z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M16%2013H18V14H16z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M5%206H6V7H5z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M9%2013L7%2013%207%2014%209%2014%209%2012%2016%2012%2016%2011%209%2011z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cg%20fill%3D%22%232e2e2e%22%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202%2C6%20C%202%2C6.4%202%2C6.7%202%2C7%20H%205%20V%206%20H%202%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M2%209L2%2010%204%2010%203%209z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204%2C3%20H%206%20V%202%20H%204%20C%201%2C2%201%2C5%201%2C6%20H%200%20V%207%20H%201%20C%201%2C6%201%2C3%204%2C3%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2018%2C4%20C%2018%2C3%2017%2C0%2015%2C0%20H%2012%2010%20C%208%2C0%207%2C3%207%2C4%20H%206%205%20V%205%20H%207%20C%207%2C4%208%2C1%2010%2C1%20h%202%203%20c%202%2C0%203%2C3%203%2C4%20h%202%20V%204%20h%20-2%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208%2C10%20H%209%20C%209.6%2C10%2010%2C9.6%2010%2C9%2010%2C8.8%209.9%2C8.6%209.8%2C8.5%209.7%2C8.8%209.4%2C9%209%2C9%20H%208%20C%207.6%2C9%207.3%2C8.8%207.2%2C8.5%207.1%2C8.6%207%2C8.8%207%2C9%20c%200%2C0.6%200.4%2C1%201%2C1%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2017%2C6%20C%2017%2C5.6%2017%2C5.3%2017%2C5%20H%208%20c%200%2C0.3%200%2C0.6%200%2C1%20h%209%20z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2017.8%2C8.5%20C%2017.7%2C8.8%2017.4%2C9%2017%2C9%20H%2016%20C%2015.6%2C9%2015.3%2C8.8%2015.2%2C8.5%2015.1%2C8.6%2015%2C8.8%2015%2C9%20c%200%2C0.6%200.4%2C1%201%2C1%20h%201%20c%200.6%2C0%201%2C-0.4%201%2C-1%200%2C-0.2%20-0.1%2C-0.4%20-0.2%2C-0.5%20z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A)}.dg-control-round__icon_state_active.dg-control-round__icon_name_traffic:active:after,.dg-control-round__icon_state_active.dg-control-round__icon_name_traffic:after,.no-touch .dg-control-round__icon_state_active.dg-control-round__icon_name_traffic:hover:after{background-image:none}a.dg-traffic-control{z-index:0;color:#f2f2f2;text-decoration:none;text-shadow:0 1px 2px rgba(0,0,0,.3);font:400 15px/32px 'Arial narrow',Arial,sans-serif}a.dg-traffic-control_color_green:after,a.dg-traffic-control_color_red:after,a.dg-traffic-control_color_yellow:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;margin:auto;width:22px;height:22px;border-radius:50%;-webkit-box-shadow:inset 0 1px 0 0 rgba(0,0,0,.2),0 1px 0 0 #fff;box-shadow:inset 0 1px 0 0 rgba(0,0,0,.2),0 1px 0 0 #fff}.no-touch a.dg-traffic-control:hover{color:#f2f2f2}.no-touch a.dg-traffic-control_color_green:hover:after,.no-touch a.dg-traffic-control_color_red:hover:after,.no-touch a.dg-traffic-control_color_yellow:hover:after{width:22px;height:22px}a.dg-traffic-control_color_green:after{background:#3fc03b}.no-touch a.dg-traffic-control_color_green:hover:after,a.dg-traffic-control_color_green:active:after{background:-webkit-gradient(linear,left bottom,left top,from(#2aa731),to(#53e13a)) #3ec435;background:-webkit-linear-gradient(bottom,#2aa731,#53e13a) #3ec435;background:linear-gradient(to top,#2aa731,#53e13a) #3ec435}a.dg-traffic-control_color_yellow:after{background:#f3b223}.no-touch a.dg-traffic-control_color_yellow:hover:after,a.dg-traffic-control_color_yellow:active:after{background:-webkit-gradient(linear,left bottom,left top,from(#ef931b),to(#f7be26)) #f4a820;background:-webkit-linear-gradient(bottom,#ef931b,#f7be26) #f4a820;background:linear-gradient(to top,#ef931b,#f7be26) #f4a820}a.dg-traffic-control_color_red:after{background:#eb240c}.no-touch a.dg-traffic-control_color_red:hover:after,a.dg-traffic-control_color_red:active:after{background:-webkit-gradient(linear,left bottom,left top,from(#c01c0a),to(#f73416)) #db2811;background:-webkit-linear-gradient(bottom,#c01c0a,#f73416) #db2811;background:linear-gradient(to top,#c01c0a,#f73416) #db2811}.leaflet-rulerMarker-pane{z-index:600}.dg-ruler__label{position:absolute;top:0;left:0;z-index:200;-webkit-tap-highlight-color:transparent}.dg-ruler__label-spacer{display:block}.dg-ruler__label-container{display:none;padding:2px 4px;border:4px solid #fff;border-radius:13px;background:#0da5d5;background-clip:padding-box;color:#fff;white-space:nowrap;font-size:12px}.dg-ruler__point{display:inline-block;margin:2px 4px 0 0;width:10px;height:10px;border-radius:5px;background:#fff}.dg-ruler__label-remove-link{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2212%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%206%2C0%20C%202.687%2C0%200%2C2.687%200%2C6%200%2C9.313%202.687%2C12%206%2C12%209.313%2C12%2012%2C9.313%2012%2C6%2012%2C2.687%209.313%2C0%206%2C0%20z%20M%209.401%2C9.398%208.8%2C9.6%206%2C6.8%203.199%2C9.6%202.59%2C9.415%202.375%2C8.774%205.199%2C6%202.399%2C3.175%202.62%2C2.591%203.175%2C2.375%205.949%2C5.225%208.774%2C2.375%209.415%2C2.605%209.566%2C3.196%206.824%2C6%209.6%2C8.8%209.401%2C9.398%20z%22%20fill%3D%22%23fff%22%20fill-rule%3D%22evenodd%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:12px;height:12px;background-size:12px 12px;display:none;margin:1px 0 0 4px;vertical-align:top;-webkit-transition:all .2s ease;transition:all .2s ease}.no-touch .dg-ruler__label-remove-link:hover{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.dg-ruler__remove-link-overlay{position:absolute;top:-7px;right:-7px;bottom:-7px;width:40px}.no-touch .dg-ruler__remove-link-overlay{display:none}.dg-control-round__icon_name_ruler:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%229%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%2012.999%2C0%20v%204.001%20h%20-1%20V%200%20h%20-2%20v%202%20h%20-1%20V%200%20h%20-2%20V%202%20H%206%20V%200%20H%203.998%20v%204.001%20h%20-1%20V%200%20h%20-3%20V%208%20H%2016%20V%200%20z%22%20fill%3D%22%23616161%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%202.999%2C4%20h%201%20v%201%20h%20-1%20z%20m%203%2C-2%20h%201%20v%201%20h%20-1%20z%20m%203%2C0%20h%201%20v%201%20h%20-1%20z%20m%203%2C2%20h%201%20v%201%20h%20-1%20z%22%20fill%3D%22%23444%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%200%2C8%20H%2016%20V%209%20H%200%20z%22%20fill%3D%22%23fff%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%200%2C0%20H%203%20V%201%20H%200%20z%20m%2013%2C0%20h%203%20v%201%20h%20-3%20z%20m%20-3%2C0%20h%202%20V%201%20H%2010%20z%20M%207%2C0%20H%209%20V%201%20H%207%20z%20M%204%2C0%20H%206%20V%201%20H%204%20z%22%20fill%3D%22%23444%22%2F%3E%0A%3C%2Fsvg%3E%0A);width:16px;height:9px;background-size:16px 9px;position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.dg-control-round__icon_name_ruler:active:after,.no-touch .dg-control-round__icon_name_ruler:hover:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%229%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%2012.999%2C0%20v%204.001%20h%20-1%20V%200%20h%20-2%20v%202%20h%20-1%20V%200%20h%20-2%20V%202%20H%206%20V%200%20H%203.998%20v%204.001%20h%20-1%20V%200%20h%20-3%20V%208%20H%2016%20V%200%20z%22%20fill%3D%22%23424242%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%202.999%2C4%20h%201%20v%201%20h%20-1%20z%20m%203%2C-2%20h%201%20v%201%20h%20-1%20z%20m%203%2C0%20h%201%20v%201%20h%20-1%20z%20m%203%2C2%20h%201%20v%201%20h%20-1%20z%22%20fill%3D%22%232e2e2e%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%200%2C8%20H%2016%20V%209%20H%200%20z%22%20fill%3D%22%23fff%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%200%2C0%20H%203%20V%201%20H%200%20z%20m%2013%2C0%20h%203%20v%201%20h%20-3%20z%20m%20-3%2C0%20h%202%20V%201%20H%2010%20z%20M%207%2C0%20H%209%20V%201%20H%207%20z%20M%204%2C0%20H%206%20V%201%20H%204%20z%22%20fill%3D%22%232e2e2e%22%2F%3E%0A%3C%2Fsvg%3E%0A)}.dg-control-round__icon_state_active.dg-control-round__icon_name_ruler:active:after,.dg-control-round__icon_state_active.dg-control-round__icon_name_ruler:after,.no-touch .dg-control-round__icon_state_active.dg-control-round__icon_name_ruler:hover:after{background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%229%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%2012.999%2C0%20v%204.001%20h%20-1%20V%200%20h%20-2%20v%202%20h%20-1%20V%200%20h%20-2%20V%202%20H%206%20V%200%20H%203.999%20v%204.001%20h%20-1%20V%200%20h%20-3%20V%208%20H%2016%20V%200%20z%22%20fill%3D%22%2321a7d6%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22m%202.999%2C4%20h%201%20v%201%20h%20-1%20z%20m%203%2C-2%20h%201%20v%201%20h%20-1%20z%20m%203%2C0%20h%201%20v%201%20h%20-1%20z%20m%203%2C2%20h%201%20v%201%20h%20-1%20z%22%20fill%3D%22%23147596%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%200%2C8%20H%2016%20V%209%20H%200%20z%22%20fill%3D%22%23fff%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M%200%2C0%20H%203%20V%201%20H%200%20z%20m%2013%2C0%20h%203%20v%201%20h%20-3%20z%20m%20-3%2C0%20h%202%20V%201%20H%2010%20z%20M%207%2C0%20H%209%20V%201%20H%207%20z%20M%204%2C0%20H%206%20V%201%20H%204%20z%22%20fill%3D%22%23147596%22%2F%3E%0A%3C%2Fsvg%3E%0A)}\"; (_dereq_(\"browserify-css\").createStyle(css, { \"href\": \"dist/css/styles.full.dark.css\" }, { \"insertAt\": \"bottom\" })); module.exports = css;\n},{\"browserify-css\":3}],2:[function(_dereq_,module,exports){\n(function (process){\n/* reduce implemintation by Mozila https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FReduce*/\nif ('function' !== typeof Array.prototype.reduce) {\n Array.prototype.reduce = function(callback, opt_initialValue){\n 'use strict';\n if (null === this || 'undefined' === typeof this) {\n // At the moment all modern browsers, that support strict mode, have\n // native implementation of Array.prototype.reduce. For instance, IE8\n // does not support strict mode, so this check is actually useless.\n throw new TypeError(\n 'Array.prototype.reduce called on null or undefined');\n }\n if ('function' !== typeof callback) {\n throw new TypeError(callback + ' is not a function');\n }\n var index, value,\n length = this.length >>> 0,\n isValueSet = false;\n if (1 < arguments.length) {\n value = opt_initialValue;\n isValueSet = true;\n }\n for (index = 0; length > index; ++index) {\n if (this.hasOwnProperty(index)) {\n if (isValueSet) {\n value = callback(value, this[index], index, this);\n }\n else {\n value = this[index];\n isValueSet = true;\n }\n }\n }\n if (!isValueSet) {\n throw new TypeError('Reduce of empty array with no initial value');\n }\n return value;\n };\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach\n// Production steps of ECMA-262, Edition 5, 15.4.4.18\n// Reference: http://es5.github.com/#x15.4.4.18\nif (!Array.prototype.forEach) {\n\n Array.prototype.forEach = function forEach(callback, thisArg) {\n 'use strict';\n var T, k;\n\n if (this == null) {\n throw new TypeError(\"this is null or not defined\");\n }\n\n var kValue,\n // 1. Let O be the result of calling ToObject passing the |this| value as the argument.\n O = Object(this),\n\n // 2. Let lenValue be the result of calling the Get internal method of O with the argument \"length\".\n // 3. Let len be ToUint32(lenValue).\n len = O.length >>> 0; // Hack to convert O.length to a UInt32\n\n // 4. If IsCallable(callback) is false, throw a TypeError exception.\n // See: http://es5.github.com/#x9.11\n if ({}.toString.call(callback) !== \"[object Function]\") {\n throw new TypeError(callback + \" is not a function\");\n }\n\n // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.\n if (arguments.length >= 2) {\n T = thisArg;\n }\n\n // 6. Let k be 0\n k = 0;\n\n // 7. Repeat, while k < len\n while (k < len) {\n\n // a. Let Pk be ToString(k).\n // This is implicit for LHS operands of the in operator\n // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.\n // This step can be combined with c\n // c. If kPresent is true, then\n if (k in O) {\n\n // i. Let kValue be the result of calling the Get internal method of O with argument Pk.\n kValue = O[k];\n\n // ii. Call the Call internal method of callback with T as the this value and\n // argument list containing kValue, k, and O.\n callback.call(T, kValue, k, O);\n }\n // d. Increase k by 1.\n k++;\n }\n // 8. return undefined\n };\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\nif (!Object.keys) {\n Object.keys = (function () {\n 'use strict';\n var hasOwnProperty = Object.prototype.hasOwnProperty,\n hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n dontEnums = [\n 'toString',\n 'toLocaleString',\n 'valueOf',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'constructor'\n ],\n dontEnumsLength = dontEnums.length;\n\n return function (obj) {\n if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n throw new TypeError('Object.keys called on non-object');\n }\n\n var result = [], prop, i;\n\n for (prop in obj) {\n if (hasOwnProperty.call(obj, prop)) {\n result.push(prop);\n }\n }\n\n if (hasDontEnumBug) {\n for (i = 0; i < dontEnumsLength; i++) {\n if (hasOwnProperty.call(obj, dontEnums[i])) {\n result.push(dontEnums[i]);\n }\n }\n }\n return result;\n };\n }());\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some\nif (!Array.prototype.some)\n{\n Array.prototype.some = function(fun /*, thisArg */)\n {\n 'use strict';\n\n if (this === void 0 || this === null)\n throw new TypeError();\n\n var t = Object(this);\n var len = t.length >>> 0;\n if (typeof fun !== 'function')\n throw new TypeError();\n\n var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n for (var i = 0; i < len; i++)\n {\n if (i in t && fun.call(thisArg, t[i], i, t))\n return true;\n }\n\n return false;\n };\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map\nif (!Array.prototype.map)\n{\n Array.prototype.map = function(fun /*, thisArg */)\n {\n \"use strict\";\n\n if (this === void 0 || this === null)\n throw new TypeError();\n\n var t = Object(this);\n var len = t.length >>> 0;\n if (typeof fun !== \"function\")\n throw new TypeError();\n\n var res = new Array(len);\n var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n for (var i = 0; i < len; i++)\n {\n // NOTE: Absolute correctness would demand Object.defineProperty\n // be used. But this method is fairly new, and failure is\n // possible only if Object.prototype or Array.prototype\n // has a property |i| (very unlikely), so use a less-correct\n // but more portable alternative.\n if (i in t)\n res[i] = fun.call(thisArg, t[i], i, t);\n }\n\n return res;\n };\n}\n\n//From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter\nif (!Array.prototype.filter)\n{\n Array.prototype.filter = function(fun /*, thisArg */)\n {\n \"use strict\";\n\n if (this === void 0 || this === null)\n throw new TypeError();\n\n var t = Object(this);\n var len = t.length >>> 0;\n if (typeof fun != \"function\")\n throw new TypeError();\n\n var res = [];\n var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n for (var i = 0; i < len; i++)\n {\n if (i in t)\n {\n var val = t[i];\n\n // NOTE: Technically this should Object.defineProperty at\n // the next index, as push can be affected by\n // properties on Object.prototype and Array.prototype.\n // But that method's new, and collisions should be\n // rare, so use the more-compatible alternative.\n if (fun.call(thisArg, val, i, t))\n res.push(val);\n }\n }\n\n return res;\n };\n}\n\n//From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind\nif (!Function.prototype.bind) {\n Function.prototype.bind = function (oThis) {\n if (typeof this !== \"function\") {\n // closest thing possible to the ECMAScript 5 internal IsCallable function\n throw new TypeError(\"Function.prototype.bind - what is trying to be bound is not callable\");\n }\n\n var aArgs = Array.prototype.slice.call(arguments, 1),\n fToBind = this,\n fNOP = function () {},\n fBound = function () {\n return fToBind.apply(this instanceof fNOP && oThis\n ? this\n : oThis,\n aArgs.concat(Array.prototype.slice.call(arguments)));\n };\n\n fNOP.prototype = this.prototype;\n fBound.prototype = new fNOP();\n\n return fBound;\n };\n}\n\n//From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FindexOf\nif (!Array.prototype.indexOf) {\n Array.prototype.indexOf = function (searchElement, fromIndex) {\n if ( this === undefined || this === null ) {\n throw new TypeError( '\"this\" is null or not defined' );\n }\n\n var length = this.length >>> 0; // Hack to convert object.length to a UInt32\n\n fromIndex = +fromIndex || 0;\n\n if (Math.abs(fromIndex) === Infinity) {\n fromIndex = 0;\n }\n\n if (fromIndex < 0) {\n fromIndex += length;\n if (fromIndex < 0) {\n fromIndex = 0;\n }\n }\n\n for (;fromIndex < length; fromIndex++) {\n if (this[fromIndex] === searchElement) {\n return fromIndex;\n }\n }\n\n return -1;\n };\n}\n\nif (typeof Promise !== 'function') {\n (function() {\n var define, requireModule, _dereq_, requirejs;\n\n (function() {\n var registry = {}, seen = {};\n\n define = function(name, deps, callback) {\n registry[name] = { deps: deps, callback: callback };\n };\n\n requirejs = _dereq_ = requireModule = function(name) {\n requirejs._eak_seen = registry;\n\n if (seen[name]) { return seen[name]; }\n seen[name] = {};\n\n if (!registry[name]) {\n throw new Error(\"Could not find module \" + name);\n }\n\n var mod = registry[name],\n deps = mod.deps,\n callback = mod.callback,\n reified = [],\n exports;\n\n for (var i=0, l=deps.length; i<l; i++) {\n if (deps[i] === 'exports') {\n reified.push(exports = {});\n } else {\n reified.push(requireModule(resolve(deps[i])));\n }\n }\n\n var value = callback.apply(this, reified);\n return seen[name] = exports || value;\n\n function resolve(child) {\n if (child.charAt(0) !== '.') { return child; }\n var parts = child.split(\"/\");\n var parentBase = name.split(\"/\").slice(0, -1);\n\n for (var i=0, l=parts.length; i<l; i++) {\n var part = parts[i];\n\n if (part === '..') { parentBase.pop(); }\n else if (part === '.') { continue; }\n else { parentBase.push(part); }\n }\n\n return parentBase.join(\"/\");\n }\n };\n })();\n\n define(\"promise/all\",\n [\"./utils\",\"exports\"],\n function(__dependency1__, __exports__) {\n \"use strict\";\n /* global toString */\n\n var isArray = __dependency1__.isArray;\n var isFunction = __dependency1__.isFunction;\n\n /**\n Returns a promise that is fulfilled when all the given promises have been\n fulfilled, or rejected if any of them become rejected. The return promise\n is fulfilled with an array that gives all the values in the order they were\n passed in the `promises` array argument.\n\n Example:\n\n ```javascript\n var promise1 = RSVP.resolve(1);\n var promise2 = RSVP.resolve(2);\n var promise3 = RSVP.resolve(3);\n var promises = [ promise1, promise2, promise3 ];\n\n RSVP.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `RSVP.all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n var promise1 = RSVP.resolve(1);\n var promise2 = RSVP.reject(new Error(\"2\"));\n var promise3 = RSVP.reject(new Error(\"3\"));\n var promises = [ promise1, promise2, promise3 ];\n\n RSVP.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @for RSVP\n @param {Array} promises\n @param {String} label\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n */\n function all(promises) {\n /*jshint validthis:true */\n var Promise = this;\n\n if (!isArray(promises)) {\n throw new TypeError('You must pass an array to all.');\n }\n\n return new Promise(function(resolve, reject) {\n var results = [], remaining = promises.length,\n promise;\n\n if (remaining === 0) {\n resolve([]);\n }\n\n function resolver(index) {\n return function(value) {\n resolveAll(index, value);\n };\n }\n\n function resolveAll(index, value) {\n results[index] = value;\n if (--remaining === 0) {\n resolve(results);\n }\n }\n\n for (var i = 0; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && isFunction(promise.then)) {\n promise.then(resolver(i), reject);\n } else {\n resolveAll(i, promise);\n }\n }\n });\n }\n\n __exports__.all = all;\n });\n define(\"promise/asap\",\n [\"exports\"],\n function(__exports__) {\n \"use strict\";\n var browserGlobal = (typeof window !== 'undefined') ? window : {};\n var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\n var local = window;\n\n // node\n function useNextTick() {\n return function() {\n process.nextTick(flush);\n };\n }\n\n function useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function() {\n node.data = (iterations = ++iterations % 2);\n };\n }\n\n function useSetTimeout() {\n return function() {\n local.setTimeout(flush, 1);\n };\n }\n\n var queue = [];\n function flush() {\n for (var i = 0; i < queue.length; i++) {\n var tuple = queue[i];\n var callback = tuple[0], arg = tuple[1];\n callback(arg);\n }\n queue = [];\n }\n\n var scheduleFlush;\n\n // Decide what async method to use to triggering processing of queued callbacks:\n if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n scheduleFlush = useNextTick();\n } else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n } else {\n scheduleFlush = useSetTimeout();\n }\n\n function asap(callback, arg) {\n var length = queue.push([callback, arg]);\n if (length === 1) {\n // If length is 1, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n scheduleFlush();\n }\n }\n\n __exports__.asap = asap;\n });\n define(\"promise/config\",\n [\"exports\"],\n function(__exports__) {\n \"use strict\";\n var config = {\n instrument: false\n };\n\n function configure(name, value) {\n if (arguments.length === 2) {\n config[name] = value;\n } else {\n return config[name];\n }\n }\n\n __exports__.config = config;\n __exports__.configure = configure;\n });\n define(\"promise/polyfill\",\n [\"./promise\",\"./utils\",\"exports\"],\n function(__dependency1__, __dependency2__, __exports__) {\n \"use strict\";\n /*global self*/\n var RSVPPromise = __dependency1__.Promise;\n var isFunction = __dependency2__.isFunction;\n\n function polyfill() {\n var local;\n\n if (typeof window !== 'undefined' && window.document) {\n local = window;\n } else {\n local = self;\n }\n\n var es6PromiseSupport =\n \"Promise\" in local &&\n // Some of these methods are missing from\n // Firefox/Chrome experimental implementations\n \"resolve\" in local.Promise &&\n \"reject\" in local.Promise &&\n \"all\" in local.Promise &&\n \"race\" in local.Promise &&\n // Older version of the spec had a resolver object\n // as the arg rather than a function\n (function() {\n var resolve;\n new local.Promise(function(r) { resolve = r; });\n return isFunction(resolve);\n }());\n\n if (!es6PromiseSupport) {\n local.Promise = RSVPPromise;\n }\n }\n\n __exports__.polyfill = polyfill;\n });\n define(\"promise/promise\",\n [\"./config\",\"./utils\",\"./all\",\"./race\",\"./resolve\",\"./reject\",\"./asap\",\"exports\"],\n function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {\n \"use strict\";\n var config = __dependency1__.config;\n var configure = __dependency1__.configure;\n var objectOrFunction = __dependency2__.objectOrFunction;\n var isFunction = __dependency2__.isFunction;\n var now = __dependency2__.now;\n var all = __dependency3__.all;\n var race = __dependency4__.race;\n var staticResolve = __dependency5__.resolve;\n var staticReject = __dependency6__.reject;\n var asap = __dependency7__.asap;\n\n var counter = 0;\n\n config.async = asap; // default async is asap;\n\n function Promise(resolver) {\n if (!isFunction(resolver)) {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n }\n\n if (!(this instanceof Promise)) {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n }\n\n this._subscribers = [];\n\n invokeResolver(resolver, this);\n }\n\n function invokeResolver(resolver, promise) {\n function resolvePromise(value) {\n resolve(promise, value);\n }\n\n function rejectPromise(reason) {\n reject(promise, reason);\n }\n\n try {\n resolver(resolvePromise, rejectPromise);\n } catch(e) {\n rejectPromise(e);\n }\n }\n\n function invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value, error, succeeded, failed;\n\n if (hasCallback) {\n try {\n value = callback(detail);\n succeeded = true;\n } catch(e) {\n failed = true;\n error = e;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (handleThenable(promise, value)) {\n return;\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n resolve(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n }\n\n var PENDING = void 0;\n var SEALED = 0;\n var FULFILLED = 1;\n var REJECTED = 2;\n\n function subscribe(parent, child, onFulfillment, onRejection) {\n var subscribers = parent._subscribers;\n var length = subscribers.length;\n\n subscribers[length] = child;\n subscribers[length + FULFILLED] = onFulfillment;\n subscribers[length + REJECTED] = onRejection;\n }\n\n function publish(promise, settled) {\n var child, callback, subscribers = promise._subscribers, detail = promise._detail;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n invokeCallback(settled, child, callback, detail);\n }\n\n promise._subscribers = null;\n }\n\n Promise.prototype = {\n constructor: Promise,\n\n _state: undefined,\n _detail: undefined,\n _subscribers: undefined,\n\n then: function(onFulfillment, onRejection) {\n var promise = this;\n\n var thenPromise = new this.constructor(function() {});\n\n if (this._state) {\n var callbacks = arguments;\n config.async(function invokePromiseCallback() {\n invokeCallback(promise._state, thenPromise, callbacks[promise._state - 1], promise._detail);\n });\n } else {\n subscribe(this, thenPromise, onFulfillment, onRejection);\n }\n\n return thenPromise;\n },\n\n 'catch': function(onRejection) {\n return this.then(null, onRejection);\n }\n };\n\n Promise.all = all;\n Promise.race = race;\n Promise.resolve = staticResolve;\n Promise.reject = staticReject;\n\n function handleThenable(promise, value) {\n var then = null,\n resolved;\n\n try {\n if (promise === value) {\n throw new TypeError(\"A promises callback cannot return that same promise.\");\n }\n\n if (objectOrFunction(value)) {\n then = value.then;\n\n if (isFunction(then)) {\n then.call(value, function(val) {\n if (resolved) { return true; }\n resolved = true;\n\n if (value !== val) {\n resolve(promise, val);\n } else {\n fulfill(promise, val);\n }\n }, function(val) {\n if (resolved) { return true; }\n resolved = true;\n\n reject(promise, val);\n });\n\n return true;\n }\n }\n } catch (error) {\n if (resolved) { return true; }\n reject(promise, error);\n return true;\n }\n\n return false;\n }\n\n function resolve(promise, value) {\n if (promise === value) {\n fulfill(promise, value);\n } else if (!handleThenable(promise, value)) {\n fulfill(promise, value);\n }\n }\n\n function fulfill(promise, value) {\n if (promise._state !== PENDING) { return; }\n promise._state = SEALED;\n promise._detail = value;\n\n config.async(publishFulfillment, promise);\n }\n\n function reject(promise, reason) {\n if (promise._state !== PENDING) { return; }\n promise._state = SEALED;\n promise._detail = reason;\n\n config.async(publishRejection, promise);\n }\n\n function publishFulfillment(promise) {\n publish(promise, promise._state = FULFILLED);\n }\n\n function publishRejection(promise) {\n publish(promise, promise._state = REJECTED);\n }\n\n __exports__.Promise = Promise;\n });\n define(\"promise/race\",\n [\"./utils\",\"exports\"],\n function(__dependency1__, __exports__) {\n \"use strict\";\n /* global toString */\n var isArray = __dependency1__.isArray;\n\n /**\n `RSVP.race` allows you to watch a series of promises and act as soon as the\n first promise given to the `promises` argument fulfills or rejects.\n\n Example:\n\n ```javascript\n var promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve(\"promise 1\");\n }, 200);\n });\n\n var promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve(\"promise 2\");\n }, 100);\n });\n\n RSVP.race([promise1, promise2]).then(function(result){\n // result === \"promise 2\" because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `RSVP.race` is deterministic in that only the state of the first completed\n promise matters. For example, even if other promises given to the `promises`\n array argument are resolved, but the first completed promise has become\n rejected before the other promises became fulfilled, the returned promise\n will become rejected:\n\n ```javascript\n var promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve(\"promise 1\");\n }, 200);\n });\n\n var promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error(\"promise 2\"));\n }, 100);\n });\n\n RSVP.race([promise1, promise2]).then(function(result){\n // Code here never runs because there are rejected promises!\n }, function(reason){\n // reason.message === \"promise2\" because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n @method race\n @for RSVP\n @param {Array} promises array of promises to observe\n @param {String} label optional string for describing the promise returned.\n Useful for tooling.\n @return {Promise} a promise that becomes fulfilled with the value the first\n completed promises is resolved with if the first completed promise was\n fulfilled, or rejected with the reason that the first completed promise\n was rejected with.\n */\n function race(promises) {\n /*jshint validthis:true */\n var Promise = this;\n\n if (!isArray(promises)) {\n throw new TypeError('You must pass an array to race.');\n }\n return new Promise(function(resolve, reject) {\n var results = [], promise;\n\n for (var i = 0; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolve, reject);\n } else {\n resolve(promise);\n }\n }\n });\n }\n\n __exports__.race = race;\n });\n define(\"promise/reject\",\n [\"exports\"],\n function(__exports__) {\n \"use strict\";\n /**\n `RSVP.reject` returns a promise that will become rejected with the passed\n `reason`. `RSVP.reject` is essentially shorthand for the following:\n\n ```javascript\n var promise = new RSVP.Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n var promise = RSVP.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @for RSVP\n @param {Any} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become rejected with the given\n `reason`.\n */\n function reject(reason) {\n /*jshint validthis:true */\n var Promise = this;\n\n return new Promise(function (resolve, reject) {\n reject(reason);\n });\n }\n\n __exports__.reject = reject;\n });\n define(\"promise/resolve\",\n [\"exports\"],\n function(__exports__) {\n \"use strict\";\n function resolve(value) {\n /*jshint validthis:true */\n if (value && typeof value === 'object' && value.constructor === this) {\n return value;\n }\n\n var Promise = this;\n\n return new Promise(function(resolve) {\n resolve(value);\n });\n }\n\n __exports__.resolve = resolve;\n });\n define(\"promise/utils\",\n [\"exports\"],\n function(__exports__) {\n \"use strict\";\n function objectOrFunction(x) {\n return isFunction(x) || (typeof x === \"object\" && x !== null);\n }\n\n function isFunction(x) {\n return typeof x === \"function\";\n }\n\n function isArray(x) {\n return Object.prototype.toString.call(x) === \"[object Array]\";\n }\n\n // Date.now is not available in browsers < IE9\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility\n var now = Date.now || function() { return new Date().getTime(); };\n\n\n __exports__.objectOrFunction = objectOrFunction;\n __exports__.isFunction = isFunction;\n __exports__.isArray = isArray;\n __exports__.now = now;\n });\n requireModule('promise/polyfill').polyfill();\n }());\n}\n\n_dereq_('leaflet');\n_dereq_('html5shiv');\n\n// DG inheritance\nvar oldDG = window.DG;\nvar DG = new (\n (function() {\n var DgApi = function() {},\n DgApiCore = function() {};\n\n DgApiCore.prototype = L;\n DgApi.prototype = new DgApiCore();\n\n return DgApi;\n })()\n)();\n\nfor (var prop in oldDG) {\n if (oldDG.hasOwnProperty(prop) && typeof DG[prop] === 'undefined') {\n DG[prop] = oldDG[prop];\n }\n}\n\nwindow.__dgApi__ = window.__dgApi__ || {};\nDG.version = window.__dgApi__.version;\nDG.Icon.Default.imagePath = '../img/vendors/leaflet';\n\nDG.Map.addInitHook((function() {\n var inited = false;\n\n // Analytics inited once\n return function() {\n if (!inited) {\n /*eslint-disable */\n (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n })(window,document,'script',DG.config.googleAnalytics,'ga');\n /*eslint-enable */\n\n inited = true;\n }\n\n /*eslint-disable */\n ga('create', DG.config.gaCode, {\n storage: 'none', // don't store and use cookies thanks GDPR\n name: DG.config.gaName,\n sampleRate: 50\n });\n ga(DG.config.gaName + '.set', 'anonymizeIp', true);\n ga(DG.config.gaName + '.send', 'pageview');\n /*eslint-enable */\n };\n})());\n\n// Improve IHandler\nDG.Map.include({\n addHandler: function(name, HandlerClass) {\n if (!HandlerClass) { return this; }\n\n var options = this.options[name],\n param = (options === Object(options)) ? options : null,\n handler = this[name] = new HandlerClass(this, param);\n\n this._handlers.push(handler);\n\n if (options) {\n handler.enable();\n }\n\n return this;\n }\n});\n\n// Apply class to map container for detect when we dont need hover effects\nDG.Map.addInitHook(function() {\n if (!DG.Browser.touchEnabled) {\n DG.DomUtil.addClass(this._container, 'no-touch');\n }\n});\n\nwindow.DG = DG;\nmodule.exports = DG;\n\nvar handlers = window.__dgApi__.callbacks || [],\n chain = Promise.resolve();\n\nhandlers.forEach(function(handlers) {\n chain = chain.then(handlers[0], handlers[1]);\n});\n\nDG.then = function(resolve, reject) {\n return chain.then(resolve, reject);\n};\n\n// IE8 throw error if `chain.catch`\n/* eslint-disable dot-notation, no-console */\nchain['catch'](function(err) {\n console.error(err);\n});\n/* eslint-enable dot-notation, no-console */\n\nDG.plugin = function(plugins) {\n var count,\n jsReg = new RegExp(/.js$/i),\n cssReg = new RegExp(/.css$/i);\n\n return new Promise(function(resolve) {\n function checkLoading() {\n count--;\n\n if (count === 0) {\n resolve();\n }\n }\n\n function appendJS(link) {\n var js = document.createElement('script');\n js.setAttribute('type', 'text/javascript');\n js.setAttribute('src', link);\n js.onload = function() {\n checkLoading();\n };\n js.onerror = function() {\n checkLoading();\n };\n // load/error for IE\n js.onreadystatechange = function() {\n if (js.readyState === 'complete' || js.readyState === 'loaded') {\n checkLoading();\n }\n };\n\n document.getElementsByTagName('head')[0].appendChild(js);\n }\n\n function appendCSS(link) {\n var css = document.createElement('link');\n css.setAttribute('rel', 'stylesheet');\n css.setAttribute('type', 'text/css');\n css.setAttribute('href', link);\n document.getElementsByTagName('head')[0].appendChild(css);\n\n checkLoading();\n }\n\n function isJs(url) {\n return jsReg.test(url);\n }\n\n function isCss(url) {\n return cssReg.test(url);\n }\n\n function appendAsset(asset) {\n if (isJs(asset)) {\n appendJS(asset);\n } else if (isCss(asset)) {\n appendCSS(asset);\n } else {\n count--;\n }\n }\n\n if (DG.Util.isArray(plugins)) {\n count = plugins.length;\n plugins.forEach(function(plugin) {\n appendAsset(plugin);\n });\n }\n\n if (typeof plugins === 'string') {\n count = 1;\n appendAsset(plugins);\n }\n });\n};\n\nDG.ajax = (function() {\n\n var win = window,\n doc = document,\n\n rurl = /^([\\w.+-]+:)?(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n twoHundo = /^20\\d$/,\n\n // Document location\n ajaxLocParts,\n ajaxLocation,\n\n byTag = 'getElementsByTagName',\n readyState = 'readyState',\n contentType = 'Content-Type',\n requestedWith = 'X-Requested-With',\n head = doc[byTag]('head')[0],\n uniqid = 0,\n callbackPrefix = 'l_dg_ajax_callback_' + (+new Date()),\n lastValue, // data stored by the most recent JSONP callback\n xmlHttpRequest = 'XMLHttpRequest',\n xDomainRequest = 'XDomainRequest', // IE 8 and 9 only\n noop = function() {},\n defaultHeaders = {\n contentType: 'application/x-www-form-urlencoded',\n requestedWith: xmlHttpRequest,\n accept: {\n '*': 'text/javascript, text/html, application/xml, text/xml, */*',\n xml: 'application/xml, text/xml',\n html: 'text/html',\n text: 'text/plain',\n json: 'application/json, text/javascript',\n js: 'application/javascript, text/javascript'\n }\n },\n /*global XDomainRequest:false */\n xhr = function(o) {\n // is it x-domain\n if (o.crossDomain === true) {\n var xhr = win[xmlHttpRequest] ? new XMLHttpRequest() : null;\n if (xhr && 'withCredentials' in xhr) {\n return xhr;\n } else if (win[xDomainRequest]) {\n return new XDomainRequest();\n } else {\n throw new Error('Browser does not support cross-origin requests');\n }\n } else {\n return new XMLHttpRequest();\n }\n },\n\n globalSetupOptions = {\n dataFilter: function(data) {\n return data;\n }\n };\n\n // IE may throw an exception when accessing\n // a field from window.location if document.domain has been set\n try {\n ajaxLocation = location.href;\n } catch (e) {\n // Use the href attribute of an A element\n // since IE will modify it given document.location\n ajaxLocation = document.createElement('a');\n ajaxLocation.href = '';\n ajaxLocation = ajaxLocation.href;\n }\n\n // Segment location into parts\n ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || [];\n\n function handleReadyState(r, success, error) {\n return function() {\n // use _aborted to mitigate against IE err c00c023f\n // (can't read props on aborted request objects)\n if (r._aborted) {\n return error(r.request);\n }\n if (r.request && r.request[readyState] === 4) {\n r.request.onreadystatechange = noop;\n if (twoHundo.test(r.request.status)) {\n success(r.request);\n } else {\n error(r.request);\n }\n }\n };\n }\n\n function setHeaders(http, o) {\n var headers = o.headers || {},\n h;\n\n headers.Accept = headers.Accept || defaultHeaders.accept[o.dataType] || defaultHeaders.accept['*'];\n\n // breaks cross-origin requests with legacy browsers\n if (!o.crossDomain && !headers[requestedWith]) {\n headers[requestedWith] = defaultHeaders.requestedWith;\n }\n if (!headers[contentType]) {\n headers[contentType] = o.contentType || defaultHeaders.contentType;\n }\n for (h in headers) {\n if (headers.hasOwnProperty(h) && 'setRequestHeader' in http) {\n http.setRequestHeader(h, headers[h]);\n }\n }\n }\n\n function setCredentials(http, o) {\n if (typeof o.withCredentials !== 'undefined' && typeof http.withCredentials !== 'undefined') {\n http.withCredentials = !!o.withCredentials;\n }\n }\n\n function generalCallback(data) {\n lastValue = data;\n }\n\n function urlappend(url, s) {\n return url + (/\\?/.test(url) ? '&' : '?') + s;\n }\n\n function handleJsonp(o, fn, err, url) {\n var reqId = uniqid++,\n cbkey = o.jsonpCallback || 'callback', // the 'callback' key\n cbval = o.jsonpCallbackName || callbackPrefix,\n cbreg = new RegExp('((^|\\\\?|&)' + cbkey + ')=([^&]+)'),\n match = url.match(cbreg),\n script = doc.createElement('script'),\n loaded = 0,\n isIE10 = navigator.userAgent.indexOf('MSIE 10.0') !== -1;\n\n if (match) {\n if (match[3] === '?') {\n url = url.replace(cbreg, '$1=' + cbval); // wildcard callback func name\n } else {\n cbval = match[3]; // provided callback func name\n }\n } else {\n url = urlappend(url, cbkey + '=' + cbval); // no callback details, add 'em\n }\n\n win[cbval] = generalCallback;\n\n script.type = 'text/javascript';\n script.src = url;\n script.async = true;\n if (typeof script.onreadystatechange !== 'undefined' && !isIE10) {\n // need this for IE due to out-of-order onreadystatechange(), binding script\n // execution to an event listener gives us control over when the script\n // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html\n //\n // if this hack is used in IE10 jsonp callback are never called\n script.event = 'onclick';\n script.htmlFor = script.id = '_request_' + reqId;\n }\n\n script.onerror = function() {\n script.onerror = script.onload = script.onreadystatechange = null;\n err({}, 'Request unknown error', {});\n lastValue = undefined;\n head.removeChild(script);\n loaded = 1;\n };\n script.onload = script.onreadystatechange = function() {\n if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) {\n return false;\n }\n script.onerror = script.onload = script.onreadystatechange = null;\n if (script.onclick) {\n script.onclick();\n }\n // Call the user callback with the last value stored and clean up values and scripts.\n fn(lastValue);\n lastValue = undefined;\n head.removeChild(script);\n loaded = 1;\n };\n\n // Add the script to the DOM head\n head.appendChild(script);\n\n // Enable JSONP timeout\n return {\n abort: function() {\n script.onerror = script.onload = script.onreadystatechange = null;\n err({}, 'Request is aborted: timeout', {});\n lastValue = undefined;\n head.removeChild(script);\n loaded = 1;\n }\n };\n }\n\n function getRequest(fn, err) {\n var o = this.options,\n method = (o.type || 'GET').toUpperCase(),\n url = typeof o === 'string' ? o : o.url,\n // convert non-string objects to query-string form unless o.processData is false\n data = (o.processData !== false && o.data && typeof o.data !== 'string') ? Ajax.toQueryString(o.data) : (o.data || null),\n http,\n sendWait = false;\n\n // if we're working on a GET request and we have data then we should append\n // query string to end of URL and not post data\n if ((o.type === 'jsonp' || method === 'GET') && data) {\n url = urlappend(url, data);\n data = null;\n }\n\n if (o.type === 'jsonp') {\n return handleJsonp(o, fn, err, url);\n }\n\n http = xhr(o);\n http.open(method, url, o.async !== false);\n\n setHeaders(http, o);\n setCredentials(http, o);\n\n if (win[xDomainRequest] && http instanceof win[xDomainRequest]) {\n http.onload = fn;\n http.onprogress = function() {};\n http.ontimeout = function() {};\n http.onerror = err;\n sendWait = true;\n } else {\n http.onreadystatechange = handleReadyState(this, fn, err);\n }\n if (sendWait) {\n setTimeout(function() {\n http.send(data);\n }, 200);\n } else {\n http.send(data);\n }\n return http;\n }\n\n function buildParams(prefix, obj, traditional, add) {\n var name, i, v,\n rbracket = /\\[\\]$/;\n\n if (DG.Util.isArray(obj)) {\n // Serialize array item.\n for (i = 0; obj && i < obj.length; i++) {\n v = obj[i];\n if (traditional || rbracket.test(prefix)) {\n // Treat each array item as a scalar.\n add(prefix, v);\n } else {\n buildParams(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add);\n }\n }\n } else if (obj && obj.toString() === '[object Object]') {\n // Serialize object item.\n for (name in obj) {\n if (obj.hasOwnProperty(name)) {\n buildParams(prefix + '[' + name + ']', obj[name], traditional, add);\n }\n }\n } else {\n // Serialize scalar item.\n add(prefix, obj);\n }\n }\n\n function setType(url) {\n var m = url.match(/\\.(json|jsonp|html|xml)(\\?|$)/);\n return m ? m[1] : 'js';\n }\n\n function isCrossDomain(url) {\n var parts = rurl.exec(url.toLowerCase());\n return !!(parts &&\n (parts[1] !== ajaxLocParts[1] || parts[2] !== ajaxLocParts[2] ||\n (parts[3] || (parts[1] === 'http:' ? '80' : '443')) !==\n (ajaxLocParts[3] || (ajaxLocParts[1] === 'http:' ? '80' : '443')))\n );\n }\n\n function doRequest(o) {\n\n if (!('crossDomain' in o)) {\n o.crossDomain = isCrossDomain(o.url);\n }\n\n var self = {};\n self.promise = new Promise(function(resolve, reject) {\n self.abort = function() {\n self._aborted = true;\n reject('aborted');\n };\n\n self.url = o.url;\n self.timeout = null;\n self.options = o;\n\n self._aborted = false;\n self._erred = false;\n self._responseArgs = {};\n\n var type = o.type === 'jsonp' ? o.type : (o.dataType || setType(self.url));\n\n if (o.timeout) {\n self.timeout = setTimeout(function() {\n self.abort();\n }, o.timeout);\n }\n\n function complete(resp) {\n if (o.timeout) {\n clearTimeout(self.timeout);\n }\n self.timeout = null;\n if (self._erred) {\n reject(resp);\n } else {\n resolve(resp);\n }\n }\n\n function success(resp) {\n resp = (type !== 'jsonp') ? self.request : resp;\n // use global data filter on response text\n var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type),\n r = filteredResponse;\n\n try {\n resp.responseText = r;\n } catch (e) {\n // can't assign this in IE<=8, just ignore\n }\n /* eslint-disable no-eval */\n if (r) {\n switch (type) {\n case 'json':\n try {\n resp = win.JSON.parse(r);\n } catch (err) {\n return error(resp, 'Could not parse JSON in response', err);\n }\n break;\n case 'js':\n resp = eval('(' + r + ')');\n break;\n case 'html':\n resp = r;\n break;\n case 'xml':\n resp = resp.responseXML && resp.responseXML.parseError && resp.responseXML.parseError.errorCode && resp.responseXML.parseError.reason ? null : resp.responseXML;\n break;\n }\n }\n /* eslint-enable no-eval */\n self._responseArgs.resp = resp;\n complete(resp);\n }\n\n function error(resp, msg, t) {\n resp = self.request;\n self._responseArgs.resp = resp;\n self._responseArgs.msg = msg;\n self._responseArgs.t = t;\n self._erred = true;\n complete(resp);\n }\n\n self.request = getRequest.call(self, success, error);\n });\n\n return self;\n }\n\n function Ajax(url, options) {\n\n if (Object.prototype.toString.call(url) === '[object Object]') {\n options = url;\n url = undefined;\n }\n options = options || {};\n options.url = url || options.url;\n\n var requestPromise = doRequest(options),\n resultPromise = requestPromise.promise;\n\n if (options.success || options.error || options.complete) {\n resultPromise.then(options.success, options.error);\n }\n\n resultPromise.abort = requestPromise.abort;\n\n return resultPromise;\n }\n\n Ajax.setup = function(options) {\n options = options || {};\n for (var k in options) {\n if (options.hasOwnProperty(k)) {\n globalSetupOptions[k] = options[k];\n }\n }\n };\n\n Ajax.toQueryString = function(o, trad) {\n var prefix, i,\n traditional = trad || false,\n s = [],\n enc = encodeURIComponent,\n add = function(key, value) {\n // If value is a function, invoke it and return its value\n if (typeof value == 'function') {\n value = value();\n } else {\n value = value || '';\n }\n\n s[s.length] = enc(key) + '=' + enc(value);\n };\n\n // If an array was passed in, assume that it is an array of form elements.\n if (DG.Util.isArray(o)) {\n for (i = 0; o && i < o.length; i++) {\n add(o[i].name, o[i].value);\n }\n } else {\n // If traditional, encode the \"old\" way (the way 1.3.2 or older\n // did it), otherwise encode params recursively.\n for (prefix in o) {\n if (o.hasOwnProperty(prefix)) {\n buildParams(prefix, o[prefix], traditional, add);\n }\n }\n }\n\n // spaces should be + according to spec\n return s.join('&').replace(/%20/g, '+');\n };\n\n var testxhr = win[xmlHttpRequest] ? new XMLHttpRequest() : null;\n\n Ajax.corsSupport = !(!(testxhr && 'withCredentials' in testxhr) && !win[xDomainRequest]) &&\n // cors not available in IE and with cyrillic domain\n !(DG.Browser.ie && document.location.host.toLowerCase().search(/[а-Ñ]/) != -1);\n\n return Ajax;\n})();\n\nDG.Wkt = {};\n\nDG.Wkt.toGeoJSON = function (data) {\n if (DG.Util.isArray(data)) {\n data = data[0];\n }\n var parts = data.split(';');\n data = parts.pop();\n\n var i = 0,\n srid = (parts.shift() || '').split('=').pop();\n\n function $(re) {\n var match = data.substring(i).match(re);\n if (!match) {\n return null;\n }\n else {\n i += match[0].length;\n return match[0];\n }\n }\n\n function crs(obj) {\n if (obj && srid.match(/\\d+/)) {\n obj.crs = {\n type: 'name',\n 'properties': {\n name: 'urn:ogc:def:crs:EPSG::' + srid\n }\n };\n }\n\n return obj;\n }\n\n function white() { $(/^\\s*/); }\n\n function multicoords() {\n white();\n var depth = 0, rings = [], stack = [rings],\n pointer = rings, elem;\n while (elem =\n $(/^(\\()/) ||\n $(/^(\\))/) ||\n $(/^(\\,)/) ||\n $(/^[-+]?([0-9]*\\.[0-9]+|[0-9]+)/)) {\n if (elem === '(') {\n stack.push(pointer);\n pointer = [];\n stack[stack.length - 1].push(pointer);\n depth++;\n } else if (elem === ')') {\n pointer = stack.pop();\n depth--;\n if (depth === 0) {\n break;\n }\n } else if (elem === ',') {\n pointer = [];\n stack[stack.length - 1].push(pointer);\n } else {\n pointer.push(parseFloat(elem));\n }\n white();\n }\n stack.length = 0;\n if (depth !== 0) {\n return null;\n }\n return rings;\n }\n\n function coords() {\n var list = [], item, pt;\n while (pt =\n $(/^[-+]?([0-9]*\\.[0-9]+|[0-9]+)/) ||\n $(/^(\\,)/)) {\n if (pt === ',') {\n list.push(item);\n item = [];\n } else {\n if (!item) {\n item = [];\n }\n item.push(parseFloat(pt));\n }\n white();\n }\n if (item) {\n list.push(item);\n }\n return list.length ? list : null;\n }\n\n function point() {\n if (!$(/^(point)/i)) { return null; }\n white();\n if (!$(/^(\\()/)) { return null; }\n var c = coords();\n white();\n if (!$(/^(\\))/)) { return null; }\n return {\n type: 'Point',\n coordinates: c[0]\n };\n }\n\n function multipoint() {\n if (!$(/^(multipoint)/i)) { return null; }\n white();\n var c = multicoords();\n white();\n return {\n type: 'MultiPoint',\n coordinates: c\n };\n }\n\n function multilinestring() {\n if (!$(/^(multilinestring)/i)) { return null; }\n white();\n var c = multicoords();\n white();\n return {\n type: 'MultiLineString',\n coordinates: c\n };\n }\n\n function linestring() {\n if (!$(/^(linestring)/i)) { return null; }\n white();\n if (!$(/^(\\()/)) { return null; }\n var c = coords();\n if (!$(/^(\\))/)) { return null; }\n return {\n type: 'LineString',\n coordinates: c\n };\n }\n\n function polygon() {\n if (!$(/^(polygon)/i)) { return null; }\n white();\n return {\n type: 'Polygon',\n coordinates: multicoords()\n };\n }\n\n function multipolygon() {\n if (!$(/^(multipolygon)/i)) { return null; }\n white();\n return {\n type: 'MultiPolygon',\n coordinates: multicoords()\n };\n }\n\n function geometrycollection() {\n var geometries = [], geometry;\n\n if (!$(/^(geometrycollection)/i)) { return null; }\n white();\n\n if (!$(/^(\\()/)) { return null; }\n while (geometry = root()) {\n geometries.push(geometry);\n white();\n $(/^(\\,)/);\n white();\n }\n if (!$(/^(\\))/)) { return null; }\n\n return {\n type: 'GeometryCollection',\n geometries: geometries\n };\n }\n\n function root() {\n return point() ||\n linestring() ||\n polygon() ||\n multipoint() ||\n multilinestring() ||\n multipolygon() ||\n geometrycollection();\n }\n\n return crs(root());\n};\n\nDG.Wkt.geoJsonLayer = function (data, opts) {\n return DG.geoJson(DG.Wkt.toGeoJSON(data), opts);\n};\n\nDG.Wkt._coordsToLatLngs = function (coords) {\n if (DG.Util.isArray(coords) && !DG.Util.isArray(coords[0])) {\n return [DG.GeoJSON.coordsToLatLng(coords)];\n }\n\n return coords.map(function (el) {\n return DG.Wkt._coordsToLatLngs(el);\n })\n .reduce(function (arr, coord) {\n return arr.concat(coord);\n });\n};\n\nDG.Wkt.toLatLngs = function (data) {\n if (!DG.Util.isArray(data)) {\n data = [data];\n }\n\n return data.map(function (el) {\n var coords = DG.Wkt.toGeoJSON(el).coordinates;\n\n return DG.Wkt._coordsToLatLngs(coords);\n }).reduce(function (arr, coord) {\n return arr.concat(coord);\n });\n};\n\nDG.Wkt.toPoints = function (data) {\n return DG.Wkt.toGeoJSON(data).coordinates;\n};\n\nDG.Wkt.pointsToLatLngOnMap = function (wkt, map) {\n return (function parsePoints(points) {\n return (Array.isArray(points) && Array.isArray(points[0])) ?\n points.map(parsePoints) :\n map.containerPointToLatLng(points);\n })(DG.Wkt.toPoints(wkt));\n};\n\nDG.ProjectDetector = DG.Handler.extend({\n initialize: function(map) { // (Object)\n this._map = map;\n this._osmViewport = false;\n this._project = undefined;\n this._loadProjectList();\n },\n\n addHooks: function() {\n this._projectWatch();\n this._map.on('move', this._projectWatch, this);\n },\n\n removeHooks: function() {\n this._map.off('move', this._projectWatch, this);\n },\n\n getProject: function() {\n if (!this._project) { return false; }\n\n return DG.Util.extend({}, this._project);\n },\n\n getProjectsList: function() {\n return this._projectList.slice(0);\n },\n\n isProjectHere: function(coords, project, checkMethod) {\n if (!coords) { return null; }\n\n if (!(coords instanceof DG.LatLng) && !(coords instanceof DG.LatLngBounds)) {\n coords = DG.latLng(coords);\n }\n\n coords = (coords instanceof DG.LatLngBounds) ?\n DG.latLngBounds(coords.getSouthWest().wrap(), coords.getNorthEast().wrap()) : coords.wrap();\n\n checkMethod = checkMethod || ((coords instanceof DG.LatLngBounds) ? 'intersects' : 'contains');\n\n var method = checkMethod == 'intersects' ? this._testProjectIntersects : this._testProjectContains;\n method = method.bind(this, coords);\n\n if (project) {\n return method(project);\n } else {\n return this._projectList.filter(method)[0];\n }\n },\n\n _projectWatch: function() {\n if (!this._map._loaded) {\n return;\n }\n\n if (this._osmViewport === (this._project && this._centerInProject(this._project, 'contains'))) {\n this._osmViewport = !this._osmViewport;\n this._map.attributionControl._update(null, this._osmViewport);\n }\n\n if (this._project && this._zoomInProject(this._project) && this._centerInProject(this._project)) {\n return;\n }\n\n this._searchProject();\n\n if (this._project) {\n if (this._osmViewport === (this._project && this._centerInProject(this._project, 'contains'))) {\n this._osmViewport = !this._osmViewport;\n }\n this._map.attributionControl._update(null, this._osmViewport, this._project.country_code);\n }\n },\n\n _checkProjectData: function(project) {\n function check(value) {\n return value !== undefined && value !== null;\n }\n\n return project &&\n project.bounds &&\n check(project.code) &&\n check(project.domain) &&\n check(project.country_code) &&\n check(project.flags) &&\n project.zoom_level &&\n check(project.zoom_level.min) &&\n check(project.zoom_level.max) &&\n project.time_zone &&\n check(project.time_zone.offset);\n },\n\n _loadProjectList: function() {\n DG.fallbackProjectsList = DG.fallbackProjectsList || [];\n\n if (!DG.projectsList) {\n DG.projectsList = DG.fallbackProjectsList;\n }\n delete DG.fallbackProjectsList;\n\n this._projectList = DG.projectsList\n .filter(this._checkProjectData)\n .map(function(project) {\n var bound = DG.Wkt.toGeoJSON(project.bounds);\n var latLngBounds = DG.geoJSON(bound).getBounds();\n var defaultPos = project.default_pos ? DG.latLng(project.default_pos.lat, project.default_pos.lon) : null;\n\n\n /* eslint-disable camelcase */\n return {\n id: project.id,\n code: project.code,\n minZoom: project.zoom_level.min,\n maxZoom: project.zoom_level.max,\n timeOffset: project.time_zone.offset,\n bound: bound,\n latLngBounds: latLngBounds,\n traffic: !!project.flags.traffic,\n transport: !!project.flags.public_transport,\n roads: !!project.flags.road_network,\n country_code: project.country_code,\n domain: project.domain,\n defaultPos: defaultPos\n };\n /* eslint-enable camelcase */\n });\n },\n\n _searchProject: function() {\n // Вначале отÑеиваем регионы по зуму\n var filteredByZoom = this._projectList.filter(this._zoomInProject, this);\n\n // Ðаходим проект в границы которого попадает центр карты\n var foundProjects = filteredByZoom.filter(this._centerInProject, this);\n\n // ЕÑли такой проект не найден, то ищем проекты баунд бокÑÑ‹ которых переÑекаютÑÑ Ñ Ñкраном\n if (foundProjects.length === 0) {\n var mapBounds = this._map.getBounds();\n foundProjects = filteredByZoom.filter(DG.bind(this._testProjectIntersects, this, mapBounds));\n\n if (foundProjects.length > 1) {\n var mapCenter = this._map.getCenter();\n var neareastProject = foundProjects[0];\n for (var i = 1; i < foundProjects.length; i++) {\n var currentProject = foundProjects[i];\n if (currentProject.defaultPos &&\n mapCenter.distanceTo(neareastProject.defaultPos) >\n mapCenter.distanceTo(currentProject.defaultPos)\n ) {\n neareastProject = currentProject;\n }\n }\n foundProjects = [neareastProject];\n }\n }\n\n var newProject = foundProjects[0] || null;\n\n if (this._project === newProject) {\n return;\n }\n\n var self = this;\n\n if (this._project !== null) {\n this._project = null;\n setTimeout(function() {\n self._map.fire('projectleave');\n }, 1);\n }\n\n if (newProject) {\n this._project = newProject;\n setTimeout(function() {\n self._map.fire('projectchange', {getProject: self.getProject.bind(self)});\n }, 1);\n }\n },\n\n _testProjectIntersects: function(bounds, project) {\n return project.latLngBounds.intersects(bounds);\n },\n\n _testProjectContains: function(latlng, project) {\n return DG.PolyUtil.inside([latlng.lng, latlng.lat], project.bound);\n },\n\n _centerInProject: function(project, checkMethod) {\n return this.isProjectHere(this._map.getCenter(), project, checkMethod);\n },\n\n _zoomInProject: function(project) {\n return (this._map.getZoom() >= project.minZoom);\n }\n});\n\nDG.Map.mergeOptions({\n projectDetector: true\n});\n\nDG.Map.addInitHook('addHandler', 'projectDetector', DG.ProjectDetector);\n\n/*\n * Utility functions\n */\n\nDG.Metric = function() {};\n\n/*\n * DG.Metric.Segments class can calculate total pushed segments length and used to shortcut\n * 'get Something by provided Length' calculations (segment's Index, segment's Length, etc...)\n */\nDG.Metric.Segments = function() {\n this.length = 0;\n};\n\nDG.Metric.Segments.prototype = {\n push: function(len) {\n this[this.length] = this.length > 0 ? this[this.length - 1] + len : len;\n this.length += 1;\n\n return this;\n },\n\n getLength: function() {\n return this[this.length - 1];\n },\n\n getReverse: function() {\n var segments = new DG.Metric.Segments();\n var i = this.length - 1;\n\n if (i < 0) { return segments; }\n\n while (i--) {\n segments.push(this[i + 1] - this[i]);\n }\n\n return segments.push(this[0]);\n },\n\n getIndex: function(len) {\n var i = this.length - 1;\n\n if (i < 0) { return i; }\n\n while (i--) {\n if (this[i] <= len) { break; }\n }\n\n return i + 1;\n },\n\n getSegRatio: function(len) {\n var i = this.getIndex(len);\n var sub = i > 0 ? this[i - 1] : 0;\n\n return (len - sub) / (this[i] - sub);\n },\n\n getSegLength: function(len) {\n var i = this.getIndex(len);\n var sub = i > 0 ? this[i - 1] : 0;\n\n return len - sub;\n }\n};\n\n/*\n * DG.VertexTransform is a classic 2D matrix transformation class\n *\n * Prototype methods can scale/rotate/translate vertices\n *\n * Static methods do the same but return simple array instances with attached\n * .clone() method which can reconstruct full DG.VertexTransform object\n */\n\nDG.VertexTransform = DG.Class.extend({\n initialize: function(vertices) {\n this._vertices = vertices;\n\n this._scale = null;\n this._angle = null;\n this._trans = null;\n this._matrix = null;\n\n this.load();\n },\n\n load: function() {\n this.vertices = this._vertices.map(function(vertex) { return vertex.clone(); });\n this.vertices.clone = DG.VertexTransform.clone;\n\n return this;\n },\n\n save: function() {\n this._vertices = this.vertices.map(function(vertex) { return vertex.clone(); });\n\n return this;\n },\n\n setScale: function(scale) {\n this._scale = scale;\n return this;\n },\n\n getScale: function() {\n return this._scale;\n },\n\n setAngle: function(angle) {\n this._angle = angle;\n return this;\n },\n\n getAngle: function() {\n return this._angle;\n },\n\n setTranslation: function(trans) {\n this._trans = trans;\n return this;\n },\n\n getTranslation: function() {\n return this._trans;\n },\n\n setMatrix: function(matrix) {\n this._matrix = matrix;\n return this;\n },\n\n getMatrix: function() {\n return this._matrix;\n },\n\n scale: function(scale) {\n var v = this.vertices;\n var i = v.length;\n\n scale = scale || this._scale || 1;\n while (i--) {\n v[i].x *= scale;\n v[i].y *= scale;\n }\n\n return this;\n },\n\n unScale: function(scale) {\n scale = scale || this._scale || 1; // Also safeguard against zero scale\n return this.scale(1 / scale);\n },\n\n rotate: function(angle) {\n var cos = angle ? angle.cos : (this._angle ? this._angle.cos : 1);\n var sin = angle ? angle.sin : (this._angle ? this._angle.sin : 0);\n var v = this.vertices;\n var i = v.length;\n var x, y;\n\n while (i--) {\n x = v[i].x;\n y = v[i].y;\n v[i].x = x * cos - y * sin;\n v[i].y = x * sin + y * cos;\n }\n\n return this;\n },\n\n unRotate: function(angle) {\n var cos = angle ? angle.cos : (this._angle ? this._angle.cos : 1);\n var sin = angle ? angle.sin : (this._angle ? this._angle.sin : 0);\n\n return this.rotate({cos: cos, sin: -sin});\n },\n\n translate: function(trans) {\n var dx = trans ? trans.x : (this._trans ? this._trans.x : 0);\n var dy = trans ? trans.y : (this._trans ? this._trans.y : 0);\n var v = this.vertices;\n var i = v.length;\n\n while (i--) {\n v[i].x += dx;\n v[i].y += dy;\n }\n\n return this;\n },\n\n unTranslate: function(trans) {\n var dx = trans ? trans.x : (this._trans ? this._trans.x : 0);\n var dy = trans ? trans.y : (this._trans ? this._trans.y : 0);\n\n return this.translate({x: -dx, y: -dy});\n },\n\n transform: function(matrix) {\n var a, b, c, d, dx, dy;\n var v = this.vertices;\n var i = v.length;\n var x, y;\n\n if (matrix) {\n a = matrix[0]; b = matrix[1]; dx = matrix[2];\n c = matrix[3]; d = matrix[4]; dy = matrix[5];\n } else if (this._matrix) {\n a = this._matrix[0]; b = this._matrix[1]; dx = this._matrix[2];\n c = this._matrix[3]; d = this._matrix[4]; dy = this._matrix[5];\n } else {\n a = 1; b = 0; dx = 0;\n c = 0; d = 1; dy = 0;\n }\n\n while (i--) {\n x = v[i].x;\n y = v[i].y;\n v[i].x = x * a + y * b + dx;\n v[i].y = x * c + y * d + dy;\n }\n\n return this;\n },\n\n statics: {\n scale: function(vt, scale) {\n var v = vt.vertices;\n var result = [];\n var x, y;\n\n scale = scale || 1;\n for (var i = 0; i < v.length; i++) {\n x = v[i].x * scale;\n y = v[i].y * scale;\n result.push(new DG.Point(x, y));\n }\n result.clone = DG.VertexTransform.clone;\n\n return result;\n },\n\n unScale: function(vt, scale) {\n scale = scale || 1; // Also safeguard against zero scale\n return DG.VertexTransform.scale(vt, 1 / scale);\n },\n\n rotate: function(vt, angle) {\n var cos = angle ? angle.cos : 1;\n var sin = angle ? angle.sin : 0;\n var v = vt.vertices;\n var x, y, rx, ry;\n var result = [];\n\n for (var i = 0; i < v.length; i++) {\n rx = v[i].x;\n ry = v[i].y;\n x = rx * cos - ry * sin;\n y = rx * sin + ry * cos;\n result.push(new DG.Point(x, y));\n }\n result.clone = DG.VertexTransform.clone;\n\n return result;\n },\n\n unRotate: function(vt, angle) {\n var cos = angle ? angle.cos : 1;\n var sin = angle ? angle.sin : 0;\n\n return DG.VertexTransform.rotate(vt, {cos: cos, sin: -sin});\n },\n\n translate: function(vt, trans) {\n var dx = trans ? trans.x : 0;\n var dy = trans ? trans.y : 0;\n var v = vt.vertices;\n var result = [];\n var x, y;\n\n for (var i = 0; i < v.length; i++) {\n x = v[i].x + dx;\n y = v[i].y + dy;\n result.push(new DG.Point(x, y));\n }\n result.clone = DG.VertexTransform.clone;\n\n return result;\n },\n\n unTranslate: function(vt, trans) {\n var dx = trans ? trans.x : 0;\n var dy = trans ? trans.y : 0;\n\n return DG.VertexTransform.translate(vt, {x: -dx, y: -dy});\n },\n\n clone: function() {\n // 'this' is an array\n return new DG.VertexTransform(this).save();\n },\n\n getLength: function(vec1, vec2) {\n var dx, dy;\n\n if (typeof vec1 === 'number') {\n // 'vec1' and 'vec2' are absolute coordinates of vector\n return Math.sqrt(vec1 * vec1 + vec2 * vec2);\n } else {\n // 'vec1' and 'vec2' are vector objects\n dx = vec2.x - vec1.x;\n dy = vec2.y - vec1.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n },\n\n getScaled: function(vec1, vec2, scale) {\n var dx, dy;\n\n if (typeof vec1 === 'number') {\n // 'vec1' and 'vec2' are absolute coordinates of vector\n return new DG.Point(vec1 * scale, vec2 * scale);\n } else {\n // 'vec1' and 'vec2' are vector objects\n dx = (vec2.x - vec1.x) * scale;\n dy = (vec2.y - vec1.y) * scale;\n return new DG.Point(vec1.x + dx, vec1.y + dy);\n }\n },\n\n getAngle: function(vec1, vec2, origin) {\n var l, sp, x1, y1, x2, y2;\n\n if (typeof vec1 === 'number') {\n // 'vec1' and 'vec2' are absolute coordinates of vector\n l = Math.sqrt(vec1 * vec1 + vec2 * vec2);\n if (l > 0) {\n return {cos: vec1 / l, sin: vec2 / l};\n } else {\n return {cos: 1, sin: 0};\n }\n } else {\n // 'vec1' and 'vec2' are vector objects\n x1 = vec1.x; y1 = vec1.y;\n x2 = vec2.x; y2 = vec2.y;\n if (origin) {\n x1 -= origin.x; y1 -= origin.y;\n x2 -= origin.x; y2 -= origin.y;\n }\n sp = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2);\n return {\n cos: (x1 * x2 + y1 * y2) / sp,\n sin: (x1 * y2 - x2 * y1) / sp\n };\n }\n },\n\n getAnglesSum: function(angle1, angle2) {\n return {\n cos: angle1.cos * angle2.cos - angle1.sin * angle2.sin,\n sin: angle1.sin * angle2.cos + angle1.cos * angle2.sin\n };\n },\n\n getAnglesDif: function(angle1, angle2) {\n return {\n cos: angle1.cos * angle2.cos + angle1.sin * angle2.sin,\n sin: angle1.sin * angle2.cos - angle1.cos * angle2.sin\n };\n }\n }\n});\n\n/*\n * DG.ArrowPathTransform class is a core of arrow's body calculations\n *\n * General ideas are:\n * We construct arrow body with stroke points making arcs on outer path turns\n * Processing is done segment by segment around {0, 0} virtual point\n * and resulting 'path' finally rotated to it's original map's angle (.fullAngle)\n * Subset of this vertices lately used in .subPath() calculations which can be used\n * in animations for ex.\n *\n * Final translation (see DG.Entrance.Arrow) moves arrow objects to their original positions\n */\n\nDG.ArrowPathTransform = DG.VertexTransform.extend({\n initialize: function(path) {\n // 'path.offset' is initial points offset (-x / +x) to compensate arrow tip length\n\n // Skip super initialization as we need only subset of DG.VertexTransform power\n this._lengths = new DG.Metric.Segments();\n this._vertices = [[], []];\n this._drawings = [[], []];\n // this._arcs = []; // initialized in _setPath()\n\n this._setPath(path);\n this.subPath(1);\n },\n\n load: function() {\n return this.subPath(1);\n },\n\n save: function() {\n return this; // NoOp\n },\n\n // Method constructs new path points with some displacement from original 'path'\n // Outer corners will be smoothed by arcs (cubic Bézier curves)\n _setPath: function(path) {\n var transform = DG.ArrowPathTransform.transform;\n var vertices = this._vertices;\n var drawings = this._drawings;\n var Point = DG.Point;\n var width = path.width;\n var arcs = [[], [], []];\n var lengths = [];\n\n var i, x,\n ax, bx, cx,\n angles, angle;\n\n vertices.push(path.vertices); // expect .pop() in final transform\n vertices[0].push(new DG.Point(path.offset, +width));\n vertices[1].push(new DG.Point(path.offset, -width));\n angles = DG.ArrowPathTransform.getAngles(path);\n\n cx = -path.offset;\n for (i = 0; i < angles.length; i++) {\n x = path.vertices[i + 1].x;\n ax = width * angles[i].cot;\n\n // http://pomax.github.io/bezierinfo/#circles_cubic\n // actual equation is (4/3 * tan(α/4) * radius)\n bx = angles[i].tan * width * 8 / 3;\n\n // Next code can be combined by -/+ inversion but for simplicity it is left as is\n if (ax > 0) {\n vertices[0].push(new Point(x + ax, +width));\n drawings[0].push('L');\n\n arcs[2].push(1);\n arcs[1].push(vertices[1].length);\n vertices[1].push(new Point(x + ax, -width));\n vertices[1].push(new Point(x + ax - bx, -width));\n\n transform(vertices, angles[i], {x: x, y: 0});\n\n vertices[1].push(new Point(0 - ax + bx, -width));\n vertices[1].push(new Point(0 - ax, -width));\n drawings[1].push('L', 'C');\n\n lengths.push(Math.abs(x + ax) - cx); cx = +ax;\n } else {\n vertices[1].push(new Point(x - ax, -width));\n drawings[1].push('L');\n\n arcs[2].push(0);\n arcs[0].push(vertices[0].length);\n vertices[0].push(new Point(x - ax, +width));\n vertices[0].push(new Point(x - ax + bx, +width));\n\n transform(vertices, angles[i], {x: x, y: 0});\n\n vertices[0].push(new Point(0 + ax - bx, +width));\n vertices[0].push(new Point(0 + ax, +width));\n drawings[0].push('L', 'C');\n\n lengths.push(Math.abs(x - ax) - cx); cx = -ax;\n }\n }\n\n // Final segments and tail arc\n ax = path.vertices[i + 1].x;\n bx = width * 4 / 3; // tan(PI/4) = 1\n\n vertices[0].push(new Point(ax, +width));\n vertices[1].push(new Point(ax, -width));\n\n vertices[0].push(new Point(ax - bx, +width));\n vertices[1].push(new Point(ax - bx, -width));\n\n drawings[0].push('L');\n drawings[1].push('L');\n\n lengths.push(Math.abs(ax) - cx);\n\n // Reverse right path\n vertices[1].reverse();\n drawings[1].reverse();\n\n // Move vertices into original position (before last translation)\n angle = DG.VertexTransform.getAnglesSum(angles.fullAngle, path.getAngle());\n transform(vertices, angle, vertices.pop()[0]); // path.vertices[0]\n\n // We need to reconstruct arc's indexes but too many variables already touched, reuse some of them\n ax = vertices[0].length;\n bx = vertices[1].length;\n this._arcs = arcs[2].map(function(i) {\n cx = arcs[i].shift();\n if (i > 0) {\n return new DG.ArcBezier(vertices[1].slice(bx - cx - 4, bx - cx));\n } else {\n return new DG.ArcBezier(vertices[0].slice(cx, cx + 4).reverse());\n }\n }).reverse();\n\n this._lengths.push(lengths.pop());\n lengths.reverse().forEach(function(l, i) {\n this._lengths.push(this._arcs[i].getLength()).push(l);\n }, this);\n\n // Shortcut border cases (0%-length sub-path and full-path)\n this[0] = {\n vertices: [vertices[0][ax - 2], vertices[0][ax - 1], vertices[1][0], vertices[1][1]],\n drawings: ['M', 'C']\n };\n this[1] = {\n vertices: vertices[0].concat(vertices[1]),\n drawings: ['M'].concat(drawings[0], 'C', drawings[1])\n };\n },\n\n _setAngleAndDisplacement: function(vL, vR) { // Used in DG.ArrowTipTransform.subShape()\n this.angle = DG.VertexTransform.getAngle({x: vL.x - vR.x, y: vL.y - vR.y}, {x: 0, y: 1});\n this.displ = vR.clone();\n },\n\n subPath: function(pathRatio) {\n pathRatio = pathRatio > 1 ? 1 : pathRatio;\n\n // Shortcut border cases (0%-length sub-path and full-path)\n if (pathRatio === 0 || pathRatio === 1) {\n this.vertices = this[pathRatio].vertices.map(function(vertex) { return vertex.clone(); });\n this.drawings = this[pathRatio].drawings;\n this._setAngleAndDisplacement(this.vertices[0], this.vertices[this.vertices.length - 1]);\n return this;\n }\n\n var getScaled = DG.VertexTransform.getScaled;\n var vertices = this._vertices;\n var drawings = this._drawings;\n var lengths = this._lengths;\n var len = lengths.getLength() * pathRatio;\n var segIndex = lengths.getIndex(len);\n var segRatio = lengths.getSegRatio(len);\n var vertexIndexLeft = vertices[0].length - 2;\n var vertexIndexRight = 1;\n var drawingIndexLeft = drawings[0].length - 1;\n var drawingIndexRight = 0;\n var vertexLeft, vertexRight;\n var arc = 0, aed = 0;\n\n while (aed++ < segIndex) {\n if (aed % 2 == 1) {\n vertexIndexLeft--;\n drawingIndexLeft--;\n vertexIndexRight++;\n drawingIndexRight++;\n } else {\n if (drawings[0][drawingIndexLeft] === 'C') {\n vertexIndexLeft -= 3;\n drawingIndexLeft -= 1;\n } else {\n vertexIndexRight += 3;\n drawingIndexRight += 1;\n }\n arc++;\n }\n }\n\n if (segIndex % 2 == 1) {\n // One path ends with an arc\n arc = this._arcs[arc];\n if (drawings[0][drawingIndexLeft] === 'C') {\n arc = arc.getCurveBefore(arc.getTbyL(lengths.getSegLength(len)));\n vertexLeft = arc.points[3];\n vertexRight = vertices[1][vertexIndexRight];\n this.vertices = arc.points.slice(1).reverse()\n .concat(vertices[0].slice(vertexIndexLeft), vertices[1].slice(0, vertexIndexRight + 1))\n .map(function(vertex) { return vertex.clone(); });\n this.drawings = ['M'].concat(drawings[0].slice(drawingIndexLeft), 'C', drawings[1].slice(0, drawingIndexRight));\n } else {\n arc = arc.getCurveBefore(arc.getTbyL(lengths.getSegLength(len)));\n vertexLeft = vertices[0][vertexIndexLeft];\n vertexRight = arc.points[3];\n this.vertices = vertices[0].slice(vertexIndexLeft)\n .concat(vertices[1].slice(0, vertexIndexRight + 1), arc.points.slice(1))\n .map(function(vertex) { return vertex.clone(); });\n this.drawings = ['M'].concat(drawings[0].slice(drawingIndexLeft + 1), 'C', drawings[1].slice(0, drawingIndexRight + 1));\n }\n } else {\n // Both paths end with lines\n vertexLeft = getScaled(vertices[0][vertexIndexLeft], vertices[0][vertexIndexLeft - 1], segRatio);\n vertexRight = getScaled(vertices[1][vertexIndexRight], vertices[1][vertexIndexRight + 1], segRatio);\n this.vertices = [vertexLeft]\n .concat(vertices[0].slice(vertexIndexLeft), vertices[1].slice(0, vertexIndexRight + 1), vertexRight)\n .map(function(vertex) { return vertex.clone(); });\n this.drawings = ['M'].concat(drawings[0].slice(drawingIndexLeft), 'C', drawings[1].slice(0, drawingIndexRight + 1));\n }\n\n this._setAngleAndDisplacement(vertexLeft, vertexRight);\n return this;\n },\n\n statics: {\n getAngles: function(path) {\n var getAngle = DG.VertexTransform.getAngle;\n var fullAngle = {cos: 1, sin: 0};\n var vertices = path.vertices;\n var angles = [];\n\n var absSin, angle,\n cos, sin, cot, temp, sign;\n\n for (var i = 1, len = vertices.length - 1; i < len; i++) {\n angle = getAngle(vertices[i - 1], vertices[i + 1], vertices[i]);\n\n absSin = Math.abs(angle.sin);\n if (absSin < 0.000001) {\n // Exclude 180° angle from vertices array\n vertices.splice(vertices.length - i - 1, 1);\n len--;\n i--;\n } else {\n // This is half ∢α cotangent, sign describes angle direction and used to shortcut stroke calculations\n // '-1' - right angle is inner angle, '1' - left angle is inner angle (if seen from [0, 0] to [-1, 0])\n angle.cot = (1 + angle.cos) / angle.sin;\n\n // We need to rotate next segment to [-1, 0] axis, so we need complementary angle actually\n angle.cos = -angle.cos;\n\n // Complimentary angle also used to calculate it's quaternary ∢β tangent\n // ∢β tangent used in approximation of outer arc segment by Bézier curve\n cot = (1 + angle.cos) / angle.sin;\n sign = cot < 0 ? -1 : 1;\n temp = sign * Math.sqrt(4 * cot * cot + 4);\n angle.tan = -0.5 * (cot + cot - temp);\n\n angles.push(angle);\n\n cos = fullAngle.cos * angle.cos - fullAngle.sin * angle.sin;\n sin = fullAngle.sin * angle.cos + fullAngle.cos * angle.sin;\n\n fullAngle = {cos: cos, sin: sin};\n }\n }\n\n // Used in final stroke points translation\n angles.fullAngle = {cos: fullAngle.cos, sin: -fullAngle.sin};\n return angles;\n },\n\n // TODO - if length of 'latlngs' array is less than 2 or it is undefined next function produces exception\n // check this condition in outer routines?!\n getTranslatedPath: function(map, latlngs) {\n var path = new DG.VertexTransform([]);\n var i = latlngs.length - 1;\n var v = map.project(latlngs[i]);\n var dx = v.x, dy = v.y;\n\n path.vertices.push(new DG.Point(0, 0));\n while (i--) {\n v = map.project(latlngs[i]);\n path.vertices.push(new DG.Point(v.x - dx, v.y - dy));\n }\n return path\n .setAngle(DG.VertexTransform.getAngle(-path.vertices[1].x, -path.vertices[1].y))\n .unRotate();\n },\n\n transform: function(rings, angle, vector) {\n var i = rings.length;\n var cos = angle.cos;\n var sin = angle.sin;\n var dx = vector.x;\n var dy = vector.y;\n var ring, x, y, j;\n\n while (i--) {\n ring = rings[i];\n j = ring.length;\n while (j--) {\n x = ring[j].x - dx;\n y = ring[j].y - dy;\n ring[j].x = x * cos - y * sin;\n ring[j].y = x * sin + y * cos;\n }\n }\n }\n }\n});\n\n/*\n * DG.ArrowTipTransform class is a core of arrow's tip calculations\n *\n * .subShape() routine 'bound' arrow's tip to the ending points of .subPath()\n * calculated separately in DG.ArrowPathTransform\n *\n * Final translation (see DG.Entrance.Arrow) moves arrow objects to their original positions\n */\n\nDG.ArrowTipTransform = DG.VertexTransform.extend({\n initialize: function(path, shape) {\n this.drawings = shape.drawings; // static mapping\n this._vertices = shape.vertices;\n\n this._setShape(path, shape);\n },\n\n _setShape: function(path, shape) {\n var sp = shape.vertices[0];\n var width = Math.abs(sp.y);\n var pl = path.vertices[1].x; // negative value\n var length = sp.x; // negative value\n var offset = pl - length + width + width;\n\n path.width = width;\n path.offset = length + (offset > 0 ? offset : 0);\n if (path.vertices.length < 3 && length > -10) {\n path.offset += 2.5;\n }\n\n this._vertices = this.load().unTranslate(sp).vertices;\n },\n\n subShape: function(transform) {\n this.load().unRotate(transform.angle).translate(transform.displ);\n return this;\n }\n});\n\n/*\n * DG.ComplexPath is a simple vector layer class with empty .getEvents() object(!)\n * It's drawing logic is maintained in DG.Entrance.Arrow class\n *\n * _pxBounds is a pixel bounds of this drawings and they are used in L.Canvas\n */\n\nDG.ComplexPath = DG.Path.extend({\n options: {\n fill: true,\n fillOpacity: 1,\n interactive: false\n },\n\n initialize: function(options) {\n DG.setOptions(this, options);\n\n this._empty = [];\n\n this._pxEmpty = DG.bounds(\n DG.point(0, 0), DG.point(0, 0)\n );\n this._pxBounds = this._pxEmpty;\n\n this._vertices = [this._empty];\n this._drawings = [this._empty];\n },\n\n getEvents: function() {\n return {};\n },\n\n _project: function() {\n var opts = this.options,\n zoom, weight;\n\n if (this._map) {\n zoom = this._map.getZoom();\n } else {\n return;\n }\n\n if (opts.visibility.isShown && opts.transform[zoom]) {\n // Next numbers was empirically selected in order to provide visual compliance\n // to the original arrow's implementation\n weight = 2.2 - ((19 - zoom) * 0.2);\n if (opts.weight !== weight) {\n this.setStyle({weight: +weight.toFixed(2)});\n }\n\n this._vertices[0] = opts.transform[zoom].vertices;\n this._drawings[0] = opts.transform[zoom].drawings;\n\n this._pxBounds = opts.transform[zoom]._pxBounds;\n } else {\n this._vertices[0] = this._empty;\n this._drawings[0] = this._empty;\n\n this._pxBounds = this._pxEmpty;\n }\n },\n\n _update: function() {\n if (this._map) {\n this._updatePath();\n }\n },\n\n _updatePath: function() { // used in Canvas renderer\n this._renderer._updateComplexPath(this);\n }\n});\n\n/*\n * Actual painting methods that can draw complex objects with curves\n *\n * Point coordinates must be provided in layer._vertices object\n * And types of line must be provided in layer._drawings object\n */\n\nDG.extend(L.Canvas.prototype, {\n _updateComplexPath: function(layer, closed) {\n var i, j, k, d, x, y, _x, _y, $x, $y, points;\n var drawings = layer._drawings;\n var vertices = layer._vertices;\n var ctx = this._ctx;\n\n this._drawnLayers[layer._leaflet_id] = layer;\n\n // TODO: Do we need to do a 'beginPath()' and possible 'closePath()' per ring?!\n ctx.beginPath();\n\n for (i = 0; i < vertices.length; i++) {\n points = vertices[i];\n x = y = 0;\n j = k = 0;\n while (j < points.length) {\n d = drawings[i][k++];\n switch (d) {\n case 'M':\n x = points[j].x;\n y = points[j].y;\n j += 1;\n ctx.moveTo(x, y);\n break;\n\n case 'm':\n x += points[j].x;\n y += points[j].y;\n j += 1;\n ctx.moveTo(x, y);\n break;\n\n case 'L':\n x = points[j].x;\n y = points[j].y;\n j += 1;\n ctx.lineTo(x, y);\n break;\n\n case 'l':\n x += points[j].x;\n y += points[j].y;\n j += 1;\n ctx.lineTo(x, y);\n break;\n\n case 'C':\n _x = points[j].x;\n _y = points[j].y;\n j += 1;\n $x = points[j].x;\n $y = points[j].y;\n j += 1;\n x = points[j].x;\n y = points[j].y;\n j += 1;\n ctx.bezierCurveTo(_x, _y, $x, $y, x, y);\n break;\n\n case 'c':\n _x = x + points[j].x;\n _y = y + points[j].y;\n j += 1;\n $x = x + points[j].x;\n $y = y + points[j].y;\n j += 1;\n x = x + points[j].x;\n y = y + points[j].y;\n j += 1;\n ctx.bezierCurveTo(_x, _y, $x, $y, x, y);\n break;\n\n case 'Q':\n _x = points[j].x;\n _y = points[j].y;\n j += 1;\n x = points[j].x;\n y = points[j].y;\n j += 1;\n ctx.quadraticCurveTo(_x, _y, x, y);\n break;\n\n case 'q':\n _x = x + points[j].x;\n _y = y + points[j].y;\n j += 1;\n x = x + points[j].x;\n y = y + points[j].y;\n j += 1;\n ctx.quadraticCurveTo(_x, _y, x, y);\n break;\n }\n }\n if (closed) {\n ctx.closePath();\n }\n }\n\n this._fillStroke(ctx, layer);\n }\n});\n\n\nDG.extend(L.SVG.prototype, {\n _updateComplexPath: function(layer, closed) {\n this._setPath(layer, L.SVG.complexPointsToPath(layer._vertices, layer._drawings, closed));\n }\n});\n\n\nDG.extend(L.SVG, {\n complexPointsToPath: function(vertices, drawings, closed) {\n var str = '';\n var svg = DG.Browser.svg;\n var i, j, k, n, d, points;\n\n for (i = 0; i < vertices.length; i++) {\n points = vertices[i];\n\n // Speedup hot path by removing if/ternary condition checks but duplicating loops\n if (svg) {\n j = k = 0;\n while (j < points.length) {\n d = drawings[i][k++];\n switch (d) {\n case 'C':\n case 'c': n = 3; break;\n case 'Q':\n case 'q': n = 2; break;\n\n default: n = 1; // 'M', 'm', 'L', 'l', ...\n }\n str += d;\n while (n--) {\n str += points[j].x.toFixed(4) + ',' + points[j].y.toFixed(4) + ' ';\n j += 1;\n }\n }\n } else {\n // vml in IE8 can support only integer values in 'path', sorry about loss of precision\n j = k = 0;\n while (j < points.length) {\n d = drawings[i][k++];\n switch (d) {\n case 'M': d = 'm'; n = 1; break;\n case 'm': d = 't'; n = 1; break;\n case 'L': d = 'l'; n = 1; break;\n case 'l': d = 'r'; n = 1; break;\n case 'C': d = 'c'; n = 3; break;\n case 'c': d = 'v'; n = 3; break;\n case 'Q':\n // VML spec has 'qb' command in 'v' attribute string but no 'relativeTo' compliment\n // So we'll emulate Cubic Bézier curve by applying Quadratic variant in both cases\n // TODO: Both control points will use the same value but this is not true solution\n str += 'C' +\n points[j].x.toFixed(0) + ',' + points[j].y.toFixed(0) + ' ' +\n points[j].x.toFixed(0) + ',' + points[j].y.toFixed(0) + ' ' +\n points[j + 1].x.toFixed(0) + ',' + points[j + 1].y.toFixed(0) + ' ';\n j += 2;\n d = '';\n n = 0;\n break;\n case 'q':\n str += 'c' +\n points[j].x.toFixed(0) + ',' + points[j].y.toFixed(0) + ' ' +\n points[j].x.toFixed(0) + ',' + points[j].y.toFixed(0) + ' ' +\n points[j + 1].x.toFixed(0) + ',' + points[j + 1].y.toFixed(0) + ' ';\n j += 2;\n d = '';\n n = 0;\n break;\n\n default: n = 1;\n }\n str += d;\n while (n--) {\n str += points[j].x.toFixed(0) + ',' + points[j].y.toFixed(0) + ' ';\n j += 1;\n }\n }\n }\n\n str += closed ? (svg ? 'z' : 'x') : '';\n }\n\n // SVG complains about empty path strings\n return str || 'm0,0';\n }\n});\n\n/*\n * DGBezierCurves is a collection of three classes:\n * Original DG.Bezier class provides basic math for Cubic and Quadratic Bézier curves\n * DG.TimeBezier used in animation effects it can return 'Distance' (Y) by Time (X) value\n * DG.ArcBezier can return 't' value by curve's segment length\n * Actual calculations can be very hard (in math terms) so we use LUT's to optimize them\n *\n * Original ideas come from this source: https://pomax.github.io/bezierinfo/\n */\n\nDG.Bezier = DG.Class.extend({\n /**\n * Initialize curve object by provided control points\n * @param {Array<DG.Point>} coords Curve's control points in DG.Point format (up to four control points supported)\n * @param {boolean} [clone] Clone original points or not (Default)\n */\n initialize: function(coords, clone) {\n if (clone) {\n this.points = coords.map(function(coord) { return coord.clone(); });\n } else {\n this.points = coords;\n }\n this.dpoints = this._getDerivatives();\n this.order = this.points.length - 1;\n this._lut = [];\n },\n\n getPoint: function(t) {\n var p = this.points;\n var mt, mt2, t2;\n var a, b, c, d;\n\n if (t === 0) { return p[0]; }\n if (t === 1) { return p[this.order]; }\n\n mt = 1 - t;\n mt2 = mt * mt;\n t2 = t * t;\n\n if (this.order > 2) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n } else {\n p = [p[0], p[1], p[2], {x: 0, y: 0}];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n d = 0;\n }\n\n return new DG.Point(\n a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y\n );\n },\n\n derivative: function(t) {\n var p = this.dpoints[0];\n var mt = 1 - t;\n var a, b, c;\n\n if (this.order > 2) {\n a = mt * mt;\n b = mt * t * 2;\n c = t * t;\n } else {\n p = [p[0], p[1], {x: 0, y: 0}];\n a = mt; b = t; c = 0;\n }\n\n return new DG.Point(\n a * p[0].x + b * p[1].x + c * p[2].x,\n a * p[0].y + b * p[1].y + c * p[2].y\n );\n },\n\n getLength: function() {\n /* eslint-disable camelcase */\n var w_i = DG.Bezier.WEIGHT;\n var x_i = DG.Bezier.ABSCISSA;\n var z = 0.5;\n var sum = 0;\n var d, l, t;\n\n for (var i = 0; i < x_i.length; i++) {\n t = z * x_i[i] + z;\n d = this.derivative(t);\n l = d.x * d.x + d.y * d.y;\n sum += w_i[i] * Math.sqrt(l);\n }\n /* eslint-enable camelcase */\n\n return z * sum;\n },\n\n getCurveBefore: function(z) {\n var p = this.points;\n var z2, z3, mz, mz2, mz3;\n var b$3, b$4, c$4;\n var curve;\n\n if (z === 1) { return this.clone(); }\n\n curve = [];\n z2 = z * z;\n mz = z - 1;\n mz2 = mz * mz;\n\n curve[0] = new DG.Point(\n p[0].x,\n p[0].y\n );\n\n curve[1] = new DG.Point(\n z * p[1].x - mz * p[0].x,\n z * p[1].y - mz * p[0].y\n );\n\n b$3 = z * mz * 2;\n curve[2] = new DG.Point(\n z2 * p[2].x - b$3 * p[1].x + mz2 * p[0].x,\n z2 * p[2].y - b$3 * p[1].y + mz2 * p[0].y\n );\n\n if (this.order > 2) {\n z3 = z2 * z;\n mz3 = mz2 * mz;\n b$4 = z2 * mz * 3;\n c$4 = z * mz2 * 3;\n curve[3] = new DG.Point(\n z3 * p[3].x - b$4 * p[2].x + c$4 * p[1].x - mz3 * p[0].x,\n z3 * p[3].y - b$4 * p[2].y + c$4 * p[1].y - mz3 * p[0].y\n );\n }\n\n return new DG.Bezier(curve);\n },\n\n getCurveAfter: function(z) {\n var p = this.points;\n var n = this.order;\n var z2, z3, mz, mz2, mz3;\n var b$3, b$4, c$4;\n var curve;\n\n if (z === 1) { return this.clone(); }\n\n curve = [];\n z2 = z * z;\n mz = z - 1;\n mz2 = mz * mz;\n\n curve[n] = new DG.Point(\n p[n].x,\n p[n].y\n );\n\n curve[--n] = new DG.Point(\n z * p[n + 1].x - mz * p[n].x,\n z * p[n + 1].y - mz * p[n].y\n );\n\n b$3 = z * mz * 2;\n curve[--n] = new DG.Point(\n z2 * p[n + 2].x - b$3 * p[n + 1].x + mz2 * p[n].x,\n z2 * p[n + 2].y - b$3 * p[n + 1].y + mz2 * p[n].y\n );\n\n if (this.order > 2) {\n z3 = z2 * z;\n mz3 = mz2 * mz;\n b$4 = z2 * mz * 3;\n c$4 = z * mz2 * 3;\n curve[--n] = new DG.Point(\n z3 * p[n + 3].x - b$4 * p[n + 2].x + c$4 * p[n + 1].x - mz3 * p[n].x,\n z3 * p[n + 3].y - b$4 * p[n + 2].y + c$4 * p[n + 1].y - mz3 * p[n].y\n );\n }\n\n return new DG.Bezier(curve);\n },\n\n _getDerivatives: function() {\n var p = this.points;\n var d, c, j, list;\n var result = [];\n\n for (d = p.length, c = d - 1; d > 1; d--, c--) {\n list = [];\n for (j = 0; j < c; j++) {\n list.push(new DG.Point(\n c * (p[j + 1].x - p[j].x),\n c * (p[j + 1].y - p[j].y)\n ));\n }\n result.push(list);\n p = list;\n }\n\n return result;\n },\n\n getLUT: function(steps) {\n steps = steps || 125;\n\n if (this._lut.length !== steps + 1) {\n if (this.order > 2) {\n this._setLUT3(steps);\n } else {\n this._setLUT2(steps);\n }\n }\n\n return this._lut;\n },\n\n _setLUT2: function(steps) {\n var lut = this._lut = [];\n var p = this.points;\n var t, mt;\n var a, b, c;\n\n lut.push({x: p[0].x, y: p[0].y, l: 0});\n for (var s = 1; s < steps; s++) {\n t = s / steps;\n mt = 1 - t;\n a = mt * mt;\n b = mt * t * 2;\n c = t * t;\n lut.push({\n x: a * p[0].x + b * p[1].x + c * p[2].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y\n });\n }\n lut.push({x: p[2].x, y: p[2].y, l: 0});\n },\n\n _setLUT3: function(steps) {\n var lut = this._lut = [];\n var p = this.points;\n var t, t2, mt, mt2;\n var a, b, c, d;\n\n lut.push({x: p[0].x, y: p[0].y, l: 0});\n for (var s = 1; s < steps; s++) {\n t = s / steps;\n mt = 1 - t;\n mt2 = mt * mt;\n t2 = t * t;\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n lut.push({\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y\n });\n }\n lut.push({x: p[3].x, y: p[3].y, l: 0});\n },\n\n clone: function() {\n return new DG.Bezier(this.points, true);\n }\n});\n\nDG.bezier = function(coords) {\n if (typeof coords === 'number' || coords instanceof DG.Point) {\n coords = Array.prototype.slice.call(arguments);\n }\n\n if (typeof coords[0] === 'number') {\n if (coords.length < 7) {\n coords = [\n new DG.Point(coords[0], coords[1]),\n new DG.Point(coords[2], coords[3]),\n new DG.Point(coords[4], coords[5])\n ];\n } else {\n coords = [\n new DG.Point(coords[0], coords[1]),\n new DG.Point(coords[2], coords[3]),\n new DG.Point(coords[4], coords[5]),\n new DG.Point(coords[6], coords[7])\n ];\n }\n return new DG.Bezier(coords);\n } else {\n return new DG.Bezier(coords, true);\n }\n};\n\n/* eslint-disable indent */\nDG.Bezier.WEIGHT = [\n 0.3626837833783620,\n 0.3626837833783620,\n 0.3137066458778873,\n 0.3137066458778873,\n 0.2223810344533745,\n 0.2223810344533745,\n 0.1012285362903763,\n 0.1012285362903763\n];\nDG.Bezier.ABSCISSA = [\n -0.1834346424956498,\n 0.1834346424956498,\n -0.5255324099163290,\n 0.5255324099163290,\n -0.7966664774136267,\n 0.7966664774136267,\n -0.9602898564975363,\n 0.9602898564975363\n];\n/* eslint-enable indent */\n\n\n// This curve is monotonically ordered by 'X' coordinate and has P[0] = {0, 0} and P[3] = {1, 1}\n// We can utilize this facts to shortcut calculations\nDG.TimeBezier = DG.Bezier.extend({\n initialize: function(controlPoint1, controlPoint2, clone) {\n DG.Bezier.prototype.initialize.call(\n this,\n [DG.TimeBezier.START, controlPoint1, controlPoint2, DG.TimeBezier.END],\n clone\n );\n },\n\n getYbyX: function(x) {\n var lut = this.getLUT();\n var max = lut.length - 1;\n var min = 0;\n var mid;\n\n if (x <= 0) { return 0; }\n if (x >= 1) { return 1; }\n\n // 'X' is monotonically increasing so we can do a simple binary search (LUT)\n // and then fine-tune the result by linear interpolation assuming 'Y' is not changed so radically\n while (true) {\n mid = min + (max - min >> 1);\n if (x < lut[mid].x) {\n max = mid;\n } else {\n min = mid;\n }\n if (max - min < 2) { break; }\n }\n x = (x - lut[min].x) / (lut[max].x - lut[min].x);\n\n return (lut[min].y + (lut[max].y - lut[min].y) * x);\n },\n\n getLUT: function(steps) {\n var p = this.points;\n var t, t2, mt;\n var b, c, d;\n var lut;\n\n steps = steps || 240;\n if (this._lut.length === steps + 1) {\n return this._lut;\n } else {\n this._lut = lut = [];\n }\n\n lut.push({x: 0, y: 0});\n for (var s = 1; s < steps; s++) {\n t = s / steps;\n mt = 1 - t;\n t2 = t * t;\n // We don't need 'a' coefficient because p[0] is {0, 0}\n b = mt * mt * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n lut.push({\n x: b * p[1].x + c * p[2].x + d,\n y: b * p[1].y + c * p[2].y + d\n });\n }\n lut.push({x: 1, y: 1});\n\n return lut;\n },\n\n clone: function() {\n return new DG.TimeBezier(this.points, true);\n }\n});\n\nDG.TimeBezier.START = DG.point(0, 0);\nDG.TimeBezier.END = DG.point(1, 1);\n\n\n// This is cubic Bezier describing circular arc\nDG.ArcBezier = DG.Bezier.extend({\n initialize: function(coords, clone) {\n DG.Bezier.prototype.initialize.call(this, coords, clone);\n this.getLUT();\n this._setLutLengths();\n },\n\n getTbyL: function(l) {\n var lut = this.getLUT();\n var max = lut.length - 1;\n var min = 0;\n var mid;\n var x, y;\n\n if (l <= 0) { return 0; }\n if (l >= lut[max].l) { return 1; }\n\n // 'L' is monotonically increasing so we can do a binary search (LUT)\n // and then fine-tune the result by linear interpolation\n while (true) {\n mid = min + (max - min >> 1);\n if (l < lut[mid].l) {\n max = mid;\n } else {\n min = mid;\n }\n if (max - min < 2) { break; }\n }\n l = (l - lut[min].l) / (lut[max].l - lut[min].l);\n\n x = (lut[min].x + (lut[max].x - lut[min].x) * l);\n y = (lut[min].y + (lut[max].y - lut[min].y) * l);\n\n // BUT this is a part of story, we need a projection of this point to the actual curve and it's reverse 't' val\n var p, dx, dy, t;\n var et = max / lut.length;\n var dt = min / lut.length;\n var s = 1 / lut.length / 10; // TODO\n var d = Math.pow(2, 53) - 1;\n\n for (t = dt; dt < et; dt += s) {\n p = this.getPoint(dt);\n dx = p.x - x; dy = p.y - y;\n l = Math.sqrt(dx * dx + dy * dy);\n if (l < d) {\n d = l;\n t = dt;\n }\n }\n\n return t;\n },\n\n _setLutLengths: function() {\n var lut = this._lut;\n var dx, dy;\n\n lut[0].l = 0;\n for (var i = 1; i < lut.length; i++) {\n dx = lut[i].x - lut[i - 1].x;\n dy = lut[i].y - lut[i - 1].y;\n lut[i].l = lut[i - 1].l + Math.sqrt(dx * dx + dy * dy);\n }\n },\n\n getLength: function() {\n return this._lut[this._lut.length - 1].l;\n },\n\n clone: function() {\n return new DG.ArcBezier(this.points, true);\n }\n});\n\n/*\n * DG.Animation provides tick (step) logic returning progression values\n * calculated over provided or custom Bézier curves\n * Original input can be array object btw...\n */\n\nDG.Animation = DG.Evented.extend({\n options: {\n // animation: { // Or array of objects\n // function: DG.Animation.EASE,\n // duration: 2000,\n // frames: null\n // }\n\n //offset: 0\n //repeat: 0\n },\n\n initialize: function(options) {\n DG.setOptions(this, options);\n\n this._animID = -1;\n this._startTime = 0;\n this._running = false;\n this._animation = null;\n this._durations = null;\n },\n\n start: function() {\n this.stop();\n this._prepare();\n\n this._running = true;\n\n this.fire('start');\n\n // Date.now(), but... IE9+\n this._startTime = new Date().getTime();\n\n this._animate();\n },\n\n stop: function() {\n if (this._running) {\n this._run(this._durations.getLength());\n }\n },\n\n _prepare: function() {\n this._animation = DG.Util.isArray(this.options.animation) ? this.options.animation : [this.options.animation];\n\n this._durations = new DG.Metric.Segments();\n this._animation.forEach(function(animation) {\n this.push(animation.duration);\n }, this._durations);\n },\n\n _animate: function() {\n this._animID = DG.Util.requestAnimFrame(this._animate, this);\n this._run();\n },\n\n _run: function(elapsed) {\n var el, index, progress;\n // Possible skip zero delta time but who cares?!\n elapsed = elapsed ? elapsed : new Date().getTime() - this._startTime;\n\n if (elapsed < this._durations.getLength()) {\n index = this._durations.getIndex(elapsed);\n el = this._durations.getSegRatio(elapsed);\n progress = this._animation[index]['function'].getYbyX(el);\n this._step(this._getFrameValues(index, progress));\n } else {\n index = this._durations.length - 1;\n this._step(this._getFrameValues(index, 1));\n this._complete();\n }\n },\n\n _step: function(obj) {\n this.fire('step', obj);\n },\n\n _complete: function() {\n DG.Util.cancelAnimFrame(this._animID);\n\n this._durations = null;\n this._animation = null;\n this._running = false;\n this.fire('end');\n },\n\n _getFrameValues: function(index, progress) {\n var frames = this._animation[index].frames;\n var obj = {progress: progress};\n var fr, to;\n\n if (frames) {\n for (var key in frames) {\n if (frames[key].progress) {\n obj[key] = frames[key].progress(progress);\n } else {\n fr = frames[key].from;\n to = frames[key].to;\n obj[key] = fr + (to - fr) * progress;\n }\n }\n }\n return obj;\n }\n});\n\nDG.animation = function(options) {\n return new DG.Animation(options);\n};\n\nDG.Animation.LINEAR = new DG.TimeBezier(DG.point(0.00, 0.0), DG.point(1.00, 1.0));\nDG.Animation.EASE = new DG.TimeBezier(DG.point(0.25, 0.1), DG.point(0.25, 1.0));\nDG.Animation.EASE_IN = new DG.TimeBezier(DG.point(0.42, 0.0), DG.point(1.00, 1.0));\nDG.Animation.EASE_IN_OUT = new DG.TimeBezier(DG.point(0.42, 0.0), DG.point(0.58, 1.0));\nDG.Animation.EASE_OUT = new DG.TimeBezier(DG.point(0.00, 0.0), DG.point(0.58, 1.0));\n\n/*\n * DG.Entrance is a main class that hosts actual arrow layers\n * It orchestrates animation and provides user space methods like .show() and .hide()\n */\n\nDG.Entrance = DG.FeatureGroup.extend({\n\n options: {\n vectors: [],\n\n fillColor: '#0085a0',\n strokeColor: '#fff',\n\n enableAnimation: true,\n interactive: false,\n\n autoClose: true\n },\n\n initialize: function(options) {\n DG.LayerGroup.prototype.initialize.call(this);\n\n DG.setOptions(this, options);\n\n this._bounds =\n new DG.LatLngBounds();\n this._animations = {\n bounce: DG.animation(DG.Entrance.BOUNCE_ANIMATION),\n path: DG.animation(DG.Entrance.PATH_ANIMATION)\n };\n\n this._initArrows();\n\n this._isShown = false;\n },\n\n onAdd: function(map) {\n DG.LayerGroup.prototype.onAdd.call(this, map);\n this.show();\n },\n\n onRemove: function(map) {\n this.hide();\n DG.LayerGroup.prototype.onRemove.call(this, map);\n },\n\n getEvents: function() {\n var events = {};\n\n if (this.options.autoClose) {\n events['layeradd'] = this._removeEntrance; // eslint-disable-line dot-notation\n }\n if (this.options.enableAnimation) {\n events['zoomend'] = this._animate; // eslint-disable-line dot-notation\n }\n\n return events;\n },\n\n show: function(fitBounds) {\n if (this._layers) {\n if (fitBounds) {\n this.fitBounds();\n }\n if (!this._isShown) {\n this._isShown = true;\n this.eachLayer(function(arrow) {\n arrow.setVisibility(true);\n });\n if (this.options.enableAnimation) {\n this._animate();\n }\n this._map.fire('entranceshow');\n }\n }\n\n return this;\n },\n\n hide: function() {\n if (this._layers && this._isShown) {\n this._isShown = false;\n this.eachLayer(function(arrow) {\n arrow.setVisibility(false);\n });\n this._map.fire('entrancehide');\n }\n\n return this;\n },\n\n isShown: function() {\n return this._isShown;\n },\n\n getBounds: function() {\n return this._bounds;\n },\n\n setFillColor: function(color) {\n this.eachLayer(function(arrow) {\n arrow.setStyle({fillColor: color});\n });\n },\n\n setStrokeColor: function(color) {\n this.eachLayer(function(arrow) {\n arrow.setStyle({color: color});\n });\n },\n\n _initArrows: function() {\n var base = {\n color: this.options.strokeColor,\n fillColor: this.options.fillColor,\n interactive: this.options.interactive\n };\n\n this.options.vectors\n .map(function(vector) {\n return DG.Wkt.toLatLngs(vector);\n })\n .forEach(function(latlngs) {\n var options = DG.Util.create(base),\n bounds = DG.latLngBounds(latlngs);\n\n this._bounds.extend(bounds);\n\n options.latlngs = latlngs;\n options.bounds = bounds;\n if (this.options.enableAnimation) {\n if (latlngs.length > 2) {\n options.animation = this._animations.path;\n } else {\n options.animation = this._animations.bounce;\n options.distance = true;\n }\n }\n\n this.addLayer(DG.entrance.arrow(options));\n }, this);\n },\n\n\n _animate: function() {\n if (this._isShown) {\n this._animations.bounce.start();\n this._animations.path.start();\n }\n },\n\n // Current logic of next four methods extracted from original arrow's implementation\n fitBounds: function() {\n var map = this._map, fitZoom,\n bounds = this.getBounds();\n\n if (!map.getBounds().contains(bounds) || !this._isAllowedZoom()) {\n fitZoom = this._getFitZoom();\n if (!map.projectDetector.getProject()) {\n map.once('moveend', function() {\n map.setZoom(this._getFitZoom());\n }, this);\n }\n map.setView(bounds.getCenter(), fitZoom, {animate: true});\n }\n\n return this;\n },\n\n _getFitZoom: function() {\n var project = this._map.projectDetector.getProject();\n return project ? project.maxZoom : DG.Entrance.SHOW_FROM_ZOOM;\n },\n\n _isAllowedZoom: function() {\n return this._map.getZoom() >= DG.Entrance.SHOW_FROM_ZOOM;\n },\n\n _removeEntrance: function(e) {\n if (e.layer instanceof DG.Popup ||\n (e.layer instanceof DG.Entrance && e.layer !== this)) {\n\n this.remove();\n }\n }\n});\n\nDG.entrance = function(options) {\n return new DG.Entrance(options);\n};\n\nDG.Entrance.SHOW_FROM_ZOOM = 16;\nDG.Entrance.PATH_ANIMATION = {\n animation: {\n 'function': DG.Animation.EASE_IN_OUT,\n 'duration': 750\n }\n};\nDG.Entrance.BOUNCE_ANIMATION = {\n animation: [\n {'function': DG.Animation.EASE_IN_OUT, 'duration': 250, 'frames': {'distance': {'from': 0, 'to': 0.6}}},\n {'function': DG.Animation.EASE_IN, 'duration': 135, 'frames': {'distance': {'from': 0.6, 'to': 0}}},\n {'function': DG.Animation.EASE_OUT, 'duration': 135, 'frames': {'distance': {'from': 0, 'to': 0.16}}},\n {'function': DG.Animation.EASE_IN, 'duration': 90, 'frames': {'distance': {'from': 0.16, 'to': 0}}},\n {'function': DG.Animation.EASE_OUT, 'duration': 90, 'frames': {'distance': {'from': 0, 'to': 0.06}}},\n {'function': DG.Animation.EASE_IN, 'duration': 50, 'frames': {'distance': {'from': 0.06, 'to': 0}}}\n ]\n};\n\n/*\n * DG.Entrance.Arrow class hosts two layers, one for arrow body (path) and one for arrow tip\n * It overrides projection events from hosted layers to minimize total overhead\n * Actual calculations produced in DG.ArrowPathTransform and DG.ArrowTipTransform classes\n */\n\nDG.Entrance.Arrow = DG.FeatureGroup.extend({\n initialize: function(options) {\n DG.LayerGroup.prototype.initialize.call(this);\n\n DG.setOptions(this, options);\n\n this._progress = 1;\n this._distance = 0;\n this._visibility = {\n isShown: false\n };\n this._position =\n options.latlngs[options.latlngs.length - 1];\n this._shape =\n this.options.shape ||\n DG.Entrance.Arrow.SHAPE;\n\n this._apt = {}; // DG.ArrowPathTransform objects by zoom levels\n this._att = {}; // DG.ArrowTipTransform objects by zoom levels\n },\n\n beforeAdd: function(map) {\n // this._map is not initialized yet, so we can freely addLayer(s)\n var opts = this.options;\n\n // TODO: Check Canvas processing order\n // Additional logic to DISABLE animation on Canvas for now!\n if (opts.animation && !map.options.preferCanvas && !DG.Browser.ielt9) {\n opts.animation.on('step', this._animation, this);\n } else {\n opts.animation = null;\n }\n\n this.projection();\n\n this.addLayer(new DG.ComplexPath({\n lineCap: 'butt',\n color: opts.color,\n fillColor: opts.fillColor,\n interactive: opts.interactive,\n visibility: this._visibility,\n transform: this._apt\n }));\n\n this.addLayer(new DG.ComplexPath({\n lineJoin: 'miter',\n color: opts.color,\n fillColor: opts.fillColor,\n interactive: opts.interactive,\n visibility: this._visibility,\n transform: this._att\n }));\n },\n\n getEvents: function() {\n return {\n zoomend: this._project,\n moveend: this._update,\n viewreset: this._reset\n };\n },\n\n setVisibility: function(isShown) {\n if (this._visibility.isShown !== isShown) {\n this._visibility.isShown = isShown;\n if (isShown) {\n if (!this.options.animation) {\n this._reset();\n }\n } else {\n this._reset();\n }\n }\n },\n\n getBounds: function() {\n return this.options.bounds;\n },\n\n projection: function() {\n var map = this._map || this._mapToAdd;\n var zoom = map ? map.getZoom() : 0;\n var vertices = this._shape.vertices[zoom];\n var drawings = this._shape.drawings[zoom];\n var latlngs = this.options.latlngs;\n var shape, path, lastPoint, prevPoint;\n\n if (zoom && vertices && drawings) {\n if (!this._att[zoom]) {\n path = DG.ArrowPathTransform.getTranslatedPath(map, latlngs);\n shape = {vertices: vertices, drawings: drawings};\n this._att[zoom] = new DG.ArrowTipTransform(path, shape);\n this._apt[zoom] = new DG.ArrowPathTransform(path);\n }\n\n lastPoint = map.latLngToLayerPoint(this._position);\n prevPoint = map.latLngToLayerPoint(latlngs[latlngs.length - 2]);\n if (!this._apt[zoom]._pxBounds) {\n // One-time action per 'viewreset' event\n // Caching _pxBounds for using with Canvas renderer\n this._setBounds(lastPoint, prevPoint, this._apt[zoom], this._att[zoom]);\n }\n if (this.options.distance) {\n // Arrow position recalculated for Bounce animation effect\n lastPoint = DG.VertexTransform.getScaled(lastPoint, prevPoint, this._distance);\n }\n\n // Main calculations\n // Get part of the arrow path and move (bound) arrow tip to it\n this._apt[zoom].subPath(this._progress).translate(lastPoint);\n this._att[zoom].subShape(this._apt[zoom]).translate(lastPoint);\n }\n\n return this;\n },\n\n _animation: function(e) {\n if (e.distance != undefined) {\n this._distance = e.distance; // bounce animation effect\n } else {\n this._progress = e.progress; // path animation effect\n }\n if (this._visibility.isShown) {\n // TODO: Additional logic for animation on Canvas\n // this.projection().invoke('redraw');\n\n this._project();\n this._update();\n }\n },\n\n _project: function() {\n this.projection().invoke('_project');\n },\n\n _update: function() {\n this.invoke('_update');\n },\n\n _reset: function() {\n this._resetBounds();\n\n this._project();\n this._update();\n },\n\n _resetBounds: function() {\n // Canvas renderer specific\n var z;\n\n for (z in this._apt) {\n this._apt[z]._pxBounds = null;\n }\n\n for (z in this._att) {\n this._att[z]._pxBounds = null;\n }\n },\n\n _setBounds: function(pl, pp, apt, att) {\n var _apt = apt.subPath(1).translate(pl).vertices,\n _att = att.subShape(apt).translate(pl).vertices;\n\n // TODO: Additional logic for animation on Canvas\n // if (this.options.distance) {\n // pl = DG.VertexTransform.getScaled(pl, pp, 1);\n // _apt = _apt.concat(apt.subPath(1).translate(pl).vertices);\n // _att = _att.concat(att.subShape(apt).translate(pl).vertices);\n // }\n\n apt._pxBounds = new DG.Bounds(_apt);\n att._pxBounds = new DG.Bounds(_att);\n }\n});\n\nDG.entrance.arrow = function(options) {\n return new DG.Entrance.Arrow(options);\n};\n\n/*\n * Predefined arrow tips\n */\n\n/* eslint-disable array-bracket-spacing */\nDG.Entrance.Arrow.SHAPE = {\n vertices: {\n 16: [\n [ -6.5000, -1.8000],\n [ -6.0522, -1.8000],\n [ -7.0975, -5.2537],\n [ -6.6619, -6.2565], [ -6.5980, -6.3550], [ -6.1757, -6.1470],\n [ 0.8371, -0.3552],\n [ 0.9275, -0.1764], [ 0.9275, 0.1764], [ 0.8371, 0.3552],\n [ -6.1757, 6.1470],\n [ -6.5980, 6.3550], [ -6.6619, 6.2565], [ -7.0975, 5.2537],\n [ -6.0522, 1.8000],\n [ -6.5000, 1.8000]\n ],\n 17: [\n [ -9.0000, -2.4000],\n [ -7.8890, -2.4000],\n [ -9.9245, -7.2548],\n [ -9.3363, -8.6404], [ -9.3448, -8.6448], [ -8.8717, -8.3508],\n [ 1.0285, -0.3552],\n [ 1.1190, -0.1764], [ 1.1190, 0.1764], [ 1.0285, 0.3552],\n [ -8.8717, 8.3508],\n [ -9.3448, 8.6448], [ -9.3363, 8.6404], [ -9.9245, 7.2548],\n [ -7.8890, 2.4000],\n [ -9.0000, 2.4000]\n ],\n 18: [\n [-11.5000, -3.0000],\n [-10.0795, -3.0000],\n [-12.4909, -9.3173],\n [-11.8402, -10.7654], [-11.5986, -10.7073], [-10.9380, -10.2258],\n [ 1.1497, -0.3552],\n [ 1.2402, -0.1764], [ 1.2402, 0.1764], [ 1.1497, 0.3552],\n [-10.9380, 10.2258],\n [-11.5986, 10.7073], [-11.8402, 10.7654], [-12.4909, 9.3173],\n [-10.0795, 3.0000],\n [-11.5000, 3.0000]\n ],\n 19: [\n [-13.0000, -3.6000],\n [-11.6600, -3.6000],\n [-14.1696, -10.8351],\n [-13.5189, -12.2832], [-13.2773, -12.2251], [-12.6167, -11.7436],\n [ 1.3061, -0.3552],\n [ 1.3966, -0.1764], [ 1.3966, 0.1764], [ 1.3061, 0.3552],\n [-12.6167, 11.7436],\n [-13.2773, 12.2251], [-13.5189, 12.2832], [-14.1696, 10.8351],\n [-11.6600, 3.6000],\n [-13.0000, 3.6000]\n ]\n },\n drawings: {\n 16: ['M', 'L', 'L', 'C', 'L', 'C', 'L', 'C', 'L', 'L'],\n 17: ['M', 'L', 'L', 'C', 'L', 'C', 'L', 'C', 'L', 'L'],\n 18: ['M', 'L', 'L', 'C', 'L', 'C', 'L', 'C', 'L', 'L'],\n 19: ['M', 'L', 'L', 'C', 'L', 'C', 'L', 'C', 'L', 'L']\n }\n};\n/* eslint-enable array-bracket-spacing */\n\n\n(function(vertices) {\n for (var i in vertices) {\n vertices[i] = vertices[i].map(function(vertex) { return DG.point(vertex); });\n }\n})(DG.Entrance.Arrow.SHAPE.vertices);\n\nDG.Label = DG.Layer.extend({\n\n options: {\n offset: new DG.Point(12, 15),\n className: 'dg-label',\n zIndexOffset: 0,\n textDirection: 'auto' // 'auto' | 'ltr' | 'rtl\n },\n\n _typeOfString : Object.prototype.toString.call('s'),\n _defaultZIndex: 100,\n\n initialize: function(content, options) {\n DG.Util.setOptions(this, options);\n\n this._animated = DG.Browser.any3d;\n this._content = content;\n },\n\n onAdd: function(map) {\n this._map = map;\n\n if (!this._el) {\n this._initDOM();\n }\n\n this._visible = true;\n\n this\n .setContent(this._content)\n ._onViewReset();\n\n map\n .on('viewreset', this._onViewReset, this)\n .on('zoomanim', this._onZoomAnimation, this);\n },\n\n onRemove: function(map) {\n map\n .off('viewreset', this._onViewReset, this)\n .off('zoomanim', this._onZoomAnimation, this);\n\n this._visible = false;\n\n this._el.removeChild(this._container);\n DG.Util.falseFn(this._container.offsetWidth); // we need reflow here\n this._container = null;\n\n map.getPanes().tooltipPane.removeChild(this._el);\n this._el = null;\n },\n\n _initDOM: function() {\n this._el = DG.DomUtil.create(\n 'div',\n this.options.className + ' leaflet-zoom-' + (this._animated ? 'animated' : 'hide'),\n this._map.getPanes().tooltipPane);\n this._el.style.zIndex = this._defaultZIndex + this.options.zIndexOffset;\n\n this._container = DG.DomUtil.create('div', this.options.className + '__content', this._el);\n this._container.setAttribute('dir', this.options.textDirection);\n\n DG.DomEvent\n .disableClickPropagation(this._el)\n .on(this._container, 'mousewheel', DG.DomEvent.stopPropagation)\n .on(this._container, 'contextmenu', DG.DomEvent.stopPropagation);\n },\n\n _onViewReset: function() {\n if (this._visible && this._latlng) {\n DG.DomUtil.setPosition(this._el, this._map.latLngToLayerPoint(this._latlng).add(this.options.offset), DG.Browser.ie);\n }\n },\n\n _onZoomAnimation: function(opt) {\n if (this._latlng) {\n DG.DomUtil.setPosition(this._el, this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).add(this.options.offset));\n }\n },\n\n setOffset: function(point) {\n if (point instanceof DG.Point) {\n this.options.offset = point;\n this._onViewReset();\n }\n return this;\n },\n\n setZIndexOffset: function(zIndex) {\n if (!isNaN(+zIndex)) {\n this.options.zIndexOffset = +zIndex;\n if (this._visible) {\n this._el.style.zIndex = this._defaultZIndex + this.options.zIndexOffset;\n }\n }\n return this;\n },\n\n setContent: function(content) {\n if (Object.prototype.toString.call(content) !== this._typeOfString) {\n return this;\n }\n this._content = content;\n if (this._visible) {\n this._container.innerHTML = content;\n }\n return this;\n },\n\n setPosition: function(latlng) {\n if (!(latlng instanceof DG.LatLng)) {\n return this;\n }\n\n this._latlng = latlng;\n this._onViewReset();\n return this;\n }\n});\n\nDG.label = function(content, options) {\n return new DG.Label(content, options);\n};\n\nDG.Marker.include({\n\n bindLabel: function(content, options) {\n if (this._label) {\n this._label.setContent(content);\n if (options) {\n if (this.options.offset !== options.offset) {\n this._label.setOffset(this.options.offset = options.offset);\n }\n if (this.options.static !== options.static) {\n this.unbindLabel().bindLabel(content, options);\n }\n }\n } else {\n options = DG.extend({\n offset: new DG.Point(5, 5)\n }, options);\n\n this._label = DG.label(content, options);\n\n this.once('remove', this._onMarkerRemove);\n\n if (options.static) {\n this.showLabel();\n } else {\n this\n .on('mouseover', this._mouseOverLabel)\n .on('mouseout', this._mouseOutLabel)\n .on('dragstart', this._dragStartLabel)\n .on('dragend', this._dragEndLabel);\n }\n\n if (typeof this._map !== 'undefined') {\n this._updateLabelZIndex();\n } else {\n this.once('add', this._updateLabelZIndex);\n }\n }\n return this;\n },\n\n unbindLabel: function() {\n if (this._label) {\n this\n .hideLabel()\n .off('remove', this.unbindLabel)\n .off('mouseover', this._mouseOverLabel)\n .off('mouseout', this._mouseOutLabel)\n .off('dragstart', this._dragStartLabel)\n .off('dragend', this._dragEndLabel)\n .off('move', this._updatePosition)\n .off('add', this._updateLabelZIndex);\n\n this._label = null;\n }\n return this;\n },\n\n _onMarkerRemove: function() {\n if (this._label) {\n var content = this._label._content;\n this.once('add', function() {\n if (this._label) { return; } // new label added after removing marker\n this.bindLabel(content);\n });\n this.unbindLabel();\n }\n },\n\n getLabel: function() {\n return this._label ? this._label : null;\n },\n\n _originalUpdateZIndex: DG.Marker.prototype._updateZIndex,\n _updateZIndex: function(offset) {\n if (!this._zIndex) {\n this._zIndex = 0;\n }\n this._originalUpdateZIndex(offset);\n this._updateLabelZIndex();\n return this;\n },\n\n _updateLabelZIndex: function() {\n if (this._label && this._icon) {\n this._label.setZIndexOffset(this._icon.style.zIndex);\n }\n return this;\n },\n\n showLabel : function() {\n if (this._label) {\n this\n .on('move', this._updatePosition)\n ._map.addLayer(this._label.setPosition(this.getLatLng()));\n }\n\n return this;\n },\n\n hideLabel : function() {\n if (this._label) {\n this\n .off('move', this._updatePosition)\n ._map.removeLayer(this._label);\n }\n return this;\n },\n\n _updatePosition : function() {\n this._label.setPosition(this.getLatLng());\n },\n\n _dragStartLabel: function() {\n this._label.isMarkerDragging = true;\n\n this.hideLabel();\n },\n\n _dragEndLabel: function() {\n this._label.isMarkerDragging = false;\n\n if (this._label.isMouseOverMarker) {\n this.showLabel();\n }\n },\n\n _mouseOverLabel: function() {\n this._label.isMouseOverMarker = true;\n\n if (!this._label.isMarkerDragging) {\n this.showLabel();\n }\n },\n\n _mouseOutLabel: function() {\n this._label.isMouseOverMarker = false;\n\n this.hideLabel();\n }\n});\n\nDG.Marker.addInitHook(function() {\n if (typeof this.options.label !== 'undefined') {\n this.bindLabel(this.options.label);\n }\n});\n\nDG.Path.include({\n bindLabel: function(content, options) {\n\n if (!this._label) {\n this._label = DG.label(content, options);\n this.on(this._labelEvents, this);\n } else {\n this._label.setContent(content);\n\n if (this._label.options.offset !== options.offset) {\n this._label.setOffset(options.offset);\n }\n }\n return this;\n },\n\n unbindLabel: function() {\n if (this._label) {\n this.off(this._labelEvents, this);\n this._map.removeLayer(this._label);\n this._label = null;\n }\n return this;\n },\n\n getLabel: function() {\n return this._label ? this._label : null;\n },\n\n _labelEvents : {\n mouseover: function(event) {\n this._map.addLayer(this._label.setPosition(event.latlng));\n DG.DomEvent.stop(event);\n },\n mousemove: function(event) {\n this._label.setPosition(event.latlng);\n DG.DomEvent.stop(event);\n },\n mouseout: function(event) {\n this._map.removeLayer(this._label);\n DG.DomEvent.stop(event);\n },\n remove: function() {\n this._map.removeLayer(this._label);\n }\n }\n});\n\nDG.Path.addInitHook(function() {\n if (typeof this.options.label !== 'undefined') {\n this.bindLabel(this.options.label);\n }\n});\n\nDG.Entrance.include({\n bindLabel: function(content, options) {\n\n if (!this._label) {\n this._label = DG.label(content, options);\n this.on(this._labelEvents, this);\n } else {\n this._label.setContent(content);\n\n if (this._label.options.offset !== options.offset) {\n this._label.setOffset(options.offset);\n }\n }\n return this;\n },\n\n unbindLabel: function() {\n if (this._label) {\n this.off(this._labelEvents, this);\n this._map.removeLayer(this._label);\n this._label = null;\n }\n return this;\n },\n\n getLabel: function() {\n return this._label ? this._label : null;\n },\n\n _labelEvents : {\n mouseover: function(event) {\n this._map.addLayer(this._label.setPosition(event.latlng));\n DG.DomEvent.stop(event);\n },\n mousemove: function(event) {\n this._label.setPosition(event.latlng);\n DG.DomEvent.stop(event);\n },\n mouseout: function() {\n this._label.remove();\n },\n remove: function() {\n this._label.remove();\n }\n }\n});\n\nDG.Entrance.addInitHook(function() {\n if (typeof this.options.label !== 'undefined') {\n this.bindLabel(this.options.label);\n }\n});\n\nDG.configTheme = DG.configTheme || {};\n\nDG.configTheme.balloonOptions = {\n offset: {\n x: 1,\n y: -43\n }\n};\n\n_dereq_('../../../vendors/baron');\n\n// 2GIS-related popup content wrapper and offset\n(function() {\n var offsetX = DG.configTheme.balloonOptions.offset.x,\n offsetY = DG.configTheme.balloonOptions.offset.y,\n originalInitialize = DG.Popup.prototype.initialize,\n originalInitLayout = DG.Popup.prototype._initLayout,\n originalOnAdd = DG.Popup.prototype.onAdd,\n graf = baron.noConflict();\n\n var BaronDomHelper = function(element) {\n this[0] = element;\n this.length = 1;\n };\n BaronDomHelper.prototype = {\n setAttribute: function(name, value) {\n this[0].setAttribute(name, value);\n return this;\n },\n getAttribute: function(name) {\n return this[0].getAttribute(name);\n },\n removeAttribute: function(name) {\n this[0].removeAttribute(name);\n return this;\n },\n css: function(style, value) {\n if (value) {\n this[0].style[style] = value;\n return this;\n } else {\n return DG.DomUtil.getStyle(this[0], style);\n }\n }\n };\n\n DG.Popup.prototype.options.offset = DG.point(offsetX, offsetY);\n\n DG.Popup.mergeOptions({\n border: 16,\n mapControlsWidth: 60,\n textDirection: 'auto' // 'auto' | 'ltr' | 'rtl\n });\n\n DG.Popup.include({\n _headerContent: null,\n _footerContent: null,\n\n //baron elements references\n _scroller: null,\n _scrollerBar: null,\n _barWrapper: null,\n _baron: null,\n _isBaronExist: false,\n\n _popupShowClass: 'leaflet-popup_show_true',\n _popupHideClass: 'leaflet-popup_show_false',\n\n _popupTipClass: 'leaflet-popup-tip-container',\n _tipSVGPath: 'M0 0c12.643 0 28 7.115 28 44h2c0-36.885 15.358-44 28-44h-58z',\n\n _isAutoPanPaddingUserDefined: false,\n\n initialize: function(options, source) { // (Object, Object)\n this._popupStructure = {};\n this._isAutoPanPaddingUserDefined = options && options.hasOwnProperty('autoPanPadding');\n originalInitialize.call(this, options, source);\n },\n\n onAdd: function(map) { // (Map)\n map.on({\n entranceshow: this._closePopup,\n resize: this.resize\n }, this);\n originalOnAdd.call(this, map);\n this._animateOpening();\n\n // Monitor popups usage\n // TODO: remove after successful research\n if (typeof ga !== undefined) {\n // eslint-disable-next-line no-undef\n ga(DG.config.gaName + '.send', 'event', 'Popup', 'Use');\n }\n },\n\n onRemove: function(map) { // (Map)\n this._animateClosing();\n map.off({\n entranceshow: this._closePopup,\n resize: this.resize\n }, this);\n\n if (DG.DomUtil.TRANSITION) {\n this._removeTimeout = setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200);\n } else {\n L.DomUtil.remove(this._container);\n }\n\n map.fire('popupclose', {popup: this});\n\n if (this._source) {\n this._source.fire('popupclose', {popup: this}, true);\n }\n },\n\n setContent: function(content) { // (DOMElement | Object | HTML) -> Popup\n if (!this._isNode(content) && typeof content === 'object') {\n Object.keys(content).forEach(function(item) {\n this['_' + item + 'Content'] = content[item];\n }, this);\n } else {\n this._bodyContent = content;\n }\n\n this.update();\n\n return this;\n },\n\n setHeaderContent: function(content) { // (HTML) -> Popup\n this._headerContent = content;\n this.update();\n\n return this;\n },\n\n setFooterContent: function(content) { // (HTML) -> Popup\n this._footerContent = content;\n this.update();\n\n return this;\n },\n\n getContent: function() { // () -> HTML\n return this._bodyContent;\n },\n\n getHeaderContent: function() { // () -> HTML\n return this._headerContent;\n },\n\n getFooterContent: function() { // () -> HTML\n return this._footerContent;\n },\n\n clear: function() { // () -> Popup\n Object.keys(this._popupStructure).forEach(this._clearElement, this);\n\n // think about move this set to another public method\n this._isBaronExist = false;\n return this;\n },\n\n clearHeader: function() { // () -> Popup\n return this._clearElement('header');\n },\n\n clearFooter: function() { // () -> Popup\n return this._clearElement('footer');\n },\n\n findElement: function(element) { // (String) -> DOMElement\n return this._contentNode.querySelector(element);\n },\n\n _animateOpening: function() {\n DG.DomUtil.addClass(this._innerContainer, this._popupShowClass);\n DG.DomUtil.removeClass(this._innerContainer, this._popupHideClass);\n },\n\n _animateClosing: function() {\n DG.DomUtil.addClass(this._innerContainer, this._popupHideClass);\n DG.DomUtil.removeClass(this._innerContainer, this._popupShowClass);\n },\n\n _closePopup: function() {\n this._map.closePopup(this);\n },\n\n _isNode: function(o) { // (Object) -> Boolean\n return (o.nodeName ? true : false);\n },\n\n _onCloseButtonClick: function(e) {\n if (this._map) {\n this._map.closePopup(this);\n }\n L.DomEvent.stop(e);\n },\n\n _close: function() {\n if (this._map) {\n if (DG.Browser.mobile && this._map.geoclicker &&\n (this.options.closeOnClick || this._map.options.closePopupOnClick)) {\n // We need to signal geoclicker that popup was open before 'click' event\n // But by time it will get it's event the popup will be already closed\n // See 'DGGeoclicker' for '_mapEventsListeners' and '_singleClick' method\n this._map.geoclicker.popupWasOpen = true;\n }\n\n this._map.closePopup(this);\n }\n },\n\n _initLayout: function() {\n originalInitLayout.call(this);\n\n // Prevents scroll events for div.leaflet-popup-content (this._contentNode) from web page scrolling when popup is opened\n DG.DomEvent.on(this._contentNode, 'wheel', function(e) {\n var eventPath;\n\n if (e.composedPath) {\n eventPath = e.composedPath();\n } else {\n var elem = e.target;\n eventPath = [];\n while (elem.parentNode) {\n eventPath.push(elem);\n elem = elem.parentNode;\n }\n }\n\n if (eventPath.indexOf(this._scroller) === -1 || eventPath.indexOf(this._barWrapper) !== -1) {\n e.preventDefault();\n }\n }, this);\n\n this._innerContainer = DG.DomUtil.create('div', 'leaflet-popup-inner ' + this._popupHideClass, this._container);\n\n // Prevents mouse events from leaking through close button\n // See https://github.com/2gis/mapsapi/pull/153/\n DG.DomEvent.disableClickPropagation(this._innerContainer);\n\n if (this.options.closeButton) {\n this._innerContainer.appendChild(this._detachEl(this._closeButton));\n }\n\n this._innerContainer.appendChild(this._detachEl(this._wrapper));\n\n var tip = this._detachEl(this._tipContainer);\n\n if (DG.Browser.svg) {\n var path = DG.SVG.create('path');\n var svgClass = this._popupTipClass + ' ' + this._popupTipClass + '_svg';\n\n path.setAttribute('d', this._tipSVGPath);\n\n tip = DG.SVG.create('svg');\n tip.setAttribute('class', svgClass);\n\n tip.appendChild(path);\n DG.DomEvent.disableClickPropagation(path);\n } else {\n DG.DomUtil.addClass(tip, this._popupTipClass + '_image');\n DG.DomEvent.disableClickPropagation(tip);\n }\n\n this._innerContainer.appendChild(tip);\n },\n\n _clearElement: function(elem) { // (DOMElement) -> Popup\n this['_' + elem + 'Content'] = null;\n this._detachEl(this._popupStructure[elem]);\n delete this._popupStructure[elem];\n return this;\n },\n\n _updateScrollPosition: function() {\n if (this._baron) {\n this._baron.update();\n }\n },\n\n resize: function() {\n var scrolled = this._updateLayout();\n this._updatePosition();\n\n if (!scrolled) {\n if (this._isBaronExist) {\n this._scrollerWrapper.style.height = '';\n DG.DomUtil.removeClass(this._scroller, 'dg-scroller');\n\n DG.DomUtil.addClass(this._scroller, 'dg-scroller_hidden_true');\n DG.DomUtil.removeClass(this._scroller, 'dg-scroller');\n DG.DomEvent.off(this._scroller, 'scroll', this._onScroll);\n }\n } else if (this._isBaronExist) {\n DG.DomUtil.removeClass(this._scroller, 'dg-scroller_hidden_true');\n DG.DomUtil.addClass(this._scroller, 'dg-scroller');\n\n var scrollTop = this._isBaronExist ? this._scroller.scrollTop : false;\n\n if (scrollTop) {\n this._scroller.scrollTop = scrollTop;\n }\n\n var innerHeight = this.options.maxHeight - this.options.border * 2 - this._getDelta();\n this._scrollerWrapper.style.height = innerHeight + 'px';\n\n this._updateScrollPosition();\n } else if (!this._isContentHeightEnough()) {\n this._initBaronScroller();\n this._initBaron();\n }\n\n this._adjustPan();\n this._bindAdjustPanOnTransitionEnd();\n },\n\n _adjustPan: function(e) {\n if (!this._map) { return; }\n\n if (e) { // animated popup is opening (height from 0 to max)\n if (e.propertyName === 'max-height') {\n // when it's finished we are here\n DG.DomEvent.off(this._wrapper, DG.DomUtil.TRANSITION_END, this._adjustPan);\n } else {\n // here's intermediate steps - we don't need to process them\n return;\n }\n }\n\n var options = this.options;\n\n if (!options.autoPan) { return; }\n\n var map = this._map,\n containerHeight = this._container.offsetHeight,\n containerWidth = this._containerWidth,\n layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);\n\n if (this._zoomAnimated) {\n layerPos._add(L.DomUtil.getPosition(this._container));\n }\n\n var autoPanPadding = [options.autoPanPadding[0], options.autoPanPadding[1]];\n\n // if width of map is more then width of popup and controls\n // set default autoPanPadding to width controls\n if (\n !this._isAutoPanPaddingUserDefined &&\n this._map._container.offsetWidth >= options.maxWidth + options.mapControlsWidth * 2\n ) {\n autoPanPadding[0] = options.mapControlsWidth;\n }\n\n var containerPos = map.layerPointToContainerPoint(layerPos),\n padding = L.point(autoPanPadding),\n paddingTL = L.point(options.autoPanPaddingTopLeft || padding),\n paddingBR = L.point(options.autoPanPaddingBottomRight || padding),\n size = map.getSize(),\n dx = 0,\n dy = 0;\n\n if (size.x === 0 || size.y === 0) {\n // map isn't visible\n return;\n }\n\n if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right\n dx = containerPos.x + containerWidth - size.x + paddingBR.x;\n }\n if (containerPos.x - dx - paddingTL.x < 0) { // left\n dx = containerPos.x - paddingTL.x;\n }\n if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom\n dy = containerPos.y + containerHeight - size.y + paddingBR.y;\n }\n if (containerPos.y - dy - paddingTL.y < 0) { // top\n dy = containerPos.y - paddingTL.y;\n }\n\n if (dx || dy) {\n map\n .fire('autopanstart')\n .panBy([dx, dy]);\n }\n },\n\n _bindAdjustPanOnTransitionEnd: function() {\n if (DG.DomUtil.TRANSITION) {\n DG.DomEvent.on(this._wrapper, DG.DomUtil.TRANSITION_END, this._adjustPan, this);\n } else {\n this._adjustPan();\n }\n },\n\n _isContentHeightEnough: function() { // () -> Boolean\n var options = this.options;\n\n if (!options.maxHeight) {\n return true;\n }\n\n var popupHeight = this._popupStructure.body ?\n this._popupStructure.body.offsetHeight + this._getDelta() :\n this._contentNode.offsetHeight;\n\n popupHeight += options.border * 2;\n\n return popupHeight <= options.maxHeight;\n },\n\n _initBaronScroller: function() {\n var contentNode = this._popupStructure.body.parentNode,\n scrollerWrapper = this._scrollerWrapper = DG.DomUtil.create('div', 'dg-scroller__wrapper', contentNode),\n scroller = this._scroller = DG.DomUtil.create('div', 'dg-scroller', scrollerWrapper),\n barWrapper = this._barWrapper = DG.DomUtil.create('div', 'dg-scroller__bar-wrapper', scroller),\n innerHeight = this.options.maxHeight - this.options.border * 2;\n\n this._scrollerBar = DG.DomUtil.create('div', 'dg-scroller__bar', barWrapper);\n scroller.appendChild(this._detachEl(this._popupStructure.body));\n\n innerHeight -= this._getDelta();\n scrollerWrapper.style.height = Math.max(18, innerHeight) + 'px';\n scrollerWrapper.style.width = contentNode.offsetWidth + 5 + 'px'; //TODO\n\n this._isBaronExist = true;\n\n this._switchEvents();\n },\n\n _onScroll: function(e) {\n this.fire('scroll', {originalEvent: e});\n },\n\n _onClick: function(e) {\n e.target = e.target || e.srcElement;\n\n if (!this._moving) {\n this.fire('click', {originalEvent: e});\n }\n },\n\n _onStart: function(e) {\n this._moved = false;\n\n if (this._moving) { return; }\n\n var first = e.touches ? e.touches[0] : e;\n\n this._startPoint = new DG.Point(first.clientX, first.clientY);\n\n this._toggleTouchEvents();\n },\n\n _onEnd: function(e) {\n this._toggleTouchEvents(true);\n\n this._onClick(e);\n\n this._moving = false;\n },\n\n _onMove: function(e) {\n\n if (e.touches && e.touches.length > 1) {\n this._moved = true;\n return;\n }\n\n var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\n newPoint = DG.point(first.clientX, first.clientY),\n offset = Math.abs(newPoint.subtract(this._startPoint).y);\n\n if (!offset || offset < 10) { return; }\n\n this._moving = this._moved = true;\n\n },\n\n _initBaron: function() {\n var context = this._scrollerWrapper;\n this._baron = graf({\n scroller: '.dg-scroller',\n bar: '.dg-scroller__bar',\n track: '.dg-scroller__bar-wrapper',\n $: function(selector) {\n var node = {}.toString.call(selector) === '[object String]' ?\n context.querySelector(selector) : selector;\n\n return new BaronDomHelper(node);\n },\n event: function(elem, event, func, mode) {\n event.split(' ').forEach(function(type) {\n DG.DomEvent[mode || 'on'](elem, type, func);\n });\n }\n });\n },\n\n _initHeader: function() {\n this._popupStructure.header = DG.DomUtil.create('header', 'dg-popup__header', this._contentNode);\n this._popupStructure.header.setAttribute('dir', this.options.textDirection);\n },\n\n _initFooter: function() {\n this._popupStructure.footer = DG.DomUtil.create('footer', 'dg-popup__footer', this._contentNode);\n this._popupStructure.footer.setAttribute('dir', this.options.textDirection);\n },\n\n _initBodyContainer: function() {\n this._popupStructure.wrapper = DG.DomUtil.create('div', 'dg-popup__container-wrapper', this._contentNode);\n this._popupStructure.body = DG.DomUtil.create('div', 'dg-popup__container', this._popupStructure.wrapper);\n this._popupStructure.body.setAttribute('dir', this.options.textDirection);\n },\n\n update: function() {\n if (!this._map) { return; }\n\n if (!DG.Browser.ielt9) {\n this._container.style.visibility = 'hidden';\n }\n this._switchEvents(true);\n\n this._clearNode(this._contentNode);\n this._isBaronExist = false;\n\n // init popup content dom structure\n if (this._headerContent) { this._initHeader(); }\n if (this._bodyContent) { this._initBodyContainer(); }\n if (this._footerContent) { this._initFooter(); }\n\n this._updatePopupStructure();\n this.resize();\n\n DG.DomEvent.on(this._wrapper, 'click', DG.DomEvent.stopPropagation);\n this._switchEvents();\n\n if (DG.Browser.ielt9) {\n var elem = this._popupStructure.footer;\n if (elem) {\n elem.className += ' ie8';\n }\n }\n\n if (!DG.Browser.ielt9) {\n this._container.style.visibility = '';\n }\n },\n\n _getDelta: function() { // () -> Number\n var delta = 0,\n popup = this._popupStructure;\n\n if (popup.header) {\n delta += popup.header.offsetHeight;\n }\n if (popup.footer) {\n delta += popup.footer.offsetHeight;\n }\n\n return delta;\n },\n\n _updateLayout: function() {\n var opts = this.options,\n content = this._contentNode, // leaflet-popup-content\n wrapper = this._wrapper, // leaflet-popup-content-wrapper\n style = content.style,\n wrapperStyle = wrapper.style,\n width,\n scrolledClass = 'leaflet-popup-scrolled',\n result = false;\n\n style.margin = opts.border + 'px';\n\n DG.DomUtil.removeClass(content, scrolledClass);\n\n if (this._isContentHeightEnough()) {\n wrapperStyle.maxHeight = content.offsetHeight + opts.border * 2 + 'px';\n } else {\n wrapperStyle.maxHeight = opts.maxHeight + 'px';\n DG.DomUtil.addClass(content, scrolledClass);\n result = true;\n }\n\n var availableWidth = opts.autoPanPadding[0] * 2;\n\n if (opts.sprawling) {\n width = opts.maxWidth;\n\n width = Math.min(width, this._map._container.offsetWidth - availableWidth);\n width = Math.max(width, opts.minWidth);\n } else {\n wrapperStyle.width = '';\n\n style.whiteSpace = 'nowrap';\n width = wrapper.offsetWidth;\n style.whiteSpace = '';\n\n width = Math.min(width, this._map._container.offsetWidth - availableWidth);\n width = Math.min(Math.max(width, opts.minWidth), opts.maxWidth);\n }\n\n wrapperStyle.width = width + 'px';\n\n this._containerWidth = this._container.offsetWidth;\n\n return result;\n },\n\n _updatePopupStructure: function() {\n Object.keys(this._popupStructure).forEach(function(item) {\n this._insertContent(this['_' + item + 'Content'], this._popupStructure[item]);\n }, this);\n\n this.fire('contentupdate');\n },\n\n _insertContent: function(content, node) { // (String | DOMElement, DOMElement)\n if (!content || !node) { return; }\n\n content = (typeof content === 'function') ? content(this._source || this) : content;\n\n if (typeof content === 'string') {\n node.innerHTML = content;\n } else {\n this._clearNode(node);\n node.appendChild(content);\n }\n },\n\n _clearNode: function(node) { // (DOMElement)\n while (node.hasChildNodes()) {\n node.removeChild(node.firstChild);\n }\n },\n\n _detachEl: function(elem) { // (DOMElement) -> DOMElement\n if (elem.parentNode) {\n elem.parentNode.removeChild(elem);\n }\n return elem;\n },\n\n _switchEvents: function(on) { // (Boolean)\n var switcher = on ? 'off' : 'on';\n\n if (!DG.Browser.touch) {\n DG.DomEvent[switcher](this._contentNode, 'click', this._onClick, this);\n } else {\n DG.DomEvent[switcher](this._contentNode, 'touchstart mousedown mousemove', this._onStart, this);\n }\n\n if (this._isBaronExist) {\n DG.DomEvent[switcher](this._scroller, 'scroll', this._onScroll, this);\n }\n },\n\n _toggleTouchEvents: function(on) {\n var switcher = on ? 'off' : 'on';\n\n DG.DomEvent[switcher](this._contentNode, 'touchmove', this._onMove, this);\n DG.DomEvent[switcher](this._contentNode, 'touchend', this._onEnd, this);\n }\n\n });\n}());\n\n\nDG.Map.include({\n _markerClass: 'dg-customization__marker_type_mushroom',\n _markerShowClass: 'dg-customization__marker_appear',\n _markerHideClass: 'dg-customization__marker_disappear',\n _dgHideClass: 'dg-popup_hidden_true',\n openPopup: function(popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object])\n if (!(popup instanceof L.Popup)) {\n var content = popup;\n\n popup = new L.Popup(options).setContent(content);\n }\n\n if (latlng) {\n popup.setLatLng(latlng);\n }\n\n if (this.hasLayer(popup)) {\n return this;\n }\n\n if (this._popup && this._popup.options.autoClose) {\n this.closePopup();\n }\n\n this._popup = popup;\n\n if (popup._source && popup._source._icon) {\n if (popup._source._icon.className.indexOf(this._markerClass) !== -1) {\n DG.DomUtil.removeClass(popup._source._icon, this._markerShowClass);\n DG.DomUtil.addClass(popup._source._icon, this._markerHideClass);\n } else {\n DG.DomUtil.addClass(popup._source._icon, this._dgHideClass);\n if (popup._source._shadow) {\n DG.DomUtil.addClass(popup._source._shadow, this._dgHideClass);\n }\n }\n }\n\n return this.addLayer(popup);\n },\n\n closePopup: function(popup) { // (Popup) -> Popup\n if (!popup || popup === this._popup) {\n popup = this._popup;\n this._popup = null;\n }\n if (popup) {\n if (popup._source && popup._source._icon) {\n if (popup._source._icon.className.indexOf(this._markerClass) !== -1) {\n DG.DomUtil.removeClass(popup._source._icon, this._markerHideClass);\n DG.DomUtil.addClass(popup._source._icon, this._markerShowClass);\n } else {\n DG.DomUtil.removeClass(popup._source._icon, this._dgHideClass);\n if (popup._source._shadow) {\n DG.DomUtil.removeClass(popup._source._shadow, this._dgHideClass);\n }\n }\n }\n this.removeLayer(popup);\n }\n\n return this;\n }\n});\n\nDG.Dictionary = {};\n\nDG.Dictionary.ru = {\n pluralRules: function(n) { // (Number)\n if (n % 10 === 1 && n % 100 !== 11) { // 1, 21\n return 0;\n }\n if ((n % 10 >= 2 && n % 10 <= 4 && (n % 10) % 1 === 0) && (n % 100 < 12 || n % 100 > 14)) { // 2, 3\n return 1;\n }\n\n if ((n % 10 === 0) || (n % 10 >= 5 && n % 10 <= 9 && (n % 10) % 1 === 0) || (n % 100 >= 11 && (n % 100) <= 14 && (n % 100) % 1 === 0)) { // 13, 17\n return 2;\n }\n }\n};\n\nDG.Dictionary.en = {\n pluralRules: function(n) { // (Number)\n if (n === 1) { // 1\n return 0;\n } else {\n return 1; //0, 2, 3, 4 ..\n }\n }\n};\n\nDG.Dictionary.it = {\n pluralRules: function(n) { // (Number)\n if (n === 1) { // 1\n return 0;\n } else {\n return 1; //0, 2, 3, 4 ..\n }\n }\n};\n\nDG.Dictionary.cs = {\n pluralRules: function(n) { // (Number)\n return (n === 1) ? 0 : (n >= 2 && n <= 4) ? 1 : 2;\n }\n};\n\nDG.Dictionary.es = {\n pluralRules: function(n) { // (Number)\n return (n >= 2) ? 1 : 0;\n }\n};\n\n// Stub for Arabic language, we don't have cases with plural form usage\n// Actually Arabic has 6 plural forms\nDG.Dictionary.ar = {\n pluralRules: function() {\n return 0;\n }\n};\n\nDG.Locale = {\n t: function(msg, argument) { // (String, Number) -> String\n var result,\n lang = this._map.getLang(),\n msgIsset = false,\n dictionaryMsg,\n exp;\n\n if (typeof this.constructor.Dictionary[lang] === 'undefined') {\n if (lang === 'ar') {\n lang = 'en';\n } else {\n lang = DG.config.defaultLang;\n }\n }\n dictionaryMsg = this.constructor.Dictionary[lang][msg];\n msgIsset = typeof dictionaryMsg !== 'undefined';\n if (!msgIsset) {\n return msg;\n }\n result = msgIsset ? dictionaryMsg : msg;\n\n if (argument !== undefined) {\n argument = parseInt(argument, 10);\n argument = isNaN(argument) ? 0 : argument;\n exp = this.constructor.Dictionary[lang].pluralRules(argument);\n result = dictionaryMsg[exp];\n }\n\n result = DG.Util.template(result, {n: argument});\n return result;\n }\n};\n\nDG.Map.include({\n setLang: function(lang) { // (String)\n if (lang && Object.prototype.toString.call(lang) === '[object String]') {\n this.options.currentLang = lang;\n this.fire('langchange', {'lang': lang});\n }\n },\n\n getLang: function() { // () -> String\n // If the language hasn't been set before, set it to page language or\n // default language from config\n if (!this.options.currentLang) {\n var root = document.documentElement;\n var lang = root.lang || (root.getAttributeNS && root.getAttributeNS('http://www.w3.org/XML/1998/namespace', 'lang')) || DG.config.defaultLang;\n\n this.options.currentLang = lang;\n }\n\n return this.options.currentLang;\n }\n});\n\nDG.RoundControl = DG.Control.extend({\n includes: DG.Mixin.Events,\n\n options: {\n position: 'topright',\n iconClass: 'default'\n },\n\n onAdd: function(map) {\n var controlClass = this._controlCLass = 'dg-control-round',\n controlIconClass = this._controlIconCLass = this._controlCLass + '__icon',\n container = DG.DomUtil.create('div', '');\n\n if (this._disable) {\n return container;\n }\n DG.DomUtil.addClass(container, controlClass);\n\n var link = this._link = DG.DomUtil.create(\n 'a',\n controlIconClass + ' ' + controlIconClass + '_name_' + this.options.iconClass,\n container\n );\n\n link.href = '#';\n\n this._renderTranslation();\n\n this._map = map;\n\n DG.DomEvent\n .on(container, 'click', this._toggleControl, this)\n .on(container, 'dblclick', DG.DomEvent.stopPropagation)\n .on(link, 'mousedown', DG.DomEvent.stopPropagation);\n\n this.fireEvent('add');\n\n return container;\n },\n\n onRemove: function() {\n this.fireEvent('remove');\n DG.DomEvent.off(this._link, 'click', this._toggleControl);\n },\n\n setState: function(state) {\n if (!this._link || !this._container) {\n return this;\n }\n\n if (this._state) {\n DG.DomUtil.removeClass(this._container, this._controlCLass + '_state_' + this._state);\n DG.DomUtil.removeClass(this._link, this._controlIconCLass + '_state_' + this._state);\n\n this._state = null;\n }\n\n if (state) {\n this._state = state;\n\n DG.DomUtil.addClass(this._container, this._controlCLass + '_state_' + this._state);\n DG.DomUtil.addClass(this._link, this._controlIconCLass + '_state_' + this._state);\n }\n\n return this;\n },\n\n _toggleControl: function(e) {\n DG.DomEvent.stop(e);\n this.fireEvent('click');\n }\n});\n\nDG.RoundControl.include(DG.Locale);\n\nDG.roundControl = function(options) {\n return new DG.RoundControl(options);\n};\n\nvar ie9 = (function() {\n var div = document.createElement('div');\n var all = div.getElementsByTagName('i');\n div.innerHTML = '<!--[if IE 9]><i></i><![endif]-->';\n return Boolean(all[0]);\n})();\n\nvar safari51 = DG.Browser.safari && navigator.userAgent.indexOf('Version/5.1') !== -1;\n\nvar wasPreviouslyDisabled = false;\n\n// Old Safari throws error when localStorage.getItem is called in private mode\ntry {\n wasPreviouslyDisabled = localStorage.getItem('DGMuseum') === 'false';\n} catch (err) {\n // do nothing\n}\n\nDG.Map.mergeOptions({\n museum: !wasPreviouslyDisabled && (DG.Browser.ielt9 || ie9 || DG.Browser.opera12 || safari51)\n});\n\nDG.Map.Museum = DG.Handler.extend({\n statics: {\n Dictionary: {\n ar: {\n wearesorry: 'لا نضمن لك تشغيل ثابت للتطبيق على متصÙØÙƒ. Øاول التØديث:'\n },\n cs: {\n wearesorry: 'NezaruÄujeme stabilnà fungovánà aplikace ve VaÅ¡em prohlÞeÄi. Zkuste provést aktualizaci:'\n },\n en: {\n wearesorry: 'We do not guarantee stable operation of the application in your browser. Try updating:'\n },\n es: {\n wearesorry: 'No garantizamos un funcionamiento estable de la aplicación en su buscador. Intente actualizarlo:'\n },\n it: {\n wearesorry: 'Non garantiamo il funzionamento stabile dell\\'applicazione nel tuo browser. Prova ad aggiornare:'\n },\n ru: {\n wearesorry: 'Мы не гарантируем Ñтабильную работу Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² вашем браузере. Попробуйте обновитьÑÑ:'\n }\n }\n },\n\n includes: [DG.Locale],\n\n initialize: function(map) {\n this._map = map;\n\n this._element = document.createElement('div');\n this._element.className = 'dg-museum';\n this._element.innerHTML = '<span></span>' +\n '<a class=\"dg-museum-browser dg-museum__chrome\" target=\"_blank\" href=\"https://www.google.com/chrome/\"></a>' +\n '<a class=\"dg-museum-browser dg-museum__firefox\" target=\"_blank\" href=\"https://www.mozilla.org/firefox/new/\"></a>' +\n '<a class=\"dg-museum-browser dg-museum__safari\" target=\"_blank\" href=\"https://support.apple.com/downloads/safari\"></a>' +\n '<a class=\"dg-museum-browser dg-museum__opera\" target=\"_blank\" href=\"https://www.opera.com/\"></a>' +\n '<a class=\"dg-museum-browser dg-museum__ie\" target=\"_blank\" href=\"https://windows.microsoft.com/internet-explorer/download-ie\"></a>';\n\n this._text = this._element.children[0];\n\n this._closeButton = document.createElement('span');\n this._closeButton.className = 'dg-museum__close';\n this._element.appendChild(this._closeButton);\n\n this._renderTranslation();\n },\n\n addHooks: function() {\n this._map.getContainer().appendChild(this._element);\n this._map.on('langchange', this._renderTranslation, this);\n DG.DomEvent.on(this._closeButton, 'click', this._onCloseButtonClick, this);\n },\n\n removeHooks: function() {\n this._map.getContainer().removeChild(this._element);\n this._map.off('langchange', this._renderTranslation, this);\n DG.DomEvent.off(this._closeButton, 'click', this._onCloseButtonClick, this);\n },\n\n _onCloseButtonClick: function(e) {\n DG.DomEvent.stop(e);\n\n // Old Safari throws error when localStorage.getItem is called in private mode\n try {\n localStorage.setItem('DGMuseum', 'false');\n } catch (err) {\n // do nothing\n }\n\n this.disable();\n },\n\n _renderTranslation: function() {\n var lang = this._map.getLang();\n this._text.innerHTML = this.t('wearesorry');\n this._element.setAttribute('dir', lang === 'ar' ? 'rtl': 'ltr');\n }\n});\n\nDG.Map.addInitHook('addHandler', 'museum', DG.Map.Museum);\n\nDG.configTheme = DG.configTheme || {};\n\nDG.configTheme.markersData = {\n iconSize: [22, 34],\n className: 'dg-customization__marker dg-customization__marker_type_mushroom',\n iconAnchor: [10, 32]\n};\n\n// Fix a lot of bugs with pinch-zooming\n// See https://github.com/2gis/mapsapi/issues/327\nDG.Map.mergeOptions({\n bounceAtZoomLimits: false\n});\n\n//Inject observing localization change\nvar controlAddTo = DG.Control.prototype.addTo;\n\nDG.Control.include({\n addTo: function(map) {\n map.on('langchange', this._renderTranslation, this);\n\n return controlAddTo.call(this, map);\n },\n _renderTranslation: function() {}\n});\n\n// Just a copy of toPoint function\n// https://github.com/Leaflet/Leaflet/blob/e079588573d0b0c649df95c3d6005373e87f323a/src/geometry/Point.js#L198-L222\nfunction toPoint(x, y, round) {\n if (x instanceof DG.Point) {\n return x;\n }\n if (DG.Util.isArray(x)) {\n return new DG.Point(x[0], x[1]);\n }\n if (x === undefined || x === null) {\n return x;\n }\n if (typeof x === 'object' && 'x' in x && 'y' in x) {\n return new DG.Point(x.x, x.y);\n }\n return new DG.Point(x, y, round);\n}\n\n// Add ability to pass HTMLElement in DG.divIcon html parameter\n// See https://github.com/Leaflet/Leaflet/pull/6571\n// TODO: Remove it after updating leaflet at least to v1.5.0\nDG.DivIcon.include({\n createIcon: function(oldIcon) {\n var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),\n options = this.options;\n\n if (options.html instanceof Element) {\n DG.DomUtil.empty(div);\n div.appendChild(options.html);\n } else {\n div.innerHTML = options.html !== false ? options.html : '';\n }\n\n if (options.bgPos) {\n var bgPos = toPoint(options.bgPos);\n div.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px';\n }\n this._setIconStyles(div, 'icon');\n\n return div;\n },\n});\n\n// Add some browser detection\nDG.Browser.safari51 = DG.Browser.safari && navigator.userAgent.indexOf('Version/5.1') !== -1;\n\n// DG.Browser.touch checks whether touch events supported or not; touchEnabled checks if it's a touch device\nvar msPointer = navigator.msPointerEnabled && navigator.msMaxTouchPoints && !window.PointerEvent;\nvar pointer = (window.PointerEvent && navigator.pointerEnabled && navigator.maxTouchPoints) || msPointer;\nvar documentTouch = window.DocumentTouch && document instanceof window.DocumentTouch;\nDG.Browser.touchEnabled = pointer || 'ontouchstart' in window || documentTouch;\n\n// Applies 2GIS divIcon to marker\nDG.Marker.prototype.options.icon = DG.divIcon(DG.configTheme.markersData);\n\n// support old option clickable\nvar utilSetOptions = DG.Util.setOptions;\n\nDG.setOptions = L.setOptions = DG.Util.setOptions = function(obj, options) {\n if (options && typeof options.clickable !== 'undefined') {\n options.interactive = options.clickable;\n }\n\n return utilSetOptions.call(this, obj, options);\n};\n\nDG.Layer.mergeOptions({\n nonBubblingEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu']\n});\n\nL.Canvas.include({\n // overwrite the function without mousemove debounce as it breaks metalayers events\n _initContainer: function() {\n var container = this._container = document.createElement('canvas');\n\n L.DomEvent\n .on(container, 'mousemove', this._onMouseMove, this)\n .on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this)\n .on(container, 'mouseout', this._handleMouseOut, this);\n\n this._ctx = container.getContext('2d');\n }\n});\n\n// Monitor geometry usage\n// TODO: remove after successful research\nif (DG.Path) {\n var pathInitialize = DG.Path.prototype.onAdd;\n var loggedGeometryTypes = {};\n\n DG.Path.include({\n onAdd: function(map) {\n var type = 'Unknown';\n\n if (DG.Rectangle && this instanceof DG.Rectangle) {\n type = 'Rectangle';\n } else if (DG.Circle && this instanceof DG.Circle) {\n type = 'Circle';\n } else if (DG.CircleMarker && this instanceof DG.CircleMarker) {\n type = 'CircleMarker'\n } else if (DG.Polygon && this instanceof DG.Polygon) {\n type = 'Polygon';\n } else if (DG.Polyline && this instanceof DG.Polyline) {\n type = 'Polyline';\n }\n\n // Don't send event twice for same type\n if (!loggedGeometryTypes[type]) {\n loggedGeometryTypes[type] = true;\n\n if (typeof ga !== undefined) {\n // eslint-disable-next-line no-undef\n ga(DG.config.gaName + '.send', 'event', 'Geometry', 'Use', type);\n }\n }\n\n return pathInitialize.call(this, map);\n },\n });\n}\n\nvar initMap = DG.Map.prototype.initialize,\n panBy = DG.Map.prototype.panBy,\n getBoundsZoom = DG.Map.prototype.getBoundsZoom,\n setMaxZoom = DG.Map.prototype.setMaxZoom;\n\n// Restrict zoom level according to 2gis projects, in case if dgTileLayer is only one\nDG.Map.include({\n\n // number of tileLayers without 2gis layers\n _tileLayersNumber: 0,\n\n _mapMaxZoomCache: null,\n\n //TODO try refactor it after up on new leaflet (> 0.7)\n initialize: function(id, options) { // (HTMLElement or String, Object)\n // Override default wheelPxPerZoomLevel value to avoid zooming too fast\n // on mouse wheel rotation\n // See https://github.com/2gis/mapsapi/issues/343\n options = DG.extend({wheelPxPerZoomLevel: 10000}, options);\n\n this.metaLayers = [];\n\n initMap.call(this, id, options);\n\n // Project must be checked after BaseLayer init which occurs in InitHook (see orig method definition)\n if (this.options.center && this.options.zoom !== undefined) {\n this.setView(DG.latLng(this.options.center), this.options.zoom, {reset: true});\n }\n\n this._lastMetalayer = {\n layer: undefined,\n entity: undefined\n };\n },\n\n setView: function(center, zoom, options) {\n this._restrictZoom(center, zoom);\n\n zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);\n center = this._limitCenter(DG.latLng(center), zoom, this.options.maxBounds);\n options = options || {};\n\n if (options.animate) {\n options.animate = this._testAnimation(center);\n }\n\n this._stop();\n\n if (this._loaded && !options.reset && options !== true) {\n\n if (options.animate !== undefined) {\n options.zoom = DG.extend({\n animate: options.animate,\n duration: options.duration\n }, options.zoom);\n options.pan = DG.extend({\n animate: options.animate,\n duration: options.duration\n }, options.pan);\n }\n\n // try animating pan or zoom\n var animated = (this._zoom !== zoom) ?\n this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :\n this._tryAnimatedPan(center, options.pan);\n\n if (animated) {\n // prevent resize handler call, the view will refresh after animation anyway\n clearTimeout(this._sizeTimer);\n return this;\n }\n }\n\n // animation didn't start, just reset the map view\n this._resetView(center, zoom);\n\n return this;\n },\n\n panBy: function(offset, options) {\n var map = panBy.call(this, offset, options);\n\n var zoom = this._restrictZoom(this.getCenter());\n if (this.getZoom() > zoom) {\n this.setZoom(zoom);\n }\n\n return map;\n },\n\n getBoundsZoom: function(bounds, inside, padding) {\n bounds = DG.latLngBounds(bounds);\n this._restrictZoom(bounds);\n return getBoundsZoom.call(this, bounds, inside, padding);\n },\n\n getTileLayersNumber: function() {\n return this._tileLayersNumber;\n },\n\n setMaxZoom: function(zoom) {\n this._mapMaxZoomCache = null;\n return setMaxZoom.call(this, zoom);\n },\n\n _testAnimation: function(coords) {//if we jump to other project - disable animation\n if (this.projectDetector.enabled()) {\n var projectFrom = this.projectDetector.getProject(),\n projectTo = this.projectDetector.isProjectHere(coords);\n\n if (projectFrom && projectTo) {\n return projectFrom.code === projectTo.code;\n }\n }\n\n return true;\n },\n\n _updateTileLayers: function(e) {\n if (!(e.layer instanceof DG.TileLayer) || e.layer._isDg) { return; }\n\n if (e.type === 'layeradd') {\n this._tileLayersNumber++;\n } else {\n this._tileLayersNumber--;\n }\n },\n\n _getNewBounds: function(coords, zoom) {\n if (coords instanceof DG.LatLngBounds) {\n return coords;\n }\n\n var point = this.project(coords, zoom);\n var screenSize = this.getSize().divideBy(2);\n\n var sw = this.unproject(point.subtract(screenSize), zoom);\n var ne = this.unproject(point.add(screenSize), zoom);\n\n return DG.latLngBounds(sw, ne);\n },\n\n _restrictZoom: function(coords, zoom) {\n if (this._layers &&\n this.projectDetector.enabled() &&\n (this._tileLayersNumber === 0)) {\n\n var mapOptions = this.options,\n isMapMaxZoom = !!mapOptions.maxZoom,\n dgTileLayer = this.baseLayer,\n bounds = this._getNewBounds(coords, zoom),\n project = this.projectDetector.isProjectHere(bounds);\n\n if (isMapMaxZoom) {\n if (!this._mapMaxZoomCache) {\n if (this.baseLayer.options.detectRetina && DG.Browser.retina && mapOptions.maxZoom > 0) {\n mapOptions.maxZoom--;\n }\n\n this._mapMaxZoomCache = mapOptions.maxZoom;\n }\n mapOptions.maxZoom = (this._mapMaxZoomCache && project) ? this._mapMaxZoomCache : DG.config.projectLeaveMaxZoom;\n if (project) {\n this._mapMaxZoomCache = mapOptions.maxZoom;\n }\n\n return mapOptions.maxZoom;\n } else {\n if (project) {\n if (dgTileLayer.options.detectRetina && DG.Browser.retina && project.maxZoom > 0) {\n dgTileLayer.options.maxZoom = project.maxZoom - 1;\n } else {\n dgTileLayer.options.maxZoom = project.maxZoom;\n }\n } else {\n dgTileLayer.options.maxZoom = DG.config.projectLeaveMaxZoom;\n }\n\n dgTileLayer.options.maxNativeZoom = dgTileLayer.options.maxZoom;\n this._updateZoomLevels();\n\n return dgTileLayer.options.maxZoom;\n }\n }\n },\n\n // Added meta layers events processing before map events\n _fireDOMEvent: function(e, type, targets) {\n if (e.keyCode === 13) {\n // https://github.com/Leaflet/Leaflet/issues/5499\n return;\n }\n if (e.type === 'click') {\n // Fire a synthetic 'preclick' event which propagates up (mainly for closing popups).\n // @event preclick: MouseEvent\n // Fired before mouse click on the map (sometimes useful when you\n // want something to happen on click before any existing click\n // handlers start running).\n var synth = L.Util.extend({}, e);\n synth.type = 'preclick';\n this._fireDOMEvent(synth, synth.type, targets);\n }\n\n if (e._stopped) { return; }\n\n // Find the layer the event is propagating from and its parents.\n targets = (targets || []).concat(this._findEventTargets(e, type));\n\n if (!targets.length) { return; }\n\n var target = targets[0];\n if (type === 'contextmenu' && target.listens(type, true)) {\n L.DomEvent.preventDefault(e);\n }\n\n // The eventTargets and eventTargetsMapIndex properties are used for fire events continuation to\n // remaining targets when the event was stopped due to the tile meta data request in progress.\n // In this case there is need to fire events to remaining targets asynchronously.\n var data = {\n originalEvent: e,\n eventTargets: targets,\n eventTargetsMapIndex: targets.indexOf(this)\n };\n\n if (e.type !== 'keypress') {\n var isMarker = target instanceof L.Marker;\n data.containerPoint = isMarker ?\n this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e);\n data.layerPoint = this.containerPointToLayerPoint(data.containerPoint);\n data.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint);\n }\n\n for (var i = 0; i < targets.length; i++) {\n // Check metalayers before dispatch the event to the map\n if (targets[i] === this) {\n var metalayer = this._getCurrentMetaLayer(data);\n\n if (type === 'mousemove') {\n if (this._lastMetalayer.entity && metalayer.entity &&\n this._lastMetalayer.entity.id === metalayer.entity.id) {\n this._fireMetalayerEvent('mousemove', metalayer, data);\n } else {\n this._fireMetalayerEvent('mouseout', this._lastMetalayer, data);\n this._fireMetalayerEvent('mouseover', metalayer, data);\n this._fireMetalayerEvent('mousemove', metalayer, data);\n this._lastMetalayer = metalayer;\n }\n } else {\n this._fireMetalayerEvent(type, metalayer, data);\n }\n\n // If the event wasn't stopped in metalayers, dispatch it to the map\n if (!data.originalEvent._stopped) {\n targets[i].fire(type, data, true);\n }\n } else {\n targets[i].fire(type, data, true);\n if (this._lastMetalayer.entity && data.originalEvent._stopped) {\n // fixes L.circle([54.983136831455, 82.897440725094], 200).addTo(map);\n this._fireMetalayerEvent('mouseout', this._lastMetalayer, data);\n this._lastMetalayer = {\n layer: undefined,\n entity: undefined\n };\n }\n }\n\n if (data.originalEvent._stopped ||\n (targets[i].options.nonBubblingEvents && L.Util.indexOf(targets[i].options.nonBubblingEvents, type) !== -1)) { return; }\n }\n },\n\n _getCurrentMetaLayer: function(data) {\n // Not forget for IE8 with srcElement\n var eventTarget = data.originalEvent.target || data.originalEvent.srcElement;\n var isClick = data.originalEvent.type === 'click';\n\n // Suppose that user can interact with the metalayer only if there are no layers between cursor and map\n if (\n // For all browsers which support pointer-events: none on tiles\n eventTarget === this._container ||\n // And for IE10 or less where targets are tiles\n DG.Browser.ie && eventTarget.className === 'leaflet-tile leaflet-tile-loaded' ||\n // The only exception is canvas, because a canvas layer occupies the whole screen\n eventTarget.tagName === 'CANVAS'\n ) {\n for (var j = this.metaLayers.length - 1; j >= 0; j--) {\n var metaEntity = this.metaLayers[j].getHoveredObject(data);\n if (metaEntity) {\n return {\n layer: this.metaLayers[j],\n entity: metaEntity\n };\n } else if (isClick) {\n // Additional condition for click event, because there may not be the tile meta data.\n // E.g. when the tile meta data request in progress. In this case the metalayer must be\n // returned without an entity.\n return {\n layer: this.metaLayers[j],\n entity: undefined\n }\n }\n }\n }\n return {\n layer: undefined,\n entity: undefined\n };\n },\n\n _fireMetalayerEvent: function(type, metalayer, data) {\n // There is need to continue if the event type is click, because there may not be the tile meta data.\n // That's why it will be processed in the metalayer click handler.\n if (!metalayer.entity && type !== 'click') {\n return;\n }\n\n // There is no need to fire metalayer event if the metalayer is undefined.\n if (!metalayer.layer) {\n return;\n }\n\n var listener = metalayer.layer.mapEvents[type];\n if (!listener) {\n return;\n }\n data.entity = metalayer.entity;\n listener.call(metalayer.layer, data);\n }\n});\n\nDG.Map.addInitHook(function() {\n this.on('layeradd layerremove', this._updateTileLayers);\n});\n\n// Set css property touch-action to auto if dragging is false.\n// Need for scrolling page in mobile using our map dom element.\n// todo: I made issue in leaflet https://github.com/Leaflet/Leaflet/issues/4415\nDG.Map.addInitHook(function() {\n if (this.options.dragging == false && this.options.tap == false) {\n DG.DomUtil.addClass(this._container, 'dg-dragging-false');\n }\n});\n\nDG.Map.addInitHook(function() {\n var errorUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEAAQMAAABmvDolAAAAA1BMVEX28t5R0k5UAAAAH0lEQVR4Xu3AAQkAAADCMPunNsdhWxwAAAAAAAAAwAEhAAABg2UP5AAAAABJRU5ErkJggg==';\n var errorRuUrl = DG.config.protocol + DG.config.baseUrl + '/img/nomap_ru.png';\n\n var TileLayer = DG.Browser.mobile ? DG.MobileTileLayer : DG.TileLayer;\n\n var BaseLayer = TileLayer.extend({\n initialize: function(url, options) {\n this._isDg = true;\n TileLayer.prototype.initialize.call(this, url, options);\n },\n\n getTiles: function() {\n return this._tiles;\n }\n });\n\n var tileUrl = DG.config.protocol + (DG.Browser.retina ? DG.config.retinaTileServer : DG.config.tileServer);\n var arabicTileUrl = DG.config.protocol +\n (DG.Browser.retina ? DG.config.arabicRetinaTileServer : DG.config.arabicTileServer);\n\n var previewTileUrl = DG.config.protocol +\n (DG.Browser.retina ? DG.config.previewRetinaTileServer : DG.config.previewTileServer);\n var arabicPreviewTileUrl = DG.config.protocol +\n (DG.Browser.retina ? DG.config.arabicPreviewRetinaTileServer : DG.config.arabicPreviewTileServer);\n\n this.baseLayer = new BaseLayer(tileUrl, {\n subdomains: '0123',\n errorTileUrl: this.getLang() === 'ru' ? errorRuUrl : errorUrl,\n detectRetina: DG.config.detectRetina,\n maxZoom: 19,\n maxNativeZoom: 19,\n zIndex: 0,\n updateWhenIdle: false, // it's okay with preview tiles\n previewUrl: previewTileUrl,\n });\n\n var currentTilesLang = ''; // 'ar' | ''\n\n function updateTileUrl() {\n var lang = this.getLang();\n var project = this.projectDetector && this.projectDetector.getProject();\n\n if (lang === 'ru' && !project) {\n this.baseLayer.options.errorTileUrl = errorRuUrl;\n } else {\n this.baseLayer.options.errorTileUrl = errorUrl;\n }\n\n // Change 2GIS tiles for Arabic language in Dubai project\n if (currentTilesLang === '' && lang === 'ar' && project && project.country_code === 'ae') {\n currentTilesLang = 'ar';\n this.baseLayer.setUrl(arabicTileUrl);\n if (this.baseLayer.setPreviewUrl) {\n this.baseLayer.setPreviewUrl(arabicPreviewTileUrl);\n }\n\n } else if (currentTilesLang === 'ar' && (lang !== 'ar' || (!project || project.country_code !== 'ae'))) {\n currentTilesLang = '';\n this.baseLayer.setUrl(tileUrl);\n if (this.baseLayer.setPreviewUrl) {\n this.baseLayer.setPreviewUrl(previewTileUrl);\n }\n }\n }\n\n updateTileUrl.call(this);\n\n this.baseLayer.addTo(this);\n\n this.on({\n langchange: updateTileUrl,\n projectchange: updateTileUrl,\n projectleave: updateTileUrl\n }, this);\n});\n\nDG.Map.mergeOptions({\n tilesCheck: true\n});\n\nDG.Map.TilesCheck = DG.Handler.extend({\n initialize: function(map) {\n this._map = map;\n this._layer = map.baseLayer;\n\n this._moveStartEventCounter = 0;\n this._moveEndEventCounter = 0;\n\n this._loadingEventCounter = 0;\n this._loadEventCounter = 0;\n },\n\n addHooks: function() {\n this._map.on(this._mapEvents, this);\n this._layer.on(this._layerEvents, this);\n },\n\n removeHooks: function() {\n this._map.off(this._mapEvents, this);\n this._layer.off(this._layerEvents, this);\n },\n\n _mapEvents: {\n layeradd: function(e) {\n if (e.layer == this._layer) {\n this.enable();\n }\n },\n\n layerremove: function(e) {\n if (e.layer == this._layer) {\n this.disable();\n }\n },\n\n movestart: function() {\n this._stopWaiting();\n\n this._moveStartEventCounter++;\n this._isWaiting = true;\n },\n\n moveend: function() {\n this._moveEndEventCounter++;\n\n if (!this._isWaiting && this._moveStartEventCounter !== this._moveEndEventCounter) { return; }\n\n this._isMoveEnd = true;\n\n this._checkWaiting();\n }\n },\n\n _layerEvents: {\n loading: function() {\n this._loadingEventCounter++;\n },\n\n load: function() {\n this._loadEventCounter++;\n\n if (!this._isWaiting && this._loadingEventCounter !== this._loadEventCounter) { return; }\n\n this._isLoad = true;\n\n this._checkWaiting();\n }\n },\n\n _stopWaiting: function() {\n this._isWaiting = false;\n this._isMoveEnd = false;\n this._isLoad = false;\n },\n\n _checkWaiting: function() {\n if (this._isWaiting && this._isLoad && this._isMoveEnd) {\n this._stopWaiting();\n this._resetCounters();\n this._checkTiles();\n }\n },\n\n _checkTiles: function() {\n if (this._map.getTileLayersNumber() !== 0 || !this._map._loaded) { return; }\n\n var tileZoom = this._layer._tileZoom;\n var errorUrl = this._layer.options.errorTileUrl;\n var tiles = this._layer.getTiles();\n\n for (var i in tiles) {\n if (tiles[i].coords.z === tileZoom && tiles[i].el.src !== errorUrl) {\n return;\n }\n }\n\n this._map.zoomOut();\n },\n\n _resetCounters: function() {\n this._moveStartEventCounter = 0;\n this._moveEndEventCounter = 0;\n\n this._loadingEventCounter = 0;\n this._loadEventCounter = 0;\n }\n});\n\nDG.Map.addInitHook('addHandler', 'tilesCheck', DG.Map.TilesCheck);\n\n/**\n * This customization fixes unwanted inertia movement after sudden drag stops\n * See https://github.com/Leaflet/Leaflet/pull/4048.\n * If this PR ever gets merged, this file can be removed.\n */\nvar onDragEnd = DG.Map.Drag.prototype._onDragEnd;\n\nDG.Map.Drag.include({\n _rememberTimeAndPosition: function() {\n var time = this._lastTime = +new Date(),\n pos = this._lastPos = this._draggable._absPos || this._draggable._newPos;\n\n this._positions.push(pos);\n this._times.push(time);\n\n // Remove all data points older than 50 ms\n while (time - this._times[0] > 50) {\n this._positions.shift();\n this._times.shift();\n }\n },\n\n _onDrag: function(e) {\n if (this._map.options.inertia) {\n this._rememberTimeAndPosition();\n }\n\n this._map\n .fire('move', e)\n .fire('drag', e);\n },\n\n _onDragEnd: function() {\n if (this._map.options.inertia && !DG.Browser.touch) {\n this._rememberTimeAndPosition();\n }\n\n onDragEnd.call(this);\n }\n});\n\n// from https://github.com/Turfjs/turf-inside/blob/master/index.js\nDG.PolyUtil.inside = function(point, polygon, pointReduce) {\n pointReduce = pointReduce || DG.PolyUtil._defaultPointReduce;\n var polys = polygon.coordinates;\n var pt = pointReduce(point);\n\n // normalize to multipolygon\n if (polygon.type === 'Polygon') {\n polys = [polys];\n }\n\n var insidePoly = false;\n var i = 0;\n while (i < polys.length && !insidePoly) {\n // check if it is in the outer ring first\n if (this._inRing(pt, polys[i][0], pointReduce)) {\n var inHole = false;\n var k = 1;\n // check for the point in any of the holes\n while (k < polys[i].length && !inHole) {\n if (this._inRing(pt, polys[i][k], pointReduce)) {\n inHole = true;\n }\n k++;\n }\n if (!inHole) {\n insidePoly = true;\n }\n }\n i++;\n }\n return insidePoly;\n};\n\n// pt is [x,y] and ring is [[x,y], [x,y],..]\nDG.PolyUtil._inRing = function(pt, ring, pointReduce) {\n var isInside = false;\n for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n var pi = pointReduce(ring[i]);\n var pj = pointReduce(ring[j]);\n var xi = pi[0], yi = pi[1];\n var xj = pj[0], yj = pj[1];\n var intersect = ((yi > pt[1]) !== (yj > pt[1])) &&\n (pt[0] < (xj - xi) * (pt[1] - yi) / (yj - yi) + xi);\n\n if (intersect) {\n isInside = !isInside;\n }\n }\n return isInside;\n};\n\nDG.PolyUtil._defaultPointReduce = function(point) {\n return point;\n};\n\n/**\n * Ð’ файле ÑодежатÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑƒÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð»Ð¸Ñ„Ð»ÐµÑ‚Ð° на мобильных девайÑах\n */\n\nif (DG.Browser.mobile) {\n (function() {\n /**\n * Хакаем addClass и removeClass, чтобы они не работали Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ñ… клаÑÑов\n * Сделано так, чтобы не менÑÑ‚ÑŒ кучу методов в кишках лифлета\n *\n * leaflet-dragging и leaflet-drag-target вызывает длинный recalculate style\n */\n var addClass = L.DomUtil.addClass;\n L.DomUtil.addClass = function(el, name) {\n if (name === 'leaflet-dragging' ||\n name === 'leaflet-drag-target'\n ) {\n return;\n }\n\n addClass(el, name);\n };\n\n var removeClass = L.DomUtil.removeClass;\n L.DomUtil.removeClass = function(el, name) {\n if (name === 'leaflet-dragging' ||\n name === 'leaflet-drag-target'\n ) {\n return;\n }\n\n removeClass(el, name);\n }\n\n L.Draggable.include({\n /**\n * Добавлено округление позиции this._startPos.add(offset)._round()\n * И Ñравнение Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ´Ñ‹Ñ‰ÐµÐ¹ if (this._newPos && this._newPos.x == pos.x && this._newPos.y == pos.y) {\n * Чтобы обновление dom проиÑходило только при реальном изменении\n * Убраны клаÑÑÑ‹ leaflet-dragging и leaflet-drag-target\n */\n _onMove: function(e) {\n // Ignore simulated events, since we handle both touch and\n // mouse explicitly; otherwise we risk getting duplicates of\n // touch events, see #4315.\n // Also ignore the event if disabled; this happens in IE11\n // under some circumstances, see #3666.\n if (e._simulated || !this._enabled) { return; }\n\n if (e.touches && e.touches.length > 1) {\n this._moved = true;\n return;\n }\n\n var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\n newPoint = new L.Point(first.clientX, first.clientY),\n offset = newPoint.subtract(this._startPoint);\n\n if (!offset.x && !offset.y) { return; }\n if (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; }\n\n L.DomEvent.preventDefault(e);\n\n if (!this._moved) {\n // @event dragstart: Event\n // Fired when a drag starts\n this.fire('dragstart');\n\n this._moved = true;\n this._startPos = L.DomUtil.getPosition(this._element).subtract(offset);\n\n this._lastTarget = e.target || e.srcElement;\n // IE and Edge do not give the <use> element, so fetch it\n // if necessary\n if ((window.SVGElementInstance) && (this._lastTarget instanceof window.SVGElementInstance)) {\n this._lastTarget = this._lastTarget.correspondingUseElement;\n }\n }\n\n var pos = this._startPos.add(offset)._round();\n this._moving = true;\n\n L.Util.cancelAnimFrame(this._animRequest);\n this._lastEvent = e;\n\n if (this._newPos && this._newPos.x == pos.x && this._newPos.y == pos.y) {\n return;\n }\n\n this._newPos = pos;\n this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true);\n }\n });\n\n /**\n * ДлительноÑÑ‚ÑŒ вÑех инерций при движении карты теперь 1 Ñекунда\n */\n L.Map.Drag.include({\n _onDragEnd: function(e) {\n var map = this._map,\n options = map.options,\n\n noInertia = !options.inertia || this._times.length < 2;\n\n map.fire('dragend', e);\n\n if (noInertia) {\n map.fire('moveend');\n\n } else {\n\n var direction = this._lastPos.subtract(this._positions[0]),\n duration = (this._lastTime - this._times[0]) / 1000,\n ease = options.easeLinearity,\n\n speedVector = direction.multiplyBy(ease / duration),\n speed = speedVector.distanceTo([0, 0]),\n\n limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),\n limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),\n\n decelerationDuration = 1, // limitedSpeed / (options.inertiaDeceleration * ease),\n offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();\n\n if (!offset.x && !offset.y) {\n map.fire('moveend');\n\n } else {\n offset = map._limitOffset(offset, map.options.maxBounds);\n\n L.Util.requestAnimFrame(function() {\n map.panBy(offset, {\n duration: decelerationDuration,\n easeLinearity: ease,\n noMoveStart: true,\n animate: true\n });\n });\n }\n }\n }\n })\n })();\n}\n\nL.MobileTileLayer = L.TileLayer.extend({\n initialize: function(url, options) {\n L.TileLayer.prototype.initialize.call(this, url, options);\n\n this._previewUrl = options.previewUrl;\n },\n\n setPreviewUrl: function(url) {\n this._previewUrl = url;\n this.redraw();\n },\n\n /**\n * БыÑтрое навешивание Ñобытий, вмеÑто L.DomUtil.on иÑпользуем проÑтое приÑваивание\n */\n createTile: function(coords, done, url) {\n var tile = document.createElement('img');\n tile.onload = L.bind(this._tileOnLoad, this, done, tile);\n tile.onerror = L.bind(this._tileOnError, this, done, tile);\n\n if (this.options.crossOrigin) {\n tile.crossOrigin = '';\n }\n\n /*\n Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons\n http://www.w3.org/TR/WCAG20-TECHS/H67\n */\n tile.alt = '';\n tile.src = this.getTileUrl(coords, url);\n\n return tile;\n },\n\n /**\n * Убран клаÑÑ leaflet-tile\n * Добавлен хак Ð´Ð»Ñ Ð¿Ñ€ÐµÐ²ÑŒÑŽ тайлов\n */\n _initTile: function(tile) {\n tile.style.position = 'absolute';\n\n var tileSize = this.getTileSize();\n tile.style.width = tileSize.x + 'px';\n tile.style.height = tileSize.y + 'px';\n\n tile.style.visibility = 'hidden';\n tile.style.pointerEvents = 'none';\n\n tile.onselectstart = L.Util.falseFn;\n tile.onmousemove = L.Util.falseFn;\n\n // without this hack, tiles disappear after zoom on Chrome for Android\n // https://github.com/Leaflet/Leaflet/issues/2078\n if (L.Browser.android && !L.Browser.android23) {\n tile.style.WebkitBackfaceVisibility = 'hidden';\n }\n\n return tile;\n },\n\n /**\n * Убран клаÑÑ leaflet-tile-container\n */\n _updateLevels: function() {\n\n var zoom = this._tileZoom,\n maxZoom = this.options.maxZoom;\n\n if (zoom === undefined) { return undefined; }\n\n for (var z in this._levels) {\n if (this._levels[z].el.children.length || z === zoom) {\n this._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z);\n } else {\n L.DomUtil.remove(this._levels[z].el);\n this._removeTilesAtZoom(z);\n delete this._levels[z];\n }\n }\n\n var level = this._levels[zoom],\n map = this._map;\n\n if (!level) {\n level = this._levels[zoom] = {};\n\n level.el = L.DomUtil.create('div', 'leaflet-zoom-animated', this._container);\n\n level.el.style.zIndex = maxZoom;\n\n level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round();\n level.zoom = zoom;\n\n this._setZoomTransform(level, map.getCenter(), map.getZoom());\n\n // force the browser to consider the newly added element for transition\n L.Util.falseFn(level.el.offsetWidth);\n }\n\n this._level = level;\n\n return level;\n },\n\n /**\n * Убрано добавление тайлов через documentFragment\n */\n _update: function(center) {\n var map = this._map;\n if (!map) { return; }\n var zoom = map.getZoom();\n\n if (center === undefined) { center = map.getCenter(); }\n if (this._tileZoom === undefined) { return; }\t// if out of minzoom/maxzoom\n\n var pixelBounds = this._getTiledPixelBounds(center),\n tileRange = this._pxBoundsToTileRange(pixelBounds),\n tileCenter = tileRange.getCenter(),\n queue = [],\n margin = this.options.keepBuffer,\n noPruneRange = new L.Bounds(tileRange.getBottomLeft().subtract([margin, -margin]),\n tileRange.getTopRight().add([margin, -margin]));\n\n for (var key in this._tiles) {\n var c = this._tiles[key].coords;\n if (c.z !== this._tileZoom || !noPruneRange.contains(L.point(c.x, c.y))) {\n this._tiles[key].current = false;\n }\n }\n\n // _update just loads more tiles. If the tile zoom level differs too much\n // from the map's, let _setView reset levels and prune old tiles.\n if (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; }\n\n // create a queue of coordinates to load tiles from\n for (var j = tileRange.min.y; j <= tileRange.max.y; j++) {\n for (var i = tileRange.min.x; i <= tileRange.max.x; i++) {\n var coords = new L.Point(i, j);\n coords.z = this._tileZoom;\n\n if (!this._isValidTile(coords)) { continue; }\n\n var tile = this._tiles[this._tileCoordsToKey(coords)];\n if (tile) {\n tile.current = true;\n } else {\n queue.push(coords);\n }\n }\n }\n\n // sort tile queue to load tiles in order of their distance to center\n queue.sort(function(a, b) {\n return a.distanceTo(tileCenter) - b.distanceTo(tileCenter);\n });\n\n if (queue.length !== 0) {\n // if it's the first batch of tiles to load\n if (!this._loading) {\n this._loading = true;\n // @event loading: Event\n // Fired when the grid layer starts loading tiles.\n this.fire('loading');\n }\n\n for (i = 0; i < queue.length; i++) {\n this._addTile(queue[i], this._level.el);\n }\n }\n },\n\n /**\n * We don't load preview tile:\n * - after zoom-in if a tile from a lower zoom is already shown\n * - after zoom-out if four tiles from a higher zoom is already shown\n */\n _needPreviewTile: function(coords) {\n if (this._tileZoom - this._map.getZoom() > 0) {\n // zoom in\n return !this._existTileFromLowerZoom(coords);\n } else {\n // zoom out\n return !this._existTilesFromHigherZoom(coords);\n }\n },\n\n _existTileFromLowerZoom: function(coords) {\n var coords2 = L.point(coords.x / 2, coords.y / 2)._floor();\n\n coords2.z = coords.z - 1;\n\n var key = this._tileCoordsToKey(coords2);\n var tile = this._tiles[key];\n return tile && !tile.preview;\n },\n\n _existTilesFromHigherZoom: function(coords) {\n var x = coords.x;\n var y = coords.y;\n\n for (var i = 2 * x; i < 2 * x + 2; i++) {\n for (var j = 2 * y; j < 2 * y + 2; j++) {\n var c = new L.Point(i, j);\n c.z = coords.z + 1;\n var key = this._tileCoordsToKey(c);\n if (!this._tiles[key]) {\n return false;\n }\n }\n }\n\n return true;\n },\n\n /**\n * Добавлена логика Ñ Ð¿Ñ€ÐµÐ²ÑŒÑŽ тайлами\n */\n _addTile: function(coords, container) {\n var tilePos = this._getTilePos(coords),\n key = this._tileCoordsToKey(coords);\n\n var wrapCoords = this._wrapCoords(coords);\n var needPreview = this._needPreviewTile(wrapCoords);\n\n var url = needPreview ? this._previewUrl : this._url;\n var tile = this.createTile(wrapCoords, L.bind(this._tileReady, this, coords), url);\n\n this._initTile(tile);\n\n L.DomUtil.setPosition(tile, tilePos);\n\n // save tile in cache\n this._tiles[key] = {\n el: tile,\n preview: needPreview,\n coords: coords,\n current: true\n };\n\n container.appendChild(tile);\n // @event tileloadstart: TileEvent\n // Fired when a tile is requested and starts loading.\n this.fire('tileloadstart', {\n tile: tile,\n coords: coords\n });\n },\n\n /**\n * Убран fadeAnimated и клаÑÑ leaflet-tile-loaded\n */\n _tileReady: function(coords, err, tile) {\n if (!this._map) { return; }\n\n if (err) {\n // @event tileerror: TileErrorEvent\n // Fired when there is an error loading a tile.\n this.fire('tileerror', {\n error: err,\n tile: tile,\n coords: coords\n });\n }\n\n var key = this._tileCoordsToKey(coords);\n\n tile = this._tiles[key];\n if (!tile) { return; }\n\n // ЕÑли у тайла уже еÑÑ‚ÑŒ Ð¾Ñ€Ð¸Ð³Ð¸Ð½Ð°Ð»ÑŒÐ½Ð°Ñ (не пожатаÑ) картинка,\n // то заменим превью на нее\n if (tile.originalEl && tile.el.parentNode) {\n tile.el.parentNode.replaceChild(tile.originalEl, tile.el);\n tile.el = tile.originalEl;\n\n tile.originalEl = null;\n tile.preview = false;\n\n // ЕÑли у тайла еÑÑ‚ÑŒ только превью, то добавим его на карту\n // И начнем грузить оригинальный\n } else if (tile.preview) {\n tile.originalEl = this.createTile(this._wrapCoords(coords), L.bind(this._tileReady, this, coords), this._url);\n this._initTile(tile.originalEl);\n L.DomUtil.setPosition(tile.originalEl, this._getTilePos(coords));\n }\n\n tile.loaded = +new Date();\n tile.active = true;\n this._pruneTiles();\n\n if (!err) {\n tile.el.style.visibility = '';\n\n // @event tileload: TileEvent\n // Fired when a tile loads.\n this.fire('tileload', {\n tile: tile.el,\n preview: tile.preview,\n coords: coords\n });\n }\n\n if (this._noTilesToLoad()) {\n this._loading = false;\n // @event load: Event\n // Fired when the grid layer loaded all visible tiles.\n this.fire('load');\n\n if (L.Browser.ielt9 || !this._map._fadeAnimated) {\n L.Util.requestAnimFrame(this._pruneTiles, this);\n } else {\n // Wait a bit more than 0.2 secs (the duration of the tile fade-in)\n // to trigger a pruning.\n setTimeout(L.bind(this._pruneTiles, this), 250);\n }\n }\n },\n\n /**\n * Ð’ отличие от оригинального метода, здеÑÑŒ url прокидываетÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼\n */\n getTileUrl: function(coords, url) {\n var data = {\n r: L.Browser.retina ? '@2x' : '',\n s: this._getSubdomain(coords),\n x: coords.x,\n y: coords.y,\n z: this._getZoomForUrl()\n };\n if (this._map && !this._map.options.crs.infinite) {\n var invertedY = this._globalTileRange.max.y - coords.y;\n if (this.options.tms) {\n data['y'] = invertedY;\n }\n data['-y'] = invertedY;\n }\n\n return L.Util.template(url, L.extend(data, this.options));\n },\n});\n\nDG.Control.Zoom.include(DG.Locale);\nDG.Control.Zoom.Dictionary = {};\n\nDG.Control.Zoom.include({\n onAdd: function(map) {\n var zoomName = 'dg-zoom',\n buttonTemplate = '<div class=\"dg-control-round__icon ' + zoomName + '__control ' + zoomName + '__button ' + zoomName + '__button_type_{type}\"></div>',\n container = DG.DomUtil.create('div', zoomName);\n\n this._map = map;\n\n this._zoomInButton = this._createButton(DG.Util.template(buttonTemplate, {type : 'in'}), this.t('zoom_in'), 'dg-control-round ' + zoomName + '__in', container, this._zoomIn, this);\n this._zoomOutButton = this._createButton(DG.Util.template(buttonTemplate, {type : 'out'}), this.t('zoom_out'), 'dg-control-round ' + zoomName + '__out', container, this._zoomOut, this);\n\n this._updateDisabled();\n map.on('zoomend zoomlevelschange', this._updateDisabled, this);\n\n return container;\n },\n\n _originalCreateButton: DG.Control.Zoom.prototype._createButton,\n\n // set active state control on mobile devices\n _createButton: function() {\n var args = Array.prototype.slice.call(arguments);\n var link = this._originalCreateButton.apply(this, args);\n\n var icon = link.children[0];\n var linkActiveClass = 'dg-control-round_state_active';\n var iconActiveClass = 'dg-control-round__icon_state_active';\n\n DG.DomEvent\n .on(link, 'touchstart', function() {\n DG.DomUtil.addClass(link, linkActiveClass);\n DG.DomUtil.addClass(icon, iconActiveClass);\n })\n .on(link, 'touchend touchcancel', function() {\n DG.DomUtil.removeClass(link, linkActiveClass);\n DG.DomUtil.removeClass(icon, iconActiveClass);\n });\n\n return link;\n },\n\n _renderTranslation: function() {\n if (!this._zoomInButton || !this._zoomOutButton) {\n return;\n }\n\n this._zoomInButton.title = this.t('zoom_in');\n this._zoomOutButton.title = this.t('zoom_out');\n }\n});\n\nDG.Control.Zoom.Dictionary.ru = {\n zoom_in : 'Приблизить',\n zoom_out : 'Отдалить'\n};\n\nDG.Control.Zoom.Dictionary.it = {\n zoom_in : 'Zoom avanti',\n zoom_out : 'Zoom indietro'\n};\n\nDG.Control.Zoom.Dictionary.cs = {\n zoom_in : 'PÅ™iblÞit',\n zoom_out : 'Oddálit'\n};\n\nDG.Control.Zoom.Dictionary.en = {\n zoom_in : 'Zoom in',\n zoom_out : 'Zoom out'\n};\n\nDG.Control.Zoom.Dictionary.es = {\n zoom_in : 'Acercar',\n zoom_out : 'Alejar'\n};\n\nDG.Control.Zoom.Dictionary.ar = {\n zoom_in : '',\n zoom_out : ''\n};\n\nvar dust = _dereq_('dustjs-linkedin');\n_dereq_('dustjs-helpers');\n\nDG.dust = function(name, data) {\n var result;\n\n // The callback is called synchronously, so this works\n dust.render(name, data, function(err, html) {\n result = html;\n });\n\n return result;\n};\n\nDG.Control.Attribution.include(DG.Locale);\nDG.Control.Attribution.Dictionary = {};\nDG.Control.Attribution.include({\n options: {\n position: 'bottomright'\n },\n\n _getLink: function(linkType) {\n /* eslint-disable camelcase */\n var dictionary = {\n ru: {\n copyright_logo: 'http://info.2gis.ru/?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_apilink: 'http://api.2gis.ru/?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_license: 'http://law.2gis.ru/api-rules/'\n },\n\n it: {\n copyright_logo: 'http://2gis.it/?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_apilink: 'http://2gis.it/?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_license: 'http://law.2gis.it/licensing-agreement/'\n },\n\n cz: {\n copyright_logo: 'http://praha.2gis.cz/?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_apilink: 'http://praha.2gis.cz/?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_license: 'http://law.2gis.cz/api-rules/'\n },\n\n cl: {\n copyright_logo: 'http://santiago.2gis.cl/?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_apilink: 'http://santiago.2gis.cl/?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_license: 'http://law.2gis.cl/api-rules/'\n },\n\n cy: {\n copyright_logo: 'http://info.2gis.com.cy/lemesos?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_apilink: 'http://info.2gis.com.cy/lemesos?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_license: 'http://law.2gis.com.cy/api-rules/'\n },\n\n ae: {\n copyright_logo: 'http://info.2gis.ae/dubai?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_apilink: 'http://info.2gis.ae/dubai?utm_source=copyright&utm_medium=map&utm_campaign=partners',\n copyright_license: 'http://law.2gis.ae/api-rules/'\n }\n };\n /* eslint-enable camelcase */\n\n var countryCode = (this._countryCode in dictionary) ? this._countryCode : 'ru';\n\n return dictionary[countryCode][linkType];\n },\n\n onAdd: function(map) {\n if (!map._copyright) {\n map._copyright = true;\n this._first = true;\n }\n\n map.attributionControl = this;\n this._container = DG.DomUtil.create('div', 'dg-attribution');\n DG.DomEvent.disableClickPropagation(this._container);\n\n for (var i in map._layers) {\n if (map._layers[i].getAttribution) {\n this.addAttribution(map._layers[i].getAttribution());\n }\n }\n\n this._update();\n\n return this._container;\n },\n\n _update: function(lang, osm, countryCode) {\n if (!this._map) { return; }\n\n if (typeof osm !== 'undefined') {\n this._osm = osm;\n }\n\n if (typeof countryCode !== 'undefined') {\n this._countryCode = countryCode;\n }\n\n var attribs = [];\n\n for (var i in this._attributions) {\n if (this._attributions[i]) {\n attribs.push(i);\n }\n }\n\n var prefixAndAttribs = [],\n copyright = '';\n\n if (this._first) {\n copyright = this._getAttributionHTML(lang);\n }\n\n if (this.options.prefix) {\n prefixAndAttribs.push(this.options.prefix);\n }\n if (attribs.length) {\n prefixAndAttribs.push(attribs.join(', '));\n }\n\n this._container.innerHTML = copyright + prefixAndAttribs.join(' | ');\n },\n _getData: function(lang) {\n lang = lang || this._map.getLang();\n\n return {\n 'osm': this._osm,\n 'work_on': this.t('work_on'),\n 'work_on_with_osm': this.t('work_on_with_osm'),\n 'lang': lang,\n 'copyright_apilink': this._getLink('copyright_apilink'),\n 'copyright_license': this._getLink('copyright_license'),\n 'copyright_logo': this._getLink('copyright_logo'),\n 'license_agreement': this.t('license_agreement'),\n 'dir': lang !== 'ar' ? 'ltr' : 'rtl',\n };\n },\n _getAttributionHTML: function(lang) {\n return DG.dust('DGAttribution/copyright', this._getData(lang));\n },\n _renderTranslation: function(e) {\n this._update(e.lang);\n }\n});\n\nDG.Map.addInitHook(function() {\n if (!this._copyright) {\n DG.control.attribution().addTo(this);\n }\n});\n\nDG.Control.Attribution.Dictionary.ru = {\n license_agreement: 'Лицензионное Ñоглашение',\n work_on: 'Работает на API 2ГИС',\n work_on_with_osm: 'API 2ГИС'\n};\n\nDG.Control.Attribution.Dictionary.it = {\n license_agreement : 'Accordo di licenza',\n work_on: '2GIS API',\n work_on_with_osm: '2GIS API'\n};\n\nDG.Control.Attribution.Dictionary.cs = {\n license_agreement: 'LicenÄnà smlouva',\n work_on: 'Pracuje na API 2GIS',\n work_on_with_osm: 'API 2GIS'\n};\n\nDG.Control.Attribution.Dictionary.en = {\n license_agreement: 'License agreement',\n work_on: 'Uses 2GIS API',\n work_on_with_osm: '2GIS API'\n};\n\nDG.Control.Attribution.Dictionary.es = {\n license_agreement : 'Acuerdo de licencia',\n work_on: '2GIS API',\n work_on_with_osm: '2GIS API'\n};\n\nDG.Control.Attribution.Dictionary.ar = {\n license_agreement: 'إتÙاقية ترخيص',\n work_on: 'يعمل بتطبيق 2GIS',\n work_on_with_osm: 'API 2GIS'\n};\n\nDG.Control.Location = DG.RoundControl.extend({\n\n statics: {\n Dictionary: {}\n },\n\n options: {\n iconClass: 'locate',\n position: DG.Browser.mobile ? 'bottomright' : 'topleft',\n drawCircle: true,\n follow: true, // follow with zoom and pan the user's location\n stopFollowingOnDrag: false, // if follow is true, stop following when map is dragged\n metric: true,\n onLocationError: function(/*err*/) {\n // this event is called in case of any location error\n // that is not a time out error.\n // console.log(err.message);\n },\n onLocationOutsideMapBounds: function(/*context*/) {\n // this event is repeatedly called when the location changes\n // console.log(context.t('outsideMapBoundsMsg'));\n },\n locateOptions: {}\n },\n\n initialize: function(options) {\n DG.Util.setOptions(this, options);\n\n if (!navigator.geolocation) {\n this._disable = true;\n return;\n }\n\n this._event = undefined;\n\n this._locateOptions = {\n watch: true, // if you overwrite this, visualization cannot be updated\n setView: true,\n maximumAge: Infinity,\n maxZoom: Infinity\n };\n DG.extend(this._locateOptions, this.options.locateOptions);\n\n this._resetVariables();\n\n this.on({\n 'click': this._handleLocate,\n 'add': this._initLocate\n });\n },\n\n _initLocate: function() {\n this._layer = new DG.LayerGroup();\n this._layer.addTo(this._map);\n\n // event hooks\n this._map.on({\n 'locationfound': this._onLocationFound,\n 'locationerror': this._onLocationError\n }, this);\n },\n\n _handleLocate: function() {\n if (this._active && (!this._event ||\n (this._map.getBounds().contains(this._event.latlng) ||\n this._isOutsideMapBounds()))) {\n this._stopLocate();\n } else {\n this._locateOnNextLocationFound = true;\n\n if (!this._active) {\n this._map.locate(this._locateOptions);\n }\n\n this._active = true;\n\n if (this.options.follow) {\n this._startFollowing();\n }\n\n this._clearError();\n\n if (this._event) {\n this._visualizeLocation();\n } else {\n this.setState('requesting');\n }\n }\n },\n\n _onLocationFound: function(e) {\n // no need to do anything if the location has not changed\n if (this._event &&\n (this._event.latlng.lat === e.latlng.lat &&\n this._event.latlng.lng === e.latlng.lng &&\n this._event.accuracy === e.accuracy)) {\n return;\n }\n\n if (!this._active) {\n return;\n }\n\n this._event = e;\n\n if (this.options.follow && this._following) {\n this._locateOnNextLocationFound = true;\n }\n\n this._visualizeLocation();\n },\n\n _startFollowing: function() {\n this._following = true;\n if (this.options.stopFollowingOnDrag) {\n this._map.on('dragstart', this._stopFollowing, this);\n }\n },\n\n _stopFollowing: function() {\n this._following = false;\n if (this.options.stopFollowingOnDrag) {\n this._map.off('dragstart', this._stopFollowing, this);\n }\n this._visualizeLocation();\n },\n\n _isOutsideMapBounds: function() {\n if (this._event === undefined) {\n return false;\n }\n return this._map.options.maxBounds &&\n !this._map.options.maxBounds.contains(this._event.latlng);\n },\n\n _visualizeLocation: function() {\n if (this._event.accuracy === undefined) {\n this._event.accuracy = 0;\n }\n\n var radius = this._event.accuracy;\n\n if (this._locateOnNextLocationFound) {\n if (this._isOutsideMapBounds()) {\n this.options.onLocationOutsideMapBounds(this);\n } else if (this._locateOptions.setView) {\n var project = this._map.projectDetector.getProject();\n var zoom = project ? project.maxZoom : DG.config.projectLeaveMaxZoom;\n zoom = Math.min(this._locateOptions.maxZoom, zoom);\n this._map.setView(this._event.latlng, zoom);\n }\n this._locateOnNextLocationFound = false;\n }\n\n // circle with the radius of the location's accuracy\n var style = {\n clickable: false,\n color: '#FFF',\n fillColor: '#FFF',\n fillOpacity: 0.4,\n weight: 0,\n opacity: 0.3\n };\n if (this.options.drawCircle) {\n if (!this._circle) {\n this._circle = DG.circle(this._event.latlng, radius, style)\n .addTo(this._layer);\n } else {\n this._circle.setLatLng(this._event.latlng).setRadius(radius);\n }\n }\n\n var markerClass = 'dg-location__pin';\n\n markerClass += this._following ? (' ' + markerClass + 'state_following') : '';\n // small inner marker\n var m = {\n icon: DG.divIcon({\n className: markerClass,\n iconSize: [20, 20]\n })\n };\n\n if (!this._marker) {\n this._marker = DG.marker(this._event.latlng, m)\n .bindLabel(this.t('you_are_here'))\n .addTo(this._layer);\n } else {\n this._marker.setLatLng(this._event.latlng);\n }\n\n DG.DomEvent.on(this._marker, 'click', function() {\n this._map.fireEvent('dgLocateClick');\n }, this);\n\n if (!this._container) {\n return;\n }\n\n this.setState('active');\n },\n\n _resetVariables: function() {\n this._active = false;\n this._following = false;\n },\n\n\n _stopLocate: function() {\n this._map.stopLocate();\n this._map.off('dragstart', this._stopFollowing);\n\n this.setState();\n this._resetVariables();\n\n this._layer.clearLayers();\n this._marker = undefined;\n this._circle = undefined;\n this._event = undefined;\n },\n\n _onLocationError: function(err) {\n // ignore time out error if the location is watched\n if (err.code === 3 && this._locateOptions.watch) {\n return;\n }\n\n this._stopLocate();\n this._error = DG.DomUtil.create('div', 'dg-label dg-label_name_location-error', this._container);\n this._errorText = DG.DomUtil.create('div', 'dg-label__content', this._error);\n this._errorText.innerHTML = this.t('cant_find');\n\n var self = this;\n setTimeout(function() {\n self._clearError();\n }, 3000);\n\n //show location error\n this.options.onLocationError(err);\n },\n\n _clearError: function() {\n if (this._error) {\n this._container.removeChild(this._error);\n this._error = undefined;\n this._errorText = undefined;\n }\n },\n\n _renderTranslation: function() {\n if (this._link) {\n this._link.title = this.t('button_title');\n }\n if (this._marker) {\n this._marker.bindLabel(this.t('you_are_here'));\n }\n }\n});\n\nDG.control.location = function(options) {\n return new DG.Control.Location(options);\n};\n\nDG.Map.addInitHook(function() {\n if (this.options.locationControl) {\n this.locationControl = DG.control.location(this.options.locationControl);\n this.addControl(this.locationControl);\n }\n});\n\nDG.Control.Location.Dictionary.ru = {\n cant_find : 'Мы не Ñмогли Ð’Ð°Ñ Ð½Ð°Ð¹Ñ‚Ð¸',\n you_are_here : 'Ð’Ñ‹ здеÑÑŒ',\n button_title : 'Ðайти Ð’Ð°Ñ Ð½Ð° карте'\n};\n\nDG.Control.Location.Dictionary.it = {\n cant_find : 'Non siamo riusciti a localizzarti',\n you_are_here : 'Voi siete qui',\n button_title : 'Trova la tua posizione sulla mappa'\n};\n\nDG.Control.Location.Dictionary.cs = {\n cant_find : 'NepodaÅ™ilo se nám urÄit VaÅ¡i polohu',\n you_are_here : 'Jste tady',\n button_title : 'UrÄit VaÅ¡i polohu na mapÄ›'\n};\n\nDG.Control.Location.Dictionary.en = {\n cant_find : 'We can\\'t find you',\n you_are_here : 'You are here',\n button_title : 'Show your location'\n};\n\nDG.Control.Location.Dictionary.es = {\n cant_find : 'No pudimos encontrarte',\n you_are_here : 'Tú estás aquÃ',\n button_title : 'Encontrarte en el mapa'\n};\n\nDG.Control.Location.Dictionary.ar = {\n cant_find : 'لم نستطع تØديد موقعك',\n you_are_here : 'أنت هنا',\n button_title : 'موقعي'\n};\n\n// Inspired by Sindre Sorhus screenfull\nDG.Screenfull = DG.Class.extend({\n _apiMap: [\n [\n 'requestFullscreen',\n 'exitFullscreen',\n 'fullscreenElement',\n 'fullscreenEnabled',\n 'fullscreenchange',\n 'fullscreenerror'\n ],\n [\n 'webkitRequestFullscreen',\n 'webkitExitFullscreen',\n 'webkitFullscreenElement',\n 'webkitFullscreenEnabled',\n 'webkitfullscreenchange',\n 'webkitfullscreenerror'\n\n ],\n [\n 'mozRequestFullScreen',\n 'mozCancelFullScreen',\n 'mozFullScreenElement',\n 'mozFullScreenEnabled',\n 'mozfullscreenchange',\n 'mozfullscreenerror'\n ],\n [\n 'msRequestFullscreen',\n 'msExitFullscreen',\n 'msFullscreenElement',\n 'msFullscreenEnabled',\n 'MSFullscreenChange',\n 'MSFullscreenError'\n ]\n ],\n\n initialize: function() {\n this.api = this._api();\n },\n\n request: function(elem) {\n var request = this.api.requestFullscreen;\n\n elem = elem || document.documentElement;\n elem[request](Element.ALLOW_KEYBOARD_INPUT);\n },\n\n exit: function() {\n document[this.api.exitFullscreen]();\n },\n\n isFullscreen: function() {\n return !!document[this.api.fullscreenElement];\n },\n\n isAvailable: function() {\n return Boolean(this.api);\n },\n\n _api: function() {\n var api = {},\n apiMap = this._apiMap;\n\n apiMap.forEach(function(val) {\n if (val && val[1] in document) {\n val.forEach(function(method, i) {\n api[apiMap[0][i]] = method;\n });\n }\n });\n\n return api.requestFullscreen ? api : false;\n }\n});\n\nDG.screenfull = new DG.Screenfull();\n\nDG.Control.Fullscreen = DG.RoundControl.extend({\n\n statics: {\n Dictionary: {}\n },\n\n options: {\n position: 'topright',\n iconClass: 'fullscreen'\n },\n\n initialize: function(options) {\n DG.Util.setOptions(this, options);\n this._isFullscreen = false;\n this.on('click', this._toggleFullscreen);\n },\n\n _toggleFullscreen: function() {\n if (!this._isFullscreen) {\n this._toggle(true, 'request', 'on', 'requestfullscreen');\n } else {\n this._toggle(false, 'exit', 'on', 'cancelfullscreen');\n }\n\n this._renderTranslation();\n this._map.invalidateSize();\n },\n\n _renderTranslation: function() {\n this._link.title = this.t(this._isFullscreen ? 'title_min' : 'title_max');\n },\n\n _toggle: function(isEnabled, method, list, event) {\n var container = this._map._container;\n\n this._isFullscreen = isEnabled;\n this.setState(isEnabled ? 'active' : '');\n\n DG.screenfull[method](container);\n DG.DomEvent[list](document, DG.screenfull.api.fullscreenchange, this._onFullScreenStateChange, this);\n this._map.fire(event);\n },\n\n _onFullScreenStateChange: function() {\n if (!DG.screenfull.isFullscreen()) {\n this._toggle(false, 'exit', 'on', 'cancelfullscreen');\n }\n }\n});\n\nDG.control.fullscreen = function(options) {\n return new DG.Control.Fullscreen(options);\n};\n\nDG.Map.mergeOptions({\n fullscreenControl: true\n});\n\nDG.Map.addInitHook(function() {\n if (this.options.fullscreenControl) {\n this.fullscreenControl = DG.control.fullscreen(this.options.fullscreenControl);\n\n if (DG.screenfull.isAvailable()) {\n this.addControl(this.fullscreenControl);\n }\n }\n});\n\nDG.Control.Fullscreen.Dictionary.ru = {\n title_max : 'Развернуть',\n title_min : 'ВоÑÑтановить'\n};\n\nDG.Control.Fullscreen.Dictionary.it = {\n title_max : 'Espandi',\n title_min : 'Ripristina'\n};\n\nDG.Control.Fullscreen.Dictionary.cs = {\n title_max : 'Rozbalit',\n title_min : 'Obnovit'\n};\n\nDG.Control.Fullscreen.Dictionary.en = {\n title_max : 'Expand',\n title_min : 'Restore'\n};\n\nDG.Control.Fullscreen.Dictionary.es = {\n title_max : 'Maximizar',\n title_min : 'Restaurar'\n};\n\nDG.Control.Fullscreen.Dictionary.ar = {\n title_max : '',\n title_min : ''\n};\n\nDG.Meta = {};\n\nDG.Meta.Layer = DG.Layer.extend({\n\n options: {\n tileSize: 256,\n\n minZoom: 0,\n maxZoom: 19,\n zoomOffset: 0,\n eventBubbling: 'transparent'\n // maxNativeZoom: <Number>,\n // detectRetina: <Number>,\n // zoomReverse: <Number>\n // attribution: <String>,\n // zIndex: <Number>,\n // bounds: <LatLngBounds>\n },\n\n initialize: function(source, options) { // (String, Object)\n DG.TileLayer.prototype.initialize.call(this, null, options);\n delete this._url;\n\n this._currentTileKey = '';\n this._currentTileData = [];\n this._lastEntity = undefined;\n this._dispatchMouseEvents = true;\n\n this._origin = DG.Meta.origin(source, {\n dataFilter: this.options.dataFilter\n });\n },\n\n getOrigin: function() { // () -> Object\n return this._origin;\n },\n\n onAdd: function(map) {\n this._resetView();\n\n map.metaLayers.push(this);\n\n map.on('rulerstart', this._disableDispatchMouseEvents, this);\n map.on('rulerend', this._enableDispatchMouseEvents, this);\n\n var self = this;\n\n if (DG.Browser.touchEnabled && this.options.isPoi) {\n map.eachLayer(function(layer) {\n if (layer instanceof L.TileLayer) {\n // On every tile will be load meta tile.\n layer.on('tileloadstart', self._onTileLoadStart, self);\n // Load metatiles for already loaded tiles.\n for (var tile in layer._tiles) {\n self._onTileLoadStart({\n coords: layer._tiles[tile].coords\n });\n }\n }\n });\n }\n },\n\n onRemove: function(map) {\n var self = this;\n\n if (DG.Browser.touchEnabled && this.options.isPoi) {\n map.eachLayer(function(layer) {\n if (layer instanceof L.TileLayer) {\n // On every tile will be load meta tile.\n layer.off('tileloadstart', self._onTileLoadStart);\n }\n });\n }\n\n this._tileZoom = null;\n\n var index = map.metaLayers.indexOf(this);\n if (index !== -1) {\n map.metaLayers.splice(index, 1);\n }\n\n map.off('rulerstart', this._disableDispatchMouseEvents, this);\n map.off('rulerend', this._enableDispatchMouseEvents, this);\n },\n\n getEvents: function() {\n return {\n viewprereset: this._invalidateAll,\n viewreset: this._resetView,\n zoom: this._resetView,\n moveend: this._onMoveEnd\n };\n },\n\n setUrl: function(url) {\n this._currentTileKey = '';\n this._currentTileData = [];\n this._lastEntity = undefined;\n this._dispatchMouseEvents = true;\n this._origin.setURL(url, true);\n },\n\n getHoveredObject: function(event) {\n var tileSize = this.getTileSize(),\n layerPoint = this._map.mouseEventToLayerPoint(event.originalEvent),\n tileOriginPoint = this._map.getPixelOrigin().add(layerPoint),\n tileCoord = tileOriginPoint.unscaleBy(tileSize).floor(),\n mouseTileOffset = DG.point(tileOriginPoint.x % tileSize.x, tileOriginPoint.y % tileSize.y),\n tileKey,\n zoom = this._map.getZoom(),\n self = this;\n\n if (zoom > (this.options.maxZoom + this.options.zoomOffset) ||\n zoom < (this.options.minZoom - this.options.zoomOffset) ||\n !this._isValidTile(tileCoord)) {\n return;\n }\n\n this._wrapCoords(tileCoord);\n\n tileCoord.z = this._getZoomForUrl();\n tileCoord.key = tileSize.x + 'x' + tileSize.y;\n tileKey = this._origin.getTileKey(tileCoord);\n\n if (tileKey === this._currentTileKey) {\n self._lastEntity = self._getHoveredObject(mouseTileOffset);\n } else {\n this._origin.getTileData(tileCoord, function(tileData) {\n self._currentTileKey = tileKey;\n self._currentTileData = tileData;\n self._lastEntity = self._getHoveredObject(mouseTileOffset);\n });\n }\n\n return this._lastEntity;\n },\n\n _removeAllTiles: DG.GridLayer.prototype._removeAllTiles,\n _getZoomForUrl: DG.TileLayer.prototype._getZoomForUrl,\n getTileSize: DG.TileLayer.prototype.getTileSize,\n _isValidTile: DG.GridLayer.prototype._isValidTile,\n _wrapCoords: DG.GridLayer.prototype._wrapCoords,\n _resetView: DG.GridLayer.prototype._resetView,\n _resetGrid: DG.GridLayer.prototype._resetGrid,\n _invalidateAll: DG.GridLayer.prototype._invalidateAll,\n _pxBoundsToTileRange: DG.GridLayer.prototype._pxBoundsToTileRange,\n\n // Fix for https://github.com/Leaflet/Leaflet/compare/0726f12bbf33fcb18fe8bb541d5e3212bb1f5ab2...c263f2d8b1bd962b60474376cc4816a688052513#diff-f1e6be67599c594731fff6191c710420L579\n _onMoveEnd: function() {\n if (!this._map || this._map._animatingZoom) { return; }\n\n this._resetView();\n },\n\n _onTileLoadStart: function(e) {\n var tileSize = this.getTileSize();\n e.coords.key = tileSize.x + 'x' + tileSize.y;\n this._origin.getTileData(e.coords);\n },\n\n _enableDispatchMouseEvents: function() {\n this._dispatchMouseEvents = true;\n },\n\n _disableDispatchMouseEvents: function() {\n this._dispatchMouseEvents = false;\n },\n\n mapEvents: {\n mousemove: function(event) {\n this._fireMetalayerEvent('mousemove', event);\n },\n\n mouseover: function(event) {\n this._fireMetalayerEvent('mouseover', event);\n },\n\n mouseout: function(event) {\n this._fireMetalayerEvent('mouseout', event);\n this._currentTileKey = '';\n },\n\n click: function(event) {\n var tileSize = this.getTileSize(),\n layerPoint = this._map.mouseEventToLayerPoint(event.originalEvent),\n tileOriginPoint = this._map.getPixelOrigin().add(layerPoint),\n tileCoord = tileOriginPoint.unscaleBy(tileSize).floor(),\n mouseTileOffset = DG.point(tileOriginPoint.x % tileSize.x, tileOriginPoint.y % tileSize.y);\n tileCoord.z = this._getZoomForUrl();\n tileCoord.key = tileSize.x + 'x' + tileSize.y;\n var tileKey = this._origin.getTileKey(tileCoord);\n var self = this;\n\n // In this function the tile meta data are processed by metalayer.\n var onTileData = function(currentTileData) {\n self._currentTileData = currentTileData;\n self._currentTileKey = tileKey;\n self._lastEntity = self._getHoveredObject(mouseTileOffset);\n self._mouseDown = false;\n\n if (self._lastEntity) {\n event.entity = self._lastEntity;\n self._fireMetalayerEvent('click', event);\n }\n }\n\n // For more information about the code below see:\n // https://github.com/2gis/mapsapi/pull/501\n this._origin.getTileData(tileCoord, function(tileData) {\n if (tileData) {\n onTileData(tileData);\n } else if (self._origin._requests[tileKey]) {\n DG.DomEvent.stop(event);\n self._origin._requests[tileKey].then(function() {\n delete event.originalEvent._stopped;\n onTileData(self._origin._tileStorage[tileKey]);\n if (!event.originalEvent._stopped) {\n var targets = event.eventTargets;\n for (var i = event.eventTargetsMapIndex; i < targets.length; i++) {\n targets[i].fire('click', event, true);\n if (\n event.originalEvent._stopped ||\n (targets[i].options.nonBubblingEvents &&\n L.Util.indexOf(targets[i].options.nonBubblingEvents, 'click') !== -1)\n ) {\n return;\n }\n }\n }\n });\n }\n });\n },\n\n dblclick: function(event) {\n this._fireMetalayerEvent('dblclick', event);\n },\n\n mousedown: function(event) {\n this._mouseDown = true;\n this._fireMetalayerEvent('mousedown', event);\n },\n\n contextmenu: function(event) {\n this._fireMetalayerEvent('contextmenu', event);\n }\n },\n\n _fireMetalayerEvent: function(type, mouseEvent) {\n if (!mouseEvent.entity || !this._dispatchMouseEvents) {\n return;\n }\n this.fire(type, {\n meta: mouseEvent.entity,\n latlng: this._map.mouseEventToLatLng(mouseEvent.originalEvent)\n });\n var isDragging = type === 'mousedown' || (this._mouseDown && type === 'mousemove');\n if (this.options.eventBubbling === 'layer' && !isDragging) {\n DG.DomEvent.stop(mouseEvent);\n }\n },\n\n _getHoveredObject: function(mouseTileOffset) {\n if (!this._currentTileData) {\n return;\n }\n\n for (var i = 0; i < this._currentTileData.length; i++) {\n if (DG.PolyUtil.inside(mouseTileOffset, this._currentTileData[i].geometry, this._pointReduceHelper)) {\n return this._currentTileData[i];\n }\n }\n },\n\n _pointReduceHelper: function(point) {\n return [point.x, point.y];\n },\n\n _setView: function(center, zoom, noPrune, noUpdate) {\n var tileZoom = Math.round(zoom),\n tileZoomChanged = this._tileZoom !== tileZoom;\n\n if (!noUpdate && tileZoomChanged) {\n this._tileZoom = tileZoom;\n this._resetGrid();\n }\n }\n});\n\nDG.Meta.layer = function(source, options) {\n return new DG.Meta.Layer(source, options);\n};\n\nDG.Meta.Origin = DG.Class.extend({\n\n options: {\n subdomains: '0123',\n dataFilter: null\n },\n\n _url: false,\n\n initialize: function(url, options) { // (String, Object)\n this._url = url;\n this._requests = {};\n\n this._tileStorage = {};\n\n options = DG.setOptions(this, options);\n\n if (typeof options.subdomains === 'string') {\n options.subdomains = options.subdomains.split('');\n }\n },\n\n getTileData: function(coord, clb) { // (Object) -> Object\n var tileKey = this.getTileKey(coord),\n self = this,\n callback = typeof clb === 'function' ? clb : function() {};\n\n // if the tile meta data request in progress, this function returns false, it is therefore synchronous.\n if (typeof this._tileStorage[tileKey] === 'undefined' && typeof this._requests[tileKey] === 'undefined') {\n this._tileStorage[tileKey] = false;\n var currentRequest = this._requests[tileKey] = this._requestData(coord).then(function(data) {\n if (self._requests[tileKey] !== currentRequest) {\n callback(false);\n return;\n }\n self.setTileData(tileKey, self.options.dataFilter ? self.options.dataFilter(data, coord) : data);\n delete self._requests[tileKey];\n callback(self._tileStorage[tileKey]);\n });\n } else {\n callback(this._tileStorage[tileKey]);\n }\n },\n\n setTileData: function(key, data) { // (Object/String, Object) -> Object\n if (typeof key !== 'string') {\n key = this.getTileKey(key);\n }\n\n data.forEach(function(entity) {\n if (entity.geometry.constructor !== Object) {\n entity.geometry = DG.Wkt.toGeoJSON(entity.geometry);\n }\n if (!this._tileStorage[key]) {\n this._tileStorage[key] = [];\n }\n this._tileStorage[key].push(entity);\n }, this);\n\n return this;\n },\n\n flush: function() { // () -> Object\n this._tileStorage = {};\n Object.keys(this._requests).forEach(function(tileKey) {\n if (this[tileKey].abort) {\n this[tileKey].abort();\n }\n }, this._requests);\n this._requests = {};\n\n return this;\n },\n\n setURL: function(url, flush) { // (String, Boolean) -> Object\n this._url = url;\n if (flush) {\n this.flush();\n }\n\n return this;\n },\n\n getTileKey: function(coord) { // (Object)-> String\n return [coord.x, coord.y, coord.z, coord.key].join(':');\n },\n\n _requestData: function(key) { // (String)\n if (this._url) {\n return this._performRequest(key);\n } else {\n return Promise.resolve([]);\n }\n },\n\n _performRequest: function(coords) { // (Object) -> Promise\n return DG.ajax(this._prepareURL(coords), {\n type: 'get',\n dataType: 'json'\n });\n },\n\n _prepareURL: function(coords) { // (Object) -> String\n return DG.Util.template(this._url, {\n x: coords.x,\n y: coords.y,\n z: coords.z,\n s: this._getSubdomain(coords)\n });\n },\n\n _getSubdomain: DG.TileLayer.prototype._getSubdomain\n\n});\n\nDG.Meta.origin = function(source, options) {\n return new DG.Meta.Origin(source, options);\n};\n\nDG.Map.mergeOptions({\n poi: true\n});\n\nDG.Poi = DG.Handler.extend({\n\n options: {\n disableLabel: false\n },\n\n initialize: function(map, options) { // (Object)\n this._map = map;\n DG.Util.setOptions(this, options);\n\n var url = DG.config.protocol + (DG.Browser.retina ? DG.config.retinaPoiMetaServer : DG.config.poiMetaServer);\n\n this._metaLayer = DG.Meta.layer(url, {\n minZoom: DG.config.poiLayerMinZoom,\n maxNativeZoom: 19,\n detectRetina: DG.config.detectRetina,\n eventBubbling: 'layer',\n dataFilter: DG.bind(this._processData, this),\n isPoi: true\n });\n\n this._currentTilesLang = ''; // 'ar' | ''\n },\n\n addHooks: function() {\n this._map.addLayer(this._metaLayer);\n if (!this.options.disableLabel) {\n this._labelHelper = DG.label();\n }\n this._metaLayer.on(this._layerEventsListeners, this);\n this._map.on('langchange', this._updateUrl, this);\n this._map.on('projectchange', this._updateUrl, this);\n this._map.on('projectleave', this._updateUrl, this);\n },\n\n removeHooks: function() {\n this._map.removeLayer(this._metaLayer);\n if (!this.options.disableLabel) {\n this._map.removeLayer(this._labelHelper);\n this._labelHelper = null;\n }\n this._metaLayer.off(this._layerEventsListeners, this);\n this._map.off('langchange', this._updateUrl, this);\n this._map.off('projectchange', this._updateUrl, this);\n this._map.off('projectleave', this._updateUrl, this);\n },\n\n getMetaLayer: function() {\n return this._metaLayer;\n },\n\n _updateUrl: function() {\n var url = DG.config.protocol + (DG.Browser.retina ? DG.config.retinaPoiMetaServer : DG.config.poiMetaServer);\n var arabicUrl = DG.config.protocol +\n (DG.Browser.retina ? DG.config.arabicRetinaPoiMetaServer : DG.config.arabicPoiMetaServer);\n var lang = this._map.getLang();\n var project = this._map.projectDetector && this._map.projectDetector.getProject();\n\n // Change POI for Arabic language in Dubai project\n if (this._currentTilesLang === '' && lang === 'ar' && project && project.country_code === 'ae') {\n this._currentTilesLang = 'ar';\n this._metaLayer.setUrl(arabicUrl);\n\n } else if (this._currentTilesLang === 'ar' && (lang !== 'ar' || (!project || project.country_code !== 'ae'))) {\n this._currentTilesLang = '';\n this._metaLayer.setUrl(url);\n }\n },\n\n _processData: function(data, coord) {\n var tileOriginPoint = coord.scaleBy(this._metaLayer.getTileSize());\n var polygonLngLatToPoints = DG.bind(this._polygonLngLatToPoints, this, tileOriginPoint, coord.z);\n\n if (data.responseText === '') {\n return [];\n }\n\n return data.result.poi\n .map(function(item) {\n var hovers = item.hovers !== undefined\n ? item.hovers\n : [item.hover];\n\n return {\n id: item.id,\n hint: item.links[0].name,\n linked: item.links[0],\n geometry: hovers.map(DG.Wkt.toGeoJSON),\n };\n })\n .map(function(item) {\n var coordinates = item.geometry.reduce(function(result, item) {\n if (item.type === 'Polygon') {\n result.push(polygonLngLatToPoints(item.coordinates));\n } else if (item.type === 'MultiPolygon') {\n result = result.concat(item.coordinates.map(polygonLngLatToPoints));\n }\n\n return result;\n }, []);\n\n item.geometry = {\n type: 'MultiPolygon',\n coordinates: coordinates,\n };\n\n return item;\n });\n },\n\n _polygonLngLatToPoints: function(originPoint, zoom, polygon) {\n var map = this._map;\n\n return polygon.map(function(contour) {\n return contour.map(function(lngLat) {\n return map\n .project([lngLat[1], lngLat[0]], zoom).round()\n .subtract(originPoint);\n });\n });\n },\n\n _layerEventsListeners : {\n mouseover: function(e) { // (Object)\n this._setCursor('pointer');\n if (e.meta.hint && e.meta.hint.length && !this.options.disableLabel) {\n this._labelHelper\n .setPosition(e.latlng)\n .setContent(e.meta.hint)\n .setZIndexOffset(300);\n this._map.addLayer(this._labelHelper);\n }\n this._map.fire('poihover', {\n latlng: e.latlng,\n meta: e.meta\n });\n },\n\n mouseout: function(e) {\n this._setCursor('');\n if (!this.options.disableLabel) {\n this._map.removeLayer(this._labelHelper);\n }\n this._map.fire('poileave', {\n latlng: e.latlng,\n meta: e.meta\n });\n },\n\n mousemove: function(e) { // (Object)\n if (!this.options.disableLabel) {\n this._labelHelper.setPosition(e.latlng);\n }\n }\n },\n\n _setCursor: function(cursor) { // (String)\n this._map.getContainer().style.cursor = cursor;\n }\n\n});\n\nDG.Map.addInitHook('addHandler', 'poi', DG.Poi);\n\nDG.Map.mergeOptions({\n geoclicker: false\n});\n\nDG.Geoclicker = DG.Handler.extend({\n clickCount: 0,\n pendingClick: 0,\n timeout: 250, // should be equal to 'delay' value in DoubleTap event\n\n initialize: function(map, options) { // (Object)\n this._map = map;\n this._controller = new DG.Geoclicker.Controller(map, options);\n },\n\n addHooks: function() {\n this._toggleEvents(true);\n\n // Monitor geoclicker usage statistics\n // TODO: remove after successful research\n if (typeof ga !== undefined) {\n // eslint-disable-next-line no-undef\n ga(DG.config.gaName + '.send', 'event', 'Geoclicker', 'Enable');\n }\n\n this._map\n .on('rulerstart', this._pause, this)\n .on('rulerend', this._unpause, this);\n },\n\n removeHooks: function() {\n this._toggleEvents();\n\n this._map\n .off('rulerstart', this._pause, this)\n .off('rulerend', this._unpause, this);\n },\n\n _checkOpenPopup: function() {\n if (DG.Browser.mobile && this._map._popup &&\n (this._map._popup.options.closeOnClick ||\n this._map.options.closePopupOnClick)) {\n this.popupWasOpen = true;\n }\n },\n\n _pause: function() {\n this._toggleEvents();\n },\n\n _unpause: function() {\n // Reenable event handling only in case geoclicker is enabled\n if (this.enabled()) {\n this._toggleEvents(true);\n }\n },\n\n _toggleEvents: function(flag) {\n this._map[flag ? 'on' : 'off'](this._mapEventsListeners, this);\n if (this._map.poi) {\n this._map.poi.getMetaLayer()[flag ? 'on' : 'off']('click', this._onMetaClick, this);\n }\n },\n\n getController: function() {\n return this._controller;\n },\n\n _onMetaClick: function(e) {\n this.clickCount = 0;\n clearTimeout(this.pendingClick);\n this.popupWasOpen = false;\n\n this._mapEventsListeners.click.call(this, e);\n },\n\n _mapEventsListeners: {\n langchange: function() {\n this._controller.reinvokeHandler();\n },\n\n popupclose: function(e) { // (Object)\n this._controller.handlePopupClose(e.popup);\n },\n\n click: function(e) { // (Object)\n if (this.clickCount === 0) {\n this.clickCount = 1;\n this._singleClick(e);\n } else {\n this.clickCount = 0;\n clearTimeout(this.pendingClick);\n this.popupWasOpen = false;\n }\n },\n\n dblclick: function() {\n if (DG.Browser.ielt9) {\n this.clickCount = 0;\n this.popupWasOpen = false;\n clearTimeout(this.pendingClick);\n }\n }\n },\n\n _singleClick: function(e) { // (Object)\n var self = this;\n\n clearTimeout(this.pendingClick);\n\n this.pendingClick = setTimeout(function() {\n if (e.meta) {\n self._checkOpenPopup();\n self._map.closePopup();\n }\n\n // DGPopup's '_close' method is the only place where .popupWasOpen is modified\n // It signals geoclicker that popup was open before user do a 'click' on map\n // Multistage behavior is needed as this processing occurs after popup was already closed\n if (!self.popupWasOpen) {\n var zoom = self._map.getZoom();\n self._controller.handleClick(e.latlng, zoom, e.meta);\n }\n\n self.clickCount = 0;\n self.popupWasOpen = false;\n }, this.timeout);\n }\n});\n\nDG.Map.addInitHook('addHandler', 'geoclicker', DG.Geoclicker);\n\nDG.Geoclicker.clampHelper = function(el, lineClamp) {\n var measure, text, lineWidth,\n lineStart, lineCount, wordStart,\n line, lineText, wasNewLine,\n ce = document.createElement.bind(document),\n ctn = document.createTextNode.bind(document);\n\n // measurement element is made a child of the clamped element to get it's style\n measure = ce('span');\n\n (function(s) {\n s.position = 'absolute'; // prevent page reflow\n s.whiteSpace = 'pre'; // cross-browser width results\n s.visibility = 'hidden'; // prevent drawing\n s.margin = '0 18px 8px 0';\n })(measure.style);\n\n // make sure the element belongs to the document\n if (!el.ownerDocument || el.ownerDocument !== document) {\n return;\n }\n // reset to safe starting values\n lineStart = wordStart = 0;\n lineCount = 1;\n wasNewLine = false;\n lineWidth = el.clientWidth;\n // get all the text, remove any line changes\n text = (el.textContent || el.innerText).replace(/\\n/g, ' ');\n // remove all content\n while (el.firstChild !== null) {\n el.removeChild(el.firstChild);\n }\n // add measurement element within so it inherits styles\n el.appendChild(measure);\n // http://ejohn.org/blog/search-and-dont-replace/\n text.replace(/ |-/g, function(m, pos) {\n // ignore any further processing if we have total lines\n if (lineCount === lineClamp) {\n return;\n }\n // create a text node and place it in the measurement element\n measure.appendChild(ctn(text.substr(lineStart, pos - lineStart)));\n // have we exceeded allowed line width?\n if (lineWidth < measure.clientWidth) {\n if (wasNewLine) {\n // we have a long word so it gets a line of it's own\n lineText = text.substr(lineStart, pos + 1 - lineStart);\n // next line start position\n lineStart = pos + 1;\n } else {\n // grab the text until this word\n lineText = text.substr(lineStart, wordStart - lineStart);\n // next line start position\n lineStart = wordStart;\n }\n // create a line element\n line = ce('span');\n // add text to the line element\n line.appendChild(ctn(lineText));\n // add the line element to the container\n el.appendChild(line);\n line.className = 'dg-map-geoclicker__clamped-line';\n // yes, we created a new line\n wasNewLine = true;\n lineCount++;\n } else {\n // did not create a new line\n wasNewLine = false;\n }\n // remember last word start position\n wordStart = pos + 1;\n // clear measurement element\n measure.removeChild(measure.firstChild);\n });\n // remove the measurement element from the container\n el.removeChild(measure);\n // create the last line element\n line = ce('span');\n // give styles required for text-overflow to kick in\n line.className = 'dg-map-geoclicker__clamped-line dg-map-geoclicker__clamped-line_last';\n // add all remaining text to the line element\n line.appendChild(ctn(text.substr(lineStart)));\n // add the line element to the container\n el.appendChild(line);\n};\n\nDG.Geoclicker.Provider = {};\n\nDG.Geoclicker.Provider.CatalogApi = DG.Class.extend({\n initialize: function(map) { // (Object)\n this._map = map;\n\n var apiUrl = DG.config.protocol +\n DG.config.webApiServer + '/' +\n DG.config.webApiVersion + '/';\n\n this._urlGeoSearch = apiUrl + 'geo/search';\n this._urlGeoGet = apiUrl + 'geo/get';\n this._urlDetails = apiUrl + 'catalog/branch/get';\n this._urlFirmsInHouse = apiUrl + 'catalog/branch/list';\n\n this._key = DG.config.geoclickerCatalogApiKey;\n this._geoFields = DG.config.geoAdditionalFields;\n this._firmInfoFields = DG.config.firmInfoFields;\n },\n\n getLocations: function(options) { // (Object)\n // Callback will receive array of found results or void if errors occurred or nothing was found.\n var zoom = options.zoom,\n latlng = options.latlng,\n beforeRequest = options.beforeRequest || function() {},\n types = this.getTypesByZoom(zoom),\n q = latlng.lng + ',' + latlng.lat;\n\n if (!types) {\n return Promise.reject('no type');\n }\n\n beforeRequest();\n\n return this.geoSearch(q, types, zoom).then(DG.bind(function(result) {\n return this._filterResponse(result, types);\n }, this));\n },\n\n firmsInHouse: function(houseId, parameters) { // (String, Function, Number)\n parameters = parameters || {};\n\n /* eslint-disable camelcase */\n var params = {\n building_id: houseId,\n page: parameters.page || 1\n };\n /* eslint-enable camelcase */\n\n return this._performRequest(params, this._urlFirmsInHouse);\n },\n\n getFirmInfo: function(firmId) {\n return this._performRequest({\n type: 'filial',\n id: firmId,\n fields: this._firmInfoFields\n }, this._urlDetails);\n },\n\n geoSearch: function(q, types, zoomlevel) { // (String, String, Number)\n /* eslint-disable camelcase */\n var params = {\n point: q,\n type: types,\n zoom_level: zoomlevel,\n fields: this._geoFields\n };\n /* eslint-enable camelcase */\n\n return this._performRequest(params, this._urlGeoSearch);\n },\n\n geoGet: function(id) {\n var params = {\n id: id,\n fields: this._geoFields\n };\n\n return this._performRequest(params, this._urlGeoGet);\n },\n\n cancelLastRequest: function() {\n if (this._lastRequest) {\n this._lastRequest.abort();\n }\n },\n\n getTypesByZoom: function(zoom) { // (Number) -> String|Null\n var types = {\n 'adm_div.settlement': 8,\n 'adm_div.city': 8,\n 'adm_div.division': 11,\n 'adm_div.district': 12,\n 'street': 14,\n 'building': 14,\n 'adm_div.place': 15,\n 'poi': 15,\n 'attraction': 17\n },\n selectedTypes = [];\n\n Object.keys(types).forEach(function(type) {\n if (zoom >= types[type]) {\n selectedTypes.push(type);\n }\n });\n\n if (selectedTypes.length) {\n return selectedTypes.join(',');\n } else {\n return null;\n }\n },\n\n _performRequest: function(params, url) { // (Object, String, Function, Function)\n var data = DG.extend({key: this._key}, params);\n var type = 'get';\n\n this.cancelLastRequest();\n\n if (!DG.ajax.corsSupport) {\n type = data.format = 'jsonp';\n }\n\n this._lastRequest = DG.ajax(url, {\n type: type,\n data: data,\n timeout: this._timeoutMs,\n withCredentials: true\n });\n\n return this._lastRequest;\n },\n\n _filterResponse: function(response, allowedTypes) { // (Object, Array) -> Boolean|Object\n var result = {}, i, item, found, data, type;\n\n if (this._isNotFound(response)) {\n return false;\n }\n\n data = response.result.items;\n\n for (i = data.length - 1; i >= 0; i--) {\n item = data[i];\n\n type = item.type;\n if (item.subtype) {\n type += '.' + item.subtype;\n }\n\n if (allowedTypes && allowedTypes.indexOf(type) === -1) {\n continue;\n }\n\n result[type] = item;\n found = true;\n }\n\n if (found) {\n return result;\n } else {\n return false;\n }\n },\n\n _isNotFound: function(response) { // (Object) -> Boolean\n return !response ||\n !!response.meta && !!response.meta.error ||\n !response.result ||\n !response.result.items ||\n !response.result.items.length;\n }\n\n});\n\nDG.Geoclicker.Handler = {};\n\nDG.Geoclicker.Handler.Default = DG.Class.extend({\n\n includes: DG.Locale,\n\n statics: {\n Dictionary: {}\n },\n\n _eventHandlers: {},\n\n initialize: function(controller, view, map) { // (Object, Object, Object)\n this._controller = controller;\n this._view = view;\n this._map = map;\n },\n\n handle: function() { // () -> Promise\n return Promise.resolve({\n tmpl: 'popupHeader',\n data: {'title': this.t('we_have_not')}\n });\n },\n\n addClickEvent: function() {\n this._view._popup.on('click', this._runEventHandlers, this);\n this._map.once('popupclose', this._removeClickEvent, this);\n },\n\n _removeClickEvent: function() {\n this._view._popup.off('click', this._runEventHandlers, this);\n },\n\n _addEventHandler: function(el, handler) { // (String, Function)\n this._eventHandlers[el] = handler;\n },\n\n _runEventHandlers: function(e) {\n var target = e.originalEvent.target;\n\n for (var eventClass in this._eventHandlers) {\n if (this._eventHandlers.hasOwnProperty(eventClass) && target.className.indexOf(eventClass) > -1) {\n DG.DomEvent.preventDefault(e.originalEvent);\n this._eventHandlers[eventClass].call(this, target);\n return;\n }\n }\n },\n\n _clearEventHandlers: function() {\n this._eventHandlers = {};\n },\n\n _getDirectionsUrl: function(name) {\n var project = this._map.projectDetector.getProject();\n if (!project) {\n return '';\n }\n\n return DG.Util.template(DG.config.ppnotLink, {\n 'domain': project.domain,\n 'projectCode': project.code,\n 'center': this._map.getCenter().lng + ',' + this._map.getCenter().lat,\n 'zoom': this._map.getZoom(),\n 'name': encodeURIComponent(name),\n 'rsType': project.transport ? 'bus' : 'car',\n 'point': this._popup._latlng.lng + ',' + this._popup._latlng.lat\n });\n },\n\n _getDrilldown: function(object) {\n var admDivs = [],\n result;\n\n if (object.adm_div) {\n admDivs = object.adm_div\n .reduce(function(admDivs, admDiv) {\n if (admDiv.name) {\n admDivs.push(admDiv.name);\n }\n\n return admDivs;\n }, [])\n .reverse();\n }\n\n if (admDivs.length && object.address && object.address.postcode) {\n admDivs.push(object.address.postcode);\n }\n\n result = admDivs.join(', ');\n\n return result;\n }\n\n});\n\n\nDG.Geoclicker.Handler.HandlerExample = DG.Geoclicker.Handler.Default.extend({\n\n handle: function(results, type) { // (Object, String) -> Promise\n return Promise.resolve({\n tmpl: type + ':<br/>' + results[type].id\n });\n }\n});\n\nDG.Geoclicker.Handler.ApiError = DG.Geoclicker.Handler.Default.extend({\n handle: function() { // () -> Promise\n var header = this._view.render({\n tmpl: 'popupHeader',\n data: {\n title: this.t('apiErrorTitle')\n }\n });\n\n return Promise.resolve({\n header: header,\n tmpl: this.t('apiErrorBody')\n });\n }\n});\n\nDG.Geoclicker.Handler.CityArea = DG.Geoclicker.Handler.Default.extend({\n\n _polylineStyleDefault : {\n fillColor: '#ff9387',\n color: '#ff9387',\n noClip: true,\n opacity: 1\n },\n\n _polylineStyles : {\n 11 : {\n fillOpacity: 0.18,\n weight: 1\n },\n 12 : {\n fillOpacity: 0.12,\n weight: 1\n },\n 13 : {\n fillOpacity: 0.08,\n weight: 2\n },\n 18 : {\n fillOpacity: 0,\n weight: 3\n }\n },\n\n handle: function(results, type) { // (Object, String) -> Promise\n if (!results[type]) {\n return false;\n }\n\n if (!this._stylesInited) {\n this._initStyles();\n }\n\n // remove previous geometry see https://github.com/2gis/mapsapi/issues/213\n if (this._geometry) {\n this._map.removeLayer(this._geometry);\n }\n\n this._popup = this._view.getPopup();\n\n this._geometryZoomStyle = this._getPolyStyleNum();\n this._geometry = DG.Wkt.geoJsonLayer(results[type].geometry.selection, {\n style: this._polylineStyles[this._geometryZoomStyle],\n interactive: false\n }).addTo(this._map);\n\n this._map\n .on('zoomend', this._updateGeometry, this)\n .once('popupclose', this._clearPopup, this);\n\n return Promise.resolve(this._fillCityAreaObject(results, type));\n },\n\n _fillCityAreaObject: function(results, type) {\n var data = {\n name: this.t('noname'),\n drilldown: '',\n purpose: this.t(type),\n type: type.split('.').join('_')\n };\n\n data.drilldown = this._getDrilldown(results[type]);\n\n if (results[type].name) {\n data.name = results[type].name;\n }\n\n return {\n tmpl: 'cityarea',\n data: data,\n header: this._view.render({\n tmpl: 'popupHeader',\n data: {'title': data.name}\n })\n };\n },\n\n _initStyles : function() {\n this._stylesInited = true;\n\n Object.keys(this._polylineStyles).forEach(function(zoom) {\n DG.extend(this._polylineStyles[zoom], this._polylineStyleDefault);\n }, this);\n },\n\n _getPolyStyleNum: function() {\n var mapZoom = this._map.getZoom();\n\n return Object.keys(this._polylineStyles).filter(function(zoom) {\n return mapZoom <= zoom;\n })[0] || false;\n },\n\n _updateGeometry: function() {\n var newStyle = this._getPolyStyleNum();\n\n if (newStyle && newStyle !== this._geometryZoomStyle) {\n this._geometryZoomStyle = newStyle;\n this._geometry.setStyle(this._polylineStyles[newStyle]);\n }\n },\n\n _clearPopup: function() {\n this._map\n .removeLayer(this._geometry)\n .off('zoomend', this._updateGeometry, this);\n }\n\n});\n\n/*global FirmCard */\nDG.Geoclicker.Handler.House = DG.Geoclicker.Handler.Default.extend({\n\n _firmsOnPage: 20,\n _scrollThrottleInterval: 400,\n _scrollHeightReserve: 60,\n\n options: {\n 'showBooklet': true,\n 'showPhotos': true,\n 'showRouteSearch': true\n },\n\n handle: function(results) { // (Object) -> Promise\n if (!results.building) {\n return false;\n }\n\n // initialization setup\n this.firmCard = null;\n this._page = 1;\n this._houseObject = null;\n this._firmList = null;\n this._firmListObject = null;\n this._firmCardObject = null;\n this._onScroll = false;\n this._isFirmlistOpen = false;\n\n this._id = results.building.id;\n this._totalPages = 1;\n this._api = this._controller.getCatalogApi();\n this._popup = this._view.getPopup();\n this._initedPopupClose = false;\n this._directionsUrl = this._getDirectionsUrl(results.building.name);\n this._firmListLoader = this._view.initLoader(true);\n\n this._houseObject = this._fillHouseObject(results.building);\n\n return Promise.resolve(this._houseObject);\n },\n\n _isRouteSearchAllowed: function() { //() -> Boolean\n var project = this._controller.getMap().projectDetector.getProject();\n return project.transport || project.roads;\n },\n\n _firmCardSetup: function() { //() -> Object\n var project = this._controller.getMap().projectDetector.getProject();\n return {\n render: this._view.renderTemplate,\n lang: this._map.getLang(),\n domain: project ? project.domain : 'ru',\n ajax: DG.bind(this._api.getFirmInfo, this._api),\n timezoneOffset: project ? project.timeOffset : 0,\n map: this._map,\n popup: this._popup,\n isMobile: DG.Browser.mobile,\n showEntrance: DG.Entrance,\n gotoUrl: this._directionsUrl,\n onFirmReady: DG.bind(this._onFirmReady, this),\n onToggle: DG.bind(this._popup.resize, this._popup),\n showBooklet: this.options.showBooklet,\n showPhotos: this.options.showPhotos,\n showRouteSearch: this.options.showRouteSearch && this._isRouteSearchAllowed(),\n t: DG.bind(this.t, this)\n };\n },\n\n // init single firm card in case of poi\n _fillFirmCardObject: function(firmId) {\n var options = this._firmCardSetup();\n\n this.firmCard = new FirmCard(firmId, options);\n this._initPopupClose();\n return this.firmCard.getContainer();\n },\n\n _firmListSetup: function() {\n var options = this._firmCardSetup();\n\n DG.extend(options, {\n backBtn: DG.bind(this._showHousePopup, this),\n onFirmClick: DG.bind(this._onFirmListClick, this),\n onShowLess: DG.bind(this._showHousePopup, this),\n pasteLoader: DG.bind(this._pasteLoader, this)\n });\n\n return {\n firmCard: options,\n firmlistItemTmpl: 'firmlistItem',\n onListReady: DG.bind(this._renderFirmList, this)\n };\n },\n\n _initShortFirmList: function(firms) { //(Object) -> DOMElement\n var options = this._firmListSetup();\n\n this._shortFirmList = new FirmCard.List(firms, options);\n\n return this._shortFirmList.renderList();\n },\n\n _initFirmList: function(res) { //(Object) -> Promise\n if (!res) { return false; }\n\n var results = res.result.items,\n options = this._firmListSetup();\n\n options.firmCard.backBtn = DG.bind(this._showListPopup, this);\n\n this._shortFirmList._toggleEventHandlers(true);\n\n this._firmList = new FirmCard.List(results, options);\n\n this._firmListObject = this._fillFirmListObject(this._firmList.renderList());\n this._clearAndRenderPopup(this._firmListObject);\n },\n\n _fillFirmListObject: function(firmList) { //(DOMElement) -> Object\n var self = this;\n\n return {\n tmpl: firmList,\n header: this._header,\n footer: this._view.render({\n tmpl: 'popupFooterBtns',\n data: {\n btns: [\n {\n name: 'back',\n label: this.t('back_button'),\n icon: true\n }\n ]\n }\n }),\n afterRender: function() {\n self._initPopupClose();\n\n if (self._totalPages > 1 && self._firmListLoader) {\n // \"this\" here is self._firmListObject\n this.tmpl.parentNode.appendChild(self._firmListLoader);\n }\n }\n };\n },\n\n _onFirmReady: function(firmContentObject) {\n var self = this;\n firmContentObject.afterRender = function() {\n var headerTitle = self._popup._popupStructure.header.firstChild;\n if (!DG.Browser.ielt9) {\n if (headerTitle.offsetHeight > 72) { //TODO: magic number\n DG.DomUtil.addClass(headerTitle, 'dg-popup__header-teaser');\n if (!DG.Browser.webkit) {\n DG.Geoclicker.clampHelper(headerTitle, 3);\n }\n }\n }\n };\n this._clearAndRenderPopup(firmContentObject);\n },\n\n _showHousePopup: function() {\n this._popup.off('scroll', this._onScroll);\n this._clearAndRenderPopup(this._houseObject);\n this._shortFirmList._toggleEventHandlers();\n },\n\n _onFirmListClick: function() {\n this._popup.off('scroll', this._onScroll);\n },\n\n _pasteLoader: function() {\n var loaderWrapper = DG.DomUtil.create('div', 'dg-map-geoclicker__preloader-wrapper'),\n loader = this._view.initLoader();\n\n loaderWrapper.insertBefore(loader, loaderWrapper.firstChild);\n loaderWrapper.style.height = this._popup._contentNode.offsetHeight - 1 + 'px'; // MAGIC\n loaderWrapper.style.width = this._popup._contentNode.offsetWidth + 'px';\n this._clearAndRenderPopup({tmpl: loaderWrapper});\n },\n\n _initPopupClose: function() {\n if (this._initedPopupClose) { return; }\n\n this._controller.getMap().once('popupclose', DG.bind(this._onPopupClose, this));\n this._initedPopupClose = true;\n },\n\n _showListPopup: function() {\n var firmList = this._firmListObject;\n\n this._pasteLoader();\n\n if (!firmList) {\n firmList = this._api.firmsInHouse(this._id).then(DG.bind(this._initFirmList, this));\n } else {\n this._clearAndRenderPopup(firmList);\n this._firmList._toggleEventHandlers();\n }\n\n if (!this._onScroll) {\n this._onScroll = DG.Util.throttle(this._handlePopupScroll, this._scrollThrottleInterval, this);\n }\n\n this._popup.on('scroll', this._onScroll);\n },\n\n _renderFirmList: function() {\n if (!this._isFirmlistOpen) {\n this._popup.resize();\n this._isFirmlistOpen = true;\n }\n },\n\n _onPopupClose: function() {\n this._initedPopupClose = false;\n if (this._firmList) {\n this._firmList.clearList();\n this._firmList = null;\n this._popup.off('scroll', this._onScroll);\n }\n this._firmId = null;\n if (this.firmCard) {\n this.firmCard._toggleEventHandlers(true);\n this.firmCard = null;\n }\n this._firmListLoader = null;\n this._page = 1;\n this._clearEventHandlers();\n },\n\n _initShowMore: function() {\n var link = this._popup.findElement('.dg-popup__button_name_all');\n\n if (link) {\n this._addEventHandler('dg-popup__button_name_all', DG.bind(this._showListPopup, this));\n }\n },\n\n _clearAndRenderPopup: function(popupObject) {\n this._clearEventHandlers();\n this._popup.clear('header', 'footer');\n this._view.renderPopup(popupObject);\n },\n\n _appendFirmList: function(res) { // (Object)\n this._firmList.addFirms(res.result.items);\n this._popup._updateScrollPosition();\n },\n\n _handlePopupScroll: function(e) {\n var scroller = e.originalEvent.target || e.target._scroller;\n\n DG.DomEvent.stop(e);\n\n if (this._totalPages <= 1) { return; }\n if (scroller && scroller.scrollHeight <= scroller.scrollTop + scroller.offsetHeight + this._scrollHeightReserve) {\n this._handlePaging();\n }\n },\n\n _handlePaging: function() {\n this._page++;\n\n if (this._totalPages && this._page <= this._totalPages) {\n this._api.firmsInHouse(this._id, {page: this._page}).then(DG.bind(this._appendFirmList, this));\n }\n\n if (this._page === this._totalPages) {\n var loader = this._firmListLoader;\n\n if (loader && loader.parentNode) {\n loader.parentNode.removeChild(loader);\n }\n\n this._popup.off('scroll', this._onScroll);\n }\n }\n});\n\nDG.Geoclicker.Handler.House.include({\n _getAddressString: function(house) {\n if (!house.address || !house.address.components) {\n return '';\n }\n\n return house.address.components\n .filter(function(component) {\n return component.type === 'street_number';\n })\n .map(function(component) {\n return component.street + ', ' + component.number;\n })\n .join(' / ');\n },\n\n _fillBody: function(house) { // // (Object) -> (DOMElement)\n var data = {},\n wrapper = DG.DomUtil.create('div', 'dg-building-callout__body'),\n filials = house.links && house.links.branches;\n\n var drilldown = this._getDrilldown(house);\n\n if (house.building_name) {\n data.address = {\n header: this._getAddressString(house),\n drilldown: drilldown\n };\n } else if (drilldown) {\n data.address = {\n drilldown: drilldown\n };\n }\n\n data.purpose = house.purpose_name +\n (house.floors ? ', ' + this.t('n_floors', house.floors.ground_count) : '');\n\n if (filials && filials.count > 0) {\n this._totalPages = Math.ceil(house.links.branches.count / this._firmsOnPage);\n }\n\n if (house.links && house.links.attractions && house.links.attractions.length) {\n data.attractions = house.links.attractions.reduce(function(attractions, attraction) {\n if (attraction.name) {\n attractions.push(attraction.name);\n }\n\n return attractions;\n }, []);\n }\n\n wrapper.innerHTML = this._view.render({\n tmpl: 'house',\n data: data\n });\n\n if (filials && filials.items) {\n wrapper.appendChild(this._initShortFirmList(filials.items));\n }\n\n return wrapper;\n },\n\n _fillHeader: function(house) { // (Object) -> (HTMLString)\n var header = {};\n\n if (house.building_name) {\n header.title = house.building_name;\n } else if (house.address && house.address.components) {\n header.title = this._getAddressString(house);\n } else {\n header.title = house.purpose_name;\n }\n\n this._header = this._view.render({\n tmpl: 'popupHeader',\n data: header\n });\n\n return this._header;\n },\n\n _fillFooter: function(house) { // (Object) -> (HTMLString)\n var btns = [];\n var houseFilials = house.links && house.links.branches;\n\n // Decide if we need to display 'more organisations' button\n if (\n houseFilials &&\n houseFilials.items &&\n houseFilials.items.length &&\n houseFilials.count > houseFilials.items.length\n ) {\n btns.push(this._getShowAllData(houseFilials.count));\n }\n\n if (this._isRouteSearchAllowed()) {\n btns.push({\n name: 'goto',\n label: this.t('go_to'),\n icon: true,\n href: this._directionsUrl\n });\n }\n\n return this._view.render({\n tmpl: 'popupFooterBtns',\n data: {'btns': btns}\n });\n },\n\n _getShowAllData: function(filialsCount) {\n return {\n name: 'all',\n label: this.t('show_organization_in_building', filialsCount)\n };\n },\n\n _fillHouseObject: function(house) { // (Object) -> (Object)\n var self = this;\n\n return {\n header: this._fillHeader(house),\n tmpl: this._fillBody(house),\n footer: this._fillFooter(house),\n afterRender: function() {\n self._initShowMore();\n self._initPopupClose();\n }\n };\n }\n});\n\nDG.Geoclicker.Handler.Poi = DG.Geoclicker.Handler.House.extend({\n\n handle: function(results) { // (Object) -> Promise\n if (!results.poi) {\n return false;\n }\n\n // initialization setup\n this.firmCard = null;\n this._page = 1;\n this._houseObject = null;\n this._firmList = null;\n this._firmListObject = null;\n this._firmCardObject = null;\n this._onScroll = false;\n this._isFirmlistOpen = false;\n\n this._id = results.poi.reference.id;\n this._totalPages = 1;\n this._api = this._controller.getCatalogApi();\n this._popup = this._view.getPopup();\n this._initedPopupClose = false;\n this._directionsUrl = this._getDirectionsUrl(results.poi.reference.name);\n this._firmListLoader = this._view.initLoader(true);\n\n // If the POI refers to a building (e.g. galleries in Santiago),\n // show a building callout\n if (results.poi.reference.type === 'building') {\n var self = this;\n\n return self._api.geoGet(results.poi.reference.id)\n .then(function(result) {\n self._houseObject = self._fillHouseObject(result.result.items[0]);\n return Promise.resolve(self._houseObject);\n });\n }\n\n // Otherwise, show a firm callout\n if (results.poi.reference.type === 'branch') {\n this._fillFirmCardObject(results.poi.reference.id);\n return true;\n }\n\n return false;\n }\n\n});\n\nDG.Geoclicker.Handler.Sight = DG.Geoclicker.Handler.Default.extend({\n\n handle: function(results) { // (Object, String) -> Promise\n if (!results.attraction) {\n return false;\n }\n\n this._popup = this._view.getPopup();\n this._initedPopupClose = false;\n\n return Promise.resolve(this._fillSightObject(results));\n },\n\n _fillSightObject: function(results) { // (Object) -> Object\n var attraction = results.attraction,\n data = {},\n self = this,\n footer = {\n btns: [\n {\n name: 'goto',\n label: this.t('go_to'),\n icon: true\n }\n ]\n };\n\n if (attraction.name) {\n data.buildingName = attraction.name;\n data.purpose = attraction.subtype_name;\n } else {\n data.buildingName = attraction.subtype_name;\n }\n\n data.description = attraction.description;\n\n data.drillDown = this._getDrilldown(attraction);\n\n if (this._checkDescFieldHeight(data.description)) {\n data.showMoreText = this.t('show_more_about_sight');\n }\n\n footer.btns[0].href = this._getDirectionsUrl(data.buildingName);\n\n return {\n tmpl: 'sight',\n data: data,\n header: this._view.render({\n tmpl: 'popupHeader',\n data: {'title': data.buildingName}\n }),\n footer: this._view.render({\n tmpl: 'popupFooterBtns',\n data: footer\n }),\n afterRender: function() {\n if (self._needShowMore) {\n self._initShowMore();\n }\n self._initPopupClose();\n }\n };\n },\n\n _initPopupClose: function() {\n if (this._initedPopupClose) {\n return;\n }\n\n this._controller.getMap().once('popupclose', DG.bind(this._clearPopup, this));\n this._initedPopupClose = true;\n },\n\n _clearPopup: function() {\n this._initedPopupClose = false;\n this._clearEventHandlers();\n },\n\n _showMoreText: function() {\n this._desc.style.maxHeight = '100%';\n this._link.parentNode.removeChild(this._link);\n this._popup.resize();\n },\n\n _initShowMore: function() {\n this._link = this._popup.findElement('.dg-map-geoclicker__show-more-sights-link');\n this._desc = this._popup.findElement('.dg-map-geoclicker__sight-description');\n\n if (this._link && this._desc) {\n this._addEventHandler('dg-map-geoclicker__show-more-sights-link', DG.bind(this._showMoreText, this));\n }\n },\n\n _checkDescFieldHeight: function(desc) {\n var el = DG.DomUtil.create('div', ''),\n height;\n\n el.style.visibility = 'hidden';\n el.innerHTML = desc;\n\n this._popup._contentNode.appendChild(el);\n height = el.offsetHeight;\n this._popup._contentNode.removeChild(el);\n this._needShowMore = (height > 40);\n\n return this._needShowMore;\n }\n});\n\nDG.Geoclicker.View = DG.Class.extend({\n\n initialize: function(map, options) { // (Object, Object)\n this._map = map;\n this._popup = DG.popup({\n maxHeight: 300,\n minHeight: 50,\n maxWidth: 385,\n minWidth: 310,\n sprawling: true,\n closeOnClick: true\n });\n\n if (options) {\n DG.Util.setOptions(this, options);\n }\n },\n\n initLoader: function(isSmall) {\n var loader = document.createElement('div');\n loader.innerHTML = DG.dust('DGGeoclicker/loader', {\n small: isSmall,\n anim: this._detectCssAnimation()\n });\n\n return loader.firstChild;\n },\n\n showPopup: function(latlng, content) { // (Object)\n this._popup\n .setContent(content)\n .setLatLng(latlng)\n .openOn(this._map);\n },\n\n render: function(options) { // (Object) -> String\n var html,\n data = {};\n\n options = options || {};\n options.tmpl = options.tmpl || '';\n\n if (options.data) {\n html = this.renderTemplate(options.tmpl, options.data);\n } else {\n html = options.tmpl;\n }\n\n if (options.beforeRender) {\n options.beforeRender();\n }\n\n if (options.popup) {\n if (options.header) {\n data.header = options.header;\n }\n if (options.footer) {\n data.footer = options.footer;\n }\n data.body = html;\n this._popup.setContent(data);\n }\n if (options.afterRender) {\n options.afterRender();\n }\n\n return html;\n },\n\n renderTemplate: function(name, data) {\n return DG.dust('DGGeoclicker/' + name, data);\n },\n\n renderPopup: function(options) { // (Object) -> String\n options.popup = true;\n return this.render(options);\n },\n\n getPopup: function() { // () -> Object\n return this._popup;\n },\n\n _detectCssAnimation: function() {\n var animation = false,\n domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),\n elm = document.createElement('div');\n\n if (elm.style.animationName) { animation = true; }\n\n if (animation === false) {\n for (var i = 0; i < domPrefixes.length; i++) {\n if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) {\n animation = true;\n break;\n }\n }\n }\n return animation;\n }\n});\n\nDG.Geoclicker.Controller = DG.Class.extend({\n\n options: {\n // if handler worked successfully, it should return rendering object that will be processed in View , otherwise it should return false\n // default handler always should return rendering object\n 'handlersSequence': {\n 'poi': DG.Geoclicker.Handler.Poi,\n 'attraction': DG.Geoclicker.Handler.Sight,\n 'building': DG.Geoclicker.Handler.House,\n 'street': DG.Geoclicker.Handler.CityArea,\n 'adm_div.place': DG.Geoclicker.Handler.CityArea,\n 'adm_div.district': DG.Geoclicker.Handler.CityArea,\n 'adm_div.division': DG.Geoclicker.Handler.CityArea,\n 'adm_div.settlement': DG.Geoclicker.Handler.CityArea,\n 'adm_div.city': DG.Geoclicker.Handler.CityArea,\n\n 'default': DG.Geoclicker.Handler.Default,\n\n 'apiError': DG.Geoclicker.Handler.ApiError\n\n // station_platform\n // project\n // station\n // crossbroad\n // metro\n }\n },\n\n initialize: function(map, options) { // (Object, Object)\n this._options = options;\n this._handlers = {};\n this._catalogApi = new DG.Geoclicker.Provider.CatalogApi(map);\n this._map = map;\n this._view = new DG.Geoclicker.View(map);\n\n this._renderHandlerResult = DG.bind(this._renderHandlerResult, this);\n this._lastHandleClickArguments = null;\n },\n\n handlePopupClose: function(popup) { // (Object)\n if (popup === this._view.getPopup()) {\n this._lastHandleClickArguments = null;\n this._catalogApi.cancelLastRequest();\n }\n },\n\n handleClick: function(latlng, zoom, meta) { // (Object, Number, Object)\n var self = this,\n args = Array.prototype.slice.call(arguments, 0);\n\n\n // Monitor geoclicker user usage statistics\n // TODO: remove after successful research\n if (typeof ga !== undefined) {\n // eslint-disable-next-line no-undef\n ga(DG.config.gaName + '.send', 'event', 'Geoclicker', 'Use');\n }\n\n function beforeRequest() {\n var loader = self._view.initLoader();\n self._view._popup.clear();\n self._view.showPopup(latlng, loader);\n self._lastHandleClickArguments = args;\n }\n\n if (meta && meta.linked && meta.linked.type != 'sight' && meta.linked.type != 'attraction') {\n if (meta.linked.type != 'branch' && meta.linked.type != 'building') {\n return;\n }\n\n beforeRequest();\n self.handleResponse({\n poi: {\n reference: meta.linked\n }\n });\n } else {\n this._catalogApi.getLocations({\n latlng: latlng,\n zoom: zoom,\n beforeRequest: beforeRequest\n }).then(function(result) {\n self.handleResponse(result);\n }, function(error) {\n self.handleResponse(error);\n });\n }\n },\n\n handleResponse: function(result) { // (Object)\n var type;\n\n if (!result) {\n this._runHandler('default');\n return;\n }\n\n if (result === 'no type') {\n return;\n }\n\n if (result === 'aborted') {\n this._runHandler('apiError');\n return;\n }\n\n type = this.findHandler(result);\n\n while (type) {\n if (this._runHandler(type, result)) {\n return;\n }\n delete result[type];\n\n type = this.findHandler(result);\n }\n this._runHandler('default');\n },\n\n findHandler: function(result) { // (Object) -> String|Null\n for (var i in this.options.handlersSequence) {\n if (result[i]) {\n return i;\n }\n }\n\n return null;\n },\n\n getCatalogApi: function() { // () -> Object\n return this._catalogApi;\n },\n\n getMap: function() {\n return this._map;\n },\n\n reinvokeHandler: function() {\n if (this._lastHandleClickArguments) {\n this.handleClick.apply(this, this._lastHandleClickArguments);\n }\n },\n\n _runHandler: function(type, data) { // (String, Object) -> Boolean\n data = data || {};\n this._initHandlerOnce(type);\n this._handlers[type].addClickEvent();\n\n var handlerResult = this._handlers[type].handle(data, type);\n\n return handlerResult && handlerResult.then ?\n handlerResult.then(this._renderHandlerResult) :\n handlerResult;\n },\n\n _renderHandlerResult: function(result) {\n this._view.renderPopup(result);\n },\n\n _initHandlerOnce: function(type) { // (String)\n if (!this._handlers[type]) {\n this._handlers[type] = new this.options.handlersSequence[type](this, this._view, this._map, this._options);\n }\n }\n});\n\nDG.Geoclicker.Handler.Default.Dictionary.it = DG.extend({\n apiErrorTitle: 'Oh oh, c\\'è un errore',\n apiErrorBody: 'I nostri server si rifiutano di rispondere. Stiamo facendo del nostro meglio per convincerli a comportarsi bene. Ritorna tra qualche minuto.',\n we_have_not : 'Non disponiamo ancora di informazioni su questo posto',\n noname : 'Nome non indicato',\n 'adm_div.place' : 'Luogo',\n 'adm_div.division' : 'Zona',\n 'adm_div.settlement' : 'Comune',\n street : 'Via',\n 'adm_div.district' : 'Municipalità ',\n 'adm_div.city' : 'Сittà ',\n go_to : 'Come arrivare',\n show_organization_in_building : ['{n} azienda in tutto', '{n} aziende in tutto'],\n show_more_about_sight : 'Maggiori informazioni',\n back_button: 'Indietro',\n n_floors : ['{n} piano', '{n} piani']\n}, DG.Dictionary.it);\n\nDG.Geoclicker.Handler.Default.Dictionary.ru = DG.extend({\n apiErrorTitle: 'Ошибочка вышла',\n apiErrorBody: 'Ðаши Ñерверы отказываютÑÑ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ. Мы уже прикладываем вÑе Ñилы, чтобы вразумить их. ВозвращайтеÑÑŒ к нам через неÑколько минут.',\n we_have_not : 'Ðто меÑто мы ещё не уÑпели изучить',\n noname: 'Без названиÑ',\n 'adm_div.place': 'МеÑто',\n 'adm_div.division': 'Округ',\n 'adm_div.settlement': 'ÐаÑеленный пункт',\n street: 'Улица',\n 'adm_div.district': 'Район',\n 'adm_div.city': 'Город',\n go_to: 'Проехать Ñюда',\n show_organization_in_building: ['Ð’Ñего {n} организациÑ', 'Ð’Ñего {n} организации', 'Ð’Ñего {n} организаций'],\n show_more_about_sight: 'Подробнее',\n back_button: 'Ðазад',\n n_floors: ['{n} Ñтаж', '{n} Ñтажа', '{n} Ñтажей']\n}, DG.Dictionary.ru);\n\nDG.Geoclicker.Handler.Default.Dictionary.en = DG.extend({\n apiErrorTitle: 'Oops! Error detected.',\n apiErrorBody: 'Our servers are not responding. We are doing our best to straighten them out. Please return to us in a few minutes.',\n we_have_not: 'We haven\\'t collected info about this place yet',\n noname : 'No name',\n 'adm_div.place' : 'Place',\n 'adm_div.division' : 'Area',\n 'adm_div.settlement' : 'Village',\n street : 'Street',\n 'adm_div.district' : 'District',\n 'adm_div.city' : 'City',\n go_to : 'Directions to here',\n show_organization_in_building : ['{n} organization total', '{n} organizations total'],\n back_button : 'Back',\n show_more_about_sight : 'More information',\n n_floors : ['{n} floor', '{n} floors']\n}, DG.Dictionary.en);\n\nDG.Geoclicker.Handler.Default.Dictionary.cs = DG.extend({\n apiErrorTitle: 'ChybiÄka se vloudila',\n apiErrorBody: 'NaÅ¡e servery odmÃtajà reagovat. Již nynà vynakládáme veÅ¡keré úsilÃ, abychom je pÅ™ivedli k rozumu. Zkuste akci opakovat za nÄ›kolik minut.',\n we_have_not : 'O tomto mÃstÄ› zatÃm nemáme informace',\n noname : 'Bez názvu',\n 'adm_div.place' : 'MÃsto',\n 'adm_div.division' : 'Správnà obvod',\n 'adm_div.settlement' : 'Obec',\n street : 'Ulice',\n 'adm_div.district' : 'MÄ›stská Äást',\n 'adm_div.city' : 'MÄ›sto',\n go_to : 'Cesta sem',\n show_organization_in_building : ['Celkem {n} organizace', 'Celkem {n} organizace', 'Celkem {n} organizacÃ'],\n back_button : 'ZpÄ›t',\n show_more_about_sight : 'VÃce',\n n_floors : ['{n} patro', '{n} patra', '{n} pater']\n}, DG.Dictionary.cs);\n\nDG.Geoclicker.Handler.Default.Dictionary.es = DG.extend({\n apiErrorTitle: 'Vaya, ha ocurrido un error',\n apiErrorBody: 'Nuestros servidores se niegan a responder. Ya nos estamos esforzando por hacerlos entrar en razón. Vuelva con nosotros pasados unos minutos.',\n we_have_not : 'TodavÃa no hemos recopilado la información sobre este lugar',\n noname : 'Sin nombre',\n 'adm_div.place' : 'Lugar',\n 'adm_div.division' : 'Comuna',\n 'adm_div.settlement' : 'Población',\n street : 'Calle',\n 'adm_div.district' : 'Comuna',\n 'adm_div.city' : 'Ciudad',\n go_to : 'Ir para allá',\n show_organization_in_building : ['Total {n} organización', 'Total {n} organizaciones', 'Total {n} organizaciones'],\n show_more_about_sight : 'Read more',\n back_button: 'Atrás',\n n_floors : ['{n} piso', '{n} pisos']\n}, DG.Dictionary.es);\n\nvar FirmCard = function (firm, options) {\n this._setOptions(options);\n this._firmContentObject = {};\n this._schedule = new FirmCard.Schedule({\n localLang: this.options.lang,\n dict: this.dict\n });\n\n this.render(firm);\n};\n\nFirmCard.prototype = {\n\n render: function (firmId) {\n if (!firmId) { return; }\n\n if (firmId !== this._firmId) {\n this._firmContentObject = {};\n this._renderCardById(firmId);\n } else {\n this._toggleEventHandlers();\n }\n\n return this._firmContentObject;\n },\n\n getSchedule: function () {\n return this._schedule;\n },\n\n getContainer: function () {\n return this._container;\n },\n\n _renderCardById: function (firmId) {\n var self = this;\n\n this.options.ajax(firmId).then(function (res) {\n if (!res) { return false; }\n var data = res.result.items;\n if (data !== 'undefined') {\n self._firmData = data[0];\n\n // Support for old WebAPI format.\n // TODO: remove this call after WebAPI release\n self._convertWebsite();\n\n self._firmId = firmId;\n self._renderFirmCard();\n self._toggleEventHandlers();\n }\n }, function (error) {\n self._renderError();\n });\n },\n\n _createFirmContainer: function () {\n var firm = document.createElement('div');\n firm.setAttribute('id', 'dg-map-firm-full-' + this._firmId);\n firm.setAttribute('class', 'dg-map-firm-full');\n\n return firm;\n },\n\n _getPaymentTypes: function (data) {\n var result = [],\n groupName = 'general_payment_type';\n\n if (!data.attribute_groups) {\n return result;\n }\n\n data.attribute_groups.forEach(function (group) {\n if (group.name) {\n return;\n }\n\n group.attributes.forEach(function (attr) {\n if (attr.tag.substring(0, groupName.length) === groupName) {\n result.push(attr.name);\n }\n });\n });\n\n return result;\n },\n\n _groupRubrics: function (data) {\n var result = {\n primary: [],\n additional: []\n };\n\n if (!data.rubrics || !data.rubrics.length) {\n return result;\n }\n\n data.rubrics.forEach(function (rubric) {\n result[rubric.kind].push(rubric);\n });\n\n return result;\n },\n\n // Support for old WebAPI format.\n // TODO: remove this function after WebAPI release\n _convertWebsite: function () {\n if (!this._firmData.contact_groups) {\n return;\n }\n\n this._firmData.contact_groups.forEach(function (group) {\n if (!group.contacts) {\n return;\n }\n\n group.contacts.forEach(function (contact) {\n if (contact.type != 'website') {\n return;\n }\n\n if (!contact.url) {\n contact.url = contact.value;\n }\n });\n });\n },\n\n _renderFirmCard: function () {\n var firmCardBody, schedule, forecast, links, btns, paymentTypes, rubrics,\n data = this._firmData,\n container = this._container = this._createFirmContainer();\n\n schedule = this._schedule.transform(data.schedule, {\n zoneOffset: this.options.timezoneOffset,\n apiLang: this.options.lang,\n localLang: this.options.lang\n });\n\n forecast = this._schedule.forecast(schedule);\n\n paymentTypes = this._getPaymentTypes(data);\n rubrics = this._groupRubrics(data);\n\n firmCardBody = this._buildFirmCardBody(\n this._getConfigFirmCardBody(data, schedule, forecast, paymentTypes, rubrics)\n );\n\n links = this._fillHeaderLinks();\n btns = this._fillFooterButtons();\n\n //fill object for view render\n this._firmContentObject.header = this.options.render('firmCardHeader', {'firmName': data.name, 'links': links});\n container.innerHTML = firmCardBody;\n this._firmContentObject.tmpl = container;\n if (btns.length) {\n this._footerContainer = document.createElement('div');\n\n this._footerContainer.innerHTML = this.options.render('popupFooterBtns', {'btns': btns});\n this._firmContentObject.footer = this._footerContainer;\n }\n\n if (this.options.onFirmReady) {\n this.options.onFirmReady(this._firmContentObject);\n }\n },\n\n _renderError: function() {\n this._firmContentObject.header = this.options.render('popupHeader', {\n title: this.options.t('apiErrorTitle')\n });\n\n this._firmContentObject.tmpl = this.options.t('apiErrorBody');\n\n if (this.options.onFirmReady) {\n this.options.onFirmReady(this._firmContentObject);\n }\n },\n\n _getConfigFirmCardBody: function (data, schedule, forecast, attributes, rubrics) {\n return [\n {\n tmpl: 'firmCardAddr',\n data: {\n address: data.address_name,\n comment: data.address_comment\n }\n },\n {\n tmpl: 'firmCardContacts',\n data: {\n groups: data.contact_groups\n }\n },\n {\n tmpl: 'firmCardSchedule',\n data: {\n schedule: schedule,\n forecast: forecast\n }\n },\n {\n tmpl: 'frimCardPayments',\n data: {\n payments: attributes\n }\n },\n {\n tmpl: 'firmCardRubric',\n data: {\n rubrics: rubrics\n }\n }\n ];\n },\n\n _buildFirmCardBody: function (parts) {\n var self = this;\n return parts.reduce(function (body, item) {\n var html = self.options.render(item.tmpl, item.data);\n return body + html;\n }, '');\n },\n\n _fillFooterButtons: function () {\n var btns = [];\n\n if (this.options.backBtn) {\n btns.push({ name: 'firm-card-back',\n label: this.dict.t(this.options.lang, 'btnBack'),\n icon: true\n });\n }\n\n if (this.options.showRouteSearch) {\n btns.push({ name: 'goto',\n label: this.dict.t(this.options.lang, 'btnFindWay'),\n icon: true,\n href: this.options.gotoUrl\n });\n }\n\n if (\n this._firmData.links &&\n this._firmData.links.entrances &&\n this.options.showEntrance\n ) {\n btns.push({ name: 'show-entrance',\n label: this.dict.t(this.options.lang, 'btnEntrance'),\n icon: true\n });\n }\n\n return btns;\n },\n\n _fillHeaderLinks: function () {\n var links = [],\n reviewData = this._firmData.reviews,\n booklet,\n link;\n\n if (this._firmData.external_content) {\n this._firmData.external_content.forEach(function (el) {\n if (el && el.type == 'booklet') {\n booklet = el;\n }\n });\n }\n\n if (reviewData && reviewData.is_reviewable) {\n links.push({\n name: 'flamp_stars',\n width: reviewData.rating * 20\n });\n links.push({\n name: 'flamp_reviews',\n label: this.dict.t(this.options.lang, 'linkReviews', reviewData.review_count ? reviewData.review_count : 0),\n href: FirmCard.DataHelper.getFlampUrl(this._firmId)\n });\n }\n\n // Retrieve photo data from external content block\n var photos;\n var externalContent = this._firmData.external_content;\n\n for (var i = 0; i < externalContent.length; i++) {\n if (\n externalContent[i].type == 'photo_album' &&\n externalContent[i].subtype == 'common'\n ) {\n photos = externalContent[i];\n break;\n }\n }\n\n if (!this.options.isMobile && photos && photos.count && this.options.showPhotos) {\n link = L.Util.template(DG.config.photosLink, {\n 'id': this._firmId,\n 'domain': this.options.domain\n });\n\n links.push({name: 'photos',\n href: link,\n label: this.dict.t(this.options.lang, 'linkPhoto', photos.count)\n });\n }\n\n if (!this.options.isMobile && booklet && booklet.url && this.options.showBooklet) {\n links.push({\n name: 'booklet',\n href: booklet.url,\n label: this.dict.t(this.options.lang, 'linkBooklet')\n });\n }\n\n\n return links;\n },\n\n _events: {\n 'dg-popup__button_name_firm-card-back': function() {\n this.options.backBtn();\n this._toggleEventHandlers(true);\n },\n 'dg-popup__button_name_show-entrance': function() {\n var ent = new this.options.showEntrance({'vectors': this._firmData.links.entrances[0].geometry.vectors});\n ent.addTo(this.options.map);\n ent.fitBounds();\n this._toggleEventHandlers(true);\n },\n 'dg-schedule__today': function() {\n this._onToggleSchedule();\n }\n },\n\n _toggleEventHandlers: function (flag) {\n this.options.popup[flag ? 'off' : 'on']('click', this._onClick, this);\n this.options.map[flag ? 'off' : 'on']('popupclose', this._onClose, this);\n },\n\n _onClick: function (e) {\n var target = e.originalEvent.target;\n\n for (var eventClass in this._events) {\n if (this._events.hasOwnProperty(eventClass) && target.className.indexOf(eventClass) > -1) {\n DG.DomEvent.preventDefault(e.originalEvent);\n this._events[eventClass].call(this, target);\n return;\n }\n }\n },\n\n _onClose: function (e) {\n this._toggleEventHandlers(true);\n },\n\n _onToggleSchedule: function () {\n var schedule = this._container.querySelector('.dg-schedule__table'),\n forecast = this._container.querySelector('.dg-schedule__now'),\n target = this._container.querySelector('.dg-schedule__today'),\n showClass = ' dg-schedule__today_shown_true';\n\n if (!schedule) { return; }\n\n if (schedule.style.display === 'block') {\n schedule.style.display = 'none';\n forecast.style.display = 'block';\n target.className = target.className.replace(showClass, '');\n } else {\n forecast.style.display = 'none';\n schedule.style.display = 'block';\n target.className += showClass;\n }\n\n if (this.options.onToggle) {\n this.options.onToggle();\n }\n },\n\n _setOptions: function (options) {\n var option,\n options = options || {};\n\n this.options = options;\n options.lang = options.lang || 'ru';\n\n for (option in options) {\n if (options.hasOwnProperty(option)) {\n this.options[option] = options[option];\n }\n }\n },\n\n _hasTouch: function () {\n return (('ontouchstart' in window) ||\n (navigator.maxTouchPoints > 0) ||\n (navigator.msMaxTouchPoints > 0));\n }\n};\n\nFirmCard.DataHelper = {\n\tpayMethods : [\n\t\t'americanexpress',\n\t\t'cash',\n\t\t'dinersclub',\n\t\t'goldcrown',\n\t\t'internet',\n\t\t'mastercard',\n\t\t'noncash',\n\t\t'visa'\n\t],\n\n\t_msgs : {},\n\n\tgetFlampUrl : function (id) {\n\t return DG.config.flampUrl.concat(id, '?', DG.config.flampGoogleAnalytics);\n\t},\n\n\tmsg : function (msg) {\n\t\tif (this._msgs.hasOwnProperty(msg)) {\n\t\t\treturn this._msgs[msg];\n\t\t}\n\t\tconsole && console.log(\"Cant't find translation for '\" + msg + \"'.\");\n\t\treturn msg.toString().replace('_', ' ');\n\t},\n\n\tgetProjectTime: function (timezoneOffset, time) {\n var now, utc;\n\n if (time) {\n now = new Date(time);\n } else {\n now = new Date();\n }\n\n if (timezoneOffset) {\n utc = now.getTime() + (now.getTimezoneOffset() * 60000);\n return new Date(utc + (60000 * timezoneOffset));\n } else {\n return now;\n }\n }\n};\n\n/* global\n FirmCard: false\n*/\n(function () {\n FirmCard.List = function (firms, options) {\n this._firms = {}; // {'firmID': firmDomObj}\n this._setOptions(options);\n\n this._container = options && options.container || document.createElement('ul');\n this._container.setAttribute('class', 'dg-building-callout__list');\n\n this._eventHandlersInited = false;\n this._firmCard = this._createFirm();\n this.renderList(firms);\n };\n\n FirmCard.List.prototype = {\n\n renderList: function (firms) {\n if (firms) {\n this._toggleEventHandlers();\n this.addFirms(firms);\n }\n if (this.options.onListReady) {\n this.options.onListReady(this._container);\n }\n\n return this._container;\n },\n\n _processFirms: function (firms, action) {\n if (!firms) { return; }\n var method = '_' + action + 'Firm';\n if (this._isArray(firms)) {\n for (var i = 0, l = firms.length; i < l; i++) {\n this[method](firms[i]);\n }\n } else {\n this[method](firms);\n }\n\n },\n\n addFirms: function(firms) {\n this._processFirms(firms, 'add');\n },\n\n removeFirms: function(firms) {\n this._processFirms(firms, 'remove');\n },\n\n setLang: function (newLang) {\n this.options.firmCard.lang = newLang;\n },\n\n getLang: function () {\n return this.options.firmCard.lang;\n },\n\n getContainer: function () {\n return this._container;\n },\n\n clearList : function () {\n this._firms = {};\n this._toggleEventHandlers(true);\n this._clearContainer();\n },\n\n _removeFirm: function (id) {\n if (!this._firms[id]) { return false; }\n this._container.removeChild(this._firms[id]);\n delete this._firms[id];\n },\n\n _addFirm: function (firmData) {\n var tmpl = this.options.firmlistItemTmpl,\n domFirm, firm, content;\n\n firm = {\n name: firmData.name,\n id: firmData.id.split('_').slice(0, 1)\n };\n\n if (!(firm.id in this._firms)) {\n\n domFirm = this._createListItem();\n\n content = tmpl ? this.options.firmCard.render(tmpl, {'firm': firm}) : firm.name;\n\n domFirm.insertAdjacentHTML('beforeend', content);\n\n this._firms[firm.id] = domFirm;\n this._container.appendChild(domFirm);\n }\n },\n\n _createListItem: function () {\n var item = document.createElement('li');\n item.setAttribute('class', 'dg-building-callout__list-item');\n\n return item;\n },\n\n _isArray: function (obj) {\n return {}.toString.call(obj) === '[object Array]';\n },\n\n _createFirm: function (firmData) {\n return new FirmCard(firmData, this.options.firmCard);\n },\n\n _isEmptyObj: function (obj) {\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n return false;\n }\n }\n\n return true;\n },\n\n _events: {\n 'dg-popup__link': function(target) {\n var s = this._firmCard.render(target.id);\n\n this.options.firmCard[this._isEmptyObj(s) ? 'pasteLoader' : 'onFirmReady'](s);\n\n this.options.firmCard.onFirmClick && this.options.firmCard.onFirmClick();\n\n this._toggleEventHandlers(true);\n },\n 'dg-building-callout__list-item': function(target) {\n target = target.children[0];\n\n this._events['dg-popup__link'].call(this, target);\n },\n 'dg-popup__button_name_back': function() {\n this.options.firmCard.onShowLess();\n\n this._toggleEventHandlers(true);\n }\n },\n\n _toggleEventHandlers : function (flag) {\n this.options.firmCard.popup[flag ? 'off' : 'on']('click', this._onClick, this);\n },\n\n _onClick: function (e) {\n var target = e.originalEvent.target;\n\n for (var eventClass in this._events) {\n if (this._events.hasOwnProperty(eventClass) && target.className.indexOf(eventClass) > -1) {\n DG.DomEvent.preventDefault(e.originalEvent);\n this._events[eventClass].call(this, target);\n return;\n }\n }\n },\n\n _clearContainer: function () {\n var container = this._container;\n\n while (container.hasChildNodes()) {\n container.removeChild(container.firstChild);\n }\n },\n\n _setOptions: function (options) {\n options || (options = {});\n this.options = options;\n this.options.firmCard || (this.options.firmCard = {});\n\n if (!options.firmCard.lang) {\n this.options.firmCard.lang = 'ru';\n }\n\n for (var option in options) {\n if (options.hasOwnProperty(option)) {\n this.options[option] = options[option];\n }\n }\n }\n };\n})();\n\n/*global\n FirmCard:false\n*/\nFirmCard.Schedule = function (options) {\n options = options || {};\n\n this.localLang = options.localLang || 'ru';\n this.dict = options.dict;\n return this;\n};\n\nFirmCard.Schedule.prototype = {\n\n setLang: function (lang) {\n this.localLang = lang || 'ru';\n return this;\n },\n\n transform: function (model, params) {\n if (!model) {\n return;\n }\n params = params || {};\n\n function bind(fn, obj) { // (Function, Object) -> Function\n var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null;\n return function () {\n return fn.apply(obj, args || arguments);\n };\n }\n\n var todayKey, // Mon, Tue ...\n today, // Объект модели - текущий день недели\n from, // Самое раннее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð·Ð° день\n to, // Самое позднее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð·Ð° день\n zoneOffset = params.zoneOffset || 0,\n schedule = {}, // Объект-раÑпиÑание, формируемый под шаблон\n now = params.now || FirmCard.DataHelper.getProjectTime(zoneOffset).getTime(), // Current timestamp in milliseconds\n weekKeys = [], // Ключи дней недели, определÑÑŽÑ‚ порÑдок дней и первый день недели. 0 - первый день недели в регионе (не обÑзательно Mon)\n weekKeysLocal = [],\n weekFullKeysLocal = [],\n weekKeysShort = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ],\n weekKeysFull = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'],\n localLang = params.localLang || this.localLang,\n localWorkingDays = params.localWorkingDays || [0, 1, 1, 1, 1, 1, 0],\n firstdayOffset = params.firstdayOffset || 1,\n minHoursToDisplayClosure = params.minHoursToDisplayClosure || 4,\n t = bind(this.dict.t, this.dict);\n\n\n function capitaliseFirstLetter(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n function getHours(str) {\n return str.substr(0, 2);\n }\n\n function getMinutes(str) {\n return str.substr(3, 2);\n }\n\n // ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹ точки формата апи в формат Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (25:00 -> 01:00)\n function formatTime(str) {\n var hours = +getHours(str) % 24 + '';\n\n if (hours.length === 1) {\n hours = '0' + hours;\n }\n\n return hours + ':' + getMinutes(str);\n }\n\n // ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ int чиÑла в номер Ð´Ð½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸ (диапазон 0-6)\n // отрицательные чила: -1 вернёт 6, -2 -> 5 и Ñ‚.д\n // положительные: 7 -> 0, 8 -> 1\n function dayNum(n) {\n return (n + 70) % 7;\n }\n\n\n /* jshint ignore:start */\n // Возвращает поÑледний Ñлемент маÑÑива\n // ВзÑто из Underscore.js http://underscorejs.org/#last\n function getArrayLast(arr, n) {\n if ( arr == null ) return void 0;\n if ( n == null ) return arr[ arr.length - 1 ];\n return slice.call( arr, Math.max(arr.length - n , 0) );\n }\n\n\n // ВыполнÑет глубокое Ñравнение объектов\n // ВзÑто из Underscore.js http://underscorejs.org/#isEqual\n // Упрощено Ð´Ð»Ñ Ñ‚ÐµÑ… трёх Ñравнений, которые выполнÑÑŽÑ‚ÑÑ Ð² Shedule.js\n function isEqual(obj1, obj2) {\n if ( obj1 === obj2 ) return true;\n if ( ! ( obj1 instanceof Object ) || ! ( obj2 instanceof Object ) ) return false;\n if ( obj1.constructor !== obj2.constructor ) return false;\n for ( var prop in obj1 ) {\n if ( ! obj1.hasOwnProperty( prop ) ) continue;\n if ( ! obj2.hasOwnProperty( prop ) ) return false;\n if ( obj1[ prop ] === obj2[ prop ] ) continue;\n if ( typeof( obj1[ prop ] ) !== \"object\" ) return false;\n if ( ! isEqual( obj1[ prop ], obj2[ prop ] ) ) return false;\n }\n for ( prop in obj2 ) {\n if ( obj2.hasOwnProperty( prop ) && ! obj1.hasOwnProperty( prop ) ) return false;\n }\n\n return true;\n }\n\n // Generate an integer Array containing an arithmetic progression. A port of\n // the native Python `range()` function. See\n // [the Python documentation](http://docs.python.org/library/functions.html#range).\n function range(start, stop, step) {\n if (arguments.length <= 1) {\n stop = start || 0;\n start = 0;\n }\n step = arguments[2] || 1;\n\n var length = Math.max(Math.ceil((stop - start) / step), 0);\n var idx = 0;\n var range = new Array(length);\n while(idx < length) {\n range[idx++] = start;\n start += step;\n }\n\n return range;\n }\n\n\n //ЗаполнÑет ÑвойÑтва объекта значениÑми по умолчанию\n //ВзÑто из Underscore.js http://underscorejs.org/#defaults\n function fillDefaults(obj) {\n var args = Array.prototype.slice.call(arguments, 1);\n args.forEach(function(source) {\n if (source) {\n for (var prop in source) {\n if (obj[prop] === void 0) obj[prop] = source[prop];\n }\n }\n });\n return obj;\n }\n\n //Сортирует Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑоглаÑно Ñ Ð¸Ñ‚ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼\n //ВзÑто Ñ Underscore.js http://underscorejs.org/#sortBy\n function sortBy(obj, iterator){\n return pluck(obj.map( function(value, index, list) {\n return {\n value: value,\n index: index,\n criteria: iterator.call(this, value, index, list)\n };\n }).sort(function(left, right) {\n var a = left.criteria;\n var b = right.criteria;\n if (a !== b) {\n if (a > b || a === void 0) return 1;\n if (a < b || b === void 0) return -1;\n }\n return left.index - right.index;\n }), 'value');\n }\n\n /* jshint ignore:end */\n\n function pluck(arr, key){\n var i, rv = [];\n for (i = 0; i < arr.length; ++i) {\n rv[i] = arr[i][key];\n }\n return rv;\n }\n\n\n // Преобразовать раÑпиÑание на день в упорÑдоченный маÑÑив временных отÑечек (string)\n // Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð¿Ð¾Ð»Ð°Ð³Ð°ÐµÑ‚ÑÑ, что API уже выдаёт Ñортированный маÑÑив\n function getSortedTimePoints(day) {\n var points = [],\n from, to,\n deltaHours, deltaMinutes;\n\n if (!day || !day.working_hours) {\n return [];\n }\n\n for (var i = 0 ; i < day.working_hours.length ; i++) {\n from = day.working_hours[i].from;\n to = day.working_hours[i].to;\n\n deltaHours = getHours(to) - getHours(from);\n deltaMinutes = getMinutes(to) - getMinutes(from);\n if (deltaHours < 0 || (deltaHours === 0 && deltaMinutes <= 0)) { // ЕÑли \"до\" меньше или равно \"от\" - значит указывает на завтра\n to = (+getHours(to) + 24) + ':' + getMinutes(to); // (01:00 -> 25:00)\n }\n\n points[i * 2] = {\n time: from,\n type: 'open'\n };\n points[i * 2 + 1] = {\n time: to,\n type: day.working_hours.length - 1 === i ? 'close' : 'lunch'\n };\n }\n\n return points;\n }\n\n // Возвращает маÑÑив timestamp вÑех точек, вÑех дней недели, от ÑегоднÑшнего и в будущее\n // Ðапример, ÑÐµÐ³Ð¾Ð´Ð½Ñ Ñреда, отÑечки будут взÑÑ‚Ñ‹ Ð´Ð»Ñ Ð´Ð°Ñ‚ Ñо Ñреды (ÑегоднÑ) по Ñледующий вторник включительно\n function getTimeStamps(model) {\n var timestamps = [],\n out = [],\n timePoints,\n num = weekKeys.indexOf(todayKey); // Ðомер ÑегоднÑшнего Ð´Ð½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸ (Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ региона)\n\n\n // Цикл по днÑм недели Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ ÑегоднÑшнего\n var j; // Ðомер текущего Ð´Ð½Ñ Ð² маÑÑиве weekKeys\n for (var i = 0 ; i < 7 ; i++) {\n j = dayNum(num + i);\n timePoints = getSortedTimePoints(model[weekKeys[j]]);\n // Цикл по точкам времени Ñ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸ÐµÐ¹ в timestamp\n timePoints.forEach(\n /* jshint -W083 */\n function (point) {\n // now - обÑзательно! иначе будет братьÑÑ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¹ timestamp что чревато неÑовпадениÑми при медленном быÑтродейÑтвии\n // ВычиÑлить таймÑтемп Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ð´Ð½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸, чаÑа и минуты, в будущем, но ближайший к now\n var tsp = new Date(now);\n tsp.setDate(tsp.getDate()+i);\n tsp.setHours(getHours(point.time));\n tsp.setMinutes(getMinutes(point.time));\n var ts = tsp.getTime();\n\n\n\n timestamps.push({\n ts: ts,\n type: point.type\n });\n\n if (timestamps[timestamps.length - 1] && timestamps[timestamps.length - 2]) {\n // Парно удалÑем Ñовпадающие точки (они не имеют ÑмыÑла - Ñто ÑÐµÐ³Ð¾Ð´Ð½Ñ 24:00 и завтра 00:00)\n if (timestamps[timestamps.length - 1].ts === timestamps[timestamps.length - 2].ts) {\n timestamps.pop();\n timestamps.pop();\n }\n }\n\n if (timestamps[timestamps.length - 1] && timestamps[timestamps.length - 2]) {\n // Парно переноÑим точки в будущее, еÑли они обе в прошлом (Ð¿ÐµÑ€Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° ([0]) должна быть вÑегда открытием!)\n if (timestamps[timestamps.length - 1].ts <= now && timestamps[timestamps.length - 2].ts <= now) {\n timestamps[timestamps.length - 1].ts += (7 * 24 * 60 * 60 * 1000);\n timestamps[timestamps.length - 2].ts += (7 * 24 * 60 * 60 * 1000);\n }\n }\n }\n /* jshint +W083 */\n );\n }\n\n // Сортируем на возраÑтание, ведь возможно были переноÑÑ‹ в будущее\n timestamps = sortBy(timestamps, function (timestamp) { return timestamp.ts; });\n\n // УдалÑем попарно Ñовпадающие точки времени\n i = 0;\n while (i < timestamps.length) {\n if (timestamps[i + 1] && timestamps[i].ts === timestamps[i + 1].ts) {\n i++;\n } else {\n out.push(timestamps[i].ts);\n }\n i++;\n }\n\n // Проверка на ежедневно-круглоÑуточноÑÑ‚ÑŒ\n if (out.length === 2 && (out[1] - out[0]) === (7 * 24 * 60 * 60 * 1000)) {\n return [];\n }\n\n return timestamps;\n }\n\n function whenOpenInverse(h, d, num) {\n if (d === 1 && h > minHoursToDisplayClosure ) {\n return t(localLang, 'tommorow');\n } else if (d > 1) {\n /* jshint -W015 */\n switch (num) {\n case 0: return t(localLang, 'nextSun');\n case 1: return t(localLang, 'nextMon');\n case 2: return t(localLang, 'nextTue');\n case 3: return t(localLang, 'nextWed');\n case 4: return t(localLang, 'nextThu');\n case 5: return t(localLang, 'nextFri');\n case 6: return t(localLang, 'nextSat');\n }\n /* jshint +W015 */\n }\n\n return;\n }\n\n\n //Возвращает интервал в целых днÑÑ…, Ñ Ð¿Ð¾Ð¿Ñ€Ð°Ð²ÐºÐ¾Ð¹ на Ñмену Ð´Ð½Ñ Ð² полночь, между\n // @param timestampEnd и @param dateStart\n function dayInterval(timestampEnd, dateStart) {\n\n var oneDay = 1000 * 60 * 60 * 24,\n dateEnd = new Date(timestampEnd.ts);\n\n var diff;\n\n diff = Math.round((dateEnd - dateStart) / oneDay);\n\n if( timestampEnd.type==='open' && dateEnd.getHours() < 1 )\n { diff ++; }\n\n return diff;\n }\n\n\n // ПомеÑтить данные в объект Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° о ÑегоднÑшнем дне\n function setTodayString(today) {\n\n var timePoints,\n periods = [],\n timestamps;\n\n schedule.now = {};\n\n // Timestamps вÑех отÑечек\n timestamps = getTimeStamps(model);\n\n if (!timestamps.length) {\n schedule.always = true; // Работает ежедневно круглоÑуточно\n schedule.now.open = true;\n }\n\n\n for (var i = 0 ; i < timestamps.length ; i++) {\n // Попали между точками i-1 и i // Мы находимÑÑ Ð·Ð°Ð²ÐµÐ´Ð¾Ð¼Ð¾ в будущем отноÑительно 1\n if (now >= (timestamps[i - 1] && timestamps[i - 1].ts || 0) && now < timestamps[i].ts) {\n var h = Math.floor((timestamps[i].ts - now) / (1000 * 60 * 60)), // КоличеÑтво чаÑов до Ñледующего timestamp\n m = Math.floor((timestamps[i].ts - now) / (1000 * 60) - h * 60), // КоличеÑтво минут (без чаÑов) до Ñледующего timestamp\n dayNow = new Date(now),\n\n // открыто еÑли ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¸Ñ‚ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ открытие\n nowIsOpen = timestamps[i].type !== 'open';\n\n //var d = dayOfYear(dayTs) - dayOfYear(dayNow);\n //var d = dayInterval(dayTs, dayNow, nowIsOpen);\n var d = dayInterval(timestamps[i], dayNow);\n\n\n\n // округлÑем минуты до кратных 5\n m = Math.floor(m / 10) * 10 ? Math.floor(m / 10) * 10 : 5;\n\n schedule.now.open = nowIsOpen;\n schedule.now.lunch = !!(timestamps[i - 1] && timestamps[i - 1].type === 'lunch' || getArrayLast(timestamps).type === 'lunch');\n\n schedule.will = {\n willType: timestamps[i].type,\n d: d,\n h: h,\n m: m\n };\n\n // Когда закроетÑÑ Ð¸Ð»Ð¸ откроетÑÑ\n var willWhen = new Date(timestamps[i].ts);\n schedule.will.when = whenOpenInverse(h, d, willWhen.getDay());\n\n\n var willTill = new Date(timestamps[i].ts),\n strHours = willTill.getHours(),\n strMinutes = willTill.getMinutes();\n\n if (strHours < 10) { strHours = '0' + strHours; }\n if (strMinutes < 10) { strMinutes = '0' + strMinutes; }\n\n schedule.will.till = strHours+':'+strMinutes;\n }\n }\n\n if (!today) {\n return; // Ðа ÑÐµÐ³Ð¾Ð´Ð½Ñ Ñ€Ð°ÑпиÑÐ°Ð½Ð¸Ñ Ð½ÐµÑ‚ - ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¾\n }\n\n timePoints = pluck(getSortedTimePoints(today), 'time');\n\n // Цикл по периодам работы за день\n for (i = 2 ; i < timePoints.length ; i = i + 2) {\n periods.push({ from: timePoints[i - 1], to: timePoints[i] });\n }\n\n from = formatTime(timePoints[0]);\n to = formatTime(timePoints[timePoints.length - 1]);\n\n if (from === to) { // КруглоÑуточно\n schedule.today = {\n alltime: true,\n alltimeStr: t(localLang, 'worksAroundTheClock'),\n from: '00:00',\n to: '24:00'\n };\n } else { // От from до to\n schedule.today = {\n from: from,\n to: to\n };\n }\n\n if (periods.length > 0) { // Перерывы на обед\n schedule.lunch = periods;\n schedule.lunchStr = t(localLang, 'lunch');\n }\n }\n\n // Формирование объекта-таблицы-раÑпиÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°\n function makeTable() {\n var column = [],\n hasLunch = false;\n\n for (var j = 0 ; j < 7 ; j++) {\n var dayKey = weekKeys[j],\n lunchMaxLength = 0;\n\n column[j] = {};\n\n if (model[dayKey]) {\n var day = model[dayKey],\n timePoints = pluck(getSortedTimePoints(day), 'time'),\n lunch = []; // Отрезки времени (отÑортированные моменты) на обеды\n\n // Цикл по периодам работы за день\n for (var i = 2 ; i < timePoints.length ; i = i + 2) {\n hasLunch = true;\n lunch.push({ from: timePoints[i - 1], to: timePoints[i] });\n }\n lunchMaxLength = Math.max(timePoints.length / 2, lunchMaxLength);\n\n column[j] = {\n from: formatTime(timePoints[0]),\n to: formatTime(timePoints[timePoints.length - 1]),\n lunch: lunch\n };\n }\n\n if (dayKey === todayKey) { // СегоднÑшний день надо подÑветить\n column[j].active = true;\n }\n\n column[j].key = weekKeysLocal[j];\n }\n\n // Дополнение пуÑтыми объектами маÑÑивов lunch\n column.forEach( function (col) {\n if (col.lunch) {\n fillDefaults(col.lunch, range(1, lunchMaxLength));\n }\n });\n\n return {\n table: column,\n hasLunch: hasLunch\n };\n }\n\n // Сгенерировать Ñтроку Ð´Ð»Ñ Ð²Ñех дней model, Ñовпадающих Ñ day\n function makeSimpleString(day, model) {\n var points,\n out = {\n dayList: [],\n lunch: []\n },\n lunchesTime = [];\n\n if (day && day.working_hours && day.working_hours.length) {\n points = pluck(getSortedTimePoints(day), 'time');\n points.forEach( function (point, key) {\n if (key === 0) {\n out.from = formatTime(point);\n } else if (key === points.length - 1) {\n out.to = formatTime(point);\n } else {\n lunchesTime.push(formatTime(point));\n }\n });\n for (var i = 0; i < lunchesTime.length; i += 2) {\n out.lunch.push({\n from: lunchesTime[i],\n to: lunchesTime[i + 1],\n lunchStr: capitaliseFirstLetter(t(localLang, 'lunch'))\n });\n }\n\n if (out.from == '00:00' && out.to == '00:00') {\n out.to = '24:00';\n }\n\n if (day.round_the_clock) {\n out.alltime = true;\n out.alltimeStr = t(localLang, 'worksAroundTheClock');\n }\n } else { // Выходной\n out.holiday = true;\n }\n\n // Формируем ÑпиÑок дней на локальном Ñзыке\n var groupWorkingDays = [0, 0, 0, 0, 0, 0, 0]; // Флаги работы фирмы в дни текущей группы\n var flow = 0;\n\n weekKeys.forEach( function (dayKey, numKey) { // 'Mon', 0\n if (isEqual(model[dayKey], day) || (!model[dayKey] && day === null)) {\n out.dayList.push(weekFullKeysLocal[numKey]);\n groupWorkingDays[dayNum(numKey + firstdayOffset)] = 1;\n flow++;\n } else {\n if (flow > 2) { // Более 2 дней подрÑд\n var lastDay = out.dayList.pop();\n\n for (var i = 1 ; i < flow - 1 ; i++) {\n out.dayList.pop();\n }\n\n out.dayList[out.dayList.length - 1] += ' — ' + lastDay;\n }\n\n flow = 0;\n }\n });\n\n // СпиÑок дней в данной группе идентичен ÑпиÑку будних дней, значит можно заменить Ñловом \"Будни\"\n out.budni = isEqual(localWorkingDays, groupWorkingDays);\n // СпиÑок рабочих дней - вÑе дни недели, значит нужно выводить фразу \"Ежедневно\"\n out.everyday = ( Math.min.apply(Math, groupWorkingDays) === 1 );\n\n if ( out.holiday ) { out.holidayStr = t(localLang, 'restDay', out.dayList.length).slice(2); }\n\n // Делаем из маÑÑива Ñтроку и поднимаем первый Ñимвол\n out.dayList = out.dayList.join(', ');\n out.dayList = out.dayList.charAt(0).toUpperCase() + out.dayList.slice(1);\n\n\n return out;\n }\n\n // Возвращает маÑÑив simple Ñтрок на оÑнове маÑÑива дней days\n function makeAdvancedString(days, model) {\n var out = [];\n\n for (var i = days.length - 1 ; i >= 0 ; i--) {\n out.push(makeSimpleString(days[i], model));\n }\n\n return out;\n }\n\n // ЗаполнÑем Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð´Ð½ÐµÐ¹ недели, 1 - понедельник. Ð’ заполненных маÑÑивах понедельник Ñто 0\n\n for (var i = 0 ; i < 7 ; i++) {\n weekKeys[i] = weekKeysShort[i];\n weekKeysLocal[i] = this.dict.t(localLang, weekKeysShort[i].toLowerCase());\n weekFullKeysLocal[i] = this.dict.t(localLang, weekKeysFull[i]);\n }\n\n // ВычиÑлÑем ÑегоднÑшний день недели (ÑÑылку на объект Ð´Ð½Ñ Ð² модели)\n todayKey = weekKeysShort[dayNum(new Date(now).getDay() - firstdayOffset)];\n today = model[todayKey]; // Объект раÑпиÑÐ°Ð½Ð¸Ñ - текущий день недели\n setTodayString(today); // Сделать объект Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° - Ñтрока, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ð¿Ð¸Ñывает Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ ÑегоднÑ\n\n // Ðаходим количеÑтво разных раÑпиÑаний и ÑохранÑем их в маÑÑив\n var apiDifferentDays = [], // МаÑÑив различающихÑÑ Ð´Ð½ÐµÐ¹ из модели\n apiScheduleDaysCount = 0, // КоличеÑтво опиÑанных дней в раÑпиÑании модели\n apiDifferentDaysCount = 0, // КоличеÑтво разных дней в раÑпиÑании модели\n differentWorkingHoursCount = []; // КоличеÑтво рабочих чаÑов в разных днÑÑ…\n\n Object.keys(model).forEach( function(day) {\n if (model[day] && model[day].working_hours) { // ПроверÑем что Ñто день, а не комментарий или что-то ещё\n apiScheduleDaysCount++;\n if (!isEqual(model[day], getArrayLast(apiDifferentDays))) {\n apiDifferentDays.push(model[day]);\n }\n }\n });\n\n apiDifferentDaysCount = apiDifferentDays.length;\n // ЕÑли не вÑе дни опиÑаны в модели, значит еÑÑ‚ÑŒ ещё один тип дней - выходной (отÑутÑтвущий в модели)\n if (apiScheduleDaysCount < 7) {\n apiDifferentDaysCount++;\n }\n\n // ЕÑли разных более 2, то упроÑтить не получитÑÑ - делаем таблицу\n if (apiDifferentDaysCount > 2) {\n schedule.week = makeTable(model);\n } else { // Иначе, ÑоÑтавлÑем комментарий из двух Ñтрок\n\n // Случай, когда вÑе одинаковые\n if (apiDifferentDaysCount === 1) {\n schedule.week = {\n evently: [makeSimpleString(model[weekKeys[0]], model)]\n };\n } else { // ОÑтаётÑÑ Ñлучай, когда еÑÑ‚ÑŒ два типа дней\n // ОпределÑем день Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ количеÑтвом рабочих чаÑов из чиÑла разных дней\n for (i = 0 ; i < apiDifferentDaysCount ; i++) {\n differentWorkingHoursCount[i] = 0;\n\n if (apiDifferentDays[i]) {\n var points = pluck(getSortedTimePoints(apiDifferentDays[i]), 'time');\n\n for (var j = 0 ; j < points.length ; j = j + 2) {\n var hours = (getHours(points[j + 1]) + getMinutes(points[j + 1]) / 60) - (getHours(points[j]) + getMinutes(points[j]) / 60);\n differentWorkingHoursCount[i] += hours;\n }\n } else { // Выходной\n apiDifferentDays[i] = null;\n }\n }\n\n var apiSortedDifferentDays = sortBy(apiDifferentDays, function (day, key) {\n return differentWorkingHoursCount[key];\n });\n\n schedule.week = {\n evently: makeAdvancedString(apiSortedDifferentDays, model)\n };\n }\n }\n\n schedule.comment = model.comment;\n if (schedule.week && schedule.week.evently && schedule.week.evently.length === 1) {\n schedule.everyday = schedule.week.evently[0].everyday;\n }\n return schedule;\n },\n\n forecast: function (schedule, params) {\n var interval = '',\n open,\n today = {},\n nowText,\n maxHours = params && params.maxHours || 1;\n\n if (!schedule) {\n return {};\n }\n\n if (schedule.always) { // КруглоÑуточно ежедневно - более ничего выводить не нужно\n return {\n today: {\n text: this.dict.t(this.localLang, 'aroundTheClock')\n },\n open: true\n };\n }\n\n // Формируем Ñтроку - через Ñколько произойдёт ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¸Ð½Ð²ÐµÑ€ÑÐ¸Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¾Ñти\n if (schedule.will && schedule.will.h < maxHours) {\n if (schedule.will.h) {\n interval += this.dict.t(this.localLang, 'nHours', schedule.will.h) + ' ';\n }\n\n if (schedule.will.m) {\n interval += this.dict.t(this.localLang, 'nMins', schedule.will.m);\n }\n }\n\n // Данные на ÑегоднÑ\n if (schedule.today) {\n today.text = this.dict.t(this.localLang, 'today');\n if (schedule.everyday) {\n today.text = this.dict.t(this.localLang, 'everyday');\n }\n today.from = schedule.today.from;\n today.to = schedule.today.to;\n today.lunch = schedule.lunch;\n if (today.lunch) {\n today.lunchStr = this.dict.t(this.localLang, 'lunch');\n }\n } else {\n today.text = this.dict.t(this.localLang, 'todayIsRestDay');\n }\n\n // Текущий ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¸ прогноз\n if (schedule.always) { // ЕÑли круглоÑуточно, ничего кроме \"КруглоÑуточно\" выводить не нужно\n today.text = this.dict.t(this.localLang, 'aroundTheClock');\n open = true;\n } else if (schedule.now) {\n open = schedule.now.open;\n if (open) { // открыто\n if (schedule.will && schedule.will.willType === 'lunch') {\n // далее - закрытие на обед\n if (schedule.will && schedule.will.h < maxHours) {\n // менее maxHours до Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½Ð° обед\n nowText = this.dict.t(this.localLang, '_in') + ' ' + this.dict.t(this.localLang, 'nMins', interval) + this.dict.t(this.localLang, 'isClosingOnDinner');\n } else {\n // больше maxHours до Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½Ð° обед\n nowText = this.dict.t(this.localLang, 'isOpen');\n }\n\n } else {\n // далее проÑто закрытие\n if (schedule.will.h < maxHours) {\n // менее maxHours до Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ñ€Ð¾Ñто\n nowText = this.dict.t(this.localLang, 'closeIn') + this.dict.t(this.localLang, 'nMins', interval);\n } else {\n // больше maxHours до Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ñ€Ð¾Ñто\n nowText = this.dict.t(this.localLang, 'isOpen');\n }\n }\n } else { // закрыто\n if (schedule.will && schedule.will.when) {\n // откроетÑÑ Ð½Ðµ ÑегоднÑ\n nowText = this.dict.t(this.localLang, 'open') + schedule.will.when;\n } else {\n // откроетÑÑ ÑегоднÑ\n if (schedule.now && schedule.now.lunch) {\n // ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ð±ÐµÐ´\n if (schedule.will.h < maxHours) {\n // менее maxHours до Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ Ð¾Ð±ÐµÐ´Ð°\n nowText = this.dict.t(this.localLang, 'Lunch') + this.dict.t(this.localLang, 'openIn') + this.dict.t(this.localLang, 'nMins', interval);\n } else {\n // больше maxHours до Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ Ð¾Ð±ÐµÐ´Ð°\n nowText = this.dict.t(this.localLang, 'Lunch') + this.dict.t(this.localLang, 'openAt') + schedule.will.till;\n }\n } else {\n // проÑто закрыто\n if (schedule.will && schedule.will.h < maxHours) {\n // менее maxHours до Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ñ€Ð¾Ñто\n nowText = this.dict.t(this.localLang, 'openIn') + this.dict.t(this.localLang, 'nMins', interval);\n } else {\n // больше maxHours до Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ñ€Ð¾Ñто\n nowText = this.dict.t(this.localLang, 'openAt') + schedule.will.till;\n }\n }\n }\n }\n }\n\n return {\n today: today,\n now: nowText,\n open: open,\n week: schedule.week,\n comment: schedule.comment,\n everyday: schedule.everyday\n };\n }\n};\n\n/*global\n FirmCard:false\n*/\n// FirmCard.dictionary = {};\n\nFirmCard.prototype.dict = {\n\n t: function (lang, msg, argument) { // (String, Number) -> String\n var result,\n msgIsset = false,\n dictionaryMsg,\n exp;\n\n if (typeof this[lang] === 'undefined') {\n if (lang === 'ar') {\n lang = 'en';\n } else {\n lang = 'ru';\n }\n }\n dictionaryMsg = this[lang][msg];\n msgIsset = typeof dictionaryMsg !== 'undefined';\n if (!msgIsset) {\n return msg;\n }\n result = msgIsset ? dictionaryMsg : msg;\n\n if (argument !== undefined) {\n argument = parseInt(argument, 10);\n argument = isNaN(argument) ? 0 : argument;\n exp = this[lang].pluralRules(argument);\n result = argument + ' ' + dictionaryMsg[exp];\n }\n return result;\n },\n\n ru: {\n pluralRules: function (n) { // (Number)\n if (n % 10 === 1 && n % 100 !== 11) { // 1, 21\n return 0;\n }\n if ((n % 10 >= 2 && n % 10 <= 4 && (n % 10) % 1 === 0) && (n % 100 < 12 || n % 100 > 14)) { // 2, 3\n return 1;\n }\n\n if ((n % 10 === 0) || (n % 10 >= 5 && n % 10 <= 9 && (n % 10) % 1 === 0) || (n % 100 >= 11 && (n % 100) <= 14 && (n % 100) % 1 === 0)) { // 13, 17\n return 2;\n }\n },\n\n btnBack: 'Ðазад',\n btnFindWay: 'Проехать Ñюда',\n btnEntrance: 'Ðайти вход',\n linkReviews: ['отзыв', 'отзыва', 'отзывов'],\n linkPhoto: ['фото', 'фото', 'фото'],\n linkBooklet: 'Буклет',\n tommorow: 'завтра',\n afterTommorow: 'поÑлезавтра',\n afterWeek: 'через неделю',\n nextSun: 'в воÑкреÑенье',\n nextMon: 'в понедельник',\n nextTue: 'во вторник',\n nextWed: 'в Ñреду',\n nextThu: 'в четверг',\n nextFri: 'в пÑтницу',\n nextSat: 'в Ñубботу',\n willOpen: 'откроетÑÑ',\n willClose: 'закроетÑÑ',\n isOpen: 'Открыто',\n openTill: 'Открыто до ',\n closeIn: 'ЗакроетÑÑ Ñ‡ÐµÑ€ÐµÐ· ',\n openAt: 'ОткроетÑÑ Ð² ',\n openIn: 'ОткроетÑÑ Ñ‡ÐµÑ€ÐµÐ· ',\n open: 'ОткроетÑÑ ',\n nHours: ['чаÑ', 'чаÑа', 'чаÑов'],\n nMins: ['минуту', 'минуты', 'минут'],\n lunch: 'обед',\n Lunch: 'Обед. ',\n workingDays: 'Рабочие дни',\n weekdays: 'Будние дни',\n restDay: ['выходной', 'выходные','выходные'],\n reviewsOnFlamp: 'Отзывы на Флампе',\n writeReviewOnFlamp: 'ÐапиÑать отзыв на Флампе',\n payment: 'оплата',\n everyday: 'Ежедневно c',\n worksAroundTheClock: 'Работает круглоÑуточно',\n aroundTheClock: 'КруглоÑуточно',\n knowMore: 'узнать больше',\n toClose: 'до закрытиÑ',\n monday: 'понедельник',\n tuesday: 'вторник',\n wednesday: 'Ñреда',\n thursday: 'четверг',\n friday: 'пÑтница',\n saturday: 'Ñуббота',\n sunday: 'воÑкреÑенье',\n mon: 'пон',\n tue: 'втр',\n wed: 'Ñрд',\n thu: 'чтв',\n fri: 'птн',\n sat: 'Ñбт',\n sun: 'вÑк',\n toLunch: 'до обеда',\n today: 'СегоднÑ',\n lessThenHour: 'менее чаÑа',\n youCouldLate: 'вы можете не уÑпеть',\n workingTime: 'рабочее времÑ',\n showAllOrgInRubric: 'Показать вÑе организации рубрики',\n todayIsRestDay: 'Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð¹',\n internet: 'Оплата через Интернет',\n noncash: 'Безналичный раÑчет',\n goldcrown: 'Ð—Ð¾Ð»Ð¾Ñ‚Ð°Ñ ÐšÐ¾Ñ€Ð¾Ð½Ð°',\n dinersclub: 'Diners Club',\n mastercard: 'Mastercard',\n maestrocard: 'MaestroCard',\n visa: 'Visa',\n cash: 'Ðаличный раÑчет',\n americanexpress: 'American Express',\n hour : 'чаÑ',\n less: 'менее',\n _in : 'Через',\n isClosingOnDinner : ' закрываетÑÑ Ð½Ð° обед'\n },\n\n it: {\n pluralRules: function (n) { // (Number)\n if (n === 1) { // 1\n return 0;\n } else {\n return 1; //0, 2, 3, 4 ..\n }\n },\n\n btnBack: 'Indietro',\n btnFindWay: 'Come arrivare ',\n btnEntrance: 'Trova l\\'ingresso',\n linkReviews: ['recensione', 'recensioni'],\n linkPhoto: ['fotografia', 'fotografie'],\n linkBooklet: 'Sull\\'azienda',\n tommorow: 'domani',\n afterTommorow: 'dopodomani',\n afterWeek: 'tra una settimana',\n nextSun: 'la domenica',\n nextMon: 'il lunedi',\n nextTue: 'il martedì',\n nextWed: 'il mercoledì',\n nextThu: 'il giovedi',\n nextFri: 'il venerdì',\n nextSat: 'il sabato',\n willOpen: 'apre',\n willClose: 'ciuso',\n isOpen: 'Aperto',\n openTill: 'Aperto fino alle ',\n closeIn: 'Chiude tra ',\n openAt: 'Apre alle ',\n openIn: 'Apre tra ',\n open: 'Apre ',\n nHours: ['ora', 'ore'],\n nMins: ['minuto', 'minuti'],\n lunch: 'pausa pranzo',\n Lunch: 'Pausa pranzo. ',\n workingDays: 'Giorni feriali',\n weekdays: 'Giorni feriali',\n restDay: ['chiusura','chiusura'],\n reviewsOnFlamp: 'Recensioni su Flamp',\n writeReviewOnFlamp: 'Scrivi una recensione su Flamp',\n payment: 'pagamento',\n everyday: 'Ogni giorno dalole',\n worksAroundTheClock: 'Operativo 24 ore su 24',\n aroundTheClock: '24 ore su 24',\n knowMore: 'ulteriori informazioni',\n toClose: 'fino alla chiusura',\n monday: 'lunedi',\n tuesday: 'martedì',\n wednesday: 'mercoledì',\n thursday: 'giovedi',\n friday: 'venerdì',\n saturday: 'sabato',\n sunday: 'domenica',\n mon: 'lun',\n tue: 'mar',\n wed: 'mer',\n thu: 'gio',\n fri: 'ven',\n sat: 'sab',\n sun: 'dom',\n toLunch: 'fino alla pausa pranzo',\n today: 'Oggi',\n lessThenHour: 'meno di un\\'ora',\n youCouldLate: 'affrettarsi, chiusura imminente',\n workingTime: 'orario di lavoro',\n showAllOrgInRubric: 'Visualizza tutte le aziende della categoria',\n todayIsRestDay: 'oggi chiuso',\n internet: 'Pagamento on-line',\n noncash: 'Pagamento non in contanti',\n goldcrown: 'Zolotaja Korona',\n dinersclub: 'Diners Club',\n mastercard: 'MasterCard',\n maestrocard: 'MaestroCard',\n visa: 'Visa',\n cash: 'Pagamento in contanti',\n americanexpress: 'American Express',\n hour : 'un\\'ora',\n less: 'meno di',\n _in : 'Tra',\n isClosingOnDinner : 'chiude per pausa pranzo'\n },\n\n en: {\n pluralRules: function (n) { // (Number)\n if (n === 1) { // 1\n return 0;\n } else {\n return 1; //0, 2, 3, 4 ..\n }\n },\n\n btnBack: 'Back',\n btnFindWay: 'Get here',\n btnEntrance: 'Find entrance',\n linkReviews: ['review', 'reviews'],\n linkPhoto: ['photo', 'photos'],\n linkBooklet: 'About company',\n tommorow: 'tomorrow',\n afterTommorow: 'the day after tomorrow',\n afterWeek: 'in a week',\n nextSun: 'on Sunday',\n nextMon: 'on Monday',\n nextTue: 'on Tuesday',\n nextWed: 'on Wednesday',\n nextThu: 'on Thursday',\n nextFri: 'on Friday',\n nextSat: 'on Saturday',\n willOpen: 'opens ',\n willClose: 'closes',\n isOpen: 'Open',\n openTill: 'Open till ',\n closeIn: 'Closes in ',\n openAt: 'Opens at ',\n openIn: 'Opens in ',\n open: 'Opens ',\n nHours: ['hour', 'hours'],\n nMins: ['minute', 'minutes'],\n lunch: 'lunch break',\n Lunch: 'Lunch break. ',\n workingDays: 'Working days',\n weekdays: 'Weekdays',\n restDay: ['day off','days off'],\n reviewsOnFlamp: 'Reviews on Flamp',\n writeReviewOnFlamp: 'Write a review on Flamp',\n payment: 'payment',\n everyday: 'Daily from',\n worksAroundTheClock: 'Open 24 hours',\n aroundTheClock: '24h',\n knowMore: 'see also',\n toClose: 'until closing',\n monday: 'Monday',\n tuesday: 'Tuesday',\n wednesday: 'Wednesday',\n thursday: 'Thursday',\n friday: 'Friday',\n saturday: 'Saturday',\n sunday: 'Sunday',\n mon: 'Mon',\n tue: 'Tue',\n wed: 'Wed',\n thu: 'Thu',\n fri: 'Fri',\n sat: 'Sat',\n sun: 'Sun',\n toLunch: 'until lunch',\n today: 'Today',\n lessThenHour: 'less then one hour',\n youCouldLate: 'you might be late',\n workingTime: 'working hours',\n showAllOrgInRubric: 'Show all organizations in the category',\n todayIsRestDay: 'closed today',\n internet: 'Online',\n noncash: ' No-cash',\n goldcrown: 'Golden Crown',\n dinersclub: 'Diners Club',\n mastercard: 'Mastercard',\n maestrocard: 'MaestroCard',\n visa: 'Visa',\n cash: 'Cash',\n americanexpress: 'American Express',\n hour : 'hour',\n less: 'less',\n _in : 'In',\n isClosingOnDinner : 'will be closing for lunch'\n },\n\n cs: {\n pluralRules: function (n) { // (Number)\n return (n === 1) ? 0 : (n >= 2 && n <= 4) ? 1 : 2;\n },\n\n btnBack: 'ZpÄ›t',\n btnFindWay: 'Jet sem',\n btnEntrance: 'Hledat vstup',\n linkReviews: ['recenze', 'recenze', 'recenzÃ'],\n linkPhoto: ['fotografie', 'fotografie', 'fotografiÃ'],\n linkBooklet: 'Leták',\n tommorow: 'zÃtra',\n afterTommorow: 'pozÃtÅ™Ã',\n afterWeek: 'za týden',\n nextSun: 'v nedÄ›li',\n nextMon: 'v pondÄ›lÃ',\n nextTue: 'v úterý',\n nextWed: 've stÅ™edu',\n nextThu: 've Ätvrtek',\n nextFri: 'v pátek',\n nextSat: 'v sobotu',\n willOpen: 'otevÅ™e se',\n willClose: 'zavÅ™e se',\n isOpen: 'OtevÅ™eno',\n openTill: 'OtevÅ™eno do ',\n closeIn: 'ZavÅ™e se za ',\n openAt: 'OtevÅ™e se v ',\n openIn: 'OtevÅ™e se za ',\n open: 'OtevÅ™e se ',\n nHours: [ 'hodinu' , 'hodiny' , 'hodin' ],\n nMins: [ 'minutu' , 'minuty' , 'minut' ],\n lunch: 'polednà pÅ™estávka',\n Lunch: 'Polednà pÅ™estávka. ',\n workingDays: 'VÅ¡ednà dny',\n weekdays: 'VÅ¡ednà dny',\n restDay: ['zavÅ™eno', 'zavÅ™eno'],\n reviewsOnFlamp: 'Recenze na Flampu',\n writeReviewOnFlamp: 'Napsat recenzi na Flampu',\n payment: 'platba',\n everyday: 'DennÄ› od ',\n worksAroundTheClock: 'Pracuje nonstop',\n aroundTheClock: 'Nonstop',\n knowMore: 'dozvÄ›dÄ›t se vÃce',\n toClose: 'do uzavÅ™enÃ',\n monday: 'pondÄ›lÃ',\n tuesday: 'úterý',\n wednesday: 'stÅ™eda',\n thursday: 'Ätvrtek',\n friday: 'pátek',\n saturday: 'sobota',\n sunday: 'nedÄ›le',\n mon: 'po',\n tue: 'út',\n wed: 'st',\n thu: 'Ät',\n fri: 'pá',\n sat: 'so',\n sun: 'ne',\n toLunch: 'do polednà pÅ™estávky',\n today: 'Dnes',\n lessThenHour: 'ménÄ› než hodinu',\n youCouldLate: 'nemusÃte to stihnout',\n workingTime: 'pracovnà doba',\n showAllOrgInRubric: 'Zobrazit vÅ¡echny organizace v rubrice',\n todayIsRestDay: 'Dnes je zavÅ™eno',\n internet: 'Platba prostÅ™ednictvÃm Internetu',\n noncash: 'Bezhotovostnà platba',\n goldcrown: 'Zolotaja Korona',\n dinersclub: 'Diners Club',\n mastercard: 'Mastercard',\n maestrocard: 'MaestroCard',\n visa: 'Visa',\n cash: 'Platba hotovÄ›',\n americanexpress: 'American Express',\n hour : 'hodinu',\n less: 'ménÄ›',\n _in : 'Za',\n isClosingOnDinner : 'zaÄÃná polednà pÅ™estávka'\n },\n\n es: {\n pluralRules: function (n) { // (Number)\n return (n === 1) ? 0 : (n >= 2 && n <= 4) ? 1 : 2;\n },\n\n btnBack: 'Atrás',\n btnFindWay: 'Ir para allá',\n btnEntrance: 'Buscar acceso',\n linkReviews: ['comentario', 'comentarios', 'comentarios'],\n linkPhoto: ['foto', 'fotos', 'fotos'],\n linkBooklet: 'Folleto',\n tommorow: 'mañana',\n afterTommorow: 'pasado mañana',\n afterWeek: 'en una semana más',\n nextSun: 'el domingo',\n nextMon: 'el lunes',\n nextTue: 'el martes',\n nextWed: 'el miércoles',\n nextThu: 'el jueves',\n nextFri: 'el viernes',\n nextSat: 'el sábado',\n willOpen: 'se abrirá',\n willClose: 'se cerrará',\n isOpen: 'Abierto',\n openTill: 'Abierto hasta ',\n closeIn: 'Se cerrará dentro de ',\n openAt: 'Se abrirá el ',\n openIn: 'Se abrirá dentro de ',\n open: 'Se abrirá ',\n nHours: ['hora', 'horas', 'horas'],\n nMins: ['minuto', 'minutos', 'minutos'],\n lunch: 'hora de colación',\n Lunch: 'Hora de colación. ',\n workingDays: 'DÃas laborables',\n weekdays: 'DÃas laborables',\n restDay: ['cerrado','cerrado'],\n reviewsOnFlamp: 'Comentarios en Flamp',\n writeReviewOnFlamp: 'Escribir un comentario en Flamp',\n payment: 'pago',\n everyday: 'Cada dÃa desde',\n worksAroundTheClock: 'Abierto las 24 horas',\n aroundTheClock: '24 horas',\n knowMore: 'para saber más',\n toClose: 'hasta el cierre',\n monday: 'lunes',\n tuesday: 'martes',\n wednesday: 'miércoles',\n thursday: 'jueves',\n friday: 'viernes',\n saturday: 'sábado',\n sunday: 'domingo',\n mon: 'lun',\n tue: 'mar',\n wed: 'mié',\n thu: 'jue',\n fri: 'vie',\n sat: 'sáb',\n sun: 'dom',\n toLunch: 'antes de la hora de colación',\n today: 'Hoy',\n lessThenHour: 'menos de una hora',\n youCouldLate: 'puede ser que no alcanzas a llegar',\n workingTime: 'horario de trabajo',\n showAllOrgInRubric: 'Mostrar todas las empresas de la categorÃa',\n todayIsRestDay: 'Hoy cerrado',\n internet: 'Pago por Internet',\n noncash: 'Pago sin efectivo',\n goldcrown: 'Zolotaya Korona',\n dinersclub: 'Diners Club',\n mastercard: 'Mastercard',\n maestrocard: 'MaestroCard',\n visa: 'Visa',\n cash: 'Pago en efectivo',\n americanexpress: 'American Express',\n hour : 'hora',\n less: 'menos de',\n _in : 'Dentro de',\n isClosingOnDinner : 'se cierra por hora de colación'\n }\n};\n\nDG.Traffic = DG.TileLayer.extend({\n options: {\n period: 0,\n disableLabel: false,\n updateWhenIdle: false // display new traffic tiles on move for mobile\n },\n\n statics: {\n Dictionary: {}\n },\n\n initialize: function(options) {\n this._tileUrl = DG.config.protocol + (DG.Browser.retina ? DG.config.retinaTrafficTileServer : DG.config.trafficTileServer);\n this._metaUrl = DG.config.protocol + (DG.Browser.retina ? DG.config.retinaTrafficMetaServer : DG.config.trafficMetaServer);\n this._timeUrl = DG.config.protocol + DG.config.trafficTimestampServer;\n this._updateInterval = DG.config.trafficLayerUpdateInterval;\n\n this._layersOptions = {\n errorTileUrl: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n subdomains: '012345679',\n maxNativeZoom: 18,\n detectRetina: DG.config.detectRetina,\n minZoom: DG.config.trafficLayerMinZoom\n };\n\n options = DG.setOptions(this, DG.extend(options || {}, this._layersOptions));\n this._metaLayer = DG.Meta.layer(null, {\n detectRetina: options.detectRetina,\n maxNativeZoom: options.maxNativeZoom,\n dataFilter: DG.bind(this._processData, this),\n minZoom: options.minZoom\n });\n this._isDg = true;\n this._isOnRequest = false; // timestampString request flag\n this._onTimer = DG.bind(this._onTimer, this);\n DG.TileLayer.prototype.initialize.call(this, this._tileUrl, options);\n },\n\n // #setTime(day [0-6], time[0-23]) ????\n\n onAdd: function(map) {\n this._initContainer();\n this._levels = {};\n this._tiles = {};\n\n if (this.options.period) {\n this.options.timestampString = '';\n this._onAddSetParams(map);\n } else {\n var self = this;\n this._isOnRequest = true;\n this._getTimestampString()\n .then(\n function(response) {\n self.options.timestampString = '?' + response;\n },\n function() {\n self.options.timestampString = '?' + (new Date()).getTime();\n })\n .then(\n function() {\n self._isOnRequest = false;\n if (self._map) { // if traffic layer has not been removed from map before server response and timestampString variable is assigned\n self._onAddSetParams(map);\n }\n }\n );\n }\n },\n\n onRemove: function(map) {\n if (!this._isOnRequest) {\n clearInterval(this._updateTimer);\n\n map\n .removeLayer(this._metaLayer)\n .off('projectchange projectleave', this._onMapProjectChange, this);\n\n if (!this.options.disableLabel) {\n this._metaLayer.off(this._layerEventsListeners, this);\n this._map.removeLayer(this._labelHelper);\n this._labelHelper = null;\n this._map.off('langchange', this._updateLang, this);\n }\n\n DG.TileLayer.prototype.onRemove.call(this, map);\n } else {\n L.DomUtil.remove(this._container);\n map._removeZoomLimit(this);\n this._container = null;\n }\n },\n\n update: function() {\n var self = this;\n this._getTimestampString().then(\n function(response) {\n self.options.timestampString = '?' + response;\n },\n function() {\n self.options.timestampString = '?' + (new Date()).getTime();\n }).then(\n function() {\n self.fire('update', {timestamp: self.options.timestampString});\n self._layerEventsListeners.mouseout.call(self);\n self._metaLayer.getOrigin().setURL(self._prepareMetaURL(), self);\n self.redraw();\n }\n );\n },\n\n getSubdomain: function() {\n return this._layersOptions.subdomains[\n Math.floor(Math.random() * this._layersOptions.subdomains.length)\n ];\n },\n\n _updateLang: function() {\n var lang = this._map.getLang();\n if (lang === 'ar') {\n this._labelHelper.options.textDirection = 'rtl';\n } else {\n this._labelHelper.options.textDirection = 'auto';\n }\n },\n\n _getTimestampString: function() {\n return DG.ajax(\n DG.Util.template(\n this._timeUrl,\n DG.extend({\n s : this.getSubdomain(),\n projectCode: this._map.projectDetector.getProject().code\n }, this.options || {})),\n {type: 'get'}\n );\n },\n\n _onTimer: function() {\n if (this.options.period === 0) {\n this.update();\n }\n },\n\n _processData: function(trafficData, coord) {\n var tileOriginPoint = coord.scaleBy(this.getTileSize());\n var polygonLngLatToPoints = DG.bind(this._polygonLngLatToPoints, this, tileOriginPoint);\n var hints = {};\n\n if (!DG.Util.isArray(trafficData)) { // TODO remove\n return [];\n }\n\n trafficData[1].forEach(function(item) {\n this[item.graph_id] = item.speed_text;\n }, hints);\n\n return trafficData[0]\n .map(function(item) {\n return {\n id: item.graph_id,\n speed: hints[item.graph_id],\n geometry: DG.Wkt.toGeoJSON(item.geometry[0].object[0])\n };\n })\n .filter(function(item) {\n return item.geometry.type == 'Polygon' ||\n item.geometry.type == 'MultiPolygon';\n })\n .map(function(item) {\n var geoJson = item.geometry;\n\n if (geoJson.type == 'Polygon') {\n geoJson.coordinates = polygonLngLatToPoints(geoJson.coordinates);\n } else if (geoJson.type == 'MultiPolygon') {\n geoJson.coordinates = geoJson.coordinates.map(polygonLngLatToPoints);\n }\n\n return item;\n });\n },\n\n _polygonLngLatToPoints: function(originPoint, polygon) {\n var map = this._map;\n\n return polygon.map(function(contour) {\n return contour.map(function(lngLat) {\n return map\n .project([lngLat[1], lngLat[0]]).round()\n .subtract(originPoint);\n });\n });\n },\n\n _prepareMetaURL: function() {\n return DG.Util.template(this._metaUrl, DG.extend({\n x: '{x}',\n y: '{y}',\n z: '{z}',\n s: '{s}'\n }, this.options));\n },\n\n _updateLayerProject: function() {\n var project = this._map.projectDetector.getProject();\n DG.setOptions(this, project && project.traffic ? {\n projectCode: project.code,\n bounds: project.latLngBounds,\n minZoom: Math.max(project.minZoom, this._layersOptions.minZoom),\n maxZoom: project.maxZoom\n } : {\n maxZoom: project ? project.maxZoom : DG.config.projectLeaveMaxZoom,\n minZoom: 0\n });\n this._metaLayer.getOrigin().setURL(this._prepareMetaURL());\n },\n\n _onMapProjectChange: function() {\n this._updateLayerProject();\n this.redraw();\n },\n\n _layerEventsListeners: {\n mouseover: function(e) { // (Object)\n this._setCursor('pointer');\n if (this._labelHelper && e.meta.speed) {\n this._labelHelper\n .setPosition(e.latlng)\n .setContent(e.meta.speed + ' ' + this.t('speed_unit_km_h'))\n .addTo(this._map);\n }\n },\n mouseout: function() {\n this._setCursor('');\n if (this._labelHelper) {\n this._map.removeLayer(this._labelHelper);\n }\n },\n mousemove: function(e) {\n if (this._labelHelper) {\n this._labelHelper.setPosition(e.latlng);\n }\n }\n },\n\n _setCursor: function(cursor) { // (String)\n this._map.getContainer().style.cursor = cursor;\n },\n\n _onAddSetParams: function(map) {\n this._updateLayerProject();\n\n map\n .addLayer(this._metaLayer)\n .on('projectchange projectleave', this._onMapProjectChange, this);\n\n if (!this.options.disableLabel) {\n this._metaLayer.on(this._layerEventsListeners, this);\n this._labelHelper = DG.label();\n this._map.on('langchange', this._updateLang, this);\n }\n\n if (this._updateInterval) {\n this._updateTimer = setInterval(this._onTimer, this._updateInterval);\n }\n\n this._resetView();\n this._update();\n },\n\n _update: function(center) {\n if (!this._isOnRequest) {\n DG.TileLayer.prototype._update.call(this, center);\n }\n }\n\n});\n\nDG.Traffic.include(DG.Locale);\n\nDG.traffic = function(options) { // (Object)\n return new DG.Traffic(options);\n};\n\nDG.Traffic.Dictionary.ru = {\n speed_unit_km_h: 'км/ч'\n};\n\nDG.Traffic.Dictionary.it = {\n speed_unit_km_h: 'km/h'\n};\n\nDG.Traffic.Dictionary.cs = {\n speed_unit_km_h: 'km/h'\n};\n\nDG.Traffic.Dictionary.es = {\n speed_unit_km_h: 'km/h'\n};\n\nDG.Traffic.Dictionary.en = {\n speed_unit_km_h: 'km/h'\n};\n\nDG.Traffic.Dictionary.ar = {\n speed_unit_km_h: 'كم/ساعة'\n};\n\nDG.Control.Traffic = DG.RoundControl.extend({\n options: {\n position: 'topright',\n iconClass: 'traffic'\n },\n\n statics: {\n Dictionary: {}\n },\n\n initialize: function(options) {\n this._trafficClass = 'dg-traffic-control';\n this._controlHideClass = 'dg-control-round_is-hidden_true';\n\n DG.setOptions(this, options);\n DG.extend(this, {\n _active: false,\n _trafficLayer: null\n }).on(this._controlEvents, this);\n },\n\n _controlEvents: {\n add: function() {\n this._trafficLayer = DG.traffic();\n this._map.on('zoomend projectchange projectleave', this._updateControlVisibility, this);\n },\n click: function() {\n this._active = !this._active;\n\n if (this._active) {\n this.setState('active');\n this._showTraffic();\n } else {\n this.setState('');\n this._hideTraffic();\n }\n },\n remove: function() {\n this.off(this._controlEvents, this);\n this._map.off('zoomend projectchange projectleave', this._updateControlVisibility, this);\n if (this._active) {\n this._map.removeLayer(this._trafficLayer);\n this._active = false;\n }\n this._trafficLayer = null;\n }\n },\n\n _showTraffic: function() { // ()\n this._updateTrafficScore();\n this._map.addLayer(this._trafficLayer);\n },\n\n _hideTraffic: function() { // ()\n this._handleDom('remove');\n this._map.removeLayer(this._trafficLayer);\n },\n\n _handleDom: function(method, score) {\n var a = this._link;\n\n a.innerHTML = isNaN(score) ? '' : score;\n DG.DomUtil[method + 'Class'](a, this._trafficClass);\n DG.DomUtil[method + 'Class'](a, this._trafficClass + '_color_' + this._scoreRate);\n },\n\n _getTrafficColor: function(score) { // (Number) -> String\n var result = 'green';\n\n if (score > 7) {\n result = 'red';\n } else if (score > 4) {\n result = 'yellow';\n }\n\n return result;\n },\n\n _updateControlVisibility: function() {\n var project = this._map.projectDetector.getProject(),\n projectHasTraffic = project && project.traffic,\n method = ((this._map.getZoom() < DG.config.trafficLayerMinZoom) ||\n (!projectHasTraffic)) ? 'addClass' : 'removeClass';\n\n DG.DomUtil[method](this._container, this._controlHideClass);\n if (this._active && projectHasTraffic) {\n this._updateTrafficScore();\n }\n },\n\n _updateTrafficScore: function() {\n var self = this;\n\n this._getTrafficScore().then(function(score) {\n score = parseInt(score, 10); // sometimes webapi returns something like '5,+'\n\n self._scoreRate = self._getTrafficColor(score);\n self._handleDom('add', score);\n });\n },\n\n _getTrafficScore: function() { // () -> Promise\n var url = DG.Util.template(\n DG.config.protocol + DG.config.trafficScoreServer,\n {\n s: this._trafficLayer.getSubdomain(),\n projectCode: this._map.projectDetector.getProject().code\n }\n );\n\n return DG.ajax(url, {type: 'get'});\n },\n\n _renderTranslation: function() { // ()\n this._link.title = this.t('button_title');\n }\n});\n\nDG.control.traffic = function(options) {\n return new DG.Control.Traffic(options);\n};\n\nDG.Map.mergeOptions({\n trafficControl: false\n});\n\nDG.Map.addInitHook(function() {\n if (this.options.trafficControl) {\n this.trafficControl = DG.control.traffic(this.options.trafficControl);\n this.addControl(this.trafficControl);\n }\n});\n\nDG.Control.Traffic.Dictionary.ru = {\n button_title: 'Пробки'\n};\n\nDG.Control.Traffic.Dictionary.it = {\n button_title: 'Colonna'\n};\n\nDG.Control.Traffic.Dictionary.cs = {\n button_title: 'Zácpy'\n};\n\nDG.Control.Traffic.Dictionary.es = {\n button_title: 'Taco'\n};\n\nDG.Control.Traffic.Dictionary.en = {\n button_title: 'Traffic'\n};\n\nDG.Control.Traffic.Dictionary.ar = {\n button_title: 'Øركة السير'\n};\n\nDG.Ruler = DG.Layer.extend({\n\n options: {\n editable: true\n },\n\n includes: [DG.Locale],\n\n statics: {\n Dictionary: {}\n },\n\n initialize: function(latlngs, options) { // (Array, Object)\n DG.Util.setOptions(this, options);\n\n this._layers = {\n back : null,\n middle : null,\n front : null,\n mouse : null\n };\n this._points = [];\n\n this._layersContainer = DG.featureGroup();\n Object.keys(this._layers).forEach(function(name) {\n this._layersContainer.addLayer(this._layers[name] = DG.featureGroup());\n }, this);\n\n this._reset();\n\n if (DG.Browser.mobile) {\n delete this._lineMouseEvents.mouseover;\n delete this._lineMouseEvents.mouseout;\n delete this._lineMouseEvents.mousemove;\n } else {\n delete this._lineMouseEvents.click;\n }\n\n if (latlngs && latlngs.length) {\n this.setLatLngs(latlngs);\n }\n },\n\n onAdd: function(map) { // (Map)\n this._map = map.on('langchange', this._updateDistance, this);\n\n // Pane for ruler Markers\n if (!this._map.getPane('rulerMarkerPane')) {\n this._map.createPane('rulerMarkerPane');\n }\n\n // Main ruler pane (svg objects and runner)\n if (!this._map.getPane('rulerPane')) {\n this._map.createPane('rulerPane');\n }\n\n this._layersContainer.addTo(this._map);\n\n if (this._points.length) {\n this._layers.mouse.fire('layeradd');\n this._updateDistance();\n }\n\n this._layers.mouse.on(this._lineMouseEvents, this);\n },\n\n onRemove: function(map) { // (Map)\n map\n .off('langchange', this._updateDistance, this)\n .removeLayer(this._layersContainer);\n\n this._layers.mouse.off(this._lineMouseEvents, this);\n this._reset();\n },\n\n getTotalDistance: function() { // () -> Number\n return this._calcDistance();\n },\n\n spliceLatLngs: function(index) { // (Number, Number, args ...) -> Array\n var oldLength = this._points.length,\n mutationStart = index >= 0 ? Math.min(index, oldLength) : oldLength - index,\n removed = Array.prototype.splice.apply(this._points, arguments).map(function(point) {\n this._layers.mouse.removeLayer(point);\n return point.off().getLatLng();\n }, this),\n length = this._points.length;\n\n if (length) {\n for (var i = mutationStart; i < length; i++) {\n if (!(this._points[i] instanceof DG.Ruler.LayeredMarker)) {\n this._points[i] = this._createPoint(this._points[i], this.options.iconStyles.large)\n .on(this._pointEvents, this)\n .once('add', this._addCloseHandler, this)\n .addTo(this._layers.mouse, this._layers);\n }\n if (i && !this._points[i - 1]._legs) {\n this._addLegs(this._points[i - 1]);\n }\n this._points[i].setPointStyle(this.options.iconStyles[i && i < length - 1 ? 'small' : 'large']);\n this._points[i]._pos = i;\n }\n this._removeLegs(this._points[length - 1]);\n if (oldLength > 0 && oldLength < length) {\n this._points[oldLength - 1].collapse();\n }\n if (this._points[mutationStart]) {\n this._updateLegs(this._points[mutationStart]);\n }\n if (mutationStart > 1) {\n this._points[mutationStart - 1].setPointStyle(this.options.iconStyles.small);\n }\n this._updateDistance();\n this._normalizeRulerPoints();\n }\n if (DG.Browser.touch && this._lineMarkerHelper) {\n this._lineMarkerHelper.collapse();\n }\n this._fireChangeEvent();\n return removed;\n },\n\n addLatLng: function(latlng) { // (LatLng) -> Ruler\n var lastPoint = this._points[this._points.length - 1] || null;\n latlng = DG.latLng(latlng);\n\n if (lastPoint) {\n latlng = this._normalizeLatLng(latlng, lastPoint.getLatLng());\n }\n\n this.spliceLatLngs(this._points.length, 0, latlng);\n return this;\n },\n\n getLatLngs: function() { // () -> Array\n return this._points.map(function(point) {\n return point.getLatLng();\n });\n },\n\n setLatLngs: function(latlngs) { // (Array) -> Ruler\n var args = latlngs.slice();\n args.unshift(0, this._points.length);\n this.spliceLatLngs.apply(this, args);\n return this;\n },\n\n _reset: function() { // ()\n DG.extend(this, {\n _lineMarkerHelper: null,\n _morphingNow: false\n });\n },\n\n _lineMouseEvents: {\n click: function(event) {\n var target = event.layer;\n if (target instanceof DG.Marker && target._pos !== this._points.length - 1) {\n if (this._lineMarkerHelper) {\n this._lineMarkerHelper.collapse();\n }\n target.setText(this._getFormatedDistance(target));\n this._lineMarkerHelper = target;\n } else if (target instanceof DG.Path && this.options.editable) {\n var latlng = event.latlng,\n insertPos = target._point._pos + 1;\n this.spliceLatLngs(insertPos, 0, latlng);\n }\n },\n mouseover: function(event) { // (MouseEvent)\n var target = event.layer;\n\n target._hovered = true;\n if (this._morphingNow) {\n return;\n }\n if (target instanceof DG.Marker && target._pos !== this._points.length - 1) {\n target.setText(this._getFormatedDistance(target));\n } else if (target instanceof DG.Path && !this._lineMarkerHelper) {\n var point = target._point;\n\n this._lineMarkerHelper = this._addRunningLabel(\n this._nearestPoint(point._legs.middle, event.latlng),\n point\n );\n }\n },\n mouseout: function(event) { // (MouseEvent)\n var target = event.layer,\n originalEv = event.originalEvent;\n\n target._hovered = false;\n if (this._morphingNow || target._pos === this._points.length - 1) {\n return;\n }\n if (target instanceof DG.Marker) {\n // collapse only when we move out from label container (if browser support relatedTarget)\n if (!originalEv.relatedTarget ||\n (originalEv.relatedTarget !== target.querySelector('container') &&\n originalEv.relatedTarget.parentNode !== target.querySelector('container'))) {\n target.collapse();\n }\n } else {\n this._removeRunningLabel();\n }\n },\n mousemove: function(event) { // (MouseEvent)\n if (this._morphingNow || !this._lineMarkerHelper) {\n return;\n }\n\n var point = event.layer._point,\n latlng = this._nearestPoint(point._legs.middle, event.latlng);\n\n this._lineMarkerHelper\n .setLatLng(latlng)\n .setText(this._getFormatedDistance(point, point.getLatLng().distanceTo(latlng)));\n },\n layeradd: function() { // ()\n Object.keys(this._layers).forEach(function(name) {\n this._layers[name].bringToFront();\n }, this);\n }\n },\n\n _fireChangeEvent: function() {\n this.fire('changed', {latlngs : this.getLatLngs()});\n },\n\n _addRunningLabel: function(latlng, previousPoint) { // (LatLng, Ruler.LayeredMarker)\n var point = this._createPoint(latlng).addTo(this._layers.mouse, this._layers);\n var pane = this._map.getPane('rulerPane');\n pane.insertBefore(point._icon, pane.lastElementChild);\n return point.setText(this._getFormatedDistance(previousPoint, previousPoint.getLatLng().distanceTo(latlng)));\n },\n\n _removeRunningLabel: function() { // ()\n if (this._lineMarkerHelper) {\n this._layers.mouse.removeLayer(this._lineMarkerHelper);\n this._lineMarkerHelper = null;\n }\n },\n\n _insertPointInLine: function(event) { // (MouseEvent)\n var latlng = this._lineMarkerHelper.getLatLng(),\n insertPos = event.target._point._pos + 1,\n point;\n\n if (L.Browser.ie) {\n var path = event.originalEvent.target || event.originalEvent.srcElement,\n parent = path.parentNode;\n parent.appendChild(path); // IE click event leaking problem solution: we reappend mousedown event target element\n }\n\n L.DomEvent.stopPropagation(event.originalEvent);\n\n this.spliceLatLngs(insertPos, 0, latlng);\n point = this._points[insertPos];\n point.setText(this._getFormatedDistance(point));\n\n setTimeout(function() {\n if (document.createEvent) {\n var e = document.createEvent('MouseEvents');\n e.initMouseEvent('mouseup', false, false, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 1, point._icon);\n document.dispatchEvent(e);\n\n e = document.createEvent('MouseEvents');\n e.initMouseEvent('mousedown', false, false, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 1, point._icon);\n point._icon.dispatchEvent(e);\n } else {\n point._icon.fireEvent('onMouseUp', DG.extend(document.createEventObject(), {\n button: 1,\n bubbles: false,\n cancelable: false\n }));\n point._icon.fireEvent('onMouseDown', DG.extend(document.createEventObject(), {\n button: 1,\n bubbles: false,\n cancelable: false\n }));\n }\n }, 0);\n\n this._removeRunningLabel();\n\n this._updateLegs(point);\n },\n\n // Find the point on given polyline which is closest to given latlng\n _nearestPoint: function(polyline, latlng) { // (Polyline, LatLng) -> LatLng\n var self = this;\n\n // Convert everything to pixel coordinates\n var point = this._project(latlng);\n var linePoints = polyline.getLatLngs().map(function(latlng) {\n return self._project(latlng);\n });\n\n // First look for closest polyline segment\n var minDistance;\n var closestSegmentIndex;\n for (var i = 0; i < linePoints.length - 1; i++) {\n var distance = DG.LineUtil.pointToSegmentDistance(\n point,\n linePoints[i],\n linePoints[i + 1]\n );\n\n if (minDistance === undefined || distance < minDistance) {\n minDistance = distance;\n closestSegmentIndex = i;\n }\n }\n\n // Then look for closest point on that segment\n var closestPoint = DG.LineUtil.closestPointOnSegment(\n point,\n linePoints[closestSegmentIndex],\n linePoints[closestSegmentIndex + 1]\n );\n\n // Convert back to LatLng\n return this._unproject(closestPoint);\n },\n\n _addCloseHandler: function(event) { // (Event)\n event.target\n .on('click', this._deletePoint, this)\n .querySelector('remove-link').style.display = 'inline-block';\n },\n\n _createPoint: function(latlng, style) { // (LatLng, Object) -> Ruler.LayeredMarker\n var pointStyle = style ? style : this.options.iconStyles.large,\n layers = {};\n Object.keys(pointStyle).forEach(function(layer) {\n layers[layer] = DG.circleMarker(latlng, pointStyle[layer]);\n });\n\n return DG.Ruler.layeredMarker(latlng, {\n layers : layers,\n draggable : this.options.editable,\n textDirection: this._map.getLang() !== 'ar' ? 'auto' : 'rtl'\n });\n },\n\n // Moves curr LatLng to correct world if necessary so that ruler section\n // between curr and base can be plotted correctly. Returns a new LatLng\n // object.\n _normalizeLatLng: function(curr, base) { // (LatLng, LatLng) -> LatLng\n var diff = (curr.lng < base.lng) ? 360 : -360;\n\n var newLng = curr.lng;\n while (Math.abs(newLng - base.lng) > 180) {\n newLng += diff;\n }\n\n return DG.latLng(curr.lat, newLng);\n },\n\n // Rearranges ruler points between worlds based on point param so that all\n // ruler sections can be plotted correctly.\n _normalizeRulerPoints: function(point) { // (Ruler.LayeredMarker)\n point = point || this._points[0];\n\n var self = this;\n var position = point._pos;\n var changedPoints = [];\n var i, currPoint, prevPoint, latlng, normalized;\n\n // Check points to the right\n for (i = position + 1; i < this._points.length; i++) {\n currPoint = this._points[i];\n prevPoint = this._points[i - 1];\n\n latlng = currPoint.getLatLng();\n normalized = this._normalizeLatLng(latlng, prevPoint.getLatLng());\n\n if (!normalized.equals(latlng)) {\n currPoint.setLatLng(normalized);\n changedPoints.push(i);\n }\n }\n\n // Check points to the left\n for (i = position - 1; i >= 0; i--) {\n currPoint = this._points[i];\n prevPoint = this._points[i + 1];\n\n latlng = currPoint.getLatLng();\n normalized = this._normalizeLatLng(latlng, prevPoint.getLatLng());\n\n if (!normalized.equals(latlng)) {\n currPoint.setLatLng(normalized);\n changedPoints.push(i);\n }\n }\n\n // Update legs of all points that changed position\n changedPoints.sort().reduce(function(previous, current) {\n var skipPrevious = previous && previous === current - 1;\n\n self._updateLegs(self._points[current], skipPrevious);\n\n return current;\n }, null);\n },\n\n _pointEvents: {\n drag: function(event) { // (Event)\n var point = event.target;\n\n this._normalizeRulerPoints(point);\n\n if (!DG.Browser.touch && point !== this._points[this._points.length - 1]) {\n point.setText(this._getFormatedDistance(point));\n }\n\n this._updateLegs(point);\n this._updateDistance();\n },\n dragend: function(event) { // (Event)\n var point = event.target;\n this._morphingNow = false;\n if (!point._hovered && point !== this._points[this._points.length - 1]) {\n point.collapse();\n }\n this._fireChangeEvent();\n },\n dragstart: function() { // ()\n if (DG.Browser.touch && this._lineMarkerHelper) {\n this._lineMarkerHelper.collapse();\n }\n this._morphingNow = true;\n }\n },\n\n _deletePoint: function(event) { // (MouseEvent)\n var originalEvent = event.originalEvent,\n target = originalEvent.target || originalEvent.srcElement;\n\n if (target.className !== 'dg-ruler__label-remove-link' &&\n target.className !== 'dg-ruler__remove-link-overlay') {\n return;\n }\n DG.DomEvent.stop(event.originalEvent);\n this.spliceLatLngs(event.target._pos, 1);\n },\n\n _degToRad: function(deg) {\n return (Math.PI / 180) * deg;\n },\n\n _radToDeg: function(rad) {\n return (180 / Math.PI) * rad;\n },\n\n // Map-independent project method\n _project: function(latlng) {\n if (this._map) {\n return this._map.project(latlng);\n }\n\n return DG.CRS.EPSG3857.latLngToPoint(latlng, 1);\n },\n\n // Map-independent unproject method\n _unproject: function(point) {\n if (this._map) {\n return this._map.unproject(point);\n }\n\n return DG.CRS.EPSG3857.pointToLatLng(point, 1);\n },\n\n // Calculates the size of angle point1-point-point2\n _calcAngle: function(point, point1, point2) { // (LatLng, LatLng, LatLng) -> Number\n point1 = this._normalizeLatLng(point1, point);\n point2 = this._normalizeLatLng(point2, point);\n\n point = this._project(point);\n point1 = this._project(point1);\n point2 = this._project(point2);\n\n var x1 = point1.x - point.x;\n var x2 = point2.x - point.x;\n var y1 = point1.y - point.y;\n var y2 = point2.y - point.y;\n\n var dotProduct = x1 * x2 + y1 * y2;\n var mag1 = Math.sqrt(x1 * x1 + y1 * y1);\n var mag2 = Math.sqrt(x2 * x2 + y2 * y2);\n\n return Math.acos(dotProduct / (mag1 * mag2));\n },\n\n // Calculates the midpoint on the great circle between two LatLngs\n _calcMidPoint: function(latlng1, latlng2) { // (LatLng, LatLng) -> LatLng\n var lon1 = this._degToRad(latlng1.lng);\n var lat1 = this._degToRad(latlng1.lat);\n\n var lon2 = this._degToRad(latlng2.lng);\n var lat2 = this._degToRad(latlng2.lat);\n\n // Based on formulae from\n // http://williams.best.vwh.net/avform.htm#Intermediate\n var d = Math.acos(Math.sin(lat1) * Math.sin(lat2) +\n Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));\n\n // Split the arc in half\n var f = 0.5;\n\n var A = Math.sin((1 - f) * d) / Math.sin(d);\n var B = Math.sin(f * d) / Math.sin(d);\n\n var x = A * Math.cos(lat1) * Math.cos(lon1) +\n B * Math.cos(lat2) * Math.cos(lon2);\n\n var y = A * Math.cos(lat1) * Math.sin(lon1) +\n B * Math.cos(lat2) * Math.sin(lon2);\n\n var z = A * Math.sin(lat1) + B * Math.sin(lat2);\n\n var lat = Math.atan2(z, Math.sqrt(x * x + y * y));\n var lon = Math.atan2(y, x);\n\n return DG.latLng(this._radToDeg(lat), this._radToDeg(lon));\n },\n\n // Adaptive sampling algorithm based on\n // http://ariel.chronotext.org/dd/defigueiredo93adaptive.pdf\n _adaptiveSample: function(left, right, depth, middle) { // (LatLng, LatLng, Number[, LatLng]) -> LatLng[]\n if (depth > 9) {\n // Max recursion depth reached\n return [];\n }\n\n middle = middle || this._calcMidPoint(left, right);\n\n var leftMiddle = this._calcMidPoint(left, middle);\n var rightMiddle = this._calcMidPoint(middle, right);\n\n var angle1 = this._calcAngle(leftMiddle, middle, left);\n var angle2 = this._calcAngle(middle, left, right);\n var angle3 = this._calcAngle(rightMiddle, middle, right);\n\n // left --- leftMiddle --- middle --- rightMiddle --- right\n // angle1 angle2 angle3\n\n var minAngle = 3.1;\n if (angle1 > minAngle && angle2 > minAngle && angle3 > minAngle) {\n // This section is straight enough, no intermediate points needed.\n return [];\n } else {\n // Angles are too small. Recursively sample halves of this section.\n var result = [];\n result = result.concat(this._adaptiveSample(left, middle, depth + 1, leftMiddle));\n result.push(middle);\n result = result.concat(this._adaptiveSample(middle, right, depth + 1, rightMiddle));\n\n return result;\n }\n },\n\n // Calculates the great circle arc between two LatLngs.\n _calcGreatCircle: function(latlng1, latlng2) { // (LatLng, LatLng) -> LatLng[]\n latlng2 = this._normalizeLatLng(latlng2, latlng1);\n\n // Special case: points are close to each other (within 1 degree)\n if (latlng1.equals(latlng2, 1)) {\n return [latlng1, latlng2];\n }\n\n // Special case: the great circle crosses a pole\n if (Math.abs(latlng2.lng - latlng1.lng) == 180) {\n // North or south pole?\n var latitude = (latlng1.lat + latlng2.lat > 0) ? 90 : -90;\n\n return [\n latlng1,\n DG.latLng(latitude, latlng1.lng),\n DG.latLng(latitude, latlng2.lng),\n latlng2\n ];\n }\n\n var result = [];\n\n result.push(latlng1);\n result = result.concat(this._adaptiveSample(latlng1, latlng2, 0));\n result.push(latlng2);\n\n // Make sure the arc doesn't jump between worlds\n for (var i = 1; i < result.length; i++) {\n result[i] = this._normalizeLatLng(result[i], result[i - 1]);\n }\n\n return result;\n },\n\n _addLegs: function(point) {\n var pathStyles = this.options.pathStyles;\n\n var greatCirclePoints = this._calcGreatCircle(\n point.getLatLng(),\n this._points[point._pos + 1].getLatLng()\n );\n\n point._legs = {};\n Object.keys(pathStyles).forEach(function(layer) {\n point._legs[layer] = DG.polyline(greatCirclePoints, pathStyles[layer]).addTo(this._layers[layer]);\n }, this);\n\n point._legs.mouse._point = point.once('remove', this._clearRemovingPointLegs, this);\n\n if (this.options.editable && !DG.Browser.mobile) {\n point._legs.mouse.on('mousedown', this._insertPointInLine, this);\n }\n\n if (this._map) {\n this._layers.mouse.addLayer(point._legs.mouse);\n }\n },\n\n _clearRemovingPointLegs: function(event) { // (Event)\n this._removeLegs(event.target);\n },\n\n _removeLegs: function(point) { // (Ruler.LayeredMarker)\n if (point._legs) {\n Object.keys(point._legs).forEach(function(layer) {\n this._layers[layer].removeLayer(point._legs[layer]);\n }, this);\n point._legs = null;\n }\n },\n\n _updateLegs: function(point, skipPrevious) { // (Ruler.LayeredMarker, Boolean)\n var latlng = point.getLatLng(),\n previousPoint = this._points[point._pos - 1],\n nextPoint = this._points[point._pos + 1],\n self = this,\n newPoints;\n\n if (previousPoint && !skipPrevious) {\n newPoints = self._calcGreatCircle(previousPoint.getLatLng(), latlng);\n\n Object.keys(previousPoint._legs).forEach(function(layer) {\n previousPoint._legs[layer].setLatLngs(newPoints);\n });\n }\n\n if (nextPoint) {\n newPoints = self._calcGreatCircle(latlng, nextPoint.getLatLng());\n\n Object.keys(point._legs).forEach(function(layer) {\n point._legs[layer].setLatLngs(newPoints);\n });\n }\n },\n\n _calcDistance: function(finishPoint, tail) { // (Ruler.LayeredMarker, Number) -> Number\n var distance = tail ? tail : 0,\n calcTo = finishPoint ? finishPoint._pos : this._points.length - 1;\n\n for (var i = 0; i < calcTo; i++) {\n distance += this._points[i].getLatLng().distanceTo(this._points[i + 1].getLatLng());\n }\n\n return distance;\n },\n\n _getFormatedDistance: function() { // () -> String\n var distance = this._calcDistance.apply(this, arguments),\n units = 'm';\n\n if (distance > 1000) {\n distance /= 1000;\n units = 'km';\n if (distance > 1000) {\n distance = distance.toFixed();\n distance = distance.slice(0, -3) + ' ' + distance.slice(-3);\n } else {\n distance = distance.toFixed(2).split('.').join(this.t('delimiter'));\n }\n } else {\n distance = Math.round(distance);\n }\n\n return [distance || 0, ' ', this.t(units)].join('');\n },\n\n _updateDistance: function() { // ()\n if (this._map && this._points.length) {\n this._points[this._points.length - 1].setText(this._getFormatedDistance());\n }\n }\n});\n\nDG.ruler = function(latlngs, options) { // (Array, Object)\n return new DG.Ruler(latlngs, options);\n};\n\nDG.Ruler.LayeredMarker = DG.Marker.extend({\n options: {\n draggable: false,\n keyboard: false,\n riseOnHover: true,\n pane: 'rulerMarkerPane',\n textDirection: 'auto', // 'auto' | 'ltr' | 'rtl'\n iconHTML: [\n '<img class=\"dg-ruler__label-spacer\" src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" width=\"26\" height=\"26\" />',\n '<div class=\"dg-ruler__label-container\">',\n ' <div class=\"dg-ruler__point\"></div>',\n ' <span class=\"dg-ruler__label-distance\">0 км</span>',\n ' <span class=\"dg-ruler__label-remove-link\"></span>',\n ' <div class=\"dg-ruler__remove-link-overlay\"></div>',\n '</div>'\n ].join('\\n')\n },\n\n statics: {\n domClass : 'dg-ruler__label'\n },\n\n addTo : function(map, layers) {\n Object.keys(this._layers).forEach(function(name) {\n layers[name].addLayer(this._layers[name]);\n }, this);\n\n this._viewport = layers;\n return DG.Marker.prototype.addTo.call(this.on('move', this._onMove), map);\n },\n\n onRemove : function(map) {\n Object.keys(this._layers).forEach(function(name) {\n this._viewport[name].removeLayer(this._layers[name]);\n }, this);\n this.off('move', this._onMove);\n this._viewport = null;\n this._style = null;\n return DG.Marker.prototype.onRemove.call(this, map);\n },\n\n setText : function(text) {\n if (this._iconCollapsed) {\n this.expand();\n }\n this._iconNodes.label.innerHTML = text;\n this._iconNodes.label.setAttribute('dir', this.options.textDirection);\n return this;\n },\n\n setPointStyle : function(style) {\n if (this._style !== style) {\n Object.keys(this._style = style).forEach(function(name) {\n this._layers[name].setStyle(style[name]);\n }, this);\n }\n return this;\n },\n\n expand : function() {\n this._iconCollapsed = false;\n this._iconNodes.container.style.display = 'block';\n this._iconNodes.spacer.style.display = 'none';\n return this;\n },\n\n collapse : function() {\n this._iconCollapsed = true;\n this._iconNodes.container.style.display = 'none';\n this._iconNodes.spacer.style.display = 'block';\n return this;\n },\n\n querySelector : function(selector) {\n return this._icon.querySelector('.' + DG.Ruler.LayeredMarker.domClass + '-' + selector);\n },\n\n _onMove : function(event) {\n var latlng = event.latlng;\n Object.keys(this._layers).forEach(function(name) {\n this._layers[name].setLatLng(latlng);\n }, this);\n },\n\n _initIcon : function() {\n DG.Marker.prototype._initIcon.call(this);\n this._iconCollapsed = true;\n this._icon.style.width = '';\n this._iconNodes = {\n label : this.querySelector('distance'),\n spacer : this.querySelector('spacer'),\n container : this.querySelector('container')\n };\n },\n\n // don't change icon zIndex\n _setPos: function(pos) {\n L.DomUtil.setPosition(this._icon, pos);\n\n if (this._shadow) {\n L.DomUtil.setPosition(this._shadow, pos);\n }\n },\n\n _afterInit : function() {\n this._layers = this.options.layers || null;\n this.options.icon = DG.divIcon({\n className: DG.Ruler.LayeredMarker.domClass,\n iconSize: [26, 26],\n iconAnchor: [13, 13],\n html: this.options.iconHTML\n });\n }\n\n});\n\nDG.Ruler.LayeredMarker.addInitHook('_afterInit');\n\nDG.Ruler.layeredMarker = function(latlng, options) {\n return new DG.Ruler.LayeredMarker(latlng, options);\n};\n\nvar rulerRenderer = DG.svg({pane: 'rulerPane'});\nvar hoverRenderer = DG.svg({pane: 'rulerPane'});\n\nDG.Ruler.mergeOptions({\n pathStyles: {\n back: {\n color: '#fff',\n opacity: 1,\n weight: 12,\n pointerEvents: 'none',\n noClip: true,\n renderer: rulerRenderer,\n smoothFactor: 0\n },\n middle: {\n color: '#0da5d5',\n opacity: 1,\n weight: 4,\n pointerEvents: 'none',\n noClip: true,\n renderer: rulerRenderer,\n smoothFactor: 0\n },\n mouse: {\n color: '#fff',\n opacity: DG.Browser.vml ? 0.1 : 0,\n weight: DG.Browser.touch ? 40 : 20,\n pointerEvents: 'painted',\n noClip: true,\n renderer: hoverRenderer,\n smoothFactor: 0\n }\n },\n iconStyles: {\n large: {\n back: {\n color: '#fff',\n opacity: 1,\n fillColor: '#fff',\n fillOpacity: 1,\n weight: 1,\n radius: 13,\n renderer: rulerRenderer\n },\n middle: {\n color: '#0da5d5',\n opacity: 1,\n fillColor: '#0da5d5',\n fillOpacity: 1,\n weight: 1,\n radius: 9,\n renderer: rulerRenderer\n },\n front: {\n color: '#fff',\n opacity: 1,\n fillColor: '#0da5d5',\n fillOpacity: 1,\n weight: 4,\n radius: 5,\n renderer: rulerRenderer\n }\n },\n small: {\n back: {\n color: '#fff',\n opacity: 1,\n fillColor: '#fff',\n fillOpacity: 1,\n weight: 1,\n radius: 9,\n renderer: rulerRenderer\n },\n middle: {\n color: '#0da5d5',\n opacity: 1,\n fillColor: '#0da5d5',\n fillOpacity: 1,\n weight: 1,\n radius: 5,\n renderer: rulerRenderer\n },\n front: {\n color: '#fff',\n opacity: 1,\n fillColor: '#0da5d5',\n fillOpacity: 1,\n weight: 4,\n radius: 2,\n renderer: rulerRenderer\n }\n }\n }\n});\n\nDG.Ruler.Dictionary.ru = {\n km : 'км',\n m : 'м',\n delimiter : ','\n};\n\nDG.Ruler.Dictionary.it = {\n km : 'km',\n m : 'm',\n delimiter : ','\n};\n\nDG.Ruler.Dictionary.cs = {\n km: 'km',\n m: 'm',\n delimiter: ','\n};\n\nDG.Ruler.Dictionary.es = {\n km : 'km',\n m : 'm',\n delimiter : ','\n};\n\nDG.Ruler.Dictionary.en = {\n km : 'km',\n m : 'm',\n delimiter : '.'\n};\n\nDG.Ruler.Dictionary.ar = {\n km : 'كم',\n m : 'Ù…',\n delimiter : '.'\n};\n\nDG.Control.Ruler = DG.RoundControl.extend({\n\n options: {\n position: 'topright',\n iconClass: 'ruler'\n },\n\n statics: {\n Dictionary: {}\n },\n\n initialize: function(options) {\n DG.setOptions(this, options);\n DG.extend(this, {\n _active: false,\n _drawingHelper: null,\n _geoclickerNeedRestore: false\n }).on(this._controlEvents, this);\n },\n\n _controlEvents: {\n add: function() {\n this._drawingHelper = DG.ruler([]);\n },\n click: function() {\n this._active = !this._active;\n\n if (this._active) {\n this.setState('active');\n this._startDrawing();\n } else {\n this.setState('');\n this._finishDrawing();\n }\n },\n remove: function() {\n this.off(this._controlEvents, this);\n if (this._active) {\n this._map.removeLayer(this._drawingHelper);\n this._active = false;\n }\n this._drawingHelper = null;\n }\n },\n\n _startDrawing: function() { // ()\n this._map\n .addLayer(this._drawingHelper)\n .on('click', this._handleMapClick, this);\n\n this._map.fire('rulerstart');\n },\n\n _finishDrawing: function() { // ()\n this._map\n .off('click', this._handleMapClick, this)\n .removeLayer(this._drawingHelper);\n\n this._drawingHelper.setLatLngs([]);\n\n this._map.fire('rulerend');\n },\n\n _handleMapClick: function(event) { // (MouseEvents)\n this._drawingHelper.addLatLng(event.latlng);\n },\n\n _renderTranslation: function() { // ()\n this._link.title = this.t('button_title');\n }\n});\n\nDG.control.ruler = function(options) {\n return new DG.Control.Ruler(options);\n};\n\nDG.Map.mergeOptions({\n rulerControl: false\n});\n\nDG.Map.addInitHook(function() {\n if (this.options.rulerControl) {\n this.rulerControl = DG.control.ruler(this.options.rulerControl);\n this.addControl(this.rulerControl);\n }\n});\n\nDG.Control.Ruler.Dictionary.ru = {\n button_title: 'Линейка'\n};\n\nDG.Control.Ruler.Dictionary.it = {\n button_title : 'Righello'\n};\n\nDG.Control.Ruler.Dictionary.cs = {\n button_title: 'PravÃtko'\n};\n\nDG.Control.Ruler.Dictionary.es = {\n button_title : 'Regla'\n};\n\nDG.Control.Ruler.Dictionary.en = {\n button_title : 'Ruler'\n};\n\nDG.Control.Ruler.Dictionary.ar = {\n button_title: 'مسطرة'\n};\n\n(function(dust){dust.register(\"DGAttribution\\/copyright\",body_0);function body_0(chk,ctx){return chk.w(\"<div class=\\\"dg-attribution__copyright\\\"><ul class=\\\"dg-attribution__links\\\"><li class=\\\"dg-attribution__link-item\\\">\").x(ctx.get([\"osm\"], false),ctx,{\"else\":body_1,\"block\":body_2},{}).w(\"</li><li class=\\\"dg-attribution__link-item\\\"><a href=\\\"\").f(ctx.get([\"copyright_license\"], false),ctx,\"h\").w(\"\\\" target=\\\"_blank\\\" class=\\\"dg-attribution__link\\\">\").f(ctx.get([\"license_agreement\"], false),ctx,\"h\").w(\"</a></li></ul><a href=\\\"\").f(ctx.get([\"copyright_logo\"], false),ctx,\"h\").w(\"\\\" target=\\\"_blank\\\" class=\\\"dg-attribution__logo-url\\\"></a></div>\");}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"<a href=\\\"\").f(ctx.get([\"copyright_apilink\"], false),ctx,\"h\").w(\"\\\" target=\\\"_blank\\\" class=\\\"dg-attribution__link\\\" dir=\\\"\").f(ctx.get([\"dir\"], false),ctx,\"h\").w(\"\\\">\").f(ctx.get([\"work_on\"], false),ctx,\"h\").w(\"</a>\");}body_1.__dustBody=!0;function body_2(chk,ctx){return chk.w(\"© <a href=\\\"http://www.openstreetmap.org/copyright\\\" target=\\\"_blank\\\" class=\\\"dg-attribution__link\\\">OpenStreetMap contributors</a>, <a href=\\\"\").f(ctx.get([\"copyright_apilink\"], false),ctx,\"h\").w(\"\\\" target=\\\"_blank\\\" class=\\\"dg-attribution__link\\\" dir=\\\"\").f(ctx.get([\"dir\"], false),ctx,\"h\").w(\"\\\">\").f(ctx.get([\"work_on_with_osm\"], false),ctx,\"h\").w(\"</a>\");}body_2.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/cityarea\",body_0);function body_0(chk,ctx){return chk.w(\"<div class=\\\"dg-map-geoclicker__purpose dg-map-geoclicker__purpose_type_\").f(ctx.get([\"type\"], false),ctx,\"h\").w(\"\\\">\").f(ctx.get([\"purpose\"], false),ctx,\"h\").w(\"</div>\").s(ctx.get([\"drilldown\"], false),ctx,{\"block\":body_1},{});}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"<div class=\\\"dg-map-geoclicker__drilldown\\\">\").f(ctx.get([\"drilldown\"], false),ctx,\"h\").w(\"</div>\");}body_1.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/firmCardAddr\",body_0);function body_0(chk,ctx){return chk.w(\"<address class=\\\"dg-firm-card__address dg-firm-card__icon\\\">\").f(ctx.get([\"address\"], false),ctx,\"h\").s(ctx.get([\"comment\"], false),ctx,{\"block\":body_1},{}).w(\"</address>\");}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"<span class=\\\"dg-firm-card__comment\\\">— \").f(ctx.getPath(true, []),ctx,\"h\").w(\"</span>\");}body_1.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/firmCardContacts\",body_0);function body_0(chk,ctx){return chk.s(ctx.get([\"groups\"], false),ctx,{\"block\":body_1},{});}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.s(ctx.get([\"contacts\"], false),ctx,{\"block\":body_2},{});}body_1.__dustBody=!0;function body_2(chk,ctx){return chk.h(\"select\",ctx,{\"block\":body_3},{\"key\":ctx.get([\"type\"], false),\"type\":\"string\"},\"h\");}body_2.__dustBody=!0;function body_3(chk,ctx){return chk.h(\"eq\",ctx,{\"block\":body_4},{\"value\":\"phone\",\"type\":\"string\"},\"h\").h(\"eq\",ctx,{\"block\":body_6},{\"value\":\"fax\",\"type\":\"string\"},\"h\").h(\"eq\",ctx,{\"block\":body_8},{\"value\":\"website\",\"type\":\"string\"},\"h\").h(\"eq\",ctx,{\"block\":body_9},{\"value\":\"email\",\"type\":\"string\"},\"h\");}body_3.__dustBody=!0;function body_4(chk,ctx){return chk.w(\"<div class=\\\"dg-firm-card__phone dg-firm-card__icon\\\"><span class=\\\"dg-firm-card__phone-num\\\">\").f(ctx.get([\"text\"], false),ctx,\"h\").s(ctx.get([\"comment\"], false),ctx,{\"block\":body_5},{}).w(\"</span></div>\");}body_4.__dustBody=!0;function body_5(chk,ctx){return chk.w(\"<span class=\\\"dg-firm-card__comment\\\" title=\\\"\").f(ctx.getPath(true, []),ctx,\"h\").w(\"\\\">— \").f(ctx.getPath(true, []),ctx,\"h\").w(\"</span>\");}body_5.__dustBody=!0;function body_6(chk,ctx){return chk.w(\"<div class=\\\"dg-firm-card__phone dg-firm-card__icon\\\"><span class=\\\"dg-firm-card__phone-num\\\">\").f(ctx.get([\"text\"], false),ctx,\"h\").s(ctx.get([\"comment\"], false),ctx,{\"block\":body_7},{}).w(\"</span></div>\");}body_6.__dustBody=!0;function body_7(chk,ctx){return chk.w(\"<span class=\\\"dg-firm-card__comment\\\" title=\\\"\").f(ctx.getPath(true, []),ctx,\"h\").w(\"\\\">— \").f(ctx.getPath(true, []),ctx,\"h\").w(\"</span>\");}body_7.__dustBody=!0;function body_8(chk,ctx){return chk.w(\"<div class=\\\"dg-firm-card__link dg-firm-card__site dg-firm-card__icon\\\"><a href=\\\"\").f(ctx.get([\"url\"], false),ctx,\"h\").w(\"\\\" target=\\\"_blank\\\" class=\\\"dg-link_scheme_dark dg-firm-card__sitelink\\\">\").f(ctx.get([\"text\"], false),ctx,\"h\").w(\"</a></div>\");}body_8.__dustBody=!0;function body_9(chk,ctx){return chk.w(\"<div class=\\\"dg-firm-card__link dg-firm-card__email dg-firm-card__icon\\\"><a href=\\\"mailto:\").f(ctx.get([\"value\"], false),ctx,\"h\").w(\"\\\">\").f(ctx.get([\"value\"], false),ctx,\"h\").w(\"</a></div>\");}body_9.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/firmCardHeader\",body_0);function body_0(chk,ctx){return chk.w(\"<div class=\\\"dg-popup__header-title dg-popup__header-title_for_firmcard\\\" title=\\\"\").f(ctx.get([\"firmName\"], false),ctx,\"h\").w(\"\\\">\").f(ctx.get([\"firmName\"], false),ctx,\"h\").w(\"</div>\").x(ctx.get([\"links\"], false),ctx,{\"block\":body_1},{});}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"<div class=\\\"dg-popup__header-links\\\">\").s(ctx.get([\"links\"], false),ctx,{\"block\":body_2},{}).w(\"</div>\");}body_1.__dustBody=!0;function body_2(chk,ctx){return chk.h(\"eq\",ctx,{\"else\":body_3,\"block\":body_6},{\"key\":body_7,\"value\":\"flamp_stars\",\"type\":\"string\"},\"h\");}body_2.__dustBody=!0;function body_3(chk,ctx){return chk.w(\"<a class=\\\"dg-popup__header-link dg-popup__link dg-popup__link_type_\").f(ctx.get([\"name\"], false),ctx,\"h\").w(\"\\\"\").x(ctx.get([\"href\"], false),ctx,{\"else\":body_4,\"block\":body_5},{}).w(\">\").f(ctx.get([\"label\"], false),ctx,\"h\").w(\"</a>\");}body_3.__dustBody=!0;function body_4(chk,ctx){return chk.w(\"href=\\\"javascript:void(0)\\\"\");}body_4.__dustBody=!0;function body_5(chk,ctx){return chk.w(\"href=\").f(ctx.get([\"href\"], false),ctx,\"h\").w(\" target=\\\"_blank\\\"\");}body_5.__dustBody=!0;function body_6(chk,ctx){return chk.w(\"<div class=\\\"dg-popup__rating\\\"><div class=\\\"dg-popup__rating-stars\\\" style=\\\"width: \").f(ctx.get([\"width\"], false),ctx,\"h\").w(\"%\\\"></div></div>\");}body_6.__dustBody=!0;function body_7(chk,ctx){return chk.f(ctx.get([\"name\"], false),ctx,\"h\");}body_7.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/firmCardRubric\",body_0);function body_0(chk,ctx){return chk.s(ctx.get([\"rubrics\"], false),ctx,{\"block\":body_1},{});}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"<section class=\\\"dg-firm-card__rubrics\\\">\").x(ctx.get([\"primary\"], false),ctx,{\"block\":body_2},{}).x(ctx.get([\"additional\"], false),ctx,{\"block\":body_4},{}).w(\"</section>\");}body_1.__dustBody=!0;function body_2(chk,ctx){return chk.w(\"<ul class=\\\"dg-firm-card__rubrics-list dg-firm-card__rubrics-list_type_primary\\\">\").s(ctx.get([\"primary\"], false),ctx,{\"block\":body_3},{}).w(\"</ul>\");}body_2.__dustBody=!0;function body_3(chk,ctx){return chk.w(\"<li class=\\\"dg-firm-card__rubrics-list-item\\\">\").f(ctx.get([\"name\"], false),ctx,\"h\").w(\"</li>\");}body_3.__dustBody=!0;function body_4(chk,ctx){return chk.w(\"<ul class=\\\"dg-firm-card__rubrics-list dg-firm-card__rubrics-list_type_additional\\\">\").s(ctx.get([\"additional\"], false),ctx,{\"block\":body_5},{}).w(\"</ul>\");}body_4.__dustBody=!0;function body_5(chk,ctx){return chk.w(\"<li class=\\\"dg-firm-card__rubrics-list-item\\\">\").f(ctx.get([\"name\"], false),ctx,\"h\").w(\"</li>\");}body_5.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/firmCardSchedule\",body_0);function body_0(chk,ctx){return chk.w(\"<div class=\\\"dg-firm-card__schedule dg-schedule dg-schedule_open_\").x(ctx.getPath(false, [\"forecast\",\"open\"]),ctx,{\"else\":body_1,\"block\":body_2},{}).w(\" dg-schedule_works-everyday_\").x(ctx.getPath(false, [\"schedule\",\"everyday\"]),ctx,{\"else\":body_3,\"block\":body_4},{}).w(\"\\\">\").x(ctx.get([\"schedule\"], false),ctx,{\"block\":body_5},{}).w(\"</div>\");}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"false\");}body_1.__dustBody=!0;function body_2(chk,ctx){return chk.w(\"true\");}body_2.__dustBody=!0;function body_3(chk,ctx){return chk.w(\"false\");}body_3.__dustBody=!0;function body_4(chk,ctx){return chk.w(\"true\");}body_4.__dustBody=!0;function body_5(chk,ctx){return chk.x(ctx.getPath(false, [\"forecast\",\"today\"]),ctx,{\"block\":body_6},{}).s(ctx.getPath(false, [\"forecast\",\"now\"]),ctx,{\"block\":body_10},{}).nx(ctx.getPath(false, [\"schedule\",\"everyday\"]),ctx,{\"block\":body_12},{});}body_5.__dustBody=!0;function body_6(chk,ctx){return chk.w(\"<div class=\\\"dg-schedule__today\\\"><div class=\\\"dg-schedule__today-inner\\\">\").f(ctx.getPath(false, [\"forecast\",\"today\",\"text\"]),ctx,\"h\").w(\" \").x(ctx.getPath(false, [\"forecast\",\"today\",\"from\"]),ctx,{\"block\":body_7},{}).x(ctx.getPath(false, [\"schedule\",\"lunch\"]),ctx,{\"block\":body_8},{}).w(\"</div></div>\");}body_6.__dustBody=!0;function body_7(chk,ctx){return chk.f(ctx.getPath(false, [\"forecast\",\"today\",\"from\"]),ctx,\"h\").w(\"–\").f(ctx.getPath(false, [\"forecast\",\"today\",\"to\"]),ctx,\"h\");}body_7.__dustBody=!0;function body_8(chk,ctx){return chk.w(\", \").f(ctx.getPath(false, [\"forecast\",\"today\",\"lunchStr\"]),ctx,\"h\").w(\" \").s(ctx.getPath(false, [\"schedule\",\"lunch\"]),ctx,{\"block\":body_9},{});}body_8.__dustBody=!0;function body_9(chk,ctx){return chk.f(ctx.get([\"from\"], false),ctx,\"h\").w(\"–\").f(ctx.get([\"to\"], false),ctx,\"h\");}body_9.__dustBody=!0;function body_10(chk,ctx){return chk.w(\"<div class=\\\"dg-schedule__now\\\"><span class=\\\"dg-schedule__now-text\\\">\").f(ctx.getPath(true, []),ctx,\"h\").s(ctx.getPath(false, [\"schedule\",\"comment\"]),ctx,{\"block\":body_11},{}).w(\"</span></div>\");}body_10.__dustBody=!0;function body_11(chk,ctx){return chk.w(\", \").f(ctx.getPath(true, []),ctx,\"h\");}body_11.__dustBody=!0;function body_12(chk,ctx){return chk.x(ctx.getPath(false, [\"schedule\",\"week\"]),ctx,{\"block\":body_13},{});}body_12.__dustBody=!0;function body_13(chk,ctx){return chk.x(ctx.getPath(false, [\"schedule\",\"week\",\"evently\"]),ctx,{\"block\":body_14},{}).x(ctx.getPath(false, [\"schedule\",\"week\",\"table\"]),ctx,{\"block\":body_22},{});}body_13.__dustBody=!0;function body_14(chk,ctx){return chk.w(\"<div class=\\\"dg-schedule__table\\\">\").s(ctx.getPath(false, [\"schedule\",\"week\",\"evently\"]),ctx,{\"block\":body_15},{}).w(\"</div>\");}body_14.__dustBody=!0;function body_15(chk,ctx){return chk.w(\"<div class=\\\"dg-schedule__string\\\">\").x(ctx.get([\"alltime\"], false),ctx,{\"block\":body_16},{}).x(ctx.get([\"everyday\"], false),ctx,{\"else\":body_17,\"block\":body_18},{}).x(ctx.get([\"holiday\"], false),ctx,{\"else\":body_19,\"block\":body_21},{}).w(\"</div>\");}body_15.__dustBody=!0;function body_16(chk,ctx){return chk.f(ctx.get([\"alltimeStr\"], false),ctx,\"h\");}body_16.__dustBody=!0;function body_17(chk,ctx){return chk.f(ctx.get([\"dayList\"], false),ctx,\"h\");}body_17.__dustBody=!0;function body_18(chk,ctx){return chk.f(ctx.getPath(false, [\"forecast\",\"today\",\"text\"]),ctx,\"h\");}body_18.__dustBody=!0;function body_19(chk,ctx){return chk.w(\"<span class=\\\"schedule__string-time\\\"> \").f(ctx.get([\"from\"], false),ctx,\"h\").w(\"–\").f(ctx.get([\"to\"], false),ctx,\"h\").w(\"</span>\").s(ctx.get([\"lunch\"], false),ctx,{\"block\":body_20},{});}body_19.__dustBody=!0;function body_20(chk,ctx){return chk.w(\"<p>\").f(ctx.get([\"lunchStr\"], false),ctx,\"h\").w(\"—<span class=\\\"schedule__string-time\\\">\").f(ctx.get([\"from\"], false),ctx,\"h\").w(\"–\").f(ctx.get([\"to\"], false),ctx,\"h\").w(\"</span></p>\");}body_20.__dustBody=!0;function body_21(chk,ctx){return chk.w(\" —<span class=\\\"schedule__string-time\\\"> \").f(ctx.get([\"holidayStr\"], false),ctx,\"h\").w(\"</span>\");}body_21.__dustBody=!0;function body_22(chk,ctx){return chk.w(\"<div><div class=\\\"dg-schedule__table\\\"><div class=\\\"dg-schedule__tc dg-schedule__tc_pre\\\"><div class=\\\"dg-schedule__day-name\\\"> </div><div class=\\\"dg-schedule__table-clock dg-schedule__td\\\"></div>\").x(ctx.getPath(false, [\"schedule\",\"week\",\"hasLunch\"]),ctx,{\"block\":body_23},{}).w(\"</div>\").s(ctx.getPath(false, [\"schedule\",\"week\",\"table\"]),ctx,{\"block\":body_24},{}).w(\"</div> </div>\");}body_22.__dustBody=!0;function body_23(chk,ctx){return chk.w(\"<div class=\\\"dg-schedule__table-lunch dg-schedule__td\\\"></div>\");}body_23.__dustBody=!0;function body_24(chk,ctx){return chk.h(\"if\",ctx,{\"block\":body_25},{\"cond\":body_26},\"h\").w(\"<div class=\\\"dg-schedule__tc\").x(ctx.get([\"active\"], false),ctx,{\"block\":body_27},{}).w(\"\\\"><div class=\\\"dg-schedule__day-name\\\">\").f(ctx.get([\"key\"], false),ctx,\"h\").w(\"</div><div class=\\\"dg-schedule__td\\\">\").x(ctx.get([\"from\"], false),ctx,{\"else\":body_28,\"block\":body_29},{}).w(\"</div>\").s(ctx.get([\"lunch\"], false),ctx,{\"block\":body_30},{}).w(\"</div> \").h(\"if\",ctx,{\"block\":body_33},{\"cond\":body_34},\"h\");}body_24.__dustBody=!0;function body_25(chk,ctx){return chk.w(\"<span class=\\\"dg-schedule__table-cell-group\\\">\");}body_25.__dustBody=!0;function body_26(chk,ctx){return chk.w(\"(\").f(ctx.get([\"$idx\"], false),ctx,\"h\").w(\" == \").f(ctx.get([\"$len\"], false),ctx,\"h\").w(\" - 2)\");}body_26.__dustBody=!0;function body_27(chk,ctx){return chk.w(\" dg-schedule__tc_active_true\");}body_27.__dustBody=!0;function body_28(chk,ctx){return chk.w(\"–\");}body_28.__dustBody=!0;function body_29(chk,ctx){return chk.f(ctx.get([\"from\"], false),ctx,\"h\").w(\" \").f(ctx.get([\"to\"], false),ctx,\"h\");}body_29.__dustBody=!0;function body_30(chk,ctx){return chk.w(\"<div class=\\\"dg-schedule__td\\\">\").x(ctx.get([\"from\"], false),ctx,{\"else\":body_31,\"block\":body_32},{}).w(\"</div>\");}body_30.__dustBody=!0;function body_31(chk,ctx){return chk.w(\"–\");}body_31.__dustBody=!0;function body_32(chk,ctx){return chk.f(ctx.get([\"from\"], false),ctx,\"h\").w(\" \").f(ctx.get([\"to\"], false),ctx,\"h\");}body_32.__dustBody=!0;function body_33(chk,ctx){return chk.w(\"</span>\");}body_33.__dustBody=!0;function body_34(chk,ctx){return chk.w(\"(\").f(ctx.get([\"$idx\"], false),ctx,\"h\").w(\" == \").f(ctx.get([\"$len\"], false),ctx,\"h\").w(\")\");}body_34.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/firmlistItem\",body_0);function body_0(chk,ctx){return chk.w(\"<a id=\\\"\").f(ctx.getPath(false, [\"firm\",\"id\"]),ctx,\"h\").w(\"\\\" class=\\\"dg-popup__link\\\" href=\\\"#\\\">\").f(ctx.getPath(false, [\"firm\",\"name\"]),ctx,\"h\").w(\"</a>\");}body_0.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/frimCardPayments\",body_0);function body_0(chk,ctx){return chk.x(ctx.get([\"payments\"], false),ctx,{\"block\":body_1},{});}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"<section class=\\\"dg-firm-card__aa\\\"><ul class=\\\"dg-firm-card__aa-list\\\">\").s(ctx.get([\"payments\"], false),ctx,{\"block\":body_2},{}).w(\"</ul></section>\");}body_1.__dustBody=!0;function body_2(chk,ctx){return chk.w(\"<li class=\\\"dg-firm-card__aa-list-item\\\">\").f(ctx.getPath(true, []),ctx,\"h\").w(\"</li>\");}body_2.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/house\",body_0);function body_0(chk,ctx){return chk.s(ctx.get([\"address\"], false),ctx,{\"block\":body_1},{}).s(ctx.get([\"purpose\"], false),ctx,{\"block\":body_4},{}).s(ctx.get([\"attractions\"], false),ctx,{\"block\":body_5},{});}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"<address class=\\\"dg-map-geoclicker__address\\\">\").s(ctx.getPath(false, [\"address\",\"header\"]),ctx,{\"block\":body_2},{}).s(ctx.getPath(false, [\"address\",\"drilldown\"]),ctx,{\"block\":body_3},{}).w(\"</address>\");}body_1.__dustBody=!0;function body_2(chk,ctx){return chk.w(\"<div class=\\\"dg-map-geoclicker__address-header\\\">\").f(ctx.getPath(true, []),ctx,\"h\").w(\"</div>\");}body_2.__dustBody=!0;function body_3(chk,ctx){return chk.w(\"<div class=\\\"dg-map-geoclicker__address-drilldown\\\">\").f(ctx.getPath(true, []),ctx,\"h\").w(\"</div>\");}body_3.__dustBody=!0;function body_4(chk,ctx){return chk.w(\"<div class=\\\"dg-map-geoclicker__purpose\\\">\").f(ctx.getPath(true, []),ctx,\"h\").w(\"</div>\");}body_4.__dustBody=!0;function body_5(chk,ctx){return chk.w(\"<div class=\\\"dg-map-geoclicker__purpose dg-map-geoclicker__purpose_type_sight\\\">\").f(ctx.getPath(true, []),ctx,\"h\").w(\"</div>\");}body_5.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/loader\",body_0);function body_0(chk,ctx){return chk.w(\"<div class=\\\"dg-preloader dg-preloader_scheme_regular dg-preloader_animation_\").x(ctx.get([\"anim\"], false),ctx,{\"else\":body_1,\"block\":body_2},{}).x(ctx.get([\"small\"], false),ctx,{\"block\":body_3},{}).w(\"\\\"></div>\");}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"false\");}body_1.__dustBody=!0;function body_2(chk,ctx){return chk.w(\"true\");}body_2.__dustBody=!0;function body_3(chk,ctx){return chk.w(\" dg-preloader_size_small\");}body_3.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/popupFooter\",body_0);function body_0(chk,ctx){return chk.w(\"<div class=\\\"dg-popup__footer-title\\\"><a class=\\\"dg-popup__show-less-house-link\\\" href=\\\"javascript:void(0)\\\">\").f(ctx.get([\"hideFirmsText\"], false),ctx,\"h\").w(\"</a></div>\");}body_0.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/popupFooterBtns\",body_0);function body_0(chk,ctx){return chk.x(ctx.get([\"btns\"], false),ctx,{\"block\":body_1},{});}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"<footer class=\\\"dg-popup__footer-buttons\\\">\").s(ctx.get([\"btns\"], false),ctx,{\"block\":body_2},{}).w(\"</footer>\");}body_1.__dustBody=!0;function body_2(chk,ctx){return chk.w(\"<div class=\\\"dg-popup__footer-button-wrapper\\\"><a class=\\\"dg-popup__button_name_\").f(ctx.get([\"name\"], false),ctx,\"h\").w(\" dg-popup__footer-button\").x(ctx.get([\"icon\"], false),ctx,{\"block\":body_3},{}).w(\"\\\"\").x(ctx.get([\"href\"], false),ctx,{\"else\":body_4,\"block\":body_5},{}).w(\">\").f(ctx.get([\"label\"], false),ctx,\"h\").w(\"</a></div>\");}body_2.__dustBody=!0;function body_3(chk,ctx){return chk.w(\" dg-popup__footer-icon-button\");}body_3.__dustBody=!0;function body_4(chk,ctx){return chk.w(\"href=\\\"javascript:void(0)\\\"\");}body_4.__dustBody=!0;function body_5(chk,ctx){return chk.w(\"href=\").f(ctx.get([\"href\"], false),ctx,\"h\").w(\" target=\\\"_blank\\\"\");}body_5.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/popupHeader\",body_0);function body_0(chk,ctx){return chk.s(ctx.get([\"title\"], false),ctx,{\"block\":body_1},{});}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"<div class=\\\"dg-popup__header-title\\\">\").f(ctx.getPath(true, []),ctx,\"h\").w(\"</div>\");}body_1.__dustBody=!0;return body_0}(dust));\n(function(dust){dust.register(\"DGGeoclicker\\/sight\",body_0);function body_0(chk,ctx){return chk.s(ctx.get([\"purpose\"], false),ctx,{\"block\":body_1},{}).s(ctx.get([\"address\"], false),ctx,{\"block\":body_2},{}).s(ctx.get([\"description\"], false),ctx,{\"block\":body_5},{});}body_0.__dustBody=!0;function body_1(chk,ctx){return chk.w(\"<div class=\\\"dg-map-geoclicker__purpose dg-map-geoclicker__purpose_type_sight\\\">\").f(ctx.getPath(true, []),ctx,\"h\").w(\"</div>\");}body_1.__dustBody=!0;function body_2(chk,ctx){return chk.w(\"<address class=\\\"dg-map-geoclicker__address\\\">\").s(ctx.getPath(false, [\"address\",\"header\"]),ctx,{\"block\":body_3},{}).s(ctx.getPath(false, [\"address\",\"drilldown\"]),ctx,{\"block\":body_4},{}).w(\"</address>\");}body_2.__dustBody=!0;function body_3(chk,ctx){return chk.w(\"<div class=\\\"dg-map-geoclicker__address-header\\\">\").f(ctx.getPath(true, []),ctx,\"h\").w(\"</div>\");}body_3.__dustBody=!0;function body_4(chk,ctx){return chk.w(\"<div class=\\\"dg-map-geoclicker__address-drilldown\\\">\").f(ctx.getPath(true, []),ctx,\"h\").w(\"</div>\");}body_4.__dustBody=!0;function body_5(chk,ctx){return chk.w(\"<div class=\\\"dg-map-geoclicker__sight-description\\\">\").f(ctx.getPath(true, []),ctx,\"h\").w(\"</div>\").s(ctx.get([\"showMoreText\"], false),ctx,{\"block\":body_6},{});}body_5.__dustBody=!0;function body_6(chk,ctx){return chk.w(\"<a class=\\\"dg-map-geoclicker__show-more-sights-link\\\" href=\\\"javascript:void(0)\\\">\").f(ctx.getPath(true, []),ctx,\"h\").w(\"</a>\");}body_6.__dustBody=!0;return body_0}(dust));DG.fallbackProjectsList = JSON.parse('[{\"bounds\":\"POLYGON((91.070624 53.65785,90.694431 53.829965,90.641338 53.937449,91.044722 54.011745,91.169475 54.054245,91.247741 54.10893,91.454448 54.134677,91.622967 54.067042,91.640045 53.973842,91.814639 53.94927,91.845442 53.91996,91.819053 53.85101,91.82396 53.765818,91.840532 53.753093,91.822802 53.717291,91.837259 53.573118,91.83061 53.553066,91.796923 53.549953,91.777709 53.528422,91.820605 53.472974,91.902092 53.464155,91.975795 53.380563,91.957949 53.348546,91.844535 53.29356,91.791986 53.215861,91.791488 53.190281,91.630564 53.142953,91.608241 53.066422,91.635951 52.945221,91.682944 52.871745,91.610779 52.766581,91.448948 52.715568,91.323567 52.698296,90.875829 53.015332,90.790707 53.059612,90.70189 53.141567,90.663858 53.198743,90.688715 53.225401,90.723102 53.232022,90.802796 53.311734,91.04732 53.437432,91.105621 53.481836,91.148065 53.559012,91.060276 53.614685,91.070624 53.65785))\",\"code\":\"abakan\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"69\",\"name\":\"Ðбакан\",\"time_zone\":{\"name\":\"Asia/Krasnoyarsk\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((50.989242 43.559453,50.700278 43.960347,50.548767 44.143806,50.310331 44.173939,50.159119 44.240731,50.077464 44.316906,50.050169 44.386403,50.033572 44.549467,49.924839 44.758753,49.858647 44.834275,49.815392 44.920822,49.816353 45.023361,49.847194 45.094706,49.8831 45.134367,50.017069 45.186872,50.314389 45.198264,50.4106 45.185556,50.707747 45.080803,50.871631 45.115622,51.078633 45.264022,51.269189 45.462642,51.342392 45.507019,51.730008 45.592703,52.155669 45.534531,52.290372 45.552439,52.471922 45.607825,52.541508 45.719714,53.021861 46.091373,53.191789 46.012055,53.684004 46.0156,53.895303 46.127348,53.968557 46.192437,53.971735 46.24613,54.30769 46.257033,54.504746 46.30105,54.692764 46.323051,54.832578 46.363543,55.089586 46.379528,55.270475 46.367362,55.487919 46.520131,55.602653 46.421094,55.657382 46.419648,55.698046 46.399684,55.81798 46.401193,55.824929 46.349698,55.860157 46.305272,55.820425 46.276012,55.837026 46.251191,55.90249 46.237314,55.95692 46.260008,55.981457 46.210459,56.04476 46.211476,56.121737 46.154545,56.201516 46.135755,56.286168 46.151583,56.46663 46.132189,56.516505 46.097356,56.552526 46.005868,56.605778 45.926133,56.744109 45.177249,55.998743 45.000314,56.001508 41.324124,55.876714 41.331786,55.816356 41.297155,55.811717 41.278338,55.743336 41.302058,55.721496 41.293192,55.727086 41.279493,55.63561 41.282813,55.603316 41.246392,55.600034 41.272913,55.576874 41.27195,55.567019 41.294407,55.545235 41.287966,55.557026 41.27561,55.542728 41.259293,55.499612 41.251587,55.450623 41.269299,55.442191 41.293651,55.430472 41.279495,55.398313 41.337222,55.315465 41.390882,55.119606 41.604653,55.066234 41.699339,54.949976 41.833213,54.952115 41.906308,54.928925 41.928325,54.779482 42.052549,54.21781 42.379087,53.570558 42.288924,52.984788 42.121175,52.449984 41.761967,52.335076 41.719338,52.259144 41.724447,52.229019 42.117106,52.258633 42.212153,52.440644 42.469697,52.392847 42.601758,52.195397 42.6508,51.836542 42.695872,51.737094 42.757403,51.635567 42.893483,51.557783 42.967481,51.262286 43.003889,51.132642 43.05145,51.077578 43.123231,51.071017 43.160703,51.096811 43.450783,50.989242 43.559453))\",\"code\":\"aktau\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"196\",\"name\":\"Ðктау\",\"time_zone\":{\"name\":\"Asia/Aqtau\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((57.131233 50.565431,57.29241 50.584455,57.319324 50.522876,57.456565 50.507563,57.508771 50.537321,57.653998 50.489218,57.702377 50.502943,57.760821 50.488773,57.770117 50.410886,57.71458 50.374648,57.76243 50.353087,57.773313 50.330205,57.744175 50.275572,57.755202 50.257032,57.669871 50.241394,57.687866 50.19675,57.573892 50.188895,57.558014 50.169447,57.425888 50.121144,57.148367 50.120826,56.977926 50.152601,56.914478 50.21554,56.94188 50.275119,56.88205 50.313889,56.862849 50.343913,56.861403 50.3877,57.073194 50.556581,57.131233 50.565431))\",\"code\":\"aktobe\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"167\",\"name\":\"Ðктобе\",\"time_zone\":{\"name\":\"Asia/Aqtobe\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((74.522636 44.698727,74.402579 44.801211,74.38932 44.795263,74.305668 44.848976,74.13349 44.913319,74.139386 44.953392,74.118159 44.967995,74.087497 45.127136,73.893014 45.125157,73.755036 45.104351,73.722015 45.220764,73.752677 45.288839,74.030992 45.288009,73.98423 45.381618,73.901521 45.74653,74.014734 45.890361,74.082519 46.040373,74.16572 46.138326,74.743565 46.526385,75.018939 46.557298,75.327035 46.682058,75.522245 46.707492,75.609858 46.69353,76.049095 46.738144,76.225218 46.63851,76.316933 46.654786,76.367432 46.691055,76.385236 46.64884,76.377425 46.622063,76.389734 46.615547,76.433534 46.643356,76.537671 46.593426,76.525192 46.642576,76.604608 46.665573,76.697037 46.646883,76.700725 46.627519,76.93185 46.538336,76.94664 46.551856,76.82 46.671081,76.833083 46.677976,76.878496 46.63222,76.941956 46.61741,76.974818 46.620306,77.003986 46.646582,77.072494 46.622766,77.106014 46.569705,77.103574 46.543372,77.149129 46.530758,77.263549 46.542763,77.282417 46.584788,77.338481 46.613432,77.555573 46.621211,77.465504 47.160993,77.608619 47.209514,77.867263 47.169993,78.014306 47.282562,78.142044 47.191028,78.303405 47.330894,78.591987 47.180988,78.641806 47.14103,78.768257 47.133336,78.816849 47.047246,79.262932 47.081666,79.65595 46.927577,79.915898 46.871581,80.030157 46.91537,80.202442 46.862298,80.198191 46.809236,80.606629 46.658715,80.866234 46.567727,81.128519 46.560069,81.235563 46.481858,81.282371 46.510705,81.346881 46.518233,81.459286 46.564776,81.487836 46.555838,81.512829 46.540822,81.498973 46.534359,81.519514 46.510232,81.572138 46.489886,81.526063 46.428369,81.519639 46.394838,81.549879 46.350782,81.695741 46.244168,81.728459 46.180296,81.871308 46.105808,81.976901 45.872055,82.043958 45.840235,82.093706 45.740726,82.279444 45.535365,82.542831 45.420958,82.587726 45.34472,82.581643 45.219617,82.474541 45.177044,82.322694 45.210715,82.274788 45.240919,82.151224 45.221796,82.10984 45.201514,82.081751 45.222872,82.090459 45.24548,82.044305 45.254165,82.009207 45.233565,81.922035 45.228887,81.806624 45.355336,81.767796 45.37783,81.713729 45.358922,81.694912 45.369148,81.592096 45.340549,81.568781 45.325334,81.57342 45.307351,81.530515 45.304027,81.514808 45.280208,81.451833 45.262192,81.420957 45.283638,81.376662 45.252934,81.351662 45.260974,81.269176 45.236734,81.22681 45.24794,81.166543 45.224302,81.161499 45.205589,81.106606 45.221885,81.10909 45.201081,81.070029 45.172383,80.996557 45.158284,80.956909 45.167633,80.896611 45.124698,80.742971 45.159697,80.600094 45.104419,80.511686 45.105973,80.48889 45.126494,80.381787 45.03987,80.344923 45.041065,80.319119 45.070022,80.213527 45.023252,80.139533 45.057352,80.128335 45.039291,80.090078 45.046946,80.097275 45.007081,80.05651 45.014123,79.881985 44.910678,79.885916 44.893561,79.91425 44.901149,79.963753 44.881986,79.944715 44.850043,79.995176 44.823593,79.999367 44.790446,80.1142 44.809784,80.163957 44.841565,80.164426 44.799401,80.192807 44.749696,80.337233 44.689495,80.410483 44.610393,80.34692 44.482686,80.405393 44.293009,80.394265 44.112031,80.445173 44.074395,80.458377 44.030023,80.448503 43.988485,80.483863 43.955611,80.472225 43.936452,80.508993 43.906852,80.522766 43.821915,80.750976 43.469037,80.735094 43.393153,80.683169 43.328684,80.778532 43.311382,80.765071 43.26704,80.789782 43.238458,80.78608 43.201923,80.807281 43.177272,80.781311 43.137824,80.657526 43.149944,80.591014 43.138578,80.548941 43.097709,80.408519 43.05736,80.380834 43.022411,80.437269 42.967842,80.556932 42.930638,80.601 42.892799,80.425316 42.856021,80.405965 42.829634,80.3914 42.839321,80.331043 42.824641,80.322123 42.83902,80.259951 42.827599,80.228766 42.6961,80.176723 42.671369,80.16199 42.630333,80.220581 42.532939,80.274978 42.517618,80.207623 42.46903,80.204502 42.428545,80.233437 42.403854,80.237654 42.340335,80.283553 42.319979,80.259485 42.292852,80.289328 42.260084,80.270976 42.226356,80.228742 42.217416,80.199166 42.229005,80.174404 42.210844,80.118037 42.276259,80.139202 42.290394,80.082613 42.321523,80.081662 42.339383,80.028173 42.343685,80.000317 42.37815,79.98213 42.377598,79.964108 42.436598,79.787963 42.446318,79.695511 42.479622,79.655216 42.475604,79.637153 42.453974,79.504877 42.459887,79.491167 42.486365,79.430007 42.516522,79.356944 42.595042,79.260316 42.625585,79.205044 42.668129,79.170183 42.732447,79.199372 42.804223,79.033891 42.760025,79.022988 42.777168,78.930488 42.774268,78.865709 42.800704,78.786554 42.800598,78.709549 42.826114,78.664153 42.814881,78.641886 42.842362,78.588772 42.84749,78.495717 42.900345,78.430884 42.878797,78.370535 42.886981,78.348808 42.854848,78.197829 42.881989,78.171543 42.860289,78.116667 42.864588,78.091759 42.849356,78.054338 42.847632,78.002178 42.870654,77.968122 42.85082,77.934015 42.881626,77.911121 42.870732,77.874056 42.888611,77.82376 42.884439,77.780651 42.914754,77.696993 42.903906,77.670445 42.917955,77.581041 42.915514,77.552523 42.941107,77.485265 42.924637,77.47156 42.939266,77.350501 42.898513,77.302013 42.916541,77.234786 42.911813,77.179907 42.946993,77.156765 42.944425,77.154973 42.972254,77.062577 42.976592,77.035094 42.947192,77.004469 42.98309,76.9719 42.986711,76.917246 42.965857,76.835842 42.982848,76.822744 42.955093,76.755876 42.949774,76.749231 42.921514,76.708886 42.904153,76.603487 42.916155,76.575247 42.906103,76.522591 42.922249,76.47828 42.884302,76.343846 42.860756,76.303927 42.874442,76.302069 42.910942,76.200932 42.91645,76.194148 42.931117,76.028275 42.911042,75.949176 42.933001,75.937224 42.955718,75.785865 42.937588,75.772783 42.940689,75.773787 42.972761,75.723599 42.956642,75.65608 42.980708,75.546772 42.981596,75.601222 42.999167,75.656111 43.043652,75.532556 43.082573,75.462159 43.121933,75.349428 43.146,75.330555 43.195294,75.294544 43.213266,75.330628 43.25288,75.281118 43.263114,75.294142 43.375716,75.349788 43.404824,75.418958 43.47105,75.388693 43.53486,75.183575 43.521257,74.997186 43.610291,74.997307 43.650974,75.268126 43.824588,75.285252 43.861271,75.27302 43.948714,75.315794 44.018405,75.30708 44.148039,74.997638 44.326624,74.750995 44.357814,74.519729 44.485819,74.510738 44.522803,74.493795 44.526135,74.520057 44.58313,74.522636 44.698727))\",\"code\":\"almaty\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"67\",\"name\":\"Ðлматы\",\"time_zone\":{\"name\":\"Asia/Almaty\",\"offset\":360},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((52.223466 54.858607,52.225581 54.896841,52.201091 54.925634,52.271902 54.972811,52.353207 54.986941,52.466983 54.87767,52.482409 54.827772,52.452724 54.803623,52.391155 54.816144,52.308586 54.807339,52.231899 54.837975,52.223466 54.858607))\",\"code\":\"almetevsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"108\",\"name\":\"ÐльметьевÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((177.442943 64.716762,177.461329 64.743255,177.548927 64.732752,177.536236 64.715542,177.442943 64.716762))\",\"code\":\"anadyr\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"155\",\"name\":\"Ðнадырь\",\"time_zone\":{\"name\":\"Asia/Anadyr\",\"offset\":720},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((41.306107 44.718112,41.249612 44.671822,41.186821 44.715704,41.1145 44.66542,41.070272 44.69744,41.054013 44.687595,41.018874 44.743803,40.974331 44.728943,40.940735 44.766746,40.900976 44.752949,40.873061 44.793149,40.838805 44.781364,40.800459 44.857603,40.902811 44.893435,40.864347 44.961848,40.900608 44.987223,40.842616 45.033578,40.878791 45.056262,40.854148 45.076757,40.900974 45.107242,40.866832 45.134524,40.858846 45.150726,40.880047 45.165058,40.858388 45.184086,40.938913 45.241526,41.005788 45.241262,41.00537 45.229101,41.039447 45.22527,41.35348 45.223054,41.353171 45.186895,41.365911 45.186898,41.352481 45.150892,41.31891 45.15106,41.316496 45.091465,41.267332 45.056419,41.322559 45.016188,41.286438 44.991202,41.367978 44.932597,41.287273 44.860127,41.342416 44.830816,41.317765 44.793729,41.347284 44.746855,41.306107 44.718112))\",\"code\":\"armawir\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"106\",\"name\":\"Ðрмавир\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((39.467082 64.829966,41.321175 64.812571,41.276671 64.284305,39.458118 64.301293,39.467082 64.829966))\",\"code\":\"arkhangelsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"49\",\"name\":\"ÐрхангельÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((47.747405 46.794839,47.776244 46.800521,47.810135 46.761605,47.907265 46.740644,47.928378 46.720807,48.067759 46.731313,48.098791 46.712483,48.151499 46.714994,48.33634 46.663608,48.395222 46.544961,48.402786 46.492407,48.379384 46.340769,48.362235 46.327207,48.372658 46.316606,48.355751 46.22781,48.383153 46.195758,48.44409 46.171003,48.381341 46.137798,48.348806 46.057503,48.15419 46.054404,48.107321 46.033126,47.985383 46.019315,47.894663 46.029965,47.871002 46.061984,47.697541 46.053889,47.667071 46.097238,47.702048 46.117454,47.666533 46.152288,47.655593 46.258052,47.608108 46.303432,47.626158 46.340853,47.613269 46.362228,47.624706 46.701364,47.747405 46.794839))\",\"code\":\"astrakhan\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"8\",\"name\":\"ÐÑтрахань\",\"time_zone\":{\"name\":\"Europe/Astrakhan\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((51.81079 47.15804,51.773854 47.185327,51.783515 47.206253,51.838706 47.218498,51.861149 47.208672,51.876595 47.175483,51.983982 47.184051,52.057235 47.159303,52.067301 47.149367,52.044594 47.140455,52.046404 47.121763,52.091744 47.095943,51.972771 47.045744,51.928291 47.054367,51.917185 47.009789,51.882894 47.012164,51.873782 47.039007,51.837904 47.008341,51.823097 47.013373,51.852235 47.05764,51.819873 47.049269,51.780297 47.104107,51.81079 47.15804))\",\"code\":\"atyrau\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"168\",\"name\":\"Ðтырау\",\"time_zone\":{\"name\":\"Asia/Atyrau\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((49.721871 40.236951,49.552339 40.183,49.533881 40.259461,49.582669 40.319834,49.535506 40.376409,49.529234 40.487695,49.542242 40.520306,49.528384 40.57793,49.476319 40.615977,49.534976 40.639563,49.478131 40.708582,49.516905 40.733556,49.580585 40.671048,49.742238 40.610877,50.047622 40.629235,50.197281 40.599872,50.34968 40.498679,50.412499 40.368689,50.433864 40.223615,50.35608 40.199446,50.032546 40.24974,49.721871 40.236951))\",\"code\":\"baku\",\"country_code\":\"az\",\"domain\":\"az\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"209\",\"name\":\"Баку\",\"time_zone\":{\"name\":\"Asia/Baku\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((47.725427 52.036702,47.748714 52.060939,47.860251 52.057786,47.850971 52.029011,47.879672 52.020045,47.878343 51.997199,47.829159 51.970019,47.802026 51.964036,47.79878 51.97669,47.720913 51.954501,47.699814 52.016127,47.725427 52.036702))\",\"code\":\"balakovo\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"121\",\"name\":\"Балаково\",\"time_zone\":{\"name\":\"Europe/Saratov\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((83.928748 53.507088,83.958924 53.474057,84.085515 53.473398,84.175059 53.491398,84.244766 53.479354,84.252861 53.450982,84.212018 53.445806,84.220531 53.397514,84.153577 53.393644,84.113666 53.342338,84.065249 53.322099,84.085325 53.299145,84.007656 53.124723,83.829412 53.119967,83.841391 53.105761,83.82457 53.091551,83.752618 53.110593,83.765491 53.119643,83.743587 53.128187,83.66524 53.124648,83.62449 53.145085,83.62725 53.129512,83.597794 53.129087,83.480861 53.171378,83.447607 53.152209,83.423017 53.173034,83.440163 53.184845,83.393189 53.243041,83.420765 53.275431,83.355743 53.326489,83.417758 53.339642,83.39828 53.373223,83.359899 53.358989,83.345893 53.372393,83.4203 53.408614,83.423045 53.420274,83.385145 53.425419,83.41033 53.445014,83.401345 53.460413,83.454096 53.455281,83.510199 53.504089,83.604538 53.478418,83.69242 53.482115,83.700773 53.473259,83.686064 53.462011,83.70283 53.453045,83.773714 53.458918,83.928748 53.507088))\",\"code\":\"barnaul\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"4\",\"name\":\"Барнаул\",\"time_zone\":{\"name\":\"Asia/Barnaul\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((36.408454 50.586924,36.364963 50.614887,36.375499 50.618519,36.351604 50.645128,36.360667 50.672724,36.498137 50.712983,36.5567 50.702049,36.558012 50.689755,36.58454 50.697503,36.598181 50.682437,36.660204 50.70429,36.707462 50.693417,36.800423 50.735202,36.792352 50.715029,36.80311 50.70913,36.953653 50.68767,36.916122 50.620099,36.793726 50.595649,36.791261 50.57059,36.74007 50.54822,36.707136 50.505906,36.607104 50.497135,36.610968 50.482069,36.422398 50.503675,36.407339 50.51763,36.460387 50.542201,36.458536 50.563008,36.408454 50.586924))\",\"code\":\"belgorod\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"46\",\"name\":\"Белгород\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((84.874519 52.630301,84.96163 52.640567,84.982697 52.620134,85.093095 52.688834,85.116926 52.689539,85.153911 52.634772,85.220059 52.615266,85.344146 52.674309,85.416886 52.616859,85.538556 52.454311,85.859648 52.442483,85.990975 52.322501,86.243941 52.161275,86.232545 52.017703,86.172892 52.019743,86.130729 52.068279,86.143888 52.084258,86.012143 52.084362,85.869512 52.130262,85.850951 52.105479,85.74295 52.113436,85.701278 52.096576,85.682498 52.024578,85.58501 51.993302,85.544145 51.942899,85.558749 51.906102,85.415412 51.879329,85.364843 51.890686,85.252811 51.873429,85.052969 51.887588,84.909731 51.82692,84.777548 51.897267,84.763076 51.88263,84.715642 51.905948,84.678258 51.877171,84.59717 51.888289,84.558869 51.925041,84.512641 51.932725,84.500581 51.956761,84.464805 51.945612,84.450834 51.973785,84.463158 51.992048,84.504642 52.021509,84.532127 52.022362,84.553064 52.053188,84.504543 52.079354,84.473112 52.075977,84.449089 52.100058,84.573503 52.137237,84.503848 52.222385,84.483005 52.277609,84.588967 52.290758,84.612451 52.484775,84.573893 52.523347,84.680635 52.549619,84.669706 52.572998,84.874519 52.630301))\",\"code\":\"biysk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"20\",\"name\":\"БийÑк\",\"time_zone\":{\"name\":\"Asia/Barnaul\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((133.076389 48.722009,132.924515 48.698156,132.88111 48.731395,132.778214 48.736631,132.79836 48.781288,132.825762 48.781726,132.838483 48.89423,132.915111 48.887804,132.938004 48.851563,133.130378 48.732886,133.076389 48.722009))\",\"code\":\"birobidzhan\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"157\",\"name\":\"Биробиджан\",\"time_zone\":{\"name\":\"Asia/Vladivostok\",\"offset\":600},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((75.33643 42.85545,75.570302 42.830459,75.716812 42.797344,75.761433 42.833491,75.786311 42.899161,75.823518 42.940253,75.937224 42.955718,75.949176 42.933001,76.028275 42.911042,76.194148 42.931117,76.200932 42.91645,76.302069 42.910942,76.303927 42.874442,76.343846 42.860756,76.47828 42.884302,76.522591 42.922249,76.575247 42.906103,76.603487 42.916155,76.708886 42.904153,76.749231 42.921514,76.755876 42.949774,76.822744 42.955093,76.835842 42.982848,76.917246 42.965857,76.9719 42.986711,77.004469 42.98309,77.035094 42.947192,77.062577 42.976592,77.154973 42.972254,77.156765 42.944425,77.179907 42.946993,77.234786 42.911813,77.302013 42.916541,77.350501 42.898513,77.47156 42.939266,77.485265 42.924637,77.552523 42.941107,77.581041 42.915514,77.670445 42.917955,77.696993 42.903906,77.780651 42.914754,77.82376 42.884439,77.874056 42.888611,77.911121 42.870732,77.934015 42.881626,77.968122 42.85082,78.002178 42.870654,78.054338 42.847632,78.091759 42.849356,78.116667 42.864588,78.171543 42.860289,78.197829 42.881989,78.348808 42.854848,78.370535 42.886981,78.430884 42.878797,78.464812 42.896432,78.566261 42.511021,78.677523 42.274735,77.64754 41.928742,77.283159 41.907998,77.092381 41.914309,76.583726 41.973638,76.17608 42.104976,76.021959 42.228659,75.992606 42.278642,75.996152 42.316469,75.982604 42.334876,75.995431 42.383247,75.984839 42.390884,75.908185 42.398192,75.884981 42.362349,75.80915 42.354528,75.77166 42.393324,75.679856 42.418715,75.635548 42.448328,75.568927 42.419523,75.530117 42.424251,75.515018 42.454551,75.486241 42.434229,75.407376 42.424195,75.376071 42.450156,75.280345 42.417396,75.197902 42.435125,75.153735 42.42587,75.108622 42.4444,75.079342 42.420226,75.045402 42.419472,75.007472 42.445055,74.969555 42.423173,74.916158 42.438041,74.791378 42.409699,74.416615 42.409699,74.414462 42.78905,74.39828 42.813256,74.413494 42.891453,74.4117 43.079799,74.633389 43.080409,74.749879 42.989881,74.853304 42.999852,75.223534 42.855173,75.33643 42.85545))\",\"code\":\"bishkek\",\"country_code\":\"kg\",\"domain\":\"kg\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"112\",\"name\":\"Бишкек\",\"time_zone\":{\"name\":\"Asia/Bishkek\",\"offset\":360},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((127.363676 50.403782,127.352443 50.441714,127.286463 50.467049,127.308368 50.520539,127.35453 50.542847,127.365778 50.577122,127.32975 50.625076,127.339437 50.679426,127.37608 50.702813,127.438103 50.784749,127.502736 50.82393,127.470168 50.892265,127.506464 50.931666,127.518609 51.029694,127.581071 51.042821,127.551575 51.089284,127.557909 51.128425,127.778 51.188068,127.817906 51.171164,127.921142 51.188613,127.923196 51.300574,127.944321 51.314406,127.93066 51.355243,127.985511 51.358863,128.022633 51.429539,128.070445 51.46957,128.257926 51.483286,128.329658 51.519172,128.389503 51.521946,128.395878 51.446126,128.453377 51.399746,128.451067 51.370352,128.523637 51.234533,128.522651 51.192067,128.569036 51.149161,128.599768 51.017885,128.663862 50.963103,128.657126 50.91772,128.681753 50.845115,128.566439 50.837419,128.392974 50.766518,128.36949 50.723945,128.252358 50.667232,128.175873 50.678308,128.165733 50.646583,128.132461 50.646556,128.10285 50.592973,128.007649 50.597843,127.984834 50.55919,128.031558 50.508262,128.062677 50.515051,128.059117 50.460764,128.005363 50.446487,127.957847 50.382386,127.953517 50.353369,127.911761 50.344062,127.869282 50.309829,127.900232 50.296527,127.877986 50.272908,127.83693 50.287922,127.826364 50.272383,127.768876 50.273176,127.73903 50.224478,127.612184 50.208694,127.598956 50.238392,127.37093 50.289745,127.325315 50.33611,127.363676 50.403782))\",\"code\":\"blagoveshensk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"52\",\"name\":\"БлаговещенÑк\",\"time_zone\":{\"name\":\"Asia/Yakutsk\",\"offset\":540},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((101.089619 56.502645,102.059766 56.482523,102.016041 55.92995,101.059727 55.949659,101.089619 56.502645))\",\"code\":\"bratsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"51\",\"name\":\"БратÑк\",\"time_zone\":{\"name\":\"Asia/Irkutsk\",\"offset\":480},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((34.306993 53.164362,34.180919 53.124632,34.121062 53.140568,34.091692 53.164732,34.097431 53.204355,34.11895 53.226269,34.088316 53.250407,34.103132 53.263035,34.089647 53.278232,34.154639 53.367685,34.144788 53.411926,34.193721 53.450275,34.297092 53.452291,34.34449 53.486122,34.464258 53.473829,34.543914 53.407776,34.606363 53.270293,34.581757 53.171344,34.432761 53.148647,34.306993 53.164362))\",\"code\":\"bryansk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"62\",\"name\":\"БрÑнÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((31.211943 58.6702,31.254682 58.712294,31.34888 58.696046,31.373219 58.722165,31.419891 58.716772,31.4286 58.697627,31.518878 58.684671,31.518065 58.618393,31.642191 58.534742,31.323177 58.410328,31.255009 58.436947,31.261078 58.452358,31.18483 58.473859,31.121912 58.437613,31.055469 58.474338,31.121487 58.536682,31.143158 58.634691,31.182295 58.677821,31.211943 58.6702))\",\"code\":\"v_novgorod\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true},\"id\":\"77\",\"name\":\"Великий Ðовгород\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((132.275102 43.150151,132.21611 43.028072,132.078173 42.898095,131.953248 42.837472,131.683704 42.786249,131.556063 42.836001,131.587829 43.001127,131.576277 43.03842,131.463549 43.143762,131.411051 43.399272,131.352056 43.462375,131.469144 43.517281,131.542647 43.523577,131.624304 43.564967,131.656048 43.582531,131.684033 43.635493,131.730653 43.665958,131.862315 43.646831,131.897687 43.669349,132.019485 43.644788,132.055686 43.590407,132.262319 43.527494,132.291052 43.534936,132.377914 43.481564,132.356268 43.458463,132.371029 43.453495,132.343238 43.430952,132.364157 43.419062,132.349499 43.396926,132.363818 43.367117,132.337976 43.336729,132.275102 43.150151))\",\"code\":\"vladivostok\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"25\",\"name\":\"ВладивоÑток\",\"time_zone\":{\"name\":\"Asia/Vladivostok\",\"offset\":600},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((44.664457 42.774425,44.673451 42.752473,44.636215 42.744987,44.577743 42.745408,44.551647 42.769135,44.573402 42.819361,44.558996 42.879702,44.598999 42.937189,44.586232 42.960717,44.623482 42.987794,44.628743 43.033283,44.571988 43.080116,44.619739 43.12101,44.704355 43.117526,44.703771 43.068887,44.74241 43.055611,44.727759 43.028178,44.729312 42.964361,44.688017 42.961324,44.668556 42.940746,44.676302 42.915877,44.646184 42.91671,44.632926 42.891378,44.646862 42.844371,44.665573 42.832257,44.664457 42.774425))\",\"code\":\"vladikavkaz\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"114\",\"name\":\"Владикавказ\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((40.553697 56.016865,40.321166 56.021603,40.181044 56.034779,40.141737 56.053492,40.159347 56.071072,40.162239 56.12833,40.185872 56.155526,40.161254 56.184066,40.179205 56.210653,40.158592 56.250966,40.162371 56.288428,40.181312 56.297852,40.17218 56.344226,40.198005 56.43593,40.259638 56.467022,40.303939 56.466565,40.695168 56.461839,40.743413 56.430182,40.70655 56.397878,40.703366 56.336406,40.716351 56.326915,40.678552 56.280342,40.688775 56.179039,40.713729 56.10864,40.613067 56.009461,40.553697 56.016865))\",\"code\":\"vladimir\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"59\",\"name\":\"Владимир\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((44.516273 48.264479,44.516501 48.286667,44.428333 48.293447,44.399822 48.305594,44.396745 48.328586,44.344889 48.33147,44.196749 48.239567,43.979783 48.328917,43.961466 48.345426,43.97311 48.362576,43.965729 48.407124,44.027168 48.465634,43.980829 48.472365,43.967298 48.506967,43.93733 48.506507,43.938644 48.52096,43.905835 48.519426,43.914095 48.547647,43.87482 48.582051,43.861216 48.623052,43.92897 48.621593,43.903636 48.658218,43.948472 48.707149,43.93956 48.731587,43.866099 48.764575,43.887828 48.792165,43.973955 48.851479,44.016491 48.828807,44.031502 48.841955,44.019816 48.847323,44.074949 48.89183,44.051643 48.903585,44.085706 48.932574,44.204013 48.899536,44.28802 48.924258,44.328352 48.985704,44.515948 48.948977,44.539657 48.963183,44.615677 48.950562,44.62823 48.972865,44.657701 48.955667,44.859461 48.923239,45.067555 48.808391,45.084772 48.779438,45.070885 48.765136,45.013591 48.761033,45.018099 48.743039,44.962483 48.700986,44.972802 48.677196,45.01123 48.663225,44.992745 48.646118,44.996412 48.618735,45.061759 48.574899,45.028151 48.572541,44.973857 48.454641,45.010793 48.444727,45.025871 48.383055,45.025853 48.357655,44.991761 48.3592,44.983554 48.293086,44.660355 48.266084,44.621043 48.277476,44.626912 48.258531,44.615641 48.25488,44.516273 48.264479))\",\"code\":\"volgograd\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"33\",\"name\":\"Волгоград\",\"time_zone\":{\"name\":\"Europe/Volgograd\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((42.038487 47.559392,42.02831 47.573005,42.076024 47.573168,42.099772 47.613783,42.381517 47.622752,42.398058 47.600464,42.306525 47.553131,42.30273 47.462394,42.234895 47.460529,42.070756 47.505232,42.040161 47.550891,42.049593 47.560952,42.038487 47.559392))\",\"code\":\"volgodonsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"122\",\"name\":\"ВолгодонÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((38.515933 59.121961,38.470498 59.099405,38.287173 59.086542,38.242049 59.06971,38.256449 59.06776,38.249376 59.060387,38.13843 59.057545,37.884693 59.011516,37.711939 59.029731,37.664721 59.081546,37.70754 59.099668,37.682968 59.118858,37.65629 59.212859,37.773079 59.211941,37.763425 59.225848,37.792745 59.234262,37.780588 59.268631,37.808478 59.305886,37.842804 59.311179,37.858537 59.336171,37.92028 59.34456,38.00095 59.328976,38.056271 59.346564,38.264175 59.320357,38.288699 59.328943,38.294461 59.306707,38.345585 59.291117,38.364161 59.312854,38.431422 59.30282,38.469535 59.318513,38.579894 59.291833,38.619833 59.303979,38.639694 59.288489,38.772389 59.30097,38.797706 59.285033,39.147462 59.305821,39.286558 59.337414,39.341859 59.330348,39.369125 59.306394,39.389929 59.335065,39.446643 59.35701,39.517848 59.358059,39.564516 59.331783,39.64683 59.350232,39.706341 59.344757,39.73792 59.371294,39.844323 59.411915,39.889432 59.392979,39.954988 59.398814,40.02458 59.371897,40.030302 59.35394,40.084607 59.349239,40.106504 59.356582,40.089706 59.374115,40.130857 59.382287,40.216618 59.391638,40.27283 59.375595,40.250158 59.354497,40.26296 59.346693,40.242702 59.342184,40.252141 59.332838,40.225744 59.336649,40.246397 59.325743,40.228672 59.316877,40.247251 59.311451,40.224826 59.310067,40.240377 59.299427,40.21765 59.300999,40.218215 59.278978,40.240547 59.266124,40.181195 59.256487,40.251511 59.213126,40.243574 59.204086,40.265573 59.213458,40.31158 59.19275,40.29853 59.186994,40.31338 59.169114,40.302155 59.15758,40.320565 59.15105,40.307792 59.141563,40.278849 59.152818,40.274394 59.132783,40.314184 59.123407,40.280647 59.101449,40.226748 59.096124,40.224546 59.077343,40.197595 59.066177,40.21457 59.039474,40.020498 59.016182,39.97751 59.031356,39.986346 59.045589,39.954664 59.067231,39.591774 59.041542,39.263641 59.061524,39.210222 59.076502,39.203899 59.063475,39.174891 59.062283,39.178316 59.072796,39.159241 59.060182,38.800039 59.068355,38.515933 59.121961))\",\"code\":\"vologda\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true},\"id\":\"78\",\"name\":\"Вологда\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((39.637859 51.797705,39.607537 51.754585,39.622517 51.734659,39.606708 51.714575,39.610185 51.660125,39.58174 51.613567,39.610219 51.594727,39.587116 51.548658,39.595572 51.472616,39.432197 51.463614,39.367228 51.482856,39.282321 51.47193,39.239086 51.494705,39.043242 51.47568,39.036446 51.460721,38.985148 51.451112,38.95836 51.467983,38.975484 51.587634,38.951825 51.601623,38.981717 51.616267,39.01502 51.668308,39.004525 51.686329,38.963301 51.685541,38.949909 51.702812,38.961571 51.744377,38.993182 51.762764,38.986398 51.78014,39.03206 51.824939,38.998914 51.869945,39.080845 51.918867,39.110392 51.906079,39.171912 51.925341,39.17323 51.913889,39.208998 51.916168,39.213598 51.938079,39.277114 51.947584,39.360584 51.926612,39.352964 51.907998,39.5571 51.903533,39.654444 51.882491,39.686652 51.855648,39.66049 51.849479,39.637859 51.797705))\",\"code\":\"voronezh\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"31\",\"name\":\"Воронеж\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((45.577119 43.322029,45.569157 43.338831,45.433189 43.386976,45.536872 43.389929,45.543081 43.405992,45.629672 43.419276,45.788784 43.395464,45.792415 43.376378,45.910888 43.3694,45.941572 43.352295,45.99123 43.378517,46.009982 43.422896,46.048764 43.452756,46.177622 43.450007,46.233921 43.420396,46.266297 43.442051,46.309888 43.433662,46.313981 43.466559,46.333912 43.458682,46.335194 43.400712,46.369918 43.341747,46.409527 43.324279,46.424985 43.294635,46.392708 43.186772,46.300198 43.174001,46.301016 43.143115,46.207397 43.13973,46.208392 43.088745,46.177689 43.08407,46.17819 43.065086,46.158127 43.052675,46.132947 43.050947,46.134143 43.068942,46.106337 43.093019,46.062857 43.10399,46.071517 43.063537,46.002833 43.073933,46.002547 43.03333,45.941575 43.023107,45.874379 42.977407,45.827314 43.00629,45.823516 42.993303,45.733557 42.988491,45.710197 42.958296,45.674219 42.966668,45.66205 42.953963,45.642825 42.980539,45.623245 42.970773,45.617945 43.023811,45.573545 43.015501,45.577072 42.990507,45.528611 43.003187,45.522979 42.9649,45.475822 42.938317,45.438189 42.946893,45.387398 42.984512,45.381979 43.007043,45.405465 43.062943,45.372441 43.087094,45.342988 43.077263,45.333014 43.115045,45.360799 43.136981,45.411034 43.136924,45.444513 43.178462,45.490208 43.187866,45.54258 43.252313,45.579628 43.253767,45.591963 43.30267,45.577119 43.322029))\",\"code\":\"grozny\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":true,\"road_network\":true},\"id\":\"115\",\"name\":\"Грозный\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((49.632743 54.297011,49.623729 54.247956,49.714383 54.237822,49.75288 54.200088,49.916137 54.146576,49.897869 54.100437,49.794678 54.088894,49.595455 54.099147,49.441749 54.162971,49.288109 54.138944,49.238025 54.180657,49.171741 54.162852,49.087943 54.177067,49.100666 54.223599,49.19128 54.23221,49.124791 54.264259,49.139927 54.28225,49.129537 54.293072,49.19362 54.275096,49.281859 54.350869,49.531337 54.328455,49.632743 54.297011))\",\"code\":\"dimitrovgrad\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"124\",\"name\":\"Димитровград\",\"time_zone\":{\"name\":\"Europe/Ulyanovsk\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((34.759612 48.586275,34.736228 48.631322,34.815791 48.680499,34.844227 48.665649,34.867387 48.680492,34.895435 48.662045,35.045173 48.689446,35.071796 48.661897,35.169567 48.648367,35.223556 48.694563,35.259655 48.677302,35.334139 48.680447,35.387332 48.665332,35.362011 48.621528,35.375749 48.60847,35.27671 48.531025,35.270174 48.501914,35.304892 48.412197,35.294232 48.397961,35.169144 48.347736,35.062569 48.346052,35.001881 48.297516,34.981502 48.309395,34.962903 48.355925,34.932853 48.370919,34.897326 48.377422,34.779704 48.345199,34.751465 48.364636,34.739059 48.383722,34.760305 48.427639,34.709615 48.46969,34.70723 48.488172,34.761707 48.520954,34.776767 48.55535,34.759612 48.586275))\",\"code\":\"dnepropetrovsk\",\"country_code\":\"ua\",\"domain\":\"ua\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"has_net_booklet\":true,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"105\",\"name\":\"Днепр\",\"time_zone\":{\"name\":\"Europe/Kiev\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((59.714357 57.010251,59.843218 57.01357,59.858607 57.032897,59.904726 57.03104,59.923061 57.050275,59.965298 57.054922,60.047762 57.045734,60.038449 57.016691,60.267319 56.995452,60.271682 57.013143,60.419812 57.069198,60.505544 57.043206,60.549708 57.055081,60.70108 57.03633,60.708262 57.058072,60.956449 57.021245,60.940021 56.971993,60.987937 56.928045,60.923753 56.789944,60.976652 56.751103,61.013608 56.744555,60.980369 56.72748,60.977227 56.693708,60.924551 56.702746,60.91685 56.678767,60.963803 56.613703,60.922024 56.602385,60.569054 56.588469,60.2624 56.607099,60.255886 56.591301,60.051382 56.601268,60.043108 56.579619,59.770501 56.602052,59.744221 56.627375,59.74666 56.694076,59.700893 56.827711,59.699866 56.855848,59.726605 56.870853,59.714357 57.010251))\",\"code\":\"ekaterinburg\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"9\",\"name\":\"Екатеринбург\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((38.464331 52.588624,38.425164 52.634715,38.498277 52.665741,38.584921 52.654962,38.61107 52.641374,38.624907 52.609917,38.612751 52.58612,38.552223 52.575046,38.50826 52.584209,38.466957 52.571241,38.464331 52.588624))\",\"code\":\"elets\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"126\",\"name\":\"Елец\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((41.197218 56.988588,41.188512 56.952433,41.209276 56.910049,41.142312 56.875722,40.950307 56.862373,40.826517 56.883451,40.832547 56.923862,40.787609 57.009888,40.794165 57.055793,40.834003 57.092259,41.203988 57.090369,41.223977 57.050149,41.197218 56.988588))\",\"code\":\"ivanovo\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"65\",\"name\":\"Иваново\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((52.95169 57.057889,53.495625 57.04823,53.550964 56.995238,53.679549 56.97602,53.710571 56.952482,53.757688 56.946247,53.770523 56.914248,53.729858 56.900484,53.766593 56.879291,53.751346 56.865929,53.793498 56.866158,53.790847 56.836664,53.812192 56.823012,53.756184 56.785803,53.769296 56.690065,53.812523 56.597041,53.804306 56.520944,53.697942 56.519048,53.616029 56.577276,53.379702 56.597815,53.304241 56.670729,52.93186 56.675205,52.939246 56.818944,52.922659 56.824009,52.943466 56.90041,52.95169 57.057889))\",\"code\":\"izhevsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"41\",\"name\":\"ИжевÑк\",\"time_zone\":{\"name\":\"Europe/Samara\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((103.618853 52.641505,103.558668 52.756303,103.558686 52.82878,103.732417 52.82878,103.733328 52.754448,103.754112 52.726338,103.806039 52.685174,103.854878 52.68341,103.928989 52.644714,104.97019 52.64955,104.970828 51.684764,104.59243 51.628024,104.638515 51.456042,104.633082 51.424714,104.10809 51.483461,103.854636 51.574505,103.578177 51.613596,103.647397 51.710443,103.635022 51.734936,103.646101 51.753829,103.625789 52.419895,103.576145 52.430001,103.568526 52.448971,103.624012 52.476944,103.618853 52.641505))\",\"code\":\"irkutsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"11\",\"name\":\"ИркутÑк\",\"time_zone\":{\"name\":\"Asia/Irkutsk\",\"offset\":480},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((69.410092 56.087254,69.355807 56.089424,69.351066 56.100919,69.439472 56.13218,69.516173 56.137615,69.585121 56.121264,69.580699 56.096063,69.525227 56.08951,69.530126 56.066142,69.513621 56.05274,69.410092 56.087254))\",\"code\":\"ishim\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":false},\"id\":\"205\",\"name\":\"Ишим\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((47.588902 56.761482,48.153297 56.748478,48.147576 56.680101,48.161312 56.671347,48.145753 56.658248,48.133249 56.507529,47.572432 56.520416,47.588902 56.761482))\",\"code\":\"yoshkarola\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"70\",\"name\":\"Йошкар-Ола\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((42.578142 44.002138,42.61262 44.127676,42.580833 44.178897,42.578513 44.269256,42.844476 44.304247,42.898396 44.287205,43.109725 44.285919,43.30466 44.306366,43.370345 44.261905,43.494471 44.253583,43.551152 44.211293,43.50578 44.139313,43.558606 44.083451,43.505289 44.031903,43.547468 43.948391,43.608438 43.924491,43.608506 43.901408,43.596063 43.901416,43.589321 43.846011,43.408126 43.84147,43.320009 43.801639,43.305784 43.816049,43.109967 43.767679,42.940469 43.810721,42.895215 43.799429,42.733643 43.817514,42.68112 43.807332,42.647469 43.825702,42.62712 43.86502,42.636618 43.879133,42.586434 43.920709,42.578142 44.002138))\",\"code\":\"minvody\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true},\"id\":\"89\",\"name\":\"КавМинВоды\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((48.293219 55.785858,48.300915 55.83784,48.210824 55.87347,48.264539 55.975911,48.333619 55.987526,48.465319 55.962675,48.549971 55.968903,48.585898 55.99431,48.863615 56.001223,48.935786 56.022691,48.980327 55.999077,49.132549 56.014912,49.172108 55.997201,49.23801 55.998644,49.268193 56.018944,49.425019 55.99398,49.532486 56.012359,49.576513 55.960059,49.572622 55.90025,49.603065 55.871306,49.564515 55.850699,49.569746 55.828722,49.549902 55.803099,49.576929 55.762639,49.553998 55.746684,49.548006 55.711488,49.587559 55.691345,49.549204 55.677128,49.533053 55.652126,49.535477 55.587187,48.477911 55.569986,48.446543 55.546812,48.335021 55.542882,48.302773 55.562068,48.299046 55.576462,48.332055 55.606612,48.289505 55.669048,48.312089 55.675824,48.310374 55.700797,48.265838 55.766996,48.293219 55.785858))\",\"code\":\"kazan\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"21\",\"name\":\"Казань\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((19.833135 54.586099,19.539731 54.713885,19.592596 54.772306,19.580491 54.890235,19.602075 54.967186,19.681958 55.065929,19.760019 55.116599,19.921503 55.158093,20.201823 55.16015,20.401084 55.18063,20.653783 55.384,20.953702 55.280833,21.137338 55.253862,21.136177 54.889236,21.196062 54.84523,21.163697 54.806789,21.1801 54.783729,21.169734 54.745675,21.143762 54.746284,21.121719 54.718137,21.179906 54.65098,21.15228 54.629143,21.173176 54.569384,21.151091 54.554846,20.822897 54.548373,20.766945 54.528812,20.516593 54.505253,20.495685 54.489603,20.400609 54.518031,20.279696 54.524275,20.205102 54.496552,20.090973 54.539175,20.018733 54.522701,19.833135 54.586099))\",\"code\":\"kaliningrad\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"40\",\"name\":\"Калининград\",\"time_zone\":{\"name\":\"Europe/Kaliningrad\",\"offset\":120},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((35.894818 54.755461,36.233835 54.780396,36.305069 54.765277,36.455305 54.768523,36.469927 54.533953,36.484893 54.525984,36.470977 54.516984,36.482233 54.33388,36.210971 54.327911,36.181685 54.299591,36.116858 54.321124,35.927655 54.321024,35.919922 54.424265,35.908394 54.430411,35.909715 54.559813,35.894602 54.569411,35.905908 54.610036,35.901032 54.674135,35.886054 54.687341,35.899607 54.69282,35.894818 54.755461))\",\"code\":\"kaluga\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"61\",\"name\":\"Калуга\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((61.715751 56.571122,62.254705 56.57552,62.260467 56.279794,61.725677 56.275445,61.72515 56.29129,61.694373 56.30755,61.559193 56.348059,61.550908 56.439793,61.613644 56.493314,61.698796 56.477302,61.718449 56.491317,61.715751 56.571122))\",\"code\":\"k_uralskiy\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"109\",\"name\":\"КаменÑк-УральÑкий\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((45.305955 50.108969,45.334659 50.135989,45.379769 50.121318,45.416263 50.147737,45.50263 50.114011,45.392887 49.993251,45.312501 50.029989,45.287717 50.075894,45.305955 50.108969))\",\"code\":\"kamyshin\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"127\",\"name\":\"Камышин\",\"time_zone\":{\"name\":\"Europe/Volgograd\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((72.86687 49.97048,72.864145 50.031985,72.830379 50.071579,72.835457 50.132364,72.846029 50.159294,72.930852 50.192972,73.145574 50.170885,73.166584 50.157115,73.353485 50.153223,73.413468 50.005306,73.38921 49.686854,73.2999 49.65147,73.198415 49.637712,72.861947 49.688026,72.877067 49.738372,72.86687 49.97048))\",\"code\":\"karaganda\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"84\",\"name\":\"Караганда\",\"time_zone\":{\"name\":\"Asia/Almaty\",\"offset\":360},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((86.326511 55.27068,86.327501 55.212118,85.914901 55.209146,85.909911 55.391534,85.878124 55.455955,85.975237 55.53017,86.147776 55.546002,86.177738 55.53357,86.322012 55.534428,86.326511 55.27068))\",\"code\":\"kemerovo\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"5\",\"name\":\"Кемерово\",\"time_zone\":{\"name\":\"Asia/Novokuznetsk\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((30.22961 50.267519,30.223507 50.300093,30.25384 50.347728,30.182345 50.379717,30.215735 50.383491,30.2129 50.410805,30.233945 50.426908,30.189932 50.495419,30.184392 50.542952,30.159363 50.551394,30.195035 50.592759,30.17089 50.624591,30.231123 50.608696,30.237532 50.620663,30.533346 50.642951,30.863637 50.622122,30.879715 50.64059,30.966927 50.626768,31.024126 50.643575,31.035615 50.607792,31.060791 50.596683,31.037552 50.535067,31.050481 50.516185,31.009887 50.473547,31.033795 50.466554,31.022826 50.429117,31.037104 50.420592,30.981337 50.390454,31.028961 50.320665,31.008512 50.285742,31.021363 50.275282,30.936583 50.173499,30.827588 50.20094,30.707049 50.185771,30.693523 50.164134,30.580134 50.195841,30.535508 50.182902,30.491132 50.205966,30.426931 50.212479,30.387748 50.191182,30.395631 50.139307,30.382961 50.137256,30.28915 50.170345,30.292954 50.181097,30.217764 50.178859,30.234774 50.201299,30.207971 50.224888,30.225589 50.232737,30.22961 50.267519))\",\"code\":\"kiev\",\"country_code\":\"ua\",\"domain\":\"ua\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"107\",\"name\":\"Киев\",\"time_zone\":{\"name\":\"Europe/Kiev\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((34.280779 35.226702,34.230518 35.176645,34.311619 35.053578,34.333255 34.94624,34.30553 34.86475,34.246532 34.802092,34.131869 34.756001,33.987598 34.764336,33.917176 34.742875,33.835702 34.739903,33.790212 34.684859,33.72822 34.642865,33.448103 34.538793,33.259541 34.501493,33.192432 34.413254,33.066976 34.363612,32.915196 34.369952,32.805837 34.40138,32.743846 34.438844,32.58024 34.461878,32.38906 34.52014,32.257081 34.592284,32.192743 34.651138,32.082486 34.819072,32.02449 35.022688,32.045537 35.17596,32.115025 35.264403,32.213492 35.309184,32.362822 35.30542,32.471669 35.368093,32.671189 35.399121,32.678969 35.453037,32.711632 35.513637,32.766439 35.562413,32.837579 35.594163,32.949971 35.603965,33.302016 35.553834,33.553453 35.562031,33.937128 35.666397,34.067997 35.744069,34.543625 35.906784,34.67294 35.905835,34.78423 35.852299,34.837429 35.785874,34.855318 35.707916,34.841183 35.642705,34.776411 35.536547,34.710709 35.47953,34.280779 35.226702))\",\"code\":\"cyprus\",\"country_code\":\"cy\",\"domain\":\"com.cy\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"has_net_booklet\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true},\"id\":\"173\",\"name\":\"Кипр\",\"time_zone\":{\"name\":\"Asia/Nicosia\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":19,\"min\":9}},{\"bounds\":\"POLYGON((49.036766 58.786454,49.936128 58.797004,49.939573 58.684007,49.959251 58.673889,49.93995 58.668113,49.941856 58.608637,49.954576 58.598196,49.934361 58.587878,49.947791 58.410879,49.279365 58.403646,49.046044 58.381452,49.013389 58.401974,49.056584 58.431236,49.044913 58.641473,49.024698 58.656477,49.042463 58.685214,49.036766 58.786454))\",\"code\":\"kirov\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"58\",\"name\":\"Киров\",\"time_zone\":{\"name\":\"Europe/Kirov\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((41.324341 56.41256,41.360712 56.411533,41.375763 56.391722,41.369469 56.371691,41.38204 56.364131,41.369496 56.355751,41.392262 56.297302,41.226105 56.321779,41.225754 56.349508,41.260902 56.352017,41.257121 56.375225,41.324341 56.41256))\",\"code\":\"kovrov\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"129\",\"name\":\"Ковров\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((74.438523 62.183881,74.420135 62.270479,74.430153 62.278546,74.397794 62.298115,74.415774 62.30622,74.344315 62.334832,74.393193 62.369046,74.540709 62.360474,74.610183 62.388361,74.723418 62.39534,74.786843 62.423937,74.850658 62.409232,74.803643 62.249431,74.70658 62.252803,74.577864 62.209883,74.555755 62.197961,74.538665 62.159626,74.438523 62.183881))\",\"code\":\"kogalym\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":true,\"road_network\":true},\"id\":\"207\",\"name\":\"Когалым\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((69.004116 53.276659,68.997167 53.318062,69.167949 53.327877,69.161429 53.39313,69.274826 53.383133,69.277034 53.397231,69.315124 53.404166,69.327714 53.370948,69.426323 53.365164,69.615022 53.377566,69.762747 53.305991,69.867178 53.20418,70.039459 53.155209,70.24582 53.165043,70.368026 53.153623,70.404051 53.116561,70.478959 52.928993,70.201804 52.871445,70.179755 52.895084,70.141435 52.904612,69.911928 52.819776,69.682352 52.812507,69.557302 52.828986,69.320958 52.938954,69.146486 52.881871,69.012816 52.910955,69.147482 53.140112,69.27637 53.224041,69.012491 53.225447,69.004116 53.276659))\",\"code\":\"kokshetau\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"201\",\"name\":\"Кокшетау\",\"time_zone\":{\"name\":\"Asia/Almaty\",\"offset\":360},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((136.753811 50.349972,136.732015 50.546639,136.73738 50.63626,136.77424 50.671445,136.80805 50.6719,136.854575 50.708454,137.019275 50.726093,137.047688 50.709087,137.256608 50.703973,137.300987 50.652509,137.309118 50.592302,137.281873 50.545506,137.254966 50.304488,137.178429 50.223625,137.11257 50.180152,137.020128 50.156,136.927338 50.192698,136.781474 50.184059,136.673594 50.228365,136.66226 50.244675,136.69045 50.321326,136.753811 50.349972))\",\"code\":\"komsomolsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"94\",\"name\":\"КомÑомольÑк-на-Ðмуре\",\"time_zone\":{\"name\":\"Asia/Vladivostok\",\"offset\":600},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((63.570864 53.081786,63.541088 53.060798,63.459462 53.101271,63.510712 53.125499,63.455974 53.201547,63.485376 53.216818,63.484464 53.256371,63.624834 53.31686,63.646629 53.291543,63.746165 53.288387,63.629891 53.161294,63.673836 53.157604,63.570864 53.081786))\",\"code\":\"kostanay\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"203\",\"name\":\"КоÑтанай\",\"time_zone\":{\"name\":\"Asia/Qostanay\",\"offset\":360},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((40.788473 57.681147,40.721084 57.692701,40.692564 57.764686,40.707715 57.874069,40.735404 57.932043,41.147257 57.918584,41.161447 57.8944,41.144947 57.828475,41.161745 57.817451,41.145293 57.807733,41.142643 57.763042,41.249968 57.756545,41.254896 57.746786,41.227806 57.733607,41.262881 57.699929,41.252848 57.6391,41.297403 57.629007,41.332197 57.639148,41.345872 57.629254,41.321757 57.619604,41.336817 57.599944,41.371448 57.605378,41.429376 57.587392,41.416492 57.57385,41.443097 57.564433,41.622124 57.527835,41.565535 57.45075,41.251317 57.487254,41.171949 57.470335,41.103326 57.535377,41.081717 57.583511,41.088843 57.62561,40.992319 57.669171,40.788473 57.681147))\",\"code\":\"kostroma\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"34\",\"name\":\"КоÑтрома\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((38.648205 45.176459,38.711098 45.219943,38.64025 45.271538,38.739748 45.340829,38.781788 45.31473,38.809501 45.327281,38.918451 45.294308,39.028441 45.284592,39.133021 45.284649,39.126668 45.316536,39.18719 45.315047,39.203489 45.300914,39.195239 45.289067,39.229994 45.265847,39.342399 45.254044,39.341222 45.278697,39.375139 45.284872,39.375049 45.305136,39.42069 45.309048,39.420767 45.33267,39.438429 45.332534,39.438452 45.305691,39.476685 45.305822,39.515106 45.314946,39.514719 45.360149,39.590516 45.360254,39.58218 45.375156,39.61652 45.377122,39.616013 45.441469,39.782302 45.441817,39.884814 45.419673,39.884766 45.432944,39.974064 45.432962,39.972445 45.45423,40.033952 45.458633,40.053085 45.413529,40.05355 45.358697,40.066274 45.359836,40.061038 45.260974,40.084628 45.256029,40.120102 45.278532,40.121369 45.245675,40.087582 45.197403,40.125426 45.184296,40.091663 45.135792,40.103098 45.131839,40.090267 45.099343,40.075233 45.109694,40.067071 45.094767,40.040236 45.102505,39.968812 45.080594,39.932968 45.095803,39.893669 45.084306,39.900028 45.096349,39.8718 45.111831,39.811315 45.113393,39.801652 45.129778,39.779674 45.123251,39.763667 45.136796,39.748665 45.128406,39.679284 45.167582,39.512034 45.037447,39.471249 45.035691,39.477936 44.987874,39.494979 44.975921,39.519018 44.987239,39.504601 44.968403,39.575083 44.942018,39.598598 44.911517,39.642513 44.894467,39.636756 44.878842,39.652507 44.87109,39.56203 44.837481,39.559578 44.806959,39.528955 44.811802,39.525045 44.789938,39.552019 44.795464,39.577078 44.765319,39.607462 44.775225,39.601502 44.742373,39.538293 44.691646,39.527854 44.65156,39.471062 44.640018,39.44626 44.575409,39.400566 44.576687,39.399677 44.556433,39.348204 44.529861,39.434926 44.505319,39.429588 44.483089,39.393221 44.455096,39.318938 44.459505,39.270371 44.426891,39.139535 44.457873,39.087526 44.448877,39.023849 44.38142,39.016852 44.409412,38.988065 44.397481,38.919437 44.421173,38.978084 44.443491,38.917879 44.495954,38.835643 44.510765,38.82169 44.500486,38.801122 44.513945,38.648179 44.489009,38.621174 44.718423,38.637552 44.732517,38.654426 44.726165,38.661505 44.828782,38.628541 44.83052,38.632211 44.886243,38.571424 44.976362,38.57103 45.038671,38.558308 45.040626,38.558543 45.053779,38.583641 45.05373,38.593846 45.138214,38.648205 45.176459))\",\"code\":\"krasnodar\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"23\",\"name\":\"КраÑнодар\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((92.113779 56.321481,92.546479 56.312921,92.686641 56.325006,92.698244 56.291704,92.880347 56.302262,92.918469 56.291319,92.944001 56.307758,92.963621 56.302029,92.967659 56.283178,92.996031 56.282857,93.02555 56.286858,93.024781 56.301334,93.089399 56.288399,93.351495 56.315506,93.353739 56.342098,93.385382 56.363574,93.483792 56.38784,93.525359 56.374674,93.77863 56.398338,93.778276 56.380571,93.821835 56.380351,93.812101 56.372773,93.825779 56.354057,93.727457 56.346694,93.733019 56.312658,93.651538 56.2072,93.676809 56.082704,93.676166 55.971304,93.645915 55.960206,93.693796 55.933158,93.663013 55.903518,93.698591 55.864907,93.668272 55.853942,93.681915 55.826012,93.654649 55.815941,93.650075 55.798052,93.344177 55.79616,93.321039 55.768104,93.279456 55.75733,92.945976 55.703893,92.906977 55.71333,92.906321 55.728977,92.823133 55.719781,92.795316 55.731038,92.781834 55.71597,92.76803 55.762376,92.720126 55.706235,92.706141 55.730738,92.545351 55.70355,92.477531 55.726778,92.405115 55.714618,92.34148 55.750768,92.272349 55.750681,92.271845 55.76861,92.227358 55.785552,92.226932 55.808601,92.118327 55.809971,92.105462 55.889204,91.850422 55.921905,91.746327 55.980599,91.291593 56.116023,91.146534 56.138309,90.665944 56.126281,90.207837 56.179432,90.201484 56.209533,90.182071 56.213938,90.210508 56.261959,90.143113 56.33793,90.479371 56.361035,90.582924 56.405539,90.676753 56.418299,90.8965 56.387376,91.040676 56.345942,91.102184 56.350933,91.305577 56.280725,91.373457 56.331809,91.535323 56.305279,91.781009 56.295613,92.113779 56.321481))\",\"code\":\"krasnoyarsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"7\",\"name\":\"КраÑноÑÑ€Ñк\",\"time_zone\":{\"name\":\"Asia/Krasnoyarsk\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((55.632239 52.673496,55.647402 52.696432,55.705649 52.699064,55.752857 52.753508,55.765115 52.859657,55.839739 52.898032,55.966195 52.877797,55.94339 52.863599,55.863068 52.72594,55.809336 52.734984,55.766443 52.690968,55.716005 52.670173,55.632239 52.673496))\",\"code\":\"kumertau\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":true,\"road_network\":true},\"id\":\"210\",\"name\":\"Кумертау\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((65.113307 55.505372,65.3122 55.533618,65.467434 55.529287,65.583217 55.483367,65.594049 55.449838,65.66975 55.429862,65.617468 55.423847,65.574765 55.388161,65.627644 55.301062,65.58624 55.287247,65.576998 55.258639,65.546631 55.243932,65.340727 55.245305,65.185597 55.308037,65.132927 55.350148,65.151683 55.427834,65.119873 55.444896,65.131751 55.467184,65.113307 55.505372))\",\"code\":\"kurgan\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"10\",\"name\":\"Курган\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((35.849262 51.606059,35.879043 51.638528,35.8626 51.657259,35.886388 51.672482,35.871927 51.686705,35.895263 51.728444,35.883312 51.751074,35.897331 51.765358,35.891286 51.788043,35.934091 51.831118,36.017808 51.855342,36.110698 51.829456,36.276347 51.856813,36.413323 51.838129,36.425002 51.820996,36.444293 51.714533,36.421006 51.691959,36.432607 51.674272,36.416084 51.660402,36.414402 51.596078,36.391361 51.577032,36.262953 51.554483,36.243018 51.569354,36.13865 51.563039,36.132669 51.548845,35.978087 51.54813,35.820868 51.567552,35.849262 51.606059))\",\"code\":\"kursk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"73\",\"name\":\"КурÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((94.270724 51.665494,94.315145 51.695673,94.324847 51.744437,94.34902 51.76571,94.433205 51.771844,94.463731 51.76166,94.473999 51.729721,94.541766 51.71555,94.72518 51.714792,94.735961 51.662461,94.446121 51.599531,94.434067 51.594795,94.430591 51.550679,94.319692 51.601377,94.270724 51.665494))\",\"code\":\"kyzyl\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"130\",\"name\":\"Кызыл\",\"time_zone\":{\"name\":\"Asia/Krasnoyarsk\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((85.750103 54.768861,86.495701 54.774252,86.502903 54.184679,85.767947 54.179404,85.766991 54.211526,85.745419 54.22624,85.764502 54.294869,85.761107 54.407891,85.705274 54.437493,85.759129 54.473382,85.750103 54.768861))\",\"code\":\"lenkuz\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"86\",\"name\":\"ЛенинÑк-Кузнецкий\",\"time_zone\":{\"name\":\"Asia/Novokuznetsk\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((39.379824 52.626781,39.37616 52.689433,39.437992 52.71159,39.492999 52.757372,39.569775 52.721367,39.602138 52.740383,39.679225 52.720608,39.755873 52.732008,39.865104 52.702656,39.878631 52.711235,39.903903 52.688304,39.838586 52.667735,39.875348 52.630581,39.799054 52.595293,39.869859 52.538809,39.850993 52.479662,39.807101 52.503142,39.546783 52.477641,39.387742 52.513898,39.376843 52.520679,39.41612 52.57348,39.392041 52.58361,39.395286 52.600255,39.36358 52.602605,39.379824 52.626781))\",\"code\":\"lipetsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"56\",\"name\":\"Липецк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((150.981148 59.477574,150.939542 59.434108,150.758137 59.418591,150.470178 59.487482,150.506553 59.514398,150.610509 59.542555,150.589885 59.663479,150.701035 59.719942,150.854744 59.743567,151.041303 59.714109,151.034671 59.674065,151.011971 59.658931,151.035755 59.575523,150.981148 59.477574))\",\"code\":\"magadan\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":false,\"road_network\":true},\"id\":\"158\",\"name\":\"Магадан\",\"time_zone\":{\"name\":\"Asia/Magadan\",\"offset\":660},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((59.504226 53.910884,59.464288 53.229865,58.523119 53.245612,58.525287 53.306553,58.507627 53.308733,58.489263 53.338765,58.528757 53.403605,58.547823 53.927025,59.12927 53.927438,59.504226 53.910884))\",\"code\":\"magnitogorsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"26\",\"name\":\"МагнитогорÑк\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((40.089402 44.753763,40.101092 44.757209,40.124716 44.715356,40.113022 44.712041,40.123781 44.692476,40.139033 44.695048,40.134765 44.672794,40.166019 44.622423,40.149476 44.578957,40.166096 44.565791,40.09583 44.557513,40.072631 44.574347,40.042474 44.559919,39.935305 44.615197,39.915045 44.608277,39.920423 44.626134,39.904357 44.641697,39.915984 44.651078,39.896584 44.661932,39.912612 44.676425,39.901178 44.706653,39.942788 44.736295,39.987368 44.717275,40.028921 44.746893,39.994287 44.784918,40.026405 44.793709,40.042246 44.764569,40.077824 44.774653,40.089402 44.753763))\",\"code\":\"maikop\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"131\",\"name\":\"Майкоп\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((47.200468 43.105297,47.206434 43.159023,47.25122 43.157566,47.369732 43.200312,47.446098 43.181238,47.667854 43.183177,47.892502 42.734118,48.423855 41.982785,48.303196 41.947685,48.285053 41.926917,48.26107 41.934388,48.195038 42.082799,48.02685 42.163437,47.996592 42.16361,48.009651 42.184542,47.943113 42.244403,47.851957 42.371181,47.818402 42.459356,47.763654 42.5364,47.714723 42.558413,47.663592 42.649417,47.626102 42.670573,47.553966 42.677473,47.533198 42.703034,47.452585 42.721253,47.297715 42.715881,47.266051 42.693127,47.25329 42.647631,47.324323 42.635935,47.36888 42.607318,47.352361 42.580763,47.157152 42.587953,47.13133 42.602586,47.142422 42.60921,47.104742 42.620487,47.10544 42.638598,47.063136 42.647463,47.028608 42.690907,46.949388 42.70698,46.763845 42.843271,46.634338 42.885493,46.648901 42.916593,46.735891 42.953757,46.757967 43.000438,46.722449 43.019986,46.76681 43.046117,46.789511 43.099039,46.77783 43.148056,46.787127 43.169173,46.823701 43.166458,46.829457 43.18766,46.879266 43.175464,46.966967 43.184592,47.143842 43.103686,47.200468 43.105297))\",\"code\":\"makhachkala\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"113\",\"name\":\"Махачкала\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((59.545758 55.280232,60.184965 55.273894,60.46938 55.240542,60.469595 55.204122,60.500618 55.181581,60.469789 55.133977,60.471651 54.972711,60.453588 54.936386,60.464407 54.921845,60.453185 54.904964,60.271228 54.841976,60.250821 54.794839,59.944492 54.895408,59.771438 54.866503,59.729146 54.886954,59.734627 54.900317,59.522002 54.90492,59.545758 55.280232))\",\"code\":\"miass\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"87\",\"name\":\"МиаÑÑ Ð¸ ЗлатоуÑÑ‚\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((36.843932 55.391978,36.784794 55.397859,36.777835 55.41889,36.815383 55.465206,36.8162 55.507692,36.752402 55.555974,36.766606 55.578763,36.801687 55.582252,36.79972 55.645047,36.773692 55.685786,36.789344 55.74412,36.764182 55.789763,36.789031 55.849394,36.774963 55.851828,36.788479 55.861756,36.771319 55.932067,36.812267 55.953735,36.778755 55.980113,36.768954 56.033447,36.738275 56.063624,36.78088 56.105518,36.764686 56.14976,36.867981 56.193348,36.940014 56.203627,36.970816 56.222263,36.958287 56.238762,37.040434 56.240573,37.067016 56.222993,37.053874 56.215308,37.1412 56.186516,37.350372 56.224372,37.459617 56.200237,37.553765 56.22045,37.787512 56.230706,37.859514 56.218694,38.144384 56.237691,38.284403 56.225313,38.514408 56.244101,38.527957 56.227682,38.756502 56.230105,38.953443 56.213203,39.079952 56.240858,39.1025 56.228962,39.116844 56.127081,39.090756 56.066463,39.142483 56.020898,39.107487 55.925753,39.130746 55.864247,39.102731 55.80784,39.056191 55.775004,39.034139 55.688025,39.046769 55.638546,39.145126 55.566943,39.074506 55.526778,39.079897 55.500779,39.118629 55.481078,39.093981 55.464646,39.110068 55.373845,39.144718 55.352206,39.084704 55.23022,39.091986 55.184523,39.1251 55.151805,39.089913 55.078944,39.06333 55.066245,39.07943 55.055834,39.055515 55.022353,39.004875 55.036595,38.950345 55.004012,38.888025 55.039996,38.599576 55.020946,38.466983 55.054381,38.086314 55.012933,38.008821 55.024609,37.999858 55.042258,37.94916 55.057919,37.864935 55.020766,37.680995 55.006601,37.663283 55.022916,37.619529 55.025243,37.544039 54.989247,37.420827 54.981554,37.415807 54.962128,37.316566 54.96838,36.740567 55.149574,36.746689 55.173545,36.807629 55.201463,36.787527 55.246629,36.803125 55.284317,36.915699 55.347485,36.843932 55.391978))\",\"code\":\"moscow\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"32\",\"name\":\"МоÑква\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((34.916854 69.453324,35.338993 69.451352,35.984152 69.393873,36.129362 69.368396,36.769483 69.21914,37.343866 69.039399,37.662324 68.980628,38.111366 68.850415,38.216579 68.810234,38.342927 68.718875,38.618718 68.590649,38.901838 68.546936,39.177328 68.472291,39.759706 68.374572,41.312596 68.597665,42.505704 66.990239,42.315712 66.8619,41.563897 66.609004,39.689778 65.903118,38.290735 65.691813,36.018929 65.79,34.000325 66.410169,33.397727 66.529103,32.865577 66.583263,32.587114 66.582213,32.557279 66.576102,32.548149 66.479487,32.360389 66.475171,32.342661 66.345393,31.936984 66.351047,31.83003 66.371375,31.791938 66.495233,31.621162 66.502378,31.575857 66.654003,31.086424 66.667324,30.159515 66.652838,30.169506 66.660657,29.322526 66.662861,29.149649 66.78029,29.105562 66.790069,29.119417 66.801373,29.060753 66.852693,29.046064 66.890266,29.033124 66.925472,29.040559 66.961819,29.515365 67.280794,29.504446 67.285391,29.52271 67.309917,29.644543 67.335917,29.616894 67.346394,29.93051 67.522821,30.017341 67.673569,29.661638 67.802984,29.327134 68.074516,28.647838 68.195913,28.43412 68.539795,28.707213 68.732555,28.80145 68.869366,28.66118 68.886474,28.468076 68.885514,28.416086 68.915251,28.929322 69.051906,29.0567 69.01522,29.24223 69.11306,29.23229 69.122837,29.257999 69.15437,29.249769 69.161072,29.28894 69.178824,29.314093 69.233684,29.279615 69.253687,29.290767 69.296913,29.390536 69.322218,29.57299 69.318517,29.695079 69.36345,29.723119 69.389189,29.852189 69.423025,29.94758 69.405109,30.035163 69.424947,30.115103 69.468341,30.119473 69.513656,30.177218 69.536982,30.188101 69.565826,30.137807 69.643539,30.091287 69.642843,30.085325 69.658111,30.151663 69.669379,30.224023 69.653127,30.417722 69.589919,30.515963 69.540426,30.816412 69.528709,30.91 69.548889,30.946505 69.576262,30.954475 69.632433,30.923504 69.668585,30.944747 69.683669,30.874023 69.714982,30.891446 69.72065,30.891068 69.737603,30.817653 69.794839,31.104341 69.979302,31.697363 70.134419,31.94504 70.152975,32.23962 70.134476,32.962008 69.972834,33.299281 69.930956,33.461237 69.894422,33.60639 69.831833,33.697103 69.746574,33.694899 69.681346,33.814641 69.601606,34.407516 69.564316,34.916854 69.453324))\",\"code\":\"murmansk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"96\",\"name\":\"МурманÑÐºÐ°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((42.075511 55.619342,42.068549 55.589226,42.105556 55.523023,42.022669 55.523826,42.016003 55.504829,41.982415 55.501001,41.949284 55.512605,41.944547 55.529745,41.967243 55.550761,41.952801 55.580551,41.992303 55.616841,42.026374 55.630186,42.075511 55.619342))\",\"code\":\"murom\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"132\",\"name\":\"Муром\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((51.723646 55.554874,51.646247 55.574375,51.662207 55.58784,51.65101 55.6276,51.687547 55.640433,51.750524 55.710224,51.706732 55.771285,51.674603 55.784503,51.655854 55.845784,51.789333 55.84846,51.805722 55.856219,51.796582 55.868951,51.914799 55.885486,52.095047 55.849758,52.174898 55.881161,52.234244 55.881702,52.293636 55.853347,52.311799 55.877797,52.33168 55.878953,52.464703 55.858961,52.527841 55.866224,52.622474 55.830049,52.60666 55.798331,52.612551 55.769244,52.591918 55.760726,52.605917 55.756947,52.598503 55.722374,52.632144 55.713565,52.609146 55.696526,52.605417 55.632693,52.618832 55.614353,52.582857 55.607379,52.576773 55.590283,52.510541 55.555623,52.413221 55.54469,52.295177 55.563714,52.171722 55.543903,52.117172 55.555648,51.996244 55.529149,51.935327 55.546367,51.888186 55.540568,51.874118 55.567662,51.723646 55.554874))\",\"code\":\"nabchelny\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"29\",\"name\":\"Ðабережные Челны\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((44.781815 43.187166,44.824282 43.189667,44.83776 43.173946,44.831593 43.14971,44.757225 43.159379,44.747979 43.189734,44.705508 43.226212,44.728521 43.280859,44.768018 43.277796,44.795221 43.248833,44.818011 43.246919,44.781815 43.187166))\",\"code\":\"nazran\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"154\",\"name\":\"Ðазрань\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((43.478522 43.423768,43.518069 43.52891,43.560881 43.513483,43.677653 43.547885,43.747049 43.525597,43.732109 43.502325,43.682558 43.487309,43.691447 43.474771,43.665693 43.437481,43.597604 43.38447,43.478522 43.423768))\",\"code\":\"nalchik\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"134\",\"name\":\"Ðальчик\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((53.022348 67.607263,52.888393 67.622759,52.935412 67.668792,53.120081 67.697897,53.162703 67.684555,53.158178 67.666698,53.173465 67.658365,53.159913 67.636462,53.022348 67.607263))\",\"code\":\"naryanmar\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"159\",\"name\":\"ÐарьÑн-Мар\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((132.750811 42.90212,133.241339 42.910709,133.248191 42.668281,132.759571 42.659764,132.750811 42.90212))\",\"code\":\"nahodka\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"82\",\"name\":\"Ðаходка\",\"time_zone\":{\"name\":\"Asia/Vladivostok\",\"offset\":600},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((42.004171 44.635492,41.991175 44.580785,41.909319 44.583164,41.897376 44.611711,41.911555 44.62582,41.871447 44.658472,41.886618 44.671456,41.866398 44.698941,41.884867 44.717085,41.94802 44.699055,42.004171 44.635492))\",\"code\":\"nevinnomyssk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"135\",\"name\":\"ÐевинномыÑÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((54.28712 56.135492,54.377048 56.10069,54.366146 56.036602,54.206936 56.03527,54.181859 56.067069,54.185012 56.091371,54.233773 56.127646,54.260228 56.11908,54.28712 56.135492))\",\"code\":\"neftekamsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"136\",\"name\":\"ÐефтекамÑк\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((75.931826 61.190935,77.028582 61.178947,77.007817 60.862874,76.79989 60.811169,76.675993 60.819973,76.608242 60.866834,76.574744 60.87297,76.405904 60.85454,75.922257 60.863009,75.931826 61.190935))\",\"code\":\"nizhnevartovsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"12\",\"name\":\"ÐижневартовÑк\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((43.698905 55.546439,43.70569 55.558721,43.681576 55.561972,43.67454 55.578248,43.593297 55.572642,43.590418 55.602468,43.510025 55.663714,43.534796 55.689363,43.539725 55.72664,43.620532 55.727312,43.632723 55.745959,43.602127 55.74409,43.570877 55.762944,43.570502 55.781537,43.533283 55.778601,43.538975 55.806361,43.525344 55.798613,43.483009 55.820534,43.438804 55.801096,43.435333 55.823104,43.474067 55.84075,43.439979 55.895645,43.449855 55.962492,43.400646 55.983169,43.403214 56.02306,43.350545 56.011747,43.334068 56.019705,43.348812 56.028625,43.30845 56.023735,43.318973 56.03415,43.266285 56.085781,43.285191 56.135121,43.229605 56.165666,43.27404 56.176864,43.268324 56.224575,43.333095 56.277604,43.331742 56.291613,43.262507 56.288856,43.232795 56.46447,43.478804 56.50302,43.557171 56.484975,43.578748 56.436087,43.674309 56.463834,43.652844 56.490324,43.673258 56.501015,43.662704 56.510861,43.74359 56.504769,43.746049 56.537651,43.760063 56.544098,43.898733 56.56825,43.918577 56.550293,43.902015 56.531725,43.929245 56.519835,44.117989 56.489175,44.302017 56.487725,44.257758 56.303471,44.285621 56.293472,44.326035 56.18255,44.264303 56.144489,44.287549 56.109782,44.336492 56.112459,44.324849 56.089192,44.337515 56.078338,44.110198 56.038875,44.119245 56.01916,44.093979 56.002272,44.121 55.997692,44.107902 55.988437,44.123674 55.967723,44.097652 55.9638,44.08311 55.922851,44.103838 55.916349,44.054165 55.890125,44.040117 55.859208,44.110739 55.824992,44.040112 55.80138,44.064329 55.787559,44.066411 55.737674,44.026988 55.659793,44.039148 55.654767,44.011864 55.646937,44.028688 55.631216,44.001 55.611813,43.996515 55.586966,44.026632 55.537536,44.008255 55.530253,44.001105 55.495508,43.966379 55.476111,44.016565 55.438413,44.003405 55.36925,43.913842 55.332731,43.86906 55.287421,43.837718 55.292673,43.802249 55.331555,43.74567 55.33908,43.735367 55.36641,43.687526 55.356322,43.682425 55.372337,43.722341 55.438373,43.727634 55.49936,43.660456 55.500093,43.698905 55.546439))\",\"code\":\"n_novgorod\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"19\",\"name\":\"Ðижний Ðовгород\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((60.386228 58.025926,60.543553 58.1012,60.591976 58.084258,60.59383 58.065848,60.629422 58.071692,60.626558 58.034145,60.588851 58.030923,60.56379 57.970664,60.525869 57.975302,60.478097 57.921059,60.322368 57.884501,60.2264 57.751651,59.763185 57.762607,59.779216 57.972882,59.753076 57.975012,59.802461 58.102842,60.216094 58.067059,60.238445 58.084283,60.309211 58.076303,60.302152 58.057252,60.33775 58.05346,60.329853 58.033965,60.386228 58.025926))\",\"code\":\"ntagil\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"45\",\"name\":\"Ðижний Тагил\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((86.517836 53.497554,86.514138 53.82036,86.500994 53.827564,86.513934 53.838037,86.512736 53.941118,86.480362 53.944854,86.458678 53.991061,86.492783 54.018733,86.46447 54.054813,86.4792 54.065258,86.618448 54.103252,86.651443 54.130632,87.463657 54.121473,87.456823 53.497654,87.274477 53.498212,87.265593 53.487551,87.067651 53.502008,86.517836 53.497554))\",\"code\":\"novokuznetsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"6\",\"name\":\"Ðовокузнецк\",\"time_zone\":{\"name\":\"Asia/Novokuznetsk\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((38.611788 44.334654,38.50188 44.149785,38.424852 44.176741,38.29588 44.189945,38.06936 44.261427,37.909643 44.39079,37.826166 44.417904,37.75347 44.470943,37.508447 44.490233,37.333602 44.54604,37.216533 44.607242,37.148688 44.663571,37.114741 44.747825,37.062663 44.794421,37.035232 44.845064,36.84376 44.913379,36.952521 45.139209,36.955897 45.231096,37.270595 45.252601,37.323008 45.221241,37.370325 45.225698,37.418648 45.190935,37.469267 45.200845,37.483318 45.221778,37.632022 45.195207,37.665645 45.213873,37.777513 45.211867,37.850508 45.240846,37.862296 45.226127,37.969276 45.232012,38.140004 45.188567,38.395601 45.212132,38.450284 45.20257,38.499801 45.235955,38.581237 45.224853,38.648205 45.176459,38.593846 45.138214,38.583641 45.05373,38.558543 45.053779,38.558308 45.040626,38.57103 45.038671,38.571424 44.976362,38.632211 44.886243,38.628541 44.83052,38.661505 44.828782,38.654426 44.726165,38.637552 44.732517,38.621174 44.718423,38.648179 44.489009,38.670827 44.489693,38.665686 44.474828,38.688965 44.46535,38.630156 44.366958,38.608527 44.361301,38.611788 44.334654))\",\"code\":\"novorossiysk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"74\",\"name\":\"ÐовороÑÑийÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((85.088133 54.816411,85.002688 54.800048,85.013252 54.779662,84.964301 54.781279,84.89515 54.728577,84.980047 54.704903,85.004084 54.6799,84.986639 54.667145,85.011185 54.637544,84.934464 54.60996,85.115898 54.438163,84.824313 54.325904,84.803815 54.352028,84.694421 54.290784,84.65606 54.28607,84.575667 54.235287,84.577444 54.205114,84.536029 54.158157,84.437398 54.141003,84.423005 54.147726,84.429822 54.161854,84.397627 54.178217,84.357598 54.160274,84.282223 54.158341,84.275305 54.178281,84.223933 54.192175,83.877706 54.08136,83.857861 54.087293,83.884281 54.12064,83.830747 54.12978,83.722303 54.101173,83.553128 54.109112,83.531248 54.078262,83.474428 54.062407,83.48778 53.979297,83.439161 53.973706,83.448509 53.947246,83.349582 53.933688,83.292679 54.085893,83.274482 54.051634,83.220299 54.050249,83.196775 54.065401,83.165888 54.051188,83.049376 53.969325,83.025492 53.975652,83.021283 54.00262,82.994051 54.01605,82.76229 54.012318,82.693122 54.106213,82.693979 54.131095,82.645574 54.14543,82.634722 54.248572,82.664822 54.29484,82.68705 54.30104,82.661704 54.35505,82.61106 54.369053,82.547634 54.419858,82.470375 54.420101,82.370414 54.412567,82.371804 54.399905,82.127851 54.268898,82.118361 54.252095,82.134209 54.241847,82.083649 54.219871,82.059678 54.184372,82.068814 54.177768,82.027336 54.157662,82.00034 54.171321,81.941353 54.133285,81.823904 54.099327,81.805615 54.061834,81.756478 54.033153,81.751897 53.99627,81.661622 53.981295,81.587024 53.921394,81.542805 53.909614,81.568083 54.00842,81.613035 54.021479,81.493979 54.02924,81.482831 54.058427,81.442213 54.041825,81.342891 54.08114,81.248852 54.070884,81.216226 54.124181,81.211528 54.112355,81.137057 54.109871,81.087729 54.19626,80.98516 54.294763,80.95166 54.375446,81.015929 54.437403,81.069744 54.449125,81.206379 54.469828,81.232671 54.43442,81.349135 54.442051,81.553585 54.533401,81.510757 54.591568,81.533405 54.612019,81.619201 54.634727,81.648241 54.614816,81.697814 54.622579,81.666411 54.644833,81.719479 54.657871,81.535705 54.795751,81.525131 54.835634,81.576033 54.854323,81.569753 54.873304,81.486161 54.938744,81.457861 54.932468,81.40791 54.950068,81.360969 54.937569,81.361438 54.979388,81.414723 55.001194,81.428126 55.044341,81.472002 55.050177,81.474095 55.080272,81.397608 55.101903,81.459733 55.139028,81.446447 55.247257,81.477305 55.251991,81.330338 55.319242,81.467239 55.352554,81.500579 55.380705,82.154603 55.51402,82.046328 55.623863,81.735848 56.025943,81.553507 56.235201,81.873966 56.305406,82.3392 56.357462,82.499393 56.405493,82.56553 56.399756,82.69004 56.425818,82.774176 56.409006,82.818171 56.429882,82.796319 56.46359,82.80499 56.512522,82.862728 56.535243,82.946637 56.537902,83.02902 56.518057,83.095518 56.54937,83.285825 56.445179,83.254023 56.433978,83.273679 56.431915,83.247805 56.395426,83.143274 56.374558,83.170399 56.342775,83.163827 56.314939,83.114137 56.290972,83.131482 56.275494,83.064804 56.230587,83.108472 56.211577,83.156686 56.227959,83.211845 56.209412,83.213935 56.180724,83.169868 56.18774,83.154684 56.176784,83.183089 56.166603,83.178743 56.153147,83.12927 56.120556,83.182767 56.112253,83.22148 56.086762,83.274055 56.113913,83.301553 56.095779,83.233736 56.059526,83.245146 56.024221,83.230086 56.013203,83.340089 55.978252,83.313369 55.961143,83.403008 55.896203,83.37566 55.89601,83.392788 55.863976,83.385188 55.851263,83.318525 55.854541,83.211507 55.729573,83.314218 55.70373,83.31518 55.687675,83.338522 55.710005,83.445276 55.723903,83.444876 55.694989,83.417853 55.673155,83.428686 55.664132,83.501531 55.706658,83.585493 55.670769,83.599621 55.650771,83.590415 55.616456,83.631408 55.605505,83.597281 55.578084,83.643364 55.58456,83.74695 55.537542,83.793479 55.544837,83.835711 55.529631,83.909543 55.54795,83.926346 55.568309,83.972523 55.555768,83.939427 55.51155,83.964213 55.51613,84.042645 55.444071,84.000495 55.408305,84.150837 55.400365,84.139598 55.439327,84.161904 55.455684,84.213271 55.462875,84.284625 55.43016,84.330678 55.462837,84.456308 55.468194,84.51098 55.506032,84.541189 55.468097,84.595177 55.483997,84.660798 55.479568,84.725026 55.446609,84.620578 55.404334,84.652652 55.380482,84.754742 55.379815,84.818767 55.361752,84.858737 55.375536,84.916854 55.324764,84.915525 55.277327,84.85607 55.260773,84.815445 55.227775,84.917085 55.183553,84.927023 55.163725,84.903557 55.053879,84.837145 54.997021,84.887657 54.969707,84.887673 54.9523,84.971822 54.944968,85.038038 54.873817,85.07845 54.857497,85.046502 54.844635,85.088133 54.816411))\",\"code\":\"novosibirsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"1\",\"name\":\"ÐовоÑибирÑк\",\"time_zone\":{\"name\":\"Asia/Novosibirsk\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((40.279946 47.428434,40.282366 47.396003,40.143212 47.344641,40.141957 47.32975,40.049015 47.326963,39.998114 47.354118,40.026464 47.37416,40.013292 47.39774,39.970354 47.400067,40.03631 47.428998,40.012236 47.457735,40.057056 47.486347,40.054334 47.511039,40.138377 47.487506,40.136878 47.453853,40.175715 47.42226,40.279946 47.428434))\",\"code\":\"novocherkassk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"137\",\"name\":\"ÐовочеркаÑÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((39.824717 47.738537,39.788042 47.749911,39.786221 47.765157,39.819184 47.76806,39.830504 47.862381,39.876304 47.863572,39.891586 47.889442,39.936437 47.879171,39.938209 47.853071,40.017472 47.832192,40.030386 47.810257,39.97941 47.806857,39.973289 47.75403,40.017849 47.739613,40.004332 47.702684,39.827083 47.724308,39.824717 47.738537))\",\"code\":\"novoshakhtinsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"138\",\"name\":\"ÐовошахтинÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((76.550608 66.176745,77.02186 66.185037,77.085372 66.076551,77.246806 66.036483,77.502758 66.038639,77.717867 66.101555,77.822187 66.070509,78.095049 66.132742,78.197085 66.137732,78.314914 66.113537,78.336981 66.071776,78.412791 66.007583,78.499318 65.98269,78.481427 65.958847,78.460859 65.962934,78.305241 65.861272,78.20881 65.777623,78.042981 65.718308,78.024399 65.691381,77.930064 65.689318,77.877699 65.659784,77.64937 65.641188,77.201953 65.800799,76.921259 65.790684,76.713723 65.823542,76.647881 65.84942,76.600136 65.89055,76.461521 65.914944,76.373292 66.091023,76.387134 66.109593,76.550608 66.176745))\",\"code\":\"n_urengoy\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":true,\"road_network\":true},\"id\":\"139\",\"name\":\"Ðовый Уренгой\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((88.529535 69.242435,86.000942 69.246318,85.986318 69.559455,88.551918 69.555507,88.529535 69.242435))\",\"code\":\"norilsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"76\",\"name\":\"ÐорильÑк\",\"time_zone\":{\"name\":\"Asia/Krasnoyarsk\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((74.30478 63.879187,76.263372 63.875343,76.226155 63.018251,74.325265 63.021954,74.30478 63.879187))\",\"code\":\"noyabrsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true},\"id\":\"103\",\"name\":\"ÐоÑбрьÑк\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((71.25763 50.949137,71.15911 51.015405,71.127413 51.259035,71.33122 51.306666,71.641526 51.331666,71.718671 51.378815,71.842987 51.217734,71.87991 51.02963,71.86563 50.971068,71.609524 50.928205,71.25763 50.949137))\",\"code\":\"nur_sultan\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"68\",\"name\":\"Ðур-Султан\",\"time_zone\":{\"name\":\"Asia/Almaty\",\"offset\":360},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((65.639774 62.289704,65.836829 62.290875,65.799189 62.263694,65.808049 62.239531,65.77183 62.218361,65.765344 62.197036,65.774669 62.175323,65.821512 62.161631,65.845589 62.136144,65.873049 62.136289,65.870532 62.045859,65.889685 62.046089,65.89304 61.970194,65.158167 62.002836,65.157159 62.061542,65.4281 62.196723,65.483196 62.285717,65.639774 62.289704))\",\"code\":\"nyagan\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":false},\"id\":\"202\",\"name\":\"ÐÑгань\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((55.13142 25.544679,55.203999 25.567715,55.279599 25.566579,55.43176 25.759947,55.55436 25.811148,55.666094 25.897751,55.76817 25.925981,55.826597 26.007005,55.888369 26.151722,56.086425 26.050441,56.15912 26.062127,56.195513 25.979301,56.163975 25.946893,56.177561 25.892732,56.139167 25.8325,56.1725 25.769167,56.140833 25.735,56.143611 25.676111,56.191111 25.648056,56.201874 25.611984,56.253291 25.60219,56.266328 25.606335,56.254586 25.613159,56.264173 25.627665,56.418384 25.682657,56.549221 25.692716,56.591385 25.549234,56.602446 25.323577,56.585359 25.087633,56.594079 25.007481,56.323288 24.972644,56.348923 24.934376,56.338442 24.914535,56.259358 24.859817,56.205659 24.850507,56.201022 24.784219,56.144333 24.741556,56.060585 24.746639,56.036157 24.810922,55.978341 24.877363,55.980164 24.894492,56.062185 24.870801,56.042048 24.886589,56.058722 24.949126,56.042075 24.947686,56.045483 24.967887,56.006871 24.994727,55.960882 25.005958,55.910907 24.965663,55.851301 24.965812,55.812409 24.910874,55.836502 24.671031,55.793833 24.637012,55.816207 24.615223,55.767784 24.572526,55.764989 24.52949,55.834202 24.409554,55.833944 24.327733,55.759405 24.261142,55.752895 24.234821,55.833523 24.200902,55.954447 24.222568,55.969652 24.182449,55.960753 24.170318,56.017506 24.066605,55.902317 24.046941,55.833035 24.01459,55.801126 24.025482,55.781754 24.055948,55.731246 24.058066,55.485274 23.944384,55.533725 23.849352,55.531869 23.757286,55.569228 23.720734,55.572308 23.629646,55.452588 23.465217,55.430691 23.399593,55.416507 23.382151,55.401537 23.392525,55.232271 23.110348,55.216283 23.02621,55.227508 22.791619,55.21284 22.705686,55.137388 22.631591,52.58104 22.939203,51.590376 24.126971,51.589825 24.26588,51.529512 24.336352,51.416071 24.393194,51.466454 24.462489,51.565206 24.553035,51.589187 24.619704,51.586122 24.664189,52.02542 24.75828,52.309194 24.842176,52.378334 24.900336,52.337088 24.949252,52.345961 24.997718,52.405921 25.018775,52.450032 24.982958,52.647202 25.143128,52.894479 25.470458,54.182354 25.450646,55.13142 25.544679))\",\"code\":\"dubai\",\"country_code\":\"ae\",\"domain\":\"ae\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"99\",\"name\":\"ОÐÐ\",\"time_zone\":{\"name\":\"Asia/Dubai\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((36.646351 55.086464,36.632509 55.057227,36.612321 55.051415,36.563754 55.067207,36.575797 55.076421,36.556412 55.088942,36.576812 55.098854,36.531879 55.100693,36.556018 55.139507,36.661994 55.141738,36.646351 55.086464))\",\"code\":\"obninsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"140\",\"name\":\"ОбнинÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((30.506989 46.430705,30.518192 46.431862,30.485573 46.594299,30.513522 46.664318,30.579165 46.664532,30.608994 46.647233,30.805363 46.655465,30.807606 46.643526,30.888062 46.643435,30.914609 46.522769,30.85932 46.479501,30.797545 46.358129,30.701159 46.261262,30.605848 46.256172,30.529617 46.297192,30.506989 46.430705))\",\"code\":\"odessa\",\"country_code\":\"ua\",\"domain\":\"ua\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"14\",\"name\":\"ОдеÑÑа\",\"time_zone\":{\"name\":\"Europe/Kiev\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((72.9275 54.78532,72.877229 54.78445,72.844079 55.404999,73.25143 55.411503,73.27756 55.430606,73.32946 55.412594,73.75247 55.41764,73.762279 55.10337,73.7772 55.094703,73.763533 55.06273,73.771665 54.796804,73.213126 54.789864,73.074267 54.775192,73.059208 54.787499,72.9275 54.78532))\",\"code\":\"omsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"2\",\"name\":\"ОмÑк\",\"time_zone\":{\"name\":\"Asia/Omsk\",\"offset\":360},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((55.499267 51.610351,55.501686 51.568801,55.535808 51.547416,55.428786 51.420708,55.241066 51.307496,55.121599 51.143428,55.022613 51.115633,54.897979 51.142384,54.793512 51.320397,54.879172 51.391515,54.924706 51.524762,54.906887 51.595495,54.906756 51.728877,54.849285 51.718242,54.832595 51.768469,54.875718 51.813504,54.842325 51.851931,55.056295 51.96273,55.076345 51.964945,55.090328 51.940871,55.133556 51.92549,55.190471 51.924788,55.250638 51.947908,55.269167 51.92153,55.379206 51.921589,55.380686 51.890251,55.463369 51.890643,55.462422 51.862277,55.506478 51.820429,55.515763 51.763054,55.602497 51.740792,55.578399 51.705268,55.604333 51.700118,55.584852 51.664817,55.551178 51.67362,55.499267 51.610351))\",\"code\":\"orenburg\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"48\",\"name\":\"Оренбург\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((58.488695 51.315425,58.683778 51.321673,58.697439 51.338826,58.776011 51.329791,58.78373 51.286852,58.798574 51.279821,58.786295 51.273122,58.814319 51.25288,58.899106 51.230952,59.016141 51.233939,58.987539 51.148002,59.018013 51.142934,59.030411 51.124558,59.0638 51.125372,59.085204 51.104943,59.068243 51.088276,59.08644 51.075581,59.081675 51.044506,59.054369 51.048772,59.044033 51.01299,58.941536 51.012503,58.849571 51.043631,58.731824 51.03686,58.656259 51.058501,58.598708 51.037005,58.52222 51.084149,58.382833 51.073463,58.372624 51.113302,58.403007 51.11479,58.374864 51.171941,58.391928 51.176526,58.388383 51.191967,58.415445 51.1822,58.417958 51.200327,58.388948 51.238106,58.367131 51.241517,58.340683 51.291723,58.353263 51.295716,58.351853 51.337987,58.38256 51.337957,58.382577 51.317872,58.488695 51.315425))\",\"code\":\"orsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"142\",\"name\":\"ОрÑк\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((35.853124 52.882663,35.840989 52.911897,35.84926 52.994905,35.878061 53.038401,35.860952 53.047981,35.874297 53.056616,35.860656 53.072489,35.871515 53.088745,35.93747 53.082329,35.965898 53.100819,36.064945 53.105009,36.199071 53.086792,36.249337 53.100916,36.329336 53.080138,36.284661 53.059816,36.295392 53.040838,36.284711 53.027058,36.313628 53.019657,36.31769 52.992176,36.346317 52.983267,36.305475 52.952624,36.32892 52.932396,36.28261 52.885783,36.235773 52.876645,36.203546 52.846229,36.106135 52.835902,36.014244 52.859097,35.902308 52.84126,35.864119 52.857087,35.853124 52.882663))\",\"code\":\"orel\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"71\",\"name\":\"Орёл\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((72.880651 40.410746,72.824373 40.386391,72.716869 40.41987,72.700391 40.551882,72.71733 40.589844,72.760236 40.572754,72.74911 40.597372,72.762679 40.627708,72.791396 40.616625,72.843441 40.651018,72.875985 40.619755,72.893399 40.544166,72.880651 40.410746))\",\"code\":\"osh\",\"country_code\":\"kg\",\"domain\":\"kg\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"171\",\"name\":\"Ош\",\"time_zone\":{\"name\":\"Asia/Bishkek\",\"offset\":360},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((77.223834 52.214201,77.241662 52.014535,76.992875 51.991758,76.9173 51.989277,76.769674 52.020351,76.660819 52.166653,76.600238 52.180226,76.645111 52.229329,76.675924 52.439188,76.992228 52.479541,77.235345 52.446979,77.223834 52.214201))\",\"code\":\"pavlodar\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"111\",\"name\":\"Павлодар\",\"time_zone\":{\"name\":\"Asia/Qyzylorda\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((11.381405 45.733677,12.61199 45.701369,12.572035 45.071337,11.355023 45.102946,11.381405 45.733677))\",\"code\":\"padova\",\"country_code\":\"it\",\"domain\":\"it\",\"flags\":{\"2gis_reviews\":false,\"flamp\":false,\"metro\":false,\"public_transport\":true,\"road_network\":false},\"id\":\"66\",\"name\":\"ПадуÑ\",\"time_zone\":{\"name\":\"Europe/Rome\",\"offset\":120},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((45.104058 53.066054,44.963755 53.041572,44.794662 53.061626,44.776161 53.076518,44.770048 53.262088,44.810489 53.286551,44.832085 53.335556,44.977002 53.363303,45.02642 53.389323,45.054239 53.376283,45.061105 53.34889,45.35881 53.348717,45.357781 53.225766,45.391043 53.135605,45.340927 53.030362,45.300415 53.009999,45.155505 53.031889,45.104058 53.066054))\",\"code\":\"penza\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"42\",\"name\":\"Пенза\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((56.921347 59.020265,56.905943 59.002546,56.972596 58.803898,56.885783 58.649364,56.849216 58.539439,56.843605 58.463639,56.899714 58.459027,56.898912 58.430923,56.921007 58.426045,56.899566 58.37942,56.872117 58.368386,56.873707 58.348237,56.909328 58.336781,56.895896 58.307611,56.912771 58.295503,56.896229 58.300431,56.853229 58.270343,56.857187 58.168006,56.825286 58.162266,56.786944 58.052761,56.831451 58.041996,56.816486 58.03891,56.829434 58.018053,56.816349 58.01115,56.824115 57.977059,56.770845 57.981386,56.71997 57.962514,56.749126 57.96009,56.734893 57.949979,56.746497 57.929909,56.815844 57.899191,56.81149 57.874553,56.759037 57.870989,56.822721 57.848471,56.831583 57.830761,56.649625 57.770252,56.606307 57.780272,56.445855 57.745008,56.436767 57.738924,56.461364 57.718418,56.438413 57.713822,56.463189 57.701114,56.454315 57.685357,56.468739 57.658593,56.254311 57.681783,56.249596 57.664133,55.976853 57.68302,55.955104 57.673509,55.983188 57.723328,55.97954 57.755518,55.900356 57.761933,55.908485 57.791562,55.814272 57.782843,55.748424 57.755537,55.716144 57.780353,55.687488 57.780003,55.709884 57.799233,55.702676 57.807087,55.591751 57.823949,55.554895 57.814259,55.589075 57.888804,55.503048 57.902516,55.648536 58.003859,55.619639 58.01355,55.520852 57.993174,55.520067 58.01337,55.504631 58.013045,55.569992 58.050236,55.575935 58.067054,55.554071 58.096959,55.572171 58.120218,55.562953 58.133018,55.648806 58.144972,55.637379 58.15999,55.686498 58.175148,55.681709 58.212463,55.742136 58.205958,55.740747 58.243583,55.788805 58.267762,55.846184 58.287641,55.955649 58.277983,55.980887 58.306921,55.961852 58.316612,55.963489 58.333627,56.007718 58.34083,56.002223 58.323261,56.028648 58.316982,56.068234 58.36527,56.124484 58.364976,56.162678 58.409374,56.148442 58.412692,56.15577 58.430813,56.122181 58.431366,56.071865 58.462076,56.103019 58.501165,56.069958 58.58524,56.260193 58.779141,56.302683 58.883024,56.253783 58.95531,56.239793 59.0072,56.199364 59.01991,56.177032 59.046108,56.221751 59.150502,56.215606 59.220063,56.252426 59.25211,56.472407 59.33059,56.460479 59.357147,56.484969 59.366504,56.39135 59.396913,56.321278 59.389305,56.323657 59.408076,56.413663 59.451677,56.525174 59.578228,56.574141 59.59962,56.643024 59.602979,56.662338 59.592683,56.65927 59.569141,56.72323 59.556509,56.798945 59.56039,56.824834 59.616743,56.87807 59.609381,56.914826 59.622718,56.988254 59.561737,57.076139 59.520211,57.178887 59.512805,57.301958 59.426418,57.268844 59.379168,57.2326 59.378983,57.199205 59.297491,57.164119 59.292824,57.178037 59.284982,57.167344 59.274844,57.192223 59.275825,57.166065 59.265167,57.187326 59.259679,57.171776 59.25297,57.179179 59.244273,57.140821 59.2268,57.16359 59.219585,57.07673 59.192596,57.076428 59.175407,57.128875 59.155157,57.054208 59.148638,57.039587 59.130936,57.057589 59.11709,57.018078 59.098206,56.97406 59.10476,56.921347 59.020265))\",\"code\":\"perm\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"16\",\"name\":\"Пермь\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((34.102722 61.959477,34.70885 61.953295,34.694352 61.691472,34.093364 61.697587,34.102722 61.959477))\",\"code\":\"petrozavodsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"80\",\"name\":\"ПетрозаводÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((69.347885 54.952036,69.266608 54.797665,69.117536 54.723353,69.077283 54.75212,68.979519 54.783159,68.951741 54.847098,68.973207 54.879526,68.994401 54.883477,68.995059 54.922347,69.075263 54.982374,69.147545 54.996193,69.347885 54.952036))\",\"code\":\"petropavlovsk\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"170\",\"name\":\"ПетропавловÑк\",\"time_zone\":{\"name\":\"Asia/Almaty\",\"offset\":360},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((158.93997 52.708399,158.207589 52.869935,158.098651 52.921805,158.103729 52.978899,158.122863 53.005263,158.070474 53.123971,158.038502 53.158854,158.036961 53.18785,158.110492 53.246335,158.115759 53.275807,158.172805 53.29123,158.185568 53.360891,158.767001 53.363873,158.934418 53.326234,159.031063 53.266487,159.282336 52.942785,159.099675 52.85838,158.93997 52.708399))\",\"code\":\"p_kamchatskiy\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"95\",\"name\":\"ПетропавловÑк-КамчатÑкий\",\"time_zone\":{\"name\":\"Asia/Kamchatka\",\"offset\":720},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((33.996877 59.569116,34.110199 59.579507,34.260576 59.501064,34.209909 59.47041,34.169037 59.476505,33.996877 59.569116))\",\"code\":\"pikalevo\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"213\",\"name\":\"Пикалево\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((14.219495 49.934897,14.215528 50.17879,14.713797 50.181086,14.715245 49.937173,14.219495 49.934897))\",\"code\":\"praha\",\"country_code\":\"cz\",\"domain\":\"cz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"92\",\"name\":\"Прага\",\"time_zone\":{\"name\":\"Europe/Prague\",\"offset\":120},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((28.236627 57.893868,28.487391 57.87357,28.506529 57.852656,28.489222 57.82986,28.475856 57.739093,28.383826 57.720002,28.314786 57.730288,28.165414 57.714437,28.066706 57.753157,27.879575 57.697647,27.844135 57.700623,27.81286 57.73521,27.718068 57.752111,27.662905 57.797518,27.618062 57.782609,27.541574 57.823176,27.70805 57.848448,27.740926 57.827721,27.795637 57.841216,27.800355 57.854737,27.8879 57.839632,27.916041 57.860544,27.912105 57.876503,28.167686 57.912474,28.236627 57.893868))\",\"code\":\"pskov\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"90\",\"name\":\"ПÑков\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((86.741415 52.1575,86.740159 52.171359,86.801044 52.158722,86.805639 52.187755,86.723874 52.197203,86.767102 52.243,86.783393 52.293024,86.693579 52.294799,86.68961 52.341377,86.667052 52.342734,86.642405 52.402575,86.62298 52.406021,86.62298 52.423775,86.679427 52.43683,86.676711 52.466176,86.649409 52.494794,86.661859 52.498895,86.627938 52.52683,86.722129 52.508723,86.763347 52.524257,86.794917 52.514808,86.775138 52.595801,86.821192 52.608641,86.809816 52.648098,86.844945 52.6264,86.932994 52.635155,86.936726 52.654524,86.989466 52.658492,87.012755 52.642514,87.068836 52.657448,87.099071 52.619226,87.134484 52.616339,87.11888 52.598563,87.197136 52.57321,87.218457 52.58875,87.297162 52.59237,87.33368 52.572745,87.37119 52.573691,87.371806 52.498746,87.428271 52.49947,87.494308 52.474214,87.539995 52.483464,87.583791 52.46215,87.611621 52.47148,87.623351 52.464791,87.610656 52.456439,87.617976 52.438341,87.653327 52.422416,87.700823 52.464322,87.732916 52.462713,87.755305 52.484868,87.845122 52.491026,87.864908 52.518856,87.892618 52.525854,87.891369 52.539479,88.021112 52.511055,88.123465 52.462634,88.143614 52.428852,88.231529 52.400058,88.281036 52.414455,88.310877 52.436896,88.317271 52.464244,88.445685 52.432956,88.442629 52.40601,88.406032 52.378341,88.463945 52.341503,88.403297 52.311662,88.391393 52.292277,88.402091 52.276754,88.380374 52.273215,88.396944 52.239674,88.363573 52.169065,88.374518 52.154623,88.360185 52.146284,88.378254 52.12461,88.286261 52.111732,88.248387 52.07755,88.25247 52.0458,88.178285 52.065758,88.151791 52.095988,88.126426 52.068234,88.061536 52.044389,88.057627 52.016808,88.087596 52.000021,87.97684 51.952266,88.001771 51.941712,88.001424 51.916173,87.945307 51.885704,87.934536 51.848568,87.898573 51.822291,87.882589 51.782897,87.932712 51.784547,87.991173 51.751386,88.084121 51.758335,88.110094 51.740266,88.106794 51.70856,88.076043 51.674834,88.019145 51.664388,88.00125 51.632399,88.003943 51.58927,87.959032 51.576348,87.950085 51.55133,87.900397 51.551548,87.934449 51.526312,87.945742 51.475191,88.052328 51.466461,88.141106 51.428543,88.125209 51.394057,88.143278 51.386152,88.133288 51.374165,88.156395 51.348495,88.187319 51.359006,88.315101 51.344413,88.325265 51.32452,88.401447 51.308059,88.424641 51.286255,88.590383 51.323347,88.631385 51.385349,88.700879 51.39093,88.693842 51.440444,88.680552 51.44444,88.692452 51.480816,88.658053 51.52805,88.750393 51.545358,88.763075 51.561429,88.79735 51.549455,88.814539 51.520634,88.846101 51.516319,88.863883 51.467884,88.919894 51.46392,89.004949 51.398852,89.006801 51.373922,88.985834 51.361067,88.997689 51.321504,88.960126 51.248341,88.9765 51.239932,88.960719 51.228301,88.963313 51.206481,89.031326 51.186793,89.049849 51.159806,89.036513 51.144358,89.048664 51.119576,89.022288 51.102517,89.054147 51.08231,89.054221 51.047136,89.100972 51.037486,89.123199 51.007425,89.192472 50.982957,89.241964 50.921557,89.268044 50.915982,89.267748 50.880456,89.346949 50.881253,89.348579 50.859675,89.398663 50.850525,89.375918 50.826409,89.390217 50.809925,89.453415 50.79257,89.477939 50.745449,89.528394 50.724075,89.582776 50.645801,89.639825 50.642893,89.631972 50.617147,89.649457 50.576936,89.729103 50.568638,89.85135 50.524889,89.842163 50.499885,89.865649 50.472046,89.8189 50.411201,89.735772 50.409274,89.707322 50.384121,89.664721 50.38501,89.655164 50.369729,89.613229 50.374267,89.58989 50.428129,89.50291 50.459801,89.510615 50.449948,89.4915 50.44528,89.48135 50.399919,89.501577 50.385732,89.496835 50.363912,89.381479 50.338889,89.379479 50.314921,89.406595 50.314032,89.390296 50.28636,89.343768 50.264245,89.333026 50.21668,89.308428 50.207937,89.403485 50.177932,89.440603 50.203696,89.520175 50.191731,89.532474 50.147871,89.511507 50.11931,89.58241 50.106974,89.592042 50.084192,89.533956 50.065855,89.524696 50.03935,89.543959 50.01503,89.592932 50.01553,89.598711 49.984524,89.62479 49.970855,89.608713 49.963743,89.614715 49.939182,89.591721 49.912627,89.63088 49.899345,89.611741 49.86352,89.651037 49.82644,89.624463 49.806369,89.673452 49.783475,89.711881 49.790098,89.7192 49.7283,89.6074 49.686,89.461564 49.666217,89.427352 49.619381,89.405269 49.621127,89.3846 49.6062,89.391 49.5953,89.36 49.5844,89.2506 49.6423,89.193637 49.634683,89.182398 49.622898,89.199073 49.604776,89.191469 49.58602,89.2327 49.5537,89.2009 49.5228,88.9845 49.4637,88.9326 49.5168,88.9295 49.5429,88.90009 49.558961,88.869615 49.546741,88.879675 49.513767,88.8571 49.4918,88.8801 49.4781,88.8534 49.4667,88.8628 49.4595,88.8429 49.4416,88.8022 49.4604,88.6836 49.4622,88.5992 49.5009,88.4949 49.4719,88.445 49.4726,88.4059 49.4946,88.368004 49.483846,88.3312 49.4935,88.297742 49.470898,88.221784 49.47966,88.165591 49.445452,88.184379 49.415928,88.118763 49.390801,88.124131 49.372926,88.160451 49.362761,88.170112 49.293567,88.106706 49.256569,88.054756 49.258389,88.056412 49.241085,88.017979 49.226295,87.988438 49.18302,87.805862 49.168484,87.695023 49.175738,87.670519 49.15207,87.492854 49.138516,87.503232 49.09253,87.427347 49.071318,87.28579 49.115872,87.303812 49.172181,87.291593 49.201769,87.309671 49.233885,87.198325 49.252499,87.02935 49.253989,87.006045 49.298864,86.970987 49.305851,86.926469 49.348878,86.924715 49.369818,86.9492 49.379942,86.936266 49.400195,86.947328 49.409624,86.833377 49.452247,86.82972 49.48174,86.855415 49.49914,86.814847 49.532322,86.827174 49.545425,86.739513 49.571169,86.665905 49.560272,86.618249 49.570377,86.597577 49.609524,86.615549 49.628524,86.659159 49.643789,86.665733 49.665502,86.699725 49.684973,86.72419 49.676651,86.778924 49.696016,86.752998 49.742395,86.782843 49.793792,86.735862 49.787154,86.688375 49.810899,86.590212 49.80559,86.6105 49.768929,86.582292 49.724142,86.509239 49.690951,86.488451 49.65791,86.428612 49.629352,86.420003 49.60759,86.2716 49.5827,86.267004 49.546539,86.202038 49.466113,86.17391 49.478979,86.166345 49.503304,86.112922 49.524383,86.037199 49.521846,86.024507 49.503727,85.968991 49.487116,85.929409 49.535866,85.944281 49.561326,85.883737 49.566907,85.826225 49.544254,85.809912 49.565881,85.75689 49.57715,85.677689 49.550396,85.589914 49.614381,85.553288 49.594414,85.490205 49.598129,85.38844 49.634803,85.321261 49.590847,85.257519 49.588524,85.264671 49.619788,85.210125 49.627086,85.215526 49.71853,85.203369 49.745268,85.148748 49.76791,85.144565 49.796419,85.101607 49.824213,85.100427 49.852116,85.059699 49.885036,84.985489 49.906772,84.984927 49.949919,84.972947 49.954279,84.994726 49.970128,84.978046 49.976294,85.049258 50.010397,85.035365 50.018876,85.035543 50.052494,84.974827 50.066958,84.945831 50.09661,84.8507 50.0939,84.813908 50.120772,84.825375 50.142985,84.75802 50.136943,84.692012 50.188623,84.628187 50.210679,84.567522 50.196841,84.456801 50.247256,84.409847 50.209226,84.362523 50.205465,84.251587 50.290141,84.272029 50.320659,84.269559 50.353755,84.242026 50.376855,84.241988 50.408662,84.203975 50.468975,84.232571 50.483066,84.248707 50.515566,84.230577 50.540242,84.169136 50.551745,84.144961 50.605966,84.115294 50.609194,84.080418 50.639877,84.127972 50.659636,84.343851 50.686268,84.397739 50.710053,84.42595 50.682196,84.473729 50.687078,84.514354 50.721437,84.511298 50.765456,84.557563 50.779921,84.589885 50.823992,84.539808 50.847646,84.437357 50.859917,84.438271 50.908374,84.490696 50.948059,84.34091 50.980694,84.305924 51.003878,84.222168 50.987377,84.127497 51.014216,84.101388 51.042257,84.061625 51.032231,84.02079 51.044188,84.038283 51.057608,83.943117 51.069148,83.956379 51.11019,83.932919 51.138087,84.042042 51.15374,84.096635 51.143349,84.069691 51.110609,84.120656 51.071237,84.146973 51.104134,84.153865 51.182773,84.179634 51.192381,84.200886 51.227941,84.192322 51.247157,84.234305 51.255878,84.256471 51.282613,84.331794 51.290341,84.376937 51.267314,84.412915 51.271282,84.452913 51.287731,84.458891 51.317025,84.633715 51.34705,84.641286 51.374725,84.68306 51.391487,84.716156 51.426799,84.766555 51.417022,84.849529 51.442452,84.897987 51.437753,84.923129 51.465532,84.92057 51.482868,84.989627 51.513625,85.111038 51.524095,85.166854 51.486525,85.195571 51.485502,85.244031 51.499162,85.260818 51.528716,85.29912 51.530649,85.305882 51.555556,85.449976 51.566314,85.446007 51.601769,85.479896 51.623074,85.48206 51.69047,85.582319 51.697222,85.626286 51.747247,85.623264 51.782779,85.539096 51.838252,85.536318 51.859355,85.616988 51.871872,85.544145 51.942899,85.585383 51.992331,85.682498 52.024578,85.701278 52.096576,85.74295 52.113436,85.850951 52.105479,85.869512 52.130262,86.012143 52.084362,86.143888 52.084258,86.130729 52.068279,86.172892 52.019743,86.228649 52.013592,86.241771 52.042203,86.403044 52.036219,86.416986 52.065356,86.449398 52.073489,86.43905 52.111154,86.455808 52.128334,86.648831 52.105669,86.688594 52.140995,86.725961 52.139143,86.741415 52.1575))\",\"code\":\"gornoaltaysk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"27\",\"name\":\"РеÑпублика Ðлтай\",\"time_zone\":{\"name\":\"Asia/Barnaul\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((39.35785 47.239013,39.358001 47.261508,39.310916 47.264747,39.31884 47.283311,39.486713 47.328345,39.559365 47.376813,39.734563 47.385205,39.734689 47.417805,39.804088 47.425666,39.868718 47.455781,39.864309 47.46816,39.878046 47.471547,39.834574 47.516331,39.861573 47.526634,39.996426 47.5208,40.038389 47.479463,40.012236 47.457735,40.036528 47.436502,40.028784 47.420259,39.983399 47.415849,39.96051 47.363195,39.924723 47.358403,39.919436 47.053314,39.746241 47.04353,39.743526 47.06029,39.619994 47.050119,39.618758 47.062267,39.541011 47.061609,39.535676 47.040827,39.367812 47.036168,39.355318 47.048678,39.35785 47.239013))\",\"code\":\"rostov\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"24\",\"name\":\"РоÑтов-на-Дону\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((81.297565 51.474847,81.250661 51.472574,81.238183 51.45736,81.168923 51.46669,81.176956 51.479149,81.128237 51.499905,81.131718 51.521494,81.215223 51.581969,81.242809 51.575603,81.326653 51.534967,81.297565 51.474847))\",\"code\":\"rubtsovsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"143\",\"name\":\"РубцовÑк\",\"time_zone\":{\"name\":\"Asia/Barnaul\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((38.742087 58.109103,38.947676 58.112986,38.898472 58.066256,38.953373 58.04675,38.976142 58.022331,38.913496 57.99886,38.823836 58.006161,38.648513 58.104084,38.702778 58.122775,38.742087 58.109103))\",\"code\":\"rybinsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"144\",\"name\":\"РыбинÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((39.404406 54.733859,39.344055 54.776871,39.415177 54.839913,39.388799 54.854473,39.401008 54.870252,39.444898 54.883538,39.576876 54.908518,39.610584 54.901857,39.615095 54.881368,40.082101 54.878236,40.072595 54.486578,39.402002 54.490668,39.391534 54.582714,39.402966 54.588546,39.404406 54.733859))\",\"code\":\"ryazan\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"44\",\"name\":\"Ð Ñзань\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((66.673202 66.456385,66.45835 66.508525,66.479577 66.580807,66.524881 66.622681,66.581182 66.63831,66.752996 66.623089,66.708104 66.581039,66.728105 66.556098,66.783327 66.532325,66.822744 66.477071,66.673202 66.456385))\",\"code\":\"salekhard\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"160\",\"name\":\"Салехард\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((50.611911 53.434343,50.619539 53.39416,50.664011 53.362732,50.772367 53.333177,50.795636 53.284691,50.741778 53.204916,50.569355 53.164164,50.543375 53.056351,50.51171 53.05486,50.507699 53.037506,50.412611 53.01015,49.973323 53.005299,49.910829 53.01341,49.899516 53.033312,49.747249 53.03528,49.787691 53.052236,49.794395 53.092844,49.807912 53.096481,49.77879 53.208185,49.796888 53.215506,49.792086 53.25618,49.777904 53.256952,49.787115 53.322185,49.74678 53.316751,49.707458 53.33157,49.681209 53.442657,49.728745 53.443838,49.733939 53.534138,49.794308 53.574405,49.762931 53.605617,49.797112 53.630996,49.7745 53.644768,49.811818 53.695905,50.005342 53.741546,50.225728 53.761331,50.240908 53.787848,50.328294 53.771345,50.364095 53.787345,50.497233 53.712068,50.535737 53.662852,50.535066 53.640486,50.588739 53.573857,50.567375 53.566267,50.611911 53.434343))\",\"code\":\"samara\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"18\",\"name\":\"Самара\",\"time_zone\":{\"name\":\"Europe/Samara\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((29.434359 59.946365,29.445579 59.959851,29.384119 60.174382,29.405012 60.224502,29.400164 60.252241,29.521252 60.258295,29.627703 60.278179,29.66498 60.299917,29.84095 60.308972,30.06164 60.281094,30.242995 60.303807,30.447249 60.290476,30.523715 60.320691,30.752071 60.301317,30.816189 60.315166,30.855095 60.301614,30.942787 60.325074,31.105005 60.16026,31.168335 60.018131,31.106791 59.898566,31.063075 59.885463,31.112742 59.796151,31.086122 59.724592,31.033585 59.698741,31.064892 59.563652,31.04545 59.524782,30.970836 59.485961,30.80349 59.478467,30.697059 59.506842,30.561983 59.47743,30.428788 59.490007,30.359155 59.480736,30.348887 59.463495,30.110774 59.492718,30.080227 59.491851,30.062839 59.468795,29.931194 59.489972,29.738708 59.469542,29.602223 59.489989,29.523615 59.476495,29.456031 59.535583,29.458275 59.633169,29.434451 59.70411,29.45926 59.780422,29.482875 59.793804,29.406808 59.808405,29.390717 59.828508,29.430398 59.891821,29.419245 59.945138,29.434359 59.946365))\",\"code\":\"spb\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"38\",\"name\":\"Санкт-Петербург\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((-70.483526 -33.665691,-70.857156 -33.660641,-70.849333 -33.293335,-70.477276 -33.298315,-70.483526 -33.665691))\",\"code\":\"santiago\",\"country_code\":\"cl\",\"domain\":\"cl\",\"flags\":{\"2gis_reviews\":false,\"flamp\":false,\"metro\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"101\",\"name\":\"СантьÑго\",\"time_zone\":{\"name\":\"America/Santiago\",\"offset\":-240},\"type\":\"region\",\"zoom_level\":{\"max\":19,\"min\":9}},{\"bounds\":\"POLYGON((45.081871 54.301948,45.511721 54.300891,45.508746 54.059251,45.594866 54.054223,45.705976 54.016309,45.77554 54.0151,45.807467 53.99856,45.797358 53.986292,45.813633 53.975716,45.737296 53.94083,45.507836 53.984632,44.868027 53.985633,44.867159 54.263361,44.852386 54.305301,45.081871 54.301948))\",\"code\":\"saransk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"85\",\"name\":\"СаранÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((45.856039 51.724488,45.992106 51.720064,46.06242 51.754989,46.09597 51.802026,46.136889 51.825832,46.181012 51.820402,46.208087 51.850335,46.357733 51.821791,46.430843 51.835331,46.409443 51.716977,46.433873 51.728667,46.486963 51.718232,46.493745 51.696684,46.540915 51.696023,46.588358 51.65045,46.525517 51.644371,46.496915 51.621779,46.531394 51.605031,46.510981 51.609141,46.51517 51.59486,46.418306 51.562717,46.334533 51.362232,46.364391 51.356598,46.309454 51.254999,46.280529 51.260371,46.253535 51.195964,45.636831 51.218825,45.629584 51.289772,45.675365 51.374963,45.57571 51.450277,45.542994 51.5536,45.559352 51.587834,45.534988 51.607904,45.560031 51.644779,45.527193 51.639659,45.502507 51.673286,45.531848 51.694726,45.520355 51.708246,45.581883 51.699862,45.63943 51.74748,45.71945 51.781457,45.77254 51.765501,45.81311 51.725493,45.856039 51.724488))\",\"code\":\"saratov\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"43\",\"name\":\"Саратов\",\"time_zone\":{\"name\":\"Europe/Saratov\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((38.463615 56.261756,38.496675 56.24063,38.284403 56.225313,38.191135 56.237466,38.001366 56.228403,37.925174 56.23193,37.922708 56.247703,38.068216 56.387367,38.232856 56.373681,38.234444 56.355464,38.463615 56.261756))\",\"code\":\"s_posad\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":false,\"road_network\":true},\"id\":\"146\",\"name\":\"Сергиев ПоÑад\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((37.520885 54.880488,37.512424 54.8648,37.418341 54.880951,37.352234 54.874361,37.346587 54.923465,37.316566 54.96838,37.415807 54.962128,37.420827 54.981554,37.544039 54.989247,37.560985 54.978506,37.536971 54.966343,37.520885 54.880488))\",\"code\":\"serpuhov\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"147\",\"name\":\"Серпухов\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((28.231791 59.139984,28.225934 59.076363,28.026103 59.046356,28.03716 59.139391,28.080285 59.150411,28.231791 59.139984))\",\"code\":\"slantsy\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"215\",\"name\":\"Сланцы\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((32.015394 54.690209,31.835486 54.688614,31.7783 54.707531,31.759145 54.729714,31.758252 54.779403,31.779213 54.858475,31.799064 54.879794,31.835458 54.883678,31.999494 54.881113,32.100553 54.907209,32.168106 54.944012,32.211606 54.918212,32.270858 54.815571,32.247847 54.735598,32.167074 54.698384,32.015394 54.690209))\",\"code\":\"smolensk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true},\"id\":\"63\",\"name\":\"СмоленÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((40.383094 43.821667,40.365371 43.773998,40.389201 43.76582,40.370934 43.72688,40.452068 43.724357,40.464546 43.712482,40.44948 43.671334,40.460069 43.655847,40.552923 43.623576,40.604766 43.587745,40.653978 43.584486,40.661776 43.563048,40.564559 43.519058,40.50541 43.524875,40.477821 43.549126,40.259202 43.586214,40.103393 43.568154,40.095163 43.529315,40.010289 43.425017,40.009014 43.385546,39.88448 43.224431,39.849882 43.228041,39.713913 43.282428,39.641385 43.368903,39.517373 43.438142,39.471188 43.494287,39.398814 43.537163,39.334137 43.608194,39.12771 43.776747,38.852504 43.952338,38.797372 44.002146,38.691373 44.050731,38.623879 44.118782,38.50188 44.149785,38.612587 44.335728,38.608527 44.361301,38.630156 44.366958,38.638208 44.396334,38.678873 44.431986,38.688965 44.46535,38.665686 44.474828,38.670827 44.489693,38.801122 44.513945,38.937865 44.485387,38.978084 44.443491,38.919437 44.421173,38.988065 44.397481,39.016852 44.409412,39.029765 44.392764,39.017479 44.38142,39.063696 44.409298,39.05287 44.420898,39.083895 44.44668,39.139535 44.457873,39.417834 44.381504,39.490156 44.346222,39.482191 44.324272,39.503685 44.298895,39.585877 44.276664,39.634013 44.283478,39.673372 44.314531,39.733904 44.282985,39.793339 44.332707,39.895499 44.351638,39.974611 44.338574,40.067177 44.369326,40.077202 44.320229,40.104932 44.310694,40.193777 44.355403,40.189229 44.337124,40.204925 44.326856,40.284236 44.329373,40.336778 44.304877,40.384576 44.319191,40.384083 44.284023,40.418532 44.278134,40.359829 44.246745,40.406793 44.167246,40.405546 44.132848,40.432671 44.114017,40.413294 44.063314,40.480476 43.964506,40.409687 43.938768,40.402758 43.894816,40.420424 43.882593,40.383094 43.821667))\",\"code\":\"sochi\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"30\",\"name\":\"Сочи\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((41.71342 44.893581,41.685529 44.896281,41.667935 44.929958,41.661667 45.008331,41.692812 45.027643,41.698853 45.060774,41.669371 45.069375,41.670132 45.103091,41.657403 45.103223,41.65798 45.130207,41.677233 45.13,41.671025 45.193197,41.697373 45.19275,41.697868 45.248583,41.812934 45.256127,41.954393 45.233953,41.994568 45.261419,42.147241 45.270428,42.304986 45.202801,42.366514 45.133954,42.317058 45.003834,42.242955 44.960936,42.11413 44.931575,42.061039 44.894863,42.040056 44.90999,41.999899 44.895762,41.944234 44.913399,41.71342 44.893581))\",\"code\":\"stavropol\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"57\",\"name\":\"Ставрополь\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((37.988967 51.393172,38.033751 51.338068,38.014496 51.330424,38.029978 51.322342,38.065141 51.230624,37.99364 51.155762,37.975804 51.115372,37.89047 51.137642,37.867872 51.194118,37.752363 51.240665,37.711636 51.276762,37.748802 51.303268,37.718561 51.367014,37.830964 51.42328,37.971237 51.414969,37.988967 51.393172))\",\"code\":\"staroskol\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true},\"id\":\"60\",\"name\":\"Старый ОÑкол\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((56.141291 53.395949,56.132481 53.322821,56.107835 53.306713,55.876997 53.303411,55.850201 53.317461,55.762754 53.429216,55.710701 53.440577,55.691776 53.492937,55.796363 53.556787,55.817194 53.688315,55.910874 53.726732,55.921107 53.760998,55.978377 53.761845,55.978931 53.739263,56.108566 53.731209,56.140225 53.685013,56.150362 53.610702,56.128378 53.523897,56.141291 53.395949))\",\"code\":\"sterlitamak\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"54\",\"name\":\"Стерлитамак\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((72.38176 61.388553,73.693324 61.407472,73.718338 61.430866,73.826706 61.418172,73.782279 61.384658,73.797164 60.996565,72.41568 60.977161,72.38176 61.388553))\",\"code\":\"surgut\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"39\",\"name\":\"Сургут\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((50.657504 61.527715,50.636068 61.539362,50.589385 61.519683,50.584943 61.502181,50.358049 61.524635,50.374515 61.558666,50.155553 61.579157,50.192685 61.663327,50.211824 61.66137,50.219814 61.67932,50.259702 61.675254,50.297554 61.796039,50.390698 61.787261,50.470677 61.976617,50.518438 62.005444,50.658374 61.998829,50.700115 61.965373,50.831057 61.968262,51.042965 61.943237,51.023169 61.898419,51.300937 61.871537,51.285704 61.836303,51.363189 61.812802,51.439821 61.82162,51.438722 61.778192,51.451565 61.776999,51.394151 61.675321,51.254831 61.689574,51.204445 61.576752,51.047363 61.592638,51.012532 61.514285,50.742016 61.546535,50.657504 61.527715))\",\"code\":\"syktyvkar\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"72\",\"name\":\"Сыктывкар\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((32.439828 60.157495,32.542163 60.182563,32.624134 60.142223,32.590067 60.117627,32.536197 60.115498,32.506742 60.134542,32.474859 60.128624,32.439828 60.157495))\",\"code\":\"syasstroy\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"214\",\"name\":\"СÑÑÑŒÑтрой\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((38.960129 47.28818,38.973252 47.204558,38.95631 47.187762,38.765481 47.21002,38.808288 47.238429,38.799428 47.250036,38.820496 47.271938,38.960129 47.28818))\",\"code\":\"taganrog\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"116\",\"name\":\"Таганрог\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((41.260005 52.567998,41.268479 52.731323,41.236387 52.735174,41.271138 52.78225,41.274267 52.841987,41.459271 52.838296,41.480049 52.862206,41.51864 52.846945,41.517378 52.833462,41.638962 52.800252,41.641853 52.769172,41.602466 52.733497,41.596914 52.674708,41.615396 52.638425,41.609795 52.616906,41.625776 52.610338,41.587211 52.551951,41.481204 52.574653,41.359109 52.55523,41.260005 52.567998))\",\"code\":\"tambov\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"81\",\"name\":\"Тамбов\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((69.223353 41.163236,69.179814 41.182154,69.186879 41.207672,69.170885 41.214701,69.162638 41.250966,69.121886 41.265503,69.169189 41.356879,69.237089 41.398511,69.316518 41.384651,69.35091 41.354788,69.407511 41.369421,69.409552 41.343705,69.348746 41.307471,69.383928 41.303368,69.377276 41.286511,69.409491 41.268989,69.401761 41.239756,69.29581 41.169039,69.223353 41.163236))\",\"code\":\"tashkent\",\"country_code\":\"uz\",\"domain\":\"uz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"208\",\"name\":\"Ташкент\",\"time_zone\":{\"name\":\"Asia/Tashkent\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((35.607908 56.678784,35.570898 56.695545,35.538946 56.757706,35.588963 56.772938,35.591409 56.789031,35.571466 56.851008,35.537348 56.874905,35.532145 56.924343,35.508421 56.938997,35.556666 56.956783,35.570436 56.978595,35.664379 57.00865,35.73051 57.007665,35.808084 57.041392,35.898954 57.050067,35.97844 57.037342,36.015941 57.015087,36.337513 56.974103,36.352173 56.854836,36.323448 56.787361,36.361046 56.758043,36.270183 56.694838,36.239273 56.682469,35.607908 56.678784))\",\"code\":\"tver\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"47\",\"name\":\"Тверь\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((68.027461 58.334051,68.202464 58.347584,68.330932 58.333173,68.627747 58.337205,68.630591 58.064257,68.610922 58.051367,68.515642 58.063872,68.03489 58.061137,68.027461 58.334051))\",\"code\":\"tobolsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"97\",\"name\":\"ТобольÑк\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((49.757851 53.315548,49.787115 53.322185,49.777904 53.256952,49.792086 53.25618,49.796888 53.215506,49.77879 53.208185,49.807912 53.096481,49.794395 53.092844,49.787691 53.052236,49.664636 53.027741,49.576552 53.034333,49.572233 53.048521,49.544847 53.040739,49.543582 53.06297,49.510492 53.066913,49.456518 53.050985,49.452008 53.035115,49.41868 53.036828,49.417156 53.018136,49.366877 53.00935,49.341312 52.985902,49.198784 53.018644,49.194897 52.941977,49.182276 52.932441,49.108312 52.935222,49.107225 52.912333,49.025792 52.908694,48.986242 52.882038,48.929584 52.908165,48.946418 52.921663,48.892282 52.946993,48.850016 52.927677,48.73638 52.978646,48.715833 52.962543,48.666568 52.986212,48.634927 52.967427,48.576346 52.99159,48.487947 52.989752,48.519065 52.958914,48.499645 52.940519,48.449405 52.952114,48.439113 52.972607,48.359834 52.957324,48.353057 52.973451,48.371755 52.99315,48.325122 52.997345,48.342014 53.058921,48.159756 53.086096,48.212202 53.137432,48.107527 53.180833,48.111779 53.204457,48.218927 53.261041,48.246979 53.305485,48.275755 53.290227,48.385685 53.315284,48.472727 53.283413,48.536172 53.325795,48.611318 53.314063,48.637623 53.320761,48.640492 53.338086,48.705562 53.336534,48.731976 53.373765,48.769055 53.382194,48.758106 53.407056,48.849668 53.39149,48.872272 53.435382,48.830441 53.465481,48.909851 53.478603,48.894586 53.491142,48.90861 53.509192,48.933523 53.515975,48.941069 53.497287,48.98353 53.533523,48.949824 53.578564,48.939025 53.648958,48.994808 53.706596,48.998043 53.871958,49.07379 53.872534,49.084687 53.89076,49.078093 53.871636,49.211523 53.872496,49.249735 53.836495,49.300351 53.831284,49.370744 53.789309,49.4156 53.784704,49.410478 53.766899,49.476604 53.760069,49.481771 53.777859,49.56319 53.782712,49.647911 53.754543,49.640868 53.72903,49.815231 53.714027,49.804274 53.670863,49.7745 53.644768,49.797836 53.632407,49.762931 53.605617,49.794308 53.574405,49.733939 53.534138,49.728745 53.443838,49.681209 53.442657,49.707458 53.33157,49.757851 53.315548))\",\"code\":\"togliatti\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"22\",\"name\":\"ТольÑтти\",\"time_zone\":{\"name\":\"Europe/Samara\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((84.783402 56.581901,84.991724 56.591998,84.974638 56.639988,85.004481 56.687753,85.045182 56.688676,85.070721 56.678106,85.073288 56.650464,85.096105 56.650621,85.097019 56.637889,85.206565 56.608536,85.279646 56.569455,85.342194 56.524661,85.372239 56.469756,85.402749 56.459643,85.375987 56.453381,85.389566 56.411841,85.248355 56.351724,85.170078 56.345417,85.137633 56.327633,84.831578 56.323503,84.680085 56.540089,84.760897 56.558353,84.783402 56.581901))\",\"code\":\"tomsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"3\",\"name\":\"ТомÑк\",\"time_zone\":{\"name\":\"Asia/Tomsk\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((38.399267 54.266118,38.470992 54.193999,38.508234 54.178173,38.515886 54.160246,38.501516 54.156541,38.534027 54.123972,38.600428 54.112699,38.569552 54.063692,38.592478 54.044262,38.572731 54.016646,38.551337 54.01423,38.550516 53.995377,38.638449 53.9623,38.568617 53.959038,38.457578 53.848801,38.401631 53.820618,38.220688 53.849514,38.198672 53.864001,38.200643 53.890444,38.147397 53.902982,38.12458 53.891291,38.069076 53.910786,38.051279 53.901962,38.027663 53.918465,37.919557 53.890565,37.899904 53.90477,37.464798 53.889914,37.429616 53.899539,37.418328 54.197775,37.368526 54.228625,37.38038 54.252292,37.415747 54.265208,37.425436 54.309681,37.53468 54.311057,37.552533 54.334955,37.677493 54.300075,37.744368 54.322819,37.915046 54.315078,37.962779 54.325534,37.98144 54.352026,38.159244 54.352882,38.194297 54.365283,38.205572 54.354426,38.289137 54.372007,38.298507 54.345095,38.340918 54.328254,38.343188 54.300073,38.399267 54.266118))\",\"code\":\"tula\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"36\",\"name\":\"Тула\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((66.665516 57.236788,66.690851 57.236046,66.695691 57.221026,66.673562 57.06223,66.712652 57.016171,66.674961 56.962332,66.657754 56.901559,66.621048 56.52188,66.655094 56.516231,66.618862 56.498976,66.609235 56.397678,65.560375 56.416201,65.461425 56.437632,65.307668 56.400165,65.196699 56.429248,65.170515 56.463611,65.216947 56.494441,65.243024 56.934976,65.203136 57.082456,65.184508 57.090626,65.199421 57.108857,65.184607 57.113573,65.198384 57.119297,65.193532 57.136906,65.17139 57.137306,65.18333 57.151991,65.169414 57.165587,65.199666 57.186041,65.036285 57.196946,65.037312 57.253134,65.106968 57.323991,65.262697 57.284443,65.345841 57.318081,65.414268 57.316686,65.412894 57.300163,65.762215 57.307211,65.809373 57.258866,66.665516 57.236788))\",\"code\":\"tyumen\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"13\",\"name\":\"Тюмень\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((107.698215 51.61448,107.656415 51.609405,107.624279 51.572851,107.548805 51.555526,107.541877 51.517282,107.567665 51.508801,107.469426 51.468505,107.452452 51.446251,107.375663 51.461414,107.335109 51.452981,107.312194 51.415791,107.229733 51.380989,107.232814 51.289336,107.088937 50.95494,107.119548 50.865682,107.097894 50.832182,107.133471 50.745438,107.138476 50.597866,106.963518 50.582437,106.933742 50.474337,106.893527 50.418499,107.010408 50.259144,106.971522 50.216333,106.8096 50.3018,106.6172 50.3388,106.5234 50.3499,106.473797 50.319944,106.412209 50.329488,106.2634 50.3027,106.1804 50.3404,106.0918 50.3375,106.066352 50.400046,105.9839 50.4187,106.080723 50.821715,106.1909 50.909007,106.209079 51.096042,105.34599 51.321204,105.088578 51.287042,104.967909 51.252595,104.932183 51.193833,104.837515 51.163589,104.829684 51.118821,104.711555 51.071099,104.592602 51.062506,104.557791 51.010595,103.190497 51.019467,103.160499 51.043332,103.153291 51.108048,103.126091 51.139304,103.094689 51.147967,103.033889 51.133046,102.937987 51.144836,102.815491 51.123296,102.741891 51.057444,102.687684 51.066773,102.634689 51.053258,102.586387 51.065162,102.577889 51.091,102.596391 51.118801,102.567986 51.130078,102.520493 51.112584,102.436685 51.135842,102.296096 51.120889,102.261093 51.138896,102.132115 51.139805,102.1366 51.1671,102.1586 51.1821,102.1075 51.2437,102.1166 51.2808,102.1861 51.2944,102.1177 51.3591,102.0466 51.3888,101.9673 51.3929,101.9582 51.4085,101.9129 51.4186,101.8875 51.4039,101.8147 51.4156,101.7961 51.4403,101.7523 51.4548,101.6122 51.4445,101.628 51.4703,101.5565 51.479,101.526 51.4986,101.4606 51.4892,101.437 51.451,101.3638 51.4543,101.3576 51.4742,101.2487 51.542,101.1957 51.5196,101.141 51.5215,101.104593 51.591424,101.0781 51.564,101.01828 51.570504,101.019302 51.595386,100.989922 51.613547,100.912082 51.614294,100.8504 51.648438,100.73816 51.678359,100.691279 51.710878,100.668506 51.706635,100.657446 51.726057,100.623385 51.726582,100.680694 51.764666,100.736937 51.776432,100.760475 51.765119,101.005691 51.7762,101.11139 51.797931,101.217582 51.773777,101.42569 51.811225,101.467788 51.80297,101.657988 51.835614,101.896286 51.853818,102.175186 51.954517,102.372085 51.978313,102.458694 51.969452,102.556503 51.906062,102.681587 51.881863,102.821884 51.912455,102.826164 51.982203,102.915822 51.910843,103.06229 51.901553,103.112597 51.868849,103.077015 51.856441,103.183926 51.832349,103.226932 51.80512,103.523758 51.732401,103.636253 51.737035,103.647397 51.710443,103.578177 51.613596,103.854636 51.574505,104.10809 51.483461,104.633082 51.424714,104.638515 51.456042,104.59243 51.628024,105.245419 51.733833,105.602595 51.851716,105.823638 51.999338,106.172533 52.361056,106.999934 52.716939,108.012655 53.233717,108.297403 53.673511,108.373418 53.764052,108.929363 54.269942,109.543217 54.137962,109.571009 54.113442,109.576767 54.085589,109.623624 54.05345,109.783346 54.037236,109.79646 54.023096,109.820289 54.032949,110.109045 53.946227,110.190087 53.942366,110.228012 53.881763,110.033421 53.822867,110.026644 53.786567,109.95741 53.769449,109.79495 53.658651,109.827281 53.640473,109.82049 53.63228,109.774956 53.628465,109.772408 53.611417,109.728834 53.582666,109.676847 53.576952,109.681191 53.513946,109.693225 53.506872,109.665725 53.503162,109.672112 53.452787,109.586413 53.447626,109.606989 53.431008,109.586024 53.413111,109.606315 53.368601,109.208361 52.884073,109.140834 52.856747,109.056377 52.847811,108.921689 52.788249,108.905273 52.758485,108.857134 52.727341,108.866852 52.705676,108.836543 52.692437,108.837103 52.654528,108.806788 52.65392,108.750081 52.613573,108.756079 52.587244,108.72445 52.553625,108.743334 52.538009,108.735983 52.524572,108.709908 52.507941,108.614333 52.500895,108.59248 52.474767,108.520384 52.453709,108.455362 52.391449,108.417289 52.327266,108.384674 52.31775,108.396699 52.298447,108.366236 52.255853,108.316805 52.246193,108.328595 52.207626,108.223087 52.173129,108.113563 51.929275,108.179722 51.914889,108.165325 51.853771,108.117598 51.837772,108.044288 51.757771,108.053087 51.744034,108.016956 51.70757,108.041837 51.704255,108.037249 51.679814,107.956945 51.625796,107.979753 51.606006,107.95509 51.588001,107.929383 51.597187,107.92106 51.573883,107.82198 51.553036,107.786141 51.604749,107.698215 51.61448))\",\"code\":\"ulanude\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"37\",\"name\":\"Улан-УдÑ\",\"time_zone\":{\"name\":\"Asia/Irkutsk\",\"offset\":480},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((48.634539 54.121281,48.56085 54.0901,48.552474 54.05428,48.524714 54.061226,48.519761 54.077286,48.445814 54.090836,48.408869 54.074805,48.322982 54.099049,48.179784 54.107706,48.159518 54.09732,48.069958 54.124575,48.04981 54.173416,48.00799 54.217115,48.035851 54.233839,48.022491 54.271162,48.035469 54.305415,48.056294 54.310561,48.041922 54.337865,47.965906 54.379922,47.992768 54.38293,47.984027 54.401357,48.035637 54.40986,48.011365 54.436125,48.029376 54.461865,48.08464 54.477654,48.318008 54.451123,48.336596 54.476568,48.847462 54.473294,48.861951 54.469107,48.860767 54.430261,48.924566 54.399153,48.914048 54.377469,48.953981 54.3627,49.264428 54.331259,49.19362 54.275096,49.129537 54.293072,49.139927 54.28225,49.124791 54.264259,49.19128 54.23221,49.100666 54.223599,49.087943 54.177067,49.001212 54.192089,49.007885 54.208045,48.976294 54.215558,48.93621 54.182404,48.856589 54.159136,48.634539 54.121281))\",\"code\":\"ulyanovsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"55\",\"name\":\"УльÑновÑк\",\"time_zone\":{\"name\":\"Europe/Ulyanovsk\",\"offset\":240},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((51.535491 51.289132,51.735464 51.370655,51.831167 51.382004,52.001737 51.439923,52.144871 51.468261,52.418029 51.467142,52.5074 51.5204,52.554049 51.490124,52.535767 51.467422,52.564276 51.455128,52.583579 51.477572,52.598731 51.471062,52.59221 51.454459,52.621579 51.456555,52.620829 51.474631,52.640608 51.463417,52.65523 51.490654,52.680882 51.456784,52.690641 51.463867,52.671071 51.473918,52.683196 51.480069,52.803148 51.446403,52.845179 51.347509,53.125694 51.19634,53.125431 51.117439,52.755766 51.040014,52.281686 51.047853,51.877974 51.092344,51.56813 51.155685,51.241077 51.03227,51.217932 51.048987,51.272711 51.217896,51.258108 51.243037,51.265796 51.293382,51.323377 51.295239,51.353126 51.31411,51.446775 51.281324,51.535491 51.289132))\",\"code\":\"uralsk\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"162\",\"name\":\"УральÑк\",\"time_zone\":{\"name\":\"Asia/Oral\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((131.816747 43.70959,131.787156 43.708761,131.73639 43.752125,131.756949 43.851284,131.749195 43.962278,132.076996 43.975946,132.130901 43.964375,132.142052 43.718194,132.01259 43.703639,131.816747 43.70959))\",\"code\":\"ussuriysk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"83\",\"name\":\"УÑÑурийÑк\",\"time_zone\":{\"name\":\"Asia/Vladivostok\",\"offset\":600},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((82.661138 49.798516,82.545707 49.841691,82.44862 49.846928,82.392522 49.92013,82.454 49.961702,82.43318 50.045936,82.450724 50.059192,82.715976 50.057306,82.806336 50.028657,82.796278 50.00252,82.911019 49.864261,82.904611 49.819293,82.95274 49.801722,82.980783 49.761077,82.834545 49.762443,82.661138 49.798516))\",\"code\":\"ustkam\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"91\",\"name\":\"УÑÑ‚ÑŒ-КаменогорÑк\",\"time_zone\":{\"name\":\"Asia/Almaty\",\"offset\":360},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((55.513299 54.50669,55.494061 54.522228,55.482358 54.499942,55.370533 54.502842,55.333781 54.478486,55.337286 54.466929,55.274856 54.490371,55.260739 54.468126,54.842509 54.456509,54.843068 54.473374,54.814564 54.483257,54.769627 54.445091,54.72315 54.443431,54.560293 54.483057,54.5318 54.466239,54.418596 54.494966,54.313238 54.485285,54.271603 54.443735,54.199599 54.436248,54.075626 54.458357,53.976709 54.41731,53.943558 54.374826,53.782489 54.397594,53.778182 54.378343,53.6907 54.386323,53.682825 54.407089,53.6494 54.40974,53.647372 54.396844,53.549588 54.40325,53.551157 54.422996,53.44346 54.416616,53.382596 54.452052,53.3771 54.502991,53.39054 54.504767,53.37469 54.540229,53.538948 54.687529,53.586984 54.678888,53.607935 54.696374,53.636725 54.686446,53.631588 54.66209,53.789475 54.637296,53.823796 54.605438,53.903618 54.607387,54.024752 54.643675,54.064318 54.60893,54.116066 54.608192,54.267083 54.620174,54.386915 54.667322,54.651514 54.672082,54.683258 54.687295,54.700007 54.717494,54.805092 54.724984,54.985053 54.786446,54.980276 54.803046,55.071891 54.802814,55.076182 54.82451,55.140601 54.829387,55.152037 54.79505,55.207401 54.802098,55.215732 54.787228,55.318581 54.78635,55.349396 54.816566,55.409092 54.807305,55.413453 54.832513,55.492898 54.819783,55.531936 54.879929,55.628156 54.866742,55.7174 55.045024,55.687956 55.06524,55.690124 55.083961,55.857773 55.122048,56.097268 55.058446,56.139163 54.955363,56.190417 54.951962,56.258965 54.975092,56.318201 54.969843,56.343234 54.922513,56.492011 54.850912,56.513835 54.781042,56.437825 54.744877,56.419164 54.698865,56.390362 54.677768,56.403507 54.630328,56.355509 54.617458,56.342237 54.597848,56.348497 54.57342,56.38673 54.581848,56.415958 54.559888,56.353748 54.527367,56.366215 54.501712,56.326085 54.49152,56.352179 54.466123,56.290272 54.435125,56.2344 54.458465,56.045708 54.41963,55.949653 54.46844,55.917946 54.44712,55.894078 54.474544,55.865215 54.467268,55.870203 54.476916,55.850475 54.4818,55.81172 54.462923,55.670207 54.520705,55.576685 54.523908,55.513299 54.50669))\",\"code\":\"ufa\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"17\",\"name\":\"Уфа\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((53.574443 63.644158,53.698918 63.691481,53.819455 63.687831,54.082849 63.642387,54.203436 63.597614,54.215629 63.566954,54.159605 63.533982,54.012285 63.370321,53.942882 63.353183,53.74934 63.381219,53.560589 63.3767,53.18767 63.464611,53.171499 63.480109,53.257023 63.552752,53.574443 63.644158))\",\"code\":\"ukhta\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"204\",\"name\":\"Ухта\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((135.258155 48.433811,135.257422 48.288578,135.064085 48.274463,134.874409 48.288797,134.873526 48.629594,135.259151 48.629372,135.275151 48.597403,135.268659 48.51501,135.229014 48.490393,135.250281 48.488475,135.233596 48.470107,135.258308 48.464082,135.258155 48.433811))\",\"code\":\"khabarovsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"35\",\"name\":\"ХабаровÑк\",\"time_zone\":{\"name\":\"Asia/Vladivostok\",\"offset\":600},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((68.949135 61.067994,69.064458 61.116854,69.102442 61.116618,69.183856 61.081996,69.257216 61.115126,69.359066 61.080996,69.396555 61.036198,69.418585 61.034991,69.418699 61.009458,69.335942 60.960712,69.075245 60.916376,68.976026 60.950316,68.957839 61.015554,68.915346 61.051847,68.918141 61.070311,68.949135 61.067994))\",\"code\":\"kh_mansiysk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"150\",\"name\":\"Ханты-МанÑийÑк\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((36.034468 50.060655,36.045996 50.115501,36.087143 50.14146,36.416935 50.127697,36.499253 50.101702,36.487564 50.080172,36.504004 50.071658,36.484201 50.060952,36.503267 50.051183,36.474218 50.04183,36.481798 49.972727,36.464678 49.942426,36.511907 49.918553,36.5113 49.883519,36.481252 49.879861,36.463851 49.838002,36.365981 49.847881,36.347059 49.833716,36.346506 49.80937,36.136868 49.852873,36.092277 49.83968,36.053934 49.849966,36.041616 49.873391,36.054222 49.88199,36.02314 49.919707,36.033015 49.932738,36.010819 49.947633,36.032366 49.979732,35.981617 49.992965,36.024417 50.011032,36.034468 50.060655))\",\"code\":\"kharkov\",\"country_code\":\"ua\",\"domain\":\"ua\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":true,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"110\",\"name\":\"Харьков\",\"time_zone\":{\"name\":\"Europe/Kiev\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((46.648661 43.209742,46.602332 43.198957,46.562281 43.21131,46.538973 43.238001,46.542462 43.281203,46.617797 43.281587,46.648661 43.209742))\",\"code\":\"khasavyurt\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":false},\"id\":\"151\",\"name\":\"ХаÑавюрт\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((47.003696 56.264089,47.157621 56.330593,47.604562 56.313312,47.577505 56.071351,47.599217 56.03641,47.584692 56.032973,47.57594 55.988608,47.5156 55.968684,47.423278 55.984072,47.366692 55.97116,47.307714 55.990549,47.198503 55.967518,47.167182 55.981611,46.993093 55.988177,46.96654 56.009043,46.986605 56.02278,46.984365 56.072908,46.997421 56.078488,46.939627 56.229502,47.003696 56.264089))\",\"code\":\"cheboksary\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"53\",\"name\":\"ЧебокÑары\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((61.252272 54.968614,61.203292 54.974499,61.154767 55.001658,61.045568 55.121512,61.100754 55.175448,61.084098 55.195727,61.149519 55.295912,61.284521 55.36403,61.360806 55.379536,61.385601 55.362557,61.470025 55.375552,61.600387 55.321009,61.69485 55.304482,61.756228 55.265544,61.745198 55.160898,61.779485 55.083582,61.76733 55.046807,61.746429 55.036978,61.757873 54.97934,61.70127 54.987808,61.599819 54.966064,61.54954 54.932824,61.570157 54.915237,61.501835 54.895912,61.469463 54.906971,61.470091 54.938297,61.403401 54.928846,61.368564 54.96636,61.252272 54.968614))\",\"code\":\"chelyabinsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"15\",\"name\":\"ЧелÑбинÑк\",\"time_zone\":{\"name\":\"Asia/Yekaterinburg\",\"offset\":300},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((42.063351 44.174307,42.032856 44.157802,42.004777 44.168195,42.005763 44.256884,42.046537 44.293932,42.057868 44.263238,42.094895 44.27978,42.095012 44.263651,42.123356 44.262439,42.101315 44.222423,42.100775 44.181605,42.063351 44.174307))\",\"code\":\"cherkessk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"118\",\"name\":\"ЧеркеÑÑк\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((113.069162 52.396705,113.152477 52.452545,113.371366 52.464993,113.470022 52.356606,113.534077 52.332884,113.516717 52.31346,113.536592 52.3132,113.527842 52.29535,113.560493 52.277937,113.551234 52.264949,113.666419 52.217868,113.764267 52.222663,113.798989 52.19943,113.815862 52.148641,113.785471 51.966389,113.676566 51.862738,113.451038 51.818171,113.370101 51.78102,113.348087 51.718262,113.272946 51.744414,113.219211 51.796579,113.144941 51.825077,113.064818 51.827423,112.930694 51.886475,112.505278 51.925249,112.39496 51.950602,112.334198 51.982953,112.33115 51.996715,112.361117 52.021256,112.322516 52.033757,112.323024 52.086064,112.343848 52.109777,112.332928 52.123188,112.359593 52.18084,112.436054 52.228411,112.511075 52.249215,112.505306 52.294373,112.546581 52.346365,112.610136 52.357394,112.653274 52.340795,112.680258 52.354375,112.735469 52.326659,112.804526 52.326126,112.881217 52.351024,112.922137 52.329699,112.981963 52.376365,113.008415 52.370063,113.069162 52.396705))\",\"code\":\"chita\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"64\",\"name\":\"Чита\",\"time_zone\":{\"name\":\"Asia/Chita\",\"offset\":540},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((40.196701 47.783662,40.282522 47.783729,40.387246 47.750448,40.348815 47.708697,40.325883 47.709878,40.318424 47.671348,40.243614 47.668837,40.203531 47.641568,40.186315 47.640497,40.132498 47.68707,40.073416 47.688098,40.087176 47.726971,40.080282 47.809139,40.139919 47.811535,40.15313 47.792018,40.196701 47.783662))\",\"code\":\"shakhty\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"152\",\"name\":\"Шахты\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((88.071027 52.880742,88.0044 52.768839,87.913372 52.715666,87.821154 52.726087,87.779438 52.751649,87.771905 52.838728,87.614726 52.916859,87.470702 52.897774,87.435344 52.912503,87.340253 53.00986,87.320082 53.062793,87.224531 53.144865,87.115495 53.210666,87.110063 53.280727,86.93067 53.471467,86.927436 53.498504,87.250459 53.498264,87.265593 53.487551,87.274477 53.498212,87.456823 53.497654,87.602184 53.410864,87.608344 53.365748,87.659453 53.306464,87.786968 53.341895,87.859751 53.303815,87.874373 53.25503,87.958889 53.265176,88.002464 53.218799,88.090335 53.216248,88.118962 53.10632,88.086288 53.074775,88.11326 53.022493,88.073015 52.961427,88.091294 52.939008,88.071027 52.880742))\",\"code\":\"sheregesh\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true},\"id\":\"206\",\"name\":\"Шерегеш\",\"time_zone\":{\"name\":\"Asia/Novokuznetsk\",\"offset\":420},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((69.416245 42.43852,69.802137 42.436468,69.799675 42.242484,69.414967 42.244521,69.416245 42.43852))\",\"code\":\"shymkent\",\"country_code\":\"kz\",\"domain\":\"kz\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"161\",\"name\":\"Шымкент\",\"time_zone\":{\"name\":\"Asia/Almaty\",\"offset\":360},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((44.15612 46.265719,44.132718 46.263692,44.170768 46.387705,44.36002 46.37322,44.37314 46.35283,44.362824 46.338897,44.400949 46.322676,44.401341 46.31164,44.361345 46.315885,44.352137 46.279184,44.323492 46.27843,44.303645 46.23794,44.15612 46.265719))\",\"code\":\"elista\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":false,\"metro\":false,\"public_transport\":false,\"road_network\":true},\"id\":\"153\",\"name\":\"ÐлиÑта\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((141.675118 47.669621,141.68309 47.687322,141.996815 47.620946,142.054915 47.55946,142.061898 47.524003,142.091643 47.501389,142.137566 47.497304,142.204846 47.523722,142.193993 47.575909,142.235882 47.559828,142.277984 47.599893,142.379936 47.641676,142.34477 47.668283,142.367085 47.708999,142.433038 47.712816,142.391115 47.759771,142.40718 47.802399,142.363027 47.810485,142.335671 47.859543,142.35035 47.872389,142.319167 47.908044,142.370514 47.950153,142.36785 47.967077,142.430172 48.004207,142.498338 47.965237,142.528036 47.977203,142.840258 47.976952,142.823431 47.796041,142.862919 47.705495,142.929041 47.619192,143.129518 47.50829,143.201995 47.44488,143.304514 47.297502,143.335109 47.108297,143.648645 46.992415,143.716886 46.939107,143.762274 46.870484,143.79941 46.735728,143.825875 46.545657,143.890542 46.444329,143.903581 46.350373,143.879647 46.289696,143.772449 46.143633,143.736816 46.032721,143.665992 45.923211,143.595467 45.864906,143.472308 45.824532,143.33642 45.828324,143.236326 45.864426,143.165438 45.9208,143.129995 45.983756,143.109984 46.088789,143.117793 46.22435,143.064302 46.324019,142.933805 46.40737,142.847268 46.408042,142.768372 46.398919,142.588021 46.335876,142.540337 46.242406,142.52034 46.126556,142.457837 45.977249,142.34959 45.822267,142.291767 45.656078,141.716427 45.742255,141.762841 45.852956,141.677199 45.939908,141.643665 45.996301,141.600864 46.276621,141.542085 46.432746,141.52014 46.544633,141.530207 46.654188,141.716865 46.997716,141.758166 47.128712,141.690923 47.226766,141.671864 47.284024,141.659125 47.521747,141.675118 47.669621))\",\"code\":\"yuzhnosakhalinsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"88\",\"name\":\"Южно-СахалинÑк\",\"time_zone\":{\"name\":\"Asia/Sakhalin\",\"offset\":660},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((129.558902 63.074525,129.903214 63.064516,130.628021 62.872738,131.10201 62.821206,131.510086 62.667691,131.809064 62.376579,132.20485 62.172118,132.605365 62.154489,132.645819 61.993152,132.538766 61.960015,132.368896 61.767607,132.307298 61.623673,132.345091 61.51414,132.901052 61.374474,132.756845 61.279243,132.733495 61.183413,132.082012 60.815271,131.543676 60.612425,131.29284 60.720121,130.760567 61.038314,130.333489 61.200906,128.596587 61.226232,128.449352 61.28631,128.385933 61.356958,128.359823 61.498674,128.278246 61.544112,128.042763 61.546686,127.859237 61.623452,127.740559 61.640124,127.469812 61.744924,127.327083 61.772595,127.231878 61.821748,127.119728 61.833251,126.621593 62.006493,126.669435 62.084154,126.626105 62.163748,126.668957 62.187302,126.756555 62.185521,126.918528 62.243751,127.120169 62.258118,127.16015 62.300908,127.635516 62.42181,128.03065 62.387201,128.246614 62.560553,128.476017 62.650675,128.990199 62.710662,129.483198 63.059376,129.558902 63.074525))\",\"code\":\"yakutsk\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"50\",\"name\":\"ЯкутÑк\",\"time_zone\":{\"name\":\"Asia/Yakutsk\",\"offset\":540},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}},{\"bounds\":\"POLYGON((39.707415 57.626018,39.726133 57.726358,39.696686 57.753943,39.783415 57.776164,40.004961 57.777804,40.032512 57.763814,40.010655 57.728992,40.043694 57.636403,40.130122 57.612294,40.192697 57.616615,40.1857 57.575858,40.21788 57.557747,40.215279 57.541949,40.115893 57.524251,40.096326 57.496959,39.952198 57.523612,39.71074 57.507271,39.677242 57.526629,39.675203 57.549456,39.692672 57.560453,39.664961 57.581545,39.707584 57.585252,39.707415 57.626018))\",\"code\":\"yaroslavl\",\"country_code\":\"ru\",\"domain\":\"ru\",\"flags\":{\"2gis_reviews\":true,\"flamp\":true,\"has_net_booklet\":true,\"metro\":false,\"pedestrian_routing\":true,\"public_transport\":true,\"road_network\":true,\"traffic\":true},\"id\":\"28\",\"name\":\"ЯроÑлавль\",\"time_zone\":{\"name\":\"Europe/Moscow\",\"offset\":180},\"type\":\"region\",\"zoom_level\":{\"max\":18,\"min\":9}}]');DG.config = {\"host\":null,\"port\":3000,\"defaultSkin\":\"dark\",\"defaultLang\":\"ru\",\"trafficLayerMinZoom\":10,\"trafficLayerUpdateInterval\":300000,\"ppnotLink\":\"http://2gis.{domain}/{projectCode}/center/{center}/zoom/{zoom}/routeTab/rsType/{rsType}/to/{point}â•Ž{name}\",\"photosLink\":\"http://2gis.{domain}/photos/{id}\",\"poiLayerMinZoom\":0,\"detectRetina\":false,\"webApiKey\":\"ruregt3044\",\"webApiVersion\":\"2.0\",\"regionListFields\":\"items.bounds,items.zoom_level,items.time_zone,items.code,items.flags,items.country_code,items.domain,items.default_pos\",\"firmInfoFields\":\"items.reviews,items.links,items.external_content\",\"geoAdditionalFields\":\"items.geometry.selection,items.links,items.adm_div,items.address,items.floors,items.description\",\"geoclickerCatalogApiKey\":\"ruregt3044\",\"projectLeaveMaxZoom\":16,\"flampUrl\":\"http://flamp.ru/r/\",\"flampGoogleAnalytics\":\"utm_source=api2gis&utm_medium=api&utm_campaign=geoclicker\",\"gaCode\":\"UA-38243181-2\",\"gaName\":\"mapsapi2gis\",\"protocol\":\"https:\",\"baseUrl\":\"//maps.api.2gis.ru/2.0\",\"tileServer\":\"//tile{s}.maps.2gis.com/tiles?x={x}&y={y}&z={z}&v=1&ts=online_sd\",\"retinaTileServer\":\"//tile{s}.maps.2gis.com/tiles?x={x}&y={y}&z={z}&v=1&ts=online_hd\",\"previewTileServer\":\"//tile{s}.maps.2gis.com/tiles?x={x}&y={y}&z={z}&v=1&size=64&ts=online_sd\",\"previewRetinaTileServer\":\"//tile{s}.maps.2gis.com/tiles?x={x}&y={y}&z={z}&v=1&size=64&ts=online_hd\",\"arabicTileServer\":\"//tile{s}.maps.2gis.com/tiles?x={x}&y={y}&z={z}&v=1&ts=online_sd_ar\",\"arabicRetinaTileServer\":\"//tile{s}.maps.2gis.com/tiles?x={x}&y={y}&z={z}&v=1&ts=online_hd_ar\",\"arabicPreviewTileServer\":\"//tile{s}.maps.2gis.com/tiles?x={x}&y={y}&z={z}&v=1&size=64&ts=online_sd_ar\",\"arabicPreviewRetinaTileServer\":\"//tile{s}.maps.2gis.com/tiles?x={x}&y={y}&z={z}&v=1&size=64&ts=online_hd_ar\",\"trafficTileServer\":\"//traffic{s}.maps.2gis.com/{projectCode}/traffic/{z}/{x}/{y}/speed/{period}/{timestampString}\",\"retinaTrafficTileServer\":\"//traffic{s}.maps.2gis.com/{projectCode}/traffic/{z}/{x}/{y}/speed/{period}/retina/{timestampString}\",\"trafficMetaServer\":\"//meta{s}.maps.2gis.com/{projectCode}/meta/{z}/{x}/{y}/graph_speed/{period}/{timestampString}\",\"retinaTrafficMetaServer\":\"//meta{s}.maps.2gis.com/{projectCode}/meta/{z}/{x}/{y}/graph_speed/{period}/retina/{timestampString}\",\"trafficTimestampServer\":\"//traffic{s}.maps.2gis.com/{projectCode}/meta/speed/time/\",\"trafficScoreServer\":\"//traffic{s}.maps.2gis.com/{projectCode}/meta/score/0/\",\"poiMetaServer\":\"//tile{s}.maps.2gis.com/poi?x={x}&y={y}&z={z}&v=1&ts=online_sd\",\"retinaPoiMetaServer\":\"//tile{s}.maps.2gis.com/poi?x={x}&y={y}&z={z}&v=1&ts=online_hd\",\"arabicPoiMetaServer\":\"//tile{s}.maps.2gis.com/poi?x={x}&y={y}&z={z}&v=1&ts=online_sd_ar\",\"arabicRetinaPoiMetaServer\":\"//tile{s}.maps.2gis.com/poi?x={x}&y={y}&z={z}&v=1&ts=online_hd_ar\",\"webApiServer\":\"//catalog.api.2gis.ru\",\"googleAnalytics\":\"https://www.google-analytics.com/analytics.js\",\"loadProjectListTimeout\":5000};_dereq_(\"../../../dist/css/styles.full.dark.css\");\n}).call(this,_dereq_('_process'))\n},{\"../../../dist/css/styles.full.dark.css\":1,\"../../../vendors/baron\":9,\"_process\":8,\"dustjs-helpers\":4,\"dustjs-linkedin\":5,\"html5shiv\":6,\"leaflet\":7}],3:[function(_dereq_,module,exports){\n'use strict';\n// For more information about browser field, check out the browser field at https://github.com/substack/browserify-handbook#browser-field.\n\nvar styleElementsInsertedAtTop = [];\n\nvar insertStyleElement = function(styleElement, options) {\n var head = document.head || document.getElementsByTagName('head')[0];\n var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1];\n\n options = options || {};\n options.insertAt = options.insertAt || 'bottom';\n\n if (options.insertAt === 'top') {\n if (!lastStyleElementInsertedAtTop) {\n head.insertBefore(styleElement, head.firstChild);\n } else if (lastStyleElementInsertedAtTop.nextSibling) {\n head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling);\n } else {\n head.appendChild(styleElement);\n }\n styleElementsInsertedAtTop.push(styleElement);\n } else if (options.insertAt === 'bottom') {\n head.appendChild(styleElement);\n } else {\n throw new Error('Invalid value for parameter \\'insertAt\\'. Must be \\'top\\' or \\'bottom\\'.');\n }\n};\n\nmodule.exports = {\n // Create a <link> tag with optional data attributes\n createLink: function(href, attributes) {\n var head = document.head || document.getElementsByTagName('head')[0];\n var link = document.createElement('link');\n\n link.href = href;\n link.rel = 'stylesheet';\n\n for (var key in attributes) {\n if ( ! attributes.hasOwnProperty(key)) {\n continue;\n }\n var value = attributes[key];\n link.setAttribute('data-' + key, value);\n }\n\n head.appendChild(link);\n },\n // Create a <style> tag with optional data attributes\n createStyle: function(cssText, attributes, extraOptions) {\n extraOptions = extraOptions || {};\n\n var style = document.createElement('style');\n style.type = 'text/css';\n\n for (var key in attributes) {\n if ( ! attributes.hasOwnProperty(key)) {\n continue;\n }\n var value = attributes[key];\n style.setAttribute('data-' + key, value);\n }\n\n if (style.sheet) { // for jsdom and IE9+\n style.innerHTML = cssText;\n style.sheet.cssText = cssText;\n insertStyleElement(style, { insertAt: extraOptions.insertAt });\n } else if (style.styleSheet) { // for IE8 and below\n insertStyleElement(style, { insertAt: extraOptions.insertAt });\n style.styleSheet.cssText = cssText;\n } else { // for Chrome, Firefox, and Safari\n style.appendChild(document.createTextNode(cssText));\n insertStyleElement(style, { insertAt: extraOptions.insertAt });\n }\n }\n};\n\n},{}],4:[function(_dereq_,module,exports){\n(function(root, factory) {\n if (typeof define === 'function' && define.amd && define.amd.dust === true) {\n define(['dust.core'], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory(_dereq_('dustjs-linkedin'));\n } else {\n factory(root.dust);\n }\n}(this, function(dust) {\n\nfunction log(helper, msg, level) {\n level = level || \"INFO\";\n helper = helper ? '{@' + helper + '}: ' : '';\n dust.log(helper + msg, level);\n}\n\nvar _deprecatedCache = {};\nfunction _deprecated(target) {\n if(_deprecatedCache[target]) { return; }\n log(target, \"Deprecation warning: \" + target + \" is deprecated and will be removed in a future version of dustjs-helpers\", \"WARN\");\n log(null, \"For help and a deprecation timeline, see https://github.com/linkedin/dustjs-helpers/wiki/Deprecated-Features#\" + target.replace(/\\W+/g, \"\"), \"WARN\");\n _deprecatedCache[target] = true;\n}\n\nfunction isSelect(context) {\n return context.stack.tail &&\n context.stack.tail.head &&\n typeof context.stack.tail.head.__select__ !== \"undefined\";\n}\n\nfunction getSelectState(context) {\n return isSelect(context) && context.get('__select__');\n}\n\n/**\n * Adds a special __select__ key behind the head of the context stack. Used to maintain the state\n * of {@select} blocks\n * @param context {Context} add state to this Context\n * @param opts {Object} add these properties to the state (`key` and `type`)\n */\nfunction addSelectState(context, opts) {\n var head = context.stack.head,\n newContext = context.rebase(),\n key;\n\n if(context.stack && context.stack.tail) {\n newContext.stack = context.stack.tail;\n }\n\n var state = {\n isPending: false,\n isResolved: false,\n isDeferredComplete: false,\n deferreds: []\n };\n\n for(key in opts) {\n state[key] = opts[key];\n }\n\n return newContext\n .push({ \"__select__\": state })\n .push(head, context.stack.index, context.stack.of);\n}\n\n/**\n * After a {@select} or {@math} block is complete, they invoke this function\n */\nfunction resolveSelectDeferreds(state) {\n var x, len;\n state.isDeferredPending = true;\n if(state.deferreds.length) {\n state.isDeferredComplete = true;\n for(x=0, len=state.deferreds.length; x<len; x++) {\n state.deferreds[x]();\n }\n }\n state.isDeferredPending = false;\n}\n\n/**\n * Used by {@contextDump}\n */\nfunction jsonFilter(key, value) {\n if (typeof value === \"function\") {\n return value.toString()\n .replace(/(^\\s+|\\s+$)/mg, '')\n .replace(/\\n/mg, '')\n .replace(/,\\s*/mg, ', ')\n .replace(/\\)\\{/mg, ') {');\n }\n return value;\n}\n\n/**\n * Generate a truth test helper\n */\nfunction truthTest(name, test) {\n return function(chunk, context, bodies, params) {\n return filter(chunk, context, bodies, params, name, test);\n };\n}\n\n/**\n * This function is invoked by truth test helpers\n */\nfunction filter(chunk, context, bodies, params, helperName, test) {\n var body = bodies.block,\n skip = bodies['else'],\n selectState = getSelectState(context) || {},\n willResolve, key, value, type;\n\n // Once one truth test in a select passes, short-circuit the rest of the tests\n if (selectState.isResolved && !selectState.isDeferredPending) {\n return chunk;\n }\n\n // First check for a key on the helper itself, then look for a key on the {@select}\n if (params.hasOwnProperty('key')) {\n key = params.key;\n } else if (selectState.hasOwnProperty('key')) {\n key = selectState.key;\n } else {\n log(helperName, \"No key specified\", \"WARN\");\n return chunk;\n }\n\n type = params.type || selectState.type;\n\n key = coerce(context.resolve(key), type);\n value = coerce(context.resolve(params.value), type);\n\n if (test(key, value)) {\n // Once a truth test passes, put the select into \"pending\" state. Now we can render the body of\n // the truth test (which may contain truth tests) without altering the state of the select.\n if (!selectState.isPending) {\n willResolve = true;\n selectState.isPending = true;\n }\n if (body) {\n chunk = chunk.render(body, context);\n }\n if (willResolve) {\n selectState.isResolved = true;\n }\n } else if (skip) {\n chunk = chunk.render(skip, context);\n }\n return chunk;\n}\n\nfunction coerce(value, type) {\n if (type) {\n type = type.toLowerCase();\n }\n switch (type) {\n case 'number': return +value;\n case 'string': return String(value);\n case 'boolean':\n value = (value === 'false' ? false : value);\n return Boolean(value);\n case 'date': return new Date(value);\n }\n\n return value;\n}\n\nvar helpers = {\n\n // Utility helping to resolve dust references in the given chunk\n // uses native Dust Context#resolve (available since Dust 2.6.2)\n \"tap\": function(input, chunk, context) {\n // deprecated for removal in 1.8\n _deprecated(\"tap\");\n return context.resolve(input);\n },\n\n \"sep\": function(chunk, context, bodies) {\n var body = bodies.block;\n if (context.stack.index === context.stack.of - 1) {\n return chunk;\n }\n if (body) {\n return body(chunk, context);\n } else {\n return chunk;\n }\n },\n\n \"first\": function(chunk, context, bodies) {\n if (context.stack.index === 0) {\n return bodies.block(chunk, context);\n }\n return chunk;\n },\n\n \"last\": function(chunk, context, bodies) {\n if (context.stack.index === context.stack.of - 1) {\n return bodies.block(chunk, context);\n }\n return chunk;\n },\n\n /**\n * {@contextDump}\n * @param key {String} set to \"full\" to the full context stack, otherwise the current context is dumped\n * @param to {String} set to \"console\" to log to console, otherwise outputs to the chunk\n */\n \"contextDump\": function(chunk, context, bodies, params) {\n var to = context.resolve(params.to),\n key = context.resolve(params.key),\n target, output;\n switch(key) {\n case 'full':\n target = context.stack;\n break;\n default:\n target = context.stack.head;\n }\n output = JSON.stringify(target, jsonFilter, 2);\n switch(to) {\n case 'console':\n log('contextDump', output);\n break;\n default:\n output = output.replace(/</g, '\\\\u003c');\n chunk = chunk.write(output);\n }\n return chunk;\n },\n\n /**\n * {@math}\n * @param key first value\n * @param method {String} operation to perform\n * @param operand second value (not required for operations like `abs`)\n * @param round if truthy, round() the result\n */\n \"math\": function (chunk, context, bodies, params) {\n var key = params.key,\n method = params.method,\n operand = params.operand,\n round = params.round,\n output, state, x, len;\n\n if(!params.hasOwnProperty('key') || !params.method) {\n log(\"math\", \"`key` or `method` was not provided\", \"ERROR\");\n return chunk;\n }\n\n key = parseFloat(context.resolve(key));\n operand = parseFloat(context.resolve(operand));\n\n switch(method) {\n case \"mod\":\n if(operand === 0) {\n log(\"math\", \"Division by 0\", \"ERROR\");\n }\n output = key % operand;\n break;\n case \"add\":\n output = key + operand;\n break;\n case \"subtract\":\n output = key - operand;\n break;\n case \"multiply\":\n output = key * operand;\n break;\n case \"divide\":\n if(operand === 0) {\n log(\"math\", \"Division by 0\", \"ERROR\");\n }\n output = key / operand;\n break;\n case \"ceil\":\n case \"floor\":\n case \"round\":\n case \"abs\":\n output = Math[method](key);\n break;\n case \"toint\":\n output = parseInt(key, 10);\n break;\n default:\n log(\"math\", \"Method `\" + method + \"` is not supported\", \"ERROR\");\n }\n\n if (typeof output !== 'undefined') {\n if (round) {\n output = Math.round(output);\n }\n if (bodies && bodies.block) {\n context = addSelectState(context, { key: output });\n chunk = chunk.render(bodies.block, context);\n resolveSelectDeferreds(getSelectState(context));\n } else {\n chunk = chunk.write(output);\n }\n }\n\n return chunk;\n },\n\n /**\n * {@select}\n * Groups a set of truth tests and outputs the first one that passes.\n * Also contains {@any} and {@none} blocks.\n * @param key a value or reference to use as the left-hand side of comparisons\n * @param type coerce all truth test keys without an explicit type to this type\n */\n \"select\": function(chunk, context, bodies, params) {\n var body = bodies.block,\n state = {};\n\n if (params.hasOwnProperty('key')) {\n state.key = context.resolve(params.key);\n }\n if (params.hasOwnProperty('type')) {\n state.type = params.type;\n }\n\n if (body) {\n context = addSelectState(context, state);\n chunk = chunk.render(body, context);\n resolveSelectDeferreds(getSelectState(context));\n } else {\n log(\"select\", \"Missing body block\", \"WARN\");\n }\n return chunk;\n },\n\n /**\n * Truth test helpers\n * @param key a value or reference to use as the left-hand side of comparisons\n * @param value a value or reference to use as the right-hand side of comparisons\n * @param type if specified, `key` and `value` will be forcibly cast to this type\n */\n \"eq\": truthTest('eq', function(left, right) {\n return left === right;\n }),\n \"ne\": truthTest('ne', function(left, right) {\n return left !== right;\n }),\n \"lt\": truthTest('lt', function(left, right) {\n return left < right;\n }),\n \"lte\": truthTest('lte', function(left, right) {\n return left <= right;\n }),\n \"gt\": truthTest('gt', function(left, right) {\n return left > right;\n }),\n \"gte\": truthTest('gte', function(left, right) {\n return left >= right;\n }),\n\n /**\n * {@any}\n * Outputs as long as at least one truth test inside a {@select} has passed.\n * Must be contained inside a {@select} block.\n * The passing truth test can be before or after the {@any} block.\n */\n \"any\": function(chunk, context, bodies, params) {\n var selectState = getSelectState(context);\n\n if(!selectState) {\n log(\"any\", \"Must be used inside a {@select} block\", \"ERROR\");\n } else {\n if(selectState.isDeferredComplete) {\n log(\"any\", \"Must not be nested inside {@any} or {@none} block\", \"ERROR\");\n } else {\n chunk = chunk.map(function(chunk) {\n selectState.deferreds.push(function() {\n if(selectState.isResolved) {\n chunk = chunk.render(bodies.block, context);\n }\n chunk.end();\n });\n });\n }\n }\n return chunk;\n },\n\n /**\n * {@none}\n * Outputs if no truth tests inside a {@select} pass.\n * Must be contained inside a {@select} block.\n * The position of the helper does not matter.\n */\n \"none\": function(chunk, context, bodies, params) {\n var selectState = getSelectState(context);\n\n if(!selectState) {\n log(\"none\", \"Must be used inside a {@select} block\", \"ERROR\");\n } else {\n if(selectState.isDeferredComplete) {\n log(\"none\", \"Must not be nested inside {@any} or {@none} block\", \"ERROR\");\n } else {\n chunk = chunk.map(function(chunk) {\n selectState.deferreds.push(function() {\n if(!selectState.isResolved) {\n chunk = chunk.render(bodies.block, context);\n }\n chunk.end();\n });\n });\n }\n }\n return chunk;\n },\n\n /**\n * {@size}\n * Write the size of the target to the chunk\n * Falsy values and true have size 0\n * Numbers are returned as-is\n * Arrays and Strings have size equal to their length\n * Objects have size equal to the number of keys they contain\n * Dust bodies are evaluated and the length of the string is returned\n * Functions are evaluated and the length of their return value is evaluated\n * @param key find the size of this value or reference\n */\n \"size\": function(chunk, context, bodies, params) {\n var key = params.key,\n value, k;\n\n key = context.resolve(params.key);\n if (!key || key === true) {\n value = 0;\n } else if(dust.isArray(key)) {\n value = key.length;\n } else if (!isNaN(parseFloat(key)) && isFinite(key)) {\n value = key;\n } else if (typeof key === \"object\") {\n value = 0;\n for(k in key){\n if(key.hasOwnProperty(k)){\n value++;\n }\n }\n } else {\n value = (key + '').length;\n }\n return chunk.write(value);\n }\n\n};\n\nfor(var key in helpers) {\n dust.helpers[key] = helpers[key];\n}\n\nreturn dust;\n\n}));\n\n},{\"dustjs-linkedin\":5}],5:[function(_dereq_,module,exports){\n(function (process){\n(function (root, factory) {\n if (typeof define === 'function' && define.amd && define.amd.dust === true) {\n define('dust.core', [], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.dust = factory();\n }\n}(this, function() {\n var dust = {\n \"version\": \"2.7.5\"\n },\n NONE = 'NONE', ERROR = 'ERROR', WARN = 'WARN', INFO = 'INFO', DEBUG = 'DEBUG',\n EMPTY_FUNC = function() {};\n\n dust.config = {\n whitespace: false,\n amd: false,\n cjs: false,\n cache: true\n };\n\n // Directive aliases to minify code\n dust._aliases = {\n \"write\": \"w\",\n \"end\": \"e\",\n \"map\": \"m\",\n \"render\": \"r\",\n \"reference\": \"f\",\n \"section\": \"s\",\n \"exists\": \"x\",\n \"notexists\": \"nx\",\n \"block\": \"b\",\n \"partial\": \"p\",\n \"helper\": \"h\"\n };\n\n (function initLogging() {\n /*global process, console*/\n var loggingLevels = { DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, NONE: 4 },\n consoleLog,\n log;\n\n if (typeof console !== 'undefined' && console.log) {\n consoleLog = console.log;\n if(typeof consoleLog === 'function') {\n log = function() {\n consoleLog.apply(console, arguments);\n };\n } else {\n log = function() {\n consoleLog(Array.prototype.slice.apply(arguments).join(' '));\n };\n }\n } else {\n log = EMPTY_FUNC;\n }\n\n /**\n * Filters messages based on `dust.debugLevel`.\n * This default implementation will print to the console if it exists.\n * @param {String|Error} message the message to print/throw\n * @param {String} type the severity of the message(ERROR, WARN, INFO, or DEBUG)\n * @public\n */\n dust.log = function(message, type) {\n type = type || INFO;\n if (loggingLevels[type] >= loggingLevels[dust.debugLevel]) {\n log('[DUST:' + type + ']', message);\n }\n };\n\n dust.debugLevel = NONE;\n if(typeof process !== 'undefined' && process.env && /\\bdust\\b/.test(process.env.DEBUG)) {\n dust.debugLevel = DEBUG;\n }\n\n }());\n\n dust.helpers = {};\n\n dust.cache = {};\n\n dust.register = function(name, tmpl) {\n if (!name) {\n return;\n }\n tmpl.templateName = name;\n if (dust.config.cache !== false) {\n dust.cache[name] = tmpl;\n }\n };\n\n dust.render = function(nameOrTemplate, context, callback) {\n var chunk = new Stub(callback).head;\n try {\n load(nameOrTemplate, chunk, context).end();\n } catch (err) {\n chunk.setError(err);\n }\n };\n\n dust.stream = function(nameOrTemplate, context) {\n var stream = new Stream(),\n chunk = stream.head;\n dust.nextTick(function() {\n try {\n load(nameOrTemplate, chunk, context).end();\n } catch (err) {\n chunk.setError(err);\n }\n });\n return stream;\n };\n\n /**\n * Extracts a template function (body_0) from whatever is passed.\n * @param nameOrTemplate {*} Could be:\n * - the name of a template to load from cache\n * - a CommonJS-compiled template (a function with a `template` property)\n * - a template function\n * @param loadFromCache {Boolean} if false, don't look in the cache\n * @return {Function} a template function, if found\n */\n function getTemplate(nameOrTemplate, loadFromCache/*=true*/) {\n if(!nameOrTemplate) {\n return;\n }\n if(typeof nameOrTemplate === 'function' && nameOrTemplate.template) {\n // Sugar away CommonJS module templates\n return nameOrTemplate.template;\n }\n if(dust.isTemplateFn(nameOrTemplate)) {\n // Template functions passed directly\n return nameOrTemplate;\n }\n if(loadFromCache !== false) {\n // Try loading a template with this name from cache\n return dust.cache[nameOrTemplate];\n }\n }\n\n function load(nameOrTemplate, chunk, context) {\n if(!nameOrTemplate) {\n return chunk.setError(new Error('No template or template name provided to render'));\n }\n\n var template = getTemplate(nameOrTemplate, dust.config.cache);\n\n if (template) {\n return template(chunk, Context.wrap(context, template.templateName));\n } else {\n if (dust.onLoad) {\n return chunk.map(function(chunk) {\n // Alias just so it's easier to read that this would always be a name\n var name = nameOrTemplate;\n // Three possible scenarios for a successful callback:\n // - `require(nameOrTemplate)(dust); cb()`\n // - `src = readFile('src.dust'); cb(null, src)`\n // - `compiledTemplate = require(nameOrTemplate)(dust); cb(null, compiledTemplate)`\n function done(err, srcOrTemplate) {\n var template;\n if (err) {\n return chunk.setError(err);\n }\n // Prefer a template that is passed via callback over the cached version.\n template = getTemplate(srcOrTemplate, false) || getTemplate(name, dust.config.cache);\n if (!template) {\n // It's a template string, compile it and register under `name`\n if(dust.compile) {\n template = dust.loadSource(dust.compile(srcOrTemplate, name));\n } else {\n return chunk.setError(new Error('Dust compiler not available'));\n }\n }\n template(chunk, Context.wrap(context, template.templateName)).end();\n }\n\n if(dust.onLoad.length === 3) {\n dust.onLoad(name, context.options, done);\n } else {\n dust.onLoad(name, done);\n }\n });\n }\n return chunk.setError(new Error('Template Not Found: ' + nameOrTemplate));\n }\n }\n\n dust.loadSource = function(source) {\n /*jshint evil:true*/\n return eval(source);\n };\n\n if (Array.isArray) {\n dust.isArray = Array.isArray;\n } else {\n dust.isArray = function(arr) {\n return Object.prototype.toString.call(arr) === '[object Array]';\n };\n }\n\n dust.nextTick = (function() {\n return function(callback) {\n setTimeout(callback, 0);\n };\n })();\n\n /**\n * Dust has its own rules for what is \"empty\"-- which is not the same as falsy.\n * Empty arrays, null, and undefined are empty\n */\n dust.isEmpty = function(value) {\n if (value === 0) {\n return false;\n }\n if (dust.isArray(value) && !value.length) {\n return true;\n }\n return !value;\n };\n\n dust.isEmptyObject = function(obj) {\n var key;\n if (obj === null) {\n return false;\n }\n if (obj === undefined) {\n return false;\n }\n if (obj.length > 0) {\n return false;\n }\n for (key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return false;\n }\n }\n return true;\n };\n\n dust.isTemplateFn = function(elem) {\n return typeof elem === 'function' &&\n elem.__dustBody;\n };\n\n /**\n * Decide somewhat-naively if something is a Thenable.\n * @param elem {*} object to inspect\n * @return {Boolean} is `elem` a Thenable?\n */\n dust.isThenable = function(elem) {\n return elem &&\n typeof elem === 'object' &&\n typeof elem.then === 'function';\n };\n\n /**\n * Decide very naively if something is a Stream.\n * @param elem {*} object to inspect\n * @return {Boolean} is `elem` a Stream?\n */\n dust.isStreamable = function(elem) {\n return elem &&\n typeof elem.on === 'function' &&\n typeof elem.pipe === 'function';\n };\n\n // apply the filter chain and return the output string\n dust.filter = function(string, auto, filters, context) {\n var i, len, name, filter;\n if (filters) {\n for (i = 0, len = filters.length; i < len; i++) {\n name = filters[i];\n if (!name.length) {\n continue;\n }\n filter = dust.filters[name];\n if (name === 's') {\n auto = null;\n } else if (typeof filter === 'function') {\n string = filter(string, context);\n } else {\n dust.log('Invalid filter `' + name + '`', WARN);\n }\n }\n }\n // by default always apply the h filter, unless asked to unescape with |s\n if (auto) {\n string = dust.filters[auto](string, context);\n }\n return string;\n };\n\n dust.filters = {\n h: function(value) { return dust.escapeHtml(value); },\n j: function(value) { return dust.escapeJs(value); },\n u: encodeURI,\n uc: encodeURIComponent,\n js: function(value) { return dust.escapeJSON(value); },\n jp: function(value) {\n if (!JSON) {dust.log('JSON is undefined; could not parse `' + value + '`', WARN);\n return value;\n } else {\n return JSON.parse(value);\n }\n }\n };\n\n function Context(stack, global, options, blocks, templateName) {\n if(stack !== undefined && !(stack instanceof Stack)) {\n stack = new Stack(stack);\n }\n this.stack = stack;\n this.global = global;\n this.options = options;\n this.blocks = blocks;\n this.templateName = templateName;\n this._isContext = true;\n }\n\n dust.makeBase = dust.context = function(global, options) {\n return new Context(undefined, global, options);\n };\n\n dust.isContext = function(obj) {\n return typeof obj === \"object\" && obj._isContext === true;\n };\n\n /**\n * Factory function that creates a closure scope around a Thenable-callback.\n * Returns a function that can be passed to a Thenable that will resume a\n * Context lookup once the Thenable resolves with new data, adding that new\n * data to the lookup stack.\n */\n function getWithResolvedData(ctx, cur, down) {\n return function(data) {\n return ctx.push(data)._get(cur, down);\n };\n }\n\n Context.wrap = function(context, name) {\n if (dust.isContext(context)) {\n return context;\n }\n return new Context(context, {}, {}, null, name);\n };\n\n /**\n * Public API for getting a value from the context.\n * @method get\n * @param {string|array} path The path to the value. Supported formats are:\n * 'key'\n * 'path.to.key'\n * '.path.to.key'\n * ['path', 'to', 'key']\n * ['key']\n * @param {boolean} [cur=false] Boolean which determines if the search should be limited to the\n * current context (true), or if get should search in parent contexts as well (false).\n * @public\n * @returns {string|object}\n */\n Context.prototype.get = function(path, cur) {\n if (typeof path === 'string') {\n if (path[0] === '.') {\n cur = true;\n path = path.substr(1);\n }\n path = path.split('.');\n }\n return this._get(cur, path);\n };\n\n /**\n * Get a value from the context\n * @method _get\n * @param {boolean} cur Get only from the current context\n * @param {array} down An array of each step in the path\n * @private\n * @return {string | object}\n */\n Context.prototype._get = function(cur, down) {\n var ctx = this.stack || {},\n i = 1,\n value, first, len, ctxThis, fn;\n\n first = down[0];\n len = down.length;\n\n if (cur && len === 0) {\n ctxThis = ctx;\n ctx = ctx.head;\n } else {\n if (!cur) {\n // Search up the stack for the first value\n while (ctx) {\n if (ctx.isObject) {\n ctxThis = ctx.head;\n value = ctx.head[first];\n if (value !== undefined) {\n break;\n }\n }\n ctx = ctx.tail;\n }\n\n // Try looking in the global context if we haven't found anything yet\n if (value !== undefined) {\n ctx = value;\n } else {\n ctx = this.global && this.global[first];\n }\n } else if (ctx) {\n // if scope is limited by a leading dot, don't search up the tree\n if(ctx.head) {\n ctx = ctx.head[first];\n } else {\n // context's head is empty, value we are searching for is not defined\n ctx = undefined;\n }\n }\n\n while (ctx && i < len) {\n if (dust.isThenable(ctx)) {\n // Bail early by returning a Thenable for the remainder of the search tree\n return ctx.then(getWithResolvedData(this, cur, down.slice(i)));\n }\n ctxThis = ctx;\n ctx = ctx[down[i]];\n i++;\n }\n }\n\n if (typeof ctx === 'function') {\n fn = function() {\n try {\n return ctx.apply(ctxThis, arguments);\n } catch (err) {\n dust.log(err, ERROR);\n throw err;\n }\n };\n fn.__dustBody = !!ctx.__dustBody;\n return fn;\n } else {\n if (ctx === undefined) {\n dust.log('Cannot find reference `{' + down.join('.') + '}` in template `' + this.getTemplateName() + '`', INFO);\n }\n return ctx;\n }\n };\n\n Context.prototype.getPath = function(cur, down) {\n return this._get(cur, down);\n };\n\n Context.prototype.push = function(head, idx, len) {\n if(head === undefined) {\n dust.log(\"Not pushing an undefined variable onto the context\", INFO);\n return this;\n }\n return this.rebase(new Stack(head, this.stack, idx, len));\n };\n\n Context.prototype.pop = function() {\n var head = this.current();\n this.stack = this.stack && this.stack.tail;\n return head;\n };\n\n Context.prototype.rebase = function(head) {\n return new Context(head, this.global, this.options, this.blocks, this.getTemplateName());\n };\n\n Context.prototype.clone = function() {\n var context = this.rebase();\n context.stack = this.stack;\n return context;\n };\n\n Context.prototype.current = function() {\n return this.stack && this.stack.head;\n };\n\n Context.prototype.getBlock = function(key) {\n var blocks, len, fn;\n\n if (typeof key === 'function') {\n key = key(new Chunk(), this).data.join('');\n }\n\n blocks = this.blocks;\n\n if (!blocks) {\n dust.log('No blocks for context `' + key + '` in template `' + this.getTemplateName() + '`', DEBUG);\n return false;\n }\n\n len = blocks.length;\n while (len--) {\n fn = blocks[len][key];\n if (fn) {\n return fn;\n }\n }\n\n dust.log('Malformed template `' + this.getTemplateName() + '` was missing one or more blocks.');\n return false;\n };\n\n Context.prototype.shiftBlocks = function(locals) {\n var blocks = this.blocks,\n newBlocks;\n\n if (locals) {\n if (!blocks) {\n newBlocks = [locals];\n } else {\n newBlocks = blocks.concat([locals]);\n }\n return new Context(this.stack, this.global, this.options, newBlocks, this.getTemplateName());\n }\n return this;\n };\n\n Context.prototype.resolve = function(body) {\n var chunk;\n\n if(typeof body !== 'function') {\n return body;\n }\n chunk = new Chunk().render(body, this);\n if(chunk instanceof Chunk) {\n return chunk.data.join(''); // ie7 perf\n }\n return chunk;\n };\n\n Context.prototype.getTemplateName = function() {\n return this.templateName;\n };\n\n function Stack(head, tail, idx, len) {\n this.tail = tail;\n this.isObject = head && typeof head === 'object';\n this.head = head;\n this.index = idx;\n this.of = len;\n }\n\n function Stub(callback) {\n this.head = new Chunk(this);\n this.callback = callback;\n this.out = '';\n }\n\n Stub.prototype.flush = function() {\n var chunk = this.head;\n\n while (chunk) {\n if (chunk.flushable) {\n this.out += chunk.data.join(''); //ie7 perf\n } else if (chunk.error) {\n this.callback(chunk.error);\n dust.log('Rendering failed with error `' + chunk.error + '`', ERROR);\n this.flush = EMPTY_FUNC;\n return;\n } else {\n return;\n }\n chunk = chunk.next;\n this.head = chunk;\n }\n this.callback(null, this.out);\n };\n\n /**\n * Creates an interface sort of like a Streams2 ReadableStream.\n */\n function Stream() {\n this.head = new Chunk(this);\n }\n\n Stream.prototype.flush = function() {\n var chunk = this.head;\n\n while(chunk) {\n if (chunk.flushable) {\n this.emit('data', chunk.data.join('')); //ie7 perf\n } else if (chunk.error) {\n this.emit('error', chunk.error);\n this.emit('end');\n dust.log('Streaming failed with error `' + chunk.error + '`', ERROR);\n this.flush = EMPTY_FUNC;\n return;\n } else {\n return;\n }\n chunk = chunk.next;\n this.head = chunk;\n }\n this.emit('end');\n };\n\n /**\n * Executes listeners for `type` by passing data. Note that this is different from a\n * Node stream, which can pass an arbitrary number of arguments\n * @return `true` if event had listeners, `false` otherwise\n */\n Stream.prototype.emit = function(type, data) {\n var events = this.events || {},\n handlers = events[type] || [],\n i, l;\n\n if (!handlers.length) {\n dust.log('Stream broadcasting, but no listeners for `' + type + '`', DEBUG);\n return false;\n }\n\n handlers = handlers.slice(0);\n for (i = 0, l = handlers.length; i < l; i++) {\n handlers[i](data);\n }\n return true;\n };\n\n Stream.prototype.on = function(type, callback) {\n var events = this.events = this.events || {},\n handlers = events[type] = events[type] || [];\n\n if(typeof callback !== 'function') {\n dust.log('No callback function provided for `' + type + '` event listener', WARN);\n } else {\n handlers.push(callback);\n }\n return this;\n };\n\n /**\n * Pipes to a WritableStream. Note that backpressure isn't implemented,\n * so we just write as fast as we can.\n * @param stream {WritableStream}\n * @return self\n */\n Stream.prototype.pipe = function(stream) {\n if(typeof stream.write !== 'function' ||\n typeof stream.end !== 'function') {\n dust.log('Incompatible stream passed to `pipe`', WARN);\n return this;\n }\n\n var destEnded = false;\n\n if(typeof stream.emit === 'function') {\n stream.emit('pipe', this);\n }\n\n if(typeof stream.on === 'function') {\n stream.on('error', function() {\n destEnded = true;\n });\n }\n\n return this\n .on('data', function(data) {\n if(destEnded) {\n return;\n }\n try {\n stream.write(data, 'utf8');\n } catch (err) {\n dust.log(err, ERROR);\n }\n })\n .on('end', function() {\n if(destEnded) {\n return;\n }\n try {\n stream.end();\n destEnded = true;\n } catch (err) {\n dust.log(err, ERROR);\n }\n });\n };\n\n function Chunk(root, next, taps) {\n this.root = root;\n this.next = next;\n this.data = []; //ie7 perf\n this.flushable = false;\n this.taps = taps;\n }\n\n Chunk.prototype.write = function(data) {\n var taps = this.taps;\n\n if (taps) {\n data = taps.go(data);\n }\n this.data.push(data);\n return this;\n };\n\n Chunk.prototype.end = function(data) {\n if (data) {\n this.write(data);\n }\n this.flushable = true;\n this.root.flush();\n return this;\n };\n\n Chunk.prototype.map = function(callback) {\n var cursor = new Chunk(this.root, this.next, this.taps),\n branch = new Chunk(this.root, cursor, this.taps);\n\n this.next = branch;\n this.flushable = true;\n try {\n callback(branch);\n } catch(err) {\n dust.log(err, ERROR);\n branch.setError(err);\n }\n return cursor;\n };\n\n Chunk.prototype.tap = function(tap) {\n var taps = this.taps;\n\n if (taps) {\n this.taps = taps.push(tap);\n } else {\n this.taps = new Tap(tap);\n }\n return this;\n };\n\n Chunk.prototype.untap = function() {\n this.taps = this.taps.tail;\n return this;\n };\n\n Chunk.prototype.render = function(body, context) {\n return body(this, context);\n };\n\n Chunk.prototype.reference = function(elem, context, auto, filters) {\n if (typeof elem === 'function') {\n elem = elem.apply(context.current(), [this, context, null, {auto: auto, filters: filters}]);\n if (elem instanceof Chunk) {\n return elem;\n } else {\n return this.reference(elem, context, auto, filters);\n }\n }\n if (dust.isThenable(elem)) {\n return this.await(elem, context, null, auto, filters);\n } else if (dust.isStreamable(elem)) {\n return this.stream(elem, context, null, auto, filters);\n } else if (!dust.isEmpty(elem)) {\n return this.write(dust.filter(elem, auto, filters, context));\n } else {\n return this;\n }\n };\n\n Chunk.prototype.section = function(elem, context, bodies, params) {\n var body = bodies.block,\n skip = bodies['else'],\n chunk = this,\n i, len, head;\n\n if (typeof elem === 'function' && !dust.isTemplateFn(elem)) {\n try {\n elem = elem.apply(context.current(), [this, context, bodies, params]);\n } catch(err) {\n dust.log(err, ERROR);\n return this.setError(err);\n }\n // Functions that return chunks are assumed to have handled the chunk manually.\n // Make that chunk the current one and go to the next method in the chain.\n if (elem instanceof Chunk) {\n return elem;\n }\n }\n\n if (dust.isEmptyObject(bodies)) {\n // No bodies to render, and we've already invoked any function that was available in\n // hopes of returning a Chunk.\n return chunk;\n }\n\n if (!dust.isEmptyObject(params)) {\n context = context.push(params);\n }\n\n /*\n Dust's default behavior is to enumerate over the array elem, passing each object in the array to the block.\n When elem resolves to a value or object instead of an array, Dust sets the current context to the value\n and renders the block one time.\n */\n if (dust.isArray(elem)) {\n if (body) {\n len = elem.length;\n if (len > 0) {\n head = context.stack && context.stack.head || {};\n head.$len = len;\n for (i = 0; i < len; i++) {\n head.$idx = i;\n chunk = body(chunk, context.push(elem[i], i, len));\n }\n head.$idx = undefined;\n head.$len = undefined;\n return chunk;\n } else if (skip) {\n return skip(this, context);\n }\n }\n } else if (dust.isThenable(elem)) {\n return this.await(elem, context, bodies);\n } else if (dust.isStreamable(elem)) {\n return this.stream(elem, context, bodies);\n } else if (elem === true) {\n // true is truthy but does not change context\n if (body) {\n return body(this, context);\n }\n } else if (elem || elem === 0) {\n // everything that evaluates to true are truthy ( e.g. Non-empty strings and Empty objects are truthy. )\n // zero is truthy\n // for anonymous functions that did not returns a chunk, truthiness is evaluated based on the return value\n if (body) {\n return body(this, context.push(elem));\n }\n // nonexistent, scalar false value, scalar empty string, null,\n // undefined are all falsy\n } else if (skip) {\n return skip(this, context);\n }\n dust.log('Section without corresponding key in template `' + context.getTemplateName() + '`', DEBUG);\n return this;\n };\n\n Chunk.prototype.exists = function(elem, context, bodies) {\n var body = bodies.block,\n skip = bodies['else'];\n\n if (!dust.isEmpty(elem)) {\n if (body) {\n return body(this, context);\n }\n dust.log('No block for exists check in template `' + context.getTemplateName() + '`', DEBUG);\n } else if (skip) {\n return skip(this, context);\n }\n return this;\n };\n\n Chunk.prototype.notexists = function(elem, context, bodies) {\n var body = bodies.block,\n skip = bodies['else'];\n\n if (dust.isEmpty(elem)) {\n if (body) {\n return body(this, context);\n }\n dust.log('No block for not-exists check in template `' + context.getTemplateName() + '`', DEBUG);\n } else if (skip) {\n return skip(this, context);\n }\n return this;\n };\n\n Chunk.prototype.block = function(elem, context, bodies) {\n var body = elem || bodies.block;\n\n if (body) {\n return body(this, context);\n }\n return this;\n };\n\n Chunk.prototype.partial = function(elem, context, partialContext, params) {\n var head;\n\n if(params === undefined) {\n // Compatibility for < 2.7.0 where `partialContext` did not exist\n params = partialContext;\n partialContext = context;\n }\n\n if (!dust.isEmptyObject(params)) {\n partialContext = partialContext.clone();\n head = partialContext.pop();\n partialContext = partialContext.push(params)\n .push(head);\n }\n\n if (dust.isTemplateFn(elem)) {\n // The eventual result of evaluating `elem` is a partial name\n // Load the partial after getting its name and end the async chunk\n return this.capture(elem, context, function(name, chunk) {\n partialContext.templateName = name;\n load(name, chunk, partialContext).end();\n });\n } else {\n partialContext.templateName = elem;\n return load(elem, this, partialContext);\n }\n };\n\n Chunk.prototype.helper = function(name, context, bodies, params, auto) {\n var chunk = this,\n filters = params.filters,\n ret;\n\n // Pre-2.7.1 compat: if auto is undefined, it's an old template. Automatically escape\n if (auto === undefined) {\n auto = 'h';\n }\n\n // handle invalid helpers, similar to invalid filters\n if(dust.helpers[name]) {\n try {\n ret = dust.helpers[name](chunk, context, bodies, params);\n if (ret instanceof Chunk) {\n return ret;\n }\n if(typeof filters === 'string') {\n filters = filters.split('|');\n }\n if (!dust.isEmptyObject(bodies)) {\n return chunk.section(ret, context, bodies, params);\n }\n // Helpers act slightly differently from functions in context in that they will act as\n // a reference if they are self-closing (due to grammar limitations)\n // In the Chunk.await function we check to make sure bodies is null before acting as a reference\n return chunk.reference(ret, context, auto, filters);\n } catch(err) {\n dust.log('Error in helper `' + name + '`: ' + err.message, ERROR);\n return chunk.setError(err);\n }\n } else {\n dust.log('Helper `' + name + '` does not exist', WARN);\n return chunk;\n }\n };\n\n /**\n * Reserve a chunk to be evaluated once a thenable is resolved or rejected\n * @param thenable {Thenable} the target thenable to await\n * @param context {Context} context to use to render the deferred chunk\n * @param bodies {Object} must contain a \"body\", may contain an \"error\"\n * @param auto {String} automatically apply this filter if the Thenable is a reference\n * @param filters {Array} apply these filters if the Thenable is a reference\n * @return {Chunk}\n */\n Chunk.prototype.await = function(thenable, context, bodies, auto, filters) {\n return this.map(function(chunk) {\n thenable.then(function(data) {\n if (bodies) {\n chunk = chunk.section(data, context, bodies);\n } else {\n // Actually a reference. Self-closing sections don't render\n chunk = chunk.reference(data, context, auto, filters);\n }\n chunk.end();\n }, function(err) {\n var errorBody = bodies && bodies.error;\n if(errorBody) {\n chunk.render(errorBody, context.push(err)).end();\n } else {\n dust.log('Unhandled promise rejection in `' + context.getTemplateName() + '`', INFO);\n chunk.end();\n }\n });\n });\n };\n\n /**\n * Reserve a chunk to be evaluated with the contents of a streamable.\n * Currently an error event will bomb out the stream. Once an error\n * is received, we push it to an {:error} block if one exists, and log otherwise,\n * then stop listening to the stream.\n * @param streamable {Streamable} the target streamable that will emit events\n * @param context {Context} context to use to render each thunk\n * @param bodies {Object} must contain a \"body\", may contain an \"error\"\n * @return {Chunk}\n */\n Chunk.prototype.stream = function(stream, context, bodies, auto, filters) {\n var body = bodies && bodies.block,\n errorBody = bodies && bodies.error;\n return this.map(function(chunk) {\n var ended = false;\n stream\n .on('data', function data(thunk) {\n if(ended) {\n return;\n }\n if(body) {\n // Fork a new chunk out of the blockstream so that we can flush it independently\n chunk = chunk.map(function(chunk) {\n chunk.render(body, context.push(thunk)).end();\n });\n } else if(!bodies) {\n // When actually a reference, don't fork, just write into the master async chunk\n chunk = chunk.reference(thunk, context, auto, filters);\n }\n })\n .on('error', function error(err) {\n if(ended) {\n return;\n }\n if(errorBody) {\n chunk.render(errorBody, context.push(err));\n } else {\n dust.log('Unhandled stream error in `' + context.getTemplateName() + '`', INFO);\n }\n if(!ended) {\n ended = true;\n chunk.end();\n }\n })\n .on('end', function end() {\n if(!ended) {\n ended = true;\n chunk.end();\n }\n });\n });\n };\n\n Chunk.prototype.capture = function(body, context, callback) {\n return this.map(function(chunk) {\n var stub = new Stub(function(err, out) {\n if (err) {\n chunk.setError(err);\n } else {\n callback(out, chunk);\n }\n });\n body(stub.head, context).end();\n });\n };\n\n Chunk.prototype.setError = function(err) {\n this.error = err;\n this.root.flush();\n return this;\n };\n\n // Chunk aliases\n for(var f in Chunk.prototype) {\n if(dust._aliases[f]) {\n Chunk.prototype[dust._aliases[f]] = Chunk.prototype[f];\n }\n }\n\n function Tap(head, tail) {\n this.head = head;\n this.tail = tail;\n }\n\n Tap.prototype.push = function(tap) {\n return new Tap(tap, this);\n };\n\n Tap.prototype.go = function(value) {\n var tap = this;\n\n while(tap) {\n value = tap.head(value);\n tap = tap.tail;\n }\n return value;\n };\n\n var HCHARS = /[&<>\"']/,\n AMP = /&/g,\n LT = /</g,\n GT = />/g,\n QUOT = /\\\"/g,\n SQUOT = /\\'/g;\n\n dust.escapeHtml = function(s) {\n if (typeof s === \"string\" || (s && typeof s.toString === \"function\")) {\n if (typeof s !== \"string\") {\n s = s.toString();\n }\n if (!HCHARS.test(s)) {\n return s;\n }\n return s.replace(AMP,'&').replace(LT,'<').replace(GT,'>').replace(QUOT,'"').replace(SQUOT, ''');\n }\n return s;\n };\n\n var BS = /\\\\/g,\n FS = /\\//g,\n CR = /\\r/g,\n LS = /\\u2028/g,\n PS = /\\u2029/g,\n NL = /\\n/g,\n LF = /\\f/g,\n SQ = /'/g,\n DQ = /\"/g,\n TB = /\\t/g;\n\n dust.escapeJs = function(s) {\n if (typeof s === 'string') {\n return s\n .replace(BS, '\\\\\\\\')\n .replace(FS, '\\\\/')\n .replace(DQ, '\\\\\"')\n .replace(SQ, '\\\\\\'')\n .replace(CR, '\\\\r')\n .replace(LS, '\\\\u2028')\n .replace(PS, '\\\\u2029')\n .replace(NL, '\\\\n')\n .replace(LF, '\\\\f')\n .replace(TB, '\\\\t');\n }\n return s;\n };\n\n dust.escapeJSON = function(o) {\n if (!JSON) {\n dust.log('JSON is undefined; could not escape `' + o + '`', WARN);\n return o;\n } else {\n return JSON.stringify(o)\n .replace(LS, '\\\\u2028')\n .replace(PS, '\\\\u2029')\n .replace(LT, '\\\\u003c');\n }\n };\n\n return dust;\n\n}));\n\n}).call(this,_dereq_('_process'))\n},{\"_process\":8}],6:[function(_dereq_,module,exports){\n/**\n* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n*/\n;(function(window, document) {\n/*jshint evil:true */\n /** version */\n var version = '3.7.3-pre';\n\n /** Preset options */\n var options = window.html5 || {};\n\n /** Used to skip problem elements */\n var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n /** Not all elements can be cloned in IE **/\n var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\n /** Detect whether the browser supports default html5 styles */\n var supportsHtml5Styles;\n\n /** Name of the expando, to work with multiple documents or to re-shiv one document */\n var expando = '_html5shiv';\n\n /** The id for the the documents expando */\n var expanID = 0;\n\n /** Cached data for each document */\n var expandoData = {};\n\n /** Detect whether the browser supports unknown elements */\n var supportsUnknownElements;\n\n (function() {\n try {\n var a = document.createElement('a');\n a.innerHTML = '<xyz></xyz>';\n //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n supportsHtml5Styles = ('hidden' in a);\n\n supportsUnknownElements = a.childNodes.length == 1 || (function() {\n // assign a false positive if unable to shiv\n (document.createElement)('a');\n var frag = document.createDocumentFragment();\n return (\n typeof frag.cloneNode == 'undefined' ||\n typeof frag.createDocumentFragment == 'undefined' ||\n typeof frag.createElement == 'undefined'\n );\n }());\n } catch(e) {\n // assign a false positive if detection fails => unable to shiv\n supportsHtml5Styles = true;\n supportsUnknownElements = true;\n }\n\n }());\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Creates a style sheet with the given CSS text and adds it to the document.\n * @private\n * @param {Document} ownerDocument The document.\n * @param {String} cssText The CSS text.\n * @returns {StyleSheet} The style element.\n */\n function addStyleSheet(ownerDocument, cssText) {\n var p = ownerDocument.createElement('p'),\n parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n p.innerHTML = 'x<style>' + cssText + '</style>';\n return parent.insertBefore(p.lastChild, parent.firstChild);\n }\n\n /**\n * Returns the value of `html5.elements` as an array.\n * @private\n * @returns {Array} An array of shived element node names.\n */\n function getElements() {\n var elements = html5.elements;\n return typeof elements == 'string' ? elements.split(' ') : elements;\n }\n\n /**\n * Extends the built-in list of html5 elements\n * @memberOf html5\n * @param {String|Array} newElements whitespace separated list or array of new element names to shiv\n * @param {Document} ownerDocument The context document.\n */\n function addElements(newElements, ownerDocument) {\n var elements = html5.elements;\n if(typeof elements != 'string'){\n elements = elements.join(' ');\n }\n if(typeof newElements != 'string'){\n newElements = newElements.join(' ');\n }\n html5.elements = elements +' '+ newElements;\n shivDocument(ownerDocument);\n }\n\n /**\n * Returns the data associated to the given document\n * @private\n * @param {Document} ownerDocument The document.\n * @returns {Object} An object of data.\n */\n function getExpandoData(ownerDocument) {\n var data = expandoData[ownerDocument[expando]];\n if (!data) {\n data = {};\n expanID++;\n ownerDocument[expando] = expanID;\n expandoData[expanID] = data;\n }\n return data;\n }\n\n /**\n * returns a shived element for the given nodeName and document\n * @memberOf html5\n * @param {String} nodeName name of the element\n * @param {Document} ownerDocument The context document.\n * @returns {Object} The shived element.\n */\n function createElement(nodeName, ownerDocument, data){\n if (!ownerDocument) {\n ownerDocument = document;\n }\n if(supportsUnknownElements){\n return ownerDocument.createElement(nodeName);\n }\n if (!data) {\n data = getExpandoData(ownerDocument);\n }\n var node;\n\n if (data.cache[nodeName]) {\n node = data.cache[nodeName].cloneNode();\n } else if (saveClones.test(nodeName)) {\n node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n } else {\n node = data.createElem(nodeName);\n }\n\n // Avoid adding some elements to fragments in IE < 9 because\n // * Attributes like `name` or `type` cannot be set/changed once an element\n // is inserted into a document/fragment\n // * Link elements with `src` attributes that are inaccessible, as with\n // a 403 response, will cause the tab/window to crash\n // * Script elements appended to fragments will execute when their `src`\n // or `text` property is set\n return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;\n }\n\n /**\n * returns a shived DocumentFragment for the given document\n * @memberOf html5\n * @param {Document} ownerDocument The context document.\n * @returns {Object} The shived DocumentFragment.\n */\n function createDocumentFragment(ownerDocument, data){\n if (!ownerDocument) {\n ownerDocument = document;\n }\n if(supportsUnknownElements){\n return ownerDocument.createDocumentFragment();\n }\n data = data || getExpandoData(ownerDocument);\n var clone = data.frag.cloneNode(),\n i = 0,\n elems = getElements(),\n l = elems.length;\n for(;i<l;i++){\n clone.createElement(elems[i]);\n }\n return clone;\n }\n\n /**\n * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n * @private\n * @param {Document|DocumentFragment} ownerDocument The document.\n * @param {Object} data of the document.\n */\n function shivMethods(ownerDocument, data) {\n if (!data.cache) {\n data.cache = {};\n data.createElem = ownerDocument.createElement;\n data.createFrag = ownerDocument.createDocumentFragment;\n data.frag = data.createFrag();\n }\n\n\n ownerDocument.createElement = function(nodeName) {\n //abort shiv\n if (!html5.shivMethods) {\n return data.createElem(nodeName);\n }\n return createElement(nodeName, ownerDocument, data);\n };\n\n ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n 'var n=f.cloneNode(),c=n.createElement;' +\n 'h.shivMethods&&(' +\n // unroll the `createElement` calls\n getElements().join().replace(/[\\w\\-:]+/g, function(nodeName) {\n data.createElem(nodeName);\n data.frag.createElement(nodeName);\n return 'c(\"' + nodeName + '\")';\n }) +\n ');return n}'\n )(html5, data.frag);\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Shivs the given document.\n * @memberOf html5\n * @param {Document} ownerDocument The document to shiv.\n * @returns {Document} The shived document.\n */\n function shivDocument(ownerDocument) {\n if (!ownerDocument) {\n ownerDocument = document;\n }\n var data = getExpandoData(ownerDocument);\n\n if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n data.hasCSS = !!addStyleSheet(ownerDocument,\n // corrects block display not defined in IE6/7/8/9\n 'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +\n // adds styling not present in IE6/7/8/9\n 'mark{background:#FF0;color:#000}' +\n // hides non-rendered elements\n 'template{display:none}'\n );\n }\n if (!supportsUnknownElements) {\n shivMethods(ownerDocument, data);\n }\n return ownerDocument;\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * The `html5` object is exposed so that more elements can be shived and\n * existing shiving can be detected on iframes.\n * @type Object\n * @example\n *\n * // options can be changed before the script is included\n * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n */\n var html5 = {\n\n /**\n * An array or space separated string of node names of the elements to shiv.\n * @memberOf html5\n * @type Array|String\n */\n 'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video',\n\n /**\n * current version of html5shiv\n */\n 'version': version,\n\n /**\n * A flag to indicate that the HTML5 style sheet should be inserted.\n * @memberOf html5\n * @type Boolean\n */\n 'shivCSS': (options.shivCSS !== false),\n\n /**\n * Is equal to true if a browser supports creating unknown/HTML5 elements\n * @memberOf html5\n * @type boolean\n */\n 'supportsUnknownElements': supportsUnknownElements,\n\n /**\n * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n * methods should be overwritten.\n * @memberOf html5\n * @type Boolean\n */\n 'shivMethods': (options.shivMethods !== false),\n\n /**\n * A string to describe the type of `html5` object (\"default\" or \"default print\").\n * @memberOf html5\n * @type String\n */\n 'type': 'default',\n\n // shivs the document according to the specified `html5` object options\n 'shivDocument': shivDocument,\n\n //creates a shived element\n createElement: createElement,\n\n //creates a shived documentFragment\n createDocumentFragment: createDocumentFragment,\n\n //extends list of elements\n addElements: addElements\n };\n\n /*--------------------------------------------------------------------------*/\n\n // expose html5\n window.html5 = html5;\n\n // shiv the document\n shivDocument(document);\n\n if(typeof module == 'object' && module.exports){\n module.exports = html5;\n }\n\n}(typeof window !== \"undefined\" ? window : this, document));\n\n},{}],7:[function(_dereq_,module,exports){\n\r\nvar L = {\r\n\tversion: '1.0.1'\r\n};\r\n\r\nfunction expose() {\r\n\tvar oldL = window.L;\r\n\r\n\tL.noConflict = function () {\r\n\t\twindow.L = oldL;\r\n\t\treturn this;\r\n\t};\r\n\r\n\twindow.L = L;\r\n}\r\n\r\n// define Leaflet for Node module pattern loaders, including Browserify\r\nif (typeof module === 'object' && typeof module.exports === 'object') {\r\n\tmodule.exports = L;\r\n\r\n// define Leaflet as an AMD module\r\n} else if (typeof define === 'function' && define.amd) {\r\n\tdefine(L);\r\n}\r\n\r\n// define Leaflet as a global L variable, saving the original L to restore later if needed\r\nif (typeof window !== 'undefined') {\r\n\texpose();\r\n}\r\n\n/*\r\n * @namespace Util\r\n *\r\n * Various utility functions, used by Leaflet internally.\r\n */\r\n\r\nL.Util = {\r\n\r\n\t// @function extend(dest: Object, src?: Object): Object\r\n\t// Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut.\r\n\textend: function (dest) {\r\n\t\tvar i, j, len, src;\r\n\r\n\t\tfor (j = 1, len = arguments.length; j < len; j++) {\r\n\t\t\tsrc = arguments[j];\r\n\t\t\tfor (i in src) {\r\n\t\t\t\tdest[i] = src[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn dest;\r\n\t},\r\n\r\n\t// @function create(proto: Object, properties?: Object): Object\r\n\t// Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create)\r\n\tcreate: Object.create || (function () {\r\n\t\tfunction F() {}\r\n\t\treturn function (proto) {\r\n\t\t\tF.prototype = proto;\r\n\t\t\treturn new F();\r\n\t\t};\r\n\t})(),\r\n\r\n\t// @function bind(fn: Function, …): Function\r\n\t// Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\r\n\t// Has a `L.bind()` shortcut.\r\n\tbind: function (fn, obj) {\r\n\t\tvar slice = Array.prototype.slice;\r\n\r\n\t\tif (fn.bind) {\r\n\t\t\treturn fn.bind.apply(fn, slice.call(arguments, 1));\r\n\t\t}\r\n\r\n\t\tvar args = slice.call(arguments, 2);\r\n\r\n\t\treturn function () {\r\n\t\t\treturn fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments);\r\n\t\t};\r\n\t},\r\n\r\n\t// @function stamp(obj: Object): Number\r\n\t// Returns the unique ID of an object, assiging it one if it doesn't have it.\r\n\tstamp: function (obj) {\r\n\t\t/*eslint-disable */\r\n\t\tobj._leaflet_id = obj._leaflet_id || ++L.Util.lastId;\r\n\t\treturn obj._leaflet_id;\r\n\t\t/*eslint-enable */\r\n\t},\r\n\r\n\t// @property lastId: Number\r\n\t// Last unique ID used by [`stamp()`](#util-stamp)\r\n\tlastId: 0,\r\n\r\n\t// @function throttle(fn: Function, time: Number, context: Object): Function\r\n\t// Returns a function which executes function `fn` with the given scope `context`\r\n\t// (so that the `this` keyword refers to `context` inside `fn`'s code). The function\r\n\t// `fn` will be called no more than one time per given amount of `time`. The arguments\r\n\t// received by the bound function will be any arguments passed when binding the\r\n\t// function, followed by any arguments passed when invoking the bound function.\r\n\t// Has an `L.bind` shortcut.\r\n\tthrottle: function (fn, time, context) {\r\n\t\tvar lock, args, wrapperFn, later;\r\n\r\n\t\tlater = function () {\r\n\t\t\t// reset lock and call if queued\r\n\t\t\tlock = false;\r\n\t\t\tif (args) {\r\n\t\t\t\twrapperFn.apply(context, args);\r\n\t\t\t\targs = false;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\twrapperFn = function () {\r\n\t\t\tif (lock) {\r\n\t\t\t\t// called too soon, queue to call later\r\n\t\t\t\targs = arguments;\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// call and lock until later\r\n\t\t\t\tfn.apply(context, arguments);\r\n\t\t\t\tsetTimeout(later, time);\r\n\t\t\t\tlock = true;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn wrapperFn;\r\n\t},\r\n\r\n\t// @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number\r\n\t// Returns the number `num` modulo `range` in such a way so it lies within\r\n\t// `range[0]` and `range[1]`. The returned value will be always smaller than\r\n\t// `range[1]` unless `includeMax` is set to `true`.\r\n\twrapNum: function (x, range, includeMax) {\r\n\t\tvar max = range[1],\r\n\t\t min = range[0],\r\n\t\t d = max - min;\r\n\t\treturn x === max && includeMax ? x : ((x - min) % d + d) % d + min;\r\n\t},\r\n\r\n\t// @function falseFn(): Function\r\n\t// Returns a function which always returns `false`.\r\n\tfalseFn: function () { return false; },\r\n\r\n\t// @function formatNum(num: Number, digits?: Number): Number\r\n\t// Returns the number `num` rounded to `digits` decimals, or to 5 decimals by default.\r\n\tformatNum: function (num, digits) {\r\n\t\tvar pow = Math.pow(10, digits || 5);\r\n\t\treturn Math.round(num * pow) / pow;\r\n\t},\r\n\r\n\t// @function trim(str: String): String\r\n\t// Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)\r\n\ttrim: function (str) {\r\n\t\treturn str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\r\n\t},\r\n\r\n\t// @function splitWords(str: String): String[]\r\n\t// Trims and splits the string on whitespace and returns the array of parts.\r\n\tsplitWords: function (str) {\r\n\t\treturn L.Util.trim(str).split(/\\s+/);\r\n\t},\r\n\r\n\t// @function setOptions(obj: Object, options: Object): Object\r\n\t// Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut.\r\n\tsetOptions: function (obj, options) {\r\n\t\tif (!obj.hasOwnProperty('options')) {\r\n\t\t\tobj.options = obj.options ? L.Util.create(obj.options) : {};\r\n\t\t}\r\n\t\tfor (var i in options) {\r\n\t\t\tobj.options[i] = options[i];\r\n\t\t}\r\n\t\treturn obj.options;\r\n\t},\r\n\r\n\t// @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String\r\n\t// Converts an object into a parameter URL string, e.g. `{a: \"foo\", b: \"bar\"}`\r\n\t// translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will\r\n\t// be appended at the end. If `uppercase` is `true`, the parameter names will\r\n\t// be uppercased (e.g. `'?A=foo&B=bar'`)\r\n\tgetParamString: function (obj, existingUrl, uppercase) {\r\n\t\tvar params = [];\r\n\t\tfor (var i in obj) {\r\n\t\t\tparams.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));\r\n\t\t}\r\n\t\treturn ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');\r\n\t},\r\n\r\n\t// @function template(str: String, data: Object): String\r\n\t// Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'`\r\n\t// and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string\r\n\t// `('Hello foo, bar')`. You can also specify functions instead of strings for\r\n\t// data values — they will be evaluated passing `data` as an argument.\r\n\ttemplate: function (str, data) {\r\n\t\treturn str.replace(L.Util.templateRe, function (str, key) {\r\n\t\t\tvar value = data[key];\r\n\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\tthrow new Error('No value provided for variable ' + str);\r\n\r\n\t\t\t} else if (typeof value === 'function') {\r\n\t\t\t\tvalue = value(data);\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t});\r\n\t},\r\n\r\n\ttemplateRe: /\\{ *([\\w_\\-]+) *\\}/g,\r\n\r\n\t// @function isArray(obj): Boolean\r\n\t// Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)\r\n\tisArray: Array.isArray || function (obj) {\r\n\t\treturn (Object.prototype.toString.call(obj) === '[object Array]');\r\n\t},\r\n\r\n\t// @function indexOf(array: Array, el: Object): Number\r\n\t// Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)\r\n\tindexOf: function (array, el) {\r\n\t\tfor (var i = 0; i < array.length; i++) {\r\n\t\t\tif (array[i] === el) { return i; }\r\n\t\t}\r\n\t\treturn -1;\r\n\t},\r\n\r\n\t// @property emptyImageUrl: String\r\n\t// Data URI string containing a base64-encoded empty GIF image.\r\n\t// Used as a hack to free memory from unused images on WebKit-powered\r\n\t// mobile devices (by setting image `src` to this string).\r\n\temptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='\r\n};\r\n\r\n(function () {\r\n\t// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n\r\n\tfunction getPrefixed(name) {\r\n\t\treturn window['webkit' + name] || window['moz' + name] || window['ms' + name];\r\n\t}\r\n\r\n\tvar lastTime = 0;\r\n\r\n\t// fallback for IE 7-8\r\n\tfunction timeoutDefer(fn) {\r\n\t\tvar time = +new Date(),\r\n\t\t timeToCall = Math.max(0, 16 - (time - lastTime));\r\n\r\n\t\tlastTime = time + timeToCall;\r\n\t\treturn window.setTimeout(fn, timeToCall);\r\n\t}\r\n\r\n\tvar requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer,\r\n\t cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') ||\r\n\t getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); };\r\n\r\n\r\n\t// @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number\r\n\t// Schedules `fn` to be executed when the browser repaints. `fn` is bound to\r\n\t// `context` if given. When `immediate` is set, `fn` is called immediately if\r\n\t// the browser doesn't have native support for\r\n\t// [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame),\r\n\t// otherwise it's delayed. Returns a request ID that can be used to cancel the request.\r\n\tL.Util.requestAnimFrame = function (fn, context, immediate) {\r\n\t\tif (immediate && requestFn === timeoutDefer) {\r\n\t\t\tfn.call(context);\r\n\t\t} else {\r\n\t\t\treturn requestFn.call(window, L.bind(fn, context));\r\n\t\t}\r\n\t};\r\n\r\n\t// @function cancelAnimFrame(id: Number): undefined\r\n\t// Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame).\r\n\tL.Util.cancelAnimFrame = function (id) {\r\n\t\tif (id) {\r\n\t\t\tcancelFn.call(window, id);\r\n\t\t}\r\n\t};\r\n})();\r\n\r\n// shortcuts for most used utility functions\r\nL.extend = L.Util.extend;\r\nL.bind = L.Util.bind;\r\nL.stamp = L.Util.stamp;\r\nL.setOptions = L.Util.setOptions;\r\n\n\r\n// @class Class\r\n// @aka L.Class\r\n\r\n// @section\r\n// @uninheritable\r\n\r\n// Thanks to John Resig and Dean Edwards for inspiration!\r\n\r\nL.Class = function () {};\r\n\r\nL.Class.extend = function (props) {\r\n\r\n\t// @function extend(props: Object): Function\r\n\t// [Extends the current class](#class-inheritance) given the properties to be included.\r\n\t// Returns a Javascript function that is a class constructor (to be called with `new`).\r\n\tvar NewClass = function () {\r\n\r\n\t\t// call the constructor\r\n\t\tif (this.initialize) {\r\n\t\t\tthis.initialize.apply(this, arguments);\r\n\t\t}\r\n\r\n\t\t// call all constructor hooks\r\n\t\tthis.callInitHooks();\r\n\t};\r\n\r\n\tvar parentProto = NewClass.__super__ = this.prototype;\r\n\r\n\tvar proto = L.Util.create(parentProto);\r\n\tproto.constructor = NewClass;\r\n\r\n\tNewClass.prototype = proto;\r\n\r\n\t// inherit parent's statics\r\n\tfor (var i in this) {\r\n\t\tif (this.hasOwnProperty(i) && i !== 'prototype') {\r\n\t\t\tNewClass[i] = this[i];\r\n\t\t}\r\n\t}\r\n\r\n\t// mix static properties into the class\r\n\tif (props.statics) {\r\n\t\tL.extend(NewClass, props.statics);\r\n\t\tdelete props.statics;\r\n\t}\r\n\r\n\t// mix includes into the prototype\r\n\tif (props.includes) {\r\n\t\tL.Util.extend.apply(null, [proto].concat(props.includes));\r\n\t\tdelete props.includes;\r\n\t}\r\n\r\n\t// merge options\r\n\tif (proto.options) {\r\n\t\tprops.options = L.Util.extend(L.Util.create(proto.options), props.options);\r\n\t}\r\n\r\n\t// mix given properties into the prototype\r\n\tL.extend(proto, props);\r\n\r\n\tproto._initHooks = [];\r\n\r\n\t// add method for calling all hooks\r\n\tproto.callInitHooks = function () {\r\n\r\n\t\tif (this._initHooksCalled) { return; }\r\n\r\n\t\tif (parentProto.callInitHooks) {\r\n\t\t\tparentProto.callInitHooks.call(this);\r\n\t\t}\r\n\r\n\t\tthis._initHooksCalled = true;\r\n\r\n\t\tfor (var i = 0, len = proto._initHooks.length; i < len; i++) {\r\n\t\t\tproto._initHooks[i].call(this);\r\n\t\t}\r\n\t};\r\n\r\n\treturn NewClass;\r\n};\r\n\r\n\r\n// @function include(properties: Object): this\r\n// [Includes a mixin](#class-includes) into the current class.\r\nL.Class.include = function (props) {\r\n\tL.extend(this.prototype, props);\r\n\treturn this;\r\n};\r\n\r\n// @function mergeOptions(options: Object): this\r\n// [Merges `options`](#class-options) into the defaults of the class.\r\nL.Class.mergeOptions = function (options) {\r\n\tL.extend(this.prototype.options, options);\r\n\treturn this;\r\n};\r\n\r\n// @function addInitHook(fn: Function): this\r\n// Adds a [constructor hook](#class-constructor-hooks) to the class.\r\nL.Class.addInitHook = function (fn) { // (Function) || (String, args...)\r\n\tvar args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\tvar init = typeof fn === 'function' ? fn : function () {\r\n\t\tthis[fn].apply(this, args);\r\n\t};\r\n\r\n\tthis.prototype._initHooks = this.prototype._initHooks || [];\r\n\tthis.prototype._initHooks.push(init);\r\n\treturn this;\r\n};\r\n\n/*\r\n * @class Evented\r\n * @aka L.Evented\r\n * @inherits Class\r\n *\r\n * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event).\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * map.on('click', function(e) {\r\n * \talert(e.latlng);\r\n * } );\r\n * ```\r\n *\r\n * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:\r\n *\r\n * ```js\r\n * function onClick(e) { ... }\r\n *\r\n * map.on('click', onClick);\r\n * map.off('click', onClick);\r\n * ```\r\n */\r\n\r\n\r\nL.Evented = L.Class.extend({\r\n\r\n\t/* @method on(type: String, fn: Function, context?: Object): this\r\n\t * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`).\r\n\t *\r\n\t * @alternative\r\n\t * @method on(eventMap: Object): this\r\n\t * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\t */\r\n\ton: function (types, fn, context) {\r\n\r\n\t\t// types can be a map of types/handlers\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\t// we don't process space-separated events here for performance;\r\n\t\t\t\t// it's a hot path since Layer uses the on(obj) syntax\r\n\t\t\t\tthis._on(type, types[type], fn);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\t// types can be a string of space-separated words\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._on(types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/* @method off(type: String, fn?: Function, context?: Object): this\r\n\t * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener.\r\n\t *\r\n\t * @alternative\r\n\t * @method off(eventMap: Object): this\r\n\t * Removes a set of type/listener pairs.\r\n\t *\r\n\t * @alternative\r\n\t * @method off: this\r\n\t * Removes all listeners to all events on the object.\r\n\t */\r\n\toff: function (types, fn, context) {\r\n\r\n\t\tif (!types) {\r\n\t\t\t// clear all listeners if called without arguments\r\n\t\t\tdelete this._events;\r\n\r\n\t\t} else if (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis._off(type, types[type], fn);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._off(types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// attach listener (without syntactic sugar now)\r\n\t_on: function (type, fn, context) {\r\n\t\tthis._events = this._events || {};\r\n\r\n\t\t/* get/init listeners for type */\r\n\t\tvar typeListeners = this._events[type];\r\n\t\tif (!typeListeners) {\r\n\t\t\ttypeListeners = [];\r\n\t\t\tthis._events[type] = typeListeners;\r\n\t\t}\r\n\r\n\t\tif (context === this) {\r\n\t\t\t// Less memory footprint.\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\t\tvar newListener = {fn: fn, ctx: context},\r\n\t\t listeners = typeListeners;\r\n\r\n\t\t// check if fn already there\r\n\t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\tif (listeners[i].fn === fn && listeners[i].ctx === context) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlisteners.push(newListener);\r\n\t\ttypeListeners.count++;\r\n\t},\r\n\r\n\t_off: function (type, fn, context) {\r\n\t\tvar listeners,\r\n\t\t i,\r\n\t\t len;\r\n\r\n\t\tif (!this._events) { return; }\r\n\r\n\t\tlisteners = this._events[type];\r\n\r\n\t\tif (!listeners) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!fn) {\r\n\t\t\t// Set all removed listeners to noop so they are not called if remove happens in fire\r\n\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\tlisteners[i].fn = L.Util.falseFn;\r\n\t\t\t}\r\n\t\t\t// clear all listeners for a type if function isn't specified\r\n\t\t\tdelete this._events[type];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (context === this) {\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\r\n\t\tif (listeners) {\r\n\r\n\t\t\t// find fn and remove it\r\n\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\tvar l = listeners[i];\r\n\t\t\t\tif (l.ctx !== context) { continue; }\r\n\t\t\t\tif (l.fn === fn) {\r\n\r\n\t\t\t\t\t// set the removed listener to noop so that's not called if remove happens in fire\r\n\t\t\t\t\tl.fn = L.Util.falseFn;\r\n\r\n\t\t\t\t\tif (this._firingCount) {\r\n\t\t\t\t\t\t/* copy array in case events are being fired */\r\n\t\t\t\t\t\tthis._events[type] = listeners = listeners.slice();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlisteners.splice(i, 1);\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method fire(type: String, data?: Object, propagate?: Boolean): this\r\n\t// Fires an event of the specified type. You can optionally provide an data\r\n\t// object — the first argument of the listener function will contain its\r\n\t// properties. The event might can optionally be propagated to event parents.\r\n\tfire: function (type, data, propagate) {\r\n\t\tif (!this.listens(type, propagate)) { return this; }\r\n\r\n\t\tvar event = L.Util.extend({}, data, {type: type, target: this});\r\n\r\n\t\tif (this._events) {\r\n\t\t\tvar listeners = this._events[type];\r\n\r\n\t\t\tif (listeners) {\r\n\t\t\t\tthis._firingCount = (this._firingCount + 1) || 1;\r\n\t\t\t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\t\tvar l = listeners[i];\r\n\t\t\t\t\tl.fn.call(l.ctx || this, event);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._firingCount--;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (propagate) {\r\n\t\t\t// propagate the event to parents (set with addEventParent)\r\n\t\t\tthis._propagateEvent(event);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method listens(type: String): Boolean\r\n\t// Returns `true` if a particular event type has any listeners attached to it.\r\n\tlistens: function (type, propagate) {\r\n\t\tvar listeners = this._events && this._events[type];\r\n\t\tif (listeners && listeners.length) { return true; }\r\n\r\n\t\tif (propagate) {\r\n\t\t\t// also check parents for listeners if event propagates\r\n\t\t\tfor (var id in this._eventParents) {\r\n\t\t\t\tif (this._eventParents[id].listens(type, propagate)) { return true; }\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t// @method once(…): this\r\n\t// Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed.\r\n\tonce: function (types, fn, context) {\r\n\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis.once(type, types[type], fn);\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar handler = L.bind(function () {\r\n\t\t\tthis\r\n\t\t\t .off(types, fn, context)\r\n\t\t\t .off(types, handler, context);\r\n\t\t}, this);\r\n\r\n\t\t// add a listener that's executed once and removed after that\r\n\t\treturn this\r\n\t\t .on(types, fn, context)\r\n\t\t .on(types, handler, context);\r\n\t},\r\n\r\n\t// @method addEventParent(obj: Evented): this\r\n\t// Adds an event parent - an `Evented` that will receive propagated events\r\n\taddEventParent: function (obj) {\r\n\t\tthis._eventParents = this._eventParents || {};\r\n\t\tthis._eventParents[L.stamp(obj)] = obj;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeEventParent(obj: Evented): this\r\n\t// Removes an event parent, so it will stop receiving propagated events\r\n\tremoveEventParent: function (obj) {\r\n\t\tif (this._eventParents) {\r\n\t\t\tdelete this._eventParents[L.stamp(obj)];\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_propagateEvent: function (e) {\r\n\t\tfor (var id in this._eventParents) {\r\n\t\t\tthis._eventParents[id].fire(e.type, L.extend({layer: e.target}, e), true);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar proto = L.Evented.prototype;\r\n\r\n// aliases; we should ditch those eventually\r\n\r\n// @method addEventListener(…): this\r\n// Alias to [`on(…)`](#evented-on)\r\nproto.addEventListener = proto.on;\r\n\r\n// @method removeEventListener(…): this\r\n// Alias to [`off(…)`](#evented-off)\r\n\r\n// @method clearAllEventListeners(…): this\r\n// Alias to [`off()`](#evented-off)\r\nproto.removeEventListener = proto.clearAllEventListeners = proto.off;\r\n\r\n// @method addOneTimeEventListener(…): this\r\n// Alias to [`once(…)`](#evented-once)\r\nproto.addOneTimeEventListener = proto.once;\r\n\r\n// @method fireEvent(…): this\r\n// Alias to [`fire(…)`](#evented-fire)\r\nproto.fireEvent = proto.fire;\r\n\r\n// @method hasEventListeners(…): Boolean\r\n// Alias to [`listens(…)`](#evented-listens)\r\nproto.hasEventListeners = proto.listens;\r\n\r\nL.Mixin = {Events: proto};\r\n\n/*\r\n * @namespace Browser\r\n * @aka L.Browser\r\n *\r\n * A namespace with static properties for browser/feature detection used by Leaflet internally.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * if (L.Browser.ielt9) {\r\n * alert('Upgrade your browser, dude!');\r\n * }\r\n * ```\r\n */\r\n\r\n(function () {\r\n\r\n\tvar ua = navigator.userAgent.toLowerCase(),\r\n\t doc = document.documentElement,\r\n\r\n\t ie = 'ActiveXObject' in window,\r\n\r\n\t webkit = ua.indexOf('webkit') !== -1,\r\n\t phantomjs = ua.indexOf('phantom') !== -1,\r\n\t android23 = ua.search('android [23]') !== -1,\r\n\t chrome = ua.indexOf('chrome') !== -1,\r\n\t gecko = ua.indexOf('gecko') !== -1 && !webkit && !window.opera && !ie,\r\n\r\n\t win = navigator.platform.indexOf('Win') === 0,\r\n\r\n\t mobile = typeof orientation !== 'undefined' || ua.indexOf('mobile') !== -1,\r\n\t msPointer = !window.PointerEvent && window.MSPointerEvent,\r\n\t pointer = window.PointerEvent || msPointer,\r\n\r\n\t ie3d = ie && ('transition' in doc.style),\r\n\t webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,\r\n\t gecko3d = 'MozPerspective' in doc.style,\r\n\t opera12 = 'OTransition' in doc.style;\r\n\r\n\r\n\tvar touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window ||\r\n\t\t\t(window.DocumentTouch && document instanceof window.DocumentTouch));\r\n\r\n\tL.Browser = {\r\n\r\n\t\t// @property ie: Boolean\r\n\t\t// `true` for all Internet Explorer versions (not Edge).\r\n\t\tie: ie,\r\n\r\n\t\t// @property ielt9: Boolean\r\n\t\t// `true` for Internet Explorer versions less than 9.\r\n\t\tielt9: ie && !document.addEventListener,\r\n\r\n\t\t// @property edge: Boolean\r\n\t\t// `true` for the Edge web browser.\r\n\t\tedge: 'msLaunchUri' in navigator && !('documentMode' in document),\r\n\r\n\t\t// @property webkit: Boolean\r\n\t\t// `true` for webkit-based browsers like Chrome and Safari (including mobile versions).\r\n\t\twebkit: webkit,\r\n\r\n\t\t// @property gecko: Boolean\r\n\t\t// `true` for gecko-based browsers like Firefox.\r\n\t\tgecko: gecko,\r\n\r\n\t\t// @property android: Boolean\r\n\t\t// `true` for any browser running on an Android platform.\r\n\t\tandroid: ua.indexOf('android') !== -1,\r\n\r\n\t\t// @property android23: Boolean\r\n\t\t// `true` for browsers running on Android 2 or Android 3.\r\n\t\tandroid23: android23,\r\n\r\n\t\t// @property chrome: Boolean\r\n\t\t// `true` for the Chrome browser.\r\n\t\tchrome: chrome,\r\n\r\n\t\t// @property safari: Boolean\r\n\t\t// `true` for the Safari browser.\r\n\t\tsafari: !chrome && ua.indexOf('safari') !== -1,\r\n\r\n\r\n\t\t// @property win: Boolean\r\n\t\t// `true` when the browser is running in a Windows platform\r\n\t\twin: win,\r\n\r\n\r\n\t\t// @property ie3d: Boolean\r\n\t\t// `true` for all Internet Explorer versions supporting CSS transforms.\r\n\t\tie3d: ie3d,\r\n\r\n\t\t// @property webkit3d: Boolean\r\n\t\t// `true` for webkit-based browsers supporting CSS transforms.\r\n\t\twebkit3d: webkit3d,\r\n\r\n\t\t// @property gecko3d: Boolean\r\n\t\t// `true` for gecko-based browsers supporting CSS transforms.\r\n\t\tgecko3d: gecko3d,\r\n\r\n\t\t// @property opera12: Boolean\r\n\t\t// `true` for the Opera browser supporting CSS transforms (version 12 or later).\r\n\t\topera12: opera12,\r\n\r\n\t\t// @property any3d: Boolean\r\n\t\t// `true` for all browsers supporting CSS transforms.\r\n\t\tany3d: !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantomjs,\r\n\r\n\r\n\t\t// @property mobile: Boolean\r\n\t\t// `true` for all browsers running in a mobile device.\r\n\t\tmobile: mobile,\r\n\r\n\t\t// @property mobileWebkit: Boolean\r\n\t\t// `true` for all webkit-based browsers in a mobile device.\r\n\t\tmobileWebkit: mobile && webkit,\r\n\r\n\t\t// @property mobileWebkit3d: Boolean\r\n\t\t// `true` for all webkit-based browsers in a mobile device supporting CSS transforms.\r\n\t\tmobileWebkit3d: mobile && webkit3d,\r\n\r\n\t\t// @property mobileOpera: Boolean\r\n\t\t// `true` for the Opera browser in a mobile device.\r\n\t\tmobileOpera: mobile && window.opera,\r\n\r\n\t\t// @property mobileGecko: Boolean\r\n\t\t// `true` for gecko-based browsers running in a mobile device.\r\n\t\tmobileGecko: mobile && gecko,\r\n\r\n\r\n\t\t// @property touch: Boolean\r\n\t\t// `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events).\r\n\t\ttouch: !!touch,\r\n\r\n\t\t// @property msPointer: Boolean\r\n\t\t// `true` for browsers implementing the Microsoft touch events model (notably IE10).\r\n\t\tmsPointer: !!msPointer,\r\n\r\n\t\t// @property pointer: Boolean\r\n\t\t// `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx).\r\n\t\tpointer: !!pointer,\r\n\r\n\r\n\t\t// @property retina: Boolean\r\n\t\t// `true` for browsers on a high-resolution \"retina\" screen.\r\n\t\tretina: (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1\r\n\t};\r\n\r\n}());\r\n\n/*\r\n * @class Point\r\n * @aka L.Point\r\n *\r\n * Represents a point with `x` and `y` coordinates in pixels.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var point = L.point(200, 300);\r\n * ```\r\n *\r\n * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:\r\n *\r\n * ```js\r\n * map.panBy([200, 300]);\r\n * map.panBy(L.point(200, 300));\r\n * ```\r\n */\r\n\r\nL.Point = function (x, y, round) {\r\n\tthis.x = (round ? Math.round(x) : x);\r\n\tthis.y = (round ? Math.round(y) : y);\r\n};\r\n\r\nL.Point.prototype = {\r\n\r\n\t// @method clone(): Point\r\n\t// Returns a copy of the current point.\r\n\tclone: function () {\r\n\t\treturn new L.Point(this.x, this.y);\r\n\t},\r\n\r\n\t// @method add(otherPoint: Point): Point\r\n\t// Returns the result of addition of the current and the given points.\r\n\tadd: function (point) {\r\n\t\t// non-destructive, returns a new point\r\n\t\treturn this.clone()._add(L.point(point));\r\n\t},\r\n\r\n\t_add: function (point) {\r\n\t\t// destructive, used directly for performance in situations where it's safe to modify existing point\r\n\t\tthis.x += point.x;\r\n\t\tthis.y += point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method subtract(otherPoint: Point): Point\r\n\t// Returns the result of subtraction of the given point from the current.\r\n\tsubtract: function (point) {\r\n\t\treturn this.clone()._subtract(L.point(point));\r\n\t},\r\n\r\n\t_subtract: function (point) {\r\n\t\tthis.x -= point.x;\r\n\t\tthis.y -= point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method divideBy(num: Number): Point\r\n\t// Returns the result of division of the current point by the given number.\r\n\tdivideBy: function (num) {\r\n\t\treturn this.clone()._divideBy(num);\r\n\t},\r\n\r\n\t_divideBy: function (num) {\r\n\t\tthis.x /= num;\r\n\t\tthis.y /= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method multiplyBy(num: Number): Point\r\n\t// Returns the result of multiplication of the current point by the given number.\r\n\tmultiplyBy: function (num) {\r\n\t\treturn this.clone()._multiplyBy(num);\r\n\t},\r\n\r\n\t_multiplyBy: function (num) {\r\n\t\tthis.x *= num;\r\n\t\tthis.y *= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method scaleBy(scale: Point): Point\r\n\t// Multiply each coordinate of the current point by each coordinate of\r\n\t// `scale`. In linear algebra terms, multiply the point by the\r\n\t// [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation)\r\n\t// defined by `scale`.\r\n\tscaleBy: function (point) {\r\n\t\treturn new L.Point(this.x * point.x, this.y * point.y);\r\n\t},\r\n\r\n\t// @method unscaleBy(scale: Point): Point\r\n\t// Inverse of `scaleBy`. Divide each coordinate of the current point by\r\n\t// each coordinate of `scale`.\r\n\tunscaleBy: function (point) {\r\n\t\treturn new L.Point(this.x / point.x, this.y / point.y);\r\n\t},\r\n\r\n\t// @method round(): Point\r\n\t// Returns a copy of the current point with rounded coordinates.\r\n\tround: function () {\r\n\t\treturn this.clone()._round();\r\n\t},\r\n\r\n\t_round: function () {\r\n\t\tthis.x = Math.round(this.x);\r\n\t\tthis.y = Math.round(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method floor(): Point\r\n\t// Returns a copy of the current point with floored coordinates (rounded down).\r\n\tfloor: function () {\r\n\t\treturn this.clone()._floor();\r\n\t},\r\n\r\n\t_floor: function () {\r\n\t\tthis.x = Math.floor(this.x);\r\n\t\tthis.y = Math.floor(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method ceil(): Point\r\n\t// Returns a copy of the current point with ceiled coordinates (rounded up).\r\n\tceil: function () {\r\n\t\treturn this.clone()._ceil();\r\n\t},\r\n\r\n\t_ceil: function () {\r\n\t\tthis.x = Math.ceil(this.x);\r\n\t\tthis.y = Math.ceil(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method distanceTo(otherPoint: Point): Number\r\n\t// Returns the cartesian distance between the current and the given points.\r\n\tdistanceTo: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\tvar x = point.x - this.x,\r\n\t\t y = point.y - this.y;\r\n\r\n\t\treturn Math.sqrt(x * x + y * y);\r\n\t},\r\n\r\n\t// @method equals(otherPoint: Point): Boolean\r\n\t// Returns `true` if the given point has the same coordinates.\r\n\tequals: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn point.x === this.x &&\r\n\t\t point.y === this.y;\r\n\t},\r\n\r\n\t// @method contains(otherPoint: Point): Boolean\r\n\t// Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).\r\n\tcontains: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn Math.abs(point.x) <= Math.abs(this.x) &&\r\n\t\t Math.abs(point.y) <= Math.abs(this.y);\r\n\t},\r\n\r\n\t// @method toString(): String\r\n\t// Returns a string representation of the point for debugging purposes.\r\n\ttoString: function () {\r\n\t\treturn 'Point(' +\r\n\t\t L.Util.formatNum(this.x) + ', ' +\r\n\t\t L.Util.formatNum(this.y) + ')';\r\n\t}\r\n};\r\n\r\n// @factory L.point(x: Number, y: Number, round?: Boolean)\r\n// Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values.\r\n\r\n// @alternative\r\n// @factory L.point(coords: Number[])\r\n// Expects an array of the form `[x, y]` instead.\r\n\r\n// @alternative\r\n// @factory L.point(coords: Object)\r\n// Expects a plain object of the form `{x: Number, y: Number}` instead.\r\nL.point = function (x, y, round) {\r\n\tif (x instanceof L.Point) {\r\n\t\treturn x;\r\n\t}\r\n\tif (L.Util.isArray(x)) {\r\n\t\treturn new L.Point(x[0], x[1]);\r\n\t}\r\n\tif (x === undefined || x === null) {\r\n\t\treturn x;\r\n\t}\r\n\tif (typeof x === 'object' && 'x' in x && 'y' in x) {\r\n\t\treturn new L.Point(x.x, x.y);\r\n\t}\r\n\treturn new L.Point(x, y, round);\r\n};\r\n\n/*\r\n * @class Bounds\r\n * @aka L.Bounds\r\n *\r\n * Represents a rectangular area in pixel coordinates.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var p1 = L.point(10, 10),\r\n * p2 = L.point(40, 60),\r\n * bounds = L.bounds(p1, p2);\r\n * ```\r\n *\r\n * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:\r\n *\r\n * ```js\r\n * otherBounds.intersects([[10, 10], [40, 60]]);\r\n * ```\r\n */\r\n\r\nL.Bounds = function (a, b) {\r\n\tif (!a) { return; }\r\n\r\n\tvar points = b ? [a, b] : a;\r\n\r\n\tfor (var i = 0, len = points.length; i < len; i++) {\r\n\t\tthis.extend(points[i]);\r\n\t}\r\n};\r\n\r\nL.Bounds.prototype = {\r\n\t// @method extend(point: Point): this\r\n\t// Extends the bounds to contain the given point.\r\n\textend: function (point) { // (Point)\r\n\t\tpoint = L.point(point);\r\n\r\n\t\t// @property min: Point\r\n\t\t// The top left corner of the rectangle.\r\n\t\t// @property max: Point\r\n\t\t// The bottom right corner of the rectangle.\r\n\t\tif (!this.min && !this.max) {\r\n\t\t\tthis.min = point.clone();\r\n\t\t\tthis.max = point.clone();\r\n\t\t} else {\r\n\t\t\tthis.min.x = Math.min(point.x, this.min.x);\r\n\t\t\tthis.max.x = Math.max(point.x, this.max.x);\r\n\t\t\tthis.min.y = Math.min(point.y, this.min.y);\r\n\t\t\tthis.max.y = Math.max(point.y, this.max.y);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getCenter(round?: Boolean): Point\r\n\t// Returns the center point of the bounds.\r\n\tgetCenter: function (round) {\r\n\t\treturn new L.Point(\r\n\t\t (this.min.x + this.max.x) / 2,\r\n\t\t (this.min.y + this.max.y) / 2, round);\r\n\t},\r\n\r\n\t// @method getBottomLeft(): Point\r\n\t// Returns the bottom-left point of the bounds.\r\n\tgetBottomLeft: function () {\r\n\t\treturn new L.Point(this.min.x, this.max.y);\r\n\t},\r\n\r\n\t// @method getTopRight(): Point\r\n\t// Returns the top-right point of the bounds.\r\n\tgetTopRight: function () { // -> Point\r\n\t\treturn new L.Point(this.max.x, this.min.y);\r\n\t},\r\n\r\n\t// @method getSize(): Point\r\n\t// Returns the size of the given bounds\r\n\tgetSize: function () {\r\n\t\treturn this.max.subtract(this.min);\r\n\t},\r\n\r\n\t// @method contains(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle contains the given one.\r\n\t// @alternative\r\n\t// @method contains(point: Point): Boolean\r\n\t// Returns `true` if the rectangle contains the given point.\r\n\tcontains: function (obj) {\r\n\t\tvar min, max;\r\n\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.Point) {\r\n\t\t\tobj = L.point(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.bounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof L.Bounds) {\r\n\t\t\tmin = obj.min;\r\n\t\t\tmax = obj.max;\r\n\t\t} else {\r\n\t\t\tmin = max = obj;\r\n\t\t}\r\n\r\n\t\treturn (min.x >= this.min.x) &&\r\n\t\t (max.x <= this.max.x) &&\r\n\t\t (min.y >= this.min.y) &&\r\n\t\t (max.y <= this.max.y);\r\n\t},\r\n\r\n\t// @method intersects(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle intersects the given bounds. Two bounds\r\n\t// intersect if they have at least one point in common.\r\n\tintersects: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = L.bounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t max = this.max,\r\n\t\t min2 = bounds.min,\r\n\t\t max2 = bounds.max,\r\n\t\t xIntersects = (max2.x >= min.x) && (min2.x <= max.x),\r\n\t\t yIntersects = (max2.y >= min.y) && (min2.y <= max.y);\r\n\r\n\t\treturn xIntersects && yIntersects;\r\n\t},\r\n\r\n\t// @method overlaps(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle overlaps the given bounds. Two bounds\r\n\t// overlap if their intersection is an area.\r\n\toverlaps: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = L.bounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t max = this.max,\r\n\t\t min2 = bounds.min,\r\n\t\t max2 = bounds.max,\r\n\t\t xOverlaps = (max2.x > min.x) && (min2.x < max.x),\r\n\t\t yOverlaps = (max2.y > min.y) && (min2.y < max.y);\r\n\r\n\t\treturn xOverlaps && yOverlaps;\r\n\t},\r\n\r\n\tisValid: function () {\r\n\t\treturn !!(this.min && this.max);\r\n\t}\r\n};\r\n\r\n\r\n// @factory L.bounds(topLeft: Point, bottomRight: Point)\r\n// Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).\r\n// @alternative\r\n// @factory L.bounds(points: Point[])\r\n// Creates a Bounds object from the points it contains\r\nL.bounds = function (a, b) {\r\n\tif (!a || a instanceof L.Bounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.Bounds(a, b);\r\n};\r\n\n/*\r\n * @class Transformation\r\n * @aka L.Transformation\r\n *\r\n * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d`\r\n * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing\r\n * the reverse. Used by Leaflet in its projections code.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var transformation = new L.Transformation(2, 5, -1, 10),\r\n * \tp = L.point(1, 2),\r\n * \tp2 = transformation.transform(p), // L.point(7, 8)\r\n * \tp3 = transformation.untransform(p2); // L.point(1, 2)\r\n * ```\r\n */\r\n\r\n\r\n// factory new L.Transformation(a: Number, b: Number, c: Number, d: Number)\r\n// Creates a `Transformation` object with the given coefficients.\r\nL.Transformation = function (a, b, c, d) {\r\n\tthis._a = a;\r\n\tthis._b = b;\r\n\tthis._c = c;\r\n\tthis._d = d;\r\n};\r\n\r\nL.Transformation.prototype = {\r\n\t// @method transform(point: Point, scale?: Number): Point\r\n\t// Returns a transformed point, optionally multiplied by the given scale.\r\n\t// Only accepts real `L.Point` instances, not arrays.\r\n\ttransform: function (point, scale) { // (Point, Number) -> Point\r\n\t\treturn this._transform(point.clone(), scale);\r\n\t},\r\n\r\n\t// destructive transform (faster)\r\n\t_transform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\tpoint.x = scale * (this._a * point.x + this._b);\r\n\t\tpoint.y = scale * (this._c * point.y + this._d);\r\n\t\treturn point;\r\n\t},\r\n\r\n\t// @method untransform(point: Point, scale?: Number): Point\r\n\t// Returns the reverse transformation of the given point, optionally divided\r\n\t// by the given scale. Only accepts real `L.Point` instances, not arrays.\r\n\tuntransform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\treturn new L.Point(\r\n\t\t (point.x / scale - this._b) / this._a,\r\n\t\t (point.y / scale - this._d) / this._c);\r\n\t}\r\n};\r\n\n/*\r\n * @namespace DomUtil\r\n *\r\n * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model)\r\n * tree, used by Leaflet internally.\r\n *\r\n * Most functions expecting or returning a `HTMLElement` also work for\r\n * SVG elements. The only difference is that classes refer to CSS classes\r\n * in HTML and SVG classes in SVG.\r\n */\r\n\r\nL.DomUtil = {\r\n\r\n\t// @function get(id: String|HTMLElement): HTMLElement\r\n\t// Returns an element given its DOM id, or returns the element itself\r\n\t// if it was passed directly.\r\n\tget: function (id) {\r\n\t\treturn typeof id === 'string' ? document.getElementById(id) : id;\r\n\t},\r\n\r\n\t// @function getStyle(el: HTMLElement, styleAttrib: String): String\r\n\t// Returns the value for a certain style attribute on an element,\r\n\t// including computed values or values set through CSS.\r\n\tgetStyle: function (el, style) {\r\n\r\n\t\tvar value = el.style[style] || (el.currentStyle && el.currentStyle[style]);\r\n\r\n\t\tif ((!value || value === 'auto') && document.defaultView) {\r\n\t\t\tvar css = document.defaultView.getComputedStyle(el, null);\r\n\t\t\tvalue = css ? css[style] : null;\r\n\t\t}\r\n\r\n\t\treturn value === 'auto' ? null : value;\r\n\t},\r\n\r\n\t// @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement\r\n\t// Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element.\r\n\tcreate: function (tagName, className, container) {\r\n\r\n\t\tvar el = document.createElement(tagName);\r\n\t\tel.className = className || '';\r\n\r\n\t\tif (container) {\r\n\t\t\tcontainer.appendChild(el);\r\n\t\t}\r\n\r\n\t\treturn el;\r\n\t},\r\n\r\n\t// @function remove(el: HTMLElement)\r\n\t// Removes `el` from its parent element\r\n\tremove: function (el) {\r\n\t\tvar parent = el.parentNode;\r\n\t\tif (parent) {\r\n\t\t\tparent.removeChild(el);\r\n\t\t}\r\n\t},\r\n\r\n\t// @function empty(el: HTMLElement)\r\n\t// Removes all of `el`'s children elements from `el`\r\n\tempty: function (el) {\r\n\t\twhile (el.firstChild) {\r\n\t\t\tel.removeChild(el.firstChild);\r\n\t\t}\r\n\t},\r\n\r\n\t// @function toFront(el: HTMLElement)\r\n\t// Makes `el` the last children of its parent, so it renders in front of the other children.\r\n\ttoFront: function (el) {\r\n\t\tel.parentNode.appendChild(el);\r\n\t},\r\n\r\n\t// @function toBack(el: HTMLElement)\r\n\t// Makes `el` the first children of its parent, so it renders back from the other children.\r\n\ttoBack: function (el) {\r\n\t\tvar parent = el.parentNode;\r\n\t\tparent.insertBefore(el, parent.firstChild);\r\n\t},\r\n\r\n\t// @function hasClass(el: HTMLElement, name: String): Boolean\r\n\t// Returns `true` if the element's class attribute contains `name`.\r\n\thasClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\treturn el.classList.contains(name);\r\n\t\t}\r\n\t\tvar className = L.DomUtil.getClass(el);\r\n\t\treturn className.length > 0 && new RegExp('(^|\\\\s)' + name + '(\\\\s|$)').test(className);\r\n\t},\r\n\r\n\t// @function addClass(el: HTMLElement, name: String)\r\n\t// Adds `name` to the element's class attribute.\r\n\taddClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tvar classes = L.Util.splitWords(name);\r\n\t\t\tfor (var i = 0, len = classes.length; i < len; i++) {\r\n\t\t\t\tel.classList.add(classes[i]);\r\n\t\t\t}\r\n\t\t} else if (!L.DomUtil.hasClass(el, name)) {\r\n\t\t\tvar className = L.DomUtil.getClass(el);\r\n\t\t\tL.DomUtil.setClass(el, (className ? className + ' ' : '') + name);\r\n\t\t}\r\n\t},\r\n\r\n\t// @function removeClass(el: HTMLElement, name: String)\r\n\t// Removes `name` from the element's class attribute.\r\n\tremoveClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tel.classList.remove(name);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.setClass(el, L.Util.trim((' ' + L.DomUtil.getClass(el) + ' ').replace(' ' + name + ' ', ' ')));\r\n\t\t}\r\n\t},\r\n\r\n\t// @function setClass(el: HTMLElement, name: String)\r\n\t// Sets the element's class.\r\n\tsetClass: function (el, name) {\r\n\t\tif (el.className.baseVal === undefined) {\r\n\t\t\tel.className = name;\r\n\t\t} else {\r\n\t\t\t// in case of SVG element\r\n\t\t\tel.className.baseVal = name;\r\n\t\t}\r\n\t},\r\n\r\n\t// @function getClass(el: HTMLElement): String\r\n\t// Returns the element's class.\r\n\tgetClass: function (el) {\r\n\t\treturn el.className.baseVal === undefined ? el.className : el.className.baseVal;\r\n\t},\r\n\r\n\t// @function setOpacity(el: HTMLElement, opacity: Number)\r\n\t// Set the opacity of an element (including old IE support).\r\n\t// `opacity` must be a number from `0` to `1`.\r\n\tsetOpacity: function (el, value) {\r\n\r\n\t\tif ('opacity' in el.style) {\r\n\t\t\tel.style.opacity = value;\r\n\r\n\t\t} else if ('filter' in el.style) {\r\n\t\t\tL.DomUtil._setOpacityIE(el, value);\r\n\t\t}\r\n\t},\r\n\r\n\t_setOpacityIE: function (el, value) {\r\n\t\tvar filter = false,\r\n\t\t filterName = 'DXImageTransform.Microsoft.Alpha';\r\n\r\n\t\t// filters collection throws an error if we try to retrieve a filter that doesn't exist\r\n\t\ttry {\r\n\t\t\tfilter = el.filters.item(filterName);\r\n\t\t} catch (e) {\r\n\t\t\t// don't set opacity to 1 if we haven't already set an opacity,\r\n\t\t\t// it isn't needed and breaks transparent pngs.\r\n\t\t\tif (value === 1) { return; }\r\n\t\t}\r\n\r\n\t\tvalue = Math.round(value * 100);\r\n\r\n\t\tif (filter) {\r\n\t\t\tfilter.Enabled = (value !== 100);\r\n\t\t\tfilter.Opacity = value;\r\n\t\t} else {\r\n\t\t\tel.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';\r\n\t\t}\r\n\t},\r\n\r\n\t// @function testProp(props: String[]): String|false\r\n\t// Goes through the array of style names and returns the first name\r\n\t// that is a valid style name for an element. If no such name is found,\r\n\t// it returns false. Useful for vendor-prefixed styles like `transform`.\r\n\ttestProp: function (props) {\r\n\r\n\t\tvar style = document.documentElement.style;\r\n\r\n\t\tfor (var i = 0; i < props.length; i++) {\r\n\t\t\tif (props[i] in style) {\r\n\t\t\t\treturn props[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t// @function setTransform(el: HTMLElement, offset: Point, scale?: Number)\r\n\t// Resets the 3D CSS transform of `el` so it is translated by `offset` pixels\r\n\t// and optionally scaled by `scale`. Does not have an effect if the\r\n\t// browser doesn't support 3D CSS transforms.\r\n\tsetTransform: function (el, offset, scale) {\r\n\t\tvar pos = offset || new L.Point(0, 0);\r\n\r\n\t\tel.style[L.DomUtil.TRANSFORM] =\r\n\t\t\t(L.Browser.ie3d ?\r\n\t\t\t\t'translate(' + pos.x + 'px,' + pos.y + 'px)' :\r\n\t\t\t\t'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') +\r\n\t\t\t(scale ? ' scale(' + scale + ')' : '');\r\n\t},\r\n\r\n\t// @function setPosition(el: HTMLElement, position: Point)\r\n\t// Sets the position of `el` to coordinates specified by `position`,\r\n\t// using CSS translate or top/left positioning depending on the browser\r\n\t// (used by Leaflet internally to position its layers).\r\n\tsetPosition: function (el, point) { // (HTMLElement, Point[, Boolean])\r\n\r\n\t\t/*eslint-disable */\r\n\t\tel._leaflet_pos = point;\r\n\t\t/*eslint-enable */\r\n\r\n\t\tif (L.Browser.any3d) {\r\n\t\t\tL.DomUtil.setTransform(el, point);\r\n\t\t} else {\r\n\t\t\tel.style.left = point.x + 'px';\r\n\t\t\tel.style.top = point.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t// @function getPosition(el: HTMLElement): Point\r\n\t// Returns the coordinates of an element previously positioned with setPosition.\r\n\tgetPosition: function (el) {\r\n\t\t// this method is only used for elements previously positioned using setPosition,\r\n\t\t// so it's safe to cache the position for performance\r\n\r\n\t\treturn el._leaflet_pos || new L.Point(0, 0);\r\n\t}\r\n};\r\n\r\n\r\n(function () {\r\n\t// prefix style property names\r\n\r\n\t// @property TRANSFORM: String\r\n\t// Vendor-prefixed fransform style name (e.g. `'webkitTransform'` for WebKit).\r\n\tL.DomUtil.TRANSFORM = L.DomUtil.testProp(\r\n\t\t\t['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\r\n\r\n\r\n\t// webkitTransition comes first because some browser versions that drop vendor prefix don't do\r\n\t// the same for the transitionend event, in particular the Android 4.1 stock browser\r\n\r\n\t// @property TRANSITION: String\r\n\t// Vendor-prefixed transform style name.\r\n\tvar transition = L.DomUtil.TRANSITION = L.DomUtil.testProp(\r\n\t\t\t['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\r\n\r\n\tL.DomUtil.TRANSITION_END =\r\n\t\t\ttransition === 'webkitTransition' || transition === 'OTransition' ? transition + 'End' : 'transitionend';\r\n\r\n\t// @function disableTextSelection()\r\n\t// Prevents the user from generating `selectstart` DOM events, usually generated\r\n\t// when the user drags the mouse through a page with text. Used internally\r\n\t// by Leaflet to override the behaviour of any click-and-drag interaction on\r\n\t// the map. Affects drag interactions on the whole document.\r\n\r\n\t// @function enableTextSelection()\r\n\t// Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection).\r\n\tif ('onselectstart' in document) {\r\n\t\tL.DomUtil.disableTextSelection = function () {\r\n\t\t\tL.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);\r\n\t\t};\r\n\t\tL.DomUtil.enableTextSelection = function () {\r\n\t\t\tL.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);\r\n\t\t};\r\n\r\n\t} else {\r\n\t\tvar userSelectProperty = L.DomUtil.testProp(\r\n\t\t\t['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);\r\n\r\n\t\tL.DomUtil.disableTextSelection = function () {\r\n\t\t\tif (userSelectProperty) {\r\n\t\t\t\tvar style = document.documentElement.style;\r\n\t\t\t\tthis._userSelect = style[userSelectProperty];\r\n\t\t\t\tstyle[userSelectProperty] = 'none';\r\n\t\t\t}\r\n\t\t};\r\n\t\tL.DomUtil.enableTextSelection = function () {\r\n\t\t\tif (userSelectProperty) {\r\n\t\t\t\tdocument.documentElement.style[userSelectProperty] = this._userSelect;\r\n\t\t\t\tdelete this._userSelect;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\t// @function disableImageDrag()\r\n\t// As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but\r\n\t// for `dragstart` DOM events, usually generated when the user drags an image.\r\n\tL.DomUtil.disableImageDrag = function () {\r\n\t\tL.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t};\r\n\r\n\t// @function enableImageDrag()\r\n\t// Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection).\r\n\tL.DomUtil.enableImageDrag = function () {\r\n\t\tL.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t};\r\n\r\n\t// @function preventOutline(el: HTMLElement)\r\n\t// Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline)\r\n\t// of the element `el` invisible. Used internally by Leaflet to prevent\r\n\t// focusable elements from displaying an outline when the user performs a\r\n\t// drag interaction on them.\r\n\tL.DomUtil.preventOutline = function (element) {\r\n\t\twhile (element.tabIndex === -1) {\r\n\t\t\telement = element.parentNode;\r\n\t\t}\r\n\t\tif (!element || !element.style) { return; }\r\n\t\tL.DomUtil.restoreOutline();\r\n\t\tthis._outlineElement = element;\r\n\t\tthis._outlineStyle = element.style.outline;\r\n\t\telement.style.outline = 'none';\r\n\t\tL.DomEvent.on(window, 'keydown', L.DomUtil.restoreOutline, this);\r\n\t};\r\n\r\n\t// @function restoreOutline()\r\n\t// Cancels the effects of a previous [`L.DomUtil.preventOutline`]().\r\n\tL.DomUtil.restoreOutline = function () {\r\n\t\tif (!this._outlineElement) { return; }\r\n\t\tthis._outlineElement.style.outline = this._outlineStyle;\r\n\t\tdelete this._outlineElement;\r\n\t\tdelete this._outlineStyle;\r\n\t\tL.DomEvent.off(window, 'keydown', L.DomUtil.restoreOutline, this);\r\n\t};\r\n})();\r\n\n/* @class LatLng\r\n * @aka L.LatLng\r\n *\r\n * Represents a geographical point with a certain latitude and longitude.\r\n *\r\n * @example\r\n *\r\n * ```\r\n * var latlng = L.latLng(50.5, 30.5);\r\n * ```\r\n *\r\n * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:\r\n *\r\n * ```\r\n * map.panTo([50, 30]);\r\n * map.panTo({lon: 30, lat: 50});\r\n * map.panTo({lat: 50, lng: 30});\r\n * map.panTo(L.latLng(50, 30));\r\n * ```\r\n */\r\n\r\nL.LatLng = function (lat, lng, alt) {\r\n\tif (isNaN(lat) || isNaN(lng)) {\r\n\t\tthrow new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\r\n\t}\r\n\r\n\t// @property lat: Number\r\n\t// Latitude in degrees\r\n\tthis.lat = +lat;\r\n\r\n\t// @property lng: Number\r\n\t// Longitude in degrees\r\n\tthis.lng = +lng;\r\n\r\n\t// @property alt: Number\r\n\t// Altitude in meters (optional)\r\n\tif (alt !== undefined) {\r\n\t\tthis.alt = +alt;\r\n\t}\r\n};\r\n\r\nL.LatLng.prototype = {\r\n\t// @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean\r\n\t// Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overriden by setting `maxMargin` to a small number.\r\n\tequals: function (obj, maxMargin) {\r\n\t\tif (!obj) { return false; }\r\n\r\n\t\tobj = L.latLng(obj);\r\n\r\n\t\tvar margin = Math.max(\r\n\t\t Math.abs(this.lat - obj.lat),\r\n\t\t Math.abs(this.lng - obj.lng));\r\n\r\n\t\treturn margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin);\r\n\t},\r\n\r\n\t// @method toString(): String\r\n\t// Returns a string representation of the point (for debugging purposes).\r\n\ttoString: function (precision) {\r\n\t\treturn 'LatLng(' +\r\n\t\t L.Util.formatNum(this.lat, precision) + ', ' +\r\n\t\t L.Util.formatNum(this.lng, precision) + ')';\r\n\t},\r\n\r\n\t// @method distanceTo(otherLatLng: LatLng): Number\r\n\t// Returns the distance (in meters) to the given `LatLng` calculated using the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula).\r\n\tdistanceTo: function (other) {\r\n\t\treturn L.CRS.Earth.distance(this, L.latLng(other));\r\n\t},\r\n\r\n\t// @method wrap(): LatLng\r\n\t// Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees.\r\n\twrap: function () {\r\n\t\treturn L.CRS.Earth.wrapLatLng(this);\r\n\t},\r\n\r\n\t// @method toBounds(sizeInMeters: Number): LatLngBounds\r\n\t// Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters` meters apart from the `LatLng`.\r\n\ttoBounds: function (sizeInMeters) {\r\n\t\tvar latAccuracy = 180 * sizeInMeters / 40075017,\r\n\t\t lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);\r\n\r\n\t\treturn L.latLngBounds(\r\n\t\t [this.lat - latAccuracy, this.lng - lngAccuracy],\r\n\t\t [this.lat + latAccuracy, this.lng + lngAccuracy]);\r\n\t},\r\n\r\n\tclone: function () {\r\n\t\treturn new L.LatLng(this.lat, this.lng, this.alt);\r\n\t}\r\n};\r\n\r\n\r\n\r\n// @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng\r\n// Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).\r\n\r\n// @alternative\r\n// @factory L.latLng(coords: Array): LatLng\r\n// Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead.\r\n\r\n// @alternative\r\n// @factory L.latLng(coords: Object): LatLng\r\n// Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead.\r\n\r\nL.latLng = function (a, b, c) {\r\n\tif (a instanceof L.LatLng) {\r\n\t\treturn a;\r\n\t}\r\n\tif (L.Util.isArray(a) && typeof a[0] !== 'object') {\r\n\t\tif (a.length === 3) {\r\n\t\t\treturn new L.LatLng(a[0], a[1], a[2]);\r\n\t\t}\r\n\t\tif (a.length === 2) {\r\n\t\t\treturn new L.LatLng(a[0], a[1]);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\tif (a === undefined || a === null) {\r\n\t\treturn a;\r\n\t}\r\n\tif (typeof a === 'object' && 'lat' in a) {\r\n\t\treturn new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\r\n\t}\r\n\tif (b === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\treturn new L.LatLng(a, b, c);\r\n};\r\n\n/*\r\n * @class LatLngBounds\r\n * @aka L.LatLngBounds\r\n *\r\n * Represents a rectangular geographical area on a map.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var southWest = L.latLng(40.712, -74.227),\r\n * northEast = L.latLng(40.774, -74.125),\r\n * bounds = L.latLngBounds(southWest, northEast);\r\n * ```\r\n *\r\n * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:\r\n *\r\n * ```js\r\n * map.fitBounds([\r\n * \t[40.712, -74.227],\r\n * \t[40.774, -74.125]\r\n * ]);\r\n * ```\r\n */\r\n\r\nL.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[])\r\n\tif (!southWest) { return; }\r\n\r\n\tvar latlngs = northEast ? [southWest, northEast] : southWest;\r\n\r\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\tthis.extend(latlngs[i]);\r\n\t}\r\n};\r\n\r\nL.LatLngBounds.prototype = {\r\n\r\n\t// @method extend(latlng: LatLng): this\r\n\t// Extend the bounds to contain the given point\r\n\r\n\t// @alternative\r\n\t// @method extend(otherBounds: LatLngBounds): this\r\n\t// Extend the bounds to contain the given bounds\r\n\textend: function (obj) {\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t sw2, ne2;\r\n\r\n\t\tif (obj instanceof L.LatLng) {\r\n\t\t\tsw2 = obj;\r\n\t\t\tne2 = obj;\r\n\r\n\t\t} else if (obj instanceof L.LatLngBounds) {\r\n\t\t\tsw2 = obj._southWest;\r\n\t\t\tne2 = obj._northEast;\r\n\r\n\t\t\tif (!sw2 || !ne2) { return this; }\r\n\r\n\t\t} else {\r\n\t\t\treturn obj ? this.extend(L.latLng(obj) || L.latLngBounds(obj)) : this;\r\n\t\t}\r\n\r\n\t\tif (!sw && !ne) {\r\n\t\t\tthis._southWest = new L.LatLng(sw2.lat, sw2.lng);\r\n\t\t\tthis._northEast = new L.LatLng(ne2.lat, ne2.lng);\r\n\t\t} else {\r\n\t\t\tsw.lat = Math.min(sw2.lat, sw.lat);\r\n\t\t\tsw.lng = Math.min(sw2.lng, sw.lng);\r\n\t\t\tne.lat = Math.max(ne2.lat, ne.lat);\r\n\t\t\tne.lng = Math.max(ne2.lng, ne.lng);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method pad(bufferRatio: Number): LatLngBounds\r\n\t// Returns bigger bounds created by extending the current bounds by a given percentage in each direction.\r\n\tpad: function (bufferRatio) {\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,\r\n\t\t widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\r\n\r\n\t\treturn new L.LatLngBounds(\r\n\t\t new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),\r\n\t\t new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));\r\n\t},\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the center point of the bounds.\r\n\tgetCenter: function () {\r\n\t\treturn new L.LatLng(\r\n\t\t (this._southWest.lat + this._northEast.lat) / 2,\r\n\t\t (this._southWest.lng + this._northEast.lng) / 2);\r\n\t},\r\n\r\n\t// @method getSouthWest(): LatLng\r\n\t// Returns the south-west point of the bounds.\r\n\tgetSouthWest: function () {\r\n\t\treturn this._southWest;\r\n\t},\r\n\r\n\t// @method getNorthEast(): LatLng\r\n\t// Returns the north-east point of the bounds.\r\n\tgetNorthEast: function () {\r\n\t\treturn this._northEast;\r\n\t},\r\n\r\n\t// @method getNorthWest(): LatLng\r\n\t// Returns the north-west point of the bounds.\r\n\tgetNorthWest: function () {\r\n\t\treturn new L.LatLng(this.getNorth(), this.getWest());\r\n\t},\r\n\r\n\t// @method getSouthEast(): LatLng\r\n\t// Returns the south-east point of the bounds.\r\n\tgetSouthEast: function () {\r\n\t\treturn new L.LatLng(this.getSouth(), this.getEast());\r\n\t},\r\n\r\n\t// @method getWest(): Number\r\n\t// Returns the west longitude of the bounds\r\n\tgetWest: function () {\r\n\t\treturn this._southWest.lng;\r\n\t},\r\n\r\n\t// @method getSouth(): Number\r\n\t// Returns the south latitude of the bounds\r\n\tgetSouth: function () {\r\n\t\treturn this._southWest.lat;\r\n\t},\r\n\r\n\t// @method getEast(): Number\r\n\t// Returns the east longitude of the bounds\r\n\tgetEast: function () {\r\n\t\treturn this._northEast.lng;\r\n\t},\r\n\r\n\t// @method getNorth(): Number\r\n\t// Returns the north latitude of the bounds\r\n\tgetNorth: function () {\r\n\t\treturn this._northEast.lat;\r\n\t},\r\n\r\n\t// @method contains(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle contains the given one.\r\n\r\n\t// @alternative\r\n\t// @method contains (latlng: LatLng): Boolean\r\n\t// Returns `true` if the rectangle contains the given point.\r\n\tcontains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.LatLng) {\r\n\t\t\tobj = L.latLng(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.latLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t sw2, ne2;\r\n\r\n\t\tif (obj instanceof L.LatLngBounds) {\r\n\t\t\tsw2 = obj.getSouthWest();\r\n\t\t\tne2 = obj.getNorthEast();\r\n\t\t} else {\r\n\t\t\tsw2 = ne2 = obj;\r\n\t\t}\r\n\r\n\t\treturn (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&\r\n\t\t (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);\r\n\t},\r\n\r\n\t// @method intersects(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.\r\n\tintersects: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t sw2 = bounds.getSouthWest(),\r\n\t\t ne2 = bounds.getNorthEast(),\r\n\r\n\t\t latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),\r\n\t\t lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);\r\n\r\n\t\treturn latIntersects && lngIntersects;\r\n\t},\r\n\r\n\t// @method overlaps(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.\r\n\toverlaps: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t sw2 = bounds.getSouthWest(),\r\n\t\t ne2 = bounds.getNorthEast(),\r\n\r\n\t\t latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat),\r\n\t\t lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng);\r\n\r\n\t\treturn latOverlaps && lngOverlaps;\r\n\t},\r\n\r\n\t// @method toBBoxString(): String\r\n\t// Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.\r\n\ttoBBoxString: function () {\r\n\t\treturn [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');\r\n\t},\r\n\r\n\t// @method equals(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds.\r\n\tequals: function (bounds) {\r\n\t\tif (!bounds) { return false; }\r\n\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\treturn this._southWest.equals(bounds.getSouthWest()) &&\r\n\t\t this._northEast.equals(bounds.getNorthEast());\r\n\t},\r\n\r\n\t// @method isValid(): Boolean\r\n\t// Returns `true` if the bounds are properly initialized.\r\n\tisValid: function () {\r\n\t\treturn !!(this._southWest && this._northEast);\r\n\t}\r\n};\r\n\r\n// TODO International date line?\r\n\r\n// @factory L.latLngBounds(southWest: LatLng, northEast: LatLng)\r\n// Creates a `LatLngBounds` object by defining south-west and north-east corners of the rectangle.\r\n\r\n// @alternative\r\n// @factory L.latLngBounds(latlngs: LatLng[])\r\n// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds).\r\nL.latLngBounds = function (a, b) {\r\n\tif (a instanceof L.LatLngBounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.LatLngBounds(a, b);\r\n};\r\n\n/*\r\n * @namespace Projection\r\n * @section\r\n * Leaflet comes with a set of already defined Projections out of the box:\r\n *\r\n * @projection L.Projection.LonLat\r\n *\r\n * Equirectangular, or Plate Carree projection — the most simple projection,\r\n * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as\r\n * latitude. Also suitable for flat worlds, e.g. game maps. Used by the\r\n * `EPSG:3395` and `Simple` CRS.\r\n */\r\n\r\nL.Projection = {};\r\n\r\nL.Projection.LonLat = {\r\n\tproject: function (latlng) {\r\n\t\treturn new L.Point(latlng.lng, latlng.lat);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\treturn new L.LatLng(point.y, point.x);\r\n\t},\r\n\r\n\tbounds: L.bounds([-180, -90], [180, 90])\r\n};\r\n\n/*\r\n * @namespace Projection\r\n * @projection L.Projection.SphericalMercator\r\n *\r\n * Spherical Mercator projection — the most common projection for online maps,\r\n * used by almost all free and commercial tile providers. Assumes that Earth is\r\n * a sphere. Used by the `EPSG:3857` CRS.\r\n */\r\n\r\nL.Projection.SphericalMercator = {\r\n\r\n\tR: 6378137,\r\n\tMAX_LATITUDE: 85.0511287798,\r\n\r\n\tproject: function (latlng) {\r\n\t\tvar d = Math.PI / 180,\r\n\t\t max = this.MAX_LATITUDE,\r\n\t\t lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t sin = Math.sin(lat * d);\r\n\r\n\t\treturn new L.Point(\r\n\t\t\t\tthis.R * latlng.lng * d,\r\n\t\t\t\tthis.R * Math.log((1 + sin) / (1 - sin)) / 2);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\tvar d = 180 / Math.PI;\r\n\r\n\t\treturn new L.LatLng(\r\n\t\t\t(2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,\r\n\t\t\tpoint.x * d / this.R);\r\n\t},\r\n\r\n\tbounds: (function () {\r\n\t\tvar d = 6378137 * Math.PI;\r\n\t\treturn L.bounds([-d, -d], [d, d]);\r\n\t})()\r\n};\r\n\n/*\r\n * @class CRS\r\n * @aka L.CRS\r\n * Abstract class that defines coordinate reference systems for projecting\r\n * geographical points into pixel (screen) coordinates and back (and to\r\n * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See\r\n * [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system).\r\n *\r\n * Leaflet defines the most usual CRSs by default. If you want to use a\r\n * CRS not defined by default, take a look at the\r\n * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin.\r\n */\r\n\r\nL.CRS = {\r\n\t// @method latLngToPoint(latlng: LatLng, zoom: Number): Point\r\n\t// Projects geographical coordinates into pixel coordinates for a given zoom.\r\n\tlatLngToPoint: function (latlng, zoom) {\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t scale = this.scale(zoom);\r\n\r\n\t\treturn this.transformation._transform(projectedPoint, scale);\r\n\t},\r\n\r\n\t// @method pointToLatLng(point: Point, zoom: Number): LatLng\r\n\t// The inverse of `latLngToPoint`. Projects pixel coordinates on a given\r\n\t// zoom into geographical coordinates.\r\n\tpointToLatLng: function (point, zoom) {\r\n\t\tvar scale = this.scale(zoom),\r\n\t\t untransformedPoint = this.transformation.untransform(point, scale);\r\n\r\n\t\treturn this.projection.unproject(untransformedPoint);\r\n\t},\r\n\r\n\t// @method project(latlng: LatLng): Point\r\n\t// Projects geographical coordinates into coordinates in units accepted for\r\n\t// this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).\r\n\tproject: function (latlng) {\r\n\t\treturn this.projection.project(latlng);\r\n\t},\r\n\r\n\t// @method unproject(point: Point): LatLng\r\n\t// Given a projected coordinate returns the corresponding LatLng.\r\n\t// The inverse of `project`.\r\n\tunproject: function (point) {\r\n\t\treturn this.projection.unproject(point);\r\n\t},\r\n\r\n\t// @method scale(zoom: Number): Number\r\n\t// Returns the scale used when transforming projected coordinates into\r\n\t// pixel coordinates for a particular zoom. For example, it returns\r\n\t// `256 * 2^zoom` for Mercator-based CRS.\r\n\tscale: function (zoom) {\r\n\t\treturn 256 * Math.pow(2, zoom);\r\n\t},\r\n\r\n\t// @method zoom(scale: Number): Number\r\n\t// Inverse of `scale()`, returns the zoom level corresponding to a scale\r\n\t// factor of `scale`.\r\n\tzoom: function (scale) {\r\n\t\treturn Math.log(scale / 256) / Math.LN2;\r\n\t},\r\n\r\n\t// @method getProjectedBounds(zoom: Number): Bounds\r\n\t// Returns the projection's bounds scaled and transformed for the provided `zoom`.\r\n\tgetProjectedBounds: function (zoom) {\r\n\t\tif (this.infinite) { return null; }\r\n\r\n\t\tvar b = this.projection.bounds,\r\n\t\t s = this.scale(zoom),\r\n\t\t min = this.transformation.transform(b.min, s),\r\n\t\t max = this.transformation.transform(b.max, s);\r\n\r\n\t\treturn L.bounds(min, max);\r\n\t},\r\n\r\n\t// @method distance(latlng1: LatLng, latlng2: LatLng): Number\r\n\t// Returns the distance between two geographical coordinates.\r\n\r\n\t// @property code: String\r\n\t// Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`)\r\n\t//\r\n\t// @property wrapLng: Number[]\r\n\t// An array of two numbers defining whether the longitude (horizontal) coordinate\r\n\t// axis wraps around a given range and how. Defaults to `[-180, 180]` in most\r\n\t// geographical CRSs. If `undefined`, the longitude axis does not wrap around.\r\n\t//\r\n\t// @property wrapLat: Number[]\r\n\t// Like `wrapLng`, but for the latitude (vertical) axis.\r\n\r\n\t// wrapLng: [min, max],\r\n\t// wrapLat: [min, max],\r\n\r\n\t// @property infinite: Boolean\r\n\t// If true, the coordinate space will be unbounded (infinite in both axes)\r\n\tinfinite: false,\r\n\r\n\t// @method wrapLatLng(latlng: LatLng): LatLng\r\n\t// Returns a `LatLng` where lat and lng has been wrapped according to the\r\n\t// CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds.\r\n\twrapLatLng: function (latlng) {\r\n\t\tvar lng = this.wrapLng ? L.Util.wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng,\r\n\t\t lat = this.wrapLat ? L.Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat,\r\n\t\t alt = latlng.alt;\r\n\r\n\t\treturn L.latLng(lat, lng, alt);\r\n\t}\r\n};\r\n\n/*\n * @namespace CRS\n * @crs L.CRS.Simple\n *\n * A simple CRS that maps longitude and latitude into `x` and `y` directly.\n * May be used for maps of flat surfaces (e.g. game maps). Note that the `y`\n * axis should still be inverted (going from bottom to top). `distance()` returns\n * simple euclidean distance.\n */\n\nL.CRS.Simple = L.extend({}, L.CRS, {\n\tprojection: L.Projection.LonLat,\n\ttransformation: new L.Transformation(1, 0, -1, 0),\n\n\tscale: function (zoom) {\n\t\treturn Math.pow(2, zoom);\n\t},\n\n\tzoom: function (scale) {\n\t\treturn Math.log(scale) / Math.LN2;\n\t},\n\n\tdistance: function (latlng1, latlng2) {\n\t\tvar dx = latlng2.lng - latlng1.lng,\n\t\t dy = latlng2.lat - latlng1.lat;\n\n\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t},\n\n\tinfinite: true\n});\n\n/*\n * @namespace CRS\n * @crs L.CRS.Earth\n *\n * Serves as the base for CRS that are global such that they cover the earth.\n * Can only be used as the base for other CRS and cannot be used directly,\n * since it does not have a `code`, `projection` or `transformation`. `distance()` returns\n * meters.\n */\n\nL.CRS.Earth = L.extend({}, L.CRS, {\n\twrapLng: [-180, 180],\n\n\t// Mean Earth Radius, as recommended for use by\n\t// the International Union of Geodesy and Geophysics,\n\t// see http://rosettacode.org/wiki/Haversine_formula\n\tR: 6371000,\n\n\t// distance between two geographical points using spherical law of cosines approximation\n\tdistance: function (latlng1, latlng2) {\n\t\tvar rad = Math.PI / 180,\n\t\t lat1 = latlng1.lat * rad,\n\t\t lat2 = latlng2.lat * rad,\n\t\t a = Math.sin(lat1) * Math.sin(lat2) +\n\t\t Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad);\n\n\t\treturn this.R * Math.acos(Math.min(a, 1));\n\t}\n});\n\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG3857\r\n *\r\n * The most common CRS for online maps, used by almost all free and commercial\r\n * tile providers. Uses Spherical Mercator projection. Set in by default in\r\n * Map's `crs` option.\r\n */\r\n\r\nL.CRS.EPSG3857 = L.extend({}, L.CRS.Earth, {\r\n\tcode: 'EPSG:3857',\r\n\tprojection: L.Projection.SphericalMercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar scale = 0.5 / (Math.PI * L.Projection.SphericalMercator.R);\r\n\t\treturn new L.Transformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\r\nL.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {\r\n\tcode: 'EPSG:900913'\r\n});\r\n\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG4326\r\n *\r\n * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.\r\n */\r\n\r\nL.CRS.EPSG4326 = L.extend({}, L.CRS.Earth, {\r\n\tcode: 'EPSG:4326',\r\n\tprojection: L.Projection.LonLat,\r\n\ttransformation: new L.Transformation(1 / 180, 1, -1 / 180, 0.5)\r\n});\r\n\n/*\r\n * @class Map\r\n * @aka L.Map\r\n * @inherits Evented\r\n *\r\n * The central class of the API — it is used to create a map on a page and manipulate it.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * // initialize the map on the \"map\" div with a given center and zoom\r\n * var map = L.map('map', {\r\n * \tcenter: [51.505, -0.09],\r\n * \tzoom: 13\r\n * });\r\n * ```\r\n *\r\n */\r\n\r\nL.Map = L.Evented.extend({\r\n\r\n\toptions: {\r\n\t\t// @section Map State Options\r\n\t\t// @option crs: CRS = L.CRS.EPSG3857\r\n\t\t// The [Coordinate Reference System](#crs) to use. Don't change this if you're not\r\n\t\t// sure what it means.\r\n\t\tcrs: L.CRS.EPSG3857,\r\n\r\n\t\t// @option center: LatLng = undefined\r\n\t\t// Initial geographic center of the map\r\n\t\tcenter: undefined,\r\n\r\n\t\t// @option zoom: Number = undefined\r\n\t\t// Initial map zoom level\r\n\t\tzoom: undefined,\r\n\r\n\t\t// @option minZoom: Number = undefined\r\n\t\t// Minimum zoom level of the map. Overrides any `minZoom` option set on map layers.\r\n\t\tminZoom: undefined,\r\n\r\n\t\t// @option maxZoom: Number = undefined\r\n\t\t// Maximum zoom level of the map. Overrides any `maxZoom` option set on map layers.\r\n\t\tmaxZoom: undefined,\r\n\r\n\t\t// @option layers: Layer[] = []\r\n\t\t// Array of layers that will be added to the map initially\r\n\t\tlayers: [],\r\n\r\n\t\t// @option maxBounds: LatLngBounds = null\r\n\t\t// When this option is set, the map restricts the view to the given\r\n\t\t// geographical bounds, bouncing the user back when he tries to pan\r\n\t\t// outside the view. To set the restriction dynamically, use\r\n\t\t// [`setMaxBounds`](#map-setmaxbounds) method.\r\n\t\tmaxBounds: undefined,\r\n\r\n\t\t// @option renderer: Renderer = *\r\n\t\t// The default method for drawing vector layers on the map. `L.SVG`\r\n\t\t// or `L.Canvas` by default depending on browser support.\r\n\t\trenderer: undefined,\r\n\r\n\r\n\t\t// @section Animation Options\r\n\t\t// @option fadeAnimation: Boolean = true\r\n\t\t// Whether the tile fade animation is enabled. By default it's enabled\r\n\t\t// in all browsers that support CSS3 Transitions except Android.\r\n\t\tfadeAnimation: true,\r\n\r\n\t\t// @option markerZoomAnimation: Boolean = true\r\n\t\t// Whether markers animate their zoom with the zoom animation, if disabled\r\n\t\t// they will disappear for the length of the animation. By default it's\r\n\t\t// enabled in all browsers that support CSS3 Transitions except Android.\r\n\t\tmarkerZoomAnimation: true,\r\n\r\n\t\t// @option transform3DLimit: Number = 2^23\r\n\t\t// Defines the maximum size of a CSS translation transform. The default\r\n\t\t// value should not be changed unless a web browser positions layers in\r\n\t\t// the wrong place after doing a large `panBy`.\r\n\t\ttransform3DLimit: 8388608, // Precision limit of a 32-bit float\r\n\r\n\t\t// @section Interaction Options\r\n\t\t// @option zoomSnap: Number = 1\r\n\t\t// Forces the map's zoom level to always be a multiple of this, particularly\r\n\t\t// right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom.\r\n\t\t// By default, the zoom level snaps to the nearest integer; lower values\r\n\t\t// (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0`\r\n\t\t// means the zoom level will not be snapped after `fitBounds` or a pinch-zoom.\r\n\t\tzoomSnap: 1,\r\n\r\n\t\t// @option zoomDelta: Number = 1\r\n\t\t// Controls how much the map's zoom level will change after a\r\n\t\t// [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+`\r\n\t\t// or `-` on the keyboard, or using the [zoom controls](#control-zoom).\r\n\t\t// Values smaller than `1` (e.g. `0.5`) allow for greater granularity.\r\n\t\tzoomDelta: 1,\r\n\r\n\t\t// @option trackResize: Boolean = true\r\n\t\t// Whether the map automatically handles browser window resize to update itself.\r\n\t\ttrackResize: true\r\n\t},\r\n\r\n\tinitialize: function (id, options) { // (HTMLElement or String, Object)\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\tthis._initContainer(id);\r\n\t\tthis._initLayout();\r\n\r\n\t\t// hack for https://github.com/Leaflet/Leaflet/issues/1980\r\n\t\tthis._onResize = L.bind(this._onResize, this);\r\n\r\n\t\tthis._initEvents();\r\n\r\n\t\tif (options.maxBounds) {\r\n\t\t\tthis.setMaxBounds(options.maxBounds);\r\n\t\t}\r\n\r\n\t\tif (options.zoom !== undefined) {\r\n\t\t\tthis._zoom = this._limitZoom(options.zoom);\r\n\t\t}\r\n\r\n\t\tif (options.center && options.zoom !== undefined) {\r\n\t\t\tthis.setView(L.latLng(options.center), options.zoom, {reset: true});\r\n\t\t}\r\n\r\n\t\tthis._handlers = [];\r\n\t\tthis._layers = {};\r\n\t\tthis._zoomBoundLayers = {};\r\n\t\tthis._sizeChanged = true;\r\n\r\n\t\tthis.callInitHooks();\r\n\r\n\t\tthis._addLayers(this.options.layers);\r\n\t},\r\n\r\n\r\n\t// @section Methods for modifying map state\r\n\r\n\t// @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this\r\n\t// Sets the view of the map (geographical center and zoom) with the given\r\n\t// animation options.\r\n\tsetView: function (center, zoom) {\r\n\t\t// replaced by animation-powered implementation in Map.PanAnimation.js\r\n\t\tzoom = zoom === undefined ? this.getZoom() : zoom;\r\n\t\tthis._resetView(L.latLng(center), zoom);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setZoom(zoom: Number, options: Zoom/pan options): this\r\n\t// Sets the zoom of the map.\r\n\tsetZoom: function (zoom, options) {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthis._zoom = zoom;\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\treturn this.setView(this.getCenter(), zoom, {zoom: options});\r\n\t},\r\n\r\n\t// @method zoomIn(delta?: Number, options?: Zoom options): this\r\n\t// Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).\r\n\tzoomIn: function (delta, options) {\r\n\t\tdelta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1);\r\n\t\treturn this.setZoom(this._zoom + delta, options);\r\n\t},\r\n\r\n\t// @method zoomOut(delta?: Number, options?: Zoom options): this\r\n\t// Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).\r\n\tzoomOut: function (delta, options) {\r\n\t\tdelta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1);\r\n\t\treturn this.setZoom(this._zoom - delta, options);\r\n\t},\r\n\r\n\t// @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this\r\n\t// Zooms the map while keeping a specified geographical point on the map\r\n\t// stationary (e.g. used internally for scroll zoom and double-click zoom).\r\n\t// @alternative\r\n\t// @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this\r\n\t// Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.\r\n\tsetZoomAround: function (latlng, zoom, options) {\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t viewHalf = this.getSize().divideBy(2),\r\n\t\t containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),\r\n\r\n\t\t centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),\r\n\t\t newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));\r\n\r\n\t\treturn this.setView(newCenter, zoom, {zoom: options});\r\n\t},\r\n\r\n\t_getBoundsCenterZoom: function (bounds, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tbounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);\r\n\r\n\t\tvar paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),\r\n\t\t paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),\r\n\r\n\t\t zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));\r\n\r\n\t\tzoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom;\r\n\r\n\t\tvar paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),\r\n\r\n\t\t swPoint = this.project(bounds.getSouthWest(), zoom),\r\n\t\t nePoint = this.project(bounds.getNorthEast(), zoom),\r\n\t\t center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);\r\n\r\n\t\treturn {\r\n\t\t\tcenter: center,\r\n\t\t\tzoom: zoom\r\n\t\t};\r\n\t},\r\n\r\n\t// @method fitBounds(bounds: LatLngBounds, options: fitBounds options): this\r\n\t// Sets a map view that contains the given geographical bounds with the\r\n\t// maximum zoom level possible.\r\n\tfitBounds: function (bounds, options) {\r\n\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tif (!bounds.isValid()) {\r\n\t\t\tthrow new Error('Bounds are not valid.');\r\n\t\t}\r\n\r\n\t\tvar target = this._getBoundsCenterZoom(bounds, options);\r\n\t\treturn this.setView(target.center, target.zoom, options);\r\n\t},\r\n\r\n\t// @method fitWorld(options?: fitBounds options): this\r\n\t// Sets a map view that mostly contains the whole world with the maximum\r\n\t// zoom level possible.\r\n\tfitWorld: function (options) {\r\n\t\treturn this.fitBounds([[-90, -180], [90, 180]], options);\r\n\t},\r\n\r\n\t// @method panTo(latlng: LatLng, options?: Pan options): this\r\n\t// Pans the map to a given center.\r\n\tpanTo: function (center, options) { // (LatLng)\r\n\t\treturn this.setView(center, this._zoom, {pan: options});\r\n\t},\r\n\r\n\t// @method panBy(offset: Point): this\r\n\t// Pans the map by a given number of pixels (animated).\r\n\tpanBy: function (offset) { // (Point)\r\n\t\t// replaced with animated panBy in Map.PanAnimation.js\r\n\t\tthis.fire('movestart');\r\n\r\n\t\tthis._rawPanBy(L.point(offset));\r\n\r\n\t\tthis.fire('move');\r\n\t\treturn this.fire('moveend');\r\n\t},\r\n\r\n\t// @method setMaxBounds(bounds: Bounds): this\r\n\t// Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option).\r\n\tsetMaxBounds: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tif (!bounds.isValid()) {\r\n\t\t\tthis.options.maxBounds = null;\r\n\t\t\treturn this.off('moveend', this._panInsideMaxBounds);\r\n\t\t} else if (this.options.maxBounds) {\r\n\t\t\tthis.off('moveend', this._panInsideMaxBounds);\r\n\t\t}\r\n\r\n\t\tthis.options.maxBounds = bounds;\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._panInsideMaxBounds();\r\n\t\t}\r\n\r\n\t\treturn this.on('moveend', this._panInsideMaxBounds);\r\n\t},\r\n\r\n\t// @method setMinZoom(zoom: Number): this\r\n\t// Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option).\r\n\tsetMinZoom: function (zoom) {\r\n\t\tthis.options.minZoom = zoom;\r\n\r\n\t\tif (this._loaded && this.getZoom() < this.options.minZoom) {\r\n\t\t\treturn this.setZoom(zoom);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setMaxZoom(zoom: Number): this\r\n\t// Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option).\r\n\tsetMaxZoom: function (zoom) {\r\n\t\tthis.options.maxZoom = zoom;\r\n\r\n\t\tif (this._loaded && (this.getZoom() > this.options.maxZoom)) {\r\n\t\t\treturn this.setZoom(zoom);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this\r\n\t// Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.\r\n\tpanInsideBounds: function (bounds, options) {\r\n\t\tthis._enforcingBounds = true;\r\n\t\tvar center = this.getCenter(),\r\n\t\t newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds));\r\n\r\n\t\tif (!center.equals(newCenter)) {\r\n\t\t\tthis.panTo(newCenter, options);\r\n\t\t}\r\n\r\n\t\tthis._enforcingBounds = false;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method invalidateSize(options: Zoom/Pan options): this\r\n\t// Checks if the map container size changed and updates the map if so —\r\n\t// call it after you've changed the map size dynamically, also animating\r\n\t// pan by default. If `options.pan` is `false`, panning will not occur.\r\n\t// If `options.debounceMoveend` is `true`, it will delay `moveend` event so\r\n\t// that it doesn't happen often even if the method is called many\r\n\t// times in a row.\r\n\r\n\t// @alternative\r\n\t// @method invalidateSize(animate: Boolean): this\r\n\t// Checks if the map container size changed and updates the map if so —\r\n\t// call it after you've changed the map size dynamically, also animating\r\n\t// pan by default.\r\n\tinvalidateSize: function (options) {\r\n\t\tif (!this._loaded) { return this; }\r\n\r\n\t\toptions = L.extend({\r\n\t\t\tanimate: false,\r\n\t\t\tpan: true\r\n\t\t}, options === true ? {animate: true} : options);\r\n\r\n\t\tvar oldSize = this.getSize();\r\n\t\tthis._sizeChanged = true;\r\n\t\tthis._lastCenter = null;\r\n\r\n\t\tvar newSize = this.getSize(),\r\n\t\t oldCenter = oldSize.divideBy(2).round(),\r\n\t\t newCenter = newSize.divideBy(2).round(),\r\n\t\t offset = oldCenter.subtract(newCenter);\r\n\r\n\t\tif (!offset.x && !offset.y) { return this; }\r\n\r\n\t\tif (options.animate && options.pan) {\r\n\t\t\tthis.panBy(offset);\r\n\r\n\t\t} else {\r\n\t\t\tif (options.pan) {\r\n\t\t\t\tthis._rawPanBy(offset);\r\n\t\t\t}\r\n\r\n\t\t\tthis.fire('move');\r\n\r\n\t\t\tif (options.debounceMoveend) {\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\tthis._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);\r\n\t\t\t} else {\r\n\t\t\t\tthis.fire('moveend');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// @section Map state change events\r\n\t\t// @event resize: ResizeEvent\r\n\t\t// Fired when the map is resized.\r\n\t\treturn this.fire('resize', {\r\n\t\t\toldSize: oldSize,\r\n\t\t\tnewSize: newSize\r\n\t\t});\r\n\t},\r\n\r\n\t// @section Methods for modifying map state\r\n\t// @method stop(): this\r\n\t// Stops the currently running `panTo` or `flyTo` animation, if any.\r\n\tstop: function () {\r\n\t\tthis.setZoom(this._limitZoom(this._zoom));\r\n\t\tif (!this.options.zoomSnap) {\r\n\t\t\tthis.fire('viewreset');\r\n\t\t}\r\n\t\treturn this._stop();\r\n\t},\r\n\r\n\r\n\t// TODO handler.addTo\r\n\t// TODO Appropiate docs section?\r\n\t// @section Other Methods\r\n\t// @method addHandler(name: String, HandlerClass: Function): this\r\n\t// Adds a new `Handler` to the map, given its name and constructor function.\r\n\taddHandler: function (name, HandlerClass) {\r\n\t\tif (!HandlerClass) { return this; }\r\n\r\n\t\tvar handler = this[name] = new HandlerClass(this);\r\n\r\n\t\tthis._handlers.push(handler);\r\n\r\n\t\tif (this.options[name]) {\r\n\t\t\thandler.enable();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method remove(): this\r\n\t// Destroys the map and clears all related event listeners.\r\n\tremove: function () {\r\n\r\n\t\tthis._initEvents(true);\r\n\r\n\t\tif (this._containerId !== this._container._leaflet_id) {\r\n\t\t\tthrow new Error('Map container is being reused by another instance');\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\t// throws error in IE6-8\r\n\t\t\tdelete this._container._leaflet_id;\r\n\t\t\tdelete this._containerId;\r\n\t\t} catch (e) {\r\n\t\t\t/*eslint-disable */\r\n\t\t\tthis._container._leaflet_id = undefined;\r\n\t\t\t/*eslint-enable */\r\n\t\t\tthis._containerId = undefined;\r\n\t\t}\r\n\r\n\t\tL.DomUtil.remove(this._mapPane);\r\n\r\n\t\tif (this._clearControlPos) {\r\n\t\t\tthis._clearControlPos();\r\n\t\t}\r\n\r\n\t\tthis._clearHandlers();\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\t// @section Map state change events\r\n\t\t\t// @event unload: Event\r\n\t\t\t// Fired when the map is destroyed with [remove](#map-remove) method.\r\n\t\t\tthis.fire('unload');\r\n\t\t}\r\n\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tthis._layers[i].remove();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\t// @method createPane(name: String, container?: HTMLElement): HTMLElement\r\n\t// Creates a new [map pane](#map-pane) with the given name if it doesn't exist already,\r\n\t// then returns it. The pane is created as a children of `container`, or\r\n\t// as a children of the main map pane if not set.\r\n\tcreatePane: function (name, container) {\r\n\t\tvar className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''),\r\n\t\t pane = L.DomUtil.create('div', className, container || this._mapPane);\r\n\r\n\t\tif (name) {\r\n\t\t\tthis._panes[name] = pane;\r\n\t\t}\r\n\t\treturn pane;\r\n\t},\r\n\r\n\t// @section Methods for Getting Map State\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the geographical center of the map view\r\n\tgetCenter: function () {\r\n\t\tthis._checkIfLoaded();\r\n\r\n\t\tif (this._lastCenter && !this._moved()) {\r\n\t\t\treturn this._lastCenter;\r\n\t\t}\r\n\t\treturn this.layerPointToLatLng(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// @method getZoom(): Number\r\n\t// Returns the current zoom level of the map view\r\n\tgetZoom: function () {\r\n\t\treturn this._zoom;\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Returns the geographical bounds visible in the current map view\r\n\tgetBounds: function () {\r\n\t\tvar bounds = this.getPixelBounds(),\r\n\t\t sw = this.unproject(bounds.getBottomLeft()),\r\n\t\t ne = this.unproject(bounds.getTopRight());\r\n\r\n\t\treturn new L.LatLngBounds(sw, ne);\r\n\t},\r\n\r\n\t// @method getMinZoom(): Number\r\n\t// Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default.\r\n\tgetMinZoom: function () {\r\n\t\treturn this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom;\r\n\t},\r\n\r\n\t// @method getMaxZoom(): Number\r\n\t// Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers).\r\n\tgetMaxZoom: function () {\r\n\t\treturn this.options.maxZoom === undefined ?\r\n\t\t\t(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :\r\n\t\t\tthis.options.maxZoom;\r\n\t},\r\n\r\n\t// @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean): Number\r\n\t// Returns the maximum zoom level on which the given bounds fit to the map\r\n\t// view in its entirety. If `inside` (optional) is set to `true`, the method\r\n\t// instead returns the minimum zoom level on which the map view fits into\r\n\t// the given bounds in its entirety.\r\n\tgetBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\t\tpadding = L.point(padding || [0, 0]);\r\n\r\n\t\tvar zoom = this.getZoom() || 0,\r\n\t\t min = this.getMinZoom(),\r\n\t\t max = this.getMaxZoom(),\r\n\t\t nw = bounds.getNorthWest(),\r\n\t\t se = bounds.getSouthEast(),\r\n\t\t size = this.getSize().subtract(padding),\r\n\t\t boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)),\r\n\t\t snap = L.Browser.any3d ? this.options.zoomSnap : 1;\r\n\r\n\t\tvar scale = Math.min(size.x / boundsSize.x, size.y / boundsSize.y);\r\n\t\tzoom = this.getScaleZoom(scale, zoom);\r\n\r\n\t\tif (snap) {\r\n\t\t\tzoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level\r\n\t\t\tzoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap;\r\n\t\t}\r\n\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t},\r\n\r\n\t// @method getSize(): Point\r\n\t// Returns the current size of the map container (in pixels).\r\n\tgetSize: function () {\r\n\t\tif (!this._size || this._sizeChanged) {\r\n\t\t\tthis._size = new L.Point(\r\n\t\t\t\tthis._container.clientWidth,\r\n\t\t\t\tthis._container.clientHeight);\r\n\r\n\t\t\tthis._sizeChanged = false;\r\n\t\t}\r\n\t\treturn this._size.clone();\r\n\t},\r\n\r\n\t// @method getPixelBounds(): Bounds\r\n\t// Returns the bounds of the current map view in projected pixel\r\n\t// coordinates (sometimes useful in layer and overlay implementations).\r\n\tgetPixelBounds: function (center, zoom) {\r\n\t\tvar topLeftPoint = this._getTopLeftPoint(center, zoom);\r\n\t\treturn new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));\r\n\t},\r\n\r\n\t// TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to\r\n\t// the map pane? \"left point of the map layer\" can be confusing, specially\r\n\t// since there can be negative offsets.\r\n\t// @method getPixelOrigin(): Point\r\n\t// Returns the projected pixel coordinates of the top left point of\r\n\t// the map layer (useful in custom layer and overlay implementations).\r\n\tgetPixelOrigin: function () {\r\n\t\tthis._checkIfLoaded();\r\n\t\treturn this._pixelOrigin;\r\n\t},\r\n\r\n\t// @method getPixelWorldBounds(zoom?: Number): Bounds\r\n\t// Returns the world's bounds in pixel coordinates for zoom level `zoom`.\r\n\t// If `zoom` is omitted, the map's current zoom level is used.\r\n\tgetPixelWorldBounds: function (zoom) {\r\n\t\treturn this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom);\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\r\n\t// @method getPane(pane: String|HTMLElement): HTMLElement\r\n\t// Returns a [map pane](#map-pane), given its name or its HTML element (its identity).\r\n\tgetPane: function (pane) {\r\n\t\treturn typeof pane === 'string' ? this._panes[pane] : pane;\r\n\t},\r\n\r\n\t// @method getPanes(): Object\r\n\t// Returns a plain object containing the names of all [panes](#map-pane) as keys and\r\n\t// the panes as values.\r\n\tgetPanes: function () {\r\n\t\treturn this._panes;\r\n\t},\r\n\r\n\t// @method getContainer: HTMLElement\r\n\t// Returns the HTML element that contains the map.\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\r\n\t// @section Conversion Methods\r\n\r\n\t// @method getZoomScale(toZoom: Number, fromZoom: Number): Number\r\n\t// Returns the scale factor to be applied to a map transition from zoom level\r\n\t// `fromZoom` to `toZoom`. Used internally to help with zoom animations.\r\n\tgetZoomScale: function (toZoom, fromZoom) {\r\n\t\t// TODO replace with universal implementation after refactoring projections\r\n\t\tvar crs = this.options.crs;\r\n\t\tfromZoom = fromZoom === undefined ? this._zoom : fromZoom;\r\n\t\treturn crs.scale(toZoom) / crs.scale(fromZoom);\r\n\t},\r\n\r\n\t// @method getScaleZoom(scale: Number, fromZoom: Number): Number\r\n\t// Returns the zoom level that the map would end up at, if it is at `fromZoom`\r\n\t// level and everything is scaled by a factor of `scale`. Inverse of\r\n\t// [`getZoomScale`](#map-getZoomScale).\r\n\tgetScaleZoom: function (scale, fromZoom) {\r\n\t\tvar crs = this.options.crs;\r\n\t\tfromZoom = fromZoom === undefined ? this._zoom : fromZoom;\r\n\t\tvar zoom = crs.zoom(scale * crs.scale(fromZoom));\r\n\t\treturn isNaN(zoom) ? Infinity : zoom;\r\n\t},\r\n\r\n\t// @method project(latlng: LatLng, zoom: Number): Point\r\n\t// Projects a geographical coordinate `LatLng` according to the projection\r\n\t// of the map's CRS, then scales it according to `zoom` and the CRS's\r\n\t// `Transformation`. The result is pixel coordinate relative to\r\n\t// the CRS origin.\r\n\tproject: function (latlng, zoom) {\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.latLngToPoint(L.latLng(latlng), zoom);\r\n\t},\r\n\r\n\t// @method unproject(point: Point, zoom: Number): LatLng\r\n\t// Inverse of [`project`](#map-project).\r\n\tunproject: function (point, zoom) {\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.pointToLatLng(L.point(point), zoom);\r\n\t},\r\n\r\n\t// @method layerPointToLatLng(point: Point): LatLng\r\n\t// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),\r\n\t// returns the corresponding geographical coordinate (for the current zoom level).\r\n\tlayerPointToLatLng: function (point) {\r\n\t\tvar projectedPoint = L.point(point).add(this.getPixelOrigin());\r\n\t\treturn this.unproject(projectedPoint);\r\n\t},\r\n\r\n\t// @method latLngToLayerPoint(latlng: LatLng): Point\r\n\t// Given a geographical coordinate, returns the corresponding pixel coordinate\r\n\t// relative to the [origin pixel](#map-getpixelorigin).\r\n\tlatLngToLayerPoint: function (latlng) {\r\n\t\tvar projectedPoint = this.project(L.latLng(latlng))._round();\r\n\t\treturn projectedPoint._subtract(this.getPixelOrigin());\r\n\t},\r\n\r\n\t// @method wrapLatLng(latlng: LatLng): LatLng\r\n\t// Returns a `LatLng` where `lat` and `lng` has been wrapped according to the\r\n\t// map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the\r\n\t// CRS's bounds.\r\n\t// By default this means longitude is wrapped around the dateline so its\r\n\t// value is between -180 and +180 degrees.\r\n\twrapLatLng: function (latlng) {\r\n\t\treturn this.options.crs.wrapLatLng(L.latLng(latlng));\r\n\t},\r\n\r\n\t// @method distance(latlng1: LatLng, latlng2: LatLng): Number\r\n\t// Returns the distance between two geographical coordinates according to\r\n\t// the map's CRS. By default this measures distance in meters.\r\n\tdistance: function (latlng1, latlng2) {\r\n\t\treturn this.options.crs.distance(L.latLng(latlng1), L.latLng(latlng2));\r\n\t},\r\n\r\n\t// @method containerPointToLayerPoint(point: Point): Point\r\n\t// Given a pixel coordinate relative to the map container, returns the corresponding\r\n\t// pixel coordinate relative to the [origin pixel](#map-getpixelorigin).\r\n\tcontainerPointToLayerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t// @method layerPointToContainerPoint(point: Point): Point\r\n\t// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),\r\n\t// returns the corresponding pixel coordinate relative to the map container.\r\n\tlayerPointToContainerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).add(this._getMapPanePos());\r\n\t},\r\n\r\n\t// @method containerPointToLatLng(point: Point): Point\r\n\t// Given a pixel coordinate relative to the map container, returns\r\n\t// the corresponding geographical coordinate (for the current zoom level).\r\n\tcontainerPointToLatLng: function (point) {\r\n\t\tvar layerPoint = this.containerPointToLayerPoint(L.point(point));\r\n\t\treturn this.layerPointToLatLng(layerPoint);\r\n\t},\r\n\r\n\t// @method latLngToContainerPoint(latlng: LatLng): Point\r\n\t// Given a geographical coordinate, returns the corresponding pixel coordinate\r\n\t// relative to the map container.\r\n\tlatLngToContainerPoint: function (latlng) {\r\n\t\treturn this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));\r\n\t},\r\n\r\n\t// @method mouseEventToContainerPoint(ev: MouseEvent): Point\r\n\t// Given a MouseEvent object, returns the pixel coordinate relative to the\r\n\t// map container where the event took place.\r\n\tmouseEventToContainerPoint: function (e) {\r\n\t\treturn L.DomEvent.getMousePosition(e, this._container);\r\n\t},\r\n\r\n\t// @method mouseEventToLayerPoint(ev: MouseEvent): Point\r\n\t// Given a MouseEvent object, returns the pixel coordinate relative to\r\n\t// the [origin pixel](#map-getpixelorigin) where the event took place.\r\n\tmouseEventToLayerPoint: function (e) {\r\n\t\treturn this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));\r\n\t},\r\n\r\n\t// @method mouseEventToLatLng(ev: MouseEvent): LatLng\r\n\t// Given a MouseEvent object, returns geographical coordinate where the\r\n\t// event took place.\r\n\tmouseEventToLatLng: function (e) { // (MouseEvent)\r\n\t\treturn this.layerPointToLatLng(this.mouseEventToLayerPoint(e));\r\n\t},\r\n\r\n\r\n\t// map initialization methods\r\n\r\n\t_initContainer: function (id) {\r\n\t\tvar container = this._container = L.DomUtil.get(id);\r\n\r\n\t\tif (!container) {\r\n\t\t\tthrow new Error('Map container not found.');\r\n\t\t} else if (container._leaflet_id) {\r\n\t\t\tthrow new Error('Map container is already initialized.');\r\n\t\t}\r\n\r\n\t\tL.DomEvent.addListener(container, 'scroll', this._onScroll, this);\r\n\t\tthis._containerId = L.Util.stamp(container);\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar container = this._container;\r\n\r\n\t\tthis._fadeAnimated = this.options.fadeAnimation && L.Browser.any3d;\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-container' +\r\n\t\t\t(L.Browser.touch ? ' leaflet-touch' : '') +\r\n\t\t\t(L.Browser.retina ? ' leaflet-retina' : '') +\r\n\t\t\t(L.Browser.ielt9 ? ' leaflet-oldie' : '') +\r\n\t\t\t(L.Browser.safari ? ' leaflet-safari' : '') +\r\n\t\t\t(this._fadeAnimated ? ' leaflet-fade-anim' : ''));\r\n\r\n\t\tvar position = L.DomUtil.getStyle(container, 'position');\r\n\r\n\t\tif (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {\r\n\t\t\tcontainer.style.position = 'relative';\r\n\t\t}\r\n\r\n\t\tthis._initPanes();\r\n\r\n\t\tif (this._initControlPos) {\r\n\t\t\tthis._initControlPos();\r\n\t\t}\r\n\t},\r\n\r\n\t_initPanes: function () {\r\n\t\tvar panes = this._panes = {};\r\n\t\tthis._paneRenderers = {};\r\n\r\n\t\t// @section\r\n\t\t//\r\n\t\t// Panes are DOM elements used to control the ordering of layers on the map. You\r\n\t\t// can access panes with [`map.getPane`](#map-getpane) or\r\n\t\t// [`map.getPanes`](#map-getpanes) methods. New panes can be created with the\r\n\t\t// [`map.createPane`](#map-createpane) method.\r\n\t\t//\r\n\t\t// Every map has the following default panes that differ only in zIndex.\r\n\t\t//\r\n\t\t// @pane mapPane: HTMLElement = 'auto'\r\n\t\t// Pane that contains all other map panes\r\n\r\n\t\tthis._mapPane = this.createPane('mapPane', this._container);\r\n\t\tL.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));\r\n\r\n\t\t// @pane tilePane: HTMLElement = 200\r\n\t\t// Pane for `GridLayer`s and `TileLayer`s\r\n\t\tthis.createPane('tilePane');\r\n\t\t// @pane overlayPane: HTMLElement = 400\r\n\t\t// Pane for vector overlays (`Path`s), like `Polyline`s and `Polygon`s\r\n\t\tthis.createPane('shadowPane');\r\n\t\t// @pane shadowPane: HTMLElement = 500\r\n\t\t// Pane for overlay shadows (e.g. `Marker` shadows)\r\n\t\tthis.createPane('overlayPane');\r\n\t\t// @pane markerPane: HTMLElement = 600\r\n\t\t// Pane for `Icon`s of `Marker`s\r\n\t\tthis.createPane('markerPane');\r\n\t\t// @pane tooltipPane: HTMLElement = 650\r\n\t\t// Pane for tooltip.\r\n\t\tthis.createPane('tooltipPane');\r\n\t\t// @pane popupPane: HTMLElement = 700\r\n\t\t// Pane for `Popup`s.\r\n\t\tthis.createPane('popupPane');\r\n\r\n\t\tif (!this.options.markerZoomAnimation) {\r\n\t\t\tL.DomUtil.addClass(panes.markerPane, 'leaflet-zoom-hide');\r\n\t\t\tL.DomUtil.addClass(panes.shadowPane, 'leaflet-zoom-hide');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// private methods that modify map state\r\n\r\n\t// @section Map state change events\r\n\t_resetView: function (center, zoom) {\r\n\t\tL.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));\r\n\r\n\t\tvar loading = !this._loaded;\r\n\t\tthis._loaded = true;\r\n\t\tzoom = this._limitZoom(zoom);\r\n\r\n\t\tthis.fire('viewprereset');\r\n\r\n\t\tvar zoomChanged = this._zoom !== zoom;\r\n\t\tthis\r\n\t\t\t._moveStart(zoomChanged)\r\n\t\t\t._move(center, zoom)\r\n\t\t\t._moveEnd(zoomChanged);\r\n\r\n\t\t// @event viewreset: Event\r\n\t\t// Fired when the map needs to redraw its content (this usually happens\r\n\t\t// on map zoom or load). Very useful for creating custom overlays.\r\n\t\tthis.fire('viewreset');\r\n\r\n\t\t// @event load: Event\r\n\t\t// Fired when the map is initialized (when its center and zoom are set\r\n\t\t// for the first time).\r\n\t\tif (loading) {\r\n\t\t\tthis.fire('load');\r\n\t\t}\r\n\t},\r\n\r\n\t_moveStart: function (zoomChanged) {\r\n\t\t// @event zoomstart: Event\r\n\t\t// Fired when the map zoom is about to change (e.g. before zoom animation).\r\n\t\t// @event movestart: Event\r\n\t\t// Fired when the view of the map starts changing (e.g. user starts dragging the map).\r\n\t\tif (zoomChanged) {\r\n\t\t\tthis.fire('zoomstart');\r\n\t\t}\r\n\t\treturn this.fire('movestart');\r\n\t},\r\n\r\n\t_move: function (center, zoom, data) {\r\n\t\tif (zoom === undefined) {\r\n\t\t\tzoom = this._zoom;\r\n\t\t}\r\n\t\tvar zoomChanged = this._zoom !== zoom;\r\n\r\n\t\tthis._zoom = zoom;\r\n\t\tthis._lastCenter = center;\r\n\t\tthis._pixelOrigin = this._getNewPixelOrigin(center);\r\n\r\n\t\t// @event zoom: Event\r\n\t\t// Fired repeatedly during any change in zoom level, including zoom\r\n\t\t// and fly animations.\r\n\t\tif (zoomChanged || (data && data.pinch)) {\t// Always fire 'zoom' if pinching because #3530\r\n\t\t\tthis.fire('zoom', data);\r\n\t\t}\r\n\r\n\t\t// @event move: Event\r\n\t\t// Fired repeatedly during any movement of the map, including pan and\r\n\t\t// fly animations.\r\n\t\treturn this.fire('move', data);\r\n\t},\r\n\r\n\t_moveEnd: function (zoomChanged) {\r\n\t\t// @event zoomend: Event\r\n\t\t// Fired when the map has changed, after any animations.\r\n\t\tif (zoomChanged) {\r\n\t\t\tthis.fire('zoomend');\r\n\t\t}\r\n\r\n\t\t// @event moveend: Event\r\n\t\t// Fired when the center of the map stops changing (e.g. user stopped\r\n\t\t// dragging the map).\r\n\t\treturn this.fire('moveend');\r\n\t},\r\n\r\n\t_stop: function () {\r\n\t\tL.Util.cancelAnimFrame(this._flyToFrame);\r\n\t\tif (this._panAnim) {\r\n\t\t\tthis._panAnim.stop();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_rawPanBy: function (offset) {\r\n\t\tL.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));\r\n\t},\r\n\r\n\t_getZoomSpan: function () {\r\n\t\treturn this.getMaxZoom() - this.getMinZoom();\r\n\t},\r\n\r\n\t_panInsideMaxBounds: function () {\r\n\t\tif (!this._enforcingBounds) {\r\n\t\t\tthis.panInsideBounds(this.options.maxBounds);\r\n\t\t}\r\n\t},\r\n\r\n\t_checkIfLoaded: function () {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthrow new Error('Set map center and zoom first.');\r\n\t\t}\r\n\t},\r\n\r\n\t// DOM event handling\r\n\r\n\t// @section Interaction events\r\n\t_initEvents: function (remove) {\r\n\t\tif (!L.DomEvent) { return; }\r\n\r\n\t\tthis._targets = {};\r\n\t\tthis._targets[L.stamp(this._container)] = this;\r\n\r\n\t\tvar onOff = remove ? 'off' : 'on';\r\n\r\n\t\t// @event click: MouseEvent\r\n\t\t// Fired when the user clicks (or taps) the map.\r\n\t\t// @event dblclick: MouseEvent\r\n\t\t// Fired when the user double-clicks (or double-taps) the map.\r\n\t\t// @event mousedown: MouseEvent\r\n\t\t// Fired when the user pushes the mouse button on the map.\r\n\t\t// @event mouseup: MouseEvent\r\n\t\t// Fired when the user releases the mouse button on the map.\r\n\t\t// @event mouseover: MouseEvent\r\n\t\t// Fired when the mouse enters the map.\r\n\t\t// @event mouseout: MouseEvent\r\n\t\t// Fired when the mouse leaves the map.\r\n\t\t// @event mousemove: MouseEvent\r\n\t\t// Fired while the mouse moves over the map.\r\n\t\t// @event contextmenu: MouseEvent\r\n\t\t// Fired when the user pushes the right mouse button on the map, prevents\r\n\t\t// default browser context menu from showing if there are listeners on\r\n\t\t// this event. Also fired on mobile when the user holds a single touch\r\n\t\t// for a second (also called long press).\r\n\t\t// @event keypress: KeyboardEvent\r\n\t\t// Fired when the user presses a key from the keyboard while the map is focused.\r\n\t\tL.DomEvent[onOff](this._container, 'click dblclick mousedown mouseup ' +\r\n\t\t\t'mouseover mouseout mousemove contextmenu keypress', this._handleDOMEvent, this);\r\n\r\n\t\tif (this.options.trackResize) {\r\n\t\t\tL.DomEvent[onOff](window, 'resize', this._onResize, this);\r\n\t\t}\r\n\r\n\t\tif (L.Browser.any3d && this.options.transform3DLimit) {\r\n\t\t\tthis[onOff]('moveend', this._onMoveEnd);\r\n\t\t}\r\n\t},\r\n\r\n\t_onResize: function () {\r\n\t\tL.Util.cancelAnimFrame(this._resizeRequest);\r\n\t\tthis._resizeRequest = L.Util.requestAnimFrame(\r\n\t\t function () { this.invalidateSize({debounceMoveend: true}); }, this);\r\n\t},\r\n\r\n\t_onScroll: function () {\r\n\t\tthis._container.scrollTop = 0;\r\n\t\tthis._container.scrollLeft = 0;\r\n\t},\r\n\r\n\t_onMoveEnd: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\tif (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) {\r\n\t\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have\r\n\t\t\t// a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/\r\n\t\t\tthis._resetView(this.getCenter(), this.getZoom());\r\n\t\t}\r\n\t},\r\n\r\n\t_findEventTargets: function (e, type) {\r\n\t\tvar targets = [],\r\n\t\t target,\r\n\t\t isHover = type === 'mouseout' || type === 'mouseover',\r\n\t\t src = e.target || e.srcElement,\r\n\t\t dragging = false;\r\n\r\n\t\twhile (src) {\r\n\t\t\ttarget = this._targets[L.stamp(src)];\r\n\t\t\tif (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) {\r\n\t\t\t\t// Prevent firing click after you just dragged an object.\r\n\t\t\t\tdragging = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (target && target.listens(type, true)) {\r\n\t\t\t\tif (isHover && !L.DomEvent._isExternalTarget(src, e)) { break; }\r\n\t\t\t\ttargets.push(target);\r\n\t\t\t\tif (isHover) { break; }\r\n\t\t\t}\r\n\t\t\tif (src === this._container) { break; }\r\n\t\t\tsrc = src.parentNode;\r\n\t\t}\r\n\t\tif (!targets.length && !dragging && !isHover && L.DomEvent._isExternalTarget(src, e)) {\r\n\t\t\ttargets = [this];\r\n\t\t}\r\n\t\treturn targets;\r\n\t},\r\n\r\n\t_handleDOMEvent: function (e) {\r\n\t\tif (!this._loaded || L.DomEvent._skipped(e)) { return; }\r\n\r\n\t\tvar type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type;\r\n\r\n\t\tif (type === 'mousedown') {\r\n\t\t\t// prevents outline when clicking on keyboard-focusable element\r\n\t\t\tL.DomUtil.preventOutline(e.target || e.srcElement);\r\n\t\t}\r\n\r\n\t\tthis._fireDOMEvent(e, type);\r\n\t},\r\n\r\n\t_fireDOMEvent: function (e, type, targets) {\r\n\r\n\t\tif (e.type === 'click') {\r\n\t\t\t// Fire a synthetic 'preclick' event which propagates up (mainly for closing popups).\r\n\t\t\t// @event preclick: MouseEvent\r\n\t\t\t// Fired before mouse click on the map (sometimes useful when you\r\n\t\t\t// want something to happen on click before any existing click\r\n\t\t\t// handlers start running).\r\n\t\t\tvar synth = L.Util.extend({}, e);\r\n\t\t\tsynth.type = 'preclick';\r\n\t\t\tthis._fireDOMEvent(synth, synth.type, targets);\r\n\t\t}\r\n\r\n\t\tif (e._stopped) { return; }\r\n\r\n\t\t// Find the layer the event is propagating from and its parents.\r\n\t\ttargets = (targets || []).concat(this._findEventTargets(e, type));\r\n\r\n\t\tif (!targets.length) { return; }\r\n\r\n\t\tvar target = targets[0];\r\n\t\tif (type === 'contextmenu' && target.listens(type, true)) {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\toriginalEvent: e\r\n\t\t};\r\n\r\n\t\tif (e.type !== 'keypress') {\r\n\t\t\tvar isMarker = target instanceof L.Marker;\r\n\t\t\tdata.containerPoint = isMarker ?\r\n\t\t\t\t\tthis.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e);\r\n\t\t\tdata.layerPoint = this.containerPointToLayerPoint(data.containerPoint);\r\n\t\t\tdata.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint);\r\n\t\t}\r\n\r\n\t\tfor (var i = 0; i < targets.length; i++) {\r\n\t\t\ttargets[i].fire(type, data, true);\r\n\t\t\tif (data.originalEvent._stopped ||\r\n\t\t\t\t(targets[i].options.nonBubblingEvents && L.Util.indexOf(targets[i].options.nonBubblingEvents, type) !== -1)) { return; }\r\n\t\t}\r\n\t},\r\n\r\n\t_draggableMoved: function (obj) {\r\n\t\tobj = obj.dragging && obj.dragging.enabled() ? obj : this;\r\n\t\treturn (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved());\r\n\t},\r\n\r\n\t_clearHandlers: function () {\r\n\t\tfor (var i = 0, len = this._handlers.length; i < len; i++) {\r\n\t\t\tthis._handlers[i].disable();\r\n\t\t}\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\r\n\t// @method whenReady(fn: Function, context?: Object): this\r\n\t// Runs the given function `fn` when the map gets initialized with\r\n\t// a view (center and zoom) and at least one layer, or immediately\r\n\t// if it's already initialized, optionally passing a function context.\r\n\twhenReady: function (callback, context) {\r\n\t\tif (this._loaded) {\r\n\t\t\tcallback.call(context || this, {target: this});\r\n\t\t} else {\r\n\t\t\tthis.on('load', callback, context);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\r\n\t// private methods for getting map state\r\n\r\n\t_getMapPanePos: function () {\r\n\t\treturn L.DomUtil.getPosition(this._mapPane) || new L.Point(0, 0);\r\n\t},\r\n\r\n\t_moved: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\treturn pos && !pos.equals([0, 0]);\r\n\t},\r\n\r\n\t_getTopLeftPoint: function (center, zoom) {\r\n\t\tvar pixelOrigin = center && zoom !== undefined ?\r\n\t\t\tthis._getNewPixelOrigin(center, zoom) :\r\n\t\t\tthis.getPixelOrigin();\r\n\t\treturn pixelOrigin.subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t_getNewPixelOrigin: function (center, zoom) {\r\n\t\tvar viewHalf = this.getSize()._divideBy(2);\r\n\t\treturn this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round();\r\n\t},\r\n\r\n\t_latLngToNewLayerPoint: function (latlng, zoom, center) {\r\n\t\tvar topLeft = this._getNewPixelOrigin(center, zoom);\r\n\t\treturn this.project(latlng, zoom)._subtract(topLeft);\r\n\t},\r\n\r\n\t// layer point of the current center\r\n\t_getCenterLayerPoint: function () {\r\n\t\treturn this.containerPointToLayerPoint(this.getSize()._divideBy(2));\r\n\t},\r\n\r\n\t// offset of the specified place to the current center in pixels\r\n\t_getCenterOffset: function (latlng) {\r\n\t\treturn this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// adjust center for view to get inside bounds\r\n\t_limitCenter: function (center, zoom, bounds) {\r\n\r\n\t\tif (!bounds) { return center; }\r\n\r\n\t\tvar centerPoint = this.project(center, zoom),\r\n\t\t viewHalf = this.getSize().divideBy(2),\r\n\t\t viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),\r\n\t\t offset = this._getBoundsOffset(viewBounds, bounds, zoom);\r\n\r\n\t\t// If offset is less than a pixel, ignore.\r\n\t\t// This prevents unstable projections from getting into\r\n\t\t// an infinite loop of tiny offsets.\r\n\t\tif (offset.round().equals([0, 0])) {\r\n\t\t\treturn center;\r\n\t\t}\r\n\r\n\t\treturn this.unproject(centerPoint.add(offset), zoom);\r\n\t},\r\n\r\n\t// adjust offset for view to get inside bounds\r\n\t_limitOffset: function (offset, bounds) {\r\n\t\tif (!bounds) { return offset; }\r\n\r\n\t\tvar viewBounds = this.getPixelBounds(),\r\n\t\t newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));\r\n\r\n\t\treturn offset.add(this._getBoundsOffset(newBounds, bounds));\r\n\t},\r\n\r\n\t// returns offset needed for pxBounds to get inside maxBounds at a specified zoom\r\n\t_getBoundsOffset: function (pxBounds, maxBounds, zoom) {\r\n\t\tvar projectedMaxBounds = L.bounds(\r\n\t\t this.project(maxBounds.getNorthEast(), zoom),\r\n\t\t this.project(maxBounds.getSouthWest(), zoom)\r\n\t\t ),\r\n\t\t minOffset = projectedMaxBounds.min.subtract(pxBounds.min),\r\n\t\t maxOffset = projectedMaxBounds.max.subtract(pxBounds.max),\r\n\r\n\t\t dx = this._rebound(minOffset.x, -maxOffset.x),\r\n\t\t dy = this._rebound(minOffset.y, -maxOffset.y);\r\n\r\n\t\treturn new L.Point(dx, dy);\r\n\t},\r\n\r\n\t_rebound: function (left, right) {\r\n\t\treturn left + right > 0 ?\r\n\t\t\tMath.round(left - right) / 2 :\r\n\t\t\tMath.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));\r\n\t},\r\n\r\n\t_limitZoom: function (zoom) {\r\n\t\tvar min = this.getMinZoom(),\r\n\t\t max = this.getMaxZoom(),\r\n\t\t snap = L.Browser.any3d ? this.options.zoomSnap : 1;\r\n\t\tif (snap) {\r\n\t\t\tzoom = Math.round(zoom / snap) * snap;\r\n\t\t}\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t}\r\n});\r\n\r\n// @section\r\n\r\n// @factory L.map(id: String, options?: Map options)\r\n// Instantiates a map object given the DOM ID of a `<div>` element\r\n// and optionally an object literal with `Map options`.\r\n//\r\n// @alternative\r\n// @factory L.map(el: HTMLElement, options?: Map options)\r\n// Instantiates a map object given an instance of a `<div>` HTML element\r\n// and optionally an object literal with `Map options`.\r\nL.map = function (id, options) {\r\n\treturn new L.Map(id, options);\r\n};\r\n\n\n/*\n * @class Layer\n * @inherits Evented\n * @aka L.Layer\n * @aka ILayer\n *\n * A set of methods from the Layer base class that all Leaflet layers use.\n * Inherits all methods, options and events from `L.Evented`.\n *\n * @example\n *\n * ```js\n * var layer = L.Marker(latlng).addTo(map);\n * layer.addTo(map);\n * layer.remove();\n * ```\n *\n * @event add: Event\n * Fired after the layer is added to a map\n *\n * @event remove: Event\n * Fired after the layer is removed from a map\n */\n\n\nL.Layer = L.Evented.extend({\n\n\t// Classes extending `L.Layer` will inherit the following options:\n\toptions: {\n\t\t// @option pane: String = 'overlayPane'\n\t\t// By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default.\n\t\tpane: 'overlayPane',\n\t\tnonBubblingEvents: [] // Array of events that should not be bubbled to DOM parents (like the map)\n\t},\n\n\t/* @section\n\t * Classes extending `L.Layer` will inherit the following methods:\n\t *\n\t * @method addTo(map: Map): this\n\t * Adds the layer to the given map\n\t */\n\taddTo: function (map) {\n\t\tmap.addLayer(this);\n\t\treturn this;\n\t},\n\n\t// @method remove: this\n\t// Removes the layer from the map it is currently active on.\n\tremove: function () {\n\t\treturn this.removeFrom(this._map || this._mapToAdd);\n\t},\n\n\t// @method removeFrom(map: Map): this\n\t// Removes the layer from the given map\n\tremoveFrom: function (obj) {\n\t\tif (obj) {\n\t\t\tobj.removeLayer(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getPane(name? : String): HTMLElement\n\t// Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer.\n\tgetPane: function (name) {\n\t\treturn this._map.getPane(name ? (this.options[name] || name) : this.options.pane);\n\t},\n\n\taddInteractiveTarget: function (targetEl) {\n\t\tthis._map._targets[L.stamp(targetEl)] = this;\n\t\treturn this;\n\t},\n\n\tremoveInteractiveTarget: function (targetEl) {\n\t\tdelete this._map._targets[L.stamp(targetEl)];\n\t\treturn this;\n\t},\n\n\t_layerAdd: function (e) {\n\t\tvar map = e.target;\n\n\t\t// check in case layer gets added and then removed before the map is ready\n\t\tif (!map.hasLayer(this)) { return; }\n\n\t\tthis._map = map;\n\t\tthis._zoomAnimated = map._zoomAnimated;\n\n\t\tif (this.getEvents) {\n\t\t\tvar events = this.getEvents();\n\t\t\tmap.on(events, this);\n\t\t\tthis.once('remove', function () {\n\t\t\t\tmap.off(events, this);\n\t\t\t}, this);\n\t\t}\n\n\t\tthis.onAdd(map);\n\n\t\tif (this.getAttribution && this._map.attributionControl) {\n\t\t\tthis._map.attributionControl.addAttribution(this.getAttribution());\n\t\t}\n\n\t\tthis.fire('add');\n\t\tmap.fire('layeradd', {layer: this});\n\t}\n});\n\n/* @section Extension methods\n * @uninheritable\n *\n * Every layer should extend from `L.Layer` and (re-)implement the following methods.\n *\n * @method onAdd(map: Map): this\n * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer).\n *\n * @method onRemove(map: Map): this\n * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer).\n *\n * @method getEvents(): Object\n * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer.\n *\n * @method getAttribution(): String\n * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible.\n *\n * @method beforeAdd(map: Map): this\n * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.\n */\n\n\n/* @namespace Map\n * @section Layer events\n *\n * @event layeradd: LayerEvent\n * Fired when a new layer is added to the map.\n *\n * @event layerremove: LayerEvent\n * Fired when some layer is removed from the map\n *\n * @section Methods for Layers and Controls\n */\nL.Map.include({\n\t// @method addLayer(layer: Layer): this\n\t// Adds the given layer to the map\n\taddLayer: function (layer) {\n\t\tvar id = L.stamp(layer);\n\t\tif (this._layers[id]) { return this; }\n\t\tthis._layers[id] = layer;\n\n\t\tlayer._mapToAdd = this;\n\n\t\tif (layer.beforeAdd) {\n\t\t\tlayer.beforeAdd(this);\n\t\t}\n\n\t\tthis.whenReady(layer._layerAdd, layer);\n\n\t\treturn this;\n\t},\n\n\t// @method removeLayer(layer: Layer): this\n\t// Removes the given layer from the map.\n\tremoveLayer: function (layer) {\n\t\tvar id = L.stamp(layer);\n\n\t\tif (!this._layers[id]) { return this; }\n\n\t\tif (this._loaded) {\n\t\t\tlayer.onRemove(this);\n\t\t}\n\n\t\tif (layer.getAttribution && this.attributionControl) {\n\t\t\tthis.attributionControl.removeAttribution(layer.getAttribution());\n\t\t}\n\n\t\tdelete this._layers[id];\n\n\t\tif (this._loaded) {\n\t\t\tthis.fire('layerremove', {layer: layer});\n\t\t\tlayer.fire('remove');\n\t\t}\n\n\t\tlayer._map = layer._mapToAdd = null;\n\n\t\treturn this;\n\t},\n\n\t// @method hasLayer(layer: Layer): Boolean\n\t// Returns `true` if the given layer is currently added to the map\n\thasLayer: function (layer) {\n\t\treturn !!layer && (L.stamp(layer) in this._layers);\n\t},\n\n\t/* @method eachLayer(fn: Function, context?: Object): this\n\t * Iterates over the layers of the map, optionally specifying context of the iterator function.\n\t * ```\n\t * map.eachLayer(function(layer){\n\t * layer.bindPopup('Hello');\n\t * });\n\t * ```\n\t */\n\teachLayer: function (method, context) {\n\t\tfor (var i in this._layers) {\n\t\t\tmethod.call(context, this._layers[i]);\n\t\t}\n\t\treturn this;\n\t},\n\n\t_addLayers: function (layers) {\n\t\tlayers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];\n\n\t\tfor (var i = 0, len = layers.length; i < len; i++) {\n\t\t\tthis.addLayer(layers[i]);\n\t\t}\n\t},\n\n\t_addZoomLimit: function (layer) {\n\t\tif (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) {\n\t\t\tthis._zoomBoundLayers[L.stamp(layer)] = layer;\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\t},\n\n\t_removeZoomLimit: function (layer) {\n\t\tvar id = L.stamp(layer);\n\n\t\tif (this._zoomBoundLayers[id]) {\n\t\t\tdelete this._zoomBoundLayers[id];\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\t},\n\n\t_updateZoomLevels: function () {\n\t\tvar minZoom = Infinity,\n\t\t maxZoom = -Infinity,\n\t\t oldZoomSpan = this._getZoomSpan();\n\n\t\tfor (var i in this._zoomBoundLayers) {\n\t\t\tvar options = this._zoomBoundLayers[i].options;\n\n\t\t\tminZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom);\n\t\t\tmaxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom);\n\t\t}\n\n\t\tthis._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom;\n\t\tthis._layersMinZoom = minZoom === Infinity ? undefined : minZoom;\n\n\t\t// @section Map state change events\n\t\t// @event zoomlevelschange: Event\n\t\t// Fired when the number of zoomlevels on the map is changed due\n\t\t// to adding or removing a layer.\n\t\tif (oldZoomSpan !== this._getZoomSpan()) {\n\t\t\tthis.fire('zoomlevelschange');\n\t\t}\n\t}\n});\n\n/*\r\n * @namespace Projection\r\n * @projection L.Projection.Mercator\r\n *\r\n * Elliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.\r\n */\r\n\r\nL.Projection.Mercator = {\r\n\tR: 6378137,\r\n\tR_MINOR: 6356752.314245179,\r\n\r\n\tbounds: L.bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]),\r\n\r\n\tproject: function (latlng) {\r\n\t\tvar d = Math.PI / 180,\r\n\t\t r = this.R,\r\n\t\t y = latlng.lat * d,\r\n\t\t tmp = this.R_MINOR / r,\r\n\t\t e = Math.sqrt(1 - tmp * tmp),\r\n\t\t con = e * Math.sin(y);\r\n\r\n\t\tvar ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\r\n\t\ty = -r * Math.log(Math.max(ts, 1E-10));\r\n\r\n\t\treturn new L.Point(latlng.lng * d * r, y);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\tvar d = 180 / Math.PI,\r\n\t\t r = this.R,\r\n\t\t tmp = this.R_MINOR / r,\r\n\t\t e = Math.sqrt(1 - tmp * tmp),\r\n\t\t ts = Math.exp(-point.y / r),\r\n\t\t phi = Math.PI / 2 - 2 * Math.atan(ts);\r\n\r\n\t\tfor (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\r\n\t\t\tcon = e * Math.sin(phi);\r\n\t\t\tcon = Math.pow((1 - con) / (1 + con), e / 2);\r\n\t\t\tdphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\r\n\t\t\tphi += dphi;\r\n\t\t}\r\n\r\n\t\treturn new L.LatLng(phi * d, point.x * d / r);\r\n\t}\r\n};\r\n\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG3395\r\n *\r\n * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.\r\n */\r\n\r\nL.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, {\r\n\tcode: 'EPSG:3395',\r\n\tprojection: L.Projection.Mercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar scale = 0.5 / (Math.PI * L.Projection.Mercator.R);\r\n\t\treturn new L.Transformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\n/*\n * @class GridLayer\n * @inherits Layer\n * @aka L.GridLayer\n *\n * Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces `TileLayer.Canvas`.\n * GridLayer can be extended to create a tiled grid of HTML elements like `<canvas>`, `<img>` or `<div>`. GridLayer will handle creating and animating these DOM elements for you.\n *\n *\n * @section Synchronous usage\n * @example\n *\n * To create a custom layer, extend GridLayer and implement the `createTile()` method, which will be passed a `Point` object with the `x`, `y`, and `z` (zoom level) coordinates to draw your tile.\n *\n * ```js\n * var CanvasLayer = L.GridLayer.extend({\n * createTile: function(coords){\n * // create a <canvas> element for drawing\n * var tile = L.DomUtil.create('canvas', 'leaflet-tile');\n *\n * // setup tile width and height according to the options\n * var size = this.getTileSize();\n * tile.width = size.x;\n * tile.height = size.y;\n *\n * // get a canvas context and draw something on it using coords.x, coords.y and coords.z\n * var ctx = tile.getContext('2d');\n *\n * // return the tile so it can be rendered on screen\n * return tile;\n * }\n * });\n * ```\n *\n * @section Asynchronous usage\n * @example\n *\n * Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the `done()` callback.\n *\n * ```js\n * var CanvasLayer = L.GridLayer.extend({\n * createTile: function(coords, done){\n * var error;\n *\n * // create a <canvas> element for drawing\n * var tile = L.DomUtil.create('canvas', 'leaflet-tile');\n *\n * // setup tile width and height according to the options\n * var size = this.getTileSize();\n * tile.width = size.x;\n * tile.height = size.y;\n *\n * // draw something asynchronously and pass the tile to the done() callback\n * setTimeout(function() {\n * done(error, tile);\n * }, 1000);\n *\n * return tile;\n * }\n * });\n * ```\n *\n * @section\n */\n\n\nL.GridLayer = L.Layer.extend({\n\n\t// @section\n\t// @aka GridLayer options\n\toptions: {\n\t\t// @option tileSize: Number|Point = 256\n\t\t// Width and height of tiles in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise.\n\t\ttileSize: 256,\n\n\t\t// @option opacity: Number = 1.0\n\t\t// Opacity of the tiles. Can be used in the `createTile()` function.\n\t\topacity: 1,\n\n\t\t// @option updateWhenIdle: Boolean = depends\n\t\t// If `false`, new tiles are loaded during panning, otherwise only after it (for better performance). `true` by default on mobile browsers, otherwise `false`.\n\t\tupdateWhenIdle: L.Browser.mobile,\n\n\t\t// @option updateWhenZooming: Boolean = true\n\t\t// By default, a smooth zoom animation (during a [touch zoom](#map-touchzoom) or a [`flyTo()`](#map-flyto)) will update grid layers every integer zoom level. Setting this option to `false` will update the grid layer only when the smooth animation ends.\n\t\tupdateWhenZooming: true,\n\n\t\t// @option updateInterval: Number = 200\n\t\t// Tiles will not update more than once every `updateInterval` milliseconds when panning.\n\t\tupdateInterval: 200,\n\n\t\t// @option attribution: String = null\n\t\t// String to be shown in the attribution control, describes the layer data, e.g. \"© Mapbox\".\n\t\tattribution: null,\n\n\t\t// @option zIndex: Number = 1\n\t\t// The explicit zIndex of the tile layer.\n\t\tzIndex: 1,\n\n\t\t// @option bounds: LatLngBounds = undefined\n\t\t// If set, tiles will only be loaded inside the set `LatLngBounds`.\n\t\tbounds: null,\n\n\t\t// @option minZoom: Number = 0\n\t\t// The minimum zoom level that tiles will be loaded at. By default the entire map.\n\t\tminZoom: 0,\n\n\t\t// @option maxZoom: Number = undefined\n\t\t// The maximum zoom level that tiles will be loaded at.\n\t\tmaxZoom: undefined,\n\n\t\t// @option noWrap: Boolean = false\n\t\t// Whether the layer is wrapped around the antimeridian. If `true`, the\n\t\t// GridLayer will only be displayed once at low zoom levels. Has no\n\t\t// effect when the [map CRS](#map-crs) doesn't wrap around.\n\t\tnoWrap: false,\n\n\t\t// @option pane: String = 'tilePane'\n\t\t// `Map pane` where the grid layer will be added.\n\t\tpane: 'tilePane',\n\n\t\t// @option className: String = ''\n\t\t// A custom class name to assign to the tile layer. Empty by default.\n\t\tclassName: '',\n\n\t\t// @option keepBuffer: Number = 2\n\t\t// When panning the map, keep this many rows and columns of tiles before unloading them.\n\t\tkeepBuffer: 2\n\t},\n\n\tinitialize: function (options) {\n\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function () {\n\t\tthis._initContainer();\n\n\t\tthis._levels = {};\n\t\tthis._tiles = {};\n\n\t\tthis._resetView();\n\t\tthis._update();\n\t},\n\n\tbeforeAdd: function (map) {\n\t\tmap._addZoomLimit(this);\n\t},\n\n\tonRemove: function (map) {\n\t\tthis._removeAllTiles();\n\t\tL.DomUtil.remove(this._container);\n\t\tmap._removeZoomLimit(this);\n\t\tthis._container = null;\n\t\tthis._tileZoom = null;\n\t},\n\n\t// @method bringToFront: this\n\t// Brings the tile layer to the top of all tile layers.\n\tbringToFront: function () {\n\t\tif (this._map) {\n\t\t\tL.DomUtil.toFront(this._container);\n\t\t\tthis._setAutoZIndex(Math.max);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToBack: this\n\t// Brings the tile layer to the bottom of all tile layers.\n\tbringToBack: function () {\n\t\tif (this._map) {\n\t\t\tL.DomUtil.toBack(this._container);\n\t\t\tthis._setAutoZIndex(Math.min);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getAttribution: String\n\t// Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution).\n\tgetAttribution: function () {\n\t\treturn this.options.attribution;\n\t},\n\n\t// @method getContainer: HTMLElement\n\t// Returns the HTML element that contains the tiles for this layer.\n\tgetContainer: function () {\n\t\treturn this._container;\n\t},\n\n\t// @method setOpacity(opacity: Number): this\n\t// Changes the [opacity](#gridlayer-opacity) of the grid layer.\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\t\tthis._updateOpacity();\n\t\treturn this;\n\t},\n\n\t// @method setZIndex(zIndex: Number): this\n\t// Changes the [zIndex](#gridlayer-zindex) of the grid layer.\n\tsetZIndex: function (zIndex) {\n\t\tthis.options.zIndex = zIndex;\n\t\tthis._updateZIndex();\n\n\t\treturn this;\n\t},\n\n\t// @method isLoading: Boolean\n\t// Returns `true` if any tile in the grid layer has not finished loading.\n\tisLoading: function () {\n\t\treturn this._loading;\n\t},\n\n\t// @method redraw: this\n\t// Causes the layer to clear all the tiles and request them again.\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._removeAllTiles();\n\t\t\tthis._update();\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = {\n\t\t\tviewprereset: this._invalidateAll,\n\t\t\tviewreset: this._resetView,\n\t\t\tzoom: this._resetView,\n\t\t\tmoveend: this._onMoveEnd\n\t\t};\n\n\t\tif (!this.options.updateWhenIdle) {\n\t\t\t// update tiles on move, but not more often than once per given interval\n\t\t\tif (!this._onMove) {\n\t\t\t\tthis._onMove = L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this);\n\t\t\t}\n\n\t\t\tevents.move = this._onMove;\n\t\t}\n\n\t\tif (this._zoomAnimated) {\n\t\t\tevents.zoomanim = this._animateZoom;\n\t\t}\n\n\t\treturn events;\n\t},\n\n\t// @section Extension methods\n\t// Layers extending `GridLayer` shall reimplement the following method.\n\t// @method createTile(coords: Object, done?: Function): HTMLElement\n\t// Called only internally, must be overriden by classes extending `GridLayer`.\n\t// Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback\n\t// is specified, it must be called when the tile has finished loading and drawing.\n\tcreateTile: function () {\n\t\treturn document.createElement('div');\n\t},\n\n\t// @section\n\t// @method getTileSize: Point\n\t// Normalizes the [tileSize option](#gridlayer-tilesize) into a point. Used by the `createTile()` method.\n\tgetTileSize: function () {\n\t\tvar s = this.options.tileSize;\n\t\treturn s instanceof L.Point ? s : new L.Point(s, s);\n\t},\n\n\t_updateZIndex: function () {\n\t\tif (this._container && this.options.zIndex !== undefined && this.options.zIndex !== null) {\n\t\t\tthis._container.style.zIndex = this.options.zIndex;\n\t\t}\n\t},\n\n\t_setAutoZIndex: function (compare) {\n\t\t// go through all other layers of the same pane, set zIndex to max + 1 (front) or min - 1 (back)\n\n\t\tvar layers = this.getPane().children,\n\t\t edgeZIndex = -compare(-Infinity, Infinity); // -Infinity for max, Infinity for min\n\n\t\tfor (var i = 0, len = layers.length, zIndex; i < len; i++) {\n\n\t\t\tzIndex = layers[i].style.zIndex;\n\n\t\t\tif (layers[i] !== this._container && zIndex) {\n\t\t\t\tedgeZIndex = compare(edgeZIndex, +zIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (isFinite(edgeZIndex)) {\n\t\t\tthis.options.zIndex = edgeZIndex + compare(-1, 1);\n\t\t\tthis._updateZIndex();\n\t\t}\n\t},\n\n\t_updateOpacity: function () {\n\t\tif (!this._map) { return; }\n\n\t\t// IE doesn't inherit filter opacity properly, so we're forced to set it on tiles\n\t\tif (L.Browser.ielt9) { return; }\n\n\t\tL.DomUtil.setOpacity(this._container, this.options.opacity);\n\n\t\tvar now = +new Date(),\n\t\t nextFrame = false,\n\t\t willPrune = false;\n\n\t\tfor (var key in this._tiles) {\n\t\t\tvar tile = this._tiles[key];\n\t\t\tif (!tile.current || !tile.loaded) { continue; }\n\n\t\t\tvar fade = Math.min(1, (now - tile.loaded) / 200);\n\n\t\t\tL.DomUtil.setOpacity(tile.el, fade);\n\t\t\tif (fade < 1) {\n\t\t\t\tnextFrame = true;\n\t\t\t} else {\n\t\t\t\tif (tile.active) { willPrune = true; }\n\t\t\t\ttile.active = true;\n\t\t\t}\n\t\t}\n\n\t\tif (willPrune && !this._noPrune) { this._pruneTiles(); }\n\n\t\tif (nextFrame) {\n\t\t\tL.Util.cancelAnimFrame(this._fadeFrame);\n\t\t\tthis._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this);\n\t\t}\n\t},\n\n\t_initContainer: function () {\n\t\tif (this._container) { return; }\n\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-layer ' + (this.options.className || ''));\n\t\tthis._updateZIndex();\n\n\t\tif (this.options.opacity < 1) {\n\t\t\tthis._updateOpacity();\n\t\t}\n\n\t\tthis.getPane().appendChild(this._container);\n\t},\n\n\t_updateLevels: function () {\n\n\t\tvar zoom = this._tileZoom,\n\t\t maxZoom = this.options.maxZoom;\n\n\t\tif (zoom === undefined) { return undefined; }\n\n\t\tfor (var z in this._levels) {\n\t\t\tif (this._levels[z].el.children.length || z === zoom) {\n\t\t\t\tthis._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z);\n\t\t\t} else {\n\t\t\t\tL.DomUtil.remove(this._levels[z].el);\n\t\t\t\tthis._removeTilesAtZoom(z);\n\t\t\t\tdelete this._levels[z];\n\t\t\t}\n\t\t}\n\n\t\tvar level = this._levels[zoom],\n\t\t map = this._map;\n\n\t\tif (!level) {\n\t\t\tlevel = this._levels[zoom] = {};\n\n\t\t\tlevel.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container);\n\t\t\tlevel.el.style.zIndex = maxZoom;\n\n\t\t\tlevel.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round();\n\t\t\tlevel.zoom = zoom;\n\n\t\t\tthis._setZoomTransform(level, map.getCenter(), map.getZoom());\n\n\t\t\t// force the browser to consider the newly added element for transition\n\t\t\tL.Util.falseFn(level.el.offsetWidth);\n\t\t}\n\n\t\tthis._level = level;\n\n\t\treturn level;\n\t},\n\n\t_pruneTiles: function () {\n\t\tif (!this._map) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar key, tile;\n\n\t\tvar zoom = this._map.getZoom();\n\t\tif (zoom > this.options.maxZoom ||\n\t\t\tzoom < this.options.minZoom) {\n\t\t\tthis._removeAllTiles();\n\t\t\treturn;\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\ttile = this._tiles[key];\n\t\t\ttile.retain = tile.current;\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\ttile = this._tiles[key];\n\t\t\tif (tile.current && !tile.active) {\n\t\t\t\tvar coords = tile.coords;\n\t\t\t\tif (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) {\n\t\t\t\t\tthis._retainChildren(coords.x, coords.y, coords.z, coords.z + 2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\tif (!this._tiles[key].retain) {\n\t\t\t\tthis._removeTile(key);\n\t\t\t}\n\t\t}\n\t},\n\n\t_removeTilesAtZoom: function (zoom) {\n\t\tfor (var key in this._tiles) {\n\t\t\tif (this._tiles[key].coords.z !== zoom) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis._removeTile(key);\n\t\t}\n\t},\n\n\t_removeAllTiles: function () {\n\t\tfor (var key in this._tiles) {\n\t\t\tthis._removeTile(key);\n\t\t}\n\t},\n\n\t_invalidateAll: function () {\n\t\tfor (var z in this._levels) {\n\t\t\tL.DomUtil.remove(this._levels[z].el);\n\t\t\tdelete this._levels[z];\n\t\t}\n\t\tthis._removeAllTiles();\n\n\t\tthis._tileZoom = null;\n\t},\n\n\t_retainParent: function (x, y, z, minZoom) {\n\t\tvar x2 = Math.floor(x / 2),\n\t\t y2 = Math.floor(y / 2),\n\t\t z2 = z - 1,\n\t\t coords2 = new L.Point(+x2, +y2);\n\t\tcoords2.z = +z2;\n\n\t\tvar key = this._tileCoordsToKey(coords2),\n\t\t tile = this._tiles[key];\n\n\t\tif (tile && tile.active) {\n\t\t\ttile.retain = true;\n\t\t\treturn true;\n\n\t\t} else if (tile && tile.loaded) {\n\t\t\ttile.retain = true;\n\t\t}\n\n\t\tif (z2 > minZoom) {\n\t\t\treturn this._retainParent(x2, y2, z2, minZoom);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_retainChildren: function (x, y, z, maxZoom) {\n\n\t\tfor (var i = 2 * x; i < 2 * x + 2; i++) {\n\t\t\tfor (var j = 2 * y; j < 2 * y + 2; j++) {\n\n\t\t\t\tvar coords = new L.Point(i, j);\n\t\t\t\tcoords.z = z + 1;\n\n\t\t\t\tvar key = this._tileCoordsToKey(coords),\n\t\t\t\t tile = this._tiles[key];\n\n\t\t\t\tif (tile && tile.active) {\n\t\t\t\t\ttile.retain = true;\n\t\t\t\t\tcontinue;\n\n\t\t\t\t} else if (tile && tile.loaded) {\n\t\t\t\t\ttile.retain = true;\n\t\t\t\t}\n\n\t\t\t\tif (z + 1 < maxZoom) {\n\t\t\t\t\tthis._retainChildren(i, j, z + 1, maxZoom);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_resetView: function (e) {\n\t\tvar animating = e && (e.pinch || e.flyTo);\n\t\tthis._setView(this._map.getCenter(), this._map.getZoom(), animating, animating);\n\t},\n\n\t_animateZoom: function (e) {\n\t\tthis._setView(e.center, e.zoom, true, e.noUpdate);\n\t},\n\n\t_setView: function (center, zoom, noPrune, noUpdate) {\n\t\tvar tileZoom = Math.round(zoom);\n\t\tif ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) ||\n\t\t (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) {\n\t\t\ttileZoom = undefined;\n\t\t}\n\n\t\tvar tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom);\n\n\t\tif (!noUpdate || tileZoomChanged) {\n\n\t\t\tthis._tileZoom = tileZoom;\n\n\t\t\tif (this._abortLoading) {\n\t\t\t\tthis._abortLoading();\n\t\t\t}\n\n\t\t\tthis._updateLevels();\n\t\t\tthis._resetGrid();\n\n\t\t\tif (tileZoom !== undefined) {\n\t\t\t\tthis._update(center);\n\t\t\t}\n\n\t\t\tif (!noPrune) {\n\t\t\t\tthis._pruneTiles();\n\t\t\t}\n\n\t\t\t// Flag to prevent _updateOpacity from pruning tiles during\n\t\t\t// a zoom anim or a pinch gesture\n\t\t\tthis._noPrune = !!noPrune;\n\t\t}\n\n\t\tthis._setZoomTransforms(center, zoom);\n\t},\n\n\t_setZoomTransforms: function (center, zoom) {\n\t\tfor (var i in this._levels) {\n\t\t\tthis._setZoomTransform(this._levels[i], center, zoom);\n\t\t}\n\t},\n\n\t_setZoomTransform: function (level, center, zoom) {\n\t\tvar scale = this._map.getZoomScale(zoom, level.zoom),\n\t\t translate = level.origin.multiplyBy(scale)\n\t\t .subtract(this._map._getNewPixelOrigin(center, zoom)).round();\n\n\t\tif (L.Browser.any3d) {\n\t\t\tL.DomUtil.setTransform(level.el, translate, scale);\n\t\t} else {\n\t\t\tL.DomUtil.setPosition(level.el, translate);\n\t\t}\n\t},\n\n\t_resetGrid: function () {\n\t\tvar map = this._map,\n\t\t crs = map.options.crs,\n\t\t tileSize = this._tileSize = this.getTileSize(),\n\t\t tileZoom = this._tileZoom;\n\n\t\tvar bounds = this._map.getPixelWorldBounds(this._tileZoom);\n\t\tif (bounds) {\n\t\t\tthis._globalTileRange = this._pxBoundsToTileRange(bounds);\n\t\t}\n\n\t\tthis._wrapX = crs.wrapLng && !this.options.noWrap && [\n\t\t\tMath.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize.x),\n\t\t\tMath.ceil(map.project([0, crs.wrapLng[1]], tileZoom).x / tileSize.y)\n\t\t];\n\t\tthis._wrapY = crs.wrapLat && !this.options.noWrap && [\n\t\t\tMath.floor(map.project([crs.wrapLat[0], 0], tileZoom).y / tileSize.x),\n\t\t\tMath.ceil(map.project([crs.wrapLat[1], 0], tileZoom).y / tileSize.y)\n\t\t];\n\t},\n\n\t_onMoveEnd: function () {\n\t\tif (!this._map || this._map._animatingZoom) { return; }\n\n\t\tthis._update();\n\t},\n\n\t_getTiledPixelBounds: function (center) {\n\t\tvar map = this._map,\n\t\t mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom(),\n\t\t scale = map.getZoomScale(mapZoom, this._tileZoom),\n\t\t pixelCenter = map.project(center, this._tileZoom).floor(),\n\t\t halfSize = map.getSize().divideBy(scale * 2);\n\n\t\treturn new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize));\n\t},\n\n\t// Private method to load tiles in the grid's active zoom level according to map bounds\n\t_update: function (center) {\n\t\tvar map = this._map;\n\t\tif (!map) { return; }\n\t\tvar zoom = map.getZoom();\n\n\t\tif (center === undefined) { center = map.getCenter(); }\n\t\tif (this._tileZoom === undefined) { return; }\t// if out of minzoom/maxzoom\n\n\t\tvar pixelBounds = this._getTiledPixelBounds(center),\n\t\t tileRange = this._pxBoundsToTileRange(pixelBounds),\n\t\t tileCenter = tileRange.getCenter(),\n\t\t queue = [],\n\t\t margin = this.options.keepBuffer,\n\t\t noPruneRange = new L.Bounds(tileRange.getBottomLeft().subtract([margin, -margin]),\n\t\t tileRange.getTopRight().add([margin, -margin]));\n\n\t\tfor (var key in this._tiles) {\n\t\t\tvar c = this._tiles[key].coords;\n\t\t\tif (c.z !== this._tileZoom || !noPruneRange.contains(L.point(c.x, c.y))) {\n\t\t\t\tthis._tiles[key].current = false;\n\t\t\t}\n\t\t}\n\n\t\t// _update just loads more tiles. If the tile zoom level differs too much\n\t\t// from the map's, let _setView reset levels and prune old tiles.\n\t\tif (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; }\n\n\t\t// create a queue of coordinates to load tiles from\n\t\tfor (var j = tileRange.min.y; j <= tileRange.max.y; j++) {\n\t\t\tfor (var i = tileRange.min.x; i <= tileRange.max.x; i++) {\n\t\t\t\tvar coords = new L.Point(i, j);\n\t\t\t\tcoords.z = this._tileZoom;\n\n\t\t\t\tif (!this._isValidTile(coords)) { continue; }\n\n\t\t\t\tvar tile = this._tiles[this._tileCoordsToKey(coords)];\n\t\t\t\tif (tile) {\n\t\t\t\t\ttile.current = true;\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push(coords);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// sort tile queue to load tiles in order of their distance to center\n\t\tqueue.sort(function (a, b) {\n\t\t\treturn a.distanceTo(tileCenter) - b.distanceTo(tileCenter);\n\t\t});\n\n\t\tif (queue.length !== 0) {\n\t\t\t// if it's the first batch of tiles to load\n\t\t\tif (!this._loading) {\n\t\t\t\tthis._loading = true;\n\t\t\t\t// @event loading: Event\n\t\t\t\t// Fired when the grid layer starts loading tiles.\n\t\t\t\tthis.fire('loading');\n\t\t\t}\n\n\t\t\t// create DOM fragment to append tiles in one batch\n\t\t\tvar fragment = document.createDocumentFragment();\n\n\t\t\tfor (i = 0; i < queue.length; i++) {\n\t\t\t\tthis._addTile(queue[i], fragment);\n\t\t\t}\n\n\t\t\tthis._level.el.appendChild(fragment);\n\t\t}\n\t},\n\n\t_isValidTile: function (coords) {\n\t\tvar crs = this._map.options.crs;\n\n\t\tif (!crs.infinite) {\n\t\t\t// don't load tile if it's out of bounds and not wrapped\n\t\t\tvar bounds = this._globalTileRange;\n\t\t\tif ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) ||\n\t\t\t (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; }\n\t\t}\n\n\t\tif (!this.options.bounds) { return true; }\n\n\t\t// don't load tile if it doesn't intersect the bounds in options\n\t\tvar tileBounds = this._tileCoordsToBounds(coords);\n\t\treturn L.latLngBounds(this.options.bounds).overlaps(tileBounds);\n\t},\n\n\t_keyToBounds: function (key) {\n\t\treturn this._tileCoordsToBounds(this._keyToTileCoords(key));\n\t},\n\n\t// converts tile coordinates to its geographical bounds\n\t_tileCoordsToBounds: function (coords) {\n\n\t\tvar map = this._map,\n\t\t tileSize = this.getTileSize(),\n\n\t\t nwPoint = coords.scaleBy(tileSize),\n\t\t sePoint = nwPoint.add(tileSize),\n\n\t\t nw = map.unproject(nwPoint, coords.z),\n\t\t se = map.unproject(sePoint, coords.z);\n\n\t\tif (!this.options.noWrap) {\n\t\t\tnw = map.wrapLatLng(nw);\n\t\t\tse = map.wrapLatLng(se);\n\t\t}\n\n\t\treturn new L.LatLngBounds(nw, se);\n\t},\n\n\t// converts tile coordinates to key for the tile cache\n\t_tileCoordsToKey: function (coords) {\n\t\treturn coords.x + ':' + coords.y + ':' + coords.z;\n\t},\n\n\t// converts tile cache key to coordinates\n\t_keyToTileCoords: function (key) {\n\t\tvar k = key.split(':'),\n\t\t coords = new L.Point(+k[0], +k[1]);\n\t\tcoords.z = +k[2];\n\t\treturn coords;\n\t},\n\n\t_removeTile: function (key) {\n\t\tvar tile = this._tiles[key];\n\t\tif (!tile) { return; }\n\n\t\tL.DomUtil.remove(tile.el);\n\n\t\tdelete this._tiles[key];\n\n\t\t// @event tileunload: TileEvent\n\t\t// Fired when a tile is removed (e.g. when a tile goes off the screen).\n\t\tthis.fire('tileunload', {\n\t\t\ttile: tile.el,\n\t\t\tcoords: this._keyToTileCoords(key)\n\t\t});\n\t},\n\n\t_initTile: function (tile) {\n\t\tL.DomUtil.addClass(tile, 'leaflet-tile');\n\n\t\tvar tileSize = this.getTileSize();\n\t\ttile.style.width = tileSize.x + 'px';\n\t\ttile.style.height = tileSize.y + 'px';\n\n\t\ttile.onselectstart = L.Util.falseFn;\n\t\ttile.onmousemove = L.Util.falseFn;\n\n\t\t// update opacity on tiles in IE7-8 because of filter inheritance problems\n\t\tif (L.Browser.ielt9 && this.options.opacity < 1) {\n\t\t\tL.DomUtil.setOpacity(tile, this.options.opacity);\n\t\t}\n\n\t\t// without this hack, tiles disappear after zoom on Chrome for Android\n\t\t// https://github.com/Leaflet/Leaflet/issues/2078\n\t\tif (L.Browser.android && !L.Browser.android23) {\n\t\t\ttile.style.WebkitBackfaceVisibility = 'hidden';\n\t\t}\n\t},\n\n\t_addTile: function (coords, container) {\n\t\tvar tilePos = this._getTilePos(coords),\n\t\t key = this._tileCoordsToKey(coords);\n\n\t\tvar tile = this.createTile(this._wrapCoords(coords), L.bind(this._tileReady, this, coords));\n\n\t\tthis._initTile(tile);\n\n\t\t// if createTile is defined with a second argument (\"done\" callback),\n\t\t// we know that tile is async and will be ready later; otherwise\n\t\tif (this.createTile.length < 2) {\n\t\t\t// mark tile as ready, but delay one frame for opacity animation to happen\n\t\t\tL.Util.requestAnimFrame(L.bind(this._tileReady, this, coords, null, tile));\n\t\t}\n\n\t\tL.DomUtil.setPosition(tile, tilePos);\n\n\t\t// save tile in cache\n\t\tthis._tiles[key] = {\n\t\t\tel: tile,\n\t\t\tcoords: coords,\n\t\t\tcurrent: true\n\t\t};\n\n\t\tcontainer.appendChild(tile);\n\t\t// @event tileloadstart: TileEvent\n\t\t// Fired when a tile is requested and starts loading.\n\t\tthis.fire('tileloadstart', {\n\t\t\ttile: tile,\n\t\t\tcoords: coords\n\t\t});\n\t},\n\n\t_tileReady: function (coords, err, tile) {\n\t\tif (!this._map) { return; }\n\n\t\tif (err) {\n\t\t\t// @event tileerror: TileErrorEvent\n\t\t\t// Fired when there is an error loading a tile.\n\t\t\tthis.fire('tileerror', {\n\t\t\t\terror: err,\n\t\t\t\ttile: tile,\n\t\t\t\tcoords: coords\n\t\t\t});\n\t\t}\n\n\t\tvar key = this._tileCoordsToKey(coords);\n\n\t\ttile = this._tiles[key];\n\t\tif (!tile) { return; }\n\n\t\ttile.loaded = +new Date();\n\t\tif (this._map._fadeAnimated) {\n\t\t\tL.DomUtil.setOpacity(tile.el, 0);\n\t\t\tL.Util.cancelAnimFrame(this._fadeFrame);\n\t\t\tthis._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this);\n\t\t} else {\n\t\t\ttile.active = true;\n\t\t\tthis._pruneTiles();\n\t\t}\n\n\t\tif (!err) {\n\t\t\tL.DomUtil.addClass(tile.el, 'leaflet-tile-loaded');\n\n\t\t\t// @event tileload: TileEvent\n\t\t\t// Fired when a tile loads.\n\t\t\tthis.fire('tileload', {\n\t\t\t\ttile: tile.el,\n\t\t\t\tcoords: coords\n\t\t\t});\n\t\t}\n\n\t\tif (this._noTilesToLoad()) {\n\t\t\tthis._loading = false;\n\t\t\t// @event load: Event\n\t\t\t// Fired when the grid layer loaded all visible tiles.\n\t\t\tthis.fire('load');\n\n\t\t\tif (L.Browser.ielt9 || !this._map._fadeAnimated) {\n\t\t\t\tL.Util.requestAnimFrame(this._pruneTiles, this);\n\t\t\t} else {\n\t\t\t\t// Wait a bit more than 0.2 secs (the duration of the tile fade-in)\n\t\t\t\t// to trigger a pruning.\n\t\t\t\tsetTimeout(L.bind(this._pruneTiles, this), 250);\n\t\t\t}\n\t\t}\n\t},\n\n\t_getTilePos: function (coords) {\n\t\treturn coords.scaleBy(this.getTileSize()).subtract(this._level.origin);\n\t},\n\n\t_wrapCoords: function (coords) {\n\t\tvar newCoords = new L.Point(\n\t\t\tthis._wrapX ? L.Util.wrapNum(coords.x, this._wrapX) : coords.x,\n\t\t\tthis._wrapY ? L.Util.wrapNum(coords.y, this._wrapY) : coords.y);\n\t\tnewCoords.z = coords.z;\n\t\treturn newCoords;\n\t},\n\n\t_pxBoundsToTileRange: function (bounds) {\n\t\tvar tileSize = this.getTileSize();\n\t\treturn new L.Bounds(\n\t\t\tbounds.min.unscaleBy(tileSize).floor(),\n\t\t\tbounds.max.unscaleBy(tileSize).ceil().subtract([1, 1]));\n\t},\n\n\t_noTilesToLoad: function () {\n\t\tfor (var key in this._tiles) {\n\t\t\tif (!this._tiles[key].loaded) { return false; }\n\t\t}\n\t\treturn true;\n\t}\n});\n\n// @factory L.gridLayer(options?: GridLayer options)\n// Creates a new instance of GridLayer with the supplied options.\nL.gridLayer = function (options) {\n\treturn new L.GridLayer(options);\n};\n\n/*\r\n * @class TileLayer\r\n * @inherits GridLayer\r\n * @aka L.TileLayer\r\n * Used to load and display tile layers on the map. Extends `GridLayer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map);\r\n * ```\r\n *\r\n * @section URL template\r\n * @example\r\n *\r\n * A string of the following form:\r\n *\r\n * ```\r\n * 'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'\r\n * ```\r\n *\r\n * `{s}` means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; `a`, `b` or `c` by default, can be omitted), `{z}` — zoom level, `{x}` and `{y}` — tile coordinates. `{r}` can be used to add @2x to the URL to load retina tiles.\r\n *\r\n * You can use custom keys in the template, which will be [evaluated](#util-template) from TileLayer options, like this:\r\n *\r\n * ```\r\n * L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});\r\n * ```\r\n */\r\n\r\n\r\nL.TileLayer = L.GridLayer.extend({\r\n\r\n\t// @section\r\n\t// @aka TileLayer options\r\n\toptions: {\r\n\t\t// @option minZoom: Number = 0\r\n\t\t// Minimum zoom number.\r\n\t\tminZoom: 0,\r\n\r\n\t\t// @option maxZoom: Number = 18\r\n\t\t// Maximum zoom number.\r\n\t\tmaxZoom: 18,\r\n\r\n\t\t// @option maxNativeZoom: Number = null\r\n\t\t// Maximum zoom number the tile source has available. If it is specified,\r\n\t\t// the tiles on all zoom levels higher than `maxNativeZoom` will be loaded\r\n\t\t// from `maxNativeZoom` level and auto-scaled.\r\n\t\tmaxNativeZoom: null,\r\n\r\n\t\t// @option subdomains: String|String[] = 'abc'\r\n\t\t// Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.\r\n\t\tsubdomains: 'abc',\r\n\r\n\t\t// @option errorTileUrl: String = ''\r\n\t\t// URL to the tile image to show in place of the tile that failed to load.\r\n\t\terrorTileUrl: '',\r\n\r\n\t\t// @option zoomOffset: Number = 0\r\n\t\t// The zoom number used in tile URLs will be offset with this value.\r\n\t\tzoomOffset: 0,\r\n\r\n\t\t// @option tms: Boolean = false\r\n\t\t// If `true`, inverses Y axis numbering for tiles (turn this on for [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) services).\r\n\t\ttms: false,\r\n\r\n\t\t// @option zoomReverse: Boolean = false\r\n\t\t// If set to true, the zoom number used in tile URLs will be reversed (`maxZoom - zoom` instead of `zoom`)\r\n\t\tzoomReverse: false,\r\n\r\n\t\t// @option detectRetina: Boolean = false\r\n\t\t// If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.\r\n\t\tdetectRetina: false,\r\n\r\n\t\t// @option crossOrigin: Boolean = false\r\n\t\t// If true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data.\r\n\t\tcrossOrigin: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\t// detecting retina displays, adjusting tileSize and zoom levels\r\n\t\tif (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {\r\n\r\n\t\t\toptions.tileSize = Math.floor(options.tileSize / 2);\r\n\r\n\t\t\tif (!options.zoomReverse) {\r\n\t\t\t\toptions.zoomOffset++;\r\n\t\t\t\toptions.maxZoom--;\r\n\t\t\t} else {\r\n\t\t\t\toptions.zoomOffset--;\r\n\t\t\t\toptions.minZoom++;\r\n\t\t\t}\r\n\r\n\t\t\toptions.minZoom = Math.max(0, options.minZoom);\r\n\t\t}\r\n\r\n\t\tif (typeof options.subdomains === 'string') {\r\n\t\t\toptions.subdomains = options.subdomains.split('');\r\n\t\t}\r\n\r\n\t\t// for https://github.com/Leaflet/Leaflet/issues/137\r\n\t\tif (!L.Browser.android) {\r\n\t\t\tthis.on('tileunload', this._onTileRemove);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setUrl(url: String, noRedraw?: Boolean): this\r\n\t// Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`).\r\n\tsetUrl: function (url, noRedraw) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method createTile(coords: Object, done?: Function): HTMLElement\r\n\t// Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile)\r\n\t// to return an `<img>` HTML element with the appropiate image URL given `coords`. The `done`\r\n\t// callback is called when the tile has been loaded.\r\n\tcreateTile: function (coords, done) {\r\n\t\tvar tile = document.createElement('img');\r\n\r\n\t\tL.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile));\r\n\t\tL.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile));\r\n\r\n\t\tif (this.options.crossOrigin) {\r\n\t\t\ttile.crossOrigin = '';\r\n\t\t}\r\n\r\n\t\t/*\r\n\t\t Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons\r\n\t\t http://www.w3.org/TR/WCAG20-TECHS/H67\r\n\t\t*/\r\n\t\ttile.alt = '';\r\n\r\n\t\ttile.src = this.getTileUrl(coords);\r\n\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t// @section Extension methods\r\n\t// @uninheritable\r\n\t// Layers extending `TileLayer` might reimplement the following method.\r\n\t// @method getTileUrl(coords: Object): String\r\n\t// Called only internally, returns the URL for a tile given its coordinates.\r\n\t// Classes extending `TileLayer` can override this function to provide custom tile URL naming schemes.\r\n\tgetTileUrl: function (coords) {\r\n\t\tvar data = {\r\n\t\t\tr: L.Browser.retina ? '@2x' : '',\r\n\t\t\ts: this._getSubdomain(coords),\r\n\t\t\tx: coords.x,\r\n\t\t\ty: coords.y,\r\n\t\t\tz: this._getZoomForUrl()\r\n\t\t};\r\n\t\tif (this._map && !this._map.options.crs.infinite) {\r\n\t\t\tvar invertedY = this._globalTileRange.max.y - coords.y;\r\n\t\t\tif (this.options.tms) {\r\n\t\t\t\tdata['y'] = invertedY;\r\n\t\t\t}\r\n\t\t\tdata['-y'] = invertedY;\r\n\t\t}\r\n\r\n\t\treturn L.Util.template(this._url, L.extend(data, this.options));\r\n\t},\r\n\r\n\t_tileOnLoad: function (done, tile) {\r\n\t\t// For https://github.com/Leaflet/Leaflet/issues/3332\r\n\t\tif (L.Browser.ielt9) {\r\n\t\t\tsetTimeout(L.bind(done, this, null, tile), 0);\r\n\t\t} else {\r\n\t\t\tdone(null, tile);\r\n\t\t}\r\n\t},\r\n\r\n\t_tileOnError: function (done, tile, e) {\r\n\t\tvar errorUrl = this.options.errorTileUrl;\r\n\t\tif (errorUrl) {\r\n\t\t\ttile.src = errorUrl;\r\n\t\t}\r\n\t\tdone(e, tile);\r\n\t},\r\n\r\n\tgetTileSize: function () {\r\n\t\tvar map = this._map,\r\n\t\t tileSize = L.GridLayer.prototype.getTileSize.call(this),\r\n\t\t zoom = this._tileZoom + this.options.zoomOffset,\r\n\t\t zoomN = this.options.maxNativeZoom;\r\n\r\n\t\t// increase tile size when overscaling\r\n\t\treturn zoomN !== null && zoom > zoomN ?\r\n\t\t\t\ttileSize.divideBy(map.getZoomScale(zoomN, zoom)).round() :\r\n\t\t\t\ttileSize;\r\n\t},\r\n\r\n\t_onTileRemove: function (e) {\r\n\t\te.tile.onload = null;\r\n\t},\r\n\r\n\t_getZoomForUrl: function () {\r\n\r\n\t\tvar options = this.options,\r\n\t\t zoom = this._tileZoom;\r\n\r\n\t\tif (options.zoomReverse) {\r\n\t\t\tzoom = options.maxZoom - zoom;\r\n\t\t}\r\n\r\n\t\tzoom += options.zoomOffset;\r\n\r\n\t\treturn options.maxNativeZoom !== null ? Math.min(zoom, options.maxNativeZoom) : zoom;\r\n\t},\r\n\r\n\t_getSubdomain: function (tilePoint) {\r\n\t\tvar index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;\r\n\t\treturn this.options.subdomains[index];\r\n\t},\r\n\r\n\t// stops loading all tiles in the background layer\r\n\t_abortLoading: function () {\r\n\t\tvar i, tile;\r\n\t\tfor (i in this._tiles) {\r\n\t\t\tif (this._tiles[i].coords.z !== this._tileZoom) {\r\n\t\t\t\ttile = this._tiles[i].el;\r\n\r\n\t\t\t\ttile.onload = L.Util.falseFn;\r\n\t\t\t\ttile.onerror = L.Util.falseFn;\r\n\r\n\t\t\t\tif (!tile.complete) {\r\n\t\t\t\t\ttile.src = L.Util.emptyImageUrl;\r\n\t\t\t\t\tL.DomUtil.remove(tile);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.tilelayer(urlTemplate: String, options?: TileLayer options)\r\n// Instantiates a tile layer object given a `URL template` and optionally an options object.\r\n\r\nL.tileLayer = function (url, options) {\r\n\treturn new L.TileLayer(url, options);\r\n};\r\n\n/*\r\n * @class TileLayer.WMS\r\n * @inherits TileLayer\r\n * @aka L.TileLayer.WMS\r\n * Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var nexrad = L.tileLayer.wms(\"http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi\", {\r\n * \tlayers: 'nexrad-n0r-900913',\r\n * \tformat: 'image/png',\r\n * \ttransparent: true,\r\n * \tattribution: \"Weather data © 2012 IEM Nexrad\"\r\n * });\r\n * ```\r\n */\r\n\r\nL.TileLayer.WMS = L.TileLayer.extend({\r\n\r\n\t// @section\r\n\t// @aka TileLayer.WMS options\r\n\t// If any custom options not documented here are used, they will be sent to the\r\n\t// WMS server as extra parameters in each request URL. This can be useful for\r\n\t// [non-standard vendor WMS parameters](http://docs.geoserver.org/stable/en/user/services/wms/vendor.html).\r\n\tdefaultWmsParams: {\r\n\t\tservice: 'WMS',\r\n\t\trequest: 'GetMap',\r\n\r\n\t\t// @option layers: String = ''\r\n\t\t// **(required)** Comma-separated list of WMS layers to show.\r\n\t\tlayers: '',\r\n\r\n\t\t// @option styles: String = ''\r\n\t\t// Comma-separated list of WMS styles.\r\n\t\tstyles: '',\r\n\r\n\t\t// @option format: String = 'image/jpeg'\r\n\t\t// WMS image format (use `'image/png'` for layers with transparency).\r\n\t\tformat: 'image/jpeg',\r\n\r\n\t\t// @option transparent: Boolean = false\r\n\t\t// If `true`, the WMS service will return images with transparency.\r\n\t\ttransparent: false,\r\n\r\n\t\t// @option version: String = '1.1.1'\r\n\t\t// Version of the WMS service to use\r\n\t\tversion: '1.1.1'\r\n\t},\r\n\r\n\toptions: {\r\n\t\t// @option crs: CRS = null\r\n\t\t// Coordinate Reference System to use for the WMS requests, defaults to\r\n\t\t// map CRS. Don't change this if you're not sure what it means.\r\n\t\tcrs: null,\r\n\r\n\t\t// @option uppercase: Boolean = false\r\n\t\t// If `true`, WMS request parameter keys will be uppercase.\r\n\t\tuppercase: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar wmsParams = L.extend({}, this.defaultWmsParams);\r\n\r\n\t\t// all keys that are not TileLayer options go to WMS params\r\n\t\tfor (var i in options) {\r\n\t\t\tif (!(i in this.options)) {\r\n\t\t\t\twmsParams[i] = options[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\twmsParams.width = wmsParams.height = options.tileSize * (options.detectRetina && L.Browser.retina ? 2 : 1);\r\n\r\n\t\tthis.wmsParams = wmsParams;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\r\n\t\tthis._crs = this.options.crs || map.options.crs;\r\n\t\tthis._wmsVersion = parseFloat(this.wmsParams.version);\r\n\r\n\t\tvar projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';\r\n\t\tthis.wmsParams[projectionKey] = this._crs.code;\r\n\r\n\t\tL.TileLayer.prototype.onAdd.call(this, map);\r\n\t},\r\n\r\n\tgetTileUrl: function (coords) {\r\n\r\n\t\tvar tileBounds = this._tileCoordsToBounds(coords),\r\n\t\t nw = this._crs.project(tileBounds.getNorthWest()),\r\n\t\t se = this._crs.project(tileBounds.getSouthEast()),\r\n\r\n\t\t bbox = (this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?\r\n\t\t\t [se.y, nw.x, nw.y, se.x] :\r\n\t\t\t [nw.x, se.y, se.x, nw.y]).join(','),\r\n\r\n\t\t url = L.TileLayer.prototype.getTileUrl.call(this, coords);\r\n\r\n\t\treturn url +\r\n\t\t\tL.Util.getParamString(this.wmsParams, url, this.options.uppercase) +\r\n\t\t\t(this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox;\r\n\t},\r\n\r\n\t// @method setParams(params: Object, noRedraw?: Boolean): this\r\n\t// Merges an object with the new parameters and re-requests tiles on the current screen (unless `noRedraw` was set to true).\r\n\tsetParams: function (params, noRedraw) {\r\n\r\n\t\tL.extend(this.wmsParams, params);\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.tileLayer.wms(baseUrl: String, options: TileLayer.WMS options)\r\n// Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.\r\nL.tileLayer.wms = function (url, options) {\r\n\treturn new L.TileLayer.WMS(url, options);\r\n};\r\n\n/*\r\n * @class ImageOverlay\r\n * @aka L.ImageOverlay\r\n * @inherits Interactive layer\r\n *\r\n * Used to load and display a single image over specific bounds of the map. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',\r\n * \timageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];\r\n * L.imageOverlay(imageUrl, imageBounds).addTo(map);\r\n * ```\r\n */\r\n\r\nL.ImageOverlay = L.Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka ImageOverlay options\r\n\toptions: {\r\n\t\t// @option opacity: Number = 1.0\r\n\t\t// The opacity of the image overlay.\r\n\t\topacity: 1,\r\n\r\n\t\t// @option alt: String = ''\r\n\t\t// Text for the `alt` attribute of the image (useful for accessibility).\r\n\t\talt: '',\r\n\r\n\t\t// @option interactive: Boolean = false\r\n\t\t// If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered.\r\n\t\tinteractive: false,\r\n\r\n\t\t// @option attribution: String = null\r\n\t\t// An optional string containing HTML to be shown on the `Attribution control`\r\n\t\tattribution: null,\r\n\r\n\t\t// @option crossOrigin: Boolean = false\r\n\t\t// If true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data.\r\n\t\tcrossOrigin: false\r\n\t},\r\n\r\n\tinitialize: function (url, bounds, options) { // (String, LatLngBounds, Object)\r\n\t\tthis._url = url;\r\n\t\tthis._bounds = L.latLngBounds(bounds);\r\n\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function () {\r\n\t\tif (!this._image) {\r\n\t\t\tthis._initImage();\r\n\r\n\t\t\tif (this.options.opacity < 1) {\r\n\t\t\t\tthis._updateOpacity();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.options.interactive) {\r\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-interactive');\r\n\t\t\tthis.addInteractiveTarget(this._image);\r\n\t\t}\r\n\r\n\t\tthis.getPane().appendChild(this._image);\r\n\t\tthis._reset();\r\n\t},\r\n\r\n\tonRemove: function () {\r\n\t\tL.DomUtil.remove(this._image);\r\n\t\tif (this.options.interactive) {\r\n\t\t\tthis.removeInteractiveTarget(this._image);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setOpacity(opacity: Number): this\r\n\t// Sets the opacity of the overlay.\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\r\n\t\tif (this._image) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (styleOpts) {\r\n\t\tif (styleOpts.opacity) {\r\n\t\t\tthis.setOpacity(styleOpts.opacity);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToFront(): this\r\n\t// Brings the layer to the top of all overlays.\r\n\tbringToFront: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toFront(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToBack(): this\r\n\t// Brings the layer to the bottom of all overlays.\r\n\tbringToBack: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toBack(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setUrl(url: String): this\r\n\t// Changes the URL of the image.\r\n\tsetUrl: function (url) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (this._image) {\r\n\t\t\tthis._image.src = url;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetBounds: function (bounds) {\r\n\t\tthis._bounds = bounds;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetAttribution: function () {\r\n\t\treturn this.options.attribution;\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tzoom: this._reset,\r\n\t\t\tviewreset: this._reset\r\n\t\t};\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tevents.zoomanim = this._animateZoom;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\treturn this._bounds;\r\n\t},\r\n\r\n\tgetElement: function () {\r\n\t\treturn this._image;\r\n\t},\r\n\r\n\t_initImage: function () {\r\n\t\tvar img = this._image = L.DomUtil.create('img',\r\n\t\t\t\t'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : ''));\r\n\r\n\t\timg.onselectstart = L.Util.falseFn;\r\n\t\timg.onmousemove = L.Util.falseFn;\r\n\r\n\t\timg.onload = L.bind(this.fire, this, 'load');\r\n\r\n\t\tif (this.options.crossOrigin) {\r\n\t\t\timg.crossOrigin = '';\r\n\t\t}\r\n\r\n\t\timg.src = this._url;\r\n\t\timg.alt = this.options.alt;\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar scale = this._map.getZoomScale(e.zoom),\r\n\t\t offset = this._map._latLngToNewLayerPoint(this._bounds.getNorthWest(), e.zoom, e.center);\r\n\r\n\t\tL.DomUtil.setTransform(this._image, offset, scale);\r\n\t},\r\n\r\n\t_reset: function () {\r\n\t\tvar image = this._image,\r\n\t\t bounds = new L.Bounds(\r\n\t\t this._map.latLngToLayerPoint(this._bounds.getNorthWest()),\r\n\t\t this._map.latLngToLayerPoint(this._bounds.getSouthEast())),\r\n\t\t size = bounds.getSize();\r\n\r\n\t\tL.DomUtil.setPosition(image, bounds.min);\r\n\r\n\t\timage.style.width = size.x + 'px';\r\n\t\timage.style.height = size.y + 'px';\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tL.DomUtil.setOpacity(this._image, this.options.opacity);\r\n\t}\r\n});\r\n\r\n// @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options)\r\n// Instantiates an image overlay object given the URL of the image and the\r\n// geographical bounds it is tied to.\r\nL.imageOverlay = function (url, bounds, options) {\r\n\treturn new L.ImageOverlay(url, bounds, options);\r\n};\r\n\n/*\r\n * @class Icon\r\n * @aka L.Icon\r\n * @inherits Layer\r\n *\r\n * Represents an icon to provide when creating a marker.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var myIcon = L.icon({\r\n * iconUrl: 'my-icon.png',\r\n * iconRetinaUrl: 'my-icon@2x.png',\r\n * iconSize: [38, 95],\r\n * iconAnchor: [22, 94],\r\n * popupAnchor: [-3, -76],\r\n * shadowUrl: 'my-icon-shadow.png',\r\n * shadowRetinaUrl: 'my-icon-shadow@2x.png',\r\n * shadowSize: [68, 95],\r\n * shadowAnchor: [22, 94]\r\n * });\r\n *\r\n * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);\r\n * ```\r\n *\r\n * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default.\r\n *\r\n */\r\n\r\nL.Icon = L.Class.extend({\r\n\r\n\t/* @section\r\n\t * @aka Icon options\r\n\t *\r\n\t * @option iconUrl: String = null\r\n\t * **(required)** The URL to the icon image (absolute or relative to your script path).\r\n\t *\r\n\t * @option iconRetinaUrl: String = null\r\n\t * The URL to a retina sized version of the icon image (absolute or relative to your\r\n\t * script path). Used for Retina screen devices.\r\n\t *\r\n\t * @option iconSize: Point = null\r\n\t * Size of the icon image in pixels.\r\n\t *\r\n\t * @option iconAnchor: Point = null\r\n\t * The coordinates of the \"tip\" of the icon (relative to its top left corner). The icon\r\n\t * will be aligned so that this point is at the marker's geographical location. Centered\r\n\t * by default if size is specified, also can be set in CSS with negative margins.\r\n\t *\r\n\t * @option popupAnchor: Point = null\r\n\t * The coordinates of the point from which popups will \"open\", relative to the icon anchor.\r\n\t *\r\n\t * @option shadowUrl: String = null\r\n\t * The URL to the icon shadow image. If not specified, no shadow image will be created.\r\n\t *\r\n\t * @option shadowRetinaUrl: String = null\r\n\t *\r\n\t * @option shadowSize: Point = null\r\n\t * Size of the shadow image in pixels.\r\n\t *\r\n\t * @option shadowAnchor: Point = null\r\n\t * The coordinates of the \"tip\" of the shadow (relative to its top left corner) (the same\r\n\t * as iconAnchor if not specified).\r\n\t *\r\n\t * @option className: String = ''\r\n\t * A custom class name to assign to both icon and shadow images. Empty by default.\r\n\t */\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\t// @method createIcon(oldIcon?: HTMLElement): HTMLElement\r\n\t// Called internally when the icon has to be shown, returns a `<img>` HTML element\r\n\t// styled according to the options.\r\n\tcreateIcon: function (oldIcon) {\r\n\t\treturn this._createIcon('icon', oldIcon);\r\n\t},\r\n\r\n\t// @method createShadow(oldIcon?: HTMLElement): HTMLElement\r\n\t// As `createIcon`, but for the shadow beneath it.\r\n\tcreateShadow: function (oldIcon) {\r\n\t\treturn this._createIcon('shadow', oldIcon);\r\n\t},\r\n\r\n\t_createIcon: function (name, oldIcon) {\r\n\t\tvar src = this._getIconUrl(name);\r\n\r\n\t\tif (!src) {\r\n\t\t\tif (name === 'icon') {\r\n\t\t\t\tthrow new Error('iconUrl not set in Icon options (see the docs).');\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null);\r\n\t\tthis._setIconStyles(img, name);\r\n\r\n\t\treturn img;\r\n\t},\r\n\r\n\t_setIconStyles: function (img, name) {\r\n\t\tvar options = this.options;\r\n\t\tvar sizeOption = options[name + 'Size'];\r\n\r\n\t\tif (typeof sizeOption === 'number') {\r\n\t\t\tsizeOption = [sizeOption, sizeOption];\r\n\t\t}\r\n\r\n\t\tvar size = L.point(sizeOption),\r\n\t\t anchor = L.point(name === 'shadow' && options.shadowAnchor || options.iconAnchor ||\r\n\t\t size && size.divideBy(2, true));\r\n\r\n\t\timg.className = 'leaflet-marker-' + name + ' ' + (options.className || '');\r\n\r\n\t\tif (anchor) {\r\n\t\t\timg.style.marginLeft = (-anchor.x) + 'px';\r\n\t\t\timg.style.marginTop = (-anchor.y) + 'px';\r\n\t\t}\r\n\r\n\t\tif (size) {\r\n\t\t\timg.style.width = size.x + 'px';\r\n\t\t\timg.style.height = size.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t_createImg: function (src, el) {\r\n\t\tel = el || document.createElement('img');\r\n\t\tel.src = src;\r\n\t\treturn el;\r\n\t},\r\n\r\n\t_getIconUrl: function (name) {\r\n\t\treturn L.Browser.retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url'];\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.icon(options: Icon options)\r\n// Creates an icon instance with the given options.\r\nL.icon = function (options) {\r\n\treturn new L.Icon(options);\r\n};\r\n\n/*\n * @miniclass Icon.Default (Icon)\n * @aka L.Icon.Default\n * @section\n *\n * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when\n * no icon is specified. Points to the blue marker image distributed with Leaflet\n * releases.\n *\n * In order to change the default icon, just change the properties of `L.Icon.Default.prototype.options`\n * (which is a set of `Icon options`).\n */\n\nL.Icon.Default = L.Icon.extend({\n\n\toptions: {\n\t\ticonUrl: 'marker-icon.png',\n\t\ticonRetinaUrl: 'marker-icon-2x.png',\n\t\tshadowUrl: 'marker-shadow.png',\n\t\ticonSize: [25, 41],\n\t\ticonAnchor: [12, 41],\n\t\tpopupAnchor: [1, -34],\n\t\ttooltipAnchor: [16, -28],\n\t\tshadowSize: [41, 41]\n\t},\n\n\t_getIconUrl: function (name) {\n\t\tif (!L.Icon.Default.imagePath) {\t// Deprecated, backwards-compatibility only\n\t\t\tL.Icon.Default.imagePath = this._detectIconPath();\n\t\t}\n\n\t\t// @option imagePath: String\n\t\t// `L.Icon.Default` will try to auto-detect the absolute location of the\n\t\t// blue icon images. If you are placing these images in a non-standard\n\t\t// way, set this option to point to the right absolute path.\n\t\treturn (this.options.imagePath || L.Icon.Default.imagePath) + L.Icon.prototype._getIconUrl.call(this, name);\n\t},\n\n\t_detectIconPath: function () {\n\t\tvar el = L.DomUtil.create('div', 'leaflet-default-icon-path', document.body);\n\t\tvar path = L.DomUtil.getStyle(el, 'background-image') ||\n\t\t L.DomUtil.getStyle(el, 'backgroundImage');\t// IE8\n\n\t\tdocument.body.removeChild(el);\n\n\t\treturn path.indexOf('url') === 0 ?\n\t\t\tpath.replace(/^url\\([\\\"\\']?/, '').replace(/marker-icon\\.png[\\\"\\']?\\)$/, '') : '';\n\t}\n});\n\n/*\r\n * @class Marker\r\n * @inherits Interactive layer\r\n * @aka L.Marker\r\n * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.marker([50.5, 30.5]).addTo(map);\r\n * ```\r\n */\r\n\r\nL.Marker = L.Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka Marker options\r\n\toptions: {\r\n\t\t// @option icon: Icon = *\r\n\t\t// Icon class to use for rendering the marker. See [Icon documentation](#L.Icon) for details on how to customize the marker icon. If not specified, a new `L.Icon.Default` is used.\r\n\t\ticon: new L.Icon.Default(),\r\n\r\n\t\t// Option inherited from \"Interactive layer\" abstract class\r\n\t\tinteractive: true,\r\n\r\n\t\t// @option draggable: Boolean = false\r\n\t\t// Whether the marker is draggable with mouse/touch or not.\r\n\t\tdraggable: false,\r\n\r\n\t\t// @option keyboard: Boolean = true\r\n\t\t// Whether the marker can be tabbed to with a keyboard and clicked by pressing enter.\r\n\t\tkeyboard: true,\r\n\r\n\t\t// @option title: String = ''\r\n\t\t// Text for the browser tooltip that appear on marker hover (no tooltip by default).\r\n\t\ttitle: '',\r\n\r\n\t\t// @option alt: String = ''\r\n\t\t// Text for the `alt` attribute of the icon image (useful for accessibility).\r\n\t\talt: '',\r\n\r\n\t\t// @option zIndexOffset: Number = 0\r\n\t\t// By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively).\r\n\t\tzIndexOffset: 0,\r\n\r\n\t\t// @option opacity: Number = 1.0\r\n\t\t// The opacity of the marker.\r\n\t\topacity: 1,\r\n\r\n\t\t// @option riseOnHover: Boolean = false\r\n\t\t// If `true`, the marker will get on top of others when you hover the mouse over it.\r\n\t\triseOnHover: false,\r\n\r\n\t\t// @option riseOffset: Number = 250\r\n\t\t// The z-index offset used for the `riseOnHover` feature.\r\n\t\triseOffset: 250,\r\n\r\n\t\t// @option pane: String = 'markerPane'\r\n\t\t// `Map pane` where the markers icon will be added.\r\n\t\tpane: 'markerPane',\r\n\r\n\t\t// FIXME: shadowPane is no longer a valid option\r\n\t\tnonBubblingEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu']\r\n\t},\r\n\r\n\t/* @section\r\n\t *\r\n\t * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods:\r\n\t */\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tL.setOptions(this, options);\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation;\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._initIcon();\r\n\t\tthis.update();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (this.dragging && this.dragging.enabled()) {\r\n\t\t\tthis.options.draggable = true;\r\n\t\t\tthis.dragging.removeHooks();\r\n\t\t}\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tmap.off('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._removeIcon();\r\n\t\tthis._removeShadow();\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\treturn {\r\n\t\t\tzoom: this.update,\r\n\t\t\tviewreset: this.update\r\n\t\t};\r\n\t},\r\n\r\n\t// @method getLatLng: LatLng\r\n\t// Returns the current geographical position of the marker.\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\t// @method setLatLng(latlng: LatLng): this\r\n\t// Changes the marker position to the given point.\r\n\tsetLatLng: function (latlng) {\r\n\t\tvar oldLatLng = this._latlng;\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tthis.update();\r\n\r\n\t\t// @event move: Event\r\n\t\t// Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`.\r\n\t\treturn this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng});\r\n\t},\r\n\r\n\t// @method setZIndexOffset(offset: Number): this\r\n\t// Changes the [zIndex offset](#marker-zindexoffset) of the marker.\r\n\tsetZIndexOffset: function (offset) {\r\n\t\tthis.options.zIndexOffset = offset;\r\n\t\treturn this.update();\r\n\t},\r\n\r\n\t// @method setIcon(icon: Icon): this\r\n\t// Changes the marker icon.\r\n\tsetIcon: function (icon) {\r\n\r\n\t\tthis.options.icon = icon;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._initIcon();\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\tif (this._popup) {\r\n\t\t\tthis.bindPopup(this._popup, this._popup.options);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetElement: function () {\r\n\t\treturn this._icon;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\r\n\t\tif (this._icon) {\r\n\t\t\tvar pos = this._map.latLngToLayerPoint(this._latlng).round();\r\n\t\t\tthis._setPos(pos);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initIcon: function () {\r\n\t\tvar options = this.options,\r\n\t\t classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');\r\n\r\n\t\tvar icon = options.icon.createIcon(this._icon),\r\n\t\t addIcon = false;\r\n\r\n\t\t// if we're not reusing the icon, remove the old one and init new one\r\n\t\tif (icon !== this._icon) {\r\n\t\t\tif (this._icon) {\r\n\t\t\t\tthis._removeIcon();\r\n\t\t\t}\r\n\t\t\taddIcon = true;\r\n\r\n\t\t\tif (options.title) {\r\n\t\t\t\ticon.title = options.title;\r\n\t\t\t}\r\n\t\t\tif (options.alt) {\r\n\t\t\t\ticon.alt = options.alt;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tL.DomUtil.addClass(icon, classToAdd);\r\n\r\n\t\tif (options.keyboard) {\r\n\t\t\ticon.tabIndex = '0';\r\n\t\t}\r\n\r\n\t\tthis._icon = icon;\r\n\r\n\t\tif (options.riseOnHover) {\r\n\t\t\tthis.on({\r\n\t\t\t\tmouseover: this._bringToFront,\r\n\t\t\t\tmouseout: this._resetZIndex\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tvar newShadow = options.icon.createShadow(this._shadow),\r\n\t\t addShadow = false;\r\n\r\n\t\tif (newShadow !== this._shadow) {\r\n\t\t\tthis._removeShadow();\r\n\t\t\taddShadow = true;\r\n\t\t}\r\n\r\n\t\tif (newShadow) {\r\n\t\t\tL.DomUtil.addClass(newShadow, classToAdd);\r\n\t\t}\r\n\t\tthis._shadow = newShadow;\r\n\r\n\r\n\t\tif (options.opacity < 1) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\r\n\t\tif (addIcon) {\r\n\t\t\tthis.getPane().appendChild(this._icon);\r\n\t\t}\r\n\t\tthis._initInteraction();\r\n\t\tif (newShadow && addShadow) {\r\n\t\t\tthis.getPane('shadowPane').appendChild(this._shadow);\r\n\t\t}\r\n\t},\r\n\r\n\t_removeIcon: function () {\r\n\t\tif (this.options.riseOnHover) {\r\n\t\t\tthis.off({\r\n\t\t\t\tmouseover: this._bringToFront,\r\n\t\t\t\tmouseout: this._resetZIndex\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tL.DomUtil.remove(this._icon);\r\n\t\tthis.removeInteractiveTarget(this._icon);\r\n\r\n\t\tthis._icon = null;\r\n\t},\r\n\r\n\t_removeShadow: function () {\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.remove(this._shadow);\r\n\t\t}\r\n\t\tthis._shadow = null;\r\n\t},\r\n\r\n\t_setPos: function (pos) {\r\n\t\tL.DomUtil.setPosition(this._icon, pos);\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setPosition(this._shadow, pos);\r\n\t\t}\r\n\r\n\t\tthis._zIndex = pos.y + this.options.zIndexOffset;\r\n\r\n\t\tthis._resetZIndex();\r\n\t},\r\n\r\n\t_updateZIndex: function (offset) {\r\n\t\tthis._icon.style.zIndex = this._zIndex + offset;\r\n\t},\r\n\r\n\t_animateZoom: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();\r\n\r\n\t\tthis._setPos(pos);\r\n\t},\r\n\r\n\t_initInteraction: function () {\r\n\r\n\t\tif (!this.options.interactive) { return; }\r\n\r\n\t\tL.DomUtil.addClass(this._icon, 'leaflet-interactive');\r\n\r\n\t\tthis.addInteractiveTarget(this._icon);\r\n\r\n\t\tif (L.Handler.MarkerDrag) {\r\n\t\t\tvar draggable = this.options.draggable;\r\n\t\t\tif (this.dragging) {\r\n\t\t\t\tdraggable = this.dragging.enabled();\r\n\t\t\t\tthis.dragging.disable();\r\n\t\t\t}\r\n\r\n\t\t\tthis.dragging = new L.Handler.MarkerDrag(this);\r\n\r\n\t\t\tif (draggable) {\r\n\t\t\t\tthis.dragging.enable();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setOpacity(opacity: Number): this\r\n\t// Changes the opacity of the marker.\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tvar opacity = this.options.opacity;\r\n\r\n\t\tL.DomUtil.setOpacity(this._icon, opacity);\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setOpacity(this._shadow, opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_bringToFront: function () {\r\n\t\tthis._updateZIndex(this.options.riseOffset);\r\n\t},\r\n\r\n\t_resetZIndex: function () {\r\n\t\tthis._updateZIndex(0);\r\n\t}\r\n});\r\n\r\n\r\n// factory L.marker(latlng: LatLng, options? : Marker options)\r\n\r\n// @factory L.marker(latlng: LatLng, options? : Marker options)\r\n// Instantiates a Marker object given a geographical point and optionally an options object.\r\nL.marker = function (latlng, options) {\r\n\treturn new L.Marker(latlng, options);\r\n};\r\n\n/*\n * @class DivIcon\n * @aka L.DivIcon\n * @inherits Icon\n *\n * Represents a lightweight icon for markers that uses a simple `<div>`\n * element instead of an image. Inherits from `Icon` but ignores the `iconUrl` and shadow options.\n *\n * @example\n * ```js\n * var myIcon = L.divIcon({className: 'my-div-icon'});\n * // you can set .my-div-icon styles in CSS\n *\n * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);\n * ```\n *\n * By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.\n */\n\nL.DivIcon = L.Icon.extend({\n\toptions: {\n\t\t// @section\n\t\t// @aka DivIcon options\n\t\ticonSize: [12, 12], // also can be set through CSS\n\n\t\t// iconAnchor: (Point),\n\t\t// popupAnchor: (Point),\n\n\t\t// @option html: String = ''\n\t\t// Custom HTML code to put inside the div element, empty by default.\n\t\thtml: false,\n\n\t\t// @option bgPos: Point = [0, 0]\n\t\t// Optional relative position of the background, in pixels\n\t\tbgPos: null,\n\n\t\tclassName: 'leaflet-div-icon'\n\t},\n\n\tcreateIcon: function (oldIcon) {\n\t\tvar div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),\n\t\t options = this.options;\n\n\t\tdiv.innerHTML = options.html !== false ? options.html : '';\n\n\t\tif (options.bgPos) {\n\t\t\tvar bgPos = L.point(options.bgPos);\n\t\t\tdiv.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px';\n\t\t}\n\t\tthis._setIconStyles(div, 'icon');\n\n\t\treturn div;\n\t},\n\n\tcreateShadow: function () {\n\t\treturn null;\n\t}\n});\n\n// @factory L.divIcon(options: DivIcon options)\n// Creates a `DivIcon` instance with the given options.\nL.divIcon = function (options) {\n\treturn new L.DivIcon(options);\n};\n\n/*\r\n * @class DivOverlay\r\n * @inherits Layer\r\n * @aka L.DivOverlay\r\n * Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.\r\n */\r\n\r\n// @namespace DivOverlay\r\nL.DivOverlay = L.Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka DivOverlay options\r\n\toptions: {\r\n\t\t// @option offset: Point = Point(0, 7)\r\n\t\t// The offset of the popup position. Useful to control the anchor\r\n\t\t// of the popup when opening it on some overlays.\r\n\t\toffset: [0, 7],\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom CSS class name to assign to the popup.\r\n\t\tclassName: '',\r\n\r\n\t\t// @option pane: String = 'popupPane'\r\n\t\t// `Map pane` where the popup will be added.\r\n\t\tpane: 'popupPane'\r\n\t},\r\n\r\n\tinitialize: function (options, source) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._source = source;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._zoomAnimated = map._zoomAnimated;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initLayout();\r\n\t\t}\r\n\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\r\n\t\tclearTimeout(this._removeTimeout);\r\n\t\tthis.getPane().appendChild(this._container);\r\n\t\tthis.update();\r\n\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 1);\r\n\t\t}\r\n\r\n\t\tthis.bringToFront();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t\tthis._removeTimeout = setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.remove(this._container);\r\n\t\t}\r\n\t},\r\n\r\n\t// @namespace Popup\r\n\t// @method getLatLng: LatLng\r\n\t// Returns the geographical point of popup.\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\t// @method setLatLng(latlng: LatLng): this\r\n\t// Sets the geographical point where the popup will open.\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tif (this._map) {\r\n\t\t\tthis._updatePosition();\r\n\t\t\tthis._adjustPan();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getContent: String|HTMLElement\r\n\t// Returns the content of the popup.\r\n\tgetContent: function () {\r\n\t\treturn this._content;\r\n\t},\r\n\r\n\t// @method setContent(htmlContent: String|HTMLElement|Function): this\r\n\t// Sets the HTML content of the popup. If a function is passed the source layer will be passed to the function. The function should return a `String` or `HTMLElement` to be used in the popup.\r\n\tsetContent: function (content) {\r\n\t\tthis._content = content;\r\n\t\tthis.update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getElement: String|HTMLElement\r\n\t// Alias for [getContent()](#popup-getcontent)\r\n\tgetElement: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method update: null\r\n\t// Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded.\r\n\tupdate: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._container.style.visibility = 'hidden';\r\n\r\n\t\tthis._updateContent();\r\n\t\tthis._updateLayout();\r\n\t\tthis._updatePosition();\r\n\r\n\t\tthis._container.style.visibility = '';\r\n\r\n\t\tthis._adjustPan();\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tzoom: this._updatePosition,\r\n\t\t\tviewreset: this._updatePosition\r\n\t\t};\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tevents.zoomanim = this._animateZoom;\r\n\t\t}\r\n\t\treturn events;\r\n\t},\r\n\r\n\t// @method isOpen: Boolean\r\n\t// Returns `true` when the popup is visible on the map.\r\n\tisOpen: function () {\r\n\t\treturn !!this._map && this._map.hasLayer(this);\r\n\t},\r\n\r\n\t// @method bringToFront: this\r\n\t// Brings this popup in front of other popups (in the same map pane).\r\n\tbringToFront: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toFront(this._container);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToBack: this\r\n\t// Brings this popup to the back of other popups (in the same map pane).\r\n\tbringToBack: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toBack(this._container);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateContent: function () {\r\n\t\tif (!this._content) { return; }\r\n\r\n\t\tvar node = this._contentNode;\r\n\t\tvar content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content;\r\n\r\n\t\tif (typeof content === 'string') {\r\n\t\t\tnode.innerHTML = content;\r\n\t\t} else {\r\n\t\t\twhile (node.hasChildNodes()) {\r\n\t\t\t\tnode.removeChild(node.firstChild);\r\n\t\t\t}\r\n\t\t\tnode.appendChild(content);\r\n\t\t}\r\n\t\tthis.fire('contentupdate');\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng),\r\n\t\t offset = L.point(this.options.offset),\r\n\t\t anchor = this._getAnchor();\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tL.DomUtil.setPosition(this._container, pos.add(anchor));\r\n\t\t} else {\r\n\t\t\toffset = offset.add(pos).add(anchor);\r\n\t\t}\r\n\r\n\t\tvar bottom = this._containerBottom = -offset.y,\r\n\t\t left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x;\r\n\r\n\t\t// bottom position the popup in case the height of the popup changes (images loading etc)\r\n\t\tthis._container.style.bottom = bottom + 'px';\r\n\t\tthis._container.style.left = left + 'px';\r\n\t},\r\n\r\n\t_getAnchor: function () {\r\n\t\treturn [0, 0];\r\n\t}\r\n\r\n});\r\n\n/*\r\n * @class Popup\r\n * @inherits DivOverlay\r\n * @aka L.Popup\r\n * Used to open popups in certain places of the map. Use [Map.openPopup](#map-openpopup) to\r\n * open popups while making sure that only one popup is open at one time\r\n * (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want.\r\n *\r\n * @example\r\n *\r\n * If you want to just bind a popup to marker click and then open it, it's really easy:\r\n *\r\n * ```js\r\n * marker.bindPopup(popupContent).openPopup();\r\n * ```\r\n * Path overlays like polylines also have a `bindPopup` method.\r\n * Here's a more complicated way to open a popup on a map:\r\n *\r\n * ```js\r\n * var popup = L.popup()\r\n * \t.setLatLng(latlng)\r\n * \t.setContent('<p>Hello world!<br />This is a nice popup.</p>')\r\n * \t.openOn(map);\r\n * ```\r\n */\r\n\r\n\r\n// @namespace Popup\r\nL.Popup = L.DivOverlay.extend({\r\n\r\n\t// @section\r\n\t// @aka Popup options\r\n\toptions: {\r\n\t\t// @option maxWidth: Number = 300\r\n\t\t// Max width of the popup, in pixels.\r\n\t\tmaxWidth: 300,\r\n\r\n\t\t// @option minWidth: Number = 50\r\n\t\t// Min width of the popup, in pixels.\r\n\t\tminWidth: 50,\r\n\r\n\t\t// @option maxHeight: Number = null\r\n\t\t// If set, creates a scrollable container of the given height\r\n\t\t// inside a popup if its content exceeds it.\r\n\t\tmaxHeight: null,\r\n\r\n\t\t// @option autoPan: Boolean = true\r\n\t\t// Set it to `false` if you don't want the map to do panning animation\r\n\t\t// to fit the opened popup.\r\n\t\tautoPan: true,\r\n\r\n\t\t// @option autoPanPaddingTopLeft: Point = null\r\n\t\t// The margin between the popup and the top left corner of the map\r\n\t\t// view after autopanning was performed.\r\n\t\tautoPanPaddingTopLeft: null,\r\n\r\n\t\t// @option autoPanPaddingBottomRight: Point = null\r\n\t\t// The margin between the popup and the bottom right corner of the map\r\n\t\t// view after autopanning was performed.\r\n\t\tautoPanPaddingBottomRight: null,\r\n\r\n\t\t// @option autoPanPadding: Point = Point(5, 5)\r\n\t\t// Equivalent of setting both top left and bottom right autopan padding to the same value.\r\n\t\tautoPanPadding: [5, 5],\r\n\r\n\t\t// @option keepInView: Boolean = false\r\n\t\t// Set it to `true` if you want to prevent users from panning the popup\r\n\t\t// off of the screen while it is open.\r\n\t\tkeepInView: false,\r\n\r\n\t\t// @option closeButton: Boolean = true\r\n\t\t// Controls the presence of a close button in the popup.\r\n\t\tcloseButton: true,\r\n\r\n\t\t// @option autoClose: Boolean = true\r\n\t\t// Set it to `false` if you want to override the default behavior of\r\n\t\t// the popup closing when user clicks the map (set globally by\r\n\t\t// the Map's [closePopupOnClick](#map-closepopuponclick) option).\r\n\t\tautoClose: true,\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom CSS class name to assign to the popup.\r\n\t\tclassName: ''\r\n\t},\r\n\r\n\t// @namespace Popup\r\n\t// @method openOn(map: Map): this\r\n\t// Adds the popup to the map and closes the previous one. The same as `map.openPopup(popup)`.\r\n\topenOn: function (map) {\r\n\t\tmap.openPopup(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tL.DivOverlay.prototype.onAdd.call(this, map);\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event popupopen: PopupEvent\r\n\t\t// Fired when a popup is opened in the map\r\n\t\tmap.fire('popupopen', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\t// @namespace Layer\r\n\t\t\t// @section Popup events\r\n\t\t\t// @event popupopen: PopupEvent\r\n\t\t\t// Fired when a popup bound to this layer is opened\r\n\t\t\tthis._source.fire('popupopen', {popup: this}, true);\r\n\t\t\t// For non-path layers, we toggle the popup when clicking\r\n\t\t\t// again the layer, so prevent the map to reopen it.\r\n\t\t\tif (!(this._source instanceof L.Path)) {\r\n\t\t\t\tthis._source.on('preclick', L.DomEvent.stopPropagation);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tL.DivOverlay.prototype.onRemove.call(this, map);\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event popupclose: PopupEvent\r\n\t\t// Fired when a popup in the map is closed\r\n\t\tmap.fire('popupclose', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\t// @namespace Layer\r\n\t\t\t// @section Popup events\r\n\t\t\t// @event popupclose: PopupEvent\r\n\t\t\t// Fired when a popup bound to this layer is closed\r\n\t\t\tthis._source.fire('popupclose', {popup: this}, true);\r\n\t\t\tif (!(this._source instanceof L.Path)) {\r\n\t\t\t\tthis._source.off('preclick', L.DomEvent.stopPropagation);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = L.DivOverlay.prototype.getEvents.call(this);\r\n\r\n\t\tif ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {\r\n\t\t\tevents.preclick = this._close;\r\n\t\t}\r\n\r\n\t\tif (this.options.keepInView) {\r\n\t\t\tevents.moveend = this._adjustPan;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t_close: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.closePopup(this);\r\n\t\t}\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar prefix = 'leaflet-popup',\r\n\t\t container = this._container = L.DomUtil.create('div',\r\n\t\t\tprefix + ' ' + (this.options.className || '') +\r\n\t\t\t' leaflet-zoom-animated');\r\n\r\n\t\tif (this.options.closeButton) {\r\n\t\t\tvar closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container);\r\n\t\t\tcloseButton.href = '#close';\r\n\t\t\tcloseButton.innerHTML = '×';\r\n\r\n\t\t\tL.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);\r\n\t\t}\r\n\r\n\t\tvar wrapper = this._wrapper = L.DomUtil.create('div', prefix + '-content-wrapper', container);\r\n\t\tthis._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);\r\n\r\n\t\tL.DomEvent\r\n\t\t\t.disableClickPropagation(wrapper)\r\n\t\t\t.disableScrollPropagation(this._contentNode)\r\n\t\t\t.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);\r\n\r\n\t\tthis._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);\r\n\t\tthis._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);\r\n\t},\r\n\r\n\t_updateLayout: function () {\r\n\t\tvar container = this._contentNode,\r\n\t\t style = container.style;\r\n\r\n\t\tstyle.width = '';\r\n\t\tstyle.whiteSpace = 'nowrap';\r\n\r\n\t\tvar width = container.offsetWidth;\r\n\t\twidth = Math.min(width, this.options.maxWidth);\r\n\t\twidth = Math.max(width, this.options.minWidth);\r\n\r\n\t\tstyle.width = (width + 1) + 'px';\r\n\t\tstyle.whiteSpace = '';\r\n\r\n\t\tstyle.height = '';\r\n\r\n\t\tvar height = container.offsetHeight,\r\n\t\t maxHeight = this.options.maxHeight,\r\n\t\t scrolledClass = 'leaflet-popup-scrolled';\r\n\r\n\t\tif (maxHeight && height > maxHeight) {\r\n\t\t\tstyle.height = maxHeight + 'px';\r\n\t\t\tL.DomUtil.addClass(container, scrolledClass);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.removeClass(container, scrolledClass);\r\n\t\t}\r\n\r\n\t\tthis._containerWidth = this._container.offsetWidth;\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center),\r\n\t\t anchor = this._getAnchor();\r\n\t\tL.DomUtil.setPosition(this._container, pos.add(anchor));\r\n\t},\r\n\r\n\t_adjustPan: function () {\r\n\t\tif (!this.options.autoPan || (this._map._panAnim && this._map._panAnim._inProgress)) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t marginBottom = parseInt(L.DomUtil.getStyle(this._container, 'marginBottom'), 10) || 0,\r\n\t\t containerHeight = this._container.offsetHeight + marginBottom,\r\n\t\t containerWidth = this._containerWidth,\r\n\t\t layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);\r\n\r\n\t\tlayerPos._add(L.DomUtil.getPosition(this._container));\r\n\r\n\t\tvar containerPos = map.layerPointToContainerPoint(layerPos),\r\n\t\t padding = L.point(this.options.autoPanPadding),\r\n\t\t paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),\r\n\t\t paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),\r\n\t\t size = map.getSize(),\r\n\t\t dx = 0,\r\n\t\t dy = 0;\r\n\r\n\t\tif (containerPos.x + containerWidth + paddingBR.x > size.x) { // right\r\n\t\t\tdx = containerPos.x + containerWidth - size.x + paddingBR.x;\r\n\t\t}\r\n\t\tif (containerPos.x - dx - paddingTL.x < 0) { // left\r\n\t\t\tdx = containerPos.x - paddingTL.x;\r\n\t\t}\r\n\t\tif (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom\r\n\t\t\tdy = containerPos.y + containerHeight - size.y + paddingBR.y;\r\n\t\t}\r\n\t\tif (containerPos.y - dy - paddingTL.y < 0) { // top\r\n\t\t\tdy = containerPos.y - paddingTL.y;\r\n\t\t}\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event autopanstart: Event\r\n\t\t// Fired when the map starts autopanning when opening a popup.\r\n\t\tif (dx || dy) {\r\n\t\t\tmap\r\n\t\t\t .fire('autopanstart')\r\n\t\t\t .panBy([dx, dy]);\r\n\t\t}\r\n\t},\r\n\r\n\t_onCloseButtonClick: function (e) {\r\n\t\tthis._close();\r\n\t\tL.DomEvent.stop(e);\r\n\t},\r\n\r\n\t_getAnchor: function () {\r\n\t\t// Where should we anchor the popup on the source layer?\r\n\t\treturn L.point(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]);\r\n\t}\r\n\r\n});\r\n\r\n// @namespace Popup\r\n// @factory L.popup(options?: Popup options, source?: Layer)\r\n// Instantiates a `Popup` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers.\r\nL.popup = function (options, source) {\r\n\treturn new L.Popup(options, source);\r\n};\r\n\r\n\r\n/* @namespace Map\r\n * @section Interaction Options\r\n * @option closePopupOnClick: Boolean = true\r\n * Set it to `false` if you don't want popups to close when user clicks the map.\r\n */\r\nL.Map.mergeOptions({\r\n\tclosePopupOnClick: true\r\n});\r\n\r\n\r\n// @namespace Map\r\n// @section Methods for Layers and Controls\r\nL.Map.include({\r\n\t// @method openPopup(popup: Popup): this\r\n\t// Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).\r\n\t// @alternative\r\n\t// @method openPopup(content: String|HTMLElement, latlng: LatLng, options?: Popup options): this\r\n\t// Creates a popup with the specified content and options and opens it in the given point on a map.\r\n\topenPopup: function (popup, latlng, options) {\r\n\t\tif (!(popup instanceof L.Popup)) {\r\n\t\t\tpopup = new L.Popup(options).setContent(popup);\r\n\t\t}\r\n\r\n\t\tif (latlng) {\r\n\t\t\tpopup.setLatLng(latlng);\r\n\t\t}\r\n\r\n\t\tif (this.hasLayer(popup)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (this._popup && this._popup.options.autoClose) {\r\n\t\t\tthis.closePopup();\r\n\t\t}\r\n\r\n\t\tthis._popup = popup;\r\n\t\treturn this.addLayer(popup);\r\n\t},\r\n\r\n\t// @method closePopup(popup?: Popup): this\r\n\t// Closes the popup previously opened with [openPopup](#map-openpopup) (or the given one).\r\n\tclosePopup: function (popup) {\r\n\t\tif (!popup || popup === this._popup) {\r\n\t\t\tpopup = this._popup;\r\n\t\t\tthis._popup = null;\r\n\t\t}\r\n\t\tif (popup) {\r\n\t\t\tthis.removeLayer(popup);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n/*\n * @namespace Layer\n * @section Popup methods example\n *\n * All layers share a set of methods convenient for binding popups to it.\n *\n * ```js\n * var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);\n * layer.openPopup();\n * layer.closePopup();\n * ```\n *\n * Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.\n */\n\n// @section Popup methods\nL.Layer.include({\n\n\t// @method bindPopup(content: String|HTMLElement|Function|Popup, options?: Popup options): this\n\t// Binds a popup to the layer with the passed `content` and sets up the\n\t// neccessary event listeners. If a `Function` is passed it will receive\n\t// the layer as the first argument and should return a `String` or `HTMLElement`.\n\tbindPopup: function (content, options) {\n\n\t\tif (content instanceof L.Popup) {\n\t\t\tL.setOptions(content, options);\n\t\t\tthis._popup = content;\n\t\t\tcontent._source = this;\n\t\t} else {\n\t\t\tif (!this._popup || options) {\n\t\t\t\tthis._popup = new L.Popup(options, this);\n\t\t\t}\n\t\t\tthis._popup.setContent(content);\n\t\t}\n\n\t\tif (!this._popupHandlersAdded) {\n\t\t\tthis.on({\n\t\t\t\tclick: this._openPopup,\n\t\t\t\tremove: this.closePopup,\n\t\t\t\tmove: this._movePopup\n\t\t\t});\n\t\t\tthis._popupHandlersAdded = true;\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t// @method unbindPopup(): this\n\t// Removes the popup previously bound with `bindPopup`.\n\tunbindPopup: function () {\n\t\tif (this._popup) {\n\t\t\tthis.off({\n\t\t\t\tclick: this._openPopup,\n\t\t\t\tremove: this.closePopup,\n\t\t\t\tmove: this._movePopup\n\t\t\t});\n\t\t\tthis._popupHandlersAdded = false;\n\t\t\tthis._popup = null;\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method openPopup(latlng?: LatLng): this\n\t// Opens the bound popup at the specificed `latlng` or at the default popup anchor if no `latlng` is passed.\n\topenPopup: function (layer, latlng) {\n\t\tif (!(layer instanceof L.Layer)) {\n\t\t\tlatlng = layer;\n\t\t\tlayer = this;\n\t\t}\n\n\t\tif (layer instanceof L.FeatureGroup) {\n\t\t\tfor (var id in this._layers) {\n\t\t\t\tlayer = this._layers[id];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!latlng) {\n\t\t\tlatlng = layer.getCenter ? layer.getCenter() : layer.getLatLng();\n\t\t}\n\n\t\tif (this._popup && this._map) {\n\t\t\t// set popup source to this layer\n\t\t\tthis._popup._source = layer;\n\n\t\t\t// update the popup (content, layout, ect...)\n\t\t\tthis._popup.update();\n\n\t\t\t// open the popup on the map\n\t\t\tthis._map.openPopup(this._popup, latlng);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t// @method closePopup(): this\n\t// Closes the popup bound to this layer if it is open.\n\tclosePopup: function () {\n\t\tif (this._popup) {\n\t\t\tthis._popup._close();\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method togglePopup(): this\n\t// Opens or closes the popup bound to this layer depending on its current state.\n\ttogglePopup: function (target) {\n\t\tif (this._popup) {\n\t\t\tif (this._popup._map) {\n\t\t\t\tthis.closePopup();\n\t\t\t} else {\n\t\t\t\tthis.openPopup(target);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method isPopupOpen(): boolean\n\t// Returns `true` if the popup bound to this layer is currently open.\n\tisPopupOpen: function () {\n\t\treturn this._popup.isOpen();\n\t},\n\n\t// @method setPopupContent(content: String|HTMLElement|Popup): this\n\t// Sets the content of the popup bound to this layer.\n\tsetPopupContent: function (content) {\n\t\tif (this._popup) {\n\t\t\tthis._popup.setContent(content);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getPopup(): Popup\n\t// Returns the popup bound to this layer.\n\tgetPopup: function () {\n\t\treturn this._popup;\n\t},\n\n\t_openPopup: function (e) {\n\t\tvar layer = e.layer || e.target;\n\n\t\tif (!this._popup) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._map) {\n\t\t\treturn;\n\t\t}\n\n\t\t// prevent map click\n\t\tL.DomEvent.stop(e);\n\n\t\t// if this inherits from Path its a vector and we can just\n\t\t// open the popup at the new location\n\t\tif (layer instanceof L.Path) {\n\t\t\tthis.openPopup(e.layer || e.target, e.latlng);\n\t\t\treturn;\n\t\t}\n\n\t\t// otherwise treat it like a marker and figure out\n\t\t// if we should toggle it open/closed\n\t\tif (this._map.hasLayer(this._popup) && this._popup._source === layer) {\n\t\t\tthis.closePopup();\n\t\t} else {\n\t\t\tthis.openPopup(layer, e.latlng);\n\t\t}\n\t},\n\n\t_movePopup: function (e) {\n\t\tthis._popup.setLatLng(e.latlng);\n\t}\n});\n\n/*\r\n * Popup extension to L.Marker, adding popup-related methods.\r\n */\r\n\r\nL.Marker.include({\r\n\t_getPopupAnchor: function () {\r\n\t\treturn this.options.icon.options.popupAnchor || [0, 0];\r\n\t}\r\n});\r\n\n/*\n * @class Tooltip\n * @inherits DivOverlay\n * @aka L.Tooltip\n * Used to display small texts on top of map layers.\n *\n * @example\n *\n * ```js\n * marker.bindTooltip(\"my tooltip text\").openTooltip();\n * ```\n * Note about tooltip offset. Leaflet takes two options in consideration\n * for computing tooltip offseting:\n * - the `offset` Tooltip option: it defaults to [0, 0], and it's specific to one tooltip.\n * Add a positive x offset to move the tooltip to the right, and a positive y offset to\n * move it to the bottom. Negatives will move to the left and top.\n * - the `tooltipAnchor` Icon option: this will only be considered for Marker. You\n * should adapt this value if you use a custom icon.\n */\n\n\n// @namespace Tooltip\nL.Tooltip = L.DivOverlay.extend({\n\n\t// @section\n\t// @aka Tooltip options\n\toptions: {\n\t\t// @option pane: String = 'tooltipPane'\n\t\t// `Map pane` where the tooltip will be added.\n\t\tpane: 'tooltipPane',\n\n\t\t// @option offset: Point = Point(0, 0)\n\t\t// Optional offset of the tooltip position.\n\t\toffset: [0, 0],\n\n\t\t// @option direction: String = 'auto'\n\t\t// Direction where to open the tooltip. Possible values are: `right`, `left`,\n\t\t// `top`, `bottom`, `center`, `auto`.\n\t\t// `auto` will dynamicaly switch between `right` and `left` according to the tooltip\n\t\t// position on the map.\n\t\tdirection: 'auto',\n\n\t\t// @option permanent: Boolean = false\n\t\t// Whether to open the tooltip permanently or only on mouseover.\n\t\tpermanent: false,\n\n\t\t// @option sticky: Boolean = false\n\t\t// If true, the tooltip will follow the mouse instead of being fixed at the feature center.\n\t\tsticky: false,\n\n\t\t// @option interactive: Boolean = false\n\t\t// If true, the tooltip will listen to the feature events.\n\t\tinteractive: false,\n\n\t\t// @option opacity: Number = 0.9\n\t\t// Tooltip container opacity.\n\t\topacity: 0.9\n\t},\n\n\tonAdd: function (map) {\n\t\tL.DivOverlay.prototype.onAdd.call(this, map);\n\t\tthis.setOpacity(this.options.opacity);\n\n\t\t// @namespace Map\n\t\t// @section Tooltip events\n\t\t// @event tooltipopen: TooltipEvent\n\t\t// Fired when a tooltip is opened in the map.\n\t\tmap.fire('tooltipopen', {tooltip: this});\n\n\t\tif (this._source) {\n\t\t\t// @namespace Layer\n\t\t\t// @section Tooltip events\n\t\t\t// @event tooltipopen: TooltipEvent\n\t\t\t// Fired when a tooltip bound to this layer is opened.\n\t\t\tthis._source.fire('tooltipopen', {tooltip: this}, true);\n\t\t}\n\t},\n\n\tonRemove: function (map) {\n\t\tL.DivOverlay.prototype.onRemove.call(this, map);\n\n\t\t// @namespace Map\n\t\t// @section Tooltip events\n\t\t// @event tooltipclose: TooltipEvent\n\t\t// Fired when a tooltip in the map is closed.\n\t\tmap.fire('tooltipclose', {tooltip: this});\n\n\t\tif (this._source) {\n\t\t\t// @namespace Layer\n\t\t\t// @section Tooltip events\n\t\t\t// @event tooltipclose: TooltipEvent\n\t\t\t// Fired when a tooltip bound to this layer is closed.\n\t\t\tthis._source.fire('tooltipclose', {tooltip: this}, true);\n\t\t}\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = L.DivOverlay.prototype.getEvents.call(this);\n\n\t\tif (L.Browser.touch && !this.options.permanent) {\n\t\t\tevents.preclick = this._close;\n\t\t}\n\n\t\treturn events;\n\t},\n\n\t_close: function () {\n\t\tif (this._map) {\n\t\t\tthis._map.closeTooltip(this);\n\t\t}\n\t},\n\n\t_initLayout: function () {\n\t\tvar prefix = 'leaflet-tooltip',\n\t\t className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');\n\n\t\tthis._contentNode = this._container = L.DomUtil.create('div', className);\n\t},\n\n\t_updateLayout: function () {},\n\n\t_adjustPan: function () {},\n\n\t_setPosition: function (pos) {\n\t\tvar map = this._map,\n\t\t container = this._container,\n\t\t centerPoint = map.latLngToContainerPoint(map.getCenter()),\n\t\t tooltipPoint = map.layerPointToContainerPoint(pos),\n\t\t direction = this.options.direction,\n\t\t tooltipWidth = container.offsetWidth,\n\t\t tooltipHeight = container.offsetHeight,\n\t\t offset = L.point(this.options.offset),\n\t\t anchor = this._getAnchor();\n\n\t\tif (direction === 'top') {\n\t\t\tpos = pos.add(L.point(-tooltipWidth / 2 + offset.x, -tooltipHeight + offset.y + anchor.y));\n\t\t} else if (direction === 'bottom') {\n\t\t\tpos = pos.subtract(L.point(tooltipWidth / 2 - offset.x, -offset.y));\n\t\t} else if (direction === 'center') {\n\t\t\tpos = pos.subtract(L.point(tooltipWidth / 2 + offset.x, tooltipHeight / 2 - anchor.y + offset.y));\n\t\t} else if (direction === 'right' || direction === 'auto' && tooltipPoint.x < centerPoint.x) {\n\t\t\tdirection = 'right';\n\t\t\tpos = pos.add([offset.x + anchor.x, anchor.y - tooltipHeight / 2 + offset.y]);\n\t\t} else {\n\t\t\tdirection = 'left';\n\t\t\tpos = pos.subtract(L.point(tooltipWidth + anchor.x - offset.x, tooltipHeight / 2 - anchor.y - offset.y));\n\t\t}\n\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-right');\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-left');\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-top');\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-bottom');\n\t\tL.DomUtil.addClass(container, 'leaflet-tooltip-' + direction);\n\t\tL.DomUtil.setPosition(container, pos);\n\t},\n\n\t_updatePosition: function () {\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng);\n\t\tthis._setPosition(pos);\n\t},\n\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\n\t\tif (this._container) {\n\t\t\tL.DomUtil.setOpacity(this._container, opacity);\n\t\t}\n\t},\n\n\t_animateZoom: function (e) {\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center);\n\t\tthis._setPosition(pos);\n\t},\n\n\t_getAnchor: function () {\n\t\t// Where should we anchor the tooltip on the source layer?\n\t\treturn L.point(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]);\n\t}\n\n});\n\n// @namespace Tooltip\n// @factory L.tooltip(options?: Tooltip options, source?: Layer)\n// Instantiates a Tooltip object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the tooltip with a reference to the Layer to which it refers.\nL.tooltip = function (options, source) {\n\treturn new L.Tooltip(options, source);\n};\n\n// @namespace Map\n// @section Methods for Layers and Controls\nL.Map.include({\n\n\t// @method openTooltip(tooltip: Tooltip): this\n\t// Opens the specified tooltip.\n\t// @alternative\n\t// @method openTooltip(content: String|HTMLElement, latlng: LatLng, options?: Tooltip options): this\n\t// Creates a tooltip with the specified content and options and open it.\n\topenTooltip: function (tooltip, latlng, options) {\n\t\tif (!(tooltip instanceof L.Tooltip)) {\n\t\t\ttooltip = new L.Tooltip(options).setContent(tooltip);\n\t\t}\n\n\t\tif (latlng) {\n\t\t\ttooltip.setLatLng(latlng);\n\t\t}\n\n\t\tif (this.hasLayer(tooltip)) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn this.addLayer(tooltip);\n\t},\n\n\t// @method closeTooltip(tooltip?: Tooltip): this\n\t// Closes the tooltip given as parameter.\n\tcloseTooltip: function (tooltip) {\n\t\tif (tooltip) {\n\t\t\tthis.removeLayer(tooltip);\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\n/*\n * @namespace Layer\n * @section Tooltip methods example\n *\n * All layers share a set of methods convenient for binding tooltips to it.\n *\n * ```js\n * var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);\n * layer.openTooltip();\n * layer.closeTooltip();\n * ```\n */\n\n// @section Tooltip methods\nL.Layer.include({\n\n\t// @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this\n\t// Binds a tooltip to the layer with the passed `content` and sets up the\n\t// neccessary event listeners. If a `Function` is passed it will receive\n\t// the layer as the first argument and should return a `String` or `HTMLElement`.\n\tbindTooltip: function (content, options) {\n\n\t\tif (content instanceof L.Tooltip) {\n\t\t\tL.setOptions(content, options);\n\t\t\tthis._tooltip = content;\n\t\t\tcontent._source = this;\n\t\t} else {\n\t\t\tif (!this._tooltip || options) {\n\t\t\t\tthis._tooltip = L.tooltip(options, this);\n\t\t\t}\n\t\t\tthis._tooltip.setContent(content);\n\n\t\t}\n\n\t\tthis._initTooltipInteractions();\n\n\t\tif (this._tooltip.options.permanent && this._map && this._map.hasLayer(this)) {\n\t\t\tthis.openTooltip();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t// @method unbindTooltip(): this\n\t// Removes the tooltip previously bound with `bindTooltip`.\n\tunbindTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\tthis._initTooltipInteractions(true);\n\t\t\tthis.closeTooltip();\n\t\t\tthis._tooltip = null;\n\t\t}\n\t\treturn this;\n\t},\n\n\t_initTooltipInteractions: function (remove) {\n\t\tif (!remove && this._tooltipHandlersAdded) { return; }\n\t\tvar onOff = remove ? 'off' : 'on',\n\t\t events = {\n\t\t\tremove: this.closeTooltip,\n\t\t\tmove: this._moveTooltip\n\t\t };\n\t\tif (!this._tooltip.options.permanent) {\n\t\t\tevents.mouseover = this._openTooltip;\n\t\t\tevents.mouseout = this.closeTooltip;\n\t\t\tif (this._tooltip.options.sticky) {\n\t\t\t\tevents.mousemove = this._moveTooltip;\n\t\t\t}\n\t\t\tif (L.Browser.touch) {\n\t\t\t\tevents.click = this._openTooltip;\n\t\t\t}\n\t\t} else {\n\t\t\tevents.add = this._openTooltip;\n\t\t}\n\t\tthis[onOff](events);\n\t\tthis._tooltipHandlersAdded = !remove;\n\t},\n\n\t// @method openTooltip(latlng?: LatLng): this\n\t// Opens the bound tooltip at the specificed `latlng` or at the default tooltip anchor if no `latlng` is passed.\n\topenTooltip: function (layer, latlng) {\n\t\tif (!(layer instanceof L.Layer)) {\n\t\t\tlatlng = layer;\n\t\t\tlayer = this;\n\t\t}\n\n\t\tif (layer instanceof L.FeatureGroup) {\n\t\t\tfor (var id in this._layers) {\n\t\t\t\tlayer = this._layers[id];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!latlng) {\n\t\t\tlatlng = layer.getCenter ? layer.getCenter() : layer.getLatLng();\n\t\t}\n\n\t\tif (this._tooltip && this._map) {\n\n\t\t\t// set tooltip source to this layer\n\t\t\tthis._tooltip._source = layer;\n\n\t\t\t// update the tooltip (content, layout, ect...)\n\t\t\tthis._tooltip.update();\n\n\t\t\t// open the tooltip on the map\n\t\t\tthis._map.openTooltip(this._tooltip, latlng);\n\n\t\t\t// Tooltip container may not be defined if not permanent and never\n\t\t\t// opened.\n\t\t\tif (this._tooltip.options.interactive && this._tooltip._container) {\n\t\t\t\tL.DomUtil.addClass(this._tooltip._container, 'leaflet-clickable');\n\t\t\t\tthis.addInteractiveTarget(this._tooltip._container);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t// @method closeTooltip(): this\n\t// Closes the tooltip bound to this layer if it is open.\n\tcloseTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\tthis._tooltip._close();\n\t\t\tif (this._tooltip.options.interactive && this._tooltip._container) {\n\t\t\t\tL.DomUtil.removeClass(this._tooltip._container, 'leaflet-clickable');\n\t\t\t\tthis.removeInteractiveTarget(this._tooltip._container);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method toggleTooltip(): this\n\t// Opens or closes the tooltip bound to this layer depending on its current state.\n\ttoggleTooltip: function (target) {\n\t\tif (this._tooltip) {\n\t\t\tif (this._tooltip._map) {\n\t\t\t\tthis.closeTooltip();\n\t\t\t} else {\n\t\t\t\tthis.openTooltip(target);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method isTooltipOpen(): boolean\n\t// Returns `true` if the tooltip bound to this layer is currently open.\n\tisTooltipOpen: function () {\n\t\treturn this._tooltip.isOpen();\n\t},\n\n\t// @method setTooltipContent(content: String|HTMLElement|Tooltip): this\n\t// Sets the content of the tooltip bound to this layer.\n\tsetTooltipContent: function (content) {\n\t\tif (this._tooltip) {\n\t\t\tthis._tooltip.setContent(content);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getTooltip(): Tooltip\n\t// Returns the tooltip bound to this layer.\n\tgetTooltip: function () {\n\t\treturn this._tooltip;\n\t},\n\n\t_openTooltip: function (e) {\n\t\tvar layer = e.layer || e.target;\n\n\t\tif (!this._tooltip || !this._map) {\n\t\t\treturn;\n\t\t}\n\t\tthis.openTooltip(layer, this._tooltip.options.sticky ? e.latlng : undefined);\n\t},\n\n\t_moveTooltip: function (e) {\n\t\tvar latlng = e.latlng, containerPoint, layerPoint;\n\t\tif (this._tooltip.options.sticky && e.originalEvent) {\n\t\t\tcontainerPoint = this._map.mouseEventToContainerPoint(e.originalEvent);\n\t\t\tlayerPoint = this._map.containerPointToLayerPoint(containerPoint);\n\t\t\tlatlng = this._map.layerPointToLatLng(layerPoint);\n\t\t}\n\t\tthis._tooltip.setLatLng(latlng);\n\t}\n});\n\n/*\r\n * Tooltip extension to L.Marker, adding tooltip-related methods.\r\n */\r\n\r\nL.Marker.include({\r\n\t_getTooltipAnchor: function () {\r\n\t\treturn this.options.icon.options.tooltipAnchor || [0, 0];\r\n\t}\r\n});\r\n\n/*\r\n * @class LayerGroup\r\n * @aka L.LayerGroup\r\n * @inherits Layer\r\n *\r\n * Used to group several layers and handle them as one. If you add it to the map,\r\n * any layers added or removed from the group will be added/removed on the map as\r\n * well. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.layerGroup([marker1, marker2])\r\n * \t.addLayer(polyline)\r\n * \t.addTo(map);\r\n * ```\r\n */\r\n\r\nL.LayerGroup = L.Layer.extend({\r\n\r\n\tinitialize: function (layers) {\r\n\t\tthis._layers = {};\r\n\r\n\t\tvar i, len;\r\n\r\n\t\tif (layers) {\r\n\t\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\t\t\t\tthis.addLayer(layers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addLayer(layer: Layer): this\r\n\t// Adds the given layer to the group.\r\n\taddLayer: function (layer) {\r\n\t\tvar id = this.getLayerId(layer);\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.addLayer(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeLayer(layer: Layer): this\r\n\t// Removes the given layer from the group.\r\n\t// @alternative\r\n\t// @method removeLayer(id: Number): this\r\n\t// Removes the layer with the given internal ID from the group.\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = layer in this._layers ? layer : this.getLayerId(layer);\r\n\r\n\t\tif (this._map && this._layers[id]) {\r\n\t\t\tthis._map.removeLayer(this._layers[id]);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method hasLayer(layer: Layer): Boolean\r\n\t// Returns `true` if the given layer is currently added to the group.\r\n\thasLayer: function (layer) {\r\n\t\treturn !!layer && (layer in this._layers || this.getLayerId(layer) in this._layers);\r\n\t},\r\n\r\n\t// @method clearLayers(): this\r\n\t// Removes all the layers from the group.\r\n\tclearLayers: function () {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tthis.removeLayer(this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method invoke(methodName: String, …): this\r\n\t// Calls `methodName` on every layer contained in this group, passing any\r\n\t// additional parameters. Has no effect if the layers contained do not\r\n\t// implement `methodName`.\r\n\tinvoke: function (methodName) {\r\n\t\tvar args = Array.prototype.slice.call(arguments, 1),\r\n\t\t i, layer;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tlayer = this._layers[i];\r\n\r\n\t\t\tif (layer[methodName]) {\r\n\t\t\t\tlayer[methodName].apply(layer, args);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmap.addLayer(this._layers[i]);\r\n\t\t}\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmap.removeLayer(this._layers[i]);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method eachLayer(fn: Function, context?: Object): this\r\n\t// Iterates over the layers of the group, optionally specifying context of the iterator function.\r\n\t// ```js\r\n\t// group.eachLayer(function (layer) {\r\n\t// \tlayer.bindPopup('Hello');\r\n\t// });\r\n\t// ```\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getLayer(id: Number): Layer\r\n\t// Returns the layer with the given internal ID.\r\n\tgetLayer: function (id) {\r\n\t\treturn this._layers[id];\r\n\t},\r\n\r\n\t// @method getLayers(): Layer[]\r\n\t// Returns an array of all the layers added to the group.\r\n\tgetLayers: function () {\r\n\t\tvar layers = [];\r\n\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tlayers.push(this._layers[i]);\r\n\t\t}\r\n\t\treturn layers;\r\n\t},\r\n\r\n\t// @method setZIndex(zIndex: Number): this\r\n\t// Calls `setZIndex` on every layer contained in this group, passing the z-index.\r\n\tsetZIndex: function (zIndex) {\r\n\t\treturn this.invoke('setZIndex', zIndex);\r\n\t},\r\n\r\n\t// @method getLayerId(layer: Layer): Number\r\n\t// Returns the internal ID for a layer\r\n\tgetLayerId: function (layer) {\r\n\t\treturn L.stamp(layer);\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.layerGroup(layers: Layer[])\r\n// Create a layer group, optionally given an initial set of layers.\r\nL.layerGroup = function (layers) {\r\n\treturn new L.LayerGroup(layers);\r\n};\r\n\n/*\r\n * @class FeatureGroup\r\n * @aka L.FeatureGroup\r\n * @inherits LayerGroup\r\n *\r\n * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers:\r\n * * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip))\r\n * * Events are propagated to the `FeatureGroup`, so if the group has an event\r\n * handler, it will handle events from any of the layers. This includes mouse events\r\n * and custom events.\r\n * * Has `layeradd` and `layerremove` events\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.featureGroup([marker1, marker2, polyline])\r\n * \t.bindPopup('Hello world!')\r\n * \t.on('click', function() { alert('Clicked on a member of the group!'); })\r\n * \t.addTo(map);\r\n * ```\r\n */\r\n\r\nL.FeatureGroup = L.LayerGroup.extend({\r\n\r\n\taddLayer: function (layer) {\r\n\t\tif (this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tlayer.addEventParent(this);\r\n\r\n\t\tL.LayerGroup.prototype.addLayer.call(this, layer);\r\n\r\n\t\t// @event layeradd: LayerEvent\r\n\t\t// Fired when a layer is added to this `FeatureGroup`\r\n\t\treturn this.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tif (!this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif (layer in this._layers) {\r\n\t\t\tlayer = this._layers[layer];\r\n\t\t}\r\n\r\n\t\tlayer.removeEventParent(this);\r\n\r\n\t\tL.LayerGroup.prototype.removeLayer.call(this, layer);\r\n\r\n\t\t// @event layerremove: LayerEvent\r\n\t\t// Fired when a layer is removed from this `FeatureGroup`\r\n\t\treturn this.fire('layerremove', {layer: layer});\r\n\t},\r\n\r\n\t// @method setStyle(style: Path options): this\r\n\t// Sets the given path options to each layer of the group that has a `setStyle` method.\r\n\tsetStyle: function (style) {\r\n\t\treturn this.invoke('setStyle', style);\r\n\t},\r\n\r\n\t// @method bringToFront(): this\r\n\t// Brings the layer group to the top of all other layers\r\n\tbringToFront: function () {\r\n\t\treturn this.invoke('bringToFront');\r\n\t},\r\n\r\n\t// @method bringToBack(): this\r\n\t// Brings the layer group to the top of all other layers\r\n\tbringToBack: function () {\r\n\t\treturn this.invoke('bringToBack');\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).\r\n\tgetBounds: function () {\r\n\t\tvar bounds = new L.LatLngBounds();\r\n\r\n\t\tfor (var id in this._layers) {\r\n\t\t\tvar layer = this._layers[id];\r\n\t\t\tbounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng());\r\n\t\t}\r\n\t\treturn bounds;\r\n\t}\r\n});\r\n\r\n// @factory L.featureGroup(layers: Layer[])\r\n// Create a feature group, optionally given an initial set of layers.\r\nL.featureGroup = function (layers) {\r\n\treturn new L.FeatureGroup(layers);\r\n};\r\n\n/*\n * @class Renderer\n * @inherits Layer\n * @aka L.Renderer\n *\n * Base class for vector renderer implementations (`SVG`, `Canvas`). Handles the\n * DOM container of the renderer, its bounds, and its zoom animation.\n *\n * A `Renderer` works as an implicit layer group for all `Path`s - the renderer\n * itself can be added or removed to the map. All paths use a renderer, which can\n * be implicit (the map will decide the type of renderer and use it automatically)\n * or explicit (using the [`renderer`](#path-renderer) option of the path).\n *\n * Do not use this class directly, use `SVG` and `Canvas` instead.\n *\n * @event update: Event\n * Fired when the renderer updates its bounds, center and zoom, for example when\n * its map has moved\n */\n\nL.Renderer = L.Layer.extend({\n\n\t// @section\n\t// @aka Renderer options\n\toptions: {\n\t\t// @option padding: Number = 0.1\n\t\t// How much to extend the clip area around the map view (relative to its size)\n\t\t// e.g. 0.1 would be 10% of map view in each direction\n\t\tpadding: 0.1\n\t},\n\n\tinitialize: function (options) {\n\t\tL.setOptions(this, options);\n\t\tL.stamp(this);\n\t},\n\n\tonAdd: function () {\n\t\tif (!this._container) {\n\t\t\tthis._initContainer(); // defined by renderer implementations\n\n\t\t\tif (this._zoomAnimated) {\n\t\t\t\tL.DomUtil.addClass(this._container, 'leaflet-zoom-animated');\n\t\t\t}\n\t\t}\n\n\t\tthis.getPane().appendChild(this._container);\n\t\tthis._update();\n\t},\n\n\tonRemove: function () {\n\t\tL.DomUtil.remove(this._container);\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = {\n\t\t\tviewreset: this._reset,\n\t\t\tzoom: this._onZoom,\n\t\t\tmoveend: this._update\n\t\t};\n\t\tif (this._zoomAnimated) {\n\t\t\tevents.zoomanim = this._onAnimZoom;\n\t\t}\n\t\treturn events;\n\t},\n\n\t_onAnimZoom: function (ev) {\n\t\tthis._updateTransform(ev.center, ev.zoom);\n\t},\n\n\t_onZoom: function () {\n\t\tthis._updateTransform(this._map.getCenter(), this._map.getZoom());\n\t},\n\n\t_updateTransform: function (center, zoom) {\n\t\tvar scale = this._map.getZoomScale(zoom, this._zoom),\n\t\t position = L.DomUtil.getPosition(this._container),\n\t\t viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding),\n\t\t currentCenterPoint = this._map.project(this._center, zoom),\n\t\t destCenterPoint = this._map.project(center, zoom),\n\t\t centerOffset = destCenterPoint.subtract(currentCenterPoint),\n\n\t\t topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset);\n\n\t\tif (L.Browser.any3d) {\n\t\t\tL.DomUtil.setTransform(this._container, topLeftOffset, scale);\n\t\t} else {\n\t\t\tL.DomUtil.setPosition(this._container, topLeftOffset);\n\t\t}\n\t},\n\n\t_reset: function () {\n\t\tthis._update();\n\t\tthis._updateTransform(this._center, this._zoom);\n\t},\n\n\t_update: function () {\n\t\t// Update pixel bounds of renderer container (for positioning/sizing/clipping later)\n\t\t// Subclasses are responsible of firing the 'update' event.\n\t\tvar p = this.options.padding,\n\t\t size = this._map.getSize(),\n\t\t min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round();\n\n\t\tthis._bounds = new L.Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round());\n\n\t\tthis._center = this._map.getCenter();\n\t\tthis._zoom = this._map.getZoom();\n\t}\n});\n\n\nL.Map.include({\n\t// @namespace Map; @method getRenderer(layer: Path): Renderer\n\t// Returns the instance of `Renderer` that should be used to render the given\n\t// `Path`. It will ensure that the `renderer` options of the map and paths\n\t// are respected, and that the renderers do exist on the map.\n\tgetRenderer: function (layer) {\n\t\t// @namespace Path; @option renderer: Renderer\n\t\t// Use this specific instance of `Renderer` for this path. Takes\n\t\t// precedence over the map's [default renderer](#map-renderer).\n\t\tvar renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer;\n\n\t\tif (!renderer) {\n\t\t\t// @namespace Map; @option preferCanvas: Boolean = false\n\t\t\t// Whether `Path`s should be rendered on a `Canvas` renderer.\n\t\t\t// By default, all `Path`s are rendered in a `SVG` renderer.\n\t\t\trenderer = this._renderer = (this.options.preferCanvas && L.canvas()) || L.svg();\n\t\t}\n\n\t\tif (!this.hasLayer(renderer)) {\n\t\t\tthis.addLayer(renderer);\n\t\t}\n\t\treturn renderer;\n\t},\n\n\t_getPaneRenderer: function (name) {\n\t\tif (name === 'overlayPane' || name === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar renderer = this._paneRenderers[name];\n\t\tif (renderer === undefined) {\n\t\t\trenderer = (L.SVG && L.svg({pane: name})) || (L.Canvas && L.canvas({pane: name}));\n\t\t\tthis._paneRenderers[name] = renderer;\n\t\t}\n\t\treturn renderer;\n\t}\n});\n\n/*\n * @class Path\n * @aka L.Path\n * @inherits Interactive layer\n *\n * An abstract class that contains options and constants shared between vector\n * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`.\n */\n\nL.Path = L.Layer.extend({\n\n\t// @section\n\t// @aka Path options\n\toptions: {\n\t\t// @option stroke: Boolean = true\n\t\t// Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles.\n\t\tstroke: true,\n\n\t\t// @option color: String = '#3388ff'\n\t\t// Stroke color\n\t\tcolor: '#3388ff',\n\n\t\t// @option weight: Number = 3\n\t\t// Stroke width in pixels\n\t\tweight: 3,\n\n\t\t// @option opacity: Number = 1.0\n\t\t// Stroke opacity\n\t\topacity: 1,\n\n\t\t// @option lineCap: String= 'round'\n\t\t// A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke.\n\t\tlineCap: 'round',\n\n\t\t// @option lineJoin: String = 'round'\n\t\t// A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke.\n\t\tlineJoin: 'round',\n\n\t\t// @option dashArray: String = null\n\t\t// A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).\n\t\tdashArray: null,\n\n\t\t// @option dashOffset: String = null\n\t\t// A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).\n\t\tdashOffset: null,\n\n\t\t// @option fill: Boolean = depends\n\t\t// Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles.\n\t\tfill: false,\n\n\t\t// @option fillColor: String = *\n\t\t// Fill color. Defaults to the value of the [`color`](#path-color) option\n\t\tfillColor: null,\n\n\t\t// @option fillOpacity: Number = 0.2\n\t\t// Fill opacity.\n\t\tfillOpacity: 0.2,\n\n\t\t// @option fillRule: String = 'evenodd'\n\t\t// A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined.\n\t\tfillRule: 'evenodd',\n\n\t\t// className: '',\n\n\t\t// Option inherited from \"Interactive layer\" abstract class\n\t\tinteractive: true\n\t},\n\n\tbeforeAdd: function (map) {\n\t\t// Renderer is set here because we need to call renderer.getEvents\n\t\t// before this.getEvents.\n\t\tthis._renderer = map.getRenderer(this);\n\t},\n\n\tonAdd: function () {\n\t\tthis._renderer._initPath(this);\n\t\tthis._reset();\n\t\tthis._renderer._addPath(this);\n\t\tthis._renderer.on('update', this._update, this);\n\t},\n\n\tonRemove: function () {\n\t\tthis._renderer._removePath(this);\n\t\tthis._renderer.off('update', this._update, this);\n\t},\n\n\tgetEvents: function () {\n\t\treturn {\n\t\t\tzoomend: this._project,\n\t\t\tviewreset: this._reset\n\t\t};\n\t},\n\n\t// @method redraw(): this\n\t// Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._renderer._updatePath(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method setStyle(style: Path options): this\n\t// Changes the appearance of a Path based on the options in the `Path options` object.\n\tsetStyle: function (style) {\n\t\tL.setOptions(this, style);\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._updateStyle(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToFront(): this\n\t// Brings the layer to the top of all path layers.\n\tbringToFront: function () {\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._bringToFront(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToBack(): this\n\t// Brings the layer to the bottom of all path layers.\n\tbringToBack: function () {\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._bringToBack(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetElement: function () {\n\t\treturn this._path;\n\t},\n\n\t_reset: function () {\n\t\t// defined in children classes\n\t\tthis._project();\n\t\tthis._update();\n\t},\n\n\t_clickTolerance: function () {\n\t\t// used when doing hit detection for Canvas layers\n\t\treturn (this.options.stroke ? this.options.weight / 2 : 0) + (L.Browser.touch ? 10 : 0);\n\t}\n});\n\n/*\r\n * @namespace LineUtil\r\n *\r\n * Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.\r\n */\r\n\r\nL.LineUtil = {\r\n\r\n\t// Simplify polyline with vertex reduction and Douglas-Peucker simplification.\r\n\t// Improves rendering performance dramatically by lessening the number of points to draw.\r\n\r\n\t// @function simplify(points: Point[], tolerance: Number): Point[]\r\n\t// Dramatically reduces the number of points in a polyline while retaining\r\n\t// its shape and returns a new array of simplified points, using the\r\n\t// [Douglas-Peucker algorithm](http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm).\r\n\t// Used for a huge performance boost when processing/displaying Leaflet polylines for\r\n\t// each zoom level and also reducing visual noise. tolerance affects the amount of\r\n\t// simplification (lesser value means higher quality but slower and with more points).\r\n\t// Also released as a separated micro-library [Simplify.js](http://mourner.github.com/simplify-js/).\r\n\tsimplify: function (points, tolerance) {\r\n\t\tif (!tolerance || !points.length) {\r\n\t\t\treturn points.slice();\r\n\t\t}\r\n\r\n\t\tvar sqTolerance = tolerance * tolerance;\r\n\r\n\t\t// stage 1: vertex reduction\r\n\t\tpoints = this._reducePoints(points, sqTolerance);\r\n\r\n\t\t// stage 2: Douglas-Peucker simplification\r\n\t\tpoints = this._simplifyDP(points, sqTolerance);\r\n\r\n\t\treturn points;\r\n\t},\r\n\r\n\t// @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number\r\n\t// Returns the distance between point `p` and segment `p1` to `p2`.\r\n\tpointToSegmentDistance: function (p, p1, p2) {\r\n\t\treturn Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));\r\n\t},\r\n\r\n\t// @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number\r\n\t// Returns the closest point from a point `p` on a segment `p1` to `p2`.\r\n\tclosestPointOnSegment: function (p, p1, p2) {\r\n\t\treturn this._sqClosestPointOnSegment(p, p1, p2);\r\n\t},\r\n\r\n\t// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm\r\n\t_simplifyDP: function (points, sqTolerance) {\r\n\r\n\t\tvar len = points.length,\r\n\t\t ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,\r\n\t\t markers = new ArrayConstructor(len);\r\n\r\n\t\tmarkers[0] = markers[len - 1] = 1;\r\n\r\n\t\tthis._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);\r\n\r\n\t\tvar i,\r\n\t\t newPoints = [];\r\n\r\n\t\tfor (i = 0; i < len; i++) {\r\n\t\t\tif (markers[i]) {\r\n\t\t\t\tnewPoints.push(points[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn newPoints;\r\n\t},\r\n\r\n\t_simplifyDPStep: function (points, markers, sqTolerance, first, last) {\r\n\r\n\t\tvar maxSqDist = 0,\r\n\t\t index, i, sqDist;\r\n\r\n\t\tfor (i = first + 1; i <= last - 1; i++) {\r\n\t\t\tsqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);\r\n\r\n\t\t\tif (sqDist > maxSqDist) {\r\n\t\t\t\tindex = i;\r\n\t\t\t\tmaxSqDist = sqDist;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (maxSqDist > sqTolerance) {\r\n\t\t\tmarkers[index] = 1;\r\n\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, first, index);\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, index, last);\r\n\t\t}\r\n\t},\r\n\r\n\t// reduce points that are too close to each other to a single point\r\n\t_reducePoints: function (points, sqTolerance) {\r\n\t\tvar reducedPoints = [points[0]];\r\n\r\n\t\tfor (var i = 1, prev = 0, len = points.length; i < len; i++) {\r\n\t\t\tif (this._sqDist(points[i], points[prev]) > sqTolerance) {\r\n\t\t\t\treducedPoints.push(points[i]);\r\n\t\t\t\tprev = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (prev < len - 1) {\r\n\t\t\treducedPoints.push(points[len - 1]);\r\n\t\t}\r\n\t\treturn reducedPoints;\r\n\t},\r\n\r\n\r\n\t// @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean\r\n\t// Clips the segment a to b by rectangular bounds with the\r\n\t// [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm)\r\n\t// (modifying the segment points directly!). Used by Leaflet to only show polyline\r\n\t// points that are on the screen or near, increasing performance.\r\n\tclipSegment: function (a, b, bounds, useLastCode, round) {\r\n\t\tvar codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),\r\n\t\t codeB = this._getBitCode(b, bounds),\r\n\r\n\t\t codeOut, p, newCode;\r\n\r\n\t\t// save 2nd code to avoid calculating it on the next segment\r\n\t\tthis._lastCode = codeB;\r\n\r\n\t\twhile (true) {\r\n\t\t\t// if a,b is inside the clip window (trivial accept)\r\n\t\t\tif (!(codeA | codeB)) {\r\n\t\t\t\treturn [a, b];\r\n\t\t\t}\r\n\r\n\t\t\t// if a,b is outside the clip window (trivial reject)\r\n\t\t\tif (codeA & codeB) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// other cases\r\n\t\t\tcodeOut = codeA || codeB;\r\n\t\t\tp = this._getEdgeIntersection(a, b, codeOut, bounds, round);\r\n\t\t\tnewCode = this._getBitCode(p, bounds);\r\n\r\n\t\t\tif (codeOut === codeA) {\r\n\t\t\t\ta = p;\r\n\t\t\t\tcodeA = newCode;\r\n\t\t\t} else {\r\n\t\t\t\tb = p;\r\n\t\t\t\tcodeB = newCode;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_getEdgeIntersection: function (a, b, code, bounds, round) {\r\n\t\tvar dx = b.x - a.x,\r\n\t\t dy = b.y - a.y,\r\n\t\t min = bounds.min,\r\n\t\t max = bounds.max,\r\n\t\t x, y;\r\n\r\n\t\tif (code & 8) { // top\r\n\t\t\tx = a.x + dx * (max.y - a.y) / dy;\r\n\t\t\ty = max.y;\r\n\r\n\t\t} else if (code & 4) { // bottom\r\n\t\t\tx = a.x + dx * (min.y - a.y) / dy;\r\n\t\t\ty = min.y;\r\n\r\n\t\t} else if (code & 2) { // right\r\n\t\t\tx = max.x;\r\n\t\t\ty = a.y + dy * (max.x - a.x) / dx;\r\n\r\n\t\t} else if (code & 1) { // left\r\n\t\t\tx = min.x;\r\n\t\t\ty = a.y + dy * (min.x - a.x) / dx;\r\n\t\t}\r\n\r\n\t\treturn new L.Point(x, y, round);\r\n\t},\r\n\r\n\t_getBitCode: function (p, bounds) {\r\n\t\tvar code = 0;\r\n\r\n\t\tif (p.x < bounds.min.x) { // left\r\n\t\t\tcode |= 1;\r\n\t\t} else if (p.x > bounds.max.x) { // right\r\n\t\t\tcode |= 2;\r\n\t\t}\r\n\r\n\t\tif (p.y < bounds.min.y) { // bottom\r\n\t\t\tcode |= 4;\r\n\t\t} else if (p.y > bounds.max.y) { // top\r\n\t\t\tcode |= 8;\r\n\t\t}\r\n\r\n\t\treturn code;\r\n\t},\r\n\r\n\t// square distance (to avoid unnecessary Math.sqrt calls)\r\n\t_sqDist: function (p1, p2) {\r\n\t\tvar dx = p2.x - p1.x,\r\n\t\t dy = p2.y - p1.y;\r\n\t\treturn dx * dx + dy * dy;\r\n\t},\r\n\r\n\t// return closest point on segment or distance to that point\r\n\t_sqClosestPointOnSegment: function (p, p1, p2, sqDist) {\r\n\t\tvar x = p1.x,\r\n\t\t y = p1.y,\r\n\t\t dx = p2.x - x,\r\n\t\t dy = p2.y - y,\r\n\t\t dot = dx * dx + dy * dy,\r\n\t\t t;\r\n\r\n\t\tif (dot > 0) {\r\n\t\t\tt = ((p.x - x) * dx + (p.y - y) * dy) / dot;\r\n\r\n\t\t\tif (t > 1) {\r\n\t\t\t\tx = p2.x;\r\n\t\t\t\ty = p2.y;\r\n\t\t\t} else if (t > 0) {\r\n\t\t\t\tx += dx * t;\r\n\t\t\t\ty += dy * t;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdx = p.x - x;\r\n\t\tdy = p.y - y;\r\n\r\n\t\treturn sqDist ? dx * dx + dy * dy : new L.Point(x, y);\r\n\t}\r\n};\r\n\n/*\n * @class Polyline\n * @aka L.Polyline\n * @inherits Path\n *\n * A class for drawing polyline overlays on a map. Extends `Path`.\n *\n * @example\n *\n * ```js\n * // create a red polyline from an array of LatLng points\n * var latlngs = [\n * \t[-122.68, 45.51],\n * \t[-122.43, 37.77],\n * \t[-118.2, 34.04]\n * ];\n *\n * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);\n *\n * // zoom the map to the polyline\n * map.fitBounds(polyline.getBounds());\n * ```\n *\n * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape:\n *\n * ```js\n * // create a red polyline from an array of arrays of LatLng points\n * var latlngs = [\n * \t[[-122.68, 45.51],\n * \t [-122.43, 37.77],\n * \t [-118.2, 34.04]],\n * \t[[-73.91, 40.78],\n * \t [-87.62, 41.83],\n * \t [-96.72, 32.76]]\n * ];\n * ```\n */\n\nL.Polyline = L.Path.extend({\n\n\t// @section\n\t// @aka Polyline options\n\toptions: {\n\t\t// @option smoothFactor: Number = 1.0\n\t\t// How much to simplify the polyline on each zoom level. More means\n\t\t// better performance and smoother look, and less means more accurate representation.\n\t\tsmoothFactor: 1.0,\n\n\t\t// @option noClip: Boolean = false\n\t\t// Disable polyline clipping.\n\t\tnoClip: false\n\t},\n\n\tinitialize: function (latlngs, options) {\n\t\tL.setOptions(this, options);\n\t\tthis._setLatLngs(latlngs);\n\t},\n\n\t// @method getLatLngs(): LatLng[]\n\t// Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.\n\tgetLatLngs: function () {\n\t\treturn this._latlngs;\n\t},\n\n\t// @method setLatLngs(latlngs: LatLng[]): this\n\t// Replaces all the points in the polyline with the given array of geographical points.\n\tsetLatLngs: function (latlngs) {\n\t\tthis._setLatLngs(latlngs);\n\t\treturn this.redraw();\n\t},\n\n\t// @method isEmpty(): Boolean\n\t// Returns `true` if the Polyline has no LatLngs.\n\tisEmpty: function () {\n\t\treturn !this._latlngs.length;\n\t},\n\n\tclosestLayerPoint: function (p) {\n\t\tvar minDistance = Infinity,\n\t\t minPoint = null,\n\t\t closest = L.LineUtil._sqClosestPointOnSegment,\n\t\t p1, p2;\n\n\t\tfor (var j = 0, jLen = this._parts.length; j < jLen; j++) {\n\t\t\tvar points = this._parts[j];\n\n\t\t\tfor (var i = 1, len = points.length; i < len; i++) {\n\t\t\t\tp1 = points[i - 1];\n\t\t\t\tp2 = points[i];\n\n\t\t\t\tvar sqDist = closest(p, p1, p2, true);\n\n\t\t\t\tif (sqDist < minDistance) {\n\t\t\t\t\tminDistance = sqDist;\n\t\t\t\t\tminPoint = closest(p, p1, p2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (minPoint) {\n\t\t\tminPoint.distance = Math.sqrt(minDistance);\n\t\t}\n\t\treturn minPoint;\n\t},\n\n\t// @method getCenter(): LatLng\n\t// Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the polyline.\n\tgetCenter: function () {\n\t\t// throws error when not yet added to map as this center calculation requires projected coordinates\n\t\tif (!this._map) {\n\t\t\tthrow new Error('Must add layer to map before using getCenter()');\n\t\t}\n\n\t\tvar i, halfDist, segDist, dist, p1, p2, ratio,\n\t\t points = this._rings[0],\n\t\t len = points.length;\n\n\t\tif (!len) { return null; }\n\n\t\t// polyline centroid algorithm; only uses the first ring if there are multiple\n\n\t\tfor (i = 0, halfDist = 0; i < len - 1; i++) {\n\t\t\thalfDist += points[i].distanceTo(points[i + 1]) / 2;\n\t\t}\n\n\t\t// The line is so small in the current view that all points are on the same pixel.\n\t\tif (halfDist === 0) {\n\t\t\treturn this._map.layerPointToLatLng(points[0]);\n\t\t}\n\n\t\tfor (i = 0, dist = 0; i < len - 1; i++) {\n\t\t\tp1 = points[i];\n\t\t\tp2 = points[i + 1];\n\t\t\tsegDist = p1.distanceTo(p2);\n\t\t\tdist += segDist;\n\n\t\t\tif (dist > halfDist) {\n\t\t\t\tratio = (dist - halfDist) / segDist;\n\t\t\t\treturn this._map.layerPointToLatLng([\n\t\t\t\t\tp2.x - ratio * (p2.x - p1.x),\n\t\t\t\t\tp2.y - ratio * (p2.y - p1.y)\n\t\t\t\t]);\n\t\t\t}\n\t\t}\n\t},\n\n\t// @method getBounds(): LatLngBounds\n\t// Returns the `LatLngBounds` of the path.\n\tgetBounds: function () {\n\t\treturn this._bounds;\n\t},\n\n\t// @method addLatLng(latlng: LatLng, latlngs? LatLng[]): this\n\t// Adds a given point to the polyline. By default, adds to the first ring of\n\t// the polyline in case of a multi-polyline, but can be overridden by passing\n\t// a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)).\n\taddLatLng: function (latlng, latlngs) {\n\t\tlatlngs = latlngs || this._defaultShape();\n\t\tlatlng = L.latLng(latlng);\n\t\tlatlngs.push(latlng);\n\t\tthis._bounds.extend(latlng);\n\t\treturn this.redraw();\n\t},\n\n\t_setLatLngs: function (latlngs) {\n\t\tthis._bounds = new L.LatLngBounds();\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\n\t},\n\n\t_defaultShape: function () {\n\t\treturn L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0];\n\t},\n\n\t// recursively convert latlngs input into actual LatLng instances; calculate bounds along the way\n\t_convertLatLngs: function (latlngs) {\n\t\tvar result = [],\n\t\t flat = L.Polyline._flat(latlngs);\n\n\t\tfor (var i = 0, len = latlngs.length; i < len; i++) {\n\t\t\tif (flat) {\n\t\t\t\tresult[i] = L.latLng(latlngs[i]);\n\t\t\t\tthis._bounds.extend(result[i]);\n\t\t\t} else {\n\t\t\t\tresult[i] = this._convertLatLngs(latlngs[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t},\n\n\t_project: function () {\n\t\tvar pxBounds = new L.Bounds();\n\t\tthis._rings = [];\n\t\tthis._projectLatlngs(this._latlngs, this._rings, pxBounds);\n\n\t\tvar w = this._clickTolerance(),\n\t\t p = new L.Point(w, w);\n\n\t\tif (this._bounds.isValid() && pxBounds.isValid()) {\n\t\t\tpxBounds.min._subtract(p);\n\t\t\tpxBounds.max._add(p);\n\t\t\tthis._pxBounds = pxBounds;\n\t\t}\n\t},\n\n\t// recursively turns latlngs into a set of rings with projected coordinates\n\t_projectLatlngs: function (latlngs, result, projectedBounds) {\n\t\tvar flat = latlngs[0] instanceof L.LatLng,\n\t\t len = latlngs.length,\n\t\t i, ring;\n\n\t\tif (flat) {\n\t\t\tring = [];\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tring[i] = this._map.latLngToLayerPoint(latlngs[i]);\n\t\t\t\tprojectedBounds.extend(ring[i]);\n\t\t\t}\n\t\t\tresult.push(ring);\n\t\t} else {\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tthis._projectLatlngs(latlngs[i], result, projectedBounds);\n\t\t\t}\n\t\t}\n\t},\n\n\t// clip polyline by renderer bounds so that we have less to render for performance\n\t_clipPoints: function () {\n\t\tvar bounds = this._renderer._bounds;\n\n\t\tthis._parts = [];\n\t\tif (!this._pxBounds || !this._pxBounds.intersects(bounds)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.options.noClip) {\n\t\t\tthis._parts = this._rings;\n\t\t\treturn;\n\t\t}\n\n\t\tvar parts = this._parts,\n\t\t i, j, k, len, len2, segment, points;\n\n\t\tfor (i = 0, k = 0, len = this._rings.length; i < len; i++) {\n\t\t\tpoints = this._rings[i];\n\n\t\t\tfor (j = 0, len2 = points.length; j < len2 - 1; j++) {\n\t\t\t\tsegment = L.LineUtil.clipSegment(points[j], points[j + 1], bounds, j, true);\n\n\t\t\t\tif (!segment) { continue; }\n\n\t\t\t\tparts[k] = parts[k] || [];\n\t\t\t\tparts[k].push(segment[0]);\n\n\t\t\t\t// if segment goes out of screen, or it's the last one, it's the end of the line part\n\t\t\t\tif ((segment[1] !== points[j + 1]) || (j === len2 - 2)) {\n\t\t\t\t\tparts[k].push(segment[1]);\n\t\t\t\t\tk++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// simplify each clipped part of the polyline for performance\n\t_simplifyPoints: function () {\n\t\tvar parts = this._parts,\n\t\t tolerance = this.options.smoothFactor;\n\n\t\tfor (var i = 0, len = parts.length; i < len; i++) {\n\t\t\tparts[i] = L.LineUtil.simplify(parts[i], tolerance);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tif (!this._map) { return; }\n\n\t\tthis._clipPoints();\n\t\tthis._simplifyPoints();\n\t\tthis._updatePath();\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updatePoly(this);\n\t}\n});\n\n// @factory L.polyline(latlngs: LatLng[], options?: Polyline options)\n// Instantiates a polyline object given an array of geographical points and\n// optionally an options object. You can create a `Polyline` object with\n// multiple separate lines (`MultiPolyline`) by passing an array of arrays\n// of geographic points.\nL.polyline = function (latlngs, options) {\n\treturn new L.Polyline(latlngs, options);\n};\n\nL.Polyline._flat = function (latlngs) {\n\t// true if it's a flat array of latlngs; false if nested\n\treturn !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined');\n};\n\n/*\r\n * @namespace PolyUtil\r\n * Various utility functions for polygon geometries.\r\n */\r\n\r\nL.PolyUtil = {};\r\n\r\n/* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[]\r\n * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgeman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)).\r\n * Used by Leaflet to only show polygon points that are on the screen or near, increasing\r\n * performance. Note that polygon points needs different algorithm for clipping\r\n * than polyline, so there's a seperate method for it.\r\n */\r\nL.PolyUtil.clipPolygon = function (points, bounds, round) {\r\n\tvar clippedPoints,\r\n\t edges = [1, 4, 2, 8],\r\n\t i, j, k,\r\n\t a, b,\r\n\t len, edge, p,\r\n\t lu = L.LineUtil;\r\n\r\n\tfor (i = 0, len = points.length; i < len; i++) {\r\n\t\tpoints[i]._code = lu._getBitCode(points[i], bounds);\r\n\t}\r\n\r\n\t// for each edge (left, bottom, right, top)\r\n\tfor (k = 0; k < 4; k++) {\r\n\t\tedge = edges[k];\r\n\t\tclippedPoints = [];\r\n\r\n\t\tfor (i = 0, len = points.length, j = len - 1; i < len; j = i++) {\r\n\t\t\ta = points[i];\r\n\t\t\tb = points[j];\r\n\r\n\t\t\t// if a is inside the clip window\r\n\t\t\tif (!(a._code & edge)) {\r\n\t\t\t\t// if b is outside the clip window (a->b goes out of screen)\r\n\t\t\t\tif (b._code & edge) {\r\n\t\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds, round);\r\n\t\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\t\tclippedPoints.push(p);\r\n\t\t\t\t}\r\n\t\t\t\tclippedPoints.push(a);\r\n\r\n\t\t\t// else if b is inside the clip window (a->b enters the screen)\r\n\t\t\t} else if (!(b._code & edge)) {\r\n\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds, round);\r\n\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\tclippedPoints.push(p);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpoints = clippedPoints;\r\n\t}\r\n\r\n\treturn points;\r\n};\r\n\n/*\n * @class Polygon\n * @aka L.Polygon\n * @inherits Polyline\n *\n * A class for drawing polygon overlays on a map. Extends `Polyline`.\n *\n * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.\n *\n *\n * @example\n *\n * ```js\n * // create a red polygon from an array of LatLng points\n * var latlngs = [[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]];\n *\n * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);\n *\n * // zoom the map to the polygon\n * map.fitBounds(polygon.getBounds());\n * ```\n *\n * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:\n *\n * ```js\n * var latlngs = [\n * [[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]], // outer ring\n * [[-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29]] // hole\n * ];\n * ```\n *\n * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.\n *\n * ```js\n * var latlngs = [\n * [ // first polygon\n * [[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]], // outer ring\n * [[-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29]] // hole\n * ],\n * [ // second polygon\n * [[-109.05, 37],[-109.03, 41],[-102.05, 41],[-102.04, 37],[-109.05, 38]]\n * ]\n * ];\n * ```\n */\n\nL.Polygon = L.Polyline.extend({\n\n\toptions: {\n\t\tfill: true\n\t},\n\n\tisEmpty: function () {\n\t\treturn !this._latlngs.length || !this._latlngs[0].length;\n\t},\n\n\tgetCenter: function () {\n\t\t// throws error when not yet added to map as this center calculation requires projected coordinates\n\t\tif (!this._map) {\n\t\t\tthrow new Error('Must add layer to map before using getCenter()');\n\t\t}\n\n\t\tvar i, j, p1, p2, f, area, x, y, center,\n\t\t points = this._rings[0],\n\t\t len = points.length;\n\n\t\tif (!len) { return null; }\n\n\t\t// polygon centroid algorithm; only uses the first ring if there are multiple\n\n\t\tarea = x = y = 0;\n\n\t\tfor (i = 0, j = len - 1; i < len; j = i++) {\n\t\t\tp1 = points[i];\n\t\t\tp2 = points[j];\n\n\t\t\tf = p1.y * p2.x - p2.y * p1.x;\n\t\t\tx += (p1.x + p2.x) * f;\n\t\t\ty += (p1.y + p2.y) * f;\n\t\t\tarea += f * 3;\n\t\t}\n\n\t\tif (area === 0) {\n\t\t\t// Polygon is so small that all points are on same pixel.\n\t\t\tcenter = points[0];\n\t\t} else {\n\t\t\tcenter = [x / area, y / area];\n\t\t}\n\t\treturn this._map.layerPointToLatLng(center);\n\t},\n\n\t_convertLatLngs: function (latlngs) {\n\t\tvar result = L.Polyline.prototype._convertLatLngs.call(this, latlngs),\n\t\t len = result.length;\n\n\t\t// remove last point if it equals first one\n\t\tif (len >= 2 && result[0] instanceof L.LatLng && result[0].equals(result[len - 1])) {\n\t\t\tresult.pop();\n\t\t}\n\t\treturn result;\n\t},\n\n\t_setLatLngs: function (latlngs) {\n\t\tL.Polyline.prototype._setLatLngs.call(this, latlngs);\n\t\tif (L.Polyline._flat(this._latlngs)) {\n\t\t\tthis._latlngs = [this._latlngs];\n\t\t}\n\t},\n\n\t_defaultShape: function () {\n\t\treturn L.Polyline._flat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0];\n\t},\n\n\t_clipPoints: function () {\n\t\t// polygons need a different clipping algorithm so we redefine that\n\n\t\tvar bounds = this._renderer._bounds,\n\t\t w = this.options.weight,\n\t\t p = new L.Point(w, w);\n\n\t\t// increase clip padding by stroke width to avoid stroke on clip edges\n\t\tbounds = new L.Bounds(bounds.min.subtract(p), bounds.max.add(p));\n\n\t\tthis._parts = [];\n\t\tif (!this._pxBounds || !this._pxBounds.intersects(bounds)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.options.noClip) {\n\t\t\tthis._parts = this._rings;\n\t\t\treturn;\n\t\t}\n\n\t\tfor (var i = 0, len = this._rings.length, clipped; i < len; i++) {\n\t\t\tclipped = L.PolyUtil.clipPolygon(this._rings[i], bounds, true);\n\t\t\tif (clipped.length) {\n\t\t\t\tthis._parts.push(clipped);\n\t\t\t}\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updatePoly(this, true);\n\t}\n});\n\n\n// @factory L.polygon(latlngs: LatLng[], options?: Polyline options)\nL.polygon = function (latlngs, options) {\n\treturn new L.Polygon(latlngs, options);\n};\n\n/*\n * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.\n */\n\n/*\n * @class Rectangle\n * @aka L.Retangle\n * @inherits Polygon\n *\n * A class for drawing rectangle overlays on a map. Extends `Polygon`.\n *\n * @example\n *\n * ```js\n * // define rectangle geographical bounds\n * var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];\n *\n * // create an orange rectangle\n * L.rectangle(bounds, {color: \"#ff7800\", weight: 1}).addTo(map);\n *\n * // zoom the map to the rectangle bounds\n * map.fitBounds(bounds);\n * ```\n *\n */\n\n\nL.Rectangle = L.Polygon.extend({\n\tinitialize: function (latLngBounds, options) {\n\t\tL.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);\n\t},\n\n\t// @method setBounds(latLngBounds: LatLngBounds): this\n\t// Redraws the rectangle with the passed bounds.\n\tsetBounds: function (latLngBounds) {\n\t\treturn this.setLatLngs(this._boundsToLatLngs(latLngBounds));\n\t},\n\n\t_boundsToLatLngs: function (latLngBounds) {\n\t\tlatLngBounds = L.latLngBounds(latLngBounds);\n\t\treturn [\n\t\t\tlatLngBounds.getSouthWest(),\n\t\t\tlatLngBounds.getNorthWest(),\n\t\t\tlatLngBounds.getNorthEast(),\n\t\t\tlatLngBounds.getSouthEast()\n\t\t];\n\t}\n});\n\n\n// @factory L.rectangle(latLngBounds: LatLngBounds, options?: Polyline options)\nL.rectangle = function (latLngBounds, options) {\n\treturn new L.Rectangle(latLngBounds, options);\n};\n\n/*\n * @class CircleMarker\n * @aka L.CircleMarker\n * @inherits Path\n *\n * A circle of a fixed size with radius specified in pixels. Extends `Path`.\n */\n\nL.CircleMarker = L.Path.extend({\n\n\t// @section\n\t// @aka CircleMarker options\n\toptions: {\n\t\tfill: true,\n\n\t\t// @option radius: Number = 10\n\t\t// Radius of the circle marker, in pixels\n\t\tradius: 10\n\t},\n\n\tinitialize: function (latlng, options) {\n\t\tL.setOptions(this, options);\n\t\tthis._latlng = L.latLng(latlng);\n\t\tthis._radius = this.options.radius;\n\t},\n\n\t// @method setLatLng(latLng: LatLng): this\n\t// Sets the position of a circle marker to a new location.\n\tsetLatLng: function (latlng) {\n\t\tthis._latlng = L.latLng(latlng);\n\t\tthis.redraw();\n\t\treturn this.fire('move', {latlng: this._latlng});\n\t},\n\n\t// @method getLatLng(): LatLng\n\t// Returns the current geographical position of the circle marker\n\tgetLatLng: function () {\n\t\treturn this._latlng;\n\t},\n\n\t// @method setRadius(radius: Number): this\n\t// Sets the radius of a circle marker. Units are in pixels.\n\tsetRadius: function (radius) {\n\t\tthis.options.radius = this._radius = radius;\n\t\treturn this.redraw();\n\t},\n\n\t// @method getRadius(): Number\n\t// Returns the current radius of the circle\n\tgetRadius: function () {\n\t\treturn this._radius;\n\t},\n\n\tsetStyle : function (options) {\n\t\tvar radius = options && options.radius || this._radius;\n\t\tL.Path.prototype.setStyle.call(this, options);\n\t\tthis.setRadius(radius);\n\t\treturn this;\n\t},\n\n\t_project: function () {\n\t\tthis._point = this._map.latLngToLayerPoint(this._latlng);\n\t\tthis._updateBounds();\n\t},\n\n\t_updateBounds: function () {\n\t\tvar r = this._radius,\n\t\t r2 = this._radiusY || r,\n\t\t w = this._clickTolerance(),\n\t\t p = [r + w, r2 + w];\n\t\tthis._pxBounds = new L.Bounds(this._point.subtract(p), this._point.add(p));\n\t},\n\n\t_update: function () {\n\t\tif (this._map) {\n\t\t\tthis._updatePath();\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updateCircle(this);\n\t},\n\n\t_empty: function () {\n\t\treturn this._radius && !this._renderer._bounds.intersects(this._pxBounds);\n\t}\n});\n\n\n// @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options)\n// Instantiates a circle marker object given a geographical point, and an optional options object.\nL.circleMarker = function (latlng, options) {\n\treturn new L.CircleMarker(latlng, options);\n};\n\n/*\n * @class Circle\n * @aka L.Circle\n * @inherits CircleMarker\n *\n * A class for drawing circle overlays on a map. Extends `CircleMarker`.\n *\n * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).\n *\n * @example\n *\n * ```js\n * L.circle([50.5, 30.5], {radius: 200}).addTo(map);\n * ```\n */\n\nL.Circle = L.CircleMarker.extend({\n\n\tinitialize: function (latlng, options, legacyOptions) {\n\t\tif (typeof options === 'number') {\n\t\t\t// Backwards compatibility with 0.7.x factory (latlng, radius, options?)\n\t\t\toptions = L.extend({}, legacyOptions, {radius: options});\n\t\t}\n\t\tL.setOptions(this, options);\n\t\tthis._latlng = L.latLng(latlng);\n\n\t\tif (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); }\n\n\t\t// @section\n\t\t// @aka Circle options\n\t\t// @option radius: Number; Radius of the circle, in meters.\n\t\tthis._mRadius = this.options.radius;\n\t},\n\n\t// @method setRadius(radius: Number): this\n\t// Sets the radius of a circle. Units are in meters.\n\tsetRadius: function (radius) {\n\t\tthis._mRadius = radius;\n\t\treturn this.redraw();\n\t},\n\n\t// @method getRadius(): Number\n\t// Returns the current radius of a circle. Units are in meters.\n\tgetRadius: function () {\n\t\treturn this._mRadius;\n\t},\n\n\t// @method getBounds(): LatLngBounds\n\t// Returns the `LatLngBounds` of the path.\n\tgetBounds: function () {\n\t\tvar half = [this._radius, this._radiusY || this._radius];\n\n\t\treturn new L.LatLngBounds(\n\t\t\tthis._map.layerPointToLatLng(this._point.subtract(half)),\n\t\t\tthis._map.layerPointToLatLng(this._point.add(half)));\n\t},\n\n\tsetStyle: L.Path.prototype.setStyle,\n\n\t_project: function () {\n\n\t\tvar lng = this._latlng.lng,\n\t\t lat = this._latlng.lat,\n\t\t map = this._map,\n\t\t crs = map.options.crs;\n\n\t\tif (crs.distance === L.CRS.Earth.distance) {\n\t\t\tvar d = Math.PI / 180,\n\t\t\t latR = (this._mRadius / L.CRS.Earth.R) / d,\n\t\t\t top = map.project([lat + latR, lng]),\n\t\t\t bottom = map.project([lat - latR, lng]),\n\t\t\t p = top.add(bottom).divideBy(2),\n\t\t\t lat2 = map.unproject(p).lat,\n\t\t\t lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) /\n\t\t\t (Math.cos(lat * d) * Math.cos(lat2 * d))) / d;\n\n\t\t\tif (isNaN(lngR) || lngR === 0) {\n\t\t\t\tlngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425\n\t\t\t}\n\n\t\t\tthis._point = p.subtract(map.getPixelOrigin());\n\t\t\tthis._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1);\n\t\t\tthis._radiusY = Math.max(Math.round(p.y - top.y), 1);\n\n\t\t} else {\n\t\t\tvar latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0]));\n\n\t\t\tthis._point = map.latLngToLayerPoint(this._latlng);\n\t\t\tthis._radius = this._point.x - map.latLngToLayerPoint(latlng2).x;\n\t\t}\n\n\t\tthis._updateBounds();\n\t}\n});\n\n// @factory L.circle(latlng: LatLng, options?: Circle options)\n// Instantiates a circle object given a geographical point, and an options object\n// which contains the circle radius.\n// @alternative\n// @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options)\n// Obsolete way of instantiating a circle, for compatibility with 0.7.x code.\n// Do not use in new applications or plugins.\nL.circle = function (latlng, options, legacyOptions) {\n\treturn new L.Circle(latlng, options, legacyOptions);\n};\n\n/*\n * @class SVG\n * @inherits Renderer\n * @aka L.SVG\n *\n * Allows vector layers to be displayed with [SVG](https://developer.mozilla.org/docs/Web/SVG).\n * Inherits `Renderer`.\n *\n * Due to [technical limitations](http://caniuse.com/#search=svg), SVG is not\n * available in all web browsers, notably Android 2.x and 3.x.\n *\n * Although SVG is not available on IE7 and IE8, these browsers support\n * [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language)\n * (a now deprecated technology), and the SVG renderer will fall back to VML in\n * this case.\n *\n * @example\n *\n * Use SVG by default for all paths in the map:\n *\n * ```js\n * var map = L.map('map', {\n * \trenderer: L.svg()\n * });\n * ```\n *\n * Use a SVG renderer with extra padding for specific vector geometries:\n *\n * ```js\n * var map = L.map('map');\n * var myRenderer = L.svg({ padding: 0.5 });\n * var line = L.polyline( coordinates, { renderer: myRenderer } );\n * var circle = L.circle( center, { renderer: myRenderer } );\n * ```\n */\n\nL.SVG = L.Renderer.extend({\n\n\tgetEvents: function () {\n\t\tvar events = L.Renderer.prototype.getEvents.call(this);\n\t\tevents.zoomstart = this._onZoomStart;\n\t\treturn events;\n\t},\n\n\t_initContainer: function () {\n\t\tthis._container = L.SVG.create('svg');\n\n\t\t// makes it possible to click through svg root; we'll reset it back in individual paths\n\t\tthis._container.setAttribute('pointer-events', 'none');\n\n\t\tthis._rootGroup = L.SVG.create('g');\n\t\tthis._container.appendChild(this._rootGroup);\n\t},\n\n\t_onZoomStart: function () {\n\t\t// Drag-then-pinch interactions might mess up the center and zoom.\n\t\t// In this case, the easiest way to prevent this is re-do the renderer\n\t\t// bounds and padding when the zooming starts.\n\t\tthis._update();\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom && this._bounds) { return; }\n\n\t\tL.Renderer.prototype._update.call(this);\n\n\t\tvar b = this._bounds,\n\t\t size = b.getSize(),\n\t\t container = this._container;\n\n\t\t// set size of svg-container if changed\n\t\tif (!this._svgSize || !this._svgSize.equals(size)) {\n\t\t\tthis._svgSize = size;\n\t\t\tcontainer.setAttribute('width', size.x);\n\t\t\tcontainer.setAttribute('height', size.y);\n\t\t}\n\n\t\t// movement: update container viewBox so that we don't have to change coordinates of individual layers\n\t\tL.DomUtil.setPosition(container, b.min);\n\t\tcontainer.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' '));\n\n\t\tthis.fire('update');\n\t},\n\n\t// methods below are called by vector layers implementations\n\n\t_initPath: function (layer) {\n\t\tvar path = layer._path = L.SVG.create('path');\n\n\t\t// @namespace Path\n\t\t// @option className: String = null\n\t\t// Custom class name set on an element. Only for SVG renderer.\n\t\tif (layer.options.className) {\n\t\t\tL.DomUtil.addClass(path, layer.options.className);\n\t\t}\n\n\t\tif (layer.options.interactive) {\n\t\t\tL.DomUtil.addClass(path, 'leaflet-interactive');\n\t\t}\n\n\t\tthis._updateStyle(layer);\n\t},\n\n\t_addPath: function (layer) {\n\t\tthis._rootGroup.appendChild(layer._path);\n\t\tlayer.addInteractiveTarget(layer._path);\n\t},\n\n\t_removePath: function (layer) {\n\t\tL.DomUtil.remove(layer._path);\n\t\tlayer.removeInteractiveTarget(layer._path);\n\t},\n\n\t_updatePath: function (layer) {\n\t\tlayer._project();\n\t\tlayer._update();\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tvar path = layer._path,\n\t\t options = layer.options;\n\n\t\tif (!path) { return; }\n\n\t\tif (options.stroke) {\n\t\t\tpath.setAttribute('stroke', options.color);\n\t\t\tpath.setAttribute('stroke-opacity', options.opacity);\n\t\t\tpath.setAttribute('stroke-width', options.weight);\n\t\t\tpath.setAttribute('stroke-linecap', options.lineCap);\n\t\t\tpath.setAttribute('stroke-linejoin', options.lineJoin);\n\n\t\t\tif (options.dashArray) {\n\t\t\t\tpath.setAttribute('stroke-dasharray', options.dashArray);\n\t\t\t} else {\n\t\t\t\tpath.removeAttribute('stroke-dasharray');\n\t\t\t}\n\n\t\t\tif (options.dashOffset) {\n\t\t\t\tpath.setAttribute('stroke-dashoffset', options.dashOffset);\n\t\t\t} else {\n\t\t\t\tpath.removeAttribute('stroke-dashoffset');\n\t\t\t}\n\t\t} else {\n\t\t\tpath.setAttribute('stroke', 'none');\n\t\t}\n\n\t\tif (options.fill) {\n\t\t\tpath.setAttribute('fill', options.fillColor || options.color);\n\t\t\tpath.setAttribute('fill-opacity', options.fillOpacity);\n\t\t\tpath.setAttribute('fill-rule', options.fillRule || 'evenodd');\n\t\t} else {\n\t\t\tpath.setAttribute('fill', 'none');\n\t\t}\n\t},\n\n\t_updatePoly: function (layer, closed) {\n\t\tthis._setPath(layer, L.SVG.pointsToPath(layer._parts, closed));\n\t},\n\n\t_updateCircle: function (layer) {\n\t\tvar p = layer._point,\n\t\t r = layer._radius,\n\t\t r2 = layer._radiusY || r,\n\t\t arc = 'a' + r + ',' + r2 + ' 0 1,0 ';\n\n\t\t// drawing a circle with two half-arcs\n\t\tvar d = layer._empty() ? 'M0 0' :\n\t\t\t\t'M' + (p.x - r) + ',' + p.y +\n\t\t\t\tarc + (r * 2) + ',0 ' +\n\t\t\t\tarc + (-r * 2) + ',0 ';\n\n\t\tthis._setPath(layer, d);\n\t},\n\n\t_setPath: function (layer, path) {\n\t\tlayer._path.setAttribute('d', path);\n\t},\n\n\t// SVG does not have the concept of zIndex so we resort to changing the DOM order of elements\n\t_bringToFront: function (layer) {\n\t\tL.DomUtil.toFront(layer._path);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tL.DomUtil.toBack(layer._path);\n\t}\n});\n\n\n// @namespace SVG; @section\n// There are several static functions which can be called without instantiating L.SVG:\nL.extend(L.SVG, {\n\t// @function create(name: String): SVGElement\n\t// Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement),\n\t// corresponding to the class name passed. For example, using 'line' will return\n\t// an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement).\n\tcreate: function (name) {\n\t\treturn document.createElementNS('http://www.w3.org/2000/svg', name);\n\t},\n\n\t// @function pointsToPath(rings: Point[], closed: Boolean): String\n\t// Generates a SVG path string for multiple rings, with each ring turning\n\t// into \"M..L..L..\" instructions\n\tpointsToPath: function (rings, closed) {\n\t\tvar str = '',\n\t\t i, j, len, len2, points, p;\n\n\t\tfor (i = 0, len = rings.length; i < len; i++) {\n\t\t\tpoints = rings[i];\n\n\t\t\tfor (j = 0, len2 = points.length; j < len2; j++) {\n\t\t\t\tp = points[j];\n\t\t\t\tstr += (j ? 'L' : 'M') + p.x + ' ' + p.y;\n\t\t\t}\n\n\t\t\t// closes the ring for polygons; \"x\" is VML syntax\n\t\t\tstr += closed ? (L.Browser.svg ? 'z' : 'x') : '';\n\t\t}\n\n\t\t// SVG complains about empty path strings\n\t\treturn str || 'M0 0';\n\t}\n});\n\n// @namespace Browser; @property svg: Boolean\n// `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG).\nL.Browser.svg = !!(document.createElementNS && L.SVG.create('svg').createSVGRect);\n\n\n// @namespace SVG\n// @factory L.svg(options?: Renderer options)\n// Creates a SVG renderer with the given options.\nL.svg = function (options) {\n\treturn L.Browser.svg || L.Browser.vml ? new L.SVG(options) : null;\n};\n\n/*\n * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!\n */\n\n/*\n * @class SVG\n *\n * Although SVG is not available on IE7 and IE8, these browsers support [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language), and the SVG renderer will fall back to VML in this case.\n *\n * VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility\n * with old versions of Internet Explorer.\n */\n\n// @namespace Browser; @property vml: Boolean\n// `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language).\nL.Browser.vml = !L.Browser.svg && (function () {\n\ttry {\n\t\tvar div = document.createElement('div');\n\t\tdiv.innerHTML = '<v:shape adj=\"1\"/>';\n\n\t\tvar shape = div.firstChild;\n\t\tshape.style.behavior = 'url(#default#VML)';\n\n\t\treturn shape && (typeof shape.adj === 'object');\n\n\t} catch (e) {\n\t\treturn false;\n\t}\n}());\n\n// redefine some SVG methods to handle VML syntax which is similar but with some differences\nL.SVG.include(!L.Browser.vml ? {} : {\n\n\t_initContainer: function () {\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-vml-container');\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom) { return; }\n\t\tL.Renderer.prototype._update.call(this);\n\t\tthis.fire('update');\n\t},\n\n\t_initPath: function (layer) {\n\t\tvar container = layer._container = L.SVG.create('shape');\n\n\t\tL.DomUtil.addClass(container, 'leaflet-vml-shape ' + (this.options.className || ''));\n\n\t\tcontainer.coordsize = '1 1';\n\n\t\tlayer._path = L.SVG.create('path');\n\t\tcontainer.appendChild(layer._path);\n\n\t\tthis._updateStyle(layer);\n\t},\n\n\t_addPath: function (layer) {\n\t\tvar container = layer._container;\n\t\tthis._container.appendChild(container);\n\n\t\tif (layer.options.interactive) {\n\t\t\tlayer.addInteractiveTarget(container);\n\t\t}\n\t},\n\n\t_removePath: function (layer) {\n\t\tvar container = layer._container;\n\t\tL.DomUtil.remove(container);\n\t\tlayer.removeInteractiveTarget(container);\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tvar stroke = layer._stroke,\n\t\t fill = layer._fill,\n\t\t options = layer.options,\n\t\t container = layer._container;\n\n\t\tcontainer.stroked = !!options.stroke;\n\t\tcontainer.filled = !!options.fill;\n\n\t\tif (options.stroke) {\n\t\t\tif (!stroke) {\n\t\t\t\tstroke = layer._stroke = L.SVG.create('stroke');\n\t\t\t}\n\t\t\tcontainer.appendChild(stroke);\n\t\t\tstroke.weight = options.weight + 'px';\n\t\t\tstroke.color = options.color;\n\t\t\tstroke.opacity = options.opacity;\n\n\t\t\tif (options.dashArray) {\n\t\t\t\tstroke.dashStyle = L.Util.isArray(options.dashArray) ?\n\t\t\t\t options.dashArray.join(' ') :\n\t\t\t\t options.dashArray.replace(/( *, *)/g, ' ');\n\t\t\t} else {\n\t\t\t\tstroke.dashStyle = '';\n\t\t\t}\n\t\t\tstroke.endcap = options.lineCap.replace('butt', 'flat');\n\t\t\tstroke.joinstyle = options.lineJoin;\n\n\t\t} else if (stroke) {\n\t\t\tcontainer.removeChild(stroke);\n\t\t\tlayer._stroke = null;\n\t\t}\n\n\t\tif (options.fill) {\n\t\t\tif (!fill) {\n\t\t\t\tfill = layer._fill = L.SVG.create('fill');\n\t\t\t}\n\t\t\tcontainer.appendChild(fill);\n\t\t\tfill.color = options.fillColor || options.color;\n\t\t\tfill.opacity = options.fillOpacity;\n\n\t\t} else if (fill) {\n\t\t\tcontainer.removeChild(fill);\n\t\t\tlayer._fill = null;\n\t\t}\n\t},\n\n\t_updateCircle: function (layer) {\n\t\tvar p = layer._point.round(),\n\t\t r = Math.round(layer._radius),\n\t\t r2 = Math.round(layer._radiusY || r);\n\n\t\tthis._setPath(layer, layer._empty() ? 'M0 0' :\n\t\t\t\t'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360));\n\t},\n\n\t_setPath: function (layer, path) {\n\t\tlayer._path.v = path;\n\t},\n\n\t_bringToFront: function (layer) {\n\t\tL.DomUtil.toFront(layer._container);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tL.DomUtil.toBack(layer._container);\n\t}\n});\n\nif (L.Browser.vml) {\n\tL.SVG.create = (function () {\n\t\ttry {\n\t\t\tdocument.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');\n\t\t\treturn function (name) {\n\t\t\t\treturn document.createElement('<lvml:' + name + ' class=\"lvml\">');\n\t\t\t};\n\t\t} catch (e) {\n\t\t\treturn function (name) {\n\t\t\t\treturn document.createElement('<' + name + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"lvml\">');\n\t\t\t};\n\t\t}\n\t})();\n}\n\n/*\n * @class Canvas\n * @inherits Renderer\n * @aka L.Canvas\n *\n * Allows vector layers to be displayed with [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).\n * Inherits `Renderer`.\n *\n * Due to [technical limitations](http://caniuse.com/#search=canvas), Canvas is not\n * available in all web browsers, notably IE8, and overlapping geometries might\n * not display properly in some edge cases.\n *\n * @example\n *\n * Use Canvas by default for all paths in the map:\n *\n * ```js\n * var map = L.map('map', {\n * \trenderer: L.canvas()\n * });\n * ```\n *\n * Use a Canvas renderer with extra padding for specific vector geometries:\n *\n * ```js\n * var map = L.map('map');\n * var myRenderer = L.canvas({ padding: 0.5 });\n * var line = L.polyline( coordinates, { renderer: myRenderer } );\n * var circle = L.circle( center, { renderer: myRenderer } );\n * ```\n */\n\nL.Canvas = L.Renderer.extend({\n\n\tonAdd: function () {\n\t\tL.Renderer.prototype.onAdd.call(this);\n\n\t\tthis._layers = this._layers || {};\n\n\t\t// Redraw vectors since canvas is cleared upon removal,\n\t\t// in case of removing the renderer itself from the map.\n\t\tthis._draw();\n\t},\n\n\t_initContainer: function () {\n\t\tvar container = this._container = document.createElement('canvas');\n\n\t\tL.DomEvent\n\t\t\t.on(container, 'mousemove', L.Util.throttle(this._onMouseMove, 32, this), this)\n\t\t\t.on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this)\n\t\t\t.on(container, 'mouseout', this._handleMouseOut, this);\n\n\t\tthis._ctx = container.getContext('2d');\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom && this._bounds) { return; }\n\n\t\tthis._drawnLayers = {};\n\n\t\tL.Renderer.prototype._update.call(this);\n\n\t\tvar b = this._bounds,\n\t\t container = this._container,\n\t\t size = b.getSize(),\n\t\t m = L.Browser.retina ? 2 : 1;\n\n\t\tL.DomUtil.setPosition(container, b.min);\n\n\t\t// set canvas size (also clearing it); use double size on retina\n\t\tcontainer.width = m * size.x;\n\t\tcontainer.height = m * size.y;\n\t\tcontainer.style.width = size.x + 'px';\n\t\tcontainer.style.height = size.y + 'px';\n\n\t\tif (L.Browser.retina) {\n\t\t\tthis._ctx.scale(2, 2);\n\t\t}\n\n\t\t// translate so we use the same path coordinates after canvas element moves\n\t\tthis._ctx.translate(-b.min.x, -b.min.y);\n\n\t\t// Tell paths to redraw themselves\n\t\tthis.fire('update');\n\t},\n\n\t_initPath: function (layer) {\n\t\tthis._updateDashArray(layer);\n\t\tthis._layers[L.stamp(layer)] = layer;\n\t},\n\n\t_addPath: L.Util.falseFn,\n\n\t_removePath: function (layer) {\n\t\tlayer._removed = true;\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updatePath: function (layer) {\n\t\tthis._redrawBounds = layer._pxBounds;\n\t\tthis._draw(true);\n\t\tlayer._project();\n\t\tlayer._update();\n\t\tthis._draw();\n\t\tthis._redrawBounds = null;\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tthis._updateDashArray(layer);\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updateDashArray: function (layer) {\n\t\tif (layer.options.dashArray) {\n\t\t\tvar parts = layer.options.dashArray.split(','),\n\t\t\t dashArray = [],\n\t\t\t i;\n\t\t\tfor (i = 0; i < parts.length; i++) {\n\t\t\t\tdashArray.push(Number(parts[i]));\n\t\t\t}\n\t\t\tlayer.options._dashArray = dashArray;\n\t\t}\n\t},\n\n\t_requestRedraw: function (layer) {\n\t\tif (!this._map) { return; }\n\n\t\tvar padding = (layer.options.weight || 0) + 1;\n\t\tthis._redrawBounds = this._redrawBounds || new L.Bounds();\n\t\tthis._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding]));\n\t\tthis._redrawBounds.extend(layer._pxBounds.max.add([padding, padding]));\n\n\t\tthis._redrawRequest = this._redrawRequest || L.Util.requestAnimFrame(this._redraw, this);\n\t},\n\n\t_redraw: function () {\n\t\tthis._redrawRequest = null;\n\n\t\tthis._draw(true); // clear layers in redraw bounds\n\t\tthis._draw(); // draw layers\n\n\t\tthis._redrawBounds = null;\n\t},\n\n\t_draw: function (clear) {\n\t\tthis._clear = clear;\n\t\tvar layer, bounds = this._redrawBounds;\n\t\tthis._ctx.save();\n\t\tif (bounds) {\n\t\t\tthis._ctx.beginPath();\n\t\t\tthis._ctx.rect(bounds.min.x, bounds.min.y, bounds.max.x - bounds.min.x, bounds.max.y - bounds.min.y);\n\t\t\tthis._ctx.clip();\n\t\t}\n\n\t\tfor (var id in this._layers) {\n\t\t\tlayer = this._layers[id];\n\t\t\tif (!bounds || (layer._pxBounds && layer._pxBounds.intersects(bounds))) {\n\t\t\t\tlayer._updatePath();\n\t\t\t}\n\t\t\tif (clear && layer._removed) {\n\t\t\t\tdelete layer._removed;\n\t\t\t\tdelete this._layers[id];\n\t\t\t}\n\t\t}\n\t\tthis._ctx.restore(); // Restore state before clipping.\n\t},\n\n\t_updatePoly: function (layer, closed) {\n\n\t\tvar i, j, len2, p,\n\t\t parts = layer._parts,\n\t\t len = parts.length,\n\t\t ctx = this._ctx;\n\n\t\tif (!len) { return; }\n\n\t\tthis._drawnLayers[layer._leaflet_id] = layer;\n\n\t\tctx.beginPath();\n\n\t\tif (ctx.setLineDash) {\n\t\t\tctx.setLineDash(layer.options && layer.options._dashArray || []);\n\t\t}\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tfor (j = 0, len2 = parts[i].length; j < len2; j++) {\n\t\t\t\tp = parts[i][j];\n\t\t\t\tctx[j ? 'lineTo' : 'moveTo'](p.x, p.y);\n\t\t\t}\n\t\t\tif (closed) {\n\t\t\t\tctx.closePath();\n\t\t\t}\n\t\t}\n\n\t\tthis._fillStroke(ctx, layer);\n\n\t\t// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature\n\t},\n\n\t_updateCircle: function (layer) {\n\n\t\tif (layer._empty()) { return; }\n\n\t\tvar p = layer._point,\n\t\t ctx = this._ctx,\n\t\t r = layer._radius,\n\t\t s = (layer._radiusY || r) / r;\n\n\t\tthis._drawnLayers[layer._leaflet_id] = layer;\n\n\t\tif (s !== 1) {\n\t\t\tctx.save();\n\t\t\tctx.scale(1, s);\n\t\t}\n\n\t\tctx.beginPath();\n\t\tctx.arc(p.x, p.y / s, r, 0, Math.PI * 2, false);\n\n\t\tif (s !== 1) {\n\t\t\tctx.restore();\n\t\t}\n\n\t\tthis._fillStroke(ctx, layer);\n\t},\n\n\t_fillStroke: function (ctx, layer) {\n\t\tvar clear = this._clear,\n\t\t options = layer.options;\n\n\t\tctx.globalCompositeOperation = clear ? 'destination-out' : 'source-over';\n\n\t\tif (options.fill) {\n\t\t\tctx.globalAlpha = clear ? 1 : options.fillOpacity;\n\t\t\tctx.fillStyle = options.fillColor || options.color;\n\t\t\tctx.fill(options.fillRule || 'evenodd');\n\t\t}\n\n\t\tif (options.stroke && options.weight !== 0) {\n\t\t\tctx.globalAlpha = clear ? 1 : options.opacity;\n\n\t\t\t// if clearing shape, do it with the previously drawn line width\n\t\t\tlayer._prevWeight = ctx.lineWidth = clear ? layer._prevWeight + 1 : options.weight;\n\n\t\t\tctx.strokeStyle = options.color;\n\t\t\tctx.lineCap = options.lineCap;\n\t\t\tctx.lineJoin = options.lineJoin;\n\t\t\tctx.stroke();\n\t\t}\n\t},\n\n\t// Canvas obviously doesn't have mouse events for individual drawn objects,\n\t// so we emulate that by calculating what's under the mouse on mousemove/click manually\n\n\t_onClick: function (e) {\n\t\tvar point = this._map.mouseEventToLayerPoint(e), layers = [], layer;\n\n\t\tfor (var id in this._layers) {\n\t\t\tlayer = this._layers[id];\n\t\t\tif (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) {\n\t\t\t\tL.DomEvent._fakeStop(e);\n\t\t\t\tlayers.push(layer);\n\t\t\t}\n\t\t}\n\t\tif (layers.length) {\n\t\t\tthis._fireEvent(layers, e);\n\t\t}\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; }\n\n\t\tvar point = this._map.mouseEventToLayerPoint(e);\n\t\tthis._handleMouseOut(e, point);\n\t\tthis._handleMouseHover(e, point);\n\t},\n\n\n\t_handleMouseOut: function (e, point) {\n\t\tvar layer = this._hoveredLayer;\n\t\tif (layer && (e.type === 'mouseout' || !layer._containsPoint(point))) {\n\t\t\t// if we're leaving the layer, fire mouseout\n\t\t\tL.DomUtil.removeClass(this._container, 'leaflet-interactive');\n\t\t\tthis._fireEvent([layer], e, 'mouseout');\n\t\t\tthis._hoveredLayer = null;\n\t\t}\n\t},\n\n\t_handleMouseHover: function (e, point) {\n\t\tvar id, layer;\n\n\t\tfor (id in this._drawnLayers) {\n\t\t\tlayer = this._drawnLayers[id];\n\t\t\tif (layer.options.interactive && layer._containsPoint(point)) {\n\t\t\t\tL.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor\n\t\t\t\tthis._fireEvent([layer], e, 'mouseover');\n\t\t\t\tthis._hoveredLayer = layer;\n\t\t\t}\n\t\t}\n\n\t\tif (this._hoveredLayer) {\n\t\t\tthis._fireEvent([this._hoveredLayer], e);\n\t\t}\n\t},\n\n\t_fireEvent: function (layers, e, type) {\n\t\tthis._map._fireDOMEvent(e, type || e.type, layers);\n\t},\n\n\t// TODO _bringToFront & _bringToBack, pretty tricky\n\n\t_bringToFront: L.Util.falseFn,\n\t_bringToBack: L.Util.falseFn\n});\n\n// @namespace Browser; @property canvas: Boolean\n// `true` when the browser supports [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).\nL.Browser.canvas = (function () {\n\treturn !!document.createElement('canvas').getContext;\n}());\n\n// @namespace Canvas\n// @factory L.canvas(options?: Renderer options)\n// Creates a Canvas renderer with the given options.\nL.canvas = function (options) {\n\treturn L.Browser.canvas ? new L.Canvas(options) : null;\n};\n\nL.Polyline.prototype._containsPoint = function (p, closed) {\n\tvar i, j, k, len, len2, part,\n\t w = this._clickTolerance();\n\n\tif (!this._pxBounds.contains(p)) { return false; }\n\n\t// hit detection for polylines\n\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\tpart = this._parts[i];\n\n\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\tif (!closed && (j === 0)) { continue; }\n\n\t\t\tif (L.LineUtil.pointToSegmentDistance(p, part[k], part[j]) <= w) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nL.Polygon.prototype._containsPoint = function (p) {\n\tvar inside = false,\n\t part, p1, p2, i, j, k, len, len2;\n\n\tif (!this._pxBounds.contains(p)) { return false; }\n\n\t// ray casting algorithm for detecting if point is in polygon\n\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\tpart = this._parts[i];\n\n\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\tp1 = part[j];\n\t\t\tp2 = part[k];\n\n\t\t\tif (((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\t\t\t\tinside = !inside;\n\t\t\t}\n\t\t}\n\t}\n\n\t// also check if it's on polygon stroke\n\treturn inside || L.Polyline.prototype._containsPoint.call(this, p, true);\n};\n\nL.CircleMarker.prototype._containsPoint = function (p) {\n\treturn p.distanceTo(this._point) <= this._radius + this._clickTolerance();\n};\n\n/*\r\n * @class GeoJSON\r\n * @aka L.GeoJSON\r\n * @inherits FeatureGroup\r\n *\r\n * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse\r\n * GeoJSON data and display it on the map. Extends `FeatureGroup`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.geoJSON(data, {\r\n * \tstyle: function (feature) {\r\n * \t\treturn {color: feature.properties.color};\r\n * \t}\r\n * }).bindPopup(function (layer) {\r\n * \treturn layer.feature.properties.description;\r\n * }).addTo(map);\r\n * ```\r\n */\r\n\r\nL.GeoJSON = L.FeatureGroup.extend({\r\n\r\n\t/* @section\r\n\t * @aka GeoJSON options\r\n\t *\r\n\t * @option pointToLayer: Function = *\r\n\t * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally\r\n\t * called when data is added, passing the GeoJSON point feature and its `LatLng`.\r\n\t * The default is to spawn a default `Marker`:\r\n\t * ```js\r\n\t * function(geoJsonPoint, latlng) {\r\n\t * \treturn L.marker(latlng);\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @option style: Function = *\r\n\t * A `Function` defining the `Path options` for styling GeoJSON lines and polygons,\r\n\t * called internally when data is added.\r\n\t * The default value is to not override any defaults:\r\n\t * ```js\r\n\t * function (geoJsonFeature) {\r\n\t * \treturn {}\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @option onEachFeature: Function = *\r\n\t * A `Function` that will be called once for each created `Feature`, after it has\r\n\t * been created and styled. Useful for attaching events and popups to features.\r\n\t * The default is to do nothing with the newly created layers:\r\n\t * ```js\r\n\t * function (feature, layer) {}\r\n\t * ```\r\n\t *\r\n\t * @option filter: Function = *\r\n\t * A `Function` that will be used to decide whether to include a feature or not.\r\n\t * The default is to include all features:\r\n\t * ```js\r\n\t * function (geoJsonFeature) {\r\n\t * \treturn true;\r\n\t * }\r\n\t * ```\r\n\t * Note: dynamically changing the `filter` option will have effect only on newly\r\n\t * added data. It will _not_ re-evaluate already included features.\r\n\t *\r\n\t * @option coordsToLatLng: Function = *\r\n\t * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s.\r\n\t * The default is the `coordsToLatLng` static method.\r\n\t */\r\n\r\n\tinitialize: function (geojson, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\r\n\t\tif (geojson) {\r\n\t\t\tthis.addData(geojson);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addData( <GeoJSON> data ): Layer\r\n\t// Adds a GeoJSON object to the layer.\r\n\taddData: function (geojson) {\r\n\t\tvar features = L.Util.isArray(geojson) ? geojson : geojson.features,\r\n\t\t i, len, feature;\r\n\r\n\t\tif (features) {\r\n\t\t\tfor (i = 0, len = features.length; i < len; i++) {\r\n\t\t\t\t// only add this if geometry or geometries are set and not null\r\n\t\t\t\tfeature = features[i];\r\n\t\t\t\tif (feature.geometries || feature.geometry || feature.features || feature.coordinates) {\r\n\t\t\t\t\tthis.addData(feature);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.filter && !options.filter(geojson)) { return this; }\r\n\r\n\t\tvar layer = L.GeoJSON.geometryToLayer(geojson, options);\r\n\t\tif (!layer) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tlayer.feature = L.GeoJSON.asFeature(geojson);\r\n\r\n\t\tlayer.defaultOptions = layer.options;\r\n\t\tthis.resetStyle(layer);\r\n\r\n\t\tif (options.onEachFeature) {\r\n\t\t\toptions.onEachFeature(geojson, layer);\r\n\t\t}\r\n\r\n\t\treturn this.addLayer(layer);\r\n\t},\r\n\r\n\t// @method resetStyle( <Path> layer ): Layer\r\n\t// Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.\r\n\tresetStyle: function (layer) {\r\n\t\t// reset any custom styles\r\n\t\tlayer.options = L.Util.extend({}, layer.defaultOptions);\r\n\t\tthis._setLayerStyle(layer, this.options.style);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setStyle( <Function> style ): Layer\r\n\t// Changes styles of GeoJSON vector layers with the given style function.\r\n\tsetStyle: function (style) {\r\n\t\treturn this.eachLayer(function (layer) {\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}, this);\r\n\t},\r\n\r\n\t_setLayerStyle: function (layer, style) {\r\n\t\tif (typeof style === 'function') {\r\n\t\t\tstyle = style(layer.feature);\r\n\t\t}\r\n\t\tif (layer.setStyle) {\r\n\t\t\tlayer.setStyle(style);\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// @section\r\n// There are several static functions which can be called without instantiating L.GeoJSON:\r\nL.extend(L.GeoJSON, {\r\n\t// @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer\r\n\t// Creates a `Layer` from a given GeoJSON feature. Can use a custom\r\n\t// [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng)\r\n\t// functions if provided as options.\r\n\tgeometryToLayer: function (geojson, options) {\r\n\r\n\t\tvar geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,\r\n\t\t coords = geometry ? geometry.coordinates : null,\r\n\t\t layers = [],\r\n\t\t pointToLayer = options && options.pointToLayer,\r\n\t\t coordsToLatLng = options && options.coordsToLatLng || this.coordsToLatLng,\r\n\t\t latlng, latlngs, i, len;\r\n\r\n\t\tif (!coords && !geometry) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (geometry.type) {\r\n\t\tcase 'Point':\r\n\t\t\tlatlng = coordsToLatLng(coords);\r\n\t\t\treturn pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);\r\n\r\n\t\tcase 'MultiPoint':\r\n\t\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\t\tlatlng = coordsToLatLng(coords[i]);\r\n\t\t\t\tlayers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tcase 'LineString':\r\n\t\tcase 'MultiLineString':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, coordsToLatLng);\r\n\t\t\treturn new L.Polyline(latlngs, options);\r\n\r\n\t\tcase 'Polygon':\r\n\t\tcase 'MultiPolygon':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, coordsToLatLng);\r\n\t\t\treturn new L.Polygon(latlngs, options);\r\n\r\n\t\tcase 'GeometryCollection':\r\n\t\t\tfor (i = 0, len = geometry.geometries.length; i < len; i++) {\r\n\t\t\t\tvar layer = this.geometryToLayer({\r\n\t\t\t\t\tgeometry: geometry.geometries[i],\r\n\t\t\t\t\ttype: 'Feature',\r\n\t\t\t\t\tproperties: geojson.properties\r\n\t\t\t\t}, options);\r\n\r\n\t\t\t\tif (layer) {\r\n\t\t\t\t\tlayers.push(layer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tdefault:\r\n\t\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t\t}\r\n\t},\r\n\r\n\t// @function coordsToLatLng(coords: Array): LatLng\r\n\t// Creates a `LatLng` object from an array of 2 numbers (longitude, latitude)\r\n\t// or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.\r\n\tcoordsToLatLng: function (coords) {\r\n\t\treturn new L.LatLng(coords[1], coords[0], coords[2]);\r\n\t},\r\n\r\n\t// @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array\r\n\t// Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array.\r\n\t// `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default).\r\n\t// Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function.\r\n\tcoordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) {\r\n\t\tvar latlngs = [];\r\n\r\n\t\tfor (var i = 0, len = coords.length, latlng; i < len; i++) {\r\n\t\t\tlatlng = levelsDeep ?\r\n\t\t\t this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :\r\n\t\t\t (coordsToLatLng || this.coordsToLatLng)(coords[i]);\r\n\r\n\t\t\tlatlngs.push(latlng);\r\n\t\t}\r\n\r\n\t\treturn latlngs;\r\n\t},\r\n\r\n\t// @function latLngToCoords(latlng: LatLng): Array\r\n\t// Reverse of [`coordsToLatLng`](#geojson-coordstolatlng)\r\n\tlatLngToCoords: function (latlng) {\r\n\t\treturn latlng.alt !== undefined ?\r\n\t\t\t\t[latlng.lng, latlng.lat, latlng.alt] :\r\n\t\t\t\t[latlng.lng, latlng.lat];\r\n\t},\r\n\r\n\t// @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array\r\n\t// Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs)\r\n\t// `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default.\r\n\tlatLngsToCoords: function (latlngs, levelsDeep, closed) {\r\n\t\tvar coords = [];\r\n\r\n\t\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\t\tcoords.push(levelsDeep ?\r\n\t\t\t\tL.GeoJSON.latLngsToCoords(latlngs[i], levelsDeep - 1, closed) :\r\n\t\t\t\tL.GeoJSON.latLngToCoords(latlngs[i]));\r\n\t\t}\r\n\r\n\t\tif (!levelsDeep && closed) {\r\n\t\t\tcoords.push(coords[0]);\r\n\t\t}\r\n\r\n\t\treturn coords;\r\n\t},\r\n\r\n\tgetFeature: function (layer, newGeometry) {\r\n\t\treturn layer.feature ?\r\n\t\t\t\tL.extend({}, layer.feature, {geometry: newGeometry}) :\r\n\t\t\t\tL.GeoJSON.asFeature(newGeometry);\r\n\t},\r\n\r\n\t// @function asFeature(geojson: Object): Object\r\n\t// Normalize GeoJSON geometries/features into GeoJSON features.\r\n\tasFeature: function (geojson) {\r\n\t\tif (geojson.type === 'Feature') {\r\n\t\t\treturn geojson;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'Feature',\r\n\t\t\tproperties: {},\r\n\t\t\tgeometry: geojson\r\n\t\t};\r\n\t}\r\n});\r\n\r\nvar PointToGeoJSON = {\r\n\ttoGeoJSON: function () {\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'Point',\r\n\t\t\tcoordinates: L.GeoJSON.latLngToCoords(this.getLatLng())\r\n\t\t});\r\n\t}\r\n};\r\n\r\nL.Marker.include(PointToGeoJSON);\r\n\r\n// @namespace CircleMarker\r\n// @method toGeoJSON(): Object\r\n// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature).\r\nL.Circle.include(PointToGeoJSON);\r\nL.CircleMarker.include(PointToGeoJSON);\r\n\r\n\r\n// @namespace Polyline\r\n// @method toGeoJSON(): Object\r\n// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature).\r\nL.Polyline.prototype.toGeoJSON = function () {\r\n\tvar multi = !L.Polyline._flat(this._latlngs);\r\n\r\n\tvar coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 1 : 0);\r\n\r\n\treturn L.GeoJSON.getFeature(this, {\r\n\t\ttype: (multi ? 'Multi' : '') + 'LineString',\r\n\t\tcoordinates: coords\r\n\t});\r\n};\r\n\r\n// @namespace Polygon\r\n// @method toGeoJSON(): Object\r\n// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature).\r\nL.Polygon.prototype.toGeoJSON = function () {\r\n\tvar holes = !L.Polyline._flat(this._latlngs),\r\n\t multi = holes && !L.Polyline._flat(this._latlngs[0]);\r\n\r\n\tvar coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true);\r\n\r\n\tif (!holes) {\r\n\t\tcoords = [coords];\r\n\t}\r\n\r\n\treturn L.GeoJSON.getFeature(this, {\r\n\t\ttype: (multi ? 'Multi' : '') + 'Polygon',\r\n\t\tcoordinates: coords\r\n\t});\r\n};\r\n\r\n\r\n// @namespace LayerGroup\r\nL.LayerGroup.include({\r\n\ttoMultiPoint: function () {\r\n\t\tvar coords = [];\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tcoords.push(layer.toGeoJSON().geometry.coordinates);\r\n\t\t});\r\n\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'MultiPoint',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t},\r\n\r\n\t// @method toGeoJSON(): Object\r\n\t// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `GeometryCollection`).\r\n\ttoGeoJSON: function () {\r\n\r\n\t\tvar type = this.feature && this.feature.geometry && this.feature.geometry.type;\r\n\r\n\t\tif (type === 'MultiPoint') {\r\n\t\t\treturn this.toMultiPoint();\r\n\t\t}\r\n\r\n\t\tvar isGeometryCollection = type === 'GeometryCollection',\r\n\t\t jsons = [];\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tif (layer.toGeoJSON) {\r\n\t\t\t\tvar json = layer.toGeoJSON();\r\n\t\t\t\tjsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (isGeometryCollection) {\r\n\t\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\t\tgeometries: jsons,\r\n\t\t\t\ttype: 'GeometryCollection'\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'FeatureCollection',\r\n\t\t\tfeatures: jsons\r\n\t\t};\r\n\t}\r\n});\r\n\r\n// @namespace GeoJSON\r\n// @factory L.geoJSON(geojson?: Object, options?: GeoJSON options)\r\n// Creates a GeoJSON layer. Optionally accepts an object in\r\n// [GeoJSON format](http://geojson.org/geojson-spec.html) to display on the map\r\n// (you can alternatively add it later with `addData` method) and an `options` object.\r\nL.geoJSON = function (geojson, options) {\r\n\treturn new L.GeoJSON(geojson, options);\r\n};\r\n// Backward compatibility.\r\nL.geoJson = L.geoJSON;\r\n\n/*\r\n * @namespace DomEvent\r\n * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally.\r\n */\r\n\r\n// Inspired by John Resig, Dean Edwards and YUI addEvent implementations.\r\n\r\n\r\n\r\nvar eventsKey = '_leaflet_events';\r\n\r\nL.DomEvent = {\r\n\r\n\t// @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this\r\n\t// Adds a listener function (`fn`) to a particular DOM event type of the\r\n\t// element `el`. You can optionally specify the context of the listener\r\n\t// (object the `this` keyword will point to). You can also pass several\r\n\t// space-separated types (e.g. `'click dblclick'`).\r\n\r\n\t// @alternative\r\n\t// @function on(el: HTMLElement, eventMap: Object, context?: Object): this\r\n\t// Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\ton: function (obj, types, fn, context) {\r\n\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis._on(obj, type, types[type], fn);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._on(obj, types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this\r\n\t// Removes a previously added listener function. If no function is specified,\r\n\t// it will remove all the listeners of that particular DOM event from the element.\r\n\t// Note that if you passed a custom context to on, you must pass the same\r\n\t// context to `off` in order to remove the listener.\r\n\r\n\t// @alternative\r\n\t// @function off(el: HTMLElement, eventMap: Object, context?: Object): this\r\n\t// Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\toff: function (obj, types, fn, context) {\r\n\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis._off(obj, type, types[type], fn);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._off(obj, types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_on: function (obj, type, fn, context) {\r\n\t\tvar id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : '');\r\n\r\n\t\tif (obj[eventsKey] && obj[eventsKey][id]) { return this; }\r\n\r\n\t\tvar handler = function (e) {\r\n\t\t\treturn fn.call(context || obj, e || window.event);\r\n\t\t};\r\n\r\n\t\tvar originalHandler = handler;\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\tthis.addPointerListener(obj, type, handler, id);\r\n\r\n\t\t} else if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {\r\n\t\t\tthis.addDoubleTapListener(obj, handler, id);\r\n\r\n\t\t} else if ('addEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.addEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false);\r\n\r\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\r\n\t\t\t\thandler = function (e) {\r\n\t\t\t\t\te = e || window.event;\r\n\t\t\t\t\tif (L.DomEvent._isExternalTarget(obj, e)) {\r\n\t\t\t\t\t\toriginalHandler(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\tobj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false);\r\n\r\n\t\t\t} else {\r\n\t\t\t\tif (type === 'click' && L.Browser.android) {\r\n\t\t\t\t\thandler = function (e) {\r\n\t\t\t\t\t\treturn L.DomEvent._filterClick(e, originalHandler);\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\t\t\t}\r\n\r\n\t\t} else if ('attachEvent' in obj) {\r\n\t\t\tobj.attachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[eventsKey] = obj[eventsKey] || {};\r\n\t\tobj[eventsKey][id] = handler;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_off: function (obj, type, fn, context) {\r\n\r\n\t\tvar id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''),\r\n\t\t handler = obj[eventsKey] && obj[eventsKey][id];\r\n\r\n\t\tif (!handler) { return this; }\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\tthis.removePointerListener(obj, type, id);\r\n\r\n\t\t} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {\r\n\t\t\tthis.removeDoubleTapListener(obj, id);\r\n\r\n\t\t} else if ('removeEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.removeEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false);\r\n\r\n\t\t\t} else {\r\n\t\t\t\tobj.removeEventListener(\r\n\t\t\t\t\ttype === 'mouseenter' ? 'mouseover' :\r\n\t\t\t\t\ttype === 'mouseleave' ? 'mouseout' : type, handler, false);\r\n\t\t\t}\r\n\r\n\t\t} else if ('detachEvent' in obj) {\r\n\t\t\tobj.detachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[eventsKey][id] = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function stopPropagation(ev: DOMEvent): this\r\n\t// Stop the given event from propagation to parent elements. Used inside the listener functions:\r\n\t// ```js\r\n\t// L.DomEvent.on(div, 'click', function (ev) {\r\n\t// \tL.DomEvent.stopPropagation(ev);\r\n\t// });\r\n\t// ```\r\n\tstopPropagation: function (e) {\r\n\r\n\t\tif (e.stopPropagation) {\r\n\t\t\te.stopPropagation();\r\n\t\t} else if (e.originalEvent) { // In case of Leaflet event.\r\n\t\t\te.originalEvent._stopped = true;\r\n\t\t} else {\r\n\t\t\te.cancelBubble = true;\r\n\t\t}\r\n\t\tL.DomEvent._skipped(e);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function disableScrollPropagation(el: HTMLElement): this\r\n\t// Adds `stopPropagation` to the element's `'mousewheel'` events (plus browser variants).\r\n\tdisableScrollPropagation: function (el) {\r\n\t\treturn L.DomEvent.on(el, 'mousewheel', L.DomEvent.stopPropagation);\r\n\t},\r\n\r\n\t// @function disableClickPropagation(el: HTMLElement): this\r\n\t// Adds `stopPropagation` to the element's `'click'`, `'doubleclick'`,\r\n\t// `'mousedown'` and `'touchstart'` events (plus browser variants).\r\n\tdisableClickPropagation: function (el) {\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\tL.DomEvent.on(el, L.Draggable.START.join(' '), stop);\r\n\r\n\t\treturn L.DomEvent.on(el, {\r\n\t\t\tclick: L.DomEvent._fakeStop,\r\n\t\t\tdblclick: stop\r\n\t\t});\r\n\t},\r\n\r\n\t// @function preventDefault(ev: DOMEvent): this\r\n\t// Prevents the default action of the DOM Event `ev` from happening (such as\r\n\t// following a link in the href of the a element, or doing a POST request\r\n\t// with page reload when a `<form>` is submitted).\r\n\t// Use it inside listener functions.\r\n\tpreventDefault: function (e) {\r\n\r\n\t\tif (e.preventDefault) {\r\n\t\t\te.preventDefault();\r\n\t\t} else {\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function stop(ev): this\r\n\t// Does `stopPropagation` and `preventDefault` at the same time.\r\n\tstop: function (e) {\r\n\t\treturn L.DomEvent\r\n\t\t\t.preventDefault(e)\r\n\t\t\t.stopPropagation(e);\r\n\t},\r\n\r\n\t// @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point\r\n\t// Gets normalized mouse position from a DOM event relative to the\r\n\t// `container` or to the whole page if not specified.\r\n\tgetMousePosition: function (e, container) {\r\n\t\tif (!container) {\r\n\t\t\treturn new L.Point(e.clientX, e.clientY);\r\n\t\t}\r\n\r\n\t\tvar rect = container.getBoundingClientRect();\r\n\r\n\t\treturn new L.Point(\r\n\t\t\te.clientX - rect.left - container.clientLeft,\r\n\t\t\te.clientY - rect.top - container.clientTop);\r\n\t},\r\n\r\n\t// Chrome on Win scrolls double the pixels as in other platforms (see #4538),\r\n\t// and Firefox scrolls device pixels, not CSS pixels\r\n\t_wheelPxFactor: (L.Browser.win && L.Browser.chrome) ? 2 :\r\n\t L.Browser.gecko ? window.devicePixelRatio :\r\n\t 1,\r\n\r\n\t// @function getWheelDelta(ev: DOMEvent): Number\r\n\t// Gets normalized wheel delta from a mousewheel DOM event, in vertical\r\n\t// pixels scrolled (negative if scrolling down).\r\n\t// Events from pointing devices without precise scrolling are mapped to\r\n\t// a best guess of 60 pixels.\r\n\tgetWheelDelta: function (e) {\r\n\t\treturn (L.Browser.edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta\r\n\t\t (e.deltaY && e.deltaMode === 0) ? -e.deltaY / L.DomEvent._wheelPxFactor : // Pixels\r\n\t\t (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines\r\n\t\t (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages\r\n\t\t (e.deltaX || e.deltaZ) ? 0 :\t// Skip horizontal/depth wheel events\r\n\t\t e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels\r\n\t\t (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines\r\n\t\t e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages\r\n\t\t 0;\r\n\t},\r\n\r\n\t_skipEvents: {},\r\n\r\n\t_fakeStop: function (e) {\r\n\t\t// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)\r\n\t\tL.DomEvent._skipEvents[e.type] = true;\r\n\t},\r\n\r\n\t_skipped: function (e) {\r\n\t\tvar skipped = this._skipEvents[e.type];\r\n\t\t// reset when checking, as it's only used in map container and propagates outside of the map\r\n\t\tthis._skipEvents[e.type] = false;\r\n\t\treturn skipped;\r\n\t},\r\n\r\n\t// check if element really left/entered the event target (for mouseenter/mouseleave)\r\n\t_isExternalTarget: function (el, e) {\r\n\r\n\t\tvar related = e.relatedTarget;\r\n\r\n\t\tif (!related) { return true; }\r\n\r\n\t\ttry {\r\n\t\t\twhile (related && (related !== el)) {\r\n\t\t\t\trelated = related.parentNode;\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn (related !== el);\r\n\t},\r\n\r\n\t// this is a horrible workaround for a bug in Android where a single touch triggers two click events\r\n\t_filterClick: function (e, handler) {\r\n\t\tvar timeStamp = (e.timeStamp || (e.originalEvent && e.originalEvent.timeStamp)),\r\n\t\t elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);\r\n\r\n\t\t// are they closer together than 500ms yet more than 100ms?\r\n\t\t// Android typically triggers them ~300ms apart while multiple listeners\r\n\t\t// on the same event should be triggered far faster;\r\n\t\t// or check if click is simulated on the element, and if it is, reject any non-simulated events\r\n\r\n\t\tif ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {\r\n\t\t\tL.DomEvent.stop(e);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tL.DomEvent._lastClick = timeStamp;\r\n\r\n\t\thandler(e);\r\n\t}\r\n};\r\n\r\n// @function addListener(…): this\r\n// Alias to [`L.DomEvent.on`](#domevent-on)\r\nL.DomEvent.addListener = L.DomEvent.on;\r\n\r\n// @function removeListener(…): this\r\n// Alias to [`L.DomEvent.off`](#domevent-off)\r\nL.DomEvent.removeListener = L.DomEvent.off;\r\n\n/*\r\n * @class Draggable\r\n * @aka L.Draggable\r\n * @inherits Evented\r\n *\r\n * A class for making DOM elements draggable (including touch support).\r\n * Used internally for map and marker dragging. Only works for elements\r\n * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition).\r\n *\r\n * @example\r\n * ```js\r\n * var draggable = new L.Draggable(elementToDrag);\r\n * draggable.enable();\r\n * ```\r\n */\r\n\r\nL.Draggable = L.Evented.extend({\r\n\r\n\toptions: {\r\n\t\t// @option clickTolerance: Number = 3\r\n\t\t// The max number of pixels a user can shift the mouse pointer during a click\r\n\t\t// for it to be considered a valid click (as opposed to a mouse drag).\r\n\t\tclickTolerance: 3\r\n\t},\r\n\r\n\tstatics: {\r\n\t\tSTART: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],\r\n\t\tEND: {\r\n\t\t\tmousedown: 'mouseup',\r\n\t\t\ttouchstart: 'touchend',\r\n\t\t\tpointerdown: 'touchend',\r\n\t\t\tMSPointerDown: 'touchend'\r\n\t\t},\r\n\t\tMOVE: {\r\n\t\t\tmousedown: 'mousemove',\r\n\t\t\ttouchstart: 'touchmove',\r\n\t\t\tpointerdown: 'touchmove',\r\n\t\t\tMSPointerDown: 'touchmove'\r\n\t\t}\r\n\t},\r\n\r\n\t// @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline: Boolean)\r\n\t// Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default).\r\n\tinitialize: function (element, dragStartTarget, preventOutline) {\r\n\t\tthis._element = element;\r\n\t\tthis._dragStartTarget = dragStartTarget || element;\r\n\t\tthis._preventOutline = preventOutline;\r\n\t},\r\n\r\n\t// @method enable()\r\n\t// Enables the dragging ability\r\n\tenable: function () {\r\n\t\tif (this._enabled) { return; }\r\n\r\n\t\tL.DomEvent.on(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this);\r\n\r\n\t\tthis._enabled = true;\r\n\t},\r\n\r\n\t// @method disable()\r\n\t// Disables the dragging ability\r\n\tdisable: function () {\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\tL.DomEvent.off(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this);\r\n\r\n\t\tthis._enabled = false;\r\n\t\tthis._moved = false;\r\n\t},\r\n\r\n\t_onDown: function (e) {\r\n\t\t// Ignore simulated events, since we handle both touch and\r\n\t\t// mouse explicitly; otherwise we risk getting duplicates of\r\n\t\t// touch events, see #4315.\r\n\t\t// Also ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (e._simulated || !this._enabled) { return; }\r\n\r\n\t\tthis._moved = false;\r\n\r\n\t\tif (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; }\r\n\r\n\t\tif (L.Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches) || !this._enabled) { return; }\r\n\t\tL.Draggable._dragging = true; // Prevent dragging multiple objects at once.\r\n\r\n\t\tif (this._preventOutline) {\r\n\t\t\tL.DomUtil.preventOutline(this._element);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.disableImageDrag();\r\n\t\tL.DomUtil.disableTextSelection();\r\n\r\n\t\tif (this._moving) { return; }\r\n\r\n\t\t// @event down: Event\r\n\t\t// Fired when a drag is about to start.\r\n\t\tthis.fire('down');\r\n\r\n\t\tvar first = e.touches ? e.touches[0] : e;\r\n\r\n\t\tthis._startPoint = new L.Point(first.clientX, first.clientY);\r\n\r\n\t\tL.DomEvent\r\n\t\t\t.on(document, L.Draggable.MOVE[e.type], this._onMove, this)\r\n\t\t\t.on(document, L.Draggable.END[e.type], this._onUp, this);\r\n\t},\r\n\r\n\t_onMove: function (e) {\r\n\t\t// Ignore simulated events, since we handle both touch and\r\n\t\t// mouse explicitly; otherwise we risk getting duplicates of\r\n\t\t// touch events, see #4315.\r\n\t\t// Also ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (e._simulated || !this._enabled) { return; }\r\n\r\n\t\tif (e.touches && e.touches.length > 1) {\r\n\t\t\tthis._moved = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\r\n\t\t newPoint = new L.Point(first.clientX, first.clientY),\r\n\t\t offset = newPoint.subtract(this._startPoint);\r\n\r\n\t\tif (!offset.x && !offset.y) { return; }\r\n\t\tif (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; }\r\n\r\n\t\tL.DomEvent.preventDefault(e);\r\n\r\n\t\tif (!this._moved) {\r\n\t\t\t// @event dragstart: Event\r\n\t\t\t// Fired when a drag starts\r\n\t\t\tthis.fire('dragstart');\r\n\r\n\t\t\tthis._moved = true;\r\n\t\t\tthis._startPos = L.DomUtil.getPosition(this._element).subtract(offset);\r\n\r\n\t\t\tL.DomUtil.addClass(document.body, 'leaflet-dragging');\r\n\r\n\t\t\tthis._lastTarget = e.target || e.srcElement;\r\n\t\t\t// IE and Edge do not give the <use> element, so fetch it\r\n\t\t\t// if necessary\r\n\t\t\tif ((window.SVGElementInstance) && (this._lastTarget instanceof SVGElementInstance)) {\r\n\t\t\t\tthis._lastTarget = this._lastTarget.correspondingUseElement;\r\n\t\t\t}\r\n\t\t\tL.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t}\r\n\r\n\t\tthis._newPos = this._startPos.add(offset);\r\n\t\tthis._moving = true;\r\n\r\n\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\t\tthis._lastEvent = e;\r\n\t\tthis._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true);\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tvar e = {originalEvent: this._lastEvent};\r\n\r\n\t\t// @event predrag: Event\r\n\t\t// Fired continuously during dragging *before* each corresponding\r\n\t\t// update of the element's position.\r\n\t\tthis.fire('predrag', e);\r\n\t\tL.DomUtil.setPosition(this._element, this._newPos);\r\n\r\n\t\t// @event drag: Event\r\n\t\t// Fired continuously during dragging.\r\n\t\tthis.fire('drag', e);\r\n\t},\r\n\r\n\t_onUp: function (e) {\r\n\t\t// Ignore simulated events, since we handle both touch and\r\n\t\t// mouse explicitly; otherwise we risk getting duplicates of\r\n\t\t// touch events, see #4315.\r\n\t\t// Also ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (e._simulated || !this._enabled) { return; }\r\n\r\n\t\tL.DomUtil.removeClass(document.body, 'leaflet-dragging');\r\n\r\n\t\tif (this._lastTarget) {\r\n\t\t\tL.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t\tthis._lastTarget = null;\r\n\t\t}\r\n\r\n\t\tfor (var i in L.Draggable.MOVE) {\r\n\t\t\tL.DomEvent\r\n\t\t\t\t.off(document, L.Draggable.MOVE[i], this._onMove, this)\r\n\t\t\t\t.off(document, L.Draggable.END[i], this._onUp, this);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.enableImageDrag();\r\n\t\tL.DomUtil.enableTextSelection();\r\n\r\n\t\tif (this._moved && this._moving) {\r\n\t\t\t// ensure drag is not fired after dragend\r\n\t\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\r\n\t\t\t// @event dragend: DragEndEvent\r\n\t\t\t// Fired when the drag ends.\r\n\t\t\tthis.fire('dragend', {\r\n\t\t\t\tdistance: this._newPos.distanceTo(this._startPos)\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._moving = false;\r\n\t\tL.Draggable._dragging = false;\r\n\t}\r\n});\r\n\n/*\n\tL.Handler is a base class for handler classes that are used internally to inject\n\tinteraction features like dragging to classes like Map and Marker.\n*/\n\n// @class Handler\n// @aka L.Handler\n// Abstract class for map interaction handlers\n\nL.Handler = L.Class.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t},\n\n\t// @method enable(): this\n\t// Enables the handler\n\tenable: function () {\n\t\tif (this._enabled) { return this; }\n\n\t\tthis._enabled = true;\n\t\tthis.addHooks();\n\t\treturn this;\n\t},\n\n\t// @method disable(): this\n\t// Disables the handler\n\tdisable: function () {\n\t\tif (!this._enabled) { return this; }\n\n\t\tthis._enabled = false;\n\t\tthis.removeHooks();\n\t\treturn this;\n\t},\n\n\t// @method enabled(): Boolean\n\t// Returns `true` if the handler is enabled\n\tenabled: function () {\n\t\treturn !!this._enabled;\n\t}\n\n\t// @section Extension methods\n\t// Classes inheriting from `Handler` must implement the two following methods:\n\t// @method addHooks()\n\t// Called when the handler is enabled, should add event hooks.\n\t// @method removeHooks()\n\t// Called when the handler is disabled, should remove the event hooks added previously.\n});\n\n/*\n * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @option dragging: Boolean = true\n\t// Whether the map be draggable with mouse/touch or not.\n\tdragging: true,\n\n\t// @section Panning Inertia Options\n\t// @option inertia: Boolean = *\n\t// If enabled, panning of the map will have an inertia effect where\n\t// the map builds momentum while dragging and continues moving in\n\t// the same direction for some time. Feels especially nice on touch\n\t// devices. Enabled by default unless running on old Android devices.\n\tinertia: !L.Browser.android23,\n\n\t// @option inertiaDeceleration: Number = 3000\n\t// The rate with which the inertial movement slows down, in pixels/second².\n\tinertiaDeceleration: 3400, // px/s^2\n\n\t// @option inertiaMaxSpeed: Number = Infinity\n\t// Max speed of the inertial movement, in pixels/second.\n\tinertiaMaxSpeed: Infinity, // px/s\n\n\t// @option easeLinearity: Number = 0.2\n\teaseLinearity: 0.2,\n\n\t// TODO refactor, move to CRS\n\t// @option worldCopyJump: Boolean = false\n\t// With this option enabled, the map tracks when you pan to another \"copy\"\n\t// of the world and seamlessly jumps to the original one so that all overlays\n\t// like markers and vector layers are still visible.\n\tworldCopyJump: false,\n\n\t// @option maxBoundsViscosity: Number = 0.0\n\t// If `maxBounds` is set, this option will control how solid the bounds\n\t// are when dragging the map around. The default value of `0.0` allows the\n\t// user to drag outside the bounds at normal speed, higher values will\n\t// slow down map dragging outside bounds, and `1.0` makes the bounds fully\n\t// solid, preventing the user from dragging outside the bounds.\n\tmaxBoundsViscosity: 0.0\n});\n\nL.Map.Drag = L.Handler.extend({\n\taddHooks: function () {\n\t\tif (!this._draggable) {\n\t\t\tvar map = this._map;\n\n\t\t\tthis._draggable = new L.Draggable(map._mapPane, map._container);\n\n\t\t\tthis._draggable.on({\n\t\t\t\tdown: this._onDown,\n\t\t\t\tdragstart: this._onDragStart,\n\t\t\t\tdrag: this._onDrag,\n\t\t\t\tdragend: this._onDragEnd\n\t\t\t}, this);\n\n\t\t\tthis._draggable.on('predrag', this._onPreDragLimit, this);\n\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\tthis._draggable.on('predrag', this._onPreDragWrap, this);\n\t\t\t\tmap.on('zoomend', this._onZoomEnd, this);\n\n\t\t\t\tmap.whenReady(this._onZoomEnd, this);\n\t\t\t}\n\t\t}\n\t\tL.DomUtil.addClass(this._map._container, 'leaflet-grab leaflet-touch-drag');\n\t\tthis._draggable.enable();\n\t\tthis._positions = [];\n\t\tthis._times = [];\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomUtil.removeClass(this._map._container, 'leaflet-grab');\n\t\tL.DomUtil.removeClass(this._map._container, 'leaflet-touch-drag');\n\t\tthis._draggable.disable();\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\tmoving: function () {\n\t\treturn this._draggable && this._draggable._moving;\n\t},\n\n\t_onDown: function () {\n\t\tthis._map._stop();\n\t},\n\n\t_onDragStart: function () {\n\t\tvar map = this._map;\n\n\t\tif (this._map.options.maxBounds && this._map.options.maxBoundsViscosity) {\n\t\t\tvar bounds = L.latLngBounds(this._map.options.maxBounds);\n\n\t\t\tthis._offsetLimit = L.bounds(\n\t\t\t\tthis._map.latLngToContainerPoint(bounds.getNorthWest()).multiplyBy(-1),\n\t\t\t\tthis._map.latLngToContainerPoint(bounds.getSouthEast()).multiplyBy(-1)\n\t\t\t\t\t.add(this._map.getSize()));\n\n\t\t\tthis._viscosity = Math.min(1.0, Math.max(0.0, this._map.options.maxBoundsViscosity));\n\t\t} else {\n\t\t\tthis._offsetLimit = null;\n\t\t}\n\n\t\tmap\n\t\t .fire('movestart')\n\t\t .fire('dragstart');\n\n\t\tif (map.options.inertia) {\n\t\t\tthis._positions = [];\n\t\t\tthis._times = [];\n\t\t}\n\t},\n\n\t_onDrag: function (e) {\n\t\tif (this._map.options.inertia) {\n\t\t\tvar time = this._lastTime = +new Date(),\n\t\t\t pos = this._lastPos = this._draggable._absPos || this._draggable._newPos;\n\n\t\t\tthis._positions.push(pos);\n\t\t\tthis._times.push(time);\n\n\t\t\tif (time - this._times[0] > 50) {\n\t\t\t\tthis._positions.shift();\n\t\t\t\tthis._times.shift();\n\t\t\t}\n\t\t}\n\n\t\tthis._map\n\t\t .fire('move', e)\n\t\t .fire('drag', e);\n\t},\n\n\t_onZoomEnd: function () {\n\t\tvar pxCenter = this._map.getSize().divideBy(2),\n\t\t pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);\n\n\t\tthis._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;\n\t\tthis._worldWidth = this._map.getPixelWorldBounds().getSize().x;\n\t},\n\n\t_viscousLimit: function (value, threshold) {\n\t\treturn value - (value - threshold) * this._viscosity;\n\t},\n\n\t_onPreDragLimit: function () {\n\t\tif (!this._viscosity || !this._offsetLimit) { return; }\n\n\t\tvar offset = this._draggable._newPos.subtract(this._draggable._startPos);\n\n\t\tvar limit = this._offsetLimit;\n\t\tif (offset.x < limit.min.x) { offset.x = this._viscousLimit(offset.x, limit.min.x); }\n\t\tif (offset.y < limit.min.y) { offset.y = this._viscousLimit(offset.y, limit.min.y); }\n\t\tif (offset.x > limit.max.x) { offset.x = this._viscousLimit(offset.x, limit.max.x); }\n\t\tif (offset.y > limit.max.y) { offset.y = this._viscousLimit(offset.y, limit.max.y); }\n\n\t\tthis._draggable._newPos = this._draggable._startPos.add(offset);\n\t},\n\n\t_onPreDragWrap: function () {\n\t\t// TODO refactor to be able to adjust map pane position after zoom\n\t\tvar worldWidth = this._worldWidth,\n\t\t halfWidth = Math.round(worldWidth / 2),\n\t\t dx = this._initialWorldOffset,\n\t\t x = this._draggable._newPos.x,\n\t\t newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,\n\t\t newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,\n\t\t newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;\n\n\t\tthis._draggable._absPos = this._draggable._newPos.clone();\n\t\tthis._draggable._newPos.x = newX;\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tvar map = this._map,\n\t\t options = map.options,\n\n\t\t noInertia = !options.inertia || this._times.length < 2;\n\n\t\tmap.fire('dragend', e);\n\n\t\tif (noInertia) {\n\t\t\tmap.fire('moveend');\n\n\t\t} else {\n\n\t\t\tvar direction = this._lastPos.subtract(this._positions[0]),\n\t\t\t duration = (this._lastTime - this._times[0]) / 1000,\n\t\t\t ease = options.easeLinearity,\n\n\t\t\t speedVector = direction.multiplyBy(ease / duration),\n\t\t\t speed = speedVector.distanceTo([0, 0]),\n\n\t\t\t limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),\n\t\t\t limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),\n\n\t\t\t decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),\n\t\t\t offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();\n\n\t\t\tif (!offset.x && !offset.y) {\n\t\t\t\tmap.fire('moveend');\n\n\t\t\t} else {\n\t\t\t\toffset = map._limitOffset(offset, map.options.maxBounds);\n\n\t\t\t\tL.Util.requestAnimFrame(function () {\n\t\t\t\t\tmap.panBy(offset, {\n\t\t\t\t\t\tduration: decelerationDuration,\n\t\t\t\t\t\teaseLinearity: ease,\n\t\t\t\t\t\tnoMoveStart: true,\n\t\t\t\t\t\tanimate: true\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property dragging: Handler\n// Map dragging handler (by both mouse and touch).\nL.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);\n\n/*\n * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\n\nL.Map.mergeOptions({\n\t// @option doubleClickZoom: Boolean|String = true\n\t// Whether the map can be zoomed in by double clicking on it and\n\t// zoomed out by double clicking while holding shift. If passed\n\t// `'center'`, double-click zoom will zoom to the center of the\n\t// view regardless of where the mouse was.\n\tdoubleClickZoom: true\n});\n\nL.Map.DoubleClickZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tthis._map.on('dblclick', this._onDoubleClick, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._map.off('dblclick', this._onDoubleClick, this);\n\t},\n\n\t_onDoubleClick: function (e) {\n\t\tvar map = this._map,\n\t\t oldZoom = map.getZoom(),\n\t\t delta = map.options.zoomDelta,\n\t\t zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta;\n\n\t\tif (map.options.doubleClickZoom === 'center') {\n\t\t\tmap.setZoom(zoom);\n\t\t} else {\n\t\t\tmap.setZoomAround(e.containerPoint, zoom);\n\t\t}\n\t}\n});\n\n// @section Handlers\n//\n// Map properties include interaction handlers that allow you to control\n// interaction behavior in runtime, enabling or disabling certain features such\n// as dragging or touch zoom (see `Handler` methods). For example:\n//\n// ```js\n// map.doubleClickZoom.disable();\n// ```\n//\n// @property doubleClickZoom: Handler\n// Double click zoom handler.\nL.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);\n\n/*\n * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @section Mousewheel options\n\t// @option scrollWheelZoom: Boolean|String = true\n\t// Whether the map can be zoomed by using the mouse wheel. If passed `'center'`,\n\t// it will zoom to the center of the view regardless of where the mouse was.\n\tscrollWheelZoom: true,\n\n\t// @option wheelDebounceTime: Number = 40\n\t// Limits the rate at which a wheel can fire (in milliseconds). By default\n\t// user can't zoom via wheel more often than once per 40 ms.\n\twheelDebounceTime: 40,\n\n\t// @option wheelPxPerZoomLevel: Number = 60\n\t// How many scroll pixels (as reported by [L.DomEvent.getWheelDelta](#domevent-getwheeldelta))\n\t// mean a change of one full zoom level. Smaller values will make wheel-zooming\n\t// faster (and vice versa).\n\twheelPxPerZoomLevel: 60\n});\n\nL.Map.ScrollWheelZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);\n\n\t\tthis._delta = 0;\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll, this);\n\t},\n\n\t_onWheelScroll: function (e) {\n\t\tvar delta = L.DomEvent.getWheelDelta(e);\n\n\t\tvar debounce = this._map.options.wheelDebounceTime;\n\n\t\tthis._delta += delta;\n\t\tthis._lastMousePos = this._map.mouseEventToContainerPoint(e);\n\n\t\tif (!this._startTime) {\n\t\t\tthis._startTime = +new Date();\n\t\t}\n\n\t\tvar left = Math.max(debounce - (+new Date() - this._startTime), 0);\n\n\t\tclearTimeout(this._timer);\n\t\tthis._timer = setTimeout(L.bind(this._performZoom, this), left);\n\n\t\tL.DomEvent.stop(e);\n\t},\n\n\t_performZoom: function () {\n\t\tvar map = this._map,\n\t\t zoom = map.getZoom(),\n\t\t snap = this._map.options.zoomSnap || 0;\n\n\t\tmap._stop(); // stop panning and fly animations if any\n\n\t\t// map the delta with a sigmoid function to -4..4 range leaning on -1..1\n\t\tvar d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4),\n\t\t d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2,\n\t\t d4 = snap ? Math.ceil(d3 / snap) * snap : d3,\n\t\t delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom;\n\n\t\tthis._delta = 0;\n\t\tthis._startTime = null;\n\n\t\tif (!delta) { return; }\n\n\t\tif (map.options.scrollWheelZoom === 'center') {\n\t\t\tmap.setZoom(zoom + delta);\n\t\t} else {\n\t\t\tmap.setZoomAround(this._lastMousePos, zoom + delta);\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property scrollWheelZoom: Handler\n// Scroll wheel zoom handler.\nL.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);\n\n/*\n * @class PosAnimation\n * @aka L.PosAnimation\n * @inherits Evented\n * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.\n *\n * @example\n * ```js\n * var fx = new L.PosAnimation();\n * fx.run(el, [300, 500], 0.5);\n * ```\n *\n * @constructor L.PosAnimation()\n * Creates a `PosAnimation` object.\n *\n */\n\nL.PosAnimation = L.Evented.extend({\n\n\t// @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number)\n\t// Run an animation of a given element to a new position, optionally setting\n\t// duration in seconds (`0.25` by default) and easing linearity factor (3rd\n\t// argument of the [cubic bezier curve](http://cubic-bezier.com/#0,0,.5,1),\n\t// `0.5` by default).\n\trun: function (el, newPos, duration, easeLinearity) {\n\t\tthis.stop();\n\n\t\tthis._el = el;\n\t\tthis._inProgress = true;\n\t\tthis._duration = duration || 0.25;\n\t\tthis._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);\n\n\t\tthis._startPos = L.DomUtil.getPosition(el);\n\t\tthis._offset = newPos.subtract(this._startPos);\n\t\tthis._startTime = +new Date();\n\n\t\t// @event start: Event\n\t\t// Fired when the animation starts\n\t\tthis.fire('start');\n\n\t\tthis._animate();\n\t},\n\n\t// @method stop()\n\t// Stops the animation (if currently running).\n\tstop: function () {\n\t\tif (!this._inProgress) { return; }\n\n\t\tthis._step(true);\n\t\tthis._complete();\n\t},\n\n\t_animate: function () {\n\t\t// animation loop\n\t\tthis._animId = L.Util.requestAnimFrame(this._animate, this);\n\t\tthis._step();\n\t},\n\n\t_step: function (round) {\n\t\tvar elapsed = (+new Date()) - this._startTime,\n\t\t duration = this._duration * 1000;\n\n\t\tif (elapsed < duration) {\n\t\t\tthis._runFrame(this._easeOut(elapsed / duration), round);\n\t\t} else {\n\t\t\tthis._runFrame(1);\n\t\t\tthis._complete();\n\t\t}\n\t},\n\n\t_runFrame: function (progress, round) {\n\t\tvar pos = this._startPos.add(this._offset.multiplyBy(progress));\n\t\tif (round) {\n\t\t\tpos._round();\n\t\t}\n\t\tL.DomUtil.setPosition(this._el, pos);\n\n\t\t// @event step: Event\n\t\t// Fired continuously during the animation.\n\t\tthis.fire('step');\n\t},\n\n\t_complete: function () {\n\t\tL.Util.cancelAnimFrame(this._animId);\n\n\t\tthis._inProgress = false;\n\t\t// @event end: Event\n\t\t// Fired when the animation ends.\n\t\tthis.fire('end');\n\t},\n\n\t_easeOut: function (t) {\n\t\treturn 1 - Math.pow(1 - t, this._easeOutPower);\n\t}\n});\n\n/*\n * Extends L.Map to handle panning animations.\n */\n\nL.Map.include({\n\n\tsetView: function (center, zoom, options) {\n\n\t\tzoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);\n\t\tcenter = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);\n\t\toptions = options || {};\n\n\t\tthis._stop();\n\n\t\tif (this._loaded && !options.reset && options !== true) {\n\n\t\t\tif (options.animate !== undefined) {\n\t\t\t\toptions.zoom = L.extend({animate: options.animate}, options.zoom);\n\t\t\t\toptions.pan = L.extend({animate: options.animate, duration: options.duration}, options.pan);\n\t\t\t}\n\n\t\t\t// try animating pan or zoom\n\t\t\tvar moved = (this._zoom !== zoom) ?\n\t\t\t\tthis._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :\n\t\t\t\tthis._tryAnimatedPan(center, options.pan);\n\n\t\t\tif (moved) {\n\t\t\t\t// prevent resize handler call, the view will refresh after animation anyway\n\t\t\t\tclearTimeout(this._sizeTimer);\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\n\t\t// animation didn't start, just reset the map view\n\t\tthis._resetView(center, zoom);\n\n\t\treturn this;\n\t},\n\n\tpanBy: function (offset, options) {\n\t\toffset = L.point(offset).round();\n\t\toptions = options || {};\n\n\t\tif (!offset.x && !offset.y) {\n\t\t\treturn this.fire('moveend');\n\t\t}\n\t\t// If we pan too far, Chrome gets issues with tiles\n\t\t// and makes them disappear or appear in the wrong place (slightly offset) #2602\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) {\n\t\t\tthis._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom());\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!this._panAnim) {\n\t\t\tthis._panAnim = new L.PosAnimation();\n\n\t\t\tthis._panAnim.on({\n\t\t\t\t'step': this._onPanTransitionStep,\n\t\t\t\t'end': this._onPanTransitionEnd\n\t\t\t}, this);\n\t\t}\n\n\t\t// don't fire movestart if animating inertia\n\t\tif (!options.noMoveStart) {\n\t\t\tthis.fire('movestart');\n\t\t}\n\n\t\t// animate pan unless animate: false specified\n\t\tif (options.animate !== false) {\n\t\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');\n\n\t\t\tvar newPos = this._getMapPanePos().subtract(offset).round();\n\t\t\tthis._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);\n\t\t} else {\n\t\t\tthis._rawPanBy(offset);\n\t\t\tthis.fire('move').fire('moveend');\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_onPanTransitionStep: function () {\n\t\tthis.fire('move');\n\t},\n\n\t_onPanTransitionEnd: function () {\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');\n\t\tthis.fire('moveend');\n\t},\n\n\t_tryAnimatedPan: function (center, options) {\n\t\t// difference between the new and current centers in pixels\n\t\tvar offset = this._getCenterOffset(center)._floor();\n\n\t\t// don't animate too far unless animate: true specified in options\n\t\tif ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }\n\n\t\tthis.panBy(offset, options);\n\n\t\treturn true;\n\t}\n});\n\n/*\n * Extends L.Map to handle zoom animations.\n */\n\n// @namespace Map\n// @section Animation Options\nL.Map.mergeOptions({\n\t// @option zoomAnimation: Boolean = true\n\t// Whether the map zoom animation is enabled. By default it's enabled\n\t// in all browsers that support CSS3 Transitions except Android.\n\tzoomAnimation: true,\n\n\t// @option zoomAnimationThreshold: Number = 4\n\t// Won't animate zoom if the zoom difference exceeds this value.\n\tzoomAnimationThreshold: 4\n});\n\nvar zoomAnimated = L.DomUtil.TRANSITION && L.Browser.any3d && !L.Browser.mobileOpera;\n\nif (zoomAnimated) {\n\n\tL.Map.addInitHook(function () {\n\t\t// don't animate on browsers without hardware-accelerated transitions or old Android/Opera\n\t\tthis._zoomAnimated = this.options.zoomAnimation;\n\n\t\t// zoom transitions run with the same duration for all layers, so if one of transitionend events\n\t\t// happens after starting zoom animation (propagating to the map pane), we know that it ended globally\n\t\tif (this._zoomAnimated) {\n\n\t\t\tthis._createAnimProxy();\n\n\t\t\tL.DomEvent.on(this._proxy, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this);\n\t\t}\n\t});\n}\n\nL.Map.include(!zoomAnimated ? {} : {\n\n\t_createAnimProxy: function () {\n\n\t\tvar proxy = this._proxy = L.DomUtil.create('div', 'leaflet-proxy leaflet-zoom-animated');\n\t\tthis._panes.mapPane.appendChild(proxy);\n\n\t\tthis.on('zoomanim', function (e) {\n\t\t\tvar prop = L.DomUtil.TRANSFORM,\n\t\t\t transform = proxy.style[prop];\n\n\t\t\tL.DomUtil.setTransform(proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1));\n\n\t\t\t// workaround for case when transform is the same and so transitionend event is not fired\n\t\t\tif (transform === proxy.style[prop] && this._animatingZoom) {\n\t\t\t\tthis._onZoomTransitionEnd();\n\t\t\t}\n\t\t}, this);\n\n\t\tthis.on('load moveend', function () {\n\t\t\tvar c = this.getCenter(),\n\t\t\t z = this.getZoom();\n\t\t\tL.DomUtil.setTransform(proxy, this.project(c, z), this.getZoomScale(z, 1));\n\t\t}, this);\n\t},\n\n\t_catchTransitionEnd: function (e) {\n\t\tif (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {\n\t\t\tthis._onZoomTransitionEnd();\n\t\t}\n\t},\n\n\t_nothingToAnimate: function () {\n\t\treturn !this._container.getElementsByClassName('leaflet-zoom-animated').length;\n\t},\n\n\t_tryAnimatedZoom: function (center, zoom, options) {\n\n\t\tif (this._animatingZoom) { return true; }\n\n\t\toptions = options || {};\n\n\t\t// don't animate if disabled, not supported or zoom difference is too large\n\t\tif (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||\n\t\t Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }\n\n\t\t// offset is the pixel coords of the zoom origin relative to the current center\n\t\tvar scale = this.getZoomScale(zoom),\n\t\t offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale);\n\n\t\t// don't animate if the zoom origin isn't within one screen from the current center, unless forced\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) { return false; }\n\n\t\tL.Util.requestAnimFrame(function () {\n\t\t\tthis\n\t\t\t ._moveStart(true)\n\t\t\t ._animateZoom(center, zoom, true);\n\t\t}, this);\n\n\t\treturn true;\n\t},\n\n\t_animateZoom: function (center, zoom, startAnim, noUpdate) {\n\t\tif (startAnim) {\n\t\t\tthis._animatingZoom = true;\n\n\t\t\t// remember what center/zoom to set after animation\n\t\t\tthis._animateToCenter = center;\n\t\t\tthis._animateToZoom = zoom;\n\n\t\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');\n\t\t}\n\n\t\t// @event zoomanim: ZoomAnimEvent\n\t\t// Fired on every frame of a zoom animation\n\t\tthis.fire('zoomanim', {\n\t\t\tcenter: center,\n\t\t\tzoom: zoom,\n\t\t\tnoUpdate: noUpdate\n\t\t});\n\n\t\t// Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693\n\t\tsetTimeout(L.bind(this._onZoomTransitionEnd, this), 250);\n\t},\n\n\t_onZoomTransitionEnd: function () {\n\t\tif (!this._animatingZoom) { return; }\n\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');\n\n\t\tthis._animatingZoom = false;\n\n\t\tthis._move(this._animateToCenter, this._animateToZoom);\n\n\t\t// This anim frame should prevent an obscure iOS webkit tile loading race condition.\n\t\tL.Util.requestAnimFrame(function () {\n\t\t\tthis._moveEnd(true);\n\t\t}, this);\n\t}\n});\n\n// @namespace Map\n// @section Methods for modifying map state\nL.Map.include({\n\n\t// @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this\n\t// Sets the view of the map (geographical center and zoom) performing a smooth\n\t// pan-zoom animation.\n\tflyTo: function (targetCenter, targetZoom, options) {\n\n\t\toptions = options || {};\n\t\tif (options.animate === false || !L.Browser.any3d) {\n\t\t\treturn this.setView(targetCenter, targetZoom, options);\n\t\t}\n\n\t\tthis._stop();\n\n\t\tvar from = this.project(this.getCenter()),\n\t\t to = this.project(targetCenter),\n\t\t size = this.getSize(),\n\t\t startZoom = this._zoom;\n\n\t\ttargetCenter = L.latLng(targetCenter);\n\t\ttargetZoom = targetZoom === undefined ? startZoom : targetZoom;\n\n\t\tvar w0 = Math.max(size.x, size.y),\n\t\t w1 = w0 * this.getZoomScale(startZoom, targetZoom),\n\t\t u1 = (to.distanceTo(from)) || 1,\n\t\t rho = 1.42,\n\t\t rho2 = rho * rho;\n\n\t\tfunction r(i) {\n\t\t\tvar s1 = i ? -1 : 1,\n\t\t\t s2 = i ? w1 : w0,\n\t\t\t t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1,\n\t\t\t b1 = 2 * s2 * rho2 * u1,\n\t\t\t b = t1 / b1,\n\t\t\t sq = Math.sqrt(b * b + 1) - b;\n\n\t\t\t // workaround for floating point precision bug when sq = 0, log = -Infinite,\n\t\t\t // thus triggering an infinite loop in flyTo\n\t\t\t var log = sq < 0.000000001 ? -18 : Math.log(sq);\n\n\t\t\treturn log;\n\t\t}\n\n\t\tfunction sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }\n\t\tfunction cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }\n\t\tfunction tanh(n) { return sinh(n) / cosh(n); }\n\n\t\tvar r0 = r(0);\n\n\t\tfunction w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); }\n\t\tfunction u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; }\n\n\t\tfunction easeOut(t) { return 1 - Math.pow(1 - t, 1.5); }\n\n\t\tvar start = Date.now(),\n\t\t S = (r(1) - r0) / rho,\n\t\t duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8;\n\n\t\tfunction frame() {\n\t\t\tvar t = (Date.now() - start) / duration,\n\t\t\t s = easeOut(t) * S;\n\n\t\t\tif (t <= 1) {\n\t\t\t\tthis._flyToFrame = L.Util.requestAnimFrame(frame, this);\n\n\t\t\t\tthis._move(\n\t\t\t\t\tthis.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom),\n\t\t\t\t\tthis.getScaleZoom(w0 / w(s), startZoom),\n\t\t\t\t\t{flyTo: true});\n\n\t\t\t} else {\n\t\t\t\tthis\n\t\t\t\t\t._move(targetCenter, targetZoom)\n\t\t\t\t\t._moveEnd(true);\n\t\t\t}\n\t\t}\n\n\t\tthis._moveStart(true);\n\n\t\tframe.call(this);\n\t\treturn this;\n\t},\n\n\t// @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this\n\t// Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto),\n\t// but takes a bounds parameter like [`fitBounds`](#map-fitbounds).\n\tflyToBounds: function (bounds, options) {\n\t\tvar target = this._getBoundsCenterZoom(bounds, options);\n\t\treturn this.flyTo(target.center, target.zoom, options);\n\t}\n});\n\n/*\r\n * Extends the event handling code with double tap support for mobile browsers.\r\n */\r\n\r\nL.extend(L.DomEvent, {\r\n\r\n\t_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',\r\n\t_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',\r\n\r\n\t// inspired by Zepto touch code by Thomas Fuchs\r\n\taddDoubleTapListener: function (obj, handler, id) {\r\n\t\tvar last, touch,\r\n\t\t doubleTap = false,\r\n\t\t delay = 250;\r\n\r\n\t\tfunction onTouchStart(e) {\r\n\t\t\tvar count;\r\n\r\n\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\tcount = L.DomEvent._pointersCount;\r\n\t\t\t} else {\r\n\t\t\t\tcount = e.touches.length;\r\n\t\t\t}\r\n\r\n\t\t\tif (count > 1) { return; }\r\n\r\n\t\t\tvar now = Date.now(),\r\n\t\t\t delta = now - (last || now);\r\n\r\n\t\t\ttouch = e.touches ? e.touches[0] : e;\r\n\t\t\tdoubleTap = (delta > 0 && delta <= delay);\r\n\t\t\tlast = now;\r\n\t\t}\r\n\r\n\t\tfunction onTouchEnd() {\r\n\t\t\tif (doubleTap && !touch.cancelBubble) {\r\n\t\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\t\t// work around .type being readonly with MSPointer* events\r\n\t\t\t\t\tvar newTouch = {},\r\n\t\t\t\t\t prop, i;\r\n\r\n\t\t\t\t\tfor (i in touch) {\r\n\t\t\t\t\t\tprop = touch[i];\r\n\t\t\t\t\t\tnewTouch[i] = prop && prop.bind ? prop.bind(touch) : prop;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttouch = newTouch;\r\n\t\t\t\t}\r\n\t\t\t\ttouch.type = 'dblclick';\r\n\t\t\t\thandler(touch);\r\n\t\t\t\tlast = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar pre = '_leaflet_',\r\n\t\t touchstart = this._touchstart,\r\n\t\t touchend = this._touchend;\r\n\r\n\t\tobj[pre + touchstart + id] = onTouchStart;\r\n\t\tobj[pre + touchend + id] = onTouchEnd;\r\n\t\tobj[pre + 'dblclick' + id] = handler;\r\n\r\n\t\tobj.addEventListener(touchstart, onTouchStart, false);\r\n\t\tobj.addEventListener(touchend, onTouchEnd, false);\r\n\r\n\t\t// On some platforms (notably, chrome on win10 + touchscreen + mouse),\r\n\t\t// the browser doesn't fire touchend/pointerup events but does fire\r\n\t\t// native dblclicks. See #4127.\r\n\t\tif (!L.Browser.edge) {\r\n\t\t\tobj.addEventListener('dblclick', handler, false);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveDoubleTapListener: function (obj, id) {\r\n\t\tvar pre = '_leaflet_',\r\n\t\t touchstart = obj[pre + this._touchstart + id],\r\n\t\t touchend = obj[pre + this._touchend + id],\r\n\t\t dblclick = obj[pre + 'dblclick' + id];\r\n\r\n\t\tobj.removeEventListener(this._touchstart, touchstart, false);\r\n\t\tobj.removeEventListener(this._touchend, touchend, false);\r\n\t\tif (!L.Browser.edge) {\r\n\t\t\tobj.removeEventListener('dblclick', dblclick, false);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n/*\n * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.\n */\n\nL.extend(L.DomEvent, {\n\n\tPOINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown',\n\tPOINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove',\n\tPOINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup',\n\tPOINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',\n\tTAG_WHITE_LIST: ['INPUT', 'SELECT', 'OPTION'],\n\n\t_pointers: {},\n\t_pointersCount: 0,\n\n\t// Provides a touch events wrapper for (ms)pointer events.\n\t// ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890\n\n\taddPointerListener: function (obj, type, handler, id) {\n\n\t\tif (type === 'touchstart') {\n\t\t\tthis._addPointerStart(obj, handler, id);\n\n\t\t} else if (type === 'touchmove') {\n\t\t\tthis._addPointerMove(obj, handler, id);\n\n\t\t} else if (type === 'touchend') {\n\t\t\tthis._addPointerEnd(obj, handler, id);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremovePointerListener: function (obj, type, id) {\n\t\tvar handler = obj['_leaflet_' + type + id];\n\n\t\tif (type === 'touchstart') {\n\t\t\tobj.removeEventListener(this.POINTER_DOWN, handler, false);\n\n\t\t} else if (type === 'touchmove') {\n\t\t\tobj.removeEventListener(this.POINTER_MOVE, handler, false);\n\n\t\t} else if (type === 'touchend') {\n\t\t\tobj.removeEventListener(this.POINTER_UP, handler, false);\n\t\t\tobj.removeEventListener(this.POINTER_CANCEL, handler, false);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_addPointerStart: function (obj, handler, id) {\n\t\tvar onDown = L.bind(function (e) {\n\t\t\tif (e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {\n\t\t\t\t// In IE11, some touch events needs to fire for form controls, or\n\t\t\t\t// the controls will stop working. We keep a whitelist of tag names that\n\t\t\t\t// need these events. For other target tags, we prevent default on the event.\n\t\t\t\tif (this.TAG_WHITE_LIST.indexOf(e.target.tagName) < 0) {\n\t\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._handlePointer(e, handler);\n\t\t}, this);\n\n\t\tobj['_leaflet_touchstart' + id] = onDown;\n\t\tobj.addEventListener(this.POINTER_DOWN, onDown, false);\n\n\t\t// need to keep track of what pointers and how many are active to provide e.touches emulation\n\t\tif (!this._pointerDocListener) {\n\t\t\tvar pointerUp = L.bind(this._globalPointerUp, this);\n\n\t\t\t// we listen documentElement as any drags that end by moving the touch off the screen get fired there\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_DOWN, L.bind(this._globalPointerDown, this), true);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_MOVE, L.bind(this._globalPointerMove, this), true);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_UP, pointerUp, true);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_CANCEL, pointerUp, true);\n\n\t\t\tthis._pointerDocListener = true;\n\t\t}\n\t},\n\n\t_globalPointerDown: function (e) {\n\t\tthis._pointers[e.pointerId] = e;\n\t\tthis._pointersCount++;\n\t},\n\n\t_globalPointerMove: function (e) {\n\t\tif (this._pointers[e.pointerId]) {\n\t\t\tthis._pointers[e.pointerId] = e;\n\t\t}\n\t},\n\n\t_globalPointerUp: function (e) {\n\t\tdelete this._pointers[e.pointerId];\n\t\tthis._pointersCount--;\n\t},\n\n\t_handlePointer: function (e, handler) {\n\t\te.touches = [];\n\t\tfor (var i in this._pointers) {\n\t\t\te.touches.push(this._pointers[i]);\n\t\t}\n\t\te.changedTouches = [e];\n\n\t\thandler(e);\n\t},\n\n\t_addPointerMove: function (obj, handler, id) {\n\t\tvar onMove = L.bind(function (e) {\n\t\t\t// don't fire touch moves when mouse isn't down\n\t\t\tif ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }\n\n\t\t\tthis._handlePointer(e, handler);\n\t\t}, this);\n\n\t\tobj['_leaflet_touchmove' + id] = onMove;\n\t\tobj.addEventListener(this.POINTER_MOVE, onMove, false);\n\t},\n\n\t_addPointerEnd: function (obj, handler, id) {\n\t\tvar onUp = L.bind(function (e) {\n\t\t\tthis._handlePointer(e, handler);\n\t\t}, this);\n\n\t\tobj['_leaflet_touchend' + id] = onUp;\n\t\tobj.addEventListener(this.POINTER_UP, onUp, false);\n\t\tobj.addEventListener(this.POINTER_CANCEL, onUp, false);\n\t}\n});\n\n/*\n * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @section Touch interaction options\n\t// @option touchZoom: Boolean|String = *\n\t// Whether the map can be zoomed by touch-dragging with two fingers. If\n\t// passed `'center'`, it will zoom to the center of the view regardless of\n\t// where the touch events (fingers) were. Enabled for touch-capable web\n\t// browsers except for old Androids.\n\ttouchZoom: L.Browser.touch && !L.Browser.android23,\n\n\t// @option bounceAtZoomLimits: Boolean = true\n\t// Set it to false if you don't want the map to zoom beyond min/max zoom\n\t// and then bounce back when pinch-zooming.\n\tbounceAtZoomLimits: true\n});\n\nL.Map.TouchZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomUtil.addClass(this._map._container, 'leaflet-touch-zoom');\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomUtil.removeClass(this._map._container, 'leaflet-touch-zoom');\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\t_onTouchStart: function (e) {\n\t\tvar map = this._map;\n\t\tif (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToContainerPoint(e.touches[0]),\n\t\t p2 = map.mouseEventToContainerPoint(e.touches[1]);\n\n\t\tthis._centerPoint = map.getSize()._divideBy(2);\n\t\tthis._startLatLng = map.containerPointToLatLng(this._centerPoint);\n\t\tif (map.options.touchZoom !== 'center') {\n\t\t\tthis._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2));\n\t\t}\n\n\t\tthis._startDist = p1.distanceTo(p2);\n\t\tthis._startZoom = map.getZoom();\n\n\t\tthis._moved = false;\n\t\tthis._zooming = true;\n\n\t\tmap._stop();\n\n\t\tL.DomEvent\n\t\t .on(document, 'touchmove', this._onTouchMove, this)\n\t\t .on(document, 'touchend', this._onTouchEnd, this);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_onTouchMove: function (e) {\n\t\tif (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }\n\n\t\tvar map = this._map,\n\t\t p1 = map.mouseEventToContainerPoint(e.touches[0]),\n\t\t p2 = map.mouseEventToContainerPoint(e.touches[1]),\n\t\t scale = p1.distanceTo(p2) / this._startDist;\n\n\n\t\tthis._zoom = map.getScaleZoom(scale, this._startZoom);\n\n\t\tif (!map.options.bounceAtZoomLimits && (\n\t\t\t(this._zoom < map.getMinZoom() && scale < 1) ||\n\t\t\t(this._zoom > map.getMaxZoom() && scale > 1))) {\n\t\t\tthis._zoom = map._limitZoom(this._zoom);\n\t\t}\n\n\t\tif (map.options.touchZoom === 'center') {\n\t\t\tthis._center = this._startLatLng;\n\t\t\tif (scale === 1) { return; }\n\t\t} else {\n\t\t\t// Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng\n\t\t\tvar delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint);\n\t\t\tif (scale === 1 && delta.x === 0 && delta.y === 0) { return; }\n\t\t\tthis._center = map.unproject(map.project(this._pinchStartLatLng, this._zoom).subtract(delta), this._zoom);\n\t\t}\n\n\t\tif (!this._moved) {\n\t\t\tmap._moveStart(true);\n\t\t\tthis._moved = true;\n\t\t}\n\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\tvar moveFn = L.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false});\n\t\tthis._animRequest = L.Util.requestAnimFrame(moveFn, this, true);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_onTouchEnd: function () {\n\t\tif (!this._moved || !this._zooming) {\n\t\t\tthis._zooming = false;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._zooming = false;\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\tL.DomEvent\n\t\t .off(document, 'touchmove', this._onTouchMove)\n\t\t .off(document, 'touchend', this._onTouchEnd);\n\n\t\t// Pinch updates GridLayers' levels only when zoomSnap is off, so zoomSnap becomes noUpdate.\n\t\tif (this._map.options.zoomAnimation) {\n\t\t\tthis._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.zoomSnap);\n\t\t} else {\n\t\t\tthis._map._resetView(this._center, this._map._limitZoom(this._zoom));\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property touchZoom: Handler\n// Touch zoom handler.\nL.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);\n\n/*\n * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @section Touch interaction options\n\t// @option tap: Boolean = true\n\t// Enables mobile hacks for supporting instant taps (fixing 200ms click\n\t// delay on iOS/Android) and touch holds (fired as `contextmenu` events).\n\ttap: true,\n\n\t// @option tapTolerance: Number = 15\n\t// The max number of pixels a user can shift his finger during touch\n\t// for it to be considered a valid tap.\n\ttapTolerance: 15\n});\n\nL.Map.Tap = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\t_onDown: function (e) {\n\t\tif (!e.touches) { return; }\n\n\t\tL.DomEvent.preventDefault(e);\n\n\t\tthis._fireClick = true;\n\n\t\t// don't simulate click or track longpress if more than 1 touch\n\t\tif (e.touches.length > 1) {\n\t\t\tthis._fireClick = false;\n\t\t\tclearTimeout(this._holdTimeout);\n\t\t\treturn;\n\t\t}\n\n\t\tvar first = e.touches[0],\n\t\t el = first.target;\n\n\t\tthis._startPos = this._newPos = new L.Point(first.clientX, first.clientY);\n\n\t\t// if touching a link, highlight it\n\t\tif (el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\tL.DomUtil.addClass(el, 'leaflet-active');\n\t\t}\n\n\t\t// simulate long hold but setting a timeout\n\t\tthis._holdTimeout = setTimeout(L.bind(function () {\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._fireClick = false;\n\t\t\t\tthis._onUp();\n\t\t\t\tthis._simulateEvent('contextmenu', first);\n\t\t\t}\n\t\t}, this), 1000);\n\n\t\tthis._simulateEvent('mousedown', first);\n\n\t\tL.DomEvent.on(document, {\n\t\t\ttouchmove: this._onMove,\n\t\t\ttouchend: this._onUp\n\t\t}, this);\n\t},\n\n\t_onUp: function (e) {\n\t\tclearTimeout(this._holdTimeout);\n\n\t\tL.DomEvent.off(document, {\n\t\t\ttouchmove: this._onMove,\n\t\t\ttouchend: this._onUp\n\t\t}, this);\n\n\t\tif (this._fireClick && e && e.changedTouches) {\n\n\t\t\tvar first = e.changedTouches[0],\n\t\t\t el = first.target;\n\n\t\t\tif (el && el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\t\tL.DomUtil.removeClass(el, 'leaflet-active');\n\t\t\t}\n\n\t\t\tthis._simulateEvent('mouseup', first);\n\n\t\t\t// simulate click if the touch didn't move too much\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._simulateEvent('click', first);\n\t\t\t}\n\t\t}\n\t},\n\n\t_isTapValid: function () {\n\t\treturn this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;\n\t},\n\n\t_onMove: function (e) {\n\t\tvar first = e.touches[0];\n\t\tthis._newPos = new L.Point(first.clientX, first.clientY);\n\t\tthis._simulateEvent('mousemove', first);\n\t},\n\n\t_simulateEvent: function (type, e) {\n\t\tvar simulatedEvent = document.createEvent('MouseEvents');\n\n\t\tsimulatedEvent._simulated = true;\n\t\te.target._simulatedClick = true;\n\n\t\tsimulatedEvent.initMouseEvent(\n\t\t type, true, true, window, 1,\n\t\t e.screenX, e.screenY,\n\t\t e.clientX, e.clientY,\n\t\t false, false, false, false, 0, null);\n\n\t\te.target.dispatchEvent(simulatedEvent);\n\t}\n});\n\n// @section Handlers\n// @property tap: Handler\n// Mobile touch hacks (quick tap and touch hold) handler.\nif (L.Browser.touch && !L.Browser.pointer) {\n\tL.Map.addInitHook('addHandler', 'tap', L.Map.Tap);\n}\n\n/*\n * L.Handler.BoxZoom is used to add shift-drag zoom interaction to the map\n * (zoom to a selected bounding box), enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @option boxZoom: Boolean = true\n\t// Whether the map can be zoomed to a rectangular area specified by\n\t// dragging the mouse while pressing the shift key.\n\tboxZoom: true\n});\n\nL.Map.BoxZoom = L.Handler.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t\tthis._container = map._container;\n\t\tthis._pane = map._panes.overlayPane;\n\t},\n\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tmoved: function () {\n\t\treturn this._moved;\n\t},\n\n\t_resetState: function () {\n\t\tthis._moved = false;\n\t},\n\n\t_onMouseDown: function (e) {\n\t\tif (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n\t\tthis._resetState();\n\n\t\tL.DomUtil.disableTextSelection();\n\t\tL.DomUtil.disableImageDrag();\n\n\t\tthis._startPoint = this._map.mouseEventToContainerPoint(e);\n\n\t\tL.DomEvent.on(document, {\n\t\t\tcontextmenu: L.DomEvent.stop,\n\t\t\tmousemove: this._onMouseMove,\n\t\t\tmouseup: this._onMouseUp,\n\t\t\tkeydown: this._onKeyDown\n\t\t}, this);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._moved) {\n\t\t\tthis._moved = true;\n\n\t\t\tthis._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container);\n\t\t\tL.DomUtil.addClass(this._container, 'leaflet-crosshair');\n\n\t\t\tthis._map.fire('boxzoomstart');\n\t\t}\n\n\t\tthis._point = this._map.mouseEventToContainerPoint(e);\n\n\t\tvar bounds = new L.Bounds(this._point, this._startPoint),\n\t\t size = bounds.getSize();\n\n\t\tL.DomUtil.setPosition(this._box, bounds.min);\n\n\t\tthis._box.style.width = size.x + 'px';\n\t\tthis._box.style.height = size.y + 'px';\n\t},\n\n\t_finish: function () {\n\t\tif (this._moved) {\n\t\t\tL.DomUtil.remove(this._box);\n\t\t\tL.DomUtil.removeClass(this._container, 'leaflet-crosshair');\n\t\t}\n\n\t\tL.DomUtil.enableTextSelection();\n\t\tL.DomUtil.enableImageDrag();\n\n\t\tL.DomEvent.off(document, {\n\t\t\tcontextmenu: L.DomEvent.stop,\n\t\t\tmousemove: this._onMouseMove,\n\t\t\tmouseup: this._onMouseUp,\n\t\t\tkeydown: this._onKeyDown\n\t\t}, this);\n\t},\n\n\t_onMouseUp: function (e) {\n\t\tif ((e.which !== 1) && (e.button !== 1)) { return; }\n\n\t\tthis._finish();\n\n\t\tif (!this._moved) { return; }\n\t\t// Postpone to next JS tick so internal click event handling\n\t\t// still see it as \"moved\".\n\t\tsetTimeout(L.bind(this._resetState, this), 0);\n\n\t\tvar bounds = new L.LatLngBounds(\n\t\t this._map.containerPointToLatLng(this._startPoint),\n\t\t this._map.containerPointToLatLng(this._point));\n\n\t\tthis._map\n\t\t\t.fitBounds(bounds)\n\t\t\t.fire('boxzoomend', {boxZoomBounds: bounds});\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.keyCode === 27) {\n\t\t\tthis._finish();\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property boxZoom: Handler\n// Box (shift-drag with mouse) zoom handler.\nL.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);\n\n/*\n * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.\n */\n\n// @namespace Map\n// @section Keyboard Navigation Options\nL.Map.mergeOptions({\n\t// @option keyboard: Boolean = true\n\t// Makes the map focusable and allows users to navigate the map with keyboard\n\t// arrows and `+`/`-` keys.\n\tkeyboard: true,\n\n\t// @option keyboardPanDelta: Number = 80\n\t// Amount of pixels to pan when pressing an arrow key.\n\tkeyboardPanDelta: 80\n});\n\nL.Map.Keyboard = L.Handler.extend({\n\n\tkeyCodes: {\n\t\tleft: [37],\n\t\tright: [39],\n\t\tdown: [40],\n\t\tup: [38],\n\t\tzoomIn: [187, 107, 61, 171],\n\t\tzoomOut: [189, 109, 54, 173]\n\t},\n\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\n\t\tthis._setPanDelta(map.options.keyboardPanDelta);\n\t\tthis._setZoomDelta(map.options.zoomDelta);\n\t},\n\n\taddHooks: function () {\n\t\tvar container = this._map._container;\n\n\t\t// make the container focusable by tabbing\n\t\tif (container.tabIndex <= 0) {\n\t\t\tcontainer.tabIndex = '0';\n\t\t}\n\n\t\tL.DomEvent.on(container, {\n\t\t\tfocus: this._onFocus,\n\t\t\tblur: this._onBlur,\n\t\t\tmousedown: this._onMouseDown\n\t\t}, this);\n\n\t\tthis._map.on({\n\t\t\tfocus: this._addHooks,\n\t\t\tblur: this._removeHooks\n\t\t}, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._removeHooks();\n\n\t\tL.DomEvent.off(this._map._container, {\n\t\t\tfocus: this._onFocus,\n\t\t\tblur: this._onBlur,\n\t\t\tmousedown: this._onMouseDown\n\t\t}, this);\n\n\t\tthis._map.off({\n\t\t\tfocus: this._addHooks,\n\t\t\tblur: this._removeHooks\n\t\t}, this);\n\t},\n\n\t_onMouseDown: function () {\n\t\tif (this._focused) { return; }\n\n\t\tvar body = document.body,\n\t\t docEl = document.documentElement,\n\t\t top = body.scrollTop || docEl.scrollTop,\n\t\t left = body.scrollLeft || docEl.scrollLeft;\n\n\t\tthis._map._container.focus();\n\n\t\twindow.scrollTo(left, top);\n\t},\n\n\t_onFocus: function () {\n\t\tthis._focused = true;\n\t\tthis._map.fire('focus');\n\t},\n\n\t_onBlur: function () {\n\t\tthis._focused = false;\n\t\tthis._map.fire('blur');\n\t},\n\n\t_setPanDelta: function (panDelta) {\n\t\tvar keys = this._panKeys = {},\n\t\t codes = this.keyCodes,\n\t\t i, len;\n\n\t\tfor (i = 0, len = codes.left.length; i < len; i++) {\n\t\t\tkeys[codes.left[i]] = [-1 * panDelta, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.right.length; i < len; i++) {\n\t\t\tkeys[codes.right[i]] = [panDelta, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.down.length; i < len; i++) {\n\t\t\tkeys[codes.down[i]] = [0, panDelta];\n\t\t}\n\t\tfor (i = 0, len = codes.up.length; i < len; i++) {\n\t\t\tkeys[codes.up[i]] = [0, -1 * panDelta];\n\t\t}\n\t},\n\n\t_setZoomDelta: function (zoomDelta) {\n\t\tvar keys = this._zoomKeys = {},\n\t\t codes = this.keyCodes,\n\t\t i, len;\n\n\t\tfor (i = 0, len = codes.zoomIn.length; i < len; i++) {\n\t\t\tkeys[codes.zoomIn[i]] = zoomDelta;\n\t\t}\n\t\tfor (i = 0, len = codes.zoomOut.length; i < len; i++) {\n\t\t\tkeys[codes.zoomOut[i]] = -zoomDelta;\n\t\t}\n\t},\n\n\t_addHooks: function () {\n\t\tL.DomEvent.on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_removeHooks: function () {\n\t\tL.DomEvent.off(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.altKey || e.ctrlKey || e.metaKey) { return; }\n\n\t\tvar key = e.keyCode,\n\t\t map = this._map,\n\t\t offset;\n\n\t\tif (key in this._panKeys) {\n\n\t\t\tif (map._panAnim && map._panAnim._inProgress) { return; }\n\n\t\t\toffset = this._panKeys[key];\n\t\t\tif (e.shiftKey) {\n\t\t\t\toffset = L.point(offset).multiplyBy(3);\n\t\t\t}\n\n\t\t\tmap.panBy(offset);\n\n\t\t\tif (map.options.maxBounds) {\n\t\t\t\tmap.panInsideBounds(map.options.maxBounds);\n\t\t\t}\n\n\t\t} else if (key in this._zoomKeys) {\n\t\t\tmap.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]);\n\n\t\t} else if (key === 27) {\n\t\t\tmap.closePopup();\n\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tL.DomEvent.stop(e);\n\t}\n});\n\n// @section Handlers\n// @section Handlers\n// @property keyboard: Handler\n// Keyboard navigation handler.\nL.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);\n\n/*\n * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.\n */\n\n\n/* @namespace Marker\n * @section Interaction handlers\n *\n * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example:\n *\n * ```js\n * marker.dragging.disable();\n * ```\n *\n * @property dragging: Handler\n * Marker dragging handler (by both mouse and touch).\n */\n\nL.Handler.MarkerDrag = L.Handler.extend({\n\tinitialize: function (marker) {\n\t\tthis._marker = marker;\n\t},\n\n\taddHooks: function () {\n\t\tvar icon = this._marker._icon;\n\n\t\tif (!this._draggable) {\n\t\t\tthis._draggable = new L.Draggable(icon, icon, true);\n\t\t}\n\n\t\tthis._draggable.on({\n\t\t\tdragstart: this._onDragStart,\n\t\t\tdrag: this._onDrag,\n\t\t\tdragend: this._onDragEnd\n\t\t}, this).enable();\n\n\t\tL.DomUtil.addClass(icon, 'leaflet-marker-draggable');\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable.off({\n\t\t\tdragstart: this._onDragStart,\n\t\t\tdrag: this._onDrag,\n\t\t\tdragend: this._onDragEnd\n\t\t}, this).disable();\n\n\t\tif (this._marker._icon) {\n\t\t\tL.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');\n\t\t}\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\t// @section Dragging events\n\t\t// @event dragstart: Event\n\t\t// Fired when the user starts dragging the marker.\n\n\t\t// @event movestart: Event\n\t\t// Fired when the marker starts moving (because of dragging).\n\n\t\tthis._oldLatLng = this._marker.getLatLng();\n\t\tthis._marker\n\t\t .closePopup()\n\t\t .fire('movestart')\n\t\t .fire('dragstart');\n\t},\n\n\t_onDrag: function (e) {\n\t\tvar marker = this._marker,\n\t\t shadow = marker._shadow,\n\t\t iconPos = L.DomUtil.getPosition(marker._icon),\n\t\t latlng = marker._map.layerPointToLatLng(iconPos);\n\n\t\t// update shadow position\n\t\tif (shadow) {\n\t\t\tL.DomUtil.setPosition(shadow, iconPos);\n\t\t}\n\n\t\tmarker._latlng = latlng;\n\t\te.latlng = latlng;\n\t\te.oldLatLng = this._oldLatLng;\n\n\t\t// @event drag: Event\n\t\t// Fired repeatedly while the user drags the marker.\n\t\tmarker\n\t\t .fire('move', e)\n\t\t .fire('drag', e);\n\t},\n\n\t_onDragEnd: function (e) {\n\t\t// @event dragend: DragEndEvent\n\t\t// Fired when the user stops dragging the marker.\n\n\t\t// @event moveend: Event\n\t\t// Fired when the marker stops moving (because of dragging).\n\t\tdelete this._oldLatLng;\n\t\tthis._marker\n\t\t .fire('moveend')\n\t\t .fire('dragend', e);\n\t}\n});\n\n/*\r\n * @class Control\r\n * @aka L.Control\r\n *\r\n * L.Control is a base class for implementing map controls. Handles positioning.\r\n * All other controls extend from this class.\r\n */\r\n\r\nL.Control = L.Class.extend({\r\n\t// @section\r\n\t// @aka Control options\r\n\toptions: {\r\n\t\t// @option position: String = 'topright'\r\n\t\t// The position of the control (one of the map corners). Possible values are `'topleft'`,\r\n\t\t// `'topright'`, `'bottomleft'` or `'bottomright'`\r\n\t\tposition: 'topright'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\t/* @section\r\n\t * Classes extending L.Control will inherit the following methods:\r\n\t *\r\n\t * @method getPosition: string\r\n\t * Returns the position of the control.\r\n\t */\r\n\tgetPosition: function () {\r\n\t\treturn this.options.position;\r\n\t},\r\n\r\n\t// @method setPosition(position: string): this\r\n\t// Sets the position of the control.\r\n\tsetPosition: function (position) {\r\n\t\tvar map = this._map;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.removeControl(this);\r\n\t\t}\r\n\r\n\t\tthis.options.position = position;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.addControl(this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getContainer: HTMLElement\r\n\t// Returns the HTMLElement that contains the control.\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method addTo(map: Map): this\r\n\t// Adds the control to the given map.\r\n\taddTo: function (map) {\r\n\t\tthis.remove();\r\n\t\tthis._map = map;\r\n\r\n\t\tvar container = this._container = this.onAdd(map),\r\n\t\t pos = this.getPosition(),\r\n\t\t corner = map._controlCorners[pos];\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-control');\r\n\r\n\t\tif (pos.indexOf('bottom') !== -1) {\r\n\t\t\tcorner.insertBefore(container, corner.firstChild);\r\n\t\t} else {\r\n\t\t\tcorner.appendChild(container);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method remove: this\r\n\t// Removes the control from the map it is currently active on.\r\n\tremove: function () {\r\n\t\tif (!this._map) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tL.DomUtil.remove(this._container);\r\n\r\n\t\tif (this.onRemove) {\r\n\t\t\tthis.onRemove(this._map);\r\n\t\t}\r\n\r\n\t\tthis._map = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_refocusOnMap: function (e) {\r\n\t\t// if map exists and event is not a keyboard event\r\n\t\tif (this._map && e && e.screenX > 0 && e.screenY > 0) {\r\n\t\t\tthis._map.getContainer().focus();\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.control = function (options) {\r\n\treturn new L.Control(options);\r\n};\r\n\r\n/* @section Extension methods\r\n * @uninheritable\r\n *\r\n * Every control should extend from `L.Control` and (re-)implement the following methods.\r\n *\r\n * @method onAdd(map: Map): HTMLElement\r\n * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo).\r\n *\r\n * @method onRemove(map: Map)\r\n * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove).\r\n */\r\n\r\n/* @namespace Map\r\n * @section Methods for Layers and Controls\r\n */\r\nL.Map.include({\r\n\t// @method addControl(control: Control): this\r\n\t// Adds the given control to the map\r\n\taddControl: function (control) {\r\n\t\tcontrol.addTo(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeControl(control: Control): this\r\n\t// Removes the given control from the map\r\n\tremoveControl: function (control) {\r\n\t\tcontrol.remove();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initControlPos: function () {\r\n\t\tvar corners = this._controlCorners = {},\r\n\t\t l = 'leaflet-',\r\n\t\t container = this._controlContainer =\r\n\t\t L.DomUtil.create('div', l + 'control-container', this._container);\r\n\r\n\t\tfunction createCorner(vSide, hSide) {\r\n\t\t\tvar className = l + vSide + ' ' + l + hSide;\r\n\r\n\t\t\tcorners[vSide + hSide] = L.DomUtil.create('div', className, container);\r\n\t\t}\r\n\r\n\t\tcreateCorner('top', 'left');\r\n\t\tcreateCorner('top', 'right');\r\n\t\tcreateCorner('bottom', 'left');\r\n\t\tcreateCorner('bottom', 'right');\r\n\t},\r\n\r\n\t_clearControlPos: function () {\r\n\t\tL.DomUtil.remove(this._controlContainer);\r\n\t}\r\n});\r\n\n/*\r\n * @class Control.Zoom\r\n * @aka L.Control.Zoom\r\n * @inherits Control\r\n *\r\n * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`.\r\n */\r\n\r\nL.Control.Zoom = L.Control.extend({\r\n\t// @section\r\n\t// @aka Control.Zoom options\r\n\toptions: {\r\n\t\tposition: 'topleft',\r\n\r\n\t\t// @option zoomInText: String = '+'\r\n\t\t// The text set on the 'zoom in' button.\r\n\t\tzoomInText: '+',\r\n\r\n\t\t// @option zoomInTitle: String = 'Zoom in'\r\n\t\t// The title set on the 'zoom in' button.\r\n\t\tzoomInTitle: 'Zoom in',\r\n\r\n\t\t// @option zoomOutText: String = '-'\r\n\t\t// The text set on the 'zoom out' button.\r\n\t\tzoomOutText: '-',\r\n\r\n\t\t// @option zoomOutTitle: String = 'Zoom out'\r\n\t\t// The title set on the 'zoom out' button.\r\n\t\tzoomOutTitle: 'Zoom out'\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tvar zoomName = 'leaflet-control-zoom',\r\n\t\t container = L.DomUtil.create('div', zoomName + ' leaflet-bar'),\r\n\t\t options = this.options;\r\n\r\n\t\tthis._zoomInButton = this._createButton(options.zoomInText, options.zoomInTitle,\r\n\t\t zoomName + '-in', container, this._zoomIn);\r\n\t\tthis._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle,\r\n\t\t zoomName + '-out', container, this._zoomOut);\r\n\r\n\t\tthis._updateDisabled();\r\n\t\tmap.on('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.off('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\t},\r\n\r\n\tdisable: function () {\r\n\t\tthis._disabled = true;\r\n\t\tthis._updateDisabled();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tenable: function () {\r\n\t\tthis._disabled = false;\r\n\t\tthis._updateDisabled();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_zoomIn: function (e) {\r\n\t\tif (!this._disabled && this._map._zoom < this._map.getMaxZoom()) {\r\n\t\t\tthis._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));\r\n\t\t}\r\n\t},\r\n\r\n\t_zoomOut: function (e) {\r\n\t\tif (!this._disabled && this._map._zoom > this._map.getMinZoom()) {\r\n\t\t\tthis._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));\r\n\t\t}\r\n\t},\r\n\r\n\t_createButton: function (html, title, className, container, fn) {\r\n\t\tvar link = L.DomUtil.create('a', className, container);\r\n\t\tlink.innerHTML = html;\r\n\t\tlink.href = '#';\r\n\t\tlink.title = title;\r\n\r\n\t\tL.DomEvent\r\n\t\t .on(link, 'mousedown dblclick', L.DomEvent.stopPropagation)\r\n\t\t .on(link, 'click', L.DomEvent.stop)\r\n\t\t .on(link, 'click', fn, this)\r\n\t\t .on(link, 'click', this._refocusOnMap, this);\r\n\r\n\t\treturn link;\r\n\t},\r\n\r\n\t_updateDisabled: function () {\r\n\t\tvar map = this._map,\r\n\t\t className = 'leaflet-disabled';\r\n\r\n\t\tL.DomUtil.removeClass(this._zoomInButton, className);\r\n\t\tL.DomUtil.removeClass(this._zoomOutButton, className);\r\n\r\n\t\tif (this._disabled || map._zoom === map.getMinZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomOutButton, className);\r\n\t\t}\r\n\t\tif (this._disabled || map._zoom === map.getMaxZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomInButton, className);\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// @namespace Map\r\n// @section Control options\r\n// @option zoomControl: Boolean = true\r\n// Whether a [zoom control](#control-zoom) is added to the map by default.\r\nL.Map.mergeOptions({\r\n\tzoomControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.zoomControl) {\r\n\t\tthis.zoomControl = new L.Control.Zoom();\r\n\t\tthis.addControl(this.zoomControl);\r\n\t}\r\n});\r\n\r\n// @namespace Control.Zoom\r\n// @factory L.control.zoom(options: Control.Zoom options)\r\n// Creates a zoom control\r\nL.control.zoom = function (options) {\r\n\treturn new L.Control.Zoom(options);\r\n};\r\n\n/*\r\n * @class Control.Attribution\r\n * @aka L.Control.Attribution\r\n * @inherits Control\r\n *\r\n * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control.\r\n */\r\n\r\nL.Control.Attribution = L.Control.extend({\r\n\t// @section\r\n\t// @aka Control.Attribution options\r\n\toptions: {\r\n\t\tposition: 'bottomright',\r\n\r\n\t\t// @option prefix: String = 'Leaflet'\r\n\t\t// The HTML text shown before the attributions. Pass `false` to disable.\r\n\t\tprefix: '<a href=\"http://leafletjs.com\" title=\"A JS library for interactive maps\">Leaflet</a>'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._attributions = {};\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tmap.attributionControl = this;\r\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-control-attribution');\r\n\t\tif (L.DomEvent) {\r\n\t\t\tL.DomEvent.disableClickPropagation(this._container);\r\n\t\t}\r\n\r\n\t\t// TODO ugly, refactor\r\n\t\tfor (var i in map._layers) {\r\n\t\t\tif (map._layers[i].getAttribution) {\r\n\t\t\t\tthis.addAttribution(map._layers[i].getAttribution());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method setPrefix(prefix: String): this\r\n\t// Sets the text before the attributions.\r\n\tsetPrefix: function (prefix) {\r\n\t\tthis.options.prefix = prefix;\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method addAttribution(text: String): this\r\n\t// Adds an attribution text (e.g. `'Vector data © Mapbox'`).\r\n\taddAttribution: function (text) {\r\n\t\tif (!text) { return this; }\r\n\r\n\t\tif (!this._attributions[text]) {\r\n\t\t\tthis._attributions[text] = 0;\r\n\t\t}\r\n\t\tthis._attributions[text]++;\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeAttribution(text: String): this\r\n\t// Removes an attribution text.\r\n\tremoveAttribution: function (text) {\r\n\t\tif (!text) { return this; }\r\n\r\n\t\tif (this._attributions[text]) {\r\n\t\t\tthis._attributions[text]--;\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar attribs = [];\r\n\r\n\t\tfor (var i in this._attributions) {\r\n\t\t\tif (this._attributions[i]) {\r\n\t\t\t\tattribs.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar prefixAndAttribs = [];\r\n\r\n\t\tif (this.options.prefix) {\r\n\t\t\tprefixAndAttribs.push(this.options.prefix);\r\n\t\t}\r\n\t\tif (attribs.length) {\r\n\t\t\tprefixAndAttribs.push(attribs.join(', '));\r\n\t\t}\r\n\r\n\t\tthis._container.innerHTML = prefixAndAttribs.join(' | ');\r\n\t}\r\n});\r\n\r\n// @namespace Map\r\n// @section Control options\r\n// @option attributionControl: Boolean = true\r\n// Whether a [attribution control](#control-attribution) is added to the map by default.\r\nL.Map.mergeOptions({\r\n\tattributionControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.attributionControl) {\r\n\t\tnew L.Control.Attribution().addTo(this);\r\n\t}\r\n});\r\n\r\n// @namespace Control.Attribution\r\n// @factory L.control.attribution(options: Control.Attribution options)\r\n// Creates an attribution control.\r\nL.control.attribution = function (options) {\r\n\treturn new L.Control.Attribution(options);\r\n};\r\n\n/*\n * @class Control.Scale\n * @aka L.Control.Scale\n * @inherits Control\n *\n * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`.\n *\n * @example\n *\n * ```js\n * L.control.scale().addTo(map);\n * ```\n */\n\nL.Control.Scale = L.Control.extend({\n\t// @section\n\t// @aka Control.Scale options\n\toptions: {\n\t\tposition: 'bottomleft',\n\n\t\t// @option maxWidth: Number = 100\n\t\t// Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).\n\t\tmaxWidth: 100,\n\n\t\t// @option metric: Boolean = True\n\t\t// Whether to show the metric scale line (m/km).\n\t\tmetric: true,\n\n\t\t// @option imperial: Boolean = True\n\t\t// Whether to show the imperial scale line (mi/ft).\n\t\timperial: true\n\n\t\t// @option updateWhenIdle: Boolean = false\n\t\t// If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)).\n\t},\n\n\tonAdd: function (map) {\n\t\tvar className = 'leaflet-control-scale',\n\t\t container = L.DomUtil.create('div', className),\n\t\t options = this.options;\n\n\t\tthis._addScales(options, className + '-line', container);\n\n\t\tmap.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t\tmap.whenReady(this._update, this);\n\n\t\treturn container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t},\n\n\t_addScales: function (options, className, container) {\n\t\tif (options.metric) {\n\t\t\tthis._mScale = L.DomUtil.create('div', className, container);\n\t\t}\n\t\tif (options.imperial) {\n\t\t\tthis._iScale = L.DomUtil.create('div', className, container);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tvar map = this._map,\n\t\t y = map.getSize().y / 2;\n\n\t\tvar maxMeters = map.distance(\n\t\t\t\tmap.containerPointToLatLng([0, y]),\n\t\t\t\tmap.containerPointToLatLng([this.options.maxWidth, y]));\n\n\t\tthis._updateScales(maxMeters);\n\t},\n\n\t_updateScales: function (maxMeters) {\n\t\tif (this.options.metric && maxMeters) {\n\t\t\tthis._updateMetric(maxMeters);\n\t\t}\n\t\tif (this.options.imperial && maxMeters) {\n\t\t\tthis._updateImperial(maxMeters);\n\t\t}\n\t},\n\n\t_updateMetric: function (maxMeters) {\n\t\tvar meters = this._getRoundNum(maxMeters),\n\t\t label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\n\t\tthis._updateScale(this._mScale, label, meters / maxMeters);\n\t},\n\n\t_updateImperial: function (maxMeters) {\n\t\tvar maxFeet = maxMeters * 3.2808399,\n\t\t maxMiles, miles, feet;\n\n\t\tif (maxFeet > 5280) {\n\t\t\tmaxMiles = maxFeet / 5280;\n\t\t\tmiles = this._getRoundNum(maxMiles);\n\t\t\tthis._updateScale(this._iScale, miles + ' mi', miles / maxMiles);\n\n\t\t} else {\n\t\t\tfeet = this._getRoundNum(maxFeet);\n\t\t\tthis._updateScale(this._iScale, feet + ' ft', feet / maxFeet);\n\t\t}\n\t},\n\n\t_updateScale: function (scale, text, ratio) {\n\t\tscale.style.width = Math.round(this.options.maxWidth * ratio) + 'px';\n\t\tscale.innerHTML = text;\n\t},\n\n\t_getRoundNum: function (num) {\n\t\tvar pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n\t\t d = num / pow10;\n\n\t\td = d >= 10 ? 10 :\n\t\t d >= 5 ? 5 :\n\t\t d >= 3 ? 3 :\n\t\t d >= 2 ? 2 : 1;\n\n\t\treturn pow10 * d;\n\t}\n});\n\n\n// @factory L.control.scale(options?: Control.Scale options)\n// Creates an scale control with the given options.\nL.control.scale = function (options) {\n\treturn new L.Control.Scale(options);\n};\n\n/*\r\n * @class Control.Layers\r\n * @aka L.Control.Layers\r\n * @inherits Control\r\n *\r\n * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](http://leafletjs.com/examples/layers-control.html)). Extends `Control`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var baseLayers = {\r\n * \t\"Mapbox\": mapbox,\r\n * \t\"OpenStreetMap\": osm\r\n * };\r\n *\r\n * var overlays = {\r\n * \t\"Marker\": marker,\r\n * \t\"Roads\": roadsLayer\r\n * };\r\n *\r\n * L.control.layers(baseLayers, overlays).addTo(map);\r\n * ```\r\n *\r\n * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values:\r\n *\r\n * ```js\r\n * {\r\n * \"<someName1>\": layer1,\r\n * \"<someName2>\": layer2\r\n * }\r\n * ```\r\n *\r\n * The layer names can contain HTML, which allows you to add additional styling to the items:\r\n *\r\n * ```js\r\n * {\"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>\": myLayer}\r\n * ```\r\n */\r\n\r\n\r\nL.Control.Layers = L.Control.extend({\r\n\t// @section\r\n\t// @aka Control.Layers options\r\n\toptions: {\r\n\t\t// @option collapsed: Boolean = true\r\n\t\t// If `true`, the control will be collapsed into an icon and expanded on mouse hover or touch.\r\n\t\tcollapsed: true,\r\n\t\tposition: 'topright',\r\n\r\n\t\t// @option autoZIndex: Boolean = true\r\n\t\t// If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.\r\n\t\tautoZIndex: true,\r\n\r\n\t\t// @option hideSingleBase: Boolean = false\r\n\t\t// If `true`, the base layers in the control will be hidden when there is only one.\r\n\t\thideSingleBase: false\r\n\t},\r\n\r\n\tinitialize: function (baseLayers, overlays, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = [];\r\n\t\tthis._lastZIndex = 0;\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tfor (var i in baseLayers) {\r\n\t\t\tthis._addLayer(baseLayers[i], i);\r\n\t\t}\r\n\r\n\t\tfor (i in overlays) {\r\n\t\t\tthis._addLayer(overlays[i], i, true);\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._initLayout();\r\n\t\tthis._update();\r\n\r\n\t\tthis._map = map;\r\n\t\tmap.on('zoomend', this._checkDisabledLayers, this);\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function () {\r\n\t\tthis._map.off('zoomend', this._checkDisabledLayers, this);\r\n\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\t\t\tthis._layers[i].layer.off('add remove', this._onLayerChange, this);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addBaseLayer(layer: Layer, name: String): this\r\n\t// Adds a base layer (radio button entry) with the given name to the control.\r\n\taddBaseLayer: function (layer, name) {\r\n\t\tthis._addLayer(layer, name);\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method addOverlay(layer: Layer, name: String): this\r\n\t// Adds an overlay (checkbox entry) with the given name to the control.\r\n\taddOverlay: function (layer, name) {\r\n\t\tthis._addLayer(layer, name, true);\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method removeLayer(layer: Layer): this\r\n\t// Remove the given layer from the control.\r\n\tremoveLayer: function (layer) {\r\n\t\tlayer.off('add remove', this._onLayerChange, this);\r\n\r\n\t\tvar obj = this._getLayer(L.stamp(layer));\r\n\t\tif (obj) {\r\n\t\t\tthis._layers.splice(this._layers.indexOf(obj), 1);\r\n\t\t}\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method expand(): this\r\n\t// Expand the control container if collapsed.\r\n\texpand: function () {\r\n\t\tL.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded');\r\n\t\tthis._form.style.height = null;\r\n\t\tvar acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50);\r\n\t\tif (acceptableHeight < this._form.clientHeight) {\r\n\t\t\tL.DomUtil.addClass(this._form, 'leaflet-control-layers-scrollbar');\r\n\t\t\tthis._form.style.height = acceptableHeight + 'px';\r\n\t\t} else {\r\n\t\t\tL.DomUtil.removeClass(this._form, 'leaflet-control-layers-scrollbar');\r\n\t\t}\r\n\t\tthis._checkDisabledLayers();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method collapse(): this\r\n\t// Collapse the control container if expanded.\r\n\tcollapse: function () {\r\n\t\tL.DomUtil.removeClass(this._container, 'leaflet-control-layers-expanded');\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar className = 'leaflet-control-layers',\r\n\t\t container = this._container = L.DomUtil.create('div', className);\r\n\r\n\t\t// makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released\r\n\t\tcontainer.setAttribute('aria-haspopup', true);\r\n\r\n\t\tL.DomEvent.disableClickPropagation(container);\r\n\t\tif (!L.Browser.touch) {\r\n\t\t\tL.DomEvent.disableScrollPropagation(container);\r\n\t\t}\r\n\r\n\t\tvar form = this._form = L.DomUtil.create('form', className + '-list');\r\n\r\n\t\tif (this.options.collapsed) {\r\n\t\t\tif (!L.Browser.android) {\r\n\t\t\t\tL.DomEvent.on(container, {\r\n\t\t\t\t\tmouseenter: this.expand,\r\n\t\t\t\t\tmouseleave: this.collapse\r\n\t\t\t\t}, this);\r\n\t\t\t}\r\n\r\n\t\t\tvar link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);\r\n\t\t\tlink.href = '#';\r\n\t\t\tlink.title = 'Layers';\r\n\r\n\t\t\tif (L.Browser.touch) {\r\n\t\t\t\tL.DomEvent\r\n\t\t\t\t .on(link, 'click', L.DomEvent.stop)\r\n\t\t\t\t .on(link, 'click', this.expand, this);\r\n\t\t\t} else {\r\n\t\t\t\tL.DomEvent.on(link, 'focus', this.expand, this);\r\n\t\t\t}\r\n\r\n\t\t\t// work around for Firefox Android issue https://github.com/Leaflet/Leaflet/issues/2033\r\n\t\t\tL.DomEvent.on(form, 'click', function () {\r\n\t\t\t\tsetTimeout(L.bind(this._onInputClick, this), 0);\r\n\t\t\t}, this);\r\n\r\n\t\t\tthis._map.on('click', this.collapse, this);\r\n\t\t\t// TODO keyboard accessibility\r\n\t\t} else {\r\n\t\t\tthis.expand();\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList = L.DomUtil.create('div', className + '-base', form);\r\n\t\tthis._separator = L.DomUtil.create('div', className + '-separator', form);\r\n\t\tthis._overlaysList = L.DomUtil.create('div', className + '-overlays', form);\r\n\r\n\t\tcontainer.appendChild(form);\r\n\t},\r\n\r\n\t_getLayer: function (id) {\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\r\n\t\t\tif (this._layers[i] && L.stamp(this._layers[i].layer) === id) {\r\n\t\t\t\treturn this._layers[i];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_addLayer: function (layer, name, overlay) {\r\n\t\tlayer.on('add remove', this._onLayerChange, this);\r\n\r\n\t\tthis._layers.push({\r\n\t\t\tlayer: layer,\r\n\t\t\tname: name,\r\n\t\t\toverlay: overlay\r\n\t\t});\r\n\r\n\t\tif (this.options.autoZIndex && layer.setZIndex) {\r\n\t\t\tthis._lastZIndex++;\r\n\t\t\tlayer.setZIndex(this._lastZIndex);\r\n\t\t}\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._container) { return this; }\r\n\r\n\t\tL.DomUtil.empty(this._baseLayersList);\r\n\t\tL.DomUtil.empty(this._overlaysList);\r\n\r\n\t\tvar baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0;\r\n\r\n\t\tfor (i = 0; i < this._layers.length; i++) {\r\n\t\t\tobj = this._layers[i];\r\n\t\t\tthis._addItem(obj);\r\n\t\t\toverlaysPresent = overlaysPresent || obj.overlay;\r\n\t\t\tbaseLayersPresent = baseLayersPresent || !obj.overlay;\r\n\t\t\tbaseLayersCount += !obj.overlay ? 1 : 0;\r\n\t\t}\r\n\r\n\t\t// Hide base layers section if there's only one layer.\r\n\t\tif (this.options.hideSingleBase) {\r\n\t\t\tbaseLayersPresent = baseLayersPresent && baseLayersCount > 1;\r\n\t\t\tthis._baseLayersList.style.display = baseLayersPresent ? '' : 'none';\r\n\t\t}\r\n\r\n\t\tthis._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_onLayerChange: function (e) {\r\n\t\tif (!this._handlingClick) {\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tvar obj = this._getLayer(L.stamp(e.target));\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Layer events\r\n\t\t// @event baselayerchange: LayersControlEvent\r\n\t\t// Fired when the base layer is changed through the [layer control](#control-layers).\r\n\t\t// @event overlayadd: LayersControlEvent\r\n\t\t// Fired when an overlay is selected through the [layer control](#control-layers).\r\n\t\t// @event overlayremove: LayersControlEvent\r\n\t\t// Fired when an overlay is deselected through the [layer control](#control-layers).\r\n\t\t// @namespace Control.Layers\r\n\t\tvar type = obj.overlay ?\r\n\t\t\t(e.type === 'add' ? 'overlayadd' : 'overlayremove') :\r\n\t\t\t(e.type === 'add' ? 'baselayerchange' : null);\r\n\r\n\t\tif (type) {\r\n\t\t\tthis._map.fire(type, obj);\r\n\t\t}\r\n\t},\r\n\r\n\t// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)\r\n\t_createRadioElement: function (name, checked) {\r\n\r\n\t\tvar radioHtml = '<input type=\"radio\" class=\"leaflet-control-layers-selector\" name=\"' +\r\n\t\t\t\tname + '\"' + (checked ? ' checked=\"checked\"' : '') + '/>';\r\n\r\n\t\tvar radioFragment = document.createElement('div');\r\n\t\tradioFragment.innerHTML = radioHtml;\r\n\r\n\t\treturn radioFragment.firstChild;\r\n\t},\r\n\r\n\t_addItem: function (obj) {\r\n\t\tvar label = document.createElement('label'),\r\n\t\t checked = this._map.hasLayer(obj.layer),\r\n\t\t input;\r\n\r\n\t\tif (obj.overlay) {\r\n\t\t\tinput = document.createElement('input');\r\n\t\t\tinput.type = 'checkbox';\r\n\t\t\tinput.className = 'leaflet-control-layers-selector';\r\n\t\t\tinput.defaultChecked = checked;\r\n\t\t} else {\r\n\t\t\tinput = this._createRadioElement('leaflet-base-layers', checked);\r\n\t\t}\r\n\r\n\t\tinput.layerId = L.stamp(obj.layer);\r\n\r\n\t\tL.DomEvent.on(input, 'click', this._onInputClick, this);\r\n\r\n\t\tvar name = document.createElement('span');\r\n\t\tname.innerHTML = ' ' + obj.name;\r\n\r\n\t\t// Helps from preventing layer control flicker when checkboxes are disabled\r\n\t\t// https://github.com/Leaflet/Leaflet/issues/2771\r\n\t\tvar holder = document.createElement('div');\r\n\r\n\t\tlabel.appendChild(holder);\r\n\t\tholder.appendChild(input);\r\n\t\tholder.appendChild(name);\r\n\r\n\t\tvar container = obj.overlay ? this._overlaysList : this._baseLayersList;\r\n\t\tcontainer.appendChild(label);\r\n\r\n\t\tthis._checkDisabledLayers();\r\n\t\treturn label;\r\n\t},\r\n\r\n\t_onInputClick: function () {\r\n\t\tvar inputs = this._form.getElementsByTagName('input'),\r\n\t\t input, layer, hasLayer;\r\n\t\tvar addedLayers = [],\r\n\t\t removedLayers = [];\r\n\r\n\t\tthis._handlingClick = true;\r\n\r\n\t\tfor (var i = inputs.length - 1; i >= 0; i--) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tlayer = this._getLayer(input.layerId).layer;\r\n\t\t\thasLayer = this._map.hasLayer(layer);\r\n\r\n\t\t\tif (input.checked && !hasLayer) {\r\n\t\t\t\taddedLayers.push(layer);\r\n\r\n\t\t\t} else if (!input.checked && hasLayer) {\r\n\t\t\t\tremovedLayers.push(layer);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Bugfix issue 2318: Should remove all old layers before readding new ones\r\n\t\tfor (i = 0; i < removedLayers.length; i++) {\r\n\t\t\tthis._map.removeLayer(removedLayers[i]);\r\n\t\t}\r\n\t\tfor (i = 0; i < addedLayers.length; i++) {\r\n\t\t\tthis._map.addLayer(addedLayers[i]);\r\n\t\t}\r\n\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tthis._refocusOnMap();\r\n\t},\r\n\r\n\t_checkDisabledLayers: function () {\r\n\t\tvar inputs = this._form.getElementsByTagName('input'),\r\n\t\t input,\r\n\t\t layer,\r\n\t\t zoom = this._map.getZoom();\r\n\r\n\t\tfor (var i = inputs.length - 1; i >= 0; i--) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tlayer = this._getLayer(input.layerId).layer;\r\n\t\t\tinput.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) ||\r\n\t\t\t (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom);\r\n\r\n\t\t}\r\n\t},\r\n\r\n\t_expand: function () {\r\n\t\t// Backward compatibility, remove me in 1.1.\r\n\t\treturn this.expand();\r\n\t},\r\n\r\n\t_collapse: function () {\r\n\t\t// Backward compatibility, remove me in 1.1.\r\n\t\treturn this.collapse();\r\n\t}\r\n\r\n});\r\n\r\n\r\n// @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options)\r\n// Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.\r\nL.control.layers = function (baseLayers, overlays, options) {\r\n\treturn new L.Control.Layers(baseLayers, overlays, options);\r\n};\r\n\n/*\r\n * Provides L.Map with convenient shortcuts for using browser geolocation features.\r\n */\r\n\r\n// @namespace Map\r\n\r\nL.Map.include({\r\n\t// @section Geolocation methods\r\n\t_defaultLocateOptions: {\r\n\t\ttimeout: 10000,\r\n\t\twatch: false\r\n\t\t// setView: false\r\n\t\t// maxZoom: <Number>\r\n\t\t// maximumAge: 0\r\n\t\t// enableHighAccuracy: false\r\n\t},\r\n\r\n\t// @method locate(options?: Locate options): this\r\n\t// Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound)\r\n\t// event with location data on success or a [`locationerror`](#map-locationerror) event on failure,\r\n\t// and optionally sets the map view to the user's location with respect to\r\n\t// detection accuracy (or to the world view if geolocation failed).\r\n\t// Note that, if your page doesn't use HTTPS, this method will fail in\r\n\t// modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins))\r\n\t// See `Locate options` for more details.\r\n\tlocate: function (options) {\r\n\r\n\t\toptions = this._locateOptions = L.extend({}, this._defaultLocateOptions, options);\r\n\r\n\t\tif (!('geolocation' in navigator)) {\r\n\t\t\tthis._handleGeolocationError({\r\n\t\t\t\tcode: 0,\r\n\t\t\t\tmessage: 'Geolocation not supported.'\r\n\t\t\t});\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar onResponse = L.bind(this._handleGeolocationResponse, this),\r\n\t\t onError = L.bind(this._handleGeolocationError, this);\r\n\r\n\t\tif (options.watch) {\r\n\t\t\tthis._locationWatchId =\r\n\t\t\t navigator.geolocation.watchPosition(onResponse, onError, options);\r\n\t\t} else {\r\n\t\t\tnavigator.geolocation.getCurrentPosition(onResponse, onError, options);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method stopLocate(): this\r\n\t// Stops watching location previously initiated by `map.locate({watch: true})`\r\n\t// and aborts resetting the map view if map.locate was called with\r\n\t// `{setView: true}`.\r\n\tstopLocate: function () {\r\n\t\tif (navigator.geolocation && navigator.geolocation.clearWatch) {\r\n\t\t\tnavigator.geolocation.clearWatch(this._locationWatchId);\r\n\t\t}\r\n\t\tif (this._locateOptions) {\r\n\t\t\tthis._locateOptions.setView = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_handleGeolocationError: function (error) {\r\n\t\tvar c = error.code,\r\n\t\t message = error.message ||\r\n\t\t (c === 1 ? 'permission denied' :\r\n\t\t (c === 2 ? 'position unavailable' : 'timeout'));\r\n\r\n\t\tif (this._locateOptions.setView && !this._loaded) {\r\n\t\t\tthis.fitWorld();\r\n\t\t}\r\n\r\n\t\t// @section Location events\r\n\t\t// @event locationerror: ErrorEvent\r\n\t\t// Fired when geolocation (using the [`locate`](#map-locate) method) failed.\r\n\t\tthis.fire('locationerror', {\r\n\t\t\tcode: c,\r\n\t\t\tmessage: 'Geolocation error: ' + message + '.'\r\n\t\t});\r\n\t},\r\n\r\n\t_handleGeolocationResponse: function (pos) {\r\n\t\tvar lat = pos.coords.latitude,\r\n\t\t lng = pos.coords.longitude,\r\n\t\t latlng = new L.LatLng(lat, lng),\r\n\t\t bounds = latlng.toBounds(pos.coords.accuracy),\r\n\t\t options = this._locateOptions;\r\n\r\n\t\tif (options.setView) {\r\n\t\t\tvar zoom = this.getBoundsZoom(bounds);\r\n\t\t\tthis.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tbounds: bounds,\r\n\t\t\ttimestamp: pos.timestamp\r\n\t\t};\r\n\r\n\t\tfor (var i in pos.coords) {\r\n\t\t\tif (typeof pos.coords[i] === 'number') {\r\n\t\t\t\tdata[i] = pos.coords[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// @event locationfound: LocationEvent\r\n\t\t// Fired when geolocation (using the [`locate`](#map-locate) method)\r\n\t\t// went successfully.\r\n\t\tthis.fire('locationfound', data);\r\n\t}\r\n});\r\n\n},{}],8:[function(_dereq_,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\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 = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(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 runTimeout(drainQueue);\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;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],9:[function(_dereq_,module,exports){\n(function(window, undefined) {\n 'use strict';\n\n if (!window) return; // Server side\n\nvar\n _baron = window.baron, // Stored baron value for noConflict usage\n $ = window.jQuery, // Trying to use jQuery\n origin = {\n v: { // Vertical\n x: 'Y', pos: 'top', crossPos: 'left', size: 'height', crossSize: 'width',\n client: 'clientHeight', crossClient: 'clientWidth', offset: 'offsetHeight', crossOffset: 'offsetWidth', offsetPos: 'offsetTop',\n scroll: 'scrollTop', scrollSize: 'scrollHeight'\n },\n h: { // Horizontal\n x: 'X', pos: 'left', crossPos: 'top', size: 'width', crossSize: 'height',\n client: 'clientWidth', crossClient: 'clientHeight', offset: 'offsetWidth', crossOffset: 'offsetHeight', offsetPos: 'offsetLeft',\n scroll: 'scrollLeft', scrollSize: 'scrollWidth'\n }\n },\n\n each = function(obj, iterator) {\n var i = 0;\n\n if (obj.length === undefined || obj === window) obj = [obj];\n\n while (obj[i]) {\n iterator.call(this, obj[i], i);\n i++;\n }\n },\n\n baron = function(params) { // this - window or jQuery instance\n var jQueryMode = false,//(this && this[0] && this[0].nodeType),\n roots,\n $;\n\n params = params || {};\n $ = params.$ || window.jQuery;\n\n if (jQueryMode) {\n params.root = roots = this;\n } else {\n roots = $(params.root || params.scroller);\n }\n\n return new baron.fn.constructor(roots, params, $);\n };\n\n baron.fn = {\n constructor: function(roots, input, $) {\n var params = validate(input);\n\n params.$ = $;\n each.call(this, roots, function(root, i) {\n var localParams = clone(params);\n\n if (params.root && params.scroller) {\n localParams.scroller = params.$(params.scroller, root);\n if (!localParams.scroller.length) {\n localParams.scroller = root;\n }\n } else {\n localParams.scroller = root;\n }\n\n localParams.root = root;\n this[i] = init(localParams);\n this.length = i + 1;\n });\n\n this.params = params;\n },\n\n dispose: function() {\n var params = this.params;\n\n each(this, function(item) {\n item.dispose(params);\n });\n this.params = null;\n },\n\n update: function() {\n var i = 0;\n\n while (this[i]) {\n this[i].update.apply(this[i], arguments);\n i++;\n }\n },\n\n baron: function(params) {\n params.root = [];\n params.scroller = this.params.scroller;\n\n each.call(this, this, function(elem) {\n params.root.push(elem.root);\n });\n params.direction = (this.params.direction == 'v') ? 'h' : 'v';\n params._chain = true;\n\n return baron(params);\n }\n };\n\n function manageEvents(item, eventManager, mode) {\n item._eventHandlers = item._eventHandlers || [ // Creating new functions for one baron item only one time\n {\n // onScroll:\n element: item.scroller,\n\n handler: function(e) {\n item.scroll(e);\n },\n\n type: 'scroll'\n }, {\n // onMouseDown:\n element: item.bar,\n\n handler: function(e) {\n e.preventDefault ? e.preventDefault() : e.returnValue = false; // Text selection disabling in Opera... and all other browsers?\n item.selection(); // Disable text selection in ie8\n item.drag.now = 1; // Save private byte\n },\n\n type: 'touchstart mousedown'\n }, {\n // onMouseUp:\n element: document,\n\n handler: function() {\n item.selection(1); // Enable text selection\n item.drag.now = 0;\n },\n\n type: 'mouseup blur touchend'\n }, {\n // onCoordinateReset:\n element: item.bar,\n\n handler: function(e) {\n if (e.button != 2) { // Not RM\n item._pos0(e);\n }\n },\n\n type: 'touchstart mousedown'\n }, {\n // onMouseMove:\n element: document,\n\n handler: function(e) {\n if (item.drag.now) {\n item.drag(e);\n }\n },\n\n type: 'mousemove touchmove'\n }, {\n // onResize:\n element: window,\n\n handler: function() {\n item.update();\n },\n\n type: 'resize'\n }, {\n // sizeChange:\n element: item.root,\n\n handler: function() {\n item.update();\n },\n\n type: 'sizeChange'\n }\n ];\n\n each(item._eventHandlers, function(event) {\n if (event.element) {\n eventManager(event.element, event.type, event.handler, mode);\n }\n });\n\n // if (item.scroller) {\n // event(item.scroller, 'scroll', item._eventHandlers.onScroll, mode);\n // }\n // if (item.bar) {\n // event(item.bar, 'touchstart mousedown', item._eventHandlers.onMouseDown, mode);\n // }\n // event(document, 'mouseup blur touchend', item._eventHandlers.onMouseUp, mode);\n // event(document, 'touchstart mousedown', item._eventHandlers.onCoordinateReset, mode);\n // event(document, 'mousemove touchmove', item._eventHandlers.onMouseMove, mode);\n // event(window, 'resize', item._eventHandlers.onResize, mode);\n // if (item.root) {\n // event(item.root, 'sizeChange', item._eventHandlers.onResize, mode); // Custon event for alternate baron update mechanism\n // }\n }\n\n function manageAttr(node, direction, mode) {\n var attrName = 'data-baron-' + direction;\n\n if (mode == 'on') {\n node.setAttribute(attrName, 'inited');\n } else if (mode == 'off') {\n node.removeAttribute(attrName);\n } else {\n return node.getAttribute(attrName);\n }\n }\n\n function init(params) {\n if (manageAttr(params.root, params.direction)) return;\n\n var out = new item.prototype.constructor(params); // __proto__ of returning object is baron.prototype\n\n manageEvents(out, params.event, 'on');\n\n manageAttr(out.root, params.direction, 'on');\n\n out.update();\n\n return out;\n }\n\n function clone(input) {\n var output = {};\n\n input = input || {};\n\n for (var key in input) {\n if (input.hasOwnProperty(key)) {\n output[key] = input[key];\n }\n }\n\n return output;\n }\n\n function validate(input) {\n var output = clone(input);\n\n output.direction = output.direction || 'v';\n\n var event = input.event || function(elem, event, func, mode) {\n output.$(elem)[mode || 'on'](event, func);\n };\n\n output.event = function(elems, e, func, mode) {\n each(elems, function(elem) {\n event(elem, e, func, mode);\n });\n };\n\n return output;\n }\n\n function fire(eventName) {\n /* jshint validthis:true */\n if (this.events && this.events[eventName]) {\n for (var i = 0 ; i < this.events[eventName].length ; i++) {\n var args = Array.prototype.slice.call( arguments, 1 );\n\n this.events[eventName][i].apply(this, args);\n }\n }\n }\n\n var item = {};\n\n item.prototype = {\n constructor: function(params) {\n var $,\n barPos,\n scrollerPos0,\n track,\n resizePauseTimer,\n scrollPauseTimer,\n pause,\n scrollLastFire,\n resizeLastFire;\n\n resizeLastFire = scrollLastFire = new Date().getTime();\n\n $ = this.$ = params.$;\n this.event = params.event;\n this.events = {};\n\n function getNode(sel, context) {\n return $(sel, context)[0]; // Can be undefined\n }\n\n // DOM elements\n this.root = params.root; // Always html node, not just selector\n this.scroller = getNode(params.scroller); // (params.scroller) ? getNode(params.scroller, this.root) : this.root;\n this.bar = getNode(params.bar, this.root);\n track = this.track = getNode(params.track, this.root);\n if (!this.track && this.bar) {\n track = this.bar.parentNode;\n }\n this.clipper = this.scroller.parentNode;\n\n // Parameters\n this.direction = params.direction;\n this.origin = origin[this.direction];\n this.barOnCls = params.barOnCls;\n this.barTopLimit = 0;\n pause = params.pause * 1000 || 0;\n\n // Updating height or width of bar\n function setBarSize(size) {\n /* jshint validthis:true */\n var barMinSize = this.barMinSize || 20;\n\n if (size > 0 && size < barMinSize) {\n size = barMinSize;\n }\n\n if (this.bar) {\n $(this.bar).css(this.origin.size, parseInt(size, 10) + 'px');\n }\n }\n\n // Updating top or left bar position\n function posBar(pos) {\n /* jshint validthis:true */\n if (this.bar) {\n $(this.bar).css(this.origin.pos, +pos + 'px');\n }\n }\n\n // Free path for bar\n function k() {\n /* jshint validthis:true */\n return track[this.origin.client] - this.barTopLimit - this.bar[this.origin.offset];\n }\n\n // Relative content top position to bar top position\n function relToPos(r) {\n /* jshint validthis:true */\n return r * k.call(this) + this.barTopLimit;\n }\n\n // Bar position to relative content position\n function posToRel(t) {\n /* jshint validthis:true */\n return (t - this.barTopLimit) / k.call(this);\n }\n\n // Cursor position in main direction in px // Now with iOs support\n this.cursor = function(e) {\n return e['client' + this.origin.x] || (((e.originalEvent || e).touches || {})[0] || {})['page' + this.origin.x];\n };\n\n // Text selection pos preventing\n function dontPosSelect() {\n return false;\n }\n\n this.pos = function(x) { // Absolute scroller position in px\n var ie = 'page' + this.origin.x + 'Offset',\n key = (this.scroller[ie]) ? ie : this.origin.scroll;\n\n if (x !== undefined) this.scroller[key] = x;\n\n return this.scroller[key];\n };\n\n this.rpos = function(r) { // Relative scroller position (0..1)\n var free = this.scroller[this.origin.scrollSize] - this.scroller[this.origin.client],\n x;\n\n if (r) x = this.pos(r * free);\n else x = this.pos();\n\n return x / (free || 1);\n };\n\n // Switch on the bar by adding user-defined CSS classname to scroller\n this.barOn = function(dispose) {\n if (this.barOnCls) {\n if (dispose || this.scroller[this.origin.client] >= this.scroller[this.origin.scrollSize]) {\n $(this.root).removeClass(this.barOnCls);\n } else {\n $(this.root).addClass(this.barOnCls);\n }\n }\n };\n\n this._pos0 = function(e) {\n scrollerPos0 = this.cursor(e) - barPos;\n };\n\n this.drag = function(e) {\n this.scroller[this.origin.scroll] = posToRel.call(this, this.cursor(e) - scrollerPos0) * (this.scroller[this.origin.scrollSize] - this.scroller[this.origin.client]);\n };\n\n // Text selection preventing on drag\n this.selection = function(enable) {\n this.event(document, 'selectpos selectstart', dontPosSelect, enable ? 'off' : 'on');\n };\n\n // onResize & DOM modified handler\n this.resize = function() {\n var self = this,\n delay = 0;\n\n if (new Date().getTime() - resizeLastFire < pause) {\n clearTimeout(resizePauseTimer);\n delay = pause;\n }\n\n function upd() {\n var delta = self.scroller[self.origin.crossOffset] - self.scroller[self.origin.crossClient];\n\n if (params.freeze && !self.clipper.style[self.origin.crossSize]) { // Sould fire only once\n $(self.clipper).css(self.origin.crossSize, self.clipper[self.origin.crossClient] - delta + 'px');\n }\n $(self.scroller).css(self.origin.crossSize, self.clipper[self.origin.crossClient] + delta + 'px');\n\n Array.prototype.unshift.call(arguments, 'resize');\n fire.apply(self, arguments);\n\n resizeLastFire = new Date().getTime();\n }\n\n if (delay) {\n resizePauseTimer = setTimeout(upd, delay);\n } else {\n upd();\n }\n };\n\n // onScroll handler\n this.scroll = function() {\n var oldBarSize, newBarSize,\n delay = 0,\n self = this;\n\n if (new Date().getTime() - scrollLastFire < pause) {\n clearTimeout(scrollPauseTimer);\n delay = pause;\n }\n\n function upd() {\n if (self.bar) {\n newBarSize = (track[self.origin.client] - self.barTopLimit) * self.scroller[self.origin.client] / self.scroller[self.origin.scrollSize];\n\n // Positioning bar\n if (oldBarSize != newBarSize) {\n setBarSize.call(self, newBarSize);\n oldBarSize = newBarSize;\n }\n\n barPos = relToPos.call(self, self.rpos());\n\n posBar.call(self, barPos);\n }\n\n Array.prototype.unshift.call( arguments, 'scroll' );\n fire.apply(self, arguments);\n\n scrollLastFire = new Date().getTime();\n }\n\n if (delay) {\n scrollPauseTimer = setTimeout(upd, delay);\n } else {\n upd();\n }\n\n };\n\n return this;\n },\n\n update: function(params) {\n fire.call(this, 'upd', params); // ОбновлÑем параметры вÑех плагинов\n\n this.resize(1);\n this.barOn();\n this.scroll();\n\n return this;\n },\n\n dispose: function(params) {\n manageEvents(this, this.event, 'off');\n manageAttr(this.root, params.direction, 'off');\n $(this.scroller).css(this.origin.crossSize, '');\n this.barOn(true);\n fire.call(this, 'dispose');\n },\n\n on: function(eventName, func, arg) {\n var names = eventName.split(' ');\n\n for (var i = 0 ; i < names.length ; i++) {\n if (names[i] == 'init') {\n func.call(this, arg);\n } else {\n this.events[names[i]] = this.events[names[i]] || [];\n\n this.events[names[i]].push(function(userArg) {\n func.call(this, userArg || arg);\n });\n }\n }\n }\n };\n\n baron.fn.constructor.prototype = baron.fn;\n item.prototype.constructor.prototype = item.prototype;\n\n // Use when you need \"baron\" global var for another purposes\n baron.noConflict = function() {\n window.baron = _baron; // Restoring original value of \"baron\" global var\n return baron;\n };\n\n baron.version = '0.6.6';\n\n if ($ && $.fn) { // Adding baron to jQuery as plugin\n $.fn.baron = baron;\n }\n window.baron = baron; // Use noConflict method if you need window.baron var for another purposes\n\n var fix = function(userParams) {\n var elements, viewPortSize,\n params = { // Default params\n outside: '',\n before: '',\n after: '',\n past: '',\n future: '',\n radius: 0,\n minView: 0\n },\n topFixHeights = [], // inline style for element\n topRealHeights = [], // real offset position when not fixed\n headerTops = [],\n scroller = this.scroller,\n eventManager = this.event,\n $ = this.$,\n self = this;\n\n function fixElement(i, pos) {\n if (viewPortSize < (params.minView || 0)) { // No headers fixing when no enought space for viewport\n pos = undefined;\n }\n\n if (pos !== undefined) {\n pos += 'px';\n this.$(elements[i]).css(this.origin.pos, pos).addClass(params.outside);\n } else {\n this.$(elements[i]).css(this.origin.pos, '').removeClass(params.outside);\n }\n }\n\n function bubbleWheel(e) {\n try {\n i = document.createEvent('WheelEvent'); // i - for extra byte\n // evt.initWebKitWheelEvent(deltaX, deltaY, window, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);\n i.initWebKitWheelEvent(e.originalEvent.wheelDeltaX, e.originalEvent.wheelDeltaY);\n scroller.dispatchEvent(i);\n e.preventDefault();\n } catch (e) {}\n }\n\n function init(_params) {\n var pos;\n\n for (var key in _params) {\n params[key] = _params[key];\n }\n\n elements = this.$(params.elements, this.scroller);\n\n if (elements) {\n viewPortSize = this.scroller[this.origin.client];\n for (var i = 0 ; i < elements.length ; i++) {\n // Variable header heights\n pos = {};\n pos[this.origin.size] = elements[i][this.origin.offset];\n if (elements[i].parentNode !== this.scroller) {\n this.$(elements[i].parentNode).css(pos);\n }\n pos = {};\n pos[this.origin.crossSize] = elements[i].parentNode[this.origin.crossClient];\n this.$(elements[i]).css(pos);\n\n // Between fixed headers\n viewPortSize -= elements[i][this.origin.offset];\n\n headerTops[i] = elements[i].parentNode[this.origin.offsetPos]; // No paddings for parentNode\n\n // Summary elements height above current\n topFixHeights[i] = (topFixHeights[i - 1] || 0); // Not zero because of negative margins\n topRealHeights[i] = (topRealHeights[i - 1] || Math.min(headerTops[i], 0));\n\n if (elements[i - 1]) {\n topFixHeights[i] += elements[i - 1][this.origin.offset];\n topRealHeights[i] += elements[i - 1][this.origin.offset];\n }\n\n if ( !(i == 0 && headerTops[i] == 0)/* && force */) {\n this.event(elements[i], 'mousewheel', bubbleWheel, 'off');\n this.event(elements[i], 'mousewheel', bubbleWheel);\n }\n }\n\n if (params.limiter && elements[0]) { // Bottom edge of first header as top limit for track\n if (this.track && this.track != this.scroller) {\n pos = {};\n pos[this.origin.pos] = elements[0].parentNode[this.origin.offset];\n this.$(this.track).css(pos);\n } else {\n this.barTopLimit = elements[0].parentNode[this.origin.offset];\n }\n // this.barTopLimit = elements[0].parentNode[this.origin.offset];\n this.scroll();\n }\n\n if (params.limiter === false) { // undefined (in second fix instance) should have no influence on bar limit\n this.barTopLimit = 0;\n }\n }\n\n var event = {\n element: elements,\n\n handler: function() {\n var parent = $(this)[0].parentNode,\n top = parent.offsetTop,\n num;\n\n // finding num -> elements[num] === this\n for (var i = 0 ; i < elements.length ; i++ ) {\n if (elements[i] === this) num = i;\n }\n\n var pos = top - topFixHeights[num];\n\n if (params.scroll) { // User defined callback\n params.scroll({\n x1: self.scroller.scrollTop,\n x2: pos\n });\n } else {\n self.scroller.scrollTop = pos;\n }\n },\n\n type: 'click'\n };\n\n if (params.clickable) {\n this._eventHandlers.push(event); // For auto-dispose\n eventManager(event.element, event.type, event.handler, 'off');\n eventManager(event.element, event.type, event.handler, 'on');\n }\n }\n\n this.on('init', init, userParams);\n\n this.on('init scroll', function() {\n var fixState, hTop,\n fixFlag = []; // 1 - past, 2 - future, 3 - current (not fixed)\n\n if (elements) {\n var change;\n\n // fixFlag update\n for (var i = 0 ; i < elements.length ; i++) {\n fixState = 0;\n if (headerTops[i] - this.pos() < topRealHeights[i] + params.radius) {\n // Header trying to go up\n fixState = 1;\n hTop = topFixHeights[i];\n } else if (headerTops[i] - this.pos() > topRealHeights[i] + viewPortSize - params.radius) {\n // Header trying to go down\n fixState = 2;\n hTop = topFixHeights[i] + viewPortSize;\n } else {\n // Header in viewport\n fixState = 3;\n hTop = undefined;\n }\n if (fixState != fixFlag[i]) {\n fixElement.call(this, i, hTop);\n fixFlag[i] = fixState;\n change = true;\n }\n }\n\n // Adding positioning classes (on last top and first bottom header)\n if (change) { // At leats one change in elements flag structure occured\n for (i = 0 ; i < elements.length ; i++) {\n if (fixFlag[i] == 1 && params.past) {\n this.$(elements[i]).addClass(params.past).removeClass(params.future);\n }\n\n if (fixFlag[i] == 2 && params.future) {\n this.$(elements[i]).addClass(params.future).removeClass(params.past);\n }\n\n if (fixFlag[i] == 3 && (params.future || params.past)) {\n this.$(elements[i]).removeClass(params.past).removeClass(params.future);\n }\n\n if (fixFlag[i] != fixFlag[i + 1] && fixFlag[i] == 1 && params.before) {\n this.$(elements[i]).addClass(params.before).removeClass(params.after); // Last top fixed header\n } else if (fixFlag[i] != fixFlag[i - 1] && fixFlag[i] == 2 && params.after) {\n this.$(elements[i]).addClass(params.after).removeClass(params.before); // First bottom fixed header\n } else {\n this.$(elements[i]).removeClass(params.before).removeClass(params.after);\n }\n }\n }\n }\n });\n\n this.on('resize upd', function(updParams) {\n init.call(this, updParams && updParams.fix);\n });\n };\n\n baron.fn.fix = function(params) {\n var i = 0;\n\n while (this[i]) {\n fix.call(this[i], params);\n i++;\n }\n\n return this;\n };\n\n var controls = function(params) {\n var forward, backward, track, screen,\n self = this; // AAAAAA!!!!!11\n\n screen = params.screen || 0.9;\n\n if (params.forward) {\n forward = this.$(params.forward, this.clipper);\n\n this.event(forward, 'click', function() {\n var y = self.pos() - params.delta || 30;\n\n self.pos(y);\n });\n }\n\n if (params.backward) {\n backward = this.$(params.backward, this.clipper);\n\n this.event(backward, 'click', function() {\n var y = self.pos() + params.delta || 30;\n\n self.pos(y);\n });\n }\n\n if (params.track) {\n if (params.track === true) {\n track = this.track;\n } else {\n track = this.$(params.track, this.clipper)[0];\n }\n\n if (track) {\n this.event(track, 'mousedown', function(e) {\n var x = e['offset' + self.origin.x],\n xBar = self.bar[self.origin.offsetPos],\n sign = 0;\n\n if (x < xBar) {\n sign = -1;\n } else if (x > xBar + self.bar[self.origin.offset]) {\n sign = 1;\n }\n\n var y = self.pos() + sign * screen * self.scroller[self.origin.client];\n self.pos(y);\n });\n }\n }\n\n };\n\n baron.fn.controls = function(params) {\n var i = 0;\n\n while (this[i]) {\n controls.call(this[i], params);\n i++;\n }\n\n return this;\n };\n\n var pull = function(params) {\n var block = this.$(params.block),\n size = params.size || this.origin.size,\n limit = params.limit || 80,\n onExpand = params.onExpand,\n elements = params.elements || [],\n inProgress = params.inProgress || '',\n self = this,\n _insistence = 0,\n _zeroXCount = 0,\n _interval,\n _timer,\n _x = 0,\n _onExpandCalled,\n _waiting = params.waiting || 500,\n _on;\n\n function getSize() {\n return self.scroller[self.origin.scroll] + self.scroller[self.origin.offset];\n }\n\n // Scroller content height\n function getContentSize() {\n return self.scroller[self.origin.scrollSize];\n }\n\n // Scroller height\n function getScrollerSize() {\n return self.scroller[self.origin.client];\n }\n\n function step(x, force) {\n var k = x * 0.0005;\n\n return Math.floor(force - k * (x + 550));\n }\n\n function toggle(on) {\n _on = on;\n\n if (on) {\n update(); // First time with no delay\n _interval = setInterval(update, 200);\n } else {\n clearInterval(_interval);\n }\n }\n\n function update() {\n var pos = {},\n height = getSize(),\n scrollHeight = getContentSize(),\n dx,\n op4,\n scrollInProgress = _insistence == 1;\n\n op4 = 0; // Ð’Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ñила\n if (_insistence > 0) {\n op4 = 40;\n }\n //if (_insistence > -1) {\n dx = step(_x, op4);\n if (height >= scrollHeight - _x && _insistence > -1) {\n if (scrollInProgress) {\n _x += dx;\n }\n } else {\n _x = 0;\n }\n\n if (_x < 0) _x = 0;\n\n pos[size] = _x + 'px';\n if (getScrollerSize() <= getContentSize()) {\n self.$(block).css(pos);\n for (var i = 0 ; i < elements.length ; i++) {\n self.$(elements[i].self).css(elements[i].property, Math.min(_x / limit * 100, 100) + '%');\n }\n }\n\n if (inProgress && _x) {\n self.$(self.root).addClass(inProgress);\n }\n\n if (_x == 0) {\n if (params.onCollapse) {\n params.onCollapse();\n }\n }\n\n _insistence = 0;\n _timer = setTimeout(function() {\n _insistence = -1;\n }, _waiting);\n //}\n\n if (onExpand && _x > limit && !_onExpandCalled) {\n onExpand();\n _onExpandCalled = true;\n }\n\n if (_x == 0) {\n _zeroXCount++;\n } else {\n _zeroXCount = 0;\n\n }\n if (_zeroXCount > 1) {\n toggle(false);\n _onExpandCalled = false;\n if (inProgress) {\n self.$(self.root).removeClass(inProgress);\n }\n }\n }\n\n this.on('init', function() {\n toggle(true);\n });\n\n this.on('dispose', function() {\n toggle(false);\n });\n\n this.event(this.scroller, 'mousewheel DOMMouseScroll', function(e) {\n var down = e.wheelDelta < 0 || (e.originalEvent && e.originalEvent.wheelDelta < 0) || e.detail > 0;\n\n if (down) {\n _insistence = 1;\n clearTimeout(_timer);\n if (!_on && getSize() >= getContentSize()) {\n toggle(true);\n }\n }\n // else {\n // toggle(false);\n // }\n });\n };\n\n baron.fn.pull = function(params) {\n var i = 0;\n\n while (this[i]) {\n pull.call(this[i], params);\n i++;\n }\n\n return this;\n };\n})(window);\n\n},{}]},{},[2])(2)\n});\n"]}