package/package.json000644 000765 000024 0000000734 12224121654013020 0ustar00000000 000000 { "author": "Michael Lawrence Evans", "name": "leaflet-hash", "description": "linkable location hashes for leaflet", "version": "0.2.1", "homepage": "https://github.com/mlevans/leaflet-hash", "repository": { "type": "git", "url": "https://github.com/mlevans/leaflet-hash.git" }, "devDependencies": { "mocha": "~1.8", "expect.js": "~0.2.0" }, "main": "leaflet-hash.js", "optionalDependencies": {}, "engines": { "node": "*" } } package/.npmignore000644 000765 000024 0000000012 12220204170012505 0ustar00000000 000000 .DS_Store package/README.md000644 000765 000024 0000002457 12220204170012004 0ustar00000000 000000 # Leaflet-hash Leaflet-hash lets you to add dynamic URL hashes to web pages with Leaflet maps. You can easily link users to specific map views. ![Leaflet-hash](https://github.com/mlevans/leaflet-hash/raw/master/screenshots/screenshot.png) ### Demo You can view a demo of leaflet-hash at [mlevans.github.io/leaflet-hash/map.html](http://mlevans.github.io/leaflet-hash/map.html). ### Getting started 1. Prepare a basic leaflet map. You can find instructions on [Leaflet's quick-start guide](http://leaflet.cloudmade.com/examples/quick-start.html). 2. Include [leaflet-hash.js](https://github.com/mlevans/leaflet-hash/blob/master/leaflet-hash.js). 3. Once you have initialized the map (an instance of [L.Map](http://leaflet.cloudmade.com/reference.html#map-usage)), add the following code: ```javascript // Assuming your map instance is in a variable called map var hash = new L.Hash(map); ``` ### Author [@mlevans](http://github.com/mlevans) ### Contributors [@calvinmetcalf](http://github.com/calvinmetcalf) [@jfirebaugh](http://github.com/jfirebaugh) [@rsudekum](http://github.com/rsudekum) [@tmcw](http://github.com/tmcw) [@yohanboniface](http://github.com/yohanboniface) ### License MIT License. See [LICENSE](https://github.com/mlevans/leaflet-hash/blob/master/LICENSE.md) for details. package/leaflet-hash.js000644 000765 000024 0000006606 12224121532013424 0ustar00000000 000000 (function(window) { var HAS_HASHCHANGE = (function() { var doc_mode = window.documentMode; return ('onhashchange' in window) && (doc_mode === undefined || doc_mode > 7); })(); L.Hash = function(map) { this.onHashChange = L.Util.bind(this.onHashChange, this); if (map) { this.init(map); } }; L.Hash.parseHash = function(hash) { if(hash.indexOf('#') === 0) { hash = hash.substr(1); } var args = hash.split("/"); if (args.length == 3) { var zoom = parseInt(args[0], 10), lat = parseFloat(args[1]), lon = parseFloat(args[2]); if (isNaN(zoom) || isNaN(lat) || isNaN(lon)) { return false; } else { return { center: new L.LatLng(lat, lon), zoom: zoom }; } } else { return false; } }; L.Hash.formatHash = function(map) { var center = map.getCenter(), zoom = map.getZoom(), precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)); return "#" + [zoom, center.lat.toFixed(precision), center.lng.toFixed(precision) ].join("/"); }, L.Hash.prototype = { map: null, lastHash: null, parseHash: L.Hash.parseHash, formatHash: L.Hash.formatHash, init: function(map) { this.map = map; // reset the hash this.lastHash = null; this.onHashChange(); if (!this.isListening) { this.startListening(); } }, removeFrom: function(map) { if (this.changeTimeout) { clearTimeout(this.changeTimeout); } if (this.isListening) { this.stopListening(); } this.map = null; }, onMapMove: function() { // bail if we're moving the map (updating from a hash), // or if the map is not yet loaded if (this.movingMap || !this.map._loaded) { return false; } var hash = this.formatHash(this.map); if (this.lastHash != hash) { location.replace(hash); this.lastHash = hash; } }, movingMap: false, update: function() { var hash = location.hash; if (hash === this.lastHash) { return; } var parsed = this.parseHash(hash); if (parsed) { this.movingMap = true; this.map.setView(parsed.center, parsed.zoom); this.movingMap = false; } else { this.onMapMove(this.map); } }, // defer hash change updates every 100ms changeDefer: 100, changeTimeout: null, onHashChange: function() { // throttle calls to update() so that they only happen every // `changeDefer` ms if (!this.changeTimeout) { var that = this; this.changeTimeout = setTimeout(function() { that.update(); that.changeTimeout = null; }, this.changeDefer); } }, isListening: false, hashChangeInterval: null, startListening: function() { this.map.on("moveend", this.onMapMove, this); if (HAS_HASHCHANGE) { L.DomEvent.addListener(window, "hashchange", this.onHashChange); } else { clearInterval(this.hashChangeInterval); this.hashChangeInterval = setInterval(this.onHashChange, 50); } this.isListening = true; }, stopListening: function() { this.map.off("moveend", this.onMapMove, this); if (HAS_HASHCHANGE) { L.DomEvent.removeListener(window, "hashchange", this.onHashChange); } else { clearInterval(this.hashChangeInterval); } this.isListening = false; } }; L.hash = function(map) { return new L.Hash(map); }; L.Map.prototype.addHash = function() { this._hash = L.hash(this); }; L.Map.prototype.removeHash = function() { this._hash.removeFrom(); }; })(window); package/lib/leaflet-src.js000755 000765 000024 0000570034 12220204170014036 0ustar00000000 000000 /* Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com (c) 2010-2013, Vladimir Agafonkin, CloudMade */ (function (window, document, undefined) {/* * The L namespace contains all Leaflet classes and functions. * This code allows you to handle any possible namespace conflicts. */ var L, originalL; if (typeof exports !== undefined + '') { L = exports; } else { originalL = window.L; L = {}; L.noConflict = function () { window.L = originalL; return this; }; window.L = L; } L.version = '0.5.1'; /* * L.Util contains various utility functions used throughout Leaflet code. */ L.Util = { extend: function (dest) { // (Object[, Object, ...]) -> var sources = Array.prototype.slice.call(arguments, 1), i, j, len, src; for (j = 0, len = sources.length; j < len; j++) { src = sources[j] || {}; for (i in src) { if (src.hasOwnProperty(i)) { dest[i] = src[i]; } } } return dest; }, bind: function (fn, obj) { // (Function, Object) -> Function var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null; return function () { return fn.apply(obj, args || arguments); }; }, stamp: (function () { var lastId = 0, key = '_leaflet_id'; return function (/*Object*/ obj) { obj[key] = obj[key] || ++lastId; return obj[key]; }; }()), limitExecByInterval: function (fn, time, context) { var lock, execOnUnlock; return function wrapperFn() { var args = arguments; if (lock) { execOnUnlock = true; return; } lock = true; setTimeout(function () { lock = false; if (execOnUnlock) { wrapperFn.apply(context, args); execOnUnlock = false; } }, time); fn.apply(context, args); }; }, falseFn: function () { return false; }, formatNum: function (num, digits) { var pow = Math.pow(10, digits || 5); return Math.round(num * pow) / pow; }, splitWords: function (str) { return str.replace(/^\s+|\s+$/g, '').split(/\s+/); }, setOptions: function (obj, options) { obj.options = L.extend({}, obj.options, options); return obj.options; }, getParamString: function (obj, existingUrl) { var params = []; for (var i in obj) { if (obj.hasOwnProperty(i)) { params.push(i + '=' + obj[i]); } } return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); }, template: function (str, data) { return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { var value = data[key]; if (!data.hasOwnProperty(key)) { throw new Error('No value provided for variable ' + str); } return value; }); }, isArray: function (obj) { return (Object.prototype.toString.call(obj) === '[object Array]'); }, emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=' }; (function () { // inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/ function getPrefixed(name) { var i, fn, prefixes = ['webkit', 'moz', 'o', 'ms']; for (i = 0; i < prefixes.length && !fn; i++) { fn = window[prefixes[i] + name]; } return fn; } var lastTime = 0; function timeoutDefer(fn) { var time = +new Date(), timeToCall = Math.max(0, 16 - (time - lastTime)); lastTime = time + timeToCall; return window.setTimeout(fn, timeToCall); } var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer; var cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') || getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); }; L.Util.requestAnimFrame = function (fn, context, immediate, element) { fn = L.bind(fn, context); if (immediate && requestFn === timeoutDefer) { fn(); } else { return requestFn.call(window, fn, element); } }; L.Util.cancelAnimFrame = function (id) { if (id) { cancelFn.call(window, id); } }; }()); // shortcuts for most used utility functions L.extend = L.Util.extend; L.bind = L.Util.bind; L.stamp = L.Util.stamp; L.setOptions = L.Util.setOptions; /* * L.Class powers the OOP facilities of the library. * Thanks to John Resig and Dean Edwards for inspiration! */ L.Class = function () {}; L.Class.extend = function (props) { // extended class with the new prototype var NewClass = function () { // call the constructor if (this.initialize) { this.initialize.apply(this, arguments); } // call all constructor hooks if (this._initHooks) { this.callInitHooks(); } }; // instantiate class without calling constructor var F = function () {}; F.prototype = this.prototype; var proto = new F(); proto.constructor = NewClass; NewClass.prototype = proto; //inherit parent's statics for (var i in this) { if (this.hasOwnProperty(i) && i !== 'prototype') { NewClass[i] = this[i]; } } // mix static properties into the class if (props.statics) { L.extend(NewClass, props.statics); delete props.statics; } // mix includes into the prototype if (props.includes) { L.Util.extend.apply(null, [proto].concat(props.includes)); delete props.includes; } // merge options if (props.options && proto.options) { props.options = L.extend({}, proto.options, props.options); } // mix given properties into the prototype L.extend(proto, props); proto._initHooks = []; var parent = this; // add method for calling all hooks proto.callInitHooks = function () { if (this._initHooksCalled) { return; } if (parent.prototype.callInitHooks) { parent.prototype.callInitHooks.call(this); } this._initHooksCalled = true; for (var i = 0, len = proto._initHooks.length; i < len; i++) { proto._initHooks[i].call(this); } }; return NewClass; }; // method for adding properties to prototype L.Class.include = function (props) { L.extend(this.prototype, props); }; // merge new default options to the Class L.Class.mergeOptions = function (options) { L.extend(this.prototype.options, options); }; // add a constructor hook L.Class.addInitHook = function (fn) { // (Function) || (String, args...) var args = Array.prototype.slice.call(arguments, 1); var init = typeof fn === 'function' ? fn : function () { this[fn].apply(this, args); }; this.prototype._initHooks = this.prototype._initHooks || []; this.prototype._initHooks.push(init); }; /* * L.Mixin.Events is used to add custom events functionality to Leaflet classes. */ var key = '_leaflet_events'; L.Mixin = {}; L.Mixin.Events = { addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object]) var events = this[key] = this[key] || {}, type, i, len; // Types can be a map of types/handlers if (typeof types === 'object') { for (type in types) { if (types.hasOwnProperty(type)) { this.addEventListener(type, types[type], fn); } } return this; } types = L.Util.splitWords(types); for (i = 0, len = types.length; i < len; i++) { events[types[i]] = events[types[i]] || []; events[types[i]].push({ action: fn, context: context || this }); } return this; }, hasEventListeners: function (type) { // (String) -> Boolean return (key in this) && (type in this[key]) && (this[key][type].length > 0); }, removeEventListener: function (types, fn, context) { // (String[, Function, Object]) or (Object[, Object]) var events = this[key], type, i, len, listeners, j; if (typeof types === 'object') { for (type in types) { if (types.hasOwnProperty(type)) { this.removeEventListener(type, types[type], fn); } } return this; } types = L.Util.splitWords(types); for (i = 0, len = types.length; i < len; i++) { if (this.hasEventListeners(types[i])) { listeners = events[types[i]]; for (j = listeners.length - 1; j >= 0; j--) { if ( (!fn || listeners[j].action === fn) && (!context || (listeners[j].context === context)) ) { listeners.splice(j, 1); } } } } return this; }, fireEvent: function (type, data) { // (String[, Object]) if (!this.hasEventListeners(type)) { return this; } var event = L.extend({ type: type, target: this }, data); var listeners = this[key][type].slice(); for (var i = 0, len = listeners.length; i < len; i++) { listeners[i].action.call(listeners[i].context || this, event); } return this; } }; L.Mixin.Events.on = L.Mixin.Events.addEventListener; L.Mixin.Events.off = L.Mixin.Events.removeEventListener; L.Mixin.Events.fire = L.Mixin.Events.fireEvent; /* * L.Browser handles different browser and feature detections for internal Leaflet use. */ (function () { var ie = !!window.ActiveXObject, ie6 = ie && !window.XMLHttpRequest, ie7 = ie && !document.querySelector, // terrible browser detection to work around Safari / iOS / Android browser bugs ua = navigator.userAgent.toLowerCase(), webkit = ua.indexOf('webkit') !== -1, chrome = ua.indexOf('chrome') !== -1, android = ua.indexOf('android') !== -1, android23 = ua.search('android [23]') !== -1, mobile = typeof orientation !== undefined + '', msTouch = window.navigator && window.navigator.msPointerEnabled && window.navigator.msMaxTouchPoints, retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) || ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') && window.matchMedia('(min-resolution:144dpi)').matches), doc = document.documentElement, ie3d = ie && ('transition' in doc.style), webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()), gecko3d = 'MozPerspective' in doc.style, opera3d = 'OTransition' in doc.style, any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d); var touch = !window.L_NO_TOUCH && (function () { var startName = 'ontouchstart'; // IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.MsTouch) or WebKit, etc. if (msTouch || (startName in doc)) { return true; } // Firefox/Gecko var div = document.createElement('div'), supported = false; if (!div.setAttribute) { return false; } div.setAttribute(startName, 'return;'); if (typeof div[startName] === 'function') { supported = true; } div.removeAttribute(startName); div = null; return supported; }()); L.Browser = { ie: ie, ie6: ie6, ie7: ie7, webkit: webkit, android: android, android23: android23, chrome: chrome, ie3d: ie3d, webkit3d: webkit3d, gecko3d: gecko3d, opera3d: opera3d, any3d: any3d, mobile: mobile, mobileWebkit: mobile && webkit, mobileWebkit3d: mobile && webkit3d, mobileOpera: mobile && window.opera, touch: touch, msTouch: msTouch, retina: retina }; }()); /* * L.Point represents a point with x and y coordinates. */ L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) { this.x = (round ? Math.round(x) : x); this.y = (round ? Math.round(y) : y); }; L.Point.prototype = { clone: function () { return new L.Point(this.x, this.y); }, // non-destructive, returns a new point add: function (point) { return this.clone()._add(L.point(point)); }, // destructive, used directly for performance in situations where it's safe to modify existing point _add: function (point) { this.x += point.x; this.y += point.y; return this; }, subtract: function (point) { return this.clone()._subtract(L.point(point)); }, _subtract: function (point) { this.x -= point.x; this.y -= point.y; return this; }, divideBy: function (num) { return this.clone()._divideBy(num); }, _divideBy: function (num) { this.x /= num; this.y /= num; return this; }, multiplyBy: function (num) { return this.clone()._multiplyBy(num); }, _multiplyBy: function (num) { this.x *= num; this.y *= num; return this; }, round: function () { return this.clone()._round(); }, _round: function () { this.x = Math.round(this.x); this.y = Math.round(this.y); return this; }, floor: function () { return this.clone()._floor(); }, _floor: function () { this.x = Math.floor(this.x); this.y = Math.floor(this.y); return this; }, distanceTo: function (point) { point = L.point(point); var x = point.x - this.x, y = point.y - this.y; return Math.sqrt(x * x + y * y); }, equals: function (point) { return point.x === this.x && point.y === this.y; }, toString: function () { return 'Point(' + L.Util.formatNum(this.x) + ', ' + L.Util.formatNum(this.y) + ')'; } }; L.point = function (x, y, round) { if (x instanceof L.Point) { return x; } if (L.Util.isArray(x)) { return new L.Point(x[0], x[1]); } if (isNaN(x)) { return x; } return new L.Point(x, y, round); }; /* * L.Bounds represents a rectangular area on the screen in pixel coordinates. */ L.Bounds = function (a, b) { //(Point, Point) or Point[] if (!a) { return; } var points = b ? [a, b] : a; for (var i = 0, len = points.length; i < len; i++) { this.extend(points[i]); } }; L.Bounds.prototype = { // extend the bounds to contain the given point extend: function (point) { // (Point) point = L.point(point); if (!this.min && !this.max) { this.min = point.clone(); this.max = point.clone(); } else { this.min.x = Math.min(point.x, this.min.x); this.max.x = Math.max(point.x, this.max.x); this.min.y = Math.min(point.y, this.min.y); this.max.y = Math.max(point.y, this.max.y); } return this; }, getCenter: function (round) { // (Boolean) -> Point return new L.Point( (this.min.x + this.max.x) / 2, (this.min.y + this.max.y) / 2, round); }, getBottomLeft: function () { // -> Point return new L.Point(this.min.x, this.max.y); }, getTopRight: function () { // -> Point return new L.Point(this.max.x, this.min.y); }, getSize: function () { return this.max.subtract(this.min); }, contains: function (obj) { // (Bounds) or (Point) -> Boolean var min, max; if (typeof obj[0] === 'number' || obj instanceof L.Point) { obj = L.point(obj); } else { obj = L.bounds(obj); } if (obj instanceof L.Bounds) { min = obj.min; max = obj.max; } else { min = max = obj; } return (min.x >= this.min.x) && (max.x <= this.max.x) && (min.y >= this.min.y) && (max.y <= this.max.y); }, intersects: function (bounds) { // (Bounds) -> Boolean bounds = L.bounds(bounds); var min = this.min, max = this.max, min2 = bounds.min, max2 = bounds.max, xIntersects = (max2.x >= min.x) && (min2.x <= max.x), yIntersects = (max2.y >= min.y) && (min2.y <= max.y); return xIntersects && yIntersects; }, isValid: function () { return !!(this.min && this.max); } }; L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[]) if (!a || a instanceof L.Bounds) { return a; } return new L.Bounds(a, b); }; /* * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix. */ L.Transformation = function (a, b, c, d) { this._a = a; this._b = b; this._c = c; this._d = d; }; L.Transformation.prototype = { transform: function (point, scale) { // (Point, Number) -> Point return this._transform(point.clone(), scale); }, // destructive transform (faster) _transform: function (point, scale) { scale = scale || 1; point.x = scale * (this._a * point.x + this._b); point.y = scale * (this._c * point.y + this._d); return point; }, untransform: function (point, scale) { scale = scale || 1; return new L.Point( (point.x / scale - this._b) / this._a, (point.y / scale - this._d) / this._c); } }; /* * L.DomUtil contains various utility functions for working with DOM. */ L.DomUtil = { get: function (id) { return (typeof id === 'string' ? document.getElementById(id) : id); }, getStyle: function (el, style) { var value = el.style[style]; if (!value && el.currentStyle) { value = el.currentStyle[style]; } if ((!value || value === 'auto') && document.defaultView) { var css = document.defaultView.getComputedStyle(el, null); value = css ? css[style] : null; } return value === 'auto' ? null : value; }, getViewportOffset: function (element) { var top = 0, left = 0, el = element, docBody = document.body, pos, ie7 = L.Browser.ie7; do { top += el.offsetTop || 0; left += el.offsetLeft || 0; //add borders top += parseInt(L.DomUtil.getStyle(el, "borderTopWidth"), 10) || 0; left += parseInt(L.DomUtil.getStyle(el, "borderLeftWidth"), 10) || 0; pos = L.DomUtil.getStyle(el, 'position'); if (el.offsetParent === docBody && pos === 'absolute') { break; } if (pos === 'fixed') { top += docBody.scrollTop || 0; left += docBody.scrollLeft || 0; break; } el = el.offsetParent; } while (el); el = element; do { if (el === docBody) { break; } top -= el.scrollTop || 0; left -= el.scrollLeft || 0; // webkit (and ie <= 7) handles RTL scrollLeft different to everyone else // https://code.google.com/p/closure-library/source/browse/trunk/closure/goog/style/bidi.js if (!L.DomUtil.documentIsLtr() && (L.Browser.webkit || ie7)) { left += el.scrollWidth - el.clientWidth; // ie7 shows the scrollbar by default and provides clientWidth counting it, so we // need to add it back in if it is visible; scrollbar is on the left as we are RTL if (ie7 && L.DomUtil.getStyle(el, 'overflow-y') !== 'hidden' && L.DomUtil.getStyle(el, 'overflow') !== 'hidden') { left += 17; } } el = el.parentNode; } while (el); return new L.Point(left, top); }, documentIsLtr: function () { if (!L.DomUtil._docIsLtrCached) { L.DomUtil._docIsLtrCached = true; L.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === "ltr"; } return L.DomUtil._docIsLtr; }, create: function (tagName, className, container) { var el = document.createElement(tagName); el.className = className; if (container) { container.appendChild(el); } return el; }, disableTextSelection: function () { if (document.selection && document.selection.empty) { document.selection.empty(); } if (!this._onselectstart) { this._onselectstart = document.onselectstart || null; document.onselectstart = L.Util.falseFn; } }, enableTextSelection: function () { if (document.onselectstart === L.Util.falseFn) { document.onselectstart = this._onselectstart; this._onselectstart = null; } }, hasClass: function (el, name) { return (el.className.length > 0) && new RegExp("(^|\\s)" + name + "(\\s|$)").test(el.className); }, addClass: function (el, name) { if (!L.DomUtil.hasClass(el, name)) { el.className += (el.className ? ' ' : '') + name; } }, removeClass: function (el, name) { function replaceFn(w, match) { if (match === name) { return ''; } return w; } el.className = el.className .replace(/(\S+)\s*/g, replaceFn) .replace(/(^\s+|\s+$)/, ''); }, setOpacity: function (el, value) { if ('opacity' in el.style) { el.style.opacity = value; } else if ('filter' in el.style) { var filter = false, filterName = 'DXImageTransform.Microsoft.Alpha'; // filters collection throws an error if we try to retrieve a filter that doesn't exist try { filter = el.filters.item(filterName); } catch (e) {} value = Math.round(value * 100); if (filter) { filter.Enabled = (value !== 100); filter.Opacity = value; } else { el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; } } }, testProp: function (props) { var style = document.documentElement.style; for (var i = 0; i < props.length; i++) { if (props[i] in style) { return props[i]; } } return false; }, getTranslateString: function (point) { // on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate // makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care // (same speed either way), Opera 12 doesn't support translate3d var is3d = L.Browser.webkit3d, open = 'translate' + (is3d ? '3d' : '') + '(', close = (is3d ? ',0' : '') + ')'; return open + point.x + 'px,' + point.y + 'px' + close; }, getScaleString: function (scale, origin) { var preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))), scaleStr = ' scale(' + scale + ') '; return preTranslateStr + scaleStr; }, setPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean]) el._leaflet_pos = point; if (!disable3D && L.Browser.any3d) { el.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point); // workaround for Android 2/3 stability (https://github.com/CloudMade/Leaflet/issues/69) if (L.Browser.mobileWebkit3d) { el.style.WebkitBackfaceVisibility = 'hidden'; } } else { el.style.left = point.x + 'px'; el.style.top = point.y + 'px'; } }, getPosition: function (el) { // this method is only used for elements previously positioned using setPosition, // so it's safe to cache the position for performance return el._leaflet_pos; } }; // prefix style property names L.DomUtil.TRANSFORM = L.DomUtil.testProp( ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']); // webkitTransition comes first because some browser versions that drop vendor prefix don't do // the same for the transitionend event, in particular the Android 4.1 stock browser L.DomUtil.TRANSITION = L.DomUtil.testProp( ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); L.DomUtil.TRANSITION_END = L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ? L.DomUtil.TRANSITION + 'End' : 'transitionend'; /* * L.LatLng represents a geographical point with latitude and longitude coordinates. */ L.LatLng = function (rawLat, rawLng) { // (Number, Number) var lat = parseFloat(rawLat), lng = parseFloat(rawLng); if (isNaN(lat) || isNaN(lng)) { throw new Error('Invalid LatLng object: (' + rawLat + ', ' + rawLng + ')'); } this.lat = lat; this.lng = lng; }; L.extend(L.LatLng, { DEG_TO_RAD: Math.PI / 180, RAD_TO_DEG: 180 / Math.PI, MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check }); L.LatLng.prototype = { equals: function (obj) { // (LatLng) -> Boolean if (!obj) { return false; } obj = L.latLng(obj); var margin = Math.max( Math.abs(this.lat - obj.lat), Math.abs(this.lng - obj.lng)); return margin <= L.LatLng.MAX_MARGIN; }, toString: function (precision) { // (Number) -> String return 'LatLng(' + L.Util.formatNum(this.lat, precision) + ', ' + L.Util.formatNum(this.lng, precision) + ')'; }, // Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula // TODO move to projection code, LatLng shouldn't know about Earth distanceTo: function (other) { // (LatLng) -> Number other = L.latLng(other); var R = 6378137, // earth radius in meters d2r = L.LatLng.DEG_TO_RAD, dLat = (other.lat - this.lat) * d2r, dLon = (other.lng - this.lng) * d2r, lat1 = this.lat * d2r, lat2 = other.lat * d2r, sin1 = Math.sin(dLat / 2), sin2 = Math.sin(dLon / 2); var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2); return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); }, wrap: function (a, b) { // (Number, Number) -> LatLng var lng = this.lng; a = a || -180; b = b || 180; lng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a); return new L.LatLng(this.lat, lng); } }; L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number) if (a instanceof L.LatLng) { return a; } if (L.Util.isArray(a)) { return new L.LatLng(a[0], a[1]); } if (isNaN(a)) { return a; } return new L.LatLng(a, b); }; /* * L.LatLngBounds represents a rectangular area on the map in geographical coordinates. */ L.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[]) if (!southWest) { return; } var latlngs = northEast ? [southWest, northEast] : southWest; for (var i = 0, len = latlngs.length; i < len; i++) { this.extend(latlngs[i]); } }; L.LatLngBounds.prototype = { // extend the bounds to contain the given point or bounds extend: function (obj) { // (LatLng) or (LatLngBounds) if (typeof obj[0] === 'number' || typeof obj[0] === 'string' || obj instanceof L.LatLng) { obj = L.latLng(obj); } else { obj = L.latLngBounds(obj); } if (obj instanceof L.LatLng) { if (!this._southWest && !this._northEast) { this._southWest = new L.LatLng(obj.lat, obj.lng); this._northEast = new L.LatLng(obj.lat, obj.lng); } else { this._southWest.lat = Math.min(obj.lat, this._southWest.lat); this._southWest.lng = Math.min(obj.lng, this._southWest.lng); this._northEast.lat = Math.max(obj.lat, this._northEast.lat); this._northEast.lng = Math.max(obj.lng, this._northEast.lng); } } else if (obj instanceof L.LatLngBounds) { this.extend(obj._southWest); this.extend(obj._northEast); } return this; }, // extend the bounds by a percentage pad: function (bufferRatio) { // (Number) -> LatLngBounds var sw = this._southWest, ne = this._northEast, heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio, widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio; return new L.LatLngBounds( new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer), new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer)); }, getCenter: function () { // -> LatLng return new L.LatLng( (this._southWest.lat + this._northEast.lat) / 2, (this._southWest.lng + this._northEast.lng) / 2); }, getSouthWest: function () { return this._southWest; }, getNorthEast: function () { return this._northEast; }, getNorthWest: function () { return new L.LatLng(this._northEast.lat, this._southWest.lng); }, getSouthEast: function () { return new L.LatLng(this._southWest.lat, this._northEast.lng); }, contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean if (typeof obj[0] === 'number' || obj instanceof L.LatLng) { obj = L.latLng(obj); } else { obj = L.latLngBounds(obj); } var sw = this._southWest, ne = this._northEast, sw2, ne2; if (obj instanceof L.LatLngBounds) { sw2 = obj.getSouthWest(); ne2 = obj.getNorthEast(); } else { sw2 = ne2 = obj; } return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) && (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng); }, intersects: function (bounds) { // (LatLngBounds) bounds = L.latLngBounds(bounds); var sw = this._southWest, ne = this._northEast, sw2 = bounds.getSouthWest(), ne2 = bounds.getNorthEast(), latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat), lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng); return latIntersects && lngIntersects; }, toBBoxString: function () { var sw = this._southWest, ne = this._northEast; return [sw.lng, sw.lat, ne.lng, ne.lat].join(','); }, equals: function (bounds) { // (LatLngBounds) if (!bounds) { return false; } bounds = L.latLngBounds(bounds); return this._southWest.equals(bounds.getSouthWest()) && this._northEast.equals(bounds.getNorthEast()); }, isValid: function () { return !!(this._southWest && this._northEast); } }; //TODO International date line? L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng) if (!a || a instanceof L.LatLngBounds) { return a; } return new L.LatLngBounds(a, b); }; /* * L.Projection contains various geographical projections used by CRS classes. */ L.Projection = {}; /* * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default. */ L.Projection.SphericalMercator = { MAX_LATITUDE: 85.0511287798, project: function (latlng) { // (LatLng) -> Point var d = L.LatLng.DEG_TO_RAD, max = this.MAX_LATITUDE, lat = Math.max(Math.min(max, latlng.lat), -max), x = latlng.lng * d, y = lat * d; y = Math.log(Math.tan((Math.PI / 4) + (y / 2))); return new L.Point(x, y); }, unproject: function (point) { // (Point, Boolean) -> LatLng var d = L.LatLng.RAD_TO_DEG, lng = point.x * d, lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d; return new L.LatLng(lat, lng); } }; /* * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple. */ L.Projection.LonLat = { project: function (latlng) { return new L.Point(latlng.lng, latlng.lat); }, unproject: function (point) { return new L.LatLng(point.y, point.x); } }; /* * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet. */ L.CRS = { latLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point var projectedPoint = this.projection.project(latlng), scale = this.scale(zoom); return this.transformation._transform(projectedPoint, scale); }, pointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng var scale = this.scale(zoom), untransformedPoint = this.transformation.untransform(point, scale); return this.projection.unproject(untransformedPoint); }, project: function (latlng) { return this.projection.project(latlng); }, scale: function (zoom) { return 256 * Math.pow(2, zoom); } }; /* * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps. */ L.CRS.Simple = L.extend({}, L.CRS, { projection: L.Projection.LonLat, transformation: new L.Transformation(1, 0, -1, 0), scale: function (zoom) { return Math.pow(2, zoom); } }); /* * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping * and is used by Leaflet by default. */ L.CRS.EPSG3857 = L.extend({}, L.CRS, { code: 'EPSG:3857', projection: L.Projection.SphericalMercator, transformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5), project: function (latlng) { // (LatLng) -> Point var projectedPoint = this.projection.project(latlng), earthRadius = 6378137; return projectedPoint.multiplyBy(earthRadius); } }); L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, { code: 'EPSG:900913' }); /* * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists. */ L.CRS.EPSG4326 = L.extend({}, L.CRS, { code: 'EPSG:4326', projection: L.Projection.LonLat, transformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5) }); /* * L.Map is the central class of the API - it is used to create a map. */ L.Map = L.Class.extend({ includes: L.Mixin.Events, options: { crs: L.CRS.EPSG3857, /* center: LatLng, zoom: Number, layers: Array, */ fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23, trackResize: true, markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d }, initialize: function (id, options) { // (HTMLElement or String, Object) options = L.setOptions(this, options); this._initContainer(id); this._initLayout(); this.callInitHooks(); this._initEvents(); if (options.maxBounds) { this.setMaxBounds(options.maxBounds); } if (options.center && options.zoom !== undefined) { this.setView(L.latLng(options.center), options.zoom, true); } this._initLayers(options.layers); }, // public methods that modify map state // replaced by animation-powered implementation in Map.PanAnimation.js setView: function (center, zoom) { this._resetView(L.latLng(center), this._limitZoom(zoom)); return this; }, setZoom: function (zoom) { // (Number) return this.setView(this.getCenter(), zoom); }, zoomIn: function (delta) { return this.setZoom(this._zoom + (delta || 1)); }, zoomOut: function (delta) { return this.setZoom(this._zoom - (delta || 1)); }, fitBounds: function (bounds) { // (LatLngBounds) var zoom = this.getBoundsZoom(bounds); return this.setView(L.latLngBounds(bounds).getCenter(), zoom); }, fitWorld: function () { var sw = new L.LatLng(-60, -170), ne = new L.LatLng(85, 179); return this.fitBounds(new L.LatLngBounds(sw, ne)); }, panTo: function (center) { // (LatLng) return this.setView(center, this._zoom); }, panBy: function (offset) { // (Point) // replaced with animated panBy in Map.Animation.js this.fire('movestart'); this._rawPanBy(L.point(offset)); this.fire('move'); return this.fire('moveend'); }, setMaxBounds: function (bounds) { bounds = L.latLngBounds(bounds); this.options.maxBounds = bounds; if (!bounds) { this._boundsMinZoom = null; return this; } var minZoom = this.getBoundsZoom(bounds, true); this._boundsMinZoom = minZoom; if (this._loaded) { if (this._zoom < minZoom) { this.setView(bounds.getCenter(), minZoom); } else { this.panInsideBounds(bounds); } } return this; }, panInsideBounds: function (bounds) { bounds = L.latLngBounds(bounds); var viewBounds = this.getBounds(), viewSw = this.project(viewBounds.getSouthWest()), viewNe = this.project(viewBounds.getNorthEast()), sw = this.project(bounds.getSouthWest()), ne = this.project(bounds.getNorthEast()), dx = 0, dy = 0; if (viewNe.y < ne.y) { // north dy = ne.y - viewNe.y; } if (viewNe.x > ne.x) { // east dx = ne.x - viewNe.x; } if (viewSw.y > sw.y) { // south dy = sw.y - viewSw.y; } if (viewSw.x < sw.x) { // west dx = sw.x - viewSw.x; } return this.panBy(new L.Point(dx, dy, true)); }, addLayer: function (layer) { // TODO method is too big, refactor var id = L.stamp(layer); if (this._layers[id]) { return this; } this._layers[id] = layer; // TODO getMaxZoom, getMinZoom in ILayer (instead of options) if (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) { this._zoomBoundLayers[id] = layer; this._updateZoomLevels(); } // TODO looks ugly, refactor!!! if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { this._tileLayersNum++; this._tileLayersToLoad++; layer.on('load', this._onTileLayerLoad, this); } this.whenReady(function () { layer.onAdd(this); this.fire('layeradd', {layer: layer}); }, this); return this; }, removeLayer: function (layer) { var id = L.stamp(layer); if (!this._layers[id]) { return; } layer.onRemove(this); delete this._layers[id]; if (this._zoomBoundLayers[id]) { delete this._zoomBoundLayers[id]; this._updateZoomLevels(); } // TODO looks ugly, refactor if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { this._tileLayersNum--; this._tileLayersToLoad--; layer.off('load', this._onTileLayerLoad, this); } return this.fire('layerremove', {layer: layer}); }, hasLayer: function (layer) { var id = L.stamp(layer); return this._layers.hasOwnProperty(id); }, invalidateSize: function (animate) { var oldSize = this.getSize(); this._sizeChanged = true; if (this.options.maxBounds) { this.setMaxBounds(this.options.maxBounds); } if (!this._loaded) { return this; } var offset = oldSize._subtract(this.getSize())._divideBy(2)._round(); if (animate === true) { this.panBy(offset); } else { this._rawPanBy(offset); this.fire('move'); clearTimeout(this._sizeTimer); this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); } return this; }, // TODO handler.addTo addHandler: function (name, HandlerClass) { if (!HandlerClass) { return; } this[name] = new HandlerClass(this); if (this.options[name]) { this[name].enable(); } return this; }, // public methods for getting map state getCenter: function () { // (Boolean) -> LatLng return this.layerPointToLatLng(this._getCenterLayerPoint()); }, getZoom: function () { return this._zoom; }, getBounds: function () { var bounds = this.getPixelBounds(), sw = this.unproject(bounds.getBottomLeft()), ne = this.unproject(bounds.getTopRight()); return new L.LatLngBounds(sw, ne); }, getMinZoom: function () { var z1 = this.options.minZoom || 0, z2 = this._layersMinZoom || 0, z3 = this._boundsMinZoom || 0; return Math.max(z1, z2, z3); }, getMaxZoom: function () { var z1 = this.options.maxZoom === undefined ? Infinity : this.options.maxZoom, z2 = this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom; return Math.min(z1, z2); }, getBoundsZoom: function (bounds, inside) { // (LatLngBounds, Boolean) -> Number bounds = L.latLngBounds(bounds); var size = this.getSize(), zoom = this.options.minZoom || 0, maxZoom = this.getMaxZoom(), ne = bounds.getNorthEast(), sw = bounds.getSouthWest(), boundsSize, nePoint, swPoint, zoomNotFound = true; if (inside) { zoom--; } do { zoom++; nePoint = this.project(ne, zoom); swPoint = this.project(sw, zoom); boundsSize = new L.Point( Math.abs(nePoint.x - swPoint.x), Math.abs(swPoint.y - nePoint.y)); if (!inside) { zoomNotFound = boundsSize.x <= size.x && boundsSize.y <= size.y; } else { zoomNotFound = boundsSize.x < size.x || boundsSize.y < size.y; } } while (zoomNotFound && zoom <= maxZoom); if (zoomNotFound && inside) { return null; } return inside ? zoom : zoom - 1; }, getSize: function () { if (!this._size || this._sizeChanged) { this._size = new L.Point( this._container.clientWidth, this._container.clientHeight); this._sizeChanged = false; } return this._size.clone(); }, getPixelBounds: function () { var topLeftPoint = this._getTopLeftPoint(); return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize())); }, getPixelOrigin: function () { return this._initialTopLeftPoint; }, getPanes: function () { return this._panes; }, getContainer: function () { return this._container; }, // TODO replace with universal implementation after refactoring projections getZoomScale: function (toZoom) { var crs = this.options.crs; return crs.scale(toZoom) / crs.scale(this._zoom); }, getScaleZoom: function (scale) { return this._zoom + (Math.log(scale) / Math.LN2); }, // conversion methods project: function (latlng, zoom) { // (LatLng[, Number]) -> Point zoom = zoom === undefined ? this._zoom : zoom; return this.options.crs.latLngToPoint(L.latLng(latlng), zoom); }, unproject: function (point, zoom) { // (Point[, Number]) -> LatLng zoom = zoom === undefined ? this._zoom : zoom; return this.options.crs.pointToLatLng(L.point(point), zoom); }, layerPointToLatLng: function (point) { // (Point) var projectedPoint = L.point(point).add(this._initialTopLeftPoint); return this.unproject(projectedPoint); }, latLngToLayerPoint: function (latlng) { // (LatLng) var projectedPoint = this.project(L.latLng(latlng))._round(); return projectedPoint._subtract(this._initialTopLeftPoint); }, containerPointToLayerPoint: function (point) { // (Point) return L.point(point).subtract(this._getMapPanePos()); }, layerPointToContainerPoint: function (point) { // (Point) return L.point(point).add(this._getMapPanePos()); }, containerPointToLatLng: function (point) { var layerPoint = this.containerPointToLayerPoint(L.point(point)); return this.layerPointToLatLng(layerPoint); }, latLngToContainerPoint: function (latlng) { return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng))); }, mouseEventToContainerPoint: function (e) { // (MouseEvent) return L.DomEvent.getMousePosition(e, this._container); }, mouseEventToLayerPoint: function (e) { // (MouseEvent) return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e)); }, mouseEventToLatLng: function (e) { // (MouseEvent) return this.layerPointToLatLng(this.mouseEventToLayerPoint(e)); }, // map initialization methods _initContainer: function (id) { var container = this._container = L.DomUtil.get(id); if (container._leaflet) { throw new Error("Map container is already initialized."); } container._leaflet = true; }, _initLayout: function () { var container = this._container; L.DomUtil.addClass(container, 'leaflet-container'); if (L.Browser.touch) { L.DomUtil.addClass(container, 'leaflet-touch'); } if (this.options.fadeAnimation) { L.DomUtil.addClass(container, 'leaflet-fade-anim'); } var position = L.DomUtil.getStyle(container, 'position'); if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') { container.style.position = 'relative'; } this._initPanes(); if (this._initControlPos) { this._initControlPos(); } }, _initPanes: function () { var panes = this._panes = {}; this._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container); this._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane); panes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane); panes.shadowPane = this._createPane('leaflet-shadow-pane'); panes.overlayPane = this._createPane('leaflet-overlay-pane'); panes.markerPane = this._createPane('leaflet-marker-pane'); panes.popupPane = this._createPane('leaflet-popup-pane'); var zoomHide = ' leaflet-zoom-hide'; if (!this.options.markerZoomAnimation) { L.DomUtil.addClass(panes.markerPane, zoomHide); L.DomUtil.addClass(panes.shadowPane, zoomHide); L.DomUtil.addClass(panes.popupPane, zoomHide); } }, _createPane: function (className, container) { return L.DomUtil.create('div', className, container || this._panes.objectsPane); }, _initLayers: function (layers) { layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : []; this._layers = {}; this._zoomBoundLayers = {}; this._tileLayersNum = 0; var i, len; for (i = 0, len = layers.length; i < len; i++) { this.addLayer(layers[i]); } }, // private methods that modify map state _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) { var zoomChanged = (this._zoom !== zoom); if (!afterZoomAnim) { this.fire('movestart'); if (zoomChanged) { this.fire('zoomstart'); } } this._zoom = zoom; this._initialTopLeftPoint = this._getNewTopLeftPoint(center); if (!preserveMapOffset) { L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); } else { this._initialTopLeftPoint._add(this._getMapPanePos()); } this._tileLayersToLoad = this._tileLayersNum; var loading = !this._loaded; this._loaded = true; this.fire('viewreset', {hard: !preserveMapOffset}); this.fire('move'); if (zoomChanged || afterZoomAnim) { this.fire('zoomend'); } this.fire('moveend', {hard: !preserveMapOffset}); if (loading) { this.fire('load'); } }, _rawPanBy: function (offset) { L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset)); }, _updateZoomLevels: function () { var i, minZoom = Infinity, maxZoom = -Infinity; for (i in this._zoomBoundLayers) { if (this._zoomBoundLayers.hasOwnProperty(i)) { var layer = this._zoomBoundLayers[i]; if (!isNaN(layer.options.minZoom)) { minZoom = Math.min(minZoom, layer.options.minZoom); } if (!isNaN(layer.options.maxZoom)) { maxZoom = Math.max(maxZoom, layer.options.maxZoom); } } } if (i === undefined) { // we have no tilelayers this._layersMaxZoom = this._layersMinZoom = undefined; } else { this._layersMaxZoom = maxZoom; this._layersMinZoom = minZoom; } }, // map events _initEvents: function () { if (!L.DomEvent) { return; } L.DomEvent.on(this._container, 'click', this._onMouseClick, this); var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter', 'mouseleave', 'mousemove', 'contextmenu'], i, len; for (i = 0, len = events.length; i < len; i++) { L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this); } if (this.options.trackResize) { L.DomEvent.on(window, 'resize', this._onResize, this); } }, _onResize: function () { L.Util.cancelAnimFrame(this._resizeRequest); this._resizeRequest = L.Util.requestAnimFrame( this.invalidateSize, this, false, this._container); }, _onMouseClick: function (e) { if (!this._loaded || (this.dragging && this.dragging.moved())) { return; } this.fire('preclick'); this._fireMouseEvent(e); }, _fireMouseEvent: function (e) { if (!this._loaded) { return; } var type = e.type; type = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type)); if (!this.hasEventListeners(type)) { return; } if (type === 'contextmenu') { L.DomEvent.preventDefault(e); } var containerPoint = this.mouseEventToContainerPoint(e), layerPoint = this.containerPointToLayerPoint(containerPoint), latlng = this.layerPointToLatLng(layerPoint); this.fire(type, { latlng: latlng, layerPoint: layerPoint, containerPoint: containerPoint, originalEvent: e }); }, _onTileLayerLoad: function () { // TODO super-ugly, refactor!!! // clear scaled tiles after all new tiles are loaded (for performance) this._tileLayersToLoad--; if (this._tileLayersNum && !this._tileLayersToLoad && this._tileBg) { clearTimeout(this._clearTileBgTimer); this._clearTileBgTimer = setTimeout(L.bind(this._clearTileBg, this), 500); } }, whenReady: function (callback, context) { if (this._loaded) { callback.call(context || this, this); } else { this.on('load', callback, context); } return this; }, // private methods for getting map state _getMapPanePos: function () { return L.DomUtil.getPosition(this._mapPane); }, _getTopLeftPoint: function () { if (!this._loaded) { throw new Error('Set map center and zoom first.'); } return this._initialTopLeftPoint.subtract(this._getMapPanePos()); }, _getNewTopLeftPoint: function (center, zoom) { var viewHalf = this.getSize()._divideBy(2); // TODO round on display, not calculation to increase precision? return this.project(center, zoom)._subtract(viewHalf)._round(); }, _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) { var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos()); return this.project(latlng, newZoom)._subtract(topLeft); }, _getCenterLayerPoint: function () { return this.containerPointToLayerPoint(this.getSize()._divideBy(2)); }, _getCenterOffset: function (center) { return this.latLngToLayerPoint(center).subtract(this._getCenterLayerPoint()); }, _limitZoom: function (zoom) { var min = this.getMinZoom(), max = this.getMaxZoom(); return Math.max(min, Math.min(max, zoom)); } }); L.map = function (id, options) { return new L.Map(id, options); }; /* * Mercator projection that takes into account that the Earth is not a perfect sphere. * Less popular than spherical mercator; used by projections like EPSG:3395. */ L.Projection.Mercator = { MAX_LATITUDE: 85.0840591556, R_MINOR: 6356752.3142, R_MAJOR: 6378137, project: function (latlng) { // (LatLng) -> Point var d = L.LatLng.DEG_TO_RAD, max = this.MAX_LATITUDE, lat = Math.max(Math.min(max, latlng.lat), -max), r = this.R_MAJOR, r2 = this.R_MINOR, x = latlng.lng * d * r, y = lat * d, tmp = r2 / r, eccent = Math.sqrt(1.0 - tmp * tmp), con = eccent * Math.sin(y); con = Math.pow((1 - con) / (1 + con), eccent * 0.5); var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con; y = -r2 * Math.log(ts); return new L.Point(x, y); }, unproject: function (point) { // (Point, Boolean) -> LatLng var d = L.LatLng.RAD_TO_DEG, r = this.R_MAJOR, r2 = this.R_MINOR, lng = point.x * d / r, tmp = r2 / r, eccent = Math.sqrt(1 - (tmp * tmp)), ts = Math.exp(- point.y / r2), phi = (Math.PI / 2) - 2 * Math.atan(ts), numIter = 15, tol = 1e-7, i = numIter, dphi = 0.1, con; while ((Math.abs(dphi) > tol) && (--i > 0)) { con = eccent * Math.sin(phi); dphi = (Math.PI / 2) - 2 * Math.atan(ts * Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi; phi += dphi; } return new L.LatLng(phi * d, lng); } }; L.CRS.EPSG3395 = L.extend({}, L.CRS, { code: 'EPSG:3395', projection: L.Projection.Mercator, transformation: (function () { var m = L.Projection.Mercator, r = m.R_MAJOR, r2 = m.R_MINOR; return new L.Transformation(0.5 / (Math.PI * r), 0.5, -0.5 / (Math.PI * r2), 0.5); }()) }); /* * L.TileLayer is used for standard xyz-numbered tile layers. */ L.TileLayer = L.Class.extend({ includes: L.Mixin.Events, options: { minZoom: 0, maxZoom: 18, tileSize: 256, subdomains: 'abc', errorTileUrl: '', attribution: '', zoomOffset: 0, opacity: 1, /* (undefined works too) zIndex: null, tms: false, continuousWorld: false, noWrap: false, zoomReverse: false, detectRetina: false, reuseTiles: false, */ unloadInvisibleTiles: L.Browser.mobile, updateWhenIdle: L.Browser.mobile }, initialize: function (url, options) { options = L.setOptions(this, options); // detecting retina displays, adjusting tileSize and zoom levels if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) { options.tileSize = Math.floor(options.tileSize / 2); options.zoomOffset++; if (options.minZoom > 0) { options.minZoom--; } this.options.maxZoom--; } this._url = url; var subdomains = this.options.subdomains; if (typeof subdomains === 'string') { this.options.subdomains = subdomains.split(''); } }, onAdd: function (map) { this._map = map; // create a container div for tiles this._initContainer(); // create an image to clone for tiles this._createTileProto(); // set up events map.on({ 'viewreset': this._resetCallback, 'moveend': this._update }, this); if (!this.options.updateWhenIdle) { this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this); map.on('move', this._limitedUpdate, this); } this._reset(); this._update(); }, addTo: function (map) { map.addLayer(this); return this; }, onRemove: function (map) { this._container.parentNode.removeChild(this._container); map.off({ 'viewreset': this._resetCallback, 'moveend': this._update }, this); if (!this.options.updateWhenIdle) { map.off('move', this._limitedUpdate, this); } this._container = null; this._map = null; }, bringToFront: function () { var pane = this._map._panes.tilePane; if (this._container) { pane.appendChild(this._container); this._setAutoZIndex(pane, Math.max); } return this; }, bringToBack: function () { var pane = this._map._panes.tilePane; if (this._container) { pane.insertBefore(this._container, pane.firstChild); this._setAutoZIndex(pane, Math.min); } return this; }, getAttribution: function () { return this.options.attribution; }, setOpacity: function (opacity) { this.options.opacity = opacity; if (this._map) { this._updateOpacity(); } return this; }, setZIndex: function (zIndex) { this.options.zIndex = zIndex; this._updateZIndex(); return this; }, setUrl: function (url, noRedraw) { this._url = url; if (!noRedraw) { this.redraw(); } return this; }, redraw: function () { if (this._map) { this._map._panes.tilePane.empty = false; this._reset(true); this._update(); } return this; }, _updateZIndex: function () { if (this._container && this.options.zIndex !== undefined) { this._container.style.zIndex = this.options.zIndex; } }, _setAutoZIndex: function (pane, compare) { var layers = pane.children, edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min zIndex, i, len; for (i = 0, len = layers.length; i < len; i++) { if (layers[i] !== this._container) { zIndex = parseInt(layers[i].style.zIndex, 10); if (!isNaN(zIndex)) { edgeZIndex = compare(edgeZIndex, zIndex); } } } this.options.zIndex = this._container.style.zIndex = (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1); }, _updateOpacity: function () { L.DomUtil.setOpacity(this._container, this.options.opacity); // stupid webkit hack to force redrawing of tiles var i, tiles = this._tiles; if (L.Browser.webkit) { for (i in tiles) { if (tiles.hasOwnProperty(i)) { tiles[i].style.webkitTransform += ' translate(0,0)'; } } } }, _initContainer: function () { var tilePane = this._map._panes.tilePane; if (!this._container || tilePane.empty) { this._container = L.DomUtil.create('div', 'leaflet-layer'); this._updateZIndex(); tilePane.appendChild(this._container); if (this.options.opacity < 1) { this._updateOpacity(); } } }, _resetCallback: function (e) { this._reset(e.hard); }, _reset: function (clearOldContainer) { var tiles = this._tiles; for (var key in tiles) { if (tiles.hasOwnProperty(key)) { this.fire('tileunload', {tile: tiles[key]}); } } this._tiles = {}; this._tilesToLoad = 0; if (this.options.reuseTiles) { this._unusedTiles = []; } if (clearOldContainer && this._container) { this._container.innerHTML = ""; } this._initContainer(); }, _update: function () { if (!this._map) { return; } var bounds = this._map.getPixelBounds(), zoom = this._map.getZoom(), tileSize = this.options.tileSize; if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { return; } var nwTilePoint = new L.Point( Math.floor(bounds.min.x / tileSize), Math.floor(bounds.min.y / tileSize)), seTilePoint = new L.Point( Math.floor(bounds.max.x / tileSize), Math.floor(bounds.max.y / tileSize)), tileBounds = new L.Bounds(nwTilePoint, seTilePoint); this._addTilesFromCenterOut(tileBounds); if (this.options.unloadInvisibleTiles || this.options.reuseTiles) { this._removeOtherTiles(tileBounds); } }, _addTilesFromCenterOut: function (bounds) { var queue = [], center = bounds.getCenter(); var j, i, point; for (j = bounds.min.y; j <= bounds.max.y; j++) { for (i = bounds.min.x; i <= bounds.max.x; i++) { point = new L.Point(i, j); if (this._tileShouldBeLoaded(point)) { queue.push(point); } } } var tilesToLoad = queue.length; if (tilesToLoad === 0) { return; } // load tiles in order of their distance to center queue.sort(function (a, b) { return a.distanceTo(center) - b.distanceTo(center); }); var fragment = document.createDocumentFragment(); // if its the first batch of tiles to load if (!this._tilesToLoad) { this.fire('loading'); } this._tilesToLoad += tilesToLoad; for (i = 0; i < tilesToLoad; i++) { this._addTile(queue[i], fragment); } this._container.appendChild(fragment); }, _tileShouldBeLoaded: function (tilePoint) { if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) { return false; // already loaded } if (!this.options.continuousWorld) { var limit = this._getWrapTileNum(); if (this.options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit) || tilePoint.y < 0 || tilePoint.y >= limit) { return false; // exceeds world bounds } } return true; }, _removeOtherTiles: function (bounds) { var kArr, x, y, key; for (key in this._tiles) { if (this._tiles.hasOwnProperty(key)) { kArr = key.split(':'); x = parseInt(kArr[0], 10); y = parseInt(kArr[1], 10); // remove tile if it's out of bounds if (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) { this._removeTile(key); } } } }, _removeTile: function (key) { var tile = this._tiles[key]; this.fire("tileunload", {tile: tile, url: tile.src}); if (this.options.reuseTiles) { L.DomUtil.removeClass(tile, 'leaflet-tile-loaded'); this._unusedTiles.push(tile); } else if (tile.parentNode === this._container) { this._container.removeChild(tile); } // for https://github.com/CloudMade/Leaflet/issues/137 if (!L.Browser.android) { tile.src = L.Util.emptyImageUrl; } delete this._tiles[key]; }, _addTile: function (tilePoint, container) { var tilePos = this._getTilePos(tilePoint); // get unused tile - or create a new tile var tile = this._getTile(); /* Chrome 20 layouts much faster with top/left (verify with timeline, frames) Android 4 browser has display issues with top/left and requires transform instead Android 3 browser not tested Android 2 browser requires top/left or tiles disappear on load or first drag (reappear after zoom) https://github.com/CloudMade/Leaflet/issues/866 (other browsers don't currently care) - see debug/hacks/jitter.html for an example */ L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome || L.Browser.android23); this._tiles[tilePoint.x + ':' + tilePoint.y] = tile; this._loadTile(tile, tilePoint); if (tile.parentNode !== this._container) { container.appendChild(tile); } }, _getZoomForUrl: function () { var options = this.options, zoom = this._map.getZoom(); if (options.zoomReverse) { zoom = options.maxZoom - zoom; } return zoom + options.zoomOffset; }, _getTilePos: function (tilePoint) { var origin = this._map.getPixelOrigin(), tileSize = this.options.tileSize; return tilePoint.multiplyBy(tileSize).subtract(origin); }, // image-specific code (override to implement e.g. Canvas or SVG tile layer) getTileUrl: function (tilePoint) { this._adjustTilePoint(tilePoint); return L.Util.template(this._url, L.extend({ s: this._getSubdomain(tilePoint), z: this._getZoomForUrl(), x: tilePoint.x, y: tilePoint.y }, this.options)); }, _getWrapTileNum: function () { // TODO refactor, limit is not valid for non-standard projections return Math.pow(2, this._getZoomForUrl()); }, _adjustTilePoint: function (tilePoint) { var limit = this._getWrapTileNum(); // wrap tile coordinates if (!this.options.continuousWorld && !this.options.noWrap) { tilePoint.x = ((tilePoint.x % limit) + limit) % limit; } if (this.options.tms) { tilePoint.y = limit - tilePoint.y - 1; } }, _getSubdomain: function (tilePoint) { var index = (tilePoint.x + tilePoint.y) % this.options.subdomains.length; return this.options.subdomains[index]; }, _createTileProto: function () { var img = this._tileImg = L.DomUtil.create('img', 'leaflet-tile'); img.style.width = img.style.height = this.options.tileSize + 'px'; img.galleryimg = 'no'; }, _getTile: function () { if (this.options.reuseTiles && this._unusedTiles.length > 0) { var tile = this._unusedTiles.pop(); this._resetTile(tile); return tile; } return this._createTile(); }, // Override if data stored on a tile needs to be cleaned up before reuse _resetTile: function (/*tile*/) {}, _createTile: function () { var tile = this._tileImg.cloneNode(false); tile.onselectstart = tile.onmousemove = L.Util.falseFn; return tile; }, _loadTile: function (tile, tilePoint) { tile._layer = this; tile.onload = this._tileOnLoad; tile.onerror = this._tileOnError; tile.src = this.getTileUrl(tilePoint); }, _tileLoaded: function () { this._tilesToLoad--; if (!this._tilesToLoad) { this.fire('load'); } }, _tileOnLoad: function () { var layer = this._layer; //Only if we are loading an actual image if (this.src !== L.Util.emptyImageUrl) { L.DomUtil.addClass(this, 'leaflet-tile-loaded'); layer.fire('tileload', { tile: this, url: this.src }); } layer._tileLoaded(); }, _tileOnError: function () { var layer = this._layer; layer.fire('tileerror', { tile: this, url: this.src }); var newUrl = layer.options.errorTileUrl; if (newUrl) { this.src = newUrl; } layer._tileLoaded(); } }); L.tileLayer = function (url, options) { return new L.TileLayer(url, options); }; /* * L.TileLayer.WMS is used for putting WMS tile layers on the map. */ L.TileLayer.WMS = L.TileLayer.extend({ defaultWmsParams: { service: 'WMS', request: 'GetMap', version: '1.1.1', layers: '', styles: '', format: 'image/jpeg', transparent: false }, initialize: function (url, options) { // (String, Object) this._url = url; var wmsParams = L.extend({}, this.defaultWmsParams); if (options.detectRetina && L.Browser.retina) { wmsParams.width = wmsParams.height = this.options.tileSize * 2; } else { wmsParams.width = wmsParams.height = this.options.tileSize; } for (var i in options) { // all keys that are not TileLayer options go to WMS params if (!this.options.hasOwnProperty(i)) { wmsParams[i] = options[i]; } } this.wmsParams = wmsParams; L.setOptions(this, options); }, onAdd: function (map) { var projectionKey = parseFloat(this.wmsParams.version) >= 1.3 ? 'crs' : 'srs'; this.wmsParams[projectionKey] = map.options.crs.code; L.TileLayer.prototype.onAdd.call(this, map); }, getTileUrl: function (tilePoint, zoom) { // (Point, Number) -> String this._adjustTilePoint(tilePoint); var map = this._map, crs = map.options.crs, tileSize = this.options.tileSize, nwPoint = tilePoint.multiplyBy(tileSize), sePoint = nwPoint.add(new L.Point(tileSize, tileSize)), nw = crs.project(map.unproject(nwPoint, zoom)), se = crs.project(map.unproject(sePoint, zoom)), bbox = [nw.x, se.y, se.x, nw.y].join(','), url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)}); return url + L.Util.getParamString(this.wmsParams, url) + "&bbox=" + bbox; }, setParams: function (params, noRedraw) { L.extend(this.wmsParams, params); if (!noRedraw) { this.redraw(); } return this; } }); L.tileLayer.wms = function (url, options) { return new L.TileLayer.WMS(url, options); }; /* * L.TileLayer.Canvas is a class that you can use as a base for creating * dynamically drawn Canvas-based tile layers. */ L.TileLayer.Canvas = L.TileLayer.extend({ options: { async: false }, initialize: function (options) { L.setOptions(this, options); }, redraw: function () { var tiles = this._tiles; for (var i in tiles) { if (tiles.hasOwnProperty(i)) { this._redrawTile(tiles[i]); } } }, _redrawTile: function (tile) { this.drawTile(tile, tile._tilePoint, this._map._zoom); }, _createTileProto: function () { var proto = this._canvasProto = L.DomUtil.create('canvas', 'leaflet-tile'); proto.width = proto.height = this.options.tileSize; }, _createTile: function () { var tile = this._canvasProto.cloneNode(false); tile.onselectstart = tile.onmousemove = L.Util.falseFn; return tile; }, _loadTile: function (tile, tilePoint) { tile._layer = this; tile._tilePoint = tilePoint; this._redrawTile(tile); if (!this.options.async) { this.tileDrawn(tile); } }, drawTile: function (/*tile, tilePoint*/) { // override with rendering code }, tileDrawn: function (tile) { this._tileOnLoad.call(tile); } }); L.tileLayer.canvas = function (options) { return new L.TileLayer.Canvas(options); }; /* * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds). */ L.ImageOverlay = L.Class.extend({ includes: L.Mixin.Events, options: { opacity: 1 }, initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) this._url = url; this._bounds = L.latLngBounds(bounds); L.setOptions(this, options); }, onAdd: function (map) { this._map = map; if (!this._image) { this._initImage(); } map._panes.overlayPane.appendChild(this._image); map.on('viewreset', this._reset, this); if (map.options.zoomAnimation && L.Browser.any3d) { map.on('zoomanim', this._animateZoom, this); } this._reset(); }, onRemove: function (map) { map.getPanes().overlayPane.removeChild(this._image); map.off('viewreset', this._reset, this); if (map.options.zoomAnimation) { map.off('zoomanim', this._animateZoom, this); } }, addTo: function (map) { map.addLayer(this); return this; }, setOpacity: function (opacity) { this.options.opacity = opacity; this._updateOpacity(); return this; }, // TODO remove bringToFront/bringToBack duplication from TileLayer/Path bringToFront: function () { if (this._image) { this._map._panes.overlayPane.appendChild(this._image); } return this; }, bringToBack: function () { var pane = this._map._panes.overlayPane; if (this._image) { pane.insertBefore(this._image, pane.firstChild); } return this; }, _initImage: function () { this._image = L.DomUtil.create('img', 'leaflet-image-layer'); if (this._map.options.zoomAnimation && L.Browser.any3d) { L.DomUtil.addClass(this._image, 'leaflet-zoom-animated'); } else { L.DomUtil.addClass(this._image, 'leaflet-zoom-hide'); } this._updateOpacity(); //TODO createImage util method to remove duplication L.extend(this._image, { galleryimg: 'no', onselectstart: L.Util.falseFn, onmousemove: L.Util.falseFn, onload: L.bind(this._onImageLoad, this), src: this._url }); }, _animateZoom: function (e) { var map = this._map, image = this._image, scale = map.getZoomScale(e.zoom), nw = this._bounds.getNorthWest(), se = this._bounds.getSouthEast(), topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center), size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft), origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale))); image.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') '; }, _reset: function () { var image = this._image, topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()), size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft); L.DomUtil.setPosition(image, topLeft); image.style.width = size.x + 'px'; image.style.height = size.y + 'px'; }, _onImageLoad: function () { this.fire('load'); }, _updateOpacity: function () { L.DomUtil.setOpacity(this._image, this.options.opacity); } }); L.imageOverlay = function (url, bounds, options) { return new L.ImageOverlay(url, bounds, options); }; /* * L.Icon is an image-based icon class that you can use with L.Marker for custom markers. */ L.Icon = L.Class.extend({ options: { /* iconUrl: (String) (required) iconRetinaUrl: (String) (optional, used for retina devices if detected) iconSize: (Point) (can be set through CSS) iconAnchor: (Point) (centered by default, can be set in CSS with negative margins) popupAnchor: (Point) (if not specified, popup opens in the anchor point) shadowUrl: (Point) (no shadow by default) shadowRetinaUrl: (String) (optional, used for retina devices if detected) shadowSize: (Point) shadowAnchor: (Point) */ className: '' }, initialize: function (options) { L.setOptions(this, options); }, createIcon: function () { return this._createIcon('icon'); }, createShadow: function () { return this._createIcon('shadow'); }, _createIcon: function (name) { var src = this._getIconUrl(name); if (!src) { if (name === 'icon') { throw new Error("iconUrl not set in Icon options (see the docs)."); } return null; } var img = this._createImg(src); this._setIconStyles(img, name); return img; }, _setIconStyles: function (img, name) { var options = this.options, size = L.point(options[name + 'Size']), anchor; if (name === 'shadow') { anchor = L.point(options.shadowAnchor || options.iconAnchor); } else { anchor = L.point(options.iconAnchor); } if (!anchor && size) { anchor = size.divideBy(2, true); } img.className = 'leaflet-marker-' + name + ' ' + options.className; if (anchor) { img.style.marginLeft = (-anchor.x) + 'px'; img.style.marginTop = (-anchor.y) + 'px'; } if (size) { img.style.width = size.x + 'px'; img.style.height = size.y + 'px'; } }, _createImg: function (src) { var el; if (!L.Browser.ie6) { el = document.createElement('img'); el.src = src; } else { el = document.createElement('div'); el.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '")'; } return el; }, _getIconUrl: function (name) { if (L.Browser.retina && this.options[name + 'RetinaUrl']) { return this.options[name + 'RetinaUrl']; } return this.options[name + 'Url']; } }); L.icon = function (options) { return new L.Icon(options); }; /* * L.Icon.Default is the blue marker icon used by default in Leaflet. */ L.Icon.Default = L.Icon.extend({ options: { iconSize: new L.Point(25, 41), iconAnchor: new L.Point(12, 41), popupAnchor: new L.Point(1, -34), shadowSize: new L.Point(41, 41) }, _getIconUrl: function (name) { var key = name + 'Url'; if (this.options[key]) { return this.options[key]; } if (L.Browser.retina && name === 'icon') { name += '@2x'; } var path = L.Icon.Default.imagePath; if (!path) { throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually."); } return path + '/marker-' + name + '.png'; } }); L.Icon.Default.imagePath = (function () { var scripts = document.getElementsByTagName('script'), leafletRe = /\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/; var i, len, src, matches; for (i = 0, len = scripts.length; i < len; i++) { src = scripts[i].src; matches = src.match(leafletRe); if (matches) { return src.split(leafletRe)[0] + '/images'; } } }()); /* * L.Marker is used to display clickable/draggable icons on the map. */ L.Marker = L.Class.extend({ includes: L.Mixin.Events, options: { icon: new L.Icon.Default(), title: '', clickable: true, draggable: false, zIndexOffset: 0, opacity: 1, riseOnHover: false, riseOffset: 250 }, initialize: function (latlng, options) { L.setOptions(this, options); this._latlng = L.latLng(latlng); }, onAdd: function (map) { this._map = map; map.on('viewreset', this.update, this); this._initIcon(); this.update(); if (map.options.zoomAnimation && map.options.markerZoomAnimation) { map.on('zoomanim', this._animateZoom, this); } }, addTo: function (map) { map.addLayer(this); return this; }, onRemove: function (map) { this._removeIcon(); this.fire('remove'); map.off({ 'viewreset': this.update, 'zoomanim': this._animateZoom }, this); this._map = null; }, getLatLng: function () { return this._latlng; }, setLatLng: function (latlng) { this._latlng = L.latLng(latlng); this.update(); return this.fire('move', { latlng: this._latlng }); }, setZIndexOffset: function (offset) { this.options.zIndexOffset = offset; this.update(); return this; }, setIcon: function (icon) { if (this._map) { this._removeIcon(); } this.options.icon = icon; if (this._map) { this._initIcon(); this.update(); } return this; }, update: function () { if (this._icon) { var pos = this._map.latLngToLayerPoint(this._latlng).round(); this._setPos(pos); } return this; }, _initIcon: function () { var options = this.options, map = this._map, animation = (map.options.zoomAnimation && map.options.markerZoomAnimation), classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide', needOpacityUpdate = false; if (!this._icon) { this._icon = options.icon.createIcon(); if (options.title) { this._icon.title = options.title; } this._initInteraction(); needOpacityUpdate = (this.options.opacity < 1); L.DomUtil.addClass(this._icon, classToAdd); if (options.riseOnHover) { L.DomEvent .on(this._icon, 'mouseover', this._bringToFront, this) .on(this._icon, 'mouseout', this._resetZIndex, this); } } if (!this._shadow) { this._shadow = options.icon.createShadow(); if (this._shadow) { L.DomUtil.addClass(this._shadow, classToAdd); needOpacityUpdate = (this.options.opacity < 1); } } if (needOpacityUpdate) { this._updateOpacity(); } var panes = this._map._panes; panes.markerPane.appendChild(this._icon); if (this._shadow) { panes.shadowPane.appendChild(this._shadow); } }, _removeIcon: function () { var panes = this._map._panes; if (this.options.riseOnHover) { L.DomEvent .off(this._icon, 'mouseover', this._bringToFront) .off(this._icon, 'mouseout', this._resetZIndex); } panes.markerPane.removeChild(this._icon); if (this._shadow) { panes.shadowPane.removeChild(this._shadow); } this._icon = this._shadow = null; }, _setPos: function (pos) { L.DomUtil.setPosition(this._icon, pos); if (this._shadow) { L.DomUtil.setPosition(this._shadow, pos); } this._zIndex = pos.y + this.options.zIndexOffset; this._resetZIndex(); }, _updateZIndex: function (offset) { this._icon.style.zIndex = this._zIndex + offset; }, _animateZoom: function (opt) { var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center); this._setPos(pos); }, _initInteraction: function () { if (!this.options.clickable) { return; } // TODO refactor into something shared with Map/Path/etc. to DRY it up var icon = this._icon, events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu']; L.DomUtil.addClass(icon, 'leaflet-clickable'); L.DomEvent.on(icon, 'click', this._onMouseClick, this); for (var i = 0; i < events.length; i++) { L.DomEvent.on(icon, events[i], this._fireMouseEvent, this); } if (L.Handler.MarkerDrag) { this.dragging = new L.Handler.MarkerDrag(this); if (this.options.draggable) { this.dragging.enable(); } } }, _onMouseClick: function (e) { var wasDragged = this.dragging && this.dragging.moved(); if (this.hasEventListeners(e.type) || wasDragged) { L.DomEvent.stopPropagation(e); } if (wasDragged) { return; } if ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; } this.fire(e.type, { originalEvent: e }); }, _fireMouseEvent: function (e) { this.fire(e.type, { originalEvent: e }); // TODO proper custom event propagation // this line will always be called if marker is in a FeatureGroup if (e.type === 'contextmenu' && this.hasEventListeners(e.type)) { L.DomEvent.preventDefault(e); } if (e.type !== 'mousedown') { L.DomEvent.stopPropagation(e); } }, setOpacity: function (opacity) { this.options.opacity = opacity; if (this._map) { this._updateOpacity(); } }, _updateOpacity: function () { L.DomUtil.setOpacity(this._icon, this.options.opacity); if (this._shadow) { L.DomUtil.setOpacity(this._shadow, this.options.opacity); } }, _bringToFront: function () { this._updateZIndex(this.options.riseOffset); }, _resetZIndex: function () { this._updateZIndex(0); } }); L.marker = function (latlng, options) { return new L.Marker(latlng, options); }; /* * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon) * to use with L.Marker. */ L.DivIcon = L.Icon.extend({ options: { iconSize: new L.Point(12, 12), // also can be set through CSS /* iconAnchor: (Point) popupAnchor: (Point) html: (String) bgPos: (Point) */ className: 'leaflet-div-icon' }, createIcon: function () { var div = document.createElement('div'), options = this.options; if (options.html) { div.innerHTML = options.html; } if (options.bgPos) { div.style.backgroundPosition = (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px'; } this._setIconStyles(div, 'icon'); return div; }, createShadow: function () { return null; } }); L.divIcon = function (options) { return new L.DivIcon(options); }; /* * L.Popup is used for displaying popups on the map. */ L.Map.mergeOptions({ closePopupOnClick: true }); L.Popup = L.Class.extend({ includes: L.Mixin.Events, options: { minWidth: 50, maxWidth: 300, maxHeight: null, autoPan: true, closeButton: true, offset: new L.Point(0, 6), autoPanPadding: new L.Point(5, 5), className: '', zoomAnimation: true }, initialize: function (options, source) { L.setOptions(this, options); this._source = source; this._animated = L.Browser.any3d && this.options.zoomAnimation; }, onAdd: function (map) { this._map = map; if (!this._container) { this._initLayout(); } this._updateContent(); var animFade = map.options.fadeAnimation; if (animFade) { L.DomUtil.setOpacity(this._container, 0); } map._panes.popupPane.appendChild(this._container); map.on('viewreset', this._updatePosition, this); if (this._animated) { map.on('zoomanim', this._zoomAnimation, this); } if (map.options.closePopupOnClick) { map.on('preclick', this._close, this); } this._update(); if (animFade) { L.DomUtil.setOpacity(this._container, 1); } }, addTo: function (map) { map.addLayer(this); return this; }, openOn: function (map) { map.openPopup(this); return this; }, onRemove: function (map) { map._panes.popupPane.removeChild(this._container); L.Util.falseFn(this._container.offsetWidth); // force reflow map.off({ viewreset: this._updatePosition, preclick: this._close, zoomanim: this._zoomAnimation }, this); if (map.options.fadeAnimation) { L.DomUtil.setOpacity(this._container, 0); } this._map = null; }, setLatLng: function (latlng) { this._latlng = L.latLng(latlng); this._update(); return this; }, setContent: function (content) { this._content = content; this._update(); return this; }, _close: function () { var map = this._map; if (map) { map._popup = null; map .removeLayer(this) .fire('popupclose', {popup: this}); } }, _initLayout: function () { var prefix = 'leaflet-popup', containerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' + (this._animated ? 'animated' : 'hide'), container = this._container = L.DomUtil.create('div', containerClass), closeButton; if (this.options.closeButton) { closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container); closeButton.href = '#close'; closeButton.innerHTML = '×'; L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this); } var wrapper = this._wrapper = L.DomUtil.create('div', prefix + '-content-wrapper', container); L.DomEvent.disableClickPropagation(wrapper); this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper); L.DomEvent.on(this._contentNode, 'mousewheel', L.DomEvent.stopPropagation); this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container); this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); }, _update: function () { if (!this._map) { return; } this._container.style.visibility = 'hidden'; this._updateContent(); this._updateLayout(); this._updatePosition(); this._container.style.visibility = ''; this._adjustPan(); }, _updateContent: function () { if (!this._content) { return; } if (typeof this._content === 'string') { this._contentNode.innerHTML = this._content; } else { while (this._contentNode.hasChildNodes()) { this._contentNode.removeChild(this._contentNode.firstChild); } this._contentNode.appendChild(this._content); } this.fire('contentupdate'); }, _updateLayout: function () { var container = this._contentNode, style = container.style; style.width = ''; style.whiteSpace = 'nowrap'; var width = container.offsetWidth; width = Math.min(width, this.options.maxWidth); width = Math.max(width, this.options.minWidth); style.width = (width + 1) + 'px'; style.whiteSpace = ''; style.height = ''; var height = container.offsetHeight, maxHeight = this.options.maxHeight, scrolledClass = 'leaflet-popup-scrolled'; if (maxHeight && height > maxHeight) { style.height = maxHeight + 'px'; L.DomUtil.addClass(container, scrolledClass); } else { L.DomUtil.removeClass(container, scrolledClass); } this._containerWidth = this._container.offsetWidth; }, _updatePosition: function () { if (!this._map) { return; } var pos = this._map.latLngToLayerPoint(this._latlng), animated = this._animated, offset = this.options.offset; if (animated) { L.DomUtil.setPosition(this._container, pos); } this._containerBottom = -offset.y - (animated ? 0 : pos.y); this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x); //Bottom position the popup in case the height of the popup changes (images loading etc) this._container.style.bottom = this._containerBottom + 'px'; this._container.style.left = this._containerLeft + 'px'; }, _zoomAnimation: function (opt) { var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center); L.DomUtil.setPosition(this._container, pos); }, _adjustPan: function () { if (!this.options.autoPan) { return; } var map = this._map, containerHeight = this._container.offsetHeight, containerWidth = this._containerWidth, layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom); if (this._animated) { layerPos._add(L.DomUtil.getPosition(this._container)); } var containerPos = map.layerPointToContainerPoint(layerPos), padding = this.options.autoPanPadding, size = map.getSize(), dx = 0, dy = 0; if (containerPos.x < 0) { dx = containerPos.x - padding.x; } if (containerPos.x + containerWidth > size.x) { dx = containerPos.x + containerWidth - size.x + padding.x; } if (containerPos.y < 0) { dy = containerPos.y - padding.y; } if (containerPos.y + containerHeight > size.y) { dy = containerPos.y + containerHeight - size.y + padding.y; } if (dx || dy) { map.panBy(new L.Point(dx, dy)); } }, _onCloseButtonClick: function (e) { this._close(); L.DomEvent.stop(e); } }); L.popup = function (options, source) { return new L.Popup(options, source); }; /* * Popup extension to L.Marker, adding popup-related methods. */ L.Marker.include({ openPopup: function () { if (this._popup && this._map) { this._popup.setLatLng(this._latlng); this._map.openPopup(this._popup); } return this; }, closePopup: function () { if (this._popup) { this._popup._close(); } return this; }, bindPopup: function (content, options) { var anchor = L.point(this.options.icon.options.popupAnchor) || new L.Point(0, 0); anchor = anchor.add(L.Popup.prototype.options.offset); if (options && options.offset) { anchor = anchor.add(options.offset); } options = L.extend({offset: anchor}, options); if (!this._popup) { this .on('click', this.openPopup, this) .on('remove', this.closePopup, this) .on('move', this._movePopup, this); } this._popup = new L.Popup(options, this) .setContent(content); return this; }, unbindPopup: function () { if (this._popup) { this._popup = null; this .off('click', this.openPopup) .off('remove', this.closePopup) .off('move', this._movePopup); } return this; }, _movePopup: function (e) { this._popup.setLatLng(e.latlng); } }); /* * Adds popup-related methods to L.Map. */ L.Map.include({ openPopup: function (popup) { this.closePopup(); this._popup = popup; return this .addLayer(popup) .fire('popupopen', {popup: this._popup}); }, closePopup: function () { if (this._popup) { this._popup._close(); } return this; } }); /* * L.LayerGroup is a class to combine several layers into one so that * you can manipulate the group (e.g. add/remove it) as one layer. */ L.LayerGroup = L.Class.extend({ initialize: function (layers) { this._layers = {}; var i, len; if (layers) { for (i = 0, len = layers.length; i < len; i++) { this.addLayer(layers[i]); } } }, addLayer: function (layer) { var id = L.stamp(layer); this._layers[id] = layer; if (this._map) { this._map.addLayer(layer); } return this; }, removeLayer: function (layer) { var id = L.stamp(layer); delete this._layers[id]; if (this._map) { this._map.removeLayer(layer); } return this; }, clearLayers: function () { this.eachLayer(this.removeLayer, this); return this; }, invoke: function (methodName) { var args = Array.prototype.slice.call(arguments, 1), i, layer; for (i in this._layers) { if (this._layers.hasOwnProperty(i)) { layer = this._layers[i]; if (layer[methodName]) { layer[methodName].apply(layer, args); } } } return this; }, onAdd: function (map) { this._map = map; this.eachLayer(map.addLayer, map); }, onRemove: function (map) { this.eachLayer(map.removeLayer, map); this._map = null; }, addTo: function (map) { map.addLayer(this); return this; }, eachLayer: function (method, context) { for (var i in this._layers) { if (this._layers.hasOwnProperty(i)) { method.call(context, this._layers[i]); } } }, setZIndex: function (zIndex) { return this.invoke('setZIndex', zIndex); } }); L.layerGroup = function (layers) { return new L.LayerGroup(layers); }; /* * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods * shared between a group of interactive layers (like vectors or markers). */ L.FeatureGroup = L.LayerGroup.extend({ includes: L.Mixin.Events, statics: { EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu' }, addLayer: function (layer) { if (this._layers[L.stamp(layer)]) { return this; } layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this); L.LayerGroup.prototype.addLayer.call(this, layer); if (this._popupContent && layer.bindPopup) { layer.bindPopup(this._popupContent, this._popupOptions); } return this.fire('layeradd', {layer: layer}); }, removeLayer: function (layer) { layer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this); L.LayerGroup.prototype.removeLayer.call(this, layer); if (this._popupContent) { this.invoke('unbindPopup'); } return this.fire('layerremove', {layer: layer}); }, bindPopup: function (content, options) { this._popupContent = content; this._popupOptions = options; return this.invoke('bindPopup', content, options); }, setStyle: function (style) { return this.invoke('setStyle', style); }, bringToFront: function () { return this.invoke('bringToFront'); }, bringToBack: function () { return this.invoke('bringToBack'); }, getBounds: function () { var bounds = new L.LatLngBounds(); this.eachLayer(function (layer) { bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds()); }); return bounds; }, _propagateEvent: function (e) { e.layer = e.target; e.target = this; this.fire(e.type, e); } }); L.featureGroup = function (layers) { return new L.FeatureGroup(layers); }; /* * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc. */ L.Path = L.Class.extend({ includes: [L.Mixin.Events], statics: { // how much to extend the clip area around the map view // (relative to its size, e.g. 0.5 is half the screen in each direction) // set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is) CLIP_PADDING: L.Browser.mobile ? Math.max(0, Math.min(0.5, (1280 / Math.max(window.innerWidth, window.innerHeight) - 1) / 2)) : 0.5 }, options: { stroke: true, color: '#0033ff', dashArray: null, weight: 5, opacity: 0.5, fill: false, fillColor: null, //same as color by default fillOpacity: 0.2, clickable: true }, initialize: function (options) { L.setOptions(this, options); }, onAdd: function (map) { this._map = map; if (!this._container) { this._initElements(); this._initEvents(); } this.projectLatlngs(); this._updatePath(); if (this._container) { this._map._pathRoot.appendChild(this._container); } this.fire('add'); map.on({ 'viewreset': this.projectLatlngs, 'moveend': this._updatePath }, this); }, addTo: function (map) { map.addLayer(this); return this; }, onRemove: function (map) { map._pathRoot.removeChild(this._container); // Need to fire remove event before we set _map to null as the event hooks might need the object this.fire('remove'); this._map = null; if (L.Browser.vml) { this._container = null; this._stroke = null; this._fill = null; } map.off({ 'viewreset': this.projectLatlngs, 'moveend': this._updatePath }, this); }, projectLatlngs: function () { // do all projection stuff here }, setStyle: function (style) { L.setOptions(this, style); if (this._container) { this._updateStyle(); } return this; }, redraw: function () { if (this._map) { this.projectLatlngs(); this._updatePath(); } return this; } }); L.Map.include({ _updatePathViewport: function () { var p = L.Path.CLIP_PADDING, size = this.getSize(), panePos = L.DomUtil.getPosition(this._mapPane), min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()), max = min.add(size.multiplyBy(1 + p * 2)._round()); this._pathViewport = new L.Bounds(min, max); } }); /* * Extends L.Path with SVG-specific rendering code. */ L.Path.SVG_NS = 'http://www.w3.org/2000/svg'; L.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect); L.Path = L.Path.extend({ statics: { SVG: L.Browser.svg }, bringToFront: function () { var root = this._map._pathRoot, path = this._container; if (path && root.lastChild !== path) { root.appendChild(path); } return this; }, bringToBack: function () { var root = this._map._pathRoot, path = this._container, first = root.firstChild; if (path && first !== path) { root.insertBefore(path, first); } return this; }, getPathString: function () { // form path string here }, _createElement: function (name) { return document.createElementNS(L.Path.SVG_NS, name); }, _initElements: function () { this._map._initPathRoot(); this._initPath(); this._initStyle(); }, _initPath: function () { this._container = this._createElement('g'); this._path = this._createElement('path'); this._container.appendChild(this._path); }, _initStyle: function () { if (this.options.stroke) { this._path.setAttribute('stroke-linejoin', 'round'); this._path.setAttribute('stroke-linecap', 'round'); } if (this.options.fill) { this._path.setAttribute('fill-rule', 'evenodd'); } this._updateStyle(); }, _updateStyle: function () { if (this.options.stroke) { this._path.setAttribute('stroke', this.options.color); this._path.setAttribute('stroke-opacity', this.options.opacity); this._path.setAttribute('stroke-width', this.options.weight); if (this.options.dashArray) { this._path.setAttribute('stroke-dasharray', this.options.dashArray); } else { this._path.removeAttribute('stroke-dasharray'); } } else { this._path.setAttribute('stroke', 'none'); } if (this.options.fill) { this._path.setAttribute('fill', this.options.fillColor || this.options.color); this._path.setAttribute('fill-opacity', this.options.fillOpacity); } else { this._path.setAttribute('fill', 'none'); } }, _updatePath: function () { var str = this.getPathString(); if (!str) { // fix webkit empty string parsing bug str = 'M0 0'; } this._path.setAttribute('d', str); }, // TODO remove duplication with L.Map _initEvents: function () { if (this.options.clickable) { if (L.Browser.svg || !L.Browser.vml) { this._path.setAttribute('class', 'leaflet-clickable'); } L.DomEvent.on(this._container, 'click', this._onMouseClick, this); var events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'mousemove', 'contextmenu']; for (var i = 0; i < events.length; i++) { L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this); } } }, _onMouseClick: function (e) { if (this._map.dragging && this._map.dragging.moved()) { return; } this._fireMouseEvent(e); }, _fireMouseEvent: function (e) { if (!this.hasEventListeners(e.type)) { return; } var map = this._map, containerPoint = map.mouseEventToContainerPoint(e), layerPoint = map.containerPointToLayerPoint(containerPoint), latlng = map.layerPointToLatLng(layerPoint); this.fire(e.type, { latlng: latlng, layerPoint: layerPoint, containerPoint: containerPoint, originalEvent: e }); if (e.type === 'contextmenu') { L.DomEvent.preventDefault(e); } if (e.type !== 'mousemove') { L.DomEvent.stopPropagation(e); } } }); L.Map.include({ _initPathRoot: function () { if (!this._pathRoot) { this._pathRoot = L.Path.prototype._createElement('svg'); this._panes.overlayPane.appendChild(this._pathRoot); if (this.options.zoomAnimation && L.Browser.any3d) { this._pathRoot.setAttribute('class', ' leaflet-zoom-animated'); this.on({ 'zoomanim': this._animatePathZoom, 'zoomend': this._endPathZoom }); } else { this._pathRoot.setAttribute('class', ' leaflet-zoom-hide'); } this.on('moveend', this._updateSvgViewport); this._updateSvgViewport(); } }, _animatePathZoom: function (e) { var scale = this.getZoomScale(e.zoom), offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min); this._pathRoot.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') '; this._pathZooming = true; }, _endPathZoom: function () { this._pathZooming = false; }, _updateSvgViewport: function () { if (this._pathZooming) { // Do not update SVGs while a zoom animation is going on otherwise the animation will break. // When the zoom animation ends we will be updated again anyway // This fixes the case where you do a momentum move and zoom while the move is still ongoing. return; } this._updatePathViewport(); var vp = this._pathViewport, min = vp.min, max = vp.max, width = max.x - min.x, height = max.y - min.y, root = this._pathRoot, pane = this._panes.overlayPane; // Hack to make flicker on drag end on mobile webkit less irritating if (L.Browser.mobileWebkit) { pane.removeChild(root); } L.DomUtil.setPosition(root, min); root.setAttribute('width', width); root.setAttribute('height', height); root.setAttribute('viewBox', [min.x, min.y, width, height].join(' ')); if (L.Browser.mobileWebkit) { pane.appendChild(root); } } }); /* * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods. */ L.Path.include({ bindPopup: function (content, options) { if (!this._popup || options) { this._popup = new L.Popup(options, this); } this._popup.setContent(content); if (!this._popupHandlersAdded) { this .on('click', this._openPopup, this) .on('remove', this.closePopup, this); this._popupHandlersAdded = true; } return this; }, unbindPopup: function () { if (this._popup) { this._popup = null; this .off('click', this._openPopup) .off('remove', this.closePopup); this._popupHandlersAdded = false; } return this; }, openPopup: function (latlng) { if (this._popup) { // open the popup from one of the path's points if not specified latlng = latlng || this._latlng || this._latlngs[Math.floor(this._latlngs.length / 2)]; this._openPopup({latlng: latlng}); } return this; }, closePopup: function () { if (this._popup) { this._popup._close(); } return this; }, _openPopup: function (e) { this._popup.setLatLng(e.latlng); this._map.openPopup(this._popup); } }); /* * Vector rendering for IE6-8 through VML. * Thanks to Dmitry Baranovsky and his Raphael library for inspiration! */ L.Browser.vml = !L.Browser.svg && (function () { try { var div = document.createElement('div'); div.innerHTML = ''; var shape = div.firstChild; shape.style.behavior = 'url(#default#VML)'; return shape && (typeof shape.adj === 'object'); } catch (e) { return false; } }()); L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({ statics: { VML: true, CLIP_PADDING: 0.02 }, _createElement: (function () { try { document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml'); return function (name) { return document.createElement(''); }; } catch (e) { return function (name) { return document.createElement( '<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">'); }; } }()), _initPath: function () { var container = this._container = this._createElement('shape'); L.DomUtil.addClass(container, 'leaflet-vml-shape'); if (this.options.clickable) { L.DomUtil.addClass(container, 'leaflet-clickable'); } container.coordsize = '1 1'; this._path = this._createElement('path'); container.appendChild(this._path); this._map._pathRoot.appendChild(container); }, _initStyle: function () { this._updateStyle(); }, _updateStyle: function () { var stroke = this._stroke, fill = this._fill, options = this.options, container = this._container; container.stroked = options.stroke; container.filled = options.fill; if (options.stroke) { if (!stroke) { stroke = this._stroke = this._createElement('stroke'); stroke.endcap = 'round'; container.appendChild(stroke); } stroke.weight = options.weight + 'px'; stroke.color = options.color; stroke.opacity = options.opacity; if (options.dashArray) { stroke.dashStyle = options.dashArray instanceof Array ? options.dashArray.join(' ') : options.dashArray.replace(/ *, */g, ' '); } else { stroke.dashStyle = ''; } } else if (stroke) { container.removeChild(stroke); this._stroke = null; } if (options.fill) { if (!fill) { fill = this._fill = this._createElement('fill'); container.appendChild(fill); } fill.color = options.fillColor || options.color; fill.opacity = options.fillOpacity; } else if (fill) { container.removeChild(fill); this._fill = null; } }, _updatePath: function () { var style = this._container.style; style.display = 'none'; this._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug style.display = ''; } }); L.Map.include(L.Browser.svg || !L.Browser.vml ? {} : { _initPathRoot: function () { if (this._pathRoot) { return; } var root = this._pathRoot = document.createElement('div'); root.className = 'leaflet-vml-container'; this._panes.overlayPane.appendChild(root); this.on('moveend', this._updatePathViewport); this._updatePathViewport(); } }); /* * Vector rendering for all browsers that support canvas. */ L.Browser.canvas = (function () { return !!document.createElement('canvas').getContext; }()); L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({ statics: { //CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value CANVAS: true, SVG: false }, redraw: function () { if (this._map) { this.projectLatlngs(); this._requestUpdate(); } return this; }, setStyle: function (style) { L.setOptions(this, style); if (this._map) { this._updateStyle(); this._requestUpdate(); } return this; }, onRemove: function (map) { map .off('viewreset', this.projectLatlngs, this) .off('moveend', this._updatePath, this); if (this.options.clickable) { this._map.off('click', this._onClick, this); } this._requestUpdate(); this._map = null; }, _requestUpdate: function () { if (this._map && !L.Path._updateRequest) { L.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map); } }, _fireMapMoveEnd: function () { L.Path._updateRequest = null; this.fire('moveend'); }, _initElements: function () { this._map._initPathRoot(); this._ctx = this._map._canvasCtx; }, _updateStyle: function () { var options = this.options; if (options.stroke) { this._ctx.lineWidth = options.weight; this._ctx.strokeStyle = options.color; } if (options.fill) { this._ctx.fillStyle = options.fillColor || options.color; } }, _drawPath: function () { var i, j, len, len2, point, drawMethod; this._ctx.beginPath(); for (i = 0, len = this._parts.length; i < len; i++) { for (j = 0, len2 = this._parts[i].length; j < len2; j++) { point = this._parts[i][j]; drawMethod = (j === 0 ? 'move' : 'line') + 'To'; this._ctx[drawMethod](point.x, point.y); } // TODO refactor ugly hack if (this instanceof L.Polygon) { this._ctx.closePath(); } } }, _checkIfEmpty: function () { return !this._parts.length; }, _updatePath: function () { if (this._checkIfEmpty()) { return; } var ctx = this._ctx, options = this.options; this._drawPath(); ctx.save(); this._updateStyle(); if (options.fill) { ctx.globalAlpha = options.fillOpacity; ctx.fill(); } if (options.stroke) { ctx.globalAlpha = options.opacity; ctx.stroke(); } ctx.restore(); // TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature }, _initEvents: function () { if (this.options.clickable) { // TODO hand cursor // TODO mouseover, mouseout, dblclick this._map.on('click', this._onClick, this); } }, _onClick: function (e) { if (this._containsPoint(e.layerPoint)) { this.fire('click', { latlng: e.latlng, layerPoint: e.layerPoint, containerPoint: e.containerPoint, originalEvent: e }); } } }); L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : { _initPathRoot: function () { var root = this._pathRoot, ctx; if (!root) { root = this._pathRoot = document.createElement("canvas"); root.style.position = 'absolute'; ctx = this._canvasCtx = root.getContext('2d'); ctx.lineCap = "round"; ctx.lineJoin = "round"; this._panes.overlayPane.appendChild(root); if (this.options.zoomAnimation) { this._pathRoot.className = 'leaflet-zoom-animated'; this.on('zoomanim', this._animatePathZoom); this.on('zoomend', this._endPathZoom); } this.on('moveend', this._updateCanvasViewport); this._updateCanvasViewport(); } }, _updateCanvasViewport: function () { // don't redraw while zooming. See _updateSvgViewport for more details if (this._pathZooming) { return; } this._updatePathViewport(); var vp = this._pathViewport, min = vp.min, size = vp.max.subtract(min), root = this._pathRoot; //TODO check if this works properly on mobile webkit L.DomUtil.setPosition(root, min); root.width = size.x; root.height = size.y; root.getContext('2d').translate(-min.x, -min.y); } }); /* * L.LineUtil contains different utility functions for line segments * and polylines (clipping, simplification, distances, etc.) */ /*jshint bitwise:false */ // allow bitwise oprations for this file L.LineUtil = { // Simplify polyline with vertex reduction and Douglas-Peucker simplification. // Improves rendering performance dramatically by lessening the number of points to draw. simplify: function (/*Point[]*/ points, /*Number*/ tolerance) { if (!tolerance || !points.length) { return points.slice(); } var sqTolerance = tolerance * tolerance; // stage 1: vertex reduction points = this._reducePoints(points, sqTolerance); // stage 2: Douglas-Peucker simplification points = this._simplifyDP(points, sqTolerance); return points; }, // distance from a point to a segment between two points pointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true)); }, closestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { return this._sqClosestPointOnSegment(p, p1, p2); }, // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm _simplifyDP: function (points, sqTolerance) { var len = points.length, ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array, markers = new ArrayConstructor(len); markers[0] = markers[len - 1] = 1; this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1); var i, newPoints = []; for (i = 0; i < len; i++) { if (markers[i]) { newPoints.push(points[i]); } } return newPoints; }, _simplifyDPStep: function (points, markers, sqTolerance, first, last) { var maxSqDist = 0, index, i, sqDist; for (i = first + 1; i <= last - 1; i++) { sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true); if (sqDist > maxSqDist) { index = i; maxSqDist = sqDist; } } if (maxSqDist > sqTolerance) { markers[index] = 1; this._simplifyDPStep(points, markers, sqTolerance, first, index); this._simplifyDPStep(points, markers, sqTolerance, index, last); } }, // reduce points that are too close to each other to a single point _reducePoints: function (points, sqTolerance) { var reducedPoints = [points[0]]; for (var i = 1, prev = 0, len = points.length; i < len; i++) { if (this._sqDist(points[i], points[prev]) > sqTolerance) { reducedPoints.push(points[i]); prev = i; } } if (prev < len - 1) { reducedPoints.push(points[len - 1]); } return reducedPoints; }, // Cohen-Sutherland line clipping algorithm. // Used to avoid rendering parts of a polyline that are not currently visible. clipSegment: function (a, b, bounds, useLastCode) { var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds), codeB = this._getBitCode(b, bounds), codeOut, p, newCode; // save 2nd code to avoid calculating it on the next segment this._lastCode = codeB; while (true) { // if a,b is inside the clip window (trivial accept) if (!(codeA | codeB)) { return [a, b]; // if a,b is outside the clip window (trivial reject) } else if (codeA & codeB) { return false; // other cases } else { codeOut = codeA || codeB, p = this._getEdgeIntersection(a, b, codeOut, bounds), newCode = this._getBitCode(p, bounds); if (codeOut === codeA) { a = p; codeA = newCode; } else { b = p; codeB = newCode; } } } }, _getEdgeIntersection: function (a, b, code, bounds) { var dx = b.x - a.x, dy = b.y - a.y, min = bounds.min, max = bounds.max; if (code & 8) { // top return new L.Point(a.x + dx * (max.y - a.y) / dy, max.y); } else if (code & 4) { // bottom return new L.Point(a.x + dx * (min.y - a.y) / dy, min.y); } else if (code & 2) { // right return new L.Point(max.x, a.y + dy * (max.x - a.x) / dx); } else if (code & 1) { // left return new L.Point(min.x, a.y + dy * (min.x - a.x) / dx); } }, _getBitCode: function (/*Point*/ p, bounds) { var code = 0; if (p.x < bounds.min.x) { // left code |= 1; } else if (p.x > bounds.max.x) { // right code |= 2; } if (p.y < bounds.min.y) { // bottom code |= 4; } else if (p.y > bounds.max.y) { // top code |= 8; } return code; }, // square distance (to avoid unnecessary Math.sqrt calls) _sqDist: function (p1, p2) { var dx = p2.x - p1.x, dy = p2.y - p1.y; return dx * dx + dy * dy; }, // return closest point on segment or distance to that point _sqClosestPointOnSegment: function (p, p1, p2, sqDist) { var x = p1.x, y = p1.y, dx = p2.x - x, dy = p2.y - y, dot = dx * dx + dy * dy, t; if (dot > 0) { t = ((p.x - x) * dx + (p.y - y) * dy) / dot; if (t > 1) { x = p2.x; y = p2.y; } else if (t > 0) { x += dx * t; y += dy * t; } } dx = p.x - x; dy = p.y - y; return sqDist ? dx * dx + dy * dy : new L.Point(x, y); } }; /* * L.Polygon is used to display polylines on a map. */ L.Polyline = L.Path.extend({ initialize: function (latlngs, options) { L.Path.prototype.initialize.call(this, options); this._latlngs = this._convertLatLngs(latlngs); }, options: { // how much to simplify the polyline on each zoom level // more = better performance and smoother look, less = more accurate smoothFactor: 1.0, noClip: false }, projectLatlngs: function () { this._originalPoints = []; for (var i = 0, len = this._latlngs.length; i < len; i++) { this._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]); } }, getPathString: function () { for (var i = 0, len = this._parts.length, str = ''; i < len; i++) { str += this._getPathPartStr(this._parts[i]); } return str; }, getLatLngs: function () { return this._latlngs; }, setLatLngs: function (latlngs) { this._latlngs = this._convertLatLngs(latlngs); return this.redraw(); }, addLatLng: function (latlng) { this._latlngs.push(L.latLng(latlng)); return this.redraw(); }, spliceLatLngs: function () { // (Number index, Number howMany) var removed = [].splice.apply(this._latlngs, arguments); this._convertLatLngs(this._latlngs); this.redraw(); return removed; }, closestLayerPoint: function (p) { var minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null; for (var j = 0, jLen = parts.length; j < jLen; j++) { var points = parts[j]; for (var i = 1, len = points.length; i < len; i++) { p1 = points[i - 1]; p2 = points[i]; var sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true); if (sqDist < minDistance) { minDistance = sqDist; minPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2); } } } if (minPoint) { minPoint.distance = Math.sqrt(minDistance); } return minPoint; }, getBounds: function () { var bounds = new L.LatLngBounds(), latLngs = this.getLatLngs(), i, len; for (i = 0, len = latLngs.length; i < len; i++) { bounds.extend(latLngs[i]); } return bounds; }, _convertLatLngs: function (latlngs) { var i, len; for (i = 0, len = latlngs.length; i < len; i++) { if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') { return; } latlngs[i] = L.latLng(latlngs[i]); } return latlngs; }, _initEvents: function () { L.Path.prototype._initEvents.call(this); }, _getPathPartStr: function (points) { var round = L.Path.VML; for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) { p = points[j]; if (round) { p._round(); } str += (j ? 'L' : 'M') + p.x + ' ' + p.y; } return str; }, _clipPoints: function () { var points = this._originalPoints, len = points.length, i, k, segment; if (this.options.noClip) { this._parts = [points]; return; } this._parts = []; var parts = this._parts, vp = this._map._pathViewport, lu = L.LineUtil; for (i = 0, k = 0; i < len - 1; i++) { segment = lu.clipSegment(points[i], points[i + 1], vp, i); if (!segment) { continue; } parts[k] = parts[k] || []; parts[k].push(segment[0]); // if segment goes out of screen, or it's the last one, it's the end of the line part if ((segment[1] !== points[i + 1]) || (i === len - 2)) { parts[k].push(segment[1]); k++; } } }, // simplify each clipped part of the polyline _simplifyPoints: function () { var parts = this._parts, lu = L.LineUtil; for (var i = 0, len = parts.length; i < len; i++) { parts[i] = lu.simplify(parts[i], this.options.smoothFactor); } }, _updatePath: function () { if (!this._map) { return; } this._clipPoints(); this._simplifyPoints(); L.Path.prototype._updatePath.call(this); } }); L.polyline = function (latlngs, options) { return new L.Polyline(latlngs, options); }; /* * L.PolyUtil contains utility functions for polygons (clipping, etc.). */ /*jshint bitwise:false */ // allow bitwise operations here L.PolyUtil = {}; /* * Sutherland-Hodgeman polygon clipping algorithm. * Used to avoid rendering parts of a polygon that are not currently visible. */ L.PolyUtil.clipPolygon = function (points, bounds) { var clippedPoints, edges = [1, 4, 2, 8], i, j, k, a, b, len, edge, p, lu = L.LineUtil; for (i = 0, len = points.length; i < len; i++) { points[i]._code = lu._getBitCode(points[i], bounds); } // for each edge (left, bottom, right, top) for (k = 0; k < 4; k++) { edge = edges[k]; clippedPoints = []; for (i = 0, len = points.length, j = len - 1; i < len; j = i++) { a = points[i]; b = points[j]; // if a is inside the clip window if (!(a._code & edge)) { // if b is outside the clip window (a->b goes out of screen) if (b._code & edge) { p = lu._getEdgeIntersection(b, a, edge, bounds); p._code = lu._getBitCode(p, bounds); clippedPoints.push(p); } clippedPoints.push(a); // else if b is inside the clip window (a->b enters the screen) } else if (!(b._code & edge)) { p = lu._getEdgeIntersection(b, a, edge, bounds); p._code = lu._getBitCode(p, bounds); clippedPoints.push(p); } } points = clippedPoints; } return points; }; /* * L.Polygon is used to display polygons on a map. */ L.Polygon = L.Polyline.extend({ options: { fill: true }, initialize: function (latlngs, options) { L.Polyline.prototype.initialize.call(this, latlngs, options); if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { this._latlngs = this._convertLatLngs(latlngs[0]); this._holes = latlngs.slice(1); } }, projectLatlngs: function () { L.Polyline.prototype.projectLatlngs.call(this); // project polygon holes points // TODO move this logic to Polyline to get rid of duplication this._holePoints = []; if (!this._holes) { return; } var i, j, len, len2; for (i = 0, len = this._holes.length; i < len; i++) { this._holePoints[i] = []; for (j = 0, len2 = this._holes[i].length; j < len2; j++) { this._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]); } } }, _clipPoints: function () { var points = this._originalPoints, newParts = []; this._parts = [points].concat(this._holePoints); if (this.options.noClip) { return; } for (var i = 0, len = this._parts.length; i < len; i++) { var clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport); if (clipped.length) { newParts.push(clipped); } } this._parts = newParts; }, _getPathPartStr: function (points) { var str = L.Polyline.prototype._getPathPartStr.call(this, points); return str + (L.Browser.svg ? 'z' : 'x'); } }); L.polygon = function (latlngs, options) { return new L.Polygon(latlngs, options); }; /* * Contains L.MultiPolyline and L.MultiPolygon layers. */ (function () { function createMulti(Klass) { return L.FeatureGroup.extend({ initialize: function (latlngs, options) { this._layers = {}; this._options = options; this.setLatLngs(latlngs); }, setLatLngs: function (latlngs) { var i = 0, len = latlngs.length; this.eachLayer(function (layer) { if (i < len) { layer.setLatLngs(latlngs[i++]); } else { this.removeLayer(layer); } }, this); while (i < len) { this.addLayer(new Klass(latlngs[i++], this._options)); } return this; } }); } L.MultiPolyline = createMulti(L.Polyline); L.MultiPolygon = createMulti(L.Polygon); L.multiPolyline = function (latlngs, options) { return new L.MultiPolyline(latlngs, options); }; L.multiPolygon = function (latlngs, options) { return new L.MultiPolygon(latlngs, options); }; }()); /* * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object. */ L.Rectangle = L.Polygon.extend({ initialize: function (latLngBounds, options) { L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options); }, setBounds: function (latLngBounds) { this.setLatLngs(this._boundsToLatLngs(latLngBounds)); }, _boundsToLatLngs: function (latLngBounds) { latLngBounds = L.latLngBounds(latLngBounds); return [ latLngBounds.getSouthWest(), latLngBounds.getNorthWest(), latLngBounds.getNorthEast(), latLngBounds.getSouthEast() ]; } }); L.rectangle = function (latLngBounds, options) { return new L.Rectangle(latLngBounds, options); }; /* * L.Circle is a circle overlay (with a certain radius in meters). */ L.Circle = L.Path.extend({ initialize: function (latlng, radius, options) { L.Path.prototype.initialize.call(this, options); this._latlng = L.latLng(latlng); this._mRadius = radius; }, options: { fill: true }, setLatLng: function (latlng) { this._latlng = L.latLng(latlng); return this.redraw(); }, setRadius: function (radius) { this._mRadius = radius; return this.redraw(); }, projectLatlngs: function () { var lngRadius = this._getLngRadius(), latlng2 = new L.LatLng(this._latlng.lat, this._latlng.lng - lngRadius), point2 = this._map.latLngToLayerPoint(latlng2); this._point = this._map.latLngToLayerPoint(this._latlng); this._radius = Math.max(Math.round(this._point.x - point2.x), 1); }, getBounds: function () { var lngRadius = this._getLngRadius(), latRadius = (this._mRadius / 40075017) * 360, latlng = this._latlng, sw = new L.LatLng(latlng.lat - latRadius, latlng.lng - lngRadius), ne = new L.LatLng(latlng.lat + latRadius, latlng.lng + lngRadius); return new L.LatLngBounds(sw, ne); }, getLatLng: function () { return this._latlng; }, getPathString: function () { var p = this._point, r = this._radius; if (this._checkIfEmpty()) { return ''; } if (L.Browser.svg) { return "M" + p.x + "," + (p.y - r) + "A" + r + "," + r + ",0,1,1," + (p.x - 0.1) + "," + (p.y - r) + " z"; } else { p._round(); r = Math.round(r); return "AL " + p.x + "," + p.y + " " + r + "," + r + " 0," + (65535 * 360); } }, getRadius: function () { return this._mRadius; }, // TODO Earth hardcoded, move into projection code! _getLatRadius: function () { return (this._mRadius / 40075017) * 360; }, _getLngRadius: function () { return this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat); }, _checkIfEmpty: function () { if (!this._map) { return false; } var vp = this._map._pathViewport, r = this._radius, p = this._point; return p.x - r > vp.max.x || p.y - r > vp.max.y || p.x + r < vp.min.x || p.y + r < vp.min.y; } }); L.circle = function (latlng, radius, options) { return new L.Circle(latlng, radius, options); }; /* * L.CircleMarker is a circle overlay with a permanent pixel radius. */ L.CircleMarker = L.Circle.extend({ options: { radius: 10, weight: 2 }, initialize: function (latlng, options) { L.Circle.prototype.initialize.call(this, latlng, null, options); this._radius = this.options.radius; }, projectLatlngs: function () { this._point = this._map.latLngToLayerPoint(this._latlng); }, _updateStyle : function () { L.Circle.prototype._updateStyle.call(this); this.setRadius(this.options.radius); }, setRadius: function (radius) { this.options.radius = this._radius = radius; return this.redraw(); } }); L.circleMarker = function (latlng, options) { return new L.CircleMarker(latlng, options); }; /* * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines. */ L.Polyline.include(!L.Path.CANVAS ? {} : { _containsPoint: function (p, closed) { var i, j, k, len, len2, dist, part, w = this.options.weight / 2; if (L.Browser.touch) { w += 10; // polyline click tolerance on touch devices } for (i = 0, len = this._parts.length; i < len; i++) { part = this._parts[i]; for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { if (!closed && (j === 0)) { continue; } dist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]); if (dist <= w) { return true; } } } return false; } }); /* * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons. */ L.Polygon.include(!L.Path.CANVAS ? {} : { _containsPoint: function (p) { var inside = false, part, p1, p2, i, j, k, len, len2; // TODO optimization: check if within bounds first if (L.Polyline.prototype._containsPoint.call(this, p, true)) { // click on polygon border return true; } // ray casting algorithm for detecting if point is in polygon for (i = 0, len = this._parts.length; i < len; i++) { part = this._parts[i]; for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { p1 = part[j]; p2 = part[k]; if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { inside = !inside; } } } return inside; } }); /* * Extends L.Circle with Canvas-specific code. */ L.Circle.include(!L.Path.CANVAS ? {} : { _drawPath: function () { var p = this._point; this._ctx.beginPath(); this._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false); }, _containsPoint: function (p) { var center = this._point, w2 = this.options.stroke ? this.options.weight / 2 : 0; return (p.distanceTo(center) <= this._radius + w2); } }); /* * L.GeoJSON turns any GeoJSON data into a Leaflet layer. */ L.GeoJSON = L.FeatureGroup.extend({ initialize: function (geojson, options) { L.setOptions(this, options); this._layers = {}; if (geojson) { this.addData(geojson); } }, addData: function (geojson) { var features = L.Util.isArray(geojson) ? geojson : geojson.features, i, len; if (features) { for (i = 0, len = features.length; i < len; i++) { // Only add this if geometry or geometries are set and not null if (features[i].geometries || features[i].geometry || features[i].features) { this.addData(features[i]); } } return this; } var options = this.options; if (options.filter && !options.filter(geojson)) { return; } var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer); layer.feature = geojson; layer.defaultOptions = layer.options; this.resetStyle(layer); if (options.onEachFeature) { options.onEachFeature(geojson, layer); } return this.addLayer(layer); }, resetStyle: function (layer) { var style = this.options.style; if (style) { // reset any custom styles L.Util.extend(layer.options, layer.defaultOptions); this._setLayerStyle(layer, style); } }, setStyle: function (style) { this.eachLayer(function (layer) { this._setLayerStyle(layer, style); }, this); }, _setLayerStyle: function (layer, style) { if (typeof style === 'function') { style = style(layer.feature); } if (layer.setStyle) { layer.setStyle(style); } } }); L.extend(L.GeoJSON, { geometryToLayer: function (geojson, pointToLayer) { var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, coords = geometry.coordinates, layers = [], latlng, latlngs, i, len, layer; switch (geometry.type) { case 'Point': latlng = this.coordsToLatLng(coords); return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); case 'MultiPoint': for (i = 0, len = coords.length; i < len; i++) { latlng = this.coordsToLatLng(coords[i]); layer = pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); layers.push(layer); } return new L.FeatureGroup(layers); case 'LineString': latlngs = this.coordsToLatLngs(coords); return new L.Polyline(latlngs); case 'Polygon': latlngs = this.coordsToLatLngs(coords, 1); return new L.Polygon(latlngs); case 'MultiLineString': latlngs = this.coordsToLatLngs(coords, 1); return new L.MultiPolyline(latlngs); case 'MultiPolygon': latlngs = this.coordsToLatLngs(coords, 2); return new L.MultiPolygon(latlngs); case 'GeometryCollection': for (i = 0, len = geometry.geometries.length; i < len; i++) { layer = this.geometryToLayer({ geometry: geometry.geometries[i], type: 'Feature', properties: geojson.properties }, pointToLayer); layers.push(layer); } return new L.FeatureGroup(layers); default: throw new Error('Invalid GeoJSON object.'); } }, coordsToLatLng: function (coords, reverse) { // (Array, Boolean) -> LatLng var lat = parseFloat(coords[reverse ? 0 : 1]), lng = parseFloat(coords[reverse ? 1 : 0]); return new L.LatLng(lat, lng); }, coordsToLatLngs: function (coords, levelsDeep, reverse) { // (Array, Number, Boolean) -> Array var latlng, latlngs = [], i, len; for (i = 0, len = coords.length; i < len; i++) { latlng = levelsDeep ? this.coordsToLatLngs(coords[i], levelsDeep - 1, reverse) : this.coordsToLatLng(coords[i], reverse); latlngs.push(latlng); } return latlngs; } }); L.geoJson = function (geojson, options) { return new L.GeoJSON(geojson, options); }; /* * L.DomEvent contains functions for working with DOM events. */ L.DomEvent = { /* inspired by John Resig, Dean Edwards and YUI addEvent implementations */ addListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object]) var id = L.stamp(fn), key = '_leaflet_' + type + id, handler, originalHandler, newType; if (obj[key]) { return this; } handler = function (e) { return fn.call(context || obj, e || L.DomEvent._getEvent()); }; if (L.Browser.msTouch && type.indexOf('touch') === 0) { return this.addMsTouchListener(obj, type, handler, id); } if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) { this.addDoubleTapListener(obj, handler, id); } if ('addEventListener' in obj) { if (type === 'mousewheel') { obj.addEventListener('DOMMouseScroll', handler, false); obj.addEventListener(type, handler, false); } else if ((type === 'mouseenter') || (type === 'mouseleave')) { originalHandler = handler; newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout'); handler = function (e) { if (!L.DomEvent._checkMouse(obj, e)) { return; } return originalHandler(e); }; obj.addEventListener(newType, handler, false); } else { obj.addEventListener(type, handler, false); } } else if ('attachEvent' in obj) { obj.attachEvent("on" + type, handler); } obj[key] = handler; return this; }, removeListener: function (obj, type, fn) { // (HTMLElement, String, Function) var id = L.stamp(fn), key = '_leaflet_' + type + id, handler = obj[key]; if (!handler) { return; } if (L.Browser.msTouch && type.indexOf('touch') === 0) { this.removeMsTouchListener(obj, type, id); } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) { this.removeDoubleTapListener(obj, id); } else if ('removeEventListener' in obj) { if (type === 'mousewheel') { obj.removeEventListener('DOMMouseScroll', handler, false); obj.removeEventListener(type, handler, false); } else if ((type === 'mouseenter') || (type === 'mouseleave')) { obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false); } else { obj.removeEventListener(type, handler, false); } } else if ('detachEvent' in obj) { obj.detachEvent("on" + type, handler); } obj[key] = null; return this; }, stopPropagation: function (e) { if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; } return this; }, disableClickPropagation: function (el) { var stop = L.DomEvent.stopPropagation; for (var i = L.Draggable.START.length - 1; i >= 0; i--) { L.DomEvent.addListener(el, L.Draggable.START[i], stop); } return L.DomEvent .addListener(el, 'click', stop) .addListener(el, 'dblclick', stop); }, preventDefault: function (e) { if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } return this; }, stop: function (e) { return L.DomEvent.preventDefault(e).stopPropagation(e); }, getMousePosition: function (e, container) { var body = document.body, docEl = document.documentElement, x = e.pageX ? e.pageX : e.clientX + body.scrollLeft + docEl.scrollLeft, y = e.pageY ? e.pageY : e.clientY + body.scrollTop + docEl.scrollTop, pos = new L.Point(x, y); return (container ? pos._subtract(L.DomUtil.getViewportOffset(container)) : pos); }, getWheelDelta: function (e) { var delta = 0; if (e.wheelDelta) { delta = e.wheelDelta / 120; } if (e.detail) { delta = -e.detail / 3; } return delta; }, // check if element really left/entered the event target (for mouseenter/mouseleave) _checkMouse: function (el, e) { var related = e.relatedTarget; if (!related) { return true; } try { while (related && (related !== el)) { related = related.parentNode; } } catch (err) { return false; } return (related !== el); }, _getEvent: function () { // evil magic for IE /*jshint noarg:false */ var e = window.event; if (!e) { var caller = arguments.callee.caller; while (caller) { e = caller['arguments'][0]; if (e && window.Event === e.constructor) { break; } caller = caller.caller; } } return e; } }; L.DomEvent.on = L.DomEvent.addListener; L.DomEvent.off = L.DomEvent.removeListener; /* * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too. */ L.Draggable = L.Class.extend({ includes: L.Mixin.Events, statics: { START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'], END: { mousedown: 'mouseup', touchstart: 'touchend', MSPointerDown: 'touchend' }, MOVE: { mousedown: 'mousemove', touchstart: 'touchmove', MSPointerDown: 'touchmove' }, TAP_TOLERANCE: 15 }, initialize: function (element, dragStartTarget, longPress) { this._element = element; this._dragStartTarget = dragStartTarget || element; this._longPress = longPress && !L.Browser.msTouch; }, enable: function () { if (this._enabled) { return; } for (var i = L.Draggable.START.length - 1; i >= 0; i--) { L.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); } this._enabled = true; }, disable: function () { if (!this._enabled) { return; } for (var i = L.Draggable.START.length - 1; i >= 0; i--) { L.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); } this._enabled = false; this._moved = false; }, _onDown: function (e) { if ((!L.Browser.touch && e.shiftKey) || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } L.DomEvent.preventDefault(e); L.DomEvent.stopPropagation(e); if (L.Draggable._disabled) { return; } this._simulateClick = true; if (e.touches && e.touches.length > 1) { this._simulateClick = false; clearTimeout(this._longPressTimeout); return; } var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), el = first.target; if (L.Browser.touch && el.tagName.toLowerCase() === 'a') { L.DomUtil.addClass(el, 'leaflet-active'); } this._moved = false; if (this._moving) { return; } this._startPoint = new L.Point(first.clientX, first.clientY); this._startPos = this._newPos = L.DomUtil.getPosition(this._element); //Touch contextmenu event emulation if (e.touches && e.touches.length === 1 && L.Browser.touch && this._longPress) { this._longPressTimeout = setTimeout(L.bind(function () { var dist = (this._newPos && this._newPos.distanceTo(this._startPos)) || 0; if (dist < L.Draggable.TAP_TOLERANCE) { this._simulateClick = false; this._onUp(); this._simulateEvent('contextmenu', first); } }, this), 1000); } L.DomEvent.on(document, L.Draggable.MOVE[e.type], this._onMove, this); L.DomEvent.on(document, L.Draggable.END[e.type], this._onUp, this); }, _onMove: function (e) { if (e.touches && e.touches.length > 1) { return; } var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), newPoint = new L.Point(first.clientX, first.clientY), diffVec = newPoint.subtract(this._startPoint); if (!diffVec.x && !diffVec.y) { return; } L.DomEvent.preventDefault(e); if (!this._moved) { this.fire('dragstart'); this._moved = true; this._startPos = L.DomUtil.getPosition(this._element).subtract(diffVec); if (!L.Browser.touch) { L.DomUtil.disableTextSelection(); this._setMovingCursor(); } } this._newPos = this._startPos.add(diffVec); this._moving = true; L.Util.cancelAnimFrame(this._animRequest); this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget); }, _updatePosition: function () { this.fire('predrag'); L.DomUtil.setPosition(this._element, this._newPos); this.fire('drag'); }, _onUp: function (e) { var simulateClickTouch; clearTimeout(this._longPressTimeout); if (this._simulateClick && e.changedTouches) { var first = e.changedTouches[0], el = first.target, dist = (this._newPos && this._newPos.distanceTo(this._startPos)) || 0; if (el.tagName.toLowerCase() === 'a') { L.DomUtil.removeClass(el, 'leaflet-active'); } if (dist < L.Draggable.TAP_TOLERANCE) { simulateClickTouch = first; } } if (!L.Browser.touch) { L.DomUtil.enableTextSelection(); this._restoreCursor(); } for (var i in L.Draggable.MOVE) { if (L.Draggable.MOVE.hasOwnProperty(i)) { L.DomEvent.off(document, L.Draggable.MOVE[i], this._onMove); L.DomEvent.off(document, L.Draggable.END[i], this._onUp); } } if (this._moved) { // ensure drag is not fired after dragend L.Util.cancelAnimFrame(this._animRequest); this.fire('dragend'); } this._moving = false; if (simulateClickTouch) { this._moved = false; this._simulateEvent('click', simulateClickTouch); } }, _setMovingCursor: function () { L.DomUtil.addClass(document.body, 'leaflet-dragging'); }, _restoreCursor: function () { L.DomUtil.removeClass(document.body, 'leaflet-dragging'); }, _simulateEvent: function (type, e) { var simulatedEvent = document.createEvent('MouseEvents'); simulatedEvent.initMouseEvent( type, true, true, window, 1, e.screenX, e.screenY, e.clientX, e.clientY, false, false, false, false, 0, null); e.target.dispatchEvent(simulatedEvent); } }); /* L.Handler is a base class for handler classes that are used internally to inject interaction features like dragging to classes like Map and Marker. */ L.Handler = L.Class.extend({ initialize: function (map) { this._map = map; }, enable: function () { if (this._enabled) { return; } this._enabled = true; this.addHooks(); }, disable: function () { if (!this._enabled) { return; } this._enabled = false; this.removeHooks(); }, enabled: function () { return !!this._enabled; } }); /* * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default. */ L.Map.mergeOptions({ dragging: true, inertia: !L.Browser.android23, inertiaDeceleration: 3400, // px/s^2 inertiaMaxSpeed: Infinity, // px/s inertiaThreshold: L.Browser.touch ? 32 : 18, // ms easeLinearity: 0.25, longPress: true, // TODO refactor, move to CRS worldCopyJump: false }); L.Map.Drag = L.Handler.extend({ addHooks: function () { if (!this._draggable) { var map = this._map; this._draggable = new L.Draggable(map._mapPane, map._container, map.options.longPress); this._draggable.on({ 'dragstart': this._onDragStart, 'drag': this._onDrag, 'dragend': this._onDragEnd }, this); if (map.options.worldCopyJump) { this._draggable.on('predrag', this._onPreDrag, this); map.on('viewreset', this._onViewReset, this); } } this._draggable.enable(); }, removeHooks: function () { this._draggable.disable(); }, moved: function () { return this._draggable && this._draggable._moved; }, _onDragStart: function () { var map = this._map; if (map._panAnim) { map._panAnim.stop(); } map .fire('movestart') .fire('dragstart'); if (map.options.inertia) { this._positions = []; this._times = []; } }, _onDrag: function () { if (this._map.options.inertia) { var time = this._lastTime = +new Date(), pos = this._lastPos = this._draggable._newPos; this._positions.push(pos); this._times.push(time); if (time - this._times[0] > 200) { this._positions.shift(); this._times.shift(); } } this._map .fire('move') .fire('drag'); }, _onViewReset: function () { // TODO fix hardcoded Earth values var pxCenter = this._map.getSize()._divideBy(2), pxWorldCenter = this._map.latLngToLayerPoint(new L.LatLng(0, 0)); this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x; this._worldWidth = this._map.project(new L.LatLng(0, 180)).x; }, _onPreDrag: function () { // TODO refactor to be able to adjust map pane position after zoom var worldWidth = this._worldWidth, halfWidth = Math.round(worldWidth / 2), dx = this._initialWorldOffset, x = this._draggable._newPos.x, newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx, newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx, newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2; this._draggable._newPos.x = newX; }, _onDragEnd: function () { var map = this._map, options = map.options, delay = +new Date() - this._lastTime, noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0]; if (noInertia) { map.fire('moveend'); } else { var direction = this._lastPos.subtract(this._positions[0]), duration = (this._lastTime + delay - this._times[0]) / 1000, ease = options.easeLinearity, speedVector = direction.multiplyBy(ease / duration), speed = speedVector.distanceTo(new L.Point(0, 0)), limitedSpeed = Math.min(options.inertiaMaxSpeed, speed), limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed), decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease), offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round(); L.Util.requestAnimFrame(function () { map.panBy(offset, decelerationDuration, ease); }); } map.fire('dragend'); if (options.maxBounds) { // TODO predrag validation instead of animation L.Util.requestAnimFrame(this._panInsideMaxBounds, map, true, map._container); } }, _panInsideMaxBounds: function () { this.panInsideBounds(this.options.maxBounds); } }); L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag); /* * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default. */ L.Map.mergeOptions({ doubleClickZoom: true }); L.Map.DoubleClickZoom = L.Handler.extend({ addHooks: function () { this._map.on('dblclick', this._onDoubleClick); }, removeHooks: function () { this._map.off('dblclick', this._onDoubleClick); }, _onDoubleClick: function (e) { this.setView(e.latlng, this._zoom + 1); } }); L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom); /* * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map. */ L.Map.mergeOptions({ scrollWheelZoom: true }); L.Map.ScrollWheelZoom = L.Handler.extend({ addHooks: function () { L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this); this._delta = 0; }, removeHooks: function () { L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll); }, _onWheelScroll: function (e) { var delta = L.DomEvent.getWheelDelta(e); this._delta += delta; this._lastMousePos = this._map.mouseEventToContainerPoint(e); if (!this._startTime) { this._startTime = +new Date(); } var left = Math.max(40 - (+new Date() - this._startTime), 0); clearTimeout(this._timer); this._timer = setTimeout(L.bind(this._performZoom, this), left); L.DomEvent.preventDefault(e); L.DomEvent.stopPropagation(e); }, _performZoom: function () { var map = this._map, delta = this._delta, zoom = map.getZoom(); delta = delta > 0 ? Math.ceil(delta) : Math.round(delta); delta = Math.max(Math.min(delta, 4), -4); delta = map._limitZoom(zoom + delta) - zoom; this._delta = 0; this._startTime = null; if (!delta) { return; } var newZoom = zoom + delta, newCenter = this._getCenterForScrollWheelZoom(newZoom); map.setView(newCenter, newZoom); }, _getCenterForScrollWheelZoom: function (newZoom) { var map = this._map, scale = map.getZoomScale(newZoom), viewHalf = map.getSize()._divideBy(2), centerOffset = this._lastMousePos._subtract(viewHalf)._multiplyBy(1 - 1 / scale), newCenterPoint = map._getTopLeftPoint()._add(viewHalf)._add(centerOffset); return map.unproject(newCenterPoint); } }); L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom); /* * Extends the event handling code with double tap support for mobile browsers. */ L.extend(L.DomEvent, { _touchstart: L.Browser.msTouch ? 'MSPointerDown' : 'touchstart', _touchend: L.Browser.msTouch ? 'MSPointerUp' : 'touchend', // inspired by Zepto touch code by Thomas Fuchs addDoubleTapListener: function (obj, handler, id) { var last, doubleTap = false, delay = 250, touch, pre = '_leaflet_', touchstart = this._touchstart, touchend = this._touchend, trackedTouches = []; function onTouchStart(e) { var count; if (L.Browser.msTouch) { trackedTouches.push(e.pointerId); count = trackedTouches.length; } else { count = e.touches.length; } if (count > 1) { return; } var now = Date.now(), delta = now - (last || now); touch = e.touches ? e.touches[0] : e; doubleTap = (delta > 0 && delta <= delay); last = now; } function onTouchEnd(e) { /*jshint forin:false */ if (L.Browser.msTouch) { var idx = trackedTouches.indexOf(e.pointerId); if (idx === -1) { return; } trackedTouches.splice(idx, 1); } if (doubleTap) { if (L.Browser.msTouch) { //Work around .type being readonly with MSPointer* events var newTouch = { }, prop; for (var i in touch) { prop = touch[i]; if (typeof prop === 'function') { newTouch[i] = prop.bind(touch); } else { newTouch[i] = prop; } } touch = newTouch; } touch.type = 'dblclick'; handler(touch); last = null; } } obj[pre + touchstart + id] = onTouchStart; obj[pre + touchend + id] = onTouchEnd; //On msTouch we need to listen on the document otherwise a drag starting on the map and moving off screen will not come through to us // so we will lose track of how many touches are ongoing var endElement = L.Browser.msTouch ? document.documentElement : obj; obj.addEventListener(touchstart, onTouchStart, false); endElement.addEventListener(touchend, onTouchEnd, false); if (L.Browser.msTouch) { endElement.addEventListener('MSPointerCancel', onTouchEnd, false); } return this; }, removeDoubleTapListener: function (obj, id) { var pre = '_leaflet_'; obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); (L.Browser.msTouch ? document.documentElement : obj).removeEventListener(this._touchend, obj[pre + this._touchend + id], false); if (L.Browser.msTouch) { document.documentElement.removeEventListener('MSPointerCancel', obj[pre + this._touchend + id], false); } return this; } }); /* * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. */ L.extend(L.DomEvent, { _msTouches: [], _msDocumentListener: false, // Provides a touch events wrapper for msPointer events. // Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019 addMsTouchListener: function (obj, type, handler, id) { switch (type) { case 'touchstart': return this.addMsTouchListenerStart(obj, type, handler, id); case 'touchend': return this.addMsTouchListenerEnd(obj, type, handler, id); case 'touchmove': return this.addMsTouchListenerMove(obj, type, handler, id); default: throw 'Unknown touch event type'; } }, addMsTouchListenerStart: function (obj, type, handler, id) { var pre = '_leaflet_', touches = this._msTouches; var cb = function (e) { var alreadyInArray = false; for (var i = 0; i < touches.length; i++) { if (touches[i].pointerId === e.pointerId) { alreadyInArray = true; break; } } if (!alreadyInArray) { touches.push(e); } e.touches = touches.slice(); e.changedTouches = [e]; handler(e); }; obj[pre + 'touchstart' + id] = cb; obj.addEventListener('MSPointerDown', cb, false); // need to also listen for end events to keep the _msTouches list accurate // this needs to be on the body and never go away if (!this._msDocumentListener) { var internalCb = function (e) { for (var i = 0; i < touches.length; i++) { if (touches[i].pointerId === e.pointerId) { touches.splice(i, 1); break; } } }; //We listen on the documentElement as any drags that end by moving the touch off the screen get fired there document.documentElement.addEventListener('MSPointerUp', internalCb, false); document.documentElement.addEventListener('MSPointerCancel', internalCb, false); this._msDocumentListener = true; } return this; }, addMsTouchListenerMove: function (obj, type, handler, id) { var pre = '_leaflet_', touches = this._msTouches; function cb(e) { // don't fire touch moves when mouse isn't down if (e.pointerType === e.MSPOINTER_TYPE_MOUSE && e.buttons === 0) { return; } for (var i = 0; i < touches.length; i++) { if (touches[i].pointerId === e.pointerId) { touches[i] = e; break; } } e.touches = touches.slice(); e.changedTouches = [e]; handler(e); } obj[pre + 'touchmove' + id] = cb; obj.addEventListener('MSPointerMove', cb, false); return this; }, addMsTouchListenerEnd: function (obj, type, handler, id) { var pre = '_leaflet_', touches = this._msTouches; var cb = function (e) { for (var i = 0; i < touches.length; i++) { if (touches[i].pointerId === e.pointerId) { touches.splice(i, 1); break; } } e.touches = touches.slice(); e.changedTouches = [e]; handler(e); }; obj[pre + 'touchend' + id] = cb; obj.addEventListener('MSPointerUp', cb, false); obj.addEventListener('MSPointerCancel', cb, false); return this; }, removeMsTouchListener: function (obj, type, id) { var pre = '_leaflet_', cb = obj[pre + type + id]; switch (type) { case 'touchstart': obj.removeEventListener('MSPointerDown', cb, false); break; case 'touchmove': obj.removeEventListener('MSPointerMove', cb, false); break; case 'touchend': obj.removeEventListener('MSPointerUp', cb, false); obj.removeEventListener('MSPointerCancel', cb, false); break; } return this; } }); /* * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers. */ L.Map.mergeOptions({ touchZoom: L.Browser.touch && !L.Browser.android23 }); L.Map.TouchZoom = L.Handler.extend({ addHooks: function () { L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this); }, removeHooks: function () { L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this); }, _onTouchStart: function (e) { var map = this._map; if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; } var p1 = map.mouseEventToLayerPoint(e.touches[0]), p2 = map.mouseEventToLayerPoint(e.touches[1]), viewCenter = map._getCenterLayerPoint(); this._startCenter = p1.add(p2)._divideBy(2); this._startDist = p1.distanceTo(p2); this._moved = false; this._zooming = true; this._centerOffset = viewCenter.subtract(this._startCenter); if (map._panAnim) { map._panAnim.stop(); } L.DomEvent .on(document, 'touchmove', this._onTouchMove, this) .on(document, 'touchend', this._onTouchEnd, this); L.DomEvent.preventDefault(e); }, _onTouchMove: function (e) { if (!e.touches || e.touches.length !== 2) { return; } var map = this._map; var p1 = map.mouseEventToLayerPoint(e.touches[0]), p2 = map.mouseEventToLayerPoint(e.touches[1]); this._scale = p1.distanceTo(p2) / this._startDist; this._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter); if (this._scale === 1) { return; } if (!this._moved) { L.DomUtil.addClass(map._mapPane, 'leaflet-zoom-anim leaflet-touching'); map .fire('movestart') .fire('zoomstart') ._prepareTileBg(); this._moved = true; } L.Util.cancelAnimFrame(this._animRequest); this._animRequest = L.Util.requestAnimFrame( this._updateOnMove, this, true, this._map._container); L.DomEvent.preventDefault(e); }, _updateOnMove: function () { var map = this._map, origin = this._getScaleOrigin(), center = map.layerPointToLatLng(origin); map.fire('zoomanim', { center: center, zoom: map.getScaleZoom(this._scale) }); // Used 2 translates instead of transform-origin because of a very strange bug - // it didn't count the origin on the first touch-zoom but worked correctly afterwards map._tileBg.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(this._delta) + ' ' + L.DomUtil.getScaleString(this._scale, this._startCenter); }, _onTouchEnd: function () { if (!this._moved || !this._zooming) { return; } var map = this._map; this._zooming = false; L.DomUtil.removeClass(map._mapPane, 'leaflet-touching'); L.DomEvent .off(document, 'touchmove', this._onTouchMove) .off(document, 'touchend', this._onTouchEnd); var origin = this._getScaleOrigin(), center = map.layerPointToLatLng(origin), oldZoom = map.getZoom(), floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom, roundZoomDelta = (floatZoomDelta > 0 ? Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)), zoom = map._limitZoom(oldZoom + roundZoomDelta); map.fire('zoomanim', { center: center, zoom: zoom }); map._runAnimation(center, zoom, map.getZoomScale(zoom) / this._scale, origin, true); }, _getScaleOrigin: function () { var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale); return this._startCenter.add(centerOffset); } }); L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom); /* * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map * (zoom to a selected bounding box), enabled by default. */ L.Map.mergeOptions({ boxZoom: true }); L.Map.BoxZoom = L.Handler.extend({ initialize: function (map) { this._map = map; this._container = map._container; this._pane = map._panes.overlayPane; }, addHooks: function () { L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); }, removeHooks: function () { L.DomEvent.off(this._container, 'mousedown', this._onMouseDown); }, _onMouseDown: function (e) { if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } L.DomUtil.disableTextSelection(); this._startLayerPoint = this._map.mouseEventToLayerPoint(e); this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); L.DomUtil.setPosition(this._box, this._startLayerPoint); //TODO refactor: move cursor to styles this._container.style.cursor = 'crosshair'; L.DomEvent .on(document, 'mousemove', this._onMouseMove, this) .on(document, 'mouseup', this._onMouseUp, this) .preventDefault(e); this._map.fire("boxzoomstart"); }, _onMouseMove: function (e) { var startPoint = this._startLayerPoint, box = this._box, layerPoint = this._map.mouseEventToLayerPoint(e), offset = layerPoint.subtract(startPoint), newPos = new L.Point( Math.min(layerPoint.x, startPoint.x), Math.min(layerPoint.y, startPoint.y)); L.DomUtil.setPosition(box, newPos); // TODO refactor: remove hardcoded 4 pixels box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px'; box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px'; }, _onMouseUp: function (e) { this._pane.removeChild(this._box); this._container.style.cursor = ''; L.DomUtil.enableTextSelection(); L.DomEvent .off(document, 'mousemove', this._onMouseMove) .off(document, 'mouseup', this._onMouseUp); var map = this._map, layerPoint = map.mouseEventToLayerPoint(e); if (this._startLayerPoint.equals(layerPoint)) { return; } var bounds = new L.LatLngBounds( map.layerPointToLatLng(this._startLayerPoint), map.layerPointToLatLng(layerPoint)); map.fitBounds(bounds); map.fire("boxzoomend", { boxZoomBounds: bounds }); } }); L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom); /* * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default. */ L.Map.mergeOptions({ keyboard: true, keyboardPanOffset: 80, keyboardZoomOffset: 1 }); L.Map.Keyboard = L.Handler.extend({ keyCodes: { left: [37], right: [39], down: [40], up: [38], zoomIn: [187, 107, 61], zoomOut: [189, 109, 173] }, initialize: function (map) { this._map = map; this._setPanOffset(map.options.keyboardPanOffset); this._setZoomOffset(map.options.keyboardZoomOffset); }, addHooks: function () { var container = this._map._container; // make the container focusable by tabbing if (container.tabIndex === -1) { container.tabIndex = "0"; } L.DomEvent .on(container, 'focus', this._onFocus, this) .on(container, 'blur', this._onBlur, this) .on(container, 'mousedown', this._onMouseDown, this); this._map .on('focus', this._addHooks, this) .on('blur', this._removeHooks, this); }, removeHooks: function () { this._removeHooks(); var container = this._map._container; L.DomEvent .off(container, 'focus', this._onFocus, this) .off(container, 'blur', this._onBlur, this) .off(container, 'mousedown', this._onMouseDown, this); this._map .off('focus', this._addHooks, this) .off('blur', this._removeHooks, this); }, _onMouseDown: function () { if (!this._focused) { this._map._container.focus(); } }, _onFocus: function () { this._focused = true; this._map.fire('focus'); }, _onBlur: function () { this._focused = false; this._map.fire('blur'); }, _setPanOffset: function (pan) { var keys = this._panKeys = {}, codes = this.keyCodes, i, len; for (i = 0, len = codes.left.length; i < len; i++) { keys[codes.left[i]] = [-1 * pan, 0]; } for (i = 0, len = codes.right.length; i < len; i++) { keys[codes.right[i]] = [pan, 0]; } for (i = 0, len = codes.down.length; i < len; i++) { keys[codes.down[i]] = [0, pan]; } for (i = 0, len = codes.up.length; i < len; i++) { keys[codes.up[i]] = [0, -1 * pan]; } }, _setZoomOffset: function (zoom) { var keys = this._zoomKeys = {}, codes = this.keyCodes, i, len; for (i = 0, len = codes.zoomIn.length; i < len; i++) { keys[codes.zoomIn[i]] = zoom; } for (i = 0, len = codes.zoomOut.length; i < len; i++) { keys[codes.zoomOut[i]] = -zoom; } }, _addHooks: function () { L.DomEvent.on(document, 'keydown', this._onKeyDown, this); }, _removeHooks: function () { L.DomEvent.off(document, 'keydown', this._onKeyDown, this); }, _onKeyDown: function (e) { var key = e.keyCode, map = this._map; if (this._panKeys.hasOwnProperty(key)) { map.panBy(this._panKeys[key]); if (map.options.maxBounds) { map.panInsideBounds(map.options.maxBounds); } } else if (this._zoomKeys.hasOwnProperty(key)) { map.setZoom(map.getZoom() + this._zoomKeys[key]); } else { return; } L.DomEvent.stop(e); } }); L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard); /* * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable. */ L.Handler.MarkerDrag = L.Handler.extend({ initialize: function (marker) { this._marker = marker; }, addHooks: function () { var icon = this._marker._icon; if (!this._draggable) { this._draggable = new L.Draggable(icon, icon) .on('dragstart', this._onDragStart, this) .on('drag', this._onDrag, this) .on('dragend', this._onDragEnd, this); } this._draggable.enable(); }, removeHooks: function () { this._draggable.disable(); }, moved: function () { return this._draggable && this._draggable._moved; }, _onDragStart: function () { this._marker .closePopup() .fire('movestart') .fire('dragstart'); }, _onDrag: function () { var marker = this._marker, shadow = marker._shadow, iconPos = L.DomUtil.getPosition(marker._icon), latlng = marker._map.layerPointToLatLng(iconPos); // update shadow position if (shadow) { L.DomUtil.setPosition(shadow, iconPos); } marker._latlng = latlng; marker .fire('move', {latlng: latlng}) .fire('drag'); }, _onDragEnd: function () { this._marker .fire('moveend') .fire('dragend'); } }); /* * L.Handler.PolyEdit is an editing handler for polylines and polygons. */ L.Handler.PolyEdit = L.Handler.extend({ options: { icon: new L.DivIcon({ iconSize: new L.Point(8, 8), className: 'leaflet-div-icon leaflet-editing-icon' }) }, initialize: function (poly, options) { this._poly = poly; L.setOptions(this, options); }, addHooks: function () { if (this._poly._map) { if (!this._markerGroup) { this._initMarkers(); } this._poly._map.addLayer(this._markerGroup); } }, removeHooks: function () { if (this._poly._map) { this._poly._map.removeLayer(this._markerGroup); delete this._markerGroup; delete this._markers; } }, updateMarkers: function () { this._markerGroup.clearLayers(); this._initMarkers(); }, _initMarkers: function () { if (!this._markerGroup) { this._markerGroup = new L.LayerGroup(); } this._markers = []; var latlngs = this._poly._latlngs, i, j, len, marker; // TODO refactor holes implementation in Polygon to support it here for (i = 0, len = latlngs.length; i < len; i++) { marker = this._createMarker(latlngs[i], i); marker.on('click', this._onMarkerClick, this); this._markers.push(marker); } var markerLeft, markerRight; for (i = 0, j = len - 1; i < len; j = i++) { if (i === 0 && !(L.Polygon && (this._poly instanceof L.Polygon))) { continue; } markerLeft = this._markers[j]; markerRight = this._markers[i]; this._createMiddleMarker(markerLeft, markerRight); this._updatePrevNext(markerLeft, markerRight); } }, _createMarker: function (latlng, index) { var marker = new L.Marker(latlng, { draggable: true, icon: this.options.icon }); marker._origLatLng = latlng; marker._index = index; marker.on('drag', this._onMarkerDrag, this); marker.on('dragend', this._fireEdit, this); this._markerGroup.addLayer(marker); return marker; }, _fireEdit: function () { this._poly.fire('edit'); }, _onMarkerDrag: function (e) { var marker = e.target; L.extend(marker._origLatLng, marker._latlng); if (marker._middleLeft) { marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker)); } if (marker._middleRight) { marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next)); } this._poly.redraw(); }, _onMarkerClick: function (e) { // we want to remove the marker on click, but if latlng count < 3, polyline would be invalid if (this._poly._latlngs.length < 3) { return; } var marker = e.target, i = marker._index; // remove the marker this._markerGroup.removeLayer(marker); this._markers.splice(i, 1); this._poly.spliceLatLngs(i, 1); this._updateIndexes(i, -1); // update prev/next links of adjacent markers this._updatePrevNext(marker._prev, marker._next); // remove ghost markers near the removed marker if (marker._middleLeft) { this._markerGroup.removeLayer(marker._middleLeft); } if (marker._middleRight) { this._markerGroup.removeLayer(marker._middleRight); } // create a ghost marker in place of the removed one if (marker._prev && marker._next) { this._createMiddleMarker(marker._prev, marker._next); } else if (!marker._prev) { marker._next._middleLeft = null; } else if (!marker._next) { marker._prev._middleRight = null; } this._poly.fire('edit'); }, _updateIndexes: function (index, delta) { this._markerGroup.eachLayer(function (marker) { if (marker._index > index) { marker._index += delta; } }); }, _createMiddleMarker: function (marker1, marker2) { var latlng = this._getMiddleLatLng(marker1, marker2), marker = this._createMarker(latlng), onClick, onDragStart, onDragEnd; marker.setOpacity(0.6); marker1._middleRight = marker2._middleLeft = marker; onDragStart = function () { var i = marker2._index; marker._index = i; marker .off('click', onClick) .on('click', this._onMarkerClick, this); latlng.lat = marker.getLatLng().lat; latlng.lng = marker.getLatLng().lng; this._poly.spliceLatLngs(i, 0, latlng); this._markers.splice(i, 0, marker); marker.setOpacity(1); this._updateIndexes(i, 1); marker2._index++; this._updatePrevNext(marker1, marker); this._updatePrevNext(marker, marker2); }; onDragEnd = function () { marker.off('dragstart', onDragStart, this); marker.off('dragend', onDragEnd, this); this._createMiddleMarker(marker1, marker); this._createMiddleMarker(marker, marker2); }; onClick = function () { onDragStart.call(this); onDragEnd.call(this); this._poly.fire('edit'); }; marker .on('click', onClick, this) .on('dragstart', onDragStart, this) .on('dragend', onDragEnd, this); this._markerGroup.addLayer(marker); }, _updatePrevNext: function (marker1, marker2) { if (marker1) { marker1._next = marker2; } if (marker2) { marker2._prev = marker1; } }, _getMiddleLatLng: function (marker1, marker2) { var map = this._poly._map, p1 = map.latLngToLayerPoint(marker1.getLatLng()), p2 = map.latLngToLayerPoint(marker2.getLatLng()); return map.layerPointToLatLng(p1._add(p2)._divideBy(2)); } }); L.Polyline.addInitHook(function () { if (L.Handler.PolyEdit) { this.editing = new L.Handler.PolyEdit(this); if (this.options.editable) { this.editing.enable(); } } this.on('add', function () { if (this.editing && this.editing.enabled()) { this.editing.addHooks(); } }); this.on('remove', function () { if (this.editing && this.editing.enabled()) { this.editing.removeHooks(); } }); }); /* * L.Control is a base class for implementing map controls. Handles positioning. * All other controls extend from this class. */ L.Control = L.Class.extend({ options: { position: 'topright' }, initialize: function (options) { L.setOptions(this, options); }, getPosition: function () { return this.options.position; }, setPosition: function (position) { var map = this._map; if (map) { map.removeControl(this); } this.options.position = position; if (map) { map.addControl(this); } return this; }, addTo: function (map) { this._map = map; var container = this._container = this.onAdd(map), pos = this.getPosition(), corner = map._controlCorners[pos]; L.DomUtil.addClass(container, 'leaflet-control'); if (pos.indexOf('bottom') !== -1) { corner.insertBefore(container, corner.firstChild); } else { corner.appendChild(container); } return this; }, removeFrom: function (map) { var pos = this.getPosition(), corner = map._controlCorners[pos]; corner.removeChild(this._container); this._map = null; if (this.onRemove) { this.onRemove(map); } return this; } }); L.control = function (options) { return new L.Control(options); }; /* * Adds control-related methods to L.Map. */ L.Map.include({ addControl: function (control) { control.addTo(this); return this; }, removeControl: function (control) { control.removeFrom(this); return this; }, _initControlPos: function () { var corners = this._controlCorners = {}, l = 'leaflet-', container = this._controlContainer = L.DomUtil.create('div', l + 'control-container', this._container); function createCorner(vSide, hSide) { var className = l + vSide + ' ' + l + hSide; corners[vSide + hSide] = L.DomUtil.create('div', className, container); } createCorner('top', 'left'); createCorner('top', 'right'); createCorner('bottom', 'left'); createCorner('bottom', 'right'); } }); /* * L.Control.Zoom is used for the default zoom buttons on the map. */ L.Control.Zoom = L.Control.extend({ options: { position: 'topleft' }, onAdd: function (map) { var zoomName = 'leaflet-control-zoom', barName = 'leaflet-bar', partName = barName + '-part', container = L.DomUtil.create('div', zoomName + ' ' + barName); this._map = map; this._zoomInButton = this._createButton('+', 'Zoom in', zoomName + '-in ' + partName + ' ' + partName + '-top', container, this._zoomIn, this); this._zoomOutButton = this._createButton('-', 'Zoom out', zoomName + '-out ' + partName + ' ' + partName + '-bottom', container, this._zoomOut, this); map.on('zoomend', this._updateDisabled, this); return container; }, onRemove: function (map) { map.off('zoomend', this._updateDisabled, this); }, _zoomIn: function (e) { this._map.zoomIn(e.shiftKey ? 3 : 1); }, _zoomOut: function (e) { this._map.zoomOut(e.shiftKey ? 3 : 1); }, _createButton: function (html, title, className, container, fn, context) { var link = L.DomUtil.create('a', className, container); link.innerHTML = html; link.href = '#'; link.title = title; var stop = L.DomEvent.stopPropagation; L.DomEvent .on(link, 'click', stop) .on(link, 'mousedown', stop) .on(link, 'dblclick', stop) .on(link, 'click', L.DomEvent.preventDefault) .on(link, 'click', fn, context); return link; }, _updateDisabled: function () { var map = this._map, className = 'leaflet-control-zoom-disabled'; L.DomUtil.removeClass(this._zoomInButton, className); L.DomUtil.removeClass(this._zoomOutButton, className); if (map._zoom === map.getMinZoom()) { L.DomUtil.addClass(this._zoomOutButton, className); } if (map._zoom === map.getMaxZoom()) { L.DomUtil.addClass(this._zoomInButton, className); } } }); L.Map.mergeOptions({ zoomControl: true }); L.Map.addInitHook(function () { if (this.options.zoomControl) { this.zoomControl = new L.Control.Zoom(); this.addControl(this.zoomControl); } }); L.control.zoom = function (options) { return new L.Control.Zoom(options); }; /* * L.Control.Attribution is used for displaying attribution on the map (added by default). */ L.Control.Attribution = L.Control.extend({ options: { position: 'bottomright', prefix: 'Powered by Leaflet' }, initialize: function (options) { L.setOptions(this, options); this._attributions = {}; }, onAdd: function (map) { this._container = L.DomUtil.create('div', 'leaflet-control-attribution'); L.DomEvent.disableClickPropagation(this._container); map .on('layeradd', this._onLayerAdd, this) .on('layerremove', this._onLayerRemove, this); this._update(); return this._container; }, onRemove: function (map) { map .off('layeradd', this._onLayerAdd) .off('layerremove', this._onLayerRemove); }, setPrefix: function (prefix) { this.options.prefix = prefix; this._update(); return this; }, addAttribution: function (text) { if (!text) { return; } if (!this._attributions[text]) { this._attributions[text] = 0; } this._attributions[text]++; this._update(); return this; }, removeAttribution: function (text) { if (!text) { return; } this._attributions[text]--; this._update(); return this; }, _update: function () { if (!this._map) { return; } var attribs = []; for (var i in this._attributions) { if (this._attributions.hasOwnProperty(i) && this._attributions[i]) { attribs.push(i); } } var prefixAndAttribs = []; if (this.options.prefix) { prefixAndAttribs.push(this.options.prefix); } if (attribs.length) { prefixAndAttribs.push(attribs.join(', ')); } this._container.innerHTML = prefixAndAttribs.join(' — '); }, _onLayerAdd: function (e) { if (e.layer.getAttribution) { this.addAttribution(e.layer.getAttribution()); } }, _onLayerRemove: function (e) { if (e.layer.getAttribution) { this.removeAttribution(e.layer.getAttribution()); } } }); L.Map.mergeOptions({ attributionControl: true }); L.Map.addInitHook(function () { if (this.options.attributionControl) { this.attributionControl = (new L.Control.Attribution()).addTo(this); } }); L.control.attribution = function (options) { return new L.Control.Attribution(options); }; /* * L.Control.Scale is used for displaying metric/imperial scale on the map. */ L.Control.Scale = L.Control.extend({ options: { position: 'bottomleft', maxWidth: 100, metric: true, imperial: true, updateWhenIdle: false }, onAdd: function (map) { this._map = map; var className = 'leaflet-control-scale', container = L.DomUtil.create('div', className), options = this.options; this._addScales(options, className, container); map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this); map.whenReady(this._update, this); return container; }, onRemove: function (map) { map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this); }, _addScales: function (options, className, container) { if (options.metric) { this._mScale = L.DomUtil.create('div', className + '-line', container); } if (options.imperial) { this._iScale = L.DomUtil.create('div', className + '-line', container); } }, _update: function () { var bounds = this._map.getBounds(), centerLat = bounds.getCenter().lat, halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180), dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180, size = this._map.getSize(), options = this.options, maxMeters = 0; if (size.x > 0) { maxMeters = dist * (options.maxWidth / size.x); } this._updateScales(options, maxMeters); }, _updateScales: function (options, maxMeters) { if (options.metric && maxMeters) { this._updateMetric(maxMeters); } if (options.imperial && maxMeters) { this._updateImperial(maxMeters); } }, _updateMetric: function (maxMeters) { var meters = this._getRoundNum(maxMeters); this._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px'; this._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; }, _updateImperial: function (maxMeters) { var maxFeet = maxMeters * 3.2808399, scale = this._iScale, maxMiles, miles, feet; if (maxFeet > 5280) { maxMiles = maxFeet / 5280; miles = this._getRoundNum(maxMiles); scale.style.width = this._getScaleWidth(miles / maxMiles) + 'px'; scale.innerHTML = miles + ' mi'; } else { feet = this._getRoundNum(maxFeet); scale.style.width = this._getScaleWidth(feet / maxFeet) + 'px'; scale.innerHTML = feet + ' ft'; } }, _getScaleWidth: function (ratio) { return Math.round(this.options.maxWidth * ratio) - 10; }, _getRoundNum: function (num) { var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1), d = num / pow10; d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1; return pow10 * d; } }); L.control.scale = function (options) { return new L.Control.Scale(options); }; /* * L.Control.Layers is a control to allow users to switch between different layers on the map. */ L.Control.Layers = L.Control.extend({ options: { collapsed: true, position: 'topright', autoZIndex: true }, initialize: function (baseLayers, overlays, options) { L.setOptions(this, options); this._layers = {}; this._lastZIndex = 0; this._handlingClick = false; for (var i in baseLayers) { if (baseLayers.hasOwnProperty(i)) { this._addLayer(baseLayers[i], i); } } for (i in overlays) { if (overlays.hasOwnProperty(i)) { this._addLayer(overlays[i], i, true); } } }, onAdd: function (map) { this._initLayout(); this._update(); map .on('layeradd', this._onLayerChange, this) .on('layerremove', this._onLayerChange, this); return this._container; }, onRemove: function (map) { map .off('layeradd', this._onLayerChange) .off('layerremove', this._onLayerChange); }, addBaseLayer: function (layer, name) { this._addLayer(layer, name); this._update(); return this; }, addOverlay: function (layer, name) { this._addLayer(layer, name, true); this._update(); return this; }, removeLayer: function (layer) { var id = L.stamp(layer); delete this._layers[id]; this._update(); return this; }, _initLayout: function () { var className = 'leaflet-control-layers', container = this._container = L.DomUtil.create('div', className); if (!L.Browser.touch) { L.DomEvent.disableClickPropagation(container); L.DomEvent.on(container, 'mousewheel', L.DomEvent.stopPropagation); } else { L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation); } var form = this._form = L.DomUtil.create('form', className + '-list'); if (this.options.collapsed) { L.DomEvent .on(container, 'mouseover', this._expand, this) .on(container, 'mouseout', this._collapse, this); var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container); link.href = '#'; link.title = 'Layers'; if (L.Browser.touch) { L.DomEvent .on(link, 'click', L.DomEvent.stopPropagation) .on(link, 'click', L.DomEvent.preventDefault) .on(link, 'click', this._expand, this); } else { L.DomEvent.on(link, 'focus', this._expand, this); } this._map.on('movestart', this._collapse, this); // TODO keyboard accessibility } else { this._expand(); } this._baseLayersList = L.DomUtil.create('div', className + '-base', form); this._separator = L.DomUtil.create('div', className + '-separator', form); this._overlaysList = L.DomUtil.create('div', className + '-overlays', form); container.appendChild(form); }, _addLayer: function (layer, name, overlay) { var id = L.stamp(layer); this._layers[id] = { layer: layer, name: name, overlay: overlay }; if (this.options.autoZIndex && layer.setZIndex) { this._lastZIndex++; layer.setZIndex(this._lastZIndex); } }, _update: function () { if (!this._container) { return; } this._baseLayersList.innerHTML = ''; this._overlaysList.innerHTML = ''; var baseLayersPresent = false, overlaysPresent = false; for (var i in this._layers) { if (this._layers.hasOwnProperty(i)) { var obj = this._layers[i]; this._addItem(obj); overlaysPresent = overlaysPresent || obj.overlay; baseLayersPresent = baseLayersPresent || !obj.overlay; } } this._separator.style.display = (overlaysPresent && baseLayersPresent ? '' : 'none'); }, _onLayerChange: function (e) { var id = L.stamp(e.layer); if (this._layers[id] && !this._handlingClick) { this._update(); } }, // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe) _createRadioElement: function (name, checked) { var radioHtml = ' 0.5 && this._getLoadedTilesPercentage(tilePane) < 0.5) { tilePane.style.visibility = 'hidden'; tilePane.empty = true; this._stopLoadingImages(tilePane); return; } if (!tileBg) { tileBg = this._tileBg = this._createPane('leaflet-tile-pane', this._mapPane); tileBg.style.zIndex = 1; } // prepare the background pane to become the main tile pane tileBg.style[L.DomUtil.TRANSFORM] = ''; tileBg.style.visibility = 'hidden'; // tells tile layers to reinitialize their containers tileBg.empty = true; //new FG tilePane.empty = false; //new BG //Switch out the current layer to be the new bg layer (And vice-versa) this._tilePane = this._panes.tilePane = tileBg; var newTileBg = this._tileBg = tilePane; L.DomUtil.addClass(newTileBg, 'leaflet-zoom-animated'); this._stopLoadingImages(newTileBg); }, _getLoadedTilesPercentage: function (container) { var tiles = container.getElementsByTagName('img'), i, len, count = 0; for (i = 0, len = tiles.length; i < len; i++) { if (tiles[i].complete) { count++; } } return count / len; }, // stops loading all tiles in the background layer _stopLoadingImages: function (container) { var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')), i, len, tile; for (i = 0, len = tiles.length; i < len; i++) { tile = tiles[i]; if (!tile.complete) { tile.onload = L.Util.falseFn; tile.onerror = L.Util.falseFn; tile.src = L.Util.emptyImageUrl; tile.parentNode.removeChild(tile); } } }, _onZoomTransitionEnd: function () { this._restoreTileFront(); L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); L.Util.falseFn(this._tileBg.offsetWidth); // force reflow this._animatingZoom = false; this._resetView(this._animateToCenter, this._animateToZoom, true, true); if (L.Draggable) { L.Draggable._disabled = false; } }, _restoreTileFront: function () { this._tilePane.innerHTML = ''; this._tilePane.style.visibility = ''; this._tilePane.style.zIndex = 2; this._tileBg.style.zIndex = 1; }, _clearTileBg: function () { if (!this._animatingZoom && !this.touchZoom._zooming) { this._tileBg.innerHTML = ''; } } }); /* * Provides L.Map with convenient shortcuts for using browser geolocation features. */ L.Map.include({ _defaultLocateOptions: { watch: false, setView: false, maxZoom: Infinity, timeout: 10000, maximumAge: 0, enableHighAccuracy: false }, locate: function (/*Object*/ options) { options = this._locationOptions = L.extend(this._defaultLocateOptions, options); if (!navigator.geolocation) { this._handleGeolocationError({ code: 0, message: "Geolocation not supported." }); return this; } var onResponse = L.bind(this._handleGeolocationResponse, this), onError = L.bind(this._handleGeolocationError, this); if (options.watch) { this._locationWatchId = navigator.geolocation.watchPosition(onResponse, onError, options); } else { navigator.geolocation.getCurrentPosition(onResponse, onError, options); } return this; }, stopLocate: function () { if (navigator.geolocation) { navigator.geolocation.clearWatch(this._locationWatchId); } return this; }, _handleGeolocationError: function (error) { var c = error.code, message = error.message || (c === 1 ? "permission denied" : (c === 2 ? "position unavailable" : "timeout")); if (this._locationOptions.setView && !this._loaded) { this.fitWorld(); } this.fire('locationerror', { code: c, message: "Geolocation error: " + message + "." }); }, _handleGeolocationResponse: function (pos) { var latAccuracy = 180 * pos.coords.accuracy / 4e7, lngAccuracy = latAccuracy * 2, lat = pos.coords.latitude, lng = pos.coords.longitude, latlng = new L.LatLng(lat, lng), sw = new L.LatLng(lat - latAccuracy, lng - lngAccuracy), ne = new L.LatLng(lat + latAccuracy, lng + lngAccuracy), bounds = new L.LatLngBounds(sw, ne), options = this._locationOptions; if (options.setView) { var zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom); this.setView(latlng, zoom); } this.fire('locationfound', { latlng: latlng, bounds: bounds, accuracy: pos.coords.accuracy }); } }); }(this, document));package/LICENSE.md000644 000765 000024 0000002052 12220204170012120 0ustar00000000 000000 Copyright (c) 2013 Michael Lawrence Evans Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. package/screenshots/screenshot.png000644 000765 000024 0001641267 12220204170015761 0ustar00000000 000000 PNG  IHDR)iCCPICC ProfileXYXAoenF`F%EJ E@ JAA D TPA?g{|gΜ9L][aaAJC"88(>D0M _8vOvewX#=,` aQwF|F ¸f7㱱҆4$x"1e !Px0V#z\ z%L"/=BD.A`+>2~v$ZØ' MaQZV.(C]_>Մ1+Cwa;!C7߽l ~GRF[&_HI?t"m"v c}l/o ˁ  <@h'Ap=E/rk ~{$Tog43J 2[ JQJ //귮p_}־1jĿuosH^\3bt0=2yُ@v!'692 q*{5G{BF9anOk WXRXJ 1 P5Q`oŀϞ-c88;.j7еC#}85[0S\SZRJW=<8&-$ }0d (WxFGv4 8zJy4.08Wغ~ 8) |P ΀Jp\5]p<#` X+`lB! HR ]!w CPBg* ݀B(/OG" "BaAD" t iD5цxCL#kH$C#bHE6AF %jdŧi2rAѠ8Qb' P(OT8*uuՆE=E͠VPhVZmv@ct-wu C( $br1f(fb"XU9f`K'w$d$$$z$N$!$$%$ $H| $$#U&5'"'#!$}LtGlpi\7JFFMDfIOLv  <5^wGOw/_5ȝȣOד#"A! ^$BB•":ceJRJ~JmJ"2kT4TRTTTT TTXj~j]j/th4<444i454}4h19iiWdAy21h2x3d141R>E>?S|| 0  $\$T |&R F ?AȋTEDCDE'bb1bfMS?IJ8IHK |%E-e$*)EZXSL LL̪Yr4rrz#x&i-s(6啣)VS TiP? p@́9UnUj9iu.uzFM!FOZZZZߵkAd Rѝջ/m`lP`0afiXob`tبolm|xD$¤ajdztҌ,Ĭ4m!`nqciaYfJU5uM+[Ah; ;z::2;;v8aj֜u߹ȹd8wp5ȵۍvnE4'V< ==V<=Oy.yixy-xzzQ)U=W5 2{y`]N}Ps0I{Pи0pH(`dG-|>=S#.zU\HPp|V DĞC\R<\u:q'')=]~\J`ʣToiilsG^ dDdLS9VΒ*=#S;x\;'|N \,*L(;iz([[@lI)ܩSӧMNwn;3VU\ZU«YMl9?{^_V_]rs> kksjB/Z]Wo`mȻ}iѥq&f+JūWǯ_빮x5 jo[ikpatSͺ.n[[vn'^vgݹW=3{p_~Tt (Tl(mHnܣa ;FF:GzS>{8f66:n;|ebA/V_Ƽ|<~MduЛiYWssKo#nKOLJyEwKaK>YЊʻՈ՝/_}ֳf6=ӏ?~،nekr'xg'Aܻ K8@3;7/H򁀟v.BbD0$XIG4mW|rwοI53}kyE饋  >|ynjׯL{~پ)$ FaVH8?r4A">5M<3ziTr,#\]ܓ[\Fq\TYMe5& SΚZcWuruS72,61603 54Ra%!?8;sjr.s>C`<Ƽ{}Z}kJB4BH ]s7y\r!G81oRZS"]f8L˪ȾӚvռ ϝ,+*.+:z:4oyrJs(c%S sl7٫888rps/d m H a ?d y %ML,lܲQv2L|IESTհje ZZ/wtu-H25X46r1f47)6600OPflh-`֦3<V g^.%񹵸k$yp{<?o}_%?Cb@p 1H=2x2Bhp\VH(Wѕ1^O&%&>=t#Ioԧu=&|UÛ;}щy8*d>Q4^|ԩ K\/_b9*j5.Bke]̭On ^Rh$4~i *5--m?:nu޼}=7zKd v1|Lk<arivxqƮF[0L![u zO Tp 8r$]恳  gAP=#0A "Qy;p^GD͢eЙ7eL)fΰIHHYH pd,2Y>_G.KEP%tR(Rܤ4|EEMI}FfֆvΜ RFU),̝,]l1_9qFpqmq'O \%n}+1&*(-%=%)+'YCP!^KDYRAU\LCDրg]=:}&VC^#Yc3pf_,yOۡu2]<6u<0k&})>. f ~ב X{HY2}JA.=ڱ̥T'>ԟv;C_6RqRZu^ _._mz}|RLJι w[?x$X~4 K743-i~lE:?mj# 0. d*06DJA=`BC̐" 4 }DP dN45;$ Y\FɣQch!t z}`c$$ 8!\#,m~<@J(ࢸ篯bih>ѝded`L|%u݁g$y{/E@çXX!(IO) iLܪ ~6j\1Yj5estjun4601A ٙh\qrv pjsw=>J1uKH:R+>"6,aWb̡#rI5),E鸣˙ĬٜyׅWbJdO})Z]|j5j.^i`T~YkJׇ[m՝]ɝ՞^Q=y~Z=6a"UoSZ`XĿkzV^\@m`\aW~h?2A^'"#H:7ŊJF-я0ژn*. kH o''H~PQRES;Y1(0 11ijFypqrrZG lz J. #qFr\YKYnSBrG5zƖvv.[Æ&mf捖Vm6ڶ8F;W*w27/g﷾*~9BLC;GG%ưNOs"6gjU]DZ>yL|OR.xTSU(^gixИԤE^KR[uG^cCA<(x!կ׺SoPΝ{^C菬$?دx}mm:zwgoѶAѶSgρM¦͑--[ \ێۅۃۿ~y:_;R;;wv##w|@x-S;;_]Y}N6&]4Uo =5 IDATxyU6{oN'tg', *eE 2#̫836:GuF}wu~2踀gDEFBtHw'ݭoouwB:S9ιsꔱւ      S AAAAAAcA>AAAAAA      NAЀOAAAAA h'     S4AAAAA)     D&pcoAAAAA/Xkty1AAAAA7^Lz     7^Hր     818)ըZ'hOLANKcnp_kؓ     \k5|>߆̀?Ɇe؟h<     "5NO7?/5OQ{     JFea?:VݏǨ>>WAAAAAL'Pc}5x xT KAAAAA!Z _nz}-6Z.nO5׳M=Fvʆ8~pWs՟     tGͺqFJ`Wɨ~7ݸOQ[>g<+˹ŭ1Rr'>AAAAADmu+Zaڸp*mSx&h {ߏ Z弚dtԐ~JdzW>AAAAA mw]Έ_`@.&nq܌s^JVcD'b Z]_i}kH~-`]^A\{@\r4&N%~:zҍKRyk-.W*N=sԟSO?ԟS_ ?"|K?qH$cO|"FxI8 : k2׃ mc╪ukh@_Ͻ[.|CPZ (LRD"C (5*=6r\Rq-J 4-Heyd2O?c% Կ2?|?ݯ[NʁSM?ԟ ~/~zo)w]b]QrۀowL8?sw]OGyCP[ gteuoQ7d h!Imb1|@XkJTk nې܇{IiqM?P]h}8]-O?rԟ?wyQO[֮?ԟkwW/OH$J>={5bȟl#~%ɸ itk힨F>|B̭*x]yr4d2ú\|qkq纁C7b.F>03=|{p|u`ԟSO?ԟSO?رc;fJ"?O||͛J 9ו09G;ʄu Lu9dk1/޻wRWW_FG*^TGtEy{רqfxꇰe}kN'Vl{?ԟSqԿO_ԟSǭSO?/?Gcc#C.XfMD_`Pb]7T8smˉ[z#Ԁzq5'Txw~@[ < J~%aDnٝr5s9ij giݍ_,#~nBam:{֖^'0:.?]j<42~ԟSO?ԟSO?^/_xxG#y, "[u^ Vŗc䶕)s>){ *y=Z,޽{Znev0JW@=nH<ݠ8:#ntAO&c;|}Uiiu2?Kx@?/ԟS}_ԟSONSO?^,^T*̳}k#s9Pu}-a?Ĝn\ʣ|4nVϟkڛp %wY\E0QJ8$Db̌ۀMS*qF>`tbT*AqC}\\u݇nX,]p}UAP܃Zŕ//SrP@=iRO?ԟkԟS[b&͛<444`hhW]uUOOϕvd(#\[nC̹溻n~ǸUdlg_x_5I]Y0n<6\wvNWV\77 }5䘇/>$/d _#֢X,yPHi|rt2b1OJNCߏ O?ԟSO?ԟSO:F2<.RWB6 󖲀}N%cù~Bokw9<9bd/g/gw\{[5}cW;wXW6˹`~#׺JE֯4}.Vu&qY*Ns %qt,n:-7@κ!{`$M j G~^WFKK ";އ/x? c #ʸ|!=N?`[?m۶}_, @7rWWH`%;cWRt󘴅{> 10.=!4y=<%ߑlڴ -ŋ>@ ⅌bAܹvy睇T*5gYb8p@8%pS=zЩq?I[8+Oxq-Zc?O?_H?/db``W\q~ӟbΜ9d2ضmwƖ\dɵ(]6y{55ʸɽt~9C~1_ܪm 9/g_SO}OWt]CCWk-{%<= 셋UX?@۬ٱ T7iy/z c /XK_^)tCr8woolz <}롻gv>u~UzQi>r֯_/sxuAHC[S_IǏSgy.ٳ?0=\477 ۇ3<ӧOGPhf]XJ"3?L!ݔF*m6̛7T*\HĞQ"*F y9};Эדn_\n\e*,t«Z_npLV(autܲԟSO?ԟSߏ&ٳ ,@:wjoDtkG1:rnp®|Ķ3k菋kby9}-u + O} Oågz]#q[sWE*kTڻ1<_DϜxəs{وāKފTY,{ض{3~{~3ݯ肵>Of< \t-\2w_qJ{Pup/ 0b ۧNL5 j 5>Is4>KS!?twwP,`q9焝ݻӍN "Wo팫񷈆ҍƯmG'6`t]]]xg0wz7 4_"S oy݁t@Z7HK~q<5mu~:SO?ԟSOu455aҥ0 "/E$0fDuܹؐ\~J?Z2aʡLĀ_+\Q?Qߨ6;s8xq7=r̸r.?9>{ΘF-<a/@jx{Cעqʥ ʷ6mڧρyaC0~{dfesGO݇o'1Pj$ ԍRJn,^$Q70xqYk y%j "h"=~===Egg'.\ad0M[.Xx6r"ԱmGo%(Νc8tf|>>A/B_ eutʹ_+Q}XkJ"mͿ\H&=oޗ.9J9k~ԟSO?ԟSu?K.$C-ź6b/prnTxme1' mZ—3kükw 8"~RR1wzbƢ-~T 3w.\v G~vmO$z_ g>L5}9vfkpoACCCXuL$xdӯF\t*ٽ;8 МjĪs3x൫_4y&r9=zyk -Yo50N1F:-SCC[Lɢ"f'IIdž9a윬%gu~ӟbŲeː1<<\4=`h?f`z%ܬ nGx?(0o]}XO?6*m|nBc=S4Hr0 6y“F Y#0{t[(C6y9$Fa,fws;0f6SxCA7#G/})SO?ԟS'G@ܫEt 9rM`1:>Acu\ocQŹ ĝ[[Ӎ +ECz]fZSh3hlfMڦf R L`0ZK!"JP(_nln@jz'Ӧ#[&@"c94+͞IctS Z[܂)MhIќHZQD!蘒Ci8Z Eq{hkkCR5"[wj^p7mo{,c, :Ck+|ՠQ74T^ dځ@{W7ߴ!3m(ʹn$dS13݁Lm7F վ 'R@ BXV%KFa=΃g-Ɋi1Vm݆o}[M#-SZqA^υ 1Zy($uݻpc.wߊ=>0}qF=qےq6[߁_߆omې/b  ̚9skZd2?~I[p= %~>3J+VC=únOS=>rM)iz@/p_I %@ߏ]XSO?ԟSO_<ݨlSpP''jjh_-᜻F1rpMWE^c~, L 3fK {{ThiƳO0%^*uy8w4jIDv# 88aʜPIM&H$X<}96>;ІLO55PHPa0bo+f#]>! Fxef7J:Ȓf 0Pdo=rrx00 *^澑 -zx[\6x~egq3q~6RӔqK5^ePYRp?COzjS`C)L|~=GWrJϜ5k6oތ6Ȋw#nz%w? ܁eL!l>G* 2h; p6.wC_1Wz%> )/7^9u|Q&ԟSO?ԟ(zE'f!}ڝ˹Id71qG0(W/Q:h"@xk-f\r XGL(.GLc U@tH*셫1Z xCQ `b),B0/cK<{yi^Qd!R07b7g/8L#{yݭx{p]wXݍY}a}d2XhqY###hjjB[["+G2e WYYc2ԩSÕ'yȊKX,K.Jk_ʧX,rr?^4P(DUQ4L ڋRF:W]Z+mtJXO?ԟSOBr+9rsqcv q@ľ!U*T4]iul6z-tNÃO–玠whCC{ܾGڧ`֚Άy\.hbͭZ9)lޱ{ާy)jb^nO#}=} xWk?|C8,|_fW~wg >l-56@1W]#Y!|p;~ K>?[[~|g3<"5|u^mg}ۯyտUhyh>}O> l=.6ɳT?TE)>=a^3q]ص^v z'o>.Cxd1ރO k?v=Ew oڵe7lrnW>^ k8/b㮧Ul>{郿]g܋?y#x񎵟T,}{–O[.A_Z#׾ߝ^_:wb 9}:=o:2i /߀;\?OcZ`};/ܰ@ ן,|ן;)fP?nO.B@?ߝq+[]Yvn-Hٔm=z:چ]c*:H6ĥ_8+W1U c̙ؼyseT \hiiAXB*gq;XlnnF*R??A_,Yy^~ze P%p-]˹%.'}-G OR>N\^:?N?ԟSO?s8{kG2x 1x_̀g̗s8 \aÐ H$WQ2dYMq+1+F](f188Rd- 522T]Eg |>\.! qf]I&%+CwP&e!z{{ݍd2(`c-r"K??JfEZ\ _7 z7^COn_e Vf`%_atxY36^9/߇}O ӑŨpLdo ^zb%?u,<9n]cӊp?}XCxVl6V ]!h,F?z{{qa:tg$J"Q`E.z{{qA9r=% m$ BhfÇۋCѣG6XiHrF{1,\*Sۏ׹=ė<,0@? ##8~8Xlͻ~օ8g9X:I{7/_ȇ|}.r`@V\gG&eam=0ϠgXbEo,$= t7%8u<<ٶ C_pE|\hXmf²Vc(WIc6_X,bJE8pׯ?/G&&hrwC܆v?pu`Yf 07N֮o SxE~ч|#>Ogs66ُe:(nЏ?} &5=[^pnS#Xt֙8eTox]O74ο}?u@>s_S~9O|U/)+uYl,GS(}?NjO)xvoߎC!cѢEXh<:m۞ddsML^VVc <Ô)Spرp۞z\7eXo/n҃zM$q: ' GҐ\r//>&yk#E/?g{SO?ԟS[0*ۍcG8Ilj2Xyp .Mo3cQHdRr9 cdd\.;K3+L&CCT\.\. iri@ FGGff"}`ɽk[[3gΌ47F=v /8f|U5ozzzC \}݃¢\ 3Wxx6g8'Ũ^7cۂ7a'76nK:;9Mׯl@4A9H7wrodž{q~l(kiժU3g."446]t̙UVU/0sLx~<3m"AYz%;4X2/G.%Xoc57 6ZVo=xɒ%Xj v+x+g]K,Yk>?'pVhg?GƆI9>vVgwo Å,NM?0%Kdx=-12Ql>Qk1[YXr,Yr^a.`ɒ%Xuc\3Tj o>M߿ɸ_v}3^K.Ō3p9+L&L&q9+1cL,]*!̘10<<YaAGGG8&PZuҟJ*NKY"v|Zyhu9UE5dX#pI]#\-{q_|"?O?ԟSO??\ DmƵؗ٩4jҔR%c{.Hy7$1I&0$T*VBy-C^ R7v1<ȹ4J*@CF%j$mT*ٳ,K?Ǐ^$4[[1/|voƇ>A Yl D} #1Z4hd`Њ&88|SM R,|CT.]8\0C `iXTy桭_}/a_/xʐlp-%Cmx60Z1!h~DC`@'W>G[$g>CX7ݐ]*nP( NR^I,< BaRȌ`D+3@ro#R.۷oW\iӦaxxVWM F,jGSTPKߨB;71QA8Ka!(dKM:Г?ihQȟb挙3g6vl߁e˗AR?M$4\cS*u[*6}ayJ׆+mLD_?f͚i:pp/f͚Qz@+wzŇ{sW}Y#n9K:-"z dp/}%|4G?NNzC?ԟSO?ꏨ=(-gKF̹ &UX_ c |+#yJ| b* ' [-;#t X8c ^}eH74`hd80pi˪1ALCie/d?x`2 720TiM`%%7 WMMi,^?;;;Q(qF_+W1X/"߅NCزZGnR w'sISO?ԟSO.䒿_+ŽP*7ı1h5QQ/rb qqD{p qsWy+5nFU,{suDTp:IŒʥU,F_asJ+o"}',ʢ%DZuVtuu՗Sۧرc~zpjR`ĩ\[Npq$򯒾1hkk~X,bhmm }ǹ ta%'?D' ̝;ذa9iӦ!:EcOF 4epccc'y8:Gʵ?^"' ԟSO?ԟS_Dzիo s.^d;G)Ê&BG˹UrJyտm۶~Z*nF?gId&H*ۨIЯ+F*܊}~塡g⺍Y789c :::pW3΀1}}SE(m+ VR6 AJF_h-e% e  -nէFmyoa100iӦu{v܉[ `Æ >rpp ?Xe+z@@iP)P{sF%/=ךIXoMʉSO?ԟSO?0bst3sN]ǽ;[mWWZuY?::鱷AC*adx\5'T C3s 7771&    &Z455}Wr+ѕ厈hk}hjwD-Pqi0qq ߑO `Y ;cշZkTmJwG dF?-,E)}輭=mm j;[?-dd##''''''''':[)2r,Ôq_ r#z (1ZõV}#:ׄaHr1JU_ ;_Aw|ɿ.]%Ku$Ǘ"H/E_g-ϛ1Ķ{>~ ]o1PneO ɆQq™J$_R ,[GF(VWiVM| "< `0''''''''''K"0p&k1%t0^{sU _έBXXx(UXX ꘵^P٬_U5xaA҇A<^ AlDz ?_y?????????? nXąbqWq :ίP6< `#'TJA}?BI OIVBޖ$Jt_(qAdYt]Z_1Tk̯4jK5G=î]b d2D?@AAAAD=<ǎ;haRim?D) J6Wp_-Lx |_!_ϊ/?bX ㉷LhؠzS92dW9d%?pApfH~}  FSeގf    bhkkI$w^{Z'Ykf/D'Glz7_-l"ae ".߷ɯ6NX/ B[Ll Lf!A2ai0ө4;)SxOAAAAc f͜۶Cd?\<9XP!Y!Qȡ%CC!T!D>d!o,h-e~?2zve8ϋ^0Yɰ编4kQ)U.~G+Z$D#$6FV8= $     bЀBoX.ZX  )ayb(a phša̟ڊe?4gY6{qxzI1O ¨ʥW rR ^r"(E3YKFySMr TN駟O?>3gœٳ"\q5eZ7\S5    x1_^ۻ'g,rσA>l|?w܉|;Xn11c.b\s5:!g1 a9chtܸjDlS&$;`]XD*\߯XÙHo}뛰3{v:-jJ[FY;_4T0G_'1l< ` :;}KI{Lc|؈D"\˖- Xd O>\~vo7tnh/`ccloc8Ў_<_coDaqǩVm8w vbHNBz8wQ_lȆ+*/܎=(QP+*JQҢ?*VRGLTnȒd7{;{f7@ gHvv;,KRtI7c=]yEG.NTg­8r:䦟5zSe<o0y0MkW+ĿiacO;yIKСCl6<}6lWEjȑĝeqq%tmX r&q][%Z*@ %aW6fӰ[}c⣕̛7,n7 L; ڱu[վXD֝27UMJOhKHHѣdg9୯ƿdDFFZ"11њ rQ~5iWGݳ:v/_^x &+G=uks3QW4>ͱ-qMܷ6M;G3M*aL}u8ݽl:Ӗ" W;ޗ/ =qeΜ5:[/-'kgaxux糾b)ͿNn"_yKkם>M*ݾ䱱8k#9'9ZO~Bk7|[W!^yÄjԨnHz_\}xkaШA֏gx\W:vI!9SLuNŬ\~N{ n0w̍cP]f.9΃~F(/絞CAMj+$""""".|`*bHJ|>ԽirȕI/} TL>JMݘUe#%`Z ?{/ %%%dddpQӟF?j/s&r s>Lˣ3gTӚ <ǁ3b ϟO-$$$pۭY7|LkPߖi$xc`` iŸAI0 =idfdJ>޵sz/dzzMӦM9vk׮e͚5dddpq6mJRF j(R mJI9.gՒydL S\@#ڟOJn ]2N˞Dw;ԟٳ%޸Fȗ;_3~c'Iq]}-wĕ _:ٗZR&d L1_\p'ᮡpp%wT2$p˶0m[֛;Uqd9 [˙=&3r" ='Qٮ/#ohsZIk۱8wA098ǁ\ʶ1aR˓S,$uOF+ oqi3,0-8:#k=s4cQߞ3hsKtC """""RPʹVҟ |L`¡z[~2nSs3p%4NV<39~8͛7{e֬Yv6mʧ~w5gFM9X33GNgLqX , ''v;Gq^_ؗ$򼘁 ~x#|G1OUE X|LBtj9L.ZHӦMIIIꫯKf͸{(**b޽4iMBB>ӌ+}R7imIUz8sM#clu$X{յS=}5y#W{+$;3Ծj X:Ihp+{^Mܗ^\.HNm[1 ߕ׋711扇KY޷i%+vnJ =qzLնl?d Mlcۘt; '"oߩ1@CmY6HnU,#o3,uzW̟䅻4#bKnL?rйw1z}ڑ߾oq\\ӈ2^a]yb9|?0OL[7{K^Oވia T͹+1ON+p/Uzzx>V⿸qS3"F|˗STTN&Mp\?~JRRRH7}1YC4*[Yp.w!ޤ3|oZu`ɗvbɒ%ФI`>5 ^7Xv~'b_QWݾjL 4H0HHH ))b***j?>b8|'%%kNW]EII J^ŋ/HAAA:1O?^Ϙ7;0 ;(XOmW+_0HII]]}>}0ʽM^_步 IcBߴeKyq8–/Ο&ûpcqfq<gM1o<<>u ԟ Lz`Ze\(o{Y|Зbܬel] ~'l;2q[c@S5ά1x7ņ"W}bw`OcXArsZ(cq[KIV/,f׃qlk} {7ey'뗯<)Ī5IObm׮#U"{Lvxr+/Bm}q";6.CԏF:ݾN&HϢ*IB<~rqvm~OVJދHsU^2$zZr6{>ϪOb0}&>Ǣǹ],U)? ?d̘1,ZE1sLDl6[FQ[)x+œ!uՐ7Ci0UB IDATnvwɤ駟fذ{g0 ư{?s=;w NB~>+l߱mvvl^;v[Dm浑}/Ӫ#71qqCMKl def }]g(y|c{|K^`M1 r` g<S?`=|b=.Jzlmo0mv+2g*;Hn޴ !S_ 0rT֭{6)`c1K~?%dC܎ٴhpY*%ҀFGʘXmzZ<<{ށ^?={⃡4y?mϗK򈛸mWV,GY}+̹ ٗJǷW;41m*8ziغw]}!OMdCpyVNG9~2'3v_.N念Ƚc -gg͌27_9y1$FLLn$#WҲ~Bv¨iq|#yEyr8Zgݼ5w9\?L#=vkKO[0szn1!c !ܱߕǃy 5b0-oaķ)Ip|BZߔGNV"wFb`;e[,#GOGq>?qϨ6._p`5,Bven7A\Fȩ*b\ Xyӟ-Dv;w=׏Om`,ϛa1bP{|b-X7wIJu?bzzj (xoي`>Ӗ wxv!kmC[׮e٢YLCg\w`DDDDDB̿ruO<<. |M,?;(k0oW^dggE~~>4nܘ+^T5X' ay!9L\IYYju}~mp* yCZǫoZ^,p#ߦ{I2G ڰ%yl{̠k/0b[c/<߿%-c9@c 'k05(9ew %(tuSkl+~kr+<;׾,ѫ`&FF}k+> qE %̀}AـApU"ۏ/ {p-\ٙ 턲eF۵h{nؗK޹^ZIݭ:e~ b[楴jT?ela gڃE#MǿQW':Ye/5[c_V:5T,Z,^tjo횑SYw"2qz|0j fLl=*\ G_Ig@nn0/>=TɍeySƾ $ޗ36R<93K3,O;U+^+AMzg FL9=VC!z ?\; ~]˘(8T ǁ72ɉ׿p>ըDDDDD?ޟ3  0 n |G?o&O$%.K+{7_ū(#mӂ|ֈ`8MҸ뮻IMM0 l6[L>:w\%X*sZ00L30q>0W7p7oi$%%T=i&)))tӍ֝#8l/30$τ4\N:u?(t lD҃H2khL[n||>:i֗ɓeMF(| imUqOMa5}g}>eY8w6zamx3sa:O,Ό%63zj6Y%CF1??辻Y:-_F85eںCvj/'0Ce߭`=ef2\q31oA;&_ܛ_=Vΰ&?/ׇpzxnQq+N{m ?a z=&7| iii,[ 寷ommԨx<^~%>Wk6k}{+aTElݺ^5~YHlg#;-.n dDxiaT&n$ %[+J;o[1iyC4snzKWW~^2$'E|Sa)j;Nh3t|@~6n뮲5vZ8|sWZ5HYnmF^zt\[쥸+ûn&=>ժ8 l.)Ix&kDC15#ɗ{y/zE[W3cbf/\ǫSk@}Y+tS1$MF\VTkJ0h_mj!$|nw!Ѝ!j5`;qͣW'5q"Өr'-&bXN7-1Z[\xl6*[5vNMةbÐ=e5 JHMB5 g6뽇ؓ .ŀ8PfmxKx$}.If(r2=)('Np=o1 M?d233ILLd…&^q *"k6U+qn^/'Od|'|^KhFP|>UUrtq + 0YT9?%33vaꫯXjUXPl+WdŊ9rM_Č?X*O#]o90;Ǽ"|gYyf$xyt6un PΉ"}`WDM󗱳6?N5) w`7qGR^DԢNVU)qƕa"N MgWPpW4f"{9cN2q0ೕ++m(2/ %N'{ψѫ`:Jעl ɥ{F&?q.ZҲ2fÆx=VɣR?o2Gե^q݀3_c"J)^bm.wWeeLa[F,-fXr)*dŲ;Iou)Qk"W_nsۋ(+; Cf/Hq _S#D|M2&:6A&}{u&M`#pQt]|O"^M 6aVJߥ7aA\.ʊ΢@.%ٷwtk;&TzUbJ<>#?KK۷/X?raHOOy_y5o# b~X!f ܕn:u}ǼyodQ2}tƏErmv)0T#޺ /Ke.,#wRO$)) 0z}dggc1}7L#sax6me۶m\ 4oFё">S6Тys<>/7L74ʲ(Wu 5v/ˊkɱ+3g{wpKGЫK~?y8'G˯k$%A,V|e$+~zf&?!kį_/1v22_tFܧud:z٣k2[E6=n=PMѥh+_ߞ$+JZ/ah(M4/KGٺD{#[T5֤d"]'.0oKzf1wL/Ƌo?eL\-BϝL `5\eyr艀ċytSi ޚ17?"ɾF׳dDЗQ2d Px {[2{w5^_kKwظ-/cĐq lPաjџwX͌8;P;UlI8{9f^ p (OqĪ;bB A#se1cl[oΘ d2EbF!vsYdǪ9Qp {0;y}Ϩz|<^iXhsSTډxj)4: 0g`k%_n) yssf ]<[EDDDDv,\x2 jhu n Jjn[ntGe=C1M/d4I#1k3ёa{w ۺeaXuؾ};ͣAYYFjj*iii4jԈÇӾ}{*5]OIƍ /W?<8RHKs(AZRRBJZ8o9*NCcөS Wuj `ݙ [w_ /3w3lP3OZ|3XZfXD|NtСC76m1}&f`Fd ԙ'lt/0Zf+2iY&deeO߉~P骤U0a_oIKKFgя~OSR4I\q߀ב(k$M꺽=--fY Ǘ\ދ6# O|M ;c'mgv-ʊi԰Z5iVVvc2:$SI MNM%SILmTH4KD|m'={*}YX1:Oz!19SI>JF"= %:vSI?'YDDDDDk[ Op򞁟7O+WHЪ=Jfdފ$}=?ML-??طo"99$Ҹ$|?/* &Mx<5OX_5xY $}>D ;/8)Co֗#p_i>7g=db=`>LӪWH?sS}6xD j$Q>eE38=*U7m~HGII8vT$"""""""""$5J[&lZUo4IƙI"jJ`76`)a?a]0a+D V Zn5/a.PvßAi7mڌ-|@nnnԝСClz#^ja?/J K~(tgMk]v d]b EʺZS-u|/~6["nΝ;غukD9/aSeFo [/'4A7U}hW_+~ůW_+~ů?'iԨw IDATZ"!!ZZ/X_a wn/RM x! O`,t7&PgU'y/;7 Zƍ8JĎ?n_*ۄ&w"7f8U_+~ůW_+~ůW_+sEE9֑Eߌ?P )ɅI0+\/x/N45 0M u.ȫ+t܇Npiϧ)/&ߨ]Ǫl_}oUmKil0j{֢8t̊_+~ůW_+~ůW_@4fXotrHC ^#wYqqv Ӻ"70uBrgt¢B@%W_+~ůW_+~ůW_+C]0 Nx`>z_. Ӵ.dFkĬrߙoh0LL ?!""""CHY0aM%nr)4y';3/'%DDDDD~`:FV1GßmU)c?gH8w'\LXq;"""""#%/""""gMm#ԝ%رgnHJ;Юu)ꡤJves\N c-⋰4ͪuşDYxa;xn=Nbzv.I}O԰:A>}!.8使&pyZօz=nJ9$۸?ƿId6{m۳iߩq34/r9YVJzw);c N@4 kLyT<][>0tȪy>nzSDDDDΉ3dZ}θzđ5f;p QZmɈ2HAO?ʶh.b__Yԅ1oS}Xc''NFOB@u|+)cC2mAD}~[psNs{Vc6]MĄYշ?~:gnȉ`=G|8=AYPr0{}":NN:ޏ[DDDD*%EDDD8܁ՓS3? Kv֛uɍQϟ2 n9!&Jvُ[5c1ڷ5L>z̘@MP[U%Xz5eoyx==~wg<@⑇⹡=Wn>Ȯ9"gN,'E{ xoR:⩧ :""""r}:u+&rz2 ϝ]΄ŋy~ՒW#Ju&Qjۗ-3q\mIlKV'~꟫e!y(XvJN<2a7XnfaDFJOվ+#9Vܸ*/vG6ԃ5[0 OqSfӾ $u[N=B޴G6 FDֵLXe*R*zqI͊ yzAo$/g &?‚@a2i4 ^}EDDDDBTBGDDDD2'Gc{zr(my<#+zޠgZG(wײJ%kP1'}>5yO E!ӽ]-""""I#EDDDr"z̩L⮮Ct> ܒ&4Y#̚mNI=8U6ii4gk?N<|lz5/""""rZSvS^ңlFϤSVS4or=}[dF^gù:7E,\G=/""""r*S#8%*!{~#)Ӹp gǁm =Wud#TocWx:P}Sr.ٙ8mQʂYXP?d[vod6 3#>l-o濇Mn^*9t@CJT,lΏD~}ϕGz:""""r|M[ djq;.׼2,ϡ\=We֭~vWGuxvs fgi3u"""""(/""""qIEkf)l}#|y;O[kҹSaLyc1[jț'dt(}Yipg-cOɛ9jE_CP}gk>;%>QnAhTjPcz>iWƺ2vX}0o%G]e9s-""""Raf+6τᯄ("~J --ly+U>oBoh~#))8 tHǙ89wK=$%6eNZ@?08n}`f8KcO1$NvdY3q-8PRtcŔV@RnRiѢ9Y:u(""""4M^g [򻯆̌xa-'}OZT_DDDDΚw#ԝjKצ\RIG""""r$䦈5JPLoDDDD¥""""""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" """"""""""" \ """r2M3h뷝Q#kAe%I9ʖ? 81ЄcWlV<+HO<2sX=<_m[};̞6*}dE;Y N;Ø(ֵwWsԹ8αȅD |sͳ}^KK{ZiY-u_x )5سK*||1y$u!*(.jpYtؙ}S #O V=5!DQW)nL] >c"8ǝ_?*AdDĿ!P(z S0qL23f܀ӛ49ml;1,)8q맰kߧxk&ހWwJ3S;qԩU.{Z@bNjP(qoN[Ϯ7׎;kVmi=]盔[Ctn]bY3#wc SOs{2]K]Ex|UADZ۵Jv{foߖ?&r]5nMx.hjsX} @g8pvCndTi C/t ڇwV k=}3pVWϸ)vlw}{pB!K쥫 WRv}4]_Z:zL*X8TP8 gh00\BdMS{A !BADA"qF7uI\!nb D"q?&Gƹ V,6B&B߲$|lq ]7kZ3$a..YB\[web}yCkݸp(_ϭ`~ߔ[kU|.`=3{qߣ7A;|ؾL .,󷺥oimy+bLK~kZK}vdmWL4 ` SWvo)9B!B]1i]1+bēbuŐ/)1snAIQYvŰ]]1m{W /R<][|(O!rLHA5TMgЍ +<ϋ<$^aA0va|%#m-.lq" O͆D/qeZV?+=l EA\+ ں2ߑ0w (7 苸yQ>HC7߲Fmt@lPEf8l-ۆ}|C|H||8 znkP"(~z Eɵi,4‚ [pʜˡ{Pj7.u{Go y;vnY1[ķ|X\t~m]S  3_|XE(|ӗ~]2[JlBN B!ڽy58UhB;܆jSnD W{~ n64 ]9fuQWhZ,`od7| Al/RWaiܴK4/q^k7W`N@>==_; xhĨz(|w0{:8JD[rX?? (`2_e~7mXn}k^]i 0wzlǏ%pW&Y)Q__+x.QSt] pn:v8ö=`>;/3Oaw4a MФwo]R^u8eߦ-L8kl}"_ ~3g)V7UqB!cjB!W]bN?$OX ӥj3grʙlڣhE=.&4?-Ѐ+/ؠ;7MSL6H#WfeǵMEs}ymm{>̾h @b%QAl~:ꔲu&b@ Ws'ök^s'Gc8a[{Əރ3dv\C%be3e7ʅe۵,Y;?l(HKUs\tn2=z$ng$ѱ@C5ŗigxs#7h IDAToüypgxѵ]RKˍEmB=k)[`t`ፗJ4G{.!B9(B!xsscdA\i34"ն,c6hG->0 :-Q\̇w+xd}qdR>uL{bxۚ_Fc̬U вNG@^m~M]C76oBt5m\n*(\;rm_wz[3M8k};qaD_1(;;XMw vC`b ԞۉጒE{MǗLMD4#Az5~Wݰ tMKEq-Ztw.YuX3 ]Φ7H}%CK^f&S~$Etor{g`C7-3h%Kp}/;1u"B!eB!G}_b/7U^/sLh'q~ԪnنҼba,VV4lYR(U@_=t1juk(;w㳵K1~4,0|IOnu[W_[Nn^;.>xnᵥޢsr-N&~_ވ jS@n*w.=Vz=zp0aM@qogC31 M9PzjYuhL-\d]]_;6{Kﷅ.] qz}݌3JnB!7MbK!rL ]9A=eoBAy^FK<ϋo^O4{ă/PyQ-7.!BH_qLbˉ }8 ?v_E})!((4P|KZLA~/? B!㯷 gC,&t* ED?ywIW)h3TG 6bpWt9DQ@ɤv9r˶޾ ˥ ZTe/q@.`4 tmQaE׶dQİXuKbQ$s*ϻ?s+= &ւku\&E1{??t|h\4O A v{p8}vmKEz #8^z"BH_$" }]-+X&WsB_bbϊ3s|./^(O!Ǖ{^ƹ%4br`%PƊ*4OqaH]~r;m_f"|#Ɣ/{ֽӲ~=:F1n;v=M[;B!d $B!}\Z7=?چxtxMy7˂o7!B Ho8d;_B!r,~I!B!B!JB!`(cdk| !BwQ>!B!B!QB!B!B(O!B!B!A'B!B!B B!B!B!} !B!B!>B!B!BHD|B!B!B!>!B!B!QB!B!B(O!B!B!A'B!B!B B!B!B!} !B!B!>B!B!BHD|B!B!B!>!B!B!QB!B!B(O!B!B!A'B!B!B B!B!B!} !B!B!>B!B!BHD|B!B!B!>!B!B!Qutt`yx !8c_F:x lSE-g.C6L:555c(\x{t/jjѣqF\q&rFa6F29d2QQYY1cƔNY'T>>s?RgAa…%ωҵbVֲ%$ vo:<#H~7ld2P(T~zHs6ݻxxz ڊ8Ԟ\.Z =:hdȑ#l2|> 555P(P0ͬbBJ<4 ۱pB_wFMM Cs̙3q駣(⭷ҥKq# !BL& jhhh-qxgѯ_?q뭷bƌ0LPTEX `P(% BFQq5נ 'Oo*[f8zz|t0Luvv[|?tH&H$nTWWwΉo+ BJ$H$Z8åehlB)`/ v`|a8A P(,`0Ȳ[[[j/"oYf!@_z5~AR̙3epAq<BR`ZqyATCSS@Vx<3ٶm<J5N# l6^6ꫯ^')NO^@<Apc֬Y%#6,1jZzB!XVAd2X,ydYj<32dƎ AdP__:H zqFTVVrɂQM:X,:dYhZ(J|70afΜg}C- j8?Xs)>H* lLFVK.!fϞ^x X ^dHפxdJb7-w ՊaÆ/ƛoK6J7oƊ+O_FH\.8Ntvv+**(.رNT*NwX:QP Bȷ6b<#;w>B^xlA[ng;O>d{BiӦ᭷BKK nv԰ND"BP Bh4r9 8AGGUUUjRgI6ߏ?wZUUUe`2X:qfsFo8}&u.t:iӦᮻC=QFA׃yi? J4 R VT*);駟>زe h$ b   \.>^{5,Zw-[8XSNhĻヒ . f:b*R*0Ͳ=<#" C$ n|>8TUU̱X,B%q |BQ1p}!":::p8 (|yH{LS~.GCTańB96"G{DwaԨQkK KnG0nggJu r+u݅AN͆L&VGx>ۇ[o֭ 馛pw`|*B<G$AMMMIVp$A<G*RdRD]]0AP(`6aXJF# 6 J;v@cc#DQ8ڠVp8dX[[JhZ %~a/dhll}WmL&G"TUUlr PyQgZO&0d1`?(XzZfwÁ@ D" a X,B`JB4Emm-ʿ0x`̙3("C8l6ttt@R! AP@d2#Hl:(8p t:v;:;;58qƱda;ng@@;*++a4qK/̙31dhZ!d2ظq#Ǝ+-H!$/󡺺6(q,X6Ցz_ϣG>@>lfAB!|IK/믿} -e+ʲ@8Fݑ+l+++Dd,qV /2>S  Ӊv 0ͫq^/, R:::`Xfum6n7cǎiիWc윤Q 0H* de[VjA8NpCôi`67߄fÄ  ""4 ,\.n7Ѩͤv,< h4*3~( p84zwlr9tvvb h48q-}P(ǡP(VQ]] ͒Rl6lP(&v&Ou:8q"|]CAѰR1vD{y~\.zjK]N'6lPv$F0, DL%+@qlj6A$A*ne1 3al/aq⪫+ɋ t:dY^;RFAUUn݊O>cǎq0h ցRXt"Ͳr<;CaR1Aza4QWW'BFA[[4 DQd(O9\.m!'\.ǃ:]z Bh0͛7 < IDAT26tУBPd7phy?!WHgRmm{:Ɓ0p@2CѰ l6#RJ[oaP(qYg{ŏcY֭î]pid2zcs ,V*p:NFJ%;_?䃹RU<СCaXcǎR^gA{ll6㥗^E]$ۦ7k,r)8*sv1tPxҤGQ6fCss3UUU {xbpd2 |ʍx-|&%N8^KU 0_.6SYYɲ GauV^:KV:dРA:u*.R{><֭[N;M`0T*V;&M*ٸq# PvY[ 9d( ر\p88;x<كod?&L5k`0pAr)EYj><%fYzpd2l'mz,Y{UVV:dRpf3 RKT*L&Îp(_RNH$Xɕd2`0PT*a6Y^:/iTTO> 59i$I 4xX P(Ess3:jkkىX,c4iƏϞW\/#G_h4exgQQQ386lѣq饗b޼y3gRt:xǾ}0c gyM: ;+jK2 Gf2aLdnؤ|cCC krbX`L&,Yr&#yߝ—U8p쳔-u8zLzK`$ZF&,|B![讌A8t9eoiiar{~( J%[A~W^yk֬;gq~bʔ)5jTIW9G L&?q7#" :R rp8֭[s=V%Et 䳗zgq8 ׌3J]W]uVXlڴ \s   ZZZ0{l+ @>~jVaZv`XT*Y\>JAVCTC`0xpT*FBHȏB9flBX,N:bA6e%ar.O$Hh4xPeJA `Νl.-/}eYJA@EE8ʕ+hpeq ﳞ:F#ۑd㧜rQyUըAgg'FORH$P(b0Ͳ~?t: ^Fò+++& HuIѯ_?tM_ ?O<ٳgCP LB׳ 1rH\pbíފw ÂRVe%<OITpjw }$ Qrphnnȑ#B1'쭆T Yh,yE`d귥VYk !rX :>}O|)[ TX,ug|P(A0x`̛7\s VffdN {)P(X +O<CeeݎmٲyqbΜ9CzҹIg8ƠANҽ$]Jjg2t: ,qHU `;MVوc8԰*y%-k۱o>ߟx<|u:Z-2 V*#}oܸ b29V~E+ #zhv\hooGuu5 !#w:OT]s>){pY|qb=m۰i&l޼۶mCgg'8)3gĘ1cJW "pDĠ윥 !֬YCd2ڡ0*_܉hq>8VNfb:crI&O>ѣG#LmlRWc=YK/X,ŋmC F# Zr,H$ "5ȖjaժU+(b8S[)K{JyӉJY;n7J& DZN ^d2lwZ ł`0:@|SO=?sNt:F}ZtZFsǒqRT*PWE{O6E:f#DQD8FFee,p8xDT*zx^ytX,'U z7!V|W0!䘈F}b /PYʺ^褗6TU^ANBeeep&:YjTB!W@E"x<Vp IE1Ͳ ={Xcɒ%7n4 N?t455+:::0i$Bػw/[V*#[ y<|>\.׳`TVPEE,,O=TxىT* ,Tk+83[z xxXL8 ֭cj^oA#~6rH466BER)v-vm8x O5k #O?4JYD8qP(BHH&8pv;v.|vX,,Z|t\xp? ܠ 1p@jY-T*% JR{͚5eoCB@MM ***vYU ?[zZZp8سg{z%ò#eTQ>!rT*hr,8Y@Z, ݓ!C>?E\r y8p< &M$O_Na*B4Ej-ۧVY)Y &ITUUN.(b8v*U/|&JHZػw/Ǝ QaXпY0ptQfB{{;>#߿?+ /֭~۷cݺuXt)kwҥK1rH<ǃ*zĿ. D}UTT@6((:::e3E ,6'TK_x<R)vB))ate'H$‚ωDvBMM 8cmmmT ǵ˂1Fh4 VYIp6 vgxAɒ}|xX7yv+naZը@ggr_': 9TN#wy'}(uL[*=H2R6NaMo/:H&,sD;tZ6X7n.byXbErv(y.J/RPss3***`0 "v;{+~/t2!;&l=,8f2d 3%=fk4 YRĪpYg~|rpV[v#l27^PRdXֻRDuu5+S\S{̘1rx'-  ImꫯbPT8P*4O1)_ e)Ϛ5 (bɒ%)(kWitK/e>:,̞=6mx뫪::: /4 γNLf3.Jm^C2d#lP(Á~}CR |8/ӄaܛH$X"i#iVB@"Z-܂70 Z{イ{);Ͳ/hPQQ`0X6 e~TWW#Jjb׮]ŁؽPXF@SUU66"eعs'jkk:mmm2d8~t:``rػ0ΥNlz\Dl6#L bp8LU?YF;rBx᠄/veWը>i2N`p  AP0L&6lfΜ>aٲe%q^f3|>,ŵX,P(C,c/. n Ǵ/!rQ(X,D&A6E6=pwdRV%>T*60J!J!˱b~?n7~?9:<5I$9gr?󽿷A;#B!vtvv"Ht҅F?={6.:I ^{ F~:mDLNߏ:q_lR Ǵ^G>VE.àA`4QV %lڴ X ,# ƹ@~4W_l$F6bdVX}.QRobt:U|ܰ v=<'ɨݽ*;JԞlv9= cH$?$q0?62zɛhFCcI|KIS5׋455˺{׿N~_K.я ^łL&C'. @Wk{{;~mGhZg0 c1L0 fw֤7* jT**$IuwI }-6n8z !Cz^)BU#6Imٲvl\kvyjwMKz-n@7INa0`qgڵk1vغxl6ӄFi8~Gu Ah渵}V\#<k֬7ވ_򗪤jwbb`֭8c1`ĝwމ%KncѢE_NFrfuQ8SpQGCVKZVNQTSO8w}X,[!" =y\s58R . 倝'v$ Wt:ى@ Qt:X f~6Tez7nlNm֮]I&z&?1DhSh4 ϧ: \ZnbZH$vt@J΅iW % ><>cL4ڼM IDATn'1c4+ F#k^Fq$ -H@өJcz}^$}677~;]=nFO>W[\.8EbVALF%fh4hnnF$e5(,`0 woW y4ߍ?__t)R&U$z( |>r9$I USԉ'R_رcJʛK,i8 `EQT%`$FjL<:,J%~qC۰a5=PzΆ pWg?>Hľ[oaٲex嗡PV1dy䑘4iNnJU`0࣏>?@WO>o&ljq&Ns3LBD[[!If3r\@" A6Hl.v Z΁Q{`0$Çǥ^ON\{ Ws)3$D"z|unr9"jp^{EQH$hj-$,Jd"rmT?w}7m( :::9=UF%DuGvxEl6 V3 qbXb7Bt^caH q8H&Ʋ(Rl6_~ }k9_Po6&I|>O(Msp*kP(J-LjiTI* zx>VEOhooW)A@P@*B>GX'OdmmmxGQ.qcxi,>r>FNZSuZV5&2>د9r$~aɝx<ӧ: ^,UjiۍD"w`X`h9gl*QdYFV͗bވJxz-zΜ94=>FףR@@EEQitFP2 88U*UzF=Q.iž(JVAҖ^SNx/I+R;!r96=9)2"eƌ8\YelڴI~T.zZ cƌB L&8N va!NC$cƍXt)\.{1p=n6/FݎzZ&LPY]*~ )z*Io)"E6b@ө,8t8 $c?rm[ x0 4$/ ԯ{{EhTx`4UI|˥P/ cyȲ7bٲez8 n%HJnHrd20 *5jEgg'$IYTBggqTeӽyBZSi<*z;c>FeCZXXDsss]wW3 88lA̙Cx${KFiPf4p\XZBEXV~477#<,^еBV.ZSLЕ&F&Q)M| p~ڣֽ8@pgatX,Z( X,R EYL&!"dYuaѢEXr%fΜ шg}F~3|(B|߿?Jil~KV|TVƺnb1Z tUԪH$C%IhsY7Ͱl袋T%<:;;tVU%88N%) h4شi0ߙfh.&(L&fh4R-D_;9{g~!_q\x'pw .ׯ_~۶mwc0'0 l}t@P(y]c0lF>G"@XD(jMm貴y~/U5oz\V Պ\.pR,q `,aԩmmmmkۍ> ߮QG]V)իWZEZE2cݾ};h4\.F$Iwx衇p)`0L8묳s#Ă dpia֬Y/0bĈ?ϾD<nz;zttt6 ۶mj1xZ pp:hoo,4%v@W,WV|_9~ÇGSSJC^'T$֭[(*J1 &+92,_C#]1]h4bܸqKW^M7ԣ3qѽL(d_p:zp8)v({A ^Hooܸ˗/oo4Ess/ #dYn8 e0 _uۺ dYq0)Ө,zN'Ѧ~&Gd)jziS[L^|k׮㡟Cm͚54tU uߪ r8ԃ\n A( V}:;;U}Yzkڵk{Tʐļb^WYY pj'# `00bAjk׮{gN8@WrDQQ0ji<&< QQVz)Spw? 'L&T*^Om>jcŋ?) "FV+tEqkzU|ۨQ߸@ @ss3!"Z[[1|p_9D2T%d9KVU$ p׋͛7zrJjqDp/~a˖-~!H$Y h i&tD ( :;; a2ObԨQ5.lذZL`0XN'.R\veG"㪫G2;fGR (H$D"2`γ{ $#GTy^_p%*-`09sfݶ{^h4H&H&b r!L6| }f.iĘ1c*. Y(b8St%ܛ%N*R) 'IZχJq)˪dO_f F^Jh4L&eεjZcǎESSf̘`0UVr믿ĉQ*0o_Z Q5CT*8N R)|^|1z'%4:G?=ū#G׽0vXwqtYB8h*7`0 we={jۻK٭V+v;dY1A["  ˁ㸆%{JW9s۲,OҞyPbHu<`0 Ʈ U^܄hzwO,FGo{ASOƍm^ߣ7믿)S~*|.\.~T. Lzb1R)86M@Q*m6XjmRogg'VX:Ju_m]ϧjh N'x L:W^y%~a̜9O?4Ə?> Ν ^;Æ ŋdBobt0 YQV}Q*= (]iooW}$>h \yt{X_RD"z~etvvEbd_bz=е04x`8N T. _$n_% F`0~<"k̝;Ic_t:a0Te$HzSSM<2f@F$Z~M.h l6֮]j@qI'ے$OE]T71D V,ˬ2`0_^vyn7Dv;2LIDch4bK}O=TzU9'i( ,YǪB*A<}D"X,h4D:#sT*?KVUʲ ш?~a]74jD$_ٳ1vX̚5 'OGn?m&( n&q+qF,\3_|1FRD(e˖pAc_a2zlv @2EtiEzk3Hl6#H@EpEQ`a4kA@ s5Iގ~7d2u0lBR ("?~@1d "Hy(t!2 \.ܓ&:V.z]s%EXvYmtS.7.rQ]Wj).v2Ngq` qbocC$R)pG}%LeYF2SeWď$%ENe銢 x@Z( |D"~<bH&;l6^C=ozʲٳgcɒ%XtiZ`0 cwQ,z]Z9NR)UG( @`~=AѢ(bݺuXv-f~ 2$X,*4[3*p8F#MQ(bp\-wgĉ8Zz:&yUf"dsŘ1c0oɓ'p 8D<:;;a6bI+S휬R_~$ [nESS]fHӰX,ta4^hooG(qeH9` Yj/0Is`|_jH ށp ---=Z)Bp82dY`˅h4 P( ٬jLѠRh4Ҡow!2b rX,C;T*^ٌh4JUUȲ ^~Wlق /+WTmw/4@W`0 cWٰa=І]z>Yi< F#֯_1c`ƌ5kF3fØ1cp" IDAT⩧O#2mI=&$ߤJ@QR) 8ἵRиw̘1/}z(!=Xq8{|j0td---hoo/ =n8χx<YoSO(SL8za\]Ȳp8@ H$`0FXQJP(TFłrrL ͛7;8,_ޮVظq#:jP,L&jD`Za48-Jp^ZX  l6f9`0:,y[ȲL}j㪤FVغu+ 8Λ3HІTďpGiQiT2H&;UF( dY%8vL>8C&A>5Y*mt )qvft:L&oNkl7 !6Lh JzC '|snD"c۶muy^U`0 ]9q 7U|gݗ8z~wTAA1sLL4 cǎG۷oǃ>RW]%Ղ 0>8\{hnnE]T}xq%`Xn&Mkwq L8wut:+{غu+Fn  /u]83&E<͛FB3f`Ȑ!FT*x'q* f̘χYfO?dQQ~߿?4 !}IrĴbʹz{R$݉7|Sg3bzfAQ|Gx<8PVN?F{go[̚5 ]w]](5kc9nFFHpT?v,Y)SPNGT*D"=&IoT*Uw,h4j t}RY*L&Q,5 a1cԩS>Ydr݈q:bztd2!X,BZp8 2EA.dѩvlAD;,Ja03GŪUP}x|>z0`~?n7DQ *e`srAQ!pD"۷GQhZ 77"MѮ< l6VabޝiD"i7!Ai.ͣvRl6j"NjZF˗3g< q !IҾq_b̙'|v̟?wRr!D&ߏ۷oDZ7|C/;lhnj3n:ih4\pM655hTr$.: sL&LA<ϫ#bUR tMMM8p 2 Mz!Uϲ|>oQFCF#E^h>fGp8ja6xz5enV@.uX`0iKi`mH, h~?N'4 (A@XD$QvQhiiQm;T6uN&*NBLMMMp(JA`0xĽ(Fb$:H.f@dWG'|._zZ`0ڌFHR|H$zX A϶m0w\/uY|@WpB̝;@g$I̛7>,x |7NgԨQزe z-L>0|(8]tmςyj=ţ=eP$\|^P*`Z`4 D"E .- 2W^ .@Wһ6d2zԿ Zz+K|7Ø7o".<t \s I&dVE.lqpݴjzjqᇫܒ$Q ٓbiZv!Lx<@MHLFzzbH$VlxU?^t"qz^aXO,pq`XnD=駟oХbndI3zqŊ49W_McT?0m4b1r-fKW\qr.2H;=cyફc8&IUkXL&ŐL&۷oGUjg+1 uvБe65% AJD"x|O_'QΙ3gb8餓/q(BWT `Xv-nF(IRtqBN{"Ur&T*E#tG+uPoxf<#ɨzT.kXDn&y>IXeSD>h4RNN߷`j@TD" AP.q1H&eţd~_% Xr8D5S0LMvpXDZ f 4t:U#nݺ !ߤh4UZ3{͛7V]~sr)7|`< 9lݺ]Nc=ш'{p:x7 j-pSO=U5g}{=}xG矫l].\.^/ ш|>T*X,F-R8kXI> ?† ?ǡZBezT*ȲP(Պl6K<$IB,~͆Kޣ@i &C:;;w[&YFwc_$l۶ u[oń pJ*$I,J\.h3ԄX,͆bXgӝd2*+ER)}P$W[r!N`0gR"nwCRD-,jłH$Bi_-27nĜ9sT<͛jc?>|I{ӟ<>C wߏ)SW^gNd2/#i:`#\%HGUBE(BLHR8NUV c$pAG.N(фe3!I߸?Og0:jZtQu*rLmBl6* b, l68CGGk477cРA$}}ӧgk)S@e(FRT*E2bf3mY{bPFcP(`ڵ㏱l2Z PAFSS8x≘0a;0m5j{=p 袋sϩM<W\qNPl <<ϣX,8q 2gy&VZM6l6K/gO>@ĉK/3΀$I$9E۶mÈ#\.RDd,ZU: jd2Q5zb(TS|>Iֺt"@;`ZSBdq%̢(BA( ^zYEyl6z8^kl$E_ǓXdI]… U;ғ,6|7p:" X,BEl6$Io- i,2]@{| @FJ>rr/uflG A5> (uaРA}֟X,ripH$CM4F"赬6Wޓ$IEql6Ks= c6Er9z}РATX[1FidYfPQJ`-zOv՞ݯ>˲㥗^… 1tP_Fiz;zT*eƆ WEQĺu駟?OazeA;^{-&Lٳg9̙_תb;_VӒEwxڊN8't^|E|Wկ~{0n8qjFT*_~ג$ D. t~lVt}gK,gz ӦM ]ORrjl0L4_'2{"Mbk$! A$r9:.ATjڄ~bq\F6TU#t_(rrÊXP(@n\ETB,C(߿(T*p8_׸;mɄUVau&I[k6J{$ +Y-$ ZVu> EQp859hB`0q;}= cŠѿT*r9w8$ N۷oJnWT*l^'u :ѽ']~߇ZްlD";܏@{{`IHPjE.b L&4 ""zhĶmѯ_?G0igXٴix*9Css3~G@W"RQ|{{;>S,Y+WFAZŃ>SN9j[liF68RlW_|EtMqR @Q!u:R6jtth40͘0a&LYfvZ|'XlZ[[q'VZUw8oX,T*T*PV0rHRHRXb^}U 0.fϞ ϱn:,XQkVΎ$v͆VvU>O\+w QiT*:JAժ<M+]6;tZ'Z{dQv#r!LR{҃Ր}>G4Un Jުlw`@ @4Iu2.N>^/q̙+V7е0yd]n!rN˥/jZhZl޼1t:r\Y8);UEܗ` `4"ˡÆ Ca0v+%J&A&(y^WǩAx&ZEi.C>W;s=jXy=2n](۷d2Z"8J% p82(kՐJZ d0ӧgۮjFU&b1s*H$FQqI'a۶m>|8NN; ƍa[ljf}7nf̘iӦT*5FUDiMbD"ZL7xC AKK  @ӄ|>ٌ^z ۶mC*_|W^yx* MꓤfC<EGG-Z'bԨQxꩧ?aôoyrmmmX,|y.ytl t:jDP*п]Al6㫯y.CPPUөT vGh4 C| tT Qz~BzxcjepZ_P-O/!& 'f"ا7R'7~шt:L&bJߏ7xkTVy~_Ø1c( V\IⵯS`hf4Vjz(BEhZf̈;49b \e8#q)ਣѣhT-hXA<ի1vX 4---1cL&|ApիWc_ "I$D"gX, 0I.l1I9^yGZXer:8J%ҥKq} FTNSaT*Pv1~dRUa =Sa0}Çw{>nGXwMznЉ$nV$I#6j+ e,a0#.$ u jJ?:Nlx<4X(p8p8TJԟNe*n(JeKҝ{?{'E}z{{w!MQHEĨ &[bl1&F4&F I4 `Q4B4@r\{ovP˼_}ѣG !b3pd8#_ʻ9r$W\qMMMyHD.jyfE{4`0G Ν;iii"'vYHRq!`fϞ- &0ej} drQTh4t:зlE2te"n[,{ l>/~ V\.k5@N@ CgW=+6MxJj4Gf#g̏ǀ\ =W2N|:3O_ۜ=ϓJyKn2, F:;;q8 AEEe~Ƴ>qs+WB#G6@خ&*qJH@[ |^X8Nl"˖-0lذf3Æ S|^(l6;U*D0tx-I:۷vZ!$qy֮]K/իYxs _YgŅ^Ȕ)S׾Ƌ/ȃ>UW]ŪU(Jh46lo#l3{?O|uYl޼Yq#?,$IvCRX,Fcc֗k4N'466y8A_CmV߳_Aκ=-Ec?IX,B$R4^-5z=JeFfc@@UTT>qd2~?"Þ(Jz ֭[iiizk+ ☨hii!P,U_Ee$n[ou_j_|1ӟ7WPzau7~wb1єU޹s':իWs'p8Xd lJB\l63|pƎK"63M&`0t:ra1.C={ϼ~Fweذa t2eL 7d`͚5Z Ɋ+HRr"a+>[d[,/# nN'6mMCeB8ꨣxWH$ma) + r! d/JTUfbtj m߻b!Hp8* JE?&Z-G!:Jd7/\ |=4?Kw****l6:NTy^BhZ$FC b "RѠlL***}v;8{=|'xbrLWW؟ EWNI$T*v;.KL0hyygx899 B466FyYn˖-UV|~L:3f\[ a˖-|_`ƍ}!^nƍÙLFdUo`ҤIL4+)$I@ՒJhoogڵwC 9aXIJmD8XV$I9 >d׮] nXZttt.tzfeN'x^X-fz744Ŷ+/Z-^G+\bJEF}}=:'xQF _Wp9=S|^̻ܨ&*lL&#˽+>>O裏}'QQHD QMG /Z*TUBz^1=c!|f#l\~}齞~~$ Jgg'Zh4bBQqefq"^>'VUZ-br,k}U_EeYnիWh_lZ8q"+Wz#Fpws+NI(477Ng[7FȍcN׿u?x!JO8Qq_(7"vJkyy7yg1 J%|>cǎc _B6ͱXLްaCG^nb>2x\tٌ^pșgɜ9shkk{e̙8NZ[[tr=B܏IdORX,qo q8ff3Ev; BLx< _rL(۷"LՊdcܹf Y.ZѾT* hV{~fe)KZ-j**!rbD"b ZM&tww*V+daH$PJD3t:MRWwV4r\AQm [#0k,;]v'pɤ`1VUDvϹQєh4 ^/X_z(QEE?$Inf(h4h"ƍa6`|ٳikk\pmmm(JKO\jcNW_}5s ۸q#k֬ᥗ^a̘1L2c9;L^ZVoKKK7xk'2\N_=&Lo_x8cx衇r :W_}n$l6 wҋ,̷fFdYZ-ffq,tB7F*;wdРAbvXb jH%l36T[%[477rbTU$$j(_{-EM,>'IECE כ|>/lʄh4Jcct:f# Ժ:§looUx̜9>/@O[O>$snLRiq~N$>OagB$T*vh4 4P(g賄*૨'Nt**$ISYTx)b`0t";iol;kj5>TEįT*⢰5L,)J{id2a6E@$!N @X,~&jF#|8q>r\>IJO /%KXpx<-Z$/_q[Ν??&L`֬YxzT*zj-ZڵkX,rJQ!p!0{l/sG onPT*QThhh"b裏裏+zD曼K_UV 駟>ȽxNyY|9.N:/~lٲBѣudpp뭷d Ytr9a"/r̎;D&f# QWledz>LT*էJG0.JXV$& "n~?&]nm/%YXRDXРh0N FN,ro:g|Nf}*#477cXH&n ;v6?`P4=/I<s_˗sSO=ҥK9S1EZ%^\.c2fz٬Xb=666ﳊfOQnZ3fgXu]sa}8V՛*******"æP(ڒڽZRTd2E7TJd|\D"*]]] 4VCYɍ>1dgYfO9RQQSk đB^$I~WU>L&Et2L@2x'|/lܸQsOh4;<~'7mԩSڧh48NV+@rO7466b0T*tμy8CŢŢhmw{[.ٲe < &M_">(W\qb &b , z^xoիWS*i^' ) :z:nc0 yfƌ=÷-2 HDd͂KѰT*^\H͆b!@Ze 6 IillP(hU'U0nBmUVZtZU*~.HĦMD"aNnBh ~}$I"ɐjTUŶD"NcZVBAh4~Q*ZR˓O>W1֭[G$A&'EU6M48rx^<|X&~T?(׌SynRR{R>5ý FFӉS#5ߓ3PN'MMMX,~?Hp8L0$ hjjZ,Q*OK._B?7B0$ t2 )@Jgg~diCCCvՊ')5,^zD`0H]] "# Ә7&Is**U$Ib֭<̚5 ǃK/套^C0~x~uV}~j|0WmE@+l6կ~Gy[dصk۶mX,NYz5r Gtsr1c<HDc41LF$nS,IRD"nJ"P,G^!ȑ#9cc}ᤓND"jK/@XsNBBH$$Iu]__~'fo2j(?(ΝnK.zDjJ.p%Ỻ9r$TJdwttkFȾ.~|>p@4.JtuuQ__=V >h^~ejד.dl6Wػt: BtwwŽaȐ! KyB2$ {P($NgsRoZ-C !aX>|8MMM455QWW륹Y,wF#Ov_y̘1C aZgh4iZZZ0Lb=Y,RӼtu:rYї`g5_EEECk.nmgz=ZvBR^krH1xbZo"`0`2@#gkR)2 NoUoۜL&CZ$T*H$>,**L&oC=D{{;7n䤓NSNaT3y}ΤC9DxO8Qq؛Z s=ǢEX|v!C0vX aϐ!C[)HPT$I)1{ln7mmm}qlܸO?X,ƨQx09#zG}}k@~z ,[gqnJkk+[laTTєvС"x*[@-hl6Q] رc6STT*Z[[{Y~=ӟ"z "H׋F! *8RBٌn~!Jń=MPPΤiV?>v;&JB QVٱcXjͦHG9v]]] >\D_jw$)M95imm=ruX$*l+3 ****m۶qw'i!hH$6"[f2fţh%dZ,1g~a?UTTT7lV$Ȣ{}}=bB@SSDB t:V%P(hhhF"7L fIäi<>?EE>`ժUbH}}=mmm9#F0tP\.R;w~z֮]˚5kظqyr׿̙37nGJ|O~xp`2v듯h;v=>ܘT$"yL&St:fҥ{ャ[n*p1cӦMcʔ)477?.\9CX* #BV;kl6J1l0ƌ7_wޡ\.sCo0e4 3f`ڵ_f|8*7$I!GQQIOrH&J>D|>OSSpXTP>`vڅn6=].E *$RDTReXN l7rNW떙 IDATejmxi655QTT>q[KT*%/[(w0|Ο?_Td ϳ>/̊+gnll䤓NbL6cpРA`f#Lo#PWWh`083̬$RD,$rЮ֛|ʕ$.YM$Fns=ǓO>oOu]ǜ9sRo2~xz-:(---رFٹs'cǎ+WdFnVr=" Fq\}5x<~-d8& B" ֦Ȩ4661Lb>dRզ$͛7vZ6lmۈT*Z-HR7zhZƏ99ɓYzb-NV*2Bh4f|>/,]dqT*z)l۶<ԩSꪫ8S$IB"sX&rJϟϋ/SO;C#C_|;?nO>$=K,A$>~߲uV4 ]w7x#Ce,˗/z'^ .tRyΝȑ#ż6 y'8?!G}4^x!$ {B>'#I  ($Q.1L F# spbb1uqL"d2a2_rRT6eСbp8hTl[hXnGydӒ3kMrL&Ð!Cĺ.Jd2ύ|T^ӂ$Itww,n&M$}U_EE,˶ZL{{;#Fz :~dǎBN8A~ O*Yp,˔J%"C pP(hllMCf^O0䠃z>@*bݺuL2;w kײvZ͛'DOggMTb…<]VxҥKYt)>ٳgsi1yd!0}w'*׭[G ܻΝ;sXlX{@ %KַE0v3w\^xz=ӧO`֭\y`h$BT" )t:M8M,il\h4t:"jhh Lt{Y,}ffP(DSS<_Wb"k֬,_n:^{5~0{lq^5"Ԟ8?D.Hd"(0 2ke&6{7F]s9ǜs9b> >>x&F#@ϹRn>ECD4$;7b4)J"xaXt׋u$w5NS| )(tuuԤ@/6 2[iNTTTTD(bΝBZ6YՑL&y~1V+NS?jBDEXpHz?E]Ă >x=}0CJQ,:t(`PMKK MMM}lؾbh&+X,2dzb1ë {W,X@dϚ5@ f„ Jgg'@~"]Rm!oa~rl߾l6+#W@O;vرCd|>vVKkkgZnzr"qW/|Ae`0_dN'GW*૨|6oW.]gEEe@0---} f3|~?͕ʧZoK@x|j455x8H$d2񝆆kلH"A|׋%NY,vE.p8No,|d2Z4w]9'`ah4q4R ^Ϝ9s׿ł =z4ׯCaĉqzo;?w]!-IdR.j4ZZZD"ECߟRPkNvEKK8YfY4=z4Xgb=nr)|>:x3fzFCgg" <ۙ9s&GFQ*HR !Zf3uuu{`bȪUɢ%̯kΝh4-k4*Z$* ƿ/FX JNYg3 .=lwO.$oq>.ɓ'3|pF#7oft4 #Gdь5Ç EX ĠAVڵK`"t;Azr9!t:aQXx"{~ʔ)`yǜ9sBx<"v;;v젮D"#Bh4/7k3en[T⋜{nhiX 1_$RBh4vavau]l߾Eq뭷hfyWyW;x<|[by~EvAX,[xy睬ZK* X, 4x*O:=cTUgUWQQQQQv)JQP ϛ|zill dPO"@ vEXh4@,#Hccwd" ۇ:Hx444YS֭[g!Ρ1 ypl۶e˖UA7nǏgܸq;Ce^bRj_*_WXp!8Y9s&^{mb =MtZ^R|G$Rh9{b /T zl6VX\@.,JL. z^꭭"Hg0,˗o+~"pp}qhĵ,b`thp:i\&1X,4 ZÇsuq]w)ޕB!͛ǼyZL4ӧ3uT=PE&@R)z)nVFŋy7nihhYѲ$ ?666N9پ};j! r, d2hlm6RIaT*L&^~eXR)EPI^nÇgܸqM2 n݊^gժUXVƌ;Cww7^~{YKt$Ibȑlڴ>v9C7W,* ~rL[[[nѨr#N&rfcfРA477Յl}es=e]ҥKE/KYyɍ?/hZ"x\mF./*hϷLD"||Z477,Vݎ`0X,x^XWWG2j}ɛBmM!nH$( dwF$^uf̘qv3an7k֬7WX,|>:,-ZDGG,Z}{L4i}T"HDB:LF<WU^y/xDUV1mڴ3ez𹮫c׮]lٲEXeaFn7|5kֈaYgh4b2pUM<' N2dzǃZR.1͔e-Wh44o'pSXTBe8b=ܑHDx~l6,v{u`DƵV4ݶmu}Yoql+VpUW1f\._+޽jx/m۶qGى`,.RD:jbZ XV\vetuuqiq3}t.4 \r $q '0w\gӓw i7qGR}_s=B(7 q\%Lx<$Ibx<V+C*nK]w)v}Y/^N6p;4 477Dss箩*૨| ~̝;w?ONNB+@ x<DEEEettvvz}ll#zuqB\K~F#mmm{NQG%/_\4k׮_W9.xw}T*EWWO<gq>7RH$B0T<2 uuu444xhjjBbh4*1y1 \{7aĉf$$qGrL.ޏx̙3xrņngԩ5Yf1m48o̊|>RQ{-${XTh4}NGKK P^V\.3rp7HZ9fOM3f< IDATgXu]sa}8V՛>o-7|36l`޼y;vώʀ6k-wyȼh4e5&ݍP7/Jhd+ hhhPXi=|رco?~kn3n89Əw"QgY\28<-I455Q.Y` .dӦM8N=3{?, 6LQ [oqG f/^̏c?NXDш`u](rP;^ʨQ-͏.IVJxPL&zn7۶mcС\q*49HDXd2Q.y7XbK.eÆ {e;2ydZ&Owٿ|ƍLgȐ!{0WWW'w!S<~_4Y-t:Ղ3$I_?9SNeذa}{-ήooSN#<pOf; 2ꛚljFk.f3_|1/ , sUWŋ?V_[!{B bYM`0 X1hZfܹl6+lldVD${3f=ݛj륱 \ėד/gp@aZk%w@doذATz/qp8̢EN; : :::$1cưa\.'N_zFT'r9~htz1Lj)z|>v8i,8`N%\"^ 3 Rr,uR!fd2h4* bQaS[/6}$I ۞;;ўfhZj"5Od2a6fol˵n<"#/2x]/3j[#F0bĈ=**ϣ ؐ˛UTTT>ՑEM'}#@B!* v6"-DQL&ڔmRvbR26lW_W^W_X6>c9 &1^ 2RJ`pqFE歼?Oe]\3fGvGG]@iXG"@ qeYlڴI$c r"kxƍL&JORQؔJ%L&'pK,ӏbH^^|faل[k vm,6lPZ_?SYj.|>/Drw8 8 lSO=EwwL6K.[o;Gc2hmm%Jp8hmmweɜr)f888aTNlqhhnn&cpKKf3$vZ~_30i$.2J^l4ٹshV,W%KD(RTd2f䠁cVo*N N)JB!8qnD"x<*[n[l6Ft:M(Q ɶ?4g Bjr,Q7o75`6Xv8vy^>.b1΅^͛X,c\6%NmZ|N B ws"=Q[J =G1WQQQoa6Emccc`FŢ"X,L&L\w齗ݥ,"bAQ#KH{T 5(1@8FwUfE)*.ۦ^Ǟ<;y13gvP@0p|>H$d2)y-?E`۷o[lڵkRq޽1m4L6 cƌVpb8`0.TA" D"Bׯ  t@=d 6 v3<9s`ԨQ8sp}vz`Ĉ J$.X r"jE4jE*tAYCPT}ߕmJ8;^x!5553|KEr\BJ]EaFj*~Wegy6$I( r >w.\ "+-Z^---~x .}‚Ajźu0i$\veĘ1ch %!t,V+4LR`ݨBD>RDss3?O>BW^C A:{g,~łP(BM2d۷/1[L&Sfu/ *++$6bmmm$' *&|xDf(ҹ:d_($Eh4 [=P(h4ۣdp8D"Zh4fװb_3g+z@SS̟? |plX,sB3'O("͢ Np/݅q8nG{{; DӉvl6J(b8$HLF=DFwxЀ>7oƎ;H$(?:t(#FR dEuu5F#d2|>;8\.'r!vCRoĕW^ />C<~ef{$v.rDQd25RH/ UFP % :kkkqw\.پ}zxAG JsX,f u _/Bښ8dB1j(:V+iRRqfa_|=2~wy8묳3Ϡh4?H̦r|2H0 gNl2,^_~%Ǝ'xSLcհa$ECL7H&0j4 0T b}={Va4dF)pj)gϞFP($. ---G0B zj04%V ;/RrXy5 FybW&a4hY3-Xo0rH x [6+7p8h"zU8 hK^p8$bDss!\?j:6ـ Rl6vTTTHB3Y'+Q0oiiVRQ%JqLSS,X;zJB>}p5g+_テIE] `Νزe ͛N8AbPJ:&%\.GEE,vލ>}ti=eZcF|$@l6<ؼy39sOh}DQ_/T3f N ǠR:q_,P((춴{8⫯¸qtJ~D"(0X,wtFPl6r?LDn:kO;4u0jԨ0r1ᰤ_&Ɇ 0qIJ[r%{lEO<V^M3WQQABAzj̘1Zn7 ͹\ׯٳѣGꪫ܌Ks)V^cǖ72h4tFՊx<Պd2 =z@P KX,i,z`0jvrjR(@T"J!e F8Nޕt\;T 6 |VڧR.s`Ǥ+;_x{Apwayfmmm}9 Q]] ZMҎسg!\90\.ujsTbvnrDK׋T*2m&bڴiӧj5z[n>$a?FÇc̙x嗱c|>馛Я_._';(t:d ns7t"L@.ӤJ[[Cg}ŋ#bʔ)>}~~_}2…$L&T*ɲb uқL&\.(J e&(umXvuyt:nzTWW#L_p=~x[/ e"h)JDgSO-{-:f"Cmm-I':OX,@]]SL \fcc#͛~oѣf{~}:Mar:Xi͚5|#6nj"aݐdmpH$H$`2$biRI-gE!!)R) fֆ&t:DBND* EP(D&SfA) ip7cȐ!m0^WZ}-t8 QSSkުs$ú09Q(iZ؈>}5L(d`˄bH$;[1yRCk~l2|ꫯt@FlF>dB߾}a6a6c߿?z#l6ۥ]) eO]F jXVd2\|Ř8q",^+VҥKnjj7,yl֬Y$ @7:L:xlV"vhhh hjjX<[ Z{]7o0FѫW/rb1X,L:ov؁HW>G(2w/ց:EQƍIW(H[(a6nfݰ4Aގ .wuΝKviXnyp N 0lHRQz=[fP,|] .mξxP[[7Qx?Z-zO<{.N3Z ǃVn W|@v)0L&yw_I&ٳ9 `̙dt\=kS\&͊mYD"p:hoojE,:~PYJ6suDXDmm-  yJPTQjBRQq{шCq`$zɽyD"A!l @+0}tL2s?.Y'xuuuXt)1cgQF a0sNI7|f,^_5fΜ^{oA҆ms8m6 _|?xE---e@555tz³T*x<QD"t:|>/En+]D`%c)^t񠹹մ,BǃP(NG?+%d2aĈ۩S(pWbڵGm? p8Sp8 \L pr9x^WJAg\.jer4`@UUP}dtR\uU6lF#f3.2,Y۷oߧxVѷo_\tExN㭷W\N_.zKt'|2mۆ>r oN?Gj*k-ZDkgA/ JtWdY-vCVc$J~P0:.݊paX`0dzgNIg^㬣u@w=S&֭[SN9~g0 _B^~er9U*8"$|m=Fz PUUb`038 ²e`SOaȑ8PUUu֡W_}Y|e 옰sO>A@9lj8[ ~? ***`6˅,H4TwS[_RL&0RTSZ\04Qޥ@DLFKR~;v;w.zE]n^xn˱p8̚5k1mڴC*sݻ7}/p7)u1|89\xᅨl6KCX,gϞ@f@~ 6mڄ#F`X|9Xs̑<ɘ1cRe21"uW:i&HI=Cd2Qg<ϑd( B!**tdYqlڴSClz+QQ:Y3f }fh+^S}1Ʉffd2 S;… %}e>( l6`„ dXv-~_Oǣ>Ӿ+ ( `0&9 `4%S| Mb1Hy{{;RZ-|>r9DQD&A (tӧDQVn'Γ,ܕ d2p8]vlZj`%yU]Q:&+:îL&P(*ꦗ03YL&B!ʧ`/2 ٳgC_h[_uosyw܌OnNJ{nu(B.%">SڵksND~BapYgᢋ.otP* tvK,3"ɤ&u׭[VRӎ;p%H]z=}Yjgb`dB{{$2X,J g^FzRKH$ҭ|?O: |,WP;{?&nzذaܹطECCd `ڵז3 +r{:۫b1I>@4?ٳgcĈ hZB!MEhZ,X'Nĥ^* >~gflܸz'N7^_2DQ(( D"{f8V2Gmmmtfظq#v|, , voJikkCEE Z[[(RFAuu5Z[[)XV#HP(DUa`0=zP=:Т@ee%dsd2b ,^/~_ TcGaX!ijR(p6s IDAT)S@ꫯu;v,~W^q-͚5 a߀p8!CTP t:w6s8t:jfYz% v\wpb ByX ZZZ/?I,:r9n7 SᱶT [AJTfP(i ՕN1l0 UT|\.Gh_~%~_v۷/J%  fY?ۏ9fΜŋ>2RP( BACד} ^&!Nc۶m8<@@h}CE̛7hhT27{I&oŴiӰaz޶mpgs޽Xb.v }3Q13̧tRC1p@Zl6K&FR)ݻBG"b' fP(# {QEu :GbyED}Ol.;]P(P,iy`. H~_RL`S llbE&jdP*xX|9tL_9>d*L B!NCAӕuߚfDQ^t9d:BRܧzwGDs[ou9)2 Nرcqbaˎ`]ln{L^N'9n~vd7ug6SN^ (3 JvWh4R)x< K$w~a21C,clFZ5 yf>]l&1Yq_/1qDjYG{8fC*d*Jg͒YwXD.^Ǻu0j(Ǥ&_ؾ e={F|&R3A@4%+W;c=Fٽ{7uMۗZp8刢H3msO>_Oq8HRbPTt.*J~zd H&H$׋7~{}^ <(f}&dYn#LR;L| *"Wwd2ad2H$8p Vdp|PVJӴ,Нf([b ]vj>?|,_@G1oo;>p8p4F#z=3gΤd0~xlݺ|f3YOӉe23MhHr/;*!" &RWJ(عs'4 l,T6! lwmΈD"EAW6=^rx. xNDuA{oe8b1d2TUU!P@-+B…\.G*F4E -=Ϙ=#N/G(B}}M=Xb$`ɒ%o>{=Zenhmmŝwމ͛7Up8ft׆p3F#)ٸz8B!q(J2R)`0W&l |8S`X`2^.cرXj4+,Zƍa.< }^V#ח. }k! .UkРAx7`4o={⩧(P*e7@Gd"kBO[+[X,޽{C.o^G~}lɓcƌNÛo`^Nqexn:{O>hV%Qt3 d2 BFFv* z"{& {{{;&MDXV RIb@CG&dL&ѿ*ݎp8 ߏP(D{JB455a۶mH8f}h' |n4T*++t:Fb:@j^t&?E"@ "R0(d2|TP BPp4mV----p:T|`T8묳jQWWwvrx%]y$h9g`Ϟ=غukW!rλw>kp89. & 1f ^Fvh3hkkjEEEub1x㍰l0a֯__&n}H$Xf rOd2\.s:PՈD"رcu>_pH^WzFC]ߞ={Ȯ/b|Ge$+@P޽{1c |ͨ,-L0^Q,rDTo.#/:ϑ$~ӊ~'cN:G<G8. -ׯF|> 0 )҅T*!ɐH$h"\~p\HSFrfj5z!nذW_}54KzJ>6m-Bߛf qe69LDonnBnb׋|>/ ^j{(j5t:Z[[%zi (Ft cl6 <t^z4ܹev%v(BEDQA tصVYYt:h4OA; "KDh4*^˅JTTTtJ,n7B8F# Ͻ]va̘17nx㍟yxWRQ,bS1ńcE> 6Lp8G=Y9HAדp\|p8x<$΄B!~Ԡ[/#Z|ɰZXh H \3<}|>F8L娮]`~;^H~L&xs~_ߧוwqF $z,^9N8vm$,{G=1}cMtntYid2>* X,uWUU@:_QQ!x<FADVT*zf!ɨ0T(Ԅ`0FSwPJ(H&ZinKWEV:j5B0"uy1%҄ +t:8zBt:MǺup[oŃ>d2,^XO?a466>9:~p8 ٌ^{p8ʆ0sb%tLjRnG,C*f;j0,Yiۍkwy'"d2Yk`32-K.{G5Ld2j(w}vK#GD4ŽދGyo&.]SO=ʃzC޳g} # ljPTHRX`O.6/EEݻF^}\.GX\.Gss3&MC⫯¶m0ydK _~96n܈'x5kvN\.G6FH${{;<r92 6l؀38@p8T*p8Ty^/gjnnxw=FNv#!QZ4 b!g U*V+|> M$r9XVzݎV \i) TNCP(g,"G ~W_y>稤noo?kp87X'K޽{h4PFd2 BAG2(_N3f`>{ݎwyB; h=, Ǝ3g"LRD`~ $Z z*1J-x$=κGfbG]]ɲ{u]Guuu5kÇҥKw^ uLoڴ Ç+~lآwug;9x<B0 KF|>/0s^/f3</B!̞=VկW_ZQQs"H`]vrlA ?ndV ο].# ^>o~,[ӧOW(xwx<.݂k }֭[1w\z֭[R :a&r9);{IK)c ̞F&!JO?`l2ގfkRꫯ7 ׋={^(gנRmڼys_ 7Ltd2xGpbMMMhkkC<'|>JV>} ,"}Y;m݆|s֬YO?Y0يi4 u{衇#"Ft:9>C&mmme e@,E .r;;wz)s9:DCٌL& ͆p8\y\r &Ozڵ <Ν3Y0SVCE֒]C&,0,VZ#GfP( h4Baʔ)?>Rn7L)Sz466bݺuغu+ ذad tv`ۮ(e2qr9̟?@5ώRD0D"B@*^\.f([b |gի l۶ k׮EUUu[,* =30m4*q꫸$( ^Abzjq]nfL&B1O} tt d2LP*FX,ٳ'0N'e:xVQʺ:>%t:#>LbyؗWpv]bf%z$NЄD>Guu5DQ5\?3ŢdX,B&QptpbΜ9:3]vcws8ψ޽{?Up8Fѵp8G2NB6F.#" vyaIA\s5X,8iӦ2`޼yH&Xr%|>\.OTT*ﯼJ;gє ZDL, olʕ+a20n8KS*Nl6IH*߿;d2r9zEhh)HW*p\!ͣ޺udY|^Ae 0ϓ$ɤ$Ėms&C=?|Hº].z=zE/ʕ+駟d23DXĿoTUUX,󡲲&Bmmm?KkѢE3ÁD"Q `X "b'I ::7n駟Tt(Ecb0QVU2}T X @PFO>|zZjdc,4nM*Jʥ( ԕFj_a"f,^Aը@X ׋뮻וi v=vS~C)~;]b.s8ԩSѷon+s$ҹs8Α K&$"eYx^ٗq"".]#Fv^BYg7 s90Xwc"eX̙3׿~VSS#o&{~7\Dp8E*Q*Vad2ݻ7-Zk{ٳѻwo7tQ($)8sZgfB@߾}hz%6B(&M*7(SNA6E]]-u3qT4z$sEARAP`KgϞ$jjPEv'xl?Wߏ{pi IDAT .[o^L&h4 C5LR@*{#Fvƍ{˅={@T`0V ӉV:w׮]aÆQv"t'  x< eZofYRU(ߣG\.8NFZBBd2@ @bV8,@VCR`0ftP1Ax<it:F'Q= fѲyz뭒}(J·x< NGS*1T*|Mɾ3g̣np8?#Ǐjp8AH;Dkp8Á6466p~}x*++qn1b?X9Lp, K%9n["p xI diJJDQ޽:Kٲe zh4YfA.'@kk+},Y=^xѣGcƌ{JBP(DQSSsɐ`H:}yZ{DPQQϷ bh4l6+W^6L&Ce`FFPHR9pm/ krp8I|s4~??nWDQ?̛7[l9JǏ?N8ῼÅl6K>IRR4 C4gy&YݥV{?< \.Ga2JH$  @yEEN=T^UUYfa֬Y;_z\p\qc$rI0ieJ# eB]%NG}HVp|5 , ?#G'@E 8gF4[bժU󨬬ĨQNzDP@t"JIr, $|>N-[iӦa„ x'1c x# tyq}>Zmd2ѫW}^Wzd2 vPHr^,YjkkWp8ZZZ׍pt,  bݻ*** "#|>u]֭ZUU뮻r ?aםlc3(""@T*aXH4k$L&#\ 믧  LR&L@H&hkknFAmm-l5(vܸq7ny|>|Gx7瞣. 'Nt@vgQફ}S,t„ Xh֬Y ..D"VKJx<$v>gϖ7κsNl޼+Wg}Lӧcɒ%ׯ 츋 @}xbYC (㨪B[[n7K$hkkC~$<#G$-[ d2Aу:Ya'LbӦM3f P,c!@TnCVS@[[J%,NtvǓO>}ZveEʺSRv\bDKK ݯcv~[;O-E~ʕlsEE8NBt:p8\.͆D"x<BFC\N,dl6z=yL:uh{s8?ʡ^9(,8f'9αNQocСx ŭW\>X sF 6`̙p8p lڴI8," t8P~,G9zhr9d2T`F֖=>a=j:t(Yr9رcq 7`{Rpw`֭5jZ[[ &2 ($p 1dyDQhx<ضmjQ,ѳgOb1ɲƎK_ 6fNE2?éC45$B0D:&/J . gu֭={6-[&:gJ %~`-&>Fv^FRRD:L&#}˅}Dh4J_B!B!X,vK~ogVD"$ iB!jFTTTl6CVK v) X,xJR蜩jE6E&Akk+N'n70AnGPwyǜU19gVڍp8G:MMMpM8bXH;hkk~;L&\zغuks#LÇ?k9|$ j444߁ `xI'/us;HP-7hkkC&,yժU80d8gB!d2~.U*lق^{c}Qf<#8SaX0m4 ~k֬ 'ՊB@~.KiV1zh|G:lsA@ _l=/B1gD@FEBsѣCaŊrۺj5(M{JEw&v|d2P*(HRbQRhعs'2 ,KY8qrj,nsn=z@>h^þHT'Ja.hfC[[MTWWyNJQz64%!3P`±sƬY0}C*s(hCJC x뭷0dTUUa]v۟{ؼy3qwti9v BP(hii!Qd2IDA2a?HDȫ =\˼kP__/FHR0 p8X,hkk#WѠt;wwF*":FL<@HDȣr!J! ۶m 4зo_|X~=(/fC~pinÛos=V( V`^f1p\,[L5552e !/I'Dϓd0Lp\oe2^waR޾mgaE+D԰ *1%cT\=1&Ơ&jܐ(As6,6=K}v Hĺk.ꪷު={"Lr]w/|#<{w}w'|+z,Zyi^JχlbuPm)3X5w\BKK ~_$Zz5s 0P !F0]'I\.nl628ST?>{,w8x^9\.`00yfijj~ic20alcyD"5 |>/սy:=nGX,J}}jmm% T*8 \h4Jkk+ƏϷ=nwC;wοL::::vL&>o䩧b!hkk+.T*%( $ 䰍V@JBT .Gj{墋.Z]])f3Nd2)}EbH$rr҂XEQ(-ӈEkN+V0gΜaSٳ-[x饗Xv-;wE3f SNbXd2n)DΚ5 /)B"fk뮓nI tՊd⭷ޒ"hr4} 27p'N7pgy&wYt'? 7n?dܸq`ԨQrmݺ.n7`ǃdbOYhll żd=q7VKgt_GGGGGGGGfp6>iTU?1s:ln㠃GF<6dq8E2l  CDKXdҤIfndMVx5B4x<$ ^L&CKK J`0$NƛbY َe?!۪nzǥ8 h"Q__n'h<ﻺK.߼y3~8R3f0a~_0m4NV1c`Xdf?ŋy5\ e2m&uuuJ:& vl<#b1nJŒ34iӟXn'Olw͚5{ャ_^ (iTJ|a!_*4:u*,͛73~x2NE__MMMfN?tl6\NUU Nc H$-qQ<bxWF:&ݍd5!V |>>vq8$ YrHDQ~ѼL&C2vH$hooxWN* X,N'vw}N;^zip );Ng``ȑrE5|y8x{<.\_wiGuttt>! " ?adzf͚=f N`rz{{) 2[vc6پ};NĊ+3f cǎVH-j_L&y7yg{(>Af( WSOdҥ\y{챌;_Cm*VZy>s5h3< V澴qF<@,,y?|RaL4I#Чijjj{8Ckӟ$_F<al6  |>Oss?lŔfl6S*xb_& EQ4󹺒& 6L&5*yp8rXgy&]]]L:uqr,@B!y,d /3!::::~!<F@}4=\nXA[PwyT*ER!NK!hÆ xC{I'{ǎ;ꪫt^( vBd4J%9֬Y3䵮.֯_WۋH$B[[`PgY0~JJH{{;HDfر +VްX,guU2eŢt:1b^@4 L xϞ=EQ̶mxr̙38@?q8T*; ܳvE8&LJ=cƌ;oIu  \.G ^#R)2 >O ȑ#5:a# hR$0E1{lƎKRaǎdY)xB!0544r9iJ8Syw_B{{ojnnvٲe P@ /HH}%DsR$}ŹLFγp8͈l~fEX,b4(dYfΜaf3]w7t.SZV+druͬV8QUK/TzWs-p|^fN|>i#Y€]G8&%=ϳ,[l>S:p`d2a4>" *hӉje?06$f~db{1Xz50`C Noo~466L&y衇|J%ѨQ&̈́hrLkk+P@\& Q[[9|^#@IR*Bj>N*Df\.7oA. da h$~{\y\uUʡZZZHRMUhA!0 FLσ > UUD"twwڪ D"(|>ML&(x<M@l69hB땞"M IDATM7Ē%KkќR$)Ҋ6>^`Zzb1/^ baWt_GGG_=._GGGgnS__O8c#` 0f0rYmpBɑG:+RbWt:-}:$U/ s='F,+hT6{&KXfnJ"E~aF#G^dR64Lա( ?jeܸq,5(n^ld2l6$T*>{l>CVZE.>W_Yyڵk| J|>ϦM8C`8<@* 555Ԡ*h4J6eĈ|k_6mw<^nݻw3f~!ϏԈBnj+Dj}1/M&;TUeݺu̘1C?\.… y瀁,TLfU^T<.ba̙-"e #Fcs,TYQ>V餾^^/xh4 r9\u|P_dTg RFYB@kk `4 BL&jkk5&/椓NJd )3`׮]R)yDQ h]rX,6p s`a/E vرGRȆ,r|>OPBRTAfOkx<|v) d22P/+@6\N jXy!} V]] lݺU4nuW__j%CXDUU<>,w{MM ^W oŊ̙3G#. eގղe8_oo/tZnKosc=srJϟYYx1l6e]&SO=b{bO>I(&h4JJ aѡ9~_ffwww,*%*Frl߾]Te85>`va~ob*D#4MDρ:KB=V^ʌ~iznHW vMRO?Ԅ<A$>O>" "DT*eĈl߾>F#x\f[Vv)-~~p?z|>8kkk>Bx^N?t-Z 7 +26*&O,}ynn?̙3V;Cc_dؽ{78ZVMQm":Nh12rGj/r7( ֭Abmc= dՋs edJX,joV4r\O.^׿8G7P( @@f{ `v1#zzEv3*JaEGQ"t__̌^餶]vazDQ"#FfQ.꫙5k)%fYSFet} @˅! I!_t:MMM B(455M-nC<'|Rutt>444HgFGGG_C`_WWhooT*ldY3Ν+-?FFQZV ddiMR_i9sgv]]pfF#d@ tf\ݻwKz4 L&lGc@QF Yd GfF.Bl6;ofH$"H|>o4e@~@@:&I~O@6 |> '!x^|zd2٫AQn7XxPBCC^f36MoQ.b 9?|`@5j}}}Nvk}fyRt:RPܵknY'?ަh4J cǎx?x<.3⋚@4-2r)pp8dۖL<Ρ* Mj&Nc0A"Uϣ9 l6kbE(H,#~b =\~mf2jkk1 Xiomm% bZX,FAX$3|/^,!.K3>EQW"0Vh' ԰z/)J )*#UUU~C|2[p5ha@ȵZl6Ì7N466ftR,FX"___̴RX~=7|GyDd2D&nk<`>GW#*;wl6 l2xQ*ؾ};SLE\ק e͛(ŋ?~|.ɐZvEl6tR=z4oK?>N8}kEΝ)X,o0q!R.]kjҥKyyF\.ƍܹs d0&EP__ݻ9r$0 VoM6ay衇PK.[nEZӸ\.TU;`ڵ<8N"ɄH$dF֭[9ꨣ?fI+;al5_WH$tttpK[T8S,4661> ^F{ JXLfɋlVcDֲm6Fhcʏ :;;Q@ ڵke?D"Ǝ+qX,n$AQ湹\a, L&#t_GGGGGGGGbDb DGGG_D*H?>@ MUUzT*&IMMMMR) rY|SN9+Vhe2XrFp8pLXB0ߣT* |C,g-Zyvꪫ n\.G]]VJB0d2a61v) ^LKK [lrI[FBrP(4D[lrƪt:--nrMMMJ%0lVF#˗/+ ^B"+`Pohhcǎ%Nc1?lG嬳"u;l k6ٰa_5u8E8 -[ /_o͹KP`ٲelܸlٲ>|#?ϜwyL093xM6sqmd9am[Dx饗x75#F&w}7otR~_Kx$m{, Ӄ ioG|k_EQhnn&( htHƽkD"vv؁jT*ǩT*e9O(X EQ}[[mmmr9z{{zER̪lCνT*e2Y5P[[+#bElq ʼyp\\xÞKq - NSV@VuS`r( d2iS(/lϊ ::::nZZZFGGGߕvBt]2RGgOdY)F EvލdbPWWGKK @BMM X ΨQ֭[ǔ)S4;l]>?P(j%x Sƞ *dR gBn׿.EQѐRd qMxxo۶ ݮ'Q.5j~_z'I|>Cfh AWg2lvvi]3>V#M&#Fd2aRһ]V#2|I mmm*EvRd2vQU_nI/: ۷sjQʕ+eFt   x9ٴids9GW*.BRׯgڵ,]nl6`ߖSO6_0m4&L@4eʕDQ>}:ׯUU 1:")&iMtEᮻg?<ރv<⽃8bƷ-ji3x&I cĶFMbT*9$Lٌv~?uuuQTtvvJ$EKKl+Z8vp8,S__Ϻu8I&s1p {<<ylܸ'rsg3rH֮]+.iӦ1m49&O,oox___G9/ uYb1.RV\)rjXX,c.7ضq=ԇNJVgox"n[H&466R,I&J%TU(0PFe0`0HXT*du*rP}:צt:-AR)?x֭[ǽ޻ǀ\NۄdסD"A8HEQdOݮ #DiݺuHtttt9j}4Gcc̐-HR,N^B4">}Fz]zK Dbu>ۄa)@vlR!ѡ8XV, MMM{*}Ytvvp8,Eֽ`Gf*pm6MpKdJARaԨQR~z饗8ihhW_eܸq|ߦ#GrW?r(/[L P__륩t:M$! {nqdp0$puuulٲt:M\{?.=aR矗v'o7o.MMMx^^/F.C9szjf͚nv,;w0yd?|BbJ__VDQ;0y,w͑G߲/"~|}ɒ%wq1ZFɉ'(x ܹN8c=ٳg{ XSO=űˈ#x^ضmBynż'" PH0Cd%bAFATu'455FFx< d29蠃ظq#+W/9d2v, LG[[STT*iqLSSn[SS*>V糀hhh;^Ed >vKKj_V@Wgh4*'HRtuuIkL&ÑGYGͫ:d{Ft:M<ÂMCC@. uo/$ *Oz8Tg -[hz\.RHӌ;T*E"\.fT*茶t:-[[lYo&.? &0aosM7q_EQyǜ9shhhs<g̘1>XEFf/Hx<./"FQW;wvK+r<Ļ /xva VZgYweƍ{,YzErq5կ~/~X,W^y'ʹa4e@b iF`@6C:(MGaժUi޾?5e J%BF#d2I:OT&Lf x`0 o<^{#950a|;v*x\fl6~liX@ @0p\RHMHEX,ѣaFVɓ'b $/]t>_W|466rWn:^x>h){<+,o9n /Dy~5nl jh[oUU ͒%KۓH$B&!x f͚syP-B χngݺuL4InT* qiY-Ё(kk׮eʔ)2#^UU9[R,v> IDATUVӟTÑ9䓥x뭷)x{c=6}" OaN9`_~/"6lq:r=KP(#J(˪x L&Z[[ ⩎l6SSS{fQSS#{'t8}]X?3fBMMM9d4QU"}}}RN Q|Olݺus'N|>O[[@\.'}v;vod2a61^/\.G}}=B!\.6m2@6`Uc=6e٘d21uTN=܃g׿5wկ(;GyٳgK+N5~"{RH׳隣QfߧR)z2w^rL"faۙ:u*k֬644ݍn窫bX,)EQ:::XbXv-w]dGT 6}EQ4vFսbOwF_Wy|>>ryJMUU9exl6;׿uN|8QUg2hsN"p!p( v<ܨ&JiD`0~ n؈d_*0 x^8xT*dB,RDmm >رCd2墱ߏlh4ގdb\uUqL>J"~5DRv tz{{`j QC<'F9r\ICVW |}L>硇bz(::::0eohN(:C|>zzz{Yp!6l"Ȥt8Rܘ7o+Vhoo&{>uaTU{l6 ׆Y%"(-bJTb…\{w{WWo/|3f Nl6 ʕ+ ,z͛o!EQhmmc'|K_E o5L'xB>7%9nmme̙D"~mL^{5icǎ|Æ 1cƠ*>,_פE`Cw}J֯_eEg/%5E"Lz5.?ɄO>/eXoll$ ܌(A)nQWWj%inn4s ;>|>p8dl6S[[K U~VEVtvv}D"|KR)X,VPTנo+GMMMaO^By{n.]ʤI[W>:=OGGS\s= du]x _E(BmllX?tt8D*=(ʐm:7#GlJ%Ν\~ׯ_/E !{Z0ZP?)˼OSf̘fQ(`̙äI;ï~+.aǮ*v3ΐۺ[>}m G<<UU5B,W*4 ~r&zJ}}}455N4knvnZ5V\.G:H$r9Z[[QbHR@ l$ jkkeYE>@(o`0pWFTEQvLFZZZ(JJ4ACq/;:aU=L@޽ /ɫbT>l6swMttt>|Fܹs9蠃43ďihll+}JRAQ,0]4eOXgnsm[nd@ngg'0J=uEUU裏O0b>lnfBΝ;ٰa6m^vk3< ܧFw>h$=V駟\.x71ôiӆCq|EM\&LJ>FM__6 C*rOT*r9|>.K8F(ˤR)ٔ`00zh";w@a Y ,r- 3gΔ1h֬Y#<­mWU٬IӘfRR߼y3/[/,l6 l~6mƔ)S(xL8y睇(̛7'xŜ9s_z%^}U(ˬZSj-`P8ͱ-o5JSO=UϞ= &k/r[Wp>SO=n>[GQ_~YO>(tA~ /hz)RQs"p8X,lٲM9 GV*F>LJA\.!PWWb! ~@X,^{-=&+}{EQ((˚ d2ب9O&2===J%Yq Tb14UUy'ַ>9.0NGGGӂlg?_W/'NgرkVz{{X.%6ˑD"t:M}}ƇUћL& R`c@g"j{€h hA .㺬V+DcgI|:xyyǰl}٬YFz=, ]]]tuu b1,ːs9v/n[n,z(^E]x!d2I ff2 ~_rQ*4YұXL#)"X/_Θ1chkkk65IRV*FM&[L>}/G| ~o}D"^ʯ~+* &Lc7t&9.T*UW]%d2C`aӟ?>~rw97QGE&+$;[UUN'ٳgo|ݻw9VbH$hllM[4Y00?3Ɨ?LR(hhh JNNoo/}}}(ᠯFZ[[ 2]\S`+'|75\oJ0KHDLhT_}^8@z/, ߹s']v<3T"sdORggglp.ph/Z6`0(`*0wxǿ۳T BBQ$tE)WP~ERD\@z"("R,tAzHBBB˜ɜPy}ݝr̙y; C 0(ca0 ; P*/fr~fwwWjZ0 lDFC***V%ZX,F|a8˼^/1XV^FCj5۷/ Cӿq!ڵw@V#G2sLrԩud޽dʔ)u$22b"ƍh$VD:! ÐBhlǦjC=vX,β@ @JJJf˂ϽVK!_~[ndݺuB|>q8a?v߶lBnBH9\#@ r_"n&r9"h)Juu5&NB Zvxu'??őB)))!@BȆ HvF#IHH eeeBΞ=KڴiC>L}YN]vuDRN6Ac֬YۗѣGyϞ=qߴN kOs"""ِJiRSS޽{cԨQXv-':z]OFL&À0`tN8˝N'!x<|4ҶiӦ0&[ns΁Z6V-ZnCV]\.ՊǏC ±fmzCl5oΝ F$\.Duh4h4_ɓ'`Xx1&MDYsD}Ϛ5SW*B$!99B^y\xwux 8p ֯_={ĉԩ^y,[}?|pZC^^^~edddGطo~?Fr_< ֭[ǏCCPUV6lƏi눈x饗pAc֬Y8{,+u4hZlb;`ʕ"''}632 rշo_<6 6I۶m$=z/ƞ={ p}aܹh A{RluvzQv"d24 $ `4ixTWWsXhR),Y6O@fiiih4P(HHH%J%$ 1PSt7o..!999!;DÇDž `}\#D5 + z0b?\"p#F 5`Ӗa9`vʕ+xkaΝ;.]p[oӧ_0͞'P(7VQQQP{F7 h4pXN$̤7@ooC>\c}V++0@ @dd$"""®2Ro[nɓh ˱gㆎ`xt\tO=iB k(--!"Z^iFUUU ԃ{ի5kA~0`̛79`_K𹪦&b ::1Ξ=E!22x^:L'76m9;rH$BP]] ߏf͚A(r[l"#Ghh|>+[H ޽|Ɇ+Wk)!**Ddܸq#&LڵÉ'0}t\x.]BTTN8.]ʕ+˗/ӂ  2m۶Ŵi0o<;wEEEwqvލl۶ |~'L&j ǎCVV!ݻ7LB,XK.O>)S{W^駟nO66N W8x=x{iz[44ƍ_ . t|>N'  a$Amm-RRR0 CH?0t:&M7xrX,H$]l0B᠓eee?Xz=iaYZT0 ZH$6J}t1bRRR'p%Y @S7r&U$hY /GA!xxxxn6m޽{_'&FjժśhPwp)+B JBRR=PeUQQA BNDhyBz=t:}FXVDGGu*2Dl^^!PUU|~?O@sexT*q)^!`͚5HJJ”)S> :}Ž IDAT>555ػw/8f\x/Fff&+txGuuVv̙3;pQ7Jee%=glG :7o5kրa*fffB(">>^d2L&Z-Z-|>=L&-rFB'R!CFRR$ - =D .@$QzD#\.̾j-ٶm[Bйsg:tO =ΝK{ Br9RSSja2`0#''111غu+l6.]۷_xW^y .1l0Z<j,+V`ŋC(7W&f 5p0 |>~?]n%Ұt,ӉӧOW_Ż Ʉ@ Bl]ƞ;Z-<t:'31}H$@ `0!::n6 :VTF߾}q= 55EEEXjr9~?i!ࢵ~fZ:III0L`**!6NEZZOx^ ::#ޟ?]vE߾}i&DFFrα_ #yxxxxxxxxn >~-gСCm6f\|wun7V+h^_GSKPa||5-nwz=, jIot:ݯQgϞE~M&%rI!X=[ f3bcc!͉: ̙3xPUUHM蟕sΡCTD8y$[g $z!p!L&gϞؾ};&O#ia۩bӦM:1|С4rvر0a:vz9P( h޼93cAS]$Ch4عs'NvH$HRt:9BZ-D"l6Azz:R)^{5  zZ4 9nll,^lڴ ~6SNqZʕ+XFMM }LK.A&a„ ?IZqFcڵؿ?-[{1~xӦMCnn.4 V^7؊<F, 6m^z!22&L@fpYl߾W@5.''&Mš5kPVVL0ZJÆ Gs}[Tr^߲e @nӦ .^5k ??| cÆ [;xrd@&ARшd TcB(J[s:4?ol6#>>qqqPTʢB߮]}]pbObRs>X`fϞMlvӼysbt:nL&HR|`sA^^{=dggcĉl!˱h"N}ϊ¥KeBB̙HߍzƊ7TVVo߾ꎁ􈍍a6 @@-fV+zRRz=g DB#C8|0֯_"vux{ԎE&M8!F^^^80_vZ|7!͛7Lj#0j(tԉ53n2ĩdA֭^z% mx܍fCZZjkkBDGGCPp>:}Y0 agϞŝwIƢZl?èQh;\.: \TT\|w{g^x8qn{0fL8oѣ/B{ٲeXr%Y8qN!"w8~8kFL{^nvz6{ݎjCP@ )))fŋoǎ7|3@scBPSST "94:PZMSPPqơ{Ƨ~J'' """ H htP* ;0 i"N 111lP`RDDDDجJvE(bܹXr%݋N:Lf<)h0ȟ|یrL>]vܹso0iӦh4d"..`0@,#&&޴b0 D؍_}#qrz999E6mE!?Ǝ1cMv;!p\!Iuu5J%^/ݦlFZZ ]X1>c61zhfܹ* ^g-f٨ tm_Ӊ֭[GvЮ];h"fO?? 0p@|GFۗ fpc˖-px±yf;<[2x8VX,ω4~衇8,W۟[b8z(ׯFÇs&T#].D1c-[ZMY :aN߿,_,p:pP*^Y!IIIh߾=Ák"99F:=7o #`Ϟ=?>f3fϞqqGA~~>-ZD#M&RRR8yXr%?>***gܸqx"R)\.jEdd$\ !ٳ'LrMۧM57Brss'{`̤vKQQQp8Tf_SSCfCLL J%J%4 -R/Z75`عsgȾ* ,]SNm P*aPSSIJeHQXzjm6M> Xn0Xmmm vNp ..viP:q H Hp >;vw H\Ι,s8_}A*>/XV@ W_}uw)++CӦMOfͩ8?& `ǩfX,j)BAuu5G@f|ͥB=FFFX q_r#F@vv6V^}SRnVT@oƃo|k֬͛СC1tP 4͚5k˗PUUxrnxhF_C&O-[矿~VUUQk(:8~8իWcРAh׮w5k@T۷"X,FUU9Z۷ .DUUfϞTHܹ3Μ9!C`ذaضmZZѬGat:R֎!Byѣp84Č3* СV+}ϔ)Sh19B!$_t4-8}rMIIiTl$vC,C,"pgϞEjj*{SH$\.SO R42,k|h޼96ǘ1cq_NݎBc׮]ؽ{7T*^{ӧ}|>DFF^E:<t:Fl6#111ZGAff&vuB[|T&b͚5hٲ%>#Lذa]w|'9l଺~ ֭êUp)ݻ}+i&ZtDŽ pI7oB… QZZO??cԨQ()) -[Ė-[йsg-D+Ja0P7x>h۶-'껱*vB@" tB&)LbE6\B~mX~=zR!%;N8x<l6L&t "555ZFFF\._Z& "~m,[ M4JBuu5f3ZnuEV;b ::jZ.ؚ=` +˅c ػw/Fc8pCT*EqqoZQܪEjwyӦM,۾};|] -+ ɓؽ{7vލSN!??wbbb0yd8q۷~VdQr9'"C Ayy5f1!(yLL ␗9s 11X;v ]v-{5쾜_رczjj>3qAdd$' Hbʔ)ضmRSSqFt@]$26#x_SSDX HDX40 FC,["=F rg3M8NX,$&&B,Ӛ*yyxxxxxxxxuaGUU~m_|1cp?qD,_x < +2B` N}_{5d5)**BǎoӢCT*9>Z)))te4!wJJJX,yi<<<<<7ǃիWٳzWxxxxVX-((@8= ,,[z5зo_̛7}`l(LJ$a?`ҤIx裏K.TzBPUUVy8N0  ׋ 8t:\.._ Ʉ@ 6 /^֭[d{10 >}ĉծ<ۍN:qvXyX[qqqHLLFQ{~ IDATd@C=ɨ NCZZp8ja08^|&&&#GիiM͛㭷Bjj*>}`(//Z+*Dv܉˄#8+-[ `С!2e N;z? V >1h 9rb `ǎ`fi[N^םO?XhZq&,ݻ#//?sm{cׯVT*! @Z-|>퓓i6^YYYx"DGGI&HNNAii)hyT$H$8FG~Rlǎwƾ}УGDEE_~Xt)~… 7x?8jkkDp\kl 8c ϶o:vb &&NJd3 .]NM&K$Arl6C*|>x <%8##胣r D  @ih @ @{w <=@ 00"aϟK.aÆ'|1? $33d22k֬0dذa #S8DBFA B֯VJo|ݛٓt֍`0/{䐘"B!))8Nz1ͤhZjF!Z\r%m*++N#nhZB!>ԄBߣhN#'_Ç_W;L&bZ%^-C رL<?уǓ8N&NHy?^kKoNR)iӦ 1}:hZb2H  @ @t:gf#} al2RHtt4YvU۔0 ;8I&bXoz>tL81SO5z=v\&0h4hHEEEs4K ~$''~BwCHx`0p{yrfbZ EzMxDF<^3X!ה5sz u&ݢ^nVYkIvBSyGkzM<^#grV?v֐kmJ ԩSaC;xxxxng|>^L4 ƍ )zѥKkfIR|x2v?w"td>R8v)X`[e#[nٯ`p ..>|8'!채񠤤ݶmsssT*]"777cjiCjj*~gѬY} nzC9n7RRR8.3\mn:<8uMy3_|}C=3p8`F^p8֭ 8˟y,_< M0U>]8, vލ> GNNx 0wސ3 Hn;o4ٳgcתмysNĉfΜ/s> Xj,]GUйsg\t YYY5j; שG}_~%ZlYfaȐ!Ѷm[Q3f>c_IrΘ1>~Xx19+eeeؽ{7~8q%%%Ê+ЦMj%Dx[( DFFrш@ ˅tN_ZP(p8zD7駟Я_߷~Kt:Z/utl< n P/٘}[x<\.o۩Em|͆|L<O?4lG/ Պd~~C}RoEFEl <<<< vgϞ?>n |> ۵kGSC(b׮]8p ]FA  vӂ_Ǐcغuoچ\.#oڴ) _Bh ߛ@ 2Ax#{!@cǎG}DY>ڐz:P u:nD"vB0lB\.@H$ T꬀rt:9_nz)9rwq3+YvajYž7o0|;" àVVE^1cfa?~ύQVV]0 Vˉ#>R-ŎeoX[~?R)ryJ-[0{lm B4k ӧOǠAYc o̊2zƗ"99n#$&&ҿ#( !!ubrzzzPW(O1bTTT [nGQQ vHA-BUJea-x<jx^dddp>Zee%T*G2 r{ .૯`X!AƾƖnZ@X.sĆp 5aݻ?xغu+~\PE:yxn @JZoC0h WҾ}{lذFg^fUGVUUA*B PA-+~5jY`kC ѣGCr ]PHDyx饗`4~zу^w={@"UsNl۶ @uYfΆZƬYgt?<`ڵ裏8㪆 ؙ3gtwPWwРAؿ?ڵkڹ!eee޽;N>)pJcRw a㈾,6 " 555z HKKh}8\w  !pt֍;H$رcnu2 V4HIIX,^Պf͚l:[(::i(O nΝ;رc|t"Fdd$-n[ `صk{d28|>:6zTEbb"@g3=FA||< b_p/ӧsB!RRR`X`ِ@? Fv}lRD޽裏bРA\0*hjhZӱydMl >>Up8BBrP8Ett4-|\ !!nPTH$HHHT*lb00 \"uQ @,W^ :t(F\A wb03LTtg lT YW||<, n7\.h&Sp7||dff^ߏ+WbٜѲeK9=ڷoVg^nFűQV8NF-v; XNS(HJJBV мys(..¿ 6u#o͆8MKKejF~… (,,~'@-hTbI% grhѢbbb8Yq BB!+++avpBY`0ݮ]#wŨQ@LZl_f=w6m RJׯjՉ&ߏ˗/#::FEDDСC6lJ%Ο?\f(?>-+%V+\.b1=1 ͞ΝðaPQQZjj*^|E<!S,׃嫡hp)8s JKKoh"=++ ;wFϞ=1p@dggsiUn:<u4cEc"˩Zش47\f͚M6ҥKѺukt& ǎP7{RaDbb"s=8{,=JH011ˬY`2{ۇS… 1Z!ر#^u 0 $ dR0ToQiPYYb@RqauS8['N`͚5(++Cyy9,hٲ%ZnsLUUUCUU]={Pw4<3FFFp 6kT*jBPpltرNQC;+vҰC=>}੧ }UTT 22Z_~ؾ};tBm(6r0LƀjhDff&}pnj:PtHKKG>mVĉ!ɰiӦ}`[x>8<BȪŸq?vJ%z{ n4ax<+ !æG|>ٳ+V}8GF=sl2K/aʕtL&Cyy9mH8axPYYɱ"|zj5R)flHLLDdd$j5bcc_b %%OB}YY4iBoڴiC-p&$~~ވd2Z, ް`"Z,"ld9}4xh@ B1P(!~R[ =fϞ> ={ĺumwdeeqȹsb…pxW0 Ϣ -U~-:ޗGQew:ξ}_FAD\qdqQA?DwQDGb${}ߪ^ 7VIWu-nU==n;:l6kŴipy5BPSSÈ2|whii{ƌ3p7wl}< /? ߎR'[lk.& J 644 ==YYYy>GaĈ8p Nu]СC ۱~z|Wؼy3Vbt„ L~Ϟ=K`0b ̝;7ESftiiipӧ:1gx?y_ڵ ,@eeaC 2 F# sP*YNCR}fшL<ߩS hǏ8x v׋?8p wҔ,d~t:诫ѣ=sch4 ^Z JP($Zm$u&=)Jf&^J'Y+D/?#???(T*{<9< B:xfCNNF#, ^/iL|>Rd_&eȐ!+Ӊ{n 2dtߘ6m?4BId0Z,h{lCU:AS(D"D"1 sO">`]v8XBпT*;v w}78bӧIQAFI{r*^`cUR  <(bPfQz4b3d2! hRi 0~x<)Q~H$Ѐ 68Zyyyo?bA<ǨQ`Zzj̜9DƏ k.|WEe)zǡR?|>t:iOQ />x#Gbذa(--E^^A@4e'N(++;qƅ^˗/f6C4SO=o[l 0l7xghpe|>䠲\r VX "H`hlldBYYP[[G}7of2:guƌ#Gv6zyN 89ĉ8s-ڵ g}6[vD"t:( Lgd>qw! IDATb,n8ph4 -tL>ώ;b޽yT[E //n'άhd/K U0͜PHOOnGAAn7233%He]8F=G/ :u*W_ITӖ:K!i%Y TއFeeeuH'bRDee%=\( I>et%K`͚5l_~8z(X, OOԄ{\LaXзo_!;;iiiHnGSSOy>?8.B`i---jL>dgg7;h4DVlbXR<_~9ٹs'> Q $AHCCp8qG~?q:ڧzV^:swyv vcϱX477AR BkKsj [UUEq\$HR6].!x &)|5zK$'3BywHϞ=]FDHKK^E"r xPh!." Òw8tR&p֦>DMrs.B!2bh֭[ٵN{v;F6mOMM bDED )J^ELXr:+vLev;i&,]fIKKCzzzN:& h:وbE~ 㸔 `ڴiضm~i,Y$$RF0%7Y.d2뢵hj}KK , `4a1x`Vx9YSWF+ЫW/psNL0gn gAXAx8SA(ʓ)H$P^^2;v UUUoV077z3gİaNyM0 tl,K~RSAwy'֮]a1U8묳pbc:A1>T*Y#G{gGyUUUC=ŋh-:|TVVBV#HO>{eTTT[n8ra…pM7{AϞ=Y٣Ç1k,TWWĢEPYY)Sĉ)o ߿-:D,f^(L\.Bj5z|xwocǎ1d :%%%L2i! QY]Ӊ={lb6BlF܇JL0!0BqKtI~&GkP"ܡBf>$qR F"swBI{z͆#Gbո%J3Rp ==YYYX,8@v^/77َU7/#2dȐ+A, 7e˖z2dȐs6mR@A$A׮];p`0&OOOG$1ߞZ=n7ۇ;v`߾}֭ѣG 8guV:X(tBT"33<ϣYYYy^Ҟ40^/&6lu]'5k֯_L)k|> . yyy|h4l2\`x h.x_,Ctl6}ֺ:9r믃yAB}={6V^?}q+jF|jG"vt:FBl2<쳸k}8PǡP2^N{c# `ِtB!\T?a4Q^^R \@p)2~F~&O Z V+xZD"$BxW3gj{ 8GaiiiAAA88p +\^XX͛7ǰa rJ̟?K.3/u]x7n:|?ӦMC^^^̙3>򗿠/"&O{faZ ǃ>}o]v!H[o<܊NQWWcǢAf!??Q%J%q D=^x\tE?>ƎbB<8cF׃8sAflfώg233j%jSr0 Om)v;I$ R[oCMD~{$۪P(&#h4d2AP "q@Z B 6C8^x!&M+V0>77JaSSS=z X[V+:^B\.4 ,L d_ 2~1(//رcȐ!C!4ij,^PM ~?3ۃh999)chnntMXvdfIg1xZVe|e&8ʂEZZZJ6EKK T*0waϞ= <K.0Z8`Y2+~?\.d"L'*݇Al6wxX,Fdee1!Pf&E@t'h娭ž}PVVÇ~jE-Zgu ÇsŖ-[ H---(,,D,C l(}@J]WWǢh_Ӭ !P({OG8z($EhQinnfрtz%wVğ7oK7Z  >lܹsC"`2)x*,_/}wߡK.;Bѡ=@xx֬YիW+ߏݻq,x/6oތiӦA`ڵkO<#==@:^\.6o̮:E233-Lxh6#m[SS V҂SD"˃Z |!C 2dȐmۆ Pp\q1!è8:A7ߌW^yEBwtRɢN4ɀ(p8,:1!8  H8dgg# S5?~{N'N` 0c PEP(^Z JdFDd2AV~D",^JB$a[>Hrj;.Z#*++m6XVTTTEY) FGٳ'*x뭷駟we;v,l6?HdffoIеkӖJp8jH$سFt֮]sػw/{oPEӾF(..RN+"" 1bA^1sL`ˣG޽{ɐ}?& z&~QxH~`9 z;̯B߾}ٲ p}رc'mĉm6444`XjnVlذ^{-V\ckZF}}=Z-;!4hz=l6/_`0⩧w̘1w}7v ߏR|w>6mFO?_5jjjjE^p8:$C~?A`2f9E·/5\{e~hyj<Şk{P*NχB`9t}{iH$ 8݉DUUUӧYfX{E>xX9s&*++Oٟ ɓ1awy)NŁ۷ӦMþ}`Xc˖-O0dL2W_}5֭[ݎ{$ٖ/_ľ}AXR j$ p8X,h4,#9jPTT$2/C 2dȐ!=Aj*L<X@nXRҙ.|8p\e`K CI`0H$"I?]\.ٟN0 J>l6X,DQX,v6Y MT :N٩=n6 yJMH{$RJ gffM5u:Al<w:8z(ʰn:D"466"BV##;;>|89b̘1mh]p!:Ĉ ۷oG,RD,CZZZsX,&!dy,󀦞~t֍mGACC 8---,3f \RRP(`2Rr$?ʧ@r<8@Ѱ6~vK.JByyiEV裏{eEEEK CoX;1ׂHzJ>S/ʣ3%·k׮+KHPB>s}-d( `ٲeXn1|pa޽P(7n|>:RL>[lAUUT*DQĠAzjL4 pCE< `{QVV2<#opw`…HOO7k5kf3n::ǏGMM Bv튿~C_={  a…Xh$K" IlCAsNlݺ_|X%R9HX,`0B^L&v&%CJ#@ aX(Q QaZͤ(^/ :(ˑ>6G};ǎ)vJQF/Ƅ 0rǷ(3f .\nIm,g}-[`֭Ø9s&-[H/1}tݻ_Hv 0]{/́BB%f?Lː!C/ 7#0jԨ92dbϞ=Xx1ʠP($4=9H ;;M'MA0ɒ'bΝL:BgAHAKK jǠAϢNC~~>h4(,,DfffjBCTb>}0 Ssƍ馛PXX{\ggzX X$yff&]! IDATFS'z Gq|B,yhZ 2{.9 8)Rz`8(,,doBua޼y'O$ 왣Lז:$ !nH]vB ,Z:AT*, T*l6P(/guV=vo4Y L$dEcņ PRR;v2 [J k Z2dAg ===%2nwX旎䂞 yIwXVt/2fϞ2h]w݅oVB:,Z}`ذa(++Î;0i$9rC >%K`߾}UVoć~z B@~pat(w-Z_^^Gywm݆ŋ###O<yL:VBII nfFqС3 Xjf3rssԄX 9v;y_]t,YѣGK"0#kFYp`,xPP>___N'l6"z-"mIh tp\ 0}v*ח˲(8ZBHE}<=1vXL4 &LСC;vލɓ'3ۋ:mZ 6 7p>CFL2SLAvv6F~9BZ-l6D"l(--e+~t1!^C=~~ju/2dȐog}rR.C:td BBTUU!''0EÂ^AaVTϝڸ?NA#J%0!B>}Ѐ^zh%>(BzLnEPtX87??. f6 >yyy) "O}bܸq0`+Ni_>Ld2$'k PSS VJBQQz#F/GQRR"INnd: A`0@EL&X,466~AVRB"s-\W()z0LHOOgD:-[H;ZT/y N$(((@MM Ǝs=6l)SR+͈Ϸl(bhb`ɠq㣏>Buu5]JL:-T*޽[&enP(ؘ `ۡRƯ~e-qJP)j*FY999;w.h~=~a{V¬YXΝ; "#H`0`Сظq#{\={ߎ/ի&N'_1cV\);vލ+Vik45kx h4FS| L8]t&MĢM&bh_6۷oW_k֬e̜98sX'GAjsBxУG֏^48P(h4{*MhZh~`g BIq}r4O@ @3Lr(P@7 / `0X`GDQ$2dȐ[([o%3g$<͑!CV"K,a#eAdDE~l=nrr1Ψ444p8Ln7q8$ KN''hmoqpH$B|>l6B!---dng0~9\.HJ"}!uL|)%u BF_\|d̘1T*hNGNJV\I{=b$($BfR[[Kq8M8pvN0|lOT*;($A=I>^rH㑜n`"\.qE18x^ɺ@ eW_MT*yuy<RUUEn}?Ba 퍍$ ~]5jٻw/E۷\z;BAx ""yȑ#ҥK|IA?OHVVilldۜdݺul9B9Bf̘Ah${!vСCF!_=9r!utdΜ9sAȽK ;w}t:IjjjmS歂 ۷QFǓFr饗cǒ+VaÆ2d90a,XӧOG(`l; ""$)  BTBW i6mbWT$##@EA$w0zZBPZZ QV<&B Q͆|&Y=xZj,t.CEE^ytMJBq1TTT`߾}ؾ};( 'R(߿?>|8JKKShI* ì-zX,,jMTȻtO1==[nAii)n6v4l˖-lߎhh;j }f3  Iez8+ܥKv9s'6mڄK/XvDGJnNC"``X}?P*)YE޽{KJn}b !Cgƍ1qDؾ};̙.ׯy `8z(}4ѐ!Cjqa#H HBCZ @yy9ǡV I AbA"^NcD,Cnn.D"G>}X i}Ζ/sT'H 999:g 4I`]td@~:u****7n`Tǃ/_|v؁~C`„ ꪫpW/wJJJmQ[[/'Nij>7oƦMP]]+SNĉS@H*I$A<bA$A FRljE׮]:2/C 2dȐ!pqhhhV(lb !"2EPEEE*>H0AL КqI8&B-"t:+VxH$ХKV8Nl6C< 6qnjjBQQQ! tpBP*tD"ӧyAP | >cǎ!H@ղk=z4. <hR<ψGm|>ƶ툈chq8FZZF#^xTTT_f>|8DQDyy9[x$<󨯯JB<gD0DAAT*rssY5ġX,0LK&BV#++mݻSLʕ+1w\BXZBb3둑:I&qqaꫯPPPiӦaժU'׎'?g˗]vo3H_|>Zo#"uFQL&)9$`>zkn7n7uQWRq ӟ$ 8Ocȑ\޽{7J/!|VXիWcp8ի=\TTT;ƍ`xE. x|񟝝 ѷo_[lXp!VP(ÇĉX,8r8ӧ#oƚ5k$K/^z {a:\z饸裏BVCPv#T*B؈B=뮻e| D"C~XB7|y<39 l6rrrq`ZQTT$@zQ ߥKn~zB'!@d2A㪫޽{p8B!8̄FPh/gO>fp1b\uUׯnGEEӼؼy36oތJ\uUAgm>Ѩ|,,,hL 2drQԥ 2d?? ~%; btK R“O> x???<QVD&w鰷6Eᓶ"hB!\.#-- %,[nu6SGNr' XwffϞM61{t BlrRVqzp8 ՊmjjbK 'AG@kqK/7pVX A!HLOFBP]]Ç UUU8vrЫW/ 2^x!.9* .&N1Xt)V^͖cǎz2dg2>7xt:P(X$5}ǻ\.jjf<t:#v뢴w&Gh42n#//)* iii1ݾv@KK ^z%^ZtHnF^裏bԩ)DMq/ r ۇG}-b9h  #^z-]vcQҷ~\p?;e!j,[ 7ob}݇kxرc 1c 3@d*//tK`4p8}`رZ .@+?w3jkEEn7;w}_Ӊ .X ^tvǃ|x<A(  dee!y 6i l[*7ߏTjv+)lZQYY ٌaÆI:rFQh46颲,f9!%## gJD"$V¹IPt]2=$ EKK ɮos=˅Lv%mt:jQ__" ~$u[P{InwO1p@+U"JBmm-{TVVJ(D틾}[n) 6`Eg$k믿yeł'2dp tRYx<fr-E(b>@ r<LQMjأR$Kuu5F#f3z=N'+L1#?2ްa mۆM6AaҤIxSv;zŮ8?~ B`Y vYYYF,Í4hZx<zʂnGff&T*l6$hBTvC  9 N'jyE gj"??*J"CArۑHx0{l?:eM&8]E<Ǟ={}v?>yyy6mL;/%*f~ٔq |ؽ{7Kx^cgyCeaAJQ :IKK |!C_&~?nF(JLѽ!C?.uuul(p8(((@8!DBGQ~h4dffI5k/+:۴i-[KMg~&IBܹs1d |~$5QryyyZ0L0LLX,aZ@kTJ:y}],)|~v%&l#FR %/4 =Y=]]] N&^وD"D"8(Ik7GB(Y__Wq'N]v+g}QFuz`0`Ĉ(..?'x[n_4*>1gFAA!8q<`>&I"[S[[\swM[4i&t . 6n (:3opgWAQQKfk}{mZym|wH%R*"u:Bf3bBF#v; Xqfrb^/JJJoax;SbS"(оvY+VΝ;8n&5C:ts;o-J_ٳ1n8<# ֲ* IDAT@/@@ r믣w`#@ jbX,֩(LFCyy9O o`ɒ%رc655l6C.J׮]y$iss3***xj/L ХK?0h d2D"BVC׮]IqT,r8\x^T*R[iRaܯ,(ZZZ6~H?Hwa =VoO~3"$wÖK~3ſFAA]lz3O<: @ԵkW ky˔"S M\.T*seVKUy3+9 vػw/Əߏ={t>|8z^zk׮۷/7UUUhmmqÐJ<|0`$ f̘q-Dl6TVV}q6l؀QF# ׋T*{\cE7ωܰyJ}:nT*$I /u5|ͰZ;w.8|>L&S{o>,VXшO?>.N> Ǐdž pih+444eO&(..D"A("#Rr,=4  n7J%eH$KHRg> ezzpP(&TWWDO?72,r,;(jv8_@Zo(++7||1=TTTsgvWƂ x" 1f\z饸袋/ R) $|>y+6mn`0V%H#X@  @q饗bԨQ[xwDZwݻ7q\|Ŵ+VbW^+V`ҥصk^z%UЯ_?\qG_>W_}zÆ wjXd |Mv›oaÆh  h4<`mXB8S1!DG\0% e$kg^FZ&Y.NӨϳK|(++X˅B΍u_0zp7f]0l0^\.ǔ)S"" 󡢢c 9 +rmo6h4B&Ѽo H洱CMM >9r6{B_`0x>hr U,EF|w(..F&vt1.rd2|xпŋ~@XldrŨ߀ Ǣ_Y16 !C.HP(DEsMrh~? rD4 O }?7obXѣ{1?_n.]ɓ'ك9s` Vz1x`*NpSHԩz:ƾ}_?Ė-[pD^hL@[uժUӟO?f@ϦT*z ^ѣ<1fC*lj*uIpL&[#QP1d2OR$`kT(`G2bC`C555>}:>Czٳ@#B֭ݻIy4uTRQ3žm|>z=R6w֢Rt:rrL&d& f:(**J"R{n7Z[[t:ZdyȎJv\.Z[[) x&ZҥR)OmyA:gSSSCsq, ) %=HH\.[~_=,Y7v_C@GG=zt&M-~Mf83y 7 Z-L&B=EL8Zc#7smD]ˠhP\\ BA4+ffd#`ZH$p8jN*3vh9s&(oߞYN8{ʕ+xEaժUH:t(|M 0+WĦMsNquc=[njv5c 1`L2+V@]]e]qػw/>L"c̙=z4\.R)f34 ^/N' i|L].Jy Sn6tk&dhnn&bX$`0テbD"L&CAAjkk!i-&HrvaZ)9jw0}nQv;ol6[bРA߿?K<#bFAKKˏͦR"\$Q "u-mzW_}5/_׋wy [&࣏>młx7h.Xb2h4R+m](WƋ/9sχc$X,Fqq1vq}F!( $ݻѥKUrԄn }ŋykii9fG} &`ĈRj\}ׯ^y,[ 7n=#F bs֭عs't:]v8s=/\s &Mm[[[/D]]ON>Ga҂l6`0 2 v%%%TH$zdqT*E43<#3ŋ1deY8t:^(@*BII /" N–lm!i-VQQ 6O>a:rd_cʕxwPWW{s;-ybb V`|b0LPTfuVlڴ FxRP'OFa007lPN4͛SbܹD"Akk+np"Kaa!yqd2ͲL&d"_vlFVkSгCdzz` Э[7{m wCyy9V\Hl6:;5kƌJ( X,wy;w.[TWWcظq#qQlڴ E]r|:f{/ A*|ꫯF4H$ UH$}b߾}t-XW^Nʳt:SN9SNjŴixyd<^Tby/bد>tif)f%Cj5k4vl$Ex,'W]u=ٺ8ݻcM6aǎ8sa\~ѣ-[FСCW'|uAT`˖-8pp7B$MPG:2j5~a8pD7|3_xdYzfh4(,,D,C8nbAII enHRtޝQb^/ Np\ҥ 9Ǟ*:X@v+^/`Z!QRR^Q@&݋D"epݸa00sL9g}!C ̬YVb>Udt"q8j5D"vBAFH$ByO'Cqݻg&A.,}Y[ltH&|wQ\\ ͆H$Vp'x>9\.r$Ik @E8шFZ bJYoᥗ^y睗D""mո1n8l۶ cǎqwb۶m gaxGPTTVxq饗6l@SS, |>֬Y|'NQ]]Kvfڤ~fA,CTv9Giii$~?2 ]2Xe$=SmA{TUUQwL&A]]t:Yహd2sDp7ߠwn>$<^zb8466oAϞ=ѣG{ȑ#B~P[[>}R3D}}=u놺:R555oAuu5z yH$1k%fBVz0 =.Vp(..yvFb1A<Ц K$yʤ Z6ESSS^`Ykk+QPP@c!3 ^/G"$ R):GRI6Lj+ƍ#>NCP… ؈}ᩧBMM N'8b1R8Ǚgk׮?MӤNK$Hpdz- Fy 9B\N-Lih`2qF̟?7o}݇M6a(+++L" AQ޽{>W)QRRZM 5556l"fϞ|9PVVYle[pfd2l? ~2yhWp8 V+Wč7H@3 ˗/ǂ W_qYZ`ݘ5k֭[ 0uTu]"ի/c̘1r<`V*`f=].{~;Űa0m4r-d) Bn. V!Pi444sbV^lft<6D"H6 dےf_nSޑ"\|W{sN ̘1zkuαfp\PT<}yBv';_~xqg8,>s\uUhjj\.C=iӦѵ`~EEED"(**#gϞ˗c֭0͈FPT/ @mdYL:T < {탵N{abq j kY1wJ($Zm` ovvdp\d2D@ܐp8WT8~r 4 <Ϗѷ-  pa(ʎx F#1tPڼ?xꩧSNq8|իϟ. ~zѣGqL ̘1#`_f͚ǤP(?ӦMNgŋ1m41=wN+ᬳ3< &h01baܸq4w8%%%Ttg(ZX PZnpT zY+F""5  ,v;4, =l6zIL&QSS~!N:֬Yӧx1qD~2D8F2D*B*D"y \JVad]r0x>:whjj"EG\fG8JB qذas< ƍG uٱ јu4{lغu+˝| @_9r=$p:p8j*^+w{[DF*B(–-[н{w~:F ZM bP(p\y>H WT<"m:wN(wxicΎx ѭ[7l6zB!T*"Yzkk+ b1mФR)~? lc;. Rk{ÐJd8`F1/T*GY|>TTTY _CMM jjjc zB^[o~͟f>^2 L6Hlo:,Bm=V+4 i{)Sly\wu~ԀL)=zjJ L&@ Z l_XX6mW_}uOQFaӦM^ةUcE8F"X,e٧gf־FT*W_/ǡC ɐfqaXVj[x駩u8hD:}3СC_W_}.̠T*?/;z(F ͆뮻^/JKKp8s80 &dOy9Vdևb!L^ܹsxpꩧbѢE1b?]@~D"FCkmmEiiq=su*(JT*,\Fx<;b1b1>;W>DO=~aNEii)V^SO=waq  eH-[''8I yf +@-MR|y="Y։B*·~466SZZZɷM" "ɟ Jt:Vt:444䩐r`0z;W-K~L6^XXFfqDg< F\~(-- yy9bZ[[)w)l6/L@Z:ΛZ-Lz 8wy^N#{gNyBO:~K8f #梨1FIӘ={6̙pBtMD@gY tjDCCNgFOo߾8x ƬYkacEqq1ZZZxvm@p bРAXl.Rz> <&L8XV<@݀,Ph'0{cA}X,F EEEؿ?Yh!J `2 LF}0ă>Bs=:t(ߏ;wbĈjr& 0tYJHyk1BLk+VTc%p:|ZطoPF}k"LB"@*, sEm;tx//c^_-(v+1 -|N1?CCCكol ؿ?Y0L8kiie0uTmj榦&F Պ'|6 3fˮa௽{ƌPSSN;Hc#ޙVuO=3f y=ѣa2 ZhYDf$IAQnbdB(B"X,Fee%n7. Ц///ʼnD eg1ydaŸꪫ`{{ԁ,2 \.~0^Gkk+エZ-Z-l64*Aϊ@l6^`2`6)[R;ݎ^?~ΏX,Dٌ@ @A3H---6gZXl>3?z뭷УG|RNlB?qļ㜌> $œ9stn @`0x*ΠVp8x~"3 oaXg\.mw1[GDT*EII F#n7^/, ZZZ`0 p8NYnV0D(cXXXX, zNQTTDsb6Q]] XX,+( :t)LBzcd '}>d2ރ,r;YF;F`#QLJRg2X,d2" f3)rҙ6W҂VRҗC&xwund2 Á&x^VPzt3UXwt|VB"@(T*T*Ź瞋d2 TJHL׺dfb /p뭷?_⦛nR)v)xp 8`C3Qfy]Neeeػw/ٟTTT sܹsyEaҤIdY:r/Neg`>}ټ$ \{;y۶m 6l|̷n#N&b{ɸ1fRj_ /]S.R,8VaxvBfGX,b677h4TgkTH .@yy9֮]z^/"eR)8N3el6qDQhZ N2 uuuq BV  S̲uͅB!$I(JY p"H@&L&Mt.] iSj輙tR w~zZM6ƺu0jԨ)`1rH8k׮y p"qMs@`9dqXlJKKIq^/.]Jf*FYY]:"zb1~L&lݺ_|vӳ>?D:yؽ{7D"ƌkbn  8@ӧcȑKCa0a8 X v!QZZX,X,H$ߏ^zoQYY O H;, 9߿?ك{?0c]IÇ:Tl\dRw .f>NGg2b1R;N&\Vmcfa !~L&ի9,|>zFÁZgYbEcc#?qgF[JE[@  @ID"!  )ف6ѣH&mbb1fR?auF\Ww JJJPRR*f7#H$YF0e \[NkAon*VS1d2gg/JgcfyD=;.jfwF3JHR*[[[R:d2|zmV;wh1r DXש :l6@ G3ۛs7H$\zطo> f1l0*u]??{ mC.C,#YL!Hy'?ë*a=xߋv@ @onr~\.^'ZƲe˰d3?E]D?[UU_P(Xp!Əc:R LFn ^T*H$`0X^{ SN%믿L>@sD󡰰Te жb]rXJP(8rV+uݰz==+of̛7ӧOǫJH$Bp8PUUD"S[;I$d2*l6^WYqq1\.,wJ%R)N'~?B=D"RT# p"#e1bu Ft֍]ۭp8`Xh\p7V1RXXAeee())A"@cc#(~?͐!C{nʀ`p:8묳{nm$T*E4X,X dDO334hmmźu?@ۆrZUEEE8z(N')'|8zQQQ^`W{D"b1t y*C)+rLb`gWXXG W͛Oh#׮]cd#h6xr HIaςi- t:i-Äpd`H$H&3f ^y<3y;``4q)v;7---]P\\ J$ARr6 PNCE6^T ;nV„ h \!HITbPbȅuTII EJR zx^e2|I,_9r$.+J$ ߌ׉  @_T*:  @=.btl,;z=bJ%l6r9T*ocڟc>؞(:C8hH$"%Pyyy?hjQ\.G<}g:#, B$[njH$p}h|X,Faa!j54#G?矏͛7O>xp9`̘1Dغu+M h4nz7X`-[F_??! XJ<G$9}D"9z-`ɒ%裏=#II ХKT*"H NS1^A^/σ„ X|9.R"׬Y#G?&zXd .\{fŸ'\s5Zy<+++xe2! IDATDP(`ѣGZΎ 6`ذaZ4i 6l؀Çb+ЦQ& ;fMM h]0w)6 ƾ}b \|yrPPP@]ul-P(P\\ NRI x<͆D"D"X,x^~*J0<{[דe\.GSSϖ[5O4pm F#86n܈g}7Hp8[1\Q+تv>6F2$ϥ^O?F"{ߏ;׿`XH[>pbܸq:u '²e? @[]0Dss3D"tB64J|"S*JeW"Al?: ͅFAuIp8<ꛛIά_ Pg O|+`2PQQ 'fsG% жbb/lJ'ף?'ZzMMMZ>} J:!J,t?F;wfNiÝxJycd -D:΄\ !JJ6?|OyM$w׷o_RrhDAA4ƎCgŨQpWc8D"}Q16l@.]p7O~zR7|g @O >8xꩧp]wC/"NV{:ZZZ(φuLf!T'NDEE7J孝.꫼׶mۆ5q{QWW~D ,@q)ƍI-JP`4Hr>gX~=N͛7˱~zu]غu+PnbӚys9{*9D߾}~l۶{VoiiA6E2$a\.eD" Tzr 0=T*{#L0 Q[[upǻ̓#r$زe ٌT*EL\NCqq1y3x<}{E>SmvQQY"L|3 :~)mAcǎA6X | @yBhhhIk2PSSD"L%SH |78n6VD6vI`0H%lDʅD"г`(//h'#ۺ 0D(((@"b6_޽{#H#F{輙=H$VE*d⍧WLh4|t:;14i>Sf̘Պ믿^{pwb֭xwvZ<3Xt)q%஻RX LFA,#ۯ_?8q"6n܈ޕGQgJ67Ar (၄Azm=ڂZo*k#"**( Gȹ=5;3?{_w ɇywfvv}}K.E]5k֠~) cԄ=zP.FaT Gj5rrrv Q=zC:t}p8.xq@SY9N, ՚4^򿫀Z^fAA @kk+%>9RT`@ ~*TJj v# 55&ݧGIbt,.W(f(qߧO>|ڵk?gE]^-[`ժU9s&x|Νٳgnòe0l0H$40:u*뻽F~C***("B$%%G+oڤ[o/ \'qnT* .M}0gi0f_Bqq1?|0GǎCFFz=f̘V\}ꫯ`ZqumvBjj*V+-T*PV >Ν|>̀[bڴit8|0 ի~?`ᠪpߏ69@JJ B8NDQJfK$XVS8b4iGRjaِVdeen .- b;F;\.}Ng/|\D˲b J1۷/v;z4 Qϲ#_A  -- YYYhiiAvv6ݟYf׿5^z%z Bv_TT`6ljjjx444bP`0  .B'MV+%=tƇaX,<L6VGA^ hlJ%rssV RI~?i7VEDb{HhZhZ\., LOm6]t:DQ455D%&l6Zeddfto߾!X={6~/t"D\Jx`E^g`0H}/_hD,CZZ0A~~>ۡV>[$N SBP@T&)b1Vhoo DX.wI~'sB.O@wާ$ t:B@/xh=YHVݓߧC$\.bAii)!;l0lذApݩT*Ns ߩڴiذa9<nJcӦMg=IT*b1,p8d!Bę8˨XœO>W^yEܳ\jزe  gXD{WP(cĈ˰w^A(.q]+j5ك" 4UUUd2tN3z;'qcyatdB$A0N0Ft`YId -] r9{=ZHl(..nGJJ ~?~?!48P(V E=ށZFeeBPTJX,tƐNTx<AJw@>}Fi\bQAhZ< 6`:p^Lal '}ff&XVj/ td2R) 3{W* )ؽ%8Z`&INY}+JzwVǏ ǁeYdee%&]2L@o;F`YV⋡VQSS!C F#=? ^ VJh8q"xf9IfGÇQYY#Guuu0 (..Fii)͆-Z&b1=zMMMزe ~?˱w^⋔:dvލSw^+xnFp. ߦƍCzz:VXx@>|:\>,}l2p1(T$S){L3͛a2J>& cǎ㧧fShZbƌ1 77---̄FAUUJJJ `۩$Qp񠠠jj* l6 Mh4} aǏZ֔jMMM^zQ͆4j8pHIIAƮEEE|I_Ǽy?x$B"D!h[m0fYA2 j&* Kr+p8P[[KϜ9B*GQB!qXV&J@D}Hv Y~*TH$0tp:y.U\<#!HPZZJ3@7|<Gee% " :sqb 7Ol) dI髪uVfĉٳ'." w F@GQaΝZ{2nvv6S`YVu]G RJꫯ0m4\W_}5ŠV %%%BPՂ"G;EEEx饗p}<޽{qM7 {Q:vDO@.CRD Dk4 j5l68CII *BMMs.eYJ VcV HH10G_*"??nh_r9p8VhN~jX  έ*xaklذSNggg󡱱zرcHMM]\zjCXn˲0L]f.9N( jFk֬Exb:7uV;],tA$E!0x饗P\\Ls"DzO?ń {:H8ig.BN믿^x…g=Ə `Y^ & F999p:%9K'6;A@| Y T۪O'.DT&wH@mw> %E ZM}lKJJP[[K ,o<KDx<߿tE;N$[]]M'HOOȑ#1rHQт,oߎ{o !QRR뮻(((Zn] %%%2e rG&6tB޿۸ꪫT*( 0 }aԩXv-N~~>G}?8+ SN@0ěo F JEuRq:HOOC}}=z eI,!؁?B'ynmmEZZ^#:6*ԉe\.siOPHDJ󳲲rֆTet琼HQ=zz^ hHMMdFbS 1ѣlkk^H${[nŖ-[0h :H$xW_!B H_|k?>Iq!B$>ŋ|X,T IDAT!" $ g NCI"~J$;pG-q<R) z=V+"@eMRWloMjj*]}J$gɾG.nU** :a;j*\y啴,ƥR)>saÆ 8cǎ$|ƌظq#.nutO?'c"aDG"t"6? K/ndwkDt#&ZҎ?uuu97nĦM0gu]2d)_"سg~cXx1  `ƌHMM`]-[pe!33'OFff&6oތѣG#33?DU% v;˅_ 8.퀬V+ ͐Kh4 9NCt:|CڠV)ϲ,8D"A<=2j487v=#55 BL&܌#G2Z%8 ʢɑHl6sG@GEFF(ADb'Cmm-fϞ8p& xR`X֯_Cy*RͿ҄lj?.K;Տ,οw!q"tRTUUaŊb"NGbhjjz3&L ߱ciս vvwy Xf.ph48 JuZ0AIIIRL&lB. * jεbXA tetNCHVZ 3^ADKAG--[o;!>p@!jB*fAV# -- 2 nx\ :<Iw:]|8}Y5n1bz)\~:W^y%K<3scw}7˱j*?,&~ט2e !]% ŋg믿N~i⋈Oi(̟?+W }d.|$8y:zNFqIz::Z-JL(5q$W3 PxgpAA+ p 77vi&~jFBFFˑw=0/d|O<3gB*'| `Νr?m݆;wYqF\wu}A"ছnBss3֬YsZ+Vjc0lBIzpHKKKUQcc#d2ӡP(*=S+cާT*ߒp[X,F O|偎ϬL&\.ǘ1cpcҤIFT(FhkkC^ P(j<r9RRR,G]&#'Ya2UފZ(--uzig+4kyf |"D!BĻ+\?~<.\x68@/ɐzFDˣ^2Z԰WշC*Ұ^]d^Dгgϳ&((qN 773%Z-m1qDat.<6lX,|`hzzD"J8NAyWq'U2004`}z/p%P9r*ϱcǐCU䧸~Z7x#PWW^{ p,CCJ%n&1r H1dvm꫱sN['O-5c bƍv }| &Oz \s 'rjݻ&M̙3i&l߾yyyz ˖-1b>xiS b5B/t9@[[$Iwx(B,;+}LJJt>ѷo__ +p 8ryu ୷ҥKobK/Ÿq0j( 80p t|}8y$^yL4|M,YwD1Qi?裸駟bɰZԫ<_|O=VXɓ'w߉JvD$5ql:lwȂ^ }C.a4a٨Z+eY477#33RT t:a4zjFt:ѷo_H$`YG'tRG>vC*" uY|:/QDގ {ٳiDJ2iFR)\!B"~0H NW'"D\FhllD߾}O\}v<pFAR/,X?)yw(((\.$+ R^ٜNȍ@TUdRdҲT')&tF{{;Z-UI 'OO>mw:"W>ҙW*Iz~~~0 \NCV Cҹ4͂{B@>}p\|4(8~nِGӧOGii) O{]GQաΝ;҂W_}(((@^+>8 v; xvC(SRR*,'bΝX~=ʨP}Ϟ=8y$PQQ+rzx,oɓQQQkv6p{ɓobҤIxW1vXl߾}ŋ1tPJoٲ> Z"y/⼆RD4˲gT? $`Rg 'o裏УG <.]ŋ}.\o>#'|=tPL2'NDii)$ T*͛yfax饗d 6 ,@ss3Zرz .СCq^@CCF͛7 :[ZZD=܃Çî]tR# iVB uFlT* 5L8~ǃyCZZ;&U(||ӧ?T*n_͂.Gz7nĄ hFC;XT*D"B|'a$s8zκVR8{31}tbݘD"*D"D c(**?"DD`U!APtI~w>}:;_H~@g0v,RRR zISSS-6B$z{^~ n4)"~r\@ nJVD?RMߕ]ΩNإcwc+kER$AccW⢓y`=tUp%v1  /Z ۍ@ B_رcqw{>-I²,P]]#77EEE(**BII Xkӿ߶m?/k(^40gϞtvx X|9>ҥKЀ&[3f8NPDعs'fΜիWcԨQ6mf3~mzn6oތ3gb͚5k%_2:_<3رcd2zD:O{n 6Xar>XݩrC$AEv:~Wks rO!g)x6=z4-ZDmߏ)SرclMS8j!#˻7\.|طoK߿._jbƌ(//ѣ/sN|}:DaxǠAwa„ xQ\\Lx&5N'n~{ѣx򙙙bHMMcqXVAqjȠKlnH+'F"\.H$J\.L&pIP>ax<! c(//ܹs)INFjmmmPT8 HII|f?W2jBP΃bڊy!wA^xNHD`ןl#BRW"D aܹD"x"Dq]55Q%<D"3<_rAREy[[F 0k,[ƍ1iҤy^}wܑHɮe>˲̄VD"FI 8w80Lk~rD?OMM# !#$[ZZN<ɓt`YAPtǺ˲Xٳ_Ǐ###O<%1l0lܸ1ip8ZTWW 555EEEq%`(..N"sn7z K\r hyttz\$F(, r9pWĉtw^\z饐d(**B^^֮]w1n8zLt[سgNz O #DuH|8$p0 L&SIڋy{O!] mmmIh4*P {ȓ1I@bD"lb P(BZzFvrl:fHR 89[Ǔ[X\ SÑFɡa~Du*5#I$ꫪPWW* BXf vM~裏mGFCC֭['Bss3$Lیb 8p999(bXh!,&X|>l6L&d2V+X`dA<ǥ^o7oرc1k,d2c̚5 >ƎKmzd2BP[[KkYŁ0d~(((~gu~ee%RqQWWGǸ{su{-q>|f9ZAvs t}DqUؓ.- ;|(JT$?ptHMM˲p\ʢEBNnd2L&߹SLz O <`0 -n&R[j\qTsE,BffD"9e ˲Ν;i&ܹݡ1w\A(bo~&B.=y$ b˲dD"ptPմc… cnJ]ǡ].F#bsq OD(BCC  t ݎtx^p'N2iF#N'  Jz/xG0^׿?&1qBрy;v r8FR e? +V;#1c_˅ d2<@`xcY'N5 ̙{_|1q֯_c͚57|C%ᡇ† fAaaաO>›fÜ9s Hzjddd0!yGvv69CMM rssy@j@ )"I(Ejj*:ZM-qjc* IDAT5~?< f3Q(4ԕdq 7K/ŝwI@.@;dg& ! &0 CErΉv;RRRncܹxwT*:Nvl6 yy(@^D ?)"/B"D3QP+ y8qs@ y!>Q|=U/%?t @/\oY%dH,H?bBt5|`Ff qx^JRKR(O e\h pwm7x#FonK\H׃j {F$$-2k,L:/i&\ve xӦM@}}=֮]1ctIט2e VXx!J~z=zƀhӂ]`XЯ_?C=~߾}Q[[{^"D-HG >_8qR)Azz:~? 10Lp:{[ee%%Ay?&nGZZLJ? ?  wޡ/>(ƏT83Qihg9rWon6l{1\}t{nl߾+V5kY+|nvիW/S j^/uJO':`Yۉv8ǡ t;d2:WL:T:py)))P(`8trrr<=(@*PyyyVԚ2srvѷo_Y0|tMx!iyqz|^ 9Gnn.v=Bp_"Dؽ{7ӑ"DZZZ2 YYYp8Tf0]:N &W_f3Z[[a6a2h[=:u*}D"9'D8' Aa`2@:D=d4)1-HΘhD"tt,FxBl$hgtt!CeY:$cFYA <ϣQ'?x\+QRRB[B<DZcǺd2& Xp!JKK>}`>vAd2>|X@nLH$`0={뾫G"_|H$:,?OE@`B<#hjjG}D~!&M[no.\{:t o0e[k0n8\s5۱|r̘1HxwȢ@ ߿FZJ@F8p@$E\h4`I(!]JJ ZZZ V !< ᤛL[xG $FI'[?ha[ gaŊ@_&=?OJJ l64 "z}bB YsNXZ򤤤  8d2Oȑ#Q^^> R)z=RRRt#PTTDY.#;;mmmP=dΦA8z`0HcItJ$9 |o8ߐHOO _| ntHRfpft:zJ$梩 ={*P {r ѻwoHRqZYr%ƍG?d^tt}2 4f!55Grrr JaXt:0رcp"D?@ 9sl6!W\t>PA'A$ɒq;$;B*#G[n]uUo~', N,[.I` Rr넰ZD"h4ؾ};yڵ~!|MAx.0zaVA޽W,Yᇘ:u`(  nS={BP  2mhh]* _"D\Xtٳ'EF0D$dᠪD6|>h4(J w܁ɓ'd2l6dD^ƍxEEO/$8sYM~ @4ECC`ER$4t yKI~?8J%F#  M;vbd: |=qzA=鯸 y())9P(*<`HhjjB^^%OVWRRBU.((#G0qDpVzX#kb^":GHR~PYY {'C`Z{6l ݻwcȑ|oE8ߡT*)i9|3Z 'B*J@.CV#77 AxwN,s ҂td2xRlp&uZ%- =9vas &0 XhN|x'm6s1o<<#x0}tHR~6mnfS;x71ydXJi?CL:6lٳcaXnƌ;wu&LW_}cǎy'Æ hć~#Gs=J{q}a͚5Xd POb̘1]vaݺu"/WDV G^~ `7nn' 2D[\Af%\.LܷX,TdJdD(CHn7rss9V F&$IhZ477#?? X,p\KqEq|3D"1|pTWWc…xףGbĉӧ,Y>} ''o^~e|嗘>}:$ n^{-lق4h4Ftbŋq饗bܸq3gf̘A8//nNS@("T*E8Vdn`y@YYn7B"V@`o>t@ۜ1 0 _h4Rq=##^h4TD`s+k2 LH$DQ̙3+VիjO~M,B# Ԅ|an* @B"bCie_-D!BYfQ[?( A˸؞Jh[p߿Tm8B*>`;eJ\FUr ;vK!˙'ݶak}Ld2h4 O*I~A]= HvC&h4 ߧ$d8[ߨT*<q3>@  CE8Ɖ'{o{{~!8ȑ#QRRr j\}մtdESSy3DQ$ : .˖-lwx뭷\.$ 9rf62P v H$(//Guu5rssH$T*QXXW^ZTpX,RD"1c`Xz5Ə &kŤIrJ(Jlذz+} 4}_\ya2d \R@޳vFAL&lڴ #FYxbR_~X~=^yH$b1MMMxN\{EC&AV## h4QX<:Npk3ocr9V+DJ&{. YYYp:vh4Vh4 x<BH&t. n8RE@զ01h $pGXDYYz-OsN3gğgh4GjEII oߎիQVV,XL&V L \xᅸk_`ҥB lt2Rnl6{&}T ՊV455!;;---Dp;v pfefN>6e%fw8r[RRBJRMt͒Eȑ#`Zsδ5ʺ BkgAEQ,0P(l8zٜV8"D!BO ` 4{R_w h3VmL&"Yp d_F"zha@m2H1Fx{sDB@ :>g4w:Drx<O›=fB D"A@{<{|qZذ>**h[8`=\)zMM >~xs)$Ν;xJnmm-z=mw޸QVVT{Çp8`0IP)++CMM`gET*M)`ZYAB!CR`0@ѐi{쉺: c=Xy4{<M$ꪫeYcƌqP*Xj&Mk7|3OuaH&͛1l0T* 2l֮]1cN'8 f}FzO?4jkk裏b„ ,3={۷/x W^A2Q "DҠVF) l`D9Ʒ;Gu{8p֑־+JޑH$R3+#v?[b\T BB]vM: =~?f{Aqq1x ̝;?0}qxf;8p tE^@^0l0hZkx0tP<쳸馛g9998p(..Ɨ_~}ŪUpfffB*"77 ԭ`6K[nNZFuu5=v JcǎAP //F555)x< TJ<V4!{*gg~TPdѣGh,Mٳg#uaPD---FtT|iȞ d$FCC/e"/B)-ZbL4"~H$p8Z;O3ǜzD"FrSNP*x<VX8@ -̷`a!~W&!ARAP?! r!LbǪw8D4gJD"hH$i?fm2 B`ju:pa,Las΂pܳ_+ Kzҥ@jqUW?Gee%F zATbʕ֭֭[/{lOп,\+W1j(L>/"R)pm/ f͚LFL|'>|8fϞM<@U^(a֭󻱱ZE8_ H蚢T*OZM@۽QRZdH$\EJ{ SBY9NC4w?s[2$Q+.Zr'77f;9"/B)8mۆm۶a)~"D85"% Y0H1b3}x㕕33~`lJJJgYh0|NGUB]Zx<غu+lŋ>Xre6Dh" { /nŋ"d2oLۏ?\s UUU""7rRA*F`Z)d;"d2 J%.G' h;P]XXO65@ ؈|nmץ,*"1ggH$8q"-ZK O7@ЀuDAբSN?^z)vލg}s-Z{+V@߾}ѽ{w_ƌ\p1uT 8V"?{^F{ T_=.by){bfn'[VJ`pFj;T*=zD#L#Jp8ڊl {f"6ߖdDEEdh#YM^GCCrss &w;wz=ZZZH$B~YYYphmm%`@kk+OZ-"uc:*Ν/ |"D8OR0l0"Nx(((H@v477NR$ DJ Z:f8N2DQadddtbǎ'>, YSrz gc# bmϟ͛7cDZ3b\)R)J%-NL Â"0@2K:;f7D(`SN!4v)*#G`ذa kjj܌=zeeePVV]B.8T*X,\|ł}'?Ү)&L.BQVV&x eY #BP=w!c {Eqq1+8{=̘1p~~)ő||0)JJJȏ /6B:k0x`Xf^ЭXj)ۏO>yaΜ93g&N뮻UUU7n-[FE,vƌ ddd;3V7|CPT-^$Eh4bD>V.wXeEox<\.$8n7]Y߮~dDB0_b`D&nsPTdojoF~0rHL<@=HtZZzطo_JXP(c„ w<7xG1|(J~_q`0P!CcHoߎ3g ,)S ˉ|߷o@TG巴޽;6pPW/OnCT"##b֚5kpBf*R% qFLH{L&Ylf͚{BYgbt:O---<"nj~OY{9#Ah4hZb1\yB(--s=ѣGiO>$Ν9s`UVwn,_{1c+`)cj4i&\y啸sA"{:u*$uUs_ z̈EV{Z󚬬,*nt`)FL]Fj5>*Dn>}n-܂r1{2L&FATvX\|7xg0o<…Xz5VX.={D׮]g.T*ŴiпL4 9mX CMY K,;CgSO=cB*GB`0(8Z(--{T*,qx<}lF8|0z=, YF644`3l>lqZŬXT*E0Č3_b͸ ZZZH QZZFdeeA.d2rѸdee@}6f G,C(//ey |"D8sZTK@ss3t:f3bf+l6477#;;hjjmkk+ȇB!x<b1x^+.Iጌ :Lz"Ŕgk`4q\Z_sVd`tDN밐=6.*ps ڏe4ڵkɛ0`~V5x<`0H ݻwOgv6dR@fqcm& 555)DG}ߏj|8x sڦ| x`6L& Q__R)PY,q@5)J4h6l6رc(,,6nO 1† 0rHL2&LڵkGy{ꫯƘ1c_DEE766b8L& 5k/^ DBLDk׮ō7ޘrĶmQaH8_P(Hiʬt~.8W:|H$R2@V RzA0ŲBH7a06adB@VVd5,YM6aĈسgRi[m[nؿ?z)rgƸqpu ЧO̟?>( .r}PUUn \r V\bm]NG+? `ԨQ)sA&QWłzDhȗhdYR{T*둕\ٌJ3F-+ll6cĈx衇O˪7oh&͟?sMGKK sE8>XT`^* rD>cRknnpyGs8 ߫j'c]טL&8$IAd2!444PVFFr9uO!HzOz]cJj^իW+5\Z+Vk{Q^^;w'Ă hL&caժUXbѵkWaݻ0LXz5y 8 ***P(Hg1/I$3W]u֭[GEcǒ=bF ?ǐBh% bt:]f MM|֥QD"믿xO=nVu`lD"!bÇ));;{EQQZ-8m_$ZFdtU466b@Pĉ?e@$E!c >=^"n&ۂ~Ѹnii>"Wd2h4`/LڊX,*0=Z#u<޳Zn0]?^2uH~ZMvd^^:uR$+TJE) 0tPL<k֬Fmh6L5WB{ ͛ݻ{_P(//֭[1p@r̘1 ɓ㩧Rvv6|>?XTTT`رx7k.TUUttrt"b= % ZZZ}vTVV;wB ].Wp{/ F^u0Dnn.<\x0TAA Ghnnf#}Z&XVr x^  nb!B򠮮DAؚZ>?i@ُ#}>-[~Rc|yu2pX,@ h4B: ےH$ؾ};?  BRNĤ#ڕJ%4 Je@3g@ȷI1c*vM_\\L6'nP((((@UUmv# B*h4l6\+ᢋ.T*QRR \N7MwA,÷~F4ZF42Dyy9t邢"tYg(= eeeƸqPUUW^yZje] R@۱̄R{ԽPRR]v{~ f 7nW\!?"{]waʕ(,,Ĝ9swUUF_~?~<ƍf3e t6 d266oLV;H!w͛7s΂1ji zfQk$D8ST*DQ$ B_9*Hy*pǏ@TRqVWbboG`rev{J Of0VS'p8d2 rqZ|0LxꩧPYY ׋[RٙSNؿVKjv"}EoO< ұxqF\C Bcعs'nf\veXb"(ķO2e Lv8ӉGOgee!''6 EEE?~<)`Æ 6lt: X`0:t'ND_ #Yc(EΝSqt,M&jkkQRRB>\f RI f|_;D_"sd2}ΩD4MY|O^fs HLmW*#l"@4sDzIy1{zz"BNVI8?藩ؾ| M3p:H&FTht`~ 88DF S1h4JCPUjEAA$v܉jfI2ѣGQSSC>#8N$I:ŘC˸kzjAgΝ;=v^]cǎߎKB&B-33MMMlDBz( p׿cΜ9(33] |>48!?L}B70]"7 ;ctTߩ~F^@C2Cff&n78F#0n8_Z/"n=R)yd[헀V_H$tF(q0hhhR~ c裏ЫW/\veضmvލ1c 33k׮3 bJ%N'j50|> xȺjiRqdeeuJpPh!B"R0x+"D/`6+g枝M~jaja4\moi V R3EjBZF H }kiipSNJD"Am z|0E{{t( Z0\6> 28D"+Zt: =Ju8m!_---p8:`^^?1 D8x^zVo2TN_|na,_K,ASSN8Z VKy* ݻwɓQTTDmYY(jjjNzJ4CR|W)OjX,F]|>V fgZѵkW;vc~<馛88ٻZ:j5IjmVF$IͅZ04t}}G}_߿?)?GFee%J%z! <_=n&} 4 ~B TJT߿?iM=x,rb@bPv?h[sOq>q IDAT@!B"DwH&*:77^<8455pNeF#V+222,ddd$l6 ^ ^OJӢTti=Og[>{y`2cqNN =X3c"ΦΉO,ж=v`ڷ>e5L6 }ΝΝ;Ǝ; 0zh̘1< 6n χ>(oEO믿:fݓz^za߾}3V#+X ^hnn@kk+F#y)+J999FQ]]UV /Ď;yf\s5Xyͤ;RbŊH$}v5 /暴c~z8pSNJ0o8q~gS3<#ؼy3 TooɊ Djx6 `ݺu_X]FT@ATnG0D.]L6]~=.W!B-[`Ϟ=?n_nAcccb:{dSSSt`-b|NNElZ&#f_ǷaJs \X7 p.LPOoҍWH bma޽>;k_Bvv6ķL&9CSS>3KpE`0`8t-Złgy~O<oKQAp8 ӉbRßbe;F3@H3 8b% 233ѹsgm0 H&8rJͅ`@vv6 j֢UUUx뭷p5נF:u*`СBŔ7bXz5 a{ժU:t(^x\}iNj8B>@MM O.8&x\t)f͚%ԩSl2j?YDcc#u&8",BقYm$a'B]NF("lVMQVL8qF=otCVY vpW^y%VXJ3=,̄FACCZ[[!ѩS'H$455d }3+^1fܹ\<GEE MΝ;w7n܈Ç_~O߳gO۷lcT*t^6Z H 4H&p\XǃM8p1qD 4˗/{JL܁0yd,_=z3̾e7mdBCCJՊ$''vkFF 6 ~ Z- )fu 7`̙)V:"D!@YxbhZ,[(BD{b18D"Z4Ld2:=E7s4t'%FŒɲ`&''!+ d2V*i/R}xRj@@ 踸nAoHݻwGii)QZZ^z EEE5j:w}#F _gLM~ ըCYYV^ &hsjoظq#*s=xؼ;۸>DŽes( dggBTRa! s,! +d ¶ l^u*jo3X{{0G0BbA" tF{G3>ji8k,ǒ%KR::NC$nGff&""SC@VSwiII 6"Y0z=z7|#Fv;uuu0׿R?sŃ>LK.M7݄Sbܹtb(((@,CSSmE@ CQ0+C}}}Av x<0ͨC]]ƍG?fºuc֬Y:u*MF]ƍ 0|pmx<H$ }nhh@vv6N'YQ#6f3ͧ%I1d~Vr߇l |c>% όH$8|0ƺjjjP]]-? ?|0{=:-Z+駟bС>\.믿ӧ?Ӓv¨QGƄ p-`ٲex+ lܸG1p@mEɓ' _r y:xtO>dJO3FU"DhV/E,#ɠjjZ@FFYSb{γ,N'ldgT`Dpc޼yxcdxD\\.3g?G\XX#G ;;fv\. e L s6Zزe  @:͘9s&^uL&k'|_||ML& >UUUuV[Φ%a ?WNVNH$). imuPq,Y[n#P޽{?>^qL8o1m4?vQ(ÇKԑHZ̦ PTz;$JaZa۩{|qL6 ǎڵkѿHB$E!Ba#Bį {=L`d~("Jf$T*ղ YEـn(B0$Ҕ:* P|1$y0+JEdn[H(P,d`Qz:"NE NLd<_AƆ)e8p555B$… ?H^E=0j(={D=: gϞصkJJJPIGznqzHիT*F@0eO6-ÇS="xBMM jkko>"J%eee@ii)3رӦM\SJJJbذaرc>\zH&Do"HUUUX<+++1~xzx jnnF"@nn.ի龾uVL0APt9r$.]J2J%K+L&… >|;wC}E|"R!J)% BPmR)'3B!80ڄY577C&vAĉT8|tneh4즐H$č7ވw}(--F,C"n0RD"!Pi3BUv#333mx{̩B*l6\SSχΝ;C*b  ĉJt;0Lشirٲep{ 0dXzBee%\|'xЧO,_]v8C^^d2v;F# , }\. rjX'H \.jD"Xl+]  uz"@yy9^z%̚5 7x#@A`DLQ t<tn~AD0D yF2Dcc#rrrhVq rh4d`Ȑ!fm# |"DAX,?J"NxRt'YX݌D" <R)T* 222 F d޿رK ( VT"f zX;>A jfD"D޽AUU8C2fCAA̙0$x:uB"CV F<  nϟuA`ԨQW\ Æ … q=@.'%\I&C=DBFYy^Gkk+Z[[a0رL&ݎN:uρ@Rz Э[7 rryۭ[7lٲ%%%bL&'d p8X,&خh<n(Ba!ɠT*jza2 J#9PQQc`OY!B"~hjj"Svv6 Vi܌h+n9Kf)m h͈VDѓ:ZI _yq>;Rw833)`Z 2B8gvF|T*RfhDžpg5GvB]]N'4 $ ;fΜK.]t qΟ?)Hr"R)yPXXH!lYw|;#VdIG<1e4ݱcnV?)8n7jZ`{Xvb;Xt)G}'NQWGEϞ=O4kiiI!aѭ[7HRaz())m݆*\zX` HT*|)SǠA#l7n/?YL6BH VY("EAAݪ~ZjmQ(ZZEQ!eE Ț=d2>sy?;3 E{L&7wy=9gҥ~G*w1yd,XK,T*E޽D륱k.;V>zxƜ^GFF6oތJr<#TT곫HUz dx<BP*т3`:{ݩT*d2:UK*"`i.( ^/;8#8P(DD_YY χ> 7|3'X=hڔjE]]4 =`;::hrg{]?~ABӡ6f9t6TT;w.z)9rqF#//7ߌk .ԩS裏bx7j1qDٳ\s v؁7|n~v"ѣիJ%8nGQQIG><_NuϷ.E._瓋˝&,`_P]]ݻwcϞ=8ruDQD"bDD"AAAK_IDHwMGG|>vލHFr梬 .Dff&VXw)?t^/JKK)?`…(++܌cر?~ F7o&eך`0R-[CAPj H`0Jz!ge((oP*Ru1@8aK<7| vĉ!5;?#yqnfS[[kb0ǟb/98p =Y^OYX6hnnN8QZ0 I?W"D 㫯ݻ1}4?]S*/r9l5hiixN t:Z t:R~b1f|>D"D"䃿Xt\0ͤ:c^`pGS)Yx\.hDmmm?0ҝYg$u:t: 蜀r\.:J% +Ag>Ϯ3q|D{<ntttthmmnv ߏ@ @JKK#y…(//dBQQx f{{;V^ǏX 'NH F#8\ IDATJkUVViӦ8o?{֭[1|pK/[oHm۶a޼yX~=* o&MD{RH$Bzlܸ'NߎŋS1}[7ojv_`0P7Y$lѣ!q H|DBj("D,*}XH$4gH8]e5{.1Bީ^w RT@4o6~l0yBѥ<=ͱoyb5_d HP(`Xp1l6F(Jĉ0=aE3vuEJϚ5 r E}]s=H$Vo;\իW >,.bL:=ny^ybyM N@%h4BVcҥzŒ2K,}~޽#GMb/n(J:FL&:סPHÇ^ш&ddd>!FĖh4JJ{lq&JJ2RcdD뙂eY(#CZČ LE'L&;|u7#].N'Y\.ttt ---hmm ]wB\. c"ǰhDNNf3V+222vG駟Fff&n _o>z<Z0fWG ChDLw0 u#bǏJ"k .Ruuu(((r% (ڈ8gq\fx^A0'R* 0B  &`ذa7z==hχBMM 222(vĈ馛ȃ+ . 0LFii)~r Ç'"LoX`ǃ?C !u˗cĉDH$477'g0`x1{ld2q(J|G _}?|dD(Bnn.J+ ";;[@{tpb1 4s*BQ?BgW*YrԺ}jHa=?d2튄VTĶτ ?eP(FdffB.nC*d2Aբ^0=.t:8NMMM)mF–-[tf0xeeeXn@qq1.r̘1~;~A.cڴi0`f͚O?˖-#b[.#vڝYYYhjjd#2k8H:n7VwW\TVVb֭9r$u :r9gzn#??_0/lhll$vc̙R0lmF٣"/B"0|̟?"Dp ̆"#%֬T*p8)'~_rbAMlC=!RlYT*n'|?嫼}"T/ ? )xGmHJ2xlXFNhD>}`X`XLC4 MKK;';#3g&-1erm gl`(Ba mףRZ0^zz:z}R rYYb:POPvZDl bh4P({rP]]#G${*eYYDB$СC.**B$Aff&{9&2 ZLCV ç~/ؼy3^y8l߾#F ݤR))K=vvEb1*|>R644n^[)q8J%6n܈#G̛7SL?FC.fI + .XV۶mɓɰD"5H$@ Na HjJ5z~ab u٥֧O}2deeA"tl6ӳX#nӳWRA.dǑJBvv6HpֆtGBVx֡tz=ͽY1D"`ڴiDsO>W]u&N ȑ#m6\zXnmۆUVf}> 4k֬ys^WlTWWaH$ذaP^^T|oiil6"].^z%ڵ p饗GoۤgK1vhZ"(KOOH~0|TVV]~t!"D!B, !J[ d2hZRW11qCuFJR n~/)/^TH_U? 5Q'e2MF O8x^)ߝN'v;v;gv3|{0d< cٲeJϊ& z"Rl6#++ 06~vVC>hbX(`-??Nad S*hhhJ"/PVP*HKK_*jZ_$Jt~c_h:b<l(Y`\ZZj5v܉ & @&!===]?U,R:tMMMֆ3g%%%=R͹\.:t;wĻヒ~СOŋ1uT[[T8G|*) {{;.r_RĚ5k0n8zMR?Fee%d2}QقHf=[bѐdtvx㍈bOy]E l~/F# [ZZjxͻBy Bz$&J r"R MCj{2L`-:&X vj:)8A*"++>h4i Ryۍnf=H$B6 p80RgT*,DL8QqUWh4b׮]ӧO 8UUUKQTTc۶m(**J‹/+V`̘1XhZsKK `0.-ll},^[?⋘4iqƎc=F>|IMzb6\eJ}c67Nv-^x;v oVW|޽{"D!B᠖T"u($W8δ4"jU*i[ڨjddd z"[H~MTA 6f1ÈZ,_n---p8Dгv@ @v❩[VSqh4"++ ZHOOGff&, \`0raXbfΜyZ+Tl?a.|ooo'KvS];Tr|TzL&qZ4+ dggTb18N|>zZ|͙3 =:v~-5cx|l\c޽_Smo,X2Ӈ_Iی㨫UWW8|0<JJJPQQ 3W\q6l؀ 66^y޽[pJJJpサkZz#gH[lA,C޽QQQA?cוdž 0x` <sŴiӰn:h4.{fӷo_8N9rEEEeØ2e 9"g\իW'!addd JxG`2+jB! UUU5jr9NJT*̝;W!4lX^#++ Φ[&0L0]vLF9T*q\Jbr% 3IUPIKKKRb1gcbEqK$444PIbSO ؈sڲITj"& 999hmmJVEzz:N8ݎ~hG G]]z|Cزe .R7&LN$u]c̙OCV\gք`J%xFb׮]Xz5q̷lkk(}>-Zm۶e_ÇG^^n&pG] |q455!++*1|t0'RB*5ߏ;wZN/~ |"DxvV+-ZtNOD`*ݎ ddv&z999A^^cdeb),+Vd24z:F$8й0a3fO? &@ѣ(^KDHi/4oXp8h0n8<[[[t [j4d`*##ZXL0ZpjkkD=_.\O_^^nI\ݻ8p<FZZmsOj<쳂***l2F޽[9ߧO.V2,Ɏ(`/c\]v>c#ׯ_U1gL>=fΜoiijC0$ ۶mÕW^DBd2\_~ -[Ny Czz:z*\|~ٌ<3]"D+ S?U235;;ͰZhii^'r{{;n7ɣ(^/"= yBCCR);'~}Na2ł1:q&[sssi M*y`6n g^L:5іT*Evv6N< ^Lx^ttt@VCSSl6Y-~M6 /"αbի9L ƍ1i$lݺ>KtM>|8VZ"}ߏx<.lð0 h4XlZqt:j4+KPVVs.VM6K.Avv6&O\8N{G"bs#ǃH$dþonnh gY @^{-{9:'mmm4:{smX |"Duuu8|0q. >(vNłP( .VV6  L&nGcc#ߏաyyyG~~g_ Ei40Uݎf֢Jdü2|E9Q(jh7L(**BFF233a`Za2p8khFfO'O$[9VK^yxmՂL iHsV<1 {oPNtt>t:rss)Tl6ӹ3x[?v6BMM 'ODAAV+bƍ_())wfwA466O>>}: /_n @ ,4O>0`z]բR( :tyyy]MDǃ@ Z @ @HoٲkR)-Z;&Lދo{FL&_5ߏ!C`ɒ%0akN!;;Bje2~yUmm-*++P(0m4P*|=6!B2 j`>Fggh ::tܱX PIyL=*&O%K`ҤI/ ?R{^ߏ@ @9#aҥ曓ƻD"믿Nyʕ+裏B.tBرcdO [bԨQJaZ?d8"D =Ӥ 㐑 nHp:Ag|>f]#== IDAT^{?ωh4Mz.B" ++ GPgp8DBs|1cnCii) =n:|vKKK1yd!??E|ii)R)<nZ|+Jj8Z-Z?vX +}',#4?qeGa0 J!˱gL2K,it̜ͮ9WR!ۉ'6_ƭޚX/^s6 k׮E8SO=ExMMMfJP(\"kjj/8nhh1c#GkF+!HY.+pT,<YV6ĞluTd2T*ddd ": l2zVsHPQp&DjM >)`0`0p @btd0̜9x<իWc4D"Bdᓞ4{?'Ot:k K<fϞ~aȐ!xW0}t2F"srr؈۷cŊt>[o1~F SL֭[`Ba,@Vqhiid"ɖK0mkkCzz:>_uUxq\qdeep( HD`IsH!BS0c \|?/MMM/(S0fm @,.Q'L͔,l'(wC>d20qOWWtqT^^cP(\׋|=kh0DhQ̼_3B=xOV`R:t]t- a:::zLTJ!s8dIsN]>(\.GfΜ2ׯKf=t:0D ?<.bZ@Ν;G#qbD"Azz:JJJ7+ΔT翫cF0(++a>oS&!Әc eFh4 ;v ׯȑ#iE|n͹[0yd|t޽SLkSUwŬY0k,{4v{Epwr9V+u*x<qQ,9NhZjZp! y\.*X,B*B ;;MMMX,p:-tD!B;v /2FXHiW^hhh@,^-].i>_Pf~Z'g Ҫj^d> $K btzWT{"ޯ_? c<ߖ  |>iS LAP(PQQࢋ."rAV/ ;v 6mBcc#bY~:N/zWqHQL5ڊ zAvv{~?=Jl˷X,t 8t:f38nwl1eeexg|[VV>@{w6nHnooG4ʼn'`0 Ja4OͩٳÆ KR(~ᇸn:\tE:7|38p_~9-[)S20}rJ̜9\s V\IKV`=~_v܉QF`ҥPT*"DH`]~&p8ܣl%J)X\,o?0)2Щ^H$c)hIK~Q"69BruI9R("q'cǎ$h0 T)ǂVŪUxb<4hi{E믿o~W_ T Jx .Rl޼M0w\"($ d2,YK.Amm-x L<@"j_j*\{B!8>(q$BTbɒ%v. edd`˖-DwK"-- {Ɗ+p%l6cXb8!GS L)DQ3&&VT[&XX' |VlhmmYfvFɦtA,Oh4& v B0߸{x9WZ-\.FQPP۝oH$~1bNgyłDQ ˘3gn6xQVV͛7#--rAsX,Xx1;Q% Z[[# J>IP`ժU5j~GRlN 6LtO|>|>5e]Sx衇駟B B@GGn7, 8C^^<~AP ''X,"D H濽"Gc(++/~D=9`/[@_hll)_fsR nOG#F`ѢEc(,,S3>ƙV%ۃAa׮]7<MMM NCFFN8"p^zт'ˡRp1A- A8pc=z?F˰yfܹsO=}L& 0vXwj53/޽{CTbժU1cΝ+VB8[ow>l6֬YCl?Xucc#l6U333eTVVB*c޵lÍ7ވR`X!=;Y'OHT#NzP()%D.ha!̮gs DQb X"Ng{&bq\ӧOOTJ!|f|kL0~x׿~zL:Viii8vhDsss0p@ 4z | , IC #33kO+)tRt(^ƍ1ba޼y0Lptr"#fQ+ꫯ3<2p:*H2xǎCQQs[ZZKJ'N |"D!B9J⋘8q"ף"F2/w>] JIP(vI&v3hjM*,---=>--|\.(>DE{bp-zwDe?S3rBV kpqNٲjTJ*|VZZX,ȑ#8x Cx۷o'˳>_W߿?6l؀aÆ! ~{nL>+Wի1uT_08rrssI=R^΅3g%I&aٲe:˯fL&CSS)PUUE$? Oc̘10X,XjLp]wrL!j;^@EI>JE|n7:::jb87dt9TsFxxW;`>|8ͥr9.̜9r ֭[3fPC~~><sFI}϶P(IL<ߢ3SffÇ~K.6 &M,%6X`0kj}~Pދn9FXWgKK z~?Pb2k?''}Nd!"D!ڊm۶aʔ)?M|\yؿ?,Xw`$/S3vmszI]X"AC" ?T>jWH: b&ؾ3;R9##@@T*@x8n;::(4uɒ%bqaX,TTTCqwE]|,C{{;$ Yw?=D7q|t^Lzq/QPP@m$FSvU\.GMM z%}+L WTxb].\N ,o!<;v,N ].\ IXVV+WuDB~PD:U_Z,ȵ;jE8,Fr9ĬgOXFW^:Ѣ-1\}ݷo_455wuJKK8M7ݔCq<z=R Hd%8B_xB!"33uhOE;pW" pާѧO$>MO"P(j7<rrr880ͤ۷/֭[Fuu5vڅw}C AYY`6ѿlݺ5D"5j|gxhΔ^~)~m?}F#sF/[ 'O&˗cΜ9>}:}hZ1ϝ`O㡇JwƏW_}H~b/ gV٨yǃ~@'y?zhhZdeea͚5h4b(((1|p455g!BDw8{w>Lca4ݑ|"TXVZjkk=&K,SuBq477CP㸔CG?#kƥK>n:ӟJE>}%y58x Jk\T'e]_زe ֮]ŋSN4믿O>}? /Xf iObѢED'ZqAdddkt|>JeV]t^{5L6 ;vcwUhZ O{8~8nv|?z(܌LHR R3BdBkk+233s"/B"N #GիO:)BنRĆ 0yds=_}* A{URLVB!dffި;cŊxFz!JVHj~@gF# z ,署 |-===dotj5n7^/^/񠠠@pdl޽{Q^^Añc6lqayq0F [n1|pW6m"aÆaذa1qDlڴ A@3TJdo뮻W\q֬YC\JEt:qbӦMjh"̛7[χj˕D~bjb;v,0w\=? Z-Ȟ;#iӦ;tl!B  Ӽ%/HϺ!+Jwg+Cp*Byxs޽k.s3@xlF[W IDATDbH$p8 ̖Q  <##lZ-sݎ\~d4G!\8//˖-W_M=0LxᇡT*ɖFV#''X,hjj!CPRRSLP0c 8q .Ĉ#{E޽СC1}t[oO? ZEA`ܸq:cv v8]gq|xA8vL&X, ufA|[Px SQ!Bg=DR -- 7nDaa!J%?%LdB\TRU~:HD"Pg\g B4=z4=r˟z*]-: R`0LFm㔤L`0D|>g(//>Щ}wxْdH( %&FzpCQW@ H*x5RÅB el6}lB@yyLfggfw|.aRk^{*ꚲ=bgϞL&Cnn.o]ݎvщ ~U-:RdjU|I$J&x<x^_*˲pݨ@J`Y7o륤矧p8cǎGŹsPXXӰWBޓK/DIG}_)yO˖-[pcxgq]wZzT*J!77999裏û/8q"Ud <yyyTurp"55Y򾺺HKK_|}gEzz:ڶm?r< 1fs=/yi!@M|>ZjLP( ^P(#)ΫzjwL"6-&r! HD#pÆ Á`ٮ'hn0HJJTۧ V^^Z qEzeKmm-0 .]D 8b0뮻pI'Drr2̙C Kz T!r9FGرcDll,y.˲:t(rJ۱b *\h4X`._c㼱L0fA?0RSSd:NJNNA")))p(--u(f:~Q(--Iloj$DT :&L֭[vF*lPYE㼥'_/D7Hp%!Y~><|K' A,C! ]Q%Hhht nQq׳@iKDkZZ zhhQ(+ȤvCVSk׮(++k4 |(..FAAo)..FBB}>|8 `X(1}ttéSгgO]}RK/lL<G=Y$ mۆ >w=3b{n}ݘ6mKI={`֬Yk7bɒ%zoPWW &4y.СCl6}IޛL&^qťKpj TȽދロZ`qn @kT\ .K'DcHr"K @]]Z-~?n7 bcc9S9:$  `6,=mۆvbZhҘG-G="@ @H$QojkkD28[4 dn?.զ a2M6ܹsQRR5k@,CR!1СCa6_6{}>XJg}+Wbݺup\뮻(m6RGnn.LP(Sr- h7*y'00tk֬Ayy9N}D"i߽{79~ A V ^W@SrS(e=/C  @5vtXjbСQױZtj!DKARw&$:iG*E"R)R)%R)m{BԳ끯P(S?_?!Jh4`w$DRsL$*L ߼dbGp8 ZM6nٳ8{,ʐNѣGFVV0V,`uuuȸ]=h4[?h'%%AҖ{.w*x"Ν;G NDt:L4 #F@vDvv6ڢ_O>1c&L=z(N:ѣGcժUӧt:UO?oCŖ-[0zh#55pС {o)ysN̝;wb1ۇqpBرc+r=P^^axwBޓk v4 nf?矛%V:tX3QI7 KS\ R=~W t,B.Gq' ~Ubj4&Lg}ӦMC۶m UjjB5"m6Z-cYV*ho XX,FJJ JJJG [+PSSCUf~?Z-f3N'222z?'Z-ʚ.P(>}:= XcԨQ8q]oݺuoiii0u)j ~;b8q"ƍZM;CF#8a8y$y^ǏǶmh-Q tR;p8@ @Cj5L&.J$%%! A.cΝ7n~lڴ `6V⡇±cǠr,-t:z=aWQ_WWG+hhF0 @׌_|?36mX ?cTKzޫ""}ҹDvyc@LjM ) |>~KedkrׂHE;Q_Fa DN`0٬.ygh>ȄxIPkaa! PXXgϢuuux0i$sԩS&Va0 `0,1tPz]bEsBQϡnG۶m>Fٳ.KK.ٳg/ c0޽;AaŊ?~<})33^Nʕ+q?~Nyw}3f :ӦMÁп,^#Fg}FIyk.=sرc),RSSQWWDJ?3aw^J{^ 4?Μ9 _hXK-y]H֩СC0 .-Z\:tsڨE}%@}pЖnr4D", HtEaCss>wT&رF7|3N< Ĩc* QQA",QèT*~vwpǭ*Iᣮ:t@ d݃|te{X,DF6B׊hp8PXX,(J|駸~7|L[ ,T*ŭފOBDłx 2111Xb;"Bݻ>R)f͚~aӦMHMM˲[Xs FX,(J( TWW# "ʕ+;w17K;^xݻw QVVFi 11555}0k,n]tѣG6C yh4"??&M:/n70p@D"oyW^0ؿ?3xWh"1GAaa!/h afϞqСCPTZhժ0)6l؀I&h֭֬Y'Oȑ#pBl۶YkSWW/>!k׮x J1{l$''c„ شi~ׂBdj{Y  N6g HR^Qù^)bTVVTd2H$!P(T*)rX,^8kw~ll,N:~[nضm̙uDfdG@S}dܓɘSRQ28ۀ[ja2$QĻ|kkkѾ}{Q[FZrr2L& &c(#Ѷm[:u FZ}xmn<X~=z)L>$ 0 |Mnݺu8aHKKCNNAvv6{9t+VŋH%@.k466ZLsI:"0 ֯_UVA.C,? ̝͆;67x/;qfu0C  @5CRaƌnAѪU+TUUo  :q$zC.׸~bN|e2Y0*2a>) rd2E(f^drC3rpT%ɠhta_Kt:F^Oo0DII d2^y;8{,Ν;k׮>|8,Y"Z.)) Gv* Z>G+i4CTBB.#33K2z Q+V`ʔ)W,˗/#??OFMM nVx<HR:tEff&v;/^ 9K ^>jk~~>,XѣGO>ǟaL>۷oGjj*ķjصkL8ZYMUUUaǎ^{<O?4%Vŧ~ÇcҥX~}=ז{1L&$''wˣ=## ł^z$ܹsn<  !wkK0 i cލx[V۔MKD=--Q'n݊Hhˌ3t:q7Fsp\p\p8p:tq8Jh4t}WRB@NNT*;"Zqqq-a<ۮ];0 DmV0:tłJ8vBRŋUZV__F'd2YvQD^C~ >X|9|MncڵXn&M˗[omTTT(**;#`XbT*Ol2̝;[6}݋S";;ׯd 'UbQcǎaɒ%7ny0 }a3gBNC8F]]`X%$̖tӒq< ~voN? @Wm۶Ͽ'qP(q^+D"O? z$ %󣁼'FA@y66\G| 9&Ȥa:n@|ԯ:\oQٌ"0RnݚNK6 VvGR}}=0`N'7BG*I7 <ݛD@?ij!hD.]`4y?bBii)m& \;R Pҥ :w J֭[ȑ#`Y: ,tܹsq+xGPTT, łXTUU!55 _Ǽy0zh|P1qD۷Ę1c߈Qۘ9s&%cbbT*y;//Q瞣b…x衇KyJJ  %ߏ Ɲw'YaΜ9﷦{mb߾};v, Ѿ}{d2~v… pctT Hww0F۶m4?X;޹Zn 2@ E %"+yv \v9jgXB:H!j.RWWٌ=z`„ {ЪU+:T*4X0 Z aP[[K1ڰ0 p(..jM)CJKKOG ==1̙3{g\\v؁Kbʕ裏xh8|>7tqL4U^^&O ^%K`ʔ)xGйsg?~<ĉQPP@M6FJJ j5LѣGgA׮]OcI0D8L&CBBV+ 8<Ə,ٳ ֯_?`xGenQL-@@<54Z ۺ:*  7eYY* K.Xn o` LTUU[AHeR Tz>MM jM IDATsD&qqqJdPTt$HV!Ji)Wo?@T((5t\.2;9*"dQXXHϝ;G 233Sh4SNP(xw'`̙t~N' #d]="HPSSk#&lxEA駟fCEE'!mEEE0 0 ҥ ƍ.]P9d2Qv+FfBΝyJO'᫅߿?XZ\.M7݄J?~{ҥK'IZjE~~>v \a;w.ƌ~SL75 cƌi1H$xw0}tL8B@II :t8pdddP>  =0HJJ Ǯ]0c tMj{r-=xWy٫Wf{>}`ӦM5kGRoLLFh"..`.]{\\hr sHDAd?!K4 ŋeNԩS!0gTٳǏ… }vKXt)^x^'0PTyk4lܸs.\z ۶m]' tl@J%FdBTi&|g8v֯_n [l/rfqE6555HHHX,3_f0 X,1! +WH6񋿖mECꞴqG*0<UpߓuR|`Yޔ !z=|>3'D墯GvTz]@Rl6_ |r<>&rQPP˗/|o6̟?~6ш͛7~0 ***xJ|=7D%j5'h׮~'9,KϧX,Bh AO˲h߾=`41|p;E. ϧV:j qqq;v,-[dD">K$`V'߿tC=(//G6mh,))^S;vߎo~!FEۺJ. 111ôi0i$<矱xb~3@P7ހJw XLIB vJh۶-L+W=.o4"۵k,˲9s&0E @`;CUU}AMM  ,Fg~(GC4wyNl}3 t:H륅Xx<h(.$&&j'$nsnt.mJPR!;;Xf ֬Yш~> O߱cGVK^xiӆ*9$avלabZ0L#~}h1_tlܸW{gumal߾;wĘ1cl2 8yvINaÆԩSxѳgOzL8>kZh4hBj5u'Nwń 0n8,ZݻwJ ݎ_~" `ڵxq iC 1g6mB֭yG>`Dp\HII]to3  `ka$@@uuUD*Eϲ,B^/Vk#w Leai, JBü9~ah+֭[&CSX܈S4=}- ϗ,ԩf{ѹsgo]M!++ EEERju޽d Yuu5~?bbb JcƌX5A]_~ q mYYY>}:>S 4L9+Fff&ӹ{a4ѡC&o0uq"AZG s4$ak.4+0rHر^EEEԩd2JJJK}ɓǭފ[bȑP*ٹs' =tJ%n7`K$aȑP\\ tN>ӧOYbܸqk.T*JnJ/Ƃ SOaDY1믿ǯ9,^Zj>ܸp\Wek?bJb־}{@rr2\.x†HyZݬ j: J\@4"# MysXDo]R ],")) x<0 Xz5fΜI`$\ @Ajj*B*++;vѺuka;w`YG򧤤tQh4ٳ' ׋2nݺW_ŨQvm6:vHUvE̜9ǏDŽ УGL4 ۷oG||<K,{gΜ`0xVO<8'NUVd„ ;n:˖-Ò%Kxbn1fl}>233D(],[  `РA4hПn @&Q-6g=X"eYT*"V'$lБI !Y[29JXUKks-"|afUsNȱw܉u0*-Ff={* eee())AAA^/F#f6l:w+=~?B0^/O5Dz,Z-oV2J&\ pQ'0IQPVV[{><ONJKK^z!;;ƍhg\}_~%8ԠCPTƫl^ `P(Inrx|voN@ @Wl6$GI64@ph4ejA:"ķB&T*mqH+NRRHK"sIJ.M\.nZqiTWWl6cHLLd|h4tj\.fÀпL6 YYY-e޷Z6l6eY6(((hDCdr{^xVCd~) %˙3gP^^;k׮0ͅhDǎP(rzQ\\ NǏ#77(**B\\  Ɂ`h Nw<N'ip}Z4M{ 6 @ѣȀѣG1p@zܝN'ѧOذa-T*_|)Sޣ ZoÌ30i$۷~&~'3۷oѣqYO\уARСCoΝHJJ6?P+HzjJ w&>W(ѹsf韜 DBs"z}#K Em"H$Md#݌555Stmd&5#G@,_mb4|va,T*Vyj4Vk4( ^8p8hwD"c$'(۷/k߿/Fat @ý`0r… TAg||n^p-)qA~' @5  >@^ЩS?{w#R$ˣRڏj(F^giUpI㦔\T.Us'o< Q2fԂ_)m٢.dhj~uu5l6|>~?RRRХKw.IR^ҍ d2u)$$$d2EΝqY3v,x:STH򞴎sI~ 'ODJJ 233a4\t;vl0evZp]^^ , ՊQFaҥ0 MڣE^~n7%v;$ J%= fpTvxY@ػw/{1D"Η7bj?eYl߾6mVlFjj*XO{RpŔ'111yw|G8}4%'LЈ<|쉉Ç1zh̛7۷o6=0oժ^z%=to˖-C.]sJԬDZZf3%b1vTmm-'o9 @ r/ )3r#y2-l UTt-Lss@BC}>N'p4 ^/j'snd zb7Ԕ˲;1vXƘ1czjyVz!`2ihlFǎ|>d2zv;L& .0HHHĥKj[s=l2*Q[Vt:555ѣz=ڴiNG(--E8`@Ϟ=a0Sdff[nػwo~a|+Ed-Nr9p`4wտ6!!f/pI\bQCt MM8Yegg#''午_.kwC~ZVͬY?T*ŧ~1c ''Q@QVVh%֭Jb "111tp a`xv3r]vEyy9D"N'ƍDΝ;'@Ϟ=qmQeX,Ɖ'DM')))p}UUUxGvx V"wߥ\.ڽ{7n~(..v MgzPV?ȑ#`QFH'pfBA=rNAbP(lR*T7.ݧj5 xQϲ, Ӥ=RMn )NT(++CJJ t:ѱcG 8Pj5bcc1 x'PCm!GgBD"MC.Q%߿s Dee%Uc[=V+xǃσeY6ш7|7x߹ằ4wޘ9s&F#[n(**B>} QRRBBh*c"++ m۶mͼK.D8wnfl6X,0 ryT5d֕"  2RSSg\?w܁ktgϞpNȑ#pBl۶#"H\i;iiih4Cbb"r9"T*wISH;]RRRJsmpDidGU $74D"V#!x^Wu@x9m6齒?ߏp8 N{_rJdff'Qzz: %cłxd2JL&t:zLN'ڴip8 L!d xM=~+^uZի%=`6mx\C*"99TNu\P*DŒ%K?qرFߢgϞ޽;V\;37Ȯ]ݻwO<ŋӹM0ĽKQyy9z*:z?|M,ZK.ŀo>:'c' --4hZtw}B:A[V̕E [i⧈󜻈<E<9?#K8%G.d.pxōR @ p\p87tJ7oƲe Hh#uR˲p8tpϵKŻ5PIb%DnL&d.߹Bh4ɝ={6ك?mڴ/iiiM; sA!)) Zqqq^Gjj*222^ ø|2PRRb!>>>`^A IDATQI@χě_ig$V+D"0SWWtڵ ())w}/B$!))*;wLI+)^/pYXNfKJJJEvhZT*ksvCPl67"룩jjjz$dbP{' ΡlƿozHMMlƧ~!Ch( 6 ?#9P(SƬY~ 2O<~iMX Z AI:, ^ ډ0uT~|~֭xw!C*6~[h2)) &wZnncĈٳ'lBGM}oeddPݰaâ,ˢbQg@4D[bժU?} _> RNG͆$'ȮTMHH@uu5@-Md5\.8 47oj"66ՀeYDі g (,lc;6b=8#—@  @+qAL:NBN j'Mꑤ{$|! &>>1vX̘1~!:;w7.N'^op8*HҨJu.* a:a2:"yO@&"b:7oMvNO\|۷GΝ!J &`04#\U5Q}qI eiii>|8vE׫^M|nHфLR)4 ,K#ҥK#--2T*hZr5}[}j5<9r}222@@S䚚T*TWWSNFF"P{ 'NĎ;0~x|>@PރT*Eaa! 5krJϿ 5LM 6 Çf͚F6zEyz~.IIIA0D}} 䜑ke޽3g^{5B"jY @p8@ @spS~INsAl =j!11,Rۯ+\.D"QmsiӦaԨQ>}:MYM6QSScw?uuuQqLsD>AHvBDRyCEgybb"8satwnp4tZQH=C A^^^Ԣ˲a|3W_a3ڵkGs`߾}طov؁ 6gNÉ''󡺺rr^7())ZF˲>KNSr"!'+FB!\p;vaq8u Ԫm6rZ@+juSVmnEeY`Xłrjr?f())… /GݞG 2S._,⪺(--NC0Rl n5T*FheYtBP>g6yANZߐSN<۲L.!'&תE6mx-I< <.gSzi$E"%l0v;%#.9 g1==lݻ7Z lx<[5 }08rzիWcȑ={6v XR( zIRDee%T*b1Z-c„ /{nP;FO\.ja%Я[l={__qO: +JjuuutSXXl\t)jX~=8B&&&7?"^{3x֭ko+=;ر֭Ì3SO5"ŋR|r^H3>#XLA.y_ @ +ԩS?v{0Z`YZQXi]vx'-ֿgZ] @*cbb(Yg~'0ر#wի/xh3f BP#wQUwMI?A(MP Ri"j "(h"C 6@`#|1!mj&^ysg&!啻oLn9g2>k3Kl| TFgiz ?ߏj B8{l |&e@ j> HJJ^)Pxf޽SLڡNFNv9 PXX`0eoڶm>}m۶էg`1ePNCjjj `XDVmӡC^@n޼9,3FrhZ>D. \jI갬h$#?K.(//Gbb" , 83k,8}4JKKѫW/u1N8kiiiHMMj2 (++Cbb"PSS冒VqF~!Nha ]vo͏M6hѢN:8t8.]4Hx<$%%aܸqla*^ve{s<]7V!nGq8/A jѳπwff&^/4,+Fo6ʃ {w#kjj0o<<.˹_)**ypV%WZ-4/ Du Åx<"=[F#233E+#GCbŸpwYf<0 Djr9PTTpNJJue"9񠤤$FYYY B7?ߨDoZQSS999܎ 6`РAe2v 6O=֮]׻n˖-Ä  !;w.fΜ)jw/xP^jLp8`0dL,{Xd T*'te2hW\@]@* h4 IFG~-:vP('bܹHOO;F৤ׯǐ!C8qq7" bϞ=kt^OV#-- rUUUv"3u:6oތ!C`ĈXv-9sOF-_cԨQ=c4i?·zwnZ3 JJJHRby~g2pb~jRA{ $>K/L&ђzш|qI@ ͟СC1l0rpǥjL&_z'|>DZ6m`Ĉ4iQTl< zp8q&q䀈{!33V 3f`ܸqxѦM<:u*, ##F`h40\bļnwL͛h4dwEdA 6 wuZn};_`ds~~>F#z=,HoÆ xWl D.iӦ1uT :|'"cP*ƍʕ+E?˖-CӧOGVV͛"ɓ'ѡCnKVV{=Xz\.Ao}Fj:nVfNFرcQXX<0زe uVZ{/Zx1clt"`0e2Y "x^N¬2ϊA^!qi\yxP]] .Š&3SF̒H"* T*ЪU+TWWc߾}С/]Z@gz9כ'"!++ ׯ#<""y V///kFpk4|zV"aРA J] XEaa!/_VZ^/ 4L&^GRRXm aOG&!++ pFncRu@]|ѢEn|rtM\V'%%E`Vo|aT*b'dK$H AXi:wx[adW={6M5o<̚5 Ǐ|4h: /^xп/__oFf}}rr2?& \ dEtl6K"hpm>^t$*$H eD<ηmCORR0f3et7(((n+n˟( N'$$p5d騩+L&>#ek4؍|}>}: ^}Ux8^jdffBPhG˶D̙3jʊ_*))A.]w]P}}x<+bokTv` `PwG?X-[Ю];oߞ'RukbذaF&?@  A@qq1D$j5d2f3~i|Wx1zh{c^g5_y" 2̗ȀB$H A "rssa29@; LbFXB!l߾˗/ǦMrlRDVVDݻcr\q3 Heo>21̗ ŭ _{t&V3}vlݺ[nŶmO?h\\|8fcؙEMM N:`0 x0-H Ng Y,XV dff"33_L&'`02޶bA sYDrr2?&ͥX-6U*kTFAff&xjZtZCHOO6 N[VF={v |;v6m R ǃn%%%?>`o'Nd8B!:u ùs琒ӧObC0K//L6 <#%Z-͛={=܃p8B$&&/W_}şSw}h{u`III PP>bf&Ć d$NdPiܲÈ8 $ffհZ01=A{kFL&A$W^^.اLGѥKٳsţ>޽{ѣ92U**++ "Cjj*QRR"?jvx<8~LgϞ1c <۷/Z- (ٰlX,x<>鐛v,D|O<Zn`0x7!"~?-[q5 &=SWP`͚5޽h{mڴZ{GN/Luu5rsst:X9z-ǎv3#l|JMM 7- 8 $t$H A7bx~iмys]1F1|p4m]w6l؀ɓ'믿Fvb2~vڅ7x7|h޽{1o޼P* ʲߏ#Fp>SL4ۥVy͛yە7nl—1Kn@rF~ee%n6.">nݺa͚5qgR@駟2QZљäZ\5hon*Zt:yct]<ۙ 6GNfZq zF4d2/6 v֍g}PT1ԩSؼy3,iҤ ø;{ Xt)JJJ0{lt:,Zk׮?ݻ#))HD}<(qi6c{̃N,;@LaII n馘㍞4 |>h[V7 *7yJ A¥ɲE)T" &&&6JAh4B5d"LRLx<P5 ү|&՝wމo.޽@p IDAT{cΜ9zbb"^/J%Fk0kf3J%UWWE::B<#rL&ða0p@,_r ٳg#??ɰ8l`VV, B.jEVVXZƊ+p8裏NBB(Df3kѵkF ǓUTذaG1:3 N'ڷoKoG1`.K NeN> |Q[[4tÊ+ЧO}x@aڈ.""|>BO5A"%H Ałrlڴ =Пmj nsHMMEUU222wGEEEׯ/^u(GE$x4AzAtܙώgMEjXdIvd2>=a12)60Y&Arnk׮3Ӆ  ΂gG.]]!Z_ [lӧ `0йsgtM\ԎaĈx'y#:#Ih[Pfm?r;3ׇ$CןOOOl^=555*QmZdddkJJ ؠv J~--ZBn0}tL&a#99Qeu:jr-hݺ54  #Gb„ (..Ʈ]n:B;oZn<|Wطo_EBP+u+r~m$$$`Ȑ!t(//ǀh"u;b޽brl6rADNG=eeeqV ^ev؁1c~صGăbᅴYYVʼnsH Ao&)A,`$%%qd2]ϲ}>***/Zrm/҇)JL0F«뮻<z)rTWWs>F hP(WFVcԩ=z4͛k'NO<}&AhZAD|v!I&|(--7^Y2<ؽ{ȷEmm-Ν;-Z\yW*"_ɓX`>|AlA|rѸ[&gϞ5jƌf^{-V^^zc7l؀n SLiii|?˅4>"_"0~x 2O=ڴiy{IDAX))=u9qiȚ,:zJ_?Z $H @y @3@[WhFm w`9  $Hsa6lg"ׯ'ZMUUU1F#9NX,Y PEEE;~xId2Ν;ȑ#ԥKkYfC}8q:vH͛7aÆQ>}hݺutq޽;k׎ZhA_|M4^}UիСC+v>|ڷoO[<3g[ ŋ!=St}c'"*,,$ZM.:ӏ 4qD;w.5i҄&L@G ѢE[ojޗ流 އ 3ϐJ֤$ԪU+:zȮ <@ tfR2d2̙3ݻǵ-zE(SMM f2TTTD&N'7e6rLnN>-Zv>@۷'ܹsd6o N-Z LF7޽{ѣnc |Mp8Lm۶%LFeZd =#%Kf#N<uؑ^z%=&M?cƌc&@@tCnxAdm[UUE~޶n7?dR(t:P8&ڠ$H[ ٢} 1h4HDp8b>}6m*jl3gPEE׳fj*++#K@p4df_QQAƍLZ`AKJJ⾋JJJJ ~X[njjjd2biVZZJGlZt)p8LUUUdd2Q(w8TUU%}pF#fxٳΧvf*r:~?/hp8,{ t7|A)..Lڻwo6jjjcǎ1Iuu5߻hSN{tqDDv;K%:F0Wxد_9~rƽoS+W_9ֿr/6qy~ĵr/gydVQX:? $_ $HoRBB8p R|iN\.W ÜȠm۶ tjϧ۷QQQt:lFǏ.vADD .$tqjҤ }DTgggS0+Ln|>AFFFSBuЁfd2nԩرG6DW^4sL*.."ںu+]s54yd ԡCڱcl~J6l֒+{;w.z뭢s>t嗓R222 zPTTT DA|T[[K.sc |C #3d} Fa~ܑ^_j  ' %x>Cnx]wQBBm۶-fnoAzd{uY|(**8tPR1}L2@Oc?m۶|L3f̠?JJJhɒ%E?1vE+UUU$.YD_Ϗh$#ھmF>&L ZCHEn $\ 9~?h6O>̓gϞY)Ϸ3gQlfTfB9N2\\\,"#I'Oֻjjjb:q~Լys裏D紶BUUUg<[Έ At= ƴG^zQVhƍ1Paa!'Q]]MUUU rcѪU}"ߨn7 @5Ic/S޽)S(N$'N \.Y|7؆bmAD戮N @"jc Bl2̤VYp+l[A'|IBG $H-Z  ɓ").L$k[ 99fi~٦tj+L&ѷo_uڬ_>uUVݻP(pAor o`ۍu/y)ܹ(--^Mw8Z|r<^z%l޼ᅬb$%%A.ĉԩ֭[ħ:saƍP*ǘ1c0e( |Wؿ?V\SN!)) `gΜ]p8p|'Op>9 tn`…^n5FM&^7FMM ***PTTۍ{ ;vG}[wqڵkf͚A&ԩSʊ__6 #GĴiӸ>HJJBvv6V+Z-d2v{L == hѢjkkcC^δ $\ nw] fe]@ JGc\G.|L&|>QQx~ BB$~B"I= q4zJh^7ڵ͛sNL>o^{5уK0i шd|JJ RRRxa+`)Ph4Bq_zJ]wmۆӧO믿^{ _=ouּcIJ;6M$|J믿r1L:h޼9OC󡸸ZI8CII ^{5999P("e2'LAaƌhӦ ^u 6L1ҳgBT^q\\/A p޽^$\,RSS~FMFFVk: "Buu50ju V ]tŤJtxU0Dee%*++ѹsg;v ݻwϞ=N:ѣhٲ%Ξ=ٳh߾=^8p;v`lق'{A ѩS'?~͚5CJJJ6Dĉx$[nÇK.CP(۷td8w: :_|=t:Eflܸ'Oߝ;wFEg}jO>entw}7?f6 pqLhG?~ZBӦMo# bȐ!ܹnۑ޽{͛xбcG 6  -G֭[a4믿 %%%FANB|(//ץwСprѣGuVTUU!99_=7HQQQM6ɓj1p@> d}$''# ODpڅj#GcҤI4in﷬{6A0hTFt9|ñi&^j`H} !==* NSDECUUUۗ A EtE(j>ZRĹspe]T]BVk׮ضmNh4BVCk#t>4ϐD8FT*t:jr-8t>C5 ]wϟ p_VV&1Cv;d2p HHH6! 2 vz+Wbѣ^~eNc"ɠVѤIfT*""(X@ FCr|>\.~\Xr%;L<,Ym!O:@vv6d2~`ڿ-ΗIBG $7nq?٦H/^K]tip6&%CL&Shуh2L&rm"O4#R^) R(M Ϯ5 zD^uU t#vE:󕕕jE}s= {G999\ޫ>a*//hi $HgO3=S8FKDJ##^:vx^_⚚Q/nHF!}|" K'@'NI1i&U5FQTkQ:TYY٠r_tzGֿ:sH&RsrJj߾=? Ree%?H߃ buws{!Ӵi(''QEEo6~YxhڴEɌRNN}nt:j~[@@t8o( … )##C$äG9|  A 8֯_Owq}7) 0vXJKKkphK+FZXXx^H8qrss鮻{FIzFEDDǎ\z饗h̙ԬY3:qp _ҏ?H4|(??>3_(++z)zUVTVVF*nFڸq /Pǎ魷ޢQFQfhѢE4c ܹ3m޼ )++~i?~n_ 믿ΗkZ߿?|ͼ?ZM??eeeԤIc rFWTTPuu5A^jdAFnn4 ?>_XXs-> $XjUop8S>DM6Qnn.}7 "K A ';@ݻ7͙3׋a`fmW.SQQefY]"FTGKJӦM#@/bLZ_QQˑ>iG# ~YLCh4ҤI`0K/apL&:u*.y^^^Ntјutɘ{tӦMԢE2p~'z嗩}tUWQnܹsջmOii)OH #[j%,X`ȑ#E[nw4 "6UUUѣ)??֬YSop+v\TRR"$$H w@ci { ELqhlK*hv_T2A1-\֮]T(++˗Ӛ5k`f˖->LK,bڵk9JKK魷ޢ>z;w9[lWCvaO7ߤӧOywߥǏ t9ZlY&ɓeOy(O>.]JgΜڵK(ٹs'? ֭[y7(111n6B~l4g:t([q1Qx4>իiӦq#>,+׉nYǏ?qm_zuWWWLVZt7RvMUVqguwCXVd_8t:Q1>vʗ{^JHH7g"26+!hZe|,Jۜh^=&MKGf7ď>?{lZly Bq $H{+m ^Q8weggӞ={}d8?wV=:6!kt_V8ԩS1ShذaOnLࡲ8tRUUU ]UU%:6V075<"2d5i҄{=Qmt\A_~s"d2)//C ɓ'iԡCjR(!!ZnM;vz)SX[n)))DwQFF/vjkkE~vK8NNG?0^ IDAT7d@̲ )пX۟j7|Wbf1'\η}xW*" xEEE_GUUUR.yG1D΄cիk{^:uTܙpetM7Q^HӑJ"RI ȑ#D85aѬo]u3(ym۶Qff&:t}OP($A0ZrssiܸqkxDr JK A JJJxA .͚5C(Biiyd Q_њffd2dee!++ z^mZZ/ zdUxb#"Z _~%# pjnpp. p8b\^ XѰ`0`ꫯP]]{bРA|kiii)~dddm۶n:mBp)))Bg {}zX,X,Z;+LDEp ڴiOd\.ol1ۉF/ّV_t2 7x#ƌ×ǽދ<<++Dl,ܮ]='d2/p CBB|>_L; J0nd[AT+]D aXvQYY łx^jv~-ϏP(ѩS'B!d2{mfvQQQQ> %H йsg-6W]a6a2rA,fkXF~P Ǟ={0g<ݻ7=U(hݺ5J%Fc̻&55+=s RSSFANN F#jjjD>Cnݰw^=GpV ZJ}L&5kL`0}[A`4E\&a(,,NUW]z p | $Hncڴixgls$"== fddl6ljN}RRRm)?%"XVXVhҶN'l6B%٠R`XFC /\BZzHKK^^GJJ ށم׻nÆ ѲeK^J=z'|-['f3uUVcxv# d$[ E,Zf6ѵkvJŗy<  }]ܹƍC~~>_ b L6-`xĻ덻m4/if N>#me;#Z-233ddff ddd@"j"??_XZO?zcǎaȑoh a2?cϞ=ظq#r9;fs̹3LqϏ $#~˖-{<>DCa9jBvv6N'F#AbAff&r9 ZHNNFNN<N<ɟ2  '0d{/JKKA0hXnnZ#<· B1cyc|4F={b8r_n٠Va٠hx@bp2PUU\?,X;wG}.]$_ $itDii)Ν;g#?2 (//?,sܹs|DVV233E$ecGR0L<#R B4h4Ɛ. fΝ6Dr9j5'#O^/ʪ VE˖-Ӭ·F~SN7AvlNBB֮]3W^UVa̘1#/P2 . 2'#4xVZombذa(,,B8y$\./_2cҥS#U/ YYv3RɟMzg XFFP(b_MD֯_1c- Ə}K.+D\s5:t(}YY2 dydP $ԏmۊH;YV7FC(0 FUUUL\V#''N@ &hФI>U*&N'O/GOf ''&RRR N7;]B! ncd;P*8q"N>^zaڴihڴ)ڵk]t?Oh4ѣXt). M4I`X0}t9rw z r|7رcW_M6A&!%%ju:z=.i|z1h A|HJJ lrN槤̪7]w݅cl68J $Ho Rg}ǏGӦMls$#)))nR<$&&"##.OۼXhZ~WX&|`L )))S|B^o,|>v;222D . p8 @DHNNFVVϺvZ)))HKK㎷F HD>HS՗|Btr$z\TUUׯ}Q梴 L&ছnBRRhp/^̗ǓJidw(^ D}bb"^oYll_hQ2;vf͚ٳذaV\ÇĉxQUUR;q Ǐʕ+/Ɣ)SТE  ̜9@'czѲeKl/0gL:|jرcy & ' F2|s!*z6 gL&-"x&"nXVlӲeK̚5 ;v@߾}q ޚ5kдiS̙31c~ddd`0 ##z>&uuqy[D+AINNd<{F>om6n7x2 M6dV&ǃtz Ϥ0LPP(HNNNٳ1a̚5 ZO?I&`3 ^e ("vVh[֎bcِDL<'Oƞ={лwor 8 B@~~>:u#FO>OoqF`pP*MDHLLoc̘1X~=/^ Mr\C 33UUU˫˅ ++ WJB8B+?~<﮻Bqq1T*^/ΛQ[[g;N~l6\ZHMMRBl1f߇ 2 #GD㪫¬Y.<'B"%H AŸMJ佄KBhPF%P*DFFȑ~7F3 Ρ3/xFn ̖h#)].WLL&Xrff& k֬ٳT*y "FAΝRb 0P۶mömbINNƂ }?xGOB@8FUUU)7еVbb"Vy |[ex: K,رcE͜9^i3gbӦMԩSl2㼎?7xb 8pcƌ3wŭ ׋Yf ڷo_~Y,## ₦`_}'Cmmh;F ͛7%W*hjՊ+))لGnp1ܹsq 7o߾+pWpzύlԳR ~+0B @D())A>}vaСOcp˲A㜜|>F$''rq>%%)))l%h( ,j.#//+V?<Xd ^~e :T4{@@O$%%qkkk \4f?LMBRŜ"‚ 0c ⋰l!//M6z7nz- - *L&deeA.G8vy\}anGuF]+mwc mj0f _l`)Z%P HS`㊽Vh~̨wsavW|3|y{;q'T*! fV7o n Ds vew}<2vZ~guV#(HNDdID4aLl\$14ظq#|>&Ne˖+dnd‘GoN87W^\.7|@<^|E֚Dwc6st Qwh=]w0׿0yd 6 d Ԩg]̊D"E@%~Eg@%`* ^`ժUhjjj8X,rXn]`쩧—_~%KTw0|LQi8NF\s5g}p '@QȲ]^'nߎSN93fO>mmmhiiA"`!nmn H?Oxtwwf_aʔ)/'|j!u'8\.HAP, ƯW_} I5[m#0z 7~V3X?ffsƖvM:tؾ_b…>}:;o{wt`hnnI'^_(Dr%{la2 ^o [.هڌfa4a65 I1n8tuu+H$h4Jd2*y"ib4BꐸFdD_%life]4c]HhWFTB #jI3kV u]d0P* IN'.\w}7h,p F. & p8F px+'@X1Kϟ_W5[(XmdXӈڼy3k/MAO??7onVEL&.Lb2!FtС?T*8`/ դyT’%KpM7d2+)RCYd2s;ݮ! 8$Ibx4jETB__DQB$9r0($Ur'xW]ugx5,ttZcfxa6c, JEA(ž{_~oM9 h4`P#yqO?EKK 0\., xIqn4t:Jx;$ .C=ŋ3P!iDXdz(;0|uxc=ðtRy…kW=r91CTc%k5֭[E. 0L zNIr~)Ula+uСCvIL&裏A# (UeVWOnf3+rGQ#0"p 2YH$`4aX`4Q*P*ئ?>J\.#N#Jd2D1L&NkBIL" (lEȲ\VwfYx<Ltݐ$ WRAQe.mw Eb:u*N9q8qꩧb…| 'AG<yx[[ `MՅٳgs$<dYhڵk56|ӧOŋC(n7h4\.#@Ex8qgfo|IxC_( 8S6$c=#G%M#GNO&hmmE__xx^EL&YEMH$&^:tСcرcqGo \OQ(`4h{|mICpA`5a(VEQO*}xk 2d7ׇ^aa!L&A&$IQX,lcp8r ׋&|> >. nSL`~8`ڦZ&d&) dYٗ?F|Vrx6A@>צi Jb IDAThiixB"nT#j Yp\d20LC$IdBPd*^uuu xc0Xy( $IBTbYeJ%>/Tp8蠃__QG!)D˩TaT\j\Č3 IƲIt: Ʉk{'N=TdYdYh,t>._*`vŸP €jvՖMjJEb18J%qE/*'Ae 't&N?ŋkfnsW, :t'rHP^H$v1i$L4 on&,\\r fΜ!l]hN~-$ 5---9z\F# |hNNW\qf̘n.\z|ߣBOOOM1n^7g#~"͢r}Gh4 ٌEaԨQ8bL&:::kq:zf@P`}N:$r)x'``2x^KYZj(C=vwu{7*X՛uvvkUW]2מ>}:.],€,FGGV^v 6 $b`ȑH$  tj= |:tб]`0ࢋ.wCp8 Za( /J\.נIj&(H$D"X~=`ʕfFNv3T tl-r +h2M]=ǃ#Fh<*w|WzRĤw>"X5E`__}$xCwdhDXdk"ۭEJ&hK$:͛ax&"wT_Mkcb0P.N`0 ql6^PB!L(n|}}}:t(2 |>DQDww7{f24773> bۍp8 "f3_wT8_^`^MΫYjםg4d >3f̀(ꫯx!x,CQnD"5V[Vx^HR((˚dBXd%Zq^TpVeL/uyD1ih2zL믿^C?ø[vaZ8AvETСCo tt*]!C9˗/M7݄#Gǜ9s^>&W*9$awf )ˮFN"rw:MVe>~~;fϞ `̘1/~s9(dX9n8瞃fCP@ww7 ݎb |駸|Nl޼F\.r3L-+q#K/ۍ^L  O,[ͯ q}aÆ e˖GOӆP`P&F?ƌUV`0jhk 4.t_:tбC#Nd21)G[P׋z ;M8(+)\5sxWFI?Rܐ){GG4!~_CO|5鮶) 0I<)ҁReE|˲NI`dF2kOeElܸB7r`C5ɚTHrRGQYQ|>)h4n3q_,ǃNB!Ţ;uyV#Cիk`<$Il R shjj1#i-Qb[,t:H%"2 z]wj.RR]E n6˖-ÑGY T(q6[iCv6@廯H(}߷`-v\.sO[e477\Bfʑ@6oɒ%xpcŸd@F.jE8ݟg:u*8aHgg',y 6 \N*2f̘_k{]XİasG꼜`06XV<@/#XO3pwoٖNFx x[V<#0a?碋.!CԝC u:D"\D{アl2?&LoQ 6PPGC:{^?pYg (PT4qeltVb'X ``Ppwx!EZnN;~?hnnfCTˆ#8%@&?RRVW鳤V[Jw5`246Dz^(HQ-3f $M^r\ B#5s>gRZ1<ȗdY1M&p8AGG!ZT ~Vj8ncڵyjݯ'X,{$ u~>sP,d8+@ j}l(ːe >RN&Y , zjŋc޼y0 6m |*(Pg}.Զ@ 7:tv(–@復EqW귵`00|py睸kp]w+{WJ- M0D:v;`RnuNl61c J(x饗p%`Ȑ!曱{;64$d2]N$AGGoBa&rIjƜ2;DQD8f裏_mmmH|\jW|D,L&O1D"L ԟ-Zx+RhZzߴi9d|bHz*uP0P9<^D d`Z1dO>Pu]j[$]yC TOv9!Eѐ4% Ȳ ˅. g#&NXsW{f +Ir\& Çgzvnjj(BsٌYfaԩ?1|M1a}gϞ9`ӦM|~;AFs9_=F,p)9r$zzzzZdY9n!Pmmm|~?N8xXp!gx9Pe4KS(k2G~ꩧp衇͛: w|0}t|WXp!0s-u;ֳNFst_:tlw6l|A=NǀASNmHI>"yf/v3LCpÔ)Sh"k[uN~#r}k@`@2D>g/p35)X*`F#pGAxLC_$IbȪo⡿%PPiK& p8 Af;@ʬ^hXgI{_Q8]Fzh1p:( P[R&Ix6 P( s-Բ,&L+V'ϟ1Yt:NOcݼysttthXd7heYFoo/N'aȐ!f0lhooG:!)D .(55j"f19c2Ÿ <*@EfގH$;vX&,z{{BAEqEDjc |:tPo/P[D"X,,^*|> Ap`xg1|,X)!uqzn\ VEQS*0|pJ%A|>R֐,BH>|8L&\.z\xᅸk1f,XfbKaÆ#><üm 6uzs-jfxڣ;HO|\B&`0pșd28Cg''V4X,[$Zl\A; B t:T*Z0R~?MMY@E_m#4Ȳ|>\.ǟ/O=&,^6 TH&h:M2W lR_w|>AMС}:(.sȶסC(EgUDQƍŅ}*' 8N)SOǫ_Wꪫpsi(OBPmrՠp\ޡ}fL̺nD"J%Mɲaىx~)~;Epꩧ܇0{l"]-ٸq#~& wո[ )Iӱ\.cذa$IUW_AEB! gGca7׶r^@bSe2Z7ވ?OXf `Ŋ_Rs 455!͢@὿zCaӦM8ky T*Zbu:tخJ0ro{WtlЄTԊ59HAm[R-mTV`CE6Œ%Kn:6dYFXD*Ɣe=Sq*I,$IsTB6s p`ٸT_~GS4p:޷B"sDEƒ$[W_ ֭(:꨺g6Ye&"蠃ީDADvi',]QaEhܻ?:tСcpED*Ft!H> 0w{8c;ou]sb̙5bRQZb1|*zn~R)ZJcTN 'L&ö)DxW/m݆_81gq8`קOA 3gĂ nRτ6 >k׮eoyFH]F>:iAUbL&+H5OVBSS_o6BX nBMMM$)d)w~͆Kl:$IF*>j{&A`xje8 f&xQ(x)jTss3\. *PmgRDQ}i~;o׼״i>c1J1ګo?w}3u7 =?.wvvrq`k:tСc`PSh4jB$, ~?J%qwA_~~)nF >'Nĉ1~x :?3t:vQ,kxFvh4j`"@"t~guݍ+V̟2 ^f( ~a$I\|fqb1x^|>H(J|njjbE(`Y+t2YH$fϞ EQpwbs~;\s5[Jj $k_W_}5uviaʕ5FɄ-X|9>رcԆLk02l{NСCcƌ{O'u4;̤zR^Ou|폝NkU`0p}#"oذa(2L IDATz虜5 B5nkk(J j[!Rjrl67TgqT*P,٧lu t$|((Ftuu!LM$w5`XUP(0g抢`ݺujZH$`&u PQwqXr%9EWWdY,>^=Wb@%}wev{* еUF#---8TŠ^~^KK &Ne'r5;r*V+DQuTCo c$mtСC܆D;=w.C[[\.Ϩl65e*xۋ/".2v?9RsEQsoM$ |!:f߸q#Yۍh4ʶ;8m4L0+AҥKqrq ,k===+׿Uc( rFh4T*bȄ(ظq#S XFaXr҂P(/\Yho&gy&.청" ݍVÕW^{~!%ܹs5~e V a4cڵ1bƞ\OrYT סC5M@ :1(1HeH>G"z,CT`@>ge ز^g6Q.FDn/~ u<]njyua` E5D>gx*X,Ay˲4!@$&($Jb+{%."j29n0B@`4d,&("L" jBP,[86WoChkdJڊ>3FJhkkcK&u=Z|++VO^x_BWW># *J5t:!d2aƍzjy7\DS'~XQ7PY(4uG @eqN>\}ռFeaX,r'CW}}k~?~>. =n9C:CiCRL&$*Y`{Y5v8mmm qBQ|Xl^{5\}0L?~<ƍc̘1ZY5s5h.KyP3y^n&©^K;k֬a;+\p&O: 'Oƍ7ިQ]t.ސe}}}hmmxӓ\Xdn455q:h^!sAkk+"dY,gXmrrzRmCVpd;K/acƌ8SOq!s1O?4~`ƍX,<$ Bbi`4p8A`4^Ax^i.~tww1,]sҥK'NCEV[ l޼y֑F]w:u*VZUQ`I|*$ E t:aQ.ӃmNСC:vxttt\.Rn45\.7@SSSCІZ,kCYkbۄ$6 xP.ك)g, D]]8LZe*7Qڨ}kG$J[5U/MQR)7P!0/Ƌ"6o ߏ!C Ns bԨQX,1b r]jB3g_WȲ-_|1&NÇlC$e8Κ9(܅QoL|}"rN'L&+}1f|}cH忥ϔ`@oo/[!n~_*Q5N) {4Q7̪Zߟ:6i];r\LS:tf _x ':y!8{vϫAXV3cƌ3( >SܽI:s?#Ӝr! b]]],K~P.ctl6# b`Ŋ2e ,YcDz;[:Pvі@$~ww7:::=/w}YoP{xk^v3蹺dx:Ӄf^cr@O:t!P*pW_}6ױVHmy`k^QR \m[<g"\.#Jq@j5!o6aZaX 4"|ĈhmmeQ:RՁdfP X~ $T0.^'­?rl|hEѨ7Z:Th4"N#i0Аr^edY<`Xp(P+A@<nt l6 AP*!IEA<924:$ x7 R~9N&\.P#<;O|"f .jozg^$x<~EQ#cB$yﴱcbٲe*߽۪xC:*߫"~*FMyx^P t JubjŞ{o .wߍ &CUW]ޛ1P\.cD"j۝EΙ3'|2Əlg00k,|2e 㷿-\.ߛ̙3<?5B]f_|j}V+֮]v8&v9&˱ ϱ[oz(o7 !򜥺 tka4Jz0 xG1fxpg<-(l-D""5GQ.:4u:t!`4Ji&|5:ߠULcyf$t:d2ɭDI&j`0$5;)IbcRy:P~&UpBw"TZlM(d2B\q\5-7puh!FD"Bh4ʝ ~!N8twwlX^{-/ɾ Dg2VQAEQyMF#2\DE M͛oj&1 |_\MԓU DQD41DQD.c½]]* O磏>f{|^C!8UW("F(Cu!?j~5]G[CC:tl|>|>$ A &^VjGQ&DQ&VՏѨMQ@9Nx<,Xs}݇I&aƂ pW?^/ )(& &/}]r9W{>̝;|IG? />@s_*EncJs-ZdBFD"@r.J ˅T*I& .ԩS5]---\ T*ymmmx1yd݅^qqg!bf!L+~uvvrбz](88@۪C'uСCшٳg_ަ|>Y o bbj\.X,"NP(k1TTKNöȺ%T*T*rqg=)ժ*"O|5lkkAuR7,p84 D"Q VU6H&2UGۍ|>t:&x<^9n{qbرXd xH]tf3ytww-1ɝd4vC`RF5MzXn H&u5g#똁^OѡWPC 6h H&LPw"`~EQ|A7eۑ+p۱~zAc͆^8m=C: N# r PwMh&1–,ml"",Ν;fC=SbȐ!Xp!+AQ|#pP\ڵkzQ(Zs|I8 g1ٳg{O?]#̈bLbСCy[hkkc;׋l6 6񠽽t7nH$x<(J8A{{뒬z%,HओNYg@H2e;5>. p_F+0vX=_~f@E4bZ|:tСc )ڰi&Z_MZ|>ȲR4 \.ǡQ7Ya0a2vYDh}ss3R`[lhCMS2}~ ,Ce'Y}ɧ$5T+Dw<Gss3ٿ=Nnp\.c̙;sO*-{zzp8gTMcǃl6-7@J$Ib:zۨsJuSPq>H7՚x8d2\$?ԁ:p84X*kB rcKE;6([ uCe{"taI|>Ov]`r d$aŊ5jסC#8N8NHP(Y~UOrn74V}d h۹`Dt:!f͚?O=fΜÇ{ѣkG=' ")VB$V~ϝ;'OƸq 26n܈aÆ3z*w_Em_=>X /۱b 2D3Rey<FMON'EYs;M&Qn5Ͷ=܃_;{=vm7o^s[ZZō`vòe0~x{xW49)e}:tСC4],cgy?L&뮻bڴi>|fM "f3 OGAm|e7)F#, <ʏZmucX:t(2C3b J1kX,&;::n:&{{{Uvcɒ%3 ,O~5ϧq`ܸqXd N?t\|Ÿ;jS.52t_:tpd2xqcرN0j(*$sSS/_O<67p^xjT/tplBP/)h m ՍbATj`@$gВlI^7=r ~p_.4PB]]])-̤$#_zArt$1L B>{"?at@偀F$BrCXD.C2pNN5 ܢj" 5O8("LsfƾFVwuzrJZқo6BM5/*:EW<GX)r7lMMM0\TݑD0tP8Nl6Vu{CQ |:tv dYFoo/w ҽjAP`"F]^K[P͜yb^#8z*|M7NWYh&8fΜGyﳱXLNۢy*!L⢋.?; G}4MS쓚E& +Wa66' T*idS(`2y裏Ļrd Z,rȑt { 0n8̝;~;JSOkιd9iM6.CWW ߫ |:tбaÆ xI1c NgP'n\uU4iGK/Ŕ)SvZUOz< mjg~0A,P( 1?HXD>nn[8`.¨ǁTgDBIT\j<7oތb3l4A.JTՊ?OLQ1'Lj D[,A_jEJ@\L(j,YbȟkpK^ju>];VikiP u୺8ܬ٧{7|sMA6$Iy$˅D"c@sR &ZXl$pmԝG4G 3Vq:tСYRX8ucOO "zwy8bȑD"鐔$d2sc|$Akk+B~wW\>vEG?驧ѣk8JAh3l6B&̾0 lC:͛7x@sF#F 6 ϣ뷷~-+UVVZ [oy@$$IE םå^n?GKK =m~<;t_:tpe];`I>M >&=x [?;<;fy_ɓ'GUdm\f/ːefdYF:@gL&, Vބ&Mh4*x<шQFq6X}[*P,f&"  j[x<٬!- !qnm.َj¾F# b͂Z$J%&LM&$o"7АHV @Q>j}6Ꞽ\ꅵ,t IDAT_Sj?l[QGV$} Buй?C֮]z ƍ(H$HRK9---"L&;F;\ cä(zיafXŝz F\oˉkFMN$jD"1hq!q .2c~cUO0 ./g^ߺ!Ǩq(0zhDP((Q PTF4\VA#P(Pg4>JX,j`0X,# t^bQ,ǔ)SO ct FK/aʕÞ?a40L0HVZ:^x]ncXvⷿ-8̟?gϖYblF(nG"NNd,8]w|IL0!J~6mBOO=jx'qAѺ)"pf8N~r̳r= `ܹp:8Sw׮1(Jw܁Z DGGT*~?n7l1c*׿===6m`Æ osKPP(ZTfr- 2́ |!K2&Ta/|cJPVhg?3ѝ[+8d2QAVl6l6p N#\ 4%*öz^r7Nql6LdF[a; Z+ Vxe]x6 ZMX,~o}[={6V^* jUǎg?|>m'3}$8_G}4mh23C,Æ 0n8p%p;p;<|駲5_^ǕJ v%K```vx HPAPV8餓sy_tH'0(gY#Dӟ, sX,T*4 A=܃.yc>Hi A,{we,Ji@k_X,SH$ Q,5t8p8j59vsxxp8`6dhY0JX,F o04dZh &LZƊ+GF^9c4R0"r, g~lX,g];"#5N,֨T*qep8bk2n7gw\X\xȲh^Ʒp\}+QGE_s%'ێԱ0xn4H`C@%$"6n(@Y Ң@ +((((|8^Kg_zſh4" "w[.#aZ͌qc͚5Xn9*K:sPlTCbnf|y!ˌ|0'=\EjtuuAӑ#LZ-h4x@V<#`̙q\N#:[ 8N|>pߏ\.akz( qUWl;wN'ﮰj*#G}}OCq+((((E|8Cv Oa9=SNFފ{& @xf>}:r< Pwk4h4ƦvvQR(mhDV#qy\{կ~ѣGJY:F\F" 4Sڊ-Zy|nra, ~}m-u3"Fx$Qߏ>L<p:,<8s`2\JSݎt:Mǀ9vq+Ő_)l&Ih'Z#tsb寧i^ δZ-9̽^/,Z-L&N'&yFSi+l4ކJZ-.\'Rlҥ8-6VF7~&2xGHKǡWvۉ'e.K֝2PPPPPjZZfBtZF-2C2D8NDˢN'^x{ w}F͢sAC/^Lo2Zٚp`1}tGO#in.C8IwD~R>0A/݆F@[[a _-& ^;2Gl6OP:qTUTd\xᅸdq#h."e3X{T*aܹ_*l6ylذAftRL2Gq6m`{j"ϓۿZt"#|QqWyrlF#, u |>-{ŵ^ѣv%  6fC&$ QpԘ1c88hw_իq|[Ut:yf"}݇JχC9BR!ϏXƼJNT\$N; zVBRZ|/}JWE j5_($Nx'v`0|3f`ҤIX|9:(TU_,Q* h`ۛnpH:%:]FѦ&i6` tb2hEcA\^چ{}F kv`4+lHex71uTFH{pQGo͈`.T*X,^/mⷙ ^{ "n,d4V eс_- 9FZmDâzzyNsXAbb c2o.=\Xx1\.W󉢈l6;{o1{lU*:;; aZQ`4q"_ݘ6m{9r!$oݺ P6=[;>V\9jv{SR>J%{+_~ t^x!/_zhooG<GZuH`sj7fM {4&L7߼lEommmضmn0pcÆ Xr%N3g6 ZVFr L&|z pakI&s0AsGߑqVUb1r{8NCVCZ)h6V ]fF^GT2 A*3^dYʛY>swJx}>N?tB!T*̛7sΥsz͚59s&VX1$Ne W*uArJj42f.пB{Rt:-8zGFRAP^lYU.h4ʢ:4 ^/*0eIaa0Y~$|>X7p: ?h=Bþ7?wÇ~(ۖjr ٌt:۷pd2!?FN: -̙3 v>f=z48ҥK`0L-j5|><}߅qOq}Q?*,X/].6n܈ RxGXq枎"+((((0W¨QrJ}xgdQTOO>y=HA-lOƢE}v[0L8p#`36VT*!JRHhoZZF!.L&HltqJ0j(DQlܸSLAZ%W:h@2,ZEdB4r!L&It`* pn`|>ٌrzш'|ӧOa֬YE<`0h4"QhĨQda] Loa5;/cwu."XHZ d2C 1NxJ4v@ף<Ȑ`[Z *Jo100RgPPPPPRxb),EQP3с߬`bCXazHNAAAAaτE'&7H$(bfWXhJZ,]K,'/7tZ-v;rj5\z饸[&D"F0D(BT¨Q(H$h͛a0qF5 +Vy睇3f੧q1c.2|;ߡY/OsF#pM }2A xƍCTd~믿+Vg<xw`4)<1gZq2Gv qJ%N6XX,^+),K T ^FfX,}:::wJ%~RR!h{ÎA3wtG>eih2wvyǏc|0XXjf̘!+*Hڏ(HWBEX⍤͆t:P(D&JBwv>v79scW\>>(=P<~+5 Ej5Fje<`06d2dYfaF `Euшgyôi`qg?`0E><ϓ㜙 zz֭8S["Ny{~8=\,[ zºuzXmۨKwj枆"+((((58Np _f(|Zbj>կ~V?Gu>C=zDD16UsrɄ^{ ƍc=nX,ݾ@g9,{H[f3Z-2 ~?óضmLlm[je+u+oGq:D"xc~tFQqw ,,}MX}.yec6ddRϺ|>B FɄ@ @Q$j ^Lp}(^/ҁz~_&3Gn᠂Kc+m|COzK^2kY ;Fz}"}#RwVEXd>jd-uH`0||>O4{_;VcX,Be`PF\.m+f;XSqaa۩P ZǔJ%̚5 {,_>N|>QF}W? xꩧ0i$ qlt:B ܘg1Nߔy;W㏃y̞=0V9`„ p88Spu;K/ntA##YVe8y晸1gd2?>OETUdYT*!!$艢t: FCL ]3=;v0jdFg}c!Xb8 hFp:CbSliԈJlF\͛)C5͎h`[6EXf#Yo6 @mmm0 f3_tCHb$W^ ш?\v.N,DvxVD!Q[?mcv͆"V>,W Bυp8,b|]v!xzzοj JOo|a/kjIkjAXDP^G\F&VA 6l`]PhJB3*JZFI)((((YrRA8JU7wu.!eZZEl2<8SL4 AR>~q6oތ>pŋc…SXV%N'Rl.jE^ܹsap}p Ja۶m_᫠{/͛G;s~zl6fڨ3!"~?uGJK/T*wre %K`޼y|H&8pRK3ƜLU7)sxZT*Áؼy3 }d^xq"Vk83sKD8V*PIvajQVhP*4R*șՅt:?. jشiz\9#u3ĭ\lџdhfC0l j V Iq(̥b]ذh4:M,uBx<0x<}e`Cl-sI/n].~??+`ҥPd2X,dHfy;RH"t"3s3_:VEb13bj<:,DNjfdCe%u[,Jū+Fn6mI{i;XGMc^T*^~]]]t~v t4aݺuq;:Eq+(((|^lzt[oe˖_W/$.O?o6nfxxGp1p ɠ\.CR 6lb{vF"b„ yH$H_r%6j5b1L4 ۷o͛MjZHn 6m_W3gSH荅(."H 98GW^yFc88va] #) )((((|'{ww7u0apO>gҥK)O?Eoo/8Cgg'n݊͛7h4zGO<~zj\===m|QѺd'Yg:kDQD.C*B,;vNy6^iN8aDp.)"nVqvndY?'wh:&xR!:[eg@6&9ç~T*L&t:M??S;,.FP@:, yr;N¢E cƌA*"E4ˠ Lg |.`49u:n ;*X1JӉ 6de1\`)LoooҸnYLTo,4>fV(چB!:"pqp8ݪg$1~<@T,J@"txfox r1(b̙Xv-~cҤIxqnCEX,tuuрbr9pB1c ͒^h  ǡVQ( "Fa0(T*Q8Vy.rNJ DRkʊp"݇ZɄL&#`8v€VE6V/(JraHxAhdaYwThtlRA.C./ʑӻm) syt:ttt y +H_"rLGv2DQj:|`G|n iOƵ^K⋸ꫛޖ}l6 ,a`!cݺuXt)>=[~ZKP͆ b0}t{ーZakzi=t:uVZt:l޼b2 N>d̝;]t`֭ZPTzHy`]]]PTx1g<?~<:"'Hh43ꫯb8sSOA)bΜ9xqB?` (^ի1z]tPس%ׯNG˗cر5k-6Eb0,lX&s6 x`6a |I+Ljy~H Ǯ"͑o|YR.J`(Nf8q",mK(B"lOvrLJO~L2_ՊX,NGh4*YFVFygϞ:7x#DQD&F\F2DRAOO r`2Rfzx衇0uTulݺr4T*M&9_;w.>h~:VXzW^y%:;;qN#Wm6~5j~| {P=z48 r-g}Nh"N: dӹ.* F{Lя~gx1iҤ,҆EϴBErR){+ DB@/."Ckf)} Wzz100x<tttl=z46l@-8#ݍ?ZDoץ1&i@did2$I;O~f,Z \ʭt: NFŲ~6(9AEQ}bd2^:lض\.|>ՊP( If" T`6;z]U*|> ":;;e.ZBH$BCRltFzjbzt a`` X,F(vʞ6$CtRu]X,(ߑhۊjbRzD"زsfoZ!-ʰfHZd2I0 02E75>Z xOF#;;mtr2\G"D" C/`vvG 嘀Ϻv,YW;,>KAAAAAa8XtMXD(Zdb1J%w\6d¼yىN8q 'uyz~vZXjrZ V:""^/V+ 8tww'.+PyH{x?W@;<AsiӰ~zXX {5 [o"ChkkCR,ɓ'c۶m_}vZ gu̙: ]vnWըH&2Uѐ)"ʢrT*f͚iӦ! P/hfT*!N`EUrO7:3̈󫙈.u7CqP.)lZIdYRf2`">o&\! >@բP(#dŕt:M`q$BED"c' 8N?ft>4xQPN< ej:Yvf#~VUTUr'i;;7< 76 z#N[l\  t:=DViqlƍ\ )R eGlXDłP(@zer/DɓeC_H#tXPgV0AR CRzZ"SQ6mmm7J%^kS IDAT5k^/a qr\.SdY.((JPTH5QשÞ54H&(GEѣ/2<L&V`X1Z9A%1^Ec_e`$Zhz% |E5F`vh4%aZe㣕\!Jd˖-WThmD"T$d2x PRl6(* 2V1֭[G?a,f ,j5:vpo. ʾ_2ƌOpx ӬM=H$`Z1uT\'x"pM7\O1qDAXV$ItBP4cVqp8{4fPrmmm#' jqaltRL6ntR9sW_w_AAAAs*l63 ^|Es1>}:ֆO</QIDdµVd(;t H6TbQv`0dB\ww78 ^?L:O> y̾,?,{W :H<gbIlv* JJ/ltH(:lM֖[,g׏ LԵX,PTf`$l6L~w1qD_ nHa6UڗR$DQFVh K6<VKqgg'XJ3[Ҍ:b1XVjZf[JZEP@,!`Бt:{Fd4V#b:s T*_z6u)s=_86`0ȆFQi'=6NU.e9"^GSPPPPCCgg' ui0Rv;b, ocƌضmx!׿ /< ƎK8mmmOCs0, ̙{*gj5tttsz{{rO㬳΂(?>+s=K/ņ FMB1Yr *U;qԒi61e\~8sh8_|p8PHPj pd9:lٲׯ_c~$| =]F6vH99C.#1^ߒJvaXm6rWE"x<3[lmfB\fr p8F,K3[.Cww7N;zp8|>O#{). ׯb.d2 DljmǬYl(( 4X!"|l6mkhú7v RT* yzE.FXV%L3f̵D"H8Ь#GZduqt\DwN'ߤH+lr:0 jT*M zlV7ۍ>L֩&Kn|_V}ȶ8flڴ `q?v'vr!H\.ѐt:i ֆ+Wge˖:OߏS3`}A2DZbn O=~뿆l3ݵ7qϟO>X,ŋSgZcA\s5; (7&=Sى7o&-U*RN]t:lذ3:z}^geAEvE# 1""5Qh~ 5FMn1 HĕwP~{U== 9s֭ꩪ|8V}G0m4|j%Lg0 AѣqYg (dF$),m6 džxD$ Պ;vfl1Cߏ#<'z݋bl6H$rd2IEQ"_Dxu)lk<xz-W.8n@\(h ?x1T&AŢS4F@ђBgg'<~?\.\ׯ_I0zh52% ĮXiہГ(zTȖS6GEiT,NDbJEۆa:t:MlkN'0 k&2";Zy@Wc_жy&AJՊN#@ED"]+ p8(40FM>}]-G*4 n7b>`0:@uI<Z}49j裏b…8cԄqa޼y@9Cgg'Z-ꉽbW^ys瞋 91c TcСXd .ڬYe˖]0`0 `r!4UV+Z(Ge݄jpGK,ؾ/SN97pT*Ԅ 63 >4ԭ|Lt:|7OjSN2+m8ď'yorFz"B>G$QX;+V`ԩE;wTT7e˖-(2d !h_ċ? @$ŶʭtDQD:7$4K#sp8k.Od2UEQD*B>W|~ob|2dj8+P@dy5BJ%d2~eL&ap8h&P,Պl6-xA}4L&^r<h!H$I7#gOb i48=j@\I6UTOl4 ^/k}fm`0w+8GhZq?>=wXQA_NTw܁n 'OҥK-i3gN2$T'!^:6j5A@CCoYy`kHu} Y$a…hii'3f+@cc#jkkiFpl6x饗k.lݺr\r /^̪ qx1l0zo /'Y`0ƥ^: ogOj /7Mej5jkkY,Q(|H$hN4b[XPT0Ͱl2}If:idyQGa8餓`4q9{hD&WuD N̗ "|>S̰rzN&wˀ3i ty6Xt)p9>ðazbeёH(bРAi/$Ih4rtB@m[ŋN$I >Q1T`A$R( =D*ZyRm0m#Pik_1^߉6EP_cAB&rzI=X t/+_]NQ"@&A>NS9ICcYo<_qPTBI"P4b&^AnGt")"R`6 dg0 ƏgEaƌ(^x@u1GyXf :,r9 2͘9s&fϞhdxlsIԴG 2 'w߅…^ף\. #Fa;uuu'|Kb۶mhjjG\N^2 ~ƒ0P I5 >#s9hllhѣl2pz{EO{FQVQSSC=K:FSS4 vء$v\I$IFVD$%b7i2L|A ƞ}Y 2ӦM_|ѧhH ՄX,!DQDTB]]j"Qo}IF1E|ɺv;"\.L4֨hZ2X,"w}M'ߓj¬ٯ" rlM{Uސ[t:J%hZ>A$ŪX:X*rv;jkkdh>ٯT * vy*Z˷SE[>=zt7 #Psif!~I, R+~Bw4|&{>hPhX0 YR ~^wfΜ/۷odž pck?`0JN=TEf#(b; >(/_K8d2fjY!7kZ* {f:@2a A RRfߢHfÒ%Kpc8q +iPT(JصkF#~?4w^nC a2fa2輭[$aرb1j#"f3 @$($"Ӟd $ x^(^'c#5$tc. lRqJ .!/ ">}ъ~W N;>EL^m%`V%&9W_Um„ "dya`0w4 h/Fcbر6m.r477oƘ1ck)λ(" Q{@&|o:;;.-Zkfl|`455'808fYŨU]|hnnȳU*Z-rz^'~Dv&@L\.Gxev ȯI"DTBmm-9,[ ?|'JImvb"V+z)zsI'?|o' qI3.!3N;w<xꩧǃ￟.O2׉_Y"`ԩXp!*XVL>ls_Rt{]i\f"GQPհlZA,D"JqAV#j rӗ T[NyУ\*dja4a4  ʈVٳP?BVKova*[,:|^~& 6hex&8<餓lٲn}*jh4aɸ+xb]ӧOǧ~:Lg0 A֭[d0z}=^*_7P,OǣFuOls*E3!>߇v^}Ul߾ZSLF$I" cB.C2i$+GI.Y!86JD" 뻉r_*J 3rРAF ( P]%Kh"\o@jbǎhiiA(l&A\`dB<LxZn-M*ƎK9 @lӶ&cT*!CӁyMx< \.ZiCFƍc&F dYZ@ ,c 1?{ld AqG/8qC/a>`0zƏχ Xr%}>|ر>>wz܌s/Th^0ޛ(Racƌڨsʕ1eʔ^OZ-͈h4|+$QS~ޓM,I2 L&r\fT FftvvrX,"p@ ʱXnN>dlٲ^S[iQxdhPCnq|ͯǑQ*v T. BxDPbz"ǯMNa4i  q1 kJpWO==~oر[1|]N3fM  qs`?~ c/2l0y*ܹs-wQGa8Ðd`XzӖ7(RDPE0aژ6n܈aÆUL7$zo{h4j=,(t*[ N6X,b:th4 xG2TNBf] q.;/ 4#d2d2CKK ~aƍ{W.10ݪL&:;;dp8 IсFt:$IXV*Dr9̛7&L(s8$$߫j(^ Qa$Q4hRDQ^R4–ϕJjhnFN${xgoVt91n8!CdBEpׯ=2+RH$ݎ|>Q y-e `0?Es0j*q+0i$466s= 6|>J~yY2 \V%\W_}ѣivYGMz~@ B>{xnZq*^"KP`0:pXqgMKK ?[o矏_yj׿0|p tR׿駟C{ `rh4)1o<<#{ ҂ Rg6[[T*t:*rkZ~튌l6K+WdwmNCH,C6&_|$IB6cjԧ_d2XГ,Ij5F#'qyfn8NV#Çc=?-UW]53 U}sݰd2j5R.x:::h#bۭȢN&0͈Xd ̙ӭrAEB~e]WZ@uѽ+mozB$J%ydYYl~f~EE!C(ʩFcZ4x(33vP${!bD>({=T*L<wuF 6( N9Ө՚qJ%:F+(3gNRu8N'2 K{:`0}A,ða0~r̙3?6n;n~9s&֭[ns &LGcDT*$Ir9^&Uw,Df˅Pٌ> +P|^:(p\ra@D\.SF=X,`0tw\$ k׮ESS0R@ @3{(b0L( {mۑH$zJH$N"@Tv1V{/K.=c%6 ۶mCmmbމ% ̄ax<J%R)* D'>"Hyx<dYi$I=1^B? vQ@M\.J%\uUtBrLvHcgZ Vx<A7*N A`4v!z= FCZY<]Mcn;Dcc#8֭[ˌ5 @멐'۬V+|/Iz!kg}vURԭ`'F=5 2  GnmQ[[~\r ~⣏>RTBqx0l0zͻzj,]~ ?Z-j[^w_ 6ƍqZ0 $ Æ h{N@Hߓ@m4)IVX;w"HҬ5H˖-Cmm-2"ZF$I*3` y7A!"0{ުVWl555rhkk=d~KRQX, HLVjعsLAUMՑNRD+LV)dYX,Fb_}8L&7 R""9$Mm ĊF^I! fKD'63= " V$hZzWܹszQSSCWڶ|'8S7Ovb-d4 J.N39{8?_|k::Ojl޼@>ۓ;`0|Jo2 ~W MΝ{-`dڴix[oo{H?H~70`0 ƍøq0{ _믿7ߌnf3?쳰ZB( =z8C$t:zA`0أoX qT]VRцZVa7%fypBnBlsMY"kT*ьfB4(8Cq[wB! 6 `V\zg x<m݆zC5l6:::hsUb3Np8PND݂2$CV9Ip:BZTl[`FP兼(`0 v٧D7teWjdQGoB… q7v%IB>JD3IJn3%'ϣ\.&<# LYaq(vڊt:M+nJ .q.cc~X|ҤI8#sjkkm6D`{u㡍02 ,$CRZe2nr Ih{~u){wpS!'jI6 ƣ?bjŮ]sٌ1c`ŰX,8q",X믿7x#}Yj52>6rHcUX 4_V#pPrS|˽JEQNjUdwtt @V}}x<|hhh%IjLMՐ$ w?ŋCᗿ%&d[3 :::P*R@-t:R)*nLjqS`4VkJqV+~?yr@Y~=>s]"sD$I߱x\.pL&C$ p73Ŀo?Պq/f P,V{x~!s`0 F ,YiӦaرz8=d(X~=-[L& ׋zSAQ$*ZZ-nW_VD&MЕja6H$>}@z^h4TP8PfWkœ8dYp;v(F#jjjKxF&r9r9t:z#F2刢HX"t:nv0l0 s18S1jԨ=nKrND"A˅z =>S|4xr+rvQl6 X,b֭hmm *a6d ("{tY$  *r9ˠlDƫdjjjH| 7t,X!" 8JBT6RukK\.ӹ4^G*B$dBmm-2:::t:FW^QӘ1c=@W5ه$ %"2F#O>h;tPvi|9ڊ+ qBB bԨQXv-L&$IX,ttt JѪ@r!rH"̛L&zB!L&EZ HhD(ꗀ_(`4b̘18q">l̜9&Mڣ4+?1{l<3#Fjz-t,-_s̏9}  g}O/&?=1qDlٲ .ǦM>U%ȭ\/p(2áVh44C4T6%@ޚsr9zSi+D{J%D"zSh>镕 n5_ub7C( PTPؽ{7 ^/ $|>:::tfB!O,` n7nFT*^b~w}7n@]]N8\ve8#,N<::$LnvZYVt{ǏW\c=---8è~4E.C:fÈ#8MЀNLZ2jdY:s8mK2{ :EQ* AjYR+*x<# 7|;w\I~7@ ANGҪF!$Tc׮]hnn$ ~TJn: 8T'6P= JHwbZP"d2t=(9/2"vd0 $IH$0p8h4KObʔ)(rD"0p\r0zI~J($bq@q^l(J}&HDOO?+VT* 'x">l{챬y{/_|/"8 Eym=qDx㍸;~[`0 FF#GRs9dСضm-]l͛m:444`ر}h=w: Q۶mիQ*O"_GKKKK2^\hOt&lܷl|Az"KcƌA[[8j Wr_r)M, 9rdϒ$ 8èxގ:z7w\̝;WH$wy׿fh/K\y~6dYO?+W"͢\.cȑ{0m4X,Z466B$j"oF+p \Zɏ!yGENңM?J%R)!JU}F%26zg0DXD"a I,XoZ\r=Zh4ľT*! QᙌInT 2 p8NH$0h T*Aj+E۶mS̳<8~'?$bPވbX,{I~kظq#]p}@ kX,F+ <(`$I$ "L*;85 J4 f3>SxުĦ"X@GQHb1r-1f<شi|MX|9.] I0d|ɘ1c&Lg`y8$I–-[b͚5ظq#6o VrI&éX((J(Jz444f9!7W)rYѷO<`0(*o~0W~P@}}}-wN[X,V=H^8HD@'~@qrP.a٠Rfa̜9wVA+y.I!c"`]O-1H =a ㏈ob]r{RE͆x<bB[9$I0w\żaXVh48Ntttt~azy^T*r#rqr,˟`0/$IB:N뚚 DQΝ;5<=FCz8k$ IDAT4@7+)yD"h4ZYfٳi*?]vjիWg>xǙgiӦaĈ^]sŋqhZ,_\@ `C,JڊC=G7z+ O听pZMJb\.h4Jvq6^7VZDv#G[o7oq׃8:L$ W|WA{Iv!V>tH&g%LlK0FsE=bhL&ֆ},n0d@W8liiŋxb|8؈/fZF* v/_oH&:g9s&N
[5^1Jv#ZDQ:U+3zRLGQ* eB!j#Sǫz<ѓ"$a[VND0dlݺzjZ4 U)?"l:_ō墽n݊:/2}VŸqs/v;v؁7noo-U{ dHjh`X%OjjjRB0J#e-t a!Uv/ɠzdn$AbĈOpqm uY0V+Kr&X,y\.ttt(|rn&x'xj\񩭭EXD[[.1>ݻfߕF^%\2O׉ L&aqNzjo~?O0 D"lW]N* rQWQrGOgoj׆rXL&:E~8nd#GFA,qGCRQsr3Q,L&a2i&.RM$I0avލ+˖-<@JDK5 <7M2yGGG$fEQBYg!|nrr6%ՂKTU텀}fxh|,wy>;v|d`6R0dDѪABzh4JB&^X=hooG2`JBmm-(eH 0h r9;\*`2^ 8EX cƌVE8F2DTB"?~[n֭[ڊt: QaZ1tPuQ2e~Ux1vX\wuT O&A"6ZM7GuQ}:~W8  8N` RxG `@,Sdp&G\ p[b۶mZ5jϕZ1~xyrxSO^_!亗\/I׋#F`0PՈFغu+=8 ̛7#Fq 4-¼y0k,;{dw|`0#Ċ+_0ݎo`2dz؈z0zhEV9y* { C?زe ^y|; ,_ SѮF3} d mJnHv8hD"sG*(DQD<b":ۗdP(Q(B.fQTORj4 `6Ndi pfjqG9C6U/K,7ш_Gu=\mI"+If`zkZtvvBVCR,u i"WPjoĪP( ˡP(s9i, [E[ ATzp+WBVcԩ~(CVj ۍH$f$It:رf =KRp:0ʹ. c>H> (RT*EŌ+W*闿%t<^/ ju9#߱f~Xx ,Z.V裏*Oѝ̹ZE$A&@XD}}= ߖL&hhd`B!lݺU5{@8p`0?\x6D"5 n7bc=C ދk^gZVz A0H&Ԧ2 \.cРAE`LEmm-M_bq' 8hd2O>۶mC2w QCd2l6VESh4~'x"f̘;s6|?>^x|Ǹ1w}=&3 Ç]wgSJƮ]t`_~9le˖aɒ%ؼy3~=< dp'q(4Ki t:ZvFIhM/v ьxIeV+<ȪsP gZ]lgg'<T* t8ۻ5d24Np bA* 6@`رu:NL&ڵ @!zղ& A,(rB*uKYM9ýދc9ӧOGcccEYRf0h_{{;s㡖D~-.XVa>`0CC`! شi.qpǎX &M1}tJ;/P>aj̚5 sA,íފLjțF":fDZX Z:FNJe$JB}}=4 @tt FGKRL&Qe}A\.ݻwD'%ֹ\ JT*!rQoUɄX,زe Ν zqw /G}ԫ_}5H b fU"$uj4hڐNi_ł\."4л'",̨"̆ pUWrgj,d;T*! N'"jjjFi&Ae&R@׾En_4jT4cޢBЕ}ߊt: n^G,bA<$`p9Р!&4J&ҁL&?<8øq I:::vV!Z[[m6455 ؆"} Bz4Az}H$Փ* D\kaÆ.UW]+Vt Bq2tCD"&z^( |h40(H JJF_iyfzL0aL^?1=^ ÁX;(9+?U9瞤I H$,AmaVX-~HF6 c.I,l V( t9U}y/]3=#"kw&uwuuuW>ys?OL0a?lrƅ^;k֬Վ˄RWPPPPPL\nUbсիW*@p x'apchoo r};Xc]ZV ѷz+,Yg%}L^g)L) k*rqm6P;FYbP`ױFri>QT0 y<Ϗ( dY ͢X,d2AS){X,3RhMC;8a<8S)6 RѢE{pE'b NfP( r\.>tp:*A@GG0v 0P'I}-0z1>LBR cd,+իR(EtM~(\.f3"m7 ;&O7fd2jHRcϯZ> C$IW_-{<=kFIሢt:MvJE;t:MR-[_]WX1i(r!! B8 pݴ`t>lذ'OZGoo/YL& \.h4pp\.B?y`pWCE̟?~̛7wꫯg?CI0nv|XlMLZMbf/,Q8NÝwމo̓`@gg']#d2ItOx6:m4a T*?,hс["L~f`w3i$I_?Ě5kd{o1}t<#?>N:CI0, VZEQ:;;qYd{8sf[nA$'{wv3,GjZCE 0 h4jH&T(ST <#_Ν;JK/!N;濫-VXЮF!p˟+h4:mX8xY8kxl2?+3e_rm߾V,xT*ן-V n`0 cH&x0m4^/k2ݍ[o^x!>qywfB!t:XVz>r d2}}}ɓh=)SȾy~\jX&EBGVS ^|Ep 2?_xGd{V[ǔl̟)ǂ&qPT0ͤ$IVt( F줟|ߧy]w`bOb@8 YD3gAOcW*aֆd2|>Oa(R.0 p bΝb6?|H.C.XP<'Qb5 "Moqc۶m$`0+ &hlFƕJp& NH[dB!J%4Ekk+xk;A0gΜ}ߑ/:pw:u*.\xH0O?>6l0ɿ:J_AAAAAayg>ԛ455AR!t7t~iHoXhN9T}-IRC[zX Fit2;38>}VSd3c--C hg1b9H^! cԩm۶ntT*!b@R$IHHR7{صk}]L6 (b˖-VE\F8&|E]z oqu>fb@zj$JnJB?-ǂFQ=.sjJirt ~ds?. ~chtb`` >=Zz:XR 8\. =f[T QIh"Y_O:LD"p8p:p8PT( ,B|r\|;2ַ>ƚ2f\.cppn yeRV6@fQR.Q((w8#ȸ,txG*` /I0w\CS7|3z)Sb1*4"n^7A(bTX~=Z-j5&OLI7ޠ"gDBoH$dJ}L&p8ŨO<^|Eۣ>r ݮn;4 :Nj5]G,6U \V fνǡl6j6Jg{TII$1>7,5# ] :KDב~+W"zǎاǫ/sP1裏ƑGIpg;bZrRp8L^t>"rGrTh5 T4 Zj,kB65Rf+yQ L/{]v$I(Jdk4TZ<ӱcT1uT̞=iVVfvDںGۼ',q8FcCg}F ř3gbx7'`ƍx饗Ӄ^??cx,I5n7L&477'ND\F0<ѨώV;@b!H`d;T(p-+c^wɄZFSlQ'QXߗ=s=WUqu#^s`qnf {^& LAVg9sP.>,)!]vgXB/ QqqbtZmXFB Ν;kIXD?YFN2կp뭷⢋.+fWGQPPPPP 8Ç~|>OeZO?{g裏cΝ;!HЂJZ?3_k4邚k4uYSL} ^'}>G0j^ɓ+nm6""=nҥKqQGaɐ$+NCV7\챂9SB!njz#^(?ƕW^]v[oT*!N\., d2h4BՒ›-r PՐH$`XF-V/J{\0fvK@/Bqb֬YAf3<00i$D"Ur2 ,V+-6}mI Vq{9/~DdX8ffCPׅy|>R)Ahuc\N; p4b̾Y;8L&J%TUz$ bNEʕ`al^?NES7{⇯wԟX?L"pȬhvIH$"+3V+r6W׆Y*t'm݆<;(8dW^y%y_? CX9(|8\pxU^/9W\ 6b`ɒ%Xx1|Iy䑸ǼrrL&CrJ"+ FwV ݎ-[v{N<$I„ d !żgJW3^OQ(:hm#~)J4UZ \ñbt" f& p h4R&[>x |vR)hZWk=,O#Z-V+rc+.'?VK1Hv2 ~? N'0, r )P(4T93H>[lWU{`AR`0{}Qz̘1\v^}Uz|>ZT*NDQr9̂kVT( hkkC$lFR!6f_*jL&eM+@f|O=4 e>H^S3;)V+5X5?N777NCRQl6`$I$ jU9qc̙X`Nzs8j}}}Pqy>(O׿I&⠠q83f(---裏t:7o;0Gy$Nlڴ yv}Ԣ;dEiRг) Xloz=, [^@HɄ]v)w(Tr[_e$Ip5n V0zQ.p8m188(gj36<,;<8ӱb CƮ.C BMj |>f3Fre d[8].jh4B!XV X, z)L&z,6Յx<]vtRGɼr`00882$Ip8e4A@<u8"a``M&(0aM1k6ŷ|rhkk娰a,6#L%kdYTUٹ{Ya?NnSl.O?;_AyLX6ER T n{.y;[p7ĭDQjذ¶_gj'xsϋN>پg L&C [OE| MӰX,tH&T{:M۱x<AH&Td2ztO?4=SbB}L&a2L&t:N1i$RC/LykCJYC^?Z Bܒ$aժU ]vqpp|>px| 000@m#}4!v~X,b IiVaX:׭[_t]q\C$I#0wCBuBF#5}Y%I3;fyG'f8<8qg+q(k{x6m-[O?ncR> <n}.*|lǡ{, W8"A V%9+2~N: ~:f̘>s9-"F#,R9fnx<`„ BojjB(B0h$j b$ \pN=Tvahooy睇O>dBSSĈB#?}#^/j0ىm۶-7T*W^qw| <DQĎ;t:fxŨ|~5m'i;F#L&jy^z˧~* M u(BV#+" ł۷"_r%tm/h42~`` ,Xv4Qڰa"=\ jp8 I(8lڴ jzǡN wXAAAAa1 #>3 "zx<lr0ųy0e:0E|ZFɵZF6tFףP(l6f>r*BVy.`rz>l6@< z&Lo/ޣ ITBZ&nǣ> qy;( |} >TLš wq֮] qe+$IHXl,Yr+Bv[ZFGG6mDbl6 ñEշz j-}݇SN9'NDZE$^'x<χl6nlݺ`ͲZ18^oF o3<Aa6Lrh4" f pf꼯}ks=GIx<>bŌz$VVBZZ '|2PO}0Kt: # [fFe ]yYk̲IN6Ʀchok;<\z8s隂MrZ=D"tttb```(VAѠ@? U6!"f̘1۽Y}饗p]waɒ%㾟FY7p/ˡشRWPPPPPGAҥKiLSGss3,.vT*T/ȩj!n7X訷bagfaW_}5n:t:YtFظq#֬Y5k`˖-E4%+JÁYf/ǙgI~dfYڨ~>d2L&͆͛7mmmرcAdE6%E"[JI&aҤI6m.Blܸ3 )"ٙb{oX>L"h4`0۶mnG<G{{;,,x<(1c/^LqIt:{faĶY lٲZ] pBiԿf}5[j}mX(vCDlFjH$veʸ뮻[l/^Lv6,bֶ .&k1qDXV*0"Ayv_ߧϡD"رG6ݠ0~N'B2 &NH?b8L$"믉4 n7z{{p8[qnC{jƬ AZ륢?& @#C`0Ж:o IDATu0dL&bN>@"8XP49ѵ:IFc7MLu]2e ݏ(ذaV\H&C4EZ%UBKK N9̚5 SNEWW׈ RIP(PzTfaP. ^)S Lh4j\.#pd2d2AEDQd2tvvO1oO?>o05 k~% vY-0.J;Id>6mZ\34$tYnR0|ᇸ;x{VJ]vfxEQָ/jXVqtvv"}P*͛ev ?dֆh4J!vh4bǎ_^˰<(zfmN__Y2j5麘˖-yZJ~l߾mmm- 0L|Ѕ]04)썒T*YjrldhXd?%\9P0#vm\^Opꫯ%\ &/GVM74B'_-RTB}/+2*>k/*T*T*R} .W]uwm݆^{ JZ VSL#83gDwwX=ÕNl,|_c.^LE(F}}}X,ZdcٰeL~;h<@ ېD"6q."hz*=3@EVA,b6:|&&LIӃ|>?2k 5>q0 p\Bfعs'}ֲzՊD" V Id9@ÉD"xxbHDӆй60!R)j5x<dYhcl2\hnnqM㎃^'7f800@ k.T*jlvd2VT*4-`Z΋fOȶ+JA@cڵyLX1j:I~T*kòDdZbq'8OaLn7hku~䨣E]Y2a|g% RN>Gu6[fJEVrX|9.w}7~Wh42x#DQV\#~6ʊd*AnPThnnFZJjm C|>O7OԩS믣'p2>̘1$\.#>HPP(P! ׸$IdQ*YXD6T*!#ɀ8ϯ^f "}n0[sCz/qVJ n<lq>3\r%tW_}gIֆd2|>/+KX,6f;NCy l6R,nڴ B . tWTzd2!+C6 صk|>ߘ`0 N) Պ|>|>l6 aۑrkjl^!:;; Cvf!#ҵYl6cppPvN^\g0q8z#l(Ajō7ވӧ㥗^¼yh /_LAAAAA8az30qD<Ӳի%IB.#pz[JZMP!^qer,+tEVgLa\* Ǒ[4RsP? |^5L%h @RwڰzjdY̞=:[l#ՖF)lDܧ8dY8g _m~ Z-&NAC'Xx<EDLV*HWThAn6)c! BEP(Ț,ctvZ`Pwl.*^}Utuu]( TTD,C,CXDWW]zb18N~.`e5|~RmYR { T*a`0Tm2hC=EaݺuTf{ GAAAAAAKĉQ.eVLBEGS 6=rtyefX L&(ϟ˅JBAhq- 8&L0f< U|jaL[F}Z=hJz˟ TU 5kl6>|+rOQ(q(1;%IJIT*j*S0uy>$I0LaTF*ϞfelvEQ~뭷($矧 QY3wPF岬,8&eR6}vY7|X#VBo׿ׯ3g/_O>Yc9;w.ӱX SLA6%}}lZh"ǵ^%K@C ׮] Kχt:p8ZG:|~1Ί'z:PrGz=N'85a^sPPPPPl6$I@Fv9Fίc 9ND"x<  *j5ʹ^oD*]k B#{AEZ0VL&C ͛7ȊEsm\s5xGS-&Q _|o6*[Okk+j5N#z$IBZJ2 SCjPv\ը`h(-X L}v[Xby/Js=O>YVe0802 soa|JLv[=7p?F?H$pQG8Yf ,MrJ dl F˅ZFرX 6L&8^/[ogXD,fdbq=aOVHg}+N1S>/YA5sFz^("J(5n,:;;G,C5oX'vqe eq"@\FR~d`4QVe6\U'j}ʕ+QV1uTOgMmm &-Dze{Ap8sNR>l6J% @Vn#:i”}?|xBc&MQӂZ* ap8P,188;ffz)XECoo/-CF Fu>U*] h4T*$g>;b1Y5Y~}U(HdFmFY#yx׾WƊ+HOL_7"g8`@U? ,ė|s=XdY_N\pV\'tlYJnJBSS6nNG|ִ8^@f:nS\*⋢Q=l6KlX,(Jgp;~B ۗa+(J?UW]%S$mop,X@Vx7ϲ X(k>v D"t2F mmmx7tR̚5 w:,ի`0>SJΘ1}}}}wUڧޙ`"A`k@QHQ!%V,B4Р$ DڰӘrʜ޿?~LAx{=<3s>}]ZDh4p+><ϣT*l6#Ny 0h a޽$H ᛅVE$\񘖁y|kmmh,qR$X Պx@ތ&~뭷pe8Z <#`D \*'DhDWWz=Faj42e?62(Z-  N;4㣏>€p'N\vehbbp8f+.v| h޽yjj(ˈ466db\:SX-g̙x饗*N(y 0|뙯L& afj,YSNE]7Æ P(p)ж2ckk+<]]]/QUUNۍX,D"AEOz zшݻwl6V7 $H8scjx<{j%ow!NWL OtlƏO>W\qN8$IxPy]]]'Az=R݅V J%d2h4A:J A G,z=Z[[iq"uV;H u C2zU8L&;§~X,;@}X/?d24-l6yW0j(\tE?u;8+B"%H A f"Y(^bC1_~%<-[ /><.""iП'x¶y2LFT* EJ>~b֭ظq#F &?ǪU0{l l4QHqIjc|g i!WK1@ @dZFTB:F!eda+h$B4!p 0 D2`0HS, ja2t:Ũ GLX<o#Gw_܆bHĩNC8coL&D"D"\.GA0]G|p`SՊ]vaѴk;#: /tۺ0u d2R%IR'JLP^;!Lf )S7oE]D8qLJܳg&LPg`6q*1*i~npP(d2ImٌP(D9@9eٰqF񨮮VE d_WƢE0vX:Ov;)kfףjQUUUoX墠od2fEtttT$K AcVw:݋ b:NB!e(J :4^fR zW@l۶ C 5B7C)09b~?h4l6[Qgpݸ۰`&|+p!$H A7[\.SO=֫BKK BRg)y=Tl6iZ 駟ɓQ__?Oؾ}{Zyt3*qD FC)D“?[jƺuSOaĉ8Ӱc[7nǑ߽ gAu0 Ύ#Q yr(M*-  P(dFT(JfHӤPFzšERv&LY#nK.A(† 3 BTt"d2ίl6d2IĻN#!l<٬R*U$beJ׋}QqGCբ rZ @GGl6$jjj(Xraʔ)?~r9f̘[P(P(mXJV+uD"^g?~iΝ38~)x 7br8NeٳL·l6<urjyPZ{*zX,"TX|pZ \( 2>fNڹT*UxG"J%f8ttt@ףX,DNKK ~SOs=GNKp3Rv|:zBW^3 D" 3,D"t̒$ J%Myo~zj|>~WmӗJ2Kh cT*[h4h4Vp\..ۘ:u*J%&OM6^}U$ *؈I`03g9Se˖~UǡT ~vp.gJ󡭭gJ t:.e3ĉ'cW_駟kB1zh{x衇6WWWv;F I۷oj^b ~?4MW|ÁT*X,&$Hp qjkkZ?;4@|>l6`0ɄL&N|>={jy pp8L6Nd gL&T*X_=<.\g>>l_|zL&C=ӧ /_/A $|8/U"!|>>~gD (H(,tT.kJJ+XpP(1-~_T#F #@qNwY .V}݇;o&6l؀ޯ=̺CRa߾}zRFif6ryrkZl6`Mvij~Ž8 dYL&^בH2HH$BǎM}>)~?u]q9`޼y*/D lRhpg[H$jueSuDnA{nx^L&8?o6 7o8jE\&p:$[B@ JE@=!.1J%r r9r<_q|}QL4 _~9R +V7LXl qo˗wz=2 ݋ÇSF&A2${*d2 D"|Xv- ]Ç?O fCx0}t(JtMxGcc#u{jUUt Rw=@VSחf\.GKK  z>,4 ^/"(0rmضm.\H/ PTd8hR,f8L&o,F38˖-w}7A/A $|Kq)`ذazUӰbKǑXlt< b_uL&xhhh@CCyqbժUG`/|s`Wd?v{gn _~9a83dy(Rk:F$qp:lHRX/Jj8p :::zIRu"{w,8SK8le(ˤ~bsZIy|܌`0kw^\]]]+qlyb{ vVL` tIѳu.\gy&n#A oH $H @.C± eFαIkԨQ=h$³X'AڊUV[y@RWAD|,\.(X,H$dc$B8]12 mK`,3Y tf B>G" OyJg C\s=VL>R ӧOǂ *t 6Ċx6/S( zd28p r9<";8D"Fqlp8 կ~5k֠/2Mʙ}lڴ >lNHXb QבV%bpL&RZs\wI.;#ݻwӹP(0c REL0|A>>yz\ vr9<R. "YL*^N'2LEaX T aʔ)xsO~\qn:EniiAMM N8466b޼y꫱n:@k׮Űaoi `ju/.k4hPSSSQ,( d̴X,hjjn'EV*gߓte >SP'q0HR͑Ha`lF2Dgg'f2dYvEh4lڴ +VVG~TPB?~<~`ԩ\\L!e [D466jP*磮\T*\.GL-KP:ܹs[oaرXn C$8ܹhG=+q`mXD>pb. Tjb}܆B!d2EwǏ'bTUU^I'D, Ӊ@ @FAKK rX,p8 8g؈W^y˖-q-/ǐ!C!LB@cڵXf ~cشiN>d 4dtJ| $H D8ŋqqa =3}ݨ{̞=U& Ǒ k1vX<(J8p $)ryt~ XrD;NE477l6R}9vr~gD6s=(عs'~ߒ ;NZ<`)Ő !N#ɐMhĎ;`0R(FHl"PMP3ۯ+~@^ H pT*ax+@tR駟\Ny|>e\.ł\.G>H|[5'BPT\+˱g?Fgg'Ν| bDjl&LСC!ɨ#y+ h4w뻕SR)_,=>KX,Rn;zkXn6n܈~t>(.RZam4RV|>j444S Q,)L&'|cOǜ9s0c D"<vލnNFaX0w\L<SNĉ3`Μ9thkkàA踈CU*Ur q\E68$H JZ[`y1wf3l6u.F"uvvBT Ǔ~ t+D;2 ]]]`<;wB\15nAgg'8#AʴlvmEC& $nwLcx≇DK A ?;ގcJ)5 ׯ~oPo{k֬W^ O=y {_7xlG5De\LHBFLRZ I𬨡T*Hf7x\F2c$z>GTA=܃ ~P*426oL @ BL&C;t3D4e paLc(.]u֑~zL48ax*p%D%H $H BV㷿-oNo QT:u*N˗[oʕ+q)`ҥkHS.<(Jyf BO.fd2yf6m~?Əшz \pZZZVg*S<0k6* H$d_'LRn$A<G:F:& bB\NۤhP*eާ{P(ɦMjhh4n#RdBss3^u8NQ*4lJ&;롣>O5;ŰgT*L&g}u4 l'V+ A W IDAT+z  \."1m4H$ze0Mc\z饸[tR;O<FIg LL&<8 @^KDt,!L&qg֭+RuM,Y[nŻK>꭭>|x1P"D* P&PB@?l gc}"+bŊ>CWPtΧiE If|>ON#K N\.VR8@c[WMW\q^}U^PSSF 'p-/ˡ.lZ[[Z~=0||P*0NT:2 f܌+hH } $HvƍݻI!J`4jiY,ZD" cl sqǁ8x<R)ٳuuuj`.T^xd0^/ -`h4 ZA[@b}0D`X~}SOw}]zC"%H Ao#G $|sؾ}{wp8p`ܹ;j*s=2e  n7 m6=$ɄRD ۶mC[[֯_G?FΝ;1nܸ "oFGQ Me*F+J(J8y:ZzC ^\.G$AMM mۆvr)x|8v;yfL&m0`4a6a6a4 {O?}{gŠA0l0L6ZYNg<\N:; r)y].BP2\.G> [RjwI6*lR(dv#@/+|fV!L:7BJR\.IUt}>T*f Xs8qFt644 NcNnd2ٻw/FA 8_ 7oƼyȂI~f~ rLAs!A xwp9PNbA&ATBT5}^UU^W*j+.vtvvB  t8VYQ@PD ~n|@=BX$ -Jb0GDvZ{ RI@N&e\|&G\_m/q_~=VW^3%ߡ $Ha޽qeU(1%$ XVl޼'O>ommwߍzAT .Bj V+$2 25LUU݋㥗^¹ a(J!H`̙8sqf΂Nn2H1l6{y] 02]~SNŝwމBr VKjX,F^1~? h[ C/t" S1#j\.C *&yxFϘzYWC$!Dss3N'4M<,j5-3!JX,VȳULbb1wy>ओN9眃iӦuj*d2ivmx .-BjD"AE vlntmm-d2HZ+v[[SKI AoF#/^;S0Aݎt: ٌ@ H 6 n( I.n#Pcxpݐ$`bVx<ƈl g:HFqA}}=v;^{C^> WNmG4l0mБe`2~S$zo~??BcB7!% $HpDގ'|R"l۶ (H<.x7w%u8tu0zh,Z C6c=[Em0_1czI36`dlYAF!{71D`gR)j"E.Z&u9>d22 lB5RH/vcʔ)Xz5,X͆`0K}^p8ގv)7jhjjB]]քyT*d2ZeEalba2` :HwJd2I6-ЭgD0>ltl Q ZZ>LmX0g̙3@7ѾyfǼyxh֭[_(J6lz)>QdǔdL&oGKK  rBu($I~vA`WjvNG5h3?/F޳7V.K/ō7ވAUT }:|Aa2p8j"CRQF(B$nG>Ld2tm1]P > Oyat:1` dzb^VfcҥXx1>3S7 5hQSSLZMA RX#A }p6~D""fvH$ԄjgF"۷FB[["~i[dXgKK b1d2qZX,x<ՊL&rL9>bo| {y8_|<`c,qg_p\8䓱aG*2 IJ9/A $Hq 'O x$={9P՘1cnVL2bÆ ó>\.lڴ O?4VX5kjχL&[o;w DR xÎ;pM7)ՁnV/3bQTpb^F|f2$$4OaPef3;!f.@pD wҥKq 7#rmZۍh4 \ 2+f},XK2N VhV+|ůc|?8kf__Xz5ZZZ(tʕp\K ݋뮻[n㣏>"6SFCP@{{;d2 \w}=vI5ZMOVPTp\p\l(JD"4ST0 ~ǬjVbl۷gy&L/yb׮]x'黝e\{TbmV~"1ˑЭZd*>r6E > F+ tuuѵ:AF ˅3f`ݺuZ-N:$[3Ϥ"y"ejׄZF  7ol6/a gYx^r9D"a<Á={ ˑ;$H ۅgxkm6J%4YҔea <_1dBUUn74 Z[[~2f DbyBcp8 InGuu5ykZO&|ǠP(p{[ډ١u .k֬9'+$H A1\.ǒ%Kj|ggϞb!6l؀%K`֬YxgdPAp HR0 D"3oN@AxLT* d` \N>=ьf zT*i Dl6X,FD"p8LϧiAaر2dN;4lܸKmĄRc&&[(gA̎bP۵B0J``(=@/ձb^̟>$Ȋb:HS׋#G⣏>"x<\ozj5g\a0g\C 1":LFQ2D>'C8@&U ,Om݆SVov-2r;#NS̙3Wk.1Ϭ =; xb-Nr,wX'B<dBSS 2&O믿>(K\{6cERqGL&bHN("\Vbq'o 7@לd.TWW}A4%bHY1xL>ud2P}vH A5\GySLm?v 8l{nLNG]=1k,\}&|p:hjj:_DK A `K'?رczj"(T6` i,kmATP(T 6?Y02}J"L&C(!%Эaޥ@wHhF!˞rX,N1e3S[8묳pYga͚5O~Bl.C,#e>`j(-tyD"8`>PTᠢA4ݯww7+0,='~ `X,Fashkký [!-VV*d2L&"rą-Á[bI /.$Ituuh41f}ճDcᩧݻ|ϴi?cǎV*ujZSYzM˼曱f͚~ <:N444P8n("+r@ JT PP~!:|ގzy'N$&ZM}\\.$y8sN̚5 | ~xފ ˆl6Kyhxs2$}z/+ A }C7ѣq)>w`ZVFxT6Dڳ@ @6nA"ɠP(---0 a2# ugGMMM$2tϗt1 {($o#&bbxX%[ Nk9'O?̛7?/ڵ GU]w{%H Ao {a֬YRQkeG d'Nlƍ!P(H$$ ,p @ @/tRAR!P+2gm)\V/gYL&V6ߵkn`08ER2s6y*H1(B~R_~sܹs xb"Ğ=+_XZP@*;BQî.466⣏>k'Me˖aĉ?4 )*bqWw׮]+W=2 F FV%FFc'CuZ0h A 7qԡx(`ܗ/_Js=`vo`u  XO_Bs/ax]]]Z]DK A lڴ 7nD\E]tW$'|iӦygy&8>3L&dH$T*JbACCA#{X/f&LUT*./D&"#EӑBs*㾂M4d2}YW•W^ ߏ[n. Pv;ZZZrHM̼»(t" !g> BjDq'bW]}2Ҟu:0\Lrga1T*YTyZ *6lp%D[l-[pM7AV?MS~~~/;P(?1>l߾x<;ӟcVM\\. DfP*P(t8ST*qeG=Ӹg68jd2!HRHRp:FHӰd2P*&455_1}ts93f 0vڅe˖vvdYٳ#F "JvSDTRZ-?b~CkŢEI|[H$d`0jI}C"p8)%%H Aǘ1cn:{9s&^~rx<tvvX,Z`Tvh>l02( #FxPHH$*D"( X,dYyd2T**jB/ɠrUܫ9v؁%> IDATK1aS WJr\׸l̙Xp! TljhnnF$`A"%H Ao&O?<֫Gꪫॗ^ڮ.RuvvvR#8s牴ypuq(j&NC2$)g5:r6H)ӉBPv)&)`(&XKp8h /SlD"(JDR)";OTWIm& <<.] ۍ/PzZ}F؇B!Rt:ma] S3q1s}6jxX-=?E_qu6ƍsaڵGDyfl޼yܸq3f P]] Fm رc>.tR̚5R,C4EUU,@cc#z)CTu"|8BY_fOIFWu\FXСCvZl۶ z+^{x={6`0r>N'}f  >A墬|>H$H 1c {ޙs=ay3f8-?`XF Zr̙sPdZzr{[!B"~0`x 1(bСo/^z {@Ⱦp8 L7Vkوb:#ڶ=>ٮiry ;-G& $S0,jMnnn ^s\D~qH$NcP(T NG{ضmfϞiӦATr@l6^Rj"@RuI|+")TyɳI-Lg3\.Li6O:kY?ԣN81|L&/ذa>*` ~:jkk)à| ?L?ml63'Oé[0DX\.Qѐ\.'Xt)W^y%֬YO<>KRwx@SSV^qQ)3 eVlYA ̚v466FA<'U}$,vĂ0 H-t:zt:ywP(W^ycǎ=⶟">r\v7bܸq馛dL&nGKK? "D!Bď"ptQQQJ//{r)3gxG*"K@.I pXTG͵pڃUMwE~fߒfA`zz)(LUVVbߏK/w6l؀e˖aŊk⬳΢4uհkZ[[, BL&CAceee83_K.q}y8*`vaF>|>G*J T Ӊ&6G"˘3gSⷿ-nZ ~zL&]8Nb*GJ/þ};̚u|>D"J@ L& Ym C.+zwg}a޼y) DB?]Y4 8DAv  >eE"A7])L&bAg\ "D!Bď PLESO=֭#ZZZpbРAH <xN%D7LJY F3B*"J4yi_~z" 4R@_a ejYfJqJ%"8C[[[= ֦̂qSOaرWk4ajfjRM&s=uaÆ |[SS.#FI' Z Z \~ʦ#:TB! xDZs58S0i$\}՝ٞ E. W\q @cc#>C_6l@ccAl6N;4zlٲo^G8R\. = ݎT*z*f\.|G8q"R.]KB.CբU`U4%5"gA2 ػw/&T*zVIg`fI'ѣGcذaڏ9fc4T*hH$H:p:{Z JC~z{ ,B"w݋z 3f#zj9yx':cD>#PYYf BZt?k0^h4`0ov ZN{6f 0hkkZD"AX$+( x衇0`p Gj ˩CH8! "L~yꩧзo_|/+Hd2=vWTT`Ϟ=PT]n3D_"D{޽{裏#;| v}7ũTWS:,( |GDr"M StE d2RԖB.#LB" h4 @zzIP(~ZF`Qݽ_Y0;qd2 'J!H ɐdpc8묳RJTVhH$ш'bda6IqO>/mۆbB6Sȑ#1e >#{"{zߞ^[bɒ%x{Tt:L8'NĹ)`ᅬ|۶mCmm-3<GW]]Sbԩ;wDCCZ[[d6p8B P]]d2I7}׶6<#xpgc…袋|c*xr9:ף搗/HЫW/466fS"/B"DPYY;v>۫B^Vp~*")HnjV_(V+`Z---P((F)r~v]:j5]?LlC jZ1Æ +V ,RB:LvnX,шٳgC޽n: |Gꪫza6QSSQUUn W\q`?e V\7oA?H4HڏQ p8{Ĉ<nH$h4 jAl6u b--|1^O`TUUaٲeyMMM2e f̘!o娨Νa" :@)H&PTDb(P*q\]] DTTTP Z H`Z:`Raz\.}"D8t 0`̙^zsN'$<r9q Պ|>G$JfC$A~B< u\]__޽{#N`0Q.K VjAP@6E$HO~)( ׿>mDwu:fya20l0|w2d'|o;FRTO>hmm=fH|!B"~d6mv;=PWW|>'Jd2 l?bݺuxq Jp8JDWVV q]2[N}vL4 6mnE2sL\D,2)~h0+^<`,7 B`"L3Ě5kocƌ(//ԩSO |FK;L |fa4IZqw܉;=܃9s?5k {2 T*2 4L&Rt:,˫T'ݽw(tL&%db s=vy>z\veP*bl6K_"  bXt) t:?|E߾}P[[38/^`jň:J 'T jd@ui9 JN Ȗ" :e2oߎk֬_۷yuvN $ iT*ɞl6]"`ƌ{x0rHRJ$R}qt'~5mf\r%d28sԄQFa۶m0x'1qD/p7h?XFDnSK(ҙR;>*5 @"sAuu54wq; PUU%PcY> f͚/yKCB<# "  AȔ9 rL^__SO=Xx1y .DYY.b|iG^;wĮ]:mllHRl6<#Y%\&,Y۶màAꫯ H$"ZYYh4L& #Lvlٲr ,XZFtMki&: آ( BvŻJB6E4E6ECCl~,(=nS,XV)StI;,\MMMx1a `@?l*m˅%K`ذa ~m|guT*}]pL&`0gϞ. dĺ:1Wfa0Fxxyf }͸qgwؽ{7>; "H""p:o mCLFEdѢE eeeBFHh4zt JATtd2A;+Faw'Jh4"j"Aד @&A.ZT @` b߸R0q 7pXM"{ $0$ a-`h HNbxѯ_?|ڋpkOK.txCZsY;>4f"D!ӉÇc6N#B.B }x@ǑItŋ1sL.%,H$;v\^/}QoC:N#?U,v؁w ӧ#v aX0sL<#Ǽy`2ϓ+ AӑxG­eeeYn2('@SSn&d*_'`2sN׏ʝN'ylaTWWSnGss3J%D,o&=Vx;< "^;⬳ܹs1r. dP$dz+NaXr%6oތ;,bXdiqxG[[#~p8 FB_?s4_P@P( ,Z| fϞ믿^]˺g4iZRXz<:u*~`x饗0i$lذgy&nV<T*p8LB&j}8F>fCkk+IR:YG*Bee%ϔR.-5#K Y|>S`666bRna (//\R}Dck2D6CpE!L6 ˗/G}}=***w|c< l"Yql6x^K$p:t]#n6=o?P)%Yѣ/f#0g?ǸqF1eH$""*++h",[ ? Lodd0bN˅lNUUUhW~vthv{,K^}Ua̙{D'?>\zX,B8Jpiyxک8Yt)^z%<8+ nH&B|hkkCss3PvB H{(dP(zj1o0j(ٳz+t:  L]^^N]P1omm%K0S*YA"[wD&Ayy9*** H Q__˗nV<{owo`Ȑ!dj. >xwMa;vUikkWBP yr# PѼqu fh4"NvfVZF{w}7n&L%u8AS"ͮL&ut:H$RΛ7 ,o~ER|N f[[ZZ(2ɐu4E2D  uXDMM "cr9`DګT*"+6aAGhcظq#N=TL0---d2O{bʕ|> }_z"N'CäIԄ[lwމ/ӦM#u֭[1c L<'ODB!aDQb1TF6 eeeTtV* TJ{nܹNbbqعs'͛^zaɒ%k.p Y iN' ;xػw/|>\.jZرc^o&6o ϔ[ۦ\.P($PxDj?|A{F4Ecc#&Nzԑxw\gߵl߸\.x^Zhkk ͆|> LF=Dwj㝮wrՈFTjp\hiiA<`ΙBTb3#rAR !};Kx@"Dt^zaΜ9xw裏CaeEpӉX,FY@VEss3***HH$T*7bo%QN<Gcc# v=YC=:r)zT*Fd{тR!^^x+V@(q]w YD|1V"DB.kśo)jqx۷/^{^*B.#n)_W4/qD @P bY*N09⪫ԩS? '|2lقFW:(Uٳ1{l,Xq`K.+ h'% ^@;Fa00c ,Zl?Fǁ\(aΖüRY;T*%R7͒8n# 2⸫BFXD":~|T= PgҥK;M+Hp5`…իW40Z,T*  wqXj֬Y/<&L. .ĠAp=gyWc=]-R  reߏݻwc׮]|(++qhmm1tP :Vźu|r|w2e|>JQ8*D>]vv܉xj*Zu=E!B^xL2XKORUJ7|36mڄAyW}݇fa֬Ykf}ҤIxWuVדw$zm_kSO=@;QH$`ZqF\tEXd &OLdWaj(J xvZN>nvr!H  RzdPTx<0 ϊlVPbi6IϺʨP,;wĕW^#FƏ>lmĎ֥2p@\2Cn7v⟑,h49#c>J^h0`[l6Jr9dYq t(=Zݰ#F.CRATYZw!BJpc׮]X~= rDN% PTPTpݨB<G6%KR 7墰{0o<FKK~-rQgcL&#`P*dG+P( CTy\ӧOG.-܂;cNJH!B")|G9r,l ѷo_|'?jqb1TUU 6m:(E S3J`߾}#"$ O7x| `0l6 Fc„ x'1n83 'tRq477j"n#ˡX, ,fqD"4-=I a0 >[R2)2KTB8`ݏYpgGUw~P,^{'pz)~&4F>٠rذaغu+v%(0?wÜ9sЀUVQtXDP@X$/|V @LR!(ZtVYjH`nG?[Rl6Sx&h?.h{qp:V_~_~9w,趔W(h4H&Jq9"f3.Xlg^p8L@; h ɠŐL&>/L&6at:M5^ȑF^B,ZףGvCRd2Q0>ˡj>:D?k1+x!Bı@ O<h6m~^/Vk AyNI8:"s9`9LF`qP(`?`OLFI*Hhp4Tx2 ~aժU0LX|9;X E "D!'T*+V;LTVV8۷o>#PKB!~?ZyzFb1r9", rY0s)yHRk  {3gb…D,Hp86`]La;Yzb1R3t% )%0HR`jԦ̖>ꛑ LaP((4NcܸqxdL2E0z饗uV{mjxG4- B16m‹/HZ`T*͛1c {)PՐصkY5zh4nf(Jr9TVVL&#{6JFT(a{ @NѻwoAMٻwo9y#8va2® ~}bD_7C(W"~ZذaN>duYزe!u`unJ$l6ףb*Rl8y &qPPTt[}̑Ps\\bL&CT*T*EEõ)NC&qX,XlnfL8F˜1cOw|: !B?l߾/^clٲi駟\.QSرc1l0={;==g5#2;4#s)8G,j`p뭷>|@y$  ~TVVBRO>D !rz-CXQPl?F# L&z=)Z-4 Z-t:f3v;=L&v;F#8C2D_zL6 Ů]0k,XezRٳG`cT{ypEaTp:ԩ܌ѣG'mB]ʋ!NSv*Nd2Il---z8a2]}~<l6H$R NGL`]T >FʳZDJ$E|>x^D"XV8qe4{kWscCP bb[n#F@uu5Ν{R1'L&È#}.Sq>v2 nb^ @P /aL&gv(J! R4;$b^/ D&\V>}P.~UTT엜`zӉr$IA/#$R)3,X@h!Bc1bĈNᇂG}%HCh_WB^Ow?L" LP(bZݳ,bbXԋD"(8S}v,X?Q[[?|O"/B"D_GXZ< [F:3y<_=N!JIˆβ2T*?fG0N$d2̗;X,l |껂VҥK1i$l۶ @{Qp[*"LR;n$l&=kkdQ@f*Bkk+n7bLj# Fhw5*=2 F 6Yh~mRz~`XP,g"l69^jyƍJhߏnASS6n܈O<G*JRh4L&h4HRX,R89#>)vR_. H?<.|dR"ʖ3?N`0nwް0͝. 6^3Lmz (hiiA$A:FKK Q,1i$AD"+0| 4C*bƍذaY'e2vR3fXVn "8V·~_|F!ryL8Æ ܹs,L&H{tHRu)qάk.f34 G>le2,~?< ш*Rf+Ċ^juuuef($w8Ӽ[ڏei[G"\.X,Q]MM Z( \ve:u*~?ϟ:,]aڵ(  j}#QJ f\2DQB!b1<`0@{ۡT*Q(PSSVyt:L&| ~{ h4 F`0؉gIxxfdjE q:feVN<"D5jy|رϐdgv]NRtiۻ,w۷#F@$AP֭[[oaڴiX,x衇LT`0@ND"HR] RGU~4="|f  ֭[1o<\}~!B"~"j]Dڷ:vnn&wm6ųQxG` x'KR˯!Lk\D`yعs't7 D!Bın3gʕ+)PjTu~Iol4`?sxhjj¸qqFy po IDATL&ܹsqy׶2 Z2ib:{tvw8!|X6T<?OOd :ofA b+Wą^|`!솗ʰAIǀ(ɶp_~h42-Dr9 R d2a$ȩ}!ϣbP !Jaɒ%q9w%B)ó,YSNǃ\.H$"8,u00>г}IWfVi _ݺuXp൧z ƍNb1 I7xnSNNT*Eq `0@"૯¾}pwvp84XD"7oA&!Hd2rQp>G<'K#F #U*r9T*nw8FYYb@>ZRBA6:@ψgٌ`0OvI0eEorwr8btL HR(//D"dJ^zc`ƍpI߲2zH(++C$A8jcnhTÇG^P[[D">'O2v B;Loqt:Y$l]xgjW VK{:XB>t0k$ӉT*ǃH$cC-֢P(];<] 6ufzAEE EmDB`I&B2x5 s^|C^RDyT#:Xl?|HR xWp)tbܹp83~z 8^>G"@R`0@}@.C<G4`B@ @Xĩ]v׿5}Y 4谿O"/B"Dc޼yXf{U~xg7x#VZ4[nE8&q.C.;"7MF'x@39f6[D"!銴/%sJv<&ضRTHRH( ؽ{72 zEҰa/Z-/X+3?bhnnT*E0_f 0r .\'|?|IH$Я_N; jltnynR\.r9"Y\.G(:A(^/enZ7ԥ7d"9p:H$H$TR(Y۷>Nl{Zm'")R"BGa8quaD"+{>?/ӧcРAhllW_z~)nF466o߾عs qt0t/Z,JDȿH򏖕봋D"d2x饗pO"/B"DP[[ =PġȪnfD}h?&P(SJ3{  ^Tv M&ׯڊV8XVT*R׌D<G:c LFM&^/<tt( d;fX`6X*a}OA:zL&arz!BO .***p饗o="-l: ?xǷ~ СC_㮻—_~Iq{1<ӈb/~kw5 ]b#_=+VByǏ?O6',Cq_tҒJT,JJ"Dy[.iɄQF_b D3ͬ,x'%;#ny\.ǐ!C#A. &L5k{X,Fk.hZ ٳqwZ_dHO VX,B ڵ }gäO] [^Kр{(FE,g *%&ĨD4E5JbרhH( ,Svqla)s]{1N9s9]vGt:ZVH&OD" b.Ph p:Pd2P*$ʗJ%ָoaNӘ0aT*r 4amnDP@6E2D jFqY:IЭT*hmm*:0j" yz /Z=$IQ0i$oiim݆뮻)mwv)P( JɊk\NnZlz="z=M eٲe M | 2e ^z%Z~_Gy? <:,aEGyp" D(rM`XO`0n62EA8Ny|oNqFL4 ---{ dT &ika rd]]]\.'|dRySvTp8҂_G}4a4E__mۆ>lٲ6l͛ Na4h|f#ĩӧS1~W/s9w{1,Ygu.٪T* zT*J%TUe/d4F3+J2Y Scz/I_x>p8OK._ݎ. drX/fX( rE'D:c5Vl6ؑ?hz>dƍìYcZBV~Zs 6n܈P(D.]PBPXdZE6lFPa&vNu9ًy衇-qv>~ׇ&H$B_4] 'zjLݠ. * T :rPo6E>'{Vd2ԹRdF# LVx< ۄMz%IB4{{{i/hmmB@.RhD^|m\. lB(pG⭷q{{{q" o̙3ׇ˗Gq<> .Bj5$ xA[[Pĝ|vw[oZj Ȯ8r9h4I yh7 LkFӧcxwp'OƉ'iӦ+_ 0UǃzNV hd\&ޟp lv~pPCPP ]j5h4~$ ( BX|9ARl6?әFIgdx:f Fk +T*8NX,Y'[ZE,Vhntb5snڴ F|fa,p|r9m6)'Z"Hrh$+%IH$a٠hсI&aݺuwyQ[3g{.>z뭰Xlz=}_P(83 ImFfy ziJPQ˦R)FC1F>hENN ׋|>P(DYdt:|> >.Jy&J%V+Gv]VZ#&x^$IYw#pv ~:N?t|xb``pGhooG[[vhv3ZBPcի_wMݎy?.d ::2*ժz0+np8^9眃I&ɺ29b6>ht7/Ѯ2XmFEj4`(NW*JJ%Rl6ңuaU^x8#裏" ᦛnB2ٳzqgƍ; yL$I px.\Ipw[G}oqӅm6N'6nHKP( 7h4b֬YL˂VΝn ^J2lb3ł[r0: vIݺu+ x#Ɵ'lڴ Rww7֭[3gb„ 8P裏b4сt:T*ԑa4aHg] >|*N(aid2r!m{ylݺqrvR`ۑL&;M~j4wxʋp8;ɓq5^y+Xbn6| 'I&h4=ش… !?bĉX`f̘^{mKVd2f`0@TB$Eir9jXbjNsNԗ/p8g/?pQGE0L;-ۑ`&5NWۍl6 AvEG>R.ZF䬃P(؉(jZJ%oEFݮÊ O</vZ_̙3ꫯbʔ)hkkÅ^z[nJ`JddL:nh~[o7WUy#+z sAqX,BZj. r & J%0|M\wuTa<:.bHD7`'>bTd2AVCooXVZ h(J#S2 cL&fQ.zp8h/U:~?ƍvX. j^e"Y^G<(p8Je&',{UF]_~6 x x ,j,!+ r2 o.s8 ̙3:cgl(#>\.# l6.~| J} N^, "Rn9f!Lb8κmpN , & pdRVig~^x!/_m۶ᥗ^G\yXjDQPhmm^G*c] IDATC^ꫯu]_|Ÿt:QV)v#`o2`va6i=^z JwP {RD>D"Av'|:0hþX,"#JsX=0ΦMV$I$vzJ%y:a^mmm0.^V+ @$og6 N6u[wɄ],,o6 j2k!F#8Bfo +tAwC^{i%K@c:]A)w:0 XnzخT*T*da#0ezܑ } \L---Th"H p8ˮ ht!5;Űb o)7|s 4 f3l6z= V+OF(pp8}g}/ž^})S@T7p(䋢t:@ SV,;'|J>z߳aHͻ ejrq(7 ^/LDltE^1`T*dHd27ny3߳Q`c===KO cŊ0uTz_:$hy* GO9_㦛naYfkfٙ0m0h{T&PAx'QVO+iՅ@ Nva$[,D"Nl) aen7^/:2&b NnW_g}䭷?>P(`˖-ؼy3z{{i&_ׯG__ZZZ~zh4lܸ'NĴigʕ+ȃk$&M\.c&mvd2l۶ &M0(~CmxXg4ֽ^/MX,B!!M0^V@P JT*AAV#Ȃe ]p8d"H8@V+T 'Ncy3V*0Lظq#l6L$ 7tӟQZ ( .7 F+V@$̝;h] X,fAq\( @H30}VdgI*lxF0lh8X8_$l}/~bFw<=B|ֆ_Xx1?o_G1czva;7kZj5eE(B9gkp8}3f੧-ӜйsbH$2,Fsj*ߺu+:::>SHEH4Dc)"4pPx& u:(t1v"Lb@/$2?N& v.fۻH̖ , OӧnC6K/o뮻PTp '`ƌ2efoN;mu\,~su.GQ|'Xnn:B!ԩSӃNt:lݺXp!zZ; ,CRZݎ\.QQThqFüR`ĉm/IDQ7OtoiiA$wrDbvzIl$ DBhNSk2h¡ZFtZ&+JD"PThooߗeAfz l@Bc9FfGѾtwc͚59s&M6{`K,ɓ LFvH`0.ZhZ9VFP. (iHT~.}XDVEvQ點ey#Ol@:p>[M8yrTBT\vZN; v6oތ%Kࡇ_~\{={ 8|C9STTT*(JV49´Z-/b>p8>\ztО^}믿* W]u՞^][]P@cƍin>G^UWʺ]m6r0 8 BzzNV~^jǏGRZZZH$eh蟯P(rpYg͛_WR'2 R4rrq5aiZ|Xz(;0q?~<<qz衰~#[hiiC! /u]O>&M"qnJw]z'|d^z)$IB&1uy<T*TUyY.+01VAB$8#ÿJ/Mm/4fC{{;WL&YAVC4 ؼy3Y\.YnZE[[|>n7Y J &Pp*[Gd~ 6? +qGGq{ņ h4w}?>͆P(D   $jHRX,Clj5ZZZ' FY95OoXVEMN6muX2}}^iqz=n7$,~owߍD"G}N\s <;<|>w̟?s9sp- yʷX,Z54is`9GP({ ɄE=^=8Dd>f$iphRHe$IjT*$imXI$dsh׼QMR( Æ >"]XB@ww7 <SN9眃O>SLQGӧzYv-N|>8Nj5q̜9{.|A"H7C=뮻3fĉI`-˴hnAXwiy\{կ~ZD"!)VRaܸqjضmَ4ڣ4q|>~d2 L&Ӱ¼(ڗտlP6 &LJhw^'~˖-p8zX 2xd}j4Q*gB9#['|`ܹss! .[o:>7x#yu,_ g>jd a0`4h} p8b{9?oOcʕ$G2_:ݾ馛/ *>{83qa VVL&IpN$P*{-X{wk_9HZ\.H$jJ9mRqlݺh<;::FވB8uj5Ed6L0 z$h4߸J,6 7ha6o,|ߔ?CoٌSO=˗/G6ߏjٳg7x#o?714t&x|>$IB$ȤIP*F1 F{{4pPAH$h ;f_F+#JpNbP(h!IKybĉXt)8-[I}. sſa2 :f:FP@}}gOp8`n… yn@P`ժUT*8S4L lc=216S.h\&aO{5HH8(j5AT*|wt|jFv"̙C7t̒=!xb7\r  !v!IA oZ A|r\x$2nذK.s,6 . Z:-F e+lTz7u8fJ%<"Ѩ'!͢^mZRbm6ұU,N %uR)j5x^j5k=~``k֬WUR)HBZSO=/ƿo<#T*K9Z---HRHRD"hkk oYV\.[oEfӌB$Ib{j`@L:nXKfA5]Vp8 JEtvmo&ˡT*Nz\tEO{a֬YxqGbŻd2Q;bY5O>p8>6 ֭u3vn7VXXt^b4hĉD"شiѳq\vGfT*2V= 8_ש?" +j5TURVQ *JT*(((( ER (BE yy r9r9r/ˈD"jl000>/Fgg'-[_/{˖-uڊzp8L>ܕJEfT*`۩z+$Iƍ\k2hl\Lr=}b* :e0I(:!ݍh4|>g?Nlr ZM;XD]lٲR ]]]PTco,<2^/HTn?묳d}ꩧ6+i7=W^ JEV< J~TU t.JhiiAR!N@ D"1jAjv# mw}nT*ZZZN `0kp8dY7LYcAPJҐi =L&x^x<x!/{3r(j6ydG"? &؝cQVf:nlp8>^7ߌm۶}.v!_Os=W]uM&\FGFCjc` L&R4К!IӚYݮT*h4rT*j۩Tl6 JE"B@X(t%"($RJ%gBU`pU*^YY1n7~;/K֭ԸU*|ƭJ'qd\*6qdP(bo~s=@?7o21>ɐx/"&MxT*x^ B!xp8 ]]]2eʞ^}e˖fa֬Y{=h?~<2eWĦL&rLi<u6 fxO6,l4eA/҂ٳgSa8f3~?Ə?dj5EA$g?2|{h4Eޑkv;, yY-+&ZxH$:K$+cl=~?^/uołT*Jߏa ۳\ $^CE6817o}g$ Bw}T _~9 ֯_Er& 4 J%ˀ1`0ߏD"! {˅P(DEhp8xGn:XbO/lalذׯ`0҂`08Dt$ ~хB>GVY4Dў3I>G?L:;zvcm_O<b1 (I FT*K .E_:LzNz]fQ\L&QPT,Xt:n'WEu'~cCR U;`c_ZZZh0}`Pfa;3:YHz^f'tI'ɞ !$$I"?9:f̘A~cP(Pnj" "jB  l+4!I$It4j---d22{o2d][n%tBTRVEl8SD"xnٲe Ng}7o׬Yg}SNEX?>̛7VԩSq7K9هyqYg7ӋpI'aҤIw\PAkk+h4aƍxDHg~X~?z{{Gԅj)4\xiVl6CV#adü>l+č7ވvtB"AZ \N}_ӟi&,[ wy'"Ä f~zS-h4x0nt:MZLDmmmz[I}z=u[V NAvs8yH$`XvȪ&J[nԩS`\Rvnс+Wb:u*n(J,^twu0NO?}4 }>p80ӋOӟD^1,aTlej5ގ6~ƏOv7u؉p–(VG>gpT шjp8L&C],1~x~z7fϞ AT*R`zvFb0aj5$.]s9Dի^{-Z[[eDT*ZFyZfىH$`0HBX "jVAo}x<Ϡ IDATۻz= ˜.@U*2 ^V;>XFuVaYApPNBMOOlJy2HR$Ixg`ZqCPо,TPQ(jP(T*sjM 0{F{oKfrI0hx<H> * |'͍N"t:پp8dǙZNۮUp8X,T*uT FN=Tr-Xz5,X0 `ո)VꫯFoo/pqa{<}o èT*\y啸袋Sh4U"&nBGQk/"4(lB2 FdӃr9T*tDs8vbX,x*|>ǓH~VCOO.\x[|---PTo & Zv̂Ǐdnl&l6WըV$oٲHz\:xhrh4ThcAo|_ `Pbjݏ9̚5&+f3J%*=+ Jn7t:"uEa:nhP(=%IBP@[[4$IB  _X!A[p:BF!#jHH$Mq8yPՐH$vh҂p8{m7lذS>p8NҲ IdkÙqL&x<L&'NJM֜9s`pw2`;R>j2*YCeE&b3,2NCqex<"aYv8U*Z[[f' =e7|fm8ɠ?<^{5L>z]&\.b1q["@P Lz=yu]·mW*Cz & `۶m$66 p8H$X,& 9elf3Lp0KѰtajO~&L jm^OB:g}6~QG%{_| DpEZmmmC<[ZZL&O<˅P(Dp8P.IAČh4Jv1Z~?RL&d2 BR)۾GMOx"1XvĎr8+Hp8,T(du7zh-uoٲ|0naf ~aٲexgp)t^ZřgC[>p8_},]tVΎcXu(+ Y}sUZJ@t:=_&3裏o{Μ9X,Xx1yT*nߙx"@"d2L&Q!"rJ~j lZ_fh4P*d2H$N|l,.^ßg^z*$I`@6i Jt::2^/pw{!EZZM$"}f FNGA\z<-P^2aXl35!_Rm^^jVzYw{2cA6loo{B˵ˎm۶bR R_~| o{{{i[5{.G$j@E:V1VPT`Zp8 z=j5Rl6l}LZp,ph ͖@lBюHET**q8g<D=gzVb#4k֬ʕ+1k֬!SLʕ+f??gp8_`ժUxgX1cQJB$I8q"FQ  yZ+WviH&@6%u`vS7n_ D70t>8c]>$T*!HȲFБ$Dkֵ\q'⩧s=>$-N8#ׇ_|'O\s5ՅJߏX,QP(PՆײNxC43Z1vB! lwT|gPdĦ$IVEZ%(T`a DmR?~ĂV%Iw܁;D"8Tރyqa XVnU*et: J5V  +bj:D0W@ B&X^A>L&p8I(i_%HjaŰ4~;gϞ ݎ%KCł q+WԩSdv̞=ke<3qwƲe.\{ gvp8ΗӧCVa=6>Ci?Ӌ2&F<=d2r$x2ߏj::R `0v8nTɓqwCE\p | l3=l("ݮT*hoolEF Mp8T8+Wu #8}k-U}]\癧JB{{;"n:b'dB@RB8F"ϛL& Mhooe-AZbs4R&A*B6%A?~W)ˈD"VD"FOVz<s L<La,g}1ph1|y}tضmM=)P(DSnBBAy_*C/ϣX=j5(jY8yXbb',V~&CoY1Xp8Ξ/ud2av,T*Ո4R1hfx>k,Yϗ=㪫'yaڵ#>N$?ƢE0sLٹ3bp8{}QY3g6m><8qEo v3u{h4x<b1l۶H:v;2_D:sիsaɒ%tbh!Y <KJ`ZQi}J%;00@j5uKۍzM6QgJ9s@PG0(2񾿿/:(+d HhX n* V <;O"* NpZ:"t:uEzO^OSz}Ty7?j5A$l6ttt@R\.S,C6bFnUDn* 3w=l8i QO$T`bfC<Jjr-[B]FGP  Ļ FZNrt: A`XN' p`0pT*O>AWW |>,0|>L&M?xJ\.NG!6wv< }YR)r)5k.ىSN9Cr9xq'Xg|0Ê)BR?Olvr3A@4E("^FlFgg'ud2!9K.j7ߌ~`q9~W|fiy I$L&b(3oy`m.f@]$o[<袋 v~/LB%KсO>lVAZPdI$ X rj6 > ;L{gvew)bLDThb!X ("*(Ddaa2;;؜-tzyvf̝s|oZyRnJDNł|>ߣ]a9\6Jap:ׯN'N!C<#ahhh@{{;"HvKb@A{"X,u@y4E&(hll(Qr\pbWx ̙3s ~?N|>O+I'O>F O|>_Ȳ&EPq[hZjClj 88FdYd2yQ*Fxtٿ;v,|Ǩ۫uz,Zxꩧ,F]],Y~=59* 8ijjBXDP[n7 x\tEX`&O|#bQMw7T8ZNa,_{,h4_ѣq%/,}+w{#vr9$I`@Lq*t?_~Taw~>HnCRQ "C&f<NDTB'a9ԗA,˸+!2ZȲ?1rH*nٲ__rzr4|>F#P(rJw`$IhhhrZD$ ,H6lzSp8MN{5!REmEE- hhh !eݮhE{,#HPYJǃl6K'g,FD_z9C]]׮]K >۔Nq, x Blh44s \8Z" ;VPsl^G[[\.L!A$$sSD`0.ACi HxX IJ,+q5~!N;4s/2^~e|G{N; 'x"nW'|3f`0`>uQ{#Lg0 C(“O>|y> `3f ~aL4Ob"9B!Jݪ:FTVV*$qDQİa? sĉ(i52 ,$4j54 , r\T'$ TږF44tvgћ@ DQh P \. Q`2P(㯮I@}}=`,%SLA,k֬'HEDYquoG~P,u X,R:LRax~=_<DeYvfnkgf34 ֮]: 8pjg@}IP*hgx! Hj}^OT*F*"fAzFR.$guumٲ qqr8Cee%R7%HVV,ϫ My< *Dm !ӤJ=V|8RPYYP(DɸZCB` `0=@ oF]xu/gY|j-S.EATTT.NCEER*++`\zGeNg+L`0CE|W{(-<o Պ; gz0B@ X,t:N$`0@E*zpmdž Jhvva;N8nۗ.'v{E7$&IZ}[(N!"ĵ\޾};sl٢h.BE6 $azTȏFxqx+pXx1 ONF#|>(=Z˅L&H$BUb@C$adYJ:BZ-b l>LC Uf*  @$$.`0Il6p8}"gY̞=z*"2 q455.;b{U3 qD2uT 4zaJµ^^x˗/oAlΞ=!~cRT*ҷpPvV QڊP( qXVZ  !.\C (HRz'/)yOMgH)h4 7v)c8 \!_(qѱq 4`bnVǗ1mmmϰb ̜9fgF>ߎ* tvRDQTUUAѠ<σ8:9]pm8F~P*i&|HV#Fh"y晐$ 7nQ%_(!"D"ltepVKFYJ趕f28NZNGBtC*4#cJV C@ǹOV[,ޮtD"p\0L _'? ΉD"4% ȲxǀyfS!.KqNsBѠ`ZVz@TN(vv>ǡ@6] (R ,`pGh2 < =RdYh9 b1x۷/$;|Xb =X;?TsLg0 &Jaڴi81cƌ=Ò7x1k,L8555:u**[xq7K/W_QFX.3d2=V>VVPO.NoI(gTBcc#Va0?a j=muGg{X,S_ ByG|+,CVuJj466L @ss3<^/l68z^v*{vH;Y q@~Kbҁx ̥R ~>oVHz+z-1:_}~i^χn v,c…t$q7=`0 JBPʕ+#^xp믿>h0~x,YQWW)S`x8c,J o`0H+Z[[zi8F2T,B]]mۆd2 FC, cǎ`_|W,.b)S,!"0/ vG<[y`.\.XV$.Y*ُdbZzd2a˖-4P(@EL&cذaO0l0jϓN~h4PXj;<Ћ#0`\.444@ed2ZFss3"T*"~$HGu}LlQDQ_$sOH(x<; %-k_~ΓNhIFnQfJ%B!^~}*K/8z~7@hZTTT`;<O, \.~? x,֯_z7ޟAQhhh@EEA-2 9f*4fY*nfغuk? /LZǤR)ADQAb1^\8. Bزe (RR,.-d?t:7 ښ?\y睊?G}4l6 JERA`ǎ:t("V\N8 zsnf[7o>z+2 ,zzFTD:b`JP DB`ha&uX,*p,b~?L&^oIlMM 4 ,"͖ Z@4YVrQ1x^XVlٲ~F>:tº>֭[AGJB6E*B&q'<ϣAPQQL&C'>RC`0 0ʹ!Ls 48_}N>dL>=XV+9wg}38;pnG/_wtP}UcUo5%IHb0 q`hiiA0l0|ǻ|}2k^z ۷onj3pJfw9sԄZTVV*L[nFXY{{;N'a{_OdY477CVZQesq!JVGQng|\V=W~T,T*Q˗رcl[$X,r9<8K,y睧ȢX~=ohhfCXV)VرcQ*駟bҟT˲ Ap믿ƛo Cgyfy[[nupRN3$ğfV:骱X,]*wF RL&RdYRB!ȲbH3ȄPaΜ9[_xvo'QyfTWWp8 \\.h4 I\z`0!݇D'9=?f1!J)BI')Xl&N~\rIiXp5`ܹ{5u`e˞/&w/='wϣq翐w!г |`0}@>}pyaݺuhjjf3~_O?Żヒe˖aȐ!__^ԑHR HpP f:ځF ;^zbAcc#2 ]6qDc۶mypx@ rRɼ3krۙ'qV__v{x88N\.nZuo0t: / X,]ip8PYY;vXS"VEPb#"$v{9D(mmmb;$FZnֆQF):5֭[ZKŋG2رc1oDSd+,\&M/X,b˖-e2!eZ `Hmxde I 8ꨣtRp QQ]]?{<#BwW/ `0~ 6 Ԇ3& @RIo߾H$hiiu:oƍ/RQ9ȲL+̙{d$ITؕ$ ޴Z-t:yն$VeXV :]v>1bZ^x!ϟL&AQ*wW9dzBR햰HD0zhxo0l2F_ꫯƍQ__W^yCKRBd28ӟk8z D,v%W]uƏK/z/0D"Jb łb J=)J4\ГrID I8 ~&B~($Ip:㨪KcdFXx1L&&Mk_M7łsbtM38c{ @`q*++ŐL&i02`0"* $ L&!cXC.X{@~?~`0 XܗbVO~0k,|x>R;^{ NL[2D:F:F&A:F*B*B6Ujoڴ B:>  wW^ŋ3Dkk+T*mۆ~AM.,B%dNWГT uuuo"*t:O?].Vl2Eq 7ߌz FO>$ƏO'/8z=Z-88JV Xp!nYsi@ @ǵ^SO=WXʲ[C6E<fðltȤG2D$AuuuBh4|>F/j \ͰX, ,d2Tw\tKel۶ R F$aРA83PUU?Cqhllq%KO,8쳱l2: .~鰑e6mB}}=0Q e0 PDee%c#eY(P3f ~`ܸq{/&L{X>`0#&|>O1+U3pB۸袋j]DᤓNѣzl;CeYp7駟믿רjHDSN9L| uޢhE[[Wbw_'7Lr@*'aԨQ۶mÐ!CpOAfÇ~C'nD @zӅЮ,vt:v;n.o6m_IpWWe8ttt駟f͂^G&q0 hmm,|D"bjضm.+8cLmKB[Vq^, 2  6`oQ__S"H@VcE< 6L"ؽERA$yZ;L&XVX,6477#σyt:@Kl( *h4tVE4E r"![_<}L,&Lf<#8ꨣ۷/ΝiӦriOl~ob0 p8/ttR5U>qhkk^q߿?t" @5Lkk^`>`0.,^> }݃=CAO?̉Oss={2VR~7nn݊s=w@ >~-/A*]U0Jh4( -{nj3h"Ų'|nܸ d ="NC|>AejH$poyGSn7nߐ`2L&Bf:~x;QQQ9sPކ+xh@,<RyJhb a}d¶mhu>jy Hf:-QN|bH$}>h\> >3:u*dYFXkquqw}{vFaY* 8)EdrJ쫮bK ttWAZPPYYOW`0 RnݺE۷oG0Dee%x!8\zf ۍ_| N;48餓`0P__wy@c4za L xl2PSSl6&dY|>OHDQuA IDAT]#f& nZ~~X,xKvcSNup=nwwv*{*{f$Iw`0d2 JE._7@[[l6>h4+,nYyz,Z_~9]FVd2ԚeP*s{E,JBXUD -EMM ~O}g$IBP vAn7;[+ꫯV<7e8`*~R_eرj@#^d2x<LCM|I<` "T*)cz\u:DQm˝t:!J wfzɊF,^* lق#F3ѣ1rv>|>O;L&.}T{w@nH`.vnpG[eYjz:єH$d`4Q(9H$d T0zh <SNEkk+x }~8's , JLQ[lA]]=#Zae|( 8cx`0 ,f`RHriB0b1 6 7x#O["2f͚ `հl(B{qw6(XyNnrrsr<w y=g0 SHE0{KcV| v׿pbȑظqcߛf!B/݊@G[AԩSֆo&^}Upcڵ裏0oV Պ1c`ʕ3- BBfꫯkQJm0"jjjh`4z 8!0N}AyfÊ+/c„ o`ŊlfH&`=K `̞=7nܹsxPbZ>裏cũE)){"ɀy*w'2hrF#jkkQ[[ c|>9r$zȲfZ | 8L&DQ˙/V%r)cLJt=]Y;A W_}lx ,/_I&Q\@l߾!~TVV8lٲn6lW^7|sz=lB'J  >#@ X,l6##`0@EH: gu+Wb0adY-܂kv+' jq4 ,"L!L8$ * ÁH$B;iC,2 mW0 tb`06> رcL&, f3n7aۡhpWbҥZ(Jp7_~%.,+*ơ7>^jbP(h`x߯f`0#V Nd:Yr N8İaz|5k0qD3 ,ݠz^Q  `AF|r\z{8(N>d?͙LZY'U$,Jptr:D"04hyR)dYE,͂yh4v;cǎ,Xz5fΜsG\Wm\RI!`yE4QN&?"\aT*M&,]w*8 ǀd+$n[*P]]|>&- , dYFPѣֆO>q }RW^_XL!cذa4oAKK ٬ST]&v5 fC:F:D,őd0 ǍZlF*BTB"#z< ^{5{;`kaݺuxהvh^b0 SLR;`尀T駟zӧOWXtG6C?wG9pnzyg3[r3`4a4xH$D ˲CCբ\mmmh4tiΜ9رc.̘1v D" Y伻K|*j֧OMMM0:zʠPxD׃^t&L… qL&I\SSOCjpwyHI&#$I(J(Jd24J/Vp'BeZQ؈: h. bt.wߍ '%\X^^mZi| D0݉3c0='ʃ y `nhZI "T*?xz>s:A8օBxEd2zPeZ JE'o_իn: 0ǃ`0;$r9%t ϦeYVt2 &3 $gøqpYH L<^z)fΜl6_FhOT*{?8dYƄ 觽yf,[ k׮---H$T/l6cѢE8tR x/ PT/1e <v/:yO9X,fBH&߿"OxߓjiF& QIh IۉF"hDCC~`@kk+j5, R, N'T*^/fģ>J',:z<=zt=)\.8 R)Ah`6<"/J#zH$㨭L_ORj ɠb ᅬ+Vଳ~nd#aZih:mf3F#dYJdP\N,xN^-R? .ŋ1dL:l`0 ƾ8t:n[(P*pr &3 ,>(1bIZ-dYF>? 7tPz|4д3(B${(VK/a?~HEx"T*X,Nnj Q]]MW(0sL x0~xz8C,@$iҋA";DQ8NjH[[[P(G-S, xb\eB!J$It: \zsB@R`Cj֭[a6EBѠ("@VS!<ӎ 2LOlf2 I0}tE̙3:ttږg^ c9_|]ז-[TLKK 6l؀p8H$BA,YVSNWVx<f`0 F'H< M&0LLf`0ApeAPRh聀8L< .56 *V455!bX~=뮻Fw}w ׿O>[xR_-O? QhȭVѿ*t:d7|#Fo7|+8;ގp8Z*NeR%F l6ڐP 2= JQa: [n67T >F~VC:K._}V^+9#@CmmmɳFx3SKWw/I2Y `@/ Q, (&WTAsQ7!o A KA b:tUWwWWtϒLI&sN=UoUp}/e&L^:ƆXQh @4l6ZF_z%?_?č78Z4 V#4MqH$B|iN: vMGN'DQ¸iػw/7MN>ZxJ6 nzGQd2T*s)EAVC,C ?|xp}5 qAiB!8puX֦B#zPAZUU,tLӄ =z#P( @mc7HR(v*/# ;'m4n/ 5uާR)nXV̘1i[ Jmmm4c޼y4 oB@m]gŢEH3g-Z|#hoo?.cDo<#HP(`„ y56ך5k߰Z;n:*yȲr MC,Kڨm&R\. %嚦,SP(j@ ˅]v! %!7$dyݎ~&M,0 hkkC<nGoo/ m %47N[lܹs!^ڹ.2 PXRjNX,F3 Z[[QVzvQ( ,"e@ӴL rSLq4\7^Rp@/_z)LT*z> @_Q 8㌦mرcv 8CP?qqXb1D: qq4Mi4Jqaw `00kᬳT;4 ǝ;wpu 8C[[^uj=aAGJFxҥv&Ϝ9k֬iv>ԍ9 $ d>(Buj5x<ej~G?“O>|#XjΝKKn2 t]CRA*(z( 4 j@؍H$`n)2nbpv~݈D"( t_ݘ0aBӚ,Nt: Պn$IZx p:p7>c^u|So+Wbĉp0M~zHp0 M(Jp8< 8@_+JX,  !HТGch,7Ow^:8ibҥZ7o!hIg( -r_!ŇNDQʕ+i;w$dH'#<2@bx׿I7MlLnV!Lj5$ j1(z7G?Q*`XC3t](hiiA0(Z}Æ X`9m۶ᗿ%.B@TB&f@0DV(PU Pwł|>͆p8LA+ 8* $IB$AVtҮ~ۍn<ɓ'cԩFw^ رi_O4b1H͆nP---p@jڇ-p@UUO(^}U\|8~* à~SA}<# Be|>q8plvntvvkyB!L0ND4P^UA܉uR8b͛QVq 7P>1{b~,]\r 09'?9.v7$[  5#1 qcZ䢮Բqj: `1'NŻヒ0m IDATj: T&BXv-.BM9ݐeGF!t0y,^鵏~|!x$󡻻P$5u[,x:DQD(B<Bo[{شi\.Lӄ(3a@u$&Պl6+WfŋOPKz]aZp8p8hm^GRa5a \>G\~iv~g2Hzłx<IFg~0fɓQ( IV+ @OOƌz#T~>iudtuuA4x^X,A۷Pﷴ& 㠪*-|_-܂wy'8|ӟƹ Q4SBI3Ǝjx4Dwڅ;&LoիWcXxq?V@D"χH$Iv\~p xH DH'|*X," BcH$u.~v}":̉ *8u]غu+^yx^,\ӦMߏzހ" /M~j6ٳ2}@8|~PL&3"oOuqQ1sLB0vF+ `&N;4εk50  vS{B@ga>`0b̘1>}h/#LX,ҠM{{;|M?p}oF8xO;v쨬?4;;;q饗6ݠ|C3<QaJҀ5"IqiQ@f"`J;vK/1k,=!nX &/Jx1|\px<~s̡60T*Apv|>*Ozb[C@S1&Vaʔ)"HX,X,tR"Skp8|>D"EQŐb,M"eDQXVN;,r2h,АIrTU&oyb<EAgggw;]O8spE{E&>MӨh!A4 bjԂX PcNi]ǖ-[*>OS] GkE&N ?`0 ct8N6Xr|Rb2Lg0 qLIT i%I{1l߾7ooUVQ/y",xR Hg۩-K6P3(bP!"~E.28 L@vA^6nf!NS"W*zJ:q`Xx8gƊ+ݍ;ׯqUWᗿ%4M߃jJS? HT 9=IffYZ 7x#}< r]tQ(~Շ e0 q8v͢i[ `0 6`…ظqh/ LsD1~xz뭘9s&.2*V˖$uxwv/A)J845M]$(Vr@_1nsRq .#lL4 v­ފL&n ,R AEadYu*Q(VB!\.ڵ !4 ov;-L0\;Np˅H$ݎަkti躎O?'OF[[ƍD"rRj ߏT*X,Fv]].v;4Mk:M0yd(bHl0hg>$I+uV8p_~9VX|xWwR`0 x(0ǠLfP_FHaPV 83ulǂxw `0F /[P( Pd`>`0ctGy%'R SNePlقO|8zo񓅞hK,K/D_8/piXq:MDl'aevau]rXb톷X,;^4?D4żyl2HJbHg{*A&GUUo_TpA*{.M`0 ɍb &3 8&̙ \rh/e!]MOOZ[[MEZ DK&d2PUJzȎ;ӟ?>=ґ:2 Ehg,$0 IK?1-ZD쉨o>\wux<7 .{֭[_TdhGT*?~O`֬YxGi1|zbPU ,mɁO?go Y`0A\p[bx|`0DŽ >GES\.A0f̘^ כvv<#" " ! !rQ!|TPocί~7p.CR tpX,(l4z|>_|^z 0 Jf "߱cq_`0y8N`Ti}@F`0 QfaZG;XjzuJR^;_@ਂ5w7rS/zBP5M᠂49 UUaJŰ{nL8 N㪫ҥKO} mmm袋|@_ ϧ:j\^vi}@RJl! nfVQ!5  6~$ *ԍ!",JƎ QQVL&fQ.8X,by$C DQD2ŃzT*t:M`׌("VDĉ`0H ((˨G|8y`>`0_7|K_{*@,jc$r\.#H yjs(2Lshx$AVGٿ "֮]K'iԊ^Swo".o4p8iJ<&M:.\/`W^y%6n܈~z׿YfxO%aX,^/عs' tttfpFb`0i4MzL2eX.DDEPED"PoܸqE4mzid2uR X,Vc8N'N'-HˣsCM;1 'Nߏ~غu+V\gy?<$I… /~3f̠VX,I?ԔիQ*O|jX쒎vzmێz[ `0F`Ol6 ͆D"6X,j3b: àM&Ełt:M =<# "CDQyjB!1X+˨jpg̙Xj~W_ŲeO`~ecƌŖJYQT3E`XPpeǏ;wDR9b+ `0'$yEN A1&3 1jo;:O$`J]]]CNZFv0@K @(,PU,z3`2^wv;AFi:j,>1V>X,z0Mr,4M\}8pfΜ˗c֬YxhO&w㚄L&rL>ax׮];v,ORC$^rNEi|Mm @oo/NI~g"ƌJ0hPUo&D"no xG8vIV_|1.bewòep}6n6|sg 0*EAKKˀ=sp:ԦHef ~: ;#:똶`0 ct!C$GP(pi0`0 ƈ1e<3Ϣ(G\$IM?#~LPvѓ)Rl) hmm<) 4`~ < %0dPrFd*0dYn =aPMc+M>,˸kp50 xױ`XV,Z-¤I`]QVi\.8ó> UUq%:%IcaX~=}[o1`0`0T ԧv6~Ю!$I,T8&]V5C$D"*VUE*< Át:MVXhrbsNlڴ rpP튢H' Àuz P)SoaƌXz5=MqOErJ?I&#˱X <4M۷HahQNQp8ha @n:OR bVmmm@OO<J=GMDOO $IPq\DCZE\f"FZ$I8~ zL4 "NYiv d~t^ 8O?9s`„ Xh I-꫸ˏ~_{g4=gA `8fAiFsdY>`>`0¶mȬG:CAmҁfN_<^ݖ̙3@_=xJE\.G-XuB`MD^qE֭DPǝdP`X0e$I*Vg2TUȲc"yT*dYp6* EE!ˡP(f@@`͑bAWWsoip6H$T*I&2Z"L"yj5$IsڿKK$*:7aCZ "Q4a(r-anCQ:yBDBႹ9ٳ1{l`0~e\v L4 я~tR+<0JjT*8n{P3H/ .2K/4=TX3f vӉVt6uTaƲeMV2<ϣ;wF(j*x_z϶⒟8pn4Mp׋{b`ر0 I/ PUcƌ򦪿N\nyĺ#LB$NX,FqmiVQaR L"Љb7SC~2 <|>_%ϡ((1yq:E$T*!H^T* kZ`Xhg~s=Xn}YȲ Y!4M>s _ LZg0 jV#ϳp`0 p_Ʈ]N)/^o~PU]ǛF "oL t5M,jشi~᷿-:::d|lٲe6 x$O?K.!ƏB@l6ZFolhm穨N:s衮*@CH'j* MP,D܄˖FTX aT~db`X:Lӄb$IHӰZ`Pՠ(! $p ?v+rTPdYjCkt:jzoiiOQ'aC"Ν;b YAep p )طoߠm)T A nѴImӡb<# !JHh,io d2A@"ѣ>|3G^{<1cz)|G}`0 88NeT* 0`٘/I `w~Jer9d!ENx7FA `0ޟpQ.i:O2Nh`0B"ފ;7F{9'/?)"(vJ#lP"`jtRlڴ axG`8}JJBE"NuK#+HO @ZԩSbq зK;::F: ={:].v܉cRX k;#NC$MNQՐ!IWj`a@eTՓۛrll)!5p8Ӄzt]VUZ"Lf YgƔ)Sx!bSh/o߾`0 _AP,Qը/HZ2 &3 8vX,lڴ D} |8V+OַNhiVehGyKobXn À7 r-;vl{9qP(R `P{BZE"p} xWqg`To<}=T @mO"ط`0 p8pwn =7oylݺ ]QVQ.Q*`h?0CnæQc=UV!ɀ8\}ո;0k֬&]4hZYht`7D'HT9Aj5ٳwukwKr46aҤIM(H\.sM P4Mݻ. Hd@A8CZE$(PUxZd2 `ZH$xrr~?8G#2!|IPV2'IX,`0T*] ՑNiHBgg'o L?Oa5MCww7LĸqP(H$`xpATUڙOS BH$MVPfH$B'6|>!; àYr ۍd2 χT*uH1P|… Gm͘1 c&3 q<\.TUEZETaZ'uS&3 `'."X,dB:Pױk.T*<@ H$Bqr447}ӂ uI|`7:>HӸoرN0 8uh 4 rzvK#`0 qطo.xmǃ~@N<A@6 Ej IdYDP6MZhX,uc۶mxqXd zlڴ 7twM{4N( :ND?ТGc$n1n8?dT a`ԩD"0 Dp\BEPڸp8ǡ( @$ P,/(uN ~`pNd2? ߅p8L8""}#tқ L6߀>"qX˞uk=G `pY%cZEX|`0'.ܹsDCOvn&i'?^@ eV,#ЎlχrܴV 4<0 Hm<<CPZL07|3:8&L9scXv-RVXAvTUET(ػw/<EtD"Rl6{D{z˖-?/d|ZXVZ8RB0eppPPCzzzu?VHPBQ$I8Nav#"JѰ]UUj'$Vn#p AZ (RLlakX,Ңyv8( G4mX78#ӛm6a0 q2 I\.{P( :10 `0'?eyrø˰a8sx,PUڝ}(p8p\M!L|>Oϡiti4T6Z$ A/Q!Iv;v M 9yj$25BJ2RzCfP vL<.+)0 8uEn{@#  `0, ?sq¹+`x'DjEQ{P'RʲB χL&AEJPqD"~wC駟aW|͘>}r9vj( ""NpjmiD"@Vij`͐$ s>?Jb:(͢R @E\.l6 Yq?H&lu===5Ԉw.^pr===:Q6E8ijw("Jšp 뺎T*X,vNLjqgRѹ GqE `0NHmTC; `0ǙsgE&N|mr^/,݆iX,ua0 tww0 L8`d> L>k׮_G}(T!bEFr4Q,( zzz I='Bex^*hoܸZ gqf;"E|UU!2 8Ȳl6r\.x<~D򺮣T* )gYH$BD`&qzꈢAPV!4M((C-1p]_Tֆp8\.ZD"A-ĠV9$ǀ+T*UUa q 2|`0Cq>\cda>`0QxO E/} >k֬(KཀZ=l6L&B`0qQ[MfB,7 x^XD< nL6 >!Mq| OntvvyAHh4ڴn͗_~ǏV4OJz{{UMץDTB4E<R~GJBf8l6KCXnD`iG&A V(BexHvA(F"h 9&$ID"p8׆ji`aY Ա|`08&ޏLg0 1*"e0 `=Lg0 1*|CڵkWrbpXp!<^}U(uq0X,Q<ߏ}kKqF,Y}]ߤ -Œ3?km<^/dYa}Ht0A@N;:::8#U"4N+Ǐo*ر.1 ` 0`0 ƨp9^ cɒ%VXr%>ME(ǃCQ χH$BBUVOԩSl2̝;/"z!L4<g?'|k%p(" N#ˍ}à $@xq(8"͛@TPenyx|8>."Z4Z'm8yiسg(`0 |`0Ɣ)SF_: 'OiE0DTرcF={kA0ArJR)7^HzNmUJݯ$IM]w֯_b8Z \.wT;'4ݥR 蠢ps9ӟ4Y萉4iW~|>B ,;VR ZO8C0D8FXD<1_yM72vXZ)j(TwÐ$ r]#^?O◿%&9È|3 `6Lg0 1ꨪ|>?8!,Y֭'<BooƴiӰa|k_}vtMp8tTUV!Hv{ަa̝;=ܐl:MQ`XEK/aΜ9;w.x *g2AgYaƍ6m8]v8*JO`pIp8hi2Ø1cD硪*A@8VHq~?"* xS1 b4/a88NaL0Bt(JkݎD"={?A?:Ya> `0'#k`0 q{i' n/~ | _ىkb͚5сH$B;ʁ:N'4Mq;Z"C4x<r ]r|<> VbW< ÀaME`ܸqC+ĕW^ HRMi(qT u{ŋggb۩jmbZfyu>oX>s+*(&XbDJPbƫ~hcHh!S`B!KSNcx̙3 xZ8mg9yd2|FEA$-zT  !"A@CCÐsKbʕ={6)1RAB! !2l6<7kQ\r ~md2/Xz5>C|?ٳgjS,YuyX^lF4ec6E>@( ( ,z~Xt)Bv{c0͈D"#644T@S&8۷*d2jtU lhDl긬Vk‹D qjZF0LlJ~(Hxd~t:՝rhkkjdQ†B kycƌ3<O?4FcESŔ)SqkcǎQ>"B!('BȨ뮻`Zqyf\{غu+."s=ꫡVtWJ!Z0?l6# \.CTP(j^FFСCp\hhhJVո[ny!BV#NPz_ (*3T"g}6-txnqp8( ,rp\lCV㸪הJ%yh4V-b{)Z'OF,x)\dݷX,C`H\F[[_qf3UL&wd2AR ra޼yXv-nj6T1~x6ѣ'B!BzdB!dpwWDR py!J88p֭ 7P$FQ477# B8>gRt:m;dsZ,\JI-Z5k:D"77of̘w}\nD֪@/)߲e &NXNcy]@5ϳ8DXdpPXaZ J9"l6c„ 0 IDAT|#Qp8p8`^h(:::rz 7fls`,[ +WнG|ǣgݻwґB! !BNd2 Q1}tV}rP*P.q,|>Z-mYg0fqF#rxNc2[Vh46fU x>]]](JxױxbW^ދNL>}Īokq9pW/7 :U 땪5 `6 \ !BB!r]va?> ?N]vP(@T"N'p\.#@CE߿Ga=9Gz @տr^R /VZcǎy;?jN* !BNB!䔡h/|ׯ䓦Z7n] Z-k܌[n2e r9DQ 6q-"DQDTB$Agg'2,__|1&LPF& ɰRVhvyF(JVo0 "{,h44h45J%DQdd^GwTZDZcǐBR+ T za6|@$(BPJ<;v,f͚?Xdɰ]0JvB\wB!TD>!BN)7pn>t:R |Eh6q̟?_WqPZ."ܹUrۍL&NZԌ .ƍ{/Nkk+ VL&Z}R{S*(J?tuHOP\.WDZ5 DB!JAW'Q N.x>ӝTuffǏ@SSko㦛nT>J%J%2 T*YnfپhDSS0v;bذW$˱`^{>___->L&l 0ZܞBaRShĉq<.vnRL&n7NP4=ϋbq}Ftuu 8Xj$r8|/Hd2F#{=P(pmaʕшD"qBB!('B)iΝXf ~)Lpގ1cƜ*CUV *J &Lo:\ʪ~֦Ku: % W%tTb}OT0#8\.qP(hnnFGG(ksT*t: ŸUV χh4R@ `0U qAR)d2vH䄎o(Z-RTҥK|*jP4ȖB!@= !rJ:u*V+=: Hd<G>gmA ƌfDQL2("CEiV]ԚGfQ___X-[֫VP@T""Lf gᅬp8|mmmECCjY t:rbV[54@՞pDXu8vvD"|>=z:}Vn łayBP@wEnb||4fttt555aԩxqM7!9s`4L2DZ B!|B!4 z) O\x|\1+c&Z1m4"F*Py[AV) <+Re\.?;ߠP(Tr:+ QWW 9ڇV%jnP*W>Ҥ+@{=pBl߾yюD|dK!2('B)X,ccX_T*88*1Rw"@XdGNXO3fT߳gvT*466>G.PBGPd2jH$YUql6rF{IEtvv8lt!BG-t!rY<.>aU x0#IjqSQPfD"C8FTbqA=)ǓzZl* !rs7|(, +{yr@ Z-Ne a6L&p8Bz^X,r<`@ s\B1Q{ErUWd2ɂWhښA|:t\m dh4?˱)r\`<A@\FTFFTBGG\.d2("4I Imdz|V~nͅ8YN'(N'<+ԧ>ǃ7xW^y%F#RqJ>=+?a.!B< !rʻ 0ڇrB*2 R @wnqѥZf3r9|>Z- CqJ%(J]RqpB}I%=3X߻w/j5z=DQdA=}_jS GUUL&Ckk+F#, OFq0|,|UN3ـhҥKs+Z>JzXx566B׳={j%B!#|B!x… G0N(U֪T*gu)X,bCXRp_ljzzl`f^,=~RR\Dyf_,V{R5<]%?PopB_ q{BT*UOV AXxŠj1a„~|bL"JbNC h?D Ϟ@(Fkkko׿u~\g?}9ôiӰi&ݟÇ3B!QO!rzX,eV[:l(ST~*bp @ӱ}rpvx:r>﹯L&Bʊ*+IzDѰ Z[[Q__( Up5 z=L&_+E l|*H$l6 3`x<^. PRU!#NE:"8( @… zj|k_c:>|B!|B!V֬Y={态y(J#J X v;0ڳ|T*BfH}*Ça4еX,UEQD,՟t:v Gc_ZT*v6 @wx;w\R{PR\.ju$"̕J%( OQxj^GGG:;;r`D4 lW;ǎOtRqx衇N^ThݻwomB!QO!J[[ۇ7|kH$!"f3t:n |>\F\ٌH$Q308vZmRſԺQFQ* Q(X{bA} bh4Wԇm>NcҤIτ pa P* l*jCE~ABPl2h0f~=z}= 4lN\.Z*EkZU8lڴ ^xqO6]eB!dp('BioƱc`GPLh4P(@T /[oņAWr:p8d2͢(BTh4Bղ߂ bv;6 >VJBh`Zk7q}C zmeKLƂ jooJ¸q|h"- dYף E V-R8yr9LE\.{6[\fKVk~?4 xAXD< 7nr98kS$bma]jd2D"?~J+H@E t:|>x<^P(H&Dt:TNNZZRDPl68D"r>Rm@ٌx<\Bн aرljT*t:g8FX,,Y&M3R&XVz( J%L&&444pesϝ1a {>B!'B9- +V'X,Ƃ}kdxGtb*\w:,7 p8UBjw:( X,֖GhvWլliG8v=zR @-"b}>dd;؞Ì3|z-~\>Af86 /ƴiӰelذ]v"\. N'7L&hZtvvd2!UmbT=n4Vdxtr/ B08v b;:BmHb,Dq饗H5 4 @EO0*-QhtW_yxknS.J{Z*yE,cA4XSrtv\b IDAT2h[Әfnjt:JkUWHɒZ Ɔ 0}t LVs@ڦje4T" !`ܸqp8}h4dy4ZZB0Bea3Ti~<R``C|j(ʪ`4t:l3g_2VXqTSB!A>!BN{W˗ J:qH&fy/\.֮]DZ?)6l؀5RvY ja6YUKU* H2HT kM&, B3f . ~ErՕ}@ζ6\r%Bs &6:T |f.=E"X,֒ rJZt:R ~cǎ^qUɉs:<6E ]R.lA#fzE]]]UkY`$6m47c('B9Y('BifA`۶mEuqehZ 6`0g?~ӟj⭷³>_X,BAP,R҂\.RY݁`C8F:hooyLD"X@Y/p8̪ץd=ǁYbrwu{N.*?x @TnPg  xu:n7Ba6< :;;zz S@j5V8}1 p\}-vDb}N0R<Ǐ~!pTO!2:('Bi`0w]8C4qTp8oCR6~߲̘1ذa|I0LrD"X,8q"$RkX-Ufd2XVx^d"`hB{EU⋢8`z_*+łrRrz֗eւƘ1c~_ x'O{jP(FF68(J\.Voۡj&DQn0&C# _ZH?@X츶i4aX<Ӊl6;$ͣr¿&}۱e˖ˇcH^P>!Bu\uǿ|}Z?{ޖWܗW6 Ją^b]wDQqػw/͛?KO"(p\5_P(u|>nB& p8-@8f Hh ZHAբX,V2 |2 T hI$X,0 P*X`vڅcǎ!"BE$ L&J%d2FEd2\.+կ~ dzY~4E6eCBjrj~x<$I6\.D"Qp桐j״+l$f +3`Æ xWt̂ Tͯ8QcƌAgg't:!BN-"O5Dž~~Ŋ?QqB!$S*R (˘4i|Mp;o?묳vZ,Zmmm[TVKHBfU!"b |>_,4|ͪ^)UߗClu:]!=3mKV`0&-zΝ;1gd2( 8:ӧcǎS"u56(yرlx8T*P(vF# M&b rb >jN. l@px NyOplS+0s<8? K4PFGE۷︶K!B|B!|رwy'v9ڇ2N\.ꥫ 2 R ӧOǺuqnFlٲC=/| ~eh(?*~?m^r {zǁuYھ[ mu"bEd8r\.*pﵷ koՅ R)( d264X.X,rs.d2СCsɉ3lqGj3PzfL&C0 0T* q= DQD0gLEtvvBѰ+I}w=mB!C>!B>Q( ~ߍP(X,"8d2q9s`ڵEW_}5YBTg?q󬂽]PV*ݞ.{n+U+JpD"1t( 8sƍt_ ^NEB!;lPmGjT,<"xgcZ qv; z=Y+X,72 !rEaƌ0ahJf3;D\.Q.`X(b…8<㗿%ﱁxW+v=B)l/ /ݖ-$l 0f{0l{ܹxw8tuuAT*68NCTbd2 \X r˗/GGG_f{}<B8bp~^]dK!r 5B!HPG^G{{;L&,+"4 k]C "/^Cgŷ-|߇(83h"<xg`2zV:lUyeی~g8H!zX  EU|pdok۷o93~u:{/_|1/_;t: pǂ} Bǃjf466~n("J!ˡ @Z~mZ-hhN aKD0}~jn2By2 J}IR_Ɯ9sJgX,k. ( 2 <{}gV{B!Q>!B(E -Jr_;tµo~/~ǿo`լ _L; ʁ}Y /)d2R BbBL&î0HH,ܺukUYXT*X,d2l6T*[/}K8ٹ|<.?u]b[ӱ(߳Z05`g,ϾwyZ*e2d2r9r9 ݥҿR/ݗ; , ˪"ƍؤ ~0xt/PHv& VjDZŝK.o6kш.Al6nJ%gر7A`0߾_!Jh4r+/|>v \.u?9?aժUfxOxC9)Dss3m@7pv{r2 ("_zVUC. $@d2v#LW-,X/"vڅٳg#Fr.{ݻGtB!Q|B!|b}ӟ͛Oz`>ࡇbF#xi&,XV¹瞋[oX o>\.|_d\|Md27n.VMg^<ϳwm۶[o /p8[o Xb(/^3gBEqY}N',YF`۷nK,A}}=6n܈M6+o~{[P(h0sLvj5.]>3;v" B֮] A`4Ν;qرcJU׿3fe]{ & q7:wӧOaZ{s=9<^Do>O quaڵXx1f͚M6nh=; |B!E>!B>>l_~[lm0w\Sbʕ֭['/~ݎݻwcʕp\طo~_PT}„ [|9֯__r-+J`JbDV|=׿b…P P3΀ƺu}LJf|]]]lh4J}jD"f$I?p`JͰZU-{ƎOӘ3gꫯF]]V^ xgvZ7"͛;v`ժUxwpUW .%L:SLa޺u+&M> jq`ժUظq#."o +VǑ#GjkXv-q`֬YسgOUm0m4~op8pW/G&c=B˟hmmŦMfqwvߏݻwcƌغu+Jz)r9/|*+w}ؾ};i|Ν;r~<͛7#K_R"1czrDL&SU`0@P LV=+`ɒ%W: { /2:,Y6 `۶m… ~_=Vka[nEKK nxXd <*^~7|3n݊;gΜYs_ǎÓO>_W]u^s9Z]I83pSO=  c̙s[=vLF `ѢE =ww>\{xqu<#H8F>'\s ֮].̞=`<[K^oբ}ؕ,B!dQO!~?|>hF/<ϳ>pbxf\{Pհlظq#;̜9s݋: MMMQ__>(\.c8W\qDQĂ o֬YE3g`̘1[׼}_]~wzNj#S^Ø8q";<Hshg%˅oo?pp8X/~0Xz5kU NU6fx^B!R)zNǂRQDP(X? .Į]P*uV\uU3g.rbĉرc H$ڊ֭[saϞ=سg~?2 ~T*aΝl!T*?day,C[[LRs_ǎ_\RzRX~g⣏>ï~+|ƿ/wyx뭷jnkǔL&ڊɓ'>̙3uY=,zyv$Iݻr"+)S5N*3 }]X,Çc̙83q|;<F}a̙F5eنtL]]]8}CaĉU8Pp:0 HR|WIRvCPU]q p8g?YO̙3G,ħ>B!'B?l۶mCꫯbݺuxn:Ik*C. c!Ja͚5سg.Rlڴ >( @{(J<^~}_ַt:]KAՅH$†U=/. &-L<^z)|M477C&pmٳgS{9?Q OO^fC.c)b R 'OhޝUݛ}ifiՖPY_@a"(l*CatDqpCGeDFU-*4-fO.?9,wI&̝{{y~٣k``@ VGGnYVƻ577k߾}z׿UVЇ}䤶mۦ/| Zv8 =c:pƴyf{:97l- IDAT}wءc=V- '\[nյ^\+VPKK*++󺦝;w]dRjhhPUUݛݙfOyy/^Kj||\3555Zt:;;ݿqZ[ .@[lQooN;#3ꩧf<  >1]ynÍ?_/X6mR__>O oxs7t>l}T}}*{%\!\R$ 曵rJtMo~w78θw9w߭z]ymk3۷]v#H[[zzz466t:v[Q&+J^~ɤ)/lS DB+VP__bUUUi~"~;uvvjZvl٢?OZ|jMNNjg?͛7裏Ȉ;4w^αtq>ouVkdd$NI'G}TW_}?|?|y智[u3k^w}Ӯ]z^K,ѝwީruww~$+kZzR>O&''u's6oެUV)LjÆ օ^MhllT[[imS[[KjbbBLF~fݺu33-쉅Ie,|u+nY˶W\Nxq:2 3<#i* /++See۵|reY=zui9'H_gyFڰaN_J/򖷨^w_zuQ#iγ088d2twwFuuuݵk֭[zm߾]+V(&IչNJ+ l6x<$GRZRw+'X3e^g|W6$'8 dٜ wso6g9i޽ZreΘ|XmLFV]]Kއ?Ȏ;t7'TUU;^\r#iYCC6mNg~؝Hf7uww9'v疐Azꩧ7IUUUھ}Q w\䵃ZhQɎف####'?kC\_+Nkrrq]YYt: UWWkddĭuZƜuYjnn֣>VUW]{.8uv.hDC=H(}V7t 7{U y+**KS9I1d2^zIXL}}}PTYYn~;w35i;OCCC'?.mٲEjooסC|+ƣL&Р_wƍk.{챑}Ϟ=:ۛ=φAֺGՒ%KTQQLu'>p[}?>>r{ب2=:3UYY]vM+BC=oݺU֭+ɱX(e*ͪG>aJ:t萤Pٙutt)LxgK 63G$z===:x:;;ӓ}h&IUVV^QUUFFFTVV!e2b1:tHDBcccrC$kxUss-[Ab1]s5Ν;ܜ3yr&miiqV?G?Q.T===W\Jow[h"7뮻N7xvio>O[oK/4O<񄚛uiiZb騣r瑦zoݺU>I*R"P__^οź:566EDB˗/wykdܬL&l6NԤAR)tIڶmɤַjll$c_#G==^t)U 7~$g{*R<wvOscz׿K/4!Bb {zӛu+Ji߾}Zv:(u]۴n:s1Z~ݛ7 }#gV}9=N/N~ttt?>O'ЪU Fޟ)_TWWGmmmrS2TWW]В%K4::t:X,D"_|}TUUI8p@-R"$tIzѡ$cO=TI P$ؖ)˲K/)fP.H]t\_Ą٬oz555Oj~<wv8n!׫ZjhhP2sm}14|mO:V__īJljj$xqQLpppXYYG;wW\_n(<#я~T7pկ .p' ~߭ui``@?-[ }_V,sYz.B޽۝Lֶm۴~z|۷oO?7JO><===ڱc6nܨ|3o~?s=Ww<K,QggsZJ-ZH/VZ9Nڪ*vZ[T*% gu^׍7ިիWurJ0E= m~οRWWd2^GJW,uUWmwoGй+dtuu)Lbsss;!ؘRJWuu[Ԥ9~վy_K_6lؠoYwyg9l6555ӵ^}{KcYF?o)Ji[U]]D"x>=t΃3߮׎;t5h͚5jiiիUQQ{c=V׿KzsN7wr͵jݻWusթ~ٷoV\>Xڽ{*++kѷ-bN,M^8MxbUTTK===ӲeVXl6!neMMdئM׾V_xgu?SOOJmٲ%۷o M~پ}N?_^r6mڤ9&ϥʜWB֦&c_LNNjrrR]]]ZlTQQ1mj[E|,w};ѓO>YmtזcŘK}~ŕyo|5000חY6ݻvUUUJNeee+ohhP,SeeƔdH$ܬڜ=JM볶@SS;N8Auuuzg%Id+j_O>Yu^|GD"wvZmٲEӟ|r^ZTJ_jMNNjg?͛7裏g͚5;qFo֙go=+|<###ڰa۪gժUz{ޣ3Ei``@?%Iuvvʴd-YD/0V[[^ת_]]]9TTTh|||u,[L_WiӦHJ{Hwb pcaN x7cz@]/3㞗Y/{mFQj8ap^:w;N=So7А***TUUKs=VMLL---Q"pn;^K/r9;tPho{SRT -ZH[l>s=z;ޡiȈLju]wk_~iݺuy]+l6UJ,USSfU"P&QeedtMLLBjkkshkk`,sƍut?_tg_~~ӟt,|b%,逤+~/g{ʲ,g=zֳ=ku{W6$?|3/;K(7ՒKj|3Ƽ~/տf}_0_g<~/o m7`TrCx?elKyciG[@Pȝ58hڬ1MP{^ |0_e<˶|м7Ȍ?,L޶OÉyXT_( rX=(DVk,d[>}`]_Hpn+cp{0]ٚ&,;|ٮo[ G~EQ>}SL>wQ|(9pٶG͎ ʘ\QoUϛQ_1q2b2ZSh5;N3o|T ۣl7zX/:6'PA` Aa~6sX6ݣiF|`G |涠_|g6njeXQZ|c滷p\G%7e{ G^:to?g/7Y}ﭺ7x? 'LG mkfv{1 m~Afpy-G易:cNNW{ec=,V ~l% K~p>f5msč17w^>#YX5tXG rN-47-L Ͱ dBla~:~Yϸ~椶0ߘd7|3>w.YƢ/RQzGP;op] deG8^Pymn#oj ΝlooZ˲l nK?fcX>m` 7?cbmY~?xǔ z6|TG ,}Gɛm4cl6tH| y:c7[Ihm1ϺmZ[on1_%zޛ~Q|:{UD^*V]eEUK>` |s9aCX^b|ym!vv-ah[Acr[[o}ȇ1>9y->.joٮ(~0/wݫ~%/eeYq[on>]1cz۪"0ߕ*ReoWo{ToUUܛ77[*%Iic=̷q˸m"[滠/p oXAQ+y|?W=eƸNǯ {[%>>."=(wƢ {;NK(?[ |3 ꃶ9Augٙ֬ķUG c"e_o{o(T;x7^x %{}?L|xUPJ+AAcP \o|*T{oެܷ}˴M\juc =& ;,$ae[p/_yo/}>~ۻ\ٚ{&WKA{VÆg_>~Ay|s棰2~$?cyǕAqToVKUaa{嘭s̉i29k4>g* ,A{X>jۜeخż(Q`(eoQ Uފ{޻;jq \|Kń~dlбU 󻧨^~6b1Ͻj.W>k0ǂ5JXo^l6Zc~KΑ{z2Bo [k s[6Yy6UGV?jeXqgV{'5B5wޣ gZ / ALU{قyGĶw&{遽s츦zo`=-{ɲl{"0{*݃m=&6(7m1Q*}wss_Xo[Yֳ֯mN|[ mQ|GPOz[{3 S!}A*yY: rֳ=f۪B{6iz|zX({zX{ 0?),/L^7,1[x?ĵ1˺ K5",7󨯰 /rQhyl6ż7-۪m!_EmYqm8')~A20IDATefHMv[hxoc sYl66&m^?J|o{Λ=\)|*fo\&u9q)8OJo [G %{7ᇅA dY(2fp/χYλso`ow]5{Hd4=a݆QB}۵[[;Q}Yv찰^cws_}^h1Ƽk.Y8o{if**| W|ﲳ6lrڠ9>JO`r|go|* (%/Uo3f/3"U >۶RoUQa}J ڟ6:hU 75UQ8aT>G*m *|sYmV4eNP,WuFǶ,$a~Ug,jemY Qpd—KU-j}5ٯ?,8Ϸ ?h=65ln,"IllaۣTU;ފ|yͿ0ݛ_h:~%Y޻l mm~UDO+[h0 ͖9Θdws?/,dQ|ma~|!湃j#Ejc '&N1X~t}Q` V;a~Ա(/Um9R |)r擄A}|ۇٮ=l~m~m,ʹ,BLN!qփ(4f7 aA~=hBö| {/ mn+f+߉mn:Y RB|X +A,ͥңT[u4>#44!w,x -9F q\Ǭ Rh/.3A۩TE~lRڰdx/B/m+¾Ij  ?Aatm+B?xx/R/E BB{{,T $7Fx/b/EAiTmukF{i{i|Wb{`fGد;$Ɨf'JY_~?4{ ݯ3+T;q># _/t/e@O)e ϱ:\&0&>(b#2:,||%?>3Dt1:|"i*q$a{QW Sy`H fC}aH mUl)b@i,s}`:|C8 p"0Daьgl8IENDB`package/test/index.html000644 000765 000024 0000001130 12220204170013464 0ustar00000000 000000 Mocha Tests
package/test/spec/hash.js000644 000765 000024 0000004071 12224121532013715 0ustar00000000 000000 describe("L.Hash", function() { var map; mocha.ignoreLeaks(); beforeEach(function() { map = new L.Map(document.createElement('div')); }); it('sets a hash when the map is moved', function() { var hash = L.hash(map); map.setView([51.505, -0.09], 13); expect(location.hash).to.be('#13/51.5050/-0.0900'); }); it('uses a hash set initially on the page', function(done) { location.hash = '#13/10/40'; var hash = L.hash(map); window.setTimeout(function() { expect(Math.round(map.getCenter().lat)).to.be(10); expect(Math.round(map.getCenter().lng)).to.be(40); done(); }, 200); }); it('responds to a hash change after an initial hash is set', function(done) { map.setView([51.505, -0.09], 13); location.hash = '#13/20/40'; var hash = L.hash(map); window.setTimeout(function() { expect(Math.round(map.getCenter().lat)).to.be(20); expect(Math.round(map.getCenter().lng)).to.be(40); done(); }, 200); }); it('does not acknowledge a junk hash', function(done) { var hash = L.hash(map); map.setView([51, 2], 13); location.hash = '#foo'; window.setTimeout(function() { expect(Math.round(map.getCenter().lat)).to.eql(51); expect(Math.round(map.getCenter().lng)).to.eql(2); done(); }, 200); }); it('unbinds events when removed', function() { location.hash = ''; var hash = L.hash(map); map.removeControl(hash); map.setView([51.505, -0.09], 13); expect(location.hash).to.be(''); }); it('parses a hash', function() { var parsed = L.Hash.parseHash('#13/20/40'); expect(parsed.zoom).to.be(13); expect(parsed.center).to.be.a(L.LatLng); expect(parsed.center).to.eql({lat: 20, lng: 40}); }); it('formats a hash', function() { map.setView([51, 2], 13); expect(L.Hash.formatHash(map)).to.be('#13/51.0000/2.0000'); }); });