From a775df93ef587d05ebb34ff6a25e4d550e7517c7 Mon Sep 17 00:00:00 2001
From: Fabio Roberto Vitello <fabio.vitello@inaf.it>
Date: Thu, 27 Apr 2017 11:04:12 +0200
Subject: [PATCH] add PanoramicView

---
 PanoramicView/OpenLayers.js                   | 26176 ++++++++++++++++
 PanoramicView/img/.DS_Store                   |   Bin 0 -> 6148 bytes
 PanoramicView/img/east-mini.png               |   Bin 0 -> 342 bytes
 PanoramicView/img/layer-switcher-maximize.png |   Bin 0 -> 405 bytes
 PanoramicView/img/layer-switcher-minimize.png |   Bin 0 -> 220 bytes
 PanoramicView/img/north-mini.png              |   Bin 0 -> 378 bytes
 PanoramicView/img/slider.png                  |   Bin 0 -> 247 bytes
 PanoramicView/img/south-mini.png              |   Bin 0 -> 373 bytes
 PanoramicView/img/west-mini.png               |   Bin 0 -> 360 bytes
 PanoramicView/img/zoom-minus-mini.png         |   Bin 0 -> 291 bytes
 PanoramicView/img/zoom-plus-mini.png          |   Bin 0 -> 386 bytes
 PanoramicView/img/zoombar.png                 |   Bin 0 -> 350 bytes
 PanoramicView/logo.jpg                        |   Bin 0 -> 19870 bytes
 PanoramicView/logo.png                        |   Bin 0 -> 91699 bytes
 PanoramicView/openlayers.html                 |   441 +
 PanoramicView/style.css                       |   484 +
 PanoramicView/tilemapresource.xml             |    24 +
 17 files changed, 27125 insertions(+)
 create mode 100644 PanoramicView/OpenLayers.js
 create mode 100644 PanoramicView/img/.DS_Store
 create mode 100644 PanoramicView/img/east-mini.png
 create mode 100644 PanoramicView/img/layer-switcher-maximize.png
 create mode 100644 PanoramicView/img/layer-switcher-minimize.png
 create mode 100644 PanoramicView/img/north-mini.png
 create mode 100644 PanoramicView/img/slider.png
 create mode 100644 PanoramicView/img/south-mini.png
 create mode 100644 PanoramicView/img/west-mini.png
 create mode 100644 PanoramicView/img/zoom-minus-mini.png
 create mode 100644 PanoramicView/img/zoom-plus-mini.png
 create mode 100644 PanoramicView/img/zoombar.png
 create mode 100644 PanoramicView/logo.jpg
 create mode 100644 PanoramicView/logo.png
 create mode 100644 PanoramicView/openlayers.html
 create mode 100644 PanoramicView/style.css
 create mode 100644 PanoramicView/tilemapresource.xml

diff --git a/PanoramicView/OpenLayers.js b/PanoramicView/OpenLayers.js
new file mode 100644
index 00000000..7f880d55
--- /dev/null
+++ b/PanoramicView/OpenLayers.js
@@ -0,0 +1,26176 @@
+
+var OpenLayers = {
+    VERSION_NUMBER: "Release 2.12",
+    singleFile: !0,
+    _getScriptLocation: function() {
+        for (var a = /(^|(.*?\/))(OpenLayers[^\/]*?\.js)(\?|$)/, b = document.getElementsByTagName("script"), c, d = "", e = 0, f = b.length; e < f; e++)
+            if (c = b[e].getAttribute("src"))
+                if (c = c.match(a)) {
+                    d = c[1];
+                    break
+                }
+        return function() {
+            return d
+        }
+    }(),
+    ImgPath: ""
+};
+OpenLayers.Class = function() {
+    var a = arguments.length,
+        b = arguments[0],
+        c = arguments[a - 1],
+        d = "function" == typeof c.initialize ? c.initialize : function() {
+            b.prototype.initialize.apply(this, arguments)
+        };
+    1 < a ? (a = [d, b].concat(Array.prototype.slice.call(arguments).slice(1, a - 1), c), OpenLayers.inherit.apply(null, a)) : d.prototype = c;
+    return d
+};
+OpenLayers.inherit = function(a, b) {
+    var c = function() {};
+    c.prototype = b.prototype;
+    a.prototype = new c;
+    var d, e, c = 2;
+    for (d = arguments.length; c < d; c++) e = arguments[c], "function" === typeof e && (e = e.prototype), OpenLayers.Util.extend(a.prototype, e)
+};
+OpenLayers.Util = OpenLayers.Util || {};
+OpenLayers.Util.extend = function(a, b) {
+    a = a || {};
+    if (b) {
+        for (var c in b) {
+            var d = b[c];
+            void 0 !== d && (a[c] = d)
+        }!("function" == typeof window.Event && b instanceof window.Event) && (b.hasOwnProperty && b.hasOwnProperty("toString")) && (a.toString = b.toString)
+    }
+    return a
+};
+OpenLayers.String = {
+    startsWith: function(a, b) {
+        return 0 == a.indexOf(b)
+    },
+    contains: function(a, b) {
+        return -1 != a.indexOf(b)
+    },
+    trim: function(a) {
+        return a.replace(/^\s\s*/, "").replace(/\s\s*$/, "")
+    },
+    camelize: function(a) {
+        for (var a = a.split("-"), b = a[0], c = 1, d = a.length; c < d; c++) var e = a[c],
+            b = b + (e.charAt(0).toUpperCase() + e.substring(1));
+        return b
+    },
+    format: function(a, b, c) {
+        b || (b = window);
+        return a.replace(OpenLayers.String.tokenRegEx, function(a, e) {
+            for (var f, g = e.split(/\.+/), h = 0; h < g.length; h++) 0 == h && (f = b), f = f[g[h]];
+            "function" ==
+            typeof f && (f = c ? f.apply(null, c) : f());
+            return "undefined" == typeof f ? "undefined" : f
+        })
+    },
+    tokenRegEx: /\$\{([\w.]+?)\}/g,
+    numberRegEx: /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/,
+    isNumeric: function(a) {
+        return OpenLayers.String.numberRegEx.test(a)
+    },
+    numericIf: function(a) {
+        return OpenLayers.String.isNumeric(a) ? parseFloat(a) : a
+    }
+};
+OpenLayers.Number = {
+    decimalSeparator: ".",
+    thousandsSeparator: ",",
+    limitSigDigs: function(a, b) {
+        var c = 0;
+        0 < b && (c = parseFloat(a.toPrecision(b)));
+        return c
+    },
+    format: function(a, b, c, d) {
+        b = "undefined" != typeof b ? b : 0;
+        c = "undefined" != typeof c ? c : OpenLayers.Number.thousandsSeparator;
+        d = "undefined" != typeof d ? d : OpenLayers.Number.decimalSeparator;
+        null != b && (a = parseFloat(a.toFixed(b)));
+        var e = a.toString().split(".");
+        1 == e.length && null == b && (b = 0);
+        a = e[0];
+        if (c)
+            for (var f = /(-?[0-9]+)([0-9]{3})/; f.test(a);) a = a.replace(f, "$1" + c + "$2");
+        0 == b ? b = a : (c = 1 < e.length ? e[1] : "0", null != b && (c += Array(b - c.length + 1).join("0")), b = a + d + c);
+        return b
+    }
+};
+OpenLayers.Function = {
+    bind: function(a, b) {
+        var c = Array.prototype.slice.apply(arguments, [2]);
+        return function() {
+            var d = c.concat(Array.prototype.slice.apply(arguments, [0]));
+            return a.apply(b, d)
+        }
+    },
+    bindAsEventListener: function(a, b) {
+        return function(c) {
+            return a.call(b, c || window.event)
+        }
+    },
+    False: function() {
+        return !1
+    },
+    True: function() {
+        return !0
+    },
+    Void: function() {}
+};
+OpenLayers.Array = {
+    filter: function(a, b, c) {
+        var d = [];
+        if (Array.prototype.filter) d = a.filter(b, c);
+        else {
+            var e = a.length;
+            if ("function" != typeof b) throw new TypeError;
+            for (var f = 0; f < e; f++)
+                if (f in a) {
+                    var g = a[f];
+                    b.call(c, g, f, a) && d.push(g)
+                }
+        }
+        return d
+    }
+};
+OpenLayers.Bounds = OpenLayers.Class({
+    left: null,
+    bottom: null,
+    right: null,
+    top: null,
+    centerLonLat: null,
+    initialize: function(a, b, c, d) {
+        OpenLayers.Util.isArray(a) && (d = a[3], c = a[2], b = a[1], a = a[0]);
+        null != a && (this.left = OpenLayers.Util.toFloat(a));
+        null != b && (this.bottom = OpenLayers.Util.toFloat(b));
+        null != c && (this.right = OpenLayers.Util.toFloat(c));
+        null != d && (this.top = OpenLayers.Util.toFloat(d))
+    },
+    clone: function() {
+        return new OpenLayers.Bounds(this.left, this.bottom, this.right, this.top)
+    },
+    equals: function(a) {
+        var b = !1;
+        null !=
+            a && (b = this.left == a.left && this.right == a.right && this.top == a.top && this.bottom == a.bottom);
+        return b
+    },
+    toString: function() {
+        return [this.left, this.bottom, this.right, this.top].join()
+    },
+    toArray: function(a) {
+        return !0 === a ? [this.bottom, this.left, this.top, this.right] : [this.left, this.bottom, this.right, this.top]
+    },
+    toBBOX: function(a, b) {
+        null == a && (a = 6);
+        var c = Math.pow(10, a),
+            d = Math.round(this.left * c) / c,
+            e = Math.round(this.bottom * c) / c,
+            f = Math.round(this.right * c) / c,
+            c = Math.round(this.top * c) / c;
+        return !0 === b ? e + "," + d + "," + c + "," + f : d +
+            "," + e + "," + f + "," + c
+    },
+    toGeometry: function() {
+        return new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing([new OpenLayers.Geometry.Point(this.left, this.bottom), new OpenLayers.Geometry.Point(this.right, this.bottom), new OpenLayers.Geometry.Point(this.right, this.top), new OpenLayers.Geometry.Point(this.left, this.top)])])
+    },
+    getWidth: function() {
+        return this.right - this.left
+    },
+    getHeight: function() {
+        return this.top - this.bottom
+    },
+    getSize: function() {
+        return new OpenLayers.Size(this.getWidth(), this.getHeight())
+    },
+    getCenterPixel: function() {
+        return new OpenLayers.Pixel((this.left + this.right) / 2, (this.bottom + this.top) / 2)
+    },
+    getCenterLonLat: function() {
+        this.centerLonLat || (this.centerLonLat = new OpenLayers.LonLat((this.left + this.right) / 2, (this.bottom + this.top) / 2));
+        return this.centerLonLat
+    },
+    scale: function(a, b) {
+        null == b && (b = this.getCenterLonLat());
+        var c, d;
+        "OpenLayers.LonLat" == b.CLASS_NAME ? (c = b.lon, d = b.lat) : (c = b.x, d = b.y);
+        return new OpenLayers.Bounds((this.left - c) * a + c, (this.bottom - d) * a + d, (this.right - c) * a + c, (this.top - d) * a +
+            d)
+    },
+    add: function(a, b) {
+        if (null == a || null == b) throw new TypeError("Bounds.add cannot receive null values");
+        return new OpenLayers.Bounds(this.left + a, this.bottom + b, this.right + a, this.top + b)
+    },
+    extend: function(a) {
+        var b = null;
+        if (a) {
+            switch (a.CLASS_NAME) {
+                case "OpenLayers.LonLat":
+                    b = new OpenLayers.Bounds(a.lon, a.lat, a.lon, a.lat);
+                    break;
+                case "OpenLayers.Geometry.Point":
+                    b = new OpenLayers.Bounds(a.x, a.y, a.x, a.y);
+                    break;
+                case "OpenLayers.Bounds":
+                    b = a
+            }
+            if (b) {
+                this.centerLonLat = null;
+                if (null == this.left || b.left < this.left) this.left =
+                    b.left;
+                if (null == this.bottom || b.bottom < this.bottom) this.bottom = b.bottom;
+                if (null == this.right || b.right > this.right) this.right = b.right;
+                if (null == this.top || b.top > this.top) this.top = b.top
+            }
+        }
+    },
+    containsLonLat: function(a, b) {
+        "boolean" === typeof b && (b = {
+            inclusive: b
+        });
+        var b = b || {},
+            c = this.contains(a.lon, a.lat, b.inclusive),
+            d = b.worldBounds;
+        d && !c && (c = d.getWidth(), d = Math.round((a.lon - (d.left + d.right) / 2) / c), c = this.containsLonLat({
+            lon: a.lon - d * c,
+            lat: a.lat
+        }, {
+            inclusive: b.inclusive
+        }));
+        return c
+    },
+    containsPixel: function(a, b) {
+        return this.contains(a.x,
+            a.y, b)
+    },
+    contains: function(a, b, c) {
+        null == c && (c = !0);
+        if (null == a || null == b) return !1;
+        var a = OpenLayers.Util.toFloat(a),
+            b = OpenLayers.Util.toFloat(b),
+            d = !1;
+        return d = c ? a >= this.left && a <= this.right && b >= this.bottom && b <= this.top : a > this.left && a < this.right && b > this.bottom && b < this.top
+    },
+    intersectsBounds: function(a, b) {
+        "boolean" === typeof b && (b = {
+            inclusive: b
+        });
+        b = b || {};
+        if (b.worldBounds) var c = this.wrapDateLine(b.worldBounds),
+            a = a.wrapDateLine(b.worldBounds);
+        else c = this;
+        null == b.inclusive && (b.inclusive = !0);
+        var d = !1,
+            e = c.left ==
+            a.right || c.right == a.left || c.top == a.bottom || c.bottom == a.top;
+        if (b.inclusive || !e) var d = a.top >= c.bottom && a.top <= c.top || c.top > a.bottom && c.top < a.top,
+            e = a.left >= c.left && a.left <= c.right || c.left >= a.left && c.left <= a.right,
+            f = a.right >= c.left && a.right <= c.right || c.right >= a.left && c.right <= a.right,
+            d = (a.bottom >= c.bottom && a.bottom <= c.top || c.bottom >= a.bottom && c.bottom <= a.top || d) && (e || f);
+        if (b.worldBounds && !d) {
+            var g = b.worldBounds,
+                e = g.getWidth(),
+                f = !g.containsBounds(c),
+                g = !g.containsBounds(a);
+            f && !g ? (a = a.add(-e, 0), d = c.intersectsBounds(a, {
+                inclusive: b.inclusive
+            })) : g && !f && (c = c.add(-e, 0), d = a.intersectsBounds(c, {
+                inclusive: b.inclusive
+            }))
+        }
+        return d
+    },
+    containsBounds: function(a, b, c) {
+        null == b && (b = !1);
+        null == c && (c = !0);
+        var d = this.contains(a.left, a.bottom, c),
+            e = this.contains(a.right, a.bottom, c),
+            f = this.contains(a.left, a.top, c),
+            a = this.contains(a.right, a.top, c);
+        return b ? d || e || f || a : d && e && f && a
+    },
+    determineQuadrant: function(a) {
+        var b = "",
+            c = this.getCenterLonLat(),
+            b = b + (a.lat < c.lat ? "b" : "t");
+        return b += a.lon < c.lon ? "l" : "r"
+    },
+    transform: function(a, b) {
+        this.centerLonLat =
+            null;
+        var c = OpenLayers.Projection.transform({
+                x: this.left,
+                y: this.bottom
+            }, a, b),
+            d = OpenLayers.Projection.transform({
+                x: this.right,
+                y: this.bottom
+            }, a, b),
+            e = OpenLayers.Projection.transform({
+                x: this.left,
+                y: this.top
+            }, a, b),
+            f = OpenLayers.Projection.transform({
+                x: this.right,
+                y: this.top
+            }, a, b);
+        this.left = Math.min(c.x, e.x);
+        this.bottom = Math.min(c.y, d.y);
+        this.right = Math.max(d.x, f.x);
+        this.top = Math.max(e.y, f.y);
+        return this
+    },
+    wrapDateLine: function(a, b) {
+        var b = b || {},
+            c = b.leftTolerance || 0,
+            d = b.rightTolerance || 0,
+            e = this.clone();
+        if (a) {
+            for (var f =
+                    a.getWidth(); e.left < a.left && e.right - d <= a.left;) e = e.add(f, 0);
+            for (; e.left + c >= a.right && e.right > a.right;) e = e.add(-f, 0);
+            c = e.left + c;
+            c < a.right && (c > a.left && e.right - d > a.right) && (e = e.add(-f, 0))
+        }
+        return e
+    },
+    CLASS_NAME: "OpenLayers.Bounds"
+});
+OpenLayers.Bounds.fromString = function(a, b) {
+    var c = a.split(",");
+    return OpenLayers.Bounds.fromArray(c, b)
+};
+OpenLayers.Bounds.fromArray = function(a, b) {
+    return !0 === b ? new OpenLayers.Bounds(a[1], a[0], a[3], a[2]) : new OpenLayers.Bounds(a[0], a[1], a[2], a[3])
+};
+OpenLayers.Bounds.fromSize = function(a) {
+    return new OpenLayers.Bounds(0, a.h, a.w, 0)
+};
+OpenLayers.Bounds.oppositeQuadrant = function(a) {
+    var b;
+    b = "" + ("t" == a.charAt(0) ? "b" : "t");
+    return b += "l" == a.charAt(1) ? "r" : "l"
+};
+OpenLayers.Element = {
+    visible: function(a) {
+        return "none" != OpenLayers.Util.getElement(a).style.display
+    },
+    toggle: function() {
+        for (var a = 0, b = arguments.length; a < b; a++) {
+            var c = OpenLayers.Util.getElement(arguments[a]),
+                d = OpenLayers.Element.visible(c) ? "none" : "";
+            c.style.display = d
+        }
+    },
+    remove: function(a) {
+        a = OpenLayers.Util.getElement(a);
+        a.parentNode.removeChild(a)
+    },
+    getHeight: function(a) {
+        a = OpenLayers.Util.getElement(a);
+        return a.offsetHeight
+    },
+    hasClass: function(a, b) {
+        var c = a.className;
+        return !!c && RegExp("(^|\\s)" + b + "(\\s|$)").test(c)
+    },
+    addClass: function(a, b) {
+        OpenLayers.Element.hasClass(a, b) || (a.className += (a.className ? " " : "") + b);
+        return a
+    },
+    removeClass: function(a, b) {
+        var c = a.className;
+        c && (a.className = OpenLayers.String.trim(c.replace(RegExp("(^|\\s+)" + b + "(\\s+|$)"), " ")));
+        return a
+    },
+    toggleClass: function(a, b) {
+        OpenLayers.Element.hasClass(a, b) ? OpenLayers.Element.removeClass(a, b) : OpenLayers.Element.addClass(a, b);
+        return a
+    },
+    getStyle: function(a, b) {
+        var a = OpenLayers.Util.getElement(a),
+            c = null;
+        if (a && a.style) {
+            c = a.style[OpenLayers.String.camelize(b)];
+            c || (document.defaultView && document.defaultView.getComputedStyle ? c = (c = document.defaultView.getComputedStyle(a, null)) ? c.getPropertyValue(b) : null : a.currentStyle && (c = a.currentStyle[OpenLayers.String.camelize(b)]));
+            var d = ["left", "top", "right", "bottom"];
+            window.opera && (-1 != OpenLayers.Util.indexOf(d, b) && "static" == OpenLayers.Element.getStyle(a, "position")) && (c = "auto")
+        }
+        return "auto" == c ? null : c
+    }
+};
+OpenLayers.LonLat = OpenLayers.Class({
+//MOD ASTRO
+ori_lon:67.6027,
+ori_lat:2.22813,
+    lon: 0,
+    lat: 0,
+    initialize: function(a, b) {
+        OpenLayers.Util.isArray(a) && (b = a[1], a = a[0]);
+        this.lon = OpenLayers.Util.toFloat(a);//+this.ori_lon;
+        this.lat = OpenLayers.Util.toFloat(b);//+this.ori_lat
+    },
+    toString: function() {
+        return "lon=" + this.lon + ",lat=" + this.lat
+    },
+    toShortString: function() {
+        return this.lon + ", " + this.lat
+    },
+    clone: function() {
+        return new OpenLayers.LonLat(this.lon, this.lat)
+    },
+    add: function(a, b) {
+        if (null == a || null == b) throw new TypeError("LonLat.add cannot receive null values");
+        return new OpenLayers.LonLat(this.lon +
+            OpenLayers.Util.toFloat(a), this.lat + OpenLayers.Util.toFloat(b))
+    },
+    equals: function(a) {
+        var b = !1;
+        null != a && (b = this.lon == a.lon && this.lat == a.lat || isNaN(this.lon) && isNaN(this.lat) && isNaN(a.lon) && isNaN(a.lat));
+        return b
+    },
+    transform: function(a, b) {
+        var c = OpenLayers.Projection.transform({
+            x: this.lon,
+            y: this.lat
+        }, a, b);
+        this.lon = c.x;
+        this.lat = c.y;
+        return this
+    },
+    wrapDateLine: function(a) {
+        var b = this.clone();
+        if (a) {
+            for (; b.lon < a.left;) b.lon += a.getWidth();
+            for (; b.lon > a.right;) b.lon -= a.getWidth()
+        }
+        return b
+    },
+    CLASS_NAME: "OpenLayers.LonLat"
+});
+OpenLayers.LonLat.fromString = function(a) {
+    a = a.split(",");
+    return new OpenLayers.LonLat(a[0], a[1])
+};
+OpenLayers.LonLat.fromArray = function(a) {
+    var b = OpenLayers.Util.isArray(a);
+    return new OpenLayers.LonLat(b && a[0], b && a[1])
+};
+OpenLayers.Pixel = OpenLayers.Class({
+    x: 0,
+    y: 0,
+    initialize: function(a, b) {
+        this.x = parseFloat(a);
+        this.y = parseFloat(b)
+    },
+    toString: function() {
+        return "x=" + this.x + ",y=" + this.y
+    },
+    clone: function() {
+        return new OpenLayers.Pixel(this.x, this.y)
+    },
+    equals: function(a) {
+        var b = !1;
+        null != a && (b = this.x == a.x && this.y == a.y || isNaN(this.x) && isNaN(this.y) && isNaN(a.x) && isNaN(a.y));
+        return b
+    },
+    distanceTo: function(a) {
+        return Math.sqrt(Math.pow(this.x - a.x, 2) + Math.pow(this.y - a.y, 2))
+    },
+    add: function(a, b) {
+        if (null == a || null == b) throw new TypeError("Pixel.add cannot receive null values");
+        return new OpenLayers.Pixel(this.x + a, this.y + b)
+    },
+    offset: function(a) {
+        var b = this.clone();
+        a && (b = this.add(a.x, a.y));
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Pixel"
+});
+OpenLayers.Size = OpenLayers.Class({
+    w: 0,
+    h: 0,
+    initialize: function(a, b) {
+        this.w = parseFloat(a);
+        this.h = parseFloat(b)
+    },
+    toString: function() {
+        return "w=" + this.w + ",h=" + this.h
+    },
+    clone: function() {
+        return new OpenLayers.Size(this.w, this.h)
+    },
+    equals: function(a) {
+        var b = !1;
+        null != a && (b = this.w == a.w && this.h == a.h || isNaN(this.w) && isNaN(this.h) && isNaN(a.w) && isNaN(a.h));
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Size"
+});
+OpenLayers.Console = {
+    log: function() {},
+    debug: function() {},
+    info: function() {},
+    warn: function() {},
+    error: function() {},
+    userError: function(a) {
+        alert(a)
+    },
+    assert: function() {},
+    dir: function() {},
+    dirxml: function() {},
+    trace: function() {},
+    group: function() {},
+    groupEnd: function() {},
+    time: function() {},
+    timeEnd: function() {},
+    profile: function() {},
+    profileEnd: function() {},
+    count: function() {},
+    CLASS_NAME: "OpenLayers.Console"
+};
+(function() {
+    for (var a = document.getElementsByTagName("script"), b = 0, c = a.length; b < c; ++b)
+        if (-1 != a[b].src.indexOf("firebug.js") && console) {
+            OpenLayers.Util.extend(OpenLayers.Console, console);
+            break
+        }
+})();
+OpenLayers.Lang = {
+    code: null,
+    defaultCode: "en",
+    getCode: function() {
+        OpenLayers.Lang.code || OpenLayers.Lang.setCode();
+        return OpenLayers.Lang.code
+    },
+    setCode: function(a) {
+        var b;
+        a || (a = "msie" == OpenLayers.BROWSER_NAME ? navigator.userLanguage : navigator.language);
+        a = a.split("-");
+        a[0] = a[0].toLowerCase();
+        "object" == typeof OpenLayers.Lang[a[0]] && (b = a[0]);
+        if (a[1]) {
+            var c = a[0] + "-" + a[1].toUpperCase();
+            "object" == typeof OpenLayers.Lang[c] && (b = c)
+        }
+        b || (OpenLayers.Console.warn("Failed to find OpenLayers.Lang." + a.join("-") + " dictionary, falling back to default language"),
+            b = OpenLayers.Lang.defaultCode);
+        OpenLayers.Lang.code = b
+    },
+    translate: function(a, b) {
+        var c = OpenLayers.Lang[OpenLayers.Lang.getCode()];
+        (c = c && c[a]) || (c = a);
+        b && (c = OpenLayers.String.format(c, b));
+        return c
+    }
+};
+OpenLayers.i18n = OpenLayers.Lang.translate;
+OpenLayers.Util = OpenLayers.Util || {};
+OpenLayers.Util.getElement = function() {
+    for (var a = [], b = 0, c = arguments.length; b < c; b++) {
+        var d = arguments[b];
+        "string" == typeof d && (d = document.getElementById(d));
+        if (1 == arguments.length) return d;
+        a.push(d)
+    }
+    return a
+};
+OpenLayers.Util.isElement = function(a) {
+    return !!(a && 1 === a.nodeType)
+};
+OpenLayers.Util.isArray = function(a) {
+    return "[object Array]" === Object.prototype.toString.call(a)
+};
+"undefined" === typeof window.$ && (window.$ = OpenLayers.Util.getElement);
+OpenLayers.Util.removeItem = function(a, b) {
+    for (var c = a.length - 1; c >= 0; c--) a[c] == b && a.splice(c, 1);
+    return a
+};
+OpenLayers.Util.indexOf = function(a, b) {
+    if (typeof a.indexOf == "function") return a.indexOf(b);
+    for (var c = 0, d = a.length; c < d; c++)
+        if (a[c] == b) return c;
+    return -1
+};
+OpenLayers.Util.modifyDOMElement = function(a, b, c, d, e, f, g, h) {
+    if (b) a.id = b;
+    if (c) {
+        a.style.left = c.x + "px";
+        a.style.top = c.y + "px"
+    }
+    if (d) {
+        a.style.width = d.w + "px";
+        a.style.height = d.h + "px"
+    }
+    if (e) a.style.position = e;
+    if (f) a.style.border = f;
+    if (g) a.style.overflow = g;
+    if (parseFloat(h) >= 0 && parseFloat(h) < 1) {
+        a.style.filter = "alpha(opacity=" + h * 100 + ")";
+        a.style.opacity = h
+    } else if (parseFloat(h) == 1) {
+        a.style.filter = "";
+        a.style.opacity = ""
+    }
+};
+OpenLayers.Util.createDiv = function(a, b, c, d, e, f, g, h) {
+    var i = document.createElement("div");
+    if (d) i.style.backgroundImage = "url(" + d + ")";
+    a || (a = OpenLayers.Util.createUniqueID("OpenLayersDiv"));
+    e || (e = "absolute");
+    OpenLayers.Util.modifyDOMElement(i, a, b, c, e, f, g, h);
+    return i
+};
+OpenLayers.Util.createImage = function(a, b, c, d, e, f, g, h) {
+    var i = document.createElement("img");
+    a || (a = OpenLayers.Util.createUniqueID("OpenLayersDiv"));
+    e || (e = "relative");
+    OpenLayers.Util.modifyDOMElement(i, a, b, c, e, f, null, g);
+    if (h) {
+        i.style.display = "none";
+        b = function() {
+            i.style.display = "";
+            OpenLayers.Event.stopObservingElement(i)
+        };
+        OpenLayers.Event.observe(i, "load", b);
+        OpenLayers.Event.observe(i, "error", b)
+    }
+    i.style.alt = a;
+    i.galleryImg = "no";
+    if (d) i.src = d;
+    return i
+};
+OpenLayers.IMAGE_RELOAD_ATTEMPTS = 0;
+OpenLayers.Util.alphaHackNeeded = null;
+OpenLayers.Util.alphaHack = function() {
+    if (OpenLayers.Util.alphaHackNeeded == null) {
+        var a = navigator.appVersion.split("MSIE"),
+            a = parseFloat(a[1]),
+            b = false;
+        try {
+            b = !!document.body.filters
+        } catch (c) {}
+        OpenLayers.Util.alphaHackNeeded = b && a >= 5.5 && a < 7
+    }
+    return OpenLayers.Util.alphaHackNeeded
+};
+OpenLayers.Util.modifyAlphaImageDiv = function(a, b, c, d, e, f, g, h, i) {
+    OpenLayers.Util.modifyDOMElement(a, b, c, d, f, null, null, i);
+    b = a.childNodes[0];
+    if (e) b.src = e;
+    OpenLayers.Util.modifyDOMElement(b, a.id + "_innerImage", null, d, "relative", g);
+    if (OpenLayers.Util.alphaHack()) {
+        if (a.style.display != "none") a.style.display = "inline-block";
+        h == null && (h = "scale");
+        a.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + b.src + "', sizingMethod='" + h + "')";
+        if (parseFloat(a.style.opacity) >= 0 && parseFloat(a.style.opacity) <
+            1) a.style.filter = a.style.filter + (" alpha(opacity=" + a.style.opacity * 100 + ")");
+        b.style.filter = "alpha(opacity=0)"
+    }
+};
+OpenLayers.Util.createAlphaImageDiv = function(a, b, c, d, e, f, g, h, i) {
+    var j = OpenLayers.Util.createDiv(),
+        i = OpenLayers.Util.createImage(null, null, null, null, null, null, null, i);
+    i.className = "olAlphaImg";
+    j.appendChild(i);
+    OpenLayers.Util.modifyAlphaImageDiv(j, a, b, c, d, e, f, g, h);
+    return j
+};
+OpenLayers.Util.upperCaseObject = function(a) {
+    var b = {},
+        c;
+    for (c in a) b[c.toUpperCase()] = a[c];
+    return b
+};
+OpenLayers.Util.applyDefaults = function(a, b) {
+    var a = a || {},
+        c = typeof window.Event == "function" && b instanceof window.Event,
+        d;
+    for (d in b)
+        if (a[d] === void 0 || !c && b.hasOwnProperty && b.hasOwnProperty(d) && !a.hasOwnProperty(d)) a[d] = b[d];
+    if (!c && b && b.hasOwnProperty && b.hasOwnProperty("toString") && !a.hasOwnProperty("toString")) a.toString = b.toString;
+    return a
+};
+OpenLayers.Util.getParameterString = function(a) {
+    var b = [],
+        c;
+    for (c in a) {
+        var d = a[c];
+        if (d != null && typeof d != "function") {
+            if (typeof d == "object" && d.constructor == Array) {
+                for (var e = [], f, g = 0, h = d.length; g < h; g++) {
+                    f = d[g];
+                    e.push(encodeURIComponent(f === null || f === void 0 ? "" : f))
+                }
+                d = e.join(",")
+            } else d = encodeURIComponent(d);
+            b.push(encodeURIComponent(c) + "=" + d)
+        }
+    }
+    return b.join("&")
+};
+OpenLayers.Util.urlAppend = function(a, b) {
+    var c = a;
+    if (b) var d = (a + " ").split(/[?&]/),
+        c = c + (d.pop() === " " ? b : d.length ? "&" + b : "?" + b);
+    return c
+};
+OpenLayers.Util.getImagesLocation = function() {
+    return OpenLayers.ImgPath || OpenLayers._getScriptLocation() + "img/"
+};
+OpenLayers.Util.getImageLocation = function(a) {
+    return OpenLayers.Util.getImagesLocation() + a
+};
+OpenLayers.Util.Try = function() {
+    for (var a = null, b = 0, c = arguments.length; b < c; b++) {
+        var d = arguments[b];
+        try {
+            a = d();
+            break
+        } catch (e) {}
+    }
+    return a
+};
+OpenLayers.Util.getXmlNodeValue = function(a) {
+    var b = null;
+    OpenLayers.Util.Try(function() {
+        b = a.text;
+        if (!b) b = a.textContent;
+        if (!b) b = a.firstChild.nodeValue
+    }, function() {
+        b = a.textContent
+    });
+    return b
+};
+OpenLayers.Util.mouseLeft = function(a, b) {
+    for (var c = a.relatedTarget ? a.relatedTarget : a.toElement; c != b && c != null;) c = c.parentNode;
+    return c != b
+};
+OpenLayers.Util.DEFAULT_PRECISION = 14;
+OpenLayers.Util.toFloat = function(a, b) {
+    if (b == null) b = OpenLayers.Util.DEFAULT_PRECISION;
+    typeof a !== "number" && (a = parseFloat(a));
+    return b === 0 ? a : parseFloat(a.toPrecision(b))
+};
+OpenLayers.Util.rad = function(a) {
+    return a * Math.PI / 180
+};
+OpenLayers.Util.deg = function(a) {
+    return a * 180 / Math.PI
+};
+OpenLayers.Util.VincentyConstants = {
+    a: 6378137,
+    b: 6356752.3142,
+    f: 1 / 298.257223563
+};
+OpenLayers.Util.distVincenty = function(a, b) {
+    for (var c = OpenLayers.Util.VincentyConstants, d = c.a, e = c.b, c = c.f, f = OpenLayers.Util.rad(b.lon - a.lon), g = Math.atan((1 - c) * Math.tan(OpenLayers.Util.rad(a.lat))), h = Math.atan((1 - c) * Math.tan(OpenLayers.Util.rad(b.lat))), i = Math.sin(g), g = Math.cos(g), j = Math.sin(h), h = Math.cos(h), k = f, l = 2 * Math.PI, m = 20; Math.abs(k - l) > 1.0E-12 && --m > 0;) {
+        var n = Math.sin(k),
+            o = Math.cos(k),
+            p = Math.sqrt(h * n * h * n + (g * j - i * h * o) * (g * j - i * h * o));
+        if (p == 0) return 0;
+        var o = i * j + g * h * o,
+            q = Math.atan2(p, o),
+            r = Math.asin(g *
+                h * n / p),
+            s = Math.cos(r) * Math.cos(r),
+            n = o - 2 * i * j / s,
+            t = c / 16 * s * (4 + c * (4 - 3 * s)),
+            l = k,
+            k = f + (1 - t) * c * Math.sin(r) * (q + t * p * (n + t * o * (-1 + 2 * n * n)))
+    }
+    if (m == 0) return NaN;
+    d = s * (d * d - e * e) / (e * e);
+    c = d / 1024 * (256 + d * (-128 + d * (74 - 47 * d)));
+    return (e * (1 + d / 16384 * (4096 + d * (-768 + d * (320 - 175 * d)))) * (q - c * p * (n + c / 4 * (o * (-1 + 2 * n * n) - c / 6 * n * (-3 + 4 * p * p) * (-3 + 4 * n * n))))).toFixed(3) / 1E3
+};
+OpenLayers.Util.destinationVincenty = function(a, b, c) {
+    for (var d = OpenLayers.Util, e = d.VincentyConstants, f = e.a, g = e.b, h = e.f, e = a.lon, a = a.lat, i = d.rad(b), b = Math.sin(i), i = Math.cos(i), a = (1 - h) * Math.tan(d.rad(a)), j = 1 / Math.sqrt(1 + a * a), k = a * j, l = Math.atan2(a, i), a = j * b, m = 1 - a * a, f = m * (f * f - g * g) / (g * g), n = 1 + f / 16384 * (4096 + f * (-768 + f * (320 - 175 * f))), o = f / 1024 * (256 + f * (-128 + f * (74 - 47 * f))), f = c / (g * n), p = 2 * Math.PI; Math.abs(f - p) > 1.0E-12;) var q = Math.cos(2 * l + f),
+        r = Math.sin(f),
+        s = Math.cos(f),
+        t = o * r * (q + o / 4 * (s * (-1 + 2 * q * q) - o / 6 * q * (-3 + 4 * r * r) * (-3 + 4 *
+            q * q))),
+        p = f,
+        f = c / (g * n) + t;
+    c = k * r - j * s * i;
+    g = Math.atan2(k * s + j * r * i, (1 - h) * Math.sqrt(a * a + c * c));
+    b = Math.atan2(r * b, j * s - k * r * i);
+    i = h / 16 * m * (4 + h * (4 - 3 * m));
+    q = b - (1 - i) * h * a * (f + i * r * (q + i * s * (-1 + 2 * q * q)));
+    Math.atan2(a, -c);
+    return new OpenLayers.LonLat(e + d.deg(q), d.deg(g))
+};
+OpenLayers.Util.getParameters = function(a) {
+    var a = a === null || a === void 0 ? window.location.href : a,
+        b = "";
+    if (OpenLayers.String.contains(a, "?")) var b = a.indexOf("?") + 1,
+        c = OpenLayers.String.contains(a, "#") ? a.indexOf("#") : a.length,
+        b = a.substring(b, c);
+    for (var a = {}, b = b.split(/[&;]/), c = 0, d = b.length; c < d; ++c) {
+        var e = b[c].split("=");
+        if (e[0]) {
+            var f = e[0];
+            try {
+                f = decodeURIComponent(f)
+            } catch (g) {
+                f = unescape(f)
+            }
+            e = (e[1] || "").replace(/\+/g, " ");
+            try {
+                e = decodeURIComponent(e)
+            } catch (h) {
+                e = unescape(e)
+            }
+            e = e.split(",");
+            e.length == 1 && (e = e[0]);
+            a[f] = e
+        }
+    }
+    return a
+};
+OpenLayers.Util.lastSeqID = 0;
+OpenLayers.Util.createUniqueID = function(a) {
+    a == null && (a = "id_");
+    OpenLayers.Util.lastSeqID = OpenLayers.Util.lastSeqID + 1;
+    return a + OpenLayers.Util.lastSeqID
+};
+OpenLayers.INCHES_PER_UNIT = {
+    inches: 1,
+    ft: 12,
+    mi: 63360,
+    m: 39.3701,
+    km: 39370.1,
+    dd: 4374754,
+    yd: 36
+};
+OpenLayers.INCHES_PER_UNIT["in"] = OpenLayers.INCHES_PER_UNIT.inches;
+OpenLayers.INCHES_PER_UNIT.degrees = OpenLayers.INCHES_PER_UNIT.dd;
+OpenLayers.INCHES_PER_UNIT.nmi = 1852 * OpenLayers.INCHES_PER_UNIT.m;
+OpenLayers.METERS_PER_INCH = 0.0254000508001016;
+OpenLayers.Util.extend(OpenLayers.INCHES_PER_UNIT, {
+    Inch: OpenLayers.INCHES_PER_UNIT.inches,
+    Meter: 1 / OpenLayers.METERS_PER_INCH,
+    Foot: 0.3048006096012192 / OpenLayers.METERS_PER_INCH,
+    IFoot: 0.3048 / OpenLayers.METERS_PER_INCH,
+    ClarkeFoot: 0.3047972651151 / OpenLayers.METERS_PER_INCH,
+    SearsFoot: 0.30479947153867626 / OpenLayers.METERS_PER_INCH,
+    GoldCoastFoot: 0.3047997101815088 / OpenLayers.METERS_PER_INCH,
+    IInch: 0.0254 / OpenLayers.METERS_PER_INCH,
+    MicroInch: 2.54E-5 / OpenLayers.METERS_PER_INCH,
+    Mil: 2.54E-8 / OpenLayers.METERS_PER_INCH,
+    Centimeter: 0.01 / OpenLayers.METERS_PER_INCH,
+    Kilometer: 1E3 / OpenLayers.METERS_PER_INCH,
+    Yard: 0.9144018288036576 / OpenLayers.METERS_PER_INCH,
+    SearsYard: 0.914398414616029 / OpenLayers.METERS_PER_INCH,
+    IndianYard: 0.9143985307444408 / OpenLayers.METERS_PER_INCH,
+    IndianYd37: 0.91439523 / OpenLayers.METERS_PER_INCH,
+    IndianYd62: 0.9143988 / OpenLayers.METERS_PER_INCH,
+    IndianYd75: 0.9143985 / OpenLayers.METERS_PER_INCH,
+    IndianFoot: 0.30479951 / OpenLayers.METERS_PER_INCH,
+    IndianFt37: 0.30479841 / OpenLayers.METERS_PER_INCH,
+    IndianFt62: 0.3047996 /
+        OpenLayers.METERS_PER_INCH,
+    IndianFt75: 0.3047995 / OpenLayers.METERS_PER_INCH,
+    Mile: 1609.3472186944373 / OpenLayers.METERS_PER_INCH,
+    IYard: 0.9144 / OpenLayers.METERS_PER_INCH,
+    IMile: 1609.344 / OpenLayers.METERS_PER_INCH,
+    NautM: 1852 / OpenLayers.METERS_PER_INCH,
+    "Lat-66": 110943.31648893273 / OpenLayers.METERS_PER_INCH,
+    "Lat-83": 110946.25736872235 / OpenLayers.METERS_PER_INCH,
+    Decimeter: 0.1 / OpenLayers.METERS_PER_INCH,
+    Millimeter: 0.001 / OpenLayers.METERS_PER_INCH,
+    Dekameter: 10 / OpenLayers.METERS_PER_INCH,
+    Decameter: 10 / OpenLayers.METERS_PER_INCH,
+    Hectometer: 100 / OpenLayers.METERS_PER_INCH,
+    GermanMeter: 1.0000135965 / OpenLayers.METERS_PER_INCH,
+    CaGrid: 0.999738 / OpenLayers.METERS_PER_INCH,
+    ClarkeChain: 20.1166194976 / OpenLayers.METERS_PER_INCH,
+    GunterChain: 20.11684023368047 / OpenLayers.METERS_PER_INCH,
+    BenoitChain: 20.116782494375872 / OpenLayers.METERS_PER_INCH,
+    SearsChain: 20.11676512155 / OpenLayers.METERS_PER_INCH,
+    ClarkeLink: 0.201166194976 / OpenLayers.METERS_PER_INCH,
+    GunterLink: 0.2011684023368047 / OpenLayers.METERS_PER_INCH,
+    BenoitLink: 0.20116782494375873 / OpenLayers.METERS_PER_INCH,
+    SearsLink: 0.2011676512155 / OpenLayers.METERS_PER_INCH,
+    Rod: 5.02921005842012 / OpenLayers.METERS_PER_INCH,
+    IntnlChain: 20.1168 / OpenLayers.METERS_PER_INCH,
+    IntnlLink: 0.201168 / OpenLayers.METERS_PER_INCH,
+    Perch: 5.02921005842012 / OpenLayers.METERS_PER_INCH,
+    Pole: 5.02921005842012 / OpenLayers.METERS_PER_INCH,
+    Furlong: 201.1684023368046 / OpenLayers.METERS_PER_INCH,
+    Rood: 3.778266898 / OpenLayers.METERS_PER_INCH,
+    CapeFoot: 0.3047972615 / OpenLayers.METERS_PER_INCH,
+    Brealey: 375 / OpenLayers.METERS_PER_INCH,
+    ModAmFt: 0.304812252984506 /
+        OpenLayers.METERS_PER_INCH,
+    Fathom: 1.8288 / OpenLayers.METERS_PER_INCH,
+    "NautM-UK": 1853.184 / OpenLayers.METERS_PER_INCH,
+    "50kilometers": 5E4 / OpenLayers.METERS_PER_INCH,
+    "150kilometers": 15E4 / OpenLayers.METERS_PER_INCH
+});
+OpenLayers.Util.extend(OpenLayers.INCHES_PER_UNIT, {
+    mm: OpenLayers.INCHES_PER_UNIT.Meter / 1E3,
+    cm: OpenLayers.INCHES_PER_UNIT.Meter / 100,
+    dm: 100 * OpenLayers.INCHES_PER_UNIT.Meter,
+    km: 1E3 * OpenLayers.INCHES_PER_UNIT.Meter,
+    kmi: OpenLayers.INCHES_PER_UNIT.nmi,
+    fath: OpenLayers.INCHES_PER_UNIT.Fathom,
+    ch: OpenLayers.INCHES_PER_UNIT.IntnlChain,
+    link: OpenLayers.INCHES_PER_UNIT.IntnlLink,
+    "us-in": OpenLayers.INCHES_PER_UNIT.inches,
+    "us-ft": OpenLayers.INCHES_PER_UNIT.Foot,
+    "us-yd": OpenLayers.INCHES_PER_UNIT.Yard,
+    "us-ch": OpenLayers.INCHES_PER_UNIT.GunterChain,
+    "us-mi": OpenLayers.INCHES_PER_UNIT.Mile,
+    "ind-yd": OpenLayers.INCHES_PER_UNIT.IndianYd37,
+    "ind-ft": OpenLayers.INCHES_PER_UNIT.IndianFt37,
+    "ind-ch": 20.11669506 / OpenLayers.METERS_PER_INCH
+});
+OpenLayers.DOTS_PER_INCH = 72;
+OpenLayers.Util.normalizeScale = function(a) {
+    return a > 1 ? 1 / a : a
+};
+OpenLayers.Util.getResolutionFromScale = function(a, b) {
+    var c;
+    if (a) {
+        b == null && (b = "degrees");
+        c = 1 / (OpenLayers.Util.normalizeScale(a) * OpenLayers.INCHES_PER_UNIT[b] * OpenLayers.DOTS_PER_INCH)
+    }
+    return c
+};
+OpenLayers.Util.getScaleFromResolution = function(a, b) {
+    b == null && (b = "degrees");
+    return a * OpenLayers.INCHES_PER_UNIT[b] * OpenLayers.DOTS_PER_INCH
+};
+OpenLayers.Util.pagePosition = function(a) {
+    var b = [0, 0],
+        c = OpenLayers.Util.getViewportElement();
+    if (!a || a == window || a == c) return b;
+    var d = OpenLayers.IS_GECKO && document.getBoxObjectFor && OpenLayers.Element.getStyle(a, "position") == "absolute" && (a.style.top == "" || a.style.left == ""),
+        e = null;
+    if (a.getBoundingClientRect) {
+        a = a.getBoundingClientRect();
+        e = c.scrollTop;
+        b[0] = a.left + c.scrollLeft;
+        b[1] = a.top + e
+    } else if (document.getBoxObjectFor && !d) {
+        a = document.getBoxObjectFor(a);
+        c = document.getBoxObjectFor(c);
+        b[0] = a.screenX - c.screenX;
+        b[1] = a.screenY - c.screenY
+    } else {
+        b[0] = a.offsetLeft;
+        b[1] = a.offsetTop;
+        e = a.offsetParent;
+        if (e != a)
+            for (; e;) {
+                b[0] = b[0] + e.offsetLeft;
+                b[1] = b[1] + e.offsetTop;
+                e = e.offsetParent
+            }
+        c = OpenLayers.BROWSER_NAME;
+        if (c == "opera" || c == "safari" && OpenLayers.Element.getStyle(a, "position") == "absolute") b[1] = b[1] - document.body.offsetTop;
+        for (e = a.offsetParent; e && e != document.body;) {
+            b[0] = b[0] - e.scrollLeft;
+            if (c != "opera" || e.tagName != "TR") b[1] = b[1] - e.scrollTop;
+            e = e.offsetParent
+        }
+    }
+    return b
+};
+OpenLayers.Util.getViewportElement = function() {
+    var a = arguments.callee.viewportElement;
+    if (a == void 0) {
+        a = OpenLayers.BROWSER_NAME == "msie" && document.compatMode != "CSS1Compat" ? document.body : document.documentElement;
+        arguments.callee.viewportElement = a
+    }
+    return a
+};
+OpenLayers.Util.isEquivalentUrl = function(a, b, c) {
+    c = c || {};
+    OpenLayers.Util.applyDefaults(c, {
+        ignoreCase: true,
+        ignorePort80: true,
+        ignoreHash: true
+    });
+    var a = OpenLayers.Util.createUrlObject(a, c),
+        b = OpenLayers.Util.createUrlObject(b, c),
+        d;
+    for (d in a)
+        if (d !== "args" && a[d] != b[d]) return false;
+    for (d in a.args) {
+        if (a.args[d] != b.args[d]) return false;
+        delete b.args[d]
+    }
+    for (d in b.args) return false;
+    return true
+};
+OpenLayers.Util.createUrlObject = function(a, b) {
+    b = b || {};
+    if (!/^\w+:\/\//.test(a)) {
+        var c = window.location,
+            d = c.port ? ":" + c.port : "",
+            d = c.protocol + "//" + c.host.split(":").shift() + d;
+        if (a.indexOf("/") === 0) a = d + a;
+        else {
+            c = c.pathname.split("/");
+            c.pop();
+            a = d + c.join("/") + "/" + a
+        }
+    }
+    b.ignoreCase && (a = a.toLowerCase());
+    c = document.createElement("a");
+    c.href = a;
+    d = {};
+    d.host = c.host.split(":").shift();
+    d.protocol = c.protocol;
+    d.port = b.ignorePort80 ? c.port == "80" || c.port == "0" ? "" : c.port : c.port == "" || c.port == "0" ? "80" : c.port;
+    d.hash = b.ignoreHash ||
+        c.hash === "#" ? "" : c.hash;
+    var e = c.search;
+    if (!e) {
+        e = a.indexOf("?");
+        e = e != -1 ? a.substr(e) : ""
+    }
+    d.args = OpenLayers.Util.getParameters(e);
+    d.pathname = c.pathname.charAt(0) == "/" ? c.pathname : "/" + c.pathname;
+    return d
+};
+OpenLayers.Util.removeTail = function(a) {
+    var b = null,
+        b = a.indexOf("?"),
+        c = a.indexOf("#");
+    return b = b == -1 ? c != -1 ? a.substr(0, c) : a : c != -1 ? a.substr(0, Math.min(b, c)) : a.substr(0, b)
+};
+OpenLayers.IS_GECKO = function() {
+    var a = navigator.userAgent.toLowerCase();
+    return a.indexOf("webkit") == -1 && a.indexOf("gecko") != -1
+}();
+OpenLayers.CANVAS_SUPPORTED = function() {
+    var a = document.createElement("canvas");
+    return !(!a.getContext || !a.getContext("2d"))
+}();
+OpenLayers.BROWSER_NAME = function() {
+    var a = "",
+        b = navigator.userAgent.toLowerCase();
+    b.indexOf("opera") != -1 ? a = "opera" : b.indexOf("msie") != -1 ? a = "msie" : b.indexOf("safari") != -1 ? a = "safari" : b.indexOf("mozilla") != -1 && (a = b.indexOf("firefox") != -1 ? "firefox" : "mozilla");
+    return a
+}();
+OpenLayers.Util.getBrowserName = function() {
+    return OpenLayers.BROWSER_NAME
+};
+OpenLayers.Util.getRenderedDimensions = function(a, b, c) {
+    var d, e, f = document.createElement("div");
+    f.style.visibility = "hidden";
+    for (var g = c && c.containerElement ? c.containerElement : document.body, h = false, i = null, j = g; j && j.tagName.toLowerCase() != "body";) {
+        var k = OpenLayers.Element.getStyle(j, "position");
+        if (k == "absolute") {
+            h = true;
+            break
+        } else if (k && k != "static") break;
+        j = j.parentNode
+    }
+    if (h && (g.clientHeight === 0 || g.clientWidth === 0)) {
+        i = document.createElement("div");
+        i.style.visibility = "hidden";
+        i.style.position = "absolute";
+        i.style.overflow = "visible";
+        i.style.width = document.body.clientWidth + "px";
+        i.style.height = document.body.clientHeight + "px";
+        i.appendChild(f)
+    }
+    f.style.position = "absolute";
+    if (b)
+        if (b.w) {
+            d = b.w;
+            f.style.width = d + "px"
+        } else if (b.h) {
+        e = b.h;
+        f.style.height = e + "px"
+    }
+    if (c && c.displayClass) f.className = c.displayClass;
+    b = document.createElement("div");
+    b.innerHTML = a;
+    b.style.overflow = "visible";
+    if (b.childNodes) {
+        a = 0;
+        for (c = b.childNodes.length; a < c; a++)
+            if (b.childNodes[a].style) b.childNodes[a].style.overflow = "visible"
+    }
+    f.appendChild(b);
+    i ? g.appendChild(i) : g.appendChild(f);
+    if (!d) {
+        d = parseInt(b.scrollWidth);
+        f.style.width = d + "px"
+    }
+    e || (e = parseInt(b.scrollHeight));
+    f.removeChild(b);
+    if (i) {
+        i.removeChild(f);
+        g.removeChild(i)
+    } else g.removeChild(f);
+    return new OpenLayers.Size(d, e)
+};
+OpenLayers.Util.getScrollbarWidth = function() {
+    var a = OpenLayers.Util._scrollbarWidth;
+    if (a == null) {
+        var b = null,
+            c = null,
+            b = a = 0,
+            b = document.createElement("div");
+        b.style.position = "absolute";
+        b.style.top = "-1000px";
+        b.style.left = "-1000px";
+        b.style.width = "100px";
+        b.style.height = "50px";
+        b.style.overflow = "hidden";
+        c = document.createElement("div");
+        c.style.width = "100%";
+        c.style.height = "200px";
+        b.appendChild(c);
+        document.body.appendChild(b);
+        a = c.offsetWidth;
+        b.style.overflow = "scroll";
+        b = c.offsetWidth;
+        document.body.removeChild(document.body.lastChild);
+        OpenLayers.Util._scrollbarWidth = a - b;
+        a = OpenLayers.Util._scrollbarWidth
+    }
+    return a
+};
+OpenLayers.Util.getFormattedLonLat = function(a, b, c) {
+    c || (c = "dms");
+    var a = (a + 540) % 360 - 180,
+        d = Math.abs(a),
+        e = Math.floor(d),
+        f = d = (d - e) / (1 / 60),
+        d = Math.floor(d),
+        f = Math.round((f - d) / (1 / 60) * 10),
+        f = f / 10;
+    if (f >= 60) {
+        f = f - 60;
+        d = d + 1;
+        if (d >= 60) {
+            d = d - 60;
+            e = e + 1
+        }
+    }
+    e < 10 && (e = "0" + e);
+    e = e + "\u00b0";
+    if (c.indexOf("dm") >= 0) {
+        d < 10 && (d = "0" + d);
+        e = e + (d + "'");
+        if (c.indexOf("dms") >= 0) {
+            f < 10 && (f = "0" + f);
+            e = e + (f + '"')
+        }
+    }
+    return e = b == "lon" ? e + (a < 0 ? OpenLayers.i18n("W") : OpenLayers.i18n("E")) : e + (a < 0 ? OpenLayers.i18n("S") : OpenLayers.i18n("N"))
+};
+OpenLayers.Format = OpenLayers.Class({
+    options: null,
+    externalProjection: null,
+    internalProjection: null,
+    data: null,
+    keepData: !1,
+    initialize: function(a) {
+        OpenLayers.Util.extend(this, a);
+        this.options = a
+    },
+    destroy: function() {},
+    read: function() {
+        throw Error("Read not implemented.");
+    },
+    write: function() {
+        throw Error("Write not implemented.");
+    },
+    CLASS_NAME: "OpenLayers.Format"
+});
+OpenLayers.Format.CSWGetRecords = function(a) {
+    var a = OpenLayers.Util.applyDefaults(a, OpenLayers.Format.CSWGetRecords.DEFAULTS),
+        b = OpenLayers.Format.CSWGetRecords["v" + a.version.replace(/\./g, "_")];
+    if (!b) throw "Unsupported CSWGetRecords version: " + a.version;
+    return new b(a)
+};
+OpenLayers.Format.CSWGetRecords.DEFAULTS = {
+    version: "2.0.2"
+};
+OpenLayers.Control = OpenLayers.Class({
+    id: null,
+    map: null,
+    div: null,
+    type: null,
+    allowSelection: !1,
+    displayClass: "",
+    title: "",
+    autoActivate: !1,
+    active: null,
+    handler: null,
+    eventListeners: null,
+    events: null,
+    initialize: function(a) {
+        this.displayClass = this.CLASS_NAME.replace("OpenLayers.", "ol").replace(/\./g, "");
+        OpenLayers.Util.extend(this, a);
+        this.events = new OpenLayers.Events(this);
+        if (this.eventListeners instanceof Object) this.events.on(this.eventListeners);
+        null == this.id && (this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME +
+            "_"))
+    },
+    destroy: function() {
+        this.events && (this.eventListeners && this.events.un(this.eventListeners), this.events.destroy(), this.events = null);
+        this.eventListeners = null;
+        this.handler && (this.handler.destroy(), this.handler = null);
+        if (this.handlers) {
+            for (var a in this.handlers) this.handlers.hasOwnProperty(a) && "function" == typeof this.handlers[a].destroy && this.handlers[a].destroy();
+            this.handlers = null
+        }
+        this.map && (this.map.removeControl(this), this.map = null);
+        this.div = null
+    },
+    setMap: function(a) {
+        this.map = a;
+        this.handler &&
+            this.handler.setMap(a)
+    },
+    draw: function(a) {
+        if (null == this.div && (this.div = OpenLayers.Util.createDiv(this.id), this.div.className = this.displayClass, this.allowSelection || (this.div.className += " olControlNoSelect", this.div.setAttribute("unselectable", "on", 0), this.div.onselectstart = OpenLayers.Function.False), "" != this.title)) this.div.title = this.title;
+        null != a && (this.position = a.clone());
+        this.moveTo(this.position);
+        return this.div
+    },
+    moveTo: function(a) {
+        null != a && null != this.div && (this.div.style.left = a.x + "px", this.div.style.top =
+            a.y + "px")
+    },
+    activate: function() {
+        if (this.active) return !1;
+        this.handler && this.handler.activate();
+        this.active = !0;
+        this.map && OpenLayers.Element.addClass(this.map.viewPortDiv, this.displayClass.replace(/ /g, "") + "Active");
+        this.events.triggerEvent("activate");
+        return !0
+    },
+    deactivate: function() {
+        return this.active ? (this.handler && this.handler.deactivate(), this.active = !1, this.map && OpenLayers.Element.removeClass(this.map.viewPortDiv, this.displayClass.replace(/ /g, "") + "Active"), this.events.triggerEvent("deactivate"), !0) : !1
+    },
+    CLASS_NAME: "OpenLayers.Control"
+});
+OpenLayers.Control.TYPE_BUTTON = 1;
+OpenLayers.Control.TYPE_TOGGLE = 2;
+OpenLayers.Control.TYPE_TOOL = 3;
+OpenLayers.Event = {
+    observers: !1,
+    KEY_SPACE: 32,
+    KEY_BACKSPACE: 8,
+    KEY_TAB: 9,
+    KEY_RETURN: 13,
+    KEY_ESC: 27,
+    KEY_LEFT: 37,
+    KEY_UP: 38,
+    KEY_RIGHT: 39,
+    KEY_DOWN: 40,
+    KEY_DELETE: 46,
+    element: function(a) {
+        return a.target || a.srcElement
+    },
+    isSingleTouch: function(a) {
+        return a.touches && 1 == a.touches.length
+    },
+    isMultiTouch: function(a) {
+        return a.touches && 1 < a.touches.length
+    },
+    isLeftClick: function(a) {
+        return a.which && 1 == a.which || a.button && 1 == a.button
+    },
+    isRightClick: function(a) {
+        return a.which && 3 == a.which || a.button && 2 == a.button
+    },
+    stop: function(a,
+        b) {
+        b || (a.preventDefault ? a.preventDefault() : a.returnValue = !1);
+        a.stopPropagation ? a.stopPropagation() : a.cancelBubble = !0
+    },
+    findElement: function(a, b) {
+        for (var c = OpenLayers.Event.element(a); c.parentNode && (!c.tagName || c.tagName.toUpperCase() != b.toUpperCase());) c = c.parentNode;
+        return c
+    },
+    observe: function(a, b, c, d) {
+        a = OpenLayers.Util.getElement(a);
+        d = d || !1;
+        if ("keypress" == b && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || a.attachEvent)) b = "keydown";
+        this.observers || (this.observers = {});
+        if (!a._eventCacheID) {
+            var e =
+                "eventCacheID_";
+            a.id && (e = a.id + "_" + e);
+            a._eventCacheID = OpenLayers.Util.createUniqueID(e)
+        }
+        e = a._eventCacheID;
+        this.observers[e] || (this.observers[e] = []);
+        this.observers[e].push({
+            element: a,
+            name: b,
+            observer: c,
+            useCapture: d
+        });
+        a.addEventListener ? a.addEventListener(b, c, d) : a.attachEvent && a.attachEvent("on" + b, c)
+    },
+    stopObservingElement: function(a) {
+        a = OpenLayers.Util.getElement(a)._eventCacheID;
+        this._removeElementObservers(OpenLayers.Event.observers[a])
+    },
+    _removeElementObservers: function(a) {
+        if (a)
+            for (var b = a.length - 1; 0 <=
+                b; b--) {
+                var c = a[b];
+                OpenLayers.Event.stopObserving.apply(this, [c.element, c.name, c.observer, c.useCapture])
+            }
+    },
+    stopObserving: function(a, b, c, d) {
+        var d = d || !1,
+            a = OpenLayers.Util.getElement(a),
+            e = a._eventCacheID;
+        if ("keypress" == b && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || a.detachEvent)) b = "keydown";
+        var f = !1,
+            g = OpenLayers.Event.observers[e];
+        if (g)
+            for (var h = 0; !f && h < g.length;) {
+                var i = g[h];
+                if (i.name == b && i.observer == c && i.useCapture == d) {
+                    g.splice(h, 1);
+                    0 == g.length && delete OpenLayers.Event.observers[e];
+                    f = !0;
+                    break
+                }
+                h++
+            }
+        f && (a.removeEventListener ? a.removeEventListener(b, c, d) : a && a.detachEvent && a.detachEvent("on" + b, c));
+        return f
+    },
+    unloadCache: function() {
+        if (OpenLayers.Event && OpenLayers.Event.observers) {
+            for (var a in OpenLayers.Event.observers) OpenLayers.Event._removeElementObservers.apply(this, [OpenLayers.Event.observers[a]]);
+            OpenLayers.Event.observers = !1
+        }
+    },
+    CLASS_NAME: "OpenLayers.Event"
+};
+OpenLayers.Event.observe(window, "unload", OpenLayers.Event.unloadCache, !1);
+OpenLayers.Events = OpenLayers.Class({
+    BROWSER_EVENTS: "mouseover mouseout mousedown mouseup mousemove click dblclick rightclick dblrightclick resize focus blur touchstart touchmove touchend keydown".split(" "),
+    listeners: null,
+    object: null,
+    element: null,
+    eventHandler: null,
+    fallThrough: null,
+    includeXY: !1,
+    extensions: null,
+    extensionCount: null,
+    clearMouseListener: null,
+    initialize: function(a, b, c, d, e) {
+        OpenLayers.Util.extend(this, e);
+        this.object = a;
+        this.fallThrough = d;
+        this.listeners = {};
+        this.extensions = {};
+        this.extensionCount = {};
+        null != b && this.attachToElement(b)
+    },
+    destroy: function() {
+        for (var a in this.extensions) "boolean" !== typeof this.extensions[a] && this.extensions[a].destroy();
+        this.extensions = null;
+        this.element && (OpenLayers.Event.stopObservingElement(this.element), this.element.hasScrollEvent && OpenLayers.Event.stopObserving(window, "scroll", this.clearMouseListener));
+        this.eventHandler = this.fallThrough = this.object = this.listeners = this.element = null
+    },
+    addEventType: function() {},
+    attachToElement: function(a) {
+        this.element ? OpenLayers.Event.stopObservingElement(this.element) :
+            (this.eventHandler = OpenLayers.Function.bindAsEventListener(this.handleBrowserEvent, this), this.clearMouseListener = OpenLayers.Function.bind(this.clearMouseCache, this));
+        this.element = a;
+        for (var b = 0, c = this.BROWSER_EVENTS.length; b < c; b++) OpenLayers.Event.observe(a, this.BROWSER_EVENTS[b], this.eventHandler);
+        OpenLayers.Event.observe(a, "dragstart", OpenLayers.Event.stop)
+    },
+    on: function(a) {
+        for (var b in a) "scope" != b && a.hasOwnProperty(b) && this.register(b, a.scope, a[b])
+    },
+    register: function(a, b, c, d) {
+        a in OpenLayers.Events &&
+            !this.extensions[a] && (this.extensions[a] = new OpenLayers.Events[a](this));
+        if (null != c) {
+            null == b && (b = this.object);
+            var e = this.listeners[a];
+            e || (e = [], this.listeners[a] = e, this.extensionCount[a] = 0);
+            b = {
+                obj: b,
+                func: c
+            };
+            d ? (e.splice(this.extensionCount[a], 0, b), "object" === typeof d && d.extension && this.extensionCount[a]++) : e.push(b)
+        }
+    },
+    registerPriority: function(a, b, c) {
+        this.register(a, b, c, !0)
+    },
+    un: function(a) {
+        for (var b in a) "scope" != b && a.hasOwnProperty(b) && this.unregister(b, a.scope, a[b])
+    },
+    unregister: function(a, b, c) {
+        null ==
+            b && (b = this.object);
+        a = this.listeners[a];
+        if (null != a)
+            for (var d = 0, e = a.length; d < e; d++)
+                if (a[d].obj == b && a[d].func == c) {
+                    a.splice(d, 1);
+                    break
+                }
+    },
+    remove: function(a) {
+        null != this.listeners[a] && (this.listeners[a] = [])
+    },
+    triggerEvent: function(a, b) {
+        var c = this.listeners[a];
+        if (c && 0 != c.length) {
+            null == b && (b = {});
+            b.object = this.object;
+            b.element = this.element;
+            b.type || (b.type = a);
+            for (var c = c.slice(), d, e = 0, f = c.length; e < f && !(d = c[e], d = d.func.apply(d.obj, [b]), void 0 != d && !1 == d); e++);
+            this.fallThrough || OpenLayers.Event.stop(b, !0);
+            return d
+        }
+    },
+    handleBrowserEvent: function(a) {
+        var b = a.type,
+            c = this.listeners[b];
+        if (c && 0 != c.length) {
+            if ((c = a.touches) && c[0]) {
+                for (var d = 0, e = 0, f = c.length, g, h = 0; h < f; ++h) g = c[h], d += g.clientX, e += g.clientY;
+                a.clientX = d / f;
+                a.clientY = e / f
+            }
+            this.includeXY && (a.xy = this.getMousePosition(a));
+            this.triggerEvent(b, a)
+        }
+    },
+    clearMouseCache: function() {
+        this.element.scrolls = null;
+        this.element.lefttop = null;
+        var a = document.body;
+        if (a && (!(0 != a.scrollTop || 0 != a.scrollLeft) || !navigator.userAgent.match(/iPhone/i))) this.element.offsets = null
+    },
+    getMousePosition: function(a) {
+        this.includeXY ?
+            this.element.hasScrollEvent || (OpenLayers.Event.observe(window, "scroll", this.clearMouseListener), this.element.hasScrollEvent = !0) : this.clearMouseCache();
+        if (!this.element.scrolls) {
+            var b = OpenLayers.Util.getViewportElement();
+            this.element.scrolls = [b.scrollLeft, b.scrollTop]
+        }
+        this.element.lefttop || (this.element.lefttop = [document.documentElement.clientLeft || 0, document.documentElement.clientTop || 0]);
+        this.element.offsets || (this.element.offsets = OpenLayers.Util.pagePosition(this.element));
+        return new OpenLayers.Pixel(a.clientX +
+            this.element.scrolls[0] - this.element.offsets[0] - this.element.lefttop[0], a.clientY + this.element.scrolls[1] - this.element.offsets[1] - this.element.lefttop[1])
+    },
+    CLASS_NAME: "OpenLayers.Events"
+});
+OpenLayers.Events.buttonclick = OpenLayers.Class({
+    target: null,
+    events: "mousedown mouseup click dblclick touchstart touchmove touchend keydown".split(" "),
+    startRegEx: /^mousedown|touchstart$/,
+    cancelRegEx: /^touchmove$/,
+    completeRegEx: /^mouseup|touchend$/,
+    initialize: function(a) {
+        this.target = a;
+        for (a = this.events.length - 1; 0 <= a; --a) this.target.register(this.events[a], this, this.buttonClick, {
+            extension: !0
+        })
+    },
+    destroy: function() {
+        for (var a = this.events.length - 1; 0 <= a; --a) this.target.unregister(this.events[a], this, this.buttonClick);
+        delete this.target
+    },
+    getPressedButton: function(a) {
+        var b = 3,
+            c;
+        do {
+            if (OpenLayers.Element.hasClass(a, "olButton")) {
+                c = a;
+                break
+            }
+            a = a.parentNode
+        } while (0 < --b && a);
+        return c
+    },
+    buttonClick: function(a) {
+        var b = !0,
+            c = OpenLayers.Event.element(a);
+        if (c && (OpenLayers.Event.isLeftClick(a) || !~a.type.indexOf("mouse")))
+            if (c = this.getPressedButton(c)) {
+                if ("keydown" === a.type) switch (a.keyCode) {
+                    case OpenLayers.Event.KEY_RETURN:
+                    case OpenLayers.Event.KEY_SPACE:
+                        this.target.triggerEvent("buttonclick", {
+                                buttonElement: c
+                            }), OpenLayers.Event.stop(a),
+                            b = !1
+                } else this.startEvt && (this.completeRegEx.test(a.type) && (b = OpenLayers.Util.pagePosition(c), this.target.triggerEvent("buttonclick", {
+                    buttonElement: c,
+                    buttonXY: {
+                        x: this.startEvt.clientX - b[0],
+                        y: this.startEvt.clientY - b[1]
+                    }
+                })), this.cancelRegEx.test(a.type) && delete this.startEvt, OpenLayers.Event.stop(a), b = !1);
+                this.startRegEx.test(a.type) && (this.startEvt = a, OpenLayers.Event.stop(a), b = !1)
+            } else delete this.startEvt;
+        return b
+    }
+});
+OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, {
+    element: null,
+    ovmap: null,
+    size: {
+        w: 180,
+        h: 90
+    },
+    layers: null,
+    minRectSize: 15,
+    minRectDisplayClass: "RectReplacement",
+    minRatio: 8,
+    maxRatio: 32,
+    mapOptions: null,
+    autoPan: !1,
+    handlers: null,
+    resolutionFactor: 1,
+    maximized: !1,
+    initialize: function(a) {
+        this.layers = [];
+        this.handlers = {};
+        OpenLayers.Control.prototype.initialize.apply(this, [a])
+    },
+    destroy: function() {
+        this.mapDiv && (this.handlers.click && this.handlers.click.destroy(), this.handlers.drag && this.handlers.drag.destroy(),
+            this.ovmap && this.ovmap.viewPortDiv.removeChild(this.extentRectangle), this.extentRectangle = null, this.rectEvents && (this.rectEvents.destroy(), this.rectEvents = null), this.ovmap && (this.ovmap.destroy(), this.ovmap = null), this.element.removeChild(this.mapDiv), this.mapDiv = null, this.div.removeChild(this.element), this.element = null, this.maximizeDiv && (this.div.removeChild(this.maximizeDiv), this.maximizeDiv = null), this.minimizeDiv && (this.div.removeChild(this.minimizeDiv), this.minimizeDiv = null), this.map.events.un({
+                buttonclick: this.onButtonClick,
+                moveend: this.update,
+                changebaselayer: this.baseLayerDraw,
+                scope: this
+            }), OpenLayers.Control.prototype.destroy.apply(this, arguments))
+    },
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        if (0 === this.layers.length)
+            if (this.map.baseLayer) this.layers = [this.map.baseLayer.clone()];
+            else return this.map.events.register("changebaselayer", this, this.baseLayerDraw), this.div;
+        this.element = document.createElement("div");
+        this.element.className = this.displayClass + "Element";
+        this.element.style.display = "none";
+        this.mapDiv = document.createElement("div");
+        this.mapDiv.style.width = this.size.w + "px";
+        this.mapDiv.style.height = this.size.h + "px";
+        this.mapDiv.style.position = "relative";
+        this.mapDiv.style.overflow = "hidden";
+        this.mapDiv.id = OpenLayers.Util.createUniqueID("overviewMap");
+        this.extentRectangle = document.createElement("div");
+        this.extentRectangle.style.position = "absolute";
+        this.extentRectangle.style.zIndex = 1E3;
+        this.extentRectangle.className = this.displayClass + "ExtentRectangle";
+        this.element.appendChild(this.mapDiv);
+        this.div.appendChild(this.element);
+        if (this.outsideViewport) this.element.style.display = "";
+        else {
+            this.div.className += " " + this.displayClass + "Container";
+            var a = OpenLayers.Util.getImageLocation("layer-switcher-maximize.png");
+            this.maximizeDiv = OpenLayers.Util.createAlphaImageDiv(this.displayClass + "MaximizeButton", null, null, a, "absolute");
+            this.maximizeDiv.style.display = "none";
+            this.maximizeDiv.className = this.displayClass + "MaximizeButton olButton";
+            this.div.appendChild(this.maximizeDiv);
+            a = OpenLayers.Util.getImageLocation("layer-switcher-minimize.png");
+            this.minimizeDiv = OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_minimizeDiv", null, null, a, "absolute");
+            this.minimizeDiv.style.display = "none";
+            this.minimizeDiv.className = this.displayClass + "MinimizeButton olButton";
+            this.div.appendChild(this.minimizeDiv);
+            this.minimizeControl()
+        }
+        this.map.getExtent() && this.update();
+        this.map.events.on({
+            buttonclick: this.onButtonClick,
+            moveend: this.update,
+            scope: this
+        });
+        this.maximized && this.maximizeControl();
+        return this.div
+    },
+    baseLayerDraw: function() {
+        this.draw();
+        this.map.events.unregister("changebaselayer",
+            this, this.baseLayerDraw)
+    },
+    rectDrag: function(a) {
+        var b = this.handlers.drag.last.x - a.x,
+            c = this.handlers.drag.last.y - a.y;
+        if (0 != b || 0 != c) {
+            var d = this.rectPxBounds.top,
+                e = this.rectPxBounds.left,
+                a = Math.abs(this.rectPxBounds.getHeight()),
+                f = this.rectPxBounds.getWidth(),
+                c = Math.max(0, d - c),
+                c = Math.min(c, this.ovmap.size.h - this.hComp - a),
+                b = Math.max(0, e - b),
+                b = Math.min(b, this.ovmap.size.w - this.wComp - f);
+            this.setRectPxBounds(new OpenLayers.Bounds(b, c + a, b + f, c))
+        }
+    },
+    mapDivClick: function(a) {
+        var b = this.rectPxBounds.getCenterPixel(),
+            c = a.xy.x - b.x,
+            d = a.xy.y - b.y,
+            e = this.rectPxBounds.top,
+            f = this.rectPxBounds.left,
+            a = Math.abs(this.rectPxBounds.getHeight()),
+            b = this.rectPxBounds.getWidth(),
+            d = Math.max(0, e + d),
+            d = Math.min(d, this.ovmap.size.h - a),
+            c = Math.max(0, f + c),
+            c = Math.min(c, this.ovmap.size.w - b);
+        this.setRectPxBounds(new OpenLayers.Bounds(c, d + a, c + b, d));
+        this.updateMapToRect()
+    },
+    onButtonClick: function(a) {
+        a.buttonElement === this.minimizeDiv ? this.minimizeControl() : a.buttonElement === this.maximizeDiv && this.maximizeControl()
+    },
+    maximizeControl: function(a) {
+        this.element.style.display =
+            "";
+        this.showToggle(!1);
+        null != a && OpenLayers.Event.stop(a)
+    },
+    minimizeControl: function(a) {
+        this.element.style.display = "none";
+        this.showToggle(!0);
+        null != a && OpenLayers.Event.stop(a)
+    },
+    showToggle: function(a) {
+        this.maximizeDiv.style.display = a ? "" : "none";
+        this.minimizeDiv.style.display = a ? "none" : ""
+    },
+    update: function() {
+        null == this.ovmap && this.createMap();
+        (this.autoPan || !this.isSuitableOverview()) && this.updateOverview();
+        this.updateRectToMap()
+    },
+    isSuitableOverview: function() {
+        var a = this.map.getExtent(),
+            b = this.map.maxExtent,
+            a = new OpenLayers.Bounds(Math.max(a.left, b.left), Math.max(a.bottom, b.bottom), Math.min(a.right, b.right), Math.min(a.top, b.top));
+        this.ovmap.getProjection() != this.map.getProjection() && (a = a.transform(this.map.getProjectionObject(), this.ovmap.getProjectionObject()));
+        b = this.ovmap.getResolution() / this.map.getResolution();
+        return b > this.minRatio && b <= this.maxRatio && this.ovmap.getExtent().containsBounds(a)
+    },
+    updateOverview: function() {
+        var a = this.map.getResolution(),
+            b = this.ovmap.getResolution(),
+            c = b / a;
+        c > this.maxRatio ?
+            b = this.minRatio * a : c <= this.minRatio && (b = this.maxRatio * a);
+        this.ovmap.getProjection() != this.map.getProjection() ? (a = this.map.center.clone(), a.transform(this.map.getProjectionObject(), this.ovmap.getProjectionObject())) : a = this.map.center;
+        this.ovmap.setCenter(a, this.ovmap.getZoomForResolution(b * this.resolutionFactor));
+        this.updateRectToMap()
+    },
+    createMap: function() {
+        var a = OpenLayers.Util.extend({
+            controls: [],
+            maxResolution: "auto",
+            fallThrough: !1
+        }, this.mapOptions);
+        this.ovmap = new OpenLayers.Map(this.mapDiv, a);
+        this.ovmap.viewPortDiv.appendChild(this.extentRectangle);
+        OpenLayers.Event.stopObserving(window, "unload", this.ovmap.unloadDestroy);
+        this.ovmap.addLayers(this.layers);
+        this.ovmap.zoomToMaxExtent();
+        this.wComp = (this.wComp = parseInt(OpenLayers.Element.getStyle(this.extentRectangle, "border-left-width")) + parseInt(OpenLayers.Element.getStyle(this.extentRectangle, "border-right-width"))) ? this.wComp : 2;
+        this.hComp = (this.hComp = parseInt(OpenLayers.Element.getStyle(this.extentRectangle, "border-top-width")) + parseInt(OpenLayers.Element.getStyle(this.extentRectangle, "border-bottom-width"))) ?
+            this.hComp : 2;
+        this.handlers.drag = new OpenLayers.Handler.Drag(this, {
+            move: this.rectDrag,
+            done: this.updateMapToRect
+        }, {
+            map: this.ovmap
+        });
+        this.handlers.click = new OpenLayers.Handler.Click(this, {
+            click: this.mapDivClick
+        }, {
+            single: !0,
+            "double": !1,
+            stopSingle: !0,
+            stopDouble: !0,
+            pixelTolerance: 1,
+            map: this.ovmap
+        });
+        this.handlers.click.activate();
+        this.rectEvents = new OpenLayers.Events(this, this.extentRectangle, null, !0);
+        this.rectEvents.register("mouseover", this, function() {
+            !this.handlers.drag.active && !this.map.dragging && this.handlers.drag.activate()
+        });
+        this.rectEvents.register("mouseout", this, function() {
+            this.handlers.drag.dragging || this.handlers.drag.deactivate()
+        });
+        if (this.ovmap.getProjection() != this.map.getProjection()) {
+            var a = this.map.getProjectionObject().getUnits() || this.map.units || this.map.baseLayer.units,
+                b = this.ovmap.getProjectionObject().getUnits() || this.ovmap.units || this.ovmap.baseLayer.units;
+            this.resolutionFactor = a && b ? OpenLayers.INCHES_PER_UNIT[a] / OpenLayers.INCHES_PER_UNIT[b] : 1
+        }
+    },
+    updateRectToMap: function() {
+        var a = this.getRectBoundsFromMapBounds(this.ovmap.getProjection() !=
+            this.map.getProjection() ? this.map.getExtent().transform(this.map.getProjectionObject(), this.ovmap.getProjectionObject()) : this.map.getExtent());
+        a && this.setRectPxBounds(a)
+    },
+    updateMapToRect: function() {
+        var a = this.getMapBoundsFromRectBounds(this.rectPxBounds);
+        this.ovmap.getProjection() != this.map.getProjection() && (a = a.transform(this.ovmap.getProjectionObject(), this.map.getProjectionObject()));
+        this.map.panTo(a.getCenterLonLat())
+    },
+    setRectPxBounds: function(a) {
+        var b = Math.max(a.top, 0),
+            c = Math.max(a.left, 0),
+            d =
+            Math.min(a.top + Math.abs(a.getHeight()), this.ovmap.size.h - this.hComp),
+            a = Math.min(a.left + a.getWidth(), this.ovmap.size.w - this.wComp),
+            e = Math.max(a - c, 0),
+            f = Math.max(d - b, 0);
+        e < this.minRectSize || f < this.minRectSize ? (this.extentRectangle.className = this.displayClass + this.minRectDisplayClass, e = c + e / 2 - this.minRectSize / 2, this.extentRectangle.style.top = Math.round(b + f / 2 - this.minRectSize / 2) + "px", this.extentRectangle.style.left = Math.round(e) + "px", this.extentRectangle.style.height = this.minRectSize + "px", this.extentRectangle.style.width =
+            this.minRectSize + "px") : (this.extentRectangle.className = this.displayClass + "ExtentRectangle", this.extentRectangle.style.top = Math.round(b) + "px", this.extentRectangle.style.left = Math.round(c) + "px", this.extentRectangle.style.height = Math.round(f) + "px", this.extentRectangle.style.width = Math.round(e) + "px");
+        this.rectPxBounds = new OpenLayers.Bounds(Math.round(c), Math.round(d), Math.round(a), Math.round(b))
+    },
+    getRectBoundsFromMapBounds: function(a) {
+        var b = this.getOverviewPxFromLonLat({
+                lon: a.left,
+                lat: a.bottom
+            }),
+            a = this.getOverviewPxFromLonLat({
+                lon: a.right,
+                lat: a.top
+            }),
+            c = null;
+        b && a && (c = new OpenLayers.Bounds(b.x, b.y, a.x, a.y));
+        return c
+    },
+    getMapBoundsFromRectBounds: function(a) {
+        var b = this.getLonLatFromOverviewPx({
+                x: a.left,
+                y: a.bottom
+            }),
+            a = this.getLonLatFromOverviewPx({
+                x: a.right,
+                y: a.top
+            });
+        return new OpenLayers.Bounds(b.lon, b.lat, a.lon, a.lat)
+    },
+    getLonLatFromOverviewPx: function(a) {
+        var b = this.ovmap.size,
+            c = this.ovmap.getResolution(),
+            d = this.ovmap.getExtent().getCenterLonLat();
+        return {
+            lon: d.lon + (a.x - b.w / 2) * c,
+            lat: d.lat - (a.y - b.h / 2) * c
+        }
+    },
+    getOverviewPxFromLonLat: function(a) {
+        var b =
+            this.ovmap.getResolution(),
+            c = this.ovmap.getExtent();
+        if (c) return {
+            x: Math.round(1 / b * (a.lon - c.left)),
+            y: Math.round(1 / b * (c.top - a.lat))
+        }
+    },
+    CLASS_NAME: "OpenLayers.Control.OverviewMap"
+});
+OpenLayers.Animation = function(a) {
+    var b = !(!a.requestAnimationFrame && !a.webkitRequestAnimationFrame && !a.mozRequestAnimationFrame && !a.oRequestAnimationFrame && !a.msRequestAnimationFrame),
+        c = function() {
+            var b = a.requestAnimationFrame || a.webkitRequestAnimationFrame || a.mozRequestAnimationFrame || a.oRequestAnimationFrame || a.msRequestAnimationFrame || function(b) {
+                a.setTimeout(b, 16)
+            };
+            return function(c, d) {
+                b.apply(a, [c, d])
+            }
+        }(),
+        d = 0,
+        e = {};
+    return {
+        isNative: b,
+        requestFrame: c,
+        start: function(a, b, h) {
+            var b = 0 < b ? b : Number.POSITIVE_INFINITY,
+                i = ++d,
+                j = +new Date;
+            e[i] = function() {
+                e[i] && +new Date - j <= b ? (a(), e[i] && c(e[i], h)) : delete e[i]
+            };
+            c(e[i], h);
+            return i
+        },
+        stop: function(a) {
+            delete e[a]
+        }
+    }
+}(window);
+OpenLayers.Tween = OpenLayers.Class({
+    easing: null,
+    begin: null,
+    finish: null,
+    duration: null,
+    callbacks: null,
+    time: null,
+    animationId: null,
+    playing: !1,
+    initialize: function(a) {
+        this.easing = a ? a : OpenLayers.Easing.Expo.easeOut
+    },
+    start: function(a, b, c, d) {
+        this.playing = !0;
+        this.begin = a;
+        this.finish = b;
+        this.duration = c;
+        this.callbacks = d.callbacks;
+        this.time = 0;
+        OpenLayers.Animation.stop(this.animationId);
+        this.animationId = null;
+        this.callbacks && this.callbacks.start && this.callbacks.start.call(this, this.begin);
+        this.animationId = OpenLayers.Animation.start(OpenLayers.Function.bind(this.play,
+            this))
+    },
+    stop: function() {
+        this.playing && (this.callbacks && this.callbacks.done && this.callbacks.done.call(this, this.finish), OpenLayers.Animation.stop(this.animationId), this.animationId = null, this.playing = !1)
+    },
+    play: function() {
+        var a = {},
+            b;
+        for (b in this.begin) {
+            var c = this.begin[b],
+                d = this.finish[b];
+            if (null == c || null == d || isNaN(c) || isNaN(d)) throw new TypeError("invalid value for Tween");
+            a[b] = this.easing.apply(this, [this.time, c, d - c, this.duration])
+        }
+        this.time++;
+        this.callbacks && this.callbacks.eachStep && this.callbacks.eachStep.call(this,
+            a);
+        this.time > this.duration && this.stop()
+    },
+    CLASS_NAME: "OpenLayers.Tween"
+});
+OpenLayers.Easing = {
+    CLASS_NAME: "OpenLayers.Easing"
+};
+OpenLayers.Easing.Linear = {
+    easeIn: function(a, b, c, d) {
+        return c * a / d + b
+    },
+    easeOut: function(a, b, c, d) {
+        return c * a / d + b
+    },
+    easeInOut: function(a, b, c, d) {
+        return c * a / d + b
+    },
+    CLASS_NAME: "OpenLayers.Easing.Linear"
+};
+OpenLayers.Easing.Expo = {
+    easeIn: function(a, b, c, d) {
+        return 0 == a ? b : c * Math.pow(2, 10 * (a / d - 1)) + b
+    },
+    easeOut: function(a, b, c, d) {
+        return a == d ? b + c : c * (-Math.pow(2, -10 * a / d) + 1) + b
+    },
+    easeInOut: function(a, b, c, d) {
+        return 0 == a ? b : a == d ? b + c : 1 > (a /= d / 2) ? c / 2 * Math.pow(2, 10 * (a - 1)) + b : c / 2 * (-Math.pow(2, -10 * --a) + 2) + b
+    },
+    CLASS_NAME: "OpenLayers.Easing.Expo"
+};
+OpenLayers.Easing.Quad = {
+    easeIn: function(a, b, c, d) {
+        return c * (a /= d) * a + b
+    },
+    easeOut: function(a, b, c, d) {
+        return -c * (a /= d) * (a - 2) + b
+    },
+    easeInOut: function(a, b, c, d) {
+        return 1 > (a /= d / 2) ? c / 2 * a * a + b : -c / 2 * (--a * (a - 2) - 1) + b
+    },
+    CLASS_NAME: "OpenLayers.Easing.Quad"
+};
+OpenLayers.Projection = OpenLayers.Class({
+    proj: null,
+    projCode: null,
+    titleRegEx: /\+title=[^\+]*/,
+    initialize: function(a, b) {
+        OpenLayers.Util.extend(this, b);
+        this.projCode = a;
+        window.Proj4js && (this.proj = new Proj4js.Proj(a))
+    },
+    getCode: function() {
+        return this.proj ? this.proj.srsCode : this.projCode
+    },
+    getUnits: function() {
+        return this.proj ? this.proj.units : null
+    },
+    toString: function() {
+        return this.getCode()
+    },
+    equals: function(a) {
+        var b = !1;
+        a && (a instanceof OpenLayers.Projection || (a = new OpenLayers.Projection(a)), window.Proj4js &&
+            this.proj.defData && a.proj.defData ? b = this.proj.defData.replace(this.titleRegEx, "") == a.proj.defData.replace(this.titleRegEx, "") : a.getCode && (b = this.getCode(), a = a.getCode(), b = b == a || !!OpenLayers.Projection.transforms[b] && OpenLayers.Projection.transforms[b][a] === OpenLayers.Projection.nullTransform));
+        return b
+    },
+    destroy: function() {
+        delete this.proj;
+        delete this.projCode
+    },
+    CLASS_NAME: "OpenLayers.Projection"
+});
+OpenLayers.Projection.transforms = {};
+OpenLayers.Projection.defaults = {
+    "EPSG:4326": {
+        units: "degrees",
+        maxExtent: [-180, -90, 180, 90],
+        yx: !0
+    },
+    "CRS:84": {
+        units: "degrees",
+        maxExtent: [-180, -90, 180, 90]
+    },
+    "EPSG:900913": {
+        units: "m",
+        maxExtent: [-2.003750834E7, -2.003750834E7, 2.003750834E7, 2.003750834E7]
+    }
+};
+OpenLayers.Projection.addTransform = function(a, b, c) {
+    if (c === OpenLayers.Projection.nullTransform) {
+        var d = OpenLayers.Projection.defaults[a];
+        d && !OpenLayers.Projection.defaults[b] && (OpenLayers.Projection.defaults[b] = d)
+    }
+    OpenLayers.Projection.transforms[a] || (OpenLayers.Projection.transforms[a] = {});
+    OpenLayers.Projection.transforms[a][b] = c
+};
+OpenLayers.Projection.transform = function(a, b, c) {
+    if (b && c)
+        if (b instanceof OpenLayers.Projection || (b = new OpenLayers.Projection(b)), c instanceof OpenLayers.Projection || (c = new OpenLayers.Projection(c)), b.proj && c.proj) a = Proj4js.transform(b.proj, c.proj, a);
+        else {
+            var b = b.getCode(),
+                c = c.getCode(),
+                d = OpenLayers.Projection.transforms;
+            if (d[b] && d[b][c]) d[b][c](a)
+        }
+    return a
+};
+OpenLayers.Projection.nullTransform = function(a) {
+    return a
+};
+(function() {
+    function a(a) {
+        a.x = 180 * a.x / d;
+        a.y = 180 / Math.PI * (2 * Math.atan(Math.exp(a.y / d * Math.PI)) - Math.PI / 2);
+        return a
+    }
+
+    function b(a) {
+        a.x = a.x * d / 180;
+        a.y = Math.log(Math.tan((90 + a.y) * Math.PI / 360)) / Math.PI * d;
+        return a
+    }
+
+    function c(c, d) {
+        var e = OpenLayers.Projection.addTransform,
+            f = OpenLayers.Projection.nullTransform,
+            g, m, n, o, p;
+        g = 0;
+        for (m = d.length; g < m; ++g) {
+            n = d[g];
+            e(c, n, b);
+            e(n, c, a);
+            for (p = g + 1; p < m; ++p) o = d[p], e(n, o, f), e(o, n, f)
+        }
+    }
+    var d = 2.003750834E7,
+        e = ["EPSG:900913", "EPSG:3857", "EPSG:102113", "EPSG:102100"],
+        f = ["CRS:84", "urn:ogc:def:crs:EPSG:6.6:4326",
+            "EPSG:4326"
+        ],
+        g;
+    for (g = e.length - 1; 0 <= g; --g) c(e[g], f);
+    for (g = f.length - 1; 0 <= g; --g) c(f[g], e)
+})();
+OpenLayers.Map = OpenLayers.Class({
+    Z_INDEX_BASE: {
+        BaseLayer: 100,
+        Overlay: 325,
+        Feature: 725,
+        Popup: 750,
+        Control: 1E3
+    },
+    id: null,
+    fractionalZoom: !1,
+    events: null,
+    allOverlays: !1,
+    div: null,
+    dragging: !1,
+    size: null,
+    viewPortDiv: null,
+    layerContainerOrigin: null,
+    layerContainerDiv: null,
+    layers: null,
+    controls: null,
+    popups: null,
+    baseLayer: null,
+    center: null,
+    resolution: null,
+    zoom: 0,
+    panRatio: 1.5,
+    options: null,
+    tileSize: null,
+    projection: "EPSG:4326",
+    units: null,
+    resolutions: null,
+    maxResolution: null,
+    minResolution: null,
+    maxScale: null,
+    minScale: null,
+    maxExtent: null,
+    minExtent: null,
+    restrictedExtent: null,
+    numZoomLevels: 16,
+    theme: null,
+    displayProjection: null,
+    fallThrough: !0,
+    panTween: null,
+    eventListeners: null,
+    panMethod: OpenLayers.Easing.Expo.easeOut,
+    panDuration: 50,
+    paddingForPopups: null,
+    minPx: null,
+    maxPx: null,
+    initialize: function(a, b) {
+        1 === arguments.length && "object" === typeof a && (a = (b = a) && b.div);
+        this.tileSize = new OpenLayers.Size(OpenLayers.Map.TILE_WIDTH, OpenLayers.Map.TILE_HEIGHT);
+        this.paddingForPopups = new OpenLayers.Bounds(15, 15, 15, 15);
+        this.theme = OpenLayers._getScriptLocation() +
+            "style.css";
+        this.options = OpenLayers.Util.extend({}, b);
+        OpenLayers.Util.extend(this, b);
+        OpenLayers.Util.applyDefaults(this, OpenLayers.Projection.defaults[this.projection instanceof OpenLayers.Projection ? this.projection.projCode : this.projection]);
+        this.maxExtent && !(this.maxExtent instanceof OpenLayers.Bounds) && (this.maxExtent = new OpenLayers.Bounds(this.maxExtent));
+        this.minExtent && !(this.minExtent instanceof OpenLayers.Bounds) && (this.minExtent = new OpenLayers.Bounds(this.minExtent));
+        this.restrictedExtent &&
+            !(this.restrictedExtent instanceof OpenLayers.Bounds) && (this.restrictedExtent = new OpenLayers.Bounds(this.restrictedExtent));
+        this.center && !(this.center instanceof OpenLayers.LonLat) && (this.center = new OpenLayers.LonLat(this.center));
+        this.layers = [];
+        this.id = OpenLayers.Util.createUniqueID("OpenLayers.Map_");
+        this.div = OpenLayers.Util.getElement(a);
+        this.div || (this.div = document.createElement("div"), this.div.style.height = "1px", this.div.style.width = "1px");
+        OpenLayers.Element.addClass(this.div, "olMap");
+        var c =
+            this.id + "_OpenLayers_ViewPort";
+        this.viewPortDiv = OpenLayers.Util.createDiv(c, null, null, null, "relative", null, "hidden");
+        this.viewPortDiv.style.width = "100%";
+        this.viewPortDiv.style.height = "100%";
+        this.viewPortDiv.className = "olMapViewport";
+        this.div.appendChild(this.viewPortDiv);
+        this.events = new OpenLayers.Events(this, this.viewPortDiv, null, this.fallThrough, {
+            includeXY: !0
+        });
+        c = this.id + "_OpenLayers_Container";
+        this.layerContainerDiv = OpenLayers.Util.createDiv(c);
+        this.layerContainerDiv.style.width = "100px";
+        this.layerContainerDiv.style.height =
+            "100px";
+        this.layerContainerDiv.style.zIndex = this.Z_INDEX_BASE.Popup - 1;
+        this.viewPortDiv.appendChild(this.layerContainerDiv);
+        this.updateSize();
+        if (this.eventListeners instanceof Object) this.events.on(this.eventListeners);
+        9 > parseFloat(navigator.appVersion.split("MSIE")[1]) ? this.events.register("resize", this, this.updateSize) : (this.updateSizeDestroy = OpenLayers.Function.bind(this.updateSize, this), OpenLayers.Event.observe(window, "resize", this.updateSizeDestroy));
+        if (this.theme) {
+            for (var c = !0, d = document.getElementsByTagName("link"),
+                    e = 0, f = d.length; e < f; ++e)
+                if (OpenLayers.Util.isEquivalentUrl(d.item(e).href, this.theme)) {
+                    c = !1;
+                    break
+                }
+            c && (c = document.createElement("link"), c.setAttribute("rel", "stylesheet"), c.setAttribute("type", "text/css"), c.setAttribute("href", this.theme), document.getElementsByTagName("head")[0].appendChild(c))
+        }
+        null == this.controls && (this.controls = [], null != OpenLayers.Control && (OpenLayers.Control.Navigation ? this.controls.push(new OpenLayers.Control.Navigation) : OpenLayers.Control.TouchNavigation && this.controls.push(new OpenLayers.Control.TouchNavigation),
+            OpenLayers.Control.Zoom ? this.controls.push(new OpenLayers.Control.Zoom) : OpenLayers.Control.PanZoom && this.controls.push(new OpenLayers.Control.PanZoom), OpenLayers.Control.ArgParser && this.controls.push(new OpenLayers.Control.ArgParser), OpenLayers.Control.Attribution && this.controls.push(new OpenLayers.Control.Attribution)));
+        e = 0;
+        for (f = this.controls.length; e < f; e++) this.addControlToMap(this.controls[e]);
+        this.popups = [];
+        this.unloadDestroy = OpenLayers.Function.bind(this.destroy, this);
+        OpenLayers.Event.observe(window,
+            "unload", this.unloadDestroy);
+        b && b.layers && (delete this.center, this.addLayers(b.layers), b.center && !this.getCenter() && this.setCenter(b.center, b.zoom))
+    },
+    getViewport: function() {
+        return this.viewPortDiv
+    },
+    render: function(a) {
+        this.div = OpenLayers.Util.getElement(a);
+        OpenLayers.Element.addClass(this.div, "olMap");
+        this.viewPortDiv.parentNode.removeChild(this.viewPortDiv);
+        this.div.appendChild(this.viewPortDiv);
+        this.updateSize()
+    },
+    unloadDestroy: null,
+    updateSizeDestroy: null,
+    destroy: function() {
+        if (!this.unloadDestroy) return !1;
+        this.panTween && (this.panTween.stop(), this.panTween = null);
+        OpenLayers.Event.stopObserving(window, "unload", this.unloadDestroy);
+        this.unloadDestroy = null;
+        this.updateSizeDestroy ? OpenLayers.Event.stopObserving(window, "resize", this.updateSizeDestroy) : this.events.unregister("resize", this, this.updateSize);
+        this.paddingForPopups = null;
+        if (null != this.controls) {
+            for (var a = this.controls.length - 1; 0 <= a; --a) this.controls[a].destroy();
+            this.controls = null
+        }
+        if (null != this.layers) {
+            for (a = this.layers.length - 1; 0 <= a; --a) this.layers[a].destroy(!1);
+            this.layers = null
+        }
+        this.viewPortDiv && this.div.removeChild(this.viewPortDiv);
+        this.viewPortDiv = null;
+        this.eventListeners && (this.events.un(this.eventListeners), this.eventListeners = null);
+        this.events.destroy();
+        this.options = this.events = null
+    },
+    setOptions: function(a) {
+        var b = this.minPx && a.restrictedExtent != this.restrictedExtent;
+        OpenLayers.Util.extend(this, a);
+        b && this.moveTo(this.getCachedCenter(), this.zoom, {
+            forceZoomChange: !0
+        })
+    },
+    getTileSize: function() {
+        return this.tileSize
+    },
+    getBy: function(a, b, c) {
+        var d = "function" ==
+            typeof c.test;
+        return OpenLayers.Array.filter(this[a], function(a) {
+            return a[b] == c || d && c.test(a[b])
+        })
+    },
+    getLayersBy: function(a, b) {
+        return this.getBy("layers", a, b)
+    },
+    getLayersByName: function(a) {
+        return this.getLayersBy("name", a)
+    },
+    getLayersByClass: function(a) {
+        return this.getLayersBy("CLASS_NAME", a)
+    },
+    getControlsBy: function(a, b) {
+        return this.getBy("controls", a, b)
+    },
+    getControlsByClass: function(a) {
+        return this.getControlsBy("CLASS_NAME", a)
+    },
+    getLayer: function(a) {
+        for (var b = null, c = 0, d = this.layers.length; c < d; c++) {
+            var e =
+                this.layers[c];
+            if (e.id == a) {
+                b = e;
+                break
+            }
+        }
+        return b
+    },
+    setLayerZIndex: function(a, b) {
+        a.setZIndex(this.Z_INDEX_BASE[a.isBaseLayer ? "BaseLayer" : "Overlay"] + 5 * b)
+    },
+    resetLayersZIndex: function() {
+        for (var a = 0, b = this.layers.length; a < b; a++) this.setLayerZIndex(this.layers[a], a)
+    },
+    addLayer: function(a) {
+        for (var b = 0, c = this.layers.length; b < c; b++)
+            if (this.layers[b] == a) return !1;
+        if (!1 === this.events.triggerEvent("preaddlayer", {
+                layer: a
+            })) return !1;
+        this.allOverlays && (a.isBaseLayer = !1);
+        a.div.className = "olLayerDiv";
+        a.div.style.overflow =
+            "";
+        this.setLayerZIndex(a, this.layers.length);
+        a.isFixed ? this.viewPortDiv.appendChild(a.div) : this.layerContainerDiv.appendChild(a.div);
+        this.layers.push(a);
+        a.setMap(this);
+        a.isBaseLayer || this.allOverlays && !this.baseLayer ? null == this.baseLayer ? this.setBaseLayer(a) : a.setVisibility(!1) : a.redraw();
+        this.events.triggerEvent("addlayer", {
+            layer: a
+        });
+        a.events.triggerEvent("added", {
+            map: this,
+            layer: a
+        });
+        a.afterAdd();
+        return !0
+    },
+    addLayers: function(a) {
+        for (var b = 0, c = a.length; b < c; b++) this.addLayer(a[b])
+    },
+    removeLayer: function(a,
+        b) {
+        if (!1 !== this.events.triggerEvent("preremovelayer", {
+                layer: a
+            })) {
+            null == b && (b = !0);
+            a.isFixed ? this.viewPortDiv.removeChild(a.div) : this.layerContainerDiv.removeChild(a.div);
+            OpenLayers.Util.removeItem(this.layers, a);
+            a.removeMap(this);
+            a.map = null;
+            if (this.baseLayer == a && (this.baseLayer = null, b))
+                for (var c = 0, d = this.layers.length; c < d; c++) {
+                    var e = this.layers[c];
+                    if (e.isBaseLayer || this.allOverlays) {
+                        this.setBaseLayer(e);
+                        break
+                    }
+                }
+            this.resetLayersZIndex();
+            this.events.triggerEvent("removelayer", {
+                layer: a
+            });
+            a.events.triggerEvent("removed", {
+                map: this,
+                layer: a
+            })
+        }
+    },
+    getNumLayers: function() {
+        return this.layers.length
+    },
+    getLayerIndex: function(a) {
+        return OpenLayers.Util.indexOf(this.layers, a)
+    },
+    setLayerIndex: function(a, b) {
+        var c = this.getLayerIndex(a);
+        0 > b ? b = 0 : b > this.layers.length && (b = this.layers.length);
+        if (c != b) {
+            this.layers.splice(c, 1);
+            this.layers.splice(b, 0, a);
+            for (var c = 0, d = this.layers.length; c < d; c++) this.setLayerZIndex(this.layers[c], c);
+            this.events.triggerEvent("changelayer", {
+                layer: a,
+                property: "order"
+            });
+            this.allOverlays && (0 === b ? this.setBaseLayer(a) :
+                this.baseLayer !== this.layers[0] && this.setBaseLayer(this.layers[0]))
+        }
+    },
+    raiseLayer: function(a, b) {
+        var c = this.getLayerIndex(a) + b;
+        this.setLayerIndex(a, c)
+    },
+    setBaseLayer: function(a) {
+        if (a != this.baseLayer && -1 != OpenLayers.Util.indexOf(this.layers, a)) {
+            var b = this.getCachedCenter(),
+                c = OpenLayers.Util.getResolutionFromScale(this.getScale(), a.units);
+            null != this.baseLayer && !this.allOverlays && this.baseLayer.setVisibility(!1);
+            this.baseLayer = a;
+            if (!this.allOverlays || this.baseLayer.visibility) this.baseLayer.setVisibility(!0), !1 === this.baseLayer.inRange && this.baseLayer.redraw();
+            null != b && (a = this.getZoomForResolution(c || this.resolution, !0), this.setCenter(b, a, !1, !0));
+            this.events.triggerEvent("changebaselayer", {
+                layer: this.baseLayer
+            })
+        }
+    },
+    addControl: function(a, b) {
+        this.controls.push(a);
+        this.addControlToMap(a, b)
+    },
+    addControls: function(a, b) {
+        for (var c = 1 === arguments.length ? [] : b, d = 0, e = a.length; d < e; d++) this.addControl(a[d], c[d] ? c[d] : null)
+    },
+    addControlToMap: function(a, b) {
+        a.outsideViewport = null != a.div;
+        this.displayProjection && !a.displayProjection &&
+            (a.displayProjection = this.displayProjection);
+        a.setMap(this);
+        var c = a.draw(b);
+        c && !a.outsideViewport && (c.style.zIndex = this.Z_INDEX_BASE.Control + this.controls.length, this.viewPortDiv.appendChild(c));
+        a.autoActivate && a.activate()
+    },
+    getControl: function(a) {
+        for (var b = null, c = 0, d = this.controls.length; c < d; c++) {
+            var e = this.controls[c];
+            if (e.id == a) {
+                b = e;
+                break
+            }
+        }
+        return b
+    },
+    removeControl: function(a) {
+        a && a == this.getControl(a.id) && (a.div && a.div.parentNode == this.viewPortDiv && this.viewPortDiv.removeChild(a.div), OpenLayers.Util.removeItem(this.controls,
+            a))
+    },
+    addPopup: function(a, b) {
+        if (b)
+            for (var c = this.popups.length - 1; 0 <= c; --c) this.removePopup(this.popups[c]);
+        a.map = this;
+        this.popups.push(a);
+        if (c = a.draw()) c.style.zIndex = this.Z_INDEX_BASE.Popup + this.popups.length, this.layerContainerDiv.appendChild(c)
+    },
+    removePopup: function(a) {
+        OpenLayers.Util.removeItem(this.popups, a);
+        if (a.div) try {
+            this.layerContainerDiv.removeChild(a.div)
+        } catch (b) {}
+        a.map = null
+    },
+    getSize: function() {
+        var a = null;
+        null != this.size && (a = this.size.clone());
+        return a
+    },
+    updateSize: function() {
+        var a = this.getCurrentSize();
+        if (a && !isNaN(a.h) && !isNaN(a.w)) {
+            this.events.clearMouseCache();
+            var b = this.getSize();
+            null == b && (this.size = b = a);
+            if (!a.equals(b)) {
+                this.size = a;
+                a = 0;
+                for (b = this.layers.length; a < b; a++) this.layers[a].onMapResize();
+                a = this.getCachedCenter();
+                null != this.baseLayer && null != a && (b = this.getZoom(), this.zoom = null, this.setCenter(a, b))
+            }
+        }
+    },
+    getCurrentSize: function() {
+        var a = new OpenLayers.Size(this.div.clientWidth, this.div.clientHeight);
+        if (0 == a.w && 0 == a.h || isNaN(a.w) && isNaN(a.h)) a.w = this.div.offsetWidth, a.h = this.div.offsetHeight;
+        if (0 == a.w && 0 == a.h || isNaN(a.w) && isNaN(a.h)) a.w = parseInt(this.div.style.width), a.h = parseInt(this.div.style.height);
+        return a
+    },
+    calculateBounds: function(a, b) {
+        var c = null;
+        null == a && (a = this.getCachedCenter());
+        null == b && (b = this.getResolution());
+        if (null != a && null != b) var c = this.size.w * b / 2,
+            d = this.size.h * b / 2,
+            c = new OpenLayers.Bounds(a.lon - c, a.lat - d, a.lon + c, a.lat + d);
+        return c
+    },
+    getCenter: function() {
+        var a = null,
+            b = this.getCachedCenter();
+        b && (a = b.clone());
+        return a
+    },
+    getCachedCenter: function() {
+        !this.center && this.size && (this.center =
+            this.getLonLatFromViewPortPx({
+                x: this.size.w / 2,
+                y: this.size.h / 2
+            }));
+        return this.center
+    },
+    getZoom: function() {
+        return this.zoom
+    },
+    pan: function(a, b, c) {
+        c = OpenLayers.Util.applyDefaults(c, {
+            animate: !0,
+            dragging: !1
+        });
+        if (c.dragging)(0 != a || 0 != b) && this.moveByPx(a, b);
+        else {
+            var d = this.getViewPortPxFromLonLat(this.getCachedCenter()),
+                a = d.add(a, b);
+            if (this.dragging || !a.equals(d)) d = this.getLonLatFromViewPortPx(a), c.animate ? this.panTo(d) : (this.moveTo(d), this.dragging && (this.dragging = !1, this.events.triggerEvent("moveend")))
+        }
+    },
+    panTo: function(a) {
+        if (this.panMethod && this.getExtent().scale(this.panRatio).containsLonLat(a)) {
+            this.panTween || (this.panTween = new OpenLayers.Tween(this.panMethod));
+            var b = this.getCachedCenter();
+            if (!a.equals(b)) {
+                var b = this.getPixelFromLonLat(b),
+                    c = this.getPixelFromLonLat(a),
+                    d = 0,
+                    e = 0;
+                this.panTween.start({
+                    x: 0,
+                    y: 0
+                }, {
+                    x: c.x - b.x,
+                    y: c.y - b.y
+                }, this.panDuration, {
+                    callbacks: {
+                        eachStep: OpenLayers.Function.bind(function(a) {
+                            this.moveByPx(a.x - d, a.y - e);
+                            d = Math.round(a.x);
+                            e = Math.round(a.y)
+                        }, this),
+                        done: OpenLayers.Function.bind(function() {
+                            this.moveTo(a);
+                            this.dragging = false;
+                            this.events.triggerEvent("moveend")
+                        }, this)
+                    }
+                })
+            }
+        } else this.setCenter(a)
+    },
+    setCenter: function(a, b, c, d) {
+        this.panTween && this.panTween.stop();
+        this.moveTo(a, b, {
+            dragging: c,
+            forceZoomChange: d
+        })
+    },
+    moveByPx: function(a, b) {
+        var c = this.size.w / 2,
+            d = this.size.h / 2,
+            e = c + a,
+            f = d + b,
+            g = this.baseLayer.wrapDateLine,
+            h = 0,
+            i = 0;
+        this.restrictedExtent && (h = c, i = d, g = !1);
+        a = g || e <= this.maxPx.x - h && e >= this.minPx.x + h ? Math.round(a) : 0;
+        b = f <= this.maxPx.y - i && f >= this.minPx.y + i ? Math.round(b) : 0;
+        if (a || b) {
+            this.dragging || (this.dragging = !0, this.events.triggerEvent("movestart"));
+            this.center = null;
+            a && (this.layerContainerDiv.style.left = parseInt(this.layerContainerDiv.style.left) - a + "px", this.minPx.x -= a, this.maxPx.x -= a);
+            b && (this.layerContainerDiv.style.top = parseInt(this.layerContainerDiv.style.top) - b + "px", this.minPx.y -= b, this.maxPx.y -= b);
+            d = 0;
+            for (e = this.layers.length; d < e; ++d)
+                if (c = this.layers[d], c.visibility && (c === this.baseLayer || c.inRange)) c.moveByPx(a, b), c.events.triggerEvent("move");
+            this.events.triggerEvent("move")
+        }
+    },
+    adjustZoom: function(a) {
+        var b =
+            this.baseLayer.resolutions,
+            c = this.getMaxExtent().getWidth() / this.size.w;
+        if (this.getResolutionForZoom(a) > c)
+            for (var d = a | 0, e = b.length; d < e; ++d)
+                if (b[d] <= c) {
+                    a = d;
+                    break
+                }
+        return a
+    },
+    moveTo: function(a, b, c) {
+        null != a && !(a instanceof OpenLayers.LonLat) && (a = new OpenLayers.LonLat(a));
+        c || (c = {});
+        null != b && (b = parseFloat(b), this.fractionalZoom || (b = Math.round(b)));
+        if (this.baseLayer.wrapDateLine) {
+            var d = b,
+                b = this.adjustZoom(b);
+            b !== d && (a = this.getCenter())
+        }
+        var d = c.dragging || this.dragging,
+            e = c.forceZoomChange;
+        !this.getCachedCenter() &&
+            !this.isValidLonLat(a) && (a = this.maxExtent.getCenterLonLat(), this.center = a.clone());
+        if (null != this.restrictedExtent) {
+            null == a && (a = this.center);
+            null == b && (b = this.getZoom());
+            var f = this.getResolutionForZoom(b),
+                f = this.calculateBounds(a, f);
+            if (!this.restrictedExtent.containsBounds(f)) {
+                var g = this.restrictedExtent.getCenterLonLat();
+                f.getWidth() > this.restrictedExtent.getWidth() ? a = new OpenLayers.LonLat(g.lon, a.lat) : f.left < this.restrictedExtent.left ? a = a.add(this.restrictedExtent.left - f.left, 0) : f.right > this.restrictedExtent.right &&
+                    (a = a.add(this.restrictedExtent.right - f.right, 0));
+                f.getHeight() > this.restrictedExtent.getHeight() ? a = new OpenLayers.LonLat(a.lon, g.lat) : f.bottom < this.restrictedExtent.bottom ? a = a.add(0, this.restrictedExtent.bottom - f.bottom) : f.top > this.restrictedExtent.top && (a = a.add(0, this.restrictedExtent.top - f.top))
+            }
+        }
+        e = e || this.isValidZoomLevel(b) && b != this.getZoom();
+        f = this.isValidLonLat(a) && !a.equals(this.center);
+        if (e || f || d) {
+            d || this.events.triggerEvent("movestart");
+            f && (!e && this.center && this.centerLayerContainer(a), this.center =
+                a.clone());
+            a = e ? this.getResolutionForZoom(b) : this.getResolution();
+            if (e || null == this.layerContainerOrigin) {
+                this.layerContainerOrigin = this.getCachedCenter();
+                this.layerContainerDiv.style.left = "0px";
+                this.layerContainerDiv.style.top = "0px";
+                var f = this.getMaxExtent({
+                        restricted: !0
+                    }),
+                    h = f.getCenterLonLat(),
+                    g = this.center.lon - h.lon,
+                    h = h.lat - this.center.lat,
+                    i = Math.round(f.getWidth() / a),
+                    j = Math.round(f.getHeight() / a);
+                this.minPx = {
+                    x: (this.size.w - i) / 2 - g / a,
+                    y: (this.size.h - j) / 2 - h / a
+                };
+                this.maxPx = {
+                    x: this.minPx.x + Math.round(f.getWidth() /
+                        a),
+                    y: this.minPx.y + Math.round(f.getHeight() / a)
+                }
+            }
+            e && (this.zoom = b, this.resolution = a);
+            a = this.getExtent();
+            this.baseLayer.visibility && (this.baseLayer.moveTo(a, e, c.dragging), c.dragging || this.baseLayer.events.triggerEvent("moveend", {
+                zoomChanged: e
+            }));
+            a = this.baseLayer.getExtent();
+            for (b = this.layers.length - 1; 0 <= b; --b)
+                if (f = this.layers[b], f !== this.baseLayer && !f.isBaseLayer && (g = f.calculateInRange(), f.inRange != g && ((f.inRange = g) || f.display(!1), this.events.triggerEvent("changelayer", {
+                            layer: f,
+                            property: "visibility"
+                        })),
+                        g && f.visibility)) f.moveTo(a, e, c.dragging), c.dragging || f.events.triggerEvent("moveend", {
+                    zoomChanged: e
+                });
+            this.events.triggerEvent("move");
+            d || this.events.triggerEvent("moveend");
+            if (e) {
+                b = 0;
+                for (c = this.popups.length; b < c; b++) this.popups[b].updatePosition();
+                this.events.triggerEvent("zoomend")
+            }
+        }
+    },
+    centerLayerContainer: function(a) {
+        var b = this.getViewPortPxFromLonLat(this.layerContainerOrigin),
+            c = this.getViewPortPxFromLonLat(a);
+        if (null != b && null != c) {
+            var d = parseInt(this.layerContainerDiv.style.left),
+                a = parseInt(this.layerContainerDiv.style.top),
+                e = Math.round(b.x - c.x),
+                b = Math.round(b.y - c.y);
+            this.layerContainerDiv.style.left = e + "px";
+            this.layerContainerDiv.style.top = b + "px";
+            d -= e;
+            a -= b;
+            this.minPx.x -= d;
+            this.maxPx.x -= d;
+            this.minPx.y -= a;
+            this.maxPx.y -= a
+        }
+    },
+    isValidZoomLevel: function(a) {
+        return null != a && 0 <= a && a < this.getNumZoomLevels()
+    },
+    isValidLonLat: function(a) {
+        var b = !1;
+        null != a && (b = this.getMaxExtent(), b = b.containsLonLat(a, {
+            worldBounds: this.baseLayer.wrapDateLine && b
+        }));
+        return b
+    },
+    getProjection: function() {
+        var a = this.getProjectionObject();
+        return a ? a.getCode() :
+            null
+    },
+    getProjectionObject: function() {
+        var a = null;
+        null != this.baseLayer && (a = this.baseLayer.projection);
+        return a
+    },
+    getMaxResolution: function() {
+        var a = null;
+        null != this.baseLayer && (a = this.baseLayer.maxResolution);
+        return a
+    },
+    getMaxExtent: function(a) {
+        var b = null;
+        a && a.restricted && this.restrictedExtent ? b = this.restrictedExtent : null != this.baseLayer && (b = this.baseLayer.maxExtent);
+        return b
+    },
+    getNumZoomLevels: function() {
+        var a = null;
+        null != this.baseLayer && (a = this.baseLayer.numZoomLevels);
+        return a
+    },
+    getExtent: function() {
+        var a =
+            null;
+        null != this.baseLayer && (a = this.baseLayer.getExtent());
+        return a
+    },
+    getResolution: function() {
+        var a = null;
+        null != this.baseLayer ? a = this.baseLayer.getResolution() : !0 === this.allOverlays && 0 < this.layers.length && (a = this.layers[0].getResolution());
+        return a
+    },
+    getUnits: function() {
+        var a = null;
+        null != this.baseLayer && (a = this.baseLayer.units);
+        return a
+    },
+    getScale: function() {
+        var a = null;
+        null != this.baseLayer && (a = this.getResolution(), a = OpenLayers.Util.getScaleFromResolution(a, this.baseLayer.units));
+        return a
+    },
+    getZoomForExtent: function(a,
+        b) {
+        var c = null;
+        null != this.baseLayer && (c = this.baseLayer.getZoomForExtent(a, b));
+        return c
+    },
+    getResolutionForZoom: function(a) {
+        var b = null;
+        this.baseLayer && (b = this.baseLayer.getResolutionForZoom(a));
+        return b
+    },
+    getZoomForResolution: function(a, b) {
+        var c = null;
+        null != this.baseLayer && (c = this.baseLayer.getZoomForResolution(a, b));
+        return c
+    },
+    zoomTo: function(a) {
+        this.isValidZoomLevel(a) && this.setCenter(null, a)
+    },
+    zoomIn: function() {
+        this.zoomTo(this.getZoom() + 1)
+    },
+    zoomOut: function() {
+        this.zoomTo(this.getZoom() - 1)
+    },
+    zoomToExtent: function(a,
+        b) {
+        a instanceof OpenLayers.Bounds || (a = new OpenLayers.Bounds(a));
+        var c = a.getCenterLonLat();
+        if (this.baseLayer.wrapDateLine) {
+            c = this.getMaxExtent();
+            for (a = a.clone(); a.right < a.left;) a.right += c.getWidth();
+            c = a.getCenterLonLat().wrapDateLine(c)
+        }
+        this.setCenter(c, this.getZoomForExtent(a, b))
+    },
+    zoomToMaxExtent: function(a) {
+        this.zoomToExtent(this.getMaxExtent({
+            restricted: a ? a.restricted : !0
+        }))
+    },
+    zoomToScale: function(a, b) {
+        var c = OpenLayers.Util.getResolutionFromScale(a, this.baseLayer.units),
+            d = this.size.w * c / 2,
+            c = this.size.h *
+            c / 2,
+            e = this.getCachedCenter();
+        this.zoomToExtent(new OpenLayers.Bounds(e.lon - d, e.lat - c, e.lon + d, e.lat + c), b)
+    },
+    getLonLatFromViewPortPx: function(a) {
+        var b = null;
+        null != this.baseLayer && (b = this.baseLayer.getLonLatFromViewPortPx(a));
+        return b
+    },
+    getViewPortPxFromLonLat: function(a) {
+        var b = null;
+        null != this.baseLayer && (b = this.baseLayer.getViewPortPxFromLonLat(a));
+        return b
+    },
+    getLonLatFromPixel: function(a) {
+        return this.getLonLatFromViewPortPx(a)
+    },
+    getPixelFromLonLat: function(a) {
+        a = this.getViewPortPxFromLonLat(a);
+        a.x = Math.round(a.x);
+        a.y = Math.round(a.y);
+        return a
+    },
+    getGeodesicPixelSize: function(a) {
+        var b = a ? this.getLonLatFromPixel(a) : this.getCachedCenter() || new OpenLayers.LonLat(0, 0),
+            c = this.getResolution(),
+            a = b.add(-c / 2, 0),
+            d = b.add(c / 2, 0),
+            e = b.add(0, -c / 2),
+            b = b.add(0, c / 2),
+            c = new OpenLayers.Projection("EPSG:4326"),
+            f = this.getProjectionObject() || c;
+        f.equals(c) || (a.transform(f, c), d.transform(f, c), e.transform(f, c), b.transform(f, c));
+        return new OpenLayers.Size(OpenLayers.Util.distVincenty(a, d), OpenLayers.Util.distVincenty(e, b))
+    },
+    getViewPortPxFromLayerPx: function(a) {
+        var b =
+            null;
+        if (null != a) var b = parseInt(this.layerContainerDiv.style.left),
+            c = parseInt(this.layerContainerDiv.style.top),
+            b = a.add(b, c);
+        return b
+    },
+    getLayerPxFromViewPortPx: function(a) {
+        var b = null;
+        if (null != a) {
+            var b = -parseInt(this.layerContainerDiv.style.left),
+                c = -parseInt(this.layerContainerDiv.style.top),
+                b = a.add(b, c);
+            if (isNaN(b.x) || isNaN(b.y)) b = null
+        }
+        return b
+    },
+    getLonLatFromLayerPx: function(a) {
+        a = this.getViewPortPxFromLayerPx(a);
+        return this.getLonLatFromViewPortPx(a)
+    },
+    getLayerPxFromLonLat: function(a) {
+        return this.getLayerPxFromViewPortPx(this.getPixelFromLonLat(a))
+    },
+    CLASS_NAME: "OpenLayers.Map"
+});
+OpenLayers.Map.TILE_WIDTH = 256;
+OpenLayers.Map.TILE_HEIGHT = 256;
+OpenLayers.Layer = OpenLayers.Class({
+    id: null,
+    name: null,
+    div: null,
+    opacity: 1,
+    alwaysInRange: null,
+    RESOLUTION_PROPERTIES: "scales resolutions maxScale minScale maxResolution minResolution numZoomLevels maxZoomLevel".split(" "),
+    events: null,
+    map: null,
+    isBaseLayer: !1,
+    alpha: !1,
+    displayInLayerSwitcher: !0,
+    visibility: !0,
+    attribution: null,
+    inRange: !1,
+    imageSize: null,
+    options: null,
+    eventListeners: null,
+    gutter: 0,
+    projection: null,
+    units: null,
+    scales: null,
+    resolutions: null,
+    maxExtent: null,
+    minExtent: null,
+    maxResolution: null,
+    minResolution: null,
+    numZoomLevels: null,
+    minScale: null,
+    maxScale: null,
+    displayOutsideMaxExtent: !1,
+    wrapDateLine: !1,
+    metadata: null,
+    initialize: function(a, b) {
+        this.metadata = {};
+        this.addOptions(b);
+        this.name = a;
+        if (null == this.id && (this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_"), this.div = OpenLayers.Util.createDiv(this.id), this.div.style.width = "100%", this.div.style.height = "100%", this.div.dir = "ltr", this.events = new OpenLayers.Events(this, this.div), this.eventListeners instanceof Object)) this.events.on(this.eventListeners)
+    },
+    destroy: function(a) {
+        null == a && (a = !0);
+        null != this.map && this.map.removeLayer(this, a);
+        this.options = this.div = this.name = this.map = this.projection = null;
+        this.events && (this.eventListeners && this.events.un(this.eventListeners), this.events.destroy());
+        this.events = this.eventListeners = null
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer(this.name, this.getOptions()));
+        OpenLayers.Util.applyDefaults(a, this);
+        a.map = null;
+        return a
+    },
+    getOptions: function() {
+        var a = {},
+            b;
+        for (b in this.options) a[b] = this[b];
+        return a
+    },
+    setName: function(a) {
+        a !=
+            this.name && (this.name = a, null != this.map && this.map.events.triggerEvent("changelayer", {
+                layer: this,
+                property: "name"
+            }))
+    },
+    addOptions: function(a, b) {
+        null == this.options && (this.options = {});
+        if (a && ("string" == typeof a.projection && (a.projection = new OpenLayers.Projection(a.projection)), a.projection && OpenLayers.Util.applyDefaults(a, OpenLayers.Projection.defaults[a.projection.getCode()]), a.maxExtent && !(a.maxExtent instanceof OpenLayers.Bounds) && (a.maxExtent = new OpenLayers.Bounds(a.maxExtent)), a.minExtent && !(a.minExtent instanceof OpenLayers.Bounds))) a.minExtent = new OpenLayers.Bounds(a.minExtent);
+        OpenLayers.Util.extend(this.options, a);
+        OpenLayers.Util.extend(this, a);
+        this.projection && this.projection.getUnits() && (this.units = this.projection.getUnits());
+        if (this.map) {
+            var c = this.map.getResolution(),
+                d = this.RESOLUTION_PROPERTIES.concat(["projection", "units", "minExtent", "maxExtent"]),
+                e;
+            for (e in a)
+                if (a.hasOwnProperty(e) && 0 <= OpenLayers.Util.indexOf(d, e)) {
+                    this.initResolutions();
+                    b && this.map.baseLayer === this && (this.map.setCenter(this.map.getCenter(),
+                        this.map.getZoomForResolution(c), !1, !0), this.map.events.triggerEvent("changebaselayer", {
+                        layer: this
+                    }));
+                    break
+                }
+        }
+    },
+    onMapResize: function() {},
+    redraw: function() {
+        var a = !1;
+        if (this.map) {
+            this.inRange = this.calculateInRange();
+            var b = this.getExtent();
+            b && (this.inRange && this.visibility) && (this.moveTo(b, !0, !1), this.events.triggerEvent("moveend", {
+                zoomChanged: !0
+            }), a = !0)
+        }
+        return a
+    },
+    moveTo: function() {
+        var a = this.visibility;
+        this.isBaseLayer || (a = a && this.inRange);
+        this.display(a)
+    },
+    moveByPx: function() {},
+    setMap: function(a) {
+        null ==
+            this.map && (this.map = a, this.maxExtent = this.maxExtent || this.map.maxExtent, this.minExtent = this.minExtent || this.map.minExtent, this.projection = this.projection || this.map.projection, "string" == typeof this.projection && (this.projection = new OpenLayers.Projection(this.projection)), this.units = this.projection.getUnits() || this.units || this.map.units, this.initResolutions(), this.isBaseLayer || (this.inRange = this.calculateInRange(), this.div.style.display = this.visibility && this.inRange ? "" : "none"), this.setTileSize())
+    },
+    afterAdd: function() {},
+    removeMap: function() {},
+    getImageSize: function() {
+        return this.imageSize || this.tileSize
+    },
+    setTileSize: function(a) {
+        this.tileSize = a = a ? a : this.tileSize ? this.tileSize : this.map.getTileSize();
+        this.gutter && (this.imageSize = new OpenLayers.Size(a.w + 2 * this.gutter, a.h + 2 * this.gutter))
+    },
+    getVisibility: function() {
+        return this.visibility
+    },
+    setVisibility: function(a) {
+        a != this.visibility && (this.visibility = a, this.display(a), this.redraw(), null != this.map && this.map.events.triggerEvent("changelayer", {
+                layer: this,
+                property: "visibility"
+            }),
+            this.events.triggerEvent("visibilitychanged"))
+    },
+    display: function(a) {
+        a != ("none" != this.div.style.display) && (this.div.style.display = a && this.calculateInRange() ? "block" : "none")
+    },
+    calculateInRange: function() {
+        var a = !1;
+        this.alwaysInRange ? a = !0 : this.map && (a = this.map.getResolution(), a = a >= this.minResolution && a <= this.maxResolution);
+        return a
+    },
+    setIsBaseLayer: function(a) {
+        a != this.isBaseLayer && (this.isBaseLayer = a, null != this.map && this.map.events.triggerEvent("changebaselayer", {
+            layer: this
+        }))
+    },
+    initResolutions: function() {
+        var a,
+            b, c, d = {},
+            e = !0;
+        a = 0;
+        for (b = this.RESOLUTION_PROPERTIES.length; a < b; a++) c = this.RESOLUTION_PROPERTIES[a], d[c] = this.options[c], e && this.options[c] && (e = !1);
+        null == this.alwaysInRange && (this.alwaysInRange = e);
+        null == d.resolutions && (d.resolutions = this.resolutionsFromScales(d.scales));
+        null == d.resolutions && (d.resolutions = this.calculateResolutions(d));
+        if (null == d.resolutions) {
+            a = 0;
+            for (b = this.RESOLUTION_PROPERTIES.length; a < b; a++) c = this.RESOLUTION_PROPERTIES[a], d[c] = null != this.options[c] ? this.options[c] : this.map[c];
+            null ==
+                d.resolutions && (d.resolutions = this.resolutionsFromScales(d.scales));
+            null == d.resolutions && (d.resolutions = this.calculateResolutions(d))
+        }
+        var f;
+        this.options.maxResolution && "auto" !== this.options.maxResolution && (f = this.options.maxResolution);
+        this.options.minScale && (f = OpenLayers.Util.getResolutionFromScale(this.options.minScale, this.units));
+        var g;
+        this.options.minResolution && "auto" !== this.options.minResolution && (g = this.options.minResolution);
+        this.options.maxScale && (g = OpenLayers.Util.getResolutionFromScale(this.options.maxScale,
+            this.units));
+        d.resolutions && (d.resolutions.sort(function(a, b) {
+            return b - a
+        }), f || (f = d.resolutions[0]), g || (g = d.resolutions[d.resolutions.length - 1]));
+        if (this.resolutions = d.resolutions) {
+            b = this.resolutions.length;
+            this.scales = Array(b);
+            for (a = 0; a < b; a++) this.scales[a] = OpenLayers.Util.getScaleFromResolution(this.resolutions[a], this.units);
+            this.numZoomLevels = b
+        }
+        if (this.minResolution = g) this.maxScale = OpenLayers.Util.getScaleFromResolution(g, this.units);
+        if (this.maxResolution = f) this.minScale = OpenLayers.Util.getScaleFromResolution(f,
+            this.units)
+    },
+    resolutionsFromScales: function(a) {
+        if (null != a) {
+            var b, c, d;
+            d = a.length;
+            b = Array(d);
+            for (c = 0; c < d; c++) b[c] = OpenLayers.Util.getResolutionFromScale(a[c], this.units);
+            return b
+        }
+    },
+    calculateResolutions: function(a) {
+        var b, c, d = a.maxResolution;
+        null != a.minScale ? d = OpenLayers.Util.getResolutionFromScale(a.minScale, this.units) : "auto" == d && null != this.maxExtent && (b = this.map.getSize(), c = this.maxExtent.getWidth() / b.w, b = this.maxExtent.getHeight() / b.h, d = Math.max(c, b));
+        c = a.minResolution;
+        null != a.maxScale ? c = OpenLayers.Util.getResolutionFromScale(a.maxScale,
+            this.units) : "auto" == a.minResolution && null != this.minExtent && (b = this.map.getSize(), c = this.minExtent.getWidth() / b.w, b = this.minExtent.getHeight() / b.h, c = Math.max(c, b));
+        "number" !== typeof d && ("number" !== typeof c && null != this.maxExtent) && (d = this.map.getTileSize(), d = Math.max(this.maxExtent.getWidth() / d.w, this.maxExtent.getHeight() / d.h));
+        b = a.maxZoomLevel;
+        a = a.numZoomLevels;
+        "number" === typeof c && "number" === typeof d && void 0 === a ? a = Math.floor(Math.log(d / c) / Math.log(2)) + 1 : void 0 === a && null != b && (a = b + 1);
+        if (!("number" !==
+                typeof a || 0 >= a || "number" !== typeof d && "number" !== typeof c)) {
+            b = Array(a);
+            var e = 2;
+            "number" == typeof c && "number" == typeof d && (e = Math.pow(d / c, 1 / (a - 1)));
+            var f;
+            if ("number" === typeof d)
+                for (f = 0; f < a; f++) b[f] = d / Math.pow(e, f);
+            else
+                for (f = 0; f < a; f++) b[a - 1 - f] = c * Math.pow(e, f);
+            return b
+        }
+    },
+    getResolution: function() {
+        return this.getResolutionForZoom(this.map.getZoom())
+    },
+    getExtent: function() {
+        return this.map.calculateBounds()
+    },
+    getZoomForExtent: function(a, b) {
+        var c = this.map.getSize();
+        return this.getZoomForResolution(Math.max(a.getWidth() /
+            c.w, a.getHeight() / c.h), b)
+    },
+    getDataExtent: function() {},
+    getResolutionForZoom: function(a) {
+        a = Math.max(0, Math.min(a, this.resolutions.length - 1));
+        if (this.map.fractionalZoom) var b = Math.floor(a),
+            c = Math.ceil(a),
+            a = this.resolutions[b] - (a - b) * (this.resolutions[b] - this.resolutions[c]);
+        else a = this.resolutions[Math.round(a)];
+        return a
+    },
+    getZoomForResolution: function(a, b) {
+        var c, d;
+        if (this.map.fractionalZoom) {
+            var e = 0,
+                f = this.resolutions[e],
+                g = this.resolutions[this.resolutions.length - 1],
+                h;
+            c = 0;
+            for (d = this.resolutions.length; c <
+                d; ++c)
+                if (h = this.resolutions[c], h >= a && (f = h, e = c), h <= a) {
+                    g = h;
+                    break
+                }
+            c = f - g;
+            c = 0 < c ? e + (f - a) / c : e
+        } else {
+            f = Number.POSITIVE_INFINITY;
+            c = 0;
+            for (d = this.resolutions.length; c < d; c++)
+                if (b) {
+                    e = Math.abs(this.resolutions[c] - a);
+                    if (e > f) break;
+                    f = e
+                } else if (this.resolutions[c] < a) break;
+            c = Math.max(0, c - 1)
+        }
+        return c
+    },
+    getLonLatFromViewPortPx: function(a) {
+        var b = null,
+            c = this.map;
+        if (null != a && c.minPx) {
+            var b = c.getResolution(),
+                d = c.getMaxExtent({
+                    restricted: !0
+                }),
+                b = new OpenLayers.LonLat( (a.x - c.minPx.x) * b + d.left, (c.minPx.y - a.y) * b + d.top);
+                
+                //MOD PER COORDINATE ASTRO - MOD ASTRO
+                step_x=-0.000888889;
+                step_y=0.000888889;
+         //     b = new OpenLayers.LonLat( ((a.x - c.minPx.x) * b + d.left)*step_x, ((c.minPx.y - a.y) * b + d.top)*step_y);
+/*
+                 Coordinata1 = X*step + offset_X ;
+                 Coordinata 2= Y*step + offset_Y
+                 */
+            this.wrapDateLine &&
+                (b = b.wrapDateLine(this.maxExtent))
+        }
+
+        return b
+    },
+    getViewPortPxFromLonLat: function(a, b) {
+        var c = null;
+        null != a && (b = b || this.map.getResolution(), c = this.map.calculateBounds(null, b), c = new OpenLayers.Pixel(1 / b * (a.lon - c.left), 1 / b * (c.top - a.lat)));
+        return c
+    },
+    setOpacity: function(a) {
+        if (a != this.opacity) {
+            this.opacity = a;
+            for (var b = this.div.childNodes, c = 0, d = b.length; c < d; ++c) {
+                var e = b[c].firstChild || b[c],
+                    f = b[c].lastChild;
+                f && "iframe" === f.nodeName.toLowerCase() && (e = f.parentNode);
+                OpenLayers.Util.modifyDOMElement(e, null, null, null,
+                    null, null, null, a)
+            }
+            null != this.map && this.map.events.triggerEvent("changelayer", {
+                layer: this,
+                property: "opacity"
+            })
+        }
+    },
+    getZIndex: function() {
+        return this.div.style.zIndex
+    },
+    setZIndex: function(a) {
+        this.div.style.zIndex = a
+    },
+    adjustBounds: function(a) {
+        if (this.gutter) var b = this.gutter * this.map.getResolution(),
+            a = new OpenLayers.Bounds(a.left - b, a.bottom - b, a.right + b, a.top + b);
+        this.wrapDateLine && (b = {
+            rightTolerance: this.getResolution(),
+            leftTolerance: this.getResolution()
+        }, a = a.wrapDateLine(this.maxExtent, b));
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Layer"
+});
+OpenLayers.Layer.SphericalMercator = {
+    getExtent: function() {
+        var a = null;
+        return a = this.sphericalMercator ? this.map.calculateBounds() : OpenLayers.Layer.FixedZoomLevels.prototype.getExtent.apply(this)
+    },
+    getLonLatFromViewPortPx: function(a) {
+        return OpenLayers.Layer.prototype.getLonLatFromViewPortPx.apply(this, arguments)
+    },
+    getViewPortPxFromLonLat: function(a) {
+        return OpenLayers.Layer.prototype.getViewPortPxFromLonLat.apply(this, arguments)
+    },
+    initMercatorParameters: function() {
+        this.RESOLUTIONS = [];
+        for (var a = 0; a <= this.MAX_ZOOM_LEVEL; ++a) this.RESOLUTIONS[a] =
+            156543.03390625 / Math.pow(2, a);
+        this.units = "m";
+        this.projection = this.projection || "EPSG:900913"
+    },
+    forwardMercator: function() {
+        var a = new OpenLayers.Projection("EPSG:4326"),
+            b = new OpenLayers.Projection("EPSG:900913");
+        return function(c, d) {
+            var e = OpenLayers.Projection.transform({
+                x: c,
+                y: d
+            }, a, b);
+            return new OpenLayers.LonLat(e.x, e.y)
+        }
+    }(),
+    inverseMercator: function() {
+        var a = new OpenLayers.Projection("EPSG:4326"),
+            b = new OpenLayers.Projection("EPSG:900913");
+        return function(c, d) {
+            var e = OpenLayers.Projection.transform({
+                x: c,
+                y: d
+            }, b, a);
+            return new OpenLayers.LonLat(e.x, e.y)
+        }
+    }()
+};
+OpenLayers.Layer.EventPane = OpenLayers.Class(OpenLayers.Layer, {
+    smoothDragPan: !0,
+    isBaseLayer: !0,
+    isFixed: !0,
+    pane: null,
+    mapObject: null,
+    initialize: function(a, b) {
+        OpenLayers.Layer.prototype.initialize.apply(this, arguments);
+        null == this.pane && (this.pane = OpenLayers.Util.createDiv(this.div.id + "_EventPane"))
+    },
+    destroy: function() {
+        this.pane = this.mapObject = null;
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments)
+    },
+    setMap: function(a) {
+        OpenLayers.Layer.prototype.setMap.apply(this, arguments);
+        this.pane.style.zIndex =
+            parseInt(this.div.style.zIndex) + 1;
+        this.pane.style.display = this.div.style.display;
+        this.pane.style.width = "100%";
+        this.pane.style.height = "100%";
+        "msie" == OpenLayers.BROWSER_NAME && (this.pane.style.background = "url(" + OpenLayers.Util.getImageLocation("blank.gif") + ")");
+        this.isFixed ? this.map.viewPortDiv.appendChild(this.pane) : this.map.layerContainerDiv.appendChild(this.pane);
+        this.loadMapObject();
+        null == this.mapObject && this.loadWarningMessage()
+    },
+    removeMap: function(a) {
+        this.pane && this.pane.parentNode && this.pane.parentNode.removeChild(this.pane);
+        OpenLayers.Layer.prototype.removeMap.apply(this, arguments)
+    },
+    loadWarningMessage: function() {
+        this.div.style.backgroundColor = "darkblue";
+        var a = this.map.getSize(),
+            b = Math.min(a.w, 300),
+            c = Math.min(a.h, 200),
+            b = new OpenLayers.Size(b, c),
+            a = (new OpenLayers.Pixel(a.w / 2, a.h / 2)).add(-b.w / 2, -b.h / 2),
+            a = OpenLayers.Util.createDiv(this.name + "_warning", a, b, null, null, null, "auto");
+        a.style.padding = "7px";
+        a.style.backgroundColor = "yellow";
+        a.innerHTML = this.getWarningHTML();
+        this.div.appendChild(a)
+    },
+    getWarningHTML: function() {
+        return ""
+    },
+    display: function(a) {
+        OpenLayers.Layer.prototype.display.apply(this, arguments);
+        this.pane.style.display = this.div.style.display
+    },
+    setZIndex: function(a) {
+        OpenLayers.Layer.prototype.setZIndex.apply(this, arguments);
+        this.pane.style.zIndex = parseInt(this.div.style.zIndex) + 1
+    },
+    moveByPx: function(a, b) {
+        OpenLayers.Layer.prototype.moveByPx.apply(this, arguments);
+        this.dragPanMapObject ? this.dragPanMapObject(a, -b) : this.moveTo(this.map.getCachedCenter())
+    },
+    moveTo: function(a, b, c) {
+        OpenLayers.Layer.prototype.moveTo.apply(this,
+            arguments);
+        if (null != this.mapObject) {
+            var d = this.map.getCenter(),
+                e = this.map.getZoom();
+            if (null != d) {
+                var f = this.getOLLonLatFromMapObjectLonLat(this.getMapObjectCenter()),
+                    g = this.getOLZoomFromMapObjectZoom(this.getMapObjectZoom());
+                if (!d.equals(f) || e != g) !b && f && this.dragPanMapObject && this.smoothDragPan ? (e = this.map.getViewPortPxFromLonLat(f), d = this.map.getViewPortPxFromLonLat(d), this.dragPanMapObject(d.x - e.x, e.y - d.y)) : (d = this.getMapObjectLonLatFromOLLonLat(d), e = this.getMapObjectZoomFromOLZoom(e), this.setMapObjectCenter(d,
+                    e, c))
+            }
+        }
+    },
+    getLonLatFromViewPortPx: function(a) {
+        var b = null;
+        null != this.mapObject && null != this.getMapObjectCenter() && (b = this.getOLLonLatFromMapObjectLonLat(this.getMapObjectLonLatFromMapObjectPixel(this.getMapObjectPixelFromOLPixel(a))));
+        return b
+    },
+    getViewPortPxFromLonLat: function(a) {
+        var b = null;
+        null != this.mapObject && null != this.getMapObjectCenter() && (b = this.getOLPixelFromMapObjectPixel(this.getMapObjectPixelFromMapObjectLonLat(this.getMapObjectLonLatFromOLLonLat(a))));
+        return b
+    },
+    getOLLonLatFromMapObjectLonLat: function(a) {
+        var b =
+            null;
+        null != a && (b = this.getLongitudeFromMapObjectLonLat(a), a = this.getLatitudeFromMapObjectLonLat(a), b = new OpenLayers.LonLat(b, a));
+        return b
+    },
+    getMapObjectLonLatFromOLLonLat: function(a) {
+        var b = null;
+        null != a && (b = this.getMapObjectLonLatFromLonLat(a.lon, a.lat));
+        return b
+    },
+    getOLPixelFromMapObjectPixel: function(a) {
+        var b = null;
+        null != a && (b = this.getXFromMapObjectPixel(a), a = this.getYFromMapObjectPixel(a), b = new OpenLayers.Pixel(b, a));
+        return b
+    },
+    getMapObjectPixelFromOLPixel: function(a) {
+        var b = null;
+        null != a && (b = this.getMapObjectPixelFromXY(a.x,
+            a.y));
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Layer.EventPane"
+});
+OpenLayers.Layer.FixedZoomLevels = OpenLayers.Class({
+    initialize: function() {},
+    initResolutions: function() {
+        for (var a = ["minZoomLevel", "maxZoomLevel", "numZoomLevels"], b = 0, c = a.length; b < c; b++) {
+            var d = a[b];
+            this[d] = null != this.options[d] ? this.options[d] : this.map[d]
+        }
+        if (null == this.minZoomLevel || this.minZoomLevel < this.MIN_ZOOM_LEVEL) this.minZoomLevel = this.MIN_ZOOM_LEVEL;
+        a = this.MAX_ZOOM_LEVEL - this.minZoomLevel + 1;
+        b = null == this.options.numZoomLevels && null != this.options.maxZoomLevel || null == this.numZoomLevels && null != this.maxZoomLevel ?
+            this.maxZoomLevel - this.minZoomLevel + 1 : this.numZoomLevels;
+        this.numZoomLevels = null != b ? Math.min(b, a) : a;
+        this.maxZoomLevel = this.minZoomLevel + this.numZoomLevels - 1;
+        if (null != this.RESOLUTIONS) {
+            a = 0;
+            this.resolutions = [];
+            for (b = this.minZoomLevel; b <= this.maxZoomLevel; b++) this.resolutions[a++] = this.RESOLUTIONS[b];
+            this.maxResolution = this.resolutions[0];
+            this.minResolution = this.resolutions[this.resolutions.length - 1]
+        }
+    },
+    getResolution: function() {
+        if (null != this.resolutions) return OpenLayers.Layer.prototype.getResolution.apply(this,
+            arguments);
+        var a = null,
+            b = this.map.getSize(),
+            c = this.getExtent();
+        null != b && null != c && (a = Math.max(c.getWidth() / b.w, c.getHeight() / b.h));
+        return a
+    },
+    getExtent: function() {
+        var a = this.map.getSize(),
+            b = this.getLonLatFromViewPortPx({
+                x: 0,
+                y: 0
+            }),
+            a = this.getLonLatFromViewPortPx({
+                x: a.w,
+                y: a.h
+            });
+        return null != b && null != a ? new OpenLayers.Bounds(b.lon, a.lat, a.lon, b.lat) : null
+    },
+    getZoomForResolution: function(a) {
+        return null != this.resolutions ? OpenLayers.Layer.prototype.getZoomForResolution.apply(this, arguments) : this.getZoomForExtent(OpenLayers.Layer.prototype.getExtent.apply(this, []))
+    },
+    getOLZoomFromMapObjectZoom: function(a) {
+        var b = null;
+        null != a && (b = a - this.minZoomLevel, this.map.baseLayer !== this && (b = this.map.baseLayer.getZoomForResolution(this.getResolutionForZoom(b))));
+        return b
+    },
+    getMapObjectZoomFromOLZoom: function(a) {
+        var b = null;
+        null != a && (b = a + this.minZoomLevel, this.map.baseLayer !== this && (b = this.getZoomForResolution(this.map.baseLayer.getResolutionForZoom(b))));
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Layer.FixedZoomLevels"
+});
+OpenLayers.Layer.Google = OpenLayers.Class(OpenLayers.Layer.EventPane, OpenLayers.Layer.FixedZoomLevels, {
+    MIN_ZOOM_LEVEL: 0,
+    MAX_ZOOM_LEVEL: 21,
+    RESOLUTIONS: [1.40625, 0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 6.866455078125E-4, 3.4332275390625E-4, 1.71661376953125E-4, 8.58306884765625E-5, 4.291534423828125E-5, 2.145767211914062E-5, 1.072883605957031E-5, 5.36441802978515E-6, 2.68220901489257E-6, 1.341104507446289E-6, 6.705522537231445E-7],
+    type: null,
+    wrapDateLine: !0,
+    sphericalMercator: !1,
+    version: null,
+    initialize: function(a, b) {
+        b = b || {};
+        b.version || (b.version = "function" === typeof GMap2 ? "2" : "3");
+        var c = OpenLayers.Layer.Google["v" + b.version.replace(/\./g, "_")];
+        if (c) OpenLayers.Util.applyDefaults(b, c);
+        else throw "Unsupported Google Maps API version: " + b.version;
+        OpenLayers.Util.applyDefaults(b, c.DEFAULTS);
+        b.maxExtent && (b.maxExtent = b.maxExtent.clone());
+        OpenLayers.Layer.EventPane.prototype.initialize.apply(this, [a, b]);
+        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this, [a, b]);
+        this.sphericalMercator && (OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator), this.initMercatorParameters())
+    },
+    clone: function() {
+        return new OpenLayers.Layer.Google(this.name, this.getOptions())
+    },
+    setVisibility: function(a) {
+        var b = null == this.opacity ? 1 : this.opacity;
+        OpenLayers.Layer.EventPane.prototype.setVisibility.apply(this, arguments);
+        this.setOpacity(b)
+    },
+    display: function(a) {
+        this._dragging || this.setGMapVisibility(a);
+        OpenLayers.Layer.EventPane.prototype.display.apply(this, arguments)
+    },
+    moveTo: function(a,
+        b, c) {
+        this._dragging = c;
+        OpenLayers.Layer.EventPane.prototype.moveTo.apply(this, arguments);
+        delete this._dragging
+    },
+    setOpacity: function(a) {
+        a !== this.opacity && (null != this.map && this.map.events.triggerEvent("changelayer", {
+            layer: this,
+            property: "opacity"
+        }), this.opacity = a);
+        if (this.getVisibility()) {
+            var b = this.getMapContainer();
+            OpenLayers.Util.modifyDOMElement(b, null, null, null, null, null, null, a)
+        }
+    },
+    destroy: function() {
+        if (this.map) {
+            this.setGMapVisibility(!1);
+            var a = OpenLayers.Layer.Google.cache[this.map.id];
+            a && 1 >= a.count &&
+                this.removeGMapElements()
+        }
+        OpenLayers.Layer.EventPane.prototype.destroy.apply(this, arguments)
+    },
+    removeGMapElements: function() {
+        var a = OpenLayers.Layer.Google.cache[this.map.id];
+        if (a) {
+            var b = this.mapObject && this.getMapContainer();
+            b && b.parentNode && b.parentNode.removeChild(b);
+            (b = a.termsOfUse) && b.parentNode && b.parentNode.removeChild(b);
+            (a = a.poweredBy) && a.parentNode && a.parentNode.removeChild(a)
+        }
+    },
+    removeMap: function(a) {
+        this.visibility && this.mapObject && this.setGMapVisibility(!1);
+        var b = OpenLayers.Layer.Google.cache[a.id];
+        b && (1 >= b.count ? (this.removeGMapElements(), delete OpenLayers.Layer.Google.cache[a.id]) : --b.count);
+        delete this.termsOfUse;
+        delete this.poweredBy;
+        delete this.mapObject;
+        delete this.dragObject;
+        OpenLayers.Layer.EventPane.prototype.removeMap.apply(this, arguments)
+    },
+    getOLBoundsFromMapObjectBounds: function(a) {
+        var b = null;
+        null != a && (b = a.getSouthWest(), a = a.getNorthEast(), this.sphericalMercator ? (b = this.forwardMercator(b.lng(), b.lat()), a = this.forwardMercator(a.lng(), a.lat())) : (b = new OpenLayers.LonLat(b.lng(), b.lat()),
+            a = new OpenLayers.LonLat(a.lng(), a.lat())), b = new OpenLayers.Bounds(b.lon, b.lat, a.lon, a.lat));
+        return b
+    },
+    getWarningHTML: function() {
+        return OpenLayers.i18n("googleWarning")
+    },
+    getMapObjectCenter: function() {
+        return this.mapObject.getCenter()
+    },
+    getMapObjectZoom: function() {
+        return this.mapObject.getZoom()
+    },
+    getLongitudeFromMapObjectLonLat: function(a) {
+        return this.sphericalMercator ? this.forwardMercator(a.lng(), a.lat()).lon : a.lng()
+    },
+    getLatitudeFromMapObjectLonLat: function(a) {
+        return this.sphericalMercator ? this.forwardMercator(a.lng(),
+            a.lat()).lat : a.lat()
+    },
+    getXFromMapObjectPixel: function(a) {
+        return a.x
+    },
+    getYFromMapObjectPixel: function(a) {
+        return a.y
+    },
+    CLASS_NAME: "OpenLayers.Layer.Google"
+});
+OpenLayers.Layer.Google.cache = {};
+OpenLayers.Layer.Google.v2 = {
+    termsOfUse: null,
+    poweredBy: null,
+    dragObject: null,
+    loadMapObject: function() {
+        this.type || (this.type = G_NORMAL_MAP);
+        var a, b, c, d = OpenLayers.Layer.Google.cache[this.map.id];
+        if (d) a = d.mapObject, b = d.termsOfUse, c = d.poweredBy, ++d.count;
+        else {
+            var d = this.map.viewPortDiv,
+                e = document.createElement("div");
+            e.id = this.map.id + "_GMap2Container";
+            e.style.position = "absolute";
+            e.style.width = "100%";
+            e.style.height = "100%";
+            d.appendChild(e);
+            try {
+                a = new GMap2(e), b = e.lastChild, d.appendChild(b), b.style.zIndex =
+                    "1100", b.style.right = "", b.style.bottom = "", b.className = "olLayerGoogleCopyright", c = e.lastChild, d.appendChild(c), c.style.zIndex = "1100", c.style.right = "", c.style.bottom = "", c.className = "olLayerGooglePoweredBy gmnoprint"
+            } catch (f) {
+                throw f;
+            }
+            OpenLayers.Layer.Google.cache[this.map.id] = {
+                mapObject: a,
+                termsOfUse: b,
+                poweredBy: c,
+                count: 1
+            }
+        }
+        this.mapObject = a;
+        this.termsOfUse = b;
+        this.poweredBy = c; - 1 === OpenLayers.Util.indexOf(this.mapObject.getMapTypes(), this.type) && this.mapObject.addMapType(this.type);
+        "function" == typeof a.getDragObject ?
+            this.dragObject = a.getDragObject() : this.dragPanMapObject = null;
+        !1 === this.isBaseLayer && this.setGMapVisibility("none" !== this.div.style.display)
+    },
+    onMapResize: function() {
+        if (this.visibility && this.mapObject.isLoaded()) this.mapObject.checkResize();
+        else {
+            if (!this._resized) var a = this,
+                b = GEvent.addListener(this.mapObject, "load", function() {
+                    GEvent.removeListener(b);
+                    delete a._resized;
+                    a.mapObject.checkResize();
+                    a.moveTo(a.map.getCenter(), a.map.getZoom())
+                });
+            this._resized = !0
+        }
+    },
+    setGMapVisibility: function(a) {
+        var b = OpenLayers.Layer.Google.cache[this.map.id];
+        if (b) {
+            var c = this.mapObject.getContainer();
+            !0 === a ? (this.mapObject.setMapType(this.type), c.style.display = "", this.termsOfUse.style.left = "", this.termsOfUse.style.display = "", this.poweredBy.style.display = "", b.displayed = this.id) : (b.displayed === this.id && delete b.displayed, b.displayed || (c.style.display = "none", this.termsOfUse.style.display = "none", this.termsOfUse.style.left = "-9999px", this.poweredBy.style.display = "none"))
+        }
+    },
+    getMapContainer: function() {
+        return this.mapObject.getContainer()
+    },
+    getMapObjectBoundsFromOLBounds: function(a) {
+        var b =
+            null;
+        null != a && (b = this.sphericalMercator ? this.inverseMercator(a.bottom, a.left) : new OpenLayers.LonLat(a.bottom, a.left), a = this.sphericalMercator ? this.inverseMercator(a.top, a.right) : new OpenLayers.LonLat(a.top, a.right), b = new GLatLngBounds(new GLatLng(b.lat, b.lon), new GLatLng(a.lat, a.lon)));
+        return b
+    },
+    setMapObjectCenter: function(a, b) {
+        this.mapObject.setCenter(a, b)
+    },
+    dragPanMapObject: function(a, b) {
+        this.dragObject.moveBy(new GSize(-a, b))
+    },
+    getMapObjectLonLatFromMapObjectPixel: function(a) {
+        return this.mapObject.fromContainerPixelToLatLng(a)
+    },
+    getMapObjectPixelFromMapObjectLonLat: function(a) {
+        return this.mapObject.fromLatLngToContainerPixel(a)
+    },
+    getMapObjectZoomFromMapObjectBounds: function(a) {
+        return this.mapObject.getBoundsZoomLevel(a)
+    },
+    getMapObjectLonLatFromLonLat: function(a, b) {
+        var c;
+        this.sphericalMercator ? (c = this.inverseMercator(a, b), c = new GLatLng(c.lat, c.lon)) : c = new GLatLng(b, a);
+        return c
+    },
+    getMapObjectPixelFromXY: function(a, b) {
+        return new GPoint(a, b)
+    }
+};
+OpenLayers.Format.XML = OpenLayers.Class(OpenLayers.Format, {
+    namespaces: null,
+    namespaceAlias: null,
+    defaultPrefix: null,
+    readers: {},
+    writers: {},
+    xmldom: null,
+    initialize: function(a) {
+        window.ActiveXObject && (this.xmldom = new ActiveXObject("Microsoft.XMLDOM"));
+        OpenLayers.Format.prototype.initialize.apply(this, [a]);
+        this.namespaces = OpenLayers.Util.extend({}, this.namespaces);
+        this.namespaceAlias = {};
+        for (var b in this.namespaces) this.namespaceAlias[this.namespaces[b]] = b
+    },
+    destroy: function() {
+        this.xmldom = null;
+        OpenLayers.Format.prototype.destroy.apply(this,
+            arguments)
+    },
+    setNamespace: function(a, b) {
+        this.namespaces[a] = b;
+        this.namespaceAlias[b] = a
+    },
+    read: function(a) {
+        var b = a.indexOf("<");
+        0 < b && (a = a.substring(b));
+        b = OpenLayers.Util.Try(OpenLayers.Function.bind(function() {
+            var b;
+            b = window.ActiveXObject && !this.xmldom ? new ActiveXObject("Microsoft.XMLDOM") : this.xmldom;
+            b.loadXML(a);
+            return b
+        }, this), function() {
+            return (new DOMParser).parseFromString(a, "text/xml")
+        }, function() {
+            var b = new XMLHttpRequest;
+            b.open("GET", "data:text/xml;charset=utf-8," + encodeURIComponent(a), !1);
+            b.overrideMimeType &&
+                b.overrideMimeType("text/xml");
+            b.send(null);
+            return b.responseXML
+        });
+        this.keepData && (this.data = b);
+        return b
+    },
+    write: function(a) {
+        if (this.xmldom) a = a.xml;
+        else {
+            var b = new XMLSerializer;
+            if (1 == a.nodeType) {
+                var c = document.implementation.createDocument("", "", null);
+                c.importNode && (a = c.importNode(a, !0));
+                c.appendChild(a);
+                a = b.serializeToString(c)
+            } else a = b.serializeToString(a)
+        }
+        return a
+    },
+    createElementNS: function(a, b) {
+        return this.xmldom ? "string" == typeof a ? this.xmldom.createNode(1, b, a) : this.xmldom.createNode(1, b, "") : document.createElementNS(a,
+            b)
+    },
+    createTextNode: function(a) {
+        "string" !== typeof a && (a = "" + a);
+        return this.xmldom ? this.xmldom.createTextNode(a) : document.createTextNode(a)
+    },
+    getElementsByTagNameNS: function(a, b, c) {
+        var d = [];
+        if (a.getElementsByTagNameNS) d = a.getElementsByTagNameNS(b, c);
+        else
+            for (var a = a.getElementsByTagName("*"), e, f, g = 0, h = a.length; g < h; ++g)
+                if (e = a[g], f = e.prefix ? e.prefix + ":" + c : c, "*" == c || f == e.nodeName)("*" == b || b == e.namespaceURI) && d.push(e); return d
+    },
+    getAttributeNodeNS: function(a, b, c) {
+        var d = null;
+        if (a.getAttributeNodeNS) d = a.getAttributeNodeNS(b,
+            c);
+        else
+            for (var a = a.attributes, e, f, g = 0, h = a.length; g < h; ++g)
+                if (e = a[g], e.namespaceURI == b && (f = e.prefix ? e.prefix + ":" + c : c, f == e.nodeName)) {
+                    d = e;
+                    break
+                } return d
+    },
+    getAttributeNS: function(a, b, c) {
+        var d = "";
+        if (a.getAttributeNS) d = a.getAttributeNS(b, c) || "";
+        else if (a = this.getAttributeNodeNS(a, b, c)) d = a.nodeValue;
+        return d
+    },
+    getChildValue: function(a, b) {
+        var c = b || "";
+        if (a)
+            for (var d = a.firstChild; d; d = d.nextSibling) switch (d.nodeType) {
+                case 3:
+                case 4:
+                    c += d.nodeValue
+            }
+        return c
+    },
+    isSimpleContent: function(a) {
+        for (var b = !0, a = a.firstChild; a; a =
+            a.nextSibling)
+            if (1 === a.nodeType) {
+                b = !1;
+                break
+            }
+        return b
+    },
+    contentType: function(a) {
+        for (var b = !1, c = !1, d = OpenLayers.Format.XML.CONTENT_TYPE.EMPTY, a = a.firstChild; a; a = a.nextSibling) {
+            switch (a.nodeType) {
+                case 1:
+                    c = !0;
+                    break;
+                case 8:
+                    break;
+                default:
+                    b = !0
+            }
+            if (c && b) break
+        }
+        if (c && b) d = OpenLayers.Format.XML.CONTENT_TYPE.MIXED;
+        else {
+            if (c) return OpenLayers.Format.XML.CONTENT_TYPE.COMPLEX;
+            if (b) return OpenLayers.Format.XML.CONTENT_TYPE.SIMPLE
+        }
+        return d
+    },
+    hasAttributeNS: function(a, b, c) {
+        var d = !1;
+        return d = a.hasAttributeNS ? a.hasAttributeNS(b,
+            c) : !!this.getAttributeNodeNS(a, b, c)
+    },
+    setAttributeNS: function(a, b, c, d) {
+        if (a.setAttributeNS) a.setAttributeNS(b, c, d);
+        else if (this.xmldom) b ? (b = a.ownerDocument.createNode(2, c, b), b.nodeValue = d, a.setAttributeNode(b)) : a.setAttribute(c, d);
+        else throw "setAttributeNS not implemented";
+    },
+    createElementNSPlus: function(a, b) {
+        var b = b || {},
+            c = b.uri || this.namespaces[b.prefix];
+        c || (c = a.indexOf(":"), c = this.namespaces[a.substring(0, c)]);
+        c || (c = this.namespaces[this.defaultPrefix]);
+        c = this.createElementNS(c, a);
+        b.attributes && this.setAttributes(c,
+            b.attributes);
+        var d = b.value;
+        null != d && c.appendChild(this.createTextNode(d));
+        return c
+    },
+    setAttributes: function(a, b) {
+        var c, d, e;
+        for (e in b) null != b[e] && b[e].toString && (c = b[e].toString(), d = this.namespaces[e.substring(0, e.indexOf(":"))] || null, this.setAttributeNS(a, d, e, c))
+    },
+    readNode: function(a, b) {
+        b || (b = {});
+        var c = this.readers[a.namespaceURI ? this.namespaceAlias[a.namespaceURI] : this.defaultPrefix];
+        if (c) {
+            var d = a.localName || a.nodeName.split(":").pop();
+            (c = c[d] || c["*"]) && c.apply(this, [a, b])
+        }
+        return b
+    },
+    readChildNodes: function(a,
+        b) {
+        b || (b = {});
+        for (var c = a.childNodes, d, e = 0, f = c.length; e < f; ++e) d = c[e], 1 == d.nodeType && this.readNode(d, b);
+        return b
+    },
+    writeNode: function(a, b, c) {
+        var d, e = a.indexOf(":");
+        0 < e ? (d = a.substring(0, e), a = a.substring(e + 1)) : d = c ? this.namespaceAlias[c.namespaceURI] : this.defaultPrefix;
+        b = this.writers[d][a].apply(this, [b]);
+        c && c.appendChild(b);
+        return b
+    },
+    getChildEl: function(a, b, c) {
+        return a && this.getThisOrNextEl(a.firstChild, b, c)
+    },
+    getNextEl: function(a, b, c) {
+        return a && this.getThisOrNextEl(a.nextSibling, b, c)
+    },
+    getThisOrNextEl: function(a,
+        b, c) {
+        a: for (; a; a = a.nextSibling) switch (a.nodeType) {
+            case 1:
+                if ((!b || b === (a.localName || a.nodeName.split(":").pop())) && (!c || c === a.namespaceURI)) break a;
+                a = null;
+                break a;
+            case 3:
+                if (/^\s*$/.test(a.nodeValue)) break;
+            case 4:
+            case 6:
+            case 12:
+            case 10:
+            case 11:
+                a = null;
+                break a
+        }
+        return a || null
+    },
+    lookupNamespaceURI: function(a, b) {
+        var c = null;
+        if (a)
+            if (a.lookupNamespaceURI) c = a.lookupNamespaceURI(b);
+            else a: switch (a.nodeType) {
+                case 1:
+                    if (null !== a.namespaceURI && a.prefix === b) {
+                        c = a.namespaceURI;
+                        break a
+                    }
+                    if (c = a.attributes.length)
+                        for (var d,
+                                e = 0; e < c; ++e)
+                            if (d = a.attributes[e], "xmlns" === d.prefix && d.name === "xmlns:" + b) {
+                                c = d.value || null;
+                                break a
+                            } else if ("xmlns" === d.name && null === b) {
+                        c = d.value || null;
+                        break a
+                    }
+                    c = this.lookupNamespaceURI(a.parentNode, b);
+                    break a;
+                case 2:
+                    c = this.lookupNamespaceURI(a.ownerElement, b);
+                    break a;
+                case 9:
+                    c = this.lookupNamespaceURI(a.documentElement, b);
+                    break a;
+                case 6:
+                case 12:
+                case 10:
+                case 11:
+                    break a;
+                default:
+                    c = this.lookupNamespaceURI(a.parentNode, b)
+            }
+            return c
+    },
+    getXMLDoc: function() {
+        !OpenLayers.Format.XML.document && !this.xmldom && (document.implementation &&
+            document.implementation.createDocument ? OpenLayers.Format.XML.document = document.implementation.createDocument("", "", null) : !this.xmldom && window.ActiveXObject && (this.xmldom = new ActiveXObject("Microsoft.XMLDOM")));
+        return OpenLayers.Format.XML.document || this.xmldom
+    },
+    CLASS_NAME: "OpenLayers.Format.XML"
+});
+OpenLayers.Format.XML.CONTENT_TYPE = {
+    EMPTY: 0,
+    SIMPLE: 1,
+    COMPLEX: 2,
+    MIXED: 3
+};
+OpenLayers.Format.XML.lookupNamespaceURI = OpenLayers.Function.bind(OpenLayers.Format.XML.prototype.lookupNamespaceURI, OpenLayers.Format.XML.prototype);
+OpenLayers.Format.XML.document = null;
+OpenLayers.Format.WFST = function(a) {
+    var a = OpenLayers.Util.applyDefaults(a, OpenLayers.Format.WFST.DEFAULTS),
+        b = OpenLayers.Format.WFST["v" + a.version.replace(/\./g, "_")];
+    if (!b) throw "Unsupported WFST version: " + a.version;
+    return new b(a)
+};
+OpenLayers.Format.WFST.DEFAULTS = {
+    version: "1.0.0"
+};
+OpenLayers.Format.WFST.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance",
+        wfs: "http://www.opengis.net/wfs",
+        gml: "http://www.opengis.net/gml",
+        ogc: "http://www.opengis.net/ogc",
+        ows: "http://www.opengis.net/ows"
+    },
+    defaultPrefix: "wfs",
+    version: null,
+    schemaLocations: null,
+    srsName: null,
+    extractAttributes: !0,
+    xy: !0,
+    stateName: null,
+    initialize: function(a) {
+        this.stateName = {};
+        this.stateName[OpenLayers.State.INSERT] = "wfs:Insert";
+        this.stateName[OpenLayers.State.UPDATE] =
+            "wfs:Update";
+        this.stateName[OpenLayers.State.DELETE] = "wfs:Delete";
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+    },
+    getSrsName: function(a, b) {
+        var c = b && b.srsName;
+        c || (c = a && a.layer ? a.layer.projection.getCode() : this.srsName);
+        return c
+    },
+    read: function(a, b) {
+        b = b || {};
+        OpenLayers.Util.applyDefaults(b, {
+            output: "features"
+        });
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var c = {};
+        a && this.readNode(a, c, !0);
+        c.features && "features" === b.output &&
+            (c = c.features);
+        return c
+    },
+    readers: {
+        wfs: {
+            FeatureCollection: function(a, b) {
+                b.features = [];
+                this.readChildNodes(a, b)
+            }
+        }
+    },
+    write: function(a, b) {
+        var c = this.writeNode("wfs:Transaction", {
+                features: a,
+                options: b
+            }),
+            d = this.schemaLocationAttr();
+        d && this.setAttributeNS(c, this.namespaces.xsi, "xsi:schemaLocation", d);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [c])
+    },
+    writers: {
+        wfs: {
+            GetFeature: function(a) {
+                var b = this.createElementNSPlus("wfs:GetFeature", {
+                    attributes: {
+                        service: "WFS",
+                        version: this.version,
+                        handle: a && a.handle,
+                        outputFormat: a && a.outputFormat,
+                        maxFeatures: a && a.maxFeatures,
+                        "xsi:schemaLocation": this.schemaLocationAttr(a)
+                    }
+                });
+                if ("string" == typeof this.featureType) this.writeNode("Query", a, b);
+                else
+                    for (var c = 0, d = this.featureType.length; c < d; c++) a.featureType = this.featureType[c], this.writeNode("Query", a, b);
+                return b
+            },
+            Transaction: function(a) {
+                var a = a || {},
+                    b = a.options || {},
+                    c = this.createElementNSPlus("wfs:Transaction", {
+                        attributes: {
+                            service: "WFS",
+                            version: this.version,
+                            handle: b.handle
+                        }
+                    }),
+                    d, e = a.features;
+                if (e) {
+                    !0 === b.multi && OpenLayers.Util.extend(this.geometryTypes, {
+                        "OpenLayers.Geometry.Point": "MultiPoint",
+                        "OpenLayers.Geometry.LineString": !0 === this.multiCurve ? "MultiCurve" : "MultiLineString",
+                        "OpenLayers.Geometry.Polygon": !0 === this.multiSurface ? "MultiSurface" : "MultiPolygon"
+                    });
+                    var f, g, a = 0;
+                    for (d = e.length; a < d; ++a) g = e[a], (f = this.stateName[g.state]) && this.writeNode(f, {
+                        feature: g,
+                        options: b
+                    }, c);
+                    !0 === b.multi && this.setGeometryTypes()
+                }
+                if (b.nativeElements) {
+                    a = 0;
+                    for (d = b.nativeElements.length; a < d; ++a) this.writeNode("wfs:Native", b.nativeElements[a], c)
+                }
+                return c
+            },
+            Native: function(a) {
+                return this.createElementNSPlus("wfs:Native", {
+                    attributes: {
+                        vendorId: a.vendorId,
+                        safeToIgnore: a.safeToIgnore
+                    },
+                    value: a.value
+                })
+            },
+            Insert: function(a) {
+                var b = a.feature,
+                    a = a.options,
+                    a = this.createElementNSPlus("wfs:Insert", {
+                        attributes: {
+                            handle: a && a.handle
+                        }
+                    });
+                this.srsName = this.getSrsName(b);
+                this.writeNode("feature:_typeName", b, a);
+                return a
+            },
+            Update: function(a) {
+                var b = a.feature,
+                    a = a.options,
+                    a = this.createElementNSPlus("wfs:Update", {
+                        attributes: {
+                            handle: a && a.handle,
+                            typeName: (this.featureNS ? this.featurePrefix + ":" : "") + this.featureType
+                        }
+                    });
+                this.featureNS && a.setAttribute("xmlns:" +
+                    this.featurePrefix, this.featureNS);
+                var c = b.modified;
+                if (null !== this.geometryName && (!c || void 0 !== c.geometry)) this.srsName = this.getSrsName(b), this.writeNode("Property", {
+                    name: this.geometryName,
+                    value: b.geometry
+                }, a);
+                for (var d in b.attributes) void 0 !== b.attributes[d] && (!c || !c.attributes || c.attributes && void 0 !== c.attributes[d]) && this.writeNode("Property", {
+                    name: d,
+                    value: b.attributes[d]
+                }, a);
+                this.writeNode("ogc:Filter", new OpenLayers.Filter.FeatureId({
+                    fids: [b.fid]
+                }), a);
+                return a
+            },
+            Property: function(a) {
+                var b = this.createElementNSPlus("wfs:Property");
+                this.writeNode("Name", a.name, b);
+                null !== a.value && this.writeNode("Value", a.value, b);
+                return b
+            },
+            Name: function(a) {
+                return this.createElementNSPlus("wfs:Name", {
+                    value: a
+                })
+            },
+            Value: function(a) {
+                var b;
+                a instanceof OpenLayers.Geometry ? (b = this.createElementNSPlus("wfs:Value"), a = this.writeNode("feature:_geometry", a).firstChild, b.appendChild(a)) : b = this.createElementNSPlus("wfs:Value", {
+                    value: a
+                });
+                return b
+            },
+            Delete: function(a) {
+                var b = a.feature,
+                    a = a.options,
+                    a = this.createElementNSPlus("wfs:Delete", {
+                        attributes: {
+                            handle: a &&
+                                a.handle,
+                            typeName: (this.featureNS ? this.featurePrefix + ":" : "") + this.featureType
+                        }
+                    });
+                this.featureNS && a.setAttribute("xmlns:" + this.featurePrefix, this.featureNS);
+                this.writeNode("ogc:Filter", new OpenLayers.Filter.FeatureId({
+                    fids: [b.fid]
+                }), a);
+                return a
+            }
+        }
+    },
+    schemaLocationAttr: function(a) {
+        var a = OpenLayers.Util.extend({
+                featurePrefix: this.featurePrefix,
+                schema: this.schema
+            }, a),
+            b = OpenLayers.Util.extend({}, this.schemaLocations);
+        a.schema && (b[a.featurePrefix] = a.schema);
+        var a = [],
+            c, d;
+        for (d in b)(c = this.namespaces[d]) &&
+            a.push(c + " " + b[d]);
+        return a.join(" ") || void 0
+    },
+    setFilterProperty: function(a) {
+        if (a.filters)
+            for (var b = 0, c = a.filters.length; b < c; ++b) OpenLayers.Format.WFST.v1.prototype.setFilterProperty.call(this, a.filters[b]);
+        else a instanceof OpenLayers.Filter.Spatial && !a.property && (a.property = this.geometryName)
+    },
+    CLASS_NAME: "OpenLayers.Format.WFST.v1"
+});
+OpenLayers.Format.OGCExceptionReport = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        ogc: "http://www.opengis.net/ogc"
+    },
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    defaultPrefix: "ogc",
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        var b = {
+            exceptionReport: null
+        };
+        a.documentElement && (this.readChildNodes(a, b), null === b.exceptionReport && (b = (new OpenLayers.Format.OWSCommon).read(a)));
+        return b
+    },
+    readers: {
+        ogc: {
+            ServiceExceptionReport: function(a,
+                b) {
+                b.exceptionReport = {
+                    exceptions: []
+                };
+                this.readChildNodes(a, b.exceptionReport)
+            },
+            ServiceException: function(a, b) {
+                var c = {
+                    code: a.getAttribute("code"),
+                    locator: a.getAttribute("locator"),
+                    text: this.getChildValue(a)
+                };
+                b.exceptions.push(c)
+            }
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.OGCExceptionReport"
+});
+OpenLayers.Format.XML.VersionedOGC = OpenLayers.Class(OpenLayers.Format.XML, {
+    defaultVersion: null,
+    version: null,
+    profile: null,
+    errorProperty: null,
+    name: null,
+    stringifyOutput: !1,
+    parser: null,
+    initialize: function(a) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a]);
+        a = this.CLASS_NAME;
+        this.name = a.substring(a.lastIndexOf(".") + 1)
+    },
+    getVersion: function(a, b) {
+        var c;
+        a ? (c = this.version, c || (c = a.getAttribute("version"), c || (c = this.defaultVersion))) : c = b && b.version || this.version || this.defaultVersion;
+        return c
+    },
+    getParser: function(a) {
+        var a =
+            a || this.defaultVersion,
+            b = this.profile ? "_" + this.profile : "";
+        if (!this.parser || this.parser.VERSION != a) {
+            var c = OpenLayers.Format[this.name]["v" + a.replace(/\./g, "_") + b];
+            if (!c) throw "Can't find a " + this.name + " parser for version " + a + b;
+            this.parser = new c(this.options)
+        }
+        return this.parser
+    },
+    write: function(a, b) {
+        this.parser = this.getParser(this.getVersion(null, b));
+        var c = this.parser.write(a, b);
+        return !1 === this.stringifyOutput ? c : OpenLayers.Format.XML.prototype.write.apply(this, [c])
+    },
+    read: function(a, b) {
+        "string" == typeof a &&
+            (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        var c = this.getVersion(a.documentElement);
+        this.parser = this.getParser(c);
+        var d = this.parser.read(a, b);
+        if (null !== this.errorProperty && void 0 === d[this.errorProperty]) {
+            var e = new OpenLayers.Format.OGCExceptionReport;
+            d.error = e.read(a)
+        }
+        d.version = c;
+        return d
+    },
+    CLASS_NAME: "OpenLayers.Format.XML.VersionedOGC"
+});
+OpenLayers.Feature = OpenLayers.Class({
+    layer: null,
+    id: null,
+    lonlat: null,
+    data: null,
+    marker: null,
+    popupClass: null,
+    popup: null,
+    initialize: function(a, b, c) {
+        this.layer = a;
+        this.lonlat = b;
+        this.data = null != c ? c : {};
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_")
+    },
+    destroy: function() {
+        null != this.layer && null != this.layer.map && null != this.popup && this.layer.map.removePopup(this.popup);
+        null != this.layer && null != this.marker && this.layer.removeMarker(this.marker);
+        this.data = this.lonlat = this.id = this.layer = null;
+        null != this.marker &&
+            (this.destroyMarker(this.marker), this.marker = null);
+        null != this.popup && (this.destroyPopup(this.popup), this.popup = null)
+    },
+    onScreen: function() {
+        var a = !1;
+        null != this.layer && null != this.layer.map && (a = this.layer.map.getExtent().containsLonLat(this.lonlat));
+        return a
+    },
+    createMarker: function() {
+        null != this.lonlat && (this.marker = new OpenLayers.Marker(this.lonlat, this.data.icon));
+        return this.marker
+    },
+    destroyMarker: function() {
+        this.marker.destroy()
+    },
+    createPopup: function(a) {
+        null != this.lonlat && (this.popup || (this.popup = new(this.popupClass ?
+            this.popupClass : OpenLayers.Popup.Anchored)(this.id + "_popup", this.lonlat, this.data.popupSize, this.data.popupContentHTML, this.marker ? this.marker.icon : null, a)), null != this.data.overflow && (this.popup.contentDiv.style.overflow = this.data.overflow), this.popup.feature = this);
+        return this.popup
+    },
+    destroyPopup: function() {
+        this.popup && (this.popup.feature = null, this.popup.destroy(), this.popup = null)
+    },
+    CLASS_NAME: "OpenLayers.Feature"
+});
+OpenLayers.State = {
+    UNKNOWN: "Unknown",
+    INSERT: "Insert",
+    UPDATE: "Update",
+    DELETE: "Delete"
+};
+OpenLayers.Feature.Vector = OpenLayers.Class(OpenLayers.Feature, {
+    fid: null,
+    geometry: null,
+    attributes: null,
+    bounds: null,
+    state: null,
+    style: null,
+    url: null,
+    renderIntent: "default",
+    modified: null,
+    initialize: function(a, b, c) {
+        OpenLayers.Feature.prototype.initialize.apply(this, [null, null, b]);
+        this.lonlat = null;
+        this.geometry = a ? a : null;
+        this.state = null;
+        this.attributes = {};
+        b && (this.attributes = OpenLayers.Util.extend(this.attributes, b));
+        this.style = c ? c : null
+    },
+    destroy: function() {
+        this.layer && (this.layer.removeFeatures(this), this.layer =
+            null);
+        this.modified = this.geometry = null;
+        OpenLayers.Feature.prototype.destroy.apply(this, arguments)
+    },
+    clone: function() {
+        return new OpenLayers.Feature.Vector(this.geometry ? this.geometry.clone() : null, this.attributes, this.style)
+    },
+    onScreen: function(a) {
+        var b = !1;
+        this.layer && this.layer.map && (b = this.layer.map.getExtent(), a ? (a = this.geometry.getBounds(), b = b.intersectsBounds(a)) : b = b.toGeometry().intersects(this.geometry));
+        return b
+    },
+    getVisibility: function() {
+        return !(this.style && "none" == this.style.display || !this.layer ||
+            this.layer && this.layer.styleMap && "none" == this.layer.styleMap.createSymbolizer(this, this.renderIntent).display || this.layer && !this.layer.getVisibility())
+    },
+    createMarker: function() {
+        return null
+    },
+    destroyMarker: function() {},
+    createPopup: function() {
+        return null
+    },
+    atPoint: function(a, b, c) {
+        var d = !1;
+        this.geometry && (d = this.geometry.atPoint(a, b, c));
+        return d
+    },
+    destroyPopup: function() {},
+    move: function(a) {
+        if (this.layer && this.geometry.move) {
+            var a = "OpenLayers.LonLat" == a.CLASS_NAME ? this.layer.getViewPortPxFromLonLat(a) : a,
+                b = this.layer.getViewPortPxFromLonLat(this.geometry.getBounds().getCenterLonLat()),
+                c = this.layer.map.getResolution();
+            this.geometry.move(c * (a.x - b.x), c * (b.y - a.y));
+            this.layer.drawFeature(this);
+            return b
+        }
+    },
+    toState: function(a) {
+        if (a == OpenLayers.State.UPDATE) switch (this.state) {
+            case OpenLayers.State.UNKNOWN:
+            case OpenLayers.State.DELETE:
+                this.state = a
+        } else if (a == OpenLayers.State.INSERT) switch (this.state) {
+            case OpenLayers.State.UNKNOWN:
+                break;
+            default:
+                this.state = a
+        } else if (a == OpenLayers.State.DELETE) switch (this.state) {
+            case OpenLayers.State.UNKNOWN:
+            case OpenLayers.State.UPDATE:
+                this.state =
+                    a
+        } else a == OpenLayers.State.UNKNOWN && (this.state = a)
+    },
+    CLASS_NAME: "OpenLayers.Feature.Vector"
+});
+OpenLayers.Feature.Vector.style = {
+    "default": {
+        fillColor: "#ee9900",
+        fillOpacity: 0.4,
+        hoverFillColor: "white",
+        hoverFillOpacity: 0.8,
+        strokeColor: "#ee9900",
+        strokeOpacity: 1,
+        strokeWidth: 1,
+        strokeLinecap: "round",
+        strokeDashstyle: "solid",
+        hoverStrokeColor: "red",
+        hoverStrokeOpacity: 1,
+        hoverStrokeWidth: 0.2,
+        pointRadius: 6,
+        hoverPointRadius: 1,
+        hoverPointUnit: "%",
+        pointerEvents: "visiblePainted",
+        cursor: "inherit",
+        fontColor: "#000000",
+        labelAlign: "cm",
+        labelOutlineColor: "white",
+        labelOutlineWidth: 3
+    },
+    select: {
+        fillColor: "blue",
+        fillOpacity: 0.4,
+        hoverFillColor: "white",
+        hoverFillOpacity: 0.8,
+        strokeColor: "blue",
+        strokeOpacity: 1,
+        strokeWidth: 2,
+        strokeLinecap: "round",
+        strokeDashstyle: "solid",
+        hoverStrokeColor: "red",
+        hoverStrokeOpacity: 1,
+        hoverStrokeWidth: 0.2,
+        pointRadius: 6,
+        hoverPointRadius: 1,
+        hoverPointUnit: "%",
+        pointerEvents: "visiblePainted",
+        cursor: "pointer",
+        fontColor: "#000000",
+        labelAlign: "cm",
+        labelOutlineColor: "white",
+        labelOutlineWidth: 3
+    },
+    temporary: {
+        fillColor: "#66cccc",
+        fillOpacity: 0.2,
+        hoverFillColor: "white",
+        hoverFillOpacity: 0.8,
+        strokeColor: "#66cccc",
+        strokeOpacity: 1,
+        strokeLinecap: "round",
+        strokeWidth: 2,
+        strokeDashstyle: "solid",
+        hoverStrokeColor: "red",
+        hoverStrokeOpacity: 1,
+        hoverStrokeWidth: 0.2,
+        pointRadius: 6,
+        hoverPointRadius: 1,
+        hoverPointUnit: "%",
+        pointerEvents: "visiblePainted",
+        cursor: "inherit",
+        fontColor: "#000000",
+        labelAlign: "cm",
+        labelOutlineColor: "white",
+        labelOutlineWidth: 3
+    },
+    "delete": {
+        display: "none"
+    }
+};
+OpenLayers.Style = OpenLayers.Class({
+    id: null,
+    name: null,
+    title: null,
+    description: null,
+    layerName: null,
+    isDefault: !1,
+    rules: null,
+    context: null,
+    defaultStyle: null,
+    defaultsPerSymbolizer: !1,
+    propertyStyles: null,
+    initialize: function(a, b) {
+        OpenLayers.Util.extend(this, b);
+        this.rules = [];
+        b && b.rules && this.addRules(b.rules);
+        this.setDefaultStyle(a || OpenLayers.Feature.Vector.style["default"]);
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_")
+    },
+    destroy: function() {
+        for (var a = 0, b = this.rules.length; a < b; a++) this.rules[a].destroy(),
+            this.rules[a] = null;
+        this.defaultStyle = this.rules = null
+    },
+    createSymbolizer: function(a) {
+        for (var b = this.defaultsPerSymbolizer ? {} : this.createLiterals(OpenLayers.Util.extend({}, this.defaultStyle), a), c = this.rules, d, e = [], f = !1, g = 0, h = c.length; g < h; g++) d = c[g], d.evaluate(a) && (d instanceof OpenLayers.Rule && d.elseFilter ? e.push(d) : (f = !0, this.applySymbolizer(d, b, a)));
+        if (!1 == f && 0 < e.length) {
+            f = !0;
+            g = 0;
+            for (h = e.length; g < h; g++) this.applySymbolizer(e[g], b, a)
+        }
+        0 < c.length && !1 == f && (b.display = "none");
+        null != b.label && "string" !== typeof b.label &&
+            (b.label = "" + b.label);
+        return b
+    },
+    applySymbolizer: function(a, b, c) {
+        var d = c.geometry ? this.getSymbolizerPrefix(c.geometry) : OpenLayers.Style.SYMBOLIZER_PREFIXES[0],
+            a = a.symbolizer[d] || a.symbolizer;
+        !0 === this.defaultsPerSymbolizer && (d = this.defaultStyle, OpenLayers.Util.applyDefaults(a, {
+            pointRadius: d.pointRadius
+        }), (!0 === a.stroke || !0 === a.graphic) && OpenLayers.Util.applyDefaults(a, {
+            strokeWidth: d.strokeWidth,
+            strokeColor: d.strokeColor,
+            strokeOpacity: d.strokeOpacity,
+            strokeDashstyle: d.strokeDashstyle,
+            strokeLinecap: d.strokeLinecap
+        }), (!0 === a.fill || !0 === a.graphic) && OpenLayers.Util.applyDefaults(a, {
+            fillColor: d.fillColor,
+            fillOpacity: d.fillOpacity
+        }), !0 === a.graphic && OpenLayers.Util.applyDefaults(a, {
+            pointRadius: this.defaultStyle.pointRadius,
+            externalGraphic: this.defaultStyle.externalGraphic,
+            graphicName: this.defaultStyle.graphicName,
+            graphicOpacity: this.defaultStyle.graphicOpacity,
+            graphicWidth: this.defaultStyle.graphicWidth,
+            graphicHeight: this.defaultStyle.graphicHeight,
+            graphicXOffset: this.defaultStyle.graphicXOffset,
+            graphicYOffset: this.defaultStyle.graphicYOffset
+        }));
+        return this.createLiterals(OpenLayers.Util.extend(b, a), c)
+    },
+    createLiterals: function(a, b) {
+        var c = OpenLayers.Util.extend({}, b.attributes || b.data);
+        OpenLayers.Util.extend(c, this.context);
+        for (var d in this.propertyStyles) a[d] = OpenLayers.Style.createLiteral(a[d], c, b, d);
+        return a
+    },
+    findPropertyStyles: function() {
+        var a = {};
+        this.addPropertyStyles(a, this.defaultStyle);
+        for (var b = this.rules, c, d, e = 0, f = b.length; e < f; e++) {
+            c = b[e].symbolizer;
+            for (var g in c)
+                if (d = c[g], "object" == typeof d) this.addPropertyStyles(a, d);
+                else {
+                    this.addPropertyStyles(a,
+                        c);
+                    break
+                }
+        }
+        return a
+    },
+    addPropertyStyles: function(a, b) {
+        var c, d;
+        for (d in b) c = b[d], "string" == typeof c && c.match(/\$\{\w+\}/) && (a[d] = !0);
+        return a
+    },
+    addRules: function(a) {
+        Array.prototype.push.apply(this.rules, a);
+        this.propertyStyles = this.findPropertyStyles()
+    },
+    setDefaultStyle: function(a) {
+        this.defaultStyle = a;
+        this.propertyStyles = this.findPropertyStyles()
+    },
+    getSymbolizerPrefix: function(a) {
+        for (var b = OpenLayers.Style.SYMBOLIZER_PREFIXES, c = 0, d = b.length; c < d; c++)
+            if (-1 != a.CLASS_NAME.indexOf(b[c])) return b[c]
+    },
+    clone: function() {
+        var a =
+            OpenLayers.Util.extend({}, this);
+        if (this.rules) {
+            a.rules = [];
+            for (var b = 0, c = this.rules.length; b < c; ++b) a.rules.push(this.rules[b].clone())
+        }
+        a.context = this.context && OpenLayers.Util.extend({}, this.context);
+        b = OpenLayers.Util.extend({}, this.defaultStyle);
+        return new OpenLayers.Style(b, a)
+    },
+    CLASS_NAME: "OpenLayers.Style"
+});
+OpenLayers.Style.createLiteral = function(a, b, c, d) {
+    "string" == typeof a && -1 != a.indexOf("${") && (a = OpenLayers.String.format(a, b, [c, d]), a = isNaN(a) || !a ? a : parseFloat(a));
+    return a
+};
+OpenLayers.Style.SYMBOLIZER_PREFIXES = ["Point", "Line", "Polygon", "Text", "Raster"];
+OpenLayers.Filter = OpenLayers.Class({
+    initialize: function(a) {
+        OpenLayers.Util.extend(this, a)
+    },
+    destroy: function() {},
+    evaluate: function() {
+        return !0
+    },
+    clone: function() {
+        return null
+    },
+    toString: function() {
+        return OpenLayers.Format && OpenLayers.Format.CQL ? OpenLayers.Format.CQL.prototype.write(this) : Object.prototype.toString.call(this)
+    },
+    CLASS_NAME: "OpenLayers.Filter"
+});
+OpenLayers.Filter.FeatureId = OpenLayers.Class(OpenLayers.Filter, {
+    fids: null,
+    type: "FID",
+    initialize: function(a) {
+        this.fids = [];
+        OpenLayers.Filter.prototype.initialize.apply(this, [a])
+    },
+    evaluate: function(a) {
+        for (var b = 0, c = this.fids.length; b < c; b++)
+            if ((a.fid || a.id) == this.fids[b]) return !0;
+        return !1
+    },
+    clone: function() {
+        var a = new OpenLayers.Filter.FeatureId;
+        OpenLayers.Util.extend(a, this);
+        a.fids = this.fids.slice();
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Filter.FeatureId"
+});
+OpenLayers.Filter.Logical = OpenLayers.Class(OpenLayers.Filter, {
+    filters: null,
+    type: null,
+    initialize: function(a) {
+        this.filters = [];
+        OpenLayers.Filter.prototype.initialize.apply(this, [a])
+    },
+    destroy: function() {
+        this.filters = null;
+        OpenLayers.Filter.prototype.destroy.apply(this)
+    },
+    evaluate: function(a) {
+        var b, c;
+        switch (this.type) {
+            case OpenLayers.Filter.Logical.AND:
+                b = 0;
+                for (c = this.filters.length; b < c; b++)
+                    if (!1 == this.filters[b].evaluate(a)) return !1;
+                return !0;
+            case OpenLayers.Filter.Logical.OR:
+                b = 0;
+                for (c = this.filters.length; b <
+                    c; b++)
+                    if (!0 == this.filters[b].evaluate(a)) return !0;
+                return !1;
+            case OpenLayers.Filter.Logical.NOT:
+                return !this.filters[0].evaluate(a)
+        }
+    },
+    clone: function() {
+        for (var a = [], b = 0, c = this.filters.length; b < c; ++b) a.push(this.filters[b].clone());
+        return new OpenLayers.Filter.Logical({
+            type: this.type,
+            filters: a
+        })
+    },
+    CLASS_NAME: "OpenLayers.Filter.Logical"
+});
+OpenLayers.Filter.Logical.AND = "&&";
+OpenLayers.Filter.Logical.OR = "||";
+OpenLayers.Filter.Logical.NOT = "!";
+OpenLayers.Filter.Comparison = OpenLayers.Class(OpenLayers.Filter, {
+    type: null,
+    property: null,
+    value: null,
+    matchCase: !0,
+    lowerBoundary: null,
+    upperBoundary: null,
+    initialize: function(a) {
+        OpenLayers.Filter.prototype.initialize.apply(this, [a]);
+        this.type === OpenLayers.Filter.Comparison.LIKE && void 0 === a.matchCase && (this.matchCase = null)
+    },
+    evaluate: function(a) {
+        a instanceof OpenLayers.Feature.Vector && (a = a.attributes);
+        var b = !1,
+            a = a[this.property];
+        switch (this.type) {
+            case OpenLayers.Filter.Comparison.EQUAL_TO:
+                b = this.value;
+                b = !this.matchCase && "string" == typeof a && "string" == typeof b ? a.toUpperCase() == b.toUpperCase() : a == b;
+                break;
+            case OpenLayers.Filter.Comparison.NOT_EQUAL_TO:
+                b = this.value;
+                b = !this.matchCase && "string" == typeof a && "string" == typeof b ? a.toUpperCase() != b.toUpperCase() : a != b;
+                break;
+            case OpenLayers.Filter.Comparison.LESS_THAN:
+                b = a < this.value;
+                break;
+            case OpenLayers.Filter.Comparison.GREATER_THAN:
+                b = a > this.value;
+                break;
+            case OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO:
+                b = a <= this.value;
+                break;
+            case OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO:
+                b =
+                    a >= this.value;
+                break;
+            case OpenLayers.Filter.Comparison.BETWEEN:
+                b = a >= this.lowerBoundary && a <= this.upperBoundary;
+                break;
+            case OpenLayers.Filter.Comparison.LIKE:
+                b = RegExp(this.value, "gi").test(a)
+        }
+        return b
+    },
+    value2regex: function(a, b, c) {
+        if ("." == a) throw Error("'.' is an unsupported wildCard character for OpenLayers.Filter.Comparison");
+        a = a ? a : "*";
+        b = b ? b : ".";
+        this.value = this.value.replace(RegExp("\\" + (c ? c : "!") + "(.|$)", "g"), "\\$1");
+        this.value = this.value.replace(RegExp("\\" + b, "g"), ".");
+        this.value = this.value.replace(RegExp("\\" +
+            a, "g"), ".*");
+        this.value = this.value.replace(RegExp("\\\\.\\*", "g"), "\\" + a);
+        return this.value = this.value.replace(RegExp("\\\\\\.", "g"), "\\" + b)
+    },
+    regex2value: function() {
+        var a = this.value,
+            a = a.replace(/!/g, "!!"),
+            a = a.replace(/(\\)?\\\./g, function(a, c) {
+                return c ? a : "!."
+            }),
+            a = a.replace(/(\\)?\\\*/g, function(a, c) {
+                return c ? a : "!*"
+            }),
+            a = a.replace(/\\\\/g, "\\");
+        return a = a.replace(/\.\*/g, "*")
+    },
+    clone: function() {
+        return OpenLayers.Util.extend(new OpenLayers.Filter.Comparison, this)
+    },
+    CLASS_NAME: "OpenLayers.Filter.Comparison"
+});
+OpenLayers.Filter.Comparison.EQUAL_TO = "==";
+OpenLayers.Filter.Comparison.NOT_EQUAL_TO = "!=";
+OpenLayers.Filter.Comparison.LESS_THAN = "<";
+OpenLayers.Filter.Comparison.GREATER_THAN = ">";
+OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO = "<=";
+OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO = ">=";
+OpenLayers.Filter.Comparison.BETWEEN = "..";
+OpenLayers.Filter.Comparison.LIKE = "~";
+OpenLayers.Format.Filter = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+    defaultVersion: "1.0.0",
+    CLASS_NAME: "OpenLayers.Format.Filter"
+});
+OpenLayers.Filter.Function = OpenLayers.Class(OpenLayers.Filter, {
+    name: null,
+    params: null,
+    CLASS_NAME: "OpenLayers.Filter.Function"
+});
+OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        ogc: "http://www.opengis.net/ogc",
+        gml: "http://www.opengis.net/gml",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    defaultPrefix: "ogc",
+    schemaLocation: null,
+    initialize: function(a) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+    },
+    read: function(a) {
+        var b = {};
+        this.readers.ogc.Filter.apply(this, [a, b]);
+        return b.filter
+    },
+    readers: {
+        ogc: {
+            _expression: function(a) {
+                for (var b = "", c = a.firstChild; c; c =
+                    c.nextSibling) switch (c.nodeType) {
+                    case 1:
+                        a = this.readNode(c);
+                        a.property ? b += "${" + a.property + "}" : void 0 !== a.value && (b += a.value);
+                        break;
+                    case 3:
+                    case 4:
+                        b += c.nodeValue
+                }
+                return b
+            },
+            Filter: function(a, b) {
+                var c = {
+                    fids: [],
+                    filters: []
+                };
+                this.readChildNodes(a, c);
+                0 < c.fids.length ? b.filter = new OpenLayers.Filter.FeatureId({
+                    fids: c.fids
+                }) : 0 < c.filters.length && (b.filter = c.filters[0])
+            },
+            FeatureId: function(a, b) {
+                var c = a.getAttribute("fid");
+                c && b.fids.push(c)
+            },
+            And: function(a, b) {
+                var c = new OpenLayers.Filter.Logical({
+                    type: OpenLayers.Filter.Logical.AND
+                });
+                this.readChildNodes(a, c);
+                b.filters.push(c)
+            },
+            Or: function(a, b) {
+                var c = new OpenLayers.Filter.Logical({
+                    type: OpenLayers.Filter.Logical.OR
+                });
+                this.readChildNodes(a, c);
+                b.filters.push(c)
+            },
+            Not: function(a, b) {
+                var c = new OpenLayers.Filter.Logical({
+                    type: OpenLayers.Filter.Logical.NOT
+                });
+                this.readChildNodes(a, c);
+                b.filters.push(c)
+            },
+            PropertyIsLessThan: function(a, b) {
+                var c = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.LESS_THAN
+                });
+                this.readChildNodes(a, c);
+                b.filters.push(c)
+            },
+            PropertyIsGreaterThan: function(a,
+                b) {
+                var c = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.GREATER_THAN
+                });
+                this.readChildNodes(a, c);
+                b.filters.push(c)
+            },
+            PropertyIsLessThanOrEqualTo: function(a, b) {
+                var c = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO
+                });
+                this.readChildNodes(a, c);
+                b.filters.push(c)
+            },
+            PropertyIsGreaterThanOrEqualTo: function(a, b) {
+                var c = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO
+                });
+                this.readChildNodes(a, c);
+                b.filters.push(c)
+            },
+            PropertyIsBetween: function(a, b) {
+                var c = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.BETWEEN
+                });
+                this.readChildNodes(a, c);
+                b.filters.push(c)
+            },
+            Literal: function(a, b) {
+                b.value = OpenLayers.String.numericIf(this.getChildValue(a))
+            },
+            PropertyName: function(a, b) {
+                b.property = this.getChildValue(a)
+            },
+            LowerBoundary: function(a, b) {
+                b.lowerBoundary = OpenLayers.String.numericIf(this.readers.ogc._expression.call(this, a))
+            },
+            UpperBoundary: function(a, b) {
+                b.upperBoundary = OpenLayers.String.numericIf(this.readers.ogc._expression.call(this,
+                    a))
+            },
+            Intersects: function(a, b) {
+                this.readSpatial(a, b, OpenLayers.Filter.Spatial.INTERSECTS)
+            },
+            Within: function(a, b) {
+                this.readSpatial(a, b, OpenLayers.Filter.Spatial.WITHIN)
+            },
+            Contains: function(a, b) {
+                this.readSpatial(a, b, OpenLayers.Filter.Spatial.CONTAINS)
+            },
+            DWithin: function(a, b) {
+                this.readSpatial(a, b, OpenLayers.Filter.Spatial.DWITHIN)
+            },
+            Distance: function(a, b) {
+                b.distance = parseInt(this.getChildValue(a));
+                b.distanceUnits = a.getAttribute("units")
+            },
+            Function: function() {}
+        }
+    },
+    readSpatial: function(a, b, c) {
+        c = new OpenLayers.Filter.Spatial({
+            type: c
+        });
+        this.readChildNodes(a, c);
+        c.value = c.components[0];
+        delete c.components;
+        b.filters.push(c)
+    },
+    writeOgcExpression: function(a, b) {
+        if (a instanceof OpenLayers.Filter.Function) {
+            var c = this.writeNode("Function", a, b);
+            b.appendChild(c)
+        } else this.writeNode("Literal", a, b);
+        return b
+    },
+    write: function(a) {
+        return this.writers.ogc.Filter.apply(this, [a])
+    },
+    writeFeatureIdNodes: function(a, b) {
+        for (var c = 0, d = a.fids.length; c < d; ++c) this.writeNode("FeatureId", a.fids[c], b)
+    },
+    writers: {
+        ogc: {
+            Filter: function(a) {
+                var b = this.createElementNSPlus("ogc:Filter");
+                "FID" === a.type ? OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, a, b) : this.writeNode(this.getFilterType(a), a, b);
+                return b
+            },
+            FeatureId: function(a) {
+                return this.createElementNSPlus("ogc:FeatureId", {
+                    attributes: {
+                        fid: a
+                    }
+                })
+            },
+            And: function(a) {
+                for (var b = this.createElementNSPlus("ogc:And"), c, d = 0, e = a.filters.length; d < e; ++d) c = a.filters[d], "FID" === c.type ? OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, c, b) : this.writeNode(this.getFilterType(c), c, b);
+                return b
+            },
+            Or: function(a) {
+                for (var b =
+                        this.createElementNSPlus("ogc:Or"), c, d = 0, e = a.filters.length; d < e; ++d) c = a.filters[d], "FID" === c.type ? OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, c, b) : this.writeNode(this.getFilterType(c), c, b);
+                return b
+            },
+            Not: function(a) {
+                var b = this.createElementNSPlus("ogc:Not"),
+                    a = a.filters[0];
+                "FID" === a.type ? OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, a, b) : this.writeNode(this.getFilterType(a), a, b);
+                return b
+            },
+            PropertyIsLessThan: function(a) {
+                var b = this.createElementNSPlus("ogc:PropertyIsLessThan");
+                this.writeNode("PropertyName", a, b);
+                this.writeOgcExpression(a.value, b);
+                return b
+            },
+            PropertyIsGreaterThan: function(a) {
+                var b = this.createElementNSPlus("ogc:PropertyIsGreaterThan");
+                this.writeNode("PropertyName", a, b);
+                this.writeOgcExpression(a.value, b);
+                return b
+            },
+            PropertyIsLessThanOrEqualTo: function(a) {
+                var b = this.createElementNSPlus("ogc:PropertyIsLessThanOrEqualTo");
+                this.writeNode("PropertyName", a, b);
+                this.writeOgcExpression(a.value, b);
+                return b
+            },
+            PropertyIsGreaterThanOrEqualTo: function(a) {
+                var b = this.createElementNSPlus("ogc:PropertyIsGreaterThanOrEqualTo");
+                this.writeNode("PropertyName", a, b);
+                this.writeOgcExpression(a.value, b);
+                return b
+            },
+            PropertyIsBetween: function(a) {
+                var b = this.createElementNSPlus("ogc:PropertyIsBetween");
+                this.writeNode("PropertyName", a, b);
+                this.writeNode("LowerBoundary", a, b);
+                this.writeNode("UpperBoundary", a, b);
+                return b
+            },
+            PropertyName: function(a) {
+                return this.createElementNSPlus("ogc:PropertyName", {
+                    value: a.property
+                })
+            },
+            Literal: function(a) {
+                return this.createElementNSPlus("ogc:Literal", {
+                    value: a
+                })
+            },
+            LowerBoundary: function(a) {
+                var b = this.createElementNSPlus("ogc:LowerBoundary");
+                this.writeOgcExpression(a.lowerBoundary, b);
+                return b
+            },
+            UpperBoundary: function(a) {
+                var b = this.createElementNSPlus("ogc:UpperBoundary");
+                this.writeNode("Literal", a.upperBoundary, b);
+                return b
+            },
+            INTERSECTS: function(a) {
+                return this.writeSpatial(a, "Intersects")
+            },
+            WITHIN: function(a) {
+                return this.writeSpatial(a, "Within")
+            },
+            CONTAINS: function(a) {
+                return this.writeSpatial(a, "Contains")
+            },
+            DWITHIN: function(a) {
+                var b = this.writeSpatial(a, "DWithin");
+                this.writeNode("Distance", a, b);
+                return b
+            },
+            Distance: function(a) {
+                return this.createElementNSPlus("ogc:Distance", {
+                    attributes: {
+                        units: a.distanceUnits
+                    },
+                    value: a.distance
+                })
+            },
+            Function: function(a) {
+                for (var b = this.createElementNSPlus("ogc:Function", {
+                        attributes: {
+                            name: a.name
+                        }
+                    }), a = a.params, c = 0, d = a.length; c < d; c++) this.writeOgcExpression(a[c], b);
+                return b
+            }
+        }
+    },
+    getFilterType: function(a) {
+        var b = this.filterMap[a.type];
+        if (!b) throw "Filter writing not supported for rule type: " + a.type;
+        return b
+    },
+    filterMap: {
+        "&&": "And",
+        "||": "Or",
+        "!": "Not",
+        "==": "PropertyIsEqualTo",
+        "!=": "PropertyIsNotEqualTo",
+        "<": "PropertyIsLessThan",
+        ">": "PropertyIsGreaterThan",
+        "<=": "PropertyIsLessThanOrEqualTo",
+        ">=": "PropertyIsGreaterThanOrEqualTo",
+        "..": "PropertyIsBetween",
+        "~": "PropertyIsLike",
+        BBOX: "BBOX",
+        DWITHIN: "DWITHIN",
+        WITHIN: "WITHIN",
+        CONTAINS: "CONTAINS",
+        INTERSECTS: "INTERSECTS",
+        FID: "FeatureId"
+    },
+    CLASS_NAME: "OpenLayers.Format.Filter.v1"
+});
+OpenLayers.Geometry = OpenLayers.Class({
+    id: null,
+    parent: null,
+    bounds: null,
+    initialize: function() {
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_")
+    },
+    destroy: function() {
+        this.bounds = this.id = null
+    },
+    clone: function() {
+        return new OpenLayers.Geometry
+    },
+    setBounds: function(a) {
+        a && (this.bounds = a.clone())
+    },
+    clearBounds: function() {
+        this.bounds = null;
+        this.parent && this.parent.clearBounds()
+    },
+    extendBounds: function(a) {
+        this.getBounds() ? this.bounds.extend(a) : this.setBounds(a)
+    },
+    getBounds: function() {
+        null == this.bounds && this.calculateBounds();
+        return this.bounds
+    },
+    calculateBounds: function() {},
+    distanceTo: function() {},
+    getVertices: function() {},
+    atPoint: function(a, b, c) {
+        var d = !1;
+        null != this.getBounds() && null != a && (b = null != b ? b : 0, c = null != c ? c : 0, d = (new OpenLayers.Bounds(this.bounds.left - b, this.bounds.bottom - c, this.bounds.right + b, this.bounds.top + c)).containsLonLat(a));
+        return d
+    },
+    getLength: function() {
+        return 0
+    },
+    getArea: function() {
+        return 0
+    },
+    getCentroid: function() {
+        return null
+    },
+    toString: function() {
+        return OpenLayers.Format && OpenLayers.Format.WKT ? OpenLayers.Format.WKT.prototype.write(new OpenLayers.Feature.Vector(this)) :
+            Object.prototype.toString.call(this)
+    },
+    CLASS_NAME: "OpenLayers.Geometry"
+});
+OpenLayers.Geometry.fromWKT = function(a) {
+    var b;
+    if (OpenLayers.Format && OpenLayers.Format.WKT) {
+        var c = OpenLayers.Geometry.fromWKT.format;
+        c || (c = new OpenLayers.Format.WKT, OpenLayers.Geometry.fromWKT.format = c);
+        a = c.read(a);
+        if (a instanceof OpenLayers.Feature.Vector) b = a.geometry;
+        else if (OpenLayers.Util.isArray(a)) {
+            b = a.length;
+            for (var c = Array(b), d = 0; d < b; ++d) c[d] = a[d].geometry;
+            b = new OpenLayers.Geometry.Collection(c)
+        }
+    }
+    return b
+};
+OpenLayers.Geometry.segmentsIntersect = function(a, b, c) {
+    var d = c && c.point,
+        c = c && c.tolerance,
+        e = !1,
+        f = a.x1 - b.x1,
+        g = a.y1 - b.y1,
+        h = a.x2 - a.x1,
+        i = a.y2 - a.y1,
+        j = b.y2 - b.y1,
+        k = b.x2 - b.x1,
+        l = j * h - k * i,
+        j = k * g - j * f,
+        g = h * g - i * f;
+    0 == l ? 0 == j && 0 == g && (e = !0) : (f = j / l, l = g / l, 0 <= f && (1 >= f && 0 <= l && 1 >= l) && (d ? (h = a.x1 + f * h, l = a.y1 + f * i, e = new OpenLayers.Geometry.Point(h, l)) : e = !0));
+    if (c)
+        if (e) {
+            if (d) {
+                a = [a, b];
+                b = 0;
+                a: for (; 2 > b; ++b) {
+                    f = a[b];
+                    for (i = 1; 3 > i; ++i)
+                        if (h = f["x" + i], l = f["y" + i], d = Math.sqrt(Math.pow(h - e.x, 2) + Math.pow(l - e.y, 2)), d < c) {
+                            e.x = h;
+                            e.y = l;
+                            break a
+                        }
+                }
+            }
+        } else {
+            a = [a, b];
+            b = 0;
+            a: for (; 2 > b; ++b) {
+                h = a[b];
+                l = a[(b + 1) % 2];
+                for (i = 1; 3 > i; ++i)
+                    if (f = {
+                            x: h["x" + i],
+                            y: h["y" + i]
+                        }, g = OpenLayers.Geometry.distanceToSegment(f, l), g.distance < c) {
+                        e = d ? new OpenLayers.Geometry.Point(f.x, f.y) : !0;
+                        break a
+                    }
+            }
+        }
+    return e
+};
+OpenLayers.Geometry.distanceToSegment = function(a, b) {
+    var c = a.x,
+        d = a.y,
+        e = b.x1,
+        f = b.y1,
+        g = b.x2,
+        h = b.y2,
+        i = g - e,
+        j = h - f,
+        k = (i * (c - e) + j * (d - f)) / (Math.pow(i, 2) + Math.pow(j, 2));
+    0 >= k || (1 <= k ? (e = g, f = h) : (e += k * i, f += k * j));
+    return {
+        distance: Math.sqrt(Math.pow(e - c, 2) + Math.pow(f - d, 2)),
+        x: e,
+        y: f
+    }
+};
+OpenLayers.Geometry.Point = OpenLayers.Class(OpenLayers.Geometry, {
+    x: null,
+    y: null,
+    initialize: function(a, b) {
+        OpenLayers.Geometry.prototype.initialize.apply(this, arguments);
+        this.x = parseFloat(a);
+        this.y = parseFloat(b)
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Geometry.Point(this.x, this.y));
+        OpenLayers.Util.applyDefaults(a, this);
+        return a
+    },
+    calculateBounds: function() {
+        this.bounds = new OpenLayers.Bounds(this.x, this.y, this.x, this.y)
+    },
+    distanceTo: function(a, b) {
+        var c = !(b && !1 === b.edge) && b && b.details,
+            d, e, f, g, h;
+        a instanceof
+        OpenLayers.Geometry.Point ? (e = this.x, f = this.y, g = a.x, h = a.y, d = Math.sqrt(Math.pow(e - g, 2) + Math.pow(f - h, 2)), d = !c ? d : {
+            x0: e,
+            y0: f,
+            x1: g,
+            y1: h,
+            distance: d
+        }) : (d = a.distanceTo(this, b), c && (d = {
+            x0: d.x1,
+            y0: d.y1,
+            x1: d.x0,
+            y1: d.y0,
+            distance: d.distance
+        }));
+        return d
+    },
+    equals: function(a) {
+        var b = !1;
+        null != a && (b = this.x == a.x && this.y == a.y || isNaN(this.x) && isNaN(this.y) && isNaN(a.x) && isNaN(a.y));
+        return b
+    },
+    toShortString: function() {
+        return this.x + ", " + this.y
+    },
+    move: function(a, b) {
+        this.x += a;
+        this.y += b;
+        this.clearBounds()
+    },
+    rotate: function(a, b) {
+        var a =
+            a * (Math.PI / 180),
+            c = this.distanceTo(b),
+            d = a + Math.atan2(this.y - b.y, this.x - b.x);
+        this.x = b.x + c * Math.cos(d);
+        this.y = b.y + c * Math.sin(d);
+        this.clearBounds()
+    },
+    getCentroid: function() {
+        return new OpenLayers.Geometry.Point(this.x, this.y)
+    },
+    resize: function(a, b, c) {
+        this.x = b.x + a * (void 0 == c ? 1 : c) * (this.x - b.x);
+        this.y = b.y + a * (this.y - b.y);
+        this.clearBounds();
+        return this
+    },
+    intersects: function(a) {
+        var b = !1;
+        return b = "OpenLayers.Geometry.Point" == a.CLASS_NAME ? this.equals(a) : a.intersects(this)
+    },
+    transform: function(a, b) {
+        a && b && (OpenLayers.Projection.transform(this,
+            a, b), this.bounds = null);
+        return this
+    },
+    getVertices: function() {
+        return [this]
+    },
+    CLASS_NAME: "OpenLayers.Geometry.Point"
+});
+OpenLayers.Geometry.Collection = OpenLayers.Class(OpenLayers.Geometry, {
+    components: null,
+    componentTypes: null,
+    initialize: function(a) {
+        OpenLayers.Geometry.prototype.initialize.apply(this, arguments);
+        this.components = [];
+        null != a && this.addComponents(a)
+    },
+    destroy: function() {
+        this.components.length = 0;
+        this.components = null;
+        OpenLayers.Geometry.prototype.destroy.apply(this, arguments)
+    },
+    clone: function() {
+        for (var a = eval("new " + this.CLASS_NAME + "()"), b = 0, c = this.components.length; b < c; b++) a.addComponent(this.components[b].clone());
+        OpenLayers.Util.applyDefaults(a, this);
+        return a
+    },
+    getComponentsString: function() {
+        for (var a = [], b = 0, c = this.components.length; b < c; b++) a.push(this.components[b].toShortString());
+        return a.join(",")
+    },
+    calculateBounds: function() {
+        this.bounds = null;
+        var a = new OpenLayers.Bounds,
+            b = this.components;
+        if (b)
+            for (var c = 0, d = b.length; c < d; c++) a.extend(b[c].getBounds());
+        null != a.left && (null != a.bottom && null != a.right && null != a.top) && this.setBounds(a)
+    },
+    addComponents: function(a) {
+        OpenLayers.Util.isArray(a) || (a = [a]);
+        for (var b = 0, c = a.length; b <
+            c; b++) this.addComponent(a[b])
+    },
+    addComponent: function(a, b) {
+        var c = !1;
+        if (a && (null == this.componentTypes || -1 < OpenLayers.Util.indexOf(this.componentTypes, a.CLASS_NAME))) {
+            if (null != b && b < this.components.length) {
+                var c = this.components.slice(0, b),
+                    d = this.components.slice(b, this.components.length);
+                c.push(a);
+                this.components = c.concat(d)
+            } else this.components.push(a);
+            a.parent = this;
+            this.clearBounds();
+            c = !0
+        }
+        return c
+    },
+    removeComponents: function(a) {
+        var b = !1;
+        OpenLayers.Util.isArray(a) || (a = [a]);
+        for (var c = a.length - 1; 0 <= c; --c) b =
+            this.removeComponent(a[c]) || b;
+        return b
+    },
+    removeComponent: function(a) {
+        OpenLayers.Util.removeItem(this.components, a);
+        this.clearBounds();
+        return !0
+    },
+    getLength: function() {
+        for (var a = 0, b = 0, c = this.components.length; b < c; b++) a += this.components[b].getLength();
+        return a
+    },
+    getArea: function() {
+        for (var a = 0, b = 0, c = this.components.length; b < c; b++) a += this.components[b].getArea();
+        return a
+    },
+    getGeodesicArea: function(a) {
+        for (var b = 0, c = 0, d = this.components.length; c < d; c++) b += this.components[c].getGeodesicArea(a);
+        return b
+    },
+    getCentroid: function(a) {
+        if (!a) return this.components.length &&
+            this.components[0].getCentroid();
+        a = this.components.length;
+        if (!a) return !1;
+        for (var b = [], c = [], d = 0, e = Number.MAX_VALUE, f, g = 0; g < a; ++g) {
+            f = this.components[g];
+            var h = f.getArea();
+            f = f.getCentroid(!0);
+            !isNaN(h) && (!isNaN(f.x) && !isNaN(f.y)) && (b.push(h), d += h, e = h < e && 0 < h ? h : e, c.push(f))
+        }
+        a = b.length;
+        if (0 === d) {
+            for (g = 0; g < a; ++g) b[g] = 1;
+            d = b.length
+        } else {
+            for (g = 0; g < a; ++g) b[g] /= e;
+            d /= e
+        }
+        for (var i = e = 0, g = 0; g < a; ++g) f = c[g], h = b[g], e += f.x * h, i += f.y * h;
+        return new OpenLayers.Geometry.Point(e / d, i / d)
+    },
+    getGeodesicLength: function(a) {
+        for (var b =
+                0, c = 0, d = this.components.length; c < d; c++) b += this.components[c].getGeodesicLength(a);
+        return b
+    },
+    move: function(a, b) {
+        for (var c = 0, d = this.components.length; c < d; c++) this.components[c].move(a, b)
+    },
+    rotate: function(a, b) {
+        for (var c = 0, d = this.components.length; c < d; ++c) this.components[c].rotate(a, b)
+    },
+    resize: function(a, b, c) {
+        for (var d = 0; d < this.components.length; ++d) this.components[d].resize(a, b, c);
+        return this
+    },
+    distanceTo: function(a, b) {
+        for (var c = !(b && !1 === b.edge) && b && b.details, d, e, f, g = Number.POSITIVE_INFINITY, h = 0, i = this.components.length; h <
+            i && !(d = this.components[h].distanceTo(a, b), f = c ? d.distance : d, f < g && (g = f, e = d, 0 == g)); ++h);
+        return e
+    },
+    equals: function(a) {
+        var b = !0;
+        if (!a || !a.CLASS_NAME || this.CLASS_NAME != a.CLASS_NAME) b = !1;
+        else if (!OpenLayers.Util.isArray(a.components) || a.components.length != this.components.length) b = !1;
+        else
+            for (var c = 0, d = this.components.length; c < d; ++c)
+                if (!this.components[c].equals(a.components[c])) {
+                    b = !1;
+                    break
+                } return b
+    },
+    transform: function(a, b) {
+        if (a && b) {
+            for (var c = 0, d = this.components.length; c < d; c++) this.components[c].transform(a,
+                b);
+            this.bounds = null
+        }
+        return this
+    },
+    intersects: function(a) {
+        for (var b = !1, c = 0, d = this.components.length; c < d && !(b = a.intersects(this.components[c])); ++c);
+        return b
+    },
+    getVertices: function(a) {
+        for (var b = [], c = 0, d = this.components.length; c < d; ++c) Array.prototype.push.apply(b, this.components[c].getVertices(a));
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Geometry.Collection"
+});
+OpenLayers.Geometry.MultiPoint = OpenLayers.Class(OpenLayers.Geometry.Collection, {
+    componentTypes: ["OpenLayers.Geometry.Point"],
+    addPoint: function(a, b) {
+        this.addComponent(a, b)
+    },
+    removePoint: function(a) {
+        this.removeComponent(a)
+    },
+    CLASS_NAME: "OpenLayers.Geometry.MultiPoint"
+});
+OpenLayers.Geometry.Curve = OpenLayers.Class(OpenLayers.Geometry.MultiPoint, {
+    componentTypes: ["OpenLayers.Geometry.Point"],
+    getLength: function() {
+        var a = 0;
+        if (this.components && 1 < this.components.length)
+            for (var b = 1, c = this.components.length; b < c; b++) a += this.components[b - 1].distanceTo(this.components[b]);
+        return a
+    },
+    getGeodesicLength: function(a) {
+        var b = this;
+        if (a) {
+            var c = new OpenLayers.Projection("EPSG:4326");
+            c.equals(a) || (b = this.clone().transform(a, c))
+        }
+        a = 0;
+        if (b.components && 1 < b.components.length)
+            for (var d, e = 1, f = b.components.length; e <
+                f; e++) c = b.components[e - 1], d = b.components[e], a += OpenLayers.Util.distVincenty({
+                lon: c.x,
+                lat: c.y
+            }, {
+                lon: d.x,
+                lat: d.y
+            });
+        return 1E3 * a
+    },
+    CLASS_NAME: "OpenLayers.Geometry.Curve"
+});
+OpenLayers.Geometry.LineString = OpenLayers.Class(OpenLayers.Geometry.Curve, {
+    removeComponent: function(a) {
+        var b = this.components && 2 < this.components.length;
+        b && OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this, arguments);
+        return b
+    },
+    intersects: function(a) {
+        var b = !1,
+            c = a.CLASS_NAME;
+        if ("OpenLayers.Geometry.LineString" == c || "OpenLayers.Geometry.LinearRing" == c || "OpenLayers.Geometry.Point" == c) {
+            var d = this.getSortedSegments(),
+                a = "OpenLayers.Geometry.Point" == c ? [{
+                    x1: a.x,
+                    y1: a.y,
+                    x2: a.x,
+                    y2: a.y
+                }] : a.getSortedSegments(),
+                e, f, g, h, i, j, k, l = 0,
+                m = d.length;
+            a: for (; l < m; ++l) {
+                c = d[l];
+                e = c.x1;
+                f = c.x2;
+                g = c.y1;
+                h = c.y2;
+                var n = 0,
+                    o = a.length;
+                for (; n < o; ++n) {
+                    i = a[n];
+                    if (i.x1 > f) break;
+                    if (!(i.x2 < e) && (j = i.y1, k = i.y2, !(Math.min(j, k) > Math.max(g, h)) && !(Math.max(j, k) < Math.min(g, h)) && OpenLayers.Geometry.segmentsIntersect(c, i))) {
+                        b = !0;
+                        break a
+                    }
+                }
+            }
+        } else b = a.intersects(this);
+        return b
+    },
+    getSortedSegments: function() {
+        for (var a = this.components.length - 1, b = Array(a), c, d, e = 0; e < a; ++e) c = this.components[e], d = this.components[e + 1], b[e] = c.x < d.x ? {
+            x1: c.x,
+            y1: c.y,
+            x2: d.x,
+            y2: d.y
+        } : {
+            x1: d.x,
+            y1: d.y,
+            x2: c.x,
+            y2: c.y
+        };
+        return b.sort(function(a, b) {
+            return a.x1 - b.x1
+        })
+    },
+    splitWithSegment: function(a, b) {
+        for (var c = !(b && !1 === b.edge), d = b && b.tolerance, e = [], f = this.getVertices(), g = [], h = [], i = !1, j, k, l, m = {
+                point: !0,
+                tolerance: d
+            }, n = null, o = 0, p = f.length - 2; o <= p; ++o)
+            if (d = f[o], g.push(d.clone()), j = f[o + 1], k = {
+                    x1: d.x,
+                    y1: d.y,
+                    x2: j.x,
+                    y2: j.y
+                }, k = OpenLayers.Geometry.segmentsIntersect(a, k, m), k instanceof OpenLayers.Geometry.Point && ((l = k.x === a.x1 && k.y === a.y1 || k.x === a.x2 && k.y === a.y2 || k.equals(d) || k.equals(j) ? !0 : !1) || c)) k.equals(h[h.length -
+                1]) || h.push(k.clone()), !(0 === o && k.equals(d)) && !k.equals(j) && (i = !0, k.equals(d) || g.push(k), e.push(new OpenLayers.Geometry.LineString(g)), g = [k.clone()]);
+        i && (g.push(j.clone()), e.push(new OpenLayers.Geometry.LineString(g)));
+        if (0 < h.length) var q = a.x1 < a.x2 ? 1 : -1,
+            r = a.y1 < a.y2 ? 1 : -1,
+            n = {
+                lines: e,
+                points: h.sort(function(a, b) {
+                    return q * a.x - q * b.x || r * a.y - r * b.y
+                })
+            };
+        return n
+    },
+    split: function(a, b) {
+        var c = null,
+            d = b && b.mutual,
+            e, f, g, h;
+        if (a instanceof OpenLayers.Geometry.LineString) {
+            var i = this.getVertices(),
+                j, k, l, m, n, o = [];
+            g = [];
+            for (var p = 0, q = i.length - 2; p <= q; ++p) {
+                j = i[p];
+                k = i[p + 1];
+                l = {
+                    x1: j.x,
+                    y1: j.y,
+                    x2: k.x,
+                    y2: k.y
+                };
+                h = h || [a];
+                d && o.push(j.clone());
+                for (var r = 0; r < h.length; ++r)
+                    if (m = h[r].splitWithSegment(l, b))
+                        if (n = m.lines, 0 < n.length && (n.unshift(r, 1), Array.prototype.splice.apply(h, n), r += n.length - 2), d)
+                            for (var s = 0, t = m.points.length; s < t; ++s) n = m.points[s], n.equals(j) || (o.push(n), g.push(new OpenLayers.Geometry.LineString(o)), o = n.equals(k) ? [] : [n.clone()])
+            }
+            d && (0 < g.length && 0 < o.length) && (o.push(k.clone()), g.push(new OpenLayers.Geometry.LineString(o)))
+        } else c =
+            a.splitWith(this, b);
+        h && 1 < h.length ? f = !0 : h = [];
+        g && 1 < g.length ? e = !0 : g = [];
+        if (f || e) c = d ? [g, h] : h;
+        return c
+    },
+    splitWith: function(a, b) {
+        return a.split(this, b)
+    },
+    getVertices: function(a) {
+        return !0 === a ? [this.components[0], this.components[this.components.length - 1]] : !1 === a ? this.components.slice(1, this.components.length - 1) : this.components.slice()
+    },
+    distanceTo: function(a, b) {
+        var c = !(b && !1 === b.edge) && b && b.details,
+            d, e = {},
+            f = Number.POSITIVE_INFINITY;
+        if (a instanceof OpenLayers.Geometry.Point) {
+            for (var g = this.getSortedSegments(),
+                    h = a.x, i = a.y, j, k = 0, l = g.length; k < l; ++k)
+                if (j = g[k], d = OpenLayers.Geometry.distanceToSegment(a, j), d.distance < f) {
+                    if (f = d.distance, e = d, 0 === f) break
+                } else if (j.x2 > h && (i > j.y1 && i < j.y2 || i < j.y1 && i > j.y2)) break;
+            e = c ? {
+                distance: e.distance,
+                x0: e.x,
+                y0: e.y,
+                x1: h,
+                y1: i
+            } : e.distance
+        } else if (a instanceof OpenLayers.Geometry.LineString) {
+            var g = this.getSortedSegments(),
+                h = a.getSortedSegments(),
+                m, n, o = h.length,
+                p = {
+                    point: !0
+                },
+                k = 0,
+                l = g.length;
+            a: for (; k < l; ++k) {
+                i = g[k];
+                j = i.x1;
+                n = i.y1;
+                for (var q = 0; q < o; ++q)
+                    if (d = h[q], m = OpenLayers.Geometry.segmentsIntersect(i,
+                            d, p)) {
+                        f = 0;
+                        e = {
+                            distance: 0,
+                            x0: m.x,
+                            y0: m.y,
+                            x1: m.x,
+                            y1: m.y
+                        };
+                        break a
+                    } else d = OpenLayers.Geometry.distanceToSegment({
+                        x: j,
+                        y: n
+                    }, d), d.distance < f && (f = d.distance, e = {
+                        distance: f,
+                        x0: j,
+                        y0: n,
+                        x1: d.x,
+                        y1: d.y
+                    })
+            }
+            c || (e = e.distance);
+            0 !== f && i && (d = a.distanceTo(new OpenLayers.Geometry.Point(i.x2, i.y2), b), k = c ? d.distance : d, k < f && (e = c ? {
+                distance: f,
+                x0: d.x1,
+                y0: d.y1,
+                x1: d.x0,
+                y1: d.y0
+            } : k))
+        } else e = a.distanceTo(this, b), c && (e = {
+            distance: e.distance,
+            x0: e.x1,
+            y0: e.y1,
+            x1: e.x0,
+            y1: e.y0
+        });
+        return e
+    },
+    simplify: function(a) {
+        if (this && null !== this) {
+            var b = this.getVertices();
+            if (3 > b.length) return this;
+            var c = function(a, b, d, i) {
+                    for (var j = 0, k = 0, l = b, m; l < d; l++) {
+                        m = a[b];
+                        var n = a[d],
+                            o = a[l],
+                            o = Math.abs(0.5 * (m.x * n.y + n.x * o.y + o.x * m.y - n.x * m.y - o.x * n.y - m.x * o.y));
+                        m = Math.sqrt(Math.pow(m.x - n.x, 2) + Math.pow(m.y - n.y, 2));
+                        m = 2 * (o / m);
+                        m > j && (j = m, k = l)
+                    }
+                    j > i && k != b && (e.push(k), c(a, b, k, i), c(a, k, d, i))
+                },
+                d = b.length - 1,
+                e = [];
+            e.push(0);
+            for (e.push(d); b[0].equals(b[d]);) d--, e.push(d);
+            c(b, 0, d, a);
+            a = [];
+            e.sort(function(a, b) {
+                return a - b
+            });
+            for (d = 0; d < e.length; d++) a.push(b[e[d]]);
+            return new OpenLayers.Geometry.LineString(a)
+        }
+        return this
+    },
+    CLASS_NAME: "OpenLayers.Geometry.LineString"
+});
+OpenLayers.Geometry.MultiLineString = OpenLayers.Class(OpenLayers.Geometry.Collection, {
+    componentTypes: ["OpenLayers.Geometry.LineString"],
+    split: function(a, b) {
+        for (var c = null, d = b && b.mutual, e, f, g, h, i = [], j = [a], k = 0, l = this.components.length; k < l; ++k) {
+            f = this.components[k];
+            g = !1;
+            for (var m = 0; m < j.length; ++m)
+                if (e = f.split(j[m], b)) {
+                    if (d) {
+                        g = e[0];
+                        for (var n = 0, o = g.length; n < o; ++n) 0 === n && i.length ? i[i.length - 1].addComponent(g[n]) : i.push(new OpenLayers.Geometry.MultiLineString([g[n]]));
+                        g = !0;
+                        e = e[1]
+                    }
+                    if (e.length) {
+                        e.unshift(m,
+                            1);
+                        Array.prototype.splice.apply(j, e);
+                        break
+                    }
+                }
+            g || (i.length ? i[i.length - 1].addComponent(f.clone()) : i = [new OpenLayers.Geometry.MultiLineString(f.clone())])
+        }
+        i && 1 < i.length ? g = !0 : i = [];
+        j && 1 < j.length ? h = !0 : j = [];
+        if (g || h) c = d ? [i, j] : j;
+        return c
+    },
+    splitWith: function(a, b) {
+        var c = null,
+            d = b && b.mutual,
+            e, f, g, h, i, j;
+        if (a instanceof OpenLayers.Geometry.LineString) {
+            j = [];
+            i = [a];
+            for (var k = 0, l = this.components.length; k < l; ++k) {
+                g = !1;
+                f = this.components[k];
+                for (var m = 0; m < i.length; ++m)
+                    if (e = i[m].split(f, b)) {
+                        d && (g = e[0], g.length && (g.unshift(m,
+                            1), Array.prototype.splice.apply(i, g), m += g.length - 2), e = e[1], 0 === e.length && (e = [f.clone()]));
+                        g = 0;
+                        for (var n = e.length; g < n; ++g) 0 === g && j.length ? j[j.length - 1].addComponent(e[g]) : j.push(new OpenLayers.Geometry.MultiLineString([e[g]]));
+                        g = !0
+                    }
+                g || (j.length ? j[j.length - 1].addComponent(f.clone()) : j = [new OpenLayers.Geometry.MultiLineString([f.clone()])])
+            }
+        } else c = a.split(this);
+        i && 1 < i.length ? h = !0 : i = [];
+        j && 1 < j.length ? g = !0 : j = [];
+        if (h || g) c = d ? [i, j] : j;
+        return c
+    },
+    CLASS_NAME: "OpenLayers.Geometry.MultiLineString"
+});
+OpenLayers.Geometry.LinearRing = OpenLayers.Class(OpenLayers.Geometry.LineString, {
+    componentTypes: ["OpenLayers.Geometry.Point"],
+    addComponent: function(a, b) {
+        var c = !1,
+            d = this.components.pop();
+        if (null != b || !a.equals(d)) c = OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, arguments);
+        OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, [this.components[0]]);
+        return c
+    },
+    removeComponent: function(a) {
+        var b = this.components && 3 < this.components.length;
+        b && (this.components.pop(), OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,
+            arguments), OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, [this.components[0]]));
+        return b
+    },
+    move: function(a, b) {
+        for (var c = 0, d = this.components.length; c < d - 1; c++) this.components[c].move(a, b)
+    },
+    rotate: function(a, b) {
+        for (var c = 0, d = this.components.length; c < d - 1; ++c) this.components[c].rotate(a, b)
+    },
+    resize: function(a, b, c) {
+        for (var d = 0, e = this.components.length; d < e - 1; ++d) this.components[d].resize(a, b, c);
+        return this
+    },
+    transform: function(a, b) {
+        if (a && b) {
+            for (var c = 0, d = this.components.length; c < d - 1; c++) this.components[c].transform(a,
+                b);
+            this.bounds = null
+        }
+        return this
+    },
+    getCentroid: function() {
+        if (this.components && 2 < this.components.length) {
+            for (var a = 0, b = 0, c = 0; c < this.components.length - 1; c++) var d = this.components[c],
+                e = this.components[c + 1],
+                a = a + (d.x + e.x) * (d.x * e.y - e.x * d.y),
+                b = b + (d.y + e.y) * (d.x * e.y - e.x * d.y);
+            c = -1 * this.getArea();
+            return new OpenLayers.Geometry.Point(a / (6 * c), b / (6 * c))
+        }
+        return null
+    },
+    getArea: function() {
+        var a = 0;
+        if (this.components && 2 < this.components.length) {
+            for (var b = a = 0, c = this.components.length; b < c - 1; b++) var d = this.components[b],
+                e =
+                this.components[b + 1],
+                a = a + (d.x + e.x) * (e.y - d.y);
+            a = -a / 2
+        }
+        return a
+    },
+    getGeodesicArea: function(a) {
+        var b = this;
+        if (a) {
+            var c = new OpenLayers.Projection("EPSG:4326");
+            c.equals(a) || (b = this.clone().transform(a, c))
+        }
+        a = 0;
+        c = b.components && b.components.length;
+        if (2 < c) {
+            for (var d, e, f = 0; f < c - 1; f++) d = b.components[f], e = b.components[f + 1], a += OpenLayers.Util.rad(e.x - d.x) * (2 + Math.sin(OpenLayers.Util.rad(d.y)) + Math.sin(OpenLayers.Util.rad(e.y)));
+            a = 40680631590769 * a / 2
+        }
+        return a
+    },
+    containsPoint: function(a) {
+        for (var b = OpenLayers.Number.limitSigDigs,
+                c = b(a.x, 14), a = b(a.y, 14), d = this.components.length - 1, e, f, g, h, i, j = 0, k = 0; k < d; ++k)
+            if (e = this.components[k], g = b(e.x, 14), e = b(e.y, 14), f = this.components[k + 1], h = b(f.x, 14), f = b(f.y, 14), e == f) {
+                if (a == e && (g <= h && c >= g && c <= h || g >= h && c <= g && c >= h)) {
+                    j = -1;
+                    break
+                }
+            } else {
+                i = b((a - f) * ((h - g) / (f - e)) + h, 14);
+                if (i == c && (e < f && a >= e && a <= f || e > f && a <= e && a >= f)) {
+                    j = -1;
+                    break
+                }
+                i <= c || g != h && (i < Math.min(g, h) || i > Math.max(g, h)) || (e < f && a >= e && a < f || e > f && a < e && a >= f) && ++j
+            }
+        return -1 == j ? 1 : !!(j & 1)
+    },
+    intersects: function(a) {
+        var b = !1;
+        if ("OpenLayers.Geometry.Point" ==
+            a.CLASS_NAME) b = this.containsPoint(a);
+        else if ("OpenLayers.Geometry.LineString" == a.CLASS_NAME) b = a.intersects(this);
+        else if ("OpenLayers.Geometry.LinearRing" == a.CLASS_NAME) b = OpenLayers.Geometry.LineString.prototype.intersects.apply(this, [a]);
+        else
+            for (var c = 0, d = a.components.length; c < d && !(b = a.components[c].intersects(this)); ++c);
+        return b
+    },
+    getVertices: function(a) {
+        return !0 === a ? [] : this.components.slice(0, this.components.length - 1)
+    },
+    CLASS_NAME: "OpenLayers.Geometry.LinearRing"
+});
+OpenLayers.Geometry.Polygon = OpenLayers.Class(OpenLayers.Geometry.Collection, {
+    componentTypes: ["OpenLayers.Geometry.LinearRing"],
+    getArea: function() {
+        var a = 0;
+        if (this.components && 0 < this.components.length)
+            for (var a = a + Math.abs(this.components[0].getArea()), b = 1, c = this.components.length; b < c; b++) a -= Math.abs(this.components[b].getArea());
+        return a
+    },
+    getGeodesicArea: function(a) {
+        var b = 0;
+        if (this.components && 0 < this.components.length)
+            for (var b = b + Math.abs(this.components[0].getGeodesicArea(a)), c = 1, d = this.components.length; c <
+                d; c++) b -= Math.abs(this.components[c].getGeodesicArea(a));
+        return b
+    },
+    containsPoint: function(a) {
+        var b = this.components.length,
+            c = !1;
+        if (0 < b && (c = this.components[0].containsPoint(a), 1 !== c && c && 1 < b))
+            for (var d, e = 1; e < b; ++e)
+                if (d = this.components[e].containsPoint(a)) {
+                    c = 1 === d ? 1 : !1;
+                    break
+                }
+        return c
+    },
+    intersects: function(a) {
+        var b = !1,
+            c, d;
+        if ("OpenLayers.Geometry.Point" == a.CLASS_NAME) b = this.containsPoint(a);
+        else if ("OpenLayers.Geometry.LineString" == a.CLASS_NAME || "OpenLayers.Geometry.LinearRing" == a.CLASS_NAME) {
+            c = 0;
+            for (d =
+                this.components.length; c < d && !(b = a.intersects(this.components[c])); ++c);
+            if (!b) {
+                c = 0;
+                for (d = a.components.length; c < d && !(b = this.containsPoint(a.components[c])); ++c);
+            }
+        } else {
+            c = 0;
+            for (d = a.components.length; c < d && !(b = this.intersects(a.components[c])); ++c);
+        }
+        if (!b && "OpenLayers.Geometry.Polygon" == a.CLASS_NAME) {
+            var e = this.components[0];
+            c = 0;
+            for (d = e.components.length; c < d && !(b = a.containsPoint(e.components[c])); ++c);
+        }
+        return b
+    },
+    distanceTo: function(a, b) {
+        return b && !1 === b.edge && this.intersects(a) ? 0 : OpenLayers.Geometry.Collection.prototype.distanceTo.apply(this, [a, b])
+    },
+    CLASS_NAME: "OpenLayers.Geometry.Polygon"
+});
+OpenLayers.Geometry.Polygon.createRegularPolygon = function(a, b, c, d) {
+    var e = Math.PI * (1 / c - 0.5);
+    d && (e += d / 180 * Math.PI);
+    for (var f, g = [], h = 0; h < c; ++h) f = e + 2 * h * Math.PI / c, d = a.x + b * Math.cos(f), f = a.y + b * Math.sin(f), g.push(new OpenLayers.Geometry.Point(d, f));
+    a = new OpenLayers.Geometry.LinearRing(g);
+    return new OpenLayers.Geometry.Polygon([a])
+};
+OpenLayers.Geometry.MultiPolygon = OpenLayers.Class(OpenLayers.Geometry.Collection, {
+    componentTypes: ["OpenLayers.Geometry.Polygon"],
+    CLASS_NAME: "OpenLayers.Geometry.MultiPolygon"
+});
+OpenLayers.Format.GML = OpenLayers.Class(OpenLayers.Format.XML, {
+    featureNS: "http://mapserver.gis.umn.edu/mapserver",
+    featurePrefix: "feature",
+    featureName: "featureMember",
+    layerName: "features",
+    geometryName: "geometry",
+    collectionName: "FeatureCollection",
+    gmlns: "http://www.opengis.net/gml",
+    extractAttributes: !0,
+    xy: !0,
+    initialize: function(a) {
+        this.regExes = {
+            trimSpace: /^\s*|\s*$/g,
+            removeSpace: /\s*/g,
+            splitSpace: /\s+/,
+            trimComma: /\s*,\s*/g
+        };
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+    },
+    read: function(a) {
+        "string" ==
+        typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        for (var a = this.getElementsByTagNameNS(a.documentElement, this.gmlns, this.featureName), b = [], c = 0; c < a.length; c++) {
+            var d = this.parseFeature(a[c]);
+            d && b.push(d)
+        }
+        return b
+    },
+    parseFeature: function(a) {
+        for (var b = "MultiPolygon Polygon MultiLineString LineString MultiPoint Point Envelope".split(" "), c, d, e, f = 0; f < b.length; ++f)
+            if (c = b[f], d = this.getElementsByTagNameNS(a, this.gmlns, c), 0 < d.length) {
+                if (e = this.parseGeometry[c.toLowerCase()]) e = e.apply(this, [d[0]]), this.internalProjection && this.externalProjection && e.transform(this.externalProjection, this.internalProjection);
+                else throw new TypeError("Unsupported geometry type: " + c);
+                break
+            }
+        var g;
+        c = this.getElementsByTagNameNS(a, this.gmlns, "Box");
+        for (f = 0; f < c.length; ++f) b = c[f], d = this.parseGeometry.box.apply(this, [b]), b = b.parentNode, "boundedBy" === (b.localName || b.nodeName.split(":").pop()) ? g = d : e = d.toGeometry();
+        var h;
+        this.extractAttributes && (h = this.parseAttributes(a));
+        h = new OpenLayers.Feature.Vector(e, h);
+        h.bounds =
+            g;
+        h.gml = {
+            featureType: a.firstChild.nodeName.split(":")[1],
+            featureNS: a.firstChild.namespaceURI,
+            featureNSPrefix: a.firstChild.prefix
+        };
+        for (var a = a.firstChild, i; a && !(1 == a.nodeType && (i = a.getAttribute("fid") || a.getAttribute("id")));) a = a.nextSibling;
+        h.fid = i;
+        return h
+    },
+    parseGeometry: {
+        point: function(a) {
+            var b, c;
+            c = [];
+            b = this.getElementsByTagNameNS(a, this.gmlns, "pos");
+            0 < b.length && (c = b[0].firstChild.nodeValue, c = c.replace(this.regExes.trimSpace, ""), c = c.split(this.regExes.splitSpace));
+            0 == c.length && (b = this.getElementsByTagNameNS(a,
+                this.gmlns, "coordinates"), 0 < b.length && (c = b[0].firstChild.nodeValue, c = c.replace(this.regExes.removeSpace, ""), c = c.split(",")));
+            0 == c.length && (b = this.getElementsByTagNameNS(a, this.gmlns, "coord"), 0 < b.length && (a = this.getElementsByTagNameNS(b[0], this.gmlns, "X"), b = this.getElementsByTagNameNS(b[0], this.gmlns, "Y"), 0 < a.length && 0 < b.length && (c = [a[0].firstChild.nodeValue, b[0].firstChild.nodeValue])));
+            2 == c.length && (c[2] = null);
+            return this.xy ? new OpenLayers.Geometry.Point(c[0], c[1], c[2]) : new OpenLayers.Geometry.Point(c[1],
+                c[0], c[2])
+        },
+        multipoint: function(a) {
+            var a = this.getElementsByTagNameNS(a, this.gmlns, "Point"),
+                b = [];
+            if (0 < a.length)
+                for (var c, d = 0; d < a.length; ++d)(c = this.parseGeometry.point.apply(this, [a[d]])) && b.push(c);
+            return new OpenLayers.Geometry.MultiPoint(b)
+        },
+        linestring: function(a, b) {
+            var c, d;
+            d = [];
+            var e = [];
+            c = this.getElementsByTagNameNS(a, this.gmlns, "posList");
+            if (0 < c.length) {
+                d = this.getChildValue(c[0]);
+                d = d.replace(this.regExes.trimSpace, "");
+                d = d.split(this.regExes.splitSpace);
+                var f = parseInt(c[0].getAttribute("dimension")),
+                    g, h, i;
+                for (c = 0; c < d.length / f; ++c) g = c * f, h = d[g], i = d[g + 1], g = 2 == f ? null : d[g + 2], this.xy ? e.push(new OpenLayers.Geometry.Point(h, i, g)) : e.push(new OpenLayers.Geometry.Point(i, h, g))
+            }
+            if (0 == d.length && (c = this.getElementsByTagNameNS(a, this.gmlns, "coordinates"), 0 < c.length)) {
+                d = this.getChildValue(c[0]);
+                d = d.replace(this.regExes.trimSpace, "");
+                d = d.replace(this.regExes.trimComma, ",");
+                f = d.split(this.regExes.splitSpace);
+                for (c = 0; c < f.length; ++c) d = f[c].split(","), 2 == d.length && (d[2] = null), this.xy ? e.push(new OpenLayers.Geometry.Point(d[0],
+                    d[1], d[2])) : e.push(new OpenLayers.Geometry.Point(d[1], d[0], d[2]))
+            }
+            d = null;
+            0 != e.length && (d = b ? new OpenLayers.Geometry.LinearRing(e) : new OpenLayers.Geometry.LineString(e));
+            return d
+        },
+        multilinestring: function(a) {
+            var a = this.getElementsByTagNameNS(a, this.gmlns, "LineString"),
+                b = [];
+            if (0 < a.length)
+                for (var c, d = 0; d < a.length; ++d)(c = this.parseGeometry.linestring.apply(this, [a[d]])) && b.push(c);
+            return new OpenLayers.Geometry.MultiLineString(b)
+        },
+        polygon: function(a) {
+            var a = this.getElementsByTagNameNS(a, this.gmlns, "LinearRing"),
+                b = [];
+            if (0 < a.length)
+                for (var c, d = 0; d < a.length; ++d)(c = this.parseGeometry.linestring.apply(this, [a[d], !0])) && b.push(c);
+            return new OpenLayers.Geometry.Polygon(b)
+        },
+        multipolygon: function(a) {
+            var a = this.getElementsByTagNameNS(a, this.gmlns, "Polygon"),
+                b = [];
+            if (0 < a.length)
+                for (var c, d = 0; d < a.length; ++d)(c = this.parseGeometry.polygon.apply(this, [a[d]])) && b.push(c);
+            return new OpenLayers.Geometry.MultiPolygon(b)
+        },
+        envelope: function(a) {
+            var b = [],
+                c, d, e = this.getElementsByTagNameNS(a, this.gmlns, "lowerCorner");
+            if (0 < e.length) {
+                c = [];
+                0 < e.length && (c = e[0].firstChild.nodeValue, c = c.replace(this.regExes.trimSpace, ""), c = c.split(this.regExes.splitSpace));
+                2 == c.length && (c[2] = null);
+                var f = this.xy ? new OpenLayers.Geometry.Point(c[0], c[1], c[2]) : new OpenLayers.Geometry.Point(c[1], c[0], c[2])
+            }
+            a = this.getElementsByTagNameNS(a, this.gmlns, "upperCorner");
+            if (0 < a.length) {
+                c = [];
+                0 < a.length && (c = a[0].firstChild.nodeValue, c = c.replace(this.regExes.trimSpace, ""), c = c.split(this.regExes.splitSpace));
+                2 == c.length && (c[2] = null);
+                var g = this.xy ? new OpenLayers.Geometry.Point(c[0],
+                    c[1], c[2]) : new OpenLayers.Geometry.Point(c[1], c[0], c[2])
+            }
+            f && g && (b.push(new OpenLayers.Geometry.Point(f.x, f.y)), b.push(new OpenLayers.Geometry.Point(g.x, f.y)), b.push(new OpenLayers.Geometry.Point(g.x, g.y)), b.push(new OpenLayers.Geometry.Point(f.x, g.y)), b.push(new OpenLayers.Geometry.Point(f.x, f.y)), b = new OpenLayers.Geometry.LinearRing(b), d = new OpenLayers.Geometry.Polygon([b]));
+            return d
+        },
+        box: function(a) {
+            var b = this.getElementsByTagNameNS(a, this.gmlns, "coordinates"),
+                c = a = null;
+            0 < b.length && (b = b[0].firstChild.nodeValue,
+                b = b.split(" "), 2 == b.length && (a = b[0].split(","), c = b[1].split(",")));
+            if (null !== a && null !== c) return new OpenLayers.Bounds(parseFloat(a[0]), parseFloat(a[1]), parseFloat(c[0]), parseFloat(c[1]))
+        }
+    },
+    parseAttributes: function(a) {
+        for (var b = {}, a = a.firstChild, c, d, e; a;) {
+            if (1 == a.nodeType) {
+                a = a.childNodes;
+                for (c = 0; c < a.length; ++c)
+                    if (d = a[c], 1 == d.nodeType)
+                        if (e = d.childNodes, 1 == e.length) {
+                            if (e = e[0], 3 == e.nodeType || 4 == e.nodeType) d = d.prefix ? d.nodeName.split(":")[1] : d.nodeName, e = e.nodeValue.replace(this.regExes.trimSpace, ""),
+                                b[d] = e
+                        } else b[d.nodeName.split(":").pop()] = null;
+                break
+            }
+            a = a.nextSibling
+        }
+        return b
+    },
+    write: function(a) {
+        OpenLayers.Util.isArray(a) || (a = [a]);
+        for (var b = this.createElementNS("http://www.opengis.net/wfs", "wfs:" + this.collectionName), c = 0; c < a.length; c++) b.appendChild(this.createFeatureXML(a[c]));
+        return OpenLayers.Format.XML.prototype.write.apply(this, [b])
+    },
+    createFeatureXML: function(a) {
+        var b = this.buildGeometryNode(a.geometry),
+            c = this.createElementNS(this.featureNS, this.featurePrefix + ":" + this.geometryName);
+        c.appendChild(b);
+        var b = this.createElementNS(this.gmlns, "gml:" + this.featureName),
+            d = this.createElementNS(this.featureNS, this.featurePrefix + ":" + this.layerName);
+        d.setAttribute("fid", a.fid || a.id);
+        d.appendChild(c);
+        for (var e in a.attributes) {
+            var c = this.createTextNode(a.attributes[e]),
+                f = this.createElementNS(this.featureNS, this.featurePrefix + ":" + e.substring(e.lastIndexOf(":") + 1));
+            f.appendChild(c);
+            d.appendChild(f)
+        }
+        b.appendChild(d);
+        return b
+    },
+    buildGeometryNode: function(a) {
+        this.externalProjection && this.internalProjection && (a =
+            a.clone(), a.transform(this.internalProjection, this.externalProjection));
+        var b = a.CLASS_NAME;
+        return this.buildGeometry[b.substring(b.lastIndexOf(".") + 1).toLowerCase()].apply(this, [a])
+    },
+    buildGeometry: {
+        point: function(a) {
+            var b = this.createElementNS(this.gmlns, "gml:Point");
+            b.appendChild(this.buildCoordinatesNode(a));
+            return b
+        },
+        multipoint: function(a) {
+            for (var b = this.createElementNS(this.gmlns, "gml:MultiPoint"), a = a.components, c, d, e = 0; e < a.length; e++) c = this.createElementNS(this.gmlns, "gml:pointMember"), d = this.buildGeometry.point.apply(this, [a[e]]), c.appendChild(d), b.appendChild(c);
+            return b
+        },
+        linestring: function(a) {
+            var b = this.createElementNS(this.gmlns, "gml:LineString");
+            b.appendChild(this.buildCoordinatesNode(a));
+            return b
+        },
+        multilinestring: function(a) {
+            for (var b = this.createElementNS(this.gmlns, "gml:MultiLineString"), a = a.components, c, d, e = 0; e < a.length; ++e) c = this.createElementNS(this.gmlns, "gml:lineStringMember"), d = this.buildGeometry.linestring.apply(this, [a[e]]), c.appendChild(d), b.appendChild(c);
+            return b
+        },
+        linearring: function(a) {
+            var b = this.createElementNS(this.gmlns,
+                "gml:LinearRing");
+            b.appendChild(this.buildCoordinatesNode(a));
+            return b
+        },
+        polygon: function(a) {
+            for (var b = this.createElementNS(this.gmlns, "gml:Polygon"), a = a.components, c, d, e = 0; e < a.length; ++e) c = 0 == e ? "outerBoundaryIs" : "innerBoundaryIs", c = this.createElementNS(this.gmlns, "gml:" + c), d = this.buildGeometry.linearring.apply(this, [a[e]]), c.appendChild(d), b.appendChild(c);
+            return b
+        },
+        multipolygon: function(a) {
+            for (var b = this.createElementNS(this.gmlns, "gml:MultiPolygon"), a = a.components, c, d, e = 0; e < a.length; ++e) c = this.createElementNS(this.gmlns,
+                "gml:polygonMember"), d = this.buildGeometry.polygon.apply(this, [a[e]]), c.appendChild(d), b.appendChild(c);
+            return b
+        },
+        bounds: function(a) {
+            var b = this.createElementNS(this.gmlns, "gml:Box");
+            b.appendChild(this.buildCoordinatesNode(a));
+            return b
+        }
+    },
+    buildCoordinatesNode: function(a) {
+        var b = this.createElementNS(this.gmlns, "gml:coordinates");
+        b.setAttribute("decimal", ".");
+        b.setAttribute("cs", ",");
+        b.setAttribute("ts", " ");
+        var c = [];
+        if (a instanceof OpenLayers.Bounds) c.push(a.left + "," + a.bottom), c.push(a.right + "," + a.top);
+        else
+            for (var a = a.components ? a.components : [a], d = 0; d < a.length; d++) c.push(a[d].x + "," + a[d].y);
+        c = this.createTextNode(c.join(" "));
+        b.appendChild(c);
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Format.GML"
+});
+OpenLayers.Format.GML || (OpenLayers.Format.GML = {});
+OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        gml: "http://www.opengis.net/gml",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance",
+        wfs: "http://www.opengis.net/wfs"
+    },
+    defaultPrefix: "gml",
+    schemaLocation: null,
+    featureType: null,
+    featureNS: null,
+    geometryName: "geometry",
+    extractAttributes: !0,
+    srsName: null,
+    xy: !0,
+    geometryTypes: null,
+    singleFeatureType: null,
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g,
+        featureMember: /^(.*:)?featureMembers?$/
+    },
+    initialize: function(a) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a]);
+        this.setGeometryTypes();
+        a && a.featureNS && this.setNamespace("feature", a.featureNS);
+        this.singleFeatureType = !a || typeof a.featureType === "string"
+    },
+    read: function(a) {
+        typeof a == "string" && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        if (a && a.nodeType == 9) a = a.documentElement;
+        var b = [];
+        this.readNode(a, {
+            features: b
+        }, true);
+        if (b.length == 0) {
+            var c = this.getElementsByTagNameNS(a, this.namespaces.gml, "featureMember");
+            if (c.length)
+                for (var a =
+                        0, d = c.length; a < d; ++a) this.readNode(c[a], {
+                    features: b
+                }, true);
+            else {
+                c = this.getElementsByTagNameNS(a, this.namespaces.gml, "featureMembers");
+                c.length && this.readNode(c[0], {
+                    features: b
+                }, true)
+            }
+        }
+        return b
+    },
+    readNode: function(a, b, c) {
+        if (c === true && this.autoConfig === true) {
+            this.featureType = null;
+            delete this.namespaceAlias[this.featureNS];
+            delete this.namespaces.feature;
+            this.featureNS = null
+        }
+        if (!this.featureNS && !(a.prefix in this.namespaces) && a.parentNode.namespaceURI == this.namespaces.gml && this.regExes.featureMember.test(a.parentNode.nodeName)) {
+            this.featureType =
+                a.nodeName.split(":").pop();
+            this.setNamespace("feature", a.namespaceURI);
+            this.featureNS = a.namespaceURI;
+            this.autoConfig = true
+        }
+        return OpenLayers.Format.XML.prototype.readNode.apply(this, [a, b])
+    },
+    readers: {
+        gml: {
+            featureMember: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            featureMembers: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            name: function(a, b) {
+                b.name = this.getChildValue(a)
+            },
+            boundedBy: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                if (c.components && c.components.length > 0) b.bounds = c.components[0]
+            },
+            Point: function(a,
+                b) {
+                var c = {
+                    points: []
+                };
+                this.readChildNodes(a, c);
+                if (!b.components) b.components = [];
+                b.components.push(c.points[0])
+            },
+            coordinates: function(a, b) {
+                for (var c = this.getChildValue(a).replace(this.regExes.trimSpace, ""), c = c.replace(this.regExes.trimComma, ","), c = c.split(this.regExes.splitSpace), d, e = c.length, f = Array(e), g = 0; g < e; ++g) {
+                    d = c[g].split(",");
+                    f[g] = this.xy ? new OpenLayers.Geometry.Point(d[0], d[1], d[2]) : new OpenLayers.Geometry.Point(d[1], d[0], d[2])
+                }
+                b.points = f
+            },
+            coord: function(a, b) {
+                var c = {};
+                this.readChildNodes(a,
+                    c);
+                if (!b.points) b.points = [];
+                b.points.push(new OpenLayers.Geometry.Point(c.x, c.y, c.z))
+            },
+            X: function(a, b) {
+                b.x = this.getChildValue(a)
+            },
+            Y: function(a, b) {
+                b.y = this.getChildValue(a)
+            },
+            Z: function(a, b) {
+                b.z = this.getChildValue(a)
+            },
+            MultiPoint: function(a, b) {
+                var c = {
+                    components: []
+                };
+                this.readChildNodes(a, c);
+                b.components = [new OpenLayers.Geometry.MultiPoint(c.components)]
+            },
+            pointMember: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            LineString: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                if (!b.components) b.components = [];
+                b.components.push(new OpenLayers.Geometry.LineString(c.points))
+            },
+            MultiLineString: function(a, b) {
+                var c = {
+                    components: []
+                };
+                this.readChildNodes(a, c);
+                b.components = [new OpenLayers.Geometry.MultiLineString(c.components)]
+            },
+            lineStringMember: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Polygon: function(a, b) {
+                var c = {
+                    outer: null,
+                    inner: []
+                };
+                this.readChildNodes(a, c);
+                c.inner.unshift(c.outer);
+                if (!b.components) b.components = [];
+                b.components.push(new OpenLayers.Geometry.Polygon(c.inner))
+            },
+            LinearRing: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.components = [new OpenLayers.Geometry.LinearRing(c.points)]
+            },
+            MultiPolygon: function(a, b) {
+                var c = {
+                    components: []
+                };
+                this.readChildNodes(a, c);
+                b.components = [new OpenLayers.Geometry.MultiPolygon(c.components)]
+            },
+            polygonMember: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            GeometryCollection: function(a, b) {
+                var c = {
+                    components: []
+                };
+                this.readChildNodes(a, c);
+                b.components = [new OpenLayers.Geometry.Collection(c.components)]
+            },
+            geometryMember: function(a, b) {
+                this.readChildNodes(a, b)
+            }
+        },
+        feature: {
+            "*": function(a, b) {
+                var c, d = a.localName || a.nodeName.split(":").pop();
+                b.features ? !this.singleFeatureType &&
+                    OpenLayers.Util.indexOf(this.featureType, d) !== -1 ? c = "_typeName" : d === this.featureType && (c = "_typeName") : a.childNodes.length == 0 || a.childNodes.length == 1 && a.firstChild.nodeType == 3 ? this.extractAttributes && (c = "_attribute") : c = "_geometry";
+                c && this.readers.feature[c].apply(this, [a, b])
+            },
+            _typeName: function(a, b) {
+                var c = {
+                    components: [],
+                    attributes: {}
+                };
+                this.readChildNodes(a, c);
+                if (c.name) c.attributes.name = c.name;
+                var d = new OpenLayers.Feature.Vector(c.components[0], c.attributes);
+                if (!this.singleFeatureType) {
+                    d.type = a.nodeName.split(":").pop();
+                    d.namespace = a.namespaceURI
+                }
+                var e = a.getAttribute("fid") || this.getAttributeNS(a, this.namespaces.gml, "id");
+                if (e) d.fid = e;
+                this.internalProjection && (this.externalProjection && d.geometry) && d.geometry.transform(this.externalProjection, this.internalProjection);
+                if (c.bounds) d.bounds = c.bounds;
+                b.features.push(d)
+            },
+            _geometry: function(a, b) {
+                if (!this.geometryName) this.geometryName = a.nodeName.split(":").pop();
+                this.readChildNodes(a, b)
+            },
+            _attribute: function(a, b) {
+                var c = a.localName || a.nodeName.split(":").pop(),
+                    d = this.getChildValue(a);
+                b.attributes[c] = d
+            }
+        },
+        wfs: {
+            FeatureCollection: function(a, b) {
+                this.readChildNodes(a, b)
+            }
+        }
+    },
+    write: function(a) {
+        a = this.writeNode("gml:" + (OpenLayers.Util.isArray(a) ? "featureMembers" : "featureMember"), a);
+        this.setAttributeNS(a, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [a])
+    },
+    writers: {
+        gml: {
+            featureMember: function(a) {
+                var b = this.createElementNSPlus("gml:featureMember");
+                this.writeNode("feature:_typeName", a, b);
+                return b
+            },
+            MultiPoint: function(a) {
+                for (var b =
+                        this.createElementNSPlus("gml:MultiPoint"), a = a.components || [a], c = 0, d = a.length; c < d; ++c) this.writeNode("pointMember", a[c], b);
+                return b
+            },
+            pointMember: function(a) {
+                var b = this.createElementNSPlus("gml:pointMember");
+                this.writeNode("Point", a, b);
+                return b
+            },
+            MultiLineString: function(a) {
+                for (var b = this.createElementNSPlus("gml:MultiLineString"), a = a.components || [a], c = 0, d = a.length; c < d; ++c) this.writeNode("lineStringMember", a[c], b);
+                return b
+            },
+            lineStringMember: function(a) {
+                var b = this.createElementNSPlus("gml:lineStringMember");
+                this.writeNode("LineString", a, b);
+                return b
+            },
+            MultiPolygon: function(a) {
+                for (var b = this.createElementNSPlus("gml:MultiPolygon"), a = a.components || [a], c = 0, d = a.length; c < d; ++c) this.writeNode("polygonMember", a[c], b);
+                return b
+            },
+            polygonMember: function(a) {
+                var b = this.createElementNSPlus("gml:polygonMember");
+                this.writeNode("Polygon", a, b);
+                return b
+            },
+            GeometryCollection: function(a) {
+                for (var b = this.createElementNSPlus("gml:GeometryCollection"), c = 0, d = a.components.length; c < d; ++c) this.writeNode("geometryMember", a.components[c],
+                    b);
+                return b
+            },
+            geometryMember: function(a) {
+                var b = this.createElementNSPlus("gml:geometryMember"),
+                    a = this.writeNode("feature:_geometry", a);
+                b.appendChild(a.firstChild);
+                return b
+            }
+        },
+        feature: {
+            _typeName: function(a) {
+                var b = this.createElementNSPlus("feature:" + this.featureType, {
+                    attributes: {
+                        fid: a.fid
+                    }
+                });
+                a.geometry && this.writeNode("feature:_geometry", a.geometry, b);
+                for (var c in a.attributes) {
+                    var d = a.attributes[c];
+                    d != null && this.writeNode("feature:_attribute", {
+                        name: c,
+                        value: d
+                    }, b)
+                }
+                return b
+            },
+            _geometry: function(a) {
+                this.externalProjection &&
+                    this.internalProjection && (a = a.clone().transform(this.internalProjection, this.externalProjection));
+                var b = this.createElementNSPlus("feature:" + this.geometryName),
+                    a = this.writeNode("gml:" + this.geometryTypes[a.CLASS_NAME], a, b);
+                this.srsName && a.setAttribute("srsName", this.srsName);
+                return b
+            },
+            _attribute: function(a) {
+                return this.createElementNSPlus("feature:" + a.name, {
+                    value: a.value
+                })
+            }
+        },
+        wfs: {
+            FeatureCollection: function(a) {
+                for (var b = this.createElementNSPlus("wfs:FeatureCollection"), c = 0, d = a.length; c < d; ++c) this.writeNode("gml:featureMember",
+                    a[c], b);
+                return b
+            }
+        }
+    },
+    setGeometryTypes: function() {
+        this.geometryTypes = {
+            "OpenLayers.Geometry.Point": "Point",
+            "OpenLayers.Geometry.MultiPoint": "MultiPoint",
+            "OpenLayers.Geometry.LineString": "LineString",
+            "OpenLayers.Geometry.MultiLineString": "MultiLineString",
+            "OpenLayers.Geometry.Polygon": "Polygon",
+            "OpenLayers.Geometry.MultiPolygon": "MultiPolygon",
+            "OpenLayers.Geometry.Collection": "GeometryCollection"
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.GML.Base"
+});
+OpenLayers.Format.GML.v3 = OpenLayers.Class(OpenLayers.Format.GML.Base, {
+    schemaLocation: "http://www.opengis.net/gml http://schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/1.0.0/gmlsf.xsd",
+    curve: !1,
+    multiCurve: !0,
+    surface: !1,
+    multiSurface: !0,
+    initialize: function(a) {
+        OpenLayers.Format.GML.Base.prototype.initialize.apply(this, [a])
+    },
+    readers: {
+        gml: OpenLayers.Util.applyDefaults({
+            featureMembers: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Curve: function(a, b) {
+                var c = {
+                    points: []
+                };
+                this.readChildNodes(a, c);
+                b.components ||
+                    (b.components = []);
+                b.components.push(new OpenLayers.Geometry.LineString(c.points))
+            },
+            segments: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            LineStringSegment: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                c.points && Array.prototype.push.apply(b.points, c.points)
+            },
+            pos: function(a, b) {
+                var c = this.getChildValue(a).replace(this.regExes.trimSpace, "").split(this.regExes.splitSpace),
+                    c = this.xy ? new OpenLayers.Geometry.Point(c[0], c[1], c[2]) : new OpenLayers.Geometry.Point(c[1], c[0], c[2]);
+                b.points = [c]
+            },
+            posList: function(a,
+                b) {
+                for (var c = this.getChildValue(a).replace(this.regExes.trimSpace, "").split(this.regExes.splitSpace), d = parseInt(a.getAttribute("dimension")) || 2, e, f, g, h = Array(c.length / d), i = 0, j = c.length; i < j; i += d) e = c[i], f = c[i + 1], g = 2 == d ? void 0 : c[i + 2], h[i / d] = this.xy ? new OpenLayers.Geometry.Point(e, f, g) : new OpenLayers.Geometry.Point(f, e, g);
+                b.points = h
+            },
+            Surface: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            patches: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            PolygonPatch: function(a, b) {
+                this.readers.gml.Polygon.apply(this, [a, b])
+            },
+            exterior: function(a,
+                b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.outer = c.components[0]
+            },
+            interior: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.inner.push(c.components[0])
+            },
+            MultiCurve: function(a, b) {
+                var c = {
+                    components: []
+                };
+                this.readChildNodes(a, c);
+                0 < c.components.length && (b.components = [new OpenLayers.Geometry.MultiLineString(c.components)])
+            },
+            curveMember: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            MultiSurface: function(a, b) {
+                var c = {
+                    components: []
+                };
+                this.readChildNodes(a, c);
+                0 < c.components.length && (b.components = [new OpenLayers.Geometry.MultiPolygon(c.components)])
+            },
+            surfaceMember: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            surfaceMembers: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            pointMembers: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            lineStringMembers: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            polygonMembers: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            geometryMembers: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Envelope: function(a, b) {
+                var c = {
+                    points: Array(2)
+                };
+                this.readChildNodes(a, c);
+                b.components || (b.components = []);
+                var d = c.points[0],
+                    c = c.points[1];
+                b.components.push(new OpenLayers.Bounds(d.x,
+                    d.y, c.x, c.y))
+            },
+            lowerCorner: function(a, b) {
+                var c = {};
+                this.readers.gml.pos.apply(this, [a, c]);
+                b.points[0] = c.points[0]
+            },
+            upperCorner: function(a, b) {
+                var c = {};
+                this.readers.gml.pos.apply(this, [a, c]);
+                b.points[1] = c.points[0]
+            }
+        }, OpenLayers.Format.GML.Base.prototype.readers.gml),
+        feature: OpenLayers.Format.GML.Base.prototype.readers.feature,
+        wfs: OpenLayers.Format.GML.Base.prototype.readers.wfs
+    },
+    write: function(a) {
+        a = this.writeNode("gml:" + (OpenLayers.Util.isArray(a) ? "featureMembers" : "featureMember"), a);
+        this.setAttributeNS(a,
+            this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [a])
+    },
+    writers: {
+        gml: OpenLayers.Util.applyDefaults({
+            featureMembers: function(a) {
+                for (var b = this.createElementNSPlus("gml:featureMembers"), c = 0, d = a.length; c < d; ++c) this.writeNode("feature:_typeName", a[c], b);
+                return b
+            },
+            Point: function(a) {
+                var b = this.createElementNSPlus("gml:Point");
+                this.writeNode("pos", a, b);
+                return b
+            },
+            pos: function(a) {
+                return this.createElementNSPlus("gml:pos", {
+                    value: this.xy ? a.x +
+                        " " + a.y : a.y + " " + a.x
+                })
+            },
+            LineString: function(a) {
+                var b = this.createElementNSPlus("gml:LineString");
+                this.writeNode("posList", a.components, b);
+                return b
+            },
+            Curve: function(a) {
+                var b = this.createElementNSPlus("gml:Curve");
+                this.writeNode("segments", a, b);
+                return b
+            },
+            segments: function(a) {
+                var b = this.createElementNSPlus("gml:segments");
+                this.writeNode("LineStringSegment", a, b);
+                return b
+            },
+            LineStringSegment: function(a) {
+                var b = this.createElementNSPlus("gml:LineStringSegment");
+                this.writeNode("posList", a.components, b);
+                return b
+            },
+            posList: function(a) {
+                for (var b = a.length, c = Array(b), d, e = 0; e < b; ++e) d = a[e], c[e] = this.xy ? d.x + " " + d.y : d.y + " " + d.x;
+                return this.createElementNSPlus("gml:posList", {
+                    value: c.join(" ")
+                })
+            },
+            Surface: function(a) {
+                var b = this.createElementNSPlus("gml:Surface");
+                this.writeNode("patches", a, b);
+                return b
+            },
+            patches: function(a) {
+                var b = this.createElementNSPlus("gml:patches");
+                this.writeNode("PolygonPatch", a, b);
+                return b
+            },
+            PolygonPatch: function(a) {
+                var b = this.createElementNSPlus("gml:PolygonPatch", {
+                    attributes: {
+                        interpolation: "planar"
+                    }
+                });
+                this.writeNode("exterior", a.components[0], b);
+                for (var c = 1, d = a.components.length; c < d; ++c) this.writeNode("interior", a.components[c], b);
+                return b
+            },
+            Polygon: function(a) {
+                var b = this.createElementNSPlus("gml:Polygon");
+                this.writeNode("exterior", a.components[0], b);
+                for (var c = 1, d = a.components.length; c < d; ++c) this.writeNode("interior", a.components[c], b);
+                return b
+            },
+            exterior: function(a) {
+                var b = this.createElementNSPlus("gml:exterior");
+                this.writeNode("LinearRing", a, b);
+                return b
+            },
+            interior: function(a) {
+                var b = this.createElementNSPlus("gml:interior");
+                this.writeNode("LinearRing", a, b);
+                return b
+            },
+            LinearRing: function(a) {
+                var b = this.createElementNSPlus("gml:LinearRing");
+                this.writeNode("posList", a.components, b);
+                return b
+            },
+            MultiCurve: function(a) {
+                for (var b = this.createElementNSPlus("gml:MultiCurve"), a = a.components || [a], c = 0, d = a.length; c < d; ++c) this.writeNode("curveMember", a[c], b);
+                return b
+            },
+            curveMember: function(a) {
+                var b = this.createElementNSPlus("gml:curveMember");
+                this.curve ? this.writeNode("Curve", a, b) : this.writeNode("LineString", a, b);
+                return b
+            },
+            MultiSurface: function(a) {
+                for (var b =
+                        this.createElementNSPlus("gml:MultiSurface"), a = a.components || [a], c = 0, d = a.length; c < d; ++c) this.writeNode("surfaceMember", a[c], b);
+                return b
+            },
+            surfaceMember: function(a) {
+                var b = this.createElementNSPlus("gml:surfaceMember");
+                this.surface ? this.writeNode("Surface", a, b) : this.writeNode("Polygon", a, b);
+                return b
+            },
+            Envelope: function(a) {
+                var b = this.createElementNSPlus("gml:Envelope");
+                this.writeNode("lowerCorner", a, b);
+                this.writeNode("upperCorner", a, b);
+                this.srsName && b.setAttribute("srsName", this.srsName);
+                return b
+            },
+            lowerCorner: function(a) {
+                return this.createElementNSPlus("gml:lowerCorner", {
+                    value: this.xy ? a.left + " " + a.bottom : a.bottom + " " + a.left
+                })
+            },
+            upperCorner: function(a) {
+                return this.createElementNSPlus("gml:upperCorner", {
+                    value: this.xy ? a.right + " " + a.top : a.top + " " + a.right
+                })
+            }
+        }, OpenLayers.Format.GML.Base.prototype.writers.gml),
+        feature: OpenLayers.Format.GML.Base.prototype.writers.feature,
+        wfs: OpenLayers.Format.GML.Base.prototype.writers.wfs
+    },
+    setGeometryTypes: function() {
+        this.geometryTypes = {
+            "OpenLayers.Geometry.Point": "Point",
+            "OpenLayers.Geometry.MultiPoint": "MultiPoint",
+            "OpenLayers.Geometry.LineString": !0 ===
+                this.curve ? "Curve" : "LineString",
+            "OpenLayers.Geometry.MultiLineString": !1 === this.multiCurve ? "MultiLineString" : "MultiCurve",
+            "OpenLayers.Geometry.Polygon": !0 === this.surface ? "Surface" : "Polygon",
+            "OpenLayers.Geometry.MultiPolygon": !1 === this.multiSurface ? "MultiPolygon" : "MultiSurface",
+            "OpenLayers.Geometry.Collection": "GeometryCollection"
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.GML.v3"
+});
+OpenLayers.Format.Filter.v1_1_0 = OpenLayers.Class(OpenLayers.Format.GML.v3, OpenLayers.Format.Filter.v1, {
+    VERSION: "1.1.0",
+    schemaLocation: "http://www.opengis.net/ogc/filter/1.1.0/filter.xsd",
+    initialize: function(a) {
+        OpenLayers.Format.GML.v3.prototype.initialize.apply(this, [a])
+    },
+    readers: {
+        ogc: OpenLayers.Util.applyDefaults({
+            PropertyIsEqualTo: function(a, b) {
+                var c = a.getAttribute("matchCase"),
+                    c = new OpenLayers.Filter.Comparison({
+                        type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                        matchCase: !("false" === c || "0" === c)
+                    });
+                this.readChildNodes(a,
+                    c);
+                b.filters.push(c)
+            },
+            PropertyIsNotEqualTo: function(a, b) {
+                var c = a.getAttribute("matchCase"),
+                    c = new OpenLayers.Filter.Comparison({
+                        type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+                        matchCase: !("false" === c || "0" === c)
+                    });
+                this.readChildNodes(a, c);
+                b.filters.push(c)
+            },
+            PropertyIsLike: function(a, b) {
+                var c = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.LIKE
+                });
+                this.readChildNodes(a, c);
+                var d = a.getAttribute("wildCard"),
+                    e = a.getAttribute("singleChar"),
+                    f = a.getAttribute("escapeChar");
+                c.value2regex(d, e,
+                    f);
+                b.filters.push(c)
+            }
+        }, OpenLayers.Format.Filter.v1.prototype.readers.ogc),
+        gml: OpenLayers.Format.GML.v3.prototype.readers.gml,
+        feature: OpenLayers.Format.GML.v3.prototype.readers.feature
+    },
+    writers: {
+        ogc: OpenLayers.Util.applyDefaults({
+                PropertyIsEqualTo: function(a) {
+                    var b = this.createElementNSPlus("ogc:PropertyIsEqualTo", {
+                        attributes: {
+                            matchCase: a.matchCase
+                        }
+                    });
+                    this.writeNode("PropertyName", a, b);
+                    this.writeOgcExpression(a.value, b);
+                    return b
+                },
+                PropertyIsNotEqualTo: function(a) {
+                    var b = this.createElementNSPlus("ogc:PropertyIsNotEqualTo", {
+                        attributes: {
+                            matchCase: a.matchCase
+                        }
+                    });
+                    this.writeNode("PropertyName", a, b);
+                    this.writeOgcExpression(a.value, b);
+                    return b
+                },
+                PropertyIsLike: function(a) {
+                    var b = this.createElementNSPlus("ogc:PropertyIsLike", {
+                        attributes: {
+                            matchCase: a.matchCase,
+                            wildCard: "*",
+                            singleChar: ".",
+                            escapeChar: "!"
+                        }
+                    });
+                    this.writeNode("PropertyName", a, b);
+                    this.writeNode("Literal", a.regex2value(), b);
+                    return b
+                },
+                BBOX: function(a) {
+                    var b = this.createElementNSPlus("ogc:BBOX");
+                    a.property && this.writeNode("PropertyName", a, b);
+                    var c = this.writeNode("gml:Envelope",
+                        a.value);
+                    a.projection && c.setAttribute("srsName", a.projection);
+                    b.appendChild(c);
+                    return b
+                },
+                SortBy: function(a) {
+                    for (var b = this.createElementNSPlus("ogc:SortBy"), c = 0, d = a.length; c < d; c++) this.writeNode("ogc:SortProperty", a[c], b);
+                    return b
+                },
+                SortProperty: function(a) {
+                    var b = this.createElementNSPlus("ogc:SortProperty");
+                    this.writeNode("ogc:PropertyName", a, b);
+                    this.writeNode("ogc:SortOrder", "DESC" == a.order ? "DESC" : "ASC", b);
+                    return b
+                },
+                SortOrder: function(a) {
+                    return this.createElementNSPlus("ogc:SortOrder", {
+                        value: a
+                    })
+                }
+            },
+            OpenLayers.Format.Filter.v1.prototype.writers.ogc),
+        gml: OpenLayers.Format.GML.v3.prototype.writers.gml,
+        feature: OpenLayers.Format.GML.v3.prototype.writers.feature
+    },
+    writeSpatial: function(a, b) {
+        var c = this.createElementNSPlus("ogc:" + b);
+        this.writeNode("PropertyName", a, c);
+        if (a.value instanceof OpenLayers.Filter.Function) this.writeNode("Function", a.value, c);
+        else {
+            var d;
+            d = a.value instanceof OpenLayers.Geometry ? this.writeNode("feature:_geometry", a.value).firstChild : this.writeNode("gml:Envelope", a.value);
+            a.projection &&
+                d.setAttribute("srsName", a.projection);
+            c.appendChild(d)
+        }
+        return c
+    },
+    CLASS_NAME: "OpenLayers.Format.Filter.v1_1_0"
+});
+OpenLayers.Format.OWSCommon = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+    defaultVersion: "1.0.0",
+    getVersion: function(a) {
+        var b = this.version;
+        b || ((a = a.getAttribute("xmlns:ows")) && "1.1" === a.substring(a.lastIndexOf("/") + 1) && (b = "1.1.0"), b || (b = this.defaultVersion));
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Format.OWSCommon"
+});
+OpenLayers.Format.OWSCommon.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    read: function(a, b) {
+        OpenLayers.Util.applyDefaults(b, this.options);
+        var c = {};
+        this.readChildNodes(a, c);
+        return c
+    },
+    readers: {
+        ows: {
+            Exception: function(a, b) {
+                var c = {
+                    code: a.getAttribute("exceptionCode"),
+                    locator: a.getAttribute("locator"),
+                    texts: []
+                };
+                b.exceptions.push(c);
+                this.readChildNodes(a, c)
+            },
+            ExceptionText: function(a, b) {
+                var c = this.getChildValue(a);
+                b.texts.push(c)
+            },
+            ServiceIdentification: function(a, b) {
+                b.serviceIdentification = {};
+                this.readChildNodes(a, b.serviceIdentification)
+            },
+            Title: function(a, b) {
+                b.title = this.getChildValue(a)
+            },
+            Abstract: function(a, b) {
+                b["abstract"] = this.getChildValue(a)
+            },
+            Keywords: function(a, b) {
+                b.keywords = {};
+                this.readChildNodes(a, b.keywords)
+            },
+            Keyword: function(a, b) {
+                b[this.getChildValue(a)] = !0
+            },
+            ServiceType: function(a, b) {
+                b.serviceType = {
+                    codeSpace: a.getAttribute("codeSpace"),
+                    value: this.getChildValue(a)
+                }
+            },
+            ServiceTypeVersion: function(a, b) {
+                b.serviceTypeVersion =
+                    this.getChildValue(a)
+            },
+            Fees: function(a, b) {
+                b.fees = this.getChildValue(a)
+            },
+            AccessConstraints: function(a, b) {
+                b.accessConstraints = this.getChildValue(a)
+            },
+            ServiceProvider: function(a, b) {
+                b.serviceProvider = {};
+                this.readChildNodes(a, b.serviceProvider)
+            },
+            ProviderName: function(a, b) {
+                b.providerName = this.getChildValue(a)
+            },
+            ProviderSite: function(a, b) {
+                b.providerSite = this.getAttributeNS(a, this.namespaces.xlink, "href")
+            },
+            ServiceContact: function(a, b) {
+                b.serviceContact = {};
+                this.readChildNodes(a, b.serviceContact)
+            },
+            IndividualName: function(a,
+                b) {
+                b.individualName = this.getChildValue(a)
+            },
+            PositionName: function(a, b) {
+                b.positionName = this.getChildValue(a)
+            },
+            ContactInfo: function(a, b) {
+                b.contactInfo = {};
+                this.readChildNodes(a, b.contactInfo)
+            },
+            Phone: function(a, b) {
+                b.phone = {};
+                this.readChildNodes(a, b.phone)
+            },
+            Voice: function(a, b) {
+                b.voice = this.getChildValue(a)
+            },
+            Address: function(a, b) {
+                b.address = {};
+                this.readChildNodes(a, b.address)
+            },
+            DeliveryPoint: function(a, b) {
+                b.deliveryPoint = this.getChildValue(a)
+            },
+            City: function(a, b) {
+                b.city = this.getChildValue(a)
+            },
+            AdministrativeArea: function(a,
+                b) {
+                b.administrativeArea = this.getChildValue(a)
+            },
+            PostalCode: function(a, b) {
+                b.postalCode = this.getChildValue(a)
+            },
+            Country: function(a, b) {
+                b.country = this.getChildValue(a)
+            },
+            ElectronicMailAddress: function(a, b) {
+                b.electronicMailAddress = this.getChildValue(a)
+            },
+            Role: function(a, b) {
+                b.role = this.getChildValue(a)
+            },
+            OperationsMetadata: function(a, b) {
+                b.operationsMetadata = {};
+                this.readChildNodes(a, b.operationsMetadata)
+            },
+            Operation: function(a, b) {
+                var c = a.getAttribute("name");
+                b[c] = {};
+                this.readChildNodes(a, b[c])
+            },
+            DCP: function(a,
+                b) {
+                b.dcp = {};
+                this.readChildNodes(a, b.dcp)
+            },
+            HTTP: function(a, b) {
+                b.http = {};
+                this.readChildNodes(a, b.http)
+            },
+            Get: function(a, b) {
+                b.get || (b.get = []);
+                var c = {
+                    url: this.getAttributeNS(a, this.namespaces.xlink, "href")
+                };
+                this.readChildNodes(a, c);
+                b.get.push(c)
+            },
+            Post: function(a, b) {
+                b.post || (b.post = []);
+                var c = {
+                    url: this.getAttributeNS(a, this.namespaces.xlink, "href")
+                };
+                this.readChildNodes(a, c);
+                b.post.push(c)
+            },
+            Parameter: function(a, b) {
+                b.parameters || (b.parameters = {});
+                var c = a.getAttribute("name");
+                b.parameters[c] = {};
+                this.readChildNodes(a,
+                    b.parameters[c])
+            },
+            Constraint: function(a, b) {
+                b.constraints || (b.constraints = {});
+                var c = a.getAttribute("name");
+                b.constraints[c] = {};
+                this.readChildNodes(a, b.constraints[c])
+            },
+            Value: function(a, b) {
+                b[this.getChildValue(a)] = !0
+            },
+            OutputFormat: function(a, b) {
+                b.formats.push({
+                    value: this.getChildValue(a)
+                });
+                this.readChildNodes(a, b)
+            },
+            WGS84BoundingBox: function(a, b) {
+                var c = {};
+                c.crs = a.getAttribute("crs");
+                b.BoundingBox ? b.BoundingBox.push(c) : (b.projection = c.crs, c = b);
+                this.readChildNodes(a, c)
+            },
+            BoundingBox: function(a, b) {
+                this.readers.ows.WGS84BoundingBox.apply(this, [a, b])
+            },
+            LowerCorner: function(a, b) {
+                var c = this.getChildValue(a).replace(this.regExes.trimSpace, ""),
+                    c = c.replace(this.regExes.trimComma, ","),
+                    c = c.split(this.regExes.splitSpace);
+                b.left = c[0];
+                b.bottom = c[1]
+            },
+            UpperCorner: function(a, b) {
+                var c = this.getChildValue(a).replace(this.regExes.trimSpace, ""),
+                    c = c.replace(this.regExes.trimComma, ","),
+                    c = c.split(this.regExes.splitSpace);
+                b.right = c[0];
+                b.top = c[1];
+                b.bounds = new OpenLayers.Bounds(b.left, b.bottom, b.right, b.top);
+                delete b.left;
+                delete b.bottom;
+                delete b.right;
+                delete b.top
+            },
+            Language: function(a, b) {
+                b.language = this.getChildValue(a)
+            }
+        }
+    },
+    writers: {
+        ows: {
+            BoundingBox: function(a) {
+                var b = this.createElementNSPlus("ows:BoundingBox", {
+                    attributes: {
+                        crs: a.projection
+                    }
+                });
+                this.writeNode("ows:LowerCorner", a, b);
+                this.writeNode("ows:UpperCorner", a, b);
+                return b
+            },
+            LowerCorner: function(a) {
+                return this.createElementNSPlus("ows:LowerCorner", {
+                    value: a.bounds.left + " " + a.bounds.bottom
+                })
+            },
+            UpperCorner: function(a) {
+                return this.createElementNSPlus("ows:UpperCorner", {
+                    value: a.bounds.right + " " + a.bounds.top
+                })
+            },
+            Identifier: function(a) {
+                return this.createElementNSPlus("ows:Identifier", {
+                    value: a
+                })
+            },
+            Title: function(a) {
+                return this.createElementNSPlus("ows:Title", {
+                    value: a
+                })
+            },
+            Abstract: function(a) {
+                return this.createElementNSPlus("ows:Abstract", {
+                    value: a
+                })
+            },
+            OutputFormat: function(a) {
+                return this.createElementNSPlus("ows:OutputFormat", {
+                    value: a
+                })
+            }
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.OWSCommon.v1"
+});
+OpenLayers.Format.OWSCommon.v1_0_0 = OpenLayers.Class(OpenLayers.Format.OWSCommon.v1, {
+    namespaces: {
+        ows: "http://www.opengis.net/ows",
+        xlink: "http://www.w3.org/1999/xlink"
+    },
+    readers: {
+        ows: OpenLayers.Util.applyDefaults({
+            ExceptionReport: function(a, b) {
+                b.success = !1;
+                b.exceptionReport = {
+                    version: a.getAttribute("version"),
+                    language: a.getAttribute("language"),
+                    exceptions: []
+                };
+                this.readChildNodes(a, b.exceptionReport)
+            }
+        }, OpenLayers.Format.OWSCommon.v1.prototype.readers.ows)
+    },
+    writers: {
+        ows: OpenLayers.Format.OWSCommon.v1.prototype.writers.ows
+    },
+    CLASS_NAME: "OpenLayers.Format.OWSCommon.v1_0_0"
+});
+OpenLayers.Format.WFST.v1_1_0 = OpenLayers.Class(OpenLayers.Format.Filter.v1_1_0, OpenLayers.Format.WFST.v1, {
+    version: "1.1.0",
+    schemaLocations: {
+        wfs: "http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"
+    },
+    initialize: function(a) {
+        OpenLayers.Format.Filter.v1_1_0.prototype.initialize.apply(this, [a]);
+        OpenLayers.Format.WFST.v1.prototype.initialize.apply(this, [a])
+    },
+    readNode: function(a, b) {
+        return OpenLayers.Format.GML.v3.prototype.readNode.apply(this, [a, b])
+    },
+    readers: {
+        wfs: OpenLayers.Util.applyDefaults({
+            FeatureCollection: function(a,
+                b) {
+                b.numberOfFeatures = parseInt(a.getAttribute("numberOfFeatures"));
+                OpenLayers.Format.WFST.v1.prototype.readers.wfs.FeatureCollection.apply(this, arguments)
+            },
+            TransactionResponse: function(a, b) {
+                b.insertIds = [];
+                b.success = !1;
+                this.readChildNodes(a, b)
+            },
+            TransactionSummary: function(a, b) {
+                b.success = !0
+            },
+            InsertResults: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Feature: function(a, b) {
+                var c = {
+                    fids: []
+                };
+                this.readChildNodes(a, c);
+                b.insertIds.push(c.fids[0])
+            }
+        }, OpenLayers.Format.WFST.v1.prototype.readers.wfs),
+        gml: OpenLayers.Format.GML.v3.prototype.readers.gml,
+        feature: OpenLayers.Format.GML.v3.prototype.readers.feature,
+        ogc: OpenLayers.Format.Filter.v1_1_0.prototype.readers.ogc,
+        ows: OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers.ows
+    },
+    writers: {
+        wfs: OpenLayers.Util.applyDefaults({
+            GetFeature: function(a) {
+                var b = OpenLayers.Format.WFST.v1.prototype.writers.wfs.GetFeature.apply(this, arguments);
+                a && this.setAttributes(b, {
+                    resultType: a.resultType,
+                    startIndex: a.startIndex,
+                    count: a.count
+                });
+                return b
+            },
+            Query: function(a) {
+                var a = OpenLayers.Util.extend({
+                        featureNS: this.featureNS,
+                        featurePrefix: this.featurePrefix,
+                        featureType: this.featureType,
+                        srsName: this.srsName
+                    }, a),
+                    b = a.featurePrefix,
+                    c = this.createElementNSPlus("wfs:Query", {
+                        attributes: {
+                            typeName: (b ? b + ":" : "") + a.featureType,
+                            srsName: a.srsName
+                        }
+                    });
+                a.featureNS && c.setAttribute("xmlns:" + b, a.featureNS);
+                if (a.propertyNames)
+                    for (var b = 0, d = a.propertyNames.length; b < d; b++) this.writeNode("wfs:PropertyName", {
+                        property: a.propertyNames[b]
+                    }, c);
+                a.filter && (OpenLayers.Format.WFST.v1_1_0.prototype.setFilterProperty.call(this, a.filter), this.writeNode("ogc:Filter",
+                    a.filter, c));
+                return c
+            },
+            PropertyName: function(a) {
+                return this.createElementNSPlus("wfs:PropertyName", {
+                    value: a.property
+                })
+            }
+        }, OpenLayers.Format.WFST.v1.prototype.writers.wfs),
+        gml: OpenLayers.Format.GML.v3.prototype.writers.gml,
+        feature: OpenLayers.Format.GML.v3.prototype.writers.feature,
+        ogc: OpenLayers.Format.Filter.v1_1_0.prototype.writers.ogc
+    },
+    CLASS_NAME: "OpenLayers.Format.WFST.v1_1_0"
+});
+OpenLayers.Protocol = OpenLayers.Class({
+    format: null,
+    options: null,
+    autoDestroy: !0,
+    defaultFilter: null,
+    initialize: function(a) {
+        a = a || {};
+        OpenLayers.Util.extend(this, a);
+        this.options = a
+    },
+    mergeWithDefaultFilter: function(a) {
+        return a && this.defaultFilter ? new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.AND,
+            filters: [this.defaultFilter, a]
+        }) : a || this.defaultFilter || void 0
+    },
+    destroy: function() {
+        this.format = this.options = null
+    },
+    read: function(a) {
+        a = a || {};
+        a.filter = this.mergeWithDefaultFilter(a.filter)
+    },
+    create: function() {},
+    update: function() {},
+    "delete": function() {},
+    commit: function() {},
+    abort: function() {},
+    createCallback: function(a, b, c) {
+        return OpenLayers.Function.bind(function() {
+            a.apply(this, [b, c])
+        }, this)
+    },
+    CLASS_NAME: "OpenLayers.Protocol"
+});
+OpenLayers.Protocol.Response = OpenLayers.Class({
+    code: null,
+    requestType: null,
+    last: !0,
+    features: null,
+    data: null,
+    reqFeatures: null,
+    priv: null,
+    error: null,
+    initialize: function(a) {
+        OpenLayers.Util.extend(this, a)
+    },
+    success: function() {
+        return 0 < this.code
+    },
+    CLASS_NAME: "OpenLayers.Protocol.Response"
+});
+OpenLayers.Protocol.Response.SUCCESS = 1;
+OpenLayers.Protocol.Response.FAILURE = 0;
+OpenLayers.Format.JSON = OpenLayers.Class(OpenLayers.Format, {
+    indent: "    ",
+    space: " ",
+    newline: "\n",
+    level: 0,
+    pretty: !1,
+    nativeJSON: function() {
+        return !(!window.JSON || !("function" == typeof JSON.parse && "function" == typeof JSON.stringify))
+    }(),
+    read: function(a, b) {
+        var c;
+        if (this.nativeJSON) c = JSON.parse(a, b);
+        else try {
+            if (/^[\],:{}\s]*$/.test(a.replace(/\\["\\\/bfnrtu]/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, "")) && (c = eval("(" + a + ")"), "function" ===
+                    typeof b)) {
+                var d = function(a, c) {
+                    if (c && "object" === typeof c)
+                        for (var e in c) c.hasOwnProperty(e) && (c[e] = d(e, c[e]));
+                    return b(a, c)
+                };
+                c = d("", c)
+            }
+        } catch (e) {}
+        this.keepData && (this.data = c);
+        return c
+    },
+    write: function(a, b) {
+        this.pretty = !!b;
+        var c = null,
+            d = typeof a;
+        if (this.serialize[d]) try {
+            c = !this.pretty && this.nativeJSON ? JSON.stringify(a) : this.serialize[d].apply(this, [a])
+        } catch (e) {
+            OpenLayers.Console.error("Trouble serializing: " + e)
+        }
+        return c
+    },
+    writeIndent: function() {
+        var a = [];
+        if (this.pretty)
+            for (var b = 0; b < this.level; ++b) a.push(this.indent);
+        return a.join("")
+    },
+    writeNewline: function() {
+        return this.pretty ? this.newline : ""
+    },
+    writeSpace: function() {
+        return this.pretty ? this.space : ""
+    },
+    serialize: {
+        object: function(a) {
+            if (null == a) return "null";
+            if (a.constructor == Date) return this.serialize.date.apply(this, [a]);
+            if (a.constructor == Array) return this.serialize.array.apply(this, [a]);
+            var b = ["{"];
+            this.level += 1;
+            var c, d, e, f = !1;
+            for (c in a) a.hasOwnProperty(c) && (d = OpenLayers.Format.JSON.prototype.write.apply(this, [c, this.pretty]), e = OpenLayers.Format.JSON.prototype.write.apply(this, [a[c], this.pretty]), null != d && null != e && (f && b.push(","), b.push(this.writeNewline(), this.writeIndent(), d, ":", this.writeSpace(), e), f = !0));
+            this.level -= 1;
+            b.push(this.writeNewline(), this.writeIndent(), "}");
+            return b.join("")
+        },
+        array: function(a) {
+            var b, c = ["["];
+            this.level += 1;
+            for (var d = 0, e = a.length; d < e; ++d) b = OpenLayers.Format.JSON.prototype.write.apply(this, [a[d], this.pretty]), null != b && (0 < d && c.push(","), c.push(this.writeNewline(), this.writeIndent(), b));
+            this.level -= 1;
+            c.push(this.writeNewline(), this.writeIndent(),
+                "]");
+            return c.join("")
+        },
+        string: function(a) {
+            var b = {
+                "\u0008": "\\b",
+                "\t": "\\t",
+                "\n": "\\n",
+                "\u000c": "\\f",
+                "\r": "\\r",
+                '"': '\\"',
+                "\\": "\\\\"
+            };
+            return /["\\\x00-\x1f]/.test(a) ? '"' + a.replace(/([\x00-\x1f\\"])/g, function(a, d) {
+                var e = b[d];
+                if (e) return e;
+                e = d.charCodeAt();
+                return "\\u00" + Math.floor(e / 16).toString(16) + (e % 16).toString(16)
+            }) + '"' : '"' + a + '"'
+        },
+        number: function(a) {
+            return isFinite(a) ? "" + a : "null"
+        },
+        "boolean": function(a) {
+            return "" + a
+        },
+        date: function(a) {
+            function b(a) {
+                return 10 > a ? "0" + a : a
+            }
+            return '"' + a.getFullYear() + "-" +
+                b(a.getMonth() + 1) + "-" + b(a.getDate()) + "T" + b(a.getHours()) + ":" + b(a.getMinutes()) + ":" + b(a.getSeconds()) + '"'
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.JSON"
+});
+OpenLayers.Format.GeoJSON = OpenLayers.Class(OpenLayers.Format.JSON, {
+    ignoreExtraDims: !1,
+    read: function(a, b, c) {
+        var b = b ? b : "FeatureCollection",
+            d = null,
+            e = null;
+        if (e = "string" == typeof a ? OpenLayers.Format.JSON.prototype.read.apply(this, [a, c]) : a)
+            if ("string" != typeof e.type) OpenLayers.Console.error("Bad GeoJSON - no type: " + a);
+            else {
+                if (this.isValidType(e, b)) switch (b) {
+                    case "Geometry":
+                        try {
+                            d = this.parseGeometry(e)
+                        } catch (f) {
+                            OpenLayers.Console.error(f)
+                        }
+                        break;
+                    case "Feature":
+                        try {
+                            d = this.parseFeature(e), d.type = "Feature"
+                        } catch (g) {
+                            OpenLayers.Console.error(g)
+                        }
+                        break;
+                    case "FeatureCollection":
+                        switch (d = [], e.type) {
+                            case "Feature":
+                                try {
+                                    d.push(this.parseFeature(e))
+                                } catch (h) {
+                                    d = null, OpenLayers.Console.error(h)
+                                }
+                                break;
+                            case "FeatureCollection":
+                                a = 0;
+                                for (b = e.features.length; a < b; ++a) try {
+                                    d.push(this.parseFeature(e.features[a]))
+                                } catch (i) {
+                                    d = null, OpenLayers.Console.error(i)
+                                }
+                                break;
+                            default:
+                                try {
+                                    var j = this.parseGeometry(e);
+                                    d.push(new OpenLayers.Feature.Vector(j))
+                                } catch (k) {
+                                    d = null, OpenLayers.Console.error(k)
+                                }
+                        }
+                }
+            } else OpenLayers.Console.error("Bad JSON: " + a);
+        return d
+    },
+    isValidType: function(a,
+        b) {
+        var c = !1;
+        switch (b) {
+            case "Geometry":
+                -1 == OpenLayers.Util.indexOf("Point MultiPoint LineString MultiLineString Polygon MultiPolygon Box GeometryCollection".split(" "), a.type) ? OpenLayers.Console.error("Unsupported geometry type: " + a.type) : c = !0;
+                break;
+            case "FeatureCollection":
+                c = !0;
+                break;
+            default:
+                a.type == b ? c = !0 : OpenLayers.Console.error("Cannot convert types from " + a.type + " to " + b)
+        }
+        return c
+    },
+    parseFeature: function(a) {
+        var b, c, d;
+        c = a.properties ? a.properties : {};
+        d = a.geometry && a.geometry.bbox || a.bbox;
+        try {
+            b = this.parseGeometry(a.geometry)
+        } catch (e) {
+            throw e;
+        }
+        b = new OpenLayers.Feature.Vector(b, c);
+        d && (b.bounds = OpenLayers.Bounds.fromArray(d));
+        a.id && (b.fid = a.id);
+        return b
+    },
+    parseGeometry: function(a) {
+        if (null == a) return null;
+        var b, c = !1;
+        if ("GeometryCollection" == a.type) {
+            if (!OpenLayers.Util.isArray(a.geometries)) throw "GeometryCollection must have geometries array: " + a;
+            b = a.geometries.length;
+            for (var c = Array(b), d = 0; d < b; ++d) c[d] = this.parseGeometry.apply(this, [a.geometries[d]]);
+            b = new OpenLayers.Geometry.Collection(c);
+            c = !0
+        } else {
+            if (!OpenLayers.Util.isArray(a.coordinates)) throw "Geometry must have coordinates array: " +
+                a;
+            if (!this.parseCoords[a.type.toLowerCase()]) throw "Unsupported geometry type: " + a.type;
+            try {
+                b = this.parseCoords[a.type.toLowerCase()].apply(this, [a.coordinates])
+            } catch (e) {
+                throw e;
+            }
+        }
+        this.internalProjection && (this.externalProjection && !c) && b.transform(this.externalProjection, this.internalProjection);
+        return b
+    },
+    parseCoords: {
+        point: function(a) {
+            if (!1 == this.ignoreExtraDims && 2 != a.length) throw "Only 2D points are supported: " + a;
+            return new OpenLayers.Geometry.Point(a[0], a[1])
+        },
+        multipoint: function(a) {
+            for (var b = [],
+                    c = null, d = 0, e = a.length; d < e; ++d) {
+                try {
+                    c = this.parseCoords.point.apply(this, [a[d]])
+                } catch (f) {
+                    throw f;
+                }
+                b.push(c)
+            }
+            return new OpenLayers.Geometry.MultiPoint(b)
+        },
+        linestring: function(a) {
+            for (var b = [], c = null, d = 0, e = a.length; d < e; ++d) {
+                try {
+                    c = this.parseCoords.point.apply(this, [a[d]])
+                } catch (f) {
+                    throw f;
+                }
+                b.push(c)
+            }
+            return new OpenLayers.Geometry.LineString(b)
+        },
+        multilinestring: function(a) {
+            for (var b = [], c = null, d = 0, e = a.length; d < e; ++d) {
+                try {
+                    c = this.parseCoords.linestring.apply(this, [a[d]])
+                } catch (f) {
+                    throw f;
+                }
+                b.push(c)
+            }
+            return new OpenLayers.Geometry.MultiLineString(b)
+        },
+        polygon: function(a) {
+            for (var b = [], c, d, e = 0, f = a.length; e < f; ++e) {
+                try {
+                    d = this.parseCoords.linestring.apply(this, [a[e]])
+                } catch (g) {
+                    throw g;
+                }
+                c = new OpenLayers.Geometry.LinearRing(d.components);
+                b.push(c)
+            }
+            return new OpenLayers.Geometry.Polygon(b)
+        },
+        multipolygon: function(a) {
+            for (var b = [], c = null, d = 0, e = a.length; d < e; ++d) {
+                try {
+                    c = this.parseCoords.polygon.apply(this, [a[d]])
+                } catch (f) {
+                    throw f;
+                }
+                b.push(c)
+            }
+            return new OpenLayers.Geometry.MultiPolygon(b)
+        },
+        box: function(a) {
+            if (2 != a.length) throw "GeoJSON box coordinates must have 2 elements";
+            return new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing([new OpenLayers.Geometry.Point(a[0][0], a[0][1]), new OpenLayers.Geometry.Point(a[1][0], a[0][1]), new OpenLayers.Geometry.Point(a[1][0], a[1][1]), new OpenLayers.Geometry.Point(a[0][0], a[1][1]), new OpenLayers.Geometry.Point(a[0][0], a[0][1])])])
+        }
+    },
+    write: function(a, b) {
+        var c = {
+            type: null
+        };
+        if (OpenLayers.Util.isArray(a)) {
+            c.type = "FeatureCollection";
+            var d = a.length;
+            c.features = Array(d);
+            for (var e = 0; e < d; ++e) {
+                var f = a[e];
+                if (!f instanceof OpenLayers.Feature.Vector) throw "FeatureCollection only supports collections of features: " +
+                    f;
+                c.features[e] = this.extract.feature.apply(this, [f])
+            }
+        } else 0 == a.CLASS_NAME.indexOf("OpenLayers.Geometry") ? c = this.extract.geometry.apply(this, [a]) : a instanceof OpenLayers.Feature.Vector && (c = this.extract.feature.apply(this, [a]), a.layer && a.layer.projection && (c.crs = this.createCRSObject(a)));
+        return OpenLayers.Format.JSON.prototype.write.apply(this, [c, b])
+    },
+    createCRSObject: function(a) {
+        var a = a.layer.projection.toString(),
+            b = {};
+        a.match(/epsg:/i) && (a = parseInt(a.substring(a.indexOf(":") + 1)), b = 4326 == a ? {
+            type: "name",
+            properties: {
+                name: "urn:ogc:def:crs:OGC:1.3:CRS84"
+            }
+        } : {
+            type: "name",
+            properties: {
+                name: "EPSG:" + a
+            }
+        });
+        return b
+    },
+    extract: {
+        feature: function(a) {
+            var b = this.extract.geometry.apply(this, [a.geometry]),
+                b = {
+                    type: "Feature",
+                    properties: a.attributes,
+                    geometry: b
+                };
+            null != a.fid && (b.id = a.fid);
+            return b
+        },
+        geometry: function(a) {
+            if (null == a) return null;
+            this.internalProjection && this.externalProjection && (a = a.clone(), a.transform(this.internalProjection, this.externalProjection));
+            var b = a.CLASS_NAME.split(".")[2],
+                a = this.extract[b.toLowerCase()].apply(this, [a]);
+            return "Collection" == b ? {
+                type: "GeometryCollection",
+                geometries: a
+            } : {
+                type: b,
+                coordinates: a
+            }
+        },
+        point: function(a) {
+            return [a.x, a.y]
+        },
+        multipoint: function(a) {
+            for (var b = [], c = 0, d = a.components.length; c < d; ++c) b.push(this.extract.point.apply(this, [a.components[c]]));
+            return b
+        },
+        linestring: function(a) {
+            for (var b = [], c = 0, d = a.components.length; c < d; ++c) b.push(this.extract.point.apply(this, [a.components[c]]));
+            return b
+        },
+        multilinestring: function(a) {
+            for (var b = [], c = 0, d = a.components.length; c < d; ++c) b.push(this.extract.linestring.apply(this, [a.components[c]]));
+            return b
+        },
+        polygon: function(a) {
+            for (var b = [], c = 0, d = a.components.length; c < d; ++c) b.push(this.extract.linestring.apply(this, [a.components[c]]));
+            return b
+        },
+        multipolygon: function(a) {
+            for (var b = [], c = 0, d = a.components.length; c < d; ++c) b.push(this.extract.polygon.apply(this, [a.components[c]]));
+            return b
+        },
+        collection: function(a) {
+            for (var b = a.components.length, c = Array(b), d = 0; d < b; ++d) c[d] = this.extract.geometry.apply(this, [a.components[d]]);
+            return c
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.GeoJSON"
+});
+OpenLayers.Protocol.Script = OpenLayers.Class(OpenLayers.Protocol, {
+    url: null,
+    params: null,
+    callback: null,
+    callbackTemplate: "OpenLayers.Protocol.Script.registry.${id}",
+    callbackKey: "callback",
+    callbackPrefix: "",
+    scope: null,
+    format: null,
+    pendingRequests: null,
+    srsInBBOX: !1,
+    initialize: function(a) {
+        a = a || {};
+        this.params = {};
+        this.pendingRequests = {};
+        OpenLayers.Protocol.prototype.initialize.apply(this, arguments);
+        this.format || (this.format = new OpenLayers.Format.GeoJSON);
+        if (!this.filterToParams && OpenLayers.Format.QueryStringFilter) {
+            var b =
+                new OpenLayers.Format.QueryStringFilter({
+                    srsInBBOX: this.srsInBBOX
+                });
+            this.filterToParams = function(a, d) {
+                return b.write(a, d)
+            }
+        }
+    },
+    read: function(a) {
+        OpenLayers.Protocol.prototype.read.apply(this, arguments);
+        a = OpenLayers.Util.applyDefaults(a, this.options);
+        a.params = OpenLayers.Util.applyDefaults(a.params, this.options.params);
+        a.filter && this.filterToParams && (a.params = this.filterToParams(a.filter, a.params));
+        var b = new OpenLayers.Protocol.Response({
+                requestType: "read"
+            }),
+            c = this.createRequest(a.url, a.params, OpenLayers.Function.bind(function(c) {
+                b.data =
+                    c;
+                this.handleRead(b, a)
+            }, this));
+        b.priv = c;
+        return b
+    },
+    createRequest: function(a, b, c) {
+        var c = OpenLayers.Protocol.Script.register(c),
+            d = OpenLayers.String.format(this.callbackTemplate, {
+                id: c
+            }),
+            b = OpenLayers.Util.extend({}, b);
+        b[this.callbackKey] = this.callbackPrefix + d;
+        a = OpenLayers.Util.urlAppend(a, OpenLayers.Util.getParameterString(b));
+        b = document.createElement("script");
+        b.type = "text/javascript";
+        b.src = a;
+        b.id = "OpenLayers_Protocol_Script_" + c;
+        this.pendingRequests[b.id] = b;
+        document.getElementsByTagName("head")[0].appendChild(b);
+        return b
+    },
+    destroyRequest: function(a) {
+        OpenLayers.Protocol.Script.unregister(a.id.split("_").pop());
+        delete this.pendingRequests[a.id];
+        a.parentNode && a.parentNode.removeChild(a)
+    },
+    handleRead: function(a, b) {
+        this.handleResponse(a, b)
+    },
+    handleResponse: function(a, b) {
+        b.callback && (a.data ? (a.features = this.parseFeatures(a.data), a.code = OpenLayers.Protocol.Response.SUCCESS) : a.code = OpenLayers.Protocol.Response.FAILURE, this.destroyRequest(a.priv), b.callback.call(b.scope, a))
+    },
+    parseFeatures: function(a) {
+        return this.format.read(a)
+    },
+    abort: function(a) {
+        if (a) this.destroyRequest(a.priv);
+        else
+            for (var b in this.pendingRequests) this.destroyRequest(this.pendingRequests[b])
+    },
+    destroy: function() {
+        this.abort();
+        delete this.params;
+        delete this.format;
+        OpenLayers.Protocol.prototype.destroy.apply(this)
+    },
+    CLASS_NAME: "OpenLayers.Protocol.Script"
+});
+(function() {
+    var a = OpenLayers.Protocol.Script,
+        b = 0;
+    a.registry = {};
+    a.register = function(c) {
+        var d = "c" + ++b;
+        a.registry[d] = function() {
+            c.apply(this, arguments)
+        };
+        return d
+    };
+    a.unregister = function(b) {
+        delete a.registry[b]
+    }
+})();
+OpenLayers.Control.Panel = OpenLayers.Class(OpenLayers.Control, {
+    controls: null,
+    autoActivate: !0,
+    defaultControl: null,
+    saveState: !1,
+    allowDepress: !1,
+    activeState: null,
+    initialize: function(a) {
+        OpenLayers.Control.prototype.initialize.apply(this, [a]);
+        this.controls = [];
+        this.activeState = {}
+    },
+    destroy: function() {
+        this.map && this.map.events.unregister("buttonclick", this, this.onButtonClick);
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+        for (var a, b = this.controls.length - 1; 0 <= b; b--) a = this.controls[b], a.events &&
+            a.events.un({
+                activate: this.iconOn,
+                deactivate: this.iconOff
+            }), a.panel_div = null;
+        this.activeState = null
+    },
+    activate: function() {
+        if (OpenLayers.Control.prototype.activate.apply(this, arguments)) {
+            for (var a, b = 0, c = this.controls.length; b < c; b++) a = this.controls[b], (a === this.defaultControl || this.saveState && this.activeState[a.id]) && a.activate();
+            !0 === this.saveState && (this.defaultControl = null);
+            this.redraw();
+            return !0
+        }
+        return !1
+    },
+    deactivate: function() {
+        if (OpenLayers.Control.prototype.deactivate.apply(this, arguments)) {
+            for (var a,
+                    b = 0, c = this.controls.length; b < c; b++) a = this.controls[b], this.activeState[a.id] = a.deactivate();
+            this.redraw();
+            return !0
+        }
+        return !1
+    },
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        this.outsideViewport ? (this.events.attachToElement(this.div), this.events.register("buttonclick", this, this.onButtonClick)) : this.map.events.register("buttonclick", this, this.onButtonClick);
+        this.addControlsToMap(this.controls);
+        return this.div
+    },
+    redraw: function() {
+        for (var a = this.div.childNodes.length - 1; 0 <= a; a--) this.div.removeChild(this.div.childNodes[a]);
+        this.div.innerHTML = "";
+        if (this.active)
+            for (var a = 0, b = this.controls.length; a < b; a++) this.div.appendChild(this.controls[a].panel_div)
+    },
+    activateControl: function(a) {
+        if (!this.active) return !1;
+        if (a.type == OpenLayers.Control.TYPE_BUTTON) a.trigger();
+        else if (a.type == OpenLayers.Control.TYPE_TOGGLE) a.active ? a.deactivate() : a.activate();
+        else if (this.allowDepress && a.active) a.deactivate();
+        else {
+            for (var b, c = 0, d = this.controls.length; c < d; c++) b = this.controls[c], b != a && (b.type === OpenLayers.Control.TYPE_TOOL || null == b.type) &&
+                b.deactivate();
+            a.activate()
+        }
+    },
+    addControls: function(a) {
+        OpenLayers.Util.isArray(a) || (a = [a]);
+        this.controls = this.controls.concat(a);
+        for (var b = 0, c = a.length; b < c; b++) {
+            var d = a[b],
+                e = this.createControlMarkup(d);
+            OpenLayers.Element.addClass(e, d.displayClass + "ItemInactive");
+            OpenLayers.Element.addClass(e, "olButton");
+            "" != d.title && !e.title && (e.title = d.title);
+            d.panel_div = e
+        }
+        this.map && (this.addControlsToMap(a), this.redraw())
+    },
+    createControlMarkup: function() {
+        return document.createElement("div")
+    },
+    addControlsToMap: function(a) {
+        for (var b,
+                c = 0, d = a.length; c < d; c++) b = a[c], !0 === b.autoActivate ? (b.autoActivate = !1, this.map.addControl(b), b.autoActivate = !0) : (this.map.addControl(b), b.deactivate()), b.events.on({
+            activate: this.iconOn,
+            deactivate: this.iconOff
+        })
+    },
+    iconOn: function() {
+        var a = this.panel_div;
+        a.className = a.className.replace(RegExp("\\b(" + this.displayClass + "Item)Inactive\\b"), "$1Active")
+    },
+    iconOff: function() {
+        var a = this.panel_div;
+        a.className = a.className.replace(RegExp("\\b(" + this.displayClass + "Item)Active\\b"), "$1Inactive")
+    },
+    onButtonClick: function(a) {
+        for (var b =
+                this.controls, a = a.buttonElement, c = b.length - 1; 0 <= c; --c)
+            if (b[c].panel_div === a) {
+                this.activateControl(b[c]);
+                break
+            }
+    },
+    getControlsBy: function(a, b) {
+        var c = "function" == typeof b.test;
+        return OpenLayers.Array.filter(this.controls, function(d) {
+            return d[a] == b || c && b.test(d[a])
+        })
+    },
+    getControlsByName: function(a) {
+        return this.getControlsBy("name", a)
+    },
+    getControlsByClass: function(a) {
+        return this.getControlsBy("CLASS_NAME", a)
+    },
+    CLASS_NAME: "OpenLayers.Control.Panel"
+});
+OpenLayers.Control.ZoomIn = OpenLayers.Class(OpenLayers.Control, {
+    type: OpenLayers.Control.TYPE_BUTTON,
+    trigger: function() {
+        this.map.zoomIn()
+    },
+    CLASS_NAME: "OpenLayers.Control.ZoomIn"
+});
+OpenLayers.Control.ZoomOut = OpenLayers.Class(OpenLayers.Control, {
+    type: OpenLayers.Control.TYPE_BUTTON,
+    trigger: function() {
+        this.map.zoomOut()
+    },
+    CLASS_NAME: "OpenLayers.Control.ZoomOut"
+});
+OpenLayers.Control.ZoomToMaxExtent = OpenLayers.Class(OpenLayers.Control, {
+    type: OpenLayers.Control.TYPE_BUTTON,
+    trigger: function() {
+        this.map && this.map.zoomToMaxExtent()
+    },
+    CLASS_NAME: "OpenLayers.Control.ZoomToMaxExtent"
+});
+OpenLayers.Control.ZoomPanel = OpenLayers.Class(OpenLayers.Control.Panel, {
+    initialize: function(a) {
+        OpenLayers.Control.Panel.prototype.initialize.apply(this, [a]);
+        this.addControls([new OpenLayers.Control.ZoomIn, new OpenLayers.Control.ZoomToMaxExtent, new OpenLayers.Control.ZoomOut])
+    },
+    CLASS_NAME: "OpenLayers.Control.ZoomPanel"
+});
+OpenLayers.Layer.HTTPRequest = OpenLayers.Class(OpenLayers.Layer, {
+    URL_HASH_FACTOR: (Math.sqrt(5) - 1) / 2,
+    url: null,
+    params: null,
+    reproject: !1,
+    initialize: function(a, b, c, d) {
+        OpenLayers.Layer.prototype.initialize.apply(this, [a, d]);
+        this.url = b;
+        this.params || (this.params = OpenLayers.Util.extend({}, c))
+    },
+    destroy: function() {
+        this.params = this.url = null;
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments)
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.HTTPRequest(this.name, this.url, this.params, this.getOptions()));
+        return a = OpenLayers.Layer.prototype.clone.apply(this, [a])
+    },
+    setUrl: function(a) {
+        this.url = a
+    },
+    mergeNewParams: function(a) {
+        this.params = OpenLayers.Util.extend(this.params, a);
+        a = this.redraw();
+        null != this.map && this.map.events.triggerEvent("changelayer", {
+            layer: this,
+            property: "params"
+        });
+        return a
+    },
+    redraw: function(a) {
+        return a ? this.mergeNewParams({
+            _olSalt: Math.random()
+        }) : OpenLayers.Layer.prototype.redraw.apply(this, [])
+    },
+    selectUrl: function(a, b) {
+        for (var c = 1, d = 0, e = a.length; d < e; d++) c *= a.charCodeAt(d) * this.URL_HASH_FACTOR,
+            c -= Math.floor(c);
+        return b[Math.floor(c * b.length)]
+    },
+    getFullRequestString: function(a, b) {
+        var c = b || this.url,
+            d = OpenLayers.Util.extend({}, this.params),
+            d = OpenLayers.Util.extend(d, a),
+            e = OpenLayers.Util.getParameterString(d);
+        OpenLayers.Util.isArray(c) && (c = this.selectUrl(e, c));
+        var e = OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(c)),
+            f;
+        for (f in d) f.toUpperCase() in e && delete d[f];
+        e = OpenLayers.Util.getParameterString(d);
+        return OpenLayers.Util.urlAppend(c, e)
+    },
+    CLASS_NAME: "OpenLayers.Layer.HTTPRequest"
+});
+OpenLayers.Tile = OpenLayers.Class({
+    events: null,
+    eventListeners: null,
+    id: null,
+    layer: null,
+    url: null,
+    bounds: null,
+    size: null,
+    position: null,
+    isLoading: !1,
+    initialize: function(a, b, c, d, e, f) {
+        this.layer = a;
+        this.position = b.clone();
+        this.setBounds(c);
+        this.url = d;
+        e && (this.size = e.clone());
+        this.id = OpenLayers.Util.createUniqueID("Tile_");
+        OpenLayers.Util.extend(this, f);
+        this.events = new OpenLayers.Events(this);
+        if (this.eventListeners instanceof Object) this.events.on(this.eventListeners)
+    },
+    unload: function() {
+        this.isLoading && (this.isLoading = !1, this.events.triggerEvent("unload"))
+    },
+    destroy: function() {
+        this.position = this.size = this.bounds = this.layer = null;
+        this.eventListeners && this.events.un(this.eventListeners);
+        this.events.destroy();
+        this.events = this.eventListeners = null
+    },
+    draw: function(a) {
+        a || this.clear();
+        var b = this.shouldDraw();
+        b && !a && (b = !1 !== this.events.triggerEvent("beforedraw"));
+        return b
+    },
+    shouldDraw: function() {
+        var a = !1,
+            b = this.layer.maxExtent;
+        if (b) {
+            var c = this.layer.map,
+                c = c.baseLayer.wrapDateLine && c.getMaxExtent();
+            this.bounds.intersectsBounds(b, {
+                inclusive: !1,
+                worldBounds: c
+            }) && (a = !0)
+        }
+        return a || this.layer.displayOutsideMaxExtent
+    },
+    setBounds: function(a) {
+        a = a.clone();
+        if (this.layer.map.baseLayer.wrapDateLine) var b = this.layer.map.getMaxExtent(),
+            c = this.layer.map.getResolution(),
+            a = a.wrapDateLine(b, {
+                leftTolerance: c,
+                rightTolerance: c
+            });
+        this.bounds = a
+    },
+    moveTo: function(a, b, c) {
+        null == c && (c = !0);
+        this.setBounds(a);
+        this.position = b.clone();
+        c && this.draw()
+    },
+    clear: function() {},
+    CLASS_NAME: "OpenLayers.Tile"
+});
+OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile, {
+    url: null,
+    imgDiv: null,
+    frame: null,
+    imageReloadAttempts: null,
+    layerAlphaHack: null,
+    asyncRequestId: null,
+    blankImageUrl: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAQAIBRAA7",
+    maxGetUrlLength: null,
+    canvasContext: null,
+    crossOriginKeyword: null,
+    initialize: function(a, b, c, d, e, f) {
+        OpenLayers.Tile.prototype.initialize.apply(this, arguments);
+        this.url = d;
+        this.layerAlphaHack = this.layer.alpha && OpenLayers.Util.alphaHack();
+        if (null != this.maxGetUrlLength ||
+            this.layer.gutter || this.layerAlphaHack) this.frame = document.createElement("div"), this.frame.style.position = "absolute", this.frame.style.overflow = "hidden";
+        null != this.maxGetUrlLength && OpenLayers.Util.extend(this, OpenLayers.Tile.Image.IFrame)
+    },
+    destroy: function() {
+        this.imgDiv && (this.clear(), this.frame = this.imgDiv = null);
+        this.asyncRequestId = null;
+        OpenLayers.Tile.prototype.destroy.apply(this, arguments)
+    },
+    draw: function() {
+        var a = OpenLayers.Tile.prototype.draw.apply(this, arguments);
+        a ? (this.layer != this.layer.map.baseLayer &&
+            this.layer.reproject && (this.bounds = this.getBoundsFromBaseLayer(this.position)), this.isLoading ? this._loadEvent = "reload" : (this.isLoading = !0, this._loadEvent = "loadstart"), this.positionTile(), this.renderTile()) : this.unload();
+        return a
+    },
+    renderTile: function() {
+        this.layer.div.appendChild(this.getTile());
+        if (this.layer.async) {
+            var a = this.asyncRequestId = (this.asyncRequestId || 0) + 1;
+            this.layer.getURLasync(this.bounds, function(b) {
+                a == this.asyncRequestId && (this.url = b, this.initImage())
+            }, this)
+        } else this.url = this.layer.getURL(this.bounds),
+            this.initImage()
+    },
+    positionTile: function() {
+        var a = this.getTile().style,
+            b = this.frame ? this.size : this.layer.getImageSize(this.bounds);
+        a.left = this.position.x + "%";
+        a.top = this.position.y + "%";
+        a.width = b.w + "%";
+        a.height = b.h + "%"
+    },
+    clear: function() {
+        OpenLayers.Tile.prototype.clear.apply(this, arguments);
+        var a = this.imgDiv;
+        if (a) {
+            OpenLayers.Event.stopObservingElement(a);
+            var b = this.getTile();
+            b.parentNode === this.layer.div && this.layer.div.removeChild(b);
+            this.setImgSrc();
+            !0 === this.layerAlphaHack && (a.style.filter = "");
+            OpenLayers.Element.removeClass(a,
+                "olImageLoadError")
+        }
+        this.canvasContext = null
+    },
+    getImage: function() {
+        if (!this.imgDiv) {
+            this.imgDiv = document.createElement("img");
+            this.imgDiv.className = "olTileImage";
+            this.imgDiv.galleryImg = "no";
+            var a = this.imgDiv.style;
+            if (this.frame) {
+                var b = 0,
+                    c = 0;
+                this.layer.gutter && (b = 100 * (this.layer.gutter / this.layer.tileSize.w), c = 100 * (this.layer.gutter / this.layer.tileSize.h));
+                a.left = -b + "%";
+                a.top = -c + "%";
+                a.width = 2 * b + 100 + "%";
+                a.height = 2 * c + 100 + "%"
+            }
+            a.visibility = "hidden";
+            a.opacity = 0;
+            1 > this.layer.opacity && (a.filter = "alpha(opacity=" +
+                100 * this.layer.opacity + ")");
+            a.position = "absolute";
+            this.layerAlphaHack && (a.paddingTop = a.height, a.height = "0", a.width = "100%");
+            this.frame && this.frame.appendChild(this.imgDiv)
+        }
+        return this.imgDiv
+    },
+    initImage: function() {
+        this.events.triggerEvent(this._loadEvent);
+        var a = this.getImage();
+        if (this.url && a.getAttribute("src") == this.url) this.onImageLoad();
+        else {
+            var b = OpenLayers.Function.bind(function() {
+                OpenLayers.Event.stopObservingElement(a);
+                OpenLayers.Event.observe(a, "load", OpenLayers.Function.bind(this.onImageLoad,
+                    this));
+                OpenLayers.Event.observe(a, "error", OpenLayers.Function.bind(this.onImageError, this));
+                this.imageReloadAttempts = 0;
+                this.setImgSrc(this.url)
+            }, this);
+            a.getAttribute("src") == this.blankImageUrl ? b() : (OpenLayers.Event.observe(a, "load", b), OpenLayers.Event.observe(a, "error", b), this.crossOriginKeyword && a.removeAttribute("crossorigin"), a.src = this.blankImageUrl)
+        }
+    },
+    setImgSrc: function(a) {
+        var b = this.imgDiv;
+        b.style.visibility = "hidden";
+        b.style.opacity = 0;
+        a && (this.crossOriginKeyword && ("data:" !== a.substr(0, 5) ? b.setAttribute("crossorigin",
+            this.crossOriginKeyword) : b.removeAttribute("crossorigin")), b.src = a)
+    },
+    getTile: function() {
+        return this.frame ? this.frame : this.getImage()
+    },
+    createBackBuffer: function() {
+        if (this.imgDiv && !this.isLoading) {
+            var a;
+            this.frame ? (a = this.frame.cloneNode(!1), a.appendChild(this.imgDiv)) : a = this.imgDiv;
+            this.imgDiv = null;
+            return a
+        }
+    },
+    onImageLoad: function() {
+        var a = this.imgDiv;
+        OpenLayers.Event.stopObservingElement(a);
+        a.style.visibility = "inherit";
+        a.style.opacity = this.layer.opacity;
+        this.isLoading = !1;
+        this.canvasContext = null;
+        this.events.triggerEvent("loadend");
+        if (7 > parseFloat(navigator.appVersion.split("MSIE")[1]) && this.layer && this.layer.div) {
+            var b = document.createElement("span");
+            b.style.display = "none";
+            var c = this.layer.div;
+            c.appendChild(b);
+            window.setTimeout(function() {
+                b.parentNode === c && b.parentNode.removeChild(b)
+            }, 0)
+        }!0 === this.layerAlphaHack && (a.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + a.src + "', sizingMethod='scale')")
+    },
+    onImageError: function() {
+        var a = this.imgDiv;
+        null != a.src && (this.imageReloadAttempts++, this.imageReloadAttempts <=
+            OpenLayers.IMAGE_RELOAD_ATTEMPTS ? this.setImgSrc(this.layer.getURL(this.bounds)) : (OpenLayers.Element.addClass(a, "olImageLoadError"), this.events.triggerEvent("loaderror"), this.onImageLoad()))
+    },
+    getCanvasContext: function() {
+        if (OpenLayers.CANVAS_SUPPORTED && this.imgDiv && !this.isLoading) {
+            if (!this.canvasContext) {
+                var a = document.createElement("canvas");
+                a.width = this.size.w;
+                a.height = this.size.h;
+                this.canvasContext = a.getContext("2d");
+                this.canvasContext.drawImage(this.imgDiv, 0, 0)
+            }
+            return this.canvasContext
+        }
+    },
+    CLASS_NAME: "OpenLayers.Tile.Image"
+});
+OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
+    tileSize: null,
+    tileOriginCorner: "bl",
+    tileOrigin: null,
+    tileOptions: null,
+    tileClass: OpenLayers.Tile.Image,
+    grid: null,
+    singleTile: !1,
+    ratio: 1.5,
+    buffer: 0,
+    transitionEffect: null,
+    numLoadingTiles: 0,
+    tileLoadingDelay: 85,
+    serverResolutions: null,
+    moveTimerId: null,
+    deferMoveGriddedTiles: null,
+    tileQueueId: null,
+    tileQueue: null,
+    loading: !1,
+    backBuffer: null,
+    gridResolution: null,
+    backBufferResolution: null,
+    backBufferLonLat: null,
+    backBufferTimerId: null,
+    removeBackBufferDelay: null,
+    className: null,
+    initialize: function(a, b, c, d) {
+        OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this, arguments);
+        this.grid = [];
+        this.tileQueue = [];
+        null === this.removeBackBufferDelay && (this.removeBackBufferDelay = this.singleTile ? 0 : 2500);
+        null === this.className && (this.className = this.singleTile ? "olLayerGridSingleTile" : "olLayerGrid");
+        OpenLayers.Animation.isNative || (this.deferMoveGriddedTiles = OpenLayers.Function.bind(function() {
+            this.moveGriddedTiles(true);
+            this.moveTimerId = null
+        }, this))
+    },
+    setMap: function(a) {
+        OpenLayers.Layer.HTTPRequest.prototype.setMap.call(this,
+            a);
+        OpenLayers.Element.addClass(this.div, this.className)
+    },
+    removeMap: function() {
+        null !== this.moveTimerId && (window.clearTimeout(this.moveTimerId), this.moveTimerId = null);
+        this.clearTileQueue();
+        null !== this.backBufferTimerId && (window.clearTimeout(this.backBufferTimerId), this.backBufferTimerId = null)
+    },
+    destroy: function() {
+        this.removeBackBuffer();
+        this.clearGrid();
+        this.tileSize = this.grid = null;
+        OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments)
+    },
+    clearGrid: function() {
+        this.clearTileQueue();
+        if (this.grid) {
+            for (var a =
+                    0, b = this.grid.length; a < b; a++)
+                for (var c = this.grid[a], d = 0, e = c.length; d < e; d++) this.destroyTile(c[d]);
+            this.grid = [];
+            this.gridResolution = null
+        }
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.Grid(this.name, this.url, this.params, this.getOptions()));
+        a = OpenLayers.Layer.HTTPRequest.prototype.clone.apply(this, [a]);
+        null != this.tileSize && (a.tileSize = this.tileSize.clone());
+        a.grid = [];
+        a.gridResolution = null;
+        a.backBuffer = null;
+        a.backBufferTimerId = null;
+        a.tileQueue = [];
+        a.tileQueueId = null;
+        a.loading = !1;
+        a.moveTimerId = null;
+        return a
+    },
+    moveTo: function(a, b, c) {
+        OpenLayers.Layer.HTTPRequest.prototype.moveTo.apply(this, arguments);
+        a = a || this.map.getExtent();
+        if (null != a) {
+            var d = !this.grid.length || b,
+                e = this.getTilesBounds(),
+                f = this.map.getResolution(),
+                g = this.getServerResolution(f);
+            if (this.singleTile) {
+                if (d || !c && !e.containsBounds(a)) b && "resize" !== this.transitionEffect && this.removeBackBuffer(), (!b || "resize" === this.transitionEffect) && this.applyBackBuffer(g), this.initSingleTile(a)
+            } else(d = d || !e.intersectsBounds(a, {
+                worldBounds: this.map.baseLayer.wrapDateLine &&
+                    this.map.getMaxExtent()
+            }), f !== g ? (a = this.map.calculateBounds(null, g), d && this.transformDiv(g / f)) : (this.div.style.width = "100%", this.div.style.height = "100%", this.div.style.left = "0%", this.div.style.top = "0%"), d) ? (b && "resize" === this.transitionEffect && this.applyBackBuffer(g), this.initGriddedTiles(a)) : this.moveGriddedTiles()
+        }
+    },
+    getTileData: function(a) {
+        var b = null,
+            c = a.lon,
+            d = a.lat,
+            e = this.grid.length;
+        if (this.map && e) {
+            var f = this.map.getResolution(),
+                a = this.tileSize.w,
+                g = this.tileSize.h,
+                h = this.grid[0][0].bounds,
+                i = h.left,
+                h = h.top;
+            if (c < i && this.map.baseLayer.wrapDateLine) var j = this.map.getMaxExtent().getWidth(),
+                k = Math.ceil((i - c) / j),
+                c = c + j * k;
+            c = (c - i) / (f * a);
+            d = (h - d) / (f * g);
+            f = Math.floor(c);
+            i = Math.floor(d);
+            0 <= i && i < e && (e = this.grid[i][f]) && (b = {
+                tile: e,
+                i: Math.floor((c - f) * a),
+                j: Math.floor((d - i) * g)
+            })
+        }
+        return b
+    },
+    queueTileDraw: function(a) {
+        a = a.object;
+        ~OpenLayers.Util.indexOf(this.tileQueue, a) || this.tileQueue.push(a);
+        this.tileQueueId || (this.tileQueueId = OpenLayers.Animation.start(OpenLayers.Function.bind(this.drawTileFromQueue, this), null,
+            this.div));
+        return !1
+    },
+    drawTileFromQueue: function() {
+        0 === this.tileQueue.length ? this.clearTileQueue() : this.tileQueue.shift().draw(!0)
+    },
+    clearTileQueue: function() {
+        OpenLayers.Animation.stop(this.tileQueueId);
+        this.tileQueueId = null;
+        this.tileQueue = []
+    },
+    destroyTile: function(a) {
+        this.removeTileMonitoringHooks(a);
+        a.destroy()
+    },
+    getServerResolution: function(a) {
+        a = a || this.map.getResolution();
+        if (this.serverResolutions && -1 === OpenLayers.Util.indexOf(this.serverResolutions, a)) {
+            var b, c;
+            for (b = this.serverResolutions.length -
+                1; 0 <= b; b--)
+                if (c = this.serverResolutions[b], c > a) {
+                    a = c;
+                    break
+                }
+            if (-1 === b) throw "no appropriate resolution in serverResolutions";
+        }
+        return a
+    },
+    getServerZoom: function() {
+        var a = this.getServerResolution();
+        return this.serverResolutions ? OpenLayers.Util.indexOf(this.serverResolutions, a) : this.map.getZoomForResolution(a) + (this.zoomOffset || 0)
+    },
+    transformDiv: function(a) {
+        this.div.style.width = 100 * a + "%";
+        this.div.style.height = 100 * a + "%";
+        var b = this.map.getSize(),
+            c = parseInt(this.map.layerContainerDiv.style.left, 10),
+            d = (parseInt(this.map.layerContainerDiv.style.top,
+                10) - b.h / 2) * (a - 1);
+        this.div.style.left = (c - b.w / 2) * (a - 1) + "%";
+        this.div.style.top = d + "%"
+    },
+    getResolutionScale: function() {
+        return parseInt(this.div.style.width, 10) / 100
+    },
+    applyBackBuffer: function(a) {
+        null !== this.backBufferTimerId && this.removeBackBuffer();
+        var b = this.backBuffer;
+        if (!b) {
+            b = this.createBackBuffer();
+            if (!b) return;
+            this.div.insertBefore(b, this.div.firstChild);
+            this.backBuffer = b;
+            var c = this.grid[0][0].bounds;
+            this.backBufferLonLat = {
+                lon: c.left,
+                lat: c.top
+            };
+            this.backBufferResolution = this.gridResolution
+        }
+        var c = b.style,
+            d = this.backBufferResolution / a;
+        c.width = 100 * d + "%";
+        c.height = 100 * d + "%";
+        a = this.getViewPortPxFromLonLat(this.backBufferLonLat, a);
+        c = parseInt(this.map.layerContainerDiv.style.left, 10);
+        d = parseInt(this.map.layerContainerDiv.style.top, 10);
+        b.style.left = Math.round(a.x - c) + "%";
+        b.style.top = Math.round(a.y - d) + "%"
+    },
+    createBackBuffer: function() {
+        var a;
+        if (0 < this.grid.length) {
+            a = document.createElement("div");
+            a.id = this.div.id + "_bb";
+            a.className = "olBackBuffer";
+            a.style.position = "absolute";
+            a.style.width = "100%";
+            a.style.height =
+                "100%";
+            for (var b = 0, c = this.grid.length; b < c; b++)
+                for (var d = 0, e = this.grid[b].length; d < e; d++) {
+                    var f = this.grid[b][d].createBackBuffer();
+                    f && (f.style.top = b * this.tileSize.h + "%", f.style.left = d * this.tileSize.w + "%", a.appendChild(f))
+                }
+        }
+        return a
+    },
+    removeBackBuffer: function() {
+        this.backBuffer && (this.div.removeChild(this.backBuffer), this.backBufferResolution = this.backBuffer = null, null !== this.backBufferTimerId && (window.clearTimeout(this.backBufferTimerId), this.backBufferTimerId = null))
+    },
+    moveByPx: function() {
+        this.singleTile ||
+            this.moveGriddedTiles()
+    },
+    setTileSize: function(a) {
+        this.singleTile && (a = this.map.getSize(), a.h = parseInt(a.h * this.ratio), a.w = parseInt(a.w * this.ratio));
+        OpenLayers.Layer.HTTPRequest.prototype.setTileSize.apply(this, [a])
+    },
+    getTilesBounds: function() {
+        var a = null,
+            b = this.grid.length;
+        if (b) var a = this.grid[b - 1][0].bounds,
+            b = this.grid[0].length * a.getWidth(),
+            c = this.grid.length * a.getHeight(),
+            a = new OpenLayers.Bounds(a.left, a.bottom, a.left + b, a.bottom + c);
+        return a
+    },
+    initSingleTile: function(a) {
+        this.clearTileQueue();
+        var b =
+            a.getCenterLonLat(),
+            c = a.getWidth() * this.ratio,
+            a = a.getHeight() * this.ratio,
+            b = new OpenLayers.Bounds(b.lon - c / 2, b.lat - a / 2, b.lon + c / 2, b.lat + a / 2),
+            c = this.map.getLayerPxFromLonLat({
+                lon: b.left,
+                lat: b.top
+            });
+        this.grid.length || (this.grid[0] = []);
+        (a = this.grid[0][0]) ? a.moveTo(b, c): (a = this.addTile(b, c), this.addTileMonitoringHooks(a), a.draw(), this.grid[0][0] = a);
+        this.removeExcessTiles(1, 1);
+        this.gridResolution = this.getServerResolution()
+    },
+    calculateGridLayout: function(a, b, c) {
+        var d = c * this.tileSize.w,
+            c = c * this.tileSize.h,
+            e =
+            a.left - b.lon,
+            f = Math.floor(e / d) - this.buffer,
+            e = -(e / d - f) * this.tileSize.w,
+            f = b.lon + f * d,
+            a = a.top - (b.lat + c),
+            g = Math.ceil(a / c) + this.buffer;
+        return {
+            tilelon: d,
+            tilelat: c,
+            tileoffsetlon: f,
+            tileoffsetlat: b.lat + g * c,
+            tileoffsetx: e,
+            tileoffsety: -(g - a / c) * this.tileSize.h
+        }
+    },
+    getTileOrigin: function() {
+        var a = this.tileOrigin;
+        if (!a) var a = this.getMaxExtent(),
+            b = {
+                tl: ["left", "top"],
+                tr: ["right", "top"],
+                bl: ["left", "bottom"],
+                br: ["right", "bottom"]
+            }[this.tileOriginCorner],
+            a = new OpenLayers.LonLat(a[b[0]], a[b[1]]);
+        return a
+    },
+    initGriddedTiles: function(a) {
+        this.clearTileQueue();
+        var b = this.map.getSize(),
+            c = Math.ceil(b.h / this.tileSize.h) + Math.max(1, 2 * this.buffer),
+            b = Math.ceil(b.w / this.tileSize.w) + Math.max(1, 2 * this.buffer),
+            d = this.getTileOrigin(),
+            e = this.getServerResolution(),
+            d = this.calculateGridLayout(a, d, e),
+            e = Math.round(d.tileoffsetx),
+            f = Math.round(d.tileoffsety),
+            g = d.tileoffsetlon,
+            h = d.tileoffsetlat,
+            i = d.tilelon,
+            j = d.tilelat,
+            k = e,
+            l = g,
+            m = 0,
+            n = parseInt(this.map.layerContainerDiv.style.left),
+            o = parseInt(this.map.layerContainerDiv.style.top),
+            d = [],
+            p = this.map.getCenter();
+        do {
+            var q = this.grid[m++];
+            q || (q = [], this.grid.push(q));
+            var g = l,
+                e = k,
+                r = 0;
+            do {
+                var s = new OpenLayers.Bounds(g, h, g + i, h + j),
+                    t = e,
+                    t = t - n,
+                    u = f,
+                    u = u - o,
+                    u = new OpenLayers.Pixel(t, u);
+                (t = q[r++]) ? t.moveTo(s, u, !1): (t = this.addTile(s, u), this.addTileMonitoringHooks(t), q.push(t));
+                s = s.getCenterLonLat();
+                d.push({
+                    tile: t,
+                    distance: Math.pow(s.lon - p.lon, 2) + Math.pow(s.lat - p.lat, 2)
+                });
+                g += i;
+                e += this.tileSize.w
+            } while (g <= a.right + i * this.buffer || r < b);
+            h -= j;
+            f += this.tileSize.h
+        } while (h >= a.bottom - j * this.buffer || m < c);
+        this.removeExcessTiles(m, r);
+        this.gridResolution = this.getServerResolution();
+        d.sort(function(a, b) {
+            return a.distance - b.distance
+        });
+        a = 0;
+        for (c = d.length; a < c; ++a) d[a].tile.draw()
+    },
+    getMaxExtent: function() {
+        return this.maxExtent
+    },
+    addTile: function(a, b) {
+        var c = new this.tileClass(this, b, a, null, this.tileSize, this.tileOptions);
+        c.events.register("beforedraw", this, this.queueTileDraw);
+        return c
+    },
+    addTileMonitoringHooks: function(a) {
+        a.onLoadStart = function() {
+            !1 === this.loading && (this.loading = !0, this.events.triggerEvent("loadstart"));
+            this.events.triggerEvent("tileloadstart", {
+                tile: a
+            });
+            this.numLoadingTiles++
+        };
+        a.onLoadEnd = function() {
+            this.numLoadingTiles--;
+            this.events.triggerEvent("tileloaded", {
+                tile: a
+            });
+            0 === this.tileQueue.length && 0 === this.numLoadingTiles && (this.loading = !1, this.events.triggerEvent("loadend"), this.backBuffer && (this.backBufferTimerId = window.setTimeout(OpenLayers.Function.bind(this.removeBackBuffer, this), this.removeBackBufferDelay)))
+        };
+        a.onLoadError = function() {
+            this.events.triggerEvent("tileerror", {
+                tile: a
+            })
+        };
+        a.events.on({
+            loadstart: a.onLoadStart,
+            loadend: a.onLoadEnd,
+            unload: a.onLoadEnd,
+            loaderror: a.onLoadError,
+            scope: this
+        })
+    },
+    removeTileMonitoringHooks: function(a) {
+        a.unload();
+        a.events.un({
+            loadstart: a.onLoadStart,
+            loadend: a.onLoadEnd,
+            unload: a.onLoadEnd,
+            loaderror: a.onLoadError,
+            scope: this
+        })
+    },
+    moveGriddedTiles: function(a) {
+        if (!a && !OpenLayers.Animation.isNative) null != this.moveTimerId && window.clearTimeout(this.moveTimerId), this.moveTimerId = window.setTimeout(this.deferMoveGriddedTiles, this.tileLoadingDelay);
+        else
+            for (var a = this.buffer || 1, b = this.getResolutionScale();;) {
+                var c = this.grid[0][0].position.x * b + parseInt(this.div.style.left,
+                        10) + parseInt(this.map.layerContainerDiv.style.left),
+                    d = this.grid[0][0].position.y * b + parseInt(this.div.style.top, 10) + parseInt(this.map.layerContainerDiv.style.top),
+                    e = this.tileSize.w * b,
+                    f = this.tileSize.h * b;
+                if (c > -e * (a - 1)) this.shiftColumn(!0);
+                else if (c < -e * a) this.shiftColumn(!1);
+                else if (d > -f * (a - 1)) this.shiftRow(!0);
+                else if (d < -f * a) this.shiftRow(!1);
+                else break
+            }
+    },
+    shiftRow: function(a) {
+        for (var b = this.grid, c = b[a ? 0 : this.grid.length - 1], d = this.getServerResolution(), e = a ? -this.tileSize.h : this.tileSize.h, d = d * -e, f = a ?
+                b.pop() : b.shift(), g = 0, h = c.length; g < h; g++) {
+            var i = c[g],
+                j = i.bounds.clone(),
+                i = i.position.clone();
+            j.bottom += d;
+            j.top += d;
+            i.y += e;
+            f[g].moveTo(j, i)
+        }
+        a ? b.unshift(f) : b.push(f)
+    },
+    shiftColumn: function(a) {
+        for (var b = a ? -this.tileSize.w : this.tileSize.w, c = this.getServerResolution() * b, d = 0, e = this.grid.length; d < e; d++) {
+            var f = this.grid[d],
+                g = f[a ? 0 : f.length - 1],
+                h = g.bounds.clone(),
+                g = g.position.clone();
+            h.left += c;
+            h.right += c;
+            g.x += b;
+            var i = a ? this.grid[d].pop() : this.grid[d].shift();
+            i.moveTo(h, g);
+            a ? f.unshift(i) : f.push(i)
+        }
+    },
+    removeExcessTiles: function(a,
+        b) {
+        for (var c, d; this.grid.length > a;) {
+            var e = this.grid.pop();
+            c = 0;
+            for (d = e.length; c < d; c++) {
+                var f = e[c];
+                this.destroyTile(f)
+            }
+        }
+        c = 0;
+        for (d = this.grid.length; c < d; c++)
+            for (; this.grid[c].length > b;) e = this.grid[c], f = e.pop(), this.destroyTile(f)
+    },
+    onMapResize: function() {
+        this.singleTile && (this.clearGrid(), this.setTileSize())
+    },
+    getTileBounds: function(a) {
+        var b = this.maxExtent,
+            c = this.getResolution(),
+            d = c * this.tileSize.w,
+            c = c * this.tileSize.h,
+            e = this.getLonLatFromViewPortPx(a),
+            a = b.left + d * Math.floor((e.lon - b.left) / d),
+            b = b.bottom +
+            c * Math.floor((e.lat - b.bottom) / c);
+        return new OpenLayers.Bounds(a, b, a + d, b + c)
+    },
+    CLASS_NAME: "OpenLayers.Layer.Grid"
+});
+OpenLayers.Format.ArcXML = OpenLayers.Class(OpenLayers.Format.XML, {
+    fontStyleKeys: "antialiasing blockout font fontcolor fontsize fontstyle glowing interval outline printmode shadow transparency".split(" "),
+    request: null,
+    response: null,
+    initialize: function(a) {
+        this.request = new OpenLayers.Format.ArcXML.Request;
+        this.response = new OpenLayers.Format.ArcXML.Response;
+        if (a)
+            if ("feature" == a.requesttype) {
+                this.request.get_image = null;
+                var b = this.request.get_feature.query;
+                this.addCoordSys(b.featurecoordsys, a.featureCoordSys);
+                this.addCoordSys(b.filtercoordsys, a.filterCoordSys);
+                a.polygon ? (b.isspatial = !0, b.spatialfilter.polygon = a.polygon) : a.envelope && (b.isspatial = !0, b.spatialfilter.envelope = {
+                    minx: 0,
+                    miny: 0,
+                    maxx: 0,
+                    maxy: 0
+                }, this.parseEnvelope(b.spatialfilter.envelope, a.envelope))
+            } else "image" == a.requesttype ? (this.request.get_feature = null, b = this.request.get_image.properties, this.parseEnvelope(b.envelope, a.envelope), this.addLayers(b.layerlist, a.layers), this.addImageSize(b.imagesize, a.tileSize), this.addCoordSys(b.featurecoordsys,
+                a.featureCoordSys), this.addCoordSys(b.filtercoordsys, a.filterCoordSys)) : this.request = null;
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+    },
+    parseEnvelope: function(a, b) {
+        b && 4 == b.length && (a.minx = b[0], a.miny = b[1], a.maxx = b[2], a.maxy = b[3])
+    },
+    addLayers: function(a, b) {
+        for (var c = 0, d = b.length; c < d; c++) a.push(b[c])
+    },
+    addImageSize: function(a, b) {
+        null !== b && (a.width = b.w, a.height = b.h, a.printwidth = b.w, a.printheight = b.h)
+    },
+    addCoordSys: function(a, b) {
+        "string" == typeof b ? (a.id = parseInt(b), a.string = b) : "object" == typeof b &&
+            null !== b.proj && (a.id = b.proj.srsProjNumber, a.string = b.proj.srsCode)
+    },
+    iserror: function(a) {
+        var b = null;
+        a ? (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]), a = a.documentElement.getElementsByTagName("ERROR"), b = null !== a && 0 < a.length) : b = "" !== this.response.error;
+        return b
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        var b = null;
+        a && a.documentElement && (b = "ARCXML" == a.documentElement.nodeName ? a.documentElement : a.documentElement.getElementsByTagName("ARCXML")[0]);
+        if (!b || "parsererror" === b.firstChild.nodeName) {
+            var c, d;
+            try {
+                c = a.firstChild.nodeValue, d = a.firstChild.childNodes[1].firstChild.nodeValue
+            } catch (e) {}
+            throw {
+                message: "Error parsing the ArcXML request",
+                error: c,
+                source: d
+            };
+        }
+        return this.parseResponse(b)
+    },
+    write: function(a) {
+        a || (a = this.request);
+        var b = this.createElementNS("", "ARCXML");
+        b.setAttribute("version", "1.1");
+        var c = this.createElementNS("", "REQUEST");
+        if (null != a.get_image) {
+            var d = this.createElementNS("", "GET_IMAGE");
+            c.appendChild(d);
+            var e = this.createElementNS("",
+                "PROPERTIES");
+            d.appendChild(e);
+            a = a.get_image.properties;
+            null != a.featurecoordsys && (d = this.createElementNS("", "FEATURECOORDSYS"), e.appendChild(d), 0 === a.featurecoordsys.id ? d.setAttribute("string", a.featurecoordsys.string) : d.setAttribute("id", a.featurecoordsys.id));
+            null != a.filtercoordsys && (d = this.createElementNS("", "FILTERCOORDSYS"), e.appendChild(d), 0 === a.filtercoordsys.id ? d.setAttribute("string", a.filtercoordsys.string) : d.setAttribute("id", a.filtercoordsys.id));
+            null != a.envelope && (d = this.createElementNS("",
+                "ENVELOPE"), e.appendChild(d), d.setAttribute("minx", a.envelope.minx), d.setAttribute("miny", a.envelope.miny), d.setAttribute("maxx", a.envelope.maxx), d.setAttribute("maxy", a.envelope.maxy));
+            d = this.createElementNS("", "IMAGESIZE");
+            e.appendChild(d);
+            d.setAttribute("height", a.imagesize.height);
+            d.setAttribute("width", a.imagesize.width);
+            if (a.imagesize.height != a.imagesize.printheight || a.imagesize.width != a.imagesize.printwidth) d.setAttribute("printheight", a.imagesize.printheight), d.setArrtibute("printwidth", a.imagesize.printwidth);
+            null != a.background && (d = this.createElementNS("", "BACKGROUND"), e.appendChild(d), d.setAttribute("color", a.background.color.r + "," + a.background.color.g + "," + a.background.color.b), null !== a.background.transcolor && d.setAttribute("transcolor", a.background.transcolor.r + "," + a.background.transcolor.g + "," + a.background.transcolor.b));
+            if (null != a.layerlist && 0 < a.layerlist.length) {
+                d = this.createElementNS("", "LAYERLIST");
+                e.appendChild(d);
+                for (e = 0; e < a.layerlist.length; e++) {
+                    var f = this.createElementNS("", "LAYERDEF");
+                    d.appendChild(f);
+                    f.setAttribute("id", a.layerlist[e].id);
+                    f.setAttribute("visible", a.layerlist[e].visible);
+                    if ("object" == typeof a.layerlist[e].query) {
+                        var g = a.layerlist[e].query;
+                        if (0 > g.where.length) continue;
+                        var h = null,
+                            h = "boolean" == typeof g.spatialfilter && g.spatialfilter ? this.createElementNS("", "SPATIALQUERY") : this.createElementNS("", "QUERY");
+                        h.setAttribute("where", g.where);
+                        "number" == typeof g.accuracy && 0 < g.accuracy && h.setAttribute("accuracy", g.accuracy);
+                        "number" == typeof g.featurelimit && 2E3 > g.featurelimit && h.setAttribute("featurelimit",
+                            g.featurelimit);
+                        "string" == typeof g.subfields && "#ALL#" != g.subfields && h.setAttribute("subfields", g.subfields);
+                        "string" == typeof g.joinexpression && 0 < g.joinexpression.length && h.setAttribute("joinexpression", g.joinexpression);
+                        "string" == typeof g.jointables && 0 < g.jointables.length && h.setAttribute("jointables", g.jointables);
+                        f.appendChild(h)
+                    }
+                    "object" == typeof a.layerlist[e].renderer && this.addRenderer(f, a.layerlist[e].renderer)
+                }
+            }
+        } else if (null != a.get_feature && (d = this.createElementNS("", "GET_FEATURES"), d.setAttribute("outputmode",
+                "newxml"), d.setAttribute("checkesc", "true"), a.get_feature.geometry ? d.setAttribute("geometry", a.get_feature.geometry) : d.setAttribute("geometry", "false"), a.get_feature.compact && d.setAttribute("compact", a.get_feature.compact), "number" == a.get_feature.featurelimit && d.setAttribute("featurelimit", a.get_feature.featurelimit), d.setAttribute("globalenvelope", "true"), c.appendChild(d), null != a.get_feature.layer && 0 < a.get_feature.layer.length && (e = this.createElementNS("", "LAYER"), e.setAttribute("id", a.get_feature.layer),
+                d.appendChild(e)), a = a.get_feature.query, null != a)) e = null, e = a.isspatial ? this.createElementNS("", "SPATIALQUERY") : this.createElementNS("", "QUERY"), d.appendChild(e), "number" == typeof a.accuracy && e.setAttribute("accuracy", a.accuracy), null != a.featurecoordsys && (d = this.createElementNS("", "FEATURECOORDSYS"), 0 == a.featurecoordsys.id ? d.setAttribute("string", a.featurecoordsys.string) : d.setAttribute("id", a.featurecoordsys.id), e.appendChild(d)), null != a.filtercoordsys && (d = this.createElementNS("", "FILTERCOORDSYS"),
+            0 === a.filtercoordsys.id ? d.setAttribute("string", a.filtercoordsys.string) : d.setAttribute("id", a.filtercoordsys.id), e.appendChild(d)), 0 < a.buffer && (d = this.createElementNS("", "BUFFER"), d.setAttribute("distance", a.buffer), e.appendChild(d)), a.isspatial && (d = this.createElementNS("", "SPATIALFILTER"), d.setAttribute("relation", a.spatialfilter.relation), e.appendChild(d), a.spatialfilter.envelope ? (f = this.createElementNS("", "ENVELOPE"), f.setAttribute("minx", a.spatialfilter.envelope.minx), f.setAttribute("miny", a.spatialfilter.envelope.miny),
+            f.setAttribute("maxx", a.spatialfilter.envelope.maxx), f.setAttribute("maxy", a.spatialfilter.envelope.maxy), d.appendChild(f)) : "object" == typeof a.spatialfilter.polygon && d.appendChild(this.writePolygonGeometry(a.spatialfilter.polygon))), null != a.where && 0 < a.where.length && e.setAttribute("where", a.where);
+        b.appendChild(c);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [b])
+    },
+    addGroupRenderer: function(a, b) {
+        var c = this.createElementNS("", "GROUPRENDERER");
+        a.appendChild(c);
+        for (var d = 0; d < b.length; d++) this.addRenderer(c,
+            b[d])
+    },
+    addRenderer: function(a, b) {
+        if (OpenLayers.Util.isArray(b)) this.addGroupRenderer(a, b);
+        else {
+            var c = this.createElementNS("", b.type.toUpperCase() + "RENDERER");
+            a.appendChild(c);
+            "VALUEMAPRENDERER" == c.tagName ? this.addValueMapRenderer(c, b) : "VALUEMAPLABELRENDERER" == c.tagName ? this.addValueMapLabelRenderer(c, b) : "SIMPLELABELRENDERER" == c.tagName ? this.addSimpleLabelRenderer(c, b) : "SCALEDEPENDENTRENDERER" == c.tagName && this.addScaleDependentRenderer(c, b)
+        }
+    },
+    addScaleDependentRenderer: function(a, b) {
+        ("string" == typeof b.lower ||
+            "number" == typeof b.lower) && a.setAttribute("lower", b.lower);
+        ("string" == typeof b.upper || "number" == typeof b.upper) && a.setAttribute("upper", b.upper);
+        this.addRenderer(a, b.renderer)
+    },
+    addValueMapLabelRenderer: function(a, b) {
+        a.setAttribute("lookupfield", b.lookupfield);
+        a.setAttribute("labelfield", b.labelfield);
+        if ("object" == typeof b.exacts)
+            for (var c = 0, d = b.exacts.length; c < d; c++) {
+                var e = b.exacts[c],
+                    f = this.createElementNS("", "EXACT");
+                "string" == typeof e.value && f.setAttribute("value", e.value);
+                "string" == typeof e.label &&
+                    f.setAttribute("label", e.label);
+                "string" == typeof e.method && f.setAttribute("method", e.method);
+                a.appendChild(f);
+                if ("object" == typeof e.symbol) {
+                    var g = null;
+                    "text" == e.symbol.type && (g = this.createElementNS("", "TEXTSYMBOL"));
+                    if (null != g) {
+                        for (var h = this.fontStyleKeys, i = 0, j = h.length; i < j; i++) {
+                            var k = h[i];
+                            e.symbol[k] && g.setAttribute(k, e.symbol[k])
+                        }
+                        f.appendChild(g)
+                    }
+                }
+            }
+    },
+    addValueMapRenderer: function(a, b) {
+        a.setAttribute("lookupfield", b.lookupfield);
+        if ("object" == typeof b.ranges)
+            for (var c = 0, d = b.ranges.length; c < d; c++) {
+                var e =
+                    b.ranges[c],
+                    f = this.createElementNS("", "RANGE");
+                f.setAttribute("lower", e.lower);
+                f.setAttribute("upper", e.upper);
+                a.appendChild(f);
+                if ("object" == typeof e.symbol) {
+                    var g = null;
+                    "simplepolygon" == e.symbol.type && (g = this.createElementNS("", "SIMPLEPOLYGONSYMBOL"));
+                    null != g && ("string" == typeof e.symbol.boundarycolor && g.setAttribute("boundarycolor", e.symbol.boundarycolor), "string" == typeof e.symbol.fillcolor && g.setAttribute("fillcolor", e.symbol.fillcolor), "number" == typeof e.symbol.filltransparency && g.setAttribute("filltransparency",
+                        e.symbol.filltransparency), f.appendChild(g))
+                }
+            } else if ("object" == typeof b.exacts) {
+                c = 0;
+                for (d = b.exacts.length; c < d; c++) e = b.exacts[c], f = this.createElementNS("", "EXACT"), "string" == typeof e.value && f.setAttribute("value", e.value), "string" == typeof e.label && f.setAttribute("label", e.label), "string" == typeof e.method && f.setAttribute("method", e.method), a.appendChild(f), "object" == typeof e.symbol && (g = null, "simplemarker" == e.symbol.type && (g = this.createElementNS("", "SIMPLEMARKERSYMBOL")), null != g && ("string" == typeof e.symbol.antialiasing &&
+                    g.setAttribute("antialiasing", e.symbol.antialiasing), "string" == typeof e.symbol.color && g.setAttribute("color", e.symbol.color), "string" == typeof e.symbol.outline && g.setAttribute("outline", e.symbol.outline), "string" == typeof e.symbol.overlap && g.setAttribute("overlap", e.symbol.overlap), "string" == typeof e.symbol.shadow && g.setAttribute("shadow", e.symbol.shadow), "number" == typeof e.symbol.transparency && g.setAttribute("transparency", e.symbol.transparency), "string" == typeof e.symbol.usecentroid && g.setAttribute("usecentroid",
+                        e.symbol.usecentroid), "number" == typeof e.symbol.width && g.setAttribute("width", e.symbol.width), f.appendChild(g)))
+            }
+    },
+    addSimpleLabelRenderer: function(a, b) {
+        a.setAttribute("field", b.field);
+        for (var c = "featureweight howmanylabels labelbufferratio labelpriorities labelweight linelabelposition rotationalangles".split(" "), d = 0, e = c.length; d < e; d++) {
+            var f = c[d];
+            b[f] && a.setAttribute(f, b[f])
+        }
+        if ("text" == b.symbol.type) {
+            var g = b.symbol,
+                h = this.createElementNS("", "TEXTSYMBOL");
+            a.appendChild(h);
+            c = this.fontStyleKeys;
+            d = 0;
+            for (e = c.length; d < e; d++) f = c[d], g[f] && h.setAttribute(f, b[f])
+        }
+    },
+    writePolygonGeometry: function(a) {
+        if (!(a instanceof OpenLayers.Geometry.Polygon)) throw {
+            message: "Cannot write polygon geometry to ArcXML with an " + a.CLASS_NAME + " object.",
+            geometry: a
+        };
+        for (var b = this.createElementNS("", "POLYGON"), c = 0, d = a.components.length; c < d; c++) {
+            for (var e = a.components[c], f = this.createElementNS("", "RING"), g = 0, h = e.components.length; g < h; g++) {
+                var i = e.components[g],
+                    j = this.createElementNS("", "POINT");
+                j.setAttribute("x", i.x);
+                j.setAttribute("y",
+                    i.y);
+                f.appendChild(j)
+            }
+            b.appendChild(f)
+        }
+        return b
+    },
+    parseResponse: function(a) {
+        "string" == typeof a && (a = (new OpenLayers.Format.XML).read(a));
+        var b = new OpenLayers.Format.ArcXML.Response,
+            c = a.getElementsByTagName("ERROR");
+        if (null != c && 0 < c.length) b.error = this.getChildValue(c, "Unknown error.");
+        else {
+            c = a.getElementsByTagName("RESPONSE");
+            if (null == c || 0 == c.length) return b.error = "No RESPONSE tag found in ArcXML response.", b;
+            var d = c[0].firstChild.nodeName;
+            "#text" == d && (d = c[0].firstChild.nextSibling.nodeName);
+            if ("IMAGE" ==
+                d) c = a.getElementsByTagName("ENVELOPE"), a = a.getElementsByTagName("OUTPUT"), null == c || 0 == c.length ? b.error = "No ENVELOPE tag found in ArcXML response." : null == a || 0 == a.length ? b.error = "No OUTPUT tag found in ArcXML response." : (c = this.parseAttributes(c[0]), d = this.parseAttributes(a[0]), b.image = "string" == typeof d.type ? {
+                envelope: c,
+                output: {
+                    type: d.type,
+                    data: this.getChildValue(a[0])
+                }
+            } : {
+                envelope: c,
+                output: d
+            });
+            else if ("FEATURES" == d) {
+                if (a = c[0].getElementsByTagName("FEATURES"), c = a[0].getElementsByTagName("FEATURECOUNT"),
+                    b.features.featurecount = c[0].getAttribute("count"), 0 < b.features.featurecount) {
+                    c = a[0].getElementsByTagName("ENVELOPE");
+                    b.features.envelope = this.parseAttributes(c[0], "number");
+                    a = a[0].getElementsByTagName("FEATURE");
+                    for (c = 0; c < a.length; c++) {
+                        for (var d = new OpenLayers.Feature.Vector, e = a[c].getElementsByTagName("FIELD"), f = 0; f < e.length; f++) {
+                            var g = e[f].getAttribute("name"),
+                                h = e[f].getAttribute("value");
+                            d.attributes[g] = h
+                        }
+                        e = a[c].getElementsByTagName("POLYGON");
+                        if (0 < e.length) {
+                            e = e[0].getElementsByTagName("RING");
+                            f = [];
+                            for (g = 0; g < e.length; g++) {
+                                h = [];
+                                h.push(this.parsePointGeometry(e[g]));
+                                for (var i = e[g].getElementsByTagName("HOLE"), j = 0; j < i.length; j++) h.push(this.parsePointGeometry(i[j]));
+                                f.push(new OpenLayers.Geometry.Polygon(h))
+                            }
+                            d.geometry = 1 == f.length ? f[0] : new OpenLayers.Geometry.MultiPolygon(f)
+                        }
+                        b.features.feature.push(d)
+                    }
+                }
+            } else b.error = "Unidentified response type."
+        }
+        return b
+    },
+    parseAttributes: function(a, b) {
+        for (var c = {}, d = 0; d < a.attributes.length; d++) c[a.attributes[d].nodeName] = "number" == b ? parseFloat(a.attributes[d].nodeValue) :
+            a.attributes[d].nodeValue;
+        return c
+    },
+    parsePointGeometry: function(a) {
+        var b = [],
+            c = a.getElementsByTagName("COORDS");
+        if (0 < c.length) {
+            a = this.getChildValue(c[0]);
+            a = a.split(/;/);
+            for (c = 0; c < a.length; c++) {
+                var d = a[c].split(/ /);
+                b.push(new OpenLayers.Geometry.Point(d[0], d[1]))
+            }
+        } else if (a = a.getElementsByTagName("POINT"), 0 < a.length)
+            for (c = 0; c < a.length; c++) b.push(new OpenLayers.Geometry.Point(parseFloat(a[c].getAttribute("x")), parseFloat(a[c].getAttribute("y"))));
+        return new OpenLayers.Geometry.LinearRing(b)
+    },
+    CLASS_NAME: "OpenLayers.Format.ArcXML"
+});
+OpenLayers.Format.ArcXML.Request = OpenLayers.Class({
+    initialize: function() {
+        return OpenLayers.Util.extend(this, {
+            get_image: {
+                properties: {
+                    background: null,
+                    draw: !0,
+                    envelope: {
+                        minx: 0,
+                        miny: 0,
+                        maxx: 0,
+                        maxy: 0
+                    },
+                    featurecoordsys: {
+                        id: 0,
+                        string: "",
+                        datumtransformid: 0,
+                        datumtransformstring: ""
+                    },
+                    filtercoordsys: {
+                        id: 0,
+                        string: "",
+                        datumtransformid: 0,
+                        datumtransformstring: ""
+                    },
+                    imagesize: {
+                        height: 0,
+                        width: 0,
+                        dpi: 96,
+                        printheight: 0,
+                        printwidth: 0,
+                        scalesymbols: !1
+                    },
+                    layerlist: [],
+                    output: {
+                        baseurl: "",
+                        legendbaseurl: "",
+                        legendname: "",
+                        legendpath: "",
+                        legendurl: "",
+                        name: "",
+                        path: "",
+                        type: "jpg",
+                        url: ""
+                    }
+                }
+            },
+            get_feature: {
+                layer: "",
+                query: {
+                    isspatial: !1,
+                    featurecoordsys: {
+                        id: 0,
+                        string: "",
+                        datumtransformid: 0,
+                        datumtransformstring: ""
+                    },
+                    filtercoordsys: {
+                        id: 0,
+                        string: "",
+                        datumtransformid: 0,
+                        datumtransformstring: ""
+                    },
+                    buffer: 0,
+                    where: "",
+                    spatialfilter: {
+                        relation: "envelope_intersection",
+                        envelope: null
+                    }
+                }
+            },
+            environment: {
+                separators: {
+                    cs: " ",
+                    ts: ";"
+                }
+            },
+            layer: [],
+            workspaces: []
+        })
+    },
+    CLASS_NAME: "OpenLayers.Format.ArcXML.Request"
+});
+OpenLayers.Format.ArcXML.Response = OpenLayers.Class({
+    initialize: function() {
+        return OpenLayers.Util.extend(this, {
+            image: {
+                envelope: null,
+                output: ""
+            },
+            features: {
+                featurecount: 0,
+                envelope: null,
+                feature: []
+            },
+            error: ""
+        })
+    },
+    CLASS_NAME: "OpenLayers.Format.ArcXML.Response"
+});
+OpenLayers.ProxyHost = "";
+OpenLayers.Request = {
+    DEFAULT_CONFIG: {
+        method: "GET",
+        url: window.location.href,
+        async: !0,
+        user: void 0,
+        password: void 0,
+        params: null,
+        proxy: OpenLayers.ProxyHost,
+        headers: {},
+        data: null,
+        callback: function() {},
+        success: null,
+        failure: null,
+        scope: null
+    },
+    URL_SPLIT_REGEX: /([^:]*:)\/\/([^:]*:?[^@]*@)?([^:\/\?]*):?([^\/\?]*)/,
+    events: new OpenLayers.Events(this),
+    makeSameOrigin: function(a, b) {
+        var c = 0 !== a.indexOf("http"),
+            d = !c && a.match(this.URL_SPLIT_REGEX);
+        if (d) {
+            var e = window.location,
+                c = d[1] == e.protocol && d[3] == e.hostname,
+                d = d[4],
+                e = e.port;
+            if (80 != d && "" != d || "80" != e && "" != e) c = c && d == e
+        }
+        c || (b ? a = "function" == typeof b ? b(a) : b + encodeURIComponent(a) : OpenLayers.Console.warn(OpenLayers.i18n("proxyNeeded"), {
+            url: a
+        }));
+        return a
+    },
+    issue: function(a) {
+        var b = OpenLayers.Util.extend(this.DEFAULT_CONFIG, {
+                proxy: OpenLayers.ProxyHost
+            }),
+            a = OpenLayers.Util.applyDefaults(a, b),
+            b = !1,
+            c;
+        for (c in a.headers) a.headers.hasOwnProperty(c) && "x-requested-with" === c.toLowerCase() && (b = !0);
+        !1 === b && (a.headers["X-Requested-With"] = "XMLHttpRequest");
+        var d = new OpenLayers.Request.XMLHttpRequest,
+            e = OpenLayers.Util.urlAppend(a.url, OpenLayers.Util.getParameterString(a.params || {})),
+            e = OpenLayers.Request.makeSameOrigin(e, a.proxy);
+        d.open(a.method, e, a.async, a.user, a.password);
+        for (var f in a.headers) d.setRequestHeader(f, a.headers[f]);
+        var g = this.events,
+            h = this;
+        d.onreadystatechange = function() {
+            d.readyState == OpenLayers.Request.XMLHttpRequest.DONE && !1 !== g.triggerEvent("complete", {
+                request: d,
+                config: a,
+                requestUrl: e
+            }) && h.runCallbacks({
+                request: d,
+                config: a,
+                requestUrl: e
+            })
+        };
+        !1 === a.async ? d.send(a.data) : window.setTimeout(function() {
+            0 !==
+                d.readyState && d.send(a.data)
+        }, 0);
+        return d
+    },
+    runCallbacks: function(a) {
+        var b = a.request,
+            c = a.config,
+            d = c.scope ? OpenLayers.Function.bind(c.callback, c.scope) : c.callback,
+            e;
+        c.success && (e = c.scope ? OpenLayers.Function.bind(c.success, c.scope) : c.success);
+        var f;
+        c.failure && (f = c.scope ? OpenLayers.Function.bind(c.failure, c.scope) : c.failure);
+        "file:" == OpenLayers.Util.createUrlObject(c.url).protocol && b.responseText && (b.status = 200);
+        d(b);
+        if (!b.status || 200 <= b.status && 300 > b.status) this.events.triggerEvent("success", a), e && e(b);
+        if (b.status && (200 > b.status || 300 <= b.status)) this.events.triggerEvent("failure", a), f && f(b)
+    },
+    GET: function(a) {
+        a = OpenLayers.Util.extend(a, {
+            method: "GET"
+        });
+        return OpenLayers.Request.issue(a)
+    },
+    POST: function(a) {
+        a = OpenLayers.Util.extend(a, {
+            method: "POST"
+        });
+        a.headers = a.headers ? a.headers : {};
+        "CONTENT-TYPE" in OpenLayers.Util.upperCaseObject(a.headers) || (a.headers["Content-Type"] = "application/xml");
+        return OpenLayers.Request.issue(a)
+    },
+    PUT: function(a) {
+        a = OpenLayers.Util.extend(a, {
+            method: "PUT"
+        });
+        a.headers = a.headers ?
+            a.headers : {};
+        "CONTENT-TYPE" in OpenLayers.Util.upperCaseObject(a.headers) || (a.headers["Content-Type"] = "application/xml");
+        return OpenLayers.Request.issue(a)
+    },
+    DELETE: function(a) {
+        a = OpenLayers.Util.extend(a, {
+            method: "DELETE"
+        });
+        return OpenLayers.Request.issue(a)
+    },
+    HEAD: function(a) {
+        a = OpenLayers.Util.extend(a, {
+            method: "HEAD"
+        });
+        return OpenLayers.Request.issue(a)
+    },
+    OPTIONS: function(a) {
+        a = OpenLayers.Util.extend(a, {
+            method: "OPTIONS"
+        });
+        return OpenLayers.Request.issue(a)
+    }
+};
+OpenLayers.Layer.ArcIMS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    DEFAULT_PARAMS: {
+        ClientVersion: "9.2",
+        ServiceName: ""
+    },
+    featureCoordSys: "4326",
+    filterCoordSys: "4326",
+    layers: null,
+    async: !0,
+    name: "ArcIMS",
+    isBaseLayer: !0,
+    DEFAULT_OPTIONS: {
+        tileSize: new OpenLayers.Size(512, 512),
+        featureCoordSys: "4326",
+        filterCoordSys: "4326",
+        layers: null,
+        isBaseLayer: !0,
+        async: !0,
+        name: "ArcIMS"
+    },
+    initialize: function(a, b, c) {
+        this.tileSize = new OpenLayers.Size(512, 512);
+        this.params = OpenLayers.Util.applyDefaults({
+                ServiceName: c.serviceName
+            },
+            this.DEFAULT_PARAMS);
+        this.options = OpenLayers.Util.applyDefaults(c, this.DEFAULT_OPTIONS);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a, b, this.params, c]);
+        if (this.transparent && (this.isBaseLayer || (this.isBaseLayer = !1), "image/jpeg" == this.format)) this.format = OpenLayers.Util.alphaHack() ? "image/gif" : "image/png";
+        null === this.options.layers && (this.options.layers = [])
+    },
+    getURL: function(a) {
+        var b = "",
+            a = this.adjustBounds(a),
+            a = new OpenLayers.Format.ArcXML(OpenLayers.Util.extend(this.options, {
+                requesttype: "image",
+                envelope: a.toArray(),
+                tileSize: this.tileSize
+            })),
+            a = new OpenLayers.Request.POST({
+                url: this.getFullRequestString(),
+                data: a.write(),
+                async: !1
+            });
+        if (null != a) {
+            b = a.responseXML;
+            if (!b || !b.documentElement) b = a.responseText;
+            b = this.getUrlOrImage((new OpenLayers.Format.ArcXML).read(b).image.output)
+        }
+        return b
+    },
+    getURLasync: function(a, b, c) {
+        a = this.adjustBounds(a);
+        a = new OpenLayers.Format.ArcXML(OpenLayers.Util.extend(this.options, {
+            requesttype: "image",
+            envelope: a.toArray(),
+            tileSize: this.tileSize
+        }));
+        OpenLayers.Request.POST({
+            url: this.getFullRequestString(),
+            async: !0,
+            data: a.write(),
+            callback: function(a) {
+                var e = a.responseXML;
+                if (!e || !e.documentElement) e = a.responseText;
+                a = (new OpenLayers.Format.ArcXML).read(e);
+                b.call(c, this.getUrlOrImage(a.image.output))
+            },
+            scope: this
+        })
+    },
+    getUrlOrImage: function(a) {
+        var b = "";
+        a.url ? b = a.url : a.data && (b = "data:image/" + a.type + ";base64," + a.data);
+        return b
+    },
+    setLayerQuery: function(a, b) {
+        for (var c = 0; c < this.options.layers.length; c++)
+            if (a == this.options.layers[c].id) {
+                this.options.layers[c].query = b;
+                return
+            }
+        this.options.layers.push({
+            id: a,
+            visible: !0,
+            query: b
+        })
+    },
+    getFeatureInfo: function(a, b, c) {
+        var d = c.buffer || 1,
+            e = c.callback || function() {},
+            f = c.scope || window,
+            g = {};
+        OpenLayers.Util.extend(g, this.options);
+        g.requesttype = "feature";
+        a instanceof OpenLayers.LonLat ? (g.polygon = null, g.envelope = [a.lon - d, a.lat - d, a.lon + d, a.lat + d]) : a instanceof OpenLayers.Geometry.Polygon && (g.envelope = null, g.polygon = a);
+        var h = new OpenLayers.Format.ArcXML(g);
+        OpenLayers.Util.extend(h.request.get_feature, c);
+        h.request.get_feature.layer = b.id;
+        "number" == typeof b.query.accuracy ? h.request.get_feature.query.accuracy =
+            b.query.accuracy : (a = this.map.getCenter(), c = this.map.getViewPortPxFromLonLat(a), c.x++, c = this.map.getLonLatFromPixel(c), h.request.get_feature.query.accuracy = c.lon - a.lon);
+        h.request.get_feature.query.where = b.query.where;
+        h.request.get_feature.query.spatialfilter.relation = "area_intersection";
+        OpenLayers.Request.POST({
+            url: this.getFullRequestString({
+                CustomService: "Query"
+            }),
+            data: h.write(),
+            callback: function(a) {
+                a = h.parseResponse(a.responseText);
+                h.iserror() ? e.call(f, null) : e.call(f, a.features)
+            }
+        })
+    },
+    clone: function(a) {
+        null ==
+            a && (a = new OpenLayers.Layer.ArcIMS(this.name, this.url, this.getOptions()));
+        return a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+    },
+    CLASS_NAME: "OpenLayers.Layer.ArcIMS"
+});
+OpenLayers.Format.OWSCommon.v1_1_0 = OpenLayers.Class(OpenLayers.Format.OWSCommon.v1, {
+    namespaces: {
+        ows: "http://www.opengis.net/ows/1.1",
+        xlink: "http://www.w3.org/1999/xlink"
+    },
+    readers: {
+        ows: OpenLayers.Util.applyDefaults({
+            ExceptionReport: function(a, b) {
+                b.exceptionReport = {
+                    version: a.getAttribute("version"),
+                    language: a.getAttribute("xml:lang"),
+                    exceptions: []
+                };
+                this.readChildNodes(a, b.exceptionReport)
+            },
+            AllowedValues: function(a, b) {
+                b.allowedValues = {};
+                this.readChildNodes(a, b.allowedValues)
+            },
+            AnyValue: function(a, b) {
+                b.anyValue = !0
+            },
+            DataType: function(a, b) {
+                b.dataType = this.getChildValue(a)
+            },
+            Range: function(a, b) {
+                b.range = {};
+                this.readChildNodes(a, b.range)
+            },
+            MinimumValue: function(a, b) {
+                b.minValue = this.getChildValue(a)
+            },
+            MaximumValue: function(a, b) {
+                b.maxValue = this.getChildValue(a)
+            },
+            Identifier: function(a, b) {
+                b.identifier = this.getChildValue(a)
+            },
+            SupportedCRS: function(a, b) {
+                b.supportedCRS = this.getChildValue(a)
+            }
+        }, OpenLayers.Format.OWSCommon.v1.prototype.readers.ows)
+    },
+    writers: {
+        ows: OpenLayers.Util.applyDefaults({
+            Range: function(a) {
+                var b = this.createElementNSPlus("ows:Range", {
+                    attributes: {
+                        "ows:rangeClosure": a.closure
+                    }
+                });
+                this.writeNode("ows:MinimumValue", a.minValue, b);
+                this.writeNode("ows:MaximumValue", a.maxValue, b);
+                return b
+            },
+            MinimumValue: function(a) {
+                return this.createElementNSPlus("ows:MinimumValue", {
+                    value: a
+                })
+            },
+            MaximumValue: function(a) {
+                return this.createElementNSPlus("ows:MaximumValue", {
+                    value: a
+                })
+            },
+            Value: function(a) {
+                return this.createElementNSPlus("ows:Value", {
+                    value: a
+                })
+            }
+        }, OpenLayers.Format.OWSCommon.v1.prototype.writers.ows)
+    },
+    CLASS_NAME: "OpenLayers.Format.OWSCommon.v1_1_0"
+});
+OpenLayers.Format.WCSGetCoverage = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        ows: "http://www.opengis.net/ows/1.1",
+        wcs: "http://www.opengis.net/wcs/1.1",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    VERSION: "1.1.2",
+    schemaLocation: "http://www.opengis.net/wcs/1.1 http://schemas.opengis.net/wcs/1.1/wcsGetCoverage.xsd",
+    write: function(a) {
+        a = this.writeNode("wcs:GetCoverage",
+            a);
+        this.setAttributeNS(a, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [a])
+    },
+    writers: {
+        wcs: {
+            GetCoverage: function(a) {
+                var b = this.createElementNSPlus("wcs:GetCoverage", {
+                    attributes: {
+                        version: a.version || this.VERSION,
+                        service: "WCS"
+                    }
+                });
+                this.writeNode("ows:Identifier", a.identifier, b);
+                this.writeNode("wcs:DomainSubset", a.domainSubset, b);
+                this.writeNode("wcs:Output", a.output, b);
+                return b
+            },
+            DomainSubset: function(a) {
+                var b = this.createElementNSPlus("wcs:DomainSubset", {});
+                this.writeNode("ows:BoundingBox", a.boundingBox, b);
+                a.temporalSubset && this.writeNode("wcs:TemporalSubset", a.temporalSubset, b);
+                return b
+            },
+            TemporalSubset: function(a) {
+                for (var b = this.createElementNSPlus("wcs:TemporalSubset", {}), c = 0, d = a.timePeriods.length; c < d; ++c) this.writeNode("wcs:TimePeriod", a.timePeriods[c], b);
+                return b
+            },
+            TimePeriod: function(a) {
+                var b = this.createElementNSPlus("wcs:TimePeriod", {});
+                this.writeNode("wcs:BeginPosition", a.begin, b);
+                this.writeNode("wcs:EndPosition", a.end, b);
+                a.resolution && this.writeNode("wcs:TimeResolution",
+                    a.resolution, b);
+                return b
+            },
+            BeginPosition: function(a) {
+                return this.createElementNSPlus("wcs:BeginPosition", {
+                    value: a
+                })
+            },
+            EndPosition: function(a) {
+                return this.createElementNSPlus("wcs:EndPosition", {
+                    value: a
+                })
+            },
+            TimeResolution: function(a) {
+                return this.createElementNSPlus("wcs:TimeResolution", {
+                    value: a
+                })
+            },
+            Output: function(a) {
+                var b = this.createElementNSPlus("wcs:Output", {
+                    attributes: {
+                        format: a.format,
+                        store: a.store
+                    }
+                });
+                a.gridCRS && this.writeNode("wcs:GridCRS", a.gridCRS, b);
+                return b
+            },
+            GridCRS: function(a) {
+                var b = this.createElementNSPlus("wcs:GridCRS", {});
+                this.writeNode("wcs:GridBaseCRS", a.baseCRS, b);
+                a.type && this.writeNode("wcs:GridType", a.type, b);
+                a.origin && this.writeNode("wcs:GridOrigin", a.origin, b);
+                this.writeNode("wcs:GridOffsets", a.offsets, b);
+                a.CS && this.writeNode("wcs:GridCS", a.CS, b);
+                return b
+            },
+            GridBaseCRS: function(a) {
+                return this.createElementNSPlus("wcs:GridBaseCRS", {
+                    value: a
+                })
+            },
+            GridOrigin: function(a) {
+                return this.createElementNSPlus("wcs:GridOrigin", {
+                    value: a
+                })
+            },
+            GridType: function(a) {
+                return this.createElementNSPlus("wcs:GridType", {
+                    value: a
+                })
+            },
+            GridOffsets: function(a) {
+                return this.createElementNSPlus("wcs:GridOffsets", {
+                    value: a
+                })
+            },
+            GridCS: function(a) {
+                return this.createElementNSPlus("wcs:GridCS", {
+                    value: a
+                })
+            }
+        },
+        ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.writers.ows
+    },
+    CLASS_NAME: "OpenLayers.Format.WCSGetCoverage"
+});
+OpenLayers.Format.WPSExecute = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        ows: "http://www.opengis.net/ows/1.1",
+        gml: "http://www.opengis.net/gml",
+        wps: "http://www.opengis.net/wps/1.0.0",
+        wfs: "http://www.opengis.net/wfs",
+        ogc: "http://www.opengis.net/ogc",
+        wcs: "http://www.opengis.net/wcs",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    VERSION: "1.0.0",
+    schemaLocation: "http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd",
+    schemaLocationAttr: function() {},
+    write: function(a) {
+        var b;
+        window.ActiveXObject ? this.xmldom = b = new ActiveXObject("Microsoft.XMLDOM") : b = document.implementation.createDocument("", "", null);
+        a = this.writeNode("wps:Execute", a, b);
+        this.setAttributeNS(a, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [a])
+    },
+    writers: {
+        wps: {
+            Execute: function(a) {
+                var b = this.createElementNSPlus("wps:Execute", {
+                    attributes: {
+                        version: this.VERSION,
+                        service: "WPS"
+                    }
+                });
+                this.writeNode("ows:Identifier",
+                    a.identifier, b);
+                this.writeNode("wps:DataInputs", a.dataInputs, b);
+                this.writeNode("wps:ResponseForm", a.responseForm, b);
+                return b
+            },
+            ResponseForm: function(a) {
+                var b = this.createElementNSPlus("wps:ResponseForm", {});
+                a.rawDataOutput && this.writeNode("wps:RawDataOutput", a.rawDataOutput, b);
+                a.responseDocument && this.writeNode("wps:ResponseDocument", a.responseDocument, b);
+                return b
+            },
+            ResponseDocument: function(a) {
+                var b = this.createElementNSPlus("wps:ResponseDocument", {
+                    attributes: {
+                        storeExecuteResponse: a.storeExecuteResponse,
+                        lineage: a.lineage,
+                        status: a.status
+                    }
+                });
+                a.output && this.writeNode("wps:Output", a.output, b);
+                return b
+            },
+            Output: function(a) {
+                var b = this.createElementNSPlus("wps:Output", {
+                    attributes: {
+                        asReference: a.asReference
+                    }
+                });
+                this.writeNode("ows:Identifier", a.identifier, b);
+                this.writeNode("ows:Title", a.title, b);
+                this.writeNode("ows:Abstract", a["abstract"], b);
+                return b
+            },
+            RawDataOutput: function(a) {
+                var b = this.createElementNSPlus("wps:RawDataOutput", {
+                    attributes: {
+                        mimeType: a.mimeType
+                    }
+                });
+                this.writeNode("ows:Identifier", a.identifier,
+                    b);
+                return b
+            },
+            DataInputs: function(a) {
+                for (var b = this.createElementNSPlus("wps:DataInputs", {}), c = 0, d = a.length; c < d; ++c) this.writeNode("wps:Input", a[c], b);
+                return b
+            },
+            Input: function(a) {
+                var b = this.createElementNSPlus("wps:Input", {});
+                this.writeNode("ows:Identifier", a.identifier, b);
+                a.title && this.writeNode("ows:Title", a.title, b);
+                a.data && this.writeNode("wps:Data", a.data, b);
+                a.reference && this.writeNode("wps:Reference", a.reference, b);
+                return b
+            },
+            Data: function(a) {
+                var b = this.createElementNSPlus("wps:Data", {});
+                a.literalData ?
+                    this.writeNode("wps:LiteralData", a.literalData, b) : a.complexData && this.writeNode("wps:ComplexData", a.complexData, b);
+                return b
+            },
+            LiteralData: function(a) {
+                return this.createElementNSPlus("wps:LiteralData", {
+                    attributes: {
+                        uom: a.uom
+                    },
+                    value: a.value
+                })
+            },
+            ComplexData: function(a) {
+                var b = this.createElementNSPlus("wps:ComplexData", {
+                        attributes: {
+                            mimeType: a.mimeType,
+                            encoding: a.encoding,
+                            schema: a.schema
+                        }
+                    }),
+                    c = a.value;
+                "string" === typeof c ? b.appendChild(this.getXMLDoc().createCDATASection(a.value)) : b.appendChild(c);
+                return b
+            },
+            Reference: function(a) {
+                var b = this.createElementNSPlus("wps:Reference", {
+                    attributes: {
+                        mimeType: a.mimeType,
+                        "xlink:href": a.href,
+                        method: a.method,
+                        encoding: a.encoding,
+                        schema: a.schema
+                    }
+                });
+                a.body && this.writeNode("wps:Body", a.body, b);
+                return b
+            },
+            Body: function(a) {
+                var b = this.createElementNSPlus("wps:Body", {});
+                a.wcs ? this.writeNode("wcs:GetCoverage", a.wcs, b) : a.wfs ? (this.featureType = a.wfs.featureType, this.version = a.wfs.version, this.writeNode("wfs:GetFeature", a.wfs, b)) : this.writeNode("wps:Execute", a, b);
+                return b
+            }
+        },
+        wcs: OpenLayers.Format.WCSGetCoverage.prototype.writers.wcs,
+        wfs: OpenLayers.Format.WFST.v1_1_0.prototype.writers.wfs,
+        ogc: OpenLayers.Format.Filter.v1_1_0.prototype.writers.ogc,
+        ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.writers.ows
+    },
+    CLASS_NAME: "OpenLayers.Format.WPSExecute"
+});
+OpenLayers.Control.PanZoom = OpenLayers.Class(OpenLayers.Control, {
+    slideFactor: 50,
+    slideRatio: null,
+    buttons: null,
+    position: null,
+    initialize: function(a) {
+        this.position = new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X, OpenLayers.Control.PanZoom.Y);
+        OpenLayers.Control.prototype.initialize.apply(this, arguments)
+    },
+    destroy: function() {
+        this.map && this.map.events.unregister("buttonclick", this, this.onButtonClick);
+        this.removeButtons();
+        this.position = this.buttons = null;
+        OpenLayers.Control.prototype.destroy.apply(this, arguments)
+    },
+    setMap: function(a) {
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+        this.map.events.register("buttonclick", this, this.onButtonClick)
+    },
+    draw: function(a) {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        a = this.position;
+        this.buttons = [];
+        var b = {
+                w: 18,
+                h: 18
+            },
+            c = new OpenLayers.Pixel(a.x + b.w / 2, a.y);
+        this._addButton("panup", "north-mini.png", c, b);
+        a.y = c.y + b.h;
+        this._addButton("panleft", "west-mini.png", a, b);
+        this._addButton("panright", "east-mini.png", a.add(b.w, 0), b);
+        this._addButton("pandown", "south-mini.png",
+            c.add(0, 2 * b.h), b);
+        this._addButton("zoomin", "zoom-plus-mini.png", c.add(0, 3 * b.h + 5), b);
+        this._addButton("zoomworld", "zoom-world-mini.png", c.add(0, 4 * b.h + 5), b);
+        this._addButton("zoomout", "zoom-minus-mini.png", c.add(0, 5 * b.h + 5), b);
+        return this.div
+    },
+    _addButton: function(a, b, c, d) {
+        b = OpenLayers.Util.getImageLocation(b);
+        c = OpenLayers.Util.createAlphaImageDiv(this.id + "_" + a, c, d, b, "absolute");
+        c.style.cursor = "pointer";
+        this.div.appendChild(c);
+        c.action = a;
+        c.className = "olButton";
+        this.buttons.push(c);
+        return c
+    },
+    _removeButton: function(a) {
+        this.div.removeChild(a);
+        OpenLayers.Util.removeItem(this.buttons, a)
+    },
+    removeButtons: function() {
+        for (var a = this.buttons.length - 1; 0 <= a; --a) this._removeButton(this.buttons[a])
+    },
+    onButtonClick: function(a) {
+        switch (a.buttonElement.action) {
+            case "panup":
+                this.map.pan(0, -this.getSlideFactor("h"));
+                break;
+            case "pandown":
+                this.map.pan(0, this.getSlideFactor("h"));
+                break;
+            case "panleft":
+                this.map.pan(-this.getSlideFactor("w"), 0);
+                break;
+            case "panright":
+                this.map.pan(this.getSlideFactor("w"), 0);
+                break;
+            case "zoomin":
+                this.map.zoomIn();
+                break;
+            case "zoomout":
+                this.map.zoomOut();
+                break;
+            case "zoomworld":
+                this.map.zoomToMaxExtent()
+        }
+    },
+    getSlideFactor: function(a) {
+        return this.slideRatio ? this.map.getSize()[a] * this.slideRatio : this.slideFactor
+    },
+    CLASS_NAME: "OpenLayers.Control.PanZoom"
+});
+OpenLayers.Control.PanZoom.X = 4;
+OpenLayers.Control.PanZoom.Y = 4;
+OpenLayers.Control.PanZoomBar = OpenLayers.Class(OpenLayers.Control.PanZoom, {
+    zoomStopWidth: 18,
+    zoomStopHeight: 11,
+    slider: null,
+    sliderEvents: null,
+    zoombarDiv: null,
+    zoomWorldIcon: !1,
+    panIcons: !0,
+    forceFixedZoomLevel: !1,
+    mouseDragStart: null,
+    deltaY: null,
+    zoomStart: null,
+    destroy: function() {
+        this._removeZoomBar();
+        this.map.events.un({
+            changebaselayer: this.redraw,
+            scope: this
+        });
+        OpenLayers.Control.PanZoom.prototype.destroy.apply(this, arguments);
+        delete this.mouseDragStart;
+        delete this.zoomStart
+    },
+    setMap: function(a) {
+        OpenLayers.Control.PanZoom.prototype.setMap.apply(this,
+            arguments);
+        this.map.events.register("changebaselayer", this, this.redraw)
+    },
+    redraw: function() {
+        null != this.div && (this.removeButtons(), this._removeZoomBar());
+        this.draw()
+    },
+    draw: function(a) {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        a = this.position.clone();
+        this.buttons = [];
+        var b = {
+            w: 18,
+            h: 18
+        };
+        if (this.panIcons) {
+            var c = new OpenLayers.Pixel(a.x + b.w / 2, a.y),
+                d = b.w;
+            this.zoomWorldIcon && (c = new OpenLayers.Pixel(a.x + b.w, a.y));
+            this._addButton("panup", "north-mini.png", c, b);
+            a.y = c.y + b.h;
+            this._addButton("panleft",
+                "west-mini.png", a, b);
+            this.zoomWorldIcon && (this._addButton("zoomworld", "zoom-world-mini.png", a.add(b.w, 0), b), d *= 2);
+            this._addButton("panright", "east-mini.png", a.add(d, 0), b);
+            this._addButton("pandown", "south-mini.png", c.add(0, 2 * b.h), b);
+            this._addButton("zoomin", "zoom-plus-mini.png", c.add(0, 3 * b.h + 5), b);
+            c = this._addZoomBar(c.add(0, 4 * b.h + 5));
+            this._addButton("zoomout", "zoom-minus-mini.png", c, b)
+        } else this._addButton("zoomin", "zoom-plus-mini.png", a, b), c = this._addZoomBar(a.add(0, b.h)), this._addButton("zoomout",
+            "zoom-minus-mini.png", c, b), this.zoomWorldIcon && (c = c.add(0, b.h + 3), this._addButton("zoomworld", "zoom-world-mini.png", c, b));
+        return this.div
+    },
+    _addZoomBar: function(a) {
+        var b = OpenLayers.Util.getImageLocation("slider.png"),
+            c = this.id + "_" + this.map.id,
+            d = this.map.getNumZoomLevels() - 1 - this.map.getZoom(),
+            d = OpenLayers.Util.createAlphaImageDiv(c, a.add(-1, d * this.zoomStopHeight), {
+                w: 20,
+                h: 9
+            }, b, "absolute");
+        d.style.cursor = "move";
+        this.slider = d;
+        this.sliderEvents = new OpenLayers.Events(this, d, null, !0, {
+            includeXY: !0
+        });
+        this.sliderEvents.on({
+            touchstart: this.zoomBarDown,
+            touchmove: this.zoomBarDrag,
+            touchend: this.zoomBarUp,
+            mousedown: this.zoomBarDown,
+            mousemove: this.zoomBarDrag,
+            mouseup: this.zoomBarUp
+        });
+        var e = {
+                w: this.zoomStopWidth,
+                h: this.zoomStopHeight * this.map.getNumZoomLevels()
+            },
+            b = OpenLayers.Util.getImageLocation("zoombar.png"),
+            c = null;
+        OpenLayers.Util.alphaHack() ? (c = this.id + "_" + this.map.id, c = OpenLayers.Util.createAlphaImageDiv(c, a, {
+            w: e.w,
+            h: this.zoomStopHeight
+        }, b, "absolute", null, "crop"), c.style.height = e.h + "px") : c = OpenLayers.Util.createDiv("OpenLayers_Control_PanZoomBar_Zoombar" +
+            this.map.id, a, e, b);
+        c.style.cursor = "pointer";
+        c.className = "olButton";
+        this.zoombarDiv = c;
+        this.div.appendChild(c);
+        this.startTop = parseInt(c.style.top);
+        this.div.appendChild(d);
+        this.map.events.register("zoomend", this, this.moveZoomBar);
+        return a = a.add(0, this.zoomStopHeight * this.map.getNumZoomLevels())
+    },
+    _removeZoomBar: function() {
+        this.sliderEvents.un({
+            touchstart: this.zoomBarDown,
+            touchmove: this.zoomBarDrag,
+            touchend: this.zoomBarUp,
+            mousedown: this.zoomBarDown,
+            mousemove: this.zoomBarDrag,
+            mouseup: this.zoomBarUp
+        });
+        this.sliderEvents.destroy();
+        this.div.removeChild(this.zoombarDiv);
+        this.zoombarDiv = null;
+        this.div.removeChild(this.slider);
+        this.slider = null;
+        this.map.events.unregister("zoomend", this, this.moveZoomBar)
+    },
+    onButtonClick: function(a) {
+        OpenLayers.Control.PanZoom.prototype.onButtonClick.apply(this, arguments);
+        if (a.buttonElement === this.zoombarDiv) {
+            var b = a.buttonXY.y / this.zoomStopHeight;
+            if (this.forceFixedZoomLevel || !this.map.fractionalZoom) b = Math.floor(b);
+            b = this.map.getNumZoomLevels() - 1 - b;
+            b = Math.min(Math.max(b, 0), this.map.getNumZoomLevels() -
+                1);
+            this.map.zoomTo(b)
+        }
+    },
+    passEventToSlider: function(a) {
+        this.sliderEvents.handleBrowserEvent(a)
+    },
+    zoomBarDown: function(a) {
+        if (OpenLayers.Event.isLeftClick(a) || OpenLayers.Event.isSingleTouch(a)) this.map.events.on({
+            touchmove: this.passEventToSlider,
+            mousemove: this.passEventToSlider,
+            mouseup: this.passEventToSlider,
+            scope: this
+        }), this.mouseDragStart = a.xy.clone(), this.zoomStart = a.xy.clone(), this.div.style.cursor = "move", this.zoombarDiv.offsets = null, OpenLayers.Event.stop(a)
+    },
+    zoomBarDrag: function(a) {
+        if (null != this.mouseDragStart) {
+            var b =
+                this.mouseDragStart.y - a.xy.y,
+                c = OpenLayers.Util.pagePosition(this.zoombarDiv);
+            0 < a.clientY - c[1] && a.clientY - c[1] < parseInt(this.zoombarDiv.style.height) - 2 && (this.slider.style.top = parseInt(this.slider.style.top) - b + "px", this.mouseDragStart = a.xy.clone());
+            this.deltaY = this.zoomStart.y - a.xy.y;
+            OpenLayers.Event.stop(a)
+        }
+    },
+    zoomBarUp: function(a) {
+        if ((OpenLayers.Event.isLeftClick(a) || "touchend" === a.type) && this.mouseDragStart) {
+            this.div.style.cursor = "";
+            this.map.events.un({
+                touchmove: this.passEventToSlider,
+                mouseup: this.passEventToSlider,
+                mousemove: this.passEventToSlider,
+                scope: this
+            });
+            var b = this.map.zoom;
+            !this.forceFixedZoomLevel && this.map.fractionalZoom ? (b += this.deltaY / this.zoomStopHeight, b = Math.min(Math.max(b, 0), this.map.getNumZoomLevels() - 1)) : (b += this.deltaY / this.zoomStopHeight, b = Math.max(Math.round(b), 0));
+            this.map.zoomTo(b);
+            this.zoomStart = this.mouseDragStart = null;
+            this.deltaY = 0;
+            OpenLayers.Event.stop(a)
+        }
+    },
+    moveZoomBar: function() {
+        this.slider.style.top = (this.map.getNumZoomLevels() - 1 - this.map.getZoom()) * this.zoomStopHeight + this.startTop +
+            1 + "px"
+    },
+    CLASS_NAME: "OpenLayers.Control.PanZoomBar"
+});
+OpenLayers.Format.WFSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+    defaultVersion: "1.1.0",
+    errorProperty: "service",
+    CLASS_NAME: "OpenLayers.Format.WFSCapabilities"
+});
+OpenLayers.Format.WFSCapabilities.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        wfs: "http://www.opengis.net/wfs",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance",
+        ows: "http://www.opengis.net/ows"
+    },
+    defaultPrefix: "wfs",
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var b = {};
+        this.readNode(a, b);
+        return b
+    },
+    readers: {
+        wfs: {
+            WFS_Capabilities: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            FeatureTypeList: function(a, b) {
+                b.featureTypeList = {
+                    featureTypes: []
+                };
+                this.readChildNodes(a, b.featureTypeList)
+            },
+            FeatureType: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.featureTypes.push(c)
+            },
+            Name: function(a, b) {
+                var c = this.getChildValue(a);
+                c && (c = c.split(":"), b.name = c.pop(), 0 < c.length && (b.featureNS = this.lookupNamespaceURI(a, c[0])))
+            },
+            Title: function(a, b) {
+                var c = this.getChildValue(a);
+                c && (b.title = c)
+            },
+            Abstract: function(a, b) {
+                var c = this.getChildValue(a);
+                c && (b["abstract"] = c)
+            }
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.WFSCapabilities.v1"
+});
+OpenLayers.Format.WFSCapabilities.v1_1_0 = OpenLayers.Class(OpenLayers.Format.WFSCapabilities.v1, {
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    readers: {
+        wfs: OpenLayers.Util.applyDefaults({
+            DefaultSRS: function(a, b) {
+                var c = this.getChildValue(a);
+                c && (b.srs = c)
+            }
+        }, OpenLayers.Format.WFSCapabilities.v1.prototype.readers.wfs),
+        ows: OpenLayers.Format.OWSCommon.v1.prototype.readers.ows
+    },
+    CLASS_NAME: "OpenLayers.Format.WFSCapabilities.v1_1_0"
+});
+OpenLayers.Layer.Image = OpenLayers.Class(OpenLayers.Layer, {
+    isBaseLayer: !0,
+    url: null,
+    extent: null,
+    size: null,
+    tile: null,
+    aspectRatio: null,
+    initialize: function(a, b, c, d, e) {
+        this.url = b;
+        this.maxExtent = this.extent = c;
+        this.size = d;
+        OpenLayers.Layer.prototype.initialize.apply(this, [a, e]);
+        this.aspectRatio = this.extent.getHeight() / this.size.h / (this.extent.getWidth() / this.size.w)
+    },
+    destroy: function() {
+        this.tile && (this.removeTileMonitoringHooks(this.tile), this.tile.destroy(), this.tile = null);
+        OpenLayers.Layer.prototype.destroy.apply(this,
+            arguments)
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.Image(this.name, this.url, this.extent, this.size, this.getOptions()));
+        return a = OpenLayers.Layer.prototype.clone.apply(this, [a])
+    },
+    setMap: function(a) {
+        null == this.options.maxResolution && (this.options.maxResolution = this.aspectRatio * this.extent.getWidth() / this.size.w);
+        OpenLayers.Layer.prototype.setMap.apply(this, arguments)
+    },
+    moveTo: function(a, b, c) {
+        OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
+        var d = null == this.tile;
+        if (b || d) {
+            this.setTileSize();
+            var e = this.map.getLayerPxFromLonLat({
+                lon: this.extent.left,
+                lat: this.extent.top
+            });
+            d ? (this.tile = new OpenLayers.Tile.Image(this, e, this.extent, null, this.tileSize), this.addTileMonitoringHooks(this.tile)) : (this.tile.size = this.tileSize.clone(), this.tile.position = e.clone());
+            this.tile.draw()
+        }
+    },
+    setTileSize: function() {
+        var a = this.extent.getWidth() / this.map.getResolution(),
+            b = this.extent.getHeight() / this.map.getResolution();
+        this.tileSize = new OpenLayers.Size(a, b)
+    },
+    addTileMonitoringHooks: function(a) {
+        a.onLoadStart =
+            function() {
+                this.events.triggerEvent("loadstart")
+            };
+        a.events.register("loadstart", this, a.onLoadStart);
+        a.onLoadEnd = function() {
+            this.events.triggerEvent("loadend")
+        };
+        a.events.register("loadend", this, a.onLoadEnd);
+        a.events.register("unload", this, a.onLoadEnd)
+    },
+    removeTileMonitoringHooks: function(a) {
+        a.unload();
+        a.events.un({
+            loadstart: a.onLoadStart,
+            loadend: a.onLoadEnd,
+            unload: a.onLoadEnd,
+            scope: this
+        })
+    },
+    setUrl: function(a) {
+        this.url = a;
+        this.tile.draw()
+    },
+    getURL: function() {
+        return this.url
+    },
+    CLASS_NAME: "OpenLayers.Layer.Image"
+});
+OpenLayers.Strategy = OpenLayers.Class({
+    layer: null,
+    options: null,
+    active: null,
+    autoActivate: !0,
+    autoDestroy: !0,
+    initialize: function(a) {
+        OpenLayers.Util.extend(this, a);
+        this.options = a;
+        this.active = !1
+    },
+    destroy: function() {
+        this.deactivate();
+        this.options = this.layer = null
+    },
+    setLayer: function(a) {
+        this.layer = a
+    },
+    activate: function() {
+        return !this.active ? this.active = !0 : !1
+    },
+    deactivate: function() {
+        return this.active ? (this.active = !1, !0) : !1
+    },
+    CLASS_NAME: "OpenLayers.Strategy"
+});
+OpenLayers.Strategy.Save = OpenLayers.Class(OpenLayers.Strategy, {
+    events: null,
+    auto: !1,
+    timer: null,
+    initialize: function(a) {
+        OpenLayers.Strategy.prototype.initialize.apply(this, [a]);
+        this.events = new OpenLayers.Events(this)
+    },
+    activate: function() {
+        var a = OpenLayers.Strategy.prototype.activate.call(this);
+        if (a && this.auto)
+            if ("number" === typeof this.auto) this.timer = window.setInterval(OpenLayers.Function.bind(this.save, this), 1E3 * this.auto);
+            else this.layer.events.on({
+                featureadded: this.triggerSave,
+                afterfeaturemodified: this.triggerSave,
+                scope: this
+            });
+        return a
+    },
+    deactivate: function() {
+        var a = OpenLayers.Strategy.prototype.deactivate.call(this);
+        a && this.auto && ("number" === typeof this.auto ? window.clearInterval(this.timer) : this.layer.events.un({
+            featureadded: this.triggerSave,
+            afterfeaturemodified: this.triggerSave,
+            scope: this
+        }));
+        return a
+    },
+    triggerSave: function(a) {
+        var b = a.feature;
+        (b.state === OpenLayers.State.INSERT || b.state === OpenLayers.State.UPDATE || b.state === OpenLayers.State.DELETE) && this.save([a.feature])
+    },
+    save: function(a) {
+        a || (a = this.layer.features);
+        this.events.triggerEvent("start", {
+            features: a
+        });
+        var b = this.layer.projection,
+            c = this.layer.map.getProjectionObject();
+        if (!c.equals(b)) {
+            for (var d = a.length, e = Array(d), f, g, h = 0; h < d; ++h) f = a[h], g = f.clone(), g.fid = f.fid, g.state = f.state, f.url && (g.url = f.url), g._original = f, g.geometry.transform(c, b), e[h] = g;
+            a = e
+        }
+        this.layer.protocol.commit(a, {
+            callback: this.onCommit,
+            scope: this
+        })
+    },
+    onCommit: function(a) {
+        var b = {
+            response: a
+        };
+        if (a.success()) {
+            for (var c = a.reqFeatures, d, e = [], f = a.insertIds || [], g = 0, h = 0, i = c.length; h < i; ++h)
+                if (d = c[h],
+                    d = d._original || d, a = d.state) a == OpenLayers.State.DELETE ? e.push(d) : a == OpenLayers.State.INSERT && (d.fid = f[g], ++g), d.state = null;
+            0 < e.length && this.layer.destroyFeatures(e);
+            this.events.triggerEvent("success", b)
+        } else this.events.triggerEvent("fail", b)
+    },
+    CLASS_NAME: "OpenLayers.Strategy.Save"
+});
+OpenLayers.Format.GPX = OpenLayers.Class(OpenLayers.Format.XML, {
+    defaultDesc: "No description available",
+    extractWaypoints: !0,
+    extractTracks: !0,
+    extractRoutes: !0,
+    extractAttributes: !0,
+    namespaces: {
+        gpx: "http://www.topografix.com/GPX/1/1",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    schemaLocation: "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd",
+    creator: "OpenLayers",
+    initialize: function(a) {
+        this.externalProjection = new OpenLayers.Projection("EPSG:4326");
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        var b = [];
+        if (this.extractTracks)
+            for (var c = a.getElementsByTagName("trk"), d = 0, e = c.length; d < e; d++) {
+                var f = {};
+                this.extractAttributes && (f = this.parseAttributes(c[d]));
+                for (var g = this.getElementsByTagNameNS(c[d], c[d].namespaceURI, "trkseg"), h = 0, i = g.length; h < i; h++) {
+                    var j = this.extractSegment(g[h], "trkpt");
+                    b.push(new OpenLayers.Feature.Vector(j, f))
+                }
+            }
+        if (this.extractRoutes) {
+            e = a.getElementsByTagName("rte");
+            c = 0;
+            for (d =
+                e.length; c < d; c++) f = {}, this.extractAttributes && (f = this.parseAttributes(e[c])), g = this.extractSegment(e[c], "rtept"), b.push(new OpenLayers.Feature.Vector(g, f))
+        }
+        if (this.extractWaypoints) {
+            a = a.getElementsByTagName("wpt");
+            c = 0;
+            for (e = a.length; c < e; c++) f = {}, this.extractAttributes && (f = this.parseAttributes(a[c])), d = new OpenLayers.Geometry.Point(a[c].getAttribute("lon"), a[c].getAttribute("lat")), b.push(new OpenLayers.Feature.Vector(d, f))
+        }
+        if (this.internalProjection && this.externalProjection) {
+            f = 0;
+            for (a = b.length; f <
+                a; f++) b[f].geometry.transform(this.externalProjection, this.internalProjection)
+        }
+        return b
+    },
+    extractSegment: function(a, b) {
+        for (var c = this.getElementsByTagNameNS(a, a.namespaceURI, b), d = [], e = 0, f = c.length; e < f; e++) d.push(new OpenLayers.Geometry.Point(c[e].getAttribute("lon"), c[e].getAttribute("lat")));
+        return new OpenLayers.Geometry.LineString(d)
+    },
+    parseAttributes: function(a) {
+        for (var b = {}, a = a.firstChild, c, d; a;) {
+            if (1 == a.nodeType && a.firstChild && (c = a.firstChild, 3 == c.nodeType || 4 == c.nodeType)) d = a.prefix ? a.nodeName.split(":")[1] :
+                a.nodeName, "trkseg" != d && "rtept" != d && (b[d] = c.nodeValue);
+            a = a.nextSibling
+        }
+        return b
+    },
+    write: function(a, b) {
+        var a = OpenLayers.Util.isArray(a) ? a : [a],
+            c = this.createElementNS(this.namespaces.gpx, "gpx");
+        c.setAttribute("version", "1.1");
+        c.setAttribute("creator", this.creator);
+        this.setAttributes(c, {
+            "xsi:schemaLocation": this.schemaLocation
+        });
+        b && "object" == typeof b && c.appendChild(this.buildMetadataNode(b));
+        for (var d = 0, e = a.length; d < e; d++) c.appendChild(this.buildFeatureNode(a[d]));
+        return OpenLayers.Format.XML.prototype.write.apply(this, [c])
+    },
+    buildMetadataNode: function(a) {
+        for (var b = ["name", "desc", "author"], c = this.createElementNSPlus("gpx:metadata"), d = 0; d < b.length; d++) {
+            var e = b[d];
+            if (a[e]) {
+                var f = this.createElementNSPlus("gpx:" + e);
+                f.appendChild(this.createTextNode(a[e]));
+                c.appendChild(f)
+            }
+        }
+        return c
+    },
+    buildFeatureNode: function(a) {
+        var b = a.geometry,
+            b = b.clone();
+        this.internalProjection && this.externalProjection && b.transform(this.internalProjection, this.externalProjection);
+        if ("OpenLayers.Geometry.Point" == b.CLASS_NAME) {
+            var c = this.buildWptNode(b);
+            this.appendAttributesNode(c, a);
+            return c
+        }
+        c = this.createElementNSPlus("gpx:trk");
+        this.appendAttributesNode(c, a);
+        for (var a = this.buildTrkSegNode(b), a = OpenLayers.Util.isArray(a) ? a : [a], b = 0, d = a.length; b < d; b++) c.appendChild(a[b]);
+        return c
+    },
+    buildTrkSegNode: function(a) {
+        var b, c, d, e;
+        if ("OpenLayers.Geometry.LineString" == a.CLASS_NAME || "OpenLayers.Geometry.LinearRing" == a.CLASS_NAME) {
+            b = this.createElementNSPlus("gpx:trkseg");
+            c = 0;
+            for (d = a.components.length; c < d; c++) e = a.components[c], b.appendChild(this.buildTrkPtNode(e));
+            return b
+        }
+        b = [];
+        c = 0;
+        for (d = a.components.length; c < d; c++) b.push(this.buildTrkSegNode(a.components[c]));
+        return b
+    },
+    buildTrkPtNode: function(a) {
+        var b = this.createElementNSPlus("gpx:trkpt");
+        b.setAttribute("lon", a.x);
+        b.setAttribute("lat", a.y);
+        return b
+    },
+    buildWptNode: function(a) {
+        var b = this.createElementNSPlus("gpx:wpt");
+        b.setAttribute("lon", a.x);
+        b.setAttribute("lat", a.y);
+        return b
+    },
+    appendAttributesNode: function(a, b) {
+        var c = this.createElementNSPlus("gpx:name");
+        c.appendChild(this.createTextNode(b.attributes.name ||
+            b.id));
+        a.appendChild(c);
+        c = this.createElementNSPlus("gpx:desc");
+        c.appendChild(this.createTextNode(b.attributes.description || this.defaultDesc));
+        a.appendChild(c)
+    },
+    CLASS_NAME: "OpenLayers.Format.GPX"
+});
+OpenLayers.Format.WMSDescribeLayer = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+    defaultVersion: "1.1.1",
+    getVersion: function(a, b) {
+        var c = OpenLayers.Format.XML.VersionedOGC.prototype.getVersion.apply(this, arguments);
+        if ("1.1.1" == c || "1.1.0" == c) c = "1.1";
+        return c
+    },
+    CLASS_NAME: "OpenLayers.Format.WMSDescribeLayer"
+});
+OpenLayers.Format.WMSDescribeLayer.v1_1 = OpenLayers.Class(OpenLayers.Format.WMSDescribeLayer, {
+    initialize: function(a) {
+        OpenLayers.Format.WMSDescribeLayer.prototype.initialize.apply(this, [a])
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        for (var a = a.documentElement.childNodes, b = [], c, d, e = 0; e < a.length; ++e)
+            if (c = a[e], d = c.nodeName, "LayerDescription" == d) {
+                d = c.getAttribute("name");
+                var f = "",
+                    g = "",
+                    h = "";
+                c.getAttribute("owsType") ? (f = c.getAttribute("owsType"), g = c.getAttribute("owsURL")) :
+                    "" != c.getAttribute("wfs") ? (f = "WFS", g = c.getAttribute("wfs")) : "" != c.getAttribute("wcs") && (f = "WCS", g = c.getAttribute("wcs"));
+                c = c.getElementsByTagName("Query");
+                0 < c.length && ((h = c[0].getAttribute("typeName")) || (h = c[0].getAttribute("typename")));
+                b.push({
+                    layerName: d,
+                    owsType: f,
+                    owsURL: g,
+                    typeName: h
+                })
+            }
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Format.WMSDescribeLayer.v1_1"
+});
+OpenLayers.Layer.XYZ = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    isBaseLayer: !0,
+    sphericalMercator: !1,
+    zoomOffset: 0,
+    serverResolutions: null,
+    initialize: function(a, b, c) {
+        if (c && c.sphericalMercator || this.sphericalMercator) c = OpenLayers.Util.extend({
+            projection: "EPSG:900913",
+            numZoomLevels: 19
+        }, c);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a || this.name, b || this.url, {}, c])
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.XYZ(this.name, this.url, this.getOptions()));
+        return a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+    },
+    getURL: function(a) {
+        var a = this.getXYZ(a),
+            b = this.url;
+        OpenLayers.Util.isArray(b) && (b = this.selectUrl("" + a.x + a.y + a.z, b));
+        return OpenLayers.String.format(b, a)
+    },
+    getXYZ: function(a) {
+        var b = this.getServerResolution(),
+            c = Math.round((a.left - this.maxExtent.left) / (b * this.tileSize.w)),
+            a = Math.round((this.maxExtent.top - a.top) / (b * this.tileSize.h)),
+            b = this.getServerZoom();
+        if (this.wrapDateLine) var d = Math.pow(2, b),
+            c = (c % d + d) % d;
+        return {
+            x: c,
+            y: a,
+            z: b
+        }
+    },
+    setMap: function(a) {
+        OpenLayers.Layer.Grid.prototype.setMap.apply(this,
+            arguments);
+        this.tileOrigin || (this.tileOrigin = new OpenLayers.LonLat(this.maxExtent.left, this.maxExtent.bottom))
+    },
+    CLASS_NAME: "OpenLayers.Layer.XYZ"
+});
+OpenLayers.Layer.OSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+    name: "OpenStreetMap",
+    url: ["http://a.tile.openstreetmap.org/${z}/${x}/${y}.png", "http://b.tile.openstreetmap.org/${z}/${x}/${y}.png", "http://c.tile.openstreetmap.org/${z}/${x}/${y}.png"],
+    attribution: "Data CC-By-SA by <a href='http://openstreetmap.org/'>OpenStreetMap</a>",
+    sphericalMercator: !0,
+    wrapDateLine: !0,
+    tileOptions: null,
+    initialize: function(a, b, c) {
+        OpenLayers.Layer.XYZ.prototype.initialize.apply(this, arguments);
+        this.tileOptions = OpenLayers.Util.extend({
+                crossOriginKeyword: "anonymous"
+            },
+            this.options && this.options.tileOptions)
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.OSM(this.name, this.url, this.getOptions()));
+        return a = OpenLayers.Layer.XYZ.prototype.clone.apply(this, [a])
+    },
+    CLASS_NAME: "OpenLayers.Layer.OSM"
+});
+OpenLayers.Renderer = OpenLayers.Class({
+    container: null,
+    root: null,
+    extent: null,
+    locked: !1,
+    size: null,
+    resolution: null,
+    map: null,
+    featureDx: 0,
+    initialize: function(a, b) {
+        this.container = OpenLayers.Util.getElement(a);
+        OpenLayers.Util.extend(this, b)
+    },
+    destroy: function() {
+        this.map = this.resolution = this.size = this.extent = this.container = null
+    },
+    supported: function() {
+        return !1
+    },
+    setExtent: function(a, b) {
+        this.extent = a.clone();
+        if (this.map.baseLayer && this.map.baseLayer.wrapDateLine) {
+            var c = a.getWidth() / this.map.getExtent().getWidth(),
+                a = a.scale(1 / c);
+            this.extent = a.wrapDateLine(this.map.getMaxExtent()).scale(c)
+        }
+        b && (this.resolution = null);
+        return !0
+    },
+    setSize: function(a) {
+        this.size = a.clone();
+        this.resolution = null
+    },
+    getResolution: function() {
+        return this.resolution = this.resolution || this.map.getResolution()
+    },
+    drawFeature: function(a, b) {
+        null == b && (b = a.style);
+        if (a.geometry) {
+            var c = a.geometry.getBounds();
+            if (c) {
+                var d;
+                this.map.baseLayer && this.map.baseLayer.wrapDateLine && (d = this.map.getMaxExtent());
+                c.intersectsBounds(this.extent, {
+                    worldBounds: d
+                }) ? this.calculateFeatureDx(c,
+                    d) : b = {
+                    display: "none"
+                };
+                c = this.drawGeometry(a.geometry, b, a.id);
+                if ("none" != b.display && b.label && !1 !== c) {
+                    d = a.geometry.getCentroid();
+                    if (b.labelXOffset || b.labelYOffset) {
+                        var e = isNaN(b.labelXOffset) ? 0 : b.labelXOffset,
+                            f = isNaN(b.labelYOffset) ? 0 : b.labelYOffset,
+                            g = this.getResolution();
+                        d.move(e * g, f * g)
+                    }
+                    this.drawText(a.id, b, d)
+                } else this.removeText(a.id);
+                return c
+            }
+        }
+    },
+    calculateFeatureDx: function(a, b) {
+        this.featureDx = 0;
+        if (b) {
+            var c = b.getWidth();
+            this.featureDx = Math.round(((a.left + a.right) / 2 - (this.extent.left + this.extent.right) /
+                2) / c) * c
+        }
+    },
+    drawGeometry: function() {},
+    drawText: function() {},
+    removeText: function() {},
+    clear: function() {},
+    getFeatureIdFromEvent: function() {},
+    eraseFeatures: function(a) {
+        OpenLayers.Util.isArray(a) || (a = [a]);
+        for (var b = 0, c = a.length; b < c; ++b) {
+            var d = a[b];
+            this.eraseGeometry(d.geometry, d.id);
+            this.removeText(d.id)
+        }
+    },
+    eraseGeometry: function() {},
+    moveRoot: function() {},
+    getRenderLayerId: function() {
+        return this.container.id
+    },
+    applyDefaultSymbolizer: function(a) {
+        var b = OpenLayers.Util.extend({}, OpenLayers.Renderer.defaultSymbolizer);
+        !1 === a.stroke && (delete b.strokeWidth, delete b.strokeColor);
+        !1 === a.fill && delete b.fillColor;
+        OpenLayers.Util.extend(b, a);
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Renderer"
+});
+OpenLayers.Renderer.defaultSymbolizer = {
+    fillColor: "#000000",
+    strokeColor: "#000000",
+    strokeWidth: 2,
+    fillOpacity: 1,
+    strokeOpacity: 1,
+    pointRadius: 0,
+    labelAlign: "cm"
+};
+OpenLayers.Renderer.symbol = {
+    star: [350, 75, 379, 161, 469, 161, 397, 215, 423, 301, 350, 250, 277, 301, 303, 215, 231, 161, 321, 161, 350, 75],
+    cross: [4, 0, 6, 0, 6, 4, 10, 4, 10, 6, 6, 6, 6, 10, 4, 10, 4, 6, 0, 6, 0, 4, 4, 4, 4, 0],
+    x: [0, 0, 25, 0, 50, 35, 75, 0, 100, 0, 65, 50, 100, 100, 75, 100, 50, 65, 25, 100, 0, 100, 35, 50, 0, 0],
+    square: [0, 0, 0, 1, 1, 1, 1, 0, 0, 0],
+    triangle: [0, 10, 10, 10, 5, 0, 0, 10]
+};
+OpenLayers.Renderer.Canvas = OpenLayers.Class(OpenLayers.Renderer, {
+    hitDetection: !0,
+    hitOverflow: 0,
+    canvas: null,
+    features: null,
+    pendingRedraw: !1,
+    cachedSymbolBounds: {},
+    initialize: function(a, b) {
+        OpenLayers.Renderer.prototype.initialize.apply(this, arguments);
+        this.root = document.createElement("canvas");
+        this.container.appendChild(this.root);
+        this.canvas = this.root.getContext("2d");
+        this.features = {};
+        this.hitDetection && (this.hitCanvas = document.createElement("canvas"), this.hitContext = this.hitCanvas.getContext("2d"))
+    },
+    setExtent: function() {
+        OpenLayers.Renderer.prototype.setExtent.apply(this, arguments);
+        return !1
+    },
+    eraseGeometry: function(a, b) {
+        this.eraseFeatures(this.features[b][0])
+    },
+    supported: function() {
+        return OpenLayers.CANVAS_SUPPORTED
+    },
+    setSize: function(a) {
+        this.size = a.clone();
+        var b = this.root;
+        b.style.width = a.w + "px";
+        b.style.height = a.h + "px";
+        b.width = a.w;
+        b.height = a.h;
+        this.resolution = null;
+        this.hitDetection && (b = this.hitCanvas, b.style.width = a.w + "px", b.style.height = a.h + "px", b.width = a.w, b.height = a.h)
+    },
+    drawFeature: function(a,
+        b) {
+        var c;
+        if (a.geometry) {
+            b = this.applyDefaultSymbolizer(b || a.style);
+            c = a.geometry.getBounds();
+            var d;
+            this.map.baseLayer && this.map.baseLayer.wrapDateLine && (d = this.map.getMaxExtent());
+            d = c && c.intersectsBounds(this.extent, {
+                worldBounds: d
+            });
+            (c = "none" !== b.display && !!c && d) ? this.features[a.id] = [a, b]: delete this.features[a.id];
+            this.pendingRedraw = !0
+        }
+        this.pendingRedraw && !this.locked && (this.redraw(), this.pendingRedraw = !1);
+        return c
+    },
+    drawGeometry: function(a, b, c) {
+        var d = a.CLASS_NAME;
+        if ("OpenLayers.Geometry.Collection" ==
+            d || "OpenLayers.Geometry.MultiPoint" == d || "OpenLayers.Geometry.MultiLineString" == d || "OpenLayers.Geometry.MultiPolygon" == d)
+            for (d = 0; d < a.components.length; d++) this.drawGeometry(a.components[d], b, c);
+        else switch (a.CLASS_NAME) {
+            case "OpenLayers.Geometry.Point":
+                this.drawPoint(a, b, c);
+                break;
+            case "OpenLayers.Geometry.LineString":
+                this.drawLineString(a, b, c);
+                break;
+            case "OpenLayers.Geometry.LinearRing":
+                this.drawLinearRing(a, b, c);
+                break;
+            case "OpenLayers.Geometry.Polygon":
+                this.drawPolygon(a, b, c)
+        }
+    },
+    drawExternalGraphic: function(a,
+        b, c) {
+        var d = new Image;
+        b.graphicTitle && (d.title = b.graphicTitle);
+        var e = b.graphicWidth || b.graphicHeight,
+            f = b.graphicHeight || b.graphicWidth,
+            e = e ? e : 2 * b.pointRadius,
+            f = f ? f : 2 * b.pointRadius,
+            g = void 0 != b.graphicXOffset ? b.graphicXOffset : -(0.5 * e),
+            h = void 0 != b.graphicYOffset ? b.graphicYOffset : -(0.5 * f),
+            i = b.graphicOpacity || b.fillOpacity;
+        d.onload = OpenLayers.Function.bind(function() {
+            if (this.features[c]) {
+                var b = this.getLocalXY(a),
+                    k = b[0],
+                    b = b[1];
+                if (!isNaN(k) && !isNaN(b)) {
+                    var k = k + g | 0,
+                        b = b + h | 0,
+                        l = this.canvas;
+                    l.globalAlpha = i;
+                    var m =
+                        OpenLayers.Renderer.Canvas.drawImageScaleFactor || (OpenLayers.Renderer.Canvas.drawImageScaleFactor = /android 2.1/.test(navigator.userAgent.toLowerCase()) ? 320 / window.screen.width : 1);
+                    l.drawImage(d, k * m, b * m, e * m, f * m);
+                    if (this.hitDetection) {
+                        this.setHitContextStyle("fill", c);
+                        this.hitContext.fillRect(k, b, e, f)
+                    }
+                }
+            }
+        }, this);
+        d.src = b.externalGraphic
+    },
+    drawNamedSymbol: function(a, b, c) {
+        var d, e, f, g;
+        f = Math.PI / 180;
+        var h = OpenLayers.Renderer.symbol[b.graphicName];
+        if (!h) throw Error(b.graphicName + " is not a valid symbol name");
+        if (h.length && !(2 > h.length) && (a = this.getLocalXY(a), e = a[0], g = a[1], !isNaN(e) && !isNaN(g))) {
+            this.canvas.lineCap = "round";
+            this.canvas.lineJoin = "round";
+            this.hitDetection && (this.hitContext.lineCap = "round", this.hitContext.lineJoin = "round");
+            if (b.graphicName in this.cachedSymbolBounds) d = this.cachedSymbolBounds[b.graphicName];
+            else {
+                d = new OpenLayers.Bounds;
+                for (a = 0; a < h.length; a += 2) d.extend(new OpenLayers.LonLat(h[a], h[a + 1]));
+                this.cachedSymbolBounds[b.graphicName] = d
+            }
+            this.canvas.save();
+            this.hitDetection && this.hitContext.save();
+            this.canvas.translate(e, g);
+            this.hitDetection && this.hitContext.translate(e, g);
+            a = f * b.rotation;
+            isNaN(a) || (this.canvas.rotate(a), this.hitDetection && this.hitContext.rotate(a));
+            f = 2 * b.pointRadius / Math.max(d.getWidth(), d.getHeight());
+            this.canvas.scale(f, f);
+            this.hitDetection && this.hitContext.scale(f, f);
+            a = d.getCenterLonLat().lon;
+            d = d.getCenterLonLat().lat;
+            this.canvas.translate(-a, -d);
+            this.hitDetection && this.hitContext.translate(-a, -d);
+            g = b.strokeWidth;
+            b.strokeWidth = g / f;
+            if (!1 !== b.fill) {
+                this.setCanvasStyle("fill",
+                    b);
+                this.canvas.beginPath();
+                for (a = 0; a < h.length; a += 2) d = h[a], e = h[a + 1], 0 == a && this.canvas.moveTo(d, e), this.canvas.lineTo(d, e);
+                this.canvas.closePath();
+                this.canvas.fill();
+                if (this.hitDetection) {
+                    this.setHitContextStyle("fill", c, b);
+                    this.hitContext.beginPath();
+                    for (a = 0; a < h.length; a += 2) d = h[a], e = h[a + 1], 0 == a && this.canvas.moveTo(d, e), this.hitContext.lineTo(d, e);
+                    this.hitContext.closePath();
+                    this.hitContext.fill()
+                }
+            }
+            if (!1 !== b.stroke) {
+                this.setCanvasStyle("stroke", b);
+                this.canvas.beginPath();
+                for (a = 0; a < h.length; a += 2) d = h[a],
+                    e = h[a + 1], 0 == a && this.canvas.moveTo(d, e), this.canvas.lineTo(d, e);
+                this.canvas.closePath();
+                this.canvas.stroke();
+                if (this.hitDetection) {
+                    this.setHitContextStyle("stroke", c, b, f);
+                    this.hitContext.beginPath();
+                    for (a = 0; a < h.length; a += 2) d = h[a], e = h[a + 1], 0 == a && this.hitContext.moveTo(d, e), this.hitContext.lineTo(d, e);
+                    this.hitContext.closePath();
+                    this.hitContext.stroke()
+                }
+            }
+            b.strokeWidth = g;
+            this.canvas.restore();
+            this.hitDetection && this.hitContext.restore();
+            this.setCanvasStyle("reset")
+        }
+    },
+    setCanvasStyle: function(a, b) {
+        "fill" ===
+        a ? (this.canvas.globalAlpha = b.fillOpacity, this.canvas.fillStyle = b.fillColor) : "stroke" === a ? (this.canvas.globalAlpha = b.strokeOpacity, this.canvas.strokeStyle = b.strokeColor, this.canvas.lineWidth = b.strokeWidth) : (this.canvas.globalAlpha = 0, this.canvas.lineWidth = 1)
+    },
+    featureIdToHex: function(a) {
+        a = Number(a.split("_").pop()) + 1;
+        16777216 <= a && (this.hitOverflow = a - 16777215, a = a % 16777216 + 1);
+        var a = "000000" + a.toString(16),
+            b = a.length;
+        return a = "#" + a.substring(b - 6, b)
+    },
+    setHitContextStyle: function(a, b, c, d) {
+        b = this.featureIdToHex(b);
+        "fill" == a ? (this.hitContext.globalAlpha = 1, this.hitContext.fillStyle = b) : "stroke" == a ? (this.hitContext.globalAlpha = 1, this.hitContext.strokeStyle = b, "undefined" === typeof d ? this.hitContext.lineWidth = c.strokeWidth + 2 : isNaN(d) || (this.hitContext.lineWidth = c.strokeWidth + 2 / d)) : (this.hitContext.globalAlpha = 0, this.hitContext.lineWidth = 1)
+    },
+    drawPoint: function(a, b, c) {
+        if (!1 !== b.graphic)
+            if (b.externalGraphic) this.drawExternalGraphic(a, b, c);
+            else if (b.graphicName && "circle" != b.graphicName) this.drawNamedSymbol(a, b, c);
+        else {
+            var d =
+                this.getLocalXY(a),
+                a = d[0],
+                d = d[1];
+            if (!isNaN(a) && !isNaN(d)) {
+                var e = 2 * Math.PI,
+                    f = b.pointRadius;
+                !1 !== b.fill && (this.setCanvasStyle("fill", b), this.canvas.beginPath(), this.canvas.arc(a, d, f, 0, e, !0), this.canvas.fill(), this.hitDetection && (this.setHitContextStyle("fill", c, b), this.hitContext.beginPath(), this.hitContext.arc(a, d, f, 0, e, !0), this.hitContext.fill()));
+                !1 !== b.stroke && (this.setCanvasStyle("stroke", b), this.canvas.beginPath(), this.canvas.arc(a, d, f, 0, e, !0), this.canvas.stroke(), this.hitDetection && (this.setHitContextStyle("stroke",
+                    c, b), this.hitContext.beginPath(), this.hitContext.arc(a, d, f, 0, e, !0), this.hitContext.stroke()), this.setCanvasStyle("reset"))
+            }
+        }
+    },
+    drawLineString: function(a, b, c) {
+        b = OpenLayers.Util.applyDefaults({
+            fill: !1
+        }, b);
+        this.drawLinearRing(a, b, c)
+    },
+    drawLinearRing: function(a, b, c) {
+        !1 !== b.fill && (this.setCanvasStyle("fill", b), this.renderPath(this.canvas, a, b, c, "fill"), this.hitDetection && (this.setHitContextStyle("fill", c, b), this.renderPath(this.hitContext, a, b, c, "fill")));
+        !1 !== b.stroke && (this.setCanvasStyle("stroke", b), this.renderPath(this.canvas,
+            a, b, c, "stroke"), this.hitDetection && (this.setHitContextStyle("stroke", c, b), this.renderPath(this.hitContext, a, b, c, "stroke")));
+        this.setCanvasStyle("reset")
+    },
+    renderPath: function(a, b, c, d, e) {
+        b = b.components;
+        c = b.length;
+        a.beginPath();
+        var d = this.getLocalXY(b[0]),
+            f = d[1];
+        if (!isNaN(d[0]) && !isNaN(f)) {
+            a.moveTo(d[0], d[1]);
+            for (d = 1; d < c; ++d) f = this.getLocalXY(b[d]), a.lineTo(f[0], f[1]);
+            "fill" === e ? a.fill() : a.stroke()
+        }
+    },
+    drawPolygon: function(a, b, c) {
+        var a = a.components,
+            d = a.length;
+        this.drawLinearRing(a[0], b, c);
+        for (var e = 1; e <
+            d; ++e) this.canvas.globalCompositeOperation = "destination-out", this.hitDetection && (this.hitContext.globalCompositeOperation = "destination-out"), this.drawLinearRing(a[e], OpenLayers.Util.applyDefaults({
+            stroke: !1,
+            fillOpacity: 1
+        }, b), c), this.canvas.globalCompositeOperation = "source-over", this.hitDetection && (this.hitContext.globalCompositeOperation = "source-over"), this.drawLinearRing(a[e], OpenLayers.Util.applyDefaults({
+            fill: !1
+        }, b), c)
+    },
+    drawText: function(a, b) {
+        var c = this.getLocalXY(a);
+        this.setCanvasStyle("reset");
+        this.canvas.fillStyle = b.fontColor;
+        this.canvas.globalAlpha = b.fontOpacity || 1;
+        var d = [b.fontStyle ? b.fontStyle : "normal", "normal", b.fontWeight ? b.fontWeight : "normal", b.fontSize ? b.fontSize : "1em", b.fontFamily ? b.fontFamily : "sans-serif"].join(" "),
+            e = b.label.split("\n"),
+            f = e.length;
+        if (this.canvas.fillText) {
+            this.canvas.font = d;
+            this.canvas.textAlign = OpenLayers.Renderer.Canvas.LABEL_ALIGN[b.labelAlign[0]] || "center";
+            this.canvas.textBaseline = OpenLayers.Renderer.Canvas.LABEL_ALIGN[b.labelAlign[1]] || "middle";
+            var g = OpenLayers.Renderer.Canvas.LABEL_FACTOR[b.labelAlign[1]];
+            null == g && (g = -0.5);
+            d = this.canvas.measureText("Mg").height || this.canvas.measureText("xx").width;
+            c[1] += d * g * (f - 1);
+            for (g = 0; g < f; g++) b.labelOutlineWidth && (this.canvas.save(), this.canvas.strokeStyle = b.labelOutlineColor, this.canvas.lineWidth = b.labelOutlineWidth, this.canvas.strokeText(e[g], c[0], c[1] + d * g + 1), this.canvas.restore()), this.canvas.fillText(e[g], c[0], c[1] + d * g)
+        } else if (this.canvas.mozDrawText) {
+            this.canvas.mozTextStyle = d;
+            var h = OpenLayers.Renderer.Canvas.LABEL_FACTOR[b.labelAlign[0]];
+            null == h && (h = -0.5);
+            g = OpenLayers.Renderer.Canvas.LABEL_FACTOR[b.labelAlign[1]];
+            null == g && (g = -0.5);
+            d = this.canvas.mozMeasureText("xx");
+            c[1] += d * (1 + g * f);
+            for (g = 0; g < f; g++) {
+                var i = c[0] + h * this.canvas.mozMeasureText(e[g]),
+                    j = c[1] + g * d;
+                this.canvas.translate(i, j);
+                this.canvas.mozDrawText(e[g]);
+                this.canvas.translate(-i, -j)
+            }
+        }
+        this.setCanvasStyle("reset")
+    },
+    getLocalXY: function(a) {
+        var b = this.getResolution(),
+            c = this.extent;
+        return [(a.x - this.featureDx) / b + -c.left / b, c.top / b - a.y / b]
+    },
+    clear: function() {
+        var a = this.root.height,
+            b = this.root.width;
+        this.canvas.clearRect(0,
+            0, b, a);
+        this.features = {};
+        this.hitDetection && this.hitContext.clearRect(0, 0, b, a)
+    },
+    getFeatureIdFromEvent: function(a) {
+        var b;
+        if (this.hitDetection && "none" !== this.root.style.display && !this.map.dragging && (a = a.xy, a = this.hitContext.getImageData(a.x | 0, a.y | 0, 1, 1).data, 255 === a[3] && (a = a[2] + 256 * (a[1] + 256 * a[0])))) {
+            a = "OpenLayers.Feature.Vector_" + (a - 1 + this.hitOverflow);
+            try {
+                b = this.features[a][0]
+            } catch (c) {}
+        }
+        return b
+    },
+    eraseFeatures: function(a) {
+        OpenLayers.Util.isArray(a) || (a = [a]);
+        for (var b = 0; b < a.length; ++b) delete this.features[a[b].id];
+        this.redraw()
+    },
+    redraw: function() {
+        if (!this.locked) {
+            var a = this.root.height,
+                b = this.root.width;
+            this.canvas.clearRect(0, 0, b, a);
+            this.hitDetection && this.hitContext.clearRect(0, 0, b, a);
+            var a = [],
+                c, d, e = this.map.baseLayer && this.map.baseLayer.wrapDateLine && this.map.getMaxExtent(),
+                f;
+            for (f in this.features) this.features.hasOwnProperty(f) && (b = this.features[f][0], c = b.geometry, this.calculateFeatureDx(c.getBounds(), e), d = this.features[f][1], this.drawGeometry(c, d, b.id), d.label && a.push([b, d]));
+            b = 0;
+            for (c = a.length; b < c; ++b) f =
+                a[b], this.drawText(f[0].geometry.getCentroid(), f[1])
+        }
+    },
+    CLASS_NAME: "OpenLayers.Renderer.Canvas"
+});
+OpenLayers.Renderer.Canvas.LABEL_ALIGN = {
+    l: "left",
+    r: "right",
+    t: "top",
+    b: "bottom"
+};
+OpenLayers.Renderer.Canvas.LABEL_FACTOR = {
+    l: 0,
+    r: -1,
+    t: 0,
+    b: -1
+};
+OpenLayers.Renderer.Canvas.drawImageScaleFactor = null;
+OpenLayers.Format.OSM = OpenLayers.Class(OpenLayers.Format.XML, {
+    checkTags: !1,
+    interestingTagsExclude: null,
+    areaTags: null,
+    initialize: function(a) {
+        for (var b = {
+                interestingTagsExclude: "source source_ref source:ref history attribution created_by".split(" "),
+                areaTags: "area building leisure tourism ruins historic landuse military natural sport".split(" ")
+            }, b = OpenLayers.Util.extend(b, a), c = {}, a = 0; a < b.interestingTagsExclude.length; a++) c[b.interestingTagsExclude[a]] = !0;
+        b.interestingTagsExclude = c;
+        c = {};
+        for (a = 0; a < b.areaTags.length; a++) c[b.areaTags[a]] = !0;
+        b.areaTags = c;
+        this.externalProjection = new OpenLayers.Projection("EPSG:4326");
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [b])
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        for (var b = this.getNodes(a), c = this.getWays(a), a = Array(c.length), d = 0; d < c.length; d++) {
+            for (var e = Array(c[d].nodes.length), f = this.isWayArea(c[d]) ? 1 : 0, g = 0; g < c[d].nodes.length; g++) {
+                var h = b[c[d].nodes[g]],
+                    i = new OpenLayers.Geometry.Point(h.lon, h.lat);
+                i.osm_id = parseInt(c[d].nodes[g]);
+                e[g] = i;
+                h.used = !0
+            }
+            h = null;
+            h = f ? new OpenLayers.Geometry.Polygon(new OpenLayers.Geometry.LinearRing(e)) : new OpenLayers.Geometry.LineString(e);
+            this.internalProjection && this.externalProjection && h.transform(this.externalProjection, this.internalProjection);
+            e = new OpenLayers.Feature.Vector(h, c[d].tags);
+            e.osm_id = parseInt(c[d].id);
+            e.fid = "way." + e.osm_id;
+            a[d] = e
+        }
+        for (var j in b) {
+            h = b[j];
+            if (!h.used || this.checkTags) {
+                c = null;
+                if (this.checkTags) {
+                    c = this.getTags(h.node, !0);
+                    if (h.used && !c[1]) continue;
+                    c = c[0]
+                } else c = this.getTags(h.node);
+                e = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(h.lon, h.lat), c);
+                this.internalProjection && this.externalProjection && e.geometry.transform(this.externalProjection, this.internalProjection);
+                e.osm_id = parseInt(j);
+                e.fid = "node." + e.osm_id;
+                a.push(e)
+            }
+            h.node = null
+        }
+        return a
+    },
+    getNodes: function(a) {
+        for (var a = a.getElementsByTagName("node"), b = {}, c = 0; c < a.length; c++) {
+            var d = a[c],
+                e = d.getAttribute("id");
+            b[e] = {
+                lat: d.getAttribute("lat"),
+                lon: d.getAttribute("lon"),
+                node: d
+            }
+        }
+        return b
+    },
+    getWays: function(a) {
+        for (var a =
+                a.getElementsByTagName("way"), b = [], c = 0; c < a.length; c++) {
+            var d = a[c],
+                e = {
+                    id: d.getAttribute("id")
+                };
+            e.tags = this.getTags(d);
+            d = d.getElementsByTagName("nd");
+            e.nodes = Array(d.length);
+            for (var f = 0; f < d.length; f++) e.nodes[f] = d[f].getAttribute("ref");
+            b.push(e)
+        }
+        return b
+    },
+    getTags: function(a, b) {
+        for (var c = a.getElementsByTagName("tag"), d = {}, e = !1, f = 0; f < c.length; f++) {
+            var g = c[f].getAttribute("k");
+            d[g] = c[f].getAttribute("v");
+            b && (this.interestingTagsExclude[g] || (e = !0))
+        }
+        return b ? [d, e] : d
+    },
+    isWayArea: function(a) {
+        var b = !1,
+            c = !1;
+        a.nodes[0] == a.nodes[a.nodes.length - 1] && (b = !0);
+        if (this.checkTags)
+            for (var d in a.tags)
+                if (this.areaTags[d]) {
+                    c = !0;
+                    break
+                }
+        return b && (this.checkTags ? c : !0)
+    },
+    write: function(a) {
+        OpenLayers.Util.isArray(a) || (a = [a]);
+        this.osm_id = 1;
+        this.created_nodes = {};
+        var b = this.createElementNS(null, "osm");
+        b.setAttribute("version", "0.5");
+        b.setAttribute("generator", "OpenLayers " + OpenLayers.VERSION_NUMBER);
+        for (var c = a.length - 1; 0 <= c; c--)
+            for (var d = this.createFeatureNodes(a[c]), e = 0; e < d.length; e++) b.appendChild(d[e]);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [b])
+    },
+    createFeatureNodes: function(a) {
+        var b = [],
+            c = a.geometry.CLASS_NAME,
+            c = c.substring(c.lastIndexOf(".") + 1),
+            c = c.toLowerCase();
+        (c = this.createXML[c]) && (b = c.apply(this, [a]));
+        return b
+    },
+    createXML: {
+        point: function(a) {
+            var b = null,
+                c = a.geometry ? a.geometry : a;
+            this.internalProjection && this.externalProjection && (c = c.clone(), c.transform(this.internalProjection, this.externalProjection));
+            var d = !1;
+            a.osm_id ? (b = a.osm_id, this.created_nodes[b] && (d = !0)) : (b = -this.osm_id, this.osm_id++);
+            var e = d ? this.created_nodes[b] : this.createElementNS(null,
+                "node");
+            this.created_nodes[b] = e;
+            e.setAttribute("id", b);
+            e.setAttribute("lon", c.x);
+            e.setAttribute("lat", c.y);
+            a.attributes && this.serializeTags(a, e);
+            this.setState(a, e);
+            return d ? [] : [e]
+        },
+        linestring: function(a) {
+            var b, c = [],
+                d = a.geometry;
+            a.osm_id ? b = a.osm_id : (b = -this.osm_id, this.osm_id++);
+            var e = this.createElementNS(null, "way");
+            e.setAttribute("id", b);
+            for (b = 0; b < d.components.length; b++) {
+                var f = this.createXML.point.apply(this, [d.components[b]]);
+                if (f.length) {
+                    var f = f[0],
+                        g = f.getAttribute("id");
+                    c.push(f)
+                } else g = d.components[b].osm_id,
+                    f = this.created_nodes[g];
+                this.setState(a, f);
+                f = this.createElementNS(null, "nd");
+                f.setAttribute("ref", g);
+                e.appendChild(f)
+            }
+            this.serializeTags(a, e);
+            c.push(e);
+            return c
+        },
+        polygon: function(a) {
+            var b = OpenLayers.Util.extend({
+                    area: "yes"
+                }, a.attributes),
+                b = new OpenLayers.Feature.Vector(a.geometry.components[0], b);
+            b.osm_id = a.osm_id;
+            return this.createXML.linestring.apply(this, [b])
+        }
+    },
+    serializeTags: function(a, b) {
+        for (var c in a.attributes) {
+            var d = this.createElementNS(null, "tag");
+            d.setAttribute("k", c);
+            d.setAttribute("v",
+                a.attributes[c]);
+            b.appendChild(d)
+        }
+    },
+    setState: function(a, b) {
+        if (a.state) {
+            var c = null;
+            switch (a.state) {
+                case OpenLayers.State.UPDATE:
+                case OpenLayers.State.DELETE:
+                    c = "delete"
+            }
+            c && b.setAttribute("action", c)
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.OSM"
+});
+OpenLayers.Handler = OpenLayers.Class({
+    id: null,
+    control: null,
+    map: null,
+    keyMask: null,
+    active: !1,
+    evt: null,
+    initialize: function(a, b, c) {
+        OpenLayers.Util.extend(this, c);
+        this.control = a;
+        this.callbacks = b;
+        (a = this.map || a.map) && this.setMap(a);
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_")
+    },
+    setMap: function(a) {
+        this.map = a
+    },
+    checkModifiers: function(a) {
+        return null == this.keyMask ? !0 : ((a.shiftKey ? OpenLayers.Handler.MOD_SHIFT : 0) | (a.ctrlKey ? OpenLayers.Handler.MOD_CTRL : 0) | (a.altKey ? OpenLayers.Handler.MOD_ALT : 0)) ==
+            this.keyMask
+    },
+    activate: function() {
+        if (this.active) return !1;
+        for (var a = OpenLayers.Events.prototype.BROWSER_EVENTS, b = 0, c = a.length; b < c; b++) this[a[b]] && this.register(a[b], this[a[b]]);
+        return this.active = !0
+    },
+    deactivate: function() {
+        if (!this.active) return !1;
+        for (var a = OpenLayers.Events.prototype.BROWSER_EVENTS, b = 0, c = a.length; b < c; b++) this[a[b]] && this.unregister(a[b], this[a[b]]);
+        this.active = !1;
+        return !0
+    },
+    callback: function(a, b) {
+        a && this.callbacks[a] && this.callbacks[a].apply(this.control, b)
+    },
+    register: function(a, b) {
+        this.map.events.registerPriority(a,
+            this, b);
+        this.map.events.registerPriority(a, this, this.setEvent)
+    },
+    unregister: function(a, b) {
+        this.map.events.unregister(a, this, b);
+        this.map.events.unregister(a, this, this.setEvent)
+    },
+    setEvent: function(a) {
+        this.evt = a;
+        return !0
+    },
+    destroy: function() {
+        this.deactivate();
+        this.control = this.map = null
+    },
+    CLASS_NAME: "OpenLayers.Handler"
+});
+OpenLayers.Handler.MOD_NONE = 0;
+OpenLayers.Handler.MOD_SHIFT = 1;
+OpenLayers.Handler.MOD_CTRL = 2;
+OpenLayers.Handler.MOD_ALT = 4;
+OpenLayers.Handler.Drag = OpenLayers.Class(OpenLayers.Handler, {
+    started: !1,
+    stopDown: !0,
+    dragging: !1,
+    touch: !1,
+    last: null,
+    start: null,
+    lastMoveEvt: null,
+    oldOnselectstart: null,
+    interval: 0,
+    timeoutId: null,
+    documentDrag: !1,
+    documentEvents: null,
+    initialize: function(a, b, c) {
+        OpenLayers.Handler.prototype.initialize.apply(this, arguments);
+        if (!0 === this.documentDrag) {
+            var d = this;
+            this._docMove = function(a) {
+                d.mousemove({
+                    xy: {
+                        x: a.clientX,
+                        y: a.clientY
+                    },
+                    element: document
+                })
+            };
+            this._docUp = function(a) {
+                d.mouseup({
+                    xy: {
+                        x: a.clientX,
+                        y: a.clientY
+                    }
+                })
+            }
+        }
+    },
+    dragstart: function(a) {
+        var b = !0;
+        this.dragging = !1;
+        this.checkModifiers(a) && (OpenLayers.Event.isLeftClick(a) || OpenLayers.Event.isSingleTouch(a)) ? (this.started = !0, this.last = this.start = a.xy, OpenLayers.Element.addClass(this.map.viewPortDiv, "olDragDown"), this.down(a), this.callback("down", [a.xy]), OpenLayers.Event.stop(a), this.oldOnselectstart || (this.oldOnselectstart = document.onselectstart ? document.onselectstart : OpenLayers.Function.True), document.onselectstart = OpenLayers.Function.False, b = !this.stopDown) : (this.started = !1, this.last = this.start = null);
+        return b
+    },
+    dragmove: function(a) {
+        this.lastMoveEvt = a;
+        if (this.started && !this.timeoutId && (a.xy.x != this.last.x || a.xy.y != this.last.y)) !0 === this.documentDrag && this.documentEvents && (a.element === document ? (this.adjustXY(a), this.setEvent(a)) : this.removeDocumentEvents()), 0 < this.interval && (this.timeoutId = setTimeout(OpenLayers.Function.bind(this.removeTimeout, this), this.interval)), this.dragging = !0, this.move(a), this.callback("move", [a.xy]), this.oldOnselectstart || (this.oldOnselectstart =
+            document.onselectstart, document.onselectstart = OpenLayers.Function.False), this.last = a.xy;
+        return !0
+    },
+    dragend: function(a) {
+        if (this.started) {
+            !0 === this.documentDrag && this.documentEvents && (this.adjustXY(a), this.removeDocumentEvents());
+            var b = this.start != this.last;
+            this.dragging = this.started = !1;
+            OpenLayers.Element.removeClass(this.map.viewPortDiv, "olDragDown");
+            this.up(a);
+            this.callback("up", [a.xy]);
+            b && this.callback("done", [a.xy]);
+            document.onselectstart = this.oldOnselectstart
+        }
+        return !0
+    },
+    down: function() {},
+    move: function() {},
+    up: function() {},
+    out: function() {},
+    mousedown: function(a) {
+        return this.dragstart(a)
+    },
+    touchstart: function(a) {
+        this.touch || (this.touch = !0, this.map.events.un({
+            mousedown: this.mousedown,
+            mouseup: this.mouseup,
+            mousemove: this.mousemove,
+            click: this.click,
+            scope: this
+        }));
+        return this.dragstart(a)
+    },
+    mousemove: function(a) {
+        return this.dragmove(a)
+    },
+    touchmove: function(a) {
+        return this.dragmove(a)
+    },
+    removeTimeout: function() {
+        this.timeoutId = null;
+        this.dragging && this.mousemove(this.lastMoveEvt)
+    },
+    mouseup: function(a) {
+        return this.dragend(a)
+    },
+    touchend: function(a) {
+        a.xy = this.last;
+        return this.dragend(a)
+    },
+    mouseout: function(a) {
+        if (this.started && OpenLayers.Util.mouseLeft(a, this.map.viewPortDiv))
+            if (!0 === this.documentDrag) this.addDocumentEvents();
+            else {
+                var b = this.start != this.last;
+                this.dragging = this.started = !1;
+                OpenLayers.Element.removeClass(this.map.viewPortDiv, "olDragDown");
+                this.out(a);
+                this.callback("out", []);
+                b && this.callback("done", [a.xy]);
+                document.onselectstart && (document.onselectstart = this.oldOnselectstart)
+            }
+        return !0
+    },
+    click: function() {
+        return this.start ==
+            this.last
+    },
+    activate: function() {
+        var a = !1;
+        OpenLayers.Handler.prototype.activate.apply(this, arguments) && (this.dragging = !1, a = !0);
+        return a
+    },
+    deactivate: function() {
+        var a = !1;
+        OpenLayers.Handler.prototype.deactivate.apply(this, arguments) && (this.dragging = this.started = this.touch = !1, this.last = this.start = null, a = !0, OpenLayers.Element.removeClass(this.map.viewPortDiv, "olDragDown"));
+        return a
+    },
+    adjustXY: function(a) {
+        var b = OpenLayers.Util.pagePosition(this.map.viewPortDiv);
+        a.xy.x -= b[0];
+        a.xy.y -= b[1]
+    },
+    addDocumentEvents: function() {
+        OpenLayers.Element.addClass(document.body,
+            "olDragDown");
+        this.documentEvents = !0;
+        OpenLayers.Event.observe(document, "mousemove", this._docMove);
+        OpenLayers.Event.observe(document, "mouseup", this._docUp)
+    },
+    removeDocumentEvents: function() {
+        OpenLayers.Element.removeClass(document.body, "olDragDown");
+        this.documentEvents = !1;
+        OpenLayers.Event.stopObserving(document, "mousemove", this._docMove);
+        OpenLayers.Event.stopObserving(document, "mouseup", this._docUp)
+    },
+    CLASS_NAME: "OpenLayers.Handler.Drag"
+});
+OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, {
+    EVENTMAP: {
+        click: {
+            "in": "click",
+            out: "clickout"
+        },
+        mousemove: {
+            "in": "over",
+            out: "out"
+        },
+        dblclick: {
+            "in": "dblclick",
+            out: null
+        },
+        mousedown: {
+            "in": null,
+            out: null
+        },
+        mouseup: {
+            "in": null,
+            out: null
+        },
+        touchstart: {
+            "in": "click",
+            out: "clickout"
+        }
+    },
+    feature: null,
+    lastFeature: null,
+    down: null,
+    up: null,
+    touch: !1,
+    clickTolerance: 4,
+    geometryTypes: null,
+    stopClick: !0,
+    stopDown: !0,
+    stopUp: !1,
+    initialize: function(a, b, c, d) {
+        OpenLayers.Handler.prototype.initialize.apply(this, [a, c, d]);
+        this.layer =
+            b
+    },
+    touchstart: function(a) {
+        this.touch || (this.touch = !0, this.map.events.un({
+            mousedown: this.mousedown,
+            mouseup: this.mouseup,
+            mousemove: this.mousemove,
+            click: this.click,
+            dblclick: this.dblclick,
+            scope: this
+        }));
+        return OpenLayers.Event.isMultiTouch(a) ? !0 : this.mousedown(a)
+    },
+    touchmove: function(a) {
+        OpenLayers.Event.stop(a)
+    },
+    mousedown: function(a) {
+        if (OpenLayers.Event.isLeftClick(a) || OpenLayers.Event.isSingleTouch(a)) this.down = a.xy;
+        return this.handle(a) ? !this.stopDown : !0
+    },
+    mouseup: function(a) {
+        this.up = a.xy;
+        return this.handle(a) ?
+            !this.stopUp : !0
+    },
+    click: function(a) {
+        return this.handle(a) ? !this.stopClick : !0
+    },
+    mousemove: function(a) {
+        if (!this.callbacks.over && !this.callbacks.out) return !0;
+        this.handle(a);
+        return !0
+    },
+    dblclick: function(a) {
+        return !this.handle(a)
+    },
+    geometryTypeMatches: function(a) {
+        return null == this.geometryTypes || -1 < OpenLayers.Util.indexOf(this.geometryTypes, a.geometry.CLASS_NAME)
+    },
+    handle: function(a) {
+        this.feature && !this.feature.layer && (this.feature = null);
+        var b = a.type,
+            c = !1,
+            d = !!this.feature,
+            e = "click" == b || "dblclick" == b || "touchstart" ==
+            b;
+        if ((this.feature = this.layer.getFeatureFromEvent(a)) && !this.feature.layer) this.feature = null;
+        this.lastFeature && !this.lastFeature.layer && (this.lastFeature = null);
+        this.feature ? ("touchstart" === b && OpenLayers.Event.stop(a), a = this.feature != this.lastFeature, this.geometryTypeMatches(this.feature) ? (d && a ? (this.lastFeature && this.triggerCallback(b, "out", [this.lastFeature]), this.triggerCallback(b, "in", [this.feature])) : (!d || e) && this.triggerCallback(b, "in", [this.feature]), this.lastFeature = this.feature, c = !0) : (this.lastFeature &&
+            (d && a || e) && this.triggerCallback(b, "out", [this.lastFeature]), this.feature = null)) : this.lastFeature && (d || e) && this.triggerCallback(b, "out", [this.lastFeature]);
+        return c
+    },
+    triggerCallback: function(a, b, c) {
+        (b = this.EVENTMAP[a][b]) && ("click" == a && this.up && this.down ? Math.sqrt(Math.pow(this.up.x - this.down.x, 2) + Math.pow(this.up.y - this.down.y, 2)) <= this.clickTolerance && this.callback(b, c) : this.callback(b, c))
+    },
+    activate: function() {
+        var a = !1;
+        OpenLayers.Handler.prototype.activate.apply(this, arguments) && (this.moveLayerToTop(),
+            this.map.events.on({
+                removelayer: this.handleMapEvents,
+                changelayer: this.handleMapEvents,
+                scope: this
+            }), a = !0);
+        return a
+    },
+    deactivate: function() {
+        var a = !1;
+        OpenLayers.Handler.prototype.deactivate.apply(this, arguments) && (this.moveLayerBack(), this.up = this.down = this.lastFeature = this.feature = null, this.touch = !1, this.map.events.un({
+            removelayer: this.handleMapEvents,
+            changelayer: this.handleMapEvents,
+            scope: this
+        }), a = !0);
+        return a
+    },
+    handleMapEvents: function(a) {
+        ("removelayer" == a.type || "order" == a.property) && this.moveLayerToTop()
+    },
+    moveLayerToTop: function() {
+        this.layer.setZIndex(Math.max(this.map.Z_INDEX_BASE.Feature - 1, this.layer.getZIndex()) + 1)
+    },
+    moveLayerBack: function() {
+        var a = this.layer.getZIndex() - 1;
+        a >= this.map.Z_INDEX_BASE.Feature ? this.layer.setZIndex(a) : this.map.setLayerZIndex(this.layer, this.map.getLayerIndex(this.layer))
+    },
+    CLASS_NAME: "OpenLayers.Handler.Feature"
+});
+OpenLayers.Control.DragFeature = OpenLayers.Class(OpenLayers.Control, {
+    geometryTypes: null,
+    onStart: function() {},
+    onDrag: function() {},
+    onComplete: function() {},
+    onEnter: function() {},
+    onLeave: function() {},
+    documentDrag: !1,
+    layer: null,
+    feature: null,
+    dragCallbacks: {},
+    featureCallbacks: {},
+    lastPixel: null,
+    initialize: function(a, b) {
+        OpenLayers.Control.prototype.initialize.apply(this, [b]);
+        this.layer = a;
+        this.handlers = {
+            drag: new OpenLayers.Handler.Drag(this, OpenLayers.Util.extend({
+                down: this.downFeature,
+                move: this.moveFeature,
+                up: this.upFeature,
+                out: this.cancel,
+                done: this.doneDragging
+            }, this.dragCallbacks), {
+                documentDrag: this.documentDrag
+            }),
+            feature: new OpenLayers.Handler.Feature(this, this.layer, OpenLayers.Util.extend({
+                click: this.clickFeature,
+                clickout: this.clickoutFeature,
+                over: this.overFeature,
+                out: this.outFeature
+            }, this.featureCallbacks), {
+                geometryTypes: this.geometryTypes
+            })
+        }
+    },
+    clickFeature: function(a) {
+        this.handlers.feature.touch && (!this.over && this.overFeature(a)) && (this.handlers.drag.dragstart(this.handlers.feature.evt), this.handlers.drag.stopDown = !1)
+    },
+    clickoutFeature: function(a) {
+        this.handlers.feature.touch && this.over && (this.outFeature(a), this.handlers.drag.stopDown = !0)
+    },
+    destroy: function() {
+        this.layer = null;
+        OpenLayers.Control.prototype.destroy.apply(this, [])
+    },
+    activate: function() {
+        return this.handlers.feature.activate() && OpenLayers.Control.prototype.activate.apply(this, arguments)
+    },
+    deactivate: function() {
+        this.handlers.drag.deactivate();
+        this.handlers.feature.deactivate();
+        this.feature = null;
+        this.dragging = !1;
+        this.lastPixel = null;
+        OpenLayers.Element.removeClass(this.map.viewPortDiv,
+            this.displayClass + "Over");
+        return OpenLayers.Control.prototype.deactivate.apply(this, arguments)
+    },
+    overFeature: function(a) {
+        var b = !1;
+        this.handlers.drag.dragging ? this.over = this.feature.id == a.id ? !0 : !1 : (this.feature = a, this.handlers.drag.activate(), this.over = b = !0, OpenLayers.Element.addClass(this.map.viewPortDiv, this.displayClass + "Over"), this.onEnter(a));
+        return b
+    },
+    downFeature: function(a) {
+        this.lastPixel = a;
+        this.onStart(this.feature, a)
+    },
+    moveFeature: function(a) {
+        var b = this.map.getResolution();
+        this.feature.geometry.move(b *
+            (a.x - this.lastPixel.x), b * (this.lastPixel.y - a.y));
+        this.layer.drawFeature(this.feature);
+        this.lastPixel = a;
+        this.onDrag(this.feature, a)
+    },
+    upFeature: function() {
+        this.over || this.handlers.drag.deactivate()
+    },
+    doneDragging: function(a) {
+        this.onComplete(this.feature, a)
+    },
+    outFeature: function(a) {
+        this.handlers.drag.dragging ? this.feature.id == a.id && (this.over = !1) : (this.over = !1, this.handlers.drag.deactivate(), OpenLayers.Element.removeClass(this.map.viewPortDiv, this.displayClass + "Over"), this.onLeave(a), this.feature = null)
+    },
+    cancel: function() {
+        this.handlers.drag.deactivate();
+        this.over = !1
+    },
+    setMap: function(a) {
+        this.handlers.drag.setMap(a);
+        this.handlers.feature.setMap(a);
+        OpenLayers.Control.prototype.setMap.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Control.DragFeature"
+});
+OpenLayers.StyleMap = OpenLayers.Class({
+    styles: null,
+    extendDefault: !0,
+    initialize: function(a, b) {
+        this.styles = {
+            "default": new OpenLayers.Style(OpenLayers.Feature.Vector.style["default"]),
+            select: new OpenLayers.Style(OpenLayers.Feature.Vector.style.select),
+            temporary: new OpenLayers.Style(OpenLayers.Feature.Vector.style.temporary),
+            "delete": new OpenLayers.Style(OpenLayers.Feature.Vector.style["delete"])
+        };
+        if (a instanceof OpenLayers.Style) this.styles["default"] = a, this.styles.select = a, this.styles.temporary = a, this.styles["delete"] =
+            a;
+        else if ("object" == typeof a)
+            for (var c in a)
+                if (a[c] instanceof OpenLayers.Style) this.styles[c] = a[c];
+                else if ("object" == typeof a[c]) this.styles[c] = new OpenLayers.Style(a[c]);
+        else {
+            this.styles["default"] = new OpenLayers.Style(a);
+            this.styles.select = new OpenLayers.Style(a);
+            this.styles.temporary = new OpenLayers.Style(a);
+            this.styles["delete"] = new OpenLayers.Style(a);
+            break
+        }
+        OpenLayers.Util.extend(this, b)
+    },
+    destroy: function() {
+        for (var a in this.styles) this.styles[a].destroy();
+        this.styles = null
+    },
+    createSymbolizer: function(a,
+        b) {
+        a || (a = new OpenLayers.Feature.Vector);
+        this.styles[b] || (b = "default");
+        a.renderIntent = b;
+        var c = {};
+        this.extendDefault && "default" != b && (c = this.styles["default"].createSymbolizer(a));
+        return OpenLayers.Util.extend(c, this.styles[b].createSymbolizer(a))
+    },
+    addUniqueValueRules: function(a, b, c, d) {
+        var e = [],
+            f;
+        for (f in c) e.push(new OpenLayers.Rule({
+            symbolizer: c[f],
+            context: d,
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                property: b,
+                value: f
+            })
+        }));
+        this.styles[a].addRules(e)
+    },
+    CLASS_NAME: "OpenLayers.StyleMap"
+});
+OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
+    isBaseLayer: !1,
+    isFixed: !1,
+    features: null,
+    filter: null,
+    selectedFeatures: null,
+    unrenderedFeatures: null,
+    reportError: !0,
+    style: null,
+    styleMap: null,
+    strategies: null,
+    protocol: null,
+    renderers: ["SVG", "VML", "Canvas"],
+    renderer: null,
+    rendererOptions: null,
+    geometryType: null,
+    drawn: !1,
+    ratio: 1,
+    initialize: function(a, b) {
+        OpenLayers.Layer.prototype.initialize.apply(this, arguments);
+        (!this.renderer || !this.renderer.supported()) && this.assignRenderer();
+        if (!this.renderer ||
+            !this.renderer.supported()) this.renderer = null, this.displayError();
+        this.styleMap || (this.styleMap = new OpenLayers.StyleMap);
+        this.features = [];
+        this.selectedFeatures = [];
+        this.unrenderedFeatures = {};
+        if (this.strategies)
+            for (var c = 0, d = this.strategies.length; c < d; c++) this.strategies[c].setLayer(this)
+    },
+    destroy: function() {
+        if (this.strategies) {
+            var a, b, c;
+            b = 0;
+            for (c = this.strategies.length; b < c; b++) a = this.strategies[b], a.autoDestroy && a.destroy();
+            this.strategies = null
+        }
+        this.protocol && (this.protocol.autoDestroy && this.protocol.destroy(),
+            this.protocol = null);
+        this.destroyFeatures();
+        this.unrenderedFeatures = this.selectedFeatures = this.features = null;
+        this.renderer && this.renderer.destroy();
+        this.drawn = this.geometryType = this.renderer = null;
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments)
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.Vector(this.name, this.getOptions()));
+        for (var a = OpenLayers.Layer.prototype.clone.apply(this, [a]), b = this.features, c = b.length, d = Array(c), e = 0; e < c; ++e) d[e] = b[e].clone();
+        a.features = d;
+        return a
+    },
+    refresh: function(a) {
+        this.calculateInRange() &&
+            this.visibility && this.events.triggerEvent("refresh", a)
+    },
+    assignRenderer: function() {
+        for (var a = 0, b = this.renderers.length; a < b; a++) {
+            var c = this.renderers[a];
+            if ((c = "function" == typeof c ? c : OpenLayers.Renderer[c]) && c.prototype.supported()) {
+                this.renderer = new c(this.div, this.rendererOptions);
+                break
+            }
+        }
+    },
+    displayError: function() {
+        this.reportError && OpenLayers.Console.userError(OpenLayers.i18n("browserNotSupported", {
+            renderers: this.renderers.join("\n")
+        }))
+    },
+    setMap: function(a) {
+        OpenLayers.Layer.prototype.setMap.apply(this,
+            arguments);
+        if (this.renderer) {
+            this.renderer.map = this.map;
+            var b = this.map.getSize();
+            b.w *= this.ratio;
+            b.h *= this.ratio;
+            this.renderer.setSize(b)
+        } else this.map.removeLayer(this)
+    },
+    afterAdd: function() {
+        if (this.strategies) {
+            var a, b, c;
+            b = 0;
+            for (c = this.strategies.length; b < c; b++) a = this.strategies[b], a.autoActivate && a.activate()
+        }
+    },
+    removeMap: function() {
+        this.drawn = !1;
+        if (this.strategies) {
+            var a, b, c;
+            b = 0;
+            for (c = this.strategies.length; b < c; b++) a = this.strategies[b], a.autoActivate && a.deactivate()
+        }
+    },
+    onMapResize: function() {
+        OpenLayers.Layer.prototype.onMapResize.apply(this,
+            arguments);
+        var a = this.map.getSize();
+        a.w *= this.ratio;
+        a.h *= this.ratio;
+        this.renderer.setSize(a)
+    },
+    moveTo: function(a, b, c) {
+        OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
+        var d = !0;
+        if (!c) {
+            this.renderer.root.style.visibility = "hidden";
+            var d = this.map.getSize(),
+                e = d.w,
+                d = d.h,
+                e = e / 2 * this.ratio - e / 2,
+                d = d / 2 * this.ratio - d / 2,
+                e = e + parseInt(this.map.layerContainerDiv.style.left, 10),
+                e = -Math.round(e),
+                d = d + parseInt(this.map.layerContainerDiv.style.top, 10),
+                d = -Math.round(d);
+            this.div.style.left = e + "px";
+            this.div.style.top =
+                d + "px";
+            d = this.renderer.setExtent(this.map.getExtent().scale(this.ratio), b);
+            this.renderer.root.style.visibility = "visible";
+            !0 === OpenLayers.IS_GECKO && (this.div.scrollLeft = this.div.scrollLeft);
+            if (!b && d)
+                for (var f in this.unrenderedFeatures) e = this.unrenderedFeatures[f], this.drawFeature(e)
+        }
+        if (!this.drawn || b || !d) {
+            this.drawn = !0;
+            f = 0;
+            for (d = this.features.length; f < d; f++) this.renderer.locked = f !== d - 1, e = this.features[f], this.drawFeature(e)
+        }
+    },
+    display: function(a) {
+        OpenLayers.Layer.prototype.display.apply(this, arguments);
+        var b = this.div.style.display;
+        b != this.renderer.root.style.display && (this.renderer.root.style.display = b)
+    },
+    addFeatures: function(a, b) {
+        OpenLayers.Util.isArray(a) || (a = [a]);
+        var c = !b || !b.silent;
+        if (c) {
+            var d = {
+                features: a
+            };
+            if (!1 === this.events.triggerEvent("beforefeaturesadded", d)) return;
+            a = d.features
+        }
+        for (var d = [], e = 0, f = a.length; e < f; e++) {
+            this.renderer.locked = e != a.length - 1 ? !0 : !1;
+            var g = a[e];
+            if (this.geometryType && !(g.geometry instanceof this.geometryType)) throw new TypeError("addFeatures: component should be an " +
+                this.geometryType.prototype.CLASS_NAME);
+            g.layer = this;
+            !g.style && this.style && (g.style = OpenLayers.Util.extend({}, this.style));
+            if (c) {
+                if (!1 === this.events.triggerEvent("beforefeatureadded", {
+                        feature: g
+                    })) continue;
+                this.preFeatureInsert(g)
+            }
+            d.push(g);
+            this.features.push(g);
+            this.drawFeature(g);
+            c && (this.events.triggerEvent("featureadded", {
+                feature: g
+            }), this.onFeatureInsert(g))
+        }
+        c && this.events.triggerEvent("featuresadded", {
+            features: d
+        })
+    },
+    removeFeatures: function(a, b) {
+        if (a && 0 !== a.length) {
+            if (a === this.features) return this.removeAllFeatures(b);
+            OpenLayers.Util.isArray(a) || (a = [a]);
+            a === this.selectedFeatures && (a = a.slice());
+            var c = !b || !b.silent;
+            c && this.events.triggerEvent("beforefeaturesremoved", {
+                features: a
+            });
+            for (var d = a.length - 1; 0 <= d; d--) {
+                this.renderer.locked = 0 != d && a[d - 1].geometry ? !0 : !1;
+                var e = a[d];
+                delete this.unrenderedFeatures[e.id];
+                c && this.events.triggerEvent("beforefeatureremoved", {
+                    feature: e
+                });
+                this.features = OpenLayers.Util.removeItem(this.features, e);
+                e.layer = null;
+                e.geometry && this.renderer.eraseFeatures(e); - 1 != OpenLayers.Util.indexOf(this.selectedFeatures,
+                    e) && OpenLayers.Util.removeItem(this.selectedFeatures, e);
+                c && this.events.triggerEvent("featureremoved", {
+                    feature: e
+                })
+            }
+            c && this.events.triggerEvent("featuresremoved", {
+                features: a
+            })
+        }
+    },
+    removeAllFeatures: function(a) {
+        var a = !a || !a.silent,
+            b = this.features;
+        a && this.events.triggerEvent("beforefeaturesremoved", {
+            features: b
+        });
+        for (var c, d = b.length - 1; 0 <= d; d--) c = b[d], a && this.events.triggerEvent("beforefeatureremoved", {
+            feature: c
+        }), c.layer = null, a && this.events.triggerEvent("featureremoved", {
+            feature: c
+        });
+        this.renderer.clear();
+        this.features = [];
+        this.unrenderedFeatures = {};
+        this.selectedFeatures = [];
+        a && this.events.triggerEvent("featuresremoved", {
+            features: b
+        })
+    },
+    destroyFeatures: function(a, b) {
+        void 0 == a && (a = this.features);
+        if (a) {
+            this.removeFeatures(a, b);
+            for (var c = a.length - 1; 0 <= c; c--) a[c].destroy()
+        }
+    },
+    drawFeature: function(a, b) {
+        if (this.drawn) {
+            if ("object" != typeof b) {
+                !b && a.state === OpenLayers.State.DELETE && (b = "delete");
+                var c = b || a.renderIntent;
+                (b = a.style || this.style) || (b = this.styleMap.createSymbolizer(a, c))
+            }
+            c = this.renderer.drawFeature(a,
+                b);
+            !1 === c || null === c ? this.unrenderedFeatures[a.id] = a : delete this.unrenderedFeatures[a.id]
+        }
+    },
+    eraseFeatures: function(a) {
+        this.renderer.eraseFeatures(a)
+    },
+    getFeatureFromEvent: function(a) {
+        if (!this.renderer) throw Error("getFeatureFromEvent called on layer with no renderer. This usually means you destroyed a layer, but not some handler which is associated with it.");
+        var b = null;
+        (a = this.renderer.getFeatureIdFromEvent(a)) && (b = "string" === typeof a ? this.getFeatureById(a) : a);
+        return b
+    },
+    getFeatureBy: function(a, b) {
+        for (var c =
+                null, d = 0, e = this.features.length; d < e; ++d)
+            if (this.features[d][a] == b) {
+                c = this.features[d];
+                break
+            }
+        return c
+    },
+    getFeatureById: function(a) {
+        return this.getFeatureBy("id", a)
+    },
+    getFeatureByFid: function(a) {
+        return this.getFeatureBy("fid", a)
+    },
+    getFeaturesByAttribute: function(a, b) {
+        var c, d, e = this.features.length,
+            f = [];
+        for (c = 0; c < e; c++)(d = this.features[c]) && d.attributes && d.attributes[a] === b && f.push(d);
+        return f
+    },
+    onFeatureInsert: function() {},
+    preFeatureInsert: function() {},
+    getDataExtent: function() {
+        var a = null,
+            b = this.features;
+        if (b && 0 < b.length)
+            for (var c = null, d = 0, e = b.length; d < e; d++)
+                if (c = b[d].geometry) null === a && (a = new OpenLayers.Bounds), a.extend(c.getBounds());
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Layer.Vector"
+});
+OpenLayers.Layer.Vector.RootContainer = OpenLayers.Class(OpenLayers.Layer.Vector, {
+    displayInLayerSwitcher: !1,
+    layers: null,
+    display: function() {},
+    getFeatureFromEvent: function(a) {
+        for (var b = this.layers, c, d = 0; d < b.length; d++)
+            if (c = b[d].getFeatureFromEvent(a)) return c
+    },
+    setMap: function(a) {
+        OpenLayers.Layer.Vector.prototype.setMap.apply(this, arguments);
+        this.collectRoots();
+        a.events.register("changelayer", this, this.handleChangeLayer)
+    },
+    removeMap: function(a) {
+        a.events.unregister("changelayer", this, this.handleChangeLayer);
+        this.resetRoots();
+        OpenLayers.Layer.Vector.prototype.removeMap.apply(this, arguments)
+    },
+    collectRoots: function() {
+        for (var a, b = 0; b < this.map.layers.length; ++b) a = this.map.layers[b], -1 != OpenLayers.Util.indexOf(this.layers, a) && a.renderer.moveRoot(this.renderer)
+    },
+    resetRoots: function() {
+        for (var a, b = 0; b < this.layers.length; ++b) a = this.layers[b], this.renderer && a.renderer.getRenderLayerId() == this.id && this.renderer.moveRoot(a.renderer)
+    },
+    handleChangeLayer: function(a) {
+        var b = a.layer;
+        "order" == a.property && -1 != OpenLayers.Util.indexOf(this.layers,
+            b) && (this.resetRoots(), this.collectRoots())
+    },
+    CLASS_NAME: "OpenLayers.Layer.Vector.RootContainer"
+});
+OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
+    multipleKey: null,
+    toggleKey: null,
+    multiple: !1,
+    clickout: !0,
+    toggle: !1,
+    hover: !1,
+    highlightOnly: !1,
+    box: !1,
+    onBeforeSelect: function() {},
+    onSelect: function() {},
+    onUnselect: function() {},
+    scope: null,
+    geometryTypes: null,
+    layer: null,
+    layers: null,
+    callbacks: null,
+    selectStyle: null,
+    renderIntent: "select",
+    handlers: null,
+    initialize: function(a, b) {
+        OpenLayers.Control.prototype.initialize.apply(this, [b]);
+        null === this.scope && (this.scope = this);
+        this.initLayer(a);
+        var c = {
+            click: this.clickFeature,
+            clickout: this.clickoutFeature
+        };
+        this.hover && (c.over = this.overFeature, c.out = this.outFeature);
+        this.callbacks = OpenLayers.Util.extend(c, this.callbacks);
+        this.handlers = {
+            feature: new OpenLayers.Handler.Feature(this, this.layer, this.callbacks, {
+                geometryTypes: this.geometryTypes
+            })
+        };
+        this.box && (this.handlers.box = new OpenLayers.Handler.Box(this, {
+            done: this.selectBox
+        }, {
+            boxDivClassName: "olHandlerBoxSelectFeature"
+        }))
+    },
+    initLayer: function(a) {
+        OpenLayers.Util.isArray(a) ? (this.layers = a, this.layer =
+            new OpenLayers.Layer.Vector.RootContainer(this.id + "_container", {
+                layers: a
+            })) : this.layer = a
+    },
+    destroy: function() {
+        this.active && this.layers && this.map.removeLayer(this.layer);
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+        this.layers && this.layer.destroy()
+    },
+    activate: function() {
+        this.active || (this.layers && this.map.addLayer(this.layer), this.handlers.feature.activate(), this.box && this.handlers.box && this.handlers.box.activate());
+        return OpenLayers.Control.prototype.activate.apply(this, arguments)
+    },
+    deactivate: function() {
+        this.active &&
+            (this.handlers.feature.deactivate(), this.handlers.box && this.handlers.box.deactivate(), this.layers && this.map.removeLayer(this.layer));
+        return OpenLayers.Control.prototype.deactivate.apply(this, arguments)
+    },
+    unselectAll: function(a) {
+        for (var b = this.layers || [this.layer], c, d, e = 0; e < b.length; ++e) {
+            c = b[e];
+            for (var f = c.selectedFeatures.length - 1; 0 <= f; --f) d = c.selectedFeatures[f], (!a || a.except != d) && this.unselect(d)
+        }
+    },
+    clickFeature: function(a) {
+        this.hover || (-1 < OpenLayers.Util.indexOf(a.layer.selectedFeatures, a) ? this.toggleSelect() ?
+            this.unselect(a) : this.multipleSelect() || this.unselectAll({
+                except: a
+            }) : (this.multipleSelect() || this.unselectAll({
+                except: a
+            }), this.select(a)))
+    },
+    multipleSelect: function() {
+        return this.multiple || this.handlers.feature.evt && this.handlers.feature.evt[this.multipleKey]
+    },
+    toggleSelect: function() {
+        return this.toggle || this.handlers.feature.evt && this.handlers.feature.evt[this.toggleKey]
+    },
+    clickoutFeature: function() {
+        !this.hover && this.clickout && this.unselectAll()
+    },
+    overFeature: function(a) {
+        var b = a.layer;
+        this.hover && (this.highlightOnly ?
+            this.highlight(a) : -1 == OpenLayers.Util.indexOf(b.selectedFeatures, a) && this.select(a))
+    },
+    outFeature: function(a) {
+        if (this.hover)
+            if (this.highlightOnly) {
+                if (a._lastHighlighter == this.id)
+                    if (a._prevHighlighter && a._prevHighlighter != this.id) {
+                        delete a._lastHighlighter;
+                        var b = this.map.getControl(a._prevHighlighter);
+                        b && b.highlight(a)
+                    } else this.unhighlight(a)
+            } else this.unselect(a)
+    },
+    highlight: function(a) {
+        var b = a.layer;
+        !1 !== this.events.triggerEvent("beforefeaturehighlighted", {
+            feature: a
+        }) && (a._prevHighlighter = a._lastHighlighter,
+            a._lastHighlighter = this.id, b.drawFeature(a, this.selectStyle || this.renderIntent), this.events.triggerEvent("featurehighlighted", {
+                feature: a
+            }))
+    },
+    unhighlight: function(a) {
+        var b = a.layer;
+        void 0 == a._prevHighlighter ? delete a._lastHighlighter : (a._prevHighlighter != this.id && (a._lastHighlighter = a._prevHighlighter), delete a._prevHighlighter);
+        b.drawFeature(a, a.style || a.layer.style || "default");
+        this.events.triggerEvent("featureunhighlighted", {
+            feature: a
+        })
+    },
+    select: function(a) {
+        var b = this.onBeforeSelect.call(this.scope,
+                a),
+            c = a.layer;
+        !1 !== b && (b = c.events.triggerEvent("beforefeatureselected", {
+            feature: a
+        }), !1 !== b && (c.selectedFeatures.push(a), this.highlight(a), this.handlers.feature.lastFeature || (this.handlers.feature.lastFeature = c.selectedFeatures[0]), c.events.triggerEvent("featureselected", {
+            feature: a
+        }), this.onSelect.call(this.scope, a)))
+    },
+    unselect: function(a) {
+        var b = a.layer;
+        this.unhighlight(a);
+        OpenLayers.Util.removeItem(b.selectedFeatures, a);
+        b.events.triggerEvent("featureunselected", {
+            feature: a
+        });
+        this.onUnselect.call(this.scope,
+            a)
+    },
+    selectBox: function(a) {
+        if (a instanceof OpenLayers.Bounds) {
+            var b = this.map.getLonLatFromPixel({
+                    x: a.left,
+                    y: a.bottom
+                }),
+                a = this.map.getLonLatFromPixel({
+                    x: a.right,
+                    y: a.top
+                }),
+                b = new OpenLayers.Bounds(b.lon, b.lat, a.lon, a.lat);
+            this.multipleSelect() || this.unselectAll();
+            a = this.multiple;
+            this.multiple = !0;
+            var c = this.layers || [this.layer];
+            this.events.triggerEvent("boxselectionstart", {
+                layers: c
+            });
+            for (var d, e = 0; e < c.length; ++e) {
+                d = c[e];
+                for (var f = 0, g = d.features.length; f < g; ++f) {
+                    var h = d.features[f];
+                    h.getVisibility() && (null ==
+                        this.geometryTypes || -1 < OpenLayers.Util.indexOf(this.geometryTypes, h.geometry.CLASS_NAME)) && b.toGeometry().intersects(h.geometry) && -1 == OpenLayers.Util.indexOf(d.selectedFeatures, h) && this.select(h)
+                }
+            }
+            this.multiple = a;
+            this.events.triggerEvent("boxselectionend", {
+                layers: c
+            })
+        }
+    },
+    setMap: function(a) {
+        this.handlers.feature.setMap(a);
+        this.box && this.handlers.box.setMap(a);
+        OpenLayers.Control.prototype.setMap.apply(this, arguments)
+    },
+    setLayer: function(a) {
+        var b = this.active;
+        this.unselectAll();
+        this.deactivate();
+        this.layers &&
+            (this.layer.destroy(), this.layers = null);
+        this.initLayer(a);
+        this.handlers.feature.layer = this.layer;
+        b && this.activate()
+    },
+    CLASS_NAME: "OpenLayers.Control.SelectFeature"
+});
+OpenLayers.Handler.Keyboard = OpenLayers.Class(OpenLayers.Handler, {
+    KEY_EVENTS: ["keydown", "keyup"],
+    eventListener: null,
+    observeElement: null,
+    initialize: function(a, b, c) {
+        OpenLayers.Handler.prototype.initialize.apply(this, arguments);
+        this.eventListener = OpenLayers.Function.bindAsEventListener(this.handleKeyEvent, this)
+    },
+    destroy: function() {
+        this.deactivate();
+        this.eventListener = null;
+        OpenLayers.Handler.prototype.destroy.apply(this, arguments)
+    },
+    activate: function() {
+        if (OpenLayers.Handler.prototype.activate.apply(this,
+                arguments)) {
+            this.observeElement = this.observeElement || document;
+            for (var a = 0, b = this.KEY_EVENTS.length; a < b; a++) OpenLayers.Event.observe(this.observeElement, this.KEY_EVENTS[a], this.eventListener);
+            return !0
+        }
+        return !1
+    },
+    deactivate: function() {
+        var a = !1;
+        if (OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
+            for (var a = 0, b = this.KEY_EVENTS.length; a < b; a++) OpenLayers.Event.stopObserving(this.observeElement, this.KEY_EVENTS[a], this.eventListener);
+            a = !0
+        }
+        return a
+    },
+    handleKeyEvent: function(a) {
+        this.checkModifiers(a) &&
+            this.callback(a.type, [a])
+    },
+    CLASS_NAME: "OpenLayers.Handler.Keyboard"
+});
+OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
+    geometryTypes: null,
+    clickout: !0,
+    toggle: !0,
+    standalone: !1,
+    layer: null,
+    feature: null,
+    vertices: null,
+    virtualVertices: null,
+    selectControl: null,
+    dragControl: null,
+    handlers: null,
+    deleteCodes: null,
+    virtualStyle: null,
+    vertexRenderIntent: null,
+    mode: null,
+    createVertices: !0,
+    modified: !1,
+    radiusHandle: null,
+    dragHandle: null,
+    onModificationStart: function() {},
+    onModification: function() {},
+    onModificationEnd: function() {},
+    initialize: function(a, b) {
+        b = b || {};
+        this.layer =
+            a;
+        this.vertices = [];
+        this.virtualVertices = [];
+        this.virtualStyle = OpenLayers.Util.extend({}, this.layer.style || this.layer.styleMap.createSymbolizer(null, b.vertexRenderIntent));
+        this.virtualStyle.fillOpacity = 0.3;
+        this.virtualStyle.strokeOpacity = 0.3;
+        this.deleteCodes = [46, 68];
+        this.mode = OpenLayers.Control.ModifyFeature.RESHAPE;
+        OpenLayers.Control.prototype.initialize.apply(this, [b]);
+        OpenLayers.Util.isArray(this.deleteCodes) || (this.deleteCodes = [this.deleteCodes]);
+        var c = this,
+            d = {
+                geometryTypes: this.geometryTypes,
+                clickout: this.clickout,
+                toggle: this.toggle,
+                onBeforeSelect: this.beforeSelectFeature,
+                onSelect: this.selectFeature,
+                onUnselect: this.unselectFeature,
+                scope: this
+            };
+        !1 === this.standalone && (this.selectControl = new OpenLayers.Control.SelectFeature(a, d));
+        this.dragControl = new OpenLayers.Control.DragFeature(a, {
+            geometryTypes: ["OpenLayers.Geometry.Point"],
+            onStart: function(a, b) {
+                c.dragStart.apply(c, [a, b])
+            },
+            onDrag: function(a, b) {
+                c.dragVertex.apply(c, [a, b])
+            },
+            onComplete: function(a) {
+                c.dragComplete.apply(c, [a])
+            },
+            featureCallbacks: {
+                over: function(a) {
+                    (c.standalone !==
+                        true || a._sketch || c.feature === a) && c.dragControl.overFeature.apply(c.dragControl, [a])
+                }
+            }
+        });
+        this.handlers = {
+            keyboard: new OpenLayers.Handler.Keyboard(this, {
+                keydown: this.handleKeypress
+            })
+        }
+    },
+    destroy: function() {
+        this.layer = null;
+        this.standalone || this.selectControl.destroy();
+        this.dragControl.destroy();
+        OpenLayers.Control.prototype.destroy.apply(this, [])
+    },
+    activate: function() {
+        return (this.standalone || this.selectControl.activate()) && this.handlers.keyboard.activate() && OpenLayers.Control.prototype.activate.apply(this,
+            arguments)
+    },
+    deactivate: function() {
+        var a = !1;
+        if (OpenLayers.Control.prototype.deactivate.apply(this, arguments)) {
+            this.layer.removeFeatures(this.vertices, {
+                silent: !0
+            });
+            this.layer.removeFeatures(this.virtualVertices, {
+                silent: !0
+            });
+            this.vertices = [];
+            this.dragControl.deactivate();
+            var b = (a = this.feature) && a.geometry && a.layer;
+            !1 === this.standalone ? (b && this.selectControl.unselect.apply(this.selectControl, [a]), this.selectControl.deactivate()) : b && this.unselectFeature(a);
+            this.handlers.keyboard.deactivate();
+            a = !0
+        }
+        return a
+    },
+    beforeSelectFeature: function(a) {
+        return this.layer.events.triggerEvent("beforefeaturemodified", {
+            feature: a
+        })
+    },
+    selectFeature: function(a) {
+        if (!this.standalone || !1 !== this.beforeSelectFeature(a)) this.feature = a, this.modified = !1, this.resetVertices(), this.dragControl.activate(), this.onModificationStart(this.feature);
+        var b = a.modified;
+        if (a.geometry && (!b || !b.geometry)) this._originalGeometry = a.geometry.clone()
+    },
+    unselectFeature: function(a) {
+        this.layer.removeFeatures(this.vertices, {
+            silent: !0
+        });
+        this.vertices = [];
+        this.layer.destroyFeatures(this.virtualVertices, {
+            silent: !0
+        });
+        this.virtualVertices = [];
+        this.dragHandle && (this.layer.destroyFeatures([this.dragHandle], {
+            silent: !0
+        }), delete this.dragHandle);
+        this.radiusHandle && (this.layer.destroyFeatures([this.radiusHandle], {
+            silent: !0
+        }), delete this.radiusHandle);
+        this.feature = null;
+        this.dragControl.deactivate();
+        this.onModificationEnd(a);
+        this.layer.events.triggerEvent("afterfeaturemodified", {
+            feature: a,
+            modified: this.modified
+        });
+        this.modified = !1
+    },
+    dragStart: function(a, b) {
+        if (a != this.feature && (!a.geometry.parent && a != this.dragHandle &&
+                a != this.radiusHandle) && (!1 === this.standalone && this.feature && this.selectControl.clickFeature.apply(this.selectControl, [this.feature]), null == this.geometryTypes || -1 != OpenLayers.Util.indexOf(this.geometryTypes, a.geometry.CLASS_NAME))) this.standalone || this.selectControl.clickFeature.apply(this.selectControl, [a]), this.dragControl.overFeature.apply(this.dragControl, [a]), this.dragControl.lastPixel = b, this.dragControl.handlers.drag.started = !0, this.dragControl.handlers.drag.start = b, this.dragControl.handlers.drag.last =
+            b
+    },
+    dragVertex: function(a, b) {
+        this.modified = !0;
+        "OpenLayers.Geometry.Point" == this.feature.geometry.CLASS_NAME ? (this.feature != a && (this.feature = a), this.layer.events.triggerEvent("vertexmodified", {
+            vertex: a.geometry,
+            feature: this.feature,
+            pixel: b
+        })) : (a._index ? (a.geometry.parent.addComponent(a.geometry, a._index), delete a._index, OpenLayers.Util.removeItem(this.virtualVertices, a), this.vertices.push(a)) : a == this.dragHandle ? (this.layer.removeFeatures(this.vertices, {
+                silent: !0
+            }), this.vertices = [], this.radiusHandle &&
+            (this.layer.destroyFeatures([this.radiusHandle], {
+                silent: !0
+            }), this.radiusHandle = null)) : a !== this.radiusHandle && this.layer.events.triggerEvent("vertexmodified", {
+            vertex: a.geometry,
+            feature: this.feature,
+            pixel: b
+        }), 0 < this.virtualVertices.length && (this.layer.destroyFeatures(this.virtualVertices, {
+            silent: !0
+        }), this.virtualVertices = []), this.layer.drawFeature(this.feature, this.standalone ? void 0 : this.selectControl.renderIntent));
+        this.layer.drawFeature(a)
+    },
+    dragComplete: function() {
+        this.resetVertices();
+        this.setFeatureState();
+        this.onModification(this.feature);
+        this.layer.events.triggerEvent("featuremodified", {
+            feature: this.feature
+        })
+    },
+    setFeatureState: function() {
+        if (this.feature.state != OpenLayers.State.INSERT && this.feature.state != OpenLayers.State.DELETE && (this.feature.state = OpenLayers.State.UPDATE, this.modified && this._originalGeometry)) {
+            var a = this.feature;
+            a.modified = OpenLayers.Util.extend(a.modified, {
+                geometry: this._originalGeometry
+            });
+            delete this._originalGeometry
+        }
+    },
+    resetVertices: function() {
+        this.dragControl.feature && this.dragControl.outFeature(this.dragControl.feature);
+        0 < this.vertices.length && (this.layer.removeFeatures(this.vertices, {
+            silent: !0
+        }), this.vertices = []);
+        0 < this.virtualVertices.length && (this.layer.removeFeatures(this.virtualVertices, {
+            silent: !0
+        }), this.virtualVertices = []);
+        this.dragHandle && (this.layer.destroyFeatures([this.dragHandle], {
+            silent: !0
+        }), this.dragHandle = null);
+        this.radiusHandle && (this.layer.destroyFeatures([this.radiusHandle], {
+            silent: !0
+        }), this.radiusHandle = null);
+        this.feature && "OpenLayers.Geometry.Point" != this.feature.geometry.CLASS_NAME && (this.mode &
+            OpenLayers.Control.ModifyFeature.DRAG && this.collectDragHandle(), this.mode & (OpenLayers.Control.ModifyFeature.ROTATE | OpenLayers.Control.ModifyFeature.RESIZE) && this.collectRadiusHandle(), this.mode & OpenLayers.Control.ModifyFeature.RESHAPE && (this.mode & OpenLayers.Control.ModifyFeature.RESIZE || this.collectVertices()))
+    },
+    handleKeypress: function(a) {
+        var b = a.keyCode;
+        if (this.feature && -1 != OpenLayers.Util.indexOf(this.deleteCodes, b) && (b = this.dragControl.feature) && -1 != OpenLayers.Util.indexOf(this.vertices, b) && !this.dragControl.handlers.drag.dragging &&
+            b.geometry.parent) b.geometry.parent.removeComponent(b.geometry), this.layer.events.triggerEvent("vertexremoved", {
+            vertex: b.geometry,
+            feature: this.feature,
+            pixel: a.xy
+        }), this.layer.drawFeature(this.feature, this.standalone ? void 0 : this.selectControl.renderIntent), this.modified = !0, this.resetVertices(), this.setFeatureState(), this.onModification(this.feature), this.layer.events.triggerEvent("featuremodified", {
+            feature: this.feature
+        })
+    },
+    collectVertices: function() {
+        function a(c) {
+            var d, e, f;
+            if ("OpenLayers.Geometry.Point" ==
+                c.CLASS_NAME) e = new OpenLayers.Feature.Vector(c), e._sketch = !0, e.renderIntent = b.vertexRenderIntent, b.vertices.push(e);
+            else {
+                f = c.components.length;
+                "OpenLayers.Geometry.LinearRing" == c.CLASS_NAME && (f -= 1);
+                for (d = 0; d < f; ++d) e = c.components[d], "OpenLayers.Geometry.Point" == e.CLASS_NAME ? (e = new OpenLayers.Feature.Vector(e), e._sketch = !0, e.renderIntent = b.vertexRenderIntent, b.vertices.push(e)) : a(e);
+                if (b.createVertices && "OpenLayers.Geometry.MultiPoint" != c.CLASS_NAME) {
+                    d = 0;
+                    for (f = c.components.length; d < f - 1; ++d) {
+                        e = c.components[d];
+                        var g = c.components[d + 1];
+                        "OpenLayers.Geometry.Point" == e.CLASS_NAME && "OpenLayers.Geometry.Point" == g.CLASS_NAME && (e = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point((e.x + g.x) / 2, (e.y + g.y) / 2), null, b.virtualStyle), e.geometry.parent = c, e._index = d + 1, e._sketch = !0, b.virtualVertices.push(e))
+                    }
+                }
+            }
+        }
+        this.vertices = [];
+        this.virtualVertices = [];
+        var b = this;
+        a.call(this, this.feature.geometry);
+        this.layer.addFeatures(this.virtualVertices, {
+            silent: !0
+        });
+        this.layer.addFeatures(this.vertices, {
+            silent: !0
+        })
+    },
+    collectDragHandle: function() {
+        var a =
+            this.feature.geometry,
+            b = a.getBounds().getCenterLonLat(),
+            b = new OpenLayers.Geometry.Point(b.lon, b.lat),
+            c = new OpenLayers.Feature.Vector(b);
+        b.move = function(b, c) {
+            OpenLayers.Geometry.Point.prototype.move.call(this, b, c);
+            a.move(b, c)
+        };
+        c._sketch = !0;
+        this.dragHandle = c;
+        this.dragHandle.renderIntent = this.vertexRenderIntent;
+        this.layer.addFeatures([this.dragHandle], {
+            silent: !0
+        })
+    },
+    collectRadiusHandle: function() {
+        var a = this.feature.geometry,
+            b = a.getBounds(),
+            c = b.getCenterLonLat(),
+            d = new OpenLayers.Geometry.Point(c.lon, c.lat),
+            b = new OpenLayers.Geometry.Point(b.right, b.bottom),
+            c = new OpenLayers.Feature.Vector(b),
+            e = this.mode & OpenLayers.Control.ModifyFeature.RESIZE,
+            f = this.mode & OpenLayers.Control.ModifyFeature.RESHAPE,
+            g = this.mode & OpenLayers.Control.ModifyFeature.ROTATE;
+        b.move = function(b, c) {
+            OpenLayers.Geometry.Point.prototype.move.call(this, b, c);
+            var j = this.x - d.x,
+                k = this.y - d.y,
+                l = j - b,
+                m = k - c;
+            if (g) {
+                var n = Math.atan2(m, l),
+                    n = Math.atan2(k, j) - n,
+                    n = n * (180 / Math.PI);
+                a.rotate(n, d)
+            }
+            if (e) {
+                var o;
+                f ? (k /= m, o = j / l / k) : (l = Math.sqrt(l * l + m * m), k = Math.sqrt(j *
+                    j + k * k) / l);
+                a.resize(k, d, o)
+            }
+        };
+        c._sketch = !0;
+        this.radiusHandle = c;
+        this.radiusHandle.renderIntent = this.vertexRenderIntent;
+        this.layer.addFeatures([this.radiusHandle], {
+            silent: !0
+        })
+    },
+    setMap: function(a) {
+        this.standalone || this.selectControl.setMap(a);
+        this.dragControl.setMap(a);
+        OpenLayers.Control.prototype.setMap.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Control.ModifyFeature"
+});
+OpenLayers.Control.ModifyFeature.RESHAPE = 1;
+OpenLayers.Control.ModifyFeature.RESIZE = 2;
+OpenLayers.Control.ModifyFeature.ROTATE = 4;
+OpenLayers.Control.ModifyFeature.DRAG = 8;
+OpenLayers.Layer.Bing = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+    key: null,
+    serverResolutions: [156543.03390625, 78271.516953125, 39135.7584765625, 19567.87923828125, 9783.939619140625, 4891.9698095703125, 2445.9849047851562, 1222.9924523925781, 611.4962261962891, 305.74811309814453, 152.87405654907226, 76.43702827453613, 38.218514137268066, 19.109257068634033, 9.554628534317017, 4.777314267158508, 2.388657133579254, 1.194328566789627, 0.5971642833948135, 0.29858214169740677, 0.14929107084870338, 0.07464553542435169],
+    attributionTemplate: '<span class="olBingAttribution ${type}"><div><a target="_blank" href="http://www.bing.com/maps/"><img src="${logo}" /></a></div>${copyrights}<a style="white-space: nowrap" target="_blank" href="http://www.microsoft.com/maps/product/terms.html">Terms of Use</a></span>',
+    metadata: null,
+    type: "Road",
+    culture: "en-US",
+    metadataParams: null,
+    tileOptions: null,
+    initialize: function(a) {
+        a = OpenLayers.Util.applyDefaults({
+            sphericalMercator: !0
+        }, a);
+        OpenLayers.Layer.XYZ.prototype.initialize.apply(this, [a.name || "Bing " + (a.type || this.type), null, a]);
+        this.tileOptions = OpenLayers.Util.extend({
+            crossOriginKeyword: "anonymous"
+        }, this.options.tileOptions);
+        this.loadMetadata()
+    },
+    loadMetadata: function() {
+        this._callbackId = "_callback_" + this.id.replace(/\./g, "_");
+        window[this._callbackId] = OpenLayers.Function.bind(OpenLayers.Layer.Bing.processMetadata,
+            this);
+        var a = OpenLayers.Util.applyDefaults({
+                key: this.key,
+                jsonp: this._callbackId,
+                include: "ImageryProviders"
+            }, this.metadataParams),
+            a = "http://dev.virtualearth.net/REST/v1/Imagery/Metadata/" + this.type + "?" + OpenLayers.Util.getParameterString(a),
+            b = document.createElement("script");
+        b.type = "text/javascript";
+        b.src = a;
+        b.id = this._callbackId;
+        document.getElementsByTagName("head")[0].appendChild(b)
+    },
+    initLayer: function() {
+        var a = this.metadata.resourceSets[0].resources[0],
+            b = a.imageUrl.replace("{quadkey}", "${quadkey}"),
+            b = b.replace("{culture}", this.culture);
+        this.url = [];
+        for (var c = 0; c < a.imageUrlSubdomains.length; ++c) this.url.push(b.replace("{subdomain}", a.imageUrlSubdomains[c]));
+        this.addOptions({
+            maxResolution: Math.min(this.serverResolutions[a.zoomMin], this.maxResolution || Number.POSITIVE_INFINITY),
+            numZoomLevels: Math.min(a.zoomMax + 1 - a.zoomMin, this.numZoomLevels)
+        }, !0)
+    },
+    getURL: function(a) {
+        if (this.url) {
+            for (var b = this.getXYZ(a), a = b.x, c = b.y, b = b.z, d = [], e = b; 0 < e; --e) {
+                var f = "0",
+                    g = 1 << e - 1;
+                0 != (a & g) && f++;
+                0 != (c & g) && (f++, f++);
+                d.push(f)
+            }
+            d =
+                d.join("");
+            a = this.selectUrl("" + a + c + b, this.url);
+            return OpenLayers.String.format(a, {
+                quadkey: d
+            })
+        }
+    },
+    updateAttribution: function() {
+        var a = this.metadata;
+        if (a.resourceSets && this.map && this.map.center) {
+            var b = a.resourceSets[0].resources[0],
+                c = this.map.getExtent().transform(this.map.getProjectionObject(), new OpenLayers.Projection("EPSG:4326")),
+                b = b.imageryProviders,
+                d = OpenLayers.Util.indexOf(this.serverResolutions, this.getServerResolution()),
+                e = "",
+                f, g, h, i, j, k, l;
+            g = 0;
+            for (h = b.length; g < h; ++g) {
+                f = b[g];
+                i = 0;
+                for (j = f.coverageAreas.length; i <
+                    j; ++i) l = f.coverageAreas[i], k = OpenLayers.Bounds.fromArray(l.bbox, !0), c.intersectsBounds(k) && (d <= l.zoomMax && d >= l.zoomMin) && (e += f.attribution + " ")
+            }
+            this.attribution = OpenLayers.String.format(this.attributionTemplate, {
+                type: this.type.toLowerCase(),
+                logo: a.brandLogoUri,
+                copyrights: e
+            });
+            this.map && this.map.events.triggerEvent("changelayer", {
+                layer: this,
+                property: "attribution"
+            })
+        }
+    },
+    setMap: function() {
+        OpenLayers.Layer.XYZ.prototype.setMap.apply(this, arguments);
+        this.updateAttribution();
+        this.map.events.register("moveend",
+            this, this.updateAttribution)
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.Bing(this.options));
+        return a = OpenLayers.Layer.XYZ.prototype.clone.apply(this, [a])
+    },
+    destroy: function() {
+        this.map && this.map.events.unregister("moveend", this, this.updateAttribution);
+        OpenLayers.Layer.XYZ.prototype.destroy.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Layer.Bing"
+});
+OpenLayers.Layer.Bing.processMetadata = function(a) {
+    this.metadata = a;
+    this.initLayer();
+    a = document.getElementById(this._callbackId);
+    a.parentNode.removeChild(a);
+    window[this._callbackId] = void 0;
+    delete this._callbackId
+};
+OpenLayers.Layer.PointGrid = OpenLayers.Class(OpenLayers.Layer.Vector, {
+    dx: null,
+    dy: null,
+    ratio: 1.5,
+    maxFeatures: 250,
+    rotation: 0,
+    origin: null,
+    gridBounds: null,
+    initialize: function(a) {
+        a = a || {};
+        OpenLayers.Layer.Vector.prototype.initialize.apply(this, [a.name, a])
+    },
+    setMap: function(a) {
+        OpenLayers.Layer.Vector.prototype.setMap.apply(this, arguments);
+        a.events.register("moveend", this, this.onMoveEnd)
+    },
+    removeMap: function(a) {
+        a.events.unregister("moveend", this, this.onMoveEnd);
+        OpenLayers.Layer.Vector.prototype.removeMap.apply(this,
+            arguments)
+    },
+    setRatio: function(a) {
+        this.ratio = a;
+        this.updateGrid(!0)
+    },
+    setMaxFeatures: function(a) {
+        this.maxFeatures = a;
+        this.updateGrid(!0)
+    },
+    setSpacing: function(a, b) {
+        this.dx = a;
+        this.dy = b || a;
+        this.updateGrid(!0)
+    },
+    setOrigin: function(a) {
+        this.origin = a;
+        this.updateGrid(!0)
+    },
+    getOrigin: function() {
+        this.origin || (this.origin = this.map.getExtent().getCenterLonLat());
+        return this.origin
+    },
+    setRotation: function(a) {
+        this.rotation = a;
+        this.updateGrid(!0)
+    },
+    onMoveEnd: function() {
+        this.updateGrid()
+    },
+    getViewBounds: function() {
+        var a = this.map.getExtent();
+        if (this.rotation) {
+            var b = this.getOrigin(),
+                b = new OpenLayers.Geometry.Point(b.lon, b.lat),
+                a = a.toGeometry();
+            a.rotate(-this.rotation, b);
+            a = a.getBounds()
+        }
+        return a
+    },
+    updateGrid: function(a) {
+        if (a || this.invalidBounds()) {
+            var b = this.getViewBounds(),
+                c = this.getOrigin(),
+                a = new OpenLayers.Geometry.Point(c.lon, c.lat),
+                d = b.getWidth(),
+                e = b.getHeight(),
+                f = d / e,
+                g = Math.sqrt(this.dx * this.dy * this.maxFeatures / f),
+                d = Math.min(d * this.ratio, g * f),
+                e = Math.min(e * this.ratio, g),
+                b = b.getCenterLonLat();
+            this.gridBounds = new OpenLayers.Bounds(b.lon -
+                d / 2, b.lat - e / 2, b.lon + d / 2, b.lat + e / 2);
+            for (var b = Math.floor(e / this.dy), d = Math.floor(d / this.dx), e = c.lon + this.dx * Math.ceil((this.gridBounds.left - c.lon) / this.dx), c = c.lat + this.dy * Math.ceil((this.gridBounds.bottom - c.lat) / this.dy), g = Array(b * d), h, i = 0; i < d; ++i)
+                for (var f = e + i * this.dx, j = 0; j < b; ++j) h = c + j * this.dy, h = new OpenLayers.Geometry.Point(f, h), this.rotation && h.rotate(this.rotation, a), g[i * b + j] = new OpenLayers.Feature.Vector(h);
+            this.destroyFeatures(this.features, {
+                silent: !0
+            });
+            this.addFeatures(g, {
+                silent: !0
+            })
+        }
+    },
+    invalidBounds: function() {
+        return !this.gridBounds ||
+            !this.gridBounds.containsBounds(this.getViewBounds())
+    },
+    CLASS_NAME: "OpenLayers.Layer.PointGrid"
+});
+OpenLayers.Handler.MouseWheel = OpenLayers.Class(OpenLayers.Handler, {
+    wheelListener: null,
+    mousePosition: null,
+    interval: 0,
+    delta: 0,
+    cumulative: !0,
+    initialize: function(a, b, c) {
+        OpenLayers.Handler.prototype.initialize.apply(this, arguments);
+        this.wheelListener = OpenLayers.Function.bindAsEventListener(this.onWheelEvent, this)
+    },
+    destroy: function() {
+        OpenLayers.Handler.prototype.destroy.apply(this, arguments);
+        this.wheelListener = null
+    },
+    onWheelEvent: function(a) {
+        if (this.map && this.checkModifiers(a)) {
+            for (var b = !1, c = !1, d = !1, e =
+                    OpenLayers.Event.element(a); null != e && !d && !b;) {
+                if (!b) try {
+                    var f = e.currentStyle ? e.currentStyle.overflow : document.defaultView.getComputedStyle(e, null).getPropertyValue("overflow"),
+                        b = f && "auto" == f || "scroll" == f
+                } catch (g) {}
+                if (!c)
+                    for (var d = 0, h = this.map.layers.length; d < h; d++)
+                        if (e == this.map.layers[d].div || e == this.map.layers[d].pane) {
+                            c = !0;
+                            break
+                        }
+                d = e == this.map.div;
+                e = e.parentNode
+            }!b && d && (c && ((b = 0, a || (a = window.event), a.wheelDelta ? (b = a.wheelDelta / 120, window.opera && 9.2 > window.opera.version() && (b = -b)) : a.detail && (b = -a.detail /
+                3), this.delta += b, this.interval) ? (window.clearTimeout(this._timeoutId), this._timeoutId = window.setTimeout(OpenLayers.Function.bind(function() {
+                this.wheelZoom(a)
+            }, this), this.interval)) : this.wheelZoom(a)), OpenLayers.Event.stop(a))
+        }
+    },
+    wheelZoom: function(a) {
+        var b = this.delta;
+        this.delta = 0;
+        b && (this.mousePosition && (a.xy = this.mousePosition), a.xy || (a.xy = this.map.getPixelFromLonLat(this.map.getCenter())), 0 > b ? this.callback("down", [a, this.cumulative ? b : -1]) : this.callback("up", [a, this.cumulative ? b : 1]))
+    },
+    mousemove: function(a) {
+    //alert(a.xy);
+        this.mousePosition =
+            a.xy
+    },
+    activate: function(a) {
+        if (OpenLayers.Handler.prototype.activate.apply(this, arguments)) {
+            var b = this.wheelListener;
+            OpenLayers.Event.observe(window, "DOMMouseScroll", b);
+            OpenLayers.Event.observe(window, "mousewheel", b);
+            OpenLayers.Event.observe(document, "mousewheel", b);
+            return !0
+        }
+        return !1
+    },
+    deactivate: function(a) {
+        if (OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
+            var b = this.wheelListener;
+            OpenLayers.Event.stopObserving(window, "DOMMouseScroll", b);
+            OpenLayers.Event.stopObserving(window, "mousewheel",
+                b);
+            OpenLayers.Event.stopObserving(document, "mousewheel", b);
+            return !0
+        }
+        return !1
+    },
+    CLASS_NAME: "OpenLayers.Handler.MouseWheel"
+});
+OpenLayers.Symbolizer = OpenLayers.Class({
+    zIndex: 0,
+    initialize: function(a) {
+        OpenLayers.Util.extend(this, a)
+    },
+    clone: function() {
+        return new(eval(this.CLASS_NAME))(OpenLayers.Util.extend({}, this))
+    },
+    CLASS_NAME: "OpenLayers.Symbolizer"
+});
+OpenLayers.Symbolizer.Raster = OpenLayers.Class(OpenLayers.Symbolizer, {
+    initialize: function(a) {
+        OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Symbolizer.Raster"
+});
+OpenLayers.Rule = OpenLayers.Class({
+    id: null,
+    name: null,
+    title: null,
+    description: null,
+    context: null,
+    filter: null,
+    elseFilter: !1,
+    symbolizer: null,
+    symbolizers: null,
+    minScaleDenominator: null,
+    maxScaleDenominator: null,
+    initialize: function(a) {
+        this.symbolizer = {};
+        OpenLayers.Util.extend(this, a);
+        this.symbolizers && delete this.symbolizer;
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_")
+    },
+    destroy: function() {
+        for (var a in this.symbolizer) this.symbolizer[a] = null;
+        this.symbolizer = null;
+        delete this.symbolizers
+    },
+    evaluate: function(a) {
+        var b =
+            this.getContext(a),
+            c = !0;
+        if (this.minScaleDenominator || this.maxScaleDenominator) var d = a.layer.map.getScale();
+        this.minScaleDenominator && (c = d >= OpenLayers.Style.createLiteral(this.minScaleDenominator, b));
+        c && this.maxScaleDenominator && (c = d < OpenLayers.Style.createLiteral(this.maxScaleDenominator, b));
+        c && this.filter && (c = "OpenLayers.Filter.FeatureId" == this.filter.CLASS_NAME ? this.filter.evaluate(a) : this.filter.evaluate(b));
+        return c
+    },
+    getContext: function(a) {
+        var b = this.context;
+        b || (b = a.attributes || a.data);
+        "function" ==
+        typeof this.context && (b = this.context(a));
+        return b
+    },
+    clone: function() {
+        var a = OpenLayers.Util.extend({}, this);
+        if (this.symbolizers) {
+            var b = this.symbolizers.length;
+            a.symbolizers = Array(b);
+            for (var c = 0; c < b; ++c) a.symbolizers[c] = this.symbolizers[c].clone()
+        } else {
+            a.symbolizer = {};
+            for (var d in this.symbolizer) b = this.symbolizer[d], c = typeof b, "object" === c ? a.symbolizer[d] = OpenLayers.Util.extend({}, b) : "string" === c && (a.symbolizer[d] = b)
+        }
+        a.filter = this.filter && this.filter.clone();
+        a.context = this.context && OpenLayers.Util.extend({},
+            this.context);
+        return new OpenLayers.Rule(a)
+    },
+    CLASS_NAME: "OpenLayers.Rule"
+});
+OpenLayers.Filter.Spatial = OpenLayers.Class(OpenLayers.Filter, {
+    type: null,
+    property: null,
+    value: null,
+    distance: null,
+    distanceUnits: null,
+    evaluate: function(a) {
+        var b = !1;
+        switch (this.type) {
+            case OpenLayers.Filter.Spatial.BBOX:
+            case OpenLayers.Filter.Spatial.INTERSECTS:
+                if (a.geometry) {
+                    var c = this.value;
+                    "OpenLayers.Bounds" == this.value.CLASS_NAME && (c = this.value.toGeometry());
+                    a.geometry.intersects(c) && (b = !0)
+                }
+                break;
+            default:
+                throw Error("evaluate is not implemented for this filter type.");
+        }
+        return b
+    },
+    clone: function() {
+        var a =
+            OpenLayers.Util.applyDefaults({
+                value: this.value && this.value.clone && this.value.clone()
+            }, this);
+        return new OpenLayers.Filter.Spatial(a)
+    },
+    CLASS_NAME: "OpenLayers.Filter.Spatial"
+});
+OpenLayers.Filter.Spatial.BBOX = "BBOX";
+OpenLayers.Filter.Spatial.INTERSECTS = "INTERSECTS";
+OpenLayers.Filter.Spatial.DWITHIN = "DWITHIN";
+OpenLayers.Filter.Spatial.WITHIN = "WITHIN";
+OpenLayers.Filter.Spatial.CONTAINS = "CONTAINS";
+OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+    profile: null,
+    defaultVersion: "1.0.0",
+    stringifyOutput: !0,
+    namedLayersAsArray: !1,
+    CLASS_NAME: "OpenLayers.Format.SLD"
+});
+OpenLayers.Symbolizer.Polygon = OpenLayers.Class(OpenLayers.Symbolizer, {
+    initialize: function(a) {
+        OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Symbolizer.Polygon"
+});
+OpenLayers.Format.GML.v2 = OpenLayers.Class(OpenLayers.Format.GML.Base, {
+    schemaLocation: "http://www.opengis.net/gml http://schemas.opengis.net/gml/2.1.2/feature.xsd",
+    initialize: function(a) {
+        OpenLayers.Format.GML.Base.prototype.initialize.apply(this, [a])
+    },
+    readers: {
+        gml: OpenLayers.Util.applyDefaults({
+            outerBoundaryIs: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.outer = c.components[0]
+            },
+            innerBoundaryIs: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.inner.push(c.components[0])
+            },
+            Box: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.components || (b.components = []);
+                var d = c.points[0],
+                    c = c.points[1];
+                b.components.push(new OpenLayers.Bounds(d.x, d.y, c.x, c.y))
+            }
+        }, OpenLayers.Format.GML.Base.prototype.readers.gml),
+        feature: OpenLayers.Format.GML.Base.prototype.readers.feature,
+        wfs: OpenLayers.Format.GML.Base.prototype.readers.wfs
+    },
+    write: function(a) {
+        a = this.writeNode(OpenLayers.Util.isArray(a) ? "wfs:FeatureCollection" : "gml:featureMember", a);
+        this.setAttributeNS(a, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [a])
+    },
+    writers: {
+        gml: OpenLayers.Util.applyDefaults({
+            Point: function(a) {
+                var b = this.createElementNSPlus("gml:Point");
+                this.writeNode("coordinates", [a], b);
+                return b
+            },
+            coordinates: function(a) {
+                for (var b = a.length, c = Array(b), d, e = 0; e < b; ++e) d = a[e], c[e] = this.xy ? d.x + "," + d.y : d.y + "," + d.x, void 0 != d.z && (c[e] += "," + d.z);
+                return this.createElementNSPlus("gml:coordinates", {
+                    attributes: {
+                        decimal: ".",
+                        cs: ",",
+                        ts: " "
+                    },
+                    value: 1 == b ? c[0] : c.join(" ")
+                })
+            },
+            LineString: function(a) {
+                var b =
+                    this.createElementNSPlus("gml:LineString");
+                this.writeNode("coordinates", a.components, b);
+                return b
+            },
+            Polygon: function(a) {
+                var b = this.createElementNSPlus("gml:Polygon");
+                this.writeNode("outerBoundaryIs", a.components[0], b);
+                for (var c = 1; c < a.components.length; ++c) this.writeNode("innerBoundaryIs", a.components[c], b);
+                return b
+            },
+            outerBoundaryIs: function(a) {
+                var b = this.createElementNSPlus("gml:outerBoundaryIs");
+                this.writeNode("LinearRing", a, b);
+                return b
+            },
+            innerBoundaryIs: function(a) {
+                var b = this.createElementNSPlus("gml:innerBoundaryIs");
+                this.writeNode("LinearRing", a, b);
+                return b
+            },
+            LinearRing: function(a) {
+                var b = this.createElementNSPlus("gml:LinearRing");
+                this.writeNode("coordinates", a.components, b);
+                return b
+            },
+            Box: function(a) {
+                var b = this.createElementNSPlus("gml:Box");
+                this.writeNode("coordinates", [{
+                    x: a.left,
+                    y: a.bottom
+                }, {
+                    x: a.right,
+                    y: a.top
+                }], b);
+                this.srsName && b.setAttribute("srsName", this.srsName);
+                return b
+            }
+        }, OpenLayers.Format.GML.Base.prototype.writers.gml),
+        feature: OpenLayers.Format.GML.Base.prototype.writers.feature,
+        wfs: OpenLayers.Format.GML.Base.prototype.writers.wfs
+    },
+    CLASS_NAME: "OpenLayers.Format.GML.v2"
+});
+OpenLayers.Format.Filter.v1_0_0 = OpenLayers.Class(OpenLayers.Format.GML.v2, OpenLayers.Format.Filter.v1, {
+    VERSION: "1.0.0",
+    schemaLocation: "http://www.opengis.net/ogc/filter/1.0.0/filter.xsd",
+    initialize: function(a) {
+        OpenLayers.Format.GML.v2.prototype.initialize.apply(this, [a])
+    },
+    readers: {
+        ogc: OpenLayers.Util.applyDefaults({
+            PropertyIsEqualTo: function(a, b) {
+                var c = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.EQUAL_TO
+                });
+                this.readChildNodes(a, c);
+                b.filters.push(c)
+            },
+            PropertyIsNotEqualTo: function(a,
+                b) {
+                var c = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO
+                });
+                this.readChildNodes(a, c);
+                b.filters.push(c)
+            },
+            PropertyIsLike: function(a, b) {
+                var c = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.LIKE
+                });
+                this.readChildNodes(a, c);
+                var d = a.getAttribute("wildCard"),
+                    e = a.getAttribute("singleChar"),
+                    f = a.getAttribute("escape");
+                c.value2regex(d, e, f);
+                b.filters.push(c)
+            }
+        }, OpenLayers.Format.Filter.v1.prototype.readers.ogc),
+        gml: OpenLayers.Format.GML.v2.prototype.readers.gml,
+        feature: OpenLayers.Format.GML.v2.prototype.readers.feature
+    },
+    writers: {
+        ogc: OpenLayers.Util.applyDefaults({
+            PropertyIsEqualTo: function(a) {
+                var b = this.createElementNSPlus("ogc:PropertyIsEqualTo");
+                this.writeNode("PropertyName", a, b);
+                this.writeOgcExpression(a.value, b);
+                return b
+            },
+            PropertyIsNotEqualTo: function(a) {
+                var b = this.createElementNSPlus("ogc:PropertyIsNotEqualTo");
+                this.writeNode("PropertyName", a, b);
+                this.writeOgcExpression(a.value, b);
+                return b
+            },
+            PropertyIsLike: function(a) {
+                var b = this.createElementNSPlus("ogc:PropertyIsLike", {
+                    attributes: {
+                        wildCard: "*",
+                        singleChar: ".",
+                        escape: "!"
+                    }
+                });
+                this.writeNode("PropertyName", a, b);
+                this.writeNode("Literal", a.regex2value(), b);
+                return b
+            },
+            BBOX: function(a) {
+                var b = this.createElementNSPlus("ogc:BBOX");
+                a.property && this.writeNode("PropertyName", a, b);
+                var c = this.writeNode("gml:Box", a.value, b);
+                a.projection && c.setAttribute("srsName", a.projection);
+                return b
+            }
+        }, OpenLayers.Format.Filter.v1.prototype.writers.ogc),
+        gml: OpenLayers.Format.GML.v2.prototype.writers.gml,
+        feature: OpenLayers.Format.GML.v2.prototype.writers.feature
+    },
+    writeSpatial: function(a, b) {
+        var c = this.createElementNSPlus("ogc:" + b);
+        this.writeNode("PropertyName", a, c);
+        if (a.value instanceof OpenLayers.Filter.Function) this.writeNode("Function", a.value, c);
+        else {
+            var d;
+            d = a.value instanceof OpenLayers.Geometry ? this.writeNode("feature:_geometry", a.value).firstChild : this.writeNode("gml:Box", a.value);
+            a.projection && d.setAttribute("srsName", a.projection);
+            c.appendChild(d)
+        }
+        return c
+    },
+    CLASS_NAME: "OpenLayers.Format.Filter.v1_0_0"
+});
+OpenLayers.Format.WFST.v1_0_0 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, OpenLayers.Format.WFST.v1, {
+    version: "1.0.0",
+    srsNameInQuery: !1,
+    schemaLocations: {
+        wfs: "http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd"
+    },
+    initialize: function(a) {
+        OpenLayers.Format.Filter.v1_0_0.prototype.initialize.apply(this, [a]);
+        OpenLayers.Format.WFST.v1.prototype.initialize.apply(this, [a])
+    },
+    readNode: function(a, b) {
+        return OpenLayers.Format.GML.v2.prototype.readNode.apply(this, [a, b])
+    },
+    readers: {
+        wfs: OpenLayers.Util.applyDefaults({
+            WFS_TransactionResponse: function(a,
+                b) {
+                b.insertIds = [];
+                b.success = !1;
+                this.readChildNodes(a, b)
+            },
+            InsertResult: function(a, b) {
+                var c = {
+                    fids: []
+                };
+                this.readChildNodes(a, c);
+                b.insertIds.push(c.fids[0])
+            },
+            TransactionResult: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Status: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            SUCCESS: function(a, b) {
+                b.success = !0
+            }
+        }, OpenLayers.Format.WFST.v1.prototype.readers.wfs),
+        gml: OpenLayers.Format.GML.v2.prototype.readers.gml,
+        feature: OpenLayers.Format.GML.v2.prototype.readers.feature,
+        ogc: OpenLayers.Format.Filter.v1_0_0.prototype.readers.ogc
+    },
+    writers: {
+        wfs: OpenLayers.Util.applyDefaults({
+            Query: function(a) {
+                var a = OpenLayers.Util.extend({
+                        featureNS: this.featureNS,
+                        featurePrefix: this.featurePrefix,
+                        featureType: this.featureType,
+                        srsName: this.srsName,
+                        srsNameInQuery: this.srsNameInQuery
+                    }, a),
+                    b = a.featurePrefix,
+                    c = this.createElementNSPlus("wfs:Query", {
+                        attributes: {
+                            typeName: (b ? b + ":" : "") + a.featureType
+                        }
+                    });
+                a.srsNameInQuery && a.srsName && c.setAttribute("srsName", a.srsName);
+                a.featureNS && c.setAttribute("xmlns:" + b, a.featureNS);
+                if (a.propertyNames)
+                    for (var b = 0, d = a.propertyNames.length; b <
+                        d; b++) this.writeNode("ogc:PropertyName", {
+                        property: a.propertyNames[b]
+                    }, c);
+                a.filter && (this.setFilterProperty(a.filter), this.writeNode("ogc:Filter", a.filter, c));
+                return c
+            }
+        }, OpenLayers.Format.WFST.v1.prototype.writers.wfs),
+        gml: OpenLayers.Format.GML.v2.prototype.writers.gml,
+        feature: OpenLayers.Format.GML.v2.prototype.writers.feature,
+        ogc: OpenLayers.Format.Filter.v1_0_0.prototype.writers.ogc
+    },
+    CLASS_NAME: "OpenLayers.Format.WFST.v1_0_0"
+});
+OpenLayers.ElementsIndexer = OpenLayers.Class({
+    maxZIndex: null,
+    order: null,
+    indices: null,
+    compare: null,
+    initialize: function(a) {
+        this.compare = a ? OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_Y_ORDER : OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_DRAWING_ORDER;
+        this.clear()
+    },
+    insert: function(a) {
+        this.exists(a) && this.remove(a);
+        var b = a.id;
+        this.determineZIndex(a);
+        for (var c = -1, d = this.order.length, e; 1 < d - c;) e = parseInt((c + d) / 2), 0 < this.compare(this, a, OpenLayers.Util.getElement(this.order[e])) ? c = e : d = e;
+        this.order.splice(d,
+            0, b);
+        this.indices[b] = this.getZIndex(a);
+        return this.getNextElement(d)
+    },
+    remove: function(a) {
+        var a = a.id,
+            b = OpenLayers.Util.indexOf(this.order, a);
+        0 <= b && (this.order.splice(b, 1), delete this.indices[a], this.maxZIndex = 0 < this.order.length ? this.indices[this.order[this.order.length - 1]] : 0)
+    },
+    clear: function() {
+        this.order = [];
+        this.indices = {};
+        this.maxZIndex = 0
+    },
+    exists: function(a) {
+        return null != this.indices[a.id]
+    },
+    getZIndex: function(a) {
+        return a._style.graphicZIndex
+    },
+    determineZIndex: function(a) {
+        var b = a._style.graphicZIndex;
+        null == b ? (b = this.maxZIndex, a._style.graphicZIndex = b) : b > this.maxZIndex && (this.maxZIndex = b)
+    },
+    getNextElement: function(a) {
+        a += 1;
+        if (a < this.order.length) {
+            var b = OpenLayers.Util.getElement(this.order[a]);
+            void 0 == b && (b = this.getNextElement(a));
+            return b
+        }
+        return null
+    },
+    CLASS_NAME: "OpenLayers.ElementsIndexer"
+});
+OpenLayers.ElementsIndexer.IndexingMethods = {
+    Z_ORDER: function(a, b, c) {
+        var b = a.getZIndex(b),
+            d = 0;
+        c && (a = a.getZIndex(c), d = b - a);
+        return d
+    },
+    Z_ORDER_DRAWING_ORDER: function(a, b, c) {
+        a = OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(a, b, c);
+        c && 0 == a && (a = 1);
+        return a
+    },
+    Z_ORDER_Y_ORDER: function(a, b, c) {
+        a = OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(a, b, c);
+        c && 0 === a && (b = c._boundsBottom - b._boundsBottom, a = 0 === b ? 1 : b);
+        return a
+    }
+};
+OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
+    rendererRoot: null,
+    root: null,
+    vectorRoot: null,
+    textRoot: null,
+    xmlns: null,
+    xOffset: 0,
+    indexer: null,
+    BACKGROUND_ID_SUFFIX: "_background",
+    LABEL_ID_SUFFIX: "_label",
+    LABEL_OUTLINE_SUFFIX: "_outline",
+    initialize: function(a, b) {
+        OpenLayers.Renderer.prototype.initialize.apply(this, arguments);
+        this.rendererRoot = this.createRenderRoot();
+        this.root = this.createRoot("_root");
+        this.vectorRoot = this.createRoot("_vroot");
+        this.textRoot = this.createRoot("_troot");
+        this.root.appendChild(this.vectorRoot);
+        this.root.appendChild(this.textRoot);
+        this.rendererRoot.appendChild(this.root);
+        this.container.appendChild(this.rendererRoot);
+        if (b && (b.zIndexing || b.yOrdering)) this.indexer = new OpenLayers.ElementsIndexer(b.yOrdering)
+    },
+    destroy: function() {
+        this.clear();
+        this.xmlns = this.root = this.rendererRoot = null;
+        OpenLayers.Renderer.prototype.destroy.apply(this, arguments)
+    },
+    clear: function() {
+        var a, b = this.vectorRoot;
+        if (b)
+            for (; a = b.firstChild;) b.removeChild(a);
+        if (b = this.textRoot)
+            for (; a = b.firstChild;) b.removeChild(a);
+        this.indexer &&
+            this.indexer.clear()
+    },
+    setExtent: function(a, b) {
+        var c = OpenLayers.Renderer.prototype.setExtent.apply(this, arguments),
+            d = this.getResolution();
+        if (this.map.baseLayer && this.map.baseLayer.wrapDateLine) {
+            var e, f = a.getWidth() / this.map.getExtent().getWidth(),
+                a = a.scale(1 / f),
+                f = this.map.getMaxExtent();
+            f.right > a.left && f.right < a.right ? e = !0 : f.left > a.left && f.left < a.right && (e = !1);
+            if (e !== this.rightOfDateLine || b) c = !1, this.xOffset = !0 === e ? f.getWidth() / d : 0;
+            this.rightOfDateLine = e
+        }
+        return c
+    },
+    getNodeType: function() {},
+    drawGeometry: function(a,
+        b, c) {
+        var d = a.CLASS_NAME,
+            e = !0;
+        if ("OpenLayers.Geometry.Collection" == d || "OpenLayers.Geometry.MultiPoint" == d || "OpenLayers.Geometry.MultiLineString" == d || "OpenLayers.Geometry.MultiPolygon" == d) {
+            for (var d = 0, f = a.components.length; d < f; d++) e = this.drawGeometry(a.components[d], b, c) && e;
+            return e
+        }
+        d = e = !1;
+        "none" != b.display && (b.backgroundGraphic ? this.redrawBackgroundNode(a.id, a, b, c) : d = !0, e = this.redrawNode(a.id, a, b, c));
+        if (!1 == e && (b = document.getElementById(a.id))) b._style.backgroundGraphic && (d = !0), b.parentNode.removeChild(b);
+        d && (b = document.getElementById(a.id + this.BACKGROUND_ID_SUFFIX)) && b.parentNode.removeChild(b);
+        return e
+    },
+    redrawNode: function(a, b, c, d) {
+        c = this.applyDefaultSymbolizer(c);
+        a = this.nodeFactory(a, this.getNodeType(b, c));
+        a._featureId = d;
+        a._boundsBottom = b.getBounds().bottom;
+        a._geometryClass = b.CLASS_NAME;
+        a._style = c;
+        b = this.drawGeometryNode(a, b, c);
+        if (!1 === b) return !1;
+        a = b.node;
+        this.indexer ? (c = this.indexer.insert(a)) ? this.vectorRoot.insertBefore(a, c) : this.vectorRoot.appendChild(a) : a.parentNode !== this.vectorRoot && this.vectorRoot.appendChild(a);
+        this.postDraw(a);
+        return b.complete
+    },
+    redrawBackgroundNode: function(a, b, c) {
+        c = OpenLayers.Util.extend({}, c);
+        c.externalGraphic = c.backgroundGraphic;
+        c.graphicXOffset = c.backgroundXOffset;
+        c.graphicYOffset = c.backgroundYOffset;
+        c.graphicZIndex = c.backgroundGraphicZIndex;
+        c.graphicWidth = c.backgroundWidth || c.graphicWidth;
+        c.graphicHeight = c.backgroundHeight || c.graphicHeight;
+        c.backgroundGraphic = null;
+        c.backgroundXOffset = null;
+        c.backgroundYOffset = null;
+        c.backgroundGraphicZIndex = null;
+        return this.redrawNode(a + this.BACKGROUND_ID_SUFFIX,
+            b, c, null)
+    },
+    drawGeometryNode: function(a, b, c) {
+        var c = c || a._style,
+            d = {
+                isFilled: void 0 === c.fill ? !0 : c.fill,
+                isStroked: void 0 === c.stroke ? !!c.strokeWidth : c.stroke
+            },
+            e;
+        switch (b.CLASS_NAME) {
+            case "OpenLayers.Geometry.Point":
+                !1 === c.graphic && (d.isFilled = !1, d.isStroked = !1);
+                e = this.drawPoint(a, b);
+                break;
+            case "OpenLayers.Geometry.LineString":
+                d.isFilled = !1;
+                e = this.drawLineString(a, b);
+                break;
+            case "OpenLayers.Geometry.LinearRing":
+                e = this.drawLinearRing(a, b);
+                break;
+            case "OpenLayers.Geometry.Polygon":
+                e = this.drawPolygon(a, b);
+                break;
+            case "OpenLayers.Geometry.Rectangle":
+                e = this.drawRectangle(a, b)
+        }
+        a._options = d;
+        return !1 != e ? {
+            node: this.setStyle(a, c, d, b),
+            complete: e
+        } : !1
+    },
+    postDraw: function() {},
+    drawPoint: function() {},
+    drawLineString: function() {},
+    drawLinearRing: function() {},
+    drawPolygon: function() {},
+    drawRectangle: function() {},
+    drawCircle: function() {},
+    removeText: function(a) {
+        var b = document.getElementById(a + this.LABEL_ID_SUFFIX);
+        b && this.textRoot.removeChild(b);
+        (a = document.getElementById(a + this.LABEL_OUTLINE_SUFFIX)) && this.textRoot.removeChild(a)
+    },
+    getFeatureIdFromEvent: function(a) {
+        var b = a.target,
+            c = b && b.correspondingUseElement;
+        return (c ? c : b || a.srcElement)._featureId
+    },
+    eraseGeometry: function(a, b) {
+        if ("OpenLayers.Geometry.MultiPoint" == a.CLASS_NAME || "OpenLayers.Geometry.MultiLineString" == a.CLASS_NAME || "OpenLayers.Geometry.MultiPolygon" == a.CLASS_NAME || "OpenLayers.Geometry.Collection" == a.CLASS_NAME)
+            for (var c = 0, d = a.components.length; c < d; c++) this.eraseGeometry(a.components[c], b);
+        else if ((c = OpenLayers.Util.getElement(a.id)) && c.parentNode)
+            if (c.geometry &&
+                (c.geometry.destroy(), c.geometry = null), c.parentNode.removeChild(c), this.indexer && this.indexer.remove(c), c._style.backgroundGraphic)(c = OpenLayers.Util.getElement(a.id + this.BACKGROUND_ID_SUFFIX)) && c.parentNode && c.parentNode.removeChild(c)
+    },
+    nodeFactory: function(a, b) {
+        var c = OpenLayers.Util.getElement(a);
+        c ? this.nodeTypeCompare(c, b) || (c.parentNode.removeChild(c), c = this.nodeFactory(a, b)) : c = this.createNode(b, a);
+        return c
+    },
+    nodeTypeCompare: function() {},
+    createNode: function() {},
+    moveRoot: function(a) {
+        var b = this.root;
+        a.root.parentNode == this.rendererRoot && (b = a.root);
+        b.parentNode.removeChild(b);
+        a.rendererRoot.appendChild(b)
+    },
+    getRenderLayerId: function() {
+        return this.root.parentNode.parentNode.id
+    },
+    isComplexSymbol: function(a) {
+        return "circle" != a && !!a
+    },
+    CLASS_NAME: "OpenLayers.Renderer.Elements"
+});
+OpenLayers.Control.ArgParser = OpenLayers.Class(OpenLayers.Control, {
+    center: null,
+    zoom: null,
+    layers: null,
+    displayProjection: null,
+    getParameters: function(a) {
+        var a = a || window.location.href,
+            b = OpenLayers.Util.getParameters(a),
+            c = a.indexOf("#");
+        0 < c && (a = "?" + a.substring(c + 1, a.length), OpenLayers.Util.extend(b, OpenLayers.Util.getParameters(a)));
+        return b
+    },
+    setMap: function(a) {
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+        for (var b = 0, c = this.map.controls.length; b < c; b++) {
+            var d = this.map.controls[b];
+            if (d != this &&
+                "OpenLayers.Control.ArgParser" == d.CLASS_NAME) {
+                d.displayProjection != this.displayProjection && (this.displayProjection = d.displayProjection);
+                break
+            }
+        }
+        if (b == this.map.controls.length && (b = this.getParameters(), b.layers && (this.layers = b.layers, this.map.events.register("addlayer", this, this.configureLayers), this.configureLayers()), b.lat && b.lon)) this.center = new OpenLayers.LonLat(parseFloat(b.lon), parseFloat(b.lat)), b.zoom && (this.zoom = parseFloat(b.zoom)), this.map.events.register("changebaselayer", this, this.setCenter),
+            this.setCenter()
+    },
+    setCenter: function() {
+        this.map.baseLayer && (this.map.events.unregister("changebaselayer", this, this.setCenter), this.displayProjection && this.center.transform(this.displayProjection, this.map.getProjectionObject()), this.map.setCenter(this.center, this.zoom))
+    },
+    configureLayers: function() {
+        if (this.layers.length == this.map.layers.length) {
+            this.map.events.unregister("addlayer", this, this.configureLayers);
+            for (var a = 0, b = this.layers.length; a < b; a++) {
+                var c = this.map.layers[a],
+                    d = this.layers.charAt(a);
+                "B" == d ? this.map.setBaseLayer(c) : ("T" == d || "F" == d) && c.setVisibility("T" == d)
+            }
+        }
+    },
+    CLASS_NAME: "OpenLayers.Control.ArgParser"
+});
+OpenLayers.Control.Permalink = OpenLayers.Class(OpenLayers.Control, {
+    argParserClass: OpenLayers.Control.ArgParser,
+    element: null,
+    anchor: !1,
+    base: "",
+    displayProjection: null,
+    initialize: function(a, b, c) {
+        null !== a && "object" == typeof a && !OpenLayers.Util.isElement(a) ? (this.base = document.location.href, OpenLayers.Control.prototype.initialize.apply(this, [a]), null != this.element && (this.element = OpenLayers.Util.getElement(this.element))) : (OpenLayers.Control.prototype.initialize.apply(this, [c]), this.element = OpenLayers.Util.getElement(a),
+            this.base = b || document.location.href)
+    },
+    destroy: function() {
+        this.element && this.element.parentNode == this.div && (this.div.removeChild(this.element), this.element = null);
+        this.map && this.map.events.unregister("moveend", this, this.updateLink);
+        OpenLayers.Control.prototype.destroy.apply(this, arguments)
+    },
+    setMap: function(a) {
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+        for (var b = 0, c = this.map.controls.length; b < c; b++) {
+            var d = this.map.controls[b];
+            if (d.CLASS_NAME == this.argParserClass.CLASS_NAME) {
+                d.displayProjection !=
+                    this.displayProjection && (this.displayProjection = d.displayProjection);
+                break
+            }
+        }
+        b == this.map.controls.length && this.map.addControl(new this.argParserClass({
+            displayProjection: this.displayProjection
+        }))
+    },
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        !this.element && !this.anchor && (this.element = document.createElement("a"), this.element.innerHTML = OpenLayers.i18n("Permalink"), this.element.href = "", this.div.appendChild(this.element));
+        this.map.events.on({
+            moveend: this.updateLink,
+            changelayer: this.updateLink,
+            changebaselayer: this.updateLink,
+            scope: this
+        });
+        this.updateLink();
+        return this.div
+    },
+    updateLink: function() {
+        var a = this.anchor ? "#" : "?",
+            b = this.base; - 1 != b.indexOf(a) && (b = b.substring(0, b.indexOf(a)));
+        b += a + OpenLayers.Util.getParameterString(this.createParams());
+        this.anchor && !this.element ? window.location.href = b : this.element.href = b
+    },
+    createParams: function(a, b, c) {
+        var a = a || this.map.getCenter(),
+            d = OpenLayers.Util.getParameters(this.base);
+        if (a) {
+            d.zoom = b || this.map.getZoom();
+            b = a.lat;
+            a = a.lon;
+            this.displayProjection && (b =
+                OpenLayers.Projection.transform({
+                    x: a,
+                    y: b
+                }, this.map.getProjectionObject(), this.displayProjection), a = b.x, b = b.y);
+            d.lat = Math.round(1E5 * b) / 1E5;
+            d.lon = Math.round(1E5 * a) / 1E5;
+            c = c || this.map.layers;
+            d.layers = "";
+            a = 0;
+            for (b = c.length; a < b; a++) {
+                var e = c[a];
+                d.layers = e.isBaseLayer ? d.layers + (e == this.map.baseLayer ? "B" : "0") : d.layers + (e.getVisibility() ? "T" : "F")
+            }
+        }
+        return d
+    },
+    CLASS_NAME: "OpenLayers.Control.Permalink"
+});
+OpenLayers.Layer.TMS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    serviceVersion: "1.0.0",
+    layername: null,
+    type: null,
+    isBaseLayer: !0,
+    tileOrigin: null,
+    serverResolutions: null,
+    zoomOffset: 0,
+    initialize: function(a, b, c) {
+        var d = [];
+        d.push(a, b, {}, c);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, d)
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.TMS(this.name, this.url, this.getOptions()));
+        return a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+    },
+    getURL: function(a) {
+        var a = this.adjustBounds(a),
+            b = this.getServerResolution(),
+            c = Math.round((a.left - this.tileOrigin.lon) / (b * this.tileSize.w)),
+            a = Math.round((a.bottom - this.tileOrigin.lat) / (b * this.tileSize.h)),
+            c = this.serviceVersion + "/" + this.layername + "/" + this.getServerZoom() + "/" + c + "/" + a + "." + this.type,
+            a = this.url;
+        OpenLayers.Util.isArray(a) && (a = this.selectUrl(c, a));
+        return a + c
+    },
+    setMap: function(a) {
+        OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments);
+        this.tileOrigin || (this.tileOrigin = new OpenLayers.LonLat(this.map.maxExtent.left, this.map.maxExtent.bottom))
+    },
+    CLASS_NAME: "OpenLayers.Layer.TMS"
+});
+OpenLayers.Strategy.Fixed = OpenLayers.Class(OpenLayers.Strategy, {
+    preload: !1,
+    activate: function() {
+        if (OpenLayers.Strategy.prototype.activate.apply(this, arguments)) {
+            this.layer.events.on({
+                refresh: this.load,
+                scope: this
+            });
+            if (!0 == this.layer.visibility || this.preload) this.load();
+            else this.layer.events.on({
+                visibilitychanged: this.load,
+                scope: this
+            });
+            return !0
+        }
+        return !1
+    },
+    deactivate: function() {
+        var a = OpenLayers.Strategy.prototype.deactivate.call(this);
+        a && this.layer.events.un({
+            refresh: this.load,
+            visibilitychanged: this.load,
+            scope: this
+        });
+        return a
+    },
+    load: function(a) {
+        var b = this.layer;
+        b.events.triggerEvent("loadstart");
+        b.protocol.read(OpenLayers.Util.applyDefaults({
+            callback: OpenLayers.Function.bind(this.merge, this, b.map.getProjectionObject()),
+            filter: b.filter
+        }, a));
+        b.events.un({
+            visibilitychanged: this.load,
+            scope: this
+        })
+    },
+    merge: function(a, b) {
+        var c = this.layer;
+        c.destroyFeatures();
+        var d = b.features;
+        if (d && 0 < d.length) {
+            if (!a.equals(c.projection))
+                for (var e, f = 0, g = d.length; f < g; ++f)(e = d[f].geometry) && e.transform(c.projection, a);
+            c.addFeatures(d)
+        }
+        c.events.triggerEvent("loadend")
+    },
+    CLASS_NAME: "OpenLayers.Strategy.Fixed"
+});
+OpenLayers.Control.Zoom = OpenLayers.Class(OpenLayers.Control, {
+    zoomInText: "+",
+    zoomInId: "olZoomInLink",
+    zoomOutText: "-",
+    zoomOutId: "olZoomOutLink",
+    draw: function() {
+        var a = OpenLayers.Control.prototype.draw.apply(this),
+            b = this.getOrCreateLinks(a),
+            c = b.zoomIn,
+            b = b.zoomOut,
+            d = this.map.events;
+        b.parentNode !== a && (d = this.events, d.attachToElement(b.parentNode));
+        d.register("buttonclick", this, this.onZoomClick);
+        this.zoomInLink = c;
+        this.zoomOutLink = b;
+        return a
+    },
+    getOrCreateLinks: function(a) {
+        var b = document.getElementById(this.zoomInId),
+            c = document.getElementById(this.zoomOutId);
+        b || (b = document.createElement("a"), b.href = "#zoomIn", b.appendChild(document.createTextNode(this.zoomInText)), b.className = "olControlZoomIn", a.appendChild(b));
+        OpenLayers.Element.addClass(b, "olButton");
+        c || (c = document.createElement("a"), c.href = "#zoomOut", c.appendChild(document.createTextNode(this.zoomOutText)), c.className = "olControlZoomOut", a.appendChild(c));
+        OpenLayers.Element.addClass(c, "olButton");
+        return {
+            zoomIn: b,
+            zoomOut: c
+        }
+    },
+    onZoomClick: function(a) {
+        a = a.buttonElement;
+        a === this.zoomInLink ? this.map.zoomIn() : a === this.zoomOutLink && this.map.zoomOut()
+    },
+    destroy: function() {
+        this.map && this.map.events.unregister("buttonclick", this, this.onZoomClick);
+        delete this.zoomInLink;
+        delete this.zoomOutLink;
+        OpenLayers.Control.prototype.destroy.apply(this)
+    },
+    CLASS_NAME: "OpenLayers.Control.Zoom"
+});
+OpenLayers.Layer.PointTrack = OpenLayers.Class(OpenLayers.Layer.Vector, {
+    dataFrom: null,
+    styleFrom: null,
+    addNodes: function(a, b) {
+        if (2 > a.length) throw Error("At least two point features have to be added to create a line from");
+        for (var c = Array(a.length - 1), d, e, f, g = 0, h = a.length; g < h; g++) {
+            d = a[g];
+            if (f = d.geometry) {
+                if ("OpenLayers.Geometry.Point" != f.CLASS_NAME) throw new TypeError("Only features with point geometries are supported.");
+            } else f = d.lonlat, f = new OpenLayers.Geometry.Point(f.lon, f.lat);
+            if (0 < g) {
+                d = null != this.dataFrom ?
+                    a[g + this.dataFrom].data || a[g + this.dataFrom].attributes : null;
+                var i = null != this.styleFrom ? a[g + this.styleFrom].style : null;
+                e = new OpenLayers.Geometry.LineString([e, f]);
+                c[g - 1] = new OpenLayers.Feature.Vector(e, d, i)
+            }
+            e = f
+        }
+        this.addFeatures(c, b)
+    },
+    CLASS_NAME: "OpenLayers.Layer.PointTrack"
+});
+OpenLayers.Layer.PointTrack.SOURCE_NODE = -1;
+OpenLayers.Layer.PointTrack.TARGET_NODE = 0;
+OpenLayers.Layer.PointTrack.dataFrom = {
+    SOURCE_NODE: -1,
+    TARGET_NODE: 0
+};
+OpenLayers.Protocol.WFS = function(a) {
+    var a = OpenLayers.Util.applyDefaults(a, OpenLayers.Protocol.WFS.DEFAULTS),
+        b = OpenLayers.Protocol.WFS["v" + a.version.replace(/\./g, "_")];
+    if (!b) throw "Unsupported WFS version: " + a.version;
+    return new b(a)
+};
+OpenLayers.Protocol.WFS.fromWMSLayer = function(a, b) {
+    var c, d;
+    c = a.params.LAYERS;
+    c = (OpenLayers.Util.isArray(c) ? c[0] : c).split(":");
+    1 < c.length && (d = c[0]);
+    c = c.pop();
+    d = {
+        url: a.url,
+        featureType: c,
+        featurePrefix: d,
+        srsName: a.projection && a.projection.getCode() || a.map && a.map.getProjectionObject().getCode(),
+        version: "1.1.0"
+    };
+    return new OpenLayers.Protocol.WFS(OpenLayers.Util.applyDefaults(b, d))
+};
+OpenLayers.Protocol.WFS.DEFAULTS = {
+    version: "1.0.0"
+};
+OpenLayers.Layer.Markers = OpenLayers.Class(OpenLayers.Layer, {
+    isBaseLayer: !1,
+    markers: null,
+    drawn: !1,
+    initialize: function(a, b) {
+        OpenLayers.Layer.prototype.initialize.apply(this, arguments);
+        this.markers = []
+    },
+    destroy: function() {
+        this.clearMarkers();
+        this.markers = null;
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments)
+    },
+    setOpacity: function(a) {
+        if (a != this.opacity) {
+            this.opacity = a;
+            for (var a = 0, b = this.markers.length; a < b; a++) this.markers[a].setOpacity(this.opacity)
+        }
+    },
+    moveTo: function(a, b, c) {
+        OpenLayers.Layer.prototype.moveTo.apply(this,
+            arguments);
+        if (b || !this.drawn) {
+            for (var d = 0, e = this.markers.length; d < e; d++) this.drawMarker(this.markers[d]);
+            this.drawn = !0
+        }
+    },
+    addMarker: function(a) {
+        this.markers.push(a);
+        1 > this.opacity && a.setOpacity(this.opacity);
+        this.map && this.map.getExtent() && (a.map = this.map, this.drawMarker(a))
+    },
+    removeMarker: function(a) {
+        this.markers && this.markers.length && (OpenLayers.Util.removeItem(this.markers, a), a.erase())
+    },
+    clearMarkers: function() {
+        if (null != this.markers)
+            for (; 0 < this.markers.length;) this.removeMarker(this.markers[0])
+    },
+    drawMarker: function(a) {
+        var b = this.map.getLayerPxFromLonLat(a.lonlat);
+        null == b ? a.display(!1) : a.isDrawn() ? a.icon && a.icon.moveTo(b) : this.div.appendChild(a.draw(b))
+    },
+    getDataExtent: function() {
+        var a = null;
+        if (this.markers && 0 < this.markers.length)
+            for (var a = new OpenLayers.Bounds, b = 0, c = this.markers.length; b < c; b++) a.extend(this.markers[b].lonlat);
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Layer.Markers"
+});
+OpenLayers.Control.Pan = OpenLayers.Class(OpenLayers.Control, {
+    slideFactor: 50,
+    slideRatio: null,
+    direction: null,
+    type: OpenLayers.Control.TYPE_BUTTON,
+    initialize: function(a, b) {
+        this.direction = a;
+        this.CLASS_NAME += this.direction;
+        OpenLayers.Control.prototype.initialize.apply(this, [b])
+    },
+    trigger: function() {
+        var a = OpenLayers.Function.bind(function(a) {
+            return this.slideRatio ? this.map.getSize()[a] * this.slideRatio : this.slideFactor
+        }, this);
+        switch (this.direction) {
+            case OpenLayers.Control.Pan.NORTH:
+                this.map.pan(0, -a("h"));
+                break;
+            case OpenLayers.Control.Pan.SOUTH:
+                this.map.pan(0, a("h"));
+                break;
+            case OpenLayers.Control.Pan.WEST:
+                this.map.pan(-a("w"), 0);
+                break;
+            case OpenLayers.Control.Pan.EAST:
+                this.map.pan(a("w"), 0)
+        }
+    },
+    CLASS_NAME: "OpenLayers.Control.Pan"
+});
+OpenLayers.Control.Pan.NORTH = "North";
+OpenLayers.Control.Pan.SOUTH = "South";
+OpenLayers.Control.Pan.EAST = "East";
+OpenLayers.Control.Pan.WEST = "West";
+OpenLayers.Format.CSWGetDomain = function(a) {
+    var a = OpenLayers.Util.applyDefaults(a, OpenLayers.Format.CSWGetDomain.DEFAULTS),
+        b = OpenLayers.Format.CSWGetDomain["v" + a.version.replace(/\./g, "_")];
+    if (!b) throw "Unsupported CSWGetDomain version: " + a.version;
+    return new b(a)
+};
+OpenLayers.Format.CSWGetDomain.DEFAULTS = {
+    version: "2.0.2"
+};
+OpenLayers.Format.CSWGetDomain.v2_0_2 = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance",
+        csw: "http://www.opengis.net/cat/csw/2.0.2"
+    },
+    defaultPrefix: "csw",
+    version: "2.0.2",
+    schemaLocation: "http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd",
+    PropertyName: null,
+    ParameterName: null,
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 ==
+            a.nodeType && (a = a.documentElement);
+        var b = {};
+        this.readNode(a, b);
+        return b
+    },
+    readers: {
+        csw: {
+            GetDomainResponse: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            DomainValues: function(a, b) {
+                OpenLayers.Util.isArray(b.DomainValues) || (b.DomainValues = []);
+                for (var c = a.attributes, d = {}, e = 0, f = c.length; e < f; ++e) d[c[e].name] = c[e].nodeValue;
+                this.readChildNodes(a, d);
+                b.DomainValues.push(d)
+            },
+            PropertyName: function(a, b) {
+                b.PropertyName = this.getChildValue(a)
+            },
+            ParameterName: function(a, b) {
+                b.ParameterName = this.getChildValue(a)
+            },
+            ListOfValues: function(a,
+                b) {
+                OpenLayers.Util.isArray(b.ListOfValues) || (b.ListOfValues = []);
+                this.readChildNodes(a, b.ListOfValues)
+            },
+            Value: function(a, b) {
+                for (var c = a.attributes, d = {}, e = 0, f = c.length; e < f; ++e) d[c[e].name] = c[e].nodeValue;
+                d.value = this.getChildValue(a);
+                b.push({
+                    Value: d
+                })
+            },
+            ConceptualScheme: function(a, b) {
+                b.ConceptualScheme = {};
+                this.readChildNodes(a, b.ConceptualScheme)
+            },
+            Name: function(a, b) {
+                b.Name = this.getChildValue(a)
+            },
+            Document: function(a, b) {
+                b.Document = this.getChildValue(a)
+            },
+            Authority: function(a, b) {
+                b.Authority = this.getChildValue(a)
+            },
+            RangeOfValues: function(a, b) {
+                b.RangeOfValues = {};
+                this.readChildNodes(a, b.RangeOfValues)
+            },
+            MinValue: function(a, b) {
+                for (var c = a.attributes, d = {}, e = 0, f = c.length; e < f; ++e) d[c[e].name] = c[e].nodeValue;
+                d.value = this.getChildValue(a);
+                b.MinValue = d
+            },
+            MaxValue: function(a, b) {
+                for (var c = a.attributes, d = {}, e = 0, f = c.length; e < f; ++e) d[c[e].name] = c[e].nodeValue;
+                d.value = this.getChildValue(a);
+                b.MaxValue = d
+            }
+        }
+    },
+    write: function(a) {
+        a = this.writeNode("csw:GetDomain", a);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [a])
+    },
+    writers: {
+        csw: {
+            GetDomain: function(a) {
+                var b =
+                    this.createElementNSPlus("csw:GetDomain", {
+                        attributes: {
+                            service: "CSW",
+                            version: this.version
+                        }
+                    });
+                if (a.PropertyName || this.PropertyName) this.writeNode("csw:PropertyName", a.PropertyName || this.PropertyName, b);
+                else if (a.ParameterName || this.ParameterName) this.writeNode("csw:ParameterName", a.ParameterName || this.ParameterName, b);
+                this.readChildNodes(b, a);
+                return b
+            },
+            PropertyName: function(a) {
+                return this.createElementNSPlus("csw:PropertyName", {
+                    value: a
+                })
+            },
+            ParameterName: function(a) {
+                return this.createElementNSPlus("csw:ParameterName", {
+                    value: a
+                })
+            }
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.CSWGetDomain.v2_0_2"
+});
+OpenLayers.Format.ArcXML.Features = OpenLayers.Class(OpenLayers.Format.XML, {
+    read: function(a) {
+        return (new OpenLayers.Format.ArcXML).read(a).features.feature
+    }
+});
+OpenLayers.Control.Snapping = OpenLayers.Class(OpenLayers.Control, {
+    DEFAULTS: {
+        tolerance: 10,
+        node: !0,
+        edge: !0,
+        vertex: !0
+    },
+    greedy: !0,
+    precedence: ["node", "vertex", "edge"],
+    resolution: null,
+    geoToleranceCache: null,
+    layer: null,
+    feature: null,
+    point: null,
+    initialize: function(a) {
+        OpenLayers.Control.prototype.initialize.apply(this, [a]);
+        this.options = a || {};
+        this.options.layer && this.setLayer(this.options.layer);
+        a = OpenLayers.Util.extend({}, this.options.defaults);
+        this.defaults = OpenLayers.Util.applyDefaults(a, this.DEFAULTS);
+        this.setTargets(this.options.targets);
+        0 === this.targets.length && this.layer && this.addTargetLayer(this.layer);
+        this.geoToleranceCache = {}
+    },
+    setLayer: function(a) {
+        this.active ? (this.deactivate(), this.layer = a, this.activate()) : this.layer = a
+    },
+    setTargets: function(a) {
+        this.targets = [];
+        if (a && a.length)
+            for (var b, c = 0, d = a.length; c < d; ++c) b = a[c], b instanceof OpenLayers.Layer.Vector ? this.addTargetLayer(b) : this.addTarget(b)
+    },
+    addTargetLayer: function(a) {
+        this.addTarget({
+            layer: a
+        })
+    },
+    addTarget: function(a) {
+        a = OpenLayers.Util.applyDefaults(a, this.defaults);
+        a.nodeTolerance =
+            a.nodeTolerance || a.tolerance;
+        a.vertexTolerance = a.vertexTolerance || a.tolerance;
+        a.edgeTolerance = a.edgeTolerance || a.tolerance;
+        this.targets.push(a)
+    },
+    removeTargetLayer: function(a) {
+        for (var b, c = this.targets.length - 1; 0 <= c; --c) b = this.targets[c], b.layer === a && this.removeTarget(b)
+    },
+    removeTarget: function(a) {
+        return OpenLayers.Util.removeItem(this.targets, a)
+    },
+    activate: function() {
+        var a = OpenLayers.Control.prototype.activate.call(this);
+        if (a && this.layer && this.layer.events) this.layer.events.on({
+            sketchstarted: this.onSketchModified,
+            sketchmodified: this.onSketchModified,
+            vertexmodified: this.onVertexModified,
+            scope: this
+        });
+        return a
+    },
+    deactivate: function() {
+        var a = OpenLayers.Control.prototype.deactivate.call(this);
+        a && this.layer && this.layer.events && this.layer.events.un({
+            sketchstarted: this.onSketchModified,
+            sketchmodified: this.onSketchModified,
+            vertexmodified: this.onVertexModified,
+            scope: this
+        });
+        this.point = this.feature = null;
+        return a
+    },
+    onSketchModified: function(a) {
+        this.feature = a.feature;
+        this.considerSnapping(a.vertex, a.vertex)
+    },
+    onVertexModified: function(a) {
+        this.feature =
+            a.feature;
+        var b = this.layer.map.getLonLatFromViewPortPx(a.pixel);
+        this.considerSnapping(a.vertex, new OpenLayers.Geometry.Point(b.lon, b.lat))
+    },
+    considerSnapping: function(a, b) {
+        for (var c = {
+                rank: Number.POSITIVE_INFINITY,
+                dist: Number.POSITIVE_INFINITY,
+                x: null,
+                y: null
+            }, d = !1, e, f, g = 0, h = this.targets.length; g < h; ++g)
+            if (f = this.targets[g], e = this.testTarget(f, b))
+                if (this.greedy) {
+                    c = e;
+                    c.target = f;
+                    d = !0;
+                    break
+                } else if (e.rank < c.rank || e.rank === c.rank && e.dist < c.dist) c = e, c.target = f, d = !0;
+        d && (!1 !== this.events.triggerEvent("beforesnap", {
+            point: a,
+            x: c.x,
+            y: c.y,
+            distance: c.dist,
+            layer: c.target.layer,
+            snapType: this.precedence[c.rank]
+        }) ? (a.x = c.x, a.y = c.y, this.point = a, this.events.triggerEvent("snap", {
+            point: a,
+            snapType: this.precedence[c.rank],
+            layer: c.target.layer,
+            distance: c.dist
+        })) : d = !1);
+        this.point && !d && (a.x = b.x, a.y = b.y, this.point = null, this.events.triggerEvent("unsnap", {
+            point: a
+        }))
+    },
+    testTarget: function(a, b) {
+        var c = this.layer.map.getResolution();
+        if ("minResolution" in a && c < a.minResolution || "maxResolution" in a && c >= a.maxResolution) return null;
+        for (var c = {
+                node: this.getGeoTolerance(a.nodeTolerance, c),
+                vertex: this.getGeoTolerance(a.vertexTolerance, c),
+                edge: this.getGeoTolerance(a.edgeTolerance, c)
+            }, d = Math.max(c.node, c.vertex, c.edge), e = {
+                rank: Number.POSITIVE_INFINITY,
+                dist: Number.POSITIVE_INFINITY
+            }, f = !1, g = a.layer.features, h, i, j, k, l, m, n = this.precedence.length, o = new OpenLayers.LonLat(b.x, b.y), p = 0, q = g.length; p < q; ++p)
+            if (h = g[p], h !== this.feature && (!h._sketch && h.state !== OpenLayers.State.DELETE && (!a.filter || a.filter.evaluate(h))) && h.atPoint(o, d, d))
+                for (var r = 0, s = Math.min(e.rank +
+                        1, n); r < s; ++r)
+                    if (i = this.precedence[r], a[i])
+                        if ("edge" === i) {
+                            if (j = h.geometry.distanceTo(b, {
+                                    details: !0
+                                }), l = j.distance, l <= c[i] && l < e.dist) {
+                                e = {
+                                    rank: r,
+                                    dist: l,
+                                    x: j.x0,
+                                    y: j.y0
+                                };
+                                f = !0;
+                                break
+                            }
+                        } else {
+                            j = h.geometry.getVertices("node" === i);
+                            m = !1;
+                            for (var t = 0, u = j.length; t < u; ++t)
+                                if (k = j[t], l = k.distanceTo(b), l <= c[i] && (r < e.rank || r === e.rank && l < e.dist)) e = {
+                                    rank: r,
+                                    dist: l,
+                                    x: k.x,
+                                    y: k.y
+                                }, m = f = !0;
+                            if (m) break
+                        }
+        return f ? e : null
+    },
+    getGeoTolerance: function(a, b) {
+        b !== this.resolution && (this.resolution = b, this.geoToleranceCache = {});
+        var c = this.geoToleranceCache[a];
+        void 0 === c && (c = a * b, this.geoToleranceCache[a] = c);
+        return c
+    },
+    destroy: function() {
+        this.active && this.deactivate();
+        delete this.layer;
+        delete this.targets;
+        OpenLayers.Control.prototype.destroy.call(this)
+    },
+    CLASS_NAME: "OpenLayers.Control.Snapping"
+});
+OpenLayers.Date = {
+    toISOString: function() {
+        if ("toISOString" in Date.prototype) return function(a) {
+            return a.toISOString()
+        };
+        var a = function(a, c) {
+            for (var d = a + ""; d.length < c;) d = "0" + d;
+            return d
+        };
+        return function(b) {
+            return isNaN(b.getTime()) ? "Invalid Date" : b.getUTCFullYear() + "-" + a(b.getUTCMonth() + 1, 2) + "-" + a(b.getUTCDate(), 2) + "T" + a(b.getUTCHours(), 2) + ":" + a(b.getUTCMinutes(), 2) + ":" + a(b.getUTCSeconds(), 2) + "." + a(b.getUTCMilliseconds(), 3) + "Z"
+        }
+    }(),
+    parse: function(a) {
+        var b;
+        if ((a = a.match(/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:(?:T(\d{1,2}):(\d{2}):(\d{2}(?:\.\d+)?)(Z|(?:[+-]\d{1,2}(?::(\d{2}))?)))|Z)?$/)) &&
+            (a[1] || a[7])) {
+            b = parseInt(a[1], 10) || 0;
+            var c = parseInt(a[2], 10) - 1 || 0,
+                d = parseInt(a[3], 10) || 1;
+            b = new Date(Date.UTC(b, c, d));
+            if (c = a[7]) {
+                var d = parseInt(a[4], 10),
+                    e = parseInt(a[5], 10),
+                    f = parseFloat(a[6]),
+                    g = f | 0,
+                    f = Math.round(1E3 * (f - g));
+                b.setUTCHours(d, e, g, f);
+                "Z" !== c && (c = parseInt(c, 10), a = parseInt(a[8], 10) || 0, b = new Date(b.getTime() + -1E3 * (60 * 60 * c + 60 * a)))
+            }
+        } else b = new Date("invalid");
+        return b
+    }
+};
+(function() {
+    function a() {
+        this._object = f && !i ? new f : new window.ActiveXObject("Microsoft.XMLHTTP");
+        this._listeners = []
+    }
+
+    function b() {
+        return new a
+    }
+
+    function c(a) {
+        b.onreadystatechange && b.onreadystatechange.apply(a);
+        a.dispatchEvent({
+            type: "readystatechange",
+            bubbles: !1,
+            cancelable: !1,
+            timeStamp: new Date + 0
+        })
+    }
+
+    function d(a) {
+        try {
+            a.responseText = a._object.responseText
+        } catch (b) {}
+        try {
+            var c;
+            var d = a._object,
+                e = d.responseXML,
+                f = d.responseText;
+            h && (f && e && !e.documentElement && d.getResponseHeader("Content-Type").match(/[^\/]+\/[^\+]+\+xml/)) &&
+                (e = new window.ActiveXObject("Microsoft.XMLDOM"), e.async = !1, e.validateOnParse = !1, e.loadXML(f));
+            c = e && (h && 0 != e.parseError || !e.documentElement || e.documentElement && "parsererror" == e.documentElement.tagName) ? null : e;
+            a.responseXML = c
+        } catch (g) {}
+        try {
+            a.status = a._object.status
+        } catch (i) {}
+        try {
+            a.statusText = a._object.statusText
+        } catch (r) {}
+    }
+
+    function e(a) {
+        a._object.onreadystatechange = new window.Function
+    }
+    var f = window.XMLHttpRequest,
+        g = !!window.controllers,
+        h = window.document.all && !window.opera,
+        i = h && window.navigator.userAgent.match(/MSIE 7.0/);
+    b.prototype = a.prototype;
+    g && f.wrapped && (b.wrapped = f.wrapped);
+    b.UNSENT = 0;
+    b.OPENED = 1;
+    b.HEADERS_RECEIVED = 2;
+    b.LOADING = 3;
+    b.DONE = 4;
+    b.prototype.readyState = b.UNSENT;
+    b.prototype.responseText = "";
+    b.prototype.responseXML = null;
+    b.prototype.status = 0;
+    b.prototype.statusText = "";
+    b.prototype.priority = "NORMAL";
+    b.prototype.onreadystatechange = null;
+    b.onreadystatechange = null;
+    b.onopen = null;
+    b.onsend = null;
+    b.onabort = null;
+    b.prototype.open = function(a, f, i, m, n) {
+        delete this._headers;
+        arguments.length < 3 && (i = true);
+        this._async = i;
+        var o =
+            this,
+            p = this.readyState,
+            q;
+        if (h && i) {
+            q = function() {
+                if (p != b.DONE) {
+                    e(o);
+                    o.abort()
+                }
+            };
+            window.attachEvent("onunload", q)
+        }
+        b.onopen && b.onopen.apply(this, arguments);
+        arguments.length > 4 ? this._object.open(a, f, i, m, n) : arguments.length > 3 ? this._object.open(a, f, i, m) : this._object.open(a, f, i);
+        this.readyState = b.OPENED;
+        c(this);
+        this._object.onreadystatechange = function() {
+            if (!g || i) {
+                o.readyState = o._object.readyState;
+                d(o);
+                if (o._aborted) o.readyState = b.UNSENT;
+                else {
+                    if (o.readyState == b.DONE) {
+                        delete o._data;
+                        e(o);
+                        h && i && window.detachEvent("onunload",
+                            q)
+                    }
+                    p != o.readyState && c(o);
+                    p = o.readyState
+                }
+            }
+        }
+    };
+    b.prototype.send = function(a) {
+        b.onsend && b.onsend.apply(this, arguments);
+        arguments.length || (a = null);
+        if (a && a.nodeType) {
+            a = window.XMLSerializer ? (new window.XMLSerializer).serializeToString(a) : a.xml;
+            this._headers["Content-Type"] || this._object.setRequestHeader("Content-Type", "application/xml")
+        }
+        this._data = a;
+        a: {
+            this._object.send(this._data);
+            if (g && !this._async) {
+                this.readyState = b.OPENED;
+                for (d(this); this.readyState < b.DONE;) {
+                    this.readyState++;
+                    c(this);
+                    if (this._aborted) break a
+                }
+            }
+        }
+    };
+    b.prototype.abort = function() {
+        b.onabort && b.onabort.apply(this, arguments);
+        if (this.readyState > b.UNSENT) this._aborted = true;
+        this._object.abort();
+        e(this);
+        this.readyState = b.UNSENT;
+        delete this._data
+    };
+    b.prototype.getAllResponseHeaders = function() {
+        return this._object.getAllResponseHeaders()
+    };
+    b.prototype.getResponseHeader = function(a) {
+        return this._object.getResponseHeader(a)
+    };
+    b.prototype.setRequestHeader = function(a, b) {
+        if (!this._headers) this._headers = {};
+        this._headers[a] = b;
+        return this._object.setRequestHeader(a,
+            b)
+    };
+    b.prototype.addEventListener = function(a, b, c) {
+        for (var d = 0, e; e = this._listeners[d]; d++)
+            if (e[0] == a && e[1] == b && e[2] == c) return;
+        this._listeners.push([a, b, c])
+    };
+    b.prototype.removeEventListener = function(a, b, c) {
+        for (var d = 0, e; e = this._listeners[d]; d++)
+            if (e[0] == a && e[1] == b && e[2] == c) break;
+        e && this._listeners.splice(d, 1)
+    };
+    b.prototype.dispatchEvent = function(a) {
+        a = {
+            type: a.type,
+            target: this,
+            currentTarget: this,
+            eventPhase: 2,
+            bubbles: a.bubbles,
+            cancelable: a.cancelable,
+            timeStamp: a.timeStamp,
+            stopPropagation: function() {},
+            preventDefault: function() {},
+            initEvent: function() {}
+        };
+        a.type == "readystatechange" && this.onreadystatechange && (this.onreadystatechange.handleEvent || this.onreadystatechange).apply(this, [a]);
+        for (var b = 0, c; c = this._listeners[b]; b++) c[0] == a.type && !c[2] && (c[1].handleEvent || c[1]).apply(this, [a])
+    };
+    b.prototype.toString = function() {
+        return "[object XMLHttpRequest]"
+    };
+    b.toString = function() {
+        return "[XMLHttpRequest]"
+    };
+    window.Function.prototype.apply || (window.Function.prototype.apply = function(a, b) {
+        b || (b = []);
+        a.__func = this;
+        a.__func(b[0], b[1], b[2], b[3],
+            b[4]);
+        delete a.__func
+    });
+    OpenLayers.Request.XMLHttpRequest = b
+})();
+OpenLayers.Format.KML = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        kml: "http://www.opengis.net/kml/2.2",
+        gx: "http://www.google.com/kml/ext/2.2"
+    },
+    kmlns: "http://earth.google.com/kml/2.0",
+    placemarksDesc: "No description available",
+    foldersName: "OpenLayers export",
+    foldersDesc: "Exported on " + new Date,
+    extractAttributes: !0,
+    kvpAttributes: !1,
+    extractStyles: !1,
+    extractTracks: !1,
+    trackAttributes: null,
+    internalns: null,
+    features: null,
+    styles: null,
+    styleBaseUrl: "",
+    fetched: null,
+    maxDepth: 0,
+    initialize: function(a) {
+        this.regExes = {
+            trimSpace: /^\s*|\s*$/g,
+            removeSpace: /\s*/g,
+            splitSpace: /\s+/,
+            trimComma: /\s*,\s*/g,
+            kmlColor: /(\w{2})(\w{2})(\w{2})(\w{2})/,
+            kmlIconPalette: /root:\/\/icons\/palette-(\d+)(\.\w+)/,
+            straightBracket: /\$\[(.*?)\]/g
+        };
+        this.externalProjection = new OpenLayers.Projection("EPSG:4326");
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+    },
+    read: function(a) {
+        this.features = [];
+        this.styles = {};
+        this.fetched = {};
+        return this.parseData(a, {
+            depth: 0,
+            styleBaseUrl: this.styleBaseUrl
+        })
+    },
+    parseData: function(a, b) {
+        "string" == typeof a &&
+            (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        for (var c = ["Link", "NetworkLink", "Style", "StyleMap", "Placemark"], d = 0, e = c.length; d < e; ++d) {
+            var f = c[d],
+                g = this.getElementsByTagNameNS(a, "*", f);
+            if (0 != g.length) switch (f.toLowerCase()) {
+                case "link":
+                case "networklink":
+                    this.parseLinks(g, b);
+                    break;
+                case "style":
+                    this.extractStyles && this.parseStyles(g, b);
+                    break;
+                case "stylemap":
+                    this.extractStyles && this.parseStyleMaps(g, b);
+                    break;
+                case "placemark":
+                    this.parseFeatures(g, b)
+            }
+        }
+        return this.features
+    },
+    parseLinks: function(a,
+        b) {
+        if (b.depth >= this.maxDepth) return !1;
+        var c = OpenLayers.Util.extend({}, b);
+        c.depth++;
+        for (var d = 0, e = a.length; d < e; d++) {
+            var f = this.parseProperty(a[d], "*", "href");
+            f && !this.fetched[f] && (this.fetched[f] = !0, (f = this.fetchLink(f)) && this.parseData(f, c))
+        }
+    },
+    fetchLink: function(a) {
+        if (a = OpenLayers.Request.GET({
+                url: a,
+                async: !1
+            })) return a.responseText
+    },
+    parseStyles: function(a, b) {
+        for (var c = 0, d = a.length; c < d; c++) {
+            var e = this.parseStyle(a[c]);
+            e && (this.styles[(b.styleBaseUrl || "") + "#" + e.id] = e)
+        }
+    },
+    parseKmlColor: function(a) {
+        var b =
+            null;
+        a && (a = a.match(this.regExes.kmlColor)) && (b = {
+            color: "#" + a[4] + a[3] + a[2],
+            opacity: parseInt(a[1], 16) / 255
+        });
+        return b
+    },
+    parseStyle: function(a) {
+        for (var b = {}, c = ["LineStyle", "PolyStyle", "IconStyle", "BalloonStyle", "LabelStyle"], d, e, f = 0, g = c.length; f < g; ++f)
+            if (d = c[f], e = this.getElementsByTagNameNS(a, "*", d)[0]) switch (d.toLowerCase()) {
+                case "linestyle":
+                    d = this.parseProperty(e, "*", "color");
+                    if (d = this.parseKmlColor(d)) b.strokeColor = d.color, b.strokeOpacity = d.opacity;
+                    (d = this.parseProperty(e, "*", "width")) && (b.strokeWidth =
+                        d);
+                    break;
+                case "polystyle":
+                    d = this.parseProperty(e, "*", "color");
+                    if (d = this.parseKmlColor(d)) b.fillOpacity = d.opacity, b.fillColor = d.color;
+                    "0" == this.parseProperty(e, "*", "fill") && (b.fillColor = "none");
+                    "0" == this.parseProperty(e, "*", "outline") && (b.strokeWidth = "0");
+                    break;
+                case "iconstyle":
+                    var h = parseFloat(this.parseProperty(e, "*", "scale") || 1);
+                    d = 32 * h;
+                    var i = 32 * h,
+                        j = this.getElementsByTagNameNS(e, "*", "Icon")[0];
+                    if (j) {
+                        var k = this.parseProperty(j, "*", "href");
+                        if (k) {
+                            var l = this.parseProperty(j, "*", "w"),
+                                m = this.parseProperty(j,
+                                    "*", "h");
+                            OpenLayers.String.startsWith(k, "http://maps.google.com/mapfiles/kml") && (!l && !m) && (m = l = 64, h /= 2);
+                            l = l || m;
+                            m = m || l;
+                            l && (d = parseInt(l) * h);
+                            m && (i = parseInt(m) * h);
+                            if (m = k.match(this.regExes.kmlIconPalette)) l = m[1], m = m[2], k = this.parseProperty(j, "*", "x"), j = this.parseProperty(j, "*", "y"), k = "http://maps.google.com/mapfiles/kml/pal" + l + "/icon" + (8 * (j ? 7 - j / 32 : 7) + (k ? k / 32 : 0)) + m;
+                            b.graphicOpacity = 1;
+                            b.externalGraphic = k
+                        }
+                    }
+                    if (e = this.getElementsByTagNameNS(e, "*", "hotSpot")[0]) k = parseFloat(e.getAttribute("x")), j = parseFloat(e.getAttribute("y")),
+                        l = e.getAttribute("xunits"), "pixels" == l ? b.graphicXOffset = -k * h : "insetPixels" == l ? b.graphicXOffset = -d + k * h : "fraction" == l && (b.graphicXOffset = -d * k), e = e.getAttribute("yunits"), "pixels" == e ? b.graphicYOffset = -i + j * h + 1 : "insetPixels" == e ? b.graphicYOffset = -(j * h) + 1 : "fraction" == e && (b.graphicYOffset = -i * (1 - j) + 1);
+                    b.graphicWidth = d;
+                    b.graphicHeight = i;
+                    break;
+                case "balloonstyle":
+                    (e = OpenLayers.Util.getXmlNodeValue(e)) && (b.balloonStyle = e.replace(this.regExes.straightBracket, "${$1}"));
+                    break;
+                case "labelstyle":
+                    if (d = this.parseProperty(e,
+                            "*", "color"), d = this.parseKmlColor(d)) b.fontColor = d.color, b.fontOpacity = d.opacity
+            }!b.strokeColor && b.fillColor && (b.strokeColor = b.fillColor);
+        if ((a = a.getAttribute("id")) && b) b.id = a;
+        return b
+    },
+    parseStyleMaps: function(a, b) {
+        for (var c = 0, d = a.length; c < d; c++)
+            for (var e = a[c], f = this.getElementsByTagNameNS(e, "*", "Pair"), e = e.getAttribute("id"), g = 0, h = f.length; g < h; g++) {
+                var i = f[g],
+                    j = this.parseProperty(i, "*", "key");
+                (i = this.parseProperty(i, "*", "styleUrl")) && "normal" == j && (this.styles[(b.styleBaseUrl || "") + "#" + e] = this.styles[(b.styleBaseUrl ||
+                    "") + i])
+            }
+    },
+    parseFeatures: function(a, b) {
+        for (var c = [], d = 0, e = a.length; d < e; d++) {
+            var f = a[d],
+                g = this.parseFeature.apply(this, [f]);
+            if (g) {
+                this.extractStyles && (g.attributes && g.attributes.styleUrl) && (g.style = this.getStyle(g.attributes.styleUrl, b));
+                if (this.extractStyles) {
+                    var h = this.getElementsByTagNameNS(f, "*", "Style")[0];
+                    if (h && (h = this.parseStyle(h))) g.style = OpenLayers.Util.extend(g.style, h)
+                }
+                if (this.extractTracks) {
+                    if ((f = this.getElementsByTagNameNS(f, this.namespaces.gx, "Track")) && 0 < f.length) g = {
+                            features: [],
+                            feature: g
+                        },
+                        this.readNode(f[0], g), 0 < g.features.length && c.push.apply(c, g.features)
+                } else c.push(g)
+            } else throw "Bad Placemark: " + d;
+        }
+        this.features = this.features.concat(c)
+    },
+    readers: {
+        kml: {
+            when: function(a, b) {
+                b.whens.push(OpenLayers.Date.parse(this.getChildValue(a)))
+            },
+            _trackPointAttribute: function(a, b) {
+                var c = a.nodeName.split(":").pop();
+                b.attributes[c].push(this.getChildValue(a))
+            }
+        },
+        gx: {
+            Track: function(a, b) {
+                var c = {
+                    whens: [],
+                    points: [],
+                    angles: []
+                };
+                if (this.trackAttributes) {
+                    var d;
+                    c.attributes = {};
+                    for (var e = 0, f = this.trackAttributes.length; e <
+                        f; ++e) d = this.trackAttributes[e], c.attributes[d] = [], d in this.readers.kml || (this.readers.kml[d] = this.readers.kml._trackPointAttribute)
+                }
+                this.readChildNodes(a, c);
+                if (c.whens.length !== c.points.length) throw Error("gx:Track with unequal number of when (" + c.whens.length + ") and gx:coord (" + c.points.length + ") elements.");
+                var g = 0 < c.angles.length;
+                if (g && c.whens.length !== c.angles.length) throw Error("gx:Track with unequal number of when (" + c.whens.length + ") and gx:angles (" + c.angles.length + ") elements.");
+                for (var h,
+                        i, e = 0, f = c.whens.length; e < f; ++e) {
+                    h = b.feature.clone();
+                    h.fid = b.feature.fid || b.feature.id;
+                    i = c.points[e];
+                    h.geometry = i;
+                    "z" in i && (h.attributes.altitude = i.z);
+                    this.internalProjection && this.externalProjection && h.geometry.transform(this.externalProjection, this.internalProjection);
+                    if (this.trackAttributes) {
+                        i = 0;
+                        for (var j = this.trackAttributes.length; i < j; ++i) h.attributes[d] = c.attributes[this.trackAttributes[i]][e]
+                    }
+                    h.attributes.when = c.whens[e];
+                    h.attributes.trackId = b.feature.id;
+                    g && (i = c.angles[e], h.attributes.heading =
+                        parseFloat(i[0]), h.attributes.tilt = parseFloat(i[1]), h.attributes.roll = parseFloat(i[2]));
+                    b.features.push(h)
+                }
+            },
+            coord: function(a, b) {
+                var c = this.getChildValue(a).replace(this.regExes.trimSpace, "").split(/\s+/),
+                    d = new OpenLayers.Geometry.Point(c[0], c[1]);
+                2 < c.length && (d.z = parseFloat(c[2]));
+                b.points.push(d)
+            },
+            angles: function(a, b) {
+                var c = this.getChildValue(a).replace(this.regExes.trimSpace, "").split(/\s+/);
+                b.angles.push(c)
+            }
+        }
+    },
+    parseFeature: function(a) {
+        for (var b = ["MultiGeometry", "Polygon", "LineString", "Point"],
+                c, d, e, f = 0, g = b.length; f < g; ++f)
+            if (c = b[f], this.internalns = a.namespaceURI ? a.namespaceURI : this.kmlns, d = this.getElementsByTagNameNS(a, this.internalns, c), 0 < d.length) {
+                if (b = this.parseGeometry[c.toLowerCase()]) e = b.apply(this, [d[0]]), this.internalProjection && this.externalProjection && e.transform(this.externalProjection, this.internalProjection);
+                else throw new TypeError("Unsupported geometry type: " + c);
+                break
+            }
+        var h;
+        this.extractAttributes && (h = this.parseAttributes(a));
+        c = new OpenLayers.Feature.Vector(e, h);
+        a = a.getAttribute("id") ||
+            a.getAttribute("name");
+        null != a && (c.fid = a);
+        return c
+    },
+    getStyle: function(a, b) {
+        var c = OpenLayers.Util.removeTail(a),
+            d = OpenLayers.Util.extend({}, b);
+        d.depth++;
+        d.styleBaseUrl = c;
+        !this.styles[a] && !OpenLayers.String.startsWith(a, "#") && d.depth <= this.maxDepth && !this.fetched[c] && (c = this.fetchLink(c)) && this.parseData(c, d);
+        return OpenLayers.Util.extend({}, this.styles[a])
+    },
+    parseGeometry: {
+        point: function(a) {
+            var b = this.getElementsByTagNameNS(a, this.internalns, "coordinates"),
+                a = [];
+            if (0 < b.length) var c = b[0].firstChild.nodeValue,
+                c = c.replace(this.regExes.removeSpace, ""),
+                a = c.split(",");
+            b = null;
+            if (1 < a.length) 2 == a.length && (a[2] = null), b = new OpenLayers.Geometry.Point(a[0], a[1], a[2]);
+            else throw "Bad coordinate string: " + c;
+            return b
+        },
+        linestring: function(a, b) {
+            var c = this.getElementsByTagNameNS(a, this.internalns, "coordinates"),
+                d = null;
+            if (0 < c.length) {
+                for (var c = this.getChildValue(c[0]), c = c.replace(this.regExes.trimSpace, ""), c = c.replace(this.regExes.trimComma, ","), d = c.split(this.regExes.splitSpace), e = d.length, f = Array(e), g, h, i = 0; i < e; ++i)
+                    if (g =
+                        d[i].split(","), h = g.length, 1 < h) 2 == g.length && (g[2] = null), f[i] = new OpenLayers.Geometry.Point(g[0], g[1], g[2]);
+                    else throw "Bad LineString point coordinates: " + d[i];
+                if (e) d = b ? new OpenLayers.Geometry.LinearRing(f) : new OpenLayers.Geometry.LineString(f);
+                else throw "Bad LineString coordinates: " + c;
+            }
+            return d
+        },
+        polygon: function(a) {
+            var a = this.getElementsByTagNameNS(a, this.internalns, "LinearRing"),
+                b = a.length,
+                c = Array(b);
+            if (0 < b)
+                for (var d = 0, e = a.length; d < e; ++d)
+                    if (b = this.parseGeometry.linestring.apply(this, [a[d], !0])) c[d] =
+                        b;
+                    else throw "Bad LinearRing geometry: " + d;
+            return new OpenLayers.Geometry.Polygon(c)
+        },
+        multigeometry: function(a) {
+            for (var b, c = [], d = a.childNodes, e = 0, f = d.length; e < f; ++e) a = d[e], 1 == a.nodeType && (b = this.parseGeometry[(a.prefix ? a.nodeName.split(":")[1] : a.nodeName).toLowerCase()]) && c.push(b.apply(this, [a]));
+            return new OpenLayers.Geometry.Collection(c)
+        }
+    },
+    parseAttributes: function(a) {
+        var b = {},
+            c = a.getElementsByTagName("ExtendedData");
+        c.length && (b = this.parseExtendedData(c[0]));
+        for (var d, e, f, a = a.childNodes, c = 0, g =
+                a.length; c < g; ++c)
+            if (d = a[c], 1 == d.nodeType && (e = d.childNodes, 1 <= e.length && 3 >= e.length)) {
+                switch (e.length) {
+                    case 1:
+                        f = e[0];
+                        break;
+                    case 2:
+                        f = e[0];
+                        e = e[1];
+                        f = 3 == f.nodeType || 4 == f.nodeType ? f : e;
+                        break;
+                    default:
+                        f = e[1]
+                }
+                if (3 == f.nodeType || 4 == f.nodeType)
+                    if (d = d.prefix ? d.nodeName.split(":")[1] : d.nodeName, f = OpenLayers.Util.getXmlNodeValue(f)) f = f.replace(this.regExes.trimSpace, ""), b[d] = f
+            }
+        return b
+    },
+    parseExtendedData: function(a) {
+        var b = {},
+            c, d, e, f, g = a.getElementsByTagName("Data");
+        c = 0;
+        for (d = g.length; c < d; c++) {
+            e = g[c];
+            f = e.getAttribute("name");
+            var h = {},
+                i = e.getElementsByTagName("value");
+            i.length && (h.value = this.getChildValue(i[0]));
+            this.kvpAttributes ? b[f] = h.value : (e = e.getElementsByTagName("displayName"), e.length && (h.displayName = this.getChildValue(e[0])), b[f] = h)
+        }
+        a = a.getElementsByTagName("SimpleData");
+        c = 0;
+        for (d = a.length; c < d; c++) h = {}, e = a[c], f = e.getAttribute("name"), h.value = this.getChildValue(e), this.kvpAttributes ? b[f] = h.value : (h.displayName = f, b[f] = h);
+        return b
+    },
+    parseProperty: function(a, b, c) {
+        var d, a = this.getElementsByTagNameNS(a, b, c);
+        try {
+            d = OpenLayers.Util.getXmlNodeValue(a[0])
+        } catch (e) {
+            d =
+                null
+        }
+        return d
+    },
+    write: function(a) {
+        OpenLayers.Util.isArray(a) || (a = [a]);
+        for (var b = this.createElementNS(this.kmlns, "kml"), c = this.createFolderXML(), d = 0, e = a.length; d < e; ++d) c.appendChild(this.createPlacemarkXML(a[d]));
+        b.appendChild(c);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [b])
+    },
+    createFolderXML: function() {
+        var a = this.createElementNS(this.kmlns, "Folder");
+        if (this.foldersName) {
+            var b = this.createElementNS(this.kmlns, "name"),
+                c = this.createTextNode(this.foldersName);
+            b.appendChild(c);
+            a.appendChild(b)
+        }
+        this.foldersDesc &&
+            (b = this.createElementNS(this.kmlns, "description"), c = this.createTextNode(this.foldersDesc), b.appendChild(c), a.appendChild(b));
+        return a
+    },
+    createPlacemarkXML: function(a) {
+        var b = this.createElementNS(this.kmlns, "name");
+        b.appendChild(this.createTextNode(a.style && a.style.label ? a.style.label : a.attributes.name || a.id));
+        var c = this.createElementNS(this.kmlns, "description");
+        c.appendChild(this.createTextNode(a.attributes.description || this.placemarksDesc));
+        var d = this.createElementNS(this.kmlns, "Placemark");
+        null !=
+            a.fid && d.setAttribute("id", a.fid);
+        d.appendChild(b);
+        d.appendChild(c);
+        b = this.buildGeometryNode(a.geometry);
+        d.appendChild(b);
+        a.attributes && (a = this.buildExtendedData(a.attributes)) && d.appendChild(a);
+        return d
+    },
+    buildGeometryNode: function(a) {
+        var b = a.CLASS_NAME,
+            b = this.buildGeometry[b.substring(b.lastIndexOf(".") + 1).toLowerCase()],
+            c = null;
+        b && (c = b.apply(this, [a]));
+        return c
+    },
+    buildGeometry: {
+        point: function(a) {
+            var b = this.createElementNS(this.kmlns, "Point");
+            b.appendChild(this.buildCoordinatesNode(a));
+            return b
+        },
+        multipoint: function(a) {
+            return this.buildGeometry.collection.apply(this, [a])
+        },
+        linestring: function(a) {
+            var b = this.createElementNS(this.kmlns, "LineString");
+            b.appendChild(this.buildCoordinatesNode(a));
+            return b
+        },
+        multilinestring: function(a) {
+            return this.buildGeometry.collection.apply(this, [a])
+        },
+        linearring: function(a) {
+            var b = this.createElementNS(this.kmlns, "LinearRing");
+            b.appendChild(this.buildCoordinatesNode(a));
+            return b
+        },
+        polygon: function(a) {
+            for (var b = this.createElementNS(this.kmlns, "Polygon"), a = a.components, c, d, e = 0, f = a.length; e < f; ++e) c = 0 == e ? "outerBoundaryIs" : "innerBoundaryIs",
+                c = this.createElementNS(this.kmlns, c), d = this.buildGeometry.linearring.apply(this, [a[e]]), c.appendChild(d), b.appendChild(c);
+            return b
+        },
+        multipolygon: function(a) {
+            return this.buildGeometry.collection.apply(this, [a])
+        },
+        collection: function(a) {
+            for (var b = this.createElementNS(this.kmlns, "MultiGeometry"), c, d = 0, e = a.components.length; d < e; ++d)(c = this.buildGeometryNode.apply(this, [a.components[d]])) && b.appendChild(c);
+            return b
+        }
+    },
+    buildCoordinatesNode: function(a) {
+        var b = this.createElementNS(this.kmlns, "coordinates"),
+            c;
+        if (c = a.components) {
+            for (var d = c.length, e = Array(d), f = 0; f < d; ++f) a = c[f], e[f] = this.buildCoordinates(a);
+            c = e.join(" ")
+        } else c = this.buildCoordinates(a);
+        c = this.createTextNode(c);
+        b.appendChild(c);
+        return b
+    },
+    buildCoordinates: function(a) {
+        this.internalProjection && this.externalProjection && (a = a.clone(), a.transform(this.internalProjection, this.externalProjection));
+        return a.x + "," + a.y
+    },
+    buildExtendedData: function(a) {
+        var b = this.createElementNS(this.kmlns, "ExtendedData"),
+            c;
+        for (c in a)
+            if (a[c] && "name" != c && "description" !=
+                c && "styleUrl" != c) {
+                var d = this.createElementNS(this.kmlns, "Data");
+                d.setAttribute("name", c);
+                var e = this.createElementNS(this.kmlns, "value");
+                if ("object" == typeof a[c]) {
+                    if (a[c].value && e.appendChild(this.createTextNode(a[c].value)), a[c].displayName) {
+                        var f = this.createElementNS(this.kmlns, "displayName");
+                        f.appendChild(this.getXMLDoc().createCDATASection(a[c].displayName));
+                        d.appendChild(f)
+                    }
+                } else e.appendChild(this.createTextNode(a[c]));
+                d.appendChild(e);
+                b.appendChild(d)
+            }
+        return this.isSimpleContent(b) ? null : b
+    },
+    CLASS_NAME: "OpenLayers.Format.KML"
+});
+OpenLayers.Popup = OpenLayers.Class({
+    events: null,
+    id: "",
+    lonlat: null,
+    div: null,
+    contentSize: null,
+    size: null,
+    contentHTML: null,
+    backgroundColor: "",
+    opacity: "",
+    border: "",
+    contentDiv: null,
+    groupDiv: null,
+    closeDiv: null,
+    autoSize: !1,
+    minSize: null,
+    maxSize: null,
+    displayClass: "olPopup",
+    contentDisplayClass: "olPopupContent",
+    padding: 0,
+    disableFirefoxOverflowHack: !1,
+    fixPadding: function() {
+        "number" == typeof this.padding && (this.padding = new OpenLayers.Bounds(this.padding, this.padding, this.padding, this.padding))
+    },
+    panMapIfOutOfView: !1,
+    keepInMap: !1,
+    closeOnMove: !1,
+    map: null,
+    initialize: function(a, b, c, d, e, f) {
+        null == a && (a = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_"));
+        this.id = a;
+        this.lonlat = b;
+        this.contentSize = null != c ? c : new OpenLayers.Size(OpenLayers.Popup.WIDTH, OpenLayers.Popup.HEIGHT);
+        null != d && (this.contentHTML = d);
+        this.backgroundColor = OpenLayers.Popup.COLOR;
+        this.opacity = OpenLayers.Popup.OPACITY;
+        this.border = OpenLayers.Popup.BORDER;
+        this.div = OpenLayers.Util.createDiv(this.id, null, null, null, null, null, "hidden");
+        this.div.className = this.displayClass;
+        this.groupDiv = OpenLayers.Util.createDiv(this.id + "_GroupDiv", null, null, null, "relative", null, "hidden");
+        a = this.div.id + "_contentDiv";
+        this.contentDiv = OpenLayers.Util.createDiv(a, null, this.contentSize.clone(), null, "relative");
+        this.contentDiv.className = this.contentDisplayClass;
+        this.groupDiv.appendChild(this.contentDiv);
+        this.div.appendChild(this.groupDiv);
+        e && this.addCloseBox(f);
+        this.registerEvents()
+    },
+    destroy: function() {
+        this.border = this.opacity = this.backgroundColor = this.contentHTML = this.size = this.lonlat = this.id =
+            null;
+        this.closeOnMove && this.map && this.map.events.unregister("movestart", this, this.hide);
+        this.events.destroy();
+        this.events = null;
+        this.closeDiv && (OpenLayers.Event.stopObservingElement(this.closeDiv), this.groupDiv.removeChild(this.closeDiv));
+        this.closeDiv = null;
+        this.div.removeChild(this.groupDiv);
+        this.groupDiv = null;
+        null != this.map && this.map.removePopup(this);
+        this.panMapIfOutOfView = this.padding = this.maxSize = this.minSize = this.autoSize = this.div = this.map = null
+    },
+    draw: function(a) {
+        null == a && null != this.lonlat && null !=
+            this.map && (a = this.map.getLayerPxFromLonLat(this.lonlat));
+        this.closeOnMove && this.map.events.register("movestart", this, this.hide);
+        !this.disableFirefoxOverflowHack && "firefox" == OpenLayers.BROWSER_NAME && (this.map.events.register("movestart", this, function() {
+            var a = document.defaultView.getComputedStyle(this.contentDiv, null).getPropertyValue("overflow");
+            "hidden" != a && (this.contentDiv._oldOverflow = a, this.contentDiv.style.overflow = "hidden")
+        }), this.map.events.register("moveend", this, function() {
+            var a = this.contentDiv._oldOverflow;
+            a && (this.contentDiv.style.overflow = a, this.contentDiv._oldOverflow = null)
+        }));
+        this.moveTo(a);
+        !this.autoSize && !this.size && this.setSize(this.contentSize);
+        this.setBackgroundColor();
+        this.setOpacity();
+        this.setBorder();
+        this.setContentHTML();
+        this.panMapIfOutOfView && this.panIntoView();
+        return this.div
+    },
+    updatePosition: function() {
+        if (this.lonlat && this.map) {
+            var a = this.map.getLayerPxFromLonLat(this.lonlat);
+            a && this.moveTo(a)
+        }
+    },
+    moveTo: function(a) {
+        null != a && null != this.div && (this.div.style.left = a.x + "px", this.div.style.top =
+            a.y + "px")
+    },
+    visible: function() {
+        return OpenLayers.Element.visible(this.div)
+    },
+    toggle: function() {
+        this.visible() ? this.hide() : this.show()
+    },
+    show: function() {
+        this.div.style.display = "";
+        this.panMapIfOutOfView && this.panIntoView()
+    },
+    hide: function() {
+        this.div.style.display = "none"
+    },
+    setSize: function(a) {
+        this.size = a.clone();
+        var b = this.getContentDivPadding(),
+            c = b.left + b.right,
+            d = b.top + b.bottom;
+        this.fixPadding();
+        c += this.padding.left + this.padding.right;
+        d += this.padding.top + this.padding.bottom;
+        if (this.closeDiv) var e = parseInt(this.closeDiv.style.width),
+            c = c + (e + b.right);
+        this.size.w += c;
+        this.size.h += d;
+        "msie" == OpenLayers.BROWSER_NAME && (this.contentSize.w += b.left + b.right, this.contentSize.h += b.bottom + b.top);
+        null != this.div && (this.div.style.width = this.size.w + "px", this.div.style.height = this.size.h + "px");
+        null != this.contentDiv && (this.contentDiv.style.width = a.w + "px", this.contentDiv.style.height = a.h + "px")
+    },
+    updateSize: function() {
+        var a = "<div class='" + this.contentDisplayClass + "'>" + this.contentDiv.innerHTML + "</div>",
+            b = this.map ? this.map.div : document.body,
+            c = OpenLayers.Util.getRenderedDimensions(a,
+                null, {
+                    displayClass: this.displayClass,
+                    containerElement: b
+                }),
+            d = this.getSafeContentSize(c),
+            e = null;
+        d.equals(c) ? e = c : (c = {
+            w: d.w < c.w ? d.w : null,
+            h: d.h < c.h ? d.h : null
+        }, c.w && c.h ? e = d : (a = OpenLayers.Util.getRenderedDimensions(a, c, {
+            displayClass: this.contentDisplayClass,
+            containerElement: b
+        }), "hidden" != OpenLayers.Element.getStyle(this.contentDiv, "overflow") && a.equals(d) && (d = OpenLayers.Util.getScrollbarWidth(), c.w ? a.h += d : a.w += d), e = this.getSafeContentSize(a)));
+        this.setSize(e)
+    },
+    setBackgroundColor: function(a) {
+        void 0 != a && (this.backgroundColor =
+            a);
+        null != this.div && (this.div.style.backgroundColor = this.backgroundColor)
+    },
+    setOpacity: function(a) {
+        void 0 != a && (this.opacity = a);
+        null != this.div && (this.div.style.opacity = this.opacity, this.div.style.filter = "alpha(opacity=" + 100 * this.opacity + ")")
+    },
+    setBorder: function(a) {
+        void 0 != a && (this.border = a);
+        null != this.div && (this.div.style.border = this.border)
+    },
+    setContentHTML: function(a) {
+        null != a && (this.contentHTML = a);
+        null != this.contentDiv && (null != this.contentHTML && this.contentHTML != this.contentDiv.innerHTML) && (this.contentDiv.innerHTML =
+            this.contentHTML, this.autoSize && (this.registerImageListeners(), this.updateSize()))
+    },
+    registerImageListeners: function() {
+        for (var a = function() {
+                null !== this.popup.id && (this.popup.updateSize(), this.popup.visible() && this.popup.panMapIfOutOfView && this.popup.panIntoView(), OpenLayers.Event.stopObserving(this.img, "load", this.img._onImageLoad))
+            }, b = this.contentDiv.getElementsByTagName("img"), c = 0, d = b.length; c < d; c++) {
+            var e = b[c];
+            if (0 == e.width || 0 == e.height) e._onImgLoad = OpenLayers.Function.bind(a, {
+                    popup: this,
+                    img: e
+                }),
+                OpenLayers.Event.observe(e, "load", e._onImgLoad)
+        }
+    },
+    getSafeContentSize: function(a) {
+        var a = a.clone(),
+            b = this.getContentDivPadding(),
+            c = b.left + b.right,
+            d = b.top + b.bottom;
+        this.fixPadding();
+        c += this.padding.left + this.padding.right;
+        d += this.padding.top + this.padding.bottom;
+        if (this.closeDiv) var e = parseInt(this.closeDiv.style.width),
+            c = c + (e + b.right);
+        this.minSize && (a.w = Math.max(a.w, this.minSize.w - c), a.h = Math.max(a.h, this.minSize.h - d));
+        this.maxSize && (a.w = Math.min(a.w, this.maxSize.w - c), a.h = Math.min(a.h, this.maxSize.h -
+            d));
+        if (this.map && this.map.size) {
+            e = b = 0;
+            if (this.keepInMap && !this.panMapIfOutOfView) switch (e = this.map.getPixelFromLonLat(this.lonlat), this.relativePosition) {
+                case "tr":
+                    b = e.x;
+                    e = this.map.size.h - e.y;
+                    break;
+                case "tl":
+                    b = this.map.size.w - e.x;
+                    e = this.map.size.h - e.y;
+                    break;
+                case "bl":
+                    b = this.map.size.w - e.x;
+                    e = e.y;
+                    break;
+                case "br":
+                    b = e.x;
+                    e = e.y;
+                    break;
+                default:
+                    b = e.x, e = this.map.size.h - e.y
+            }
+            d = this.map.size.h - this.map.paddingForPopups.top - this.map.paddingForPopups.bottom - d - e;
+            a.w = Math.min(a.w, this.map.size.w - this.map.paddingForPopups.left -
+                this.map.paddingForPopups.right - c - b);
+            a.h = Math.min(a.h, d)
+        }
+        return a
+    },
+    getContentDivPadding: function() {
+        var a = this._contentDivPadding;
+        if (!a && (null == this.div.parentNode && (this.div.style.display = "none", document.body.appendChild(this.div)), this._contentDivPadding = a = new OpenLayers.Bounds(OpenLayers.Element.getStyle(this.contentDiv, "padding-left"), OpenLayers.Element.getStyle(this.contentDiv, "padding-bottom"), OpenLayers.Element.getStyle(this.contentDiv, "padding-right"), OpenLayers.Element.getStyle(this.contentDiv,
+                "padding-top")), this.div.parentNode == document.body)) document.body.removeChild(this.div), this.div.style.display = "";
+        return a
+    },
+    addCloseBox: function(a) {
+        this.closeDiv = OpenLayers.Util.createDiv(this.id + "_close", null, {
+            w: 17,
+            h: 17
+        });
+        this.closeDiv.className = "olPopupCloseBox";
+        var b = this.getContentDivPadding();
+        this.closeDiv.style.right = b.right + "px";
+        this.closeDiv.style.top = b.top + "px";
+        this.groupDiv.appendChild(this.closeDiv);
+        a = a || function(a) {
+            this.hide();
+            OpenLayers.Event.stop(a)
+        };
+        OpenLayers.Event.observe(this.closeDiv,
+            "touchend", OpenLayers.Function.bindAsEventListener(a, this));
+        OpenLayers.Event.observe(this.closeDiv, "click", OpenLayers.Function.bindAsEventListener(a, this))
+    },
+    panIntoView: function() {
+        var a = this.map.getSize(),
+            b = this.map.getViewPortPxFromLayerPx(new OpenLayers.Pixel(parseInt(this.div.style.left), parseInt(this.div.style.top))),
+            c = b.clone();
+        b.x < this.map.paddingForPopups.left ? c.x = this.map.paddingForPopups.left : b.x + this.size.w > a.w - this.map.paddingForPopups.right && (c.x = a.w - this.map.paddingForPopups.right - this.size.w);
+        b.y < this.map.paddingForPopups.top ? c.y = this.map.paddingForPopups.top : b.y + this.size.h > a.h - this.map.paddingForPopups.bottom && (c.y = a.h - this.map.paddingForPopups.bottom - this.size.h);
+        this.map.pan(b.x - c.x, b.y - c.y)
+    },
+    registerEvents: function() {
+        this.events = new OpenLayers.Events(this, this.div, null, !0);
+        this.events.on({
+            mousedown: this.onmousedown,
+            mousemove: this.onmousemove,
+            mouseup: this.onmouseup,
+            click: this.onclick,
+            mouseout: this.onmouseout,
+            dblclick: this.ondblclick,
+            touchstart: function(a) {
+                OpenLayers.Event.stop(a, !0)
+            },
+            scope: this
+        })
+    },
+    onmousedown: function(a) {
+        this.mousedown = !0;
+        OpenLayers.Event.stop(a, !0)
+    },
+    onmousemove: function(a) {
+        this.mousedown && OpenLayers.Event.stop(a, !0)
+    },
+    onmouseup: function(a) {
+        this.mousedown && (this.mousedown = !1, OpenLayers.Event.stop(a, !0))
+    },
+    onclick: function(a) {
+        OpenLayers.Event.stop(a, !0)
+    },
+    onmouseout: function() {
+        this.mousedown = !1
+    },
+    ondblclick: function(a) {
+        OpenLayers.Event.stop(a, !0)
+    },
+    CLASS_NAME: "OpenLayers.Popup"
+});
+OpenLayers.Popup.WIDTH = 200;
+OpenLayers.Popup.HEIGHT = 200;
+OpenLayers.Popup.COLOR = "white";
+OpenLayers.Popup.OPACITY = 1;
+OpenLayers.Popup.BORDER = "0px";
+OpenLayers.Popup.Anchored = OpenLayers.Class(OpenLayers.Popup, {
+    relativePosition: null,
+    keepInMap: !0,
+    anchor: null,
+    initialize: function(a, b, c, d, e, f, g) {
+        OpenLayers.Popup.prototype.initialize.apply(this, [a, b, c, d, f, g]);
+        this.anchor = null != e ? e : {
+            size: new OpenLayers.Size(0, 0),
+            offset: new OpenLayers.Pixel(0, 0)
+        }
+    },
+    destroy: function() {
+        this.relativePosition = this.anchor = null;
+        OpenLayers.Popup.prototype.destroy.apply(this, arguments)
+    },
+    show: function() {
+        this.updatePosition();
+        OpenLayers.Popup.prototype.show.apply(this, arguments)
+    },
+    moveTo: function(a) {
+        var b = this.relativePosition;
+        this.relativePosition = this.calculateRelativePosition(a);
+        a = this.calculateNewPx(a);
+        OpenLayers.Popup.prototype.moveTo.apply(this, Array(a));
+        this.relativePosition != b && this.updateRelativePosition()
+    },
+    setSize: function(a) {
+        OpenLayers.Popup.prototype.setSize.apply(this, arguments);
+        this.lonlat && this.map && this.moveTo(this.map.getLayerPxFromLonLat(this.lonlat))
+    },
+    calculateRelativePosition: function(a) {
+        a = this.map.getLonLatFromLayerPx(a);
+        a = this.map.getExtent().determineQuadrant(a);
+        return OpenLayers.Bounds.oppositeQuadrant(a)
+    },
+    updateRelativePosition: function() {},
+    calculateNewPx: function(a) {
+        var a = a.offset(this.anchor.offset),
+            b = this.size || this.contentSize,
+            c = "t" == this.relativePosition.charAt(0);
+        a.y += c ? -b.h : this.anchor.size.h;
+        c = "l" == this.relativePosition.charAt(1);
+        a.x += c ? -b.w : this.anchor.size.w;
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Popup.Anchored"
+});
+/*
+ Apache 2 
+
+ Contains portions of Rico <http://openrico.org/>
+
+ Copyright 2005 Sabre Airline Solutions  
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you
+ may not use this file except in compliance with the License. You
+ may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0  
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied. See the License for the specific language governing
+ permissions and limitations under the License. 
+*/
+OpenLayers.Console.warn("OpenLayers.Rico is deprecated");
+OpenLayers.Rico = OpenLayers.Rico || {};
+OpenLayers.Rico.Color = OpenLayers.Class({
+    initialize: function(a, b, c) {
+        this.rgb = {
+            r: a,
+            g: b,
+            b: c
+        }
+    },
+    setRed: function(a) {
+        this.rgb.r = a
+    },
+    setGreen: function(a) {
+        this.rgb.g = a
+    },
+    setBlue: function(a) {
+        this.rgb.b = a
+    },
+    setHue: function(a) {
+        var b = this.asHSB();
+        b.h = a;
+        this.rgb = OpenLayers.Rico.Color.HSBtoRGB(b.h, b.s, b.b)
+    },
+    setSaturation: function(a) {
+        var b = this.asHSB();
+        b.s = a;
+        this.rgb = OpenLayers.Rico.Color.HSBtoRGB(b.h, b.s, b.b)
+    },
+    setBrightness: function(a) {
+        var b = this.asHSB();
+        b.b = a;
+        this.rgb = OpenLayers.Rico.Color.HSBtoRGB(b.h, b.s, b.b)
+    },
+    darken: function(a) {
+        var b = this.asHSB();
+        this.rgb = OpenLayers.Rico.Color.HSBtoRGB(b.h, b.s, Math.max(b.b - a, 0))
+    },
+    brighten: function(a) {
+        var b = this.asHSB();
+        this.rgb = OpenLayers.Rico.Color.HSBtoRGB(b.h, b.s, Math.min(b.b + a, 1))
+    },
+    blend: function(a) {
+        this.rgb.r = Math.floor((this.rgb.r + a.rgb.r) / 2);
+        this.rgb.g = Math.floor((this.rgb.g + a.rgb.g) / 2);
+        this.rgb.b = Math.floor((this.rgb.b + a.rgb.b) / 2)
+    },
+    isBright: function() {
+        this.asHSB();
+        return 0.5 < this.asHSB().b
+    },
+    isDark: function() {
+        return !this.isBright()
+    },
+    asRGB: function() {
+        return "rgb(" +
+            this.rgb.r + "," + this.rgb.g + "," + this.rgb.b + ")"
+    },
+    asHex: function() {
+        return "#" + this.rgb.r.toColorPart() + this.rgb.g.toColorPart() + this.rgb.b.toColorPart()
+    },
+    asHSB: function() {
+        return OpenLayers.Rico.Color.RGBtoHSB(this.rgb.r, this.rgb.g, this.rgb.b)
+    },
+    toString: function() {
+        return this.asHex()
+    }
+});
+OpenLayers.Rico.Color.createFromHex = function(a) {
+    if (4 == a.length)
+        for (var b = a, a = "#", c = 1; 4 > c; c++) a += b.charAt(c) + b.charAt(c);
+    0 == a.indexOf("#") && (a = a.substring(1));
+    b = a.substring(0, 2);
+    c = a.substring(2, 4);
+    a = a.substring(4, 6);
+    return new OpenLayers.Rico.Color(parseInt(b, 16), parseInt(c, 16), parseInt(a, 16))
+};
+OpenLayers.Rico.Color.createColorFromBackground = function(a) {
+    var b = OpenLayers.Element.getStyle(OpenLayers.Util.getElement(a), "backgroundColor");
+    return "transparent" == b && a.parentNode ? OpenLayers.Rico.Color.createColorFromBackground(a.parentNode) : null == b ? new OpenLayers.Rico.Color(255, 255, 255) : 0 == b.indexOf("rgb(") ? (a = b.substring(4, b.length - 1).split(","), new OpenLayers.Rico.Color(parseInt(a[0]), parseInt(a[1]), parseInt(a[2]))) : 0 == b.indexOf("#") ? OpenLayers.Rico.Color.createFromHex(b) : new OpenLayers.Rico.Color(255,
+        255, 255)
+};
+OpenLayers.Rico.Color.HSBtoRGB = function(a, b, c) {
+    var d = 0,
+        e = 0,
+        f = 0;
+    if (0 == b) f = e = d = parseInt(255 * c + 0.5);
+    else {
+        var a = 6 * (a - Math.floor(a)),
+            g = a - Math.floor(a),
+            h = c * (1 - b),
+            i = c * (1 - b * g),
+            b = c * (1 - b * (1 - g));
+        switch (parseInt(a)) {
+            case 0:
+                d = 255 * c + 0.5;
+                e = 255 * b + 0.5;
+                f = 255 * h + 0.5;
+                break;
+            case 1:
+                d = 255 * i + 0.5;
+                e = 255 * c + 0.5;
+                f = 255 * h + 0.5;
+                break;
+            case 2:
+                d = 255 * h + 0.5;
+                e = 255 * c + 0.5;
+                f = 255 * b + 0.5;
+                break;
+            case 3:
+                d = 255 * h + 0.5;
+                e = 255 * i + 0.5;
+                f = 255 * c + 0.5;
+                break;
+            case 4:
+                d = 255 * b + 0.5;
+                e = 255 * h + 0.5;
+                f = 255 * c + 0.5;
+                break;
+            case 5:
+                d = 255 * c + 0.5, e = 255 * h + 0.5, f = 255 * i + 0.5
+        }
+    }
+    return {
+        r: parseInt(d),
+        g: parseInt(e),
+        b: parseInt(f)
+    }
+};
+OpenLayers.Rico.Color.RGBtoHSB = function(a, b, c) {
+    var d, e = a > b ? a : b;
+    c > e && (e = c);
+    var f = a < b ? a : b;
+    c < f && (f = c);
+    d = 0 != e ? (e - f) / e : 0;
+    if (0 == d) a = 0;
+    else {
+        var g = (e - a) / (e - f),
+            h = (e - b) / (e - f),
+            c = (e - c) / (e - f),
+            a = (a == e ? c - h : b == e ? 2 + g - c : 4 + h - g) / 6;
+        0 > a && (a += 1)
+    }
+    return {
+        h: a,
+        s: d,
+        b: e / 255
+    }
+};
+OpenLayers.Console.warn("OpenLayers.Rico is deprecated");
+OpenLayers.Rico = OpenLayers.Rico || {};
+OpenLayers.Rico.Corner = {
+    round: function(a, b) {
+        a = OpenLayers.Util.getElement(a);
+        this._setOptions(b);
+        var c = this.options.color;
+        "fromElement" == this.options.color && (c = this._background(a));
+        var d = this.options.bgColor;
+        "fromParent" == this.options.bgColor && (d = this._background(a.offsetParent));
+        this._roundCornersImpl(a, c, d)
+    },
+    changeColor: function(a, b) {
+        a.style.backgroundColor = b;
+        for (var c = a.parentNode.getElementsByTagName("span"), d = 0; d < c.length; d++) c[d].style.backgroundColor = b
+    },
+    changeOpacity: function(a, b) {
+        var c = "alpha(opacity=" +
+            100 * b + ")";
+        a.style.opacity = b;
+        a.style.filter = c;
+        for (var d = a.parentNode.getElementsByTagName("span"), e = 0; e < d.length; e++) d[e].style.opacity = b, d[e].style.filter = c
+    },
+    reRound: function(a, b) {
+        var c = a.parentNode.childNodes[2];
+        a.parentNode.removeChild(a.parentNode.childNodes[0]);
+        a.parentNode.removeChild(c);
+        this.round(a.parentNode, b)
+    },
+    _roundCornersImpl: function(a, b, c) {
+        this.options.border && this._renderBorder(a, c);
+        this._isTopRounded() && this._roundTopCorners(a, b, c);
+        this._isBottomRounded() && this._roundBottomCorners(a,
+            b, c)
+    },
+    _renderBorder: function(a, b) {
+        var c = "1px solid " + this._borderColor(b);
+        a.innerHTML = "<div " + ("style='border-left: " + c + ";" + ("border-right: " + c) + "'") + ">" + a.innerHTML + "</div>"
+    },
+    _roundTopCorners: function(a, b, c) {
+        for (var d = this._createCorner(c), e = 0; e < this.options.numSlices; e++) d.appendChild(this._createCornerSlice(b, c, e, "top"));
+        a.style.paddingTop = 0;
+        a.insertBefore(d, a.firstChild)
+    },
+    _roundBottomCorners: function(a, b, c) {
+        for (var d = this._createCorner(c), e = this.options.numSlices - 1; 0 <= e; e--) d.appendChild(this._createCornerSlice(b,
+            c, e, "bottom"));
+        a.style.paddingBottom = 0;
+        a.appendChild(d)
+    },
+    _createCorner: function(a) {
+        var b = document.createElement("div");
+        b.style.backgroundColor = this._isTransparent() ? "transparent" : a;
+        return b
+    },
+    _createCornerSlice: function(a, b, c, d) {
+        var e = document.createElement("span"),
+            f = e.style;
+        f.backgroundColor = a;
+        f.display = "block";
+        f.height = "1px";
+        f.overflow = "hidden";
+        f.fontSize = "1px";
+        a = this._borderColor(a, b);
+        this.options.border && 0 == c ? (f.borderTopStyle = "solid", f.borderTopWidth = "1px", f.borderLeftWidth = "0px", f.borderRightWidth =
+            "0px", f.borderBottomWidth = "0px", f.height = "0px", f.borderColor = a) : a && (f.borderColor = a, f.borderStyle = "solid", f.borderWidth = "0px 1px");
+        !this.options.compact && c == this.options.numSlices - 1 && (f.height = "2px");
+        this._setMargin(e, c, d);
+        this._setBorder(e, c, d);
+        return e
+    },
+    _setOptions: function(a) {
+        this.options = {
+            corners: "all",
+            color: "fromElement",
+            bgColor: "fromParent",
+            blend: !0,
+            border: !1,
+            compact: !1
+        };
+        OpenLayers.Util.extend(this.options, a || {});
+        this.options.numSlices = this.options.compact ? 2 : 4;
+        this._isTransparent() && (this.options.blend = !1)
+    },
+    _whichSideTop: function() {
+        return this._hasString(this.options.corners, "all", "top") || 0 <= this.options.corners.indexOf("tl") && 0 <= this.options.corners.indexOf("tr") ? "" : 0 <= this.options.corners.indexOf("tl") ? "left" : 0 <= this.options.corners.indexOf("tr") ? "right" : ""
+    },
+    _whichSideBottom: function() {
+        return this._hasString(this.options.corners, "all", "bottom") || 0 <= this.options.corners.indexOf("bl") && 0 <= this.options.corners.indexOf("br") ? "" : 0 <= this.options.corners.indexOf("bl") ? "left" : 0 <= this.options.corners.indexOf("br") ?
+            "right" : ""
+    },
+    _borderColor: function(a, b) {
+        return "transparent" == a ? b : this.options.border ? this.options.border : this.options.blend ? this._blend(b, a) : ""
+    },
+    _setMargin: function(a, b, c) {
+        b = this._marginSize(b);
+        c = "top" == c ? this._whichSideTop() : this._whichSideBottom();
+        "left" == c ? (a.style.marginLeft = b + "px", a.style.marginRight = "0px") : "right" == c ? (a.style.marginRight = b + "px", a.style.marginLeft = "0px") : (a.style.marginLeft = b + "px", a.style.marginRight = b + "px")
+    },
+    _setBorder: function(a, b, c) {
+        b = this._borderSize(b);
+        c = "top" == c ? this._whichSideTop() :
+            this._whichSideBottom();
+        "left" == c ? (a.style.borderLeftWidth = b + "px", a.style.borderRightWidth = "0px") : "right" == c ? (a.style.borderRightWidth = b + "px", a.style.borderLeftWidth = "0px") : (a.style.borderLeftWidth = b + "px", a.style.borderRightWidth = b + "px");
+        !1 != this.options.border && (a.style.borderLeftWidth = b + "px", a.style.borderRightWidth = b + "px")
+    },
+    _marginSize: function(a) {
+        if (this._isTransparent()) return 0;
+        var b = [5, 3, 2, 1],
+            c = [3, 2, 1, 0],
+            d = [2, 1],
+            e = [1, 0];
+        return this.options.compact && this.options.blend ? e[a] : this.options.compact ?
+            d[a] : this.options.blend ? c[a] : b[a]
+    },
+    _borderSize: function(a) {
+        var b = [5, 3, 2, 1],
+            c = [2, 1, 1, 1],
+            d = [1, 0],
+            e = [0, 2, 0, 0];
+        return this.options.compact && (this.options.blend || this._isTransparent()) ? 1 : this.options.compact ? d[a] : this.options.blend ? c[a] : this.options.border ? e[a] : this._isTransparent() ? b[a] : 0
+    },
+    _hasString: function(a) {
+        for (var b = 1; b < arguments.length; b++)
+            if (0 <= a.indexOf(arguments[b])) return !0;
+        return !1
+    },
+    _blend: function(a, b) {
+        var c = OpenLayers.Rico.Color.createFromHex(a);
+        c.blend(OpenLayers.Rico.Color.createFromHex(b));
+        return c
+    },
+    _background: function(a) {
+        try {
+            return OpenLayers.Rico.Color.createColorFromBackground(a).asHex()
+        } catch (b) {
+            return "#ffffff"
+        }
+    },
+    _isTransparent: function() {
+        return "transparent" == this.options.color
+    },
+    _isTopRounded: function() {
+        return this._hasString(this.options.corners, "all", "top", "tl", "tr")
+    },
+    _isBottomRounded: function() {
+        return this._hasString(this.options.corners, "all", "bottom", "bl", "br")
+    },
+    _hasSingleTextChild: function(a) {
+        return 1 == a.childNodes.length && 3 == a.childNodes[0].nodeType
+    }
+};
+OpenLayers.Popup.AnchoredBubble = OpenLayers.Class(OpenLayers.Popup.Anchored, {
+    rounded: !1,
+    initialize: function(a, b, c, d, e, f, g) {
+        OpenLayers.Console.warn("AnchoredBubble is deprecated");
+        this.padding = new OpenLayers.Bounds(0, OpenLayers.Popup.AnchoredBubble.CORNER_SIZE, 0, OpenLayers.Popup.AnchoredBubble.CORNER_SIZE);
+        OpenLayers.Popup.Anchored.prototype.initialize.apply(this, arguments)
+    },
+    draw: function(a) {
+        OpenLayers.Popup.Anchored.prototype.draw.apply(this, arguments);
+        this.setContentHTML();
+        this.setBackgroundColor();
+        this.setOpacity();
+        return this.div
+    },
+    updateRelativePosition: function() {
+        this.setRicoCorners()
+    },
+    setSize: function(a) {
+        OpenLayers.Popup.Anchored.prototype.setSize.apply(this, arguments);
+        this.setRicoCorners()
+    },
+    setBackgroundColor: function(a) {
+        void 0 != a && (this.backgroundColor = a);
+        null != this.div && null != this.contentDiv && (this.div.style.background = "transparent", OpenLayers.Rico.Corner.changeColor(this.groupDiv, this.backgroundColor))
+    },
+    setOpacity: function(a) {
+        OpenLayers.Popup.Anchored.prototype.setOpacity.call(this,
+            a);
+        null != this.div && null != this.groupDiv && OpenLayers.Rico.Corner.changeOpacity(this.groupDiv, this.opacity)
+    },
+    setBorder: function() {
+        this.border = 0
+    },
+    setRicoCorners: function() {
+        var a = {
+            corners: this.getCornersToRound(this.relativePosition),
+            color: this.backgroundColor,
+            bgColor: "transparent",
+            blend: !1
+        };
+        this.rounded ? (OpenLayers.Rico.Corner.reRound(this.groupDiv, a), this.setBackgroundColor(), this.setOpacity()) : (OpenLayers.Rico.Corner.round(this.div, a), this.rounded = !0)
+    },
+    getCornersToRound: function() {
+        var a = ["tl", "tr",
+                "bl", "br"
+            ],
+            b = OpenLayers.Bounds.oppositeQuadrant(this.relativePosition);
+        OpenLayers.Util.removeItem(a, b);
+        return a.join(" ")
+    },
+    CLASS_NAME: "OpenLayers.Popup.AnchoredBubble"
+});
+OpenLayers.Popup.AnchoredBubble.CORNER_SIZE = 5;
+OpenLayers.Protocol.WFS.v1 = OpenLayers.Class(OpenLayers.Protocol, {
+    version: null,
+    srsName: "EPSG:4326",
+    featureType: null,
+    featureNS: null,
+    geometryName: "the_geom",
+    schema: null,
+    featurePrefix: "feature",
+    formatOptions: null,
+    readFormat: null,
+    readOptions: null,
+    initialize: function(a) {
+        OpenLayers.Protocol.prototype.initialize.apply(this, [a]);
+        a.format || (this.format = OpenLayers.Format.WFST(OpenLayers.Util.extend({
+            version: this.version,
+            featureType: this.featureType,
+            featureNS: this.featureNS,
+            featurePrefix: this.featurePrefix,
+            geometryName: this.geometryName,
+            srsName: this.srsName,
+            schema: this.schema
+        }, this.formatOptions)));
+        !a.geometryName && 1 < parseFloat(this.format.version) && this.setGeometryName(null)
+    },
+    destroy: function() {
+        this.options && !this.options.format && this.format.destroy();
+        this.format = null;
+        OpenLayers.Protocol.prototype.destroy.apply(this)
+    },
+    read: function(a) {
+        OpenLayers.Protocol.prototype.read.apply(this, arguments);
+        a = OpenLayers.Util.extend({}, a);
+        OpenLayers.Util.applyDefaults(a, this.options || {});
+        var b = new OpenLayers.Protocol.Response({
+                requestType: "read"
+            }),
+            c = OpenLayers.Format.XML.prototype.write.apply(this.format, [this.format.writeNode("wfs:GetFeature", a)]);
+        b.priv = OpenLayers.Request.POST({
+            url: a.url,
+            callback: this.createCallback(this.handleRead, b, a),
+            params: a.params,
+            headers: a.headers,
+            data: c
+        });
+        return b
+    },
+    setFeatureType: function(a) {
+        this.featureType = a;
+        this.format.featureType = a
+    },
+    setGeometryName: function(a) {
+        this.geometryName = a;
+        this.format.geometryName = a
+    },
+    handleRead: function(a, b) {
+        b = OpenLayers.Util.extend({}, b);
+        OpenLayers.Util.applyDefaults(b, this.options);
+        if (b.callback) {
+            var c =
+                a.priv;
+            200 <= c.status && 300 > c.status ? (c = this.parseResponse(c, b.readOptions)) && !1 !== c.success ? (b.readOptions && "object" == b.readOptions.output ? OpenLayers.Util.extend(a, c) : a.features = c, a.code = OpenLayers.Protocol.Response.SUCCESS) : (a.code = OpenLayers.Protocol.Response.FAILURE, a.error = c) : a.code = OpenLayers.Protocol.Response.FAILURE;
+            b.callback.call(b.scope, a)
+        }
+    },
+    parseResponse: function(a, b) {
+        var c = a.responseXML;
+        if (!c || !c.documentElement) c = a.responseText;
+        if (!c || 0 >= c.length) return null;
+        c = null !== this.readFormat ? this.readFormat.read(c) :
+            this.format.read(c, b);
+        if (!this.featureNS) {
+            var d = this.readFormat || this.format;
+            this.featureNS = d.featureNS;
+            d.autoConfig = !1;
+            this.geometryName || this.setGeometryName(d.geometryName)
+        }
+        return c
+    },
+    commit: function(a, b) {
+        b = OpenLayers.Util.extend({}, b);
+        OpenLayers.Util.applyDefaults(b, this.options);
+        var c = new OpenLayers.Protocol.Response({
+            requestType: "commit",
+            reqFeatures: a
+        });
+        c.priv = OpenLayers.Request.POST({
+            url: b.url,
+            headers: b.headers,
+            data: this.format.write(a, b),
+            callback: this.createCallback(this.handleCommit, c, b)
+        });
+        return c
+    },
+    handleCommit: function(a, b) {
+        if (b.callback) {
+            var c = a.priv,
+                d = c.responseXML;
+            if (!d || !d.documentElement) d = c.responseText;
+            c = this.format.read(d) || {};
+            a.insertIds = c.insertIds || [];
+            c.success ? a.code = OpenLayers.Protocol.Response.SUCCESS : (a.code = OpenLayers.Protocol.Response.FAILURE, a.error = c);
+            b.callback.call(b.scope, a)
+        }
+    },
+    filterDelete: function(a, b) {
+        b = OpenLayers.Util.extend({}, b);
+        OpenLayers.Util.applyDefaults(b, this.options);
+        new OpenLayers.Protocol.Response({
+            requestType: "commit"
+        });
+        var c = this.format.createElementNSPlus("wfs:Transaction", {
+                attributes: {
+                    service: "WFS",
+                    version: this.version
+                }
+            }),
+            d = this.format.createElementNSPlus("wfs:Delete", {
+                attributes: {
+                    typeName: (b.featureNS ? this.featurePrefix + ":" : "") + b.featureType
+                }
+            });
+        b.featureNS && d.setAttribute("xmlns:" + this.featurePrefix, b.featureNS);
+        var e = this.format.writeNode("ogc:Filter", a);
+        d.appendChild(e);
+        c.appendChild(d);
+        c = OpenLayers.Format.XML.prototype.write.apply(this.format, [c]);
+        return OpenLayers.Request.POST({
+            url: this.url,
+            callback: b.callback || function() {},
+            data: c
+        })
+    },
+    abort: function(a) {
+        a && a.priv.abort()
+    },
+    CLASS_NAME: "OpenLayers.Protocol.WFS.v1"
+});
+OpenLayers.Handler.Point = OpenLayers.Class(OpenLayers.Handler, {
+    point: null,
+    layer: null,
+    multi: !1,
+    citeCompliant: !1,
+    mouseDown: !1,
+    stoppedDown: null,
+    lastDown: null,
+    lastUp: null,
+    persist: !1,
+    stopDown: !1,
+    stopUp: !1,
+    layerOptions: null,
+    pixelTolerance: 5,
+    touch: !1,
+    lastTouchPx: null,
+    initialize: function(a, b, c) {
+        if (!c || !c.layerOptions || !c.layerOptions.styleMap) this.style = OpenLayers.Util.extend(OpenLayers.Feature.Vector.style["default"], {});
+        OpenLayers.Handler.prototype.initialize.apply(this, arguments)
+    },
+    activate: function() {
+        if (!OpenLayers.Handler.prototype.activate.apply(this,
+                arguments)) return !1;
+        var a = OpenLayers.Util.extend({
+            displayInLayerSwitcher: !1,
+            calculateInRange: OpenLayers.Function.True,
+            wrapDateLine: this.citeCompliant
+        }, this.layerOptions);
+        this.layer = new OpenLayers.Layer.Vector(this.CLASS_NAME, a);
+        this.map.addLayer(this.layer);
+        return !0
+    },
+    createFeature: function(a) {
+        a = this.layer.getLonLatFromViewPortPx(a);
+        a = new OpenLayers.Geometry.Point(a.lon, a.lat);
+        this.point = new OpenLayers.Feature.Vector(a);
+        this.callback("create", [this.point.geometry, this.point]);
+        this.point.geometry.clearBounds();
+        this.layer.addFeatures([this.point], {
+            silent: !0
+        })
+    },
+    deactivate: function() {
+        if (!OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) return !1;
+        this.cancel();
+        null != this.layer.map && (this.destroyFeature(!0), this.layer.destroy(!1));
+        this.layer = null;
+        this.touch = !1;
+        return !0
+    },
+    destroyFeature: function(a) {
+        this.layer && (a || !this.persist) && this.layer.destroyFeatures();
+        this.point = null
+    },
+    destroyPersistedFeature: function() {
+        var a = this.layer;
+        a && 1 < a.features.length && this.layer.features[0].destroy()
+    },
+    finalize: function(a) {
+        this.mouseDown = !1;
+        this.lastTouchPx = this.lastUp = this.lastDown = null;
+        this.callback(a ? "cancel" : "done", [this.geometryClone()]);
+        this.destroyFeature(a)
+    },
+    cancel: function() {
+        this.finalize(!0)
+    },
+    click: function(a) {
+        OpenLayers.Event.stop(a);
+        return !1
+    },
+    dblclick: function(a) {
+        OpenLayers.Event.stop(a);
+        return !1
+    },
+    modifyFeature: function(a) {
+        this.point || this.createFeature(a);
+        a = this.layer.getLonLatFromViewPortPx(a);
+        this.point.geometry.x = a.lon;
+        this.point.geometry.y = a.lat;
+        this.callback("modify", [this.point.geometry, this.point, !1]);
+        this.point.geometry.clearBounds();
+        this.drawFeature()
+    },
+    drawFeature: function() {
+        this.layer.drawFeature(this.point, this.style)
+    },
+    getGeometry: function() {
+        var a = this.point && this.point.geometry;
+        a && this.multi && (a = new OpenLayers.Geometry.MultiPoint([a]));
+        return a
+    },
+    geometryClone: function() {
+        var a = this.getGeometry();
+        return a && a.clone()
+    },
+    mousedown: function(a) {
+        return this.down(a)
+    },
+    touchstart: function(a) {
+        this.touch || (this.touch = !0, this.map.events.un({
+            mousedown: this.mousedown,
+            mouseup: this.mouseup,
+            mousemove: this.mousemove,
+            click: this.click,
+            dblclick: this.dblclick,
+            scope: this
+        }));
+        this.lastTouchPx = a.xy;
+        return this.down(a)
+    },
+    mousemove: function(a) {
+        return this.move(a)
+    },
+    touchmove: function(a) {
+        this.lastTouchPx = a.xy;
+        return this.move(a)
+    },
+    mouseup: function(a) {
+        return this.up(a)
+    },
+    touchend: function(a) {
+        a.xy = this.lastTouchPx;
+        return this.up(a)
+    },
+    down: function(a) {
+        this.mouseDown = !0;
+        this.lastDown = a.xy;
+        this.touch || this.modifyFeature(a.xy);
+        this.stoppedDown = this.stopDown;
+        return !this.stopDown
+    },
+    move: function(a) {
+        !this.touch && (!this.mouseDown || this.stoppedDown) && this.modifyFeature(a.xy);
+        return !0
+    },
+    up: function(a) {
+        this.mouseDown = !1;
+        this.stoppedDown = this.stopDown;
+        return this.checkModifiers(a) && (!this.lastUp || !this.lastUp.equals(a.xy)) && this.lastDown && this.passesTolerance(this.lastDown, a.xy, this.pixelTolerance) ? (this.touch && this.modifyFeature(a.xy), this.persist && this.destroyPersistedFeature(), this.lastUp = a.xy, this.finalize(), !this.stopUp) : !0
+    },
+    mouseout: function(a) {
+        OpenLayers.Util.mouseLeft(a, this.map.viewPortDiv) && (this.stoppedDown = this.stopDown, this.mouseDown = !1)
+    },
+    passesTolerance: function(a,
+        b, c) {
+        var d = !0;
+        null != c && a && b && a.distanceTo(b) > c && (d = !1);
+        return d
+    },
+    CLASS_NAME: "OpenLayers.Handler.Point"
+});
+OpenLayers.Handler.Path = OpenLayers.Class(OpenLayers.Handler.Point, {
+    line: null,
+    maxVertices: null,
+    doubleTouchTolerance: 20,
+    freehand: !1,
+    freehandToggle: "shiftKey",
+    timerId: null,
+    redoStack: null,
+    createFeature: function(a) {
+        a = this.layer.getLonLatFromViewPortPx(a);
+        a = new OpenLayers.Geometry.Point(a.lon, a.lat);
+        this.point = new OpenLayers.Feature.Vector(a);
+        this.line = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString([this.point.geometry]));
+        this.callback("create", [this.point.geometry, this.getSketch()]);
+        this.point.geometry.clearBounds();
+        this.layer.addFeatures([this.line, this.point], {
+            silent: !0
+        })
+    },
+    destroyFeature: function(a) {
+        OpenLayers.Handler.Point.prototype.destroyFeature.call(this, a);
+        this.line = null
+    },
+    destroyPersistedFeature: function() {
+        var a = this.layer;
+        a && 2 < a.features.length && this.layer.features[0].destroy()
+    },
+    removePoint: function() {
+        this.point && this.layer.removeFeatures([this.point])
+    },
+    addPoint: function(a) {
+        this.layer.removeFeatures([this.point]);
+        a = this.layer.getLonLatFromViewPortPx(a);
+        this.point = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(a.lon,
+            a.lat));
+        this.line.geometry.addComponent(this.point.geometry, this.line.geometry.components.length);
+        this.layer.addFeatures([this.point]);
+        this.callback("point", [this.point.geometry, this.getGeometry()]);
+        this.callback("modify", [this.point.geometry, this.getSketch()]);
+        this.drawFeature();
+        delete this.redoStack
+    },
+    insertXY: function(a, b) {
+        this.line.geometry.addComponent(new OpenLayers.Geometry.Point(a, b), this.getCurrentPointIndex());
+        this.drawFeature();
+        delete this.redoStack
+    },
+    insertDeltaXY: function(a, b) {
+        var c = this.line.geometry.components[this.getCurrentPointIndex() -
+            1];
+        c && (!isNaN(c.x) && !isNaN(c.y)) && this.insertXY(c.x + a, c.y + b)
+    },
+    insertDirectionLength: function(a, b) {
+        var a = a * (Math.PI / 180),
+            c = b * Math.cos(a),
+            d = b * Math.sin(a);
+        this.insertDeltaXY(c, d)
+    },
+    insertDeflectionLength: function(a, b) {
+        var c = this.getCurrentPointIndex() - 1;
+        if (0 < c) {
+            var d = this.line.geometry.components[c],
+                c = this.line.geometry.components[c - 1];
+            this.insertDirectionLength(180 * Math.atan2(d.y - c.y, d.x - c.x) / Math.PI + a, b)
+        }
+    },
+    getCurrentPointIndex: function() {
+        return this.line.geometry.components.length - 1
+    },
+    undo: function() {
+        var a =
+            this.line.geometry,
+            b = a.components,
+            c = this.getCurrentPointIndex() - 1,
+            b = b[c];
+        if (a = a.removeComponent(b)) this.redoStack || (this.redoStack = []), this.redoStack.push(b), this.drawFeature();
+        return a
+    },
+    redo: function() {
+        var a = this.redoStack && this.redoStack.pop();
+        a && (this.line.geometry.addComponent(a, this.getCurrentPointIndex()), this.drawFeature());
+        return !!a
+    },
+    freehandMode: function(a) {
+        return this.freehandToggle && a[this.freehandToggle] ? !this.freehand : this.freehand
+    },
+    modifyFeature: function(a, b) {
+        this.line || this.createFeature(a);
+        var c = this.layer.getLonLatFromViewPortPx(a);
+        this.point.geometry.x = c.lon;
+        this.point.geometry.y = c.lat;
+        this.callback("modify", [this.point.geometry, this.getSketch(), b]);
+        this.point.geometry.clearBounds();
+        this.drawFeature()
+    },
+    drawFeature: function() {
+        this.layer.drawFeature(this.line, this.style);
+        this.layer.drawFeature(this.point, this.style)
+    },
+    getSketch: function() {
+        return this.line
+    },
+    getGeometry: function() {
+        var a = this.line && this.line.geometry;
+        a && this.multi && (a = new OpenLayers.Geometry.MultiLineString([a]));
+        return a
+    },
+    touchstart: function(a) {
+        if (this.timerId && this.passesTolerance(this.lastTouchPx, a.xy, this.doubleTouchTolerance)) return this.finishGeometry(), window.clearTimeout(this.timerId), this.timerId = null, !1;
+        this.timerId && (window.clearTimeout(this.timerId), this.timerId = null);
+        this.timerId = window.setTimeout(OpenLayers.Function.bind(function() {
+            this.timerId = null
+        }, this), 300);
+        return OpenLayers.Handler.Point.prototype.touchstart.call(this, a)
+    },
+    down: function(a) {
+        var b = this.stopDown;
+        this.freehandMode(a) && (b = !0, this.touch &&
+            (this.modifyFeature(a.xy, !!this.lastUp), OpenLayers.Event.stop(a)));
+        !this.touch && (!this.lastDown || !this.passesTolerance(this.lastDown, a.xy, this.pixelTolerance)) && this.modifyFeature(a.xy, !!this.lastUp);
+        this.mouseDown = !0;
+        this.lastDown = a.xy;
+        this.stoppedDown = b;
+        return !b
+    },
+    move: function(a) {
+        if (this.stoppedDown && this.freehandMode(a)) return this.persist && this.destroyPersistedFeature(), this.maxVertices && this.line && this.line.geometry.components.length === this.maxVertices ? (this.removePoint(), this.finalize()) : this.addPoint(a.xy), !1;
+        !this.touch && (!this.mouseDown || this.stoppedDown) && this.modifyFeature(a.xy, !!this.lastUp);
+        return !0
+    },
+    up: function(a) {
+        if (this.mouseDown && (!this.lastUp || !this.lastUp.equals(a.xy))) this.stoppedDown && this.freehandMode(a) ? (this.persist && this.destroyPersistedFeature(), this.removePoint(), this.finalize()) : this.passesTolerance(this.lastDown, a.xy, this.pixelTolerance) && (this.touch && this.modifyFeature(a.xy), null == this.lastUp && this.persist && this.destroyPersistedFeature(), this.addPoint(a.xy), this.lastUp = a.xy, this.line.geometry.components.length ===
+            this.maxVertices + 1 && this.finishGeometry());
+        this.stoppedDown = this.stopDown;
+        this.mouseDown = !1;
+        return !this.stopUp
+    },
+    finishGeometry: function() {
+        this.line.geometry.removeComponent(this.line.geometry.components[this.line.geometry.components.length - 1]);
+        this.removePoint();
+        this.finalize()
+    },
+    dblclick: function(a) {
+        this.freehandMode(a) || this.finishGeometry();
+        return !1
+    },
+    CLASS_NAME: "OpenLayers.Handler.Path"
+});
+OpenLayers.Spherical = OpenLayers.Spherical || {};
+OpenLayers.Spherical.DEFAULT_RADIUS = 6378137;
+OpenLayers.Spherical.computeDistanceBetween = function(a, b, c) {
+    var c = c || OpenLayers.Spherical.DEFAULT_RADIUS,
+        d = Math.sin(Math.PI * (b.lon - a.lon) / 360),
+        e = Math.sin(Math.PI * (b.lat - a.lat) / 360),
+        a = e * e + d * d * Math.cos(Math.PI * a.lat / 180) * Math.cos(Math.PI * b.lat / 180);
+    return 2 * c * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
+};
+OpenLayers.Spherical.computeHeading = function(a, b) {
+    var c = Math.sin(Math.PI * (a.lon - b.lon) / 180) * Math.cos(Math.PI * b.lat / 180),
+        d = Math.cos(Math.PI * a.lat / 180) * Math.sin(Math.PI * b.lat / 180) - Math.sin(Math.PI * a.lat / 180) * Math.cos(Math.PI * b.lat / 180) * Math.cos(Math.PI * (a.lon - b.lon) / 180);
+    return 180 * Math.atan2(c, d) / Math.PI
+};
+OpenLayers.Control.CacheWrite = OpenLayers.Class(OpenLayers.Control, {
+    layers: null,
+    imageFormat: "image/png",
+    quotaRegEx: /quota/i,
+    setMap: function(a) {
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+        var b, c = this.layers || a.layers;
+        for (b = c.length - 1; 0 <= b; --b) this.addLayer({
+            layer: c[b]
+        });
+        if (!this.layers) a.events.on({
+            addlayer: this.addLayer,
+            removeLayer: this.removeLayer,
+            scope: this
+        })
+    },
+    addLayer: function(a) {
+        a.layer.events.on({
+            tileloadstart: this.makeSameOrigin,
+            tileloaded: this.cache,
+            scope: this
+        })
+    },
+    removeLayer: function(a) {
+        a.layer.events.un({
+            tileloadstart: this.makeSameOrigin,
+            tileloaded: this.cache,
+            scope: this
+        })
+    },
+    makeSameOrigin: function(a) {
+        if (this.active && (a = a.tile, a instanceof OpenLayers.Tile.Image && !a.crossOriginKeyword && "data:" !== a.url.substr(0, 5))) {
+            var b = OpenLayers.Request.makeSameOrigin(a.url, OpenLayers.ProxyHost);
+            OpenLayers.Control.CacheWrite.urlMap[b] = a.url;
+            a.url = b
+        }
+    },
+    cache: function(a) {
+        if (this.active && window.localStorage && (a = a.tile, a instanceof OpenLayers.Tile.Image && "data:" !== a.url.substr(0, 5))) try {
+            var b = a.getCanvasContext();
+            if (b) {
+                var c = OpenLayers.Control.CacheWrite.urlMap;
+                window.localStorage.setItem("olCache_" + (c[a.url] || a.url), b.canvas.toDataURL(this.imageFormat));
+                delete c[a.url]
+            }
+        } catch (d) {
+            (b = d.name || d.message) && this.quotaRegEx.test(b) ? this.events.triggerEvent("cachefull", {
+                tile: a
+            }) : OpenLayers.Console.error(d.toString())
+        }
+    },
+    destroy: function() {
+        if (this.layers || this.map) {
+            var a, b = this.layers || this.map.layers;
+            for (a = b.length - 1; 0 <= a; --a) this.removeLayer({
+                layer: b[a]
+            })
+        }
+        this.map && this.map.events.un({
+            addlayer: this.addLayer,
+            removeLayer: this.removeLayer,
+            scope: this
+        });
+        OpenLayers.Control.prototype.destroy.apply(this,
+            arguments)
+    },
+    CLASS_NAME: "OpenLayers.Control.CacheWrite"
+});
+OpenLayers.Control.CacheWrite.clearCache = function() {
+    if (window.localStorage) {
+        var a, b;
+        for (a = window.localStorage.length - 1; 0 <= a; --a) b = window.localStorage.key(a), "olCache_" === b.substr(0, 8) && window.localStorage.removeItem(b)
+    }
+};
+OpenLayers.Control.CacheWrite.urlMap = {};
+OpenLayers.Format.Context = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+    layerOptions: null,
+    layerParams: null,
+    read: function(a, b) {
+        var c = OpenLayers.Format.XML.VersionedOGC.prototype.read.apply(this, arguments);
+        if (b && b.map)
+            if (this.context = c, b.map instanceof OpenLayers.Map) c = this.mergeContextToMap(c, b.map);
+            else {
+                var d = b.map;
+                if (OpenLayers.Util.isElement(d) || "string" == typeof d) d = {
+                    div: d
+                };
+                c = this.contextToMap(c, d)
+            }
+        return c
+    },
+    getLayerFromContext: function(a) {
+        var b, c, d = {
+            queryable: a.queryable,
+            visibility: a.visibility,
+            maxExtent: a.maxExtent,
+            metadata: OpenLayers.Util.applyDefaults(a.metadata, {
+                styles: a.styles,
+                formats: a.formats,
+                "abstract": a["abstract"],
+                dataURL: a.dataURL
+            }),
+            numZoomLevels: a.numZoomLevels,
+            units: a.units,
+            isBaseLayer: a.isBaseLayer,
+            opacity: a.opacity,
+            displayInLayerSwitcher: a.displayInLayerSwitcher,
+            singleTile: a.singleTile,
+            tileSize: a.tileSize ? new OpenLayers.Size(a.tileSize.width, a.tileSize.height) : void 0,
+            minScale: a.minScale || a.maxScaleDenominator,
+            maxScale: a.maxScale || a.minScaleDenominator,
+            srs: a.srs,
+            dimensions: a.dimensions,
+            metadataURL: a.metadataURL
+        };
+        this.layerOptions && OpenLayers.Util.applyDefaults(d, this.layerOptions);
+        var e = {
+            layers: a.name,
+            transparent: a.transparent,
+            version: a.version
+        };
+        if (a.formats && 0 < a.formats.length) {
+            e.format = a.formats[0].value;
+            b = 0;
+            for (c = a.formats.length; b < c; b++) {
+                var f = a.formats[b];
+                if (!0 == f.current) {
+                    e.format = f.value;
+                    break
+                }
+            }
+        }
+        if (a.styles && 0 < a.styles.length) {
+            b = 0;
+            for (c = a.styles.length; b < c; b++)
+                if (f = a.styles[b], !0 == f.current) {
+                    f.href ? e.sld = f.href : f.body ? e.sld_body = f.body : e.styles = f.name;
+                    break
+                }
+        }
+        this.layerParams &&
+            OpenLayers.Util.applyDefaults(e, this.layerParams);
+        b = null;
+        c = a.service;
+        c == OpenLayers.Format.Context.serviceTypes.WFS ? (d.strategies = [new OpenLayers.Strategy.BBOX], d.protocol = new OpenLayers.Protocol.WFS({
+            url: a.url,
+            featurePrefix: a.name.split(":")[0],
+            featureType: a.name.split(":").pop()
+        }), b = new OpenLayers.Layer.Vector(a.title || a.name, d)) : c == OpenLayers.Format.Context.serviceTypes.KML ? (d.strategies = [new OpenLayers.Strategy.Fixed], d.protocol = new OpenLayers.Protocol.HTTP({
+                url: a.url,
+                format: new OpenLayers.Format.KML
+            }),
+            b = new OpenLayers.Layer.Vector(a.title || a.name, d)) : c == OpenLayers.Format.Context.serviceTypes.GML ? (d.strategies = [new OpenLayers.Strategy.Fixed], d.protocol = new OpenLayers.Protocol.HTTP({
+            url: a.url,
+            format: new OpenLayers.Format.GML
+        }), b = new OpenLayers.Layer.Vector(a.title || a.name, d)) : a.features ? (b = new OpenLayers.Layer.Vector(a.title || a.name, d), b.addFeatures(a.features)) : !0 !== a.categoryLayer && (b = new OpenLayers.Layer.WMS(a.title || a.name, a.url, e, d));
+        return b
+    },
+    getLayersFromContext: function(a) {
+        for (var b = [], c =
+                0, d = a.length; c < d; c++) {
+            var e = this.getLayerFromContext(a[c]);
+            null !== e && b.push(e)
+        }
+        return b
+    },
+    contextToMap: function(a, b) {
+        b = OpenLayers.Util.applyDefaults({
+            maxExtent: a.maxExtent,
+            projection: a.projection,
+            units: a.units
+        }, b);
+        b.maxExtent && (b.maxResolution = b.maxExtent.getWidth() / OpenLayers.Map.TILE_WIDTH);
+        b.metadata = {
+            contactInformation: a.contactInformation,
+            "abstract": a["abstract"],
+            keywords: a.keywords,
+            logo: a.logo,
+            descriptionURL: a.descriptionURL
+        };
+        var c = new OpenLayers.Map(b);
+        c.addLayers(this.getLayersFromContext(a.layersContext));
+        c.setCenter(a.bounds.getCenterLonLat(), c.getZoomForExtent(a.bounds, !0));
+        return c
+    },
+    mergeContextToMap: function(a, b) {
+        b.addLayers(this.getLayersFromContext(a.layersContext));
+        return b
+    },
+    write: function(a, b) {
+        a = this.toContext(a);
+        return OpenLayers.Format.XML.VersionedOGC.prototype.write.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Format.Context"
+});
+OpenLayers.Format.Context.serviceTypes = {
+    WMS: "urn:ogc:serviceType:WMS",
+    WFS: "urn:ogc:serviceType:WFS",
+    WCS: "urn:ogc:serviceType:WCS",
+    GML: "urn:ogc:serviceType:GML",
+    SLD: "urn:ogc:serviceType:SLD",
+    FES: "urn:ogc:serviceType:FES",
+    KML: "urn:ogc:serviceType:KML"
+};
+OpenLayers.Format.WMC = OpenLayers.Class(OpenLayers.Format.Context, {
+    defaultVersion: "1.1.0",
+    layerToContext: function(a) {
+        var b = this.getParser(),
+            c = {
+                queryable: a.queryable,
+                visibility: a.visibility,
+                name: a.params.LAYERS,
+                title: a.name,
+                "abstract": a.metadata["abstract"],
+                dataURL: a.metadata.dataURL,
+                metadataURL: a.metadataURL,
+                server: {
+                    version: a.params.VERSION,
+                    url: a.url
+                },
+                maxExtent: a.maxExtent,
+                transparent: a.params.TRANSPARENT,
+                numZoomLevels: a.numZoomLevels,
+                units: a.units,
+                isBaseLayer: a.isBaseLayer,
+                opacity: 1 == a.opacity ? void 0 : a.opacity,
+                displayInLayerSwitcher: a.displayInLayerSwitcher,
+                singleTile: a.singleTile,
+                tileSize: a.singleTile || !a.tileSize ? void 0 : {
+                    width: a.tileSize.w,
+                    height: a.tileSize.h
+                },
+                minScale: a.options.resolutions || a.options.scales || a.options.maxResolution || a.options.minScale ? a.minScale : void 0,
+                maxScale: a.options.resolutions || a.options.scales || a.options.minResolution || a.options.maxScale ? a.maxScale : void 0,
+                formats: [],
+                styles: [],
+                srs: a.srs,
+                dimensions: a.dimensions
+            };
+        a.metadata.servertitle && (c.server.title = a.metadata.servertitle);
+        if (a.metadata.formats && 0 < a.metadata.formats.length)
+            for (var d = 0, e = a.metadata.formats.length; d < e; d++) {
+                var f = a.metadata.formats[d];
+                c.formats.push({
+                    value: f.value,
+                    current: f.value == a.params.FORMAT
+                })
+            } else c.formats.push({
+                value: a.params.FORMAT,
+                current: !0
+            });
+        if (a.metadata.styles && 0 < a.metadata.styles.length) {
+            d = 0;
+            for (e = a.metadata.styles.length; d < e; d++) b = a.metadata.styles[d], b.current = b.href == a.params.SLD || b.body == a.params.SLD_BODY || b.name == a.params.STYLES ? !0 : !1, c.styles.push(b)
+        } else c.styles.push({
+            href: a.params.SLD,
+            body: a.params.SLD_BODY,
+            name: a.params.STYLES || b.defaultStyleName,
+            title: b.defaultStyleTitle,
+            current: !0
+        });
+        return c
+    },
+    toContext: function(a) {
+        var b = {},
+            c = a.layers;
+        if ("OpenLayers.Map" == a.CLASS_NAME) {
+            var d = a.metadata || {};
+            b.size = a.getSize();
+            b.bounds = a.getExtent();
+            b.projection = a.projection;
+            b.title = a.title;
+            b.keywords = d.keywords;
+            b["abstract"] = d["abstract"];
+            b.logo = d.logo;
+            b.descriptionURL = d.descriptionURL;
+            b.contactInformation = d.contactInformation;
+            b.maxExtent = a.maxExtent
+        } else OpenLayers.Util.applyDefaults(b, a), void 0 !=
+            b.layers && delete b.layers;
+        void 0 == b.layersContext && (b.layersContext = []);
+        if (void 0 != c && OpenLayers.Util.isArray(c)) {
+            a = 0;
+            for (d = c.length; a < d; a++) {
+                var e = c[a];
+                e instanceof OpenLayers.Layer.WMS && b.layersContext.push(this.layerToContext(e))
+            }
+        }
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Format.WMC"
+});
+OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        ol: "http://openlayers.org/context",
+        wmc: "http://www.opengis.net/context",
+        sld: "http://www.opengis.net/sld",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    schemaLocation: "",
+    getNamespacePrefix: function(a) {
+        var b = null;
+        if (null == a) b = this.namespaces[this.defaultPrefix];
+        else
+            for (b in this.namespaces)
+                if (this.namespaces[b] == a) break; return b
+    },
+    defaultPrefix: "wmc",
+    rootPrefix: null,
+    defaultStyleName: "",
+    defaultStyleTitle: "Default",
+    initialize: function(a) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a = a.documentElement;
+        this.rootPrefix = a.prefix;
+        var b = {
+            version: a.getAttribute("version")
+        };
+        this.runChildNodes(b, a);
+        return b
+    },
+    runChildNodes: function(a, b) {
+        for (var c = b.childNodes, d, e, f, g = 0, h = c.length; g < h; ++g) d = c[g], 1 == d.nodeType && (e = this.getNamespacePrefix(d.namespaceURI), f = d.nodeName.split(":").pop(), (e = this["read_" + e + "_" + f]) && e.apply(this, [a, d]))
+    },
+    read_wmc_General: function(a, b) {
+        this.runChildNodes(a, b)
+    },
+    read_wmc_BoundingBox: function(a, b) {
+        a.projection = b.getAttribute("SRS");
+        a.bounds = new OpenLayers.Bounds(b.getAttribute("minx"), b.getAttribute("miny"), b.getAttribute("maxx"), b.getAttribute("maxy"))
+    },
+    read_wmc_LayerList: function(a, b) {
+        a.layersContext = [];
+        this.runChildNodes(a, b)
+    },
+    read_wmc_Layer: function(a, b) {
+        var c = {
+            visibility: "1" != b.getAttribute("hidden"),
+            queryable: "1" == b.getAttribute("queryable"),
+            formats: [],
+            styles: [],
+            metadata: {}
+        };
+        this.runChildNodes(c, b);
+        a.layersContext.push(c)
+    },
+    read_wmc_Extension: function(a, b) {
+        this.runChildNodes(a, b)
+    },
+    read_ol_units: function(a, b) {
+        a.units = this.getChildValue(b)
+    },
+    read_ol_maxExtent: function(a, b) {
+        var c = new OpenLayers.Bounds(b.getAttribute("minx"), b.getAttribute("miny"), b.getAttribute("maxx"), b.getAttribute("maxy"));
+        a.maxExtent = c
+    },
+    read_ol_transparent: function(a, b) {
+        a.transparent = this.getChildValue(b)
+    },
+    read_ol_numZoomLevels: function(a, b) {
+        a.numZoomLevels = parseInt(this.getChildValue(b))
+    },
+    read_ol_opacity: function(a, b) {
+        a.opacity = parseFloat(this.getChildValue(b))
+    },
+    read_ol_singleTile: function(a, b) {
+        a.singleTile = "true" == this.getChildValue(b)
+    },
+    read_ol_tileSize: function(a, b) {
+        var c = {
+            width: b.getAttribute("width"),
+            height: b.getAttribute("height")
+        };
+        a.tileSize = c
+    },
+    read_ol_isBaseLayer: function(a, b) {
+        a.isBaseLayer = "true" == this.getChildValue(b)
+    },
+    read_ol_displayInLayerSwitcher: function(a, b) {
+        a.displayInLayerSwitcher = "true" == this.getChildValue(b)
+    },
+    read_wmc_Server: function(a, b) {
+        a.version = b.getAttribute("version");
+        a.url = this.getOnlineResource_href(b);
+        a.metadata.servertitle = b.getAttribute("title")
+    },
+    read_wmc_FormatList: function(a, b) {
+        this.runChildNodes(a, b)
+    },
+    read_wmc_Format: function(a, b) {
+        var c = {
+            value: this.getChildValue(b)
+        };
+        "1" == b.getAttribute("current") && (c.current = !0);
+        a.formats.push(c)
+    },
+    read_wmc_StyleList: function(a, b) {
+        this.runChildNodes(a, b)
+    },
+    read_wmc_Style: function(a, b) {
+        var c = {};
+        this.runChildNodes(c, b);
+        "1" == b.getAttribute("current") && (c.current = !0);
+        a.styles.push(c)
+    },
+    read_wmc_SLD: function(a, b) {
+        this.runChildNodes(a,
+            b)
+    },
+    read_sld_StyledLayerDescriptor: function(a, b) {
+        var c = OpenLayers.Format.XML.prototype.write.apply(this, [b]);
+        a.body = c
+    },
+    read_sld_FeatureTypeStyle: function(a, b) {
+        var c = OpenLayers.Format.XML.prototype.write.apply(this, [b]);
+        a.body = c
+    },
+    read_wmc_OnlineResource: function(a, b) {
+        a.href = this.getAttributeNS(b, this.namespaces.xlink, "href")
+    },
+    read_wmc_Name: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.name = c)
+    },
+    read_wmc_Title: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.title = c)
+    },
+    read_wmc_MetadataURL: function(a,
+        b) {
+        a.metadataURL = this.getOnlineResource_href(b)
+    },
+    read_wmc_KeywordList: function(a, b) {
+        a.keywords = [];
+        this.runChildNodes(a.keywords, b)
+    },
+    read_wmc_Keyword: function(a, b) {
+        a.push(this.getChildValue(b))
+    },
+    read_wmc_Abstract: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a["abstract"] = c)
+    },
+    read_wmc_LogoURL: function(a, b) {
+        a.logo = {
+            width: b.getAttribute("width"),
+            height: b.getAttribute("height"),
+            format: b.getAttribute("format"),
+            href: this.getOnlineResource_href(b)
+        }
+    },
+    read_wmc_DescriptionURL: function(a, b) {
+        a.descriptionURL =
+            this.getOnlineResource_href(b)
+    },
+    read_wmc_ContactInformation: function(a, b) {
+        var c = {};
+        this.runChildNodes(c, b);
+        a.contactInformation = c
+    },
+    read_wmc_ContactPersonPrimary: function(a, b) {
+        var c = {};
+        this.runChildNodes(c, b);
+        a.personPrimary = c
+    },
+    read_wmc_ContactPerson: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.person = c)
+    },
+    read_wmc_ContactOrganization: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.organization = c)
+    },
+    read_wmc_ContactPosition: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.position = c)
+    },
+    read_wmc_ContactAddress: function(a,
+        b) {
+        var c = {};
+        this.runChildNodes(c, b);
+        a.contactAddress = c
+    },
+    read_wmc_AddressType: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.type = c)
+    },
+    read_wmc_Address: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.address = c)
+    },
+    read_wmc_City: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.city = c)
+    },
+    read_wmc_StateOrProvince: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.stateOrProvince = c)
+    },
+    read_wmc_PostCode: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.postcode = c)
+    },
+    read_wmc_Country: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.country = c)
+    },
+    read_wmc_ContactVoiceTelephone: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.phone = c)
+    },
+    read_wmc_ContactFacsimileTelephone: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.fax = c)
+    },
+    read_wmc_ContactElectronicMailAddress: function(a, b) {
+        var c = this.getChildValue(b);
+        c && (a.email = c)
+    },
+    read_wmc_DataURL: function(a, b) {
+        a.dataURL = this.getOnlineResource_href(b)
+    },
+    read_wmc_LegendURL: function(a, b) {
+        var c = {
+            width: b.getAttribute("width"),
+            height: b.getAttribute("height"),
+            format: b.getAttribute("format"),
+            href: this.getOnlineResource_href(b)
+        };
+        a.legend = c
+    },
+    read_wmc_DimensionList: function(a, b) {
+        a.dimensions = {};
+        this.runChildNodes(a.dimensions, b)
+    },
+    read_wmc_Dimension: function(a, b) {
+        var c = {
+                name: b.getAttribute("name").toLowerCase(),
+                units: b.getAttribute("units") || "",
+                unitSymbol: b.getAttribute("unitSymbol") || "",
+                userValue: b.getAttribute("userValue") || "",
+                nearestValue: "1" === b.getAttribute("nearestValue"),
+                multipleValues: "1" === b.getAttribute("multipleValues"),
+                current: "1" === b.getAttribute("current"),
+                "default": b.getAttribute("default") ||
+                    ""
+            },
+            d = this.getChildValue(b);
+        c.values = d.split(",");
+        a[c.name] = c
+    },
+    write: function(a, b) {
+        var c = this.createElementDefaultNS("ViewContext");
+        this.setAttributes(c, {
+            version: this.VERSION,
+            id: b && "string" == typeof b.id ? b.id : OpenLayers.Util.createUniqueID("OpenLayers_Context_")
+        });
+        this.setAttributeNS(c, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation);
+        c.appendChild(this.write_wmc_General(a));
+        c.appendChild(this.write_wmc_LayerList(a));
+        return OpenLayers.Format.XML.prototype.write.apply(this, [c])
+    },
+    createElementDefaultNS: function(a,
+        b, c) {
+        a = this.createElementNS(this.namespaces[this.defaultPrefix], a);
+        b && a.appendChild(this.createTextNode(b));
+        c && this.setAttributes(a, c);
+        return a
+    },
+    setAttributes: function(a, b) {
+        var c, d;
+        for (d in b) c = b[d].toString(), c.match(/[A-Z]/) ? this.setAttributeNS(a, null, d, c) : a.setAttribute(d, c)
+    },
+    write_wmc_General: function(a) {
+        var b = this.createElementDefaultNS("General");
+        a.size && b.appendChild(this.createElementDefaultNS("Window", null, {
+            width: a.size.w,
+            height: a.size.h
+        }));
+        var c = a.bounds;
+        b.appendChild(this.createElementDefaultNS("BoundingBox",
+            null, {
+                minx: c.left.toPrecision(18),
+                miny: c.bottom.toPrecision(18),
+                maxx: c.right.toPrecision(18),
+                maxy: c.top.toPrecision(18),
+                SRS: a.projection
+            }));
+        b.appendChild(this.createElementDefaultNS("Title", a.title));
+        a.keywords && b.appendChild(this.write_wmc_KeywordList(a.keywords));
+        a["abstract"] && b.appendChild(this.createElementDefaultNS("Abstract", a["abstract"]));
+        a.logo && b.appendChild(this.write_wmc_URLType("LogoURL", a.logo.href, a.logo));
+        a.descriptionURL && b.appendChild(this.write_wmc_URLType("DescriptionURL", a.descriptionURL));
+        a.contactInformation && b.appendChild(this.write_wmc_ContactInformation(a.contactInformation));
+        b.appendChild(this.write_ol_MapExtension(a));
+        return b
+    },
+    write_wmc_KeywordList: function(a) {
+        for (var b = this.createElementDefaultNS("KeywordList"), c = 0, d = a.length; c < d; c++) b.appendChild(this.createElementDefaultNS("Keyword", a[c]));
+        return b
+    },
+    write_wmc_ContactInformation: function(a) {
+        var b = this.createElementDefaultNS("ContactInformation");
+        a.personPrimary && b.appendChild(this.write_wmc_ContactPersonPrimary(a.personPrimary));
+        a.position && b.appendChild(this.createElementDefaultNS("ContactPosition", a.position));
+        a.contactAddress && b.appendChild(this.write_wmc_ContactAddress(a.contactAddress));
+        a.phone && b.appendChild(this.createElementDefaultNS("ContactVoiceTelephone", a.phone));
+        a.fax && b.appendChild(this.createElementDefaultNS("ContactFacsimileTelephone", a.fax));
+        a.email && b.appendChild(this.createElementDefaultNS("ContactElectronicMailAddress", a.email));
+        return b
+    },
+    write_wmc_ContactPersonPrimary: function(a) {
+        var b = this.createElementDefaultNS("ContactPersonPrimary");
+        a.person && b.appendChild(this.createElementDefaultNS("ContactPerson", a.person));
+        a.organization && b.appendChild(this.createElementDefaultNS("ContactOrganization", a.organization));
+        return b
+    },
+    write_wmc_ContactAddress: function(a) {
+        var b = this.createElementDefaultNS("ContactAddress");
+        a.type && b.appendChild(this.createElementDefaultNS("AddressType", a.type));
+        a.address && b.appendChild(this.createElementDefaultNS("Address", a.address));
+        a.city && b.appendChild(this.createElementDefaultNS("City", a.city));
+        a.stateOrProvince &&
+            b.appendChild(this.createElementDefaultNS("StateOrProvince", a.stateOrProvince));
+        a.postcode && b.appendChild(this.createElementDefaultNS("PostCode", a.postcode));
+        a.country && b.appendChild(this.createElementDefaultNS("Country", a.country));
+        return b
+    },
+    write_ol_MapExtension: function(a) {
+        var b = this.createElementDefaultNS("Extension");
+        if (a = a.maxExtent) {
+            var c = this.createElementNS(this.namespaces.ol, "ol:maxExtent");
+            this.setAttributes(c, {
+                minx: a.left.toPrecision(18),
+                miny: a.bottom.toPrecision(18),
+                maxx: a.right.toPrecision(18),
+                maxy: a.top.toPrecision(18)
+            });
+            b.appendChild(c)
+        }
+        return b
+    },
+    write_wmc_LayerList: function(a) {
+        for (var b = this.createElementDefaultNS("LayerList"), c = 0, d = a.layersContext.length; c < d; ++c) b.appendChild(this.write_wmc_Layer(a.layersContext[c]));
+        return b
+    },
+    write_wmc_Layer: function(a) {
+        var b = this.createElementDefaultNS("Layer", null, {
+            queryable: a.queryable ? "1" : "0",
+            hidden: a.visibility ? "0" : "1"
+        });
+        b.appendChild(this.write_wmc_Server(a));
+        b.appendChild(this.createElementDefaultNS("Name", a.name));
+        b.appendChild(this.createElementDefaultNS("Title",
+            a.title));
+        a["abstract"] && b.appendChild(this.createElementDefaultNS("Abstract", a["abstract"]));
+        a.dataURL && b.appendChild(this.write_wmc_URLType("DataURL", a.dataURL));
+        a.metadataURL && b.appendChild(this.write_wmc_URLType("MetadataURL", a.metadataURL));
+        return b
+    },
+    write_wmc_LayerExtension: function(a) {
+        var b = this.createElementDefaultNS("Extension"),
+            c = a.maxExtent,
+            d = this.createElementNS(this.namespaces.ol, "ol:maxExtent");
+        this.setAttributes(d, {
+            minx: c.left.toPrecision(18),
+            miny: c.bottom.toPrecision(18),
+            maxx: c.right.toPrecision(18),
+            maxy: c.top.toPrecision(18)
+        });
+        b.appendChild(d);
+        a.tileSize && !a.singleTile && (c = this.createElementNS(this.namespaces.ol, "ol:tileSize"), this.setAttributes(c, a.tileSize), b.appendChild(c));
+        for (var c = "transparent numZoomLevels units isBaseLayer opacity displayInLayerSwitcher singleTile".split(" "), e = 0, f = c.length; e < f; ++e)(d = this.createOLPropertyNode(a, c[e])) && b.appendChild(d);
+        return b
+    },
+    createOLPropertyNode: function(a, b) {
+        var c = null;
+        null != a[b] && (c = this.createElementNS(this.namespaces.ol, "ol:" + b), c.appendChild(this.createTextNode(a[b].toString())));
+        return c
+    },
+    write_wmc_Server: function(a) {
+        var a = a.server,
+            b = this.createElementDefaultNS("Server"),
+            c = {
+                service: "OGC:WMS",
+                version: a.version
+            };
+        a.title && (c.title = a.title);
+        this.setAttributes(b, c);
+        b.appendChild(this.write_wmc_OnlineResource(a.url));
+        return b
+    },
+    write_wmc_URLType: function(a, b, c) {
+        a = this.createElementDefaultNS(a);
+        a.appendChild(this.write_wmc_OnlineResource(b));
+        if (c)
+            for (var b = ["width", "height", "format"], d = 0; d < b.length; d++) b[d] in c && a.setAttribute(b[d], c[b[d]]);
+        return a
+    },
+    write_wmc_DimensionList: function(a) {
+        var b =
+            this.createElementDefaultNS("DimensionList"),
+            c;
+        for (c in a.dimensions) {
+            var d = {},
+                e = a.dimensions[c],
+                f;
+            for (f in e) d[f] = "boolean" == typeof e[f] ? Number(e[f]) : e[f];
+            e = "";
+            d.values && (e = d.values.join(","), delete d.values);
+            b.appendChild(this.createElementDefaultNS("Dimension", e, d))
+        }
+        return b
+    },
+    write_wmc_FormatList: function(a) {
+        for (var b = this.createElementDefaultNS("FormatList"), c = 0, d = a.formats.length; c < d; c++) {
+            var e = a.formats[c];
+            b.appendChild(this.createElementDefaultNS("Format", e.value, e.current && !0 == e.current ? {
+                    current: "1"
+                } :
+                null))
+        }
+        return b
+    },
+    write_wmc_StyleList: function(a) {
+        var b = this.createElementDefaultNS("StyleList");
+        if ((a = a.styles) && OpenLayers.Util.isArray(a))
+            for (var c, d = 0, e = a.length; d < e; d++) {
+                var f = a[d],
+                    g = this.createElementDefaultNS("Style", null, f.current && !0 == f.current ? {
+                        current: "1"
+                    } : null);
+                f.href ? (c = this.createElementDefaultNS("SLD"), f.name && c.appendChild(this.createElementDefaultNS("Name", f.name)), f.title && c.appendChild(this.createElementDefaultNS("Title", f.title)), f.legend && c.appendChild(this.write_wmc_URLType("LegendURL",
+                    f.legend.href, f.legend)), f = this.write_wmc_OnlineResource(f.href), c.appendChild(f), g.appendChild(c)) : f.body ? (c = this.createElementDefaultNS("SLD"), f.name && c.appendChild(this.createElementDefaultNS("Name", f.name)), f.title && c.appendChild(this.createElementDefaultNS("Title", f.title)), f.legend && c.appendChild(this.write_wmc_URLType("LegendURL", f.legend.href, f.legend)), f = OpenLayers.Format.XML.prototype.read.apply(this, [f.body]).documentElement, c.ownerDocument && c.ownerDocument.importNode && (f = c.ownerDocument.importNode(f, !0)), c.appendChild(f), g.appendChild(c)) : (g.appendChild(this.createElementDefaultNS("Name", f.name)), g.appendChild(this.createElementDefaultNS("Title", f.title)), f["abstract"] && g.appendChild(this.createElementDefaultNS("Abstract", f["abstract"])), f.legend && g.appendChild(this.write_wmc_URLType("LegendURL", f.legend.href, f.legend)));
+                b.appendChild(g)
+            }
+        return b
+    },
+    write_wmc_OnlineResource: function(a) {
+        var b = this.createElementDefaultNS("OnlineResource");
+        this.setAttributeNS(b, this.namespaces.xlink, "xlink:type",
+            "simple");
+        this.setAttributeNS(b, this.namespaces.xlink, "xlink:href", a);
+        return b
+    },
+    getOnlineResource_href: function(a) {
+        var b = {},
+            a = a.getElementsByTagName("OnlineResource");
+        0 < a.length && this.read_wmc_OnlineResource(b, a[0]);
+        return b.href
+    },
+    CLASS_NAME: "OpenLayers.Format.WMC.v1"
+});
+OpenLayers.Control.PanPanel = OpenLayers.Class(OpenLayers.Control.Panel, {
+    slideFactor: 50,
+    slideRatio: null,
+    initialize: function(a) {
+        OpenLayers.Control.Panel.prototype.initialize.apply(this, [a]);
+        a = {
+            slideFactor: this.slideFactor,
+            slideRatio: this.slideRatio
+        };
+        this.addControls([new OpenLayers.Control.Pan(OpenLayers.Control.Pan.NORTH, a), new OpenLayers.Control.Pan(OpenLayers.Control.Pan.SOUTH, a), new OpenLayers.Control.Pan(OpenLayers.Control.Pan.EAST, a), new OpenLayers.Control.Pan(OpenLayers.Control.Pan.WEST, a)])
+    },
+    CLASS_NAME: "OpenLayers.Control.PanPanel"
+});
+OpenLayers.Control.Attribution = OpenLayers.Class(OpenLayers.Control, {
+    separator: ", ",
+    template: "${layers}",
+    destroy: function() {
+        this.map.events.un({
+            removelayer: this.updateAttribution,
+            addlayer: this.updateAttribution,
+            changelayer: this.updateAttribution,
+            changebaselayer: this.updateAttribution,
+            scope: this
+        });
+        OpenLayers.Control.prototype.destroy.apply(this, arguments)
+    },
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        this.map.events.on({
+            changebaselayer: this.updateAttribution,
+            changelayer: this.updateAttribution,
+            addlayer: this.updateAttribution,
+            removelayer: this.updateAttribution,
+            scope: this
+        });
+        this.updateAttribution();
+        return this.div
+    },
+    updateAttribution: function() {
+        var a = [];
+        if (this.map && this.map.layers) {
+            for (var b = 0, c = this.map.layers.length; b < c; b++) {
+                var d = this.map.layers[b];
+                d.attribution && d.getVisibility() && -1 === OpenLayers.Util.indexOf(a, d.attribution) && a.push(d.attribution)
+            }
+            this.div.innerHTML = OpenLayers.String.format(this.template, {
+                layers: a.join(this.separator)
+            })
+        }
+    },
+    CLASS_NAME: "OpenLayers.Control.Attribution"
+});
+OpenLayers.Kinetic = OpenLayers.Class({
+    threshold: 0,
+    deceleration: 0.0035,
+    nbPoints: 100,
+    delay: 200,
+    points: void 0,
+    timerId: void 0,
+    initialize: function(a) {
+        OpenLayers.Util.extend(this, a)
+    },
+    begin: function() {
+        OpenLayers.Animation.stop(this.timerId);
+        this.timerId = void 0;
+        this.points = []
+    },
+    update: function(a) {
+        this.points.unshift({
+            xy: a,
+            tick: (new Date).getTime()
+        });
+        this.points.length > this.nbPoints && this.points.pop()
+    },
+    end: function(a) {
+        for (var b, c = (new Date).getTime(), d = 0, e = this.points.length, f; d < e; d++) {
+            f = this.points[d];
+            if (c -
+                f.tick > this.delay) break;
+            b = f
+        }
+        if (b && (d = (new Date).getTime() - b.tick, c = Math.sqrt(Math.pow(a.x - b.xy.x, 2) + Math.pow(a.y - b.xy.y, 2)), d = c / d, !(0 == d || d < this.threshold))) return c = Math.asin((a.y - b.xy.y) / c), b.xy.x <= a.x && (c = Math.PI - c), {
+            speed: d,
+            theta: c
+        }
+    },
+    move: function(a, b) {
+        var c = a.speed,
+            d = Math.cos(a.theta),
+            e = -Math.sin(a.theta),
+            f = (new Date).getTime(),
+            g = 0,
+            h = 0;
+        this.timerId = OpenLayers.Animation.start(OpenLayers.Function.bind(function() {
+            if (null != this.timerId) {
+                var a = (new Date).getTime() - f,
+                    j = -this.deceleration * Math.pow(a,
+                        2) / 2 + c * a,
+                    k = j * d,
+                    j = j * e,
+                    l, m;
+                l = !1;
+                0 >= -this.deceleration * a + c && (OpenLayers.Animation.stop(this.timerId), this.timerId = null, l = !0);
+                a = k - g;
+                m = j - h;
+                g = k;
+                h = j;
+                b(a, m, l)
+            }
+        }, this))
+    },
+    CLASS_NAME: "OpenLayers.Kinetic"
+});
+OpenLayers.Layer.GeoRSS = OpenLayers.Class(OpenLayers.Layer.Markers, {
+    location: null,
+    features: null,
+    formatOptions: null,
+    selectedFeature: null,
+    icon: null,
+    popupSize: null,
+    useFeedTitle: !0,
+    initialize: function(a, b, c) {
+        OpenLayers.Layer.Markers.prototype.initialize.apply(this, [a, c]);
+        this.location = b;
+        this.features = []
+    },
+    destroy: function() {
+        OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments);
+        this.clearFeatures();
+        this.features = null
+    },
+    loadRSS: function() {
+        this.loaded || (this.events.triggerEvent("loadstart"), OpenLayers.Request.GET({
+            url: this.location,
+            success: this.parseData,
+            scope: this
+        }), this.loaded = !0)
+    },
+    moveTo: function(a, b, c) {
+        OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments);
+        this.visibility && !this.loaded && this.loadRSS()
+    },
+    parseData: function(a) {
+        var b = a.responseXML;
+        if (!b || !b.documentElement) b = OpenLayers.Format.XML.prototype.read(a.responseText);
+        if (this.useFeedTitle) {
+            a = null;
+            try {
+                a = b.getElementsByTagNameNS("*", "title")[0].firstChild.nodeValue
+            } catch (c) {
+                a = b.getElementsByTagName("title")[0].firstChild.nodeValue
+            }
+            a && this.setName(a)
+        }
+        a = {};
+        OpenLayers.Util.extend(a,
+            this.formatOptions);
+        this.map && !this.projection.equals(this.map.getProjectionObject()) && (a.externalProjection = this.projection, a.internalProjection = this.map.getProjectionObject());
+        for (var b = (new OpenLayers.Format.GeoRSS(a)).read(b), a = 0, d = b.length; a < d; a++) {
+            var e = {},
+                f = b[a];
+            if (f.geometry) {
+                var g = f.attributes.title ? f.attributes.title : "Untitled",
+                    h = f.attributes.description ? f.attributes.description : "No description.",
+                    i = f.attributes.link ? f.attributes.link : "",
+                    f = f.geometry.getBounds().getCenterLonLat();
+                e.icon =
+                    null == this.icon ? OpenLayers.Marker.defaultIcon() : this.icon.clone();
+                e.popupSize = this.popupSize ? this.popupSize.clone() : new OpenLayers.Size(250, 120);
+                if (g || h) {
+                    e.title = g;
+                    e.description = h;
+                    var j = '<div class="olLayerGeoRSSClose">[x]</div>',
+                        j = j + '<div class="olLayerGeoRSSTitle">';
+                    i && (j += '<a class="link" href="' + i + '" target="_blank">');
+                    j += g;
+                    i && (j += "</a>");
+                    j += "</div>";
+                    j += '<div style="" class="olLayerGeoRSSDescription">';
+                    j += h;
+                    j += "</div>";
+                    e.popupContentHTML = j
+                }
+                f = new OpenLayers.Feature(this, f, e);
+                this.features.push(f);
+                e = f.createMarker();
+                e.events.register("click", f, this.markerClick);
+                this.addMarker(e)
+            }
+        }
+        this.events.triggerEvent("loadend")
+    },
+    markerClick: function(a) {
+        var b = this == this.layer.selectedFeature;
+        this.layer.selectedFeature = !b ? this : null;
+        for (var c = 0, d = this.layer.map.popups.length; c < d; c++) this.layer.map.removePopup(this.layer.map.popups[c]);
+        b || (b = this.createPopup(), OpenLayers.Event.observe(b.div, "click", OpenLayers.Function.bind(function() {
+                for (var a = 0, b = this.layer.map.popups.length; a < b; a++) this.layer.map.removePopup(this.layer.map.popups[a])
+            },
+            this)), this.layer.map.addPopup(b));
+        OpenLayers.Event.stop(a)
+    },
+    clearFeatures: function() {
+        if (null != this.features)
+            for (; 0 < this.features.length;) {
+                var a = this.features[0];
+                OpenLayers.Util.removeItem(this.features, a);
+                a.destroy()
+            }
+    },
+    CLASS_NAME: "OpenLayers.Layer.GeoRSS"
+});
+OpenLayers.Symbolizer.Point = OpenLayers.Class(OpenLayers.Symbolizer, {
+    initialize: function(a) {
+        OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Symbolizer.Point"
+});
+OpenLayers.Symbolizer.Line = OpenLayers.Class(OpenLayers.Symbolizer, {
+    initialize: function(a) {
+        OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Symbolizer.Line"
+});
+OpenLayers.Symbolizer.Text = OpenLayers.Class(OpenLayers.Symbolizer, {
+    initialize: function(a) {
+        OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Symbolizer.Text"
+});
+OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
+    namespaces: {
+        sld: "http://www.opengis.net/sld",
+        ogc: "http://www.opengis.net/ogc",
+        gml: "http://www.opengis.net/gml",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    defaultPrefix: "sld",
+    schemaLocation: null,
+    multipleSymbolizers: !1,
+    featureTypeCounter: null,
+    defaultSymbolizer: {
+        fillColor: "#808080",
+        fillOpacity: 1,
+        strokeColor: "#000000",
+        strokeOpacity: 1,
+        strokeWidth: 1,
+        strokeDashstyle: "solid",
+        pointRadius: 3,
+        graphicName: "square"
+    },
+    read: function(a, b) {
+        var b = OpenLayers.Util.applyDefaults(b, this.options),
+            c = {
+                namedLayers: !0 === b.namedLayersAsArray ? [] : {}
+            };
+        this.readChildNodes(a, c);
+        return c
+    },
+    readers: OpenLayers.Util.applyDefaults({
+        sld: {
+            StyledLayerDescriptor: function(a, b) {
+                b.version = a.getAttribute("version");
+                this.readChildNodes(a, b)
+            },
+            Name: function(a, b) {
+                b.name = this.getChildValue(a)
+            },
+            Title: function(a, b) {
+                b.title = this.getChildValue(a)
+            },
+            Abstract: function(a, b) {
+                b.description = this.getChildValue(a)
+            },
+            NamedLayer: function(a, b) {
+                var c = {
+                    userStyles: [],
+                    namedStyles: []
+                };
+                this.readChildNodes(a, c);
+                for (var d = 0, e = c.userStyles.length; d < e; ++d) c.userStyles[d].layerName = c.name;
+                OpenLayers.Util.isArray(b.namedLayers) ? b.namedLayers.push(c) : b.namedLayers[c.name] = c
+            },
+            NamedStyle: function(a, b) {
+                b.namedStyles.push(this.getChildName(a.firstChild))
+            },
+            UserStyle: function(a, b) {
+                var c = {
+                    defaultsPerSymbolizer: !0,
+                    rules: []
+                };
+                this.featureTypeCounter = -1;
+                this.readChildNodes(a, c);
+                this.multipleSymbolizers ? (delete c.defaultsPerSymbolizer, c = new OpenLayers.Style2(c)) : c = new OpenLayers.Style(this.defaultSymbolizer,
+                    c);
+                b.userStyles.push(c)
+            },
+            IsDefault: function(a, b) {
+                "1" == this.getChildValue(a) && (b.isDefault = !0)
+            },
+            FeatureTypeStyle: function(a, b) {
+                ++this.featureTypeCounter;
+                var c = {
+                    rules: this.multipleSymbolizers ? b.rules : []
+                };
+                this.readChildNodes(a, c);
+                this.multipleSymbolizers || (b.rules = c.rules)
+            },
+            Rule: function(a, b) {
+                var c;
+                this.multipleSymbolizers && (c = {
+                    symbolizers: []
+                });
+                c = new OpenLayers.Rule(c);
+                this.readChildNodes(a, c);
+                b.rules.push(c)
+            },
+            ElseFilter: function(a, b) {
+                b.elseFilter = !0
+            },
+            MinScaleDenominator: function(a, b) {
+                b.minScaleDenominator =
+                    parseFloat(this.getChildValue(a))
+            },
+            MaxScaleDenominator: function(a, b) {
+                b.maxScaleDenominator = parseFloat(this.getChildValue(a))
+            },
+            TextSymbolizer: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                this.multipleSymbolizers ? (c.zIndex = this.featureTypeCounter, b.symbolizers.push(new OpenLayers.Symbolizer.Text(c))) : b.symbolizer.Text = OpenLayers.Util.applyDefaults(c, b.symbolizer.Text)
+            },
+            LabelPlacement: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            PointPlacement: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                c.labelRotation =
+                    c.rotation;
+                delete c.rotation;
+                var d, e = b.labelAnchorPointX,
+                    f = b.labelAnchorPointY;
+                e <= 1 / 3 ? d = "l" : e > 1 / 3 && e < 2 / 3 ? d = "c" : e >= 2 / 3 && (d = "r");
+                f <= 1 / 3 ? d += "b" : f > 1 / 3 && f < 2 / 3 ? d += "m" : f >= 2 / 3 && (d += "t");
+                c.labelAlign = d;
+                OpenLayers.Util.applyDefaults(b, c)
+            },
+            AnchorPoint: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            AnchorPointX: function(a, b) {
+                var c = this.readers.ogc._expression.call(this, a);
+                c && (b.labelAnchorPointX = c)
+            },
+            AnchorPointY: function(a, b) {
+                var c = this.readers.ogc._expression.call(this, a);
+                c && (b.labelAnchorPointY = c)
+            },
+            Displacement: function(a,
+                b) {
+                this.readChildNodes(a, b)
+            },
+            DisplacementX: function(a, b) {
+                var c = this.readers.ogc._expression.call(this, a);
+                c && (b.labelXOffset = c)
+            },
+            DisplacementY: function(a, b) {
+                var c = this.readers.ogc._expression.call(this, a);
+                c && (b.labelYOffset = c)
+            },
+            LinePlacement: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            PerpendicularOffset: function(a, b) {
+                var c = this.readers.ogc._expression.call(this, a);
+                c && (b.labelPerpendicularOffset = c)
+            },
+            Label: function(a, b) {
+                var c = this.readers.ogc._expression.call(this, a);
+                c && (b.label = c)
+            },
+            Font: function(a, b) {
+                this.readChildNodes(a,
+                    b)
+            },
+            Halo: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.haloRadius = c.haloRadius;
+                b.haloColor = c.fillColor;
+                b.haloOpacity = c.fillOpacity
+            },
+            Radius: function(a, b) {
+                var c = this.readers.ogc._expression.call(this, a);
+                null != c && (b.haloRadius = c)
+            },
+            RasterSymbolizer: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                this.multipleSymbolizers ? (c.zIndex = this.featureTypeCounter, b.symbolizers.push(new OpenLayers.Symbolizer.Raster(c))) : b.symbolizer.Raster = OpenLayers.Util.applyDefaults(c, b.symbolizer.Raster)
+            },
+            Geometry: function(a,
+                b) {
+                b.geometry = {};
+                this.readChildNodes(a, b.geometry)
+            },
+            ColorMap: function(a, b) {
+                b.colorMap = [];
+                this.readChildNodes(a, b.colorMap)
+            },
+            ColorMapEntry: function(a, b) {
+                var c = a.getAttribute("quantity"),
+                    d = a.getAttribute("opacity");
+                b.push({
+                    color: a.getAttribute("color"),
+                    quantity: null !== c ? parseFloat(c) : void 0,
+                    label: a.getAttribute("label") || void 0,
+                    opacity: null !== d ? parseFloat(d) : void 0
+                })
+            },
+            LineSymbolizer: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                this.multipleSymbolizers ? (c.zIndex = this.featureTypeCounter, b.symbolizers.push(new OpenLayers.Symbolizer.Line(c))) :
+                    b.symbolizer.Line = OpenLayers.Util.applyDefaults(c, b.symbolizer.Line)
+            },
+            PolygonSymbolizer: function(a, b) {
+                var c = {
+                    fill: !1,
+                    stroke: !1
+                };
+                this.multipleSymbolizers || (c = b.symbolizer.Polygon || c);
+                this.readChildNodes(a, c);
+                this.multipleSymbolizers ? (c.zIndex = this.featureTypeCounter, b.symbolizers.push(new OpenLayers.Symbolizer.Polygon(c))) : b.symbolizer.Polygon = c
+            },
+            PointSymbolizer: function(a, b) {
+                var c = {
+                    fill: !1,
+                    stroke: !1,
+                    graphic: !1
+                };
+                this.multipleSymbolizers || (c = b.symbolizer.Point || c);
+                this.readChildNodes(a, c);
+                this.multipleSymbolizers ?
+                    (c.zIndex = this.featureTypeCounter, b.symbolizers.push(new OpenLayers.Symbolizer.Point(c))) : b.symbolizer.Point = c
+            },
+            Stroke: function(a, b) {
+                b.stroke = !0;
+                this.readChildNodes(a, b)
+            },
+            Fill: function(a, b) {
+                b.fill = !0;
+                this.readChildNodes(a, b)
+            },
+            CssParameter: function(a, b) {
+                var c = a.getAttribute("name"),
+                    d = this.cssMap[c];
+                b.label && ("fill" === c ? d = "fontColor" : "fill-opacity" === c && (d = "fontOpacity"));
+                d && (c = this.readers.ogc._expression.call(this, a)) && (b[d] = c)
+            },
+            Graphic: function(a, b) {
+                b.graphic = !0;
+                var c = {};
+                this.readChildNodes(a, c);
+                for (var d = "stroke strokeColor strokeWidth strokeOpacity strokeLinecap fill fillColor fillOpacity graphicName rotation graphicFormat".split(" "), e, f, g = 0, h = d.length; g < h; ++g) e = d[g], f = c[e], void 0 != f && (b[e] = f);
+                void 0 != c.opacity && (b.graphicOpacity = c.opacity);
+                void 0 != c.size && (isNaN(c.size / 2) ? b.graphicWidth = c.size : b.pointRadius = c.size / 2);
+                void 0 != c.href && (b.externalGraphic = c.href);
+                void 0 != c.rotation && (b.rotation = c.rotation)
+            },
+            ExternalGraphic: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Mark: function(a, b) {
+                this.readChildNodes(a,
+                    b)
+            },
+            WellKnownName: function(a, b) {
+                b.graphicName = this.getChildValue(a)
+            },
+            Opacity: function(a, b) {
+                var c = this.readers.ogc._expression.call(this, a);
+                c && (b.opacity = c)
+            },
+            Size: function(a, b) {
+                var c = this.readers.ogc._expression.call(this, a);
+                c && (b.size = c)
+            },
+            Rotation: function(a, b) {
+                var c = this.readers.ogc._expression.call(this, a);
+                c && (b.rotation = c)
+            },
+            OnlineResource: function(a, b) {
+                b.href = this.getAttributeNS(a, this.namespaces.xlink, "href")
+            },
+            Format: function(a, b) {
+                b.graphicFormat = this.getChildValue(a)
+            }
+        }
+    }, OpenLayers.Format.Filter.v1_0_0.prototype.readers),
+    cssMap: {
+        stroke: "strokeColor",
+        "stroke-opacity": "strokeOpacity",
+        "stroke-width": "strokeWidth",
+        "stroke-linecap": "strokeLinecap",
+        "stroke-dasharray": "strokeDashstyle",
+        fill: "fillColor",
+        "fill-opacity": "fillOpacity",
+        "font-family": "fontFamily",
+        "font-size": "fontSize",
+        "font-weight": "fontWeight",
+        "font-style": "fontStyle"
+    },
+    getCssProperty: function(a) {
+        var b = null,
+            c;
+        for (c in this.cssMap)
+            if (this.cssMap[c] == a) {
+                b = c;
+                break
+            }
+        return b
+    },
+    getGraphicFormat: function(a) {
+        var b, c;
+        for (c in this.graphicFormats)
+            if (this.graphicFormats[c].test(a)) {
+                b =
+                    c;
+                break
+            }
+        return b || this.defaultGraphicFormat
+    },
+    defaultGraphicFormat: "image/png",
+    graphicFormats: {
+        "image/jpeg": /\.jpe?g$/i,
+        "image/gif": /\.gif$/i,
+        "image/png": /\.png$/i
+    },
+    write: function(a) {
+        return this.writers.sld.StyledLayerDescriptor.apply(this, [a])
+    },
+    writers: OpenLayers.Util.applyDefaults({
+        sld: {
+            _OGCExpression: function(a, b) {
+                var c = this.createElementNSPlus(a),
+                    d = "string" == typeof b ? b.split("${") : [b];
+                c.appendChild(this.createTextNode(d[0]));
+                for (var e, f, g = 1, h = d.length; g < h; g++) e = d[g], f = e.indexOf("}"), 0 < f ? (this.writeNode("ogc:PropertyName", {
+                    property: e.substring(0, f)
+                }, c), c.appendChild(this.createTextNode(e.substring(++f)))) : c.appendChild(this.createTextNode("${" + e));
+                return c
+            },
+            StyledLayerDescriptor: function(a) {
+                var b = this.createElementNSPlus("sld:StyledLayerDescriptor", {
+                    attributes: {
+                        version: this.VERSION,
+                        "xsi:schemaLocation": this.schemaLocation
+                    }
+                });
+                b.setAttribute("xmlns:ogc", this.namespaces.ogc);
+                b.setAttribute("xmlns:gml", this.namespaces.gml);
+                a.name && this.writeNode("Name", a.name, b);
+                a.title && this.writeNode("Title", a.title, b);
+                a.description &&
+                    this.writeNode("Abstract", a.description, b);
+                if (OpenLayers.Util.isArray(a.namedLayers))
+                    for (var c = 0, d = a.namedLayers.length; c < d; ++c) this.writeNode("NamedLayer", a.namedLayers[c], b);
+                else
+                    for (c in a.namedLayers) this.writeNode("NamedLayer", a.namedLayers[c], b);
+                return b
+            },
+            Name: function(a) {
+                return this.createElementNSPlus("sld:Name", {
+                    value: a
+                })
+            },
+            Title: function(a) {
+                return this.createElementNSPlus("sld:Title", {
+                    value: a
+                })
+            },
+            Abstract: function(a) {
+                return this.createElementNSPlus("sld:Abstract", {
+                    value: a
+                })
+            },
+            NamedLayer: function(a) {
+                var b =
+                    this.createElementNSPlus("sld:NamedLayer");
+                this.writeNode("Name", a.name, b);
+                if (a.namedStyles)
+                    for (var c = 0, d = a.namedStyles.length; c < d; ++c) this.writeNode("NamedStyle", a.namedStyles[c], b);
+                if (a.userStyles) {
+                    c = 0;
+                    for (d = a.userStyles.length; c < d; ++c) this.writeNode("UserStyle", a.userStyles[c], b)
+                }
+                return b
+            },
+            NamedStyle: function(a) {
+                var b = this.createElementNSPlus("sld:NamedStyle");
+                this.writeNode("Name", a, b);
+                return b
+            },
+            UserStyle: function(a) {
+                var b = this.createElementNSPlus("sld:UserStyle");
+                a.name && this.writeNode("Name",
+                    a.name, b);
+                a.title && this.writeNode("Title", a.title, b);
+                a.description && this.writeNode("Abstract", a.description, b);
+                a.isDefault && this.writeNode("IsDefault", a.isDefault, b);
+                if (this.multipleSymbolizers && a.rules) {
+                    for (var c = {
+                            "0": []
+                        }, d = [0], e, f, g, h, i, j = 0, k = a.rules.length; j < k; ++j)
+                        if (e = a.rules[j], e.symbolizers) {
+                            f = {};
+                            for (var l = 0, m = e.symbolizers.length; l < m; ++l) g = e.symbolizers[l], h = g.zIndex, h in f || (i = e.clone(), i.symbolizers = [], f[h] = i), f[h].symbolizers.push(g.clone());
+                            for (h in f) h in c || (d.push(h), c[h] = []), c[h].push(f[h])
+                        } else c[0].push(e.clone());
+                    d.sort();
+                    j = 0;
+                    for (k = d.length; j < k; ++j) e = c[d[j]], 0 < e.length && (i = a.clone(), i.rules = c[d[j]], this.writeNode("FeatureTypeStyle", i, b))
+                } else this.writeNode("FeatureTypeStyle", a, b);
+                return b
+            },
+            IsDefault: function(a) {
+                return this.createElementNSPlus("sld:IsDefault", {
+                    value: a ? "1" : "0"
+                })
+            },
+            FeatureTypeStyle: function(a) {
+                for (var b = this.createElementNSPlus("sld:FeatureTypeStyle"), c = 0, d = a.rules.length; c < d; ++c) this.writeNode("Rule", a.rules[c], b);
+                return b
+            },
+            Rule: function(a) {
+                var b = this.createElementNSPlus("sld:Rule");
+                a.name &&
+                    this.writeNode("Name", a.name, b);
+                a.title && this.writeNode("Title", a.title, b);
+                a.description && this.writeNode("Abstract", a.description, b);
+                a.elseFilter ? this.writeNode("ElseFilter", null, b) : a.filter && this.writeNode("ogc:Filter", a.filter, b);
+                void 0 != a.minScaleDenominator && this.writeNode("MinScaleDenominator", a.minScaleDenominator, b);
+                void 0 != a.maxScaleDenominator && this.writeNode("MaxScaleDenominator", a.maxScaleDenominator, b);
+                var c, d;
+                if (this.multipleSymbolizers && a.symbolizers)
+                    for (var e = 0, f = a.symbolizers.length; e <
+                        f; ++e) d = a.symbolizers[e], c = d.CLASS_NAME.split(".").pop(), this.writeNode(c + "Symbolizer", d, b);
+                else
+                    for (var f = OpenLayers.Style.SYMBOLIZER_PREFIXES, e = 0, g = f.length; e < g; ++e) c = f[e], (d = a.symbolizer[c]) && this.writeNode(c + "Symbolizer", d, b);
+                return b
+            },
+            ElseFilter: function() {
+                return this.createElementNSPlus("sld:ElseFilter")
+            },
+            MinScaleDenominator: function(a) {
+                return this.createElementNSPlus("sld:MinScaleDenominator", {
+                    value: a
+                })
+            },
+            MaxScaleDenominator: function(a) {
+                return this.createElementNSPlus("sld:MaxScaleDenominator", {
+                    value: a
+                })
+            },
+            LineSymbolizer: function(a) {
+                var b = this.createElementNSPlus("sld:LineSymbolizer");
+                this.writeNode("Stroke", a, b);
+                return b
+            },
+            Stroke: function(a) {
+                var b = this.createElementNSPlus("sld:Stroke");
+                void 0 != a.strokeColor && this.writeNode("CssParameter", {
+                    symbolizer: a,
+                    key: "strokeColor"
+                }, b);
+                void 0 != a.strokeOpacity && this.writeNode("CssParameter", {
+                    symbolizer: a,
+                    key: "strokeOpacity"
+                }, b);
+                void 0 != a.strokeWidth && this.writeNode("CssParameter", {
+                    symbolizer: a,
+                    key: "strokeWidth"
+                }, b);
+                void 0 != a.strokeDashstyle && "solid" !==
+                    a.strokeDashstyle && this.writeNode("CssParameter", {
+                        symbolizer: a,
+                        key: "strokeDashstyle"
+                    }, b);
+                void 0 != a.strokeLinecap && this.writeNode("CssParameter", {
+                    symbolizer: a,
+                    key: "strokeLinecap"
+                }, b);
+                return b
+            },
+            CssParameter: function(a) {
+                return this.createElementNSPlus("sld:CssParameter", {
+                    attributes: {
+                        name: this.getCssProperty(a.key)
+                    },
+                    value: a.symbolizer[a.key]
+                })
+            },
+            TextSymbolizer: function(a) {
+                var b = this.createElementNSPlus("sld:TextSymbolizer");
+                null != a.label && this.writeNode("Label", a.label, b);
+                (null != a.fontFamily || null != a.fontSize ||
+                    null != a.fontWeight || null != a.fontStyle) && this.writeNode("Font", a, b);
+                (null != a.labelAnchorPointX || null != a.labelAnchorPointY || null != a.labelAlign || null != a.labelXOffset || null != a.labelYOffset || null != a.labelRotation || null != a.labelPerpendicularOffset) && this.writeNode("LabelPlacement", a, b);
+                (null != a.haloRadius || null != a.haloColor || null != a.haloOpacity) && this.writeNode("Halo", a, b);
+                (null != a.fontColor || null != a.fontOpacity) && this.writeNode("Fill", {
+                    fillColor: a.fontColor,
+                    fillOpacity: a.fontOpacity
+                }, b);
+                return b
+            },
+            LabelPlacement: function(a) {
+                var b =
+                    this.createElementNSPlus("sld:LabelPlacement");
+                (null != a.labelAnchorPointX || null != a.labelAnchorPointY || null != a.labelAlign || null != a.labelXOffset || null != a.labelYOffset || null != a.labelRotation) && null == a.labelPerpendicularOffset && this.writeNode("PointPlacement", a, b);
+                null != a.labelPerpendicularOffset && this.writeNode("LinePlacement", a, b);
+                return b
+            },
+            LinePlacement: function(a) {
+                var b = this.createElementNSPlus("sld:LinePlacement");
+                this.writeNode("PerpendicularOffset", a.labelPerpendicularOffset, b);
+                return b
+            },
+            PerpendicularOffset: function(a) {
+                return this.createElementNSPlus("sld:PerpendicularOffset", {
+                    value: a
+                })
+            },
+            PointPlacement: function(a) {
+                var b = this.createElementNSPlus("sld:PointPlacement");
+                (null != a.labelAnchorPointX || null != a.labelAnchorPointY || null != a.labelAlign) && this.writeNode("AnchorPoint", a, b);
+                (null != a.labelXOffset || null != a.labelYOffset) && this.writeNode("Displacement", a, b);
+                null != a.labelRotation && this.writeNode("Rotation", a.labelRotation, b);
+                return b
+            },
+            AnchorPoint: function(a) {
+                var b = this.createElementNSPlus("sld:AnchorPoint"),
+                    c = a.labelAnchorPointX,
+                    d = a.labelAnchorPointY;
+                null != c && this.writeNode("AnchorPointX",
+                    c, b);
+                null != d && this.writeNode("AnchorPointY", d, b);
+                if (null == c && null == d) {
+                    var e = a.labelAlign.substr(0, 1),
+                        a = a.labelAlign.substr(1, 1);
+                    "l" === e ? c = 0 : "c" === e ? c = 0.5 : "r" === e && (c = 1);
+                    "b" === a ? d = 0 : "m" === a ? d = 0.5 : "t" === a && (d = 1);
+                    this.writeNode("AnchorPointX", c, b);
+                    this.writeNode("AnchorPointY", d, b)
+                }
+                return b
+            },
+            AnchorPointX: function(a) {
+                return this.createElementNSPlus("sld:AnchorPointX", {
+                    value: a
+                })
+            },
+            AnchorPointY: function(a) {
+                return this.createElementNSPlus("sld:AnchorPointY", {
+                    value: a
+                })
+            },
+            Displacement: function(a) {
+                var b = this.createElementNSPlus("sld:Displacement");
+                null != a.labelXOffset && this.writeNode("DisplacementX", a.labelXOffset, b);
+                null != a.labelYOffset && this.writeNode("DisplacementY", a.labelYOffset, b);
+                return b
+            },
+            DisplacementX: function(a) {
+                return this.createElementNSPlus("sld:DisplacementX", {
+                    value: a
+                })
+            },
+            DisplacementY: function(a) {
+                return this.createElementNSPlus("sld:DisplacementY", {
+                    value: a
+                })
+            },
+            Font: function(a) {
+                var b = this.createElementNSPlus("sld:Font");
+                a.fontFamily && this.writeNode("CssParameter", {
+                    symbolizer: a,
+                    key: "fontFamily"
+                }, b);
+                a.fontSize && this.writeNode("CssParameter", {
+                    symbolizer: a,
+                    key: "fontSize"
+                }, b);
+                a.fontWeight && this.writeNode("CssParameter", {
+                    symbolizer: a,
+                    key: "fontWeight"
+                }, b);
+                a.fontStyle && this.writeNode("CssParameter", {
+                    symbolizer: a,
+                    key: "fontStyle"
+                }, b);
+                return b
+            },
+            Label: function(a) {
+                return this.writers.sld._OGCExpression.call(this, "sld:Label", a)
+            },
+            Halo: function(a) {
+                var b = this.createElementNSPlus("sld:Halo");
+                a.haloRadius && this.writeNode("Radius", a.haloRadius, b);
+                (a.haloColor || a.haloOpacity) && this.writeNode("Fill", {
+                    fillColor: a.haloColor,
+                    fillOpacity: a.haloOpacity
+                }, b);
+                return b
+            },
+            Radius: function(a) {
+                return this.createElementNSPlus("sld:Radius", {
+                    value: a
+                })
+            },
+            RasterSymbolizer: function(a) {
+                var b = this.createElementNSPlus("sld:RasterSymbolizer");
+                a.geometry && this.writeNode("Geometry", a.geometry, b);
+                a.opacity && this.writeNode("Opacity", a.opacity, b);
+                a.colorMap && this.writeNode("ColorMap", a.colorMap, b);
+                return b
+            },
+            Geometry: function(a) {
+                var b = this.createElementNSPlus("sld:Geometry");
+                a.property && this.writeNode("ogc:PropertyName", a, b);
+                return b
+            },
+            ColorMap: function(a) {
+                for (var b = this.createElementNSPlus("sld:ColorMap"),
+                        c = 0, d = a.length; c < d; ++c) this.writeNode("ColorMapEntry", a[c], b);
+                return b
+            },
+            ColorMapEntry: function(a) {
+                var b = this.createElementNSPlus("sld:ColorMapEntry");
+                b.setAttribute("color", a.color);
+                void 0 !== a.opacity && b.setAttribute("opacity", parseFloat(a.opacity));
+                void 0 !== a.quantity && b.setAttribute("quantity", parseFloat(a.quantity));
+                void 0 !== a.label && b.setAttribute("label", a.label);
+                return b
+            },
+            PolygonSymbolizer: function(a) {
+                var b = this.createElementNSPlus("sld:PolygonSymbolizer");
+                !1 !== a.fill && this.writeNode("Fill",
+                    a, b);
+                !1 !== a.stroke && this.writeNode("Stroke", a, b);
+                return b
+            },
+            Fill: function(a) {
+                var b = this.createElementNSPlus("sld:Fill");
+                a.fillColor && this.writeNode("CssParameter", {
+                    symbolizer: a,
+                    key: "fillColor"
+                }, b);
+                null != a.fillOpacity && this.writeNode("CssParameter", {
+                    symbolizer: a,
+                    key: "fillOpacity"
+                }, b);
+                return b
+            },
+            PointSymbolizer: function(a) {
+                var b = this.createElementNSPlus("sld:PointSymbolizer");
+                this.writeNode("Graphic", a, b);
+                return b
+            },
+            Graphic: function(a) {
+                var b = this.createElementNSPlus("sld:Graphic");
+                void 0 != a.externalGraphic ?
+                    this.writeNode("ExternalGraphic", a, b) : this.writeNode("Mark", a, b);
+                void 0 != a.graphicOpacity && this.writeNode("Opacity", a.graphicOpacity, b);
+                void 0 != a.pointRadius ? this.writeNode("Size", 2 * a.pointRadius, b) : void 0 != a.graphicWidth && this.writeNode("Size", a.graphicWidth, b);
+                void 0 != a.rotation && this.writeNode("Rotation", a.rotation, b);
+                return b
+            },
+            ExternalGraphic: function(a) {
+                var b = this.createElementNSPlus("sld:ExternalGraphic");
+                this.writeNode("OnlineResource", a.externalGraphic, b);
+                this.writeNode("Format", a.graphicFormat ||
+                    this.getGraphicFormat(a.externalGraphic), b);
+                return b
+            },
+            Mark: function(a) {
+                var b = this.createElementNSPlus("sld:Mark");
+                a.graphicName && this.writeNode("WellKnownName", a.graphicName, b);
+                !1 !== a.fill && this.writeNode("Fill", a, b);
+                !1 !== a.stroke && this.writeNode("Stroke", a, b);
+                return b
+            },
+            WellKnownName: function(a) {
+                return this.createElementNSPlus("sld:WellKnownName", {
+                    value: a
+                })
+            },
+            Opacity: function(a) {
+                return this.createElementNSPlus("sld:Opacity", {
+                    value: a
+                })
+            },
+            Size: function(a) {
+                return this.writers.sld._OGCExpression.call(this,
+                    "sld:Size", a)
+            },
+            Rotation: function(a) {
+                return this.createElementNSPlus("sld:Rotation", {
+                    value: a
+                })
+            },
+            OnlineResource: function(a) {
+                return this.createElementNSPlus("sld:OnlineResource", {
+                    attributes: {
+                        "xlink:type": "simple",
+                        "xlink:href": a
+                    }
+                })
+            },
+            Format: function(a) {
+                return this.createElementNSPlus("sld:Format", {
+                    value: a
+                })
+            }
+        }
+    }, OpenLayers.Format.Filter.v1_0_0.prototype.writers),
+    CLASS_NAME: "OpenLayers.Format.SLD.v1"
+});
+OpenLayers.Layer.WMS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    DEFAULT_PARAMS: {
+        service: "WMS",
+        version: "1.1.1",
+        request: "GetMap",
+        styles: "",
+        format: "image/jpeg"
+    },
+    isBaseLayer: !0,
+    encodeBBOX: !1,
+    noMagic: !1,
+    yx: {},
+    initialize: function(a, b, c, d) {
+        var e = [],
+            c = OpenLayers.Util.upperCaseObject(c);
+        1.3 <= parseFloat(c.VERSION) && !c.EXCEPTIONS && (c.EXCEPTIONS = "INIMAGE");
+        e.push(a, b, c, d);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, e);
+        OpenLayers.Util.applyDefaults(this.params, OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS));
+        if (!this.noMagic && this.params.TRANSPARENT && "true" == this.params.TRANSPARENT.toString().toLowerCase()) {
+            if (null == d || !d.isBaseLayer) this.isBaseLayer = !1;
+            "image/jpeg" == this.params.FORMAT && (this.params.FORMAT = OpenLayers.Util.alphaHack() ? "image/gif" : "image/png")
+        }
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.WMS(this.name, this.url, this.params, this.getOptions()));
+        return a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+    },
+    reverseAxisOrder: function() {
+        var a = this.projection.getCode();
+        return 1.3 <= parseFloat(this.params.VERSION) &&
+            !(!this.yx[a] && !OpenLayers.Projection.defaults[a].yx)
+    },
+    getURL: function(a) {
+        var a = this.adjustBounds(a),
+            b = this.getImageSize(),
+            c = {},
+            d = this.reverseAxisOrder();
+        c.BBOX = this.encodeBBOX ? a.toBBOX(null, d) : a.toArray(d);
+        c.WIDTH = b.w;
+        c.HEIGHT = b.h;
+        return this.getFullRequestString(c)
+    },
+    mergeNewParams: function(a) {
+        a = [OpenLayers.Util.upperCaseObject(a)];
+        return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this, a)
+    },
+    getFullRequestString: function(a, b) {
+        var c = this.map.getProjectionObject(),
+            c = this.projection && this.projection.equals(c) ?
+            this.projection.getCode() : c.getCode(),
+            c = "none" == c ? null : c;
+        1.3 <= parseFloat(this.params.VERSION) ? this.params.CRS = c : this.params.SRS = c;
+        "boolean" == typeof this.params.TRANSPARENT && (a.TRANSPARENT = this.params.TRANSPARENT ? "TRUE" : "FALSE");
+        return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Layer.WMS"
+});
+OpenLayers.Format.WMC.v1_1_0 = OpenLayers.Class(OpenLayers.Format.WMC.v1, {
+    VERSION: "1.1.0",
+    schemaLocation: "http://www.opengis.net/context http://schemas.opengis.net/context/1.1.0/context.xsd",
+    initialize: function(a) {
+        OpenLayers.Format.WMC.v1.prototype.initialize.apply(this, [a])
+    },
+    read_sld_MinScaleDenominator: function(a, b) {
+        var c = parseFloat(this.getChildValue(b));
+        0 < c && (a.maxScale = c)
+    },
+    read_sld_MaxScaleDenominator: function(a, b) {
+        a.minScale = parseFloat(this.getChildValue(b))
+    },
+    read_wmc_SRS: function(a, b) {
+        "srs" in
+        a || (a.srs = {});
+        a.srs[this.getChildValue(b)] = !0
+    },
+    write_wmc_Layer: function(a) {
+        var b = OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply(this, [a]);
+        if (a.maxScale) {
+            var c = this.createElementNS(this.namespaces.sld, "sld:MinScaleDenominator");
+            c.appendChild(this.createTextNode(a.maxScale.toPrecision(16)));
+            b.appendChild(c)
+        }
+        a.minScale && (c = this.createElementNS(this.namespaces.sld, "sld:MaxScaleDenominator"), c.appendChild(this.createTextNode(a.minScale.toPrecision(16))), b.appendChild(c));
+        if (a.srs)
+            for (var d in a.srs) b.appendChild(this.createElementDefaultNS("SRS",
+                d));
+        b.appendChild(this.write_wmc_FormatList(a));
+        b.appendChild(this.write_wmc_StyleList(a));
+        a.dimensions && b.appendChild(this.write_wmc_DimensionList(a));
+        b.appendChild(this.write_wmc_LayerExtension(a));
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Format.WMC.v1_1_0"
+});
+OpenLayers.Format.XLS = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+    defaultVersion: "1.1.0",
+    stringifyOutput: !0,
+    CLASS_NAME: "OpenLayers.Format.XLS"
+});
+OpenLayers.Format.XLS.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        xls: "http://www.opengis.net/xls",
+        gml: "http://www.opengis.net/gml",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    xy: !0,
+    defaultPrefix: "xls",
+    schemaLocation: null,
+    read: function(a, b) {
+        OpenLayers.Util.applyDefaults(b, this.options);
+        var c = {};
+        this.readChildNodes(a, c);
+        return c
+    },
+    readers: {
+        xls: {
+            XLS: function(a, b) {
+                b.version = a.getAttribute("version");
+                this.readChildNodes(a, b)
+            },
+            Response: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            GeocodeResponse: function(a, b) {
+                b.responseLists = [];
+                this.readChildNodes(a, b)
+            },
+            GeocodeResponseList: function(a, b) {
+                var c = {
+                    features: [],
+                    numberOfGeocodedAddresses: parseInt(a.getAttribute("numberOfGeocodedAddresses"))
+                };
+                b.responseLists.push(c);
+                this.readChildNodes(a, c)
+            },
+            GeocodedAddress: function(a, b) {
+                var c = new OpenLayers.Feature.Vector;
+                b.features.push(c);
+                this.readChildNodes(a, c);
+                c.geometry = c.components[0]
+            },
+            GeocodeMatchCode: function(a, b) {
+                b.attributes.matchCode = {
+                    accuracy: parseFloat(a.getAttribute("accuracy")),
+                    matchType: a.getAttribute("matchType")
+                }
+            },
+            Address: function(a, b) {
+                var c = {
+                    countryCode: a.getAttribute("countryCode"),
+                    addressee: a.getAttribute("addressee"),
+                    street: [],
+                    place: []
+                };
+                b.attributes.address = c;
+                this.readChildNodes(a, c)
+            },
+            freeFormAddress: function(a, b) {
+                b.freeFormAddress = this.getChildValue(a)
+            },
+            StreetAddress: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Building: function(a, b) {
+                b.building = {
+                    number: a.getAttribute("number"),
+                    subdivision: a.getAttribute("subdivision"),
+                    buildingName: a.getAttribute("buildingName")
+                }
+            },
+            Street: function(a, b) {
+                b.street.push(this.getChildValue(a))
+            },
+            Place: function(a, b) {
+                b.place[a.getAttribute("type")] = this.getChildValue(a)
+            },
+            PostalCode: function(a, b) {
+                b.postalCode = this.getChildValue(a)
+            }
+        },
+        gml: OpenLayers.Format.GML.v3.prototype.readers.gml
+    },
+    write: function(a) {
+        return this.writers.xls.XLS.apply(this, [a])
+    },
+    writers: {
+        xls: {
+            XLS: function(a) {
+                var b = this.createElementNSPlus("xls:XLS", {
+                    attributes: {
+                        version: this.VERSION,
+                        "xsi:schemaLocation": this.schemaLocation
+                    }
+                });
+                this.writeNode("RequestHeader", a.header, b);
+                this.writeNode("Request", a, b);
+                return b
+            },
+            RequestHeader: function() {
+                return this.createElementNSPlus("xls:RequestHeader")
+            },
+            Request: function(a) {
+                var b = this.createElementNSPlus("xls:Request", {
+                    attributes: {
+                        methodName: "GeocodeRequest",
+                        requestID: a.requestID || "",
+                        version: this.VERSION
+                    }
+                });
+                this.writeNode("GeocodeRequest", a.addresses, b);
+                return b
+            },
+            GeocodeRequest: function(a) {
+                for (var b = this.createElementNSPlus("xls:GeocodeRequest"), c = 0, d = a.length; c < d; c++) this.writeNode("Address",
+                    a[c], b);
+                return b
+            },
+            Address: function(a) {
+                var b = this.createElementNSPlus("xls:Address", {
+                    attributes: {
+                        countryCode: a.countryCode
+                    }
+                });
+                a.freeFormAddress ? this.writeNode("freeFormAddress", a.freeFormAddress, b) : (a.street && this.writeNode("StreetAddress", a, b), a.municipality && this.writeNode("Municipality", a.municipality, b), a.countrySubdivision && this.writeNode("CountrySubdivision", a.countrySubdivision, b), a.postalCode && this.writeNode("PostalCode", a.postalCode, b));
+                return b
+            },
+            freeFormAddress: function(a) {
+                return this.createElementNSPlus("freeFormAddress", {
+                    value: a
+                })
+            },
+            StreetAddress: function(a) {
+                var b = this.createElementNSPlus("xls:StreetAddress");
+                a.building && this.writeNode(b, "Building", a.building);
+                a = a.street;
+                OpenLayers.Util.isArray(a) || (a = [a]);
+                for (var c = 0, d = a.length; c < d; c++) this.writeNode("Street", a[c], b);
+                return b
+            },
+            Building: function(a) {
+                return this.createElementNSPlus("xls:Building", {
+                    attributes: {
+                        number: a.number,
+                        subdivision: a.subdivision,
+                        buildingName: a.buildingName
+                    }
+                })
+            },
+            Street: function(a) {
+                return this.createElementNSPlus("xls:Street", {
+                    value: a
+                })
+            },
+            Municipality: function(a) {
+                return this.createElementNSPlus("xls:Place", {
+                    attributes: {
+                        type: "Municipality"
+                    },
+                    value: a
+                })
+            },
+            CountrySubdivision: function(a) {
+                return this.createElementNSPlus("xls:Place", {
+                    attributes: {
+                        type: "CountrySubdivision"
+                    },
+                    value: a
+                })
+            },
+            PostalCode: function(a) {
+                return this.createElementNSPlus("xls:PostalCode", {
+                    value: a
+                })
+            }
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.XLS.v1"
+});
+OpenLayers.Format.XLS.v1_1_0 = OpenLayers.Class(OpenLayers.Format.XLS.v1, {
+    VERSION: "1.1",
+    schemaLocation: "http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd",
+    CLASS_NAME: "OpenLayers.Format.XLS.v1_1_0"
+});
+OpenLayers.Format.XLS.v1_1 = OpenLayers.Format.XLS.v1_1_0;
+OpenLayers.Renderer.SVG = OpenLayers.Class(OpenLayers.Renderer.Elements, {
+    xmlns: "http://www.w3.org/2000/svg",
+    xlinkns: "http://www.w3.org/1999/xlink",
+    MAX_PIXEL: 15E3,
+    translationParameters: null,
+    symbolMetrics: null,
+    initialize: function(a) {
+        this.supported() && (OpenLayers.Renderer.Elements.prototype.initialize.apply(this, arguments), this.translationParameters = {
+            x: 0,
+            y: 0
+        }, this.symbolMetrics = {})
+    },
+    supported: function() {
+        return document.implementation && (document.implementation.hasFeature("org.w3c.svg", "1.0") || document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#SVG",
+            "1.1") || document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"))
+    },
+    inValidRange: function(a, b, c) {
+        a += c ? 0 : this.translationParameters.x;
+        b += c ? 0 : this.translationParameters.y;
+        return a >= -this.MAX_PIXEL && a <= this.MAX_PIXEL && b >= -this.MAX_PIXEL && b <= this.MAX_PIXEL
+    },
+    setExtent: function(a, b) {
+        var c = OpenLayers.Renderer.Elements.prototype.setExtent.apply(this, arguments),
+            d = this.getResolution(),
+            e = -a.left / d,
+            d = a.top / d;
+        if (b) return this.left = e, this.top = d, this.rendererRoot.setAttributeNS(null,
+            "viewBox", "0 0 " + this.size.w + " " + this.size.h), this.translate(this.xOffset, 0), !0;
+        (e = this.translate(e - this.left + this.xOffset, d - this.top)) || this.setExtent(a, !0);
+        return c && e
+    },
+    translate: function(a, b) {
+        if (this.inValidRange(a, b, !0)) {
+            var c = "";
+            if (a || b) c = "translate(" + a + "," + b + ")";
+            this.root.setAttributeNS(null, "transform", c);
+            this.translationParameters = {
+                x: a,
+                y: b
+            };
+            return !0
+        }
+        return !1
+    },
+    setSize: function(a) {
+        OpenLayers.Renderer.prototype.setSize.apply(this, arguments);
+        this.rendererRoot.setAttributeNS(null, "width", this.size.w);
+        this.rendererRoot.setAttributeNS(null, "height", this.size.h)
+    },
+    getNodeType: function(a, b) {
+        var c = null;
+        switch (a.CLASS_NAME) {
+            case "OpenLayers.Geometry.Point":
+                c = b.externalGraphic ? "image" : this.isComplexSymbol(b.graphicName) ? "svg" : "circle";
+                break;
+            case "OpenLayers.Geometry.Rectangle":
+                c = "rect";
+                break;
+            case "OpenLayers.Geometry.LineString":
+                c = "polyline";
+                break;
+            case "OpenLayers.Geometry.LinearRing":
+                c = "polygon";
+                break;
+            case "OpenLayers.Geometry.Polygon":
+            case "OpenLayers.Geometry.Curve":
+                c = "path"
+        }
+        return c
+    },
+    setStyle: function(a,
+        b, c) {
+        var b = b || a._style,
+            c = c || a._options,
+            d = parseFloat(a.getAttributeNS(null, "r")),
+            e = 1,
+            f;
+        if ("OpenLayers.Geometry.Point" == a._geometryClass && d) {
+            a.style.visibility = "";
+            if (!1 === b.graphic) a.style.visibility = "hidden";
+            else if (b.externalGraphic) {
+                f = this.getPosition(a);
+                b.graphicTitle && (a.setAttributeNS(null, "title", b.graphicTitle), d = a.getElementsByTagName("title"), 0 < d.length ? d[0].firstChild.textContent = b.graphicTitle : (d = this.nodeFactory(null, "title"), d.textContent = b.graphicTitle, a.appendChild(d)));
+                b.graphicWidth &&
+                    b.graphicHeight && a.setAttributeNS(null, "preserveAspectRatio", "none");
+                var d = b.graphicWidth || b.graphicHeight,
+                    g = b.graphicHeight || b.graphicWidth,
+                    d = d ? d : 2 * b.pointRadius,
+                    g = g ? g : 2 * b.pointRadius,
+                    h = void 0 != b.graphicYOffset ? b.graphicYOffset : -(0.5 * g),
+                    i = b.graphicOpacity || b.fillOpacity;
+                a.setAttributeNS(null, "x", (f.x + (void 0 != b.graphicXOffset ? b.graphicXOffset : -(0.5 * d))).toFixed());
+                a.setAttributeNS(null, "y", (f.y + h).toFixed());
+                a.setAttributeNS(null, "width", d);
+                a.setAttributeNS(null, "height", g);
+                a.setAttributeNS(this.xlinkns,
+                    "href", b.externalGraphic);
+                a.setAttributeNS(null, "style", "opacity: " + i);
+                a.onclick = OpenLayers.Renderer.SVG.preventDefault
+            } else if (this.isComplexSymbol(b.graphicName)) {
+                var d = 3 * b.pointRadius,
+                    g = 2 * d,
+                    j = this.importSymbol(b.graphicName);
+                f = this.getPosition(a);
+                e = 3 * this.symbolMetrics[j.id][0] / g;
+                h = a.parentNode;
+                i = a.nextSibling;
+                h && h.removeChild(a);
+                a.firstChild && a.removeChild(a.firstChild);
+                a.appendChild(j.firstChild.cloneNode(!0));
+                a.setAttributeNS(null, "viewBox", j.getAttributeNS(null, "viewBox"));
+                a.setAttributeNS(null,
+                    "width", g);
+                a.setAttributeNS(null, "height", g);
+                a.setAttributeNS(null, "x", f.x - d);
+                a.setAttributeNS(null, "y", f.y - d);
+                i ? h.insertBefore(a, i) : h && h.appendChild(a)
+            } else a.setAttributeNS(null, "r", b.pointRadius);
+            d = b.rotation;
+            if ((void 0 !== d || void 0 !== a._rotation) && f) a._rotation = d, d |= 0, "svg" !== a.nodeName ? a.setAttributeNS(null, "transform", "rotate(" + d + " " + f.x + " " + f.y + ")") : (f = this.symbolMetrics[j.id], a.firstChild.setAttributeNS(null, "transform", "rotate(" + d + " " + f[1] + " " + f[2] + ")"))
+        }
+        c.isFilled ? (a.setAttributeNS(null,
+            "fill", b.fillColor), a.setAttributeNS(null, "fill-opacity", b.fillOpacity)) : a.setAttributeNS(null, "fill", "none");
+        c.isStroked ? (a.setAttributeNS(null, "stroke", b.strokeColor), a.setAttributeNS(null, "stroke-opacity", b.strokeOpacity), a.setAttributeNS(null, "stroke-width", b.strokeWidth * e), a.setAttributeNS(null, "stroke-linecap", b.strokeLinecap || "round"), a.setAttributeNS(null, "stroke-linejoin", "round"), b.strokeDashstyle && a.setAttributeNS(null, "stroke-dasharray", this.dashStyle(b, e))) : a.setAttributeNS(null, "stroke",
+            "none");
+        b.pointerEvents && a.setAttributeNS(null, "pointer-events", b.pointerEvents);
+        null != b.cursor && a.setAttributeNS(null, "cursor", b.cursor);
+        return a
+    },
+    dashStyle: function(a, b) {
+        var c = a.strokeWidth * b,
+            d = a.strokeDashstyle;
+        switch (d) {
+            case "solid":
+                return "none";
+            case "dot":
+                return [1, 4 * c].join();
+            case "dash":
+                return [4 * c, 4 * c].join();
+            case "dashdot":
+                return [4 * c, 4 * c, 1, 4 * c].join();
+            case "longdash":
+                return [8 * c, 4 * c].join();
+            case "longdashdot":
+                return [8 * c, 4 * c, 1, 4 * c].join();
+            default:
+                return OpenLayers.String.trim(d).replace(/\s+/g,
+                    ",")
+        }
+    },
+    createNode: function(a, b) {
+        var c = document.createElementNS(this.xmlns, a);
+        b && c.setAttributeNS(null, "id", b);
+        return c
+    },
+    nodeTypeCompare: function(a, b) {
+        return b == a.nodeName
+    },
+    createRenderRoot: function() {
+        var a = this.nodeFactory(this.container.id + "_svgRoot", "svg");
+        a.style.display = "block";
+        return a
+    },
+    createRoot: function(a) {
+        return this.nodeFactory(this.container.id + a, "g")
+    },
+    createDefs: function() {
+        var a = this.nodeFactory(this.container.id + "_defs", "defs");
+        this.rendererRoot.appendChild(a);
+        return a
+    },
+    drawPoint: function(a,
+        b) {
+        return this.drawCircle(a, b, 1)
+    },
+    drawCircle: function(a, b, c) {
+        var d = this.getResolution(),
+            e = (b.x - this.featureDx) / d + this.left,
+            b = this.top - b.y / d;
+        return this.inValidRange(e, b) ? (a.setAttributeNS(null, "cx", e), a.setAttributeNS(null, "cy", b), a.setAttributeNS(null, "r", c), a) : !1
+    },
+    drawLineString: function(a, b) {
+        var c = this.getComponentsString(b.components);
+        return c.path ? (a.setAttributeNS(null, "points", c.path), c.complete ? a : null) : !1
+    },
+    drawLinearRing: function(a, b) {
+        var c = this.getComponentsString(b.components);
+        return c.path ?
+            (a.setAttributeNS(null, "points", c.path), c.complete ? a : null) : !1
+    },
+    drawPolygon: function(a, b) {
+        for (var c = "", d = !0, e = !0, f, g, h = 0, i = b.components.length; h < i; h++) c += " M", f = this.getComponentsString(b.components[h].components, " "), (g = f.path) ? (c += " " + g, e = f.complete && e) : d = !1;
+        return d ? (a.setAttributeNS(null, "d", c + " z"), a.setAttributeNS(null, "fill-rule", "evenodd"), e ? a : null) : !1
+    },
+    drawRectangle: function(a, b) {
+        var c = this.getResolution(),
+            d = (b.x - this.featureDx) / c + this.left,
+            e = this.top - b.y / c;
+        return this.inValidRange(d, e) ? (a.setAttributeNS(null,
+            "x", d), a.setAttributeNS(null, "y", e), a.setAttributeNS(null, "width", b.width / c), a.setAttributeNS(null, "height", b.height / c), a) : !1
+    },
+    drawText: function(a, b, c) {
+        var d = !!b.labelOutlineWidth;
+        if (d) {
+            var e = OpenLayers.Util.extend({}, b);
+            e.fontColor = e.labelOutlineColor;
+            e.fontStrokeColor = e.labelOutlineColor;
+            e.fontStrokeWidth = b.labelOutlineWidth;
+            delete e.labelOutlineWidth;
+            this.drawText(a, e, c)
+        }
+        var f = this.getResolution(),
+            e = (c.x - this.featureDx) / f + this.left,
+            g = c.y / f - this.top,
+            d = d ? this.LABEL_OUTLINE_SUFFIX : this.LABEL_ID_SUFFIX,
+            f = this.nodeFactory(a + d, "text");
+        f.setAttributeNS(null, "x", e);
+        f.setAttributeNS(null, "y", -g);
+        b.fontColor && f.setAttributeNS(null, "fill", b.fontColor);
+        b.fontStrokeColor && f.setAttributeNS(null, "stroke", b.fontStrokeColor);
+        b.fontStrokeWidth && f.setAttributeNS(null, "stroke-width", b.fontStrokeWidth);
+        b.fontOpacity && f.setAttributeNS(null, "opacity", b.fontOpacity);
+        b.fontFamily && f.setAttributeNS(null, "font-family", b.fontFamily);
+        b.fontSize && f.setAttributeNS(null, "font-size", b.fontSize);
+        b.fontWeight && f.setAttributeNS(null,
+            "font-weight", b.fontWeight);
+        b.fontStyle && f.setAttributeNS(null, "font-style", b.fontStyle);
+        !0 === b.labelSelect ? (f.setAttributeNS(null, "pointer-events", "visible"), f._featureId = a) : f.setAttributeNS(null, "pointer-events", "none");
+        g = b.labelAlign || OpenLayers.Renderer.defaultSymbolizer.labelAlign;
+        f.setAttributeNS(null, "text-anchor", OpenLayers.Renderer.SVG.LABEL_ALIGN[g[0]] || "middle");
+        !0 === OpenLayers.IS_GECKO && f.setAttributeNS(null, "dominant-baseline", OpenLayers.Renderer.SVG.LABEL_ALIGN[g[1]] || "central");
+        for (var h =
+                b.label.split("\n"), i = h.length; f.childNodes.length > i;) f.removeChild(f.lastChild);
+        for (var j = 0; j < i; j++) {
+            var k = this.nodeFactory(a + d + "_tspan_" + j, "tspan");
+            !0 === b.labelSelect && (k._featureId = a, k._geometry = c, k._geometryClass = c.CLASS_NAME);
+            !1 === OpenLayers.IS_GECKO && k.setAttributeNS(null, "baseline-shift", OpenLayers.Renderer.SVG.LABEL_VSHIFT[g[1]] || "-35%");
+            k.setAttribute("x", e);
+            if (0 == j) {
+                var l = OpenLayers.Renderer.SVG.LABEL_VFACTOR[g[1]];
+                null == l && (l = -0.5);
+                k.setAttribute("dy", l * (i - 1) + "em")
+            } else k.setAttribute("dy",
+                "1em");
+            k.textContent = "" === h[j] ? " " : h[j];
+            k.parentNode || f.appendChild(k)
+        }
+        f.parentNode || this.textRoot.appendChild(f)
+    },
+    getComponentsString: function(a, b) {
+        for (var c = [], d = !0, e = a.length, f = [], g, h = 0; h < e; h++) g = a[h], c.push(g), (g = this.getShortString(g)) ? f.push(g) : (0 < h && this.getShortString(a[h - 1]) && f.push(this.clipLine(a[h], a[h - 1])), h < e - 1 && this.getShortString(a[h + 1]) && f.push(this.clipLine(a[h], a[h + 1])), d = !1);
+        return {
+            path: f.join(b || ","),
+            complete: d
+        }
+    },
+    clipLine: function(a, b) {
+        if (b.equals(a)) return "";
+        var c = this.getResolution(),
+            d = this.MAX_PIXEL - this.translationParameters.x,
+            e = this.MAX_PIXEL - this.translationParameters.y,
+            f = (b.x - this.featureDx) / c + this.left,
+            g = this.top - b.y / c,
+            h = (a.x - this.featureDx) / c + this.left,
+            c = this.top - a.y / c,
+            i;
+        if (h < -d || h > d) i = (c - g) / (h - f), h = 0 > h ? -d : d, c = g + (h - f) * i;
+        if (c < -e || c > e) i = (h - f) / (c - g), c = 0 > c ? -e : e, h = f + (c - g) * i;
+        return h + "," + c
+    },
+    getShortString: function(a) {
+        var b = this.getResolution(),
+            c = (a.x - this.featureDx) / b + this.left,
+            a = this.top - a.y / b;
+        return this.inValidRange(c, a) ? c + "," + a : !1
+    },
+    getPosition: function(a) {
+        return {
+            x: parseFloat(a.getAttributeNS(null,
+                "cx")),
+            y: parseFloat(a.getAttributeNS(null, "cy"))
+        }
+    },
+    importSymbol: function(a) {
+        this.defs || (this.defs = this.createDefs());
+        var b = this.container.id + "-" + a,
+            c = document.getElementById(b);
+        if (null != c) return c;
+        var d = OpenLayers.Renderer.symbol[a];
+        if (!d) throw Error(a + " is not a valid symbol name");
+        var a = this.nodeFactory(b, "symbol"),
+            e = this.nodeFactory(null, "polygon");
+        a.appendChild(e);
+        for (var c = new OpenLayers.Bounds(Number.MAX_VALUE, Number.MAX_VALUE, 0, 0), f = [], g, h, i = 0; i < d.length; i += 2) g = d[i], h = d[i + 1], c.left = Math.min(c.left,
+            g), c.bottom = Math.min(c.bottom, h), c.right = Math.max(c.right, g), c.top = Math.max(c.top, h), f.push(g, ",", h);
+        e.setAttributeNS(null, "points", f.join(" "));
+        d = c.getWidth();
+        e = c.getHeight();
+        a.setAttributeNS(null, "viewBox", [c.left - d, c.bottom - e, 3 * d, 3 * e].join(" "));
+        this.symbolMetrics[b] = [Math.max(d, e), c.getCenterLonLat().lon, c.getCenterLonLat().lat];
+        this.defs.appendChild(a);
+        return a
+    },
+    getFeatureIdFromEvent: function(a) {
+        var b = OpenLayers.Renderer.Elements.prototype.getFeatureIdFromEvent.apply(this, arguments);
+        b || (b = a.target,
+            b = b.parentNode && b != this.rendererRoot ? b.parentNode._featureId : void 0);
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Renderer.SVG"
+});
+OpenLayers.Renderer.SVG.LABEL_ALIGN = {
+    l: "start",
+    r: "end",
+    b: "bottom",
+    t: "hanging"
+};
+OpenLayers.Renderer.SVG.LABEL_VSHIFT = {
+    t: "-70%",
+    b: "0"
+};
+OpenLayers.Renderer.SVG.LABEL_VFACTOR = {
+    t: 0,
+    b: -1
+};
+OpenLayers.Renderer.SVG.preventDefault = function(a) {
+    a.preventDefault && a.preventDefault()
+};
+OpenLayers.Format.SLD.v1_0_0 = OpenLayers.Class(OpenLayers.Format.SLD.v1, {
+    VERSION: "1.0.0",
+    schemaLocation: "http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd",
+    CLASS_NAME: "OpenLayers.Format.SLD.v1_0_0"
+});
+OpenLayers.Format.OWSContext = OpenLayers.Class(OpenLayers.Format.Context, {
+    defaultVersion: "0.3.1",
+    getVersion: function(a, b) {
+        var c = OpenLayers.Format.XML.VersionedOGC.prototype.getVersion.apply(this, arguments);
+        "0.3.0" === c && (c = this.defaultVersion);
+        return c
+    },
+    toContext: function(a) {
+        var b = {};
+        "OpenLayers.Map" == a.CLASS_NAME && (b.bounds = a.getExtent(), b.maxExtent = a.maxExtent, b.projection = a.projection, b.size = a.getSize(), b.layers = a.layers);
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Format.OWSContext"
+});
+OpenLayers.Format.OWSContext.v0_3_1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        owc: "http://www.opengis.net/ows-context",
+        gml: "http://www.opengis.net/gml",
+        kml: "http://www.opengis.net/kml/2.2",
+        ogc: "http://www.opengis.net/ogc",
+        ows: "http://www.opengis.net/ows",
+        sld: "http://www.opengis.net/sld",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    VERSION: "0.3.1",
+    schemaLocation: "http://www.opengis.net/ows-context http://www.ogcnetwork.net/schemas/owc/0.3.1/owsContext.xsd",
+    defaultPrefix: "owc",
+    extractAttributes: !0,
+    xy: !0,
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    featureNS: "http://mapserver.gis.umn.edu/mapserver",
+    featureType: "vector",
+    geometryName: "geometry",
+    nestingLayerLookup: null,
+    initialize: function(a) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a]);
+        OpenLayers.Format.GML.v2.prototype.setGeometryTypes.call(this)
+    },
+    setNestingPath: function(a) {
+        if (a.layersContext)
+            for (var b = 0, c = a.layersContext.length; b < c; b++) {
+                var d =
+                    a.layersContext[b],
+                    e = [],
+                    f = a.title || "";
+                a.metadata && a.metadata.nestingPath && (e = a.metadata.nestingPath.slice());
+                "" != f && e.push(f);
+                d.metadata.nestingPath = e;
+                d.layersContext && this.setNestingPath(d)
+            }
+    },
+    decomposeNestingPath: function(a) {
+        var b = [];
+        if (OpenLayers.Util.isArray(a)) {
+            for (a = a.slice(); 0 < a.length;) b.push(a.slice()), a.pop();
+            b.reverse()
+        }
+        return b
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var b = {};
+        this.readNode(a,
+            b);
+        this.setNestingPath({
+            layersContext: b.layersContext
+        });
+        a = [];
+        this.processLayer(a, b);
+        delete b.layersContext;
+        b.layersContext = a;
+        return b
+    },
+    processLayer: function(a, b) {
+        if (b.layersContext)
+            for (var c = 0, d = b.layersContext.length; c < d; c++) {
+                var e = b.layersContext[c];
+                a.push(e);
+                e.layersContext && this.processLayer(a, e)
+            }
+    },
+    write: function(a, b) {
+        this.nestingLayerLookup = {};
+        b = b || {};
+        OpenLayers.Util.applyDefaults(b, a);
+        var c = this.writeNode("OWSContext", b);
+        this.nestingLayerLookup = null;
+        this.setAttributeNS(c, this.namespaces.xsi,
+            "xsi:schemaLocation", this.schemaLocation);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [c])
+    },
+    readers: {
+        kml: {
+            Document: function(a, b) {
+                b.features = (new OpenLayers.Format.KML({
+                    kmlns: this.namespaces.kml,
+                    extractStyles: !0
+                })).read(a)
+            }
+        },
+        owc: {
+            OWSContext: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            General: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            ResourceList: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Layer: function(a, b) {
+                var c = {
+                    metadata: {},
+                    visibility: "1" != a.getAttribute("hidden"),
+                    queryable: "1" == a.getAttribute("queryable"),
+                    opacity: null != a.getAttribute("opacity") ? parseFloat(a.getAttribute("opacity")) : null,
+                    name: a.getAttribute("name"),
+                    categoryLayer: null == a.getAttribute("name"),
+                    formats: [],
+                    styles: []
+                };
+                b.layersContext || (b.layersContext = []);
+                b.layersContext.push(c);
+                this.readChildNodes(a, c)
+            },
+            InlineGeometry: function(a, b) {
+                b.features = [];
+                var c = this.getElementsByTagNameNS(a, this.namespaces.gml, "featureMember"),
+                    d;
+                1 <= c.length && (d = c[0]);
+                d && d.firstChild && (c = d.firstChild.nextSibling ? d.firstChild.nextSibling : d.firstChild, this.setNamespace("feature",
+                    c.namespaceURI), this.featureType = c.localName || c.nodeName.split(":").pop(), this.readChildNodes(a, b))
+            },
+            Server: function(a, b) {
+                if (!b.service && !b.version || b.service != OpenLayers.Format.Context.serviceTypes.WMS) b.service = a.getAttribute("service"), b.version = a.getAttribute("version"), this.readChildNodes(a, b)
+            },
+            Name: function(a, b) {
+                b.name = this.getChildValue(a);
+                this.readChildNodes(a, b)
+            },
+            Title: function(a, b) {
+                b.title = this.getChildValue(a);
+                this.readChildNodes(a, b)
+            },
+            StyleList: function(a, b) {
+                this.readChildNodes(a, b.styles)
+            },
+            Style: function(a, b) {
+                var c = {};
+                b.push(c);
+                this.readChildNodes(a, c)
+            },
+            LegendURL: function(a, b) {
+                var c = {};
+                b.legend = c;
+                this.readChildNodes(a, c)
+            },
+            OnlineResource: function(a, b) {
+                b.url = this.getAttributeNS(a, this.namespaces.xlink, "href");
+                this.readChildNodes(a, b)
+            }
+        },
+        ows: OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers.ows,
+        gml: OpenLayers.Format.GML.v2.prototype.readers.gml,
+        sld: OpenLayers.Format.SLD.v1_0_0.prototype.readers.sld,
+        feature: OpenLayers.Format.GML.v2.prototype.readers.feature
+    },
+    writers: {
+        owc: {
+            OWSContext: function(a) {
+                var b =
+                    this.createElementNSPlus("OWSContext", {
+                        attributes: {
+                            version: this.VERSION,
+                            id: a.id || OpenLayers.Util.createUniqueID("OpenLayers_OWSContext_")
+                        }
+                    });
+                this.writeNode("General", a, b);
+                this.writeNode("ResourceList", a, b);
+                return b
+            },
+            General: function(a) {
+                var b = this.createElementNSPlus("General");
+                this.writeNode("ows:BoundingBox", a, b);
+                this.writeNode("ows:Title", a.title || "OpenLayers OWSContext", b);
+                return b
+            },
+            ResourceList: function(a) {
+                for (var b = this.createElementNSPlus("ResourceList"), c = 0, d = a.layers.length; c < d; c++) {
+                    var e =
+                        a.layers[c],
+                        f = this.decomposeNestingPath(e.metadata.nestingPath);
+                    this.writeNode("_Layer", {
+                        layer: e,
+                        subPaths: f
+                    }, b)
+                }
+                return b
+            },
+            Server: function(a) {
+                var b = this.createElementNSPlus("Server", {
+                    attributes: {
+                        version: a.version,
+                        service: a.service
+                    }
+                });
+                this.writeNode("OnlineResource", a, b);
+                return b
+            },
+            OnlineResource: function(a) {
+                return this.createElementNSPlus("OnlineResource", {
+                    attributes: {
+                        "xlink:href": a.url
+                    }
+                })
+            },
+            InlineGeometry: function(a) {
+                var b = this.createElementNSPlus("InlineGeometry");
+                this.writeNode("gml:boundedBy", a.getDataExtent(),
+                    b);
+                for (var c = 0, d = a.features.length; c < d; c++) this.writeNode("gml:featureMember", a.features[c], b);
+                return b
+            },
+            StyleList: function(a) {
+                for (var b = this.createElementNSPlus("StyleList"), c = 0, d = a.length; c < d; c++) this.writeNode("Style", a[c], b);
+                return b
+            },
+            Style: function(a) {
+                var b = this.createElementNSPlus("Style");
+                this.writeNode("Name", a, b);
+                this.writeNode("Title", a, b);
+                a.legend && this.writeNode("LegendURL", a, b);
+                return b
+            },
+            Name: function(a) {
+                return this.createElementNSPlus("Name", {
+                    value: a.name
+                })
+            },
+            Title: function(a) {
+                return this.createElementNSPlus("Title", {
+                    value: a.title
+                })
+            },
+            LegendURL: function(a) {
+                var b = this.createElementNSPlus("LegendURL");
+                this.writeNode("OnlineResource", a.legend, b);
+                return b
+            },
+            _WMS: function(a) {
+                var b = this.createElementNSPlus("Layer", {
+                    attributes: {
+                        name: a.params.LAYERS,
+                        queryable: a.queryable ? "1" : "0",
+                        hidden: a.visibility ? "0" : "1",
+                        opacity: a.hasOwnProperty("opacity") ? a.opacity : null
+                    }
+                });
+                this.writeNode("ows:Title", a.name, b);
+                this.writeNode("ows:OutputFormat", a.params.FORMAT, b);
+                this.writeNode("Server", {
+                    service: OpenLayers.Format.Context.serviceTypes.WMS,
+                    version: a.params.VERSION,
+                    url: a.url
+                }, b);
+                a.metadata.styles && 0 < a.metadata.styles.length && this.writeNode("StyleList", a.metadata.styles, b);
+                return b
+            },
+            _Layer: function(a) {
+                var b, c, d;
+                b = a.layer;
+                c = a.subPaths;
+                d = null;
+                0 < c.length ? (b = c[0].join("/"), c = b.lastIndexOf("/"), d = this.nestingLayerLookup[b], c = 0 < c ? b.substring(c + 1, b.length) : b, d || (d = this.createElementNSPlus("Layer"), this.writeNode("ows:Title", c, d), this.nestingLayerLookup[b] = d), a.subPaths.shift(), this.writeNode("_Layer", a, d)) : (b instanceof OpenLayers.Layer.WMS ?
+                    d = this.writeNode("_WMS", b) : b instanceof OpenLayers.Layer.Vector && (b.protocol instanceof OpenLayers.Protocol.WFS.v1 ? d = this.writeNode("_WFS", b) : b.protocol instanceof OpenLayers.Protocol.HTTP ? b.protocol.format instanceof OpenLayers.Format.GML ? (b.protocol.format.version = "2.1.2", d = this.writeNode("_GML", b)) : b.protocol.format instanceof OpenLayers.Format.KML && (b.protocol.format.version = "2.2", d = this.writeNode("_KML", b)) : (this.setNamespace("feature", this.featureNS), d = this.writeNode("_InlineGeometry", b))),
+                    b.options.maxScale && this.writeNode("sld:MinScaleDenominator", b.options.maxScale, d), b.options.minScale && this.writeNode("sld:MaxScaleDenominator", b.options.minScale, d), this.nestingLayerLookup[b.name] = d);
+                return d
+            },
+            _WFS: function(a) {
+                var b = this.createElementNSPlus("Layer", {
+                    attributes: {
+                        name: a.protocol.featurePrefix + ":" + a.protocol.featureType,
+                        hidden: a.visibility ? "0" : "1"
+                    }
+                });
+                this.writeNode("ows:Title", a.name, b);
+                this.writeNode("Server", {
+                    service: OpenLayers.Format.Context.serviceTypes.WFS,
+                    version: a.protocol.version,
+                    url: a.protocol.url
+                }, b);
+                return b
+            },
+            _InlineGeometry: function(a) {
+                var b = this.createElementNSPlus("Layer", {
+                    attributes: {
+                        name: this.featureType,
+                        hidden: a.visibility ? "0" : "1"
+                    }
+                });
+                this.writeNode("ows:Title", a.name, b);
+                this.writeNode("InlineGeometry", a, b);
+                return b
+            },
+            _GML: function(a) {
+                var b = this.createElementNSPlus("Layer");
+                this.writeNode("ows:Title", a.name, b);
+                this.writeNode("Server", {
+                    service: OpenLayers.Format.Context.serviceTypes.GML,
+                    url: a.protocol.url,
+                    version: a.protocol.format.version
+                }, b);
+                return b
+            },
+            _KML: function(a) {
+                var b =
+                    this.createElementNSPlus("Layer");
+                this.writeNode("ows:Title", a.name, b);
+                this.writeNode("Server", {
+                    service: OpenLayers.Format.Context.serviceTypes.KML,
+                    version: a.protocol.format.version,
+                    url: a.protocol.url
+                }, b);
+                return b
+            }
+        },
+        gml: OpenLayers.Util.applyDefaults({
+            boundedBy: function(a) {
+                var b = this.createElementNSPlus("gml:boundedBy");
+                this.writeNode("gml:Box", a, b);
+                return b
+            }
+        }, OpenLayers.Format.GML.v2.prototype.writers.gml),
+        ows: OpenLayers.Format.OWSCommon.v1_0_0.prototype.writers.ows,
+        sld: OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld,
+        feature: OpenLayers.Format.GML.v2.prototype.writers.feature
+    },
+    CLASS_NAME: "OpenLayers.Format.OWSContext.v0_3_1"
+});
+OpenLayers.Control.ScaleLine = OpenLayers.Class(OpenLayers.Control, {
+    maxWidth: 100,
+    topOutUnits: "km",
+    topInUnits: "m",
+    bottomOutUnits: "mi",
+    bottomInUnits: "ft",
+    eTop: null,
+    eBottom: null,
+    geodesic: !1,
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        this.eTop || (this.eTop = document.createElement("div"), this.eTop.className = this.displayClass + "Top", this.div.appendChild(this.eTop), this.eTop.style.visibility = "" == this.topOutUnits || "" == this.topInUnits ? "hidden" : "visible", this.eBottom = document.createElement("div"),
+            this.eBottom.className = this.displayClass + "Bottom", this.div.appendChild(this.eBottom), this.eBottom.style.visibility = "" == this.bottomOutUnits || "" == this.bottomInUnits ? "hidden" : "visible");
+        this.map.events.register("moveend", this, this.update);
+        this.update();
+        return this.div
+    },
+    getBarLen: function(a) {
+        var b = parseInt(Math.log(a) / Math.log(10)),
+            b = Math.pow(10, b),
+            a = parseInt(a / b);
+        return (5 < a ? 5 : 2 < a ? 2 : 1) * b
+    },
+    update: function() {
+        var a = this.map.getResolution();
+        if (a) {
+            var b = this.map.getUnits(),
+                c = OpenLayers.INCHES_PER_UNIT,
+                d = this.maxWidth *
+                a * c[b],
+                e = 1;
+            !0 === this.geodesic && (e = (this.map.getGeodesicPixelSize().w || 1.0E-6) * this.maxWidth / (d / c.km), d *= e);
+            var f, g;
+            1E5 < d ? (f = this.topOutUnits, g = this.bottomOutUnits) : (f = this.topInUnits, g = this.bottomInUnits);
+            var h = d / c[f],
+                i = d / c[g],
+                d = this.getBarLen(h),
+                j = this.getBarLen(i),
+                h = d / c[b] * c[f],
+                i = j / c[b] * c[g],
+                b = h / a / e,
+                a = i / a / e;
+            "visible" == this.eBottom.style.visibility && (this.eBottom.style.width = Math.round(a) + "px", this.eBottom.innerHTML = j + " " + g);
+            "visible" == this.eTop.style.visibility && (this.eTop.style.width = Math.round(b) +
+                "px", this.eTop.innerHTML = d + " " + f)
+        }
+    },
+    CLASS_NAME: "OpenLayers.Control.ScaleLine"
+});
+OpenLayers.Icon = OpenLayers.Class({
+    url: null,
+    size: null,
+    offset: null,
+    calculateOffset: null,
+    imageDiv: null,
+    px: null,
+    initialize: function(a, b, c, d) {
+        this.url = a;
+        this.size = b || {
+            w: 20,
+            h: 20
+        };
+        this.offset = c || {
+            x: -(this.size.w / 2),
+            y: -(this.size.h / 2)
+        };
+        this.calculateOffset = d;
+        a = OpenLayers.Util.createUniqueID("OL_Icon_");
+        this.imageDiv = OpenLayers.Util.createAlphaImageDiv(a)
+    },
+    destroy: function() {
+        this.erase();
+        OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild);
+        this.imageDiv.innerHTML = "";
+        this.imageDiv = null
+    },
+    clone: function() {
+        return new OpenLayers.Icon(this.url,
+            this.size, this.offset, this.calculateOffset)
+    },
+    setSize: function(a) {
+        null != a && (this.size = a);
+        this.draw()
+    },
+    setUrl: function(a) {
+        null != a && (this.url = a);
+        this.draw()
+    },
+    draw: function(a) {
+        OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, this.size, this.url, "absolute");
+        this.moveTo(a);
+        return this.imageDiv
+    },
+    erase: function() {
+        null != this.imageDiv && null != this.imageDiv.parentNode && OpenLayers.Element.remove(this.imageDiv)
+    },
+    setOpacity: function(a) {
+        OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, null, null,
+            null, null, null, a)
+    },
+    moveTo: function(a) {
+        null != a && (this.px = a);
+        null != this.imageDiv && (null == this.px ? this.display(!1) : (this.calculateOffset && (this.offset = this.calculateOffset(this.size)), OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, {
+            x: this.px.x + this.offset.x,
+            y: this.px.y + this.offset.y
+        })))
+    },
+    display: function(a) {
+        this.imageDiv.style.display = a ? "" : "none"
+    },
+    isDrawn: function() {
+        return this.imageDiv && this.imageDiv.parentNode && 11 != this.imageDiv.parentNode.nodeType
+    },
+    CLASS_NAME: "OpenLayers.Icon"
+});
+OpenLayers.Marker = OpenLayers.Class({
+    icon: null,
+    lonlat: null,
+    events: null,
+    map: null,
+    initialize: function(a, b) {
+        this.lonlat = a;
+        var c = b ? b : OpenLayers.Marker.defaultIcon();
+        null == this.icon ? this.icon = c : (this.icon.url = c.url, this.icon.size = c.size, this.icon.offset = c.offset, this.icon.calculateOffset = c.calculateOffset);
+        this.events = new OpenLayers.Events(this, this.icon.imageDiv)
+    },
+    destroy: function() {
+        this.erase();
+        this.map = null;
+        this.events.destroy();
+        this.events = null;
+        null != this.icon && (this.icon.destroy(), this.icon = null)
+    },
+    draw: function(a) {
+        return this.icon.draw(a)
+    },
+    erase: function() {
+        null != this.icon && this.icon.erase()
+    },
+    moveTo: function(a) {
+        null != a && null != this.icon && this.icon.moveTo(a);
+        this.lonlat = this.map.getLonLatFromLayerPx(a)
+    },
+    isDrawn: function() {
+        return this.icon && this.icon.isDrawn()
+    },
+    onScreen: function() {
+        var a = !1;
+        this.map && (a = this.map.getExtent().containsLonLat(this.lonlat));
+        return a
+    },
+    inflate: function(a) {
+        this.icon && this.icon.setSize({
+            w: this.icon.size.w * a,
+            h: this.icon.size.h * a
+        })
+    },
+    setOpacity: function(a) {
+        this.icon.setOpacity(a)
+    },
+    setUrl: function(a) {
+        this.icon.setUrl(a)
+    },
+    display: function(a) {
+        this.icon.display(a)
+    },
+    CLASS_NAME: "OpenLayers.Marker"
+});
+OpenLayers.Marker.defaultIcon = function() {
+    return new OpenLayers.Icon(OpenLayers.Util.getImageLocation("marker.png"), {
+        w: 21,
+        h: 25
+    }, {
+        x: -10.5,
+        y: -25
+    })
+};
+OpenLayers.Layer.TileCache = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    isBaseLayer: !0,
+    format: "image/png",
+    serverResolutions: null,
+    initialize: function(a, b, c, d) {
+        this.layername = c;
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a, b, {}, d]);
+        this.extension = this.format.split("/")[1].toLowerCase();
+        this.extension = "jpg" == this.extension ? "jpeg" : this.extension
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.TileCache(this.name, this.url, this.layername, this.getOptions()));
+        return a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+    },
+    getURL: function(a) {
+        function b(a, b) {
+            for (var a = "" + a, c = [], d = 0; d < b; ++d) c.push("0");
+            return c.join("").substring(0, b - a.length) + a
+        }
+        var c = this.getServerResolution(),
+            d = this.maxExtent,
+            e = this.tileSize,
+            f = Math.round((a.left - d.left) / (c * e.w)),
+            a = Math.round((a.bottom - d.bottom) / (c * e.h)),
+            c = null != this.serverResolutions ? OpenLayers.Util.indexOf(this.serverResolutions, c) : this.map.getZoom(),
+            f = [this.layername, b(c, 2), b(parseInt(f / 1E6), 3), b(parseInt(f / 1E3) % 1E3, 3), b(parseInt(f) % 1E3, 3), b(parseInt(a / 1E6), 3), b(parseInt(a /
+                1E3) % 1E3, 3), b(parseInt(a) % 1E3, 3) + "." + this.extension].join("/"),
+            c = this.url;
+        OpenLayers.Util.isArray(c) && (c = this.selectUrl(f, c));
+        c = "/" == c.charAt(c.length - 1) ? c : c + "/";
+        return c + f
+    },
+    CLASS_NAME: "OpenLayers.Layer.TileCache"
+});
+OpenLayers.Layer.KaMap = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    isBaseLayer: !0,
+    DEFAULT_PARAMS: {
+        i: "jpeg",
+        map: ""
+    },
+    initialize: function(a, b, c, d) {
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, arguments);
+        this.params = OpenLayers.Util.applyDefaults(this.params, this.DEFAULT_PARAMS)
+    },
+    getURL: function(a) {
+        var a = this.adjustBounds(a),
+            b = this.map.getResolution(),
+            c = Math.round(1E4 * this.map.getScale()) / 1E4,
+            d = Math.round(a.left / b);
+        return this.getFullRequestString({
+            t: -Math.round(a.top / b),
+            l: d,
+            s: c
+        })
+    },
+    calculateGridLayout: function(a,
+        b, c) {
+        var b = c * this.tileSize.w,
+            c = c * this.tileSize.h,
+            d = a.left,
+            e = Math.floor(d / b) - this.buffer,
+            d = -(d / b - e) * this.tileSize.w,
+            e = e * b,
+            a = a.top,
+            f = Math.ceil(a / c) + this.buffer;
+        return {
+            tilelon: b,
+            tilelat: c,
+            tileoffsetlon: e,
+            tileoffsetlat: f * c,
+            tileoffsetx: d,
+            tileoffsety: -(f - a / c + 1) * this.tileSize.h
+        }
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.KaMap(this.name, this.url, this.params, this.getOptions()));
+        a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a]);
+        null != this.tileSize && (a.tileSize = this.tileSize.clone());
+        a.grid = [];
+        return a
+    },
+    getTileBounds: function(a) {
+        var b = this.getResolution(),
+            c = b * this.tileSize.w,
+            b = b * this.tileSize.h,
+            d = this.getLonLatFromViewPortPx(a),
+            a = c * Math.floor(d.lon / c),
+            d = b * Math.floor(d.lat / b);
+        return new OpenLayers.Bounds(a, d, a + c, d + b)
+    },
+    CLASS_NAME: "OpenLayers.Layer.KaMap"
+});
+OpenLayers.Control.TransformFeature = OpenLayers.Class(OpenLayers.Control, {
+    geometryTypes: null,
+    layer: null,
+    preserveAspectRatio: !1,
+    rotate: !0,
+    feature: null,
+    renderIntent: "temporary",
+    rotationHandleSymbolizer: null,
+    box: null,
+    center: null,
+    scale: 1,
+    ratio: 1,
+    rotation: 0,
+    handles: null,
+    rotationHandles: null,
+    dragControl: null,
+    irregular: !1,
+    initialize: function(a, b) {
+        OpenLayers.Control.prototype.initialize.apply(this, [b]);
+        this.layer = a;
+        this.rotationHandleSymbolizer || (this.rotationHandleSymbolizer = {
+            stroke: !1,
+            pointRadius: 10,
+            fillOpacity: 0,
+            cursor: "pointer"
+        });
+        this.createBox();
+        this.createControl()
+    },
+    activate: function() {
+        var a = !1;
+        OpenLayers.Control.prototype.activate.apply(this, arguments) && (this.dragControl.activate(), this.layer.addFeatures([this.box]), this.rotate && this.layer.addFeatures(this.rotationHandles), this.layer.addFeatures(this.handles), a = !0);
+        return a
+    },
+    deactivate: function() {
+        var a = !1;
+        OpenLayers.Control.prototype.deactivate.apply(this, arguments) && (this.layer.removeFeatures(this.handles), this.rotate && this.layer.removeFeatures(this.rotationHandles),
+            this.layer.removeFeatures([this.box]), this.dragControl.deactivate(), a = !0);
+        return a
+    },
+    setMap: function(a) {
+        this.dragControl.setMap(a);
+        OpenLayers.Control.prototype.setMap.apply(this, arguments)
+    },
+    setFeature: function(a, b) {
+        var b = OpenLayers.Util.applyDefaults(b, {
+                rotation: 0,
+                scale: 1,
+                ratio: 1
+            }),
+            c = this.rotation,
+            d = this.center;
+        OpenLayers.Util.extend(this, b);
+        if (!1 !== this.events.triggerEvent("beforesetfeature", {
+                feature: a
+            })) {
+            this.feature = a;
+            this.activate();
+            this._setfeature = !0;
+            var e = this.feature.geometry.getBounds();
+            this.box.move(e.getCenterLonLat());
+            this.box.geometry.rotate(-c, d);
+            this._angle = 0;
+            this.rotation ? (c = a.geometry.clone(), c.rotate(-this.rotation, this.center), c = new OpenLayers.Feature.Vector(c.getBounds().toGeometry()), c.geometry.rotate(this.rotation, this.center), this.box.geometry.rotate(this.rotation, this.center), this.box.move(c.geometry.getBounds().getCenterLonLat()), c = c.geometry.components[0].components[0].getBounds().getCenterLonLat()) : c = new OpenLayers.LonLat(e.left, e.bottom);
+            this.handles[0].move(c);
+            delete this._setfeature;
+            this.events.triggerEvent("setfeature", {
+                feature: a
+            })
+        }
+    },
+    unsetFeature: function() {
+        this.active ? this.deactivate() : (this.feature = null, this.rotation = 0, this.ratio = this.scale = 1)
+    },
+    createBox: function() {
+        var a = this;
+        this.center = new OpenLayers.Geometry.Point(0, 0);
+        this.box = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString([new OpenLayers.Geometry.Point(-1, -1), new OpenLayers.Geometry.Point(0, -1), new OpenLayers.Geometry.Point(1, -1), new OpenLayers.Geometry.Point(1, 0), new OpenLayers.Geometry.Point(1, 1), new OpenLayers.Geometry.Point(0, 1), new OpenLayers.Geometry.Point(-1,
+            1), new OpenLayers.Geometry.Point(-1, 0), new OpenLayers.Geometry.Point(-1, -1)]), null, "string" == typeof this.renderIntent ? null : this.renderIntent);
+        this.box.geometry.move = function(b, c) {
+            a._moving = !0;
+            OpenLayers.Geometry.LineString.prototype.move.apply(this, arguments);
+            a.center.move(b, c);
+            delete a._moving
+        };
+        for (var b = function(a, b) {
+                OpenLayers.Geometry.Point.prototype.move.apply(this, arguments);
+                this._rotationHandle && this._rotationHandle.geometry.move(a, b);
+                this._handle.geometry.move(a, b)
+            }, c = function(a, b, c) {
+                OpenLayers.Geometry.Point.prototype.resize.apply(this,
+                    arguments);
+                this._rotationHandle && this._rotationHandle.geometry.resize(a, b, c);
+                this._handle.geometry.resize(a, b, c)
+            }, d = function(a, b) {
+                OpenLayers.Geometry.Point.prototype.rotate.apply(this, arguments);
+                this._rotationHandle && this._rotationHandle.geometry.rotate(a, b);
+                this._handle.geometry.rotate(a, b)
+            }, e = function(b, c) {
+                var d = this.x,
+                    e = this.y;
+                OpenLayers.Geometry.Point.prototype.move.call(this, b, c);
+                if (!a._moving) {
+                    var f = a.dragControl.handlers.drag.evt,
+                        g = !(!a._setfeature && a.preserveAspectRatio) && !(f && f.shiftKey),
+                        h = new OpenLayers.Geometry.Point(d, e),
+                        f = a.center;
+                    this.rotate(-a.rotation, f);
+                    h.rotate(-a.rotation, f);
+                    var i = this.x - f.x,
+                        j = this.y - f.y,
+                        k = i - (this.x - h.x),
+                        l = j - (this.y - h.y);
+                    a.irregular && !a._setfeature && (i -= (this.x - h.x) / 2, j -= (this.y - h.y) / 2);
+                    this.x = d;
+                    this.y = e;
+                    h = 1;
+                    g ? (j = 1.0E-5 > Math.abs(l) ? 1 : j / l, h = (1.0E-5 > Math.abs(k) ? 1 : i / k) / j) : (k = Math.sqrt(k * k + l * l), j = Math.sqrt(i * i + j * j) / k);
+                    a._moving = !0;
+                    a.box.geometry.rotate(-a.rotation, f);
+                    delete a._moving;
+                    a.box.geometry.resize(j, f, h);
+                    a.box.geometry.rotate(a.rotation, f);
+                    a.transformFeature({
+                        scale: j,
+                        ratio: h
+                    });
+                    a.irregular && !a._setfeature && (i = f.clone(), i.x += 1.0E-5 > Math.abs(d - f.x) ? 0 : this.x - d, i.y += 1.0E-5 > Math.abs(e - f.y) ? 0 : this.y - e, a.box.geometry.move(this.x - d, this.y - e), a.transformFeature({
+                        center: i
+                    }))
+                }
+            }, f = function(b, c) {
+                var d = this.x,
+                    e = this.y;
+                OpenLayers.Geometry.Point.prototype.move.call(this, b, c);
+                if (!a._moving) {
+                    var f = a.dragControl.handlers.drag.evt,
+                        f = f && f.shiftKey ? 45 : 1,
+                        g = a.center,
+                        h = this.x - g.x,
+                        i = this.y - g.y;
+                    this.x = d;
+                    this.y = e;
+                    d = Math.atan2(i - c, h - b);
+                    d = Math.atan2(i, h) - d;
+                    d *= 180 / Math.PI;
+                    a._angle = (a._angle +
+                        d) % 360;
+                    d = a.rotation % f;
+                    if (Math.abs(a._angle) >= f || 0 !== d) d = Math.round(a._angle / f) * f - d, a._angle = 0, a.box.geometry.rotate(d, g), a.transformFeature({
+                        rotation: d
+                    })
+                }
+            }, g = Array(8), h = Array(4), i, j, k, l = "sw s se e ne n nw w".split(" "), m = 0; 8 > m; ++m) i = this.box.geometry.components[m], j = new OpenLayers.Feature.Vector(i.clone(), {
+            role: l[m] + "-resize"
+        }, "string" == typeof this.renderIntent ? null : this.renderIntent), 0 == m % 2 && (k = new OpenLayers.Feature.Vector(i.clone(), {
+                role: l[m] + "-rotate"
+            }, "string" == typeof this.rotationHandleSymbolizer ?
+            null : this.rotationHandleSymbolizer), k.geometry.move = f, i._rotationHandle = k, h[m / 2] = k), i.move = b, i.resize = c, i.rotate = d, j.geometry.move = e, i._handle = j, g[m] = j;
+        this.rotationHandles = h;
+        this.handles = g
+    },
+    createControl: function() {
+        var a = this;
+        this.dragControl = new OpenLayers.Control.DragFeature(this.layer, {
+            documentDrag: !0,
+            moveFeature: function(b) {
+                this.feature === a.feature && (this.feature = a.box);
+                OpenLayers.Control.DragFeature.prototype.moveFeature.apply(this, arguments)
+            },
+            onDrag: function(b) {
+                b === a.box && a.transformFeature({
+                    center: a.center
+                })
+            },
+            onStart: function(b) {
+                var c = !a.geometryTypes || -1 !== OpenLayers.Util.indexOf(a.geometryTypes, b.geometry.CLASS_NAME),
+                    d = OpenLayers.Util.indexOf(a.handles, b),
+                    d = d + OpenLayers.Util.indexOf(a.rotationHandles, b);
+                b !== a.feature && (b !== a.box && -2 == d && c) && a.setFeature(b)
+            },
+            onComplete: function() {
+                a.events.triggerEvent("transformcomplete", {
+                    feature: a.feature
+                })
+            }
+        })
+    },
+    drawHandles: function() {
+        for (var a = this.layer, b = 0; 8 > b; ++b) this.rotate && 0 === b % 2 && a.drawFeature(this.rotationHandles[b / 2], this.rotationHandleSymbolizer), a.drawFeature(this.handles[b],
+            this.renderIntent)
+    },
+    transformFeature: function(a) {
+        if (!this._setfeature) {
+            this.scale *= a.scale || 1;
+            this.ratio *= a.ratio || 1;
+            var b = this.rotation;
+            this.rotation = (this.rotation + (a.rotation || 0)) % 360;
+            if (!1 !== this.events.triggerEvent("beforetransform", a)) {
+                var c = this.feature,
+                    d = c.geometry,
+                    e = this.center;
+                d.rotate(-b, e);
+                a.scale || a.ratio ? d.resize(a.scale, e, a.ratio) : a.center && c.move(a.center.getBounds().getCenterLonLat());
+                d.rotate(this.rotation, e);
+                this.layer.drawFeature(c);
+                c.toState(OpenLayers.State.UPDATE);
+                this.events.triggerEvent("transform",
+                    a)
+            }
+        }
+        this.layer.drawFeature(this.box, this.renderIntent);
+        this.drawHandles()
+    },
+    destroy: function() {
+        for (var a, b = 0; 8 > b; ++b) a = this.box.geometry.components[b], a._handle.destroy(), a._handle = null, a._rotationHandle && a._rotationHandle.destroy(), a._rotationHandle = null;
+        this.rotationHandles = this.rotationHandleSymbolizer = this.handles = this.feature = this.center = null;
+        this.box.destroy();
+        this.layer = this.box = null;
+        this.dragControl.destroy();
+        this.dragControl = null;
+        OpenLayers.Control.prototype.destroy.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Control.TransformFeature"
+});
+OpenLayers.Handler.Box = OpenLayers.Class(OpenLayers.Handler, {
+    dragHandler: null,
+    boxDivClassName: "olHandlerBoxZoomBox",
+    boxOffsets: null,
+    initialize: function(a, b, c) {
+        OpenLayers.Handler.prototype.initialize.apply(this, arguments);
+        this.dragHandler = new OpenLayers.Handler.Drag(this, {
+            down: this.startBox,
+            move: this.moveBox,
+            out: this.removeBox,
+            up: this.endBox
+        }, {
+            keyMask: this.keyMask
+        })
+    },
+    destroy: function() {
+        OpenLayers.Handler.prototype.destroy.apply(this, arguments);
+        this.dragHandler && (this.dragHandler.destroy(), this.dragHandler =
+            null)
+    },
+    setMap: function(a) {
+        OpenLayers.Handler.prototype.setMap.apply(this, arguments);
+        this.dragHandler && this.dragHandler.setMap(a)
+    },
+    startBox: function() {
+        this.callback("start", []);
+        this.zoomBox = OpenLayers.Util.createDiv("zoomBox", {
+            x: -9999,
+            y: -9999
+        });
+        this.zoomBox.className = this.boxDivClassName;
+        this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE.Popup - 1;
+        this.map.viewPortDiv.appendChild(this.zoomBox);
+        OpenLayers.Element.addClass(this.map.viewPortDiv, "olDrawBox")
+    },
+    moveBox: function(a) {
+        var b = this.dragHandler.start.x,
+            c = this.dragHandler.start.y,
+            d = Math.abs(b - a.x),
+            e = Math.abs(c - a.y),
+            f = this.getBoxOffsets();
+        this.zoomBox.style.width = d + f.width + 1 + "px";
+        this.zoomBox.style.height = e + f.height + 1 + "px";
+        this.zoomBox.style.left = (a.x < b ? b - d - f.left : b - f.left) + "px";
+        this.zoomBox.style.top = (a.y < c ? c - e - f.top : c - f.top) + "px"
+    },
+    endBox: function(a) {
+        var b;
+        if (5 < Math.abs(this.dragHandler.start.x - a.x) || 5 < Math.abs(this.dragHandler.start.y - a.y)) {
+            var c = this.dragHandler.start;
+            b = Math.min(c.y, a.y);
+            var d = Math.max(c.y, a.y),
+                e = Math.min(c.x, a.x),
+                a = Math.max(c.x,
+                    a.x);
+            b = new OpenLayers.Bounds(e, d, a, b)
+        } else b = this.dragHandler.start.clone();
+        this.removeBox();
+        this.callback("done", [b])
+    },
+    removeBox: function() {
+        this.map.viewPortDiv.removeChild(this.zoomBox);
+        this.boxOffsets = this.zoomBox = null;
+        OpenLayers.Element.removeClass(this.map.viewPortDiv, "olDrawBox")
+    },
+    activate: function() {
+        return OpenLayers.Handler.prototype.activate.apply(this, arguments) ? (this.dragHandler.activate(), !0) : !1
+    },
+    deactivate: function() {
+        return OpenLayers.Handler.prototype.deactivate.apply(this, arguments) ?
+            (this.dragHandler.deactivate() && this.zoomBox && this.removeBox(), !0) : !1
+    },
+    getBoxOffsets: function() {
+        if (!this.boxOffsets) {
+            var a = document.createElement("div");
+            a.style.position = "absolute";
+            a.style.border = "1px solid black";
+            a.style.width = "3px";
+            document.body.appendChild(a);
+            var b = 3 == a.clientWidth;
+            document.body.removeChild(a);
+            var a = parseInt(OpenLayers.Element.getStyle(this.zoomBox, "border-left-width")),
+                c = parseInt(OpenLayers.Element.getStyle(this.zoomBox, "border-right-width")),
+                d = parseInt(OpenLayers.Element.getStyle(this.zoomBox,
+                    "border-top-width")),
+                e = parseInt(OpenLayers.Element.getStyle(this.zoomBox, "border-bottom-width"));
+            this.boxOffsets = {
+                left: a,
+                right: c,
+                top: d,
+                bottom: e,
+                width: !1 === b ? a + c : 0,
+                height: !1 === b ? d + e : 0
+            }
+        }
+        return this.boxOffsets
+    },
+    CLASS_NAME: "OpenLayers.Handler.Box"
+});
+OpenLayers.Control.ZoomBox = OpenLayers.Class(OpenLayers.Control, {
+    type: OpenLayers.Control.TYPE_TOOL,
+    out: !1,
+    keyMask: null,
+    alwaysZoom: !1,
+    draw: function() {
+        this.handler = new OpenLayers.Handler.Box(this, {
+            done: this.zoomBox
+        }, {
+            keyMask: this.keyMask
+        })
+    },
+    zoomBox: function(a) {
+        if (a instanceof OpenLayers.Bounds) {
+            var b;
+            if (this.out) {
+                b = Math.abs(a.right - a.left);
+                var c = Math.abs(a.top - a.bottom);
+                b = Math.min(this.map.size.h / c, this.map.size.w / b);
+                var c = this.map.getExtent(),
+                    d = this.map.getLonLatFromPixel(a.getCenterPixel()),
+                    a = d.lon -
+                    c.getWidth() / 2 * b,
+                    e = d.lon + c.getWidth() / 2 * b,
+                    f = d.lat - c.getHeight() / 2 * b;
+                b = d.lat + c.getHeight() / 2 * b;
+                b = new OpenLayers.Bounds(a, f, e, b)
+            } else b = this.map.getLonLatFromPixel({
+                x: a.left,
+                y: a.bottom
+            }), c = this.map.getLonLatFromPixel({
+                x: a.right,
+                y: a.top
+            }), b = new OpenLayers.Bounds(b.lon, b.lat, c.lon, c.lat);
+            c = this.map.getZoom();
+            this.map.zoomToExtent(b);
+            c == this.map.getZoom() && !0 == this.alwaysZoom && this.map.zoomTo(c + (this.out ? -1 : 1))
+        } else this.out ? this.map.setCenter(this.map.getLonLatFromPixel(a), this.map.getZoom() - 1) : this.map.setCenter(this.map.getLonLatFromPixel(a),
+            this.map.getZoom() + 1)
+    },
+    CLASS_NAME: "OpenLayers.Control.ZoomBox"
+});
+OpenLayers.Control.DragPan = OpenLayers.Class(OpenLayers.Control, {
+    type: OpenLayers.Control.TYPE_TOOL,
+    panned: !1,
+    interval: 1,
+    documentDrag: !1,
+    kinetic: null,
+    enableKinetic: !1,
+    kineticInterval: 10,
+    draw: function() {
+        if (this.enableKinetic) {
+            var a = {
+                interval: this.kineticInterval
+            };
+            "object" === typeof this.enableKinetic && (a = OpenLayers.Util.extend(a, this.enableKinetic));
+            this.kinetic = new OpenLayers.Kinetic(a)
+        }
+        this.handler = new OpenLayers.Handler.Drag(this, {
+            move: this.panMap,
+            done: this.panMapDone,
+            down: this.panMapStart
+        }, {
+            interval: this.interval,
+            documentDrag: this.documentDrag
+        })
+    },
+    panMapStart: function() {
+        this.kinetic && this.kinetic.begin()
+    },
+    panMap: function(a) {
+        this.kinetic && this.kinetic.update(a);
+        this.panned = !0;
+        this.map.pan(this.handler.last.x - a.x, this.handler.last.y - a.y, {
+            dragging: !0,
+            animate: !1
+        })
+    },
+    panMapDone: function(a) {
+        if (this.panned) {
+            var b = null;
+            this.kinetic && (b = this.kinetic.end(a));
+            this.map.pan(this.handler.last.x - a.x, this.handler.last.y - a.y, {
+                dragging: !!b,
+                animate: !1
+            });
+            if (b) {
+                var c = this;
+                this.kinetic.move(b, function(a, b, f) {
+                    c.map.pan(a, b, {
+                        dragging: !f,
+                        animate: !1
+                    })
+                })
+            }
+            this.panned = !1
+        }
+    },
+    CLASS_NAME: "OpenLayers.Control.DragPan"
+});
+OpenLayers.Handler.Click = OpenLayers.Class(OpenLayers.Handler, {
+    delay: 300,
+    single: !0,
+    "double": !1,
+    pixelTolerance: 0,
+    dblclickTolerance: 13,
+    stopSingle: !1,
+    stopDouble: !1,
+    timerId: null,
+    touch: !1,
+    down: null,
+    last: null,
+    first: null,
+    rightclickTimerId: null,
+    touchstart: function(a) {
+        this.touch || (this.unregisterMouseListeners(), this.touch = !0);
+        this.down = this.getEventInfo(a);
+        this.last = this.getEventInfo(a);
+        return !0
+    },
+    touchmove: function(a) {
+        this.last = this.getEventInfo(a);
+        return !0
+    },
+    touchend: function(a) {
+        this.down && (a.xy = this.last.xy,
+            a.lastTouches = this.last.touches, this.handleSingle(a), this.down = null);
+        return !0
+    },
+    unregisterMouseListeners: function() {
+        this.map.events.un({
+            mousedown: this.mousedown,
+            mouseup: this.mouseup,
+            click: this.click,
+            dblclick: this.dblclick,
+            scope: this
+        })
+    },
+    mousedown: function(a) {
+        this.down = this.getEventInfo(a);
+        this.last = this.getEventInfo(a);
+        return !0
+    },
+    mouseup: function(a) {
+        var b = !0;
+        this.checkModifiers(a) && (this.control.handleRightClicks && OpenLayers.Event.isRightClick(a)) && (b = this.rightclick(a));
+        return b
+    },
+    rightclick: function(a) {
+        if (this.passesTolerance(a)) {
+            if (null !=
+                this.rightclickTimerId) return this.clearTimer(), this.callback("dblrightclick", [a]), !this.stopDouble;
+            a = this["double"] ? OpenLayers.Util.extend({}, a) : this.callback("rightclick", [a]);
+            a = OpenLayers.Function.bind(this.delayedRightCall, this, a);
+            this.rightclickTimerId = window.setTimeout(a, this.delay)
+        }
+        return !this.stopSingle
+    },
+    delayedRightCall: function(a) {
+        this.rightclickTimerId = null;
+        a && this.callback("rightclick", [a])
+    },
+    click: function(a) {
+        this.last || (this.last = this.getEventInfo(a));
+        this.handleSingle(a);
+        return !this.stopSingle
+    },
+    dblclick: function(a) {
+        this.handleDouble(a);
+        return !this.stopDouble
+    },
+    handleDouble: function(a) {
+        this.passesDblclickTolerance(a) && (this["double"] && this.callback("dblclick", [a]), this.clearTimer())
+    },
+    handleSingle: function(a) {
+        this.passesTolerance(a) && (null != this.timerId ? (this.last.touches && 1 === this.last.touches.length && (this["double"] && OpenLayers.Event.stop(a), this.handleDouble(a)), (!this.last.touches || 2 !== this.last.touches.length) && this.clearTimer()) : (this.first = this.getEventInfo(a), this.queuePotentialClick(this.single ?
+            OpenLayers.Util.extend({}, a) : null)))
+    },
+    queuePotentialClick: function(a) {
+        this.timerId = window.setTimeout(OpenLayers.Function.bind(this.delayedCall, this, a), this.delay)
+    },
+    passesTolerance: function(a) {
+        var b = !0;
+        if (null != this.pixelTolerance && this.down && this.down.xy && (b = this.pixelTolerance >= this.down.xy.distanceTo(a.xy)) && this.touch && this.down.touches.length === this.last.touches.length)
+            for (var a = 0, c = this.down.touches.length; a < c; ++a)
+                if (this.getTouchDistance(this.down.touches[a], this.last.touches[a]) > this.pixelTolerance) {
+                    b = !1;
+                    break
+                }
+        return b
+    },
+    getTouchDistance: function(a, b) {
+        return Math.sqrt(Math.pow(a.clientX - b.clientX, 2) + Math.pow(a.clientY - b.clientY, 2))
+    },
+    passesDblclickTolerance: function() {
+        var a = !0;
+        this.down && this.first && (a = this.down.xy.distanceTo(this.first.xy) <= this.dblclickTolerance);
+        return a
+    },
+    clearTimer: function() {
+        null != this.timerId && (window.clearTimeout(this.timerId), this.timerId = null);
+        null != this.rightclickTimerId && (window.clearTimeout(this.rightclickTimerId), this.rightclickTimerId = null)
+    },
+    delayedCall: function(a) {
+        this.timerId =
+            null;
+        a && this.callback("click", [a])
+    },
+    getEventInfo: function(a) {
+        var b;
+        if (a.touches) {
+            var c = a.touches.length;
+            b = Array(c);
+            for (var d, e = 0; e < c; e++) d = a.touches[e], b[e] = {
+                clientX: d.clientX,
+                clientY: d.clientY
+            }
+        }
+        return {
+            xy: a.xy,
+            touches: b
+        }
+    },
+    deactivate: function() {
+        var a = !1;
+        OpenLayers.Handler.prototype.deactivate.apply(this, arguments) && (this.clearTimer(), this.last = this.first = this.down = null, this.touch = !1, a = !0);
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Handler.Click"
+});
+OpenLayers.Control.Navigation = OpenLayers.Class(OpenLayers.Control, {
+    dragPan: null,
+    dragPanOptions: null,
+    pinchZoom: null,
+    pinchZoomOptions: null,
+    documentDrag: !1,
+    zoomBox: null,
+    zoomBoxEnabled: !0,
+    zoomWheelEnabled: !0,
+    mouseWheelOptions: null,
+    handleRightClicks: !1,
+    zoomBoxKeyMask: OpenLayers.Handler.MOD_SHIFT,
+    autoActivate: !0,
+    initialize: function(a) {
+        this.handlers = {};
+        OpenLayers.Control.prototype.initialize.apply(this, arguments)
+    },
+    destroy: function() {
+        this.deactivate();
+        this.dragPan && this.dragPan.destroy();
+        this.dragPan = null;
+        this.zoomBox && this.zoomBox.destroy();
+        this.zoomBox = null;
+        this.pinchZoom && this.pinchZoom.destroy();
+        this.pinchZoom = null;
+        OpenLayers.Control.prototype.destroy.apply(this, arguments)
+    },
+    activate: function() {
+        this.dragPan.activate();
+        this.zoomWheelEnabled && this.handlers.wheel.activate();
+        this.handlers.click.activate();
+        this.zoomBoxEnabled && this.zoomBox.activate();
+        this.pinchZoom && this.pinchZoom.activate();
+        return OpenLayers.Control.prototype.activate.apply(this, arguments)
+    },
+    deactivate: function() {
+        this.pinchZoom && this.pinchZoom.deactivate();
+        this.zoomBox.deactivate();
+        this.dragPan.deactivate();
+        this.handlers.click.deactivate();
+        this.handlers.wheel.deactivate();
+        return OpenLayers.Control.prototype.deactivate.apply(this, arguments)
+    },
+    draw: function() {
+        this.handleRightClicks && (this.map.viewPortDiv.oncontextmenu = OpenLayers.Function.False);
+        this.handlers.click = new OpenLayers.Handler.Click(this, {
+            click: this.defaultClick,
+            dblclick: this.defaultDblClick,
+            dblrightclick: this.defaultDblRightClick
+        }, {
+            "double": !0,
+            stopDouble: !0
+        });
+        this.dragPan = new OpenLayers.Control.DragPan(OpenLayers.Util.extend({
+            map: this.map,
+            documentDrag: this.documentDrag
+        }, this.dragPanOptions));
+        this.zoomBox = new OpenLayers.Control.ZoomBox({
+            map: this.map,
+            keyMask: this.zoomBoxKeyMask
+        });
+        this.dragPan.draw();
+        this.zoomBox.draw();
+        this.handlers.wheel = new OpenLayers.Handler.MouseWheel(this, {
+            up: this.wheelUp,
+            down: this.wheelDown
+        }, this.mouseWheelOptions);
+        OpenLayers.Control.PinchZoom && (this.pinchZoom = new OpenLayers.Control.PinchZoom(OpenLayers.Util.extend({
+            map: this.map
+        }, this.pinchZoomOptions)))
+    },
+    defaultClick: function(a) {
+        a.lastTouches && 2 == a.lastTouches.length &&
+            this.map.zoomOut()
+    },
+    defaultDblClick: function(a) {
+        this.map.setCenter(this.map.getLonLatFromViewPortPx(a.xy), this.map.zoom + 1)
+    },
+    defaultDblRightClick: function(a) {
+        this.map.setCenter(this.map.getLonLatFromViewPortPx(a.xy), this.map.zoom - 1)
+    },
+    wheelChange: function(a, b) {
+        var c = this.map.getZoom(),
+            d = this.map.getZoom() + Math.round(b),
+            d = Math.max(d, 0),
+            d = Math.min(d, this.map.getNumZoomLevels());
+        if (d !== c) {
+            var e = this.map.getSize(),
+                c = e.w / 2 - a.xy.x,
+                e = a.xy.y - e.h / 2,
+                f = this.map.baseLayer.getResolutionForZoom(d),
+                g = this.map.getLonLatFromPixel(a.xy);
+            this.map.setCenter(new OpenLayers.LonLat(g.lon + c * f, g.lat + e * f), d)
+        }
+    },
+    wheelUp: function(a, b) {
+        this.wheelChange(a, b || 1)
+    },
+    wheelDown: function(a, b) {
+        this.wheelChange(a, b || -1)
+    },
+    disableZoomBox: function() {
+        this.zoomBoxEnabled = !1;
+        this.zoomBox.deactivate()
+    },
+    enableZoomBox: function() {
+        this.zoomBoxEnabled = !0;
+        this.active && this.zoomBox.activate()
+    },
+    disableZoomWheel: function() {
+        this.zoomWheelEnabled = !1;
+        this.handlers.wheel.deactivate()
+    },
+    enableZoomWheel: function() {
+        this.zoomWheelEnabled = !0;
+        this.active && this.handlers.wheel.activate()
+    },
+    CLASS_NAME: "OpenLayers.Control.Navigation"
+});
+OpenLayers.Control.DrawFeature = OpenLayers.Class(OpenLayers.Control, {
+    layer: null,
+    callbacks: null,
+    multi: !1,
+    featureAdded: function() {},
+    handlerOptions: null,
+    initialize: function(a, b, c) {
+        OpenLayers.Control.prototype.initialize.apply(this, [c]);
+        this.callbacks = OpenLayers.Util.extend({
+            done: this.drawFeature,
+            modify: function(a, b) {
+                this.layer.events.triggerEvent("sketchmodified", {
+                    vertex: a,
+                    feature: b
+                })
+            },
+            create: function(a, b) {
+                this.layer.events.triggerEvent("sketchstarted", {
+                    vertex: a,
+                    feature: b
+                })
+            }
+        }, this.callbacks);
+        this.layer =
+            a;
+        this.handlerOptions = this.handlerOptions || {};
+        this.handlerOptions.layerOptions = OpenLayers.Util.applyDefaults(this.handlerOptions.layerOptions, {
+            renderers: a.renderers,
+            rendererOptions: a.rendererOptions
+        });
+        "multi" in this.handlerOptions || (this.handlerOptions.multi = this.multi);
+        if (a = this.layer.styleMap && this.layer.styleMap.styles.temporary) this.handlerOptions.layerOptions = OpenLayers.Util.applyDefaults(this.handlerOptions.layerOptions, {
+            styleMap: new OpenLayers.StyleMap({
+                "default": a
+            })
+        });
+        this.handler = new b(this,
+            this.callbacks, this.handlerOptions)
+    },
+    drawFeature: function(a) {
+        a = new OpenLayers.Feature.Vector(a);
+        !1 !== this.layer.events.triggerEvent("sketchcomplete", {
+            feature: a
+        }) && (a.state = OpenLayers.State.INSERT, this.layer.addFeatures([a]), this.featureAdded(a), this.events.triggerEvent("featureadded", {
+            feature: a
+        }))
+    },
+    insertXY: function(a, b) {
+        this.handler && this.handler.line && this.handler.insertXY(a, b)
+    },
+    insertDeltaXY: function(a, b) {
+        this.handler && this.handler.line && this.handler.insertDeltaXY(a, b)
+    },
+    insertDirectionLength: function(a,
+        b) {
+        this.handler && this.handler.line && this.handler.insertDirectionLength(a, b)
+    },
+    insertDeflectionLength: function(a, b) {
+        this.handler && this.handler.line && this.handler.insertDeflectionLength(a, b)
+    },
+    undo: function() {
+        return this.handler.undo && this.handler.undo()
+    },
+    redo: function() {
+        return this.handler.redo && this.handler.redo()
+    },
+    finishSketch: function() {
+        this.handler.finishGeometry()
+    },
+    cancel: function() {
+        this.handler.cancel()
+    },
+    CLASS_NAME: "OpenLayers.Control.DrawFeature"
+});
+OpenLayers.Handler.Polygon = OpenLayers.Class(OpenLayers.Handler.Path, {
+    holeModifier: null,
+    drawingHole: !1,
+    polygon: null,
+    createFeature: function(a) {
+        a = this.layer.getLonLatFromViewPortPx(a);
+        a = new OpenLayers.Geometry.Point(a.lon, a.lat);
+        this.point = new OpenLayers.Feature.Vector(a);
+        this.line = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LinearRing([this.point.geometry]));
+        this.polygon = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon([this.line.geometry]));
+        this.callback("create", [this.point.geometry,
+            this.getSketch()
+        ]);
+        this.point.geometry.clearBounds();
+        this.layer.addFeatures([this.polygon, this.point], {
+            silent: !0
+        })
+    },
+    addPoint: function(a) {
+        if (!this.drawingHole && this.holeModifier && this.evt && this.evt[this.holeModifier])
+            for (var b = this.point.geometry, c = this.control.layer.features, d, e = c.length - 1; 0 <= e; --e)
+                if (d = c[e].geometry, (d instanceof OpenLayers.Geometry.Polygon || d instanceof OpenLayers.Geometry.MultiPolygon) && d.intersects(b)) {
+                    b = c[e];
+                    this.control.layer.removeFeatures([b], {
+                        silent: !0
+                    });
+                    this.control.layer.events.registerPriority("sketchcomplete",
+                        this, this.finalizeInteriorRing);
+                    this.control.layer.events.registerPriority("sketchmodified", this, this.enforceTopology);
+                    b.geometry.addComponent(this.line.geometry);
+                    this.polygon = b;
+                    this.drawingHole = !0;
+                    break
+                }
+        OpenLayers.Handler.Path.prototype.addPoint.apply(this, arguments)
+    },
+    getCurrentPointIndex: function() {
+        return this.line.geometry.components.length - 2
+    },
+    enforceTopology: function(a) {
+        var a = a.vertex,
+            b = this.line.geometry.components;
+        this.polygon.geometry.intersects(a) || (b = b[b.length - 3], a.x = b.x, a.y = b.y)
+    },
+    finishGeometry: function() {
+        this.line.geometry.removeComponent(this.line.geometry.components[this.line.geometry.components.length -
+            2]);
+        this.removePoint();
+        this.finalize()
+    },
+    finalizeInteriorRing: function() {
+        var a = this.line.geometry,
+            b = 0 !== a.getArea();
+        if (b) {
+            for (var c = this.polygon.geometry.components, d = c.length - 2; 0 <= d; --d)
+                if (a.intersects(c[d])) {
+                    b = !1;
+                    break
+                }
+            if (b) {
+                d = c.length - 2;
+                a: for (; 0 < d; --d)
+                    for (var e = c[d].components, f = 0, g = e.length; f < g; ++f)
+                        if (a.containsPoint(e[f])) {
+                            b = !1;
+                            break a
+                        }
+            }
+        }
+        b ? this.polygon.state !== OpenLayers.State.INSERT && (this.polygon.state = OpenLayers.State.UPDATE) : this.polygon.geometry.removeComponent(a);
+        this.restoreFeature();
+        return !1
+    },
+    cancel: function() {
+        this.drawingHole && (this.polygon.geometry.removeComponent(this.line.geometry), this.restoreFeature(!0));
+        return OpenLayers.Handler.Path.prototype.cancel.apply(this, arguments)
+    },
+    restoreFeature: function(a) {
+        this.control.layer.events.unregister("sketchcomplete", this, this.finalizeInteriorRing);
+        this.control.layer.events.unregister("sketchmodified", this, this.enforceTopology);
+        this.layer.removeFeatures([this.polygon], {
+            silent: !0
+        });
+        this.control.layer.addFeatures([this.polygon], {
+            silent: !0
+        });
+        this.drawingHole = !1;
+        a || this.control.layer.events.triggerEvent("sketchcomplete", {
+            feature: this.polygon
+        })
+    },
+    destroyFeature: function(a) {
+        OpenLayers.Handler.Path.prototype.destroyFeature.call(this, a);
+        this.polygon = null
+    },
+    drawFeature: function() {
+        this.layer.drawFeature(this.polygon, this.style);
+        this.layer.drawFeature(this.point, this.style)
+    },
+    getSketch: function() {
+        return this.polygon
+    },
+    getGeometry: function() {
+        var a = this.polygon && this.polygon.geometry;
+        a && this.multi && (a = new OpenLayers.Geometry.MultiPolygon([a]));
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Handler.Polygon"
+});
+OpenLayers.Control.EditingToolbar = OpenLayers.Class(OpenLayers.Control.Panel, {
+    citeCompliant: !1,
+    initialize: function(a, b) {
+        OpenLayers.Control.Panel.prototype.initialize.apply(this, [b]);
+        this.addControls([new OpenLayers.Control.Navigation]);
+        this.addControls([new OpenLayers.Control.DrawFeature(a, OpenLayers.Handler.Point, {
+            displayClass: "olControlDrawFeaturePoint",
+            handlerOptions: {
+                citeCompliant: this.citeCompliant
+            }
+        }), new OpenLayers.Control.DrawFeature(a, OpenLayers.Handler.Path, {
+            displayClass: "olControlDrawFeaturePath",
+            handlerOptions: {
+                citeCompliant: this.citeCompliant
+            }
+        }), new OpenLayers.Control.DrawFeature(a, OpenLayers.Handler.Polygon, {
+            displayClass: "olControlDrawFeaturePolygon",
+            handlerOptions: {
+                citeCompliant: this.citeCompliant
+            }
+        })])
+    },
+    draw: function() {
+        var a = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments);
+        null === this.defaultControl && (this.defaultControl = this.controls[0]);
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Control.EditingToolbar"
+});
+OpenLayers.Strategy.BBOX = OpenLayers.Class(OpenLayers.Strategy, {
+    bounds: null,
+    resolution: null,
+    ratio: 2,
+    resFactor: null,
+    response: null,
+    activate: function() {
+        var a = OpenLayers.Strategy.prototype.activate.call(this);
+        a && (this.layer.events.on({
+            moveend: this.update,
+            refresh: this.update,
+            visibilitychanged: this.update,
+            scope: this
+        }), this.update());
+        return a
+    },
+    deactivate: function() {
+        var a = OpenLayers.Strategy.prototype.deactivate.call(this);
+        a && this.layer.events.un({
+            moveend: this.update,
+            refresh: this.update,
+            visibilitychanged: this.update,
+            scope: this
+        });
+        return a
+    },
+    update: function(a) {
+        var b = this.getMapBounds();
+        if (null !== b && (a && a.force || this.layer.visibility && this.layer.calculateInRange() && this.invalidBounds(b))) this.calculateBounds(b), this.resolution = this.layer.map.getResolution(), this.triggerRead(a)
+    },
+    getMapBounds: function() {
+        if (null === this.layer.map) return null;
+        var a = this.layer.map.getExtent();
+        a && !this.layer.projection.equals(this.layer.map.getProjectionObject()) && (a = a.clone().transform(this.layer.map.getProjectionObject(), this.layer.projection));
+        return a
+    },
+    invalidBounds: function(a) {
+        a || (a = this.getMapBounds());
+        a = !this.bounds || !this.bounds.containsBounds(a);
+        !a && this.resFactor && (a = this.resolution / this.layer.map.getResolution(), a = a >= this.resFactor || a <= 1 / this.resFactor);
+        return a
+    },
+    calculateBounds: function(a) {
+        a || (a = this.getMapBounds());
+        var b = a.getCenterLonLat(),
+            c = a.getWidth() * this.ratio,
+            a = a.getHeight() * this.ratio;
+        this.bounds = new OpenLayers.Bounds(b.lon - c / 2, b.lat - a / 2, b.lon + c / 2, b.lat + a / 2)
+    },
+    triggerRead: function(a) {
+        this.response && !(a && !0 === a.noAbort) &&
+            (this.layer.protocol.abort(this.response), this.layer.events.triggerEvent("loadend"));
+        this.layer.events.triggerEvent("loadstart");
+        this.response = this.layer.protocol.read(OpenLayers.Util.applyDefaults({
+            filter: this.createFilter(),
+            callback: this.merge,
+            scope: this
+        }, a))
+    },
+    createFilter: function() {
+        var a = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            value: this.bounds,
+            projection: this.layer.projection
+        });
+        this.layer.filter && (a = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.AND,
+            filters: [this.layer.filter, a]
+        }));
+        return a
+    },
+    merge: function(a) {
+        this.layer.destroyFeatures();
+        if ((a = a.features) && 0 < a.length) {
+            var b = this.layer.projection,
+                c = this.layer.map.getProjectionObject();
+            if (!c.equals(b))
+                for (var d, e = 0, f = a.length; e < f; ++e)(d = a[e].geometry) && d.transform(b, c);
+            this.layer.addFeatures(a)
+        }
+        this.response = null;
+        this.layer.events.triggerEvent("loadend")
+    },
+    CLASS_NAME: "OpenLayers.Strategy.BBOX"
+});
+OpenLayers.Layer.WorldWind = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    DEFAULT_PARAMS: {},
+    isBaseLayer: !0,
+    lzd: null,
+    zoomLevels: null,
+    initialize: function(a, b, c, d, e, f) {
+        this.lzd = c;
+        this.zoomLevels = d;
+        c = [];
+        c.push(a, b, e, f);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, c);
+        this.params = OpenLayers.Util.applyDefaults(this.params, this.DEFAULT_PARAMS)
+    },
+    getZoom: function() {
+        var a = this.map.getZoom();
+        this.map.getMaxExtent();
+        return a -= Math.log(this.maxResolution / (this.lzd / 512)) / Math.log(2)
+    },
+    getURL: function(a) {
+        var a =
+            this.adjustBounds(a),
+            b = this.getZoom(),
+            c = this.map.getMaxExtent(),
+            d = this.lzd / Math.pow(2, this.getZoom()),
+            e = Math.floor((a.left - c.left) / d),
+            a = Math.floor((a.bottom - c.bottom) / d);
+        return this.map.getResolution() <= this.lzd / 512 && this.getZoom() <= this.zoomLevels ? this.getFullRequestString({
+            L: b,
+            X: e,
+            Y: a
+        }) : OpenLayers.Util.getImageLocation("blank.gif")
+    },
+    CLASS_NAME: "OpenLayers.Layer.WorldWind"
+});
+OpenLayers.Protocol.CSW = function(a) {
+    var a = OpenLayers.Util.applyDefaults(a, OpenLayers.Protocol.CSW.DEFAULTS),
+        b = OpenLayers.Protocol.CSW["v" + a.version.replace(/\./g, "_")];
+    if (!b) throw "Unsupported CSW version: " + a.version;
+    return new b(a)
+};
+OpenLayers.Protocol.CSW.DEFAULTS = {
+    version: "2.0.2"
+};
+OpenLayers.Format.WMTSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+    defaultVersion: "1.0.0",
+    yx: {
+        "urn:ogc:def:crs:EPSG::4326": !0
+    },
+    createLayer: function(a, b) {
+        var c, d = {
+                layer: !0,
+                matrixSet: !0
+            },
+            e;
+        for (e in d)
+            if (!(e in b)) throw Error("Missing property '" + e + "' in layer configuration.");
+        d = a.contents;
+        e = d.tileMatrixSets[b.matrixSet];
+        for (var f, g = 0, h = d.layers.length; g < h; ++g)
+            if (d.layers[g].identifier === b.layer) {
+                f = d.layers[g];
+                break
+            }
+        if (f && e) {
+            for (var i, g = 0, h = f.styles.length; g < h && !(i = f.styles[g], i.isDefault); ++g);
+            c = new OpenLayers.Layer.WMTS(OpenLayers.Util.applyDefaults(b, {
+                url: "REST" === b.requestEncoding && f.resourceUrl ? f.resourceUrl.tile.template : a.operationsMetadata.GetTile.dcp.http.get[0].url,
+                name: f.title,
+                style: i.identifier,
+                matrixIds: e.matrixIds,
+                tileFullExtent: e.bounds
+            }))
+        }
+        return c
+    },
+    CLASS_NAME: "OpenLayers.Format.WMTSCapabilities"
+});
+OpenLayers.Layer.Google.v3 = {
+    DEFAULTS: {
+        sphericalMercator: !0,
+        projection: "EPSG:900913"
+    },
+    animationEnabled: !0,
+    loadMapObject: function() {
+        this.type || (this.type = google.maps.MapTypeId.ROADMAP);
+        var a, b = OpenLayers.Layer.Google.cache[this.map.id];
+        b ? (a = b.mapObject, ++b.count) : (b = this.map.viewPortDiv, a = document.createElement("div"), a.id = this.map.id + "_GMapContainer", a.style.position = "absolute", a.style.width = "100%", a.style.height = "100%", b.appendChild(a), b = this.map.getCenter(), a = new google.maps.Map(a, {
+            center: b ? new google.maps.LatLng(b.lat,
+                b.lon) : new google.maps.LatLng(0, 0),
+            zoom: this.map.getZoom() || 0,
+            mapTypeId: this.type,
+            disableDefaultUI: !0,
+            keyboardShortcuts: !1,
+            draggable: !1,
+            disableDoubleClickZoom: !0,
+            scrollwheel: !1,
+            streetViewControl: !1
+        }), b = {
+            mapObject: a,
+            count: 1
+        }, OpenLayers.Layer.Google.cache[this.map.id] = b, this.repositionListener = google.maps.event.addListenerOnce(a, "center_changed", OpenLayers.Function.bind(this.repositionMapElements, this)));
+        this.mapObject = a;
+        this.setGMapVisibility(this.visibility)
+    },
+    repositionMapElements: function() {
+        google.maps.event.trigger(this.mapObject,
+            "resize");
+        var a = this.mapObject.getDiv().firstChild;
+        if (!a || 3 > a.childNodes.length) return this.repositionTimer = window.setTimeout(OpenLayers.Function.bind(this.repositionMapElements, this), 250), !1;
+        for (var b = OpenLayers.Layer.Google.cache[this.map.id], c = this.map.viewPortDiv, d = a.children.length - 1; 0 <= d; --d) {
+            if (1000001 == a.children[d].style.zIndex) {
+                var e = a.children[d];
+                c.appendChild(e);
+                e.style.zIndex = "1100";
+                e.style.bottom = "";
+                e.className = "olLayerGoogleCopyright olLayerGoogleV3";
+                e.style.display = "";
+                b.termsOfUse =
+                    e
+            }
+            1E6 == a.children[d].style.zIndex && (e = a.children[d], c.appendChild(e), e.style.zIndex = "1100", e.style.bottom = "", e.className = "olLayerGooglePoweredBy olLayerGoogleV3 gmnoprint", e.style.display = "", b.poweredBy = e);
+            10000002 == a.children[d].style.zIndex && c.appendChild(a.children[d])
+        }
+        this.setGMapVisibility(this.visibility)
+    },
+    onMapResize: function() {
+        if (this.visibility) google.maps.event.trigger(this.mapObject, "resize");
+        else {
+            var a = OpenLayers.Layer.Google.cache[this.map.id];
+            if (!a.resized) {
+                var b = this;
+                google.maps.event.addListenerOnce(this.mapObject,
+                    "tilesloaded",
+                    function() {
+                        google.maps.event.trigger(b.mapObject, "resize");
+                        b.moveTo(b.map.getCenter(), b.map.getZoom());
+                        delete a.resized
+                    })
+            }
+            a.resized = !0
+        }
+    },
+    setGMapVisibility: function(a) {
+        var b = OpenLayers.Layer.Google.cache[this.map.id];
+        if (b) {
+            for (var c = this.type, d = this.map.layers, e, f = d.length - 1; 0 <= f; --f)
+                if (e = d[f], e instanceof OpenLayers.Layer.Google && !0 === e.visibility && !0 === e.inRange) {
+                    c = e.type;
+                    a = !0;
+                    break
+                }
+            d = this.mapObject.getDiv();
+            !0 === a ? (this.mapObject.setMapTypeId(c), d.style.left = "", b.termsOfUse && b.termsOfUse.style &&
+                (b.termsOfUse.style.left = "", b.termsOfUse.style.display = "", b.poweredBy.style.display = ""), b.displayed = this.id) : (delete b.displayed, d.style.left = "-9999px", b.termsOfUse && b.termsOfUse.style && (b.termsOfUse.style.display = "none", b.termsOfUse.style.left = "-9999px", b.poweredBy.style.display = "none"))
+        }
+    },
+    getMapContainer: function() {
+        return this.mapObject.getDiv()
+    },
+    getMapObjectBoundsFromOLBounds: function(a) {
+        var b = null;
+        null != a && (b = this.sphericalMercator ? this.inverseMercator(a.bottom, a.left) : new OpenLayers.LonLat(a.bottom,
+            a.left), a = this.sphericalMercator ? this.inverseMercator(a.top, a.right) : new OpenLayers.LonLat(a.top, a.right), b = new google.maps.LatLngBounds(new google.maps.LatLng(b.lat, b.lon), new google.maps.LatLng(a.lat, a.lon)));
+        return b
+    },
+    getMapObjectLonLatFromMapObjectPixel: function(a) {
+        var b = this.map.getSize(),
+            c = this.getLongitudeFromMapObjectLonLat(this.mapObject.center),
+            d = this.getLatitudeFromMapObjectLonLat(this.mapObject.center),
+            e = this.map.getResolution(),
+            a = new OpenLayers.LonLat(c + (a.x - b.w / 2) * e, d - (a.y - b.h / 2) * e);
+        this.wrapDateLine && (a = a.wrapDateLine(this.maxExtent));
+        return this.getMapObjectLonLatFromLonLat(a.lon, a.lat)
+    },
+    getMapObjectPixelFromMapObjectLonLat: function(a) {
+        var b = this.getLongitudeFromMapObjectLonLat(a),
+            a = this.getLatitudeFromMapObjectLonLat(a),
+            c = this.map.getResolution(),
+            d = this.map.getExtent();
+        return this.getMapObjectPixelFromXY(1 / c * (b - d.left), 1 / c * (d.top - a))
+    },
+    setMapObjectCenter: function(a, b) {
+        if (!1 === this.animationEnabled && b != this.mapObject.zoom) {
+            var c = this.getMapContainer();
+            google.maps.event.addListenerOnce(this.mapObject,
+                "idle",
+                function() {
+                    c.style.visibility = ""
+                });
+            c.style.visibility = "hidden"
+        }
+        this.mapObject.setOptions({
+            center: a,
+            zoom: b
+        })
+    },
+    getMapObjectZoomFromMapObjectBounds: function(a) {
+        return this.mapObject.getBoundsZoomLevel(a)
+    },
+    getMapObjectLonLatFromLonLat: function(a, b) {
+        var c;
+        this.sphericalMercator ? (c = this.inverseMercator(a, b), c = new google.maps.LatLng(c.lat, c.lon)) : c = new google.maps.LatLng(b, a);
+        return c
+    },
+    getMapObjectPixelFromXY: function(a, b) {
+        return new google.maps.Point(a, b)
+    },
+    destroy: function() {
+        this.repositionListener &&
+            google.maps.event.removeListener(this.repositionListener);
+        this.repositionTimer && window.clearTimeout(this.repositionTimer);
+        OpenLayers.Layer.Google.prototype.destroy.apply(this, arguments)
+    }
+};
+OpenLayers.Format.WPSDescribeProcess = OpenLayers.Class(OpenLayers.Format.XML, {
+    VERSION: "1.0.0",
+    namespaces: {
+        wps: "http://www.opengis.net/wps/1.0.0",
+        ows: "http://www.opengis.net/ows/1.1",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    schemaLocation: "http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd",
+    defaultPrefix: "wps",
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var b = {};
+        this.readNode(a, b);
+        return b
+    },
+    readers: {
+        wps: {
+            ProcessDescriptions: function(a, b) {
+                b.processDescriptions = {};
+                this.readChildNodes(a, b.processDescriptions)
+            },
+            ProcessDescription: function(a, b) {
+                var c = {
+                    processVersion: this.getAttributeNS(a, this.namespaces.wps, "processVersion"),
+                    statusSupported: "true" === a.getAttribute("statusSupported"),
+                    storeSupported: "true" === a.getAttribute("storeSupported")
+                };
+                this.readChildNodes(a, c);
+                b[c.identifier] = c
+            },
+            DataInputs: function(a,
+                b) {
+                b.dataInputs = [];
+                this.readChildNodes(a, b.dataInputs)
+            },
+            ProcessOutputs: function(a, b) {
+                b.processOutputs = [];
+                this.readChildNodes(a, b.processOutputs)
+            },
+            Output: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.push(c)
+            },
+            ComplexOutput: function(a, b) {
+                b.complexOutput = {};
+                this.readChildNodes(a, b.complexOutput)
+            },
+            Input: function(a, b) {
+                var c = {
+                    maxOccurs: parseInt(a.getAttribute("maxOccurs")),
+                    minOccurs: parseInt(a.getAttribute("minOccurs"))
+                };
+                this.readChildNodes(a, c);
+                b.push(c)
+            },
+            BoundingBoxData: function(a, b) {
+                b.boundingBoxData = {};
+                this.readChildNodes(a, b.boundingBoxData)
+            },
+            CRS: function(a, b) {
+                b.CRSs || (b.CRSs = {});
+                b.CRSs[this.getChildValue(a)] = !0
+            },
+            LiteralData: function(a, b) {
+                b.literalData = {};
+                this.readChildNodes(a, b.literalData)
+            },
+            ComplexData: function(a, b) {
+                b.complexData = {};
+                this.readChildNodes(a, b.complexData)
+            },
+            Default: function(a, b) {
+                b["default"] = {};
+                this.readChildNodes(a, b["default"])
+            },
+            Supported: function(a, b) {
+                b.supported = {};
+                this.readChildNodes(a, b.supported)
+            },
+            Format: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.formats || (b.formats = {});
+                b.formats[c.mimeType] = !0
+            },
+            MimeType: function(a, b) {
+                b.mimeType = this.getChildValue(a)
+            }
+        },
+        ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers.ows
+    },
+    CLASS_NAME: "OpenLayers.Format.WPSDescribeProcess"
+});
+OpenLayers.Format.CSWGetRecords.v2_0_2 = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        csw: "http://www.opengis.net/cat/csw/2.0.2",
+        dc: "http://purl.org/dc/elements/1.1/",
+        dct: "http://purl.org/dc/terms/",
+        gmd: "http://www.isotc211.org/2005/gmd",
+        geonet: "http://www.fao.org/geonetwork",
+        ogc: "http://www.opengis.net/ogc",
+        ows: "http://www.opengis.net/ows",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    defaultPrefix: "csw",
+    version: "2.0.2",
+    schemaLocation: "http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd",
+    requestId: null,
+    resultType: null,
+    outputFormat: null,
+    outputSchema: null,
+    startPosition: null,
+    maxRecords: null,
+    DistributedSearch: null,
+    ResponseHandler: null,
+    Query: null,
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    initialize: function(a) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var b = {};
+        this.readNode(a, b);
+        return b
+    },
+    readers: {
+        csw: {
+            GetRecordsResponse: function(a, b) {
+                b.records = [];
+                this.readChildNodes(a, b);
+                var c = this.getAttributeNS(a, "", "version");
+                "" != c && (b.version = c)
+            },
+            RequestId: function(a, b) {
+                b.RequestId = this.getChildValue(a)
+            },
+            SearchStatus: function(a, b) {
+                b.SearchStatus = {};
+                var c = this.getAttributeNS(a, "", "timestamp");
+                "" != c && (b.SearchStatus.timestamp = c)
+            },
+            SearchResults: function(a, b) {
+                this.readChildNodes(a, b);
+                for (var c = a.attributes, d = {}, e = 0, f = c.length; e < f; ++e) d[c[e].name] = "numberOfRecordsMatched" == c[e].name || "numberOfRecordsReturned" ==
+                    c[e].name || "nextRecord" == c[e].name ? parseInt(c[e].nodeValue) : c[e].nodeValue;
+                b.SearchResults = d
+            },
+            SummaryRecord: function(a, b) {
+                var c = {
+                    type: "SummaryRecord"
+                };
+                this.readChildNodes(a, c);
+                b.records.push(c)
+            },
+            BriefRecord: function(a, b) {
+                var c = {
+                    type: "BriefRecord"
+                };
+                this.readChildNodes(a, c);
+                b.records.push(c)
+            },
+            DCMIRecord: function(a, b) {
+                var c = {
+                    type: "DCMIRecord"
+                };
+                this.readChildNodes(a, c);
+                b.records.push(c)
+            },
+            Record: function(a, b) {
+                var c = {
+                    type: "Record"
+                };
+                this.readChildNodes(a, c);
+                b.records.push(c)
+            },
+            "*": function(a, b) {
+                var c = a.localName ||
+                    a.nodeName.split(":").pop();
+                b[c] = this.getChildValue(a)
+            }
+        },
+        geonet: {
+            info: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.gninfo = c
+            }
+        },
+        dc: {
+            "*": function(a, b) {
+                var c = a.localName || a.nodeName.split(":").pop();
+                OpenLayers.Util.isArray(b[c]) || (b[c] = []);
+                for (var d = {}, e = a.attributes, f = 0, g = e.length; f < g; ++f) d[e[f].name] = e[f].nodeValue;
+                d.value = this.getChildValue(a);
+                "" != d.value && b[c].push(d)
+            }
+        },
+        dct: {
+            "*": function(a, b) {
+                var c = a.localName || a.nodeName.split(":").pop();
+                OpenLayers.Util.isArray(b[c]) || (b[c] = []);
+                b[c].push(this.getChildValue(a))
+            }
+        },
+        ows: OpenLayers.Util.applyDefaults({
+            BoundingBox: function(a, b) {
+                b.bounds && (b.BoundingBox = [{
+                    crs: b.projection,
+                    value: [b.bounds.left, b.bounds.bottom, b.bounds.right, b.bounds.top]
+                }], delete b.projection, delete b.bounds);
+                OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers.ows.BoundingBox.apply(this, arguments)
+            }
+        }, OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers.ows)
+    },
+    write: function(a) {
+        a = this.writeNode("csw:GetRecords", a);
+        a.setAttribute("xmlns:gmd", this.namespaces.gmd);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [a])
+    },
+    writers: {
+        csw: {
+            GetRecords: function(a) {
+                a || (a = {});
+                var b = this.createElementNSPlus("csw:GetRecords", {
+                    attributes: {
+                        service: "CSW",
+                        version: this.version,
+                        requestId: a.requestId || this.requestId,
+                        resultType: a.resultType || this.resultType,
+                        outputFormat: a.outputFormat || this.outputFormat,
+                        outputSchema: a.outputSchema || this.outputSchema,
+                        startPosition: a.startPosition || this.startPosition,
+                        maxRecords: a.maxRecords || this.maxRecords
+                    }
+                });
+                if (a.DistributedSearch || this.DistributedSearch) this.writeNode("csw:DistributedSearch",
+                    a.DistributedSearch || this.DistributedSearch, b);
+                var c = a.ResponseHandler || this.ResponseHandler;
+                if (OpenLayers.Util.isArray(c) && 0 < c.length)
+                    for (var d = 0, e = c.length; d < e; d++) this.writeNode("csw:ResponseHandler", c[d], b);
+                this.writeNode("Query", a.Query || this.Query, b);
+                return b
+            },
+            DistributedSearch: function(a) {
+                return this.createElementNSPlus("csw:DistributedSearch", {
+                    attributes: {
+                        hopCount: a.hopCount
+                    }
+                })
+            },
+            ResponseHandler: function(a) {
+                return this.createElementNSPlus("csw:ResponseHandler", {
+                    value: a.value
+                })
+            },
+            Query: function(a) {
+                a ||
+                    (a = {});
+                var b = this.createElementNSPlus("csw:Query", {
+                        attributes: {
+                            typeNames: a.typeNames || "csw:Record"
+                        }
+                    }),
+                    c = a.ElementName;
+                if (OpenLayers.Util.isArray(c) && 0 < c.length)
+                    for (var d = 0, e = c.length; d < e; d++) this.writeNode("csw:ElementName", c[d], b);
+                else this.writeNode("csw:ElementSetName", a.ElementSetName || {
+                    value: "summary"
+                }, b);
+                a.Constraint && this.writeNode("csw:Constraint", a.Constraint, b);
+                a.SortBy && this.writeNode("ogc:SortBy", a.SortBy, b);
+                return b
+            },
+            ElementName: function(a) {
+                return this.createElementNSPlus("csw:ElementName", {
+                    value: a.value
+                })
+            },
+            ElementSetName: function(a) {
+                return this.createElementNSPlus("csw:ElementSetName", {
+                    attributes: {
+                        typeNames: a.typeNames
+                    },
+                    value: a.value
+                })
+            },
+            Constraint: function(a) {
+                var b = this.createElementNSPlus("csw:Constraint", {
+                    attributes: {
+                        version: a.version
+                    }
+                });
+                if (a.Filter) {
+                    var c = new OpenLayers.Format.Filter({
+                        version: a.version
+                    });
+                    b.appendChild(c.write(a.Filter))
+                } else a.CqlText && (a = this.createElementNSPlus("CqlText", {
+                    value: a.CqlText.value
+                }), b.appendChild(a));
+                return b
+            }
+        },
+        ogc: OpenLayers.Format.Filter.v1_1_0.prototype.writers.ogc
+    },
+    CLASS_NAME: "OpenLayers.Format.CSWGetRecords.v2_0_2"
+});
+OpenLayers.Marker.Box = OpenLayers.Class(OpenLayers.Marker, {
+    bounds: null,
+    div: null,
+    initialize: function(a, b, c) {
+        this.bounds = a;
+        this.div = OpenLayers.Util.createDiv();
+        this.div.style.overflow = "hidden";
+        this.events = new OpenLayers.Events(this, this.div);
+        this.setBorder(b, c)
+    },
+    destroy: function() {
+        this.div = this.bounds = null;
+        OpenLayers.Marker.prototype.destroy.apply(this, arguments)
+    },
+    setBorder: function(a, b) {
+        a || (a = "red");
+        b || (b = 2);
+        this.div.style.border = b + "px solid " + a
+    },
+    draw: function(a, b) {
+        OpenLayers.Util.modifyDOMElement(this.div,
+            null, a, b);
+        return this.div
+    },
+    onScreen: function() {
+        var a = !1;
+        this.map && (a = this.map.getExtent().containsBounds(this.bounds, !0, !0));
+        return a
+    },
+    display: function(a) {
+        this.div.style.display = a ? "" : "none"
+    },
+    CLASS_NAME: "OpenLayers.Marker.Box"
+});
+OpenLayers.Format.Text = OpenLayers.Class(OpenLayers.Format, {
+    defaultStyle: null,
+    extractStyles: !0,
+    initialize: function(a) {
+        a = a || {};
+        !1 !== a.extractStyles && (a.defaultStyle = {
+            externalGraphic: OpenLayers.Util.getImageLocation("marker.png"),
+            graphicWidth: 21,
+            graphicHeight: 25,
+            graphicXOffset: -10.5,
+            graphicYOffset: -12.5
+        });
+        OpenLayers.Format.prototype.initialize.apply(this, [a])
+    },
+    read: function(a) {
+        for (var a = a.split("\n"), b, c = [], d = 0; d < a.length - 1; d++) {
+            var e = a[d].replace(/^\s*/, "").replace(/\s*$/, "");
+            if ("#" != e.charAt(0))
+                if (b) {
+                    for (var e =
+                            e.split("\t"), f = new OpenLayers.Geometry.Point(0, 0), g = {}, h = this.defaultStyle ? OpenLayers.Util.applyDefaults({}, this.defaultStyle) : null, i = !1, j = 0; j < e.length; j++)
+                        if (e[j])
+                            if ("point" == b[j]) i = e[j].split(","), f.y = parseFloat(i[0]), f.x = parseFloat(i[1]), i = !0;
+                            else if ("lat" == b[j]) f.y = parseFloat(e[j]), i = !0;
+                    else if ("lon" == b[j]) f.x = parseFloat(e[j]), i = !0;
+                    else if ("title" == b[j]) g.title = e[j];
+                    else if ("image" == b[j] || "icon" == b[j] && h) h.externalGraphic = e[j];
+                    else if ("iconSize" == b[j] && h) {
+                        var k = e[j].split(",");
+                        h.graphicWidth =
+                            parseFloat(k[0]);
+                        h.graphicHeight = parseFloat(k[1])
+                    } else "iconOffset" == b[j] && h ? (k = e[j].split(","), h.graphicXOffset = parseFloat(k[0]), h.graphicYOffset = parseFloat(k[1])) : "description" == b[j] ? g.description = e[j] : "overflow" == b[j] ? g.overflow = e[j] : g[b[j]] = e[j];
+                    i && (this.internalProjection && this.externalProjection && f.transform(this.externalProjection, this.internalProjection), e = new OpenLayers.Feature.Vector(f, g, h), c.push(e))
+                } else b = e.split("\t")
+        }
+        return c
+    },
+    CLASS_NAME: "OpenLayers.Format.Text"
+});
+OpenLayers.Layer.Text = OpenLayers.Class(OpenLayers.Layer.Markers, {
+    location: null,
+    features: null,
+    formatOptions: null,
+    selectedFeature: null,
+    initialize: function(a, b) {
+        OpenLayers.Layer.Markers.prototype.initialize.apply(this, arguments);
+        this.features = []
+    },
+    destroy: function() {
+        OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments);
+        this.clearFeatures();
+        this.features = null
+    },
+    loadText: function() {
+        !this.loaded && null != this.location && (this.events.triggerEvent("loadstart"), OpenLayers.Request.GET({
+            url: this.location,
+            success: this.parseData,
+            failure: function() {
+                this.events.triggerEvent("loadend")
+            },
+            scope: this
+        }), this.loaded = !0)
+    },
+    moveTo: function(a, b, c) {
+        OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments);
+        this.visibility && !this.loaded && this.loadText()
+    },
+    parseData: function(a) {
+        var a = a.responseText,
+            b = {};
+        OpenLayers.Util.extend(b, this.formatOptions);
+        this.map && !this.projection.equals(this.map.getProjectionObject()) && (b.externalProjection = this.projection, b.internalProjection = this.map.getProjectionObject());
+        for (var a =
+                (new OpenLayers.Format.Text(b)).read(a), b = 0, c = a.length; b < c; b++) {
+            var d = {},
+                e = a[b],
+                f, g, h;
+            f = new OpenLayers.LonLat(e.geometry.x, e.geometry.y);
+            e.style.graphicWidth && e.style.graphicHeight && (g = new OpenLayers.Size(e.style.graphicWidth, e.style.graphicHeight));
+            void 0 !== e.style.graphicXOffset && void 0 !== e.style.graphicYOffset && (h = new OpenLayers.Pixel(e.style.graphicXOffset, e.style.graphicYOffset));
+            null != e.style.externalGraphic ? d.icon = new OpenLayers.Icon(e.style.externalGraphic, g, h) : (d.icon = OpenLayers.Marker.defaultIcon(),
+                null != g && d.icon.setSize(g));
+            null != e.attributes.title && null != e.attributes.description && (d.popupContentHTML = "<h2>" + e.attributes.title + "</h2><p>" + e.attributes.description + "</p>");
+            d.overflow = e.attributes.overflow || "auto";
+            d = new OpenLayers.Feature(this, f, d);
+            this.features.push(d);
+            f = d.createMarker();
+            null != e.attributes.title && null != e.attributes.description && f.events.register("click", d, this.markerClick);
+            this.addMarker(f)
+        }
+        this.events.triggerEvent("loadend")
+    },
+    markerClick: function(a) {
+        var b = this == this.layer.selectedFeature;
+        this.layer.selectedFeature = !b ? this : null;
+        for (var c = 0, d = this.layer.map.popups.length; c < d; c++) this.layer.map.removePopup(this.layer.map.popups[c]);
+        b || this.layer.map.addPopup(this.createPopup());
+        OpenLayers.Event.stop(a)
+    },
+    clearFeatures: function() {
+        if (null != this.features)
+            for (; 0 < this.features.length;) {
+                var a = this.features[0];
+                OpenLayers.Util.removeItem(this.features, a);
+                a.destroy()
+            }
+    },
+    CLASS_NAME: "OpenLayers.Layer.Text"
+});
+OpenLayers.Handler.RegularPolygon = OpenLayers.Class(OpenLayers.Handler.Drag, {
+    sides: 4,
+    radius: null,
+    snapAngle: null,
+    snapToggle: "shiftKey",
+    layerOptions: null,
+    persist: !1,
+    irregular: !1,
+    citeCompliant: !1,
+    angle: null,
+    fixedRadius: !1,
+    feature: null,
+    layer: null,
+    origin: null,
+    initialize: function(a, b, c) {
+        if (!c || !c.layerOptions || !c.layerOptions.styleMap) this.style = OpenLayers.Util.extend(OpenLayers.Feature.Vector.style["default"], {});
+        OpenLayers.Handler.Drag.prototype.initialize.apply(this, [a, b, c]);
+        this.options = c ? c : {}
+    },
+    setOptions: function(a) {
+        OpenLayers.Util.extend(this.options,
+            a);
+        OpenLayers.Util.extend(this, a)
+    },
+    activate: function() {
+        var a = !1;
+        OpenLayers.Handler.Drag.prototype.activate.apply(this, arguments) && (a = OpenLayers.Util.extend({
+            displayInLayerSwitcher: !1,
+            calculateInRange: OpenLayers.Function.True,
+            wrapDateLine: this.citeCompliant
+        }, this.layerOptions), this.layer = new OpenLayers.Layer.Vector(this.CLASS_NAME, a), this.map.addLayer(this.layer), a = !0);
+        return a
+    },
+    deactivate: function() {
+        var a = !1;
+        OpenLayers.Handler.Drag.prototype.deactivate.apply(this, arguments) && (this.dragging && this.cancel(),
+            null != this.layer.map && (this.layer.destroy(!1), this.feature && this.feature.destroy()), this.feature = this.layer = null, a = !0);
+        return a
+    },
+    down: function(a) {
+        this.fixedRadius = !!this.radius;
+        a = this.layer.getLonLatFromViewPortPx(a.xy);
+        this.origin = new OpenLayers.Geometry.Point(a.lon, a.lat);
+        if (!this.fixedRadius || this.irregular) this.radius = this.map.getResolution();
+        this.persist && this.clear();
+        this.feature = new OpenLayers.Feature.Vector;
+        this.createGeometry();
+        this.callback("create", [this.origin, this.feature]);
+        this.layer.addFeatures([this.feature], {
+            silent: !0
+        });
+        this.layer.drawFeature(this.feature, this.style)
+    },
+    move: function(a) {
+        var b = this.layer.getLonLatFromViewPortPx(a.xy),
+            b = new OpenLayers.Geometry.Point(b.lon, b.lat);
+        this.irregular ? (a = Math.sqrt(2) * Math.abs(b.y - this.origin.y) / 2, this.radius = Math.max(this.map.getResolution() / 2, a)) : this.fixedRadius ? this.origin = b : (this.calculateAngle(b, a), this.radius = Math.max(this.map.getResolution() / 2, b.distanceTo(this.origin)));
+        this.modifyGeometry();
+        this.irregular && (a = b.x - this.origin.x, b = b.y - this.origin.y, this.feature.geometry.resize(1,
+            this.origin, 0 == b ? a / (this.radius * Math.sqrt(2)) : a / b), this.feature.geometry.move(a / 2, b / 2));
+        this.layer.drawFeature(this.feature, this.style)
+    },
+    up: function(a) {
+        this.finalize();
+        this.start == this.last && this.callback("done", [a.xy])
+    },
+    out: function() {
+        this.finalize()
+    },
+    createGeometry: function() {
+        this.angle = Math.PI * (1 / this.sides - 0.5);
+        this.snapAngle && (this.angle += this.snapAngle * (Math.PI / 180));
+        this.feature.geometry = OpenLayers.Geometry.Polygon.createRegularPolygon(this.origin, this.radius, this.sides, this.snapAngle)
+    },
+    modifyGeometry: function() {
+        var a,
+            b, c = this.feature.geometry.components[0];
+        c.components.length != this.sides + 1 && (this.createGeometry(), c = this.feature.geometry.components[0]);
+        for (var d = 0; d < this.sides; ++d) b = c.components[d], a = this.angle + 2 * d * Math.PI / this.sides, b.x = this.origin.x + this.radius * Math.cos(a), b.y = this.origin.y + this.radius * Math.sin(a), b.clearBounds()
+    },
+    calculateAngle: function(a, b) {
+        var c = Math.atan2(a.y - this.origin.y, a.x - this.origin.x);
+        if (this.snapAngle && this.snapToggle && !b[this.snapToggle]) {
+            var d = Math.PI / 180 * this.snapAngle;
+            this.angle =
+                Math.round(c / d) * d
+        } else this.angle = c
+    },
+    cancel: function() {
+        this.callback("cancel", null);
+        this.finalize()
+    },
+    finalize: function() {
+        this.origin = null;
+        this.radius = this.options.radius
+    },
+    clear: function() {
+        this.layer && (this.layer.renderer.clear(), this.layer.destroyFeatures())
+    },
+    callback: function(a) {
+        this.callbacks[a] && this.callbacks[a].apply(this.control, [this.feature.geometry.clone()]);
+        !this.persist && ("done" == a || "cancel" == a) && this.clear()
+    },
+    CLASS_NAME: "OpenLayers.Handler.RegularPolygon"
+});
+OpenLayers.Control.SLDSelect = OpenLayers.Class(OpenLayers.Control, {
+    clearOnDeactivate: !1,
+    layers: null,
+    callbacks: null,
+    selectionSymbolizer: {
+        Polygon: {
+            fillColor: "#FF0000",
+            stroke: !1
+        },
+        Line: {
+            strokeColor: "#FF0000",
+            strokeWidth: 2
+        },
+        Point: {
+            graphicName: "square",
+            fillColor: "#FF0000",
+            pointRadius: 5
+        }
+    },
+    layerOptions: null,
+    handlerOptions: null,
+    sketchStyle: null,
+    wfsCache: {},
+    layerCache: {},
+    initialize: function(a, b) {
+        OpenLayers.Control.prototype.initialize.apply(this, [b]);
+        this.callbacks = OpenLayers.Util.extend({
+                done: this.select,
+                click: this.select
+            },
+            this.callbacks);
+        this.handlerOptions = this.handlerOptions || {};
+        this.layerOptions = OpenLayers.Util.applyDefaults(this.layerOptions, {
+            displayInLayerSwitcher: !1,
+            tileOptions: {
+                maxGetUrlLength: 2048
+            }
+        });
+        this.sketchStyle && (this.handlerOptions.layerOptions = OpenLayers.Util.applyDefaults(this.handlerOptions.layerOptions, {
+            styleMap: new OpenLayers.StyleMap({
+                "default": this.sketchStyle
+            })
+        }));
+        this.handler = new a(this, this.callbacks, this.handlerOptions)
+    },
+    destroy: function() {
+        for (var a in this.layerCache) delete this.layerCache[a];
+        for (a in this.wfsCache) delete this.wfsCache[a];
+        OpenLayers.Control.prototype.destroy.apply(this, arguments)
+    },
+    coupleLayerVisiblity: function(a) {
+        this.setVisibility(a.object.getVisibility())
+    },
+    createSelectionLayer: function(a) {
+        var b;
+        if (this.layerCache[a.id]) b = this.layerCache[a.id];
+        else {
+            b = new OpenLayers.Layer.WMS(a.name, a.url, a.params, OpenLayers.Util.applyDefaults(this.layerOptions, a.getOptions()));
+            this.layerCache[a.id] = b;
+            if (!1 === this.layerOptions.displayInLayerSwitcher) a.events.on({
+                visibilitychanged: this.coupleLayerVisiblity,
+                scope: b
+            });
+            this.map.addLayer(b)
+        }
+        return b
+    },
+    createSLD: function(a, b, c) {
+        for (var d = {
+                version: "1.0.0",
+                namedLayers: {}
+            }, e = ("" + a.params.LAYERS).split(","), f = 0, g = e.length; f < g; f++) {
+            var h = e[f];
+            d.namedLayers[h] = {
+                name: h,
+                userStyles: []
+            };
+            var i = this.selectionSymbolizer,
+                j = c[f];
+            0 <= j.type.indexOf("Polygon") ? i = {
+                Polygon: this.selectionSymbolizer.Polygon
+            } : 0 <= j.type.indexOf("LineString") ? i = {
+                Line: this.selectionSymbolizer.Line
+            } : 0 <= j.type.indexOf("Point") && (i = {
+                Point: this.selectionSymbolizer.Point
+            });
+            d.namedLayers[h].userStyles.push({
+                name: "default",
+                rules: [new OpenLayers.Rule({
+                    symbolizer: i,
+                    filter: b[f],
+                    maxScaleDenominator: a.options.minScale
+                })]
+            })
+        }
+        return (new OpenLayers.Format.SLD({
+            srsName: this.map.getProjection()
+        })).write(d)
+    },
+    parseDescribeLayer: function(a) {
+        var b = new OpenLayers.Format.WMSDescribeLayer,
+            c = a.responseXML;
+        if (!c || !c.documentElement) c = a.responseText;
+        for (var a = b.read(c), b = [], c = null, d = 0, e = a.length; d < e; d++) "WFS" == a[d].owsType && (b.push(a[d].typeName), c = a[d].owsURL);
+        OpenLayers.Request.GET({
+            url: c,
+            params: {
+                SERVICE: "WFS",
+                TYPENAME: b.toString(),
+                REQUEST: "DescribeFeatureType",
+                VERSION: "1.0.0"
+            },
+            callback: function(a) {
+                var b = new OpenLayers.Format.WFSDescribeFeatureType,
+                    c = a.responseXML;
+                if (!c || !c.documentElement) c = a.responseText;
+                this.control.wfsCache[this.layer.id] = b.read(c);
+                this.control._queue && this.control.applySelection()
+            },
+            scope: this
+        })
+    },
+    getGeometryAttributes: function(a) {
+        for (var b = [], a = this.wfsCache[a.id], c = 0, d = a.featureTypes.length; c < d; c++)
+            for (var e = a.featureTypes[c].properties, f = 0, g = e.length; f < g; f++) {
+                var h = e[f],
+                    i = h.type;
+                (0 <= i.indexOf("LineString") || 0 <= i.indexOf("GeometryAssociationType") ||
+                    0 <= i.indexOf("GeometryPropertyType") || 0 <= i.indexOf("Point") || 0 <= i.indexOf("Polygon")) && b.push(h)
+            }
+        return b
+    },
+    activate: function() {
+        var a = OpenLayers.Control.prototype.activate.call(this);
+        if (a)
+            for (var b = 0, c = this.layers.length; b < c; b++) {
+                var d = this.layers[b];
+                d && !this.wfsCache[d.id] && OpenLayers.Request.GET({
+                    url: d.url,
+                    params: {
+                        SERVICE: "WMS",
+                        VERSION: d.params.VERSION,
+                        LAYERS: d.params.LAYERS,
+                        REQUEST: "DescribeLayer"
+                    },
+                    callback: this.parseDescribeLayer,
+                    scope: {
+                        layer: d,
+                        control: this
+                    }
+                })
+            }
+        return a
+    },
+    deactivate: function() {
+        var a =
+            OpenLayers.Control.prototype.deactivate.call(this);
+        if (a)
+            for (var b = 0, c = this.layers.length; b < c; b++) {
+                var d = this.layers[b];
+                if (d && !0 === this.clearOnDeactivate) {
+                    var e = this.layerCache,
+                        f = e[d.id];
+                    f && (d.events.un({
+                        visibilitychanged: this.coupleLayerVisiblity,
+                        scope: f
+                    }), f.destroy(), delete e[d.id])
+                }
+            }
+        return a
+    },
+    setLayers: function(a) {
+        this.active ? (this.deactivate(), this.layers = a, this.activate()) : this.layers = a
+    },
+    createFilter: function(a, b) {
+        var c = null;
+        this.handler instanceof OpenLayers.Handler.RegularPolygon ? c = !0 === this.handler.irregular ?
+            new OpenLayers.Filter.Spatial({
+                type: OpenLayers.Filter.Spatial.BBOX,
+                property: a.name,
+                value: b.getBounds()
+            }) : new OpenLayers.Filter.Spatial({
+                type: OpenLayers.Filter.Spatial.INTERSECTS,
+                property: a.name,
+                value: b
+            }) : this.handler instanceof OpenLayers.Handler.Polygon ? c = new OpenLayers.Filter.Spatial({
+                type: OpenLayers.Filter.Spatial.INTERSECTS,
+                property: a.name,
+                value: b
+            }) : this.handler instanceof OpenLayers.Handler.Path ? c = 0 <= a.type.indexOf("Point") ? new OpenLayers.Filter.Spatial({
+                type: OpenLayers.Filter.Spatial.DWITHIN,
+                property: a.name,
+                distance: 0.01 * this.map.getExtent().getWidth(),
+                distanceUnits: this.map.getUnits(),
+                value: b
+            }) : new OpenLayers.Filter.Spatial({
+                type: OpenLayers.Filter.Spatial.INTERSECTS,
+                property: a.name,
+                value: b
+            }) : this.handler instanceof OpenLayers.Handler.Click && (c = 0 <= a.type.indexOf("Polygon") ? new OpenLayers.Filter.Spatial({
+                type: OpenLayers.Filter.Spatial.INTERSECTS,
+                property: a.name,
+                value: b
+            }) : new OpenLayers.Filter.Spatial({
+                type: OpenLayers.Filter.Spatial.DWITHIN,
+                property: a.name,
+                distance: 0.01 * this.map.getExtent().getWidth(),
+                distanceUnits: this.map.getUnits(),
+                value: b
+            }));
+        return c
+    },
+    select: function(a) {
+        this._queue = function() {
+            for (var b = 0, c = this.layers.length; b < c; b++) {
+                for (var d = this.layers[b], e = this.getGeometryAttributes(d), f = [], g = 0, h = e.length; g < h; g++) {
+                    var i = e[g];
+                    if (null !== i) {
+                        if (!(a instanceof OpenLayers.Geometry)) {
+                            var j = this.map.getLonLatFromPixel(a.xy);
+                            a = new OpenLayers.Geometry.Point(j.lon, j.lat)
+                        }
+                        i = this.createFilter(i, a);
+                        null !== i && f.push(i)
+                    }
+                }
+                g = this.createSelectionLayer(d);
+                e = this.createSLD(d, f, e);
+                this.events.triggerEvent("selected", {
+                    layer: d,
+                    filters: f
+                });
+                g.mergeNewParams({
+                    SLD_BODY: e
+                });
+                delete this._queue
+            }
+        };
+        this.applySelection()
+    },
+    applySelection: function() {
+        for (var a = !0, b = 0, c = this.layers.length; b < c; b++)
+            if (!this.wfsCache[this.layers[b].id]) {
+                a = !1;
+                break
+            }
+        a && this._queue.call(this)
+    },
+    CLASS_NAME: "OpenLayers.Control.SLDSelect"
+});
+OpenLayers.Control.Scale = OpenLayers.Class(OpenLayers.Control, {
+    element: null,
+    geodesic: !1,
+    initialize: function(a, b) {
+        OpenLayers.Control.prototype.initialize.apply(this, [b]);
+        this.element = OpenLayers.Util.getElement(a)
+    },
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        this.element || (this.element = document.createElement("div"), this.div.appendChild(this.element));
+        this.map.events.register("moveend", this, this.updateScale);
+        this.updateScale();
+        return this.div
+    },
+    updateScale: function() {
+        var a;
+        if (!0 === this.geodesic) {
+            if (!this.map.getUnits()) return;
+            a = OpenLayers.INCHES_PER_UNIT;
+            a = (this.map.getGeodesicPixelSize().w || 1.0E-6) * a.km * OpenLayers.DOTS_PER_INCH
+        } else a = this.map.getScale();
+        a && (a = 9500 <= a && 95E4 >= a ? Math.round(a / 1E3) + "K" : 95E4 <= a ? Math.round(a / 1E6) + "M" : Math.round(a), this.element.innerHTML = OpenLayers.i18n("Scale = 1 : ${scaleDenom}", {
+            scaleDenom: a
+        }))
+    },
+    CLASS_NAME: "OpenLayers.Control.Scale"
+});
+OpenLayers.Control.Button = OpenLayers.Class(OpenLayers.Control, {
+    type: OpenLayers.Control.TYPE_BUTTON,
+    trigger: function() {},
+    CLASS_NAME: "OpenLayers.Control.Button"
+});
+OpenLayers.Layer.MapGuide = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    isBaseLayer: !0,
+    useHttpTile: !1,
+    singleTile: !1,
+    useOverlay: !1,
+    useAsyncOverlay: !0,
+    TILE_PARAMS: {
+        operation: "GETTILEIMAGE",
+        version: "1.2.0"
+    },
+    SINGLE_TILE_PARAMS: {
+        operation: "GETMAPIMAGE",
+        format: "PNG",
+        locale: "en",
+        clip: "1",
+        version: "1.0.0"
+    },
+    OVERLAY_PARAMS: {
+        operation: "GETDYNAMICMAPOVERLAYIMAGE",
+        format: "PNG",
+        locale: "en",
+        clip: "1",
+        version: "2.0.0"
+    },
+    FOLDER_PARAMS: {
+        tileColumnsPerFolder: 30,
+        tileRowsPerFolder: 30,
+        format: "png",
+        querystring: null
+    },
+    defaultSize: new OpenLayers.Size(300,
+        300),
+    tileOriginCorner: "tl",
+    initialize: function(a, b, c, d) {
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, arguments);
+        if (null == d || null == d.isBaseLayer) this.isBaseLayer = "true" != this.transparent && !0 != this.transparent;
+        d && null != d.useOverlay && (this.useOverlay = d.useOverlay);
+        this.singleTile ? this.useOverlay ? (OpenLayers.Util.applyDefaults(this.params, this.OVERLAY_PARAMS), this.useAsyncOverlay || (this.params.version = "1.0.0")) : OpenLayers.Util.applyDefaults(this.params, this.SINGLE_TILE_PARAMS) : (this.useHttpTile ?
+            OpenLayers.Util.applyDefaults(this.params, this.FOLDER_PARAMS) : OpenLayers.Util.applyDefaults(this.params, this.TILE_PARAMS), this.setTileSize(this.defaultSize))
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.MapGuide(this.name, this.url, this.params, this.getOptions()));
+        return a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+    },
+    getURL: function(a) {
+        var b;
+        b = a.getCenterLonLat();
+        var c = this.map.getSize();
+        this.singleTile ? (a = {
+            setdisplaydpi: OpenLayers.DOTS_PER_INCH,
+            setdisplayheight: c.h * this.ratio,
+            setdisplaywidth: c.w *
+                this.ratio,
+            setviewcenterx: b.lon,
+            setviewcentery: b.lat,
+            setviewscale: this.map.getScale()
+        }, this.useOverlay && !this.useAsyncOverlay && (b = {}, b = OpenLayers.Util.extend(b, a), b.operation = "GETVISIBLEMAPEXTENT", b.version = "1.0.0", b.session = this.params.session, b.mapName = this.params.mapName, b.format = "text/xml", b = this.getFullRequestString(b), OpenLayers.Request.GET({
+            url: b,
+            async: !1
+        })), b = this.getFullRequestString(a)) : (c = this.map.getResolution(), b = Math.floor((a.left - this.maxExtent.left) / c), b = Math.round(b / this.tileSize.w),
+            a = Math.floor((this.maxExtent.top - a.top) / c), a = Math.round(a / this.tileSize.h), b = this.useHttpTile ? this.getImageFilePath({
+                tilecol: b,
+                tilerow: a,
+                scaleindex: this.resolutions.length - this.map.zoom - 1
+            }) : this.getFullRequestString({
+                tilecol: b,
+                tilerow: a,
+                scaleindex: this.resolutions.length - this.map.zoom - 1
+            }));
+        return b
+    },
+    getFullRequestString: function(a, b) {
+        var c = null == b ? this.url : b;
+        "object" == typeof c && (c = c[Math.floor(Math.random() * c.length)]);
+        var d = c,
+            e = OpenLayers.Util.extend({}, this.params),
+            e = OpenLayers.Util.extend(e, a),
+            f = OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(c)),
+            g;
+        for (g in e) g.toUpperCase() in f && delete e[g];
+        e = OpenLayers.Util.getParameterString(e);
+        e = e.replace(/,/g, "+");
+        "" != e && (f = c.charAt(c.length - 1), d = "&" == f || "?" == f ? d + e : -1 == c.indexOf("?") ? d + ("?" + e) : d + ("&" + e));
+        return d
+    },
+    getImageFilePath: function(a, b) {
+        var c = null == b ? this.url : b;
+        "object" == typeof c && (c = c[Math.floor(Math.random() * c.length)]);
+        var d = "",
+            e = "";
+        0 > a.tilerow && (d = "-");
+        d = 0 == a.tilerow ? d + "0" : d + Math.floor(Math.abs(a.tilerow / this.params.tileRowsPerFolder)) *
+            this.params.tileRowsPerFolder;
+        0 > a.tilecol && (e = "-");
+        e = 0 == a.tilecol ? e + "0" : e + Math.floor(Math.abs(a.tilecol / this.params.tileColumnsPerFolder)) * this.params.tileColumnsPerFolder;
+        d = "/S" + Math.floor(a.scaleindex) + "/" + this.params.basemaplayergroupname + "/R" + d + "/C" + e + "/" + a.tilerow % this.params.tileRowsPerFolder + "_" + a.tilecol % this.params.tileColumnsPerFolder + "." + this.params.format;
+        this.params.querystring && (d += "?" + this.params.querystring);
+        return c + d
+    },
+    calculateGridLayout: function(a, b, c) {
+        var d = c * this.tileSize.w,
+            c =
+            c * this.tileSize.h,
+            e = a.left - b.lon,
+            f = Math.floor(e / d) - this.buffer,
+            a = b.lat - a.top + c,
+            g = Math.floor(a / c) - this.buffer;
+        return {
+            tilelon: d,
+            tilelat: c,
+            tileoffsetlon: b.lon + f * d,
+            tileoffsetlat: b.lat - c * g,
+            tileoffsetx: -(e / d - f) * this.tileSize.w,
+            tileoffsety: (g - a / c) * this.tileSize.h
+        }
+    },
+    CLASS_NAME: "OpenLayers.Layer.MapGuide"
+});
+OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
+    handlerOptions: null,
+    callbacks: null,
+    displaySystem: "metric",
+    geodesic: !1,
+    displaySystemUnits: {
+        geographic: ["dd"],
+        english: ["mi", "ft", "in"],
+        metric: ["km", "m"]
+    },
+    partialDelay: 300,
+    delayedTrigger: null,
+    persist: !1,
+    immediate: !1,
+    initialize: function(a, b) {
+        OpenLayers.Control.prototype.initialize.apply(this, [b]);
+        var c = {
+            done: this.measureComplete,
+            point: this.measurePartial
+        };
+        this.immediate && (c.modify = this.measureImmediate);
+        this.callbacks = OpenLayers.Util.extend(c,
+            this.callbacks);
+        this.handlerOptions = OpenLayers.Util.extend({
+            persist: this.persist
+        }, this.handlerOptions);
+        this.handler = new a(this, this.callbacks, this.handlerOptions)
+    },
+    deactivate: function() {
+        this.cancelDelay();
+        return OpenLayers.Control.prototype.deactivate.apply(this, arguments)
+    },
+    cancel: function() {
+        this.cancelDelay();
+        this.handler.cancel()
+    },
+    setImmediate: function(a) {
+        (this.immediate = a) ? this.callbacks.modify = this.measureImmediate: delete this.callbacks.modify
+    },
+    updateHandler: function(a, b) {
+        var c = this.active;
+        c &&
+            this.deactivate();
+        this.handler = new a(this, this.callbacks, b);
+        c && this.activate()
+    },
+    measureComplete: function(a) {
+        this.cancelDelay();
+        this.measure(a, "measure")
+    },
+    measurePartial: function(a, b) {
+        this.cancelDelay();
+        b = b.clone();
+        this.handler.freehandMode(this.handler.evt) ? this.measure(b, "measurepartial") : this.delayedTrigger = window.setTimeout(OpenLayers.Function.bind(function() {
+            this.delayedTrigger = null;
+            this.measure(b, "measurepartial")
+        }, this), this.partialDelay)
+    },
+    measureImmediate: function(a, b, c) {
+        c && !this.handler.freehandMode(this.handler.evt) &&
+            (this.cancelDelay(), this.measure(b.geometry, "measurepartial"))
+    },
+    cancelDelay: function() {
+        null !== this.delayedTrigger && (window.clearTimeout(this.delayedTrigger), this.delayedTrigger = null)
+    },
+    measure: function(a, b) {
+        var c, d; - 1 < a.CLASS_NAME.indexOf("LineString") ? (c = this.getBestLength(a), d = 1) : (c = this.getBestArea(a), d = 2);
+        this.events.triggerEvent(b, {
+            measure: c[0],
+            units: c[1],
+            order: d,
+            geometry: a
+        })
+    },
+    getBestArea: function(a) {
+        for (var b = this.displaySystemUnits[this.displaySystem], c, d, e = 0, f = b.length; e < f && !(c = b[e], d = this.getArea(a,
+                c), 1 < d); ++e);
+        return [d, c]
+    },
+    getArea: function(a, b) {
+        var c, d;
+        this.geodesic ? (c = a.getGeodesicArea(this.map.getProjectionObject()), d = "m") : (c = a.getArea(), d = this.map.getUnits());
+        var e = OpenLayers.INCHES_PER_UNIT[b];
+        e && (c *= Math.pow(OpenLayers.INCHES_PER_UNIT[d] / e, 2));
+        return c
+    },
+    getBestLength: function(a) {
+        for (var b = this.displaySystemUnits[this.displaySystem], c, d, e = 0, f = b.length; e < f && !(c = b[e], d = this.getLength(a, c), 1 < d); ++e);
+        return [d, c]
+    },
+    getLength: function(a, b) {
+        var c, d;
+        this.geodesic ? (c = a.getGeodesicLength(this.map.getProjectionObject()),
+            d = "m") : (c = a.getLength(), d = this.map.getUnits());
+        var e = OpenLayers.INCHES_PER_UNIT[b];
+        e && (c *= OpenLayers.INCHES_PER_UNIT[d] / e);
+        return c
+    },
+    CLASS_NAME: "OpenLayers.Control.Measure"
+});
+OpenLayers.Format.WMC.v1_0_0 = OpenLayers.Class(OpenLayers.Format.WMC.v1, {
+    VERSION: "1.0.0",
+    schemaLocation: "http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd",
+    initialize: function(a) {
+        OpenLayers.Format.WMC.v1.prototype.initialize.apply(this, [a])
+    },
+    read_wmc_SRS: function(a, b) {
+        var c = this.getChildValue(b);
+        "object" != typeof a.projections && (a.projections = {});
+        for (var c = c.split(/ +/), d = 0, e = c.length; d < e; d++) a.projections[c[d]] = !0
+    },
+    write_wmc_Layer: function(a) {
+        var b = OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply(this, [a]);
+        if (a.srs) {
+            var c = [],
+                d;
+            for (d in a.srs) c.push(d);
+            b.appendChild(this.createElementDefaultNS("SRS", c.join(" ")))
+        }
+        b.appendChild(this.write_wmc_FormatList(a));
+        b.appendChild(this.write_wmc_StyleList(a));
+        a.dimensions && b.appendChild(this.write_wmc_DimensionList(a));
+        b.appendChild(this.write_wmc_LayerExtension(a))
+    },
+    CLASS_NAME: "OpenLayers.Format.WMC.v1_0_0"
+});
+OpenLayers.Popup.Framed = OpenLayers.Class(OpenLayers.Popup.Anchored, {
+    imageSrc: null,
+    imageSize: null,
+    isAlphaImage: !1,
+    positionBlocks: null,
+    blocks: null,
+    fixedRelativePosition: !1,
+    initialize: function(a, b, c, d, e, f, g) {
+        OpenLayers.Popup.Anchored.prototype.initialize.apply(this, arguments);
+        this.fixedRelativePosition && (this.updateRelativePosition(), this.calculateRelativePosition = function() {
+            return this.relativePosition
+        });
+        this.contentDiv.style.position = "absolute";
+        this.contentDiv.style.zIndex = 1;
+        f && (this.closeDiv.style.zIndex =
+            1);
+        this.groupDiv.style.position = "absolute";
+        this.groupDiv.style.top = "0px";
+        this.groupDiv.style.left = "0px";
+        this.groupDiv.style.height = "100%";
+        this.groupDiv.style.width = "100%"
+    },
+    destroy: function() {
+        this.isAlphaImage = this.imageSize = this.imageSrc = null;
+        this.fixedRelativePosition = !1;
+        this.positionBlocks = null;
+        for (var a = 0; a < this.blocks.length; a++) {
+            var b = this.blocks[a];
+            b.image && b.div.removeChild(b.image);
+            b.image = null;
+            b.div && this.groupDiv.removeChild(b.div);
+            b.div = null
+        }
+        this.blocks = null;
+        OpenLayers.Popup.Anchored.prototype.destroy.apply(this,
+            arguments)
+    },
+    setBackgroundColor: function() {},
+    setBorder: function() {},
+    setOpacity: function() {},
+    setSize: function(a) {
+        OpenLayers.Popup.Anchored.prototype.setSize.apply(this, arguments);
+        this.updateBlocks()
+    },
+    updateRelativePosition: function() {
+        this.padding = this.positionBlocks[this.relativePosition].padding;
+        if (this.closeDiv) {
+            var a = this.getContentDivPadding();
+            this.closeDiv.style.right = a.right + this.padding.right + "px";
+            this.closeDiv.style.top = a.top + this.padding.top + "px"
+        }
+        this.updateBlocks()
+    },
+    calculateNewPx: function(a) {
+        var b =
+            OpenLayers.Popup.Anchored.prototype.calculateNewPx.apply(this, arguments);
+        return b = b.offset(this.positionBlocks[this.relativePosition].offset)
+    },
+    createBlocks: function() {
+        this.blocks = [];
+        var a = null,
+            b;
+        for (b in this.positionBlocks) {
+            a = b;
+            break
+        }
+        a = this.positionBlocks[a];
+        for (b = 0; b < a.blocks.length; b++) {
+            var c = {};
+            this.blocks.push(c);
+            c.div = OpenLayers.Util.createDiv(this.id + "_FrameDecorationDiv_" + b, null, null, null, "absolute", null, "hidden", null);
+            c.image = (this.isAlphaImage ? OpenLayers.Util.createAlphaImageDiv : OpenLayers.Util.createImage)(this.id +
+                "_FrameDecorationImg_" + b, null, this.imageSize, this.imageSrc, "absolute", null, null, null);
+            c.div.appendChild(c.image);
+            this.groupDiv.appendChild(c.div)
+        }
+    },
+    updateBlocks: function() {
+        this.blocks || this.createBlocks();
+        if (this.size && this.relativePosition) {
+            for (var a = this.positionBlocks[this.relativePosition], b = 0; b < a.blocks.length; b++) {
+                var c = a.blocks[b],
+                    d = this.blocks[b],
+                    e = c.anchor.left,
+                    f = c.anchor.bottom,
+                    g = c.anchor.right,
+                    h = c.anchor.top,
+                    i = isNaN(c.size.w) ? this.size.w - (g + e) : c.size.w,
+                    j = isNaN(c.size.h) ? this.size.h - (f +
+                        h) : c.size.h;
+                d.div.style.width = (0 > i ? 0 : i) + "px";
+                d.div.style.height = (0 > j ? 0 : j) + "px";
+                d.div.style.left = null != e ? e + "px" : "";
+                d.div.style.bottom = null != f ? f + "px" : "";
+                d.div.style.right = null != g ? g + "px" : "";
+                d.div.style.top = null != h ? h + "px" : "";
+                d.image.style.left = c.position.x + "px";
+                d.image.style.top = c.position.y + "px"
+            }
+            this.contentDiv.style.left = this.padding.left + "px";
+            this.contentDiv.style.top = this.padding.top + "px"
+        }
+    },
+    CLASS_NAME: "OpenLayers.Popup.Framed"
+});
+OpenLayers.Popup.FramedCloud = OpenLayers.Class(OpenLayers.Popup.Framed, {
+    contentDisplayClass: "olFramedCloudPopupContent",
+    autoSize: !0,
+    panMapIfOutOfView: !0,
+    imageSize: new OpenLayers.Size(1276, 736),
+    isAlphaImage: !1,
+    fixedRelativePosition: !1,
+    positionBlocks: {
+        tl: {
+            offset: new OpenLayers.Pixel(44, 0),
+            padding: new OpenLayers.Bounds(8, 40, 8, 9),
+            blocks: [{
+                size: new OpenLayers.Size("auto", "auto"),
+                anchor: new OpenLayers.Bounds(0, 51, 22, 0),
+                position: new OpenLayers.Pixel(0, 0)
+            }, {
+                size: new OpenLayers.Size(22, "auto"),
+                anchor: new OpenLayers.Bounds(null,
+                    50, 0, 0),
+                position: new OpenLayers.Pixel(-1238, 0)
+            }, {
+                size: new OpenLayers.Size("auto", 19),
+                anchor: new OpenLayers.Bounds(0, 32, 22, null),
+                position: new OpenLayers.Pixel(0, -631)
+            }, {
+                size: new OpenLayers.Size(22, 18),
+                anchor: new OpenLayers.Bounds(null, 32, 0, null),
+                position: new OpenLayers.Pixel(-1238, -632)
+            }, {
+                size: new OpenLayers.Size(81, 35),
+                anchor: new OpenLayers.Bounds(null, 0, 0, null),
+                position: new OpenLayers.Pixel(0, -688)
+            }]
+        },
+        tr: {
+            offset: new OpenLayers.Pixel(-45, 0),
+            padding: new OpenLayers.Bounds(8, 40, 8, 9),
+            blocks: [{
+                size: new OpenLayers.Size("auto",
+                    "auto"),
+                anchor: new OpenLayers.Bounds(0, 51, 22, 0),
+                position: new OpenLayers.Pixel(0, 0)
+            }, {
+                size: new OpenLayers.Size(22, "auto"),
+                anchor: new OpenLayers.Bounds(null, 50, 0, 0),
+                position: new OpenLayers.Pixel(-1238, 0)
+            }, {
+                size: new OpenLayers.Size("auto", 19),
+                anchor: new OpenLayers.Bounds(0, 32, 22, null),
+                position: new OpenLayers.Pixel(0, -631)
+            }, {
+                size: new OpenLayers.Size(22, 19),
+                anchor: new OpenLayers.Bounds(null, 32, 0, null),
+                position: new OpenLayers.Pixel(-1238, -631)
+            }, {
+                size: new OpenLayers.Size(81, 35),
+                anchor: new OpenLayers.Bounds(0,
+                    0, null, null),
+                position: new OpenLayers.Pixel(-215, -687)
+            }]
+        },
+        bl: {
+            offset: new OpenLayers.Pixel(45, 0),
+            padding: new OpenLayers.Bounds(8, 9, 8, 40),
+            blocks: [{
+                size: new OpenLayers.Size("auto", "auto"),
+                anchor: new OpenLayers.Bounds(0, 21, 22, 32),
+                position: new OpenLayers.Pixel(0, 0)
+            }, {
+                size: new OpenLayers.Size(22, "auto"),
+                anchor: new OpenLayers.Bounds(null, 21, 0, 32),
+                position: new OpenLayers.Pixel(-1238, 0)
+            }, {
+                size: new OpenLayers.Size("auto", 21),
+                anchor: new OpenLayers.Bounds(0, 0, 22, null),
+                position: new OpenLayers.Pixel(0, -629)
+            }, {
+                size: new OpenLayers.Size(22,
+                    21),
+                anchor: new OpenLayers.Bounds(null, 0, 0, null),
+                position: new OpenLayers.Pixel(-1238, -629)
+            }, {
+                size: new OpenLayers.Size(81, 33),
+                anchor: new OpenLayers.Bounds(null, null, 0, 0),
+                position: new OpenLayers.Pixel(-101, -674)
+            }]
+        },
+        br: {
+            offset: new OpenLayers.Pixel(-44, 0),
+            padding: new OpenLayers.Bounds(8, 9, 8, 40),
+            blocks: [{
+                size: new OpenLayers.Size("auto", "auto"),
+                anchor: new OpenLayers.Bounds(0, 21, 22, 32),
+                position: new OpenLayers.Pixel(0, 0)
+            }, {
+                size: new OpenLayers.Size(22, "auto"),
+                anchor: new OpenLayers.Bounds(null, 21, 0, 32),
+                position: new OpenLayers.Pixel(-1238,
+                    0)
+            }, {
+                size: new OpenLayers.Size("auto", 21),
+                anchor: new OpenLayers.Bounds(0, 0, 22, null),
+                position: new OpenLayers.Pixel(0, -629)
+            }, {
+                size: new OpenLayers.Size(22, 21),
+                anchor: new OpenLayers.Bounds(null, 0, 0, null),
+                position: new OpenLayers.Pixel(-1238, -629)
+            }, {
+                size: new OpenLayers.Size(81, 33),
+                anchor: new OpenLayers.Bounds(0, null, null, 0),
+                position: new OpenLayers.Pixel(-311, -674)
+            }]
+        }
+    },
+    minSize: new OpenLayers.Size(105, 10),
+    maxSize: new OpenLayers.Size(1200, 660),
+    initialize: function(a, b, c, d, e, f, g) {
+        this.imageSrc = OpenLayers.Util.getImageLocation("cloud-popup-relative.png");
+        OpenLayers.Popup.Framed.prototype.initialize.apply(this, arguments);
+        this.contentDiv.className = this.contentDisplayClass
+    },
+    CLASS_NAME: "OpenLayers.Popup.FramedCloud"
+});
+OpenLayers.Tile.Image.IFrame = {
+    useIFrame: null,
+    draw: function() {
+        if (OpenLayers.Tile.Image.prototype.shouldDraw.call(this)) {
+            var a = this.layer.getURL(this.bounds),
+                b = this.useIFrame;
+            this.useIFrame = null !== this.maxGetUrlLength && !this.layer.async && a.length > this.maxGetUrlLength;
+            a = b && !this.useIFrame;
+            b = !b && this.useIFrame;
+            if (a || b) this.imgDiv && this.imgDiv.parentNode === this.frame && this.frame.removeChild(this.imgDiv), this.imgDiv = null, a ? (this.blankImageUrl = this._blankImageUrl, this.frame.removeChild(this.frame.firstChild)) :
+                (this._blankImageUrl = this.blankImageUrl, this.blankImageUrl = "about:blank")
+        }
+        return OpenLayers.Tile.Image.prototype.draw.apply(this, arguments)
+    },
+    getImage: function() {
+        if (!0 === this.useIFrame) {
+            if (!this.frame.childNodes.length) {
+                var a = document.createElement("div"),
+                    b = a.style;
+                b.position = "absolute";
+                b.width = "100%";
+                b.height = "100%";
+                b.zIndex = 1;
+                b.backgroundImage = "url(" + this._blankImageUrl + ")";
+                this.frame.appendChild(a)
+            }
+            a = this.id + "_iFrame";
+            9 > parseFloat(navigator.appVersion.split("MSIE")[1]) ? (b = document.createElement('<iframe name="' +
+                a + '">'), b.style.backgroundColor = "#FFFFFF", b.style.filter = "chroma(color=#FFFFFF)") : (b = document.createElement("iframe"), b.style.backgroundColor = "transparent", b.name = a);
+            b.scrolling = "no";
+            b.marginWidth = "0px";
+            b.marginHeight = "0px";
+            b.frameBorder = "0";
+            b.style.position = "absolute";
+            b.style.width = "100%";
+            b.style.height = "100%";
+            1 > this.layer.opacity && OpenLayers.Util.modifyDOMElement(b, null, null, null, null, null, null, this.layer.opacity);
+            this.frame.appendChild(b);
+            return this.imgDiv = b
+        }
+        return OpenLayers.Tile.Image.prototype.getImage.apply(this,
+            arguments)
+    },
+    createRequestForm: function() {
+        var a = document.createElement("form");
+        a.method = "POST";
+        var b = this.layer.params._OLSALT,
+            b = (b ? b + "_" : "") + this.bounds.toBBOX();
+        a.action = OpenLayers.Util.urlAppend(this.layer.url, b);
+        a.target = this.id + "_iFrame";
+        this.layer.getImageSize();
+        var b = OpenLayers.Util.getParameters(this.url),
+            c, d;
+        for (d in b) c = document.createElement("input"), c.type = "hidden", c.name = d, c.value = b[d], a.appendChild(c);
+        return a
+    },
+    setImgSrc: function(a) {
+        if (!0 === this.useIFrame)
+            if (a) {
+                var b = this.createRequestForm();
+                this.frame.appendChild(b);
+                b.submit();
+                this.frame.removeChild(b)
+            } else this.imgDiv.parentNode === this.frame && (this.frame.removeChild(this.imgDiv), this.imgDiv = null);
+        else OpenLayers.Tile.Image.prototype.setImgSrc.apply(this, arguments)
+    },
+    onImageLoad: function() {
+        OpenLayers.Tile.Image.prototype.onImageLoad.apply(this, arguments);
+        !0 === this.useIFrame && (this.imgDiv.style.opacity = 1, this.frame.style.opacity = this.layer.opacity)
+    },
+    createBackBuffer: function() {
+        var a;
+        !1 === this.useIFrame && (a = OpenLayers.Tile.Image.prototype.createBackBuffer.call(this));
+        return a
+    }
+};
+OpenLayers.Format.SOSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+    defaultVersion: "1.0.0",
+    CLASS_NAME: "OpenLayers.Format.SOSCapabilities"
+});
+OpenLayers.Format.SOSCapabilities.v1_0_0 = OpenLayers.Class(OpenLayers.Format.SOSCapabilities, {
+    namespaces: {
+        ows: "http://www.opengis.net/ows/1.1",
+        sos: "http://www.opengis.net/sos/1.0",
+        gml: "http://www.opengis.net/gml",
+        xlink: "http://www.w3.org/1999/xlink"
+    },
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    initialize: function(a) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a]);
+        this.options = a
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var b = {};
+        this.readNode(a, b);
+        return b
+    },
+    readers: {
+        gml: OpenLayers.Util.applyDefaults({
+            name: function(a, b) {
+                b.name = this.getChildValue(a)
+            },
+            TimePeriod: function(a, b) {
+                b.timePeriod = {};
+                this.readChildNodes(a, b.timePeriod)
+            },
+            beginPosition: function(a, b) {
+                b.beginPosition = this.getChildValue(a)
+            },
+            endPosition: function(a, b) {
+                b.endPosition = this.getChildValue(a)
+            }
+        }, OpenLayers.Format.GML.v3.prototype.readers.gml),
+        sos: {
+            Capabilities: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Contents: function(a,
+                b) {
+                b.contents = {};
+                this.readChildNodes(a, b.contents)
+            },
+            ObservationOfferingList: function(a, b) {
+                b.offeringList = {};
+                this.readChildNodes(a, b.offeringList)
+            },
+            ObservationOffering: function(a, b) {
+                var c = this.getAttributeNS(a, this.namespaces.gml, "id");
+                b[c] = {
+                    procedures: [],
+                    observedProperties: [],
+                    featureOfInterestIds: [],
+                    responseFormats: [],
+                    resultModels: [],
+                    responseModes: []
+                };
+                this.readChildNodes(a, b[c])
+            },
+            time: function(a, b) {
+                b.time = {};
+                this.readChildNodes(a, b.time)
+            },
+            procedure: function(a, b) {
+                b.procedures.push(this.getAttributeNS(a,
+                    this.namespaces.xlink, "href"))
+            },
+            observedProperty: function(a, b) {
+                b.observedProperties.push(this.getAttributeNS(a, this.namespaces.xlink, "href"))
+            },
+            featureOfInterest: function(a, b) {
+                b.featureOfInterestIds.push(this.getAttributeNS(a, this.namespaces.xlink, "href"))
+            },
+            responseFormat: function(a, b) {
+                b.responseFormats.push(this.getChildValue(a))
+            },
+            resultModel: function(a, b) {
+                b.resultModels.push(this.getChildValue(a))
+            },
+            responseMode: function(a, b) {
+                b.responseModes.push(this.getChildValue(a))
+            }
+        },
+        ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers.ows
+    },
+    CLASS_NAME: "OpenLayers.Format.SOSCapabilities.v1_0_0"
+});
+OpenLayers.Handler.Pinch = OpenLayers.Class(OpenLayers.Handler, {
+    started: !1,
+    stopDown: !1,
+    pinching: !1,
+    last: null,
+    start: null,
+    touchstart: function(a) {
+        var b = !0;
+        this.pinching = !1;
+        OpenLayers.Event.isMultiTouch(a) ? (this.started = !0, this.last = this.start = {
+            distance: this.getDistance(a.touches),
+            delta: 0,
+            scale: 1
+        }, this.callback("start", [a, this.start]), b = !this.stopDown) : (this.started = !1, this.last = this.start = null);
+        OpenLayers.Event.stop(a);
+        return b
+    },
+    touchmove: function(a) {
+        if (this.started && OpenLayers.Event.isMultiTouch(a)) {
+            this.pinching = !0;
+            var b = this.getPinchData(a);
+            this.callback("move", [a, b]);
+            this.last = b;
+            OpenLayers.Event.stop(a)
+        }
+        return !0
+    },
+    touchend: function(a) {
+        this.started && (this.pinching = this.started = !1, this.callback("done", [a, this.start, this.last]), this.last = this.start = null);
+        return !0
+    },
+    activate: function() {
+        var a = !1;
+        OpenLayers.Handler.prototype.activate.apply(this, arguments) && (this.pinching = !1, a = !0);
+        return a
+    },
+    deactivate: function() {
+        var a = !1;
+        OpenLayers.Handler.prototype.deactivate.apply(this, arguments) && (this.pinching = this.started = !1, this.last = this.start = null, a = !0);
+        return a
+    },
+    getDistance: function(a) {
+        var b = a[0],
+            a = a[1];
+        return Math.sqrt(Math.pow(b.clientX - a.clientX, 2) + Math.pow(b.clientY - a.clientY, 2))
+    },
+    getPinchData: function(a) {
+        a = this.getDistance(a.touches);
+        return {
+            distance: a,
+            delta: this.last.distance - a,
+            scale: a / this.start.distance
+        }
+    },
+    CLASS_NAME: "OpenLayers.Handler.Pinch"
+});
+OpenLayers.Control.NavToolbar = OpenLayers.Class(OpenLayers.Control.Panel, {
+    initialize: function(a) {
+        OpenLayers.Control.Panel.prototype.initialize.apply(this, [a]);
+        this.addControls([new OpenLayers.Control.Navigation, new OpenLayers.Control.ZoomBox])
+    },
+    draw: function() {
+        var a = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments);
+        null === this.defaultControl && (this.defaultControl = this.controls[0]);
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Control.NavToolbar"
+});
+OpenLayers.Strategy.Refresh = OpenLayers.Class(OpenLayers.Strategy, {
+    force: !1,
+    interval: 0,
+    timer: null,
+    activate: function() {
+        var a = OpenLayers.Strategy.prototype.activate.call(this);
+        a && (!0 === this.layer.visibility && this.start(), this.layer.events.on({
+            visibilitychanged: this.reset,
+            scope: this
+        }));
+        return a
+    },
+    deactivate: function() {
+        var a = OpenLayers.Strategy.prototype.deactivate.call(this);
+        a && this.stop();
+        return a
+    },
+    reset: function() {
+        !0 === this.layer.visibility ? this.start() : this.stop()
+    },
+    start: function() {
+        this.interval && ("number" ===
+            typeof this.interval && 0 < this.interval) && (this.timer = window.setInterval(OpenLayers.Function.bind(this.refresh, this), this.interval))
+    },
+    refresh: function() {
+        this.layer && (this.layer.refresh && "function" == typeof this.layer.refresh) && this.layer.refresh({
+            force: this.force
+        })
+    },
+    stop: function() {
+        null !== this.timer && (window.clearInterval(this.timer), this.timer = null)
+    },
+    CLASS_NAME: "OpenLayers.Strategy.Refresh"
+});
+OpenLayers.Layer.ArcGIS93Rest = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    DEFAULT_PARAMS: {
+        format: "png"
+    },
+    isBaseLayer: !0,
+    initialize: function(a, b, c, d) {
+        var e = [],
+            c = OpenLayers.Util.upperCaseObject(c);
+        e.push(a, b, c, d);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, e);
+        OpenLayers.Util.applyDefaults(this.params, OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS));
+        if (this.params.TRANSPARENT && "true" == this.params.TRANSPARENT.toString().toLowerCase()) {
+            if (null == d || !d.isBaseLayer) this.isBaseLayer = !1;
+            "jpg" == this.params.FORMAT &&
+                (this.params.FORMAT = OpenLayers.Util.alphaHack() ? "gif" : "png")
+        }
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.ArcGIS93Rest(this.name, this.url, this.params, this.getOptions()));
+        return a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+    },
+    getURL: function(a) {
+        var a = this.adjustBounds(a),
+            b = this.projection.getCode().split(":"),
+            b = b[b.length - 1],
+            c = this.getImageSize(),
+            a = {
+                BBOX: a.toBBOX(),
+                SIZE: c.w + "," + c.h,
+                F: "image",
+                BBOXSR: b,
+                IMAGESR: b
+            };
+        if (this.layerDefs) {
+            var b = [],
+                d;
+            for (d in this.layerDefs) this.layerDefs.hasOwnProperty(d) &&
+                this.layerDefs[d] && (b.push(d), b.push(":"), b.push(this.layerDefs[d]), b.push(";"));
+            0 < b.length && (a.LAYERDEFS = b.join(""))
+        }
+        return this.getFullRequestString(a)
+    },
+    setLayerFilter: function(a, b) {
+        this.layerDefs || (this.layerDefs = {});
+        b ? this.layerDefs[a] = b : delete this.layerDefs[a]
+    },
+    clearLayerFilter: function(a) {
+        a ? delete this.layerDefs[a] : delete this.layerDefs
+    },
+    mergeNewParams: function(a) {
+        a = [OpenLayers.Util.upperCaseObject(a)];
+        return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this, a)
+    },
+    CLASS_NAME: "OpenLayers.Layer.ArcGIS93Rest"
+});
+OpenLayers.Format.WKT = OpenLayers.Class(OpenLayers.Format, {
+    initialize: function(a) {
+        this.regExes = {
+            typeStr: /^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/,
+            spaces: /\s+/,
+            parenComma: /\)\s*,\s*\(/,
+            doubleParenComma: /\)\s*\)\s*,\s*\(\s*\(/,
+            trimParens: /^\s*\(?(.*?)\)?\s*$/
+        };
+        OpenLayers.Format.prototype.initialize.apply(this, [a])
+    },
+    read: function(a) {
+        var b, c, a = a.replace(/[\n\r]/g, " ");
+        if (c = this.regExes.typeStr.exec(a))
+            if (a = c[1].toLowerCase(), c = c[2], this.parse[a] && (b = this.parse[a].apply(this, [c])), this.internalProjection && this.externalProjection)
+                if (b &&
+                    "OpenLayers.Feature.Vector" == b.CLASS_NAME) b.geometry.transform(this.externalProjection, this.internalProjection);
+                else if (b && "geometrycollection" != a && "object" == typeof b) {
+            a = 0;
+            for (c = b.length; a < c; a++) b[a].geometry.transform(this.externalProjection, this.internalProjection)
+        }
+        return b
+    },
+    write: function(a) {
+        var b, c;
+        a.constructor == Array ? c = !0 : (a = [a], c = !1);
+        var d = [];
+        c && d.push("GEOMETRYCOLLECTION(");
+        for (var e = 0, f = a.length; e < f; ++e) c && 0 < e && d.push(","), b = a[e].geometry, d.push(this.extractGeometry(b));
+        c && d.push(")");
+        return d.join("")
+    },
+    extractGeometry: function(a) {
+        var b = a.CLASS_NAME.split(".")[2].toLowerCase();
+        if (!this.extract[b]) return null;
+        this.internalProjection && this.externalProjection && (a = a.clone(), a.transform(this.internalProjection, this.externalProjection));
+        return ("collection" == b ? "GEOMETRYCOLLECTION" : b.toUpperCase()) + "(" + this.extract[b].apply(this, [a]) + ")"
+    },
+    extract: {
+        point: function(a) {
+            return a.x + " " + a.y
+        },
+        multipoint: function(a) {
+            for (var b = [], c = 0, d = a.components.length; c < d; ++c) b.push("(" + this.extract.point.apply(this, [a.components[c]]) +
+                ")");
+            return b.join(",")
+        },
+        linestring: function(a) {
+            for (var b = [], c = 0, d = a.components.length; c < d; ++c) b.push(this.extract.point.apply(this, [a.components[c]]));
+            return b.join(",")
+        },
+        multilinestring: function(a) {
+            for (var b = [], c = 0, d = a.components.length; c < d; ++c) b.push("(" + this.extract.linestring.apply(this, [a.components[c]]) + ")");
+            return b.join(",")
+        },
+        polygon: function(a) {
+            for (var b = [], c = 0, d = a.components.length; c < d; ++c) b.push("(" + this.extract.linestring.apply(this, [a.components[c]]) + ")");
+            return b.join(",")
+        },
+        multipolygon: function(a) {
+            for (var b = [], c = 0, d = a.components.length; c < d; ++c) b.push("(" + this.extract.polygon.apply(this, [a.components[c]]) + ")");
+            return b.join(",")
+        },
+        collection: function(a) {
+            for (var b = [], c = 0, d = a.components.length; c < d; ++c) b.push(this.extractGeometry.apply(this, [a.components[c]]));
+            return b.join(",")
+        }
+    },
+    parse: {
+        point: function(a) {
+            a = OpenLayers.String.trim(a).split(this.regExes.spaces);
+            return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(a[0], a[1]))
+        },
+        multipoint: function(a) {
+            for (var b = OpenLayers.String.trim(a).split(","),
+                    c = [], d = 0, e = b.length; d < e; ++d) a = b[d].replace(this.regExes.trimParens, "$1"), c.push(this.parse.point.apply(this, [a]).geometry);
+            return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiPoint(c))
+        },
+        linestring: function(a) {
+            for (var a = OpenLayers.String.trim(a).split(","), b = [], c = 0, d = a.length; c < d; ++c) b.push(this.parse.point.apply(this, [a[c]]).geometry);
+            return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(b))
+        },
+        multilinestring: function(a) {
+            for (var b = OpenLayers.String.trim(a).split(this.regExes.parenComma),
+                    c = [], d = 0, e = b.length; d < e; ++d) a = b[d].replace(this.regExes.trimParens, "$1"), c.push(this.parse.linestring.apply(this, [a]).geometry);
+            return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiLineString(c))
+        },
+        polygon: function(a) {
+            for (var b, a = OpenLayers.String.trim(a).split(this.regExes.parenComma), c = [], d = 0, e = a.length; d < e; ++d) b = a[d].replace(this.regExes.trimParens, "$1"), b = this.parse.linestring.apply(this, [b]).geometry, b = new OpenLayers.Geometry.LinearRing(b.components), c.push(b);
+            return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon(c))
+        },
+        multipolygon: function(a) {
+            for (var b = OpenLayers.String.trim(a).split(this.regExes.doubleParenComma), c = [], d = 0, e = b.length; d < e; ++d) a = b[d].replace(this.regExes.trimParens, "$1"), c.push(this.parse.polygon.apply(this, [a]).geometry);
+            return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiPolygon(c))
+        },
+        geometrycollection: function(a) {
+            for (var a = a.replace(/,\s*([A-Za-z])/g, "|$1"), a = OpenLayers.String.trim(a).split("|"), b = [], c = 0, d = a.length; c < d; ++c) b.push(OpenLayers.Format.WKT.prototype.read.apply(this, [a[c]]));
+            return b
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.WKT"
+});
+OpenLayers.Handler.Hover = OpenLayers.Class(OpenLayers.Handler, {
+    delay: 500,
+    pixelTolerance: null,
+    stopMove: !1,
+    px: null,
+    timerId: null,
+    mousemove: function(a) {
+        this.passesTolerance(a.xy) && (this.clearTimer(), this.callback("move", [a]), this.px = a.xy, a = OpenLayers.Util.extend({}, a), this.timerId = window.setTimeout(OpenLayers.Function.bind(this.delayedCall, this, a), this.delay));
+        return !this.stopMove
+    },
+    mouseout: function(a) {
+        OpenLayers.Util.mouseLeft(a, this.map.viewPortDiv) && (this.clearTimer(), this.callback("move", [a]));
+        return !0
+    },
+    passesTolerance: function(a) {
+        var b = !0;
+        this.pixelTolerance && this.px && Math.sqrt(Math.pow(this.px.x - a.x, 2) + Math.pow(this.px.y - a.y, 2)) < this.pixelTolerance && (b = !1);
+        return b
+    },
+    clearTimer: function() {
+        null != this.timerId && (window.clearTimeout(this.timerId), this.timerId = null)
+    },
+    delayedCall: function(a) {
+        this.callback("pause", [a])
+    },
+    deactivate: function() {
+        var a = !1;
+        OpenLayers.Handler.prototype.deactivate.apply(this, arguments) && (this.clearTimer(), a = !0);
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Handler.Hover"
+});
+OpenLayers.Control.GetFeature = OpenLayers.Class(OpenLayers.Control, {
+    protocol: null,
+    multipleKey: null,
+    toggleKey: null,
+    modifiers: null,
+    multiple: !1,
+    click: !0,
+    single: !0,
+    clickout: !0,
+    toggle: !1,
+    clickTolerance: 5,
+    hover: !1,
+    box: !1,
+    maxFeatures: 10,
+    features: null,
+    hoverFeature: null,
+    handlerOptions: null,
+    handlers: null,
+    hoverResponse: null,
+    filterType: OpenLayers.Filter.Spatial.BBOX,
+    initialize: function(a) {
+        a.handlerOptions = a.handlerOptions || {};
+        OpenLayers.Control.prototype.initialize.apply(this, [a]);
+        this.features = {};
+        this.handlers = {};
+        this.click && (this.handlers.click = new OpenLayers.Handler.Click(this, {
+            click: this.selectClick
+        }, this.handlerOptions.click || {}));
+        this.box && (this.handlers.box = new OpenLayers.Handler.Box(this, {
+            done: this.selectBox
+        }, OpenLayers.Util.extend(this.handlerOptions.box, {
+            boxDivClassName: "olHandlerBoxSelectFeature"
+        })));
+        this.hover && (this.handlers.hover = new OpenLayers.Handler.Hover(this, {
+            move: this.cancelHover,
+            pause: this.selectHover
+        }, OpenLayers.Util.extend(this.handlerOptions.hover, {
+            delay: 250,
+            pixelTolerance: 2
+        })))
+    },
+    activate: function() {
+        if (!this.active)
+            for (var a in this.handlers) this.handlers[a].activate();
+        return OpenLayers.Control.prototype.activate.apply(this, arguments)
+    },
+    deactivate: function() {
+        if (this.active)
+            for (var a in this.handlers) this.handlers[a].deactivate();
+        return OpenLayers.Control.prototype.deactivate.apply(this, arguments)
+    },
+    selectClick: function(a) {
+        var b = this.pixelToBounds(a.xy);
+        this.setModifiers(a);
+        this.request(b, {
+            single: this.single
+        })
+    },
+    selectBox: function(a) {
+        var b;
+        if (a instanceof OpenLayers.Bounds) b =
+            this.map.getLonLatFromPixel({
+                x: a.left,
+                y: a.bottom
+            }), a = this.map.getLonLatFromPixel({
+                x: a.right,
+                y: a.top
+            }), b = new OpenLayers.Bounds(b.lon, b.lat, a.lon, a.lat);
+        else {
+            if (this.click) return;
+            b = this.pixelToBounds(a)
+        }
+        this.setModifiers(this.handlers.box.dragHandler.evt);
+        this.request(b)
+    },
+    selectHover: function(a) {
+        this.request(this.pixelToBounds(a.xy), {
+            single: !0,
+            hover: !0
+        })
+    },
+    cancelHover: function() {
+        this.hoverResponse && (this.protocol.abort(this.hoverResponse), this.hoverResponse = null, OpenLayers.Element.removeClass(this.map.viewPortDiv,
+            "olCursorWait"))
+    },
+    request: function(a, b) {
+        var b = b || {},
+            c = new OpenLayers.Filter.Spatial({
+                type: this.filterType,
+                value: a
+            });
+        OpenLayers.Element.addClass(this.map.viewPortDiv, "olCursorWait");
+        c = this.protocol.read({
+            maxFeatures: !0 == b.single ? this.maxFeatures : void 0,
+            filter: c,
+            callback: function(c) {
+                c.success() && (c.features.length ? !0 == b.single ? this.selectBestFeature(c.features, a.getCenterLonLat(), b) : this.select(c.features) : b.hover ? this.hoverSelect() : (this.events.triggerEvent("clickout"), this.clickout && this.unselectAll()));
+                OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait")
+            },
+            scope: this
+        });
+        !0 == b.hover && (this.hoverResponse = c)
+    },
+    selectBestFeature: function(a, b, c) {
+        c = c || {};
+        if (a.length) {
+            for (var b = new OpenLayers.Geometry.Point(b.lon, b.lat), d, e, f, g = Number.MAX_VALUE, h = 0; h < a.length && !(d = a[h], d.geometry && (f = b.distanceTo(d.geometry, {
+                    edge: !1
+                }), f < g && (g = f, e = d, 0 == g))); ++h);
+            !0 == c.hover ? this.hoverSelect(e) : this.select(e || a)
+        }
+    },
+    setModifiers: function(a) {
+        this.modifiers = {
+            multiple: this.multiple || this.multipleKey && a[this.multipleKey],
+            toggle: this.toggle || this.toggleKey && a[this.toggleKey]
+        }
+    },
+    select: function(a) {
+        !this.modifiers.multiple && !this.modifiers.toggle && this.unselectAll();
+        OpenLayers.Util.isArray(a) || (a = [a]);
+        var b = this.events.triggerEvent("beforefeaturesselected", {
+            features: a
+        });
+        if (!1 !== b) {
+            for (var c = [], d, e = 0, f = a.length; e < f; ++e) d = a[e], this.features[d.fid || d.id] ? this.modifiers.toggle && this.unselect(this.features[d.fid || d.id]) : (b = this.events.triggerEvent("beforefeatureselected", {
+                feature: d
+            }), !1 !== b && (this.features[d.fid || d.id] = d,
+                c.push(d), this.events.triggerEvent("featureselected", {
+                    feature: d
+                })));
+            this.events.triggerEvent("featuresselected", {
+                features: c
+            })
+        }
+    },
+    hoverSelect: function(a) {
+        var b = a ? a.fid || a.id : null,
+            c = this.hoverFeature ? this.hoverFeature.fid || this.hoverFeature.id : null;
+        c && c != b && (this.events.triggerEvent("outfeature", {
+            feature: this.hoverFeature
+        }), this.hoverFeature = null);
+        b && b != c && (this.events.triggerEvent("hoverfeature", {
+            feature: a
+        }), this.hoverFeature = a)
+    },
+    unselect: function(a) {
+        delete this.features[a.fid || a.id];
+        this.events.triggerEvent("featureunselected", {
+            feature: a
+        })
+    },
+    unselectAll: function() {
+        for (var a in this.features) this.unselect(this.features[a])
+    },
+    setMap: function(a) {
+        for (var b in this.handlers) this.handlers[b].setMap(a);
+        OpenLayers.Control.prototype.setMap.apply(this, arguments)
+    },
+    pixelToBounds: function(a) {
+        var b = a.add(-this.clickTolerance / 2, this.clickTolerance / 2),
+            a = a.add(this.clickTolerance / 2, -this.clickTolerance / 2),
+            b = this.map.getLonLatFromPixel(b),
+            a = this.map.getLonLatFromPixel(a);
+        return new OpenLayers.Bounds(b.lon, b.lat, a.lon, a.lat)
+    },
+    CLASS_NAME: "OpenLayers.Control.GetFeature"
+});
+OpenLayers.Format.QueryStringFilter = function() {
+    function a(a) {
+        a = a.replace(/%/g, "\\%");
+        a = a.replace(/\\\\\.(\*)?/g, function(a, b) {
+            return b ? a : "\\\\_"
+        });
+        a = a.replace(/\\\\\.\*/g, "\\\\%");
+        a = a.replace(/(\\)?\.(\*)?/g, function(a, b, c) {
+            return b || c ? a : "_"
+        });
+        a = a.replace(/(\\)?\.\*/g, function(a, b) {
+            return b ? a : "%"
+        });
+        a = a.replace(/\\\./g, ".");
+        return a = a.replace(/(\\)?\\\*/g, function(a, b) {
+            return b ? a : "*"
+        })
+    }
+    var b = {};
+    b[OpenLayers.Filter.Comparison.EQUAL_TO] = "eq";
+    b[OpenLayers.Filter.Comparison.NOT_EQUAL_TO] = "ne";
+    b[OpenLayers.Filter.Comparison.LESS_THAN] =
+        "lt";
+    b[OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO] = "lte";
+    b[OpenLayers.Filter.Comparison.GREATER_THAN] = "gt";
+    b[OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO] = "gte";
+    b[OpenLayers.Filter.Comparison.LIKE] = "ilike";
+    return OpenLayers.Class(OpenLayers.Format, {
+        wildcarded: !1,
+        srsInBBOX: !1,
+        write: function(c, d) {
+            var d = d || {},
+                e = c.CLASS_NAME,
+                e = e.substring(e.lastIndexOf(".") + 1);
+            switch (e) {
+                case "Spatial":
+                    switch (c.type) {
+                        case OpenLayers.Filter.Spatial.BBOX:
+                            d.bbox = c.value.toArray();
+                            this.srsInBBOX && c.projection &&
+                                d.bbox.push(c.projection.getCode());
+                            break;
+                        case OpenLayers.Filter.Spatial.DWITHIN:
+                            d.tolerance = c.distance;
+                        case OpenLayers.Filter.Spatial.WITHIN:
+                            d.lon = c.value.x;
+                            d.lat = c.value.y;
+                            break;
+                        default:
+                            OpenLayers.Console.warn("Unknown spatial filter type " + c.type)
+                    }
+                    break;
+                case "Comparison":
+                    e = b[c.type];
+                    if (void 0 !== e) {
+                        var f = c.value;
+                        c.type == OpenLayers.Filter.Comparison.LIKE && (f = a(f), this.wildcarded && (f = "%" + f + "%"));
+                        d[c.property + "__" + e] = f;
+                        d.queryable = d.queryable || [];
+                        d.queryable.push(c.property)
+                    } else OpenLayers.Console.warn("Unknown comparison filter type " +
+                        c.type);
+                    break;
+                case "Logical":
+                    if (c.type === OpenLayers.Filter.Logical.AND) {
+                        e = 0;
+                        for (f = c.filters.length; e < f; e++) d = this.write(c.filters[e], d)
+                    } else OpenLayers.Console.warn("Unsupported logical filter type " + c.type);
+                    break;
+                default:
+                    OpenLayers.Console.warn("Unknown filter type " + e)
+            }
+            return d
+        },
+        CLASS_NAME: "OpenLayers.Format.QueryStringFilter"
+    })
+}();
+OpenLayers.Control.MousePosition = OpenLayers.Class(OpenLayers.Control, {
+    autoActivate: !true,
+    element: null,
+    prefix: "",
+    separator: ", ",
+    suffix: "",
+    numDigits: 5,
+    granularity: 10,
+    emptyString: "",
+    lastXy: null,
+    displayProjection: null,
+    destroy: function() {
+        this.deactivate();
+        OpenLayers.Control.prototype.destroy.apply(this, arguments)
+    },
+    activate: function() {
+        return OpenLayers.Control.prototype.activate.apply(this, arguments) ? (this.map.events.register("mousemove", this, this.redraw), this.map.events.register("mouseout", this, this.reset),
+            this.redraw(), !0) : !1
+    },
+    deactivate: function() {
+        return OpenLayers.Control.prototype.deactivate.apply(this, arguments) ? (this.map.events.unregister("mousemove", this, this.redraw), this.map.events.unregister("mouseout", this, this.reset), this.element.innerHTML = "", !0) : !1
+    },
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        this.element || (this.div.left = "", this.div.top = "", this.element = this.div);
+        return this.div
+    },
+    redraw: function(a) {
+        var b;
+        if (null == a) this.reset();
+        else if (null == this.lastXy || Math.abs(a.xy.x -
+                this.lastXy.x) > this.granularity || Math.abs(a.xy.y - this.lastXy.y) > this.granularity) this.lastXy = a.xy;
+        else if (b = this.map.getLonLatFromPixel(a.xy)) 
+        	this.displayProjection && b.transform(this.map.getProjectionObject(), this.displayProjection), this.lastXy = a.xy, a = this.formatOutput(b), a != this.element.innerHTML && (this.element.innerHTML = a)
+    },
+    reset: function() {
+        null != this.emptyString && (this.element.innerHTML = this.emptyString)
+    },
+    formatOutput: function(a) {
+        var b = parseInt(this.numDigits);
+        return this.prefix + a.lon.toFixed(b) +
+            this.separator + a.lat.toFixed(b) + this.suffix
+    },
+    CLASS_NAME: "OpenLayers.Control.MousePosition"
+});
+OpenLayers.Control.Geolocate = OpenLayers.Class(OpenLayers.Control, {
+    geolocation: navigator.geolocation,
+    bind: !0,
+    watch: !1,
+    geolocationOptions: null,
+    destroy: function() {
+        this.deactivate();
+        OpenLayers.Control.prototype.destroy.apply(this, arguments)
+    },
+    activate: function() {
+        return !this.geolocation ? (this.events.triggerEvent("locationuncapable"), !1) : OpenLayers.Control.prototype.activate.apply(this, arguments) ? (this.watch ? this.watchId = this.geolocation.watchPosition(OpenLayers.Function.bind(this.geolocate, this), OpenLayers.Function.bind(this.failure,
+            this), this.geolocationOptions) : this.getCurrentLocation(), !0) : !1
+    },
+    deactivate: function() {
+        this.active && null !== this.watchId && this.geolocation.clearWatch(this.watchId);
+        return OpenLayers.Control.prototype.deactivate.apply(this, arguments)
+    },
+    geolocate: function(a) {
+        var b = (new OpenLayers.LonLat(a.coords.longitude, a.coords.latitude)).transform(new OpenLayers.Projection("EPSG:4326"), this.map.getProjectionObject());
+        this.bind && this.map.setCenter(b);
+        this.events.triggerEvent("locationupdated", {
+            position: a,
+            point: new OpenLayers.Geometry.Point(b.lon,
+                b.lat)
+        })
+    },
+    getCurrentLocation: function() {
+        if (!this.active || this.watch) return !1;
+        this.geolocation.getCurrentPosition(OpenLayers.Function.bind(this.geolocate, this), OpenLayers.Function.bind(this.failure, this), this.geolocationOptions);
+        return !0
+    },
+    failure: function(a) {
+        this.events.triggerEvent("locationfailed", {
+            error: a
+        })
+    },
+    CLASS_NAME: "OpenLayers.Control.Geolocate"
+});
+OpenLayers.Tile.UTFGrid = OpenLayers.Class(OpenLayers.Tile, {
+    url: null,
+    utfgridResolution: 2,
+    json: null,
+    format: null,
+    destroy: function() {
+        this.clear();
+        OpenLayers.Tile.prototype.destroy.apply(this, arguments)
+    },
+    draw: function() {
+        var a = OpenLayers.Tile.prototype.draw.apply(this, arguments);
+        if (a)
+            if (this.isLoading ? (this.abortLoading(), this.events.triggerEvent("reload")) : (this.isLoading = !0, this.events.triggerEvent("loadstart")), this.url = this.layer.getURL(this.bounds), this.layer.useJSONP) {
+                var b = new OpenLayers.Protocol.Script({
+                    url: this.url,
+                    callback: function(a) {
+                        this.isLoading = false;
+                        this.events.triggerEvent("loadend");
+                        this.json = a.data
+                    },
+                    scope: this
+                });
+                b.read();
+                this.request = b
+            } else this.request = OpenLayers.Request.GET({
+                url: this.url,
+                callback: function(a) {
+                    this.isLoading = false;
+                    this.events.triggerEvent("loadend");
+                    a.status === 200 && this.parseData(a.responseText)
+                },
+                scope: this
+            });
+        else this.unload();
+        return a
+    },
+    abortLoading: function() {
+        this.request && (this.request.abort(), delete this.request);
+        this.isLoading = !1
+    },
+    getFeatureInfo: function(a, b) {
+        var c = null;
+        if (this.json) {
+            var d =
+                this.getFeatureId(a, b);
+            null !== d && (c = {
+                id: d,
+                data: this.json.data[d]
+            })
+        }
+        return c
+    },
+    getFeatureId: function(a, b) {
+        var c = null;
+        if (this.json) {
+            var d = this.utfgridResolution,
+                d = this.indexFromCharCode(this.json.grid[Math.floor(b / d)].charCodeAt(Math.floor(a / d))),
+                e = this.json.keys;
+            !isNaN(d) && d in e && (c = e[d])
+        }
+        return c
+    },
+    indexFromCharCode: function(a) {
+        93 <= a && a--;
+        35 <= a && a--;
+        return a - 32
+    },
+    parseData: function(a) {
+        this.format || (this.format = new OpenLayers.Format.JSON);
+        this.json = this.format.read(a)
+    },
+    clear: function() {
+        this.json = null
+    },
+    CLASS_NAME: "OpenLayers.Tile.UTFGrid"
+});
+OpenLayers.Control.NavigationHistory = OpenLayers.Class(OpenLayers.Control, {
+    type: OpenLayers.Control.TYPE_TOGGLE,
+    previous: null,
+    previousOptions: null,
+    next: null,
+    nextOptions: null,
+    limit: 50,
+    autoActivate: !0,
+    clearOnDeactivate: !1,
+    registry: null,
+    nextStack: null,
+    previousStack: null,
+    listeners: null,
+    restoring: !1,
+    initialize: function(a) {
+        OpenLayers.Control.prototype.initialize.apply(this, [a]);
+        this.registry = OpenLayers.Util.extend({
+            moveend: this.getState
+        }, this.registry);
+        a = {
+            trigger: OpenLayers.Function.bind(this.previousTrigger,
+                this),
+            displayClass: this.displayClass + " " + this.displayClass + "Previous"
+        };
+        OpenLayers.Util.extend(a, this.previousOptions);
+        this.previous = new OpenLayers.Control.Button(a);
+        a = {
+            trigger: OpenLayers.Function.bind(this.nextTrigger, this),
+            displayClass: this.displayClass + " " + this.displayClass + "Next"
+        };
+        OpenLayers.Util.extend(a, this.nextOptions);
+        this.next = new OpenLayers.Control.Button(a);
+        this.clear()
+    },
+    onPreviousChange: function(a) {
+        a && !this.previous.active ? this.previous.activate() : !a && this.previous.active && this.previous.deactivate()
+    },
+    onNextChange: function(a) {
+        a && !this.next.active ? this.next.activate() : !a && this.next.active && this.next.deactivate()
+    },
+    destroy: function() {
+        OpenLayers.Control.prototype.destroy.apply(this);
+        this.previous.destroy();
+        this.next.destroy();
+        this.deactivate();
+        for (var a in this) this[a] = null
+    },
+    setMap: function(a) {
+        this.map = a;
+        this.next.setMap(a);
+        this.previous.setMap(a)
+    },
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        this.next.draw();
+        this.previous.draw()
+    },
+    previousTrigger: function() {
+        var a = this.previousStack.shift(),
+            b = this.previousStack.shift();
+        void 0 != b ? (this.nextStack.unshift(a), this.previousStack.unshift(b), this.restoring = !0, this.restore(b), this.restoring = !1, this.onNextChange(this.nextStack[0], this.nextStack.length), this.onPreviousChange(this.previousStack[1], this.previousStack.length - 1)) : this.previousStack.unshift(a);
+        return b
+    },
+    nextTrigger: function() {
+        var a = this.nextStack.shift();
+        void 0 != a && (this.previousStack.unshift(a), this.restoring = !0, this.restore(a), this.restoring = !1, this.onNextChange(this.nextStack[0],
+            this.nextStack.length), this.onPreviousChange(this.previousStack[1], this.previousStack.length - 1));
+        return a
+    },
+    clear: function() {
+        this.previousStack = [];
+        this.previous.deactivate();
+        this.nextStack = [];
+        this.next.deactivate()
+    },
+    getState: function() {
+        return {
+            center: this.map.getCenter(),
+            resolution: this.map.getResolution(),
+            projection: this.map.getProjectionObject(),
+            units: this.map.getProjectionObject().getUnits() || this.map.units || this.map.baseLayer.units
+        }
+    },
+    restore: function(a) {
+        var b, c;
+        if (this.map.getProjectionObject() ==
+            a.projection) c = this.map.getZoomForResolution(a.resolution), b = a.center;
+        else {
+            b = a.center.clone();
+            b.transform(a.projection, this.map.getProjectionObject());
+            c = a.units;
+            var d = this.map.getProjectionObject().getUnits() || this.map.units || this.map.baseLayer.units;
+            c = this.map.getZoomForResolution((c && d ? OpenLayers.INCHES_PER_UNIT[c] / OpenLayers.INCHES_PER_UNIT[d] : 1) * a.resolution)
+        }
+        this.map.setCenter(b, c)
+    },
+    setListeners: function() {
+        this.listeners = {};
+        for (var a in this.registry) this.listeners[a] = OpenLayers.Function.bind(function() {
+            if (!this.restoring) {
+                this.previousStack.unshift(this.registry[a].apply(this,
+                    arguments));
+                if (1 < this.previousStack.length) this.onPreviousChange(this.previousStack[1], this.previousStack.length - 1);
+                this.previousStack.length > this.limit + 1 && this.previousStack.pop();
+                0 < this.nextStack.length && (this.nextStack = [], this.onNextChange(null, 0))
+            }
+            return !0
+        }, this)
+    },
+    activate: function() {
+        var a = !1;
+        if (this.map && OpenLayers.Control.prototype.activate.apply(this)) {
+            null == this.listeners && this.setListeners();
+            for (var b in this.listeners) this.map.events.register(b, this, this.listeners[b]);
+            a = !0;
+            0 == this.previousStack.length &&
+                this.initStack()
+        }
+        return a
+    },
+    initStack: function() {
+        this.map.getCenter() && this.listeners.moveend()
+    },
+    deactivate: function() {
+        var a = !1;
+        if (this.map && OpenLayers.Control.prototype.deactivate.apply(this)) {
+            for (var b in this.listeners) this.map.events.unregister(b, this, this.listeners[b]);
+            this.clearOnDeactivate && this.clear();
+            a = !0
+        }
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Control.NavigationHistory"
+});
+OpenLayers.Protocol.HTTP = OpenLayers.Class(OpenLayers.Protocol, {
+    url: null,
+    headers: null,
+    params: null,
+    callback: null,
+    scope: null,
+    readWithPOST: !1,
+    updateWithPOST: !1,
+    deleteWithPOST: !1,
+    wildcarded: !1,
+    srsInBBOX: !1,
+    initialize: function(a) {
+        a = a || {};
+        this.params = {};
+        this.headers = {};
+        OpenLayers.Protocol.prototype.initialize.apply(this, arguments);
+        if (!this.filterToParams && OpenLayers.Format.QueryStringFilter) {
+            var b = new OpenLayers.Format.QueryStringFilter({
+                wildcarded: this.wildcarded,
+                srsInBBOX: this.srsInBBOX
+            });
+            this.filterToParams =
+                function(a, d) {
+                    return b.write(a, d)
+                }
+        }
+    },
+    destroy: function() {
+        this.headers = this.params = null;
+        OpenLayers.Protocol.prototype.destroy.apply(this)
+    },
+    read: function(a) {
+        OpenLayers.Protocol.prototype.read.apply(this, arguments);
+        a = a || {};
+        a.params = OpenLayers.Util.applyDefaults(a.params, this.options.params);
+        a = OpenLayers.Util.applyDefaults(a, this.options);
+        a.filter && this.filterToParams && (a.params = this.filterToParams(a.filter, a.params));
+        var b = void 0 !== a.readWithPOST ? a.readWithPOST : this.readWithPOST,
+            c = new OpenLayers.Protocol.Response({
+                requestType: "read"
+            });
+        b ? (b = a.headers || {}, b["Content-Type"] = "application/x-www-form-urlencoded", c.priv = OpenLayers.Request.POST({
+            url: a.url,
+            callback: this.createCallback(this.handleRead, c, a),
+            data: OpenLayers.Util.getParameterString(a.params),
+            headers: b
+        })) : c.priv = OpenLayers.Request.GET({
+            url: a.url,
+            callback: this.createCallback(this.handleRead, c, a),
+            params: a.params,
+            headers: a.headers
+        });
+        return c
+    },
+    handleRead: function(a, b) {
+        this.handleResponse(a, b)
+    },
+    create: function(a, b) {
+        var b = OpenLayers.Util.applyDefaults(b, this.options),
+            c = new OpenLayers.Protocol.Response({
+                reqFeatures: a,
+                requestType: "create"
+            });
+        c.priv = OpenLayers.Request.POST({
+            url: b.url,
+            callback: this.createCallback(this.handleCreate, c, b),
+            headers: b.headers,
+            data: this.format.write(a)
+        });
+        return c
+    },
+    handleCreate: function(a, b) {
+        this.handleResponse(a, b)
+    },
+    update: function(a, b) {
+        var b = b || {},
+            c = b.url || a.url || this.options.url + "/" + a.fid,
+            b = OpenLayers.Util.applyDefaults(b, this.options),
+            d = new OpenLayers.Protocol.Response({
+                reqFeatures: a,
+                requestType: "update"
+            });
+        d.priv = OpenLayers.Request[this.updateWithPOST ? "POST" : "PUT"]({
+            url: c,
+            callback: this.createCallback(this.handleUpdate,
+                d, b),
+            headers: b.headers,
+            data: this.format.write(a)
+        });
+        return d
+    },
+    handleUpdate: function(a, b) {
+        this.handleResponse(a, b)
+    },
+    "delete": function(a, b) {
+        var b = b || {},
+            c = b.url || a.url || this.options.url + "/" + a.fid,
+            b = OpenLayers.Util.applyDefaults(b, this.options),
+            d = new OpenLayers.Protocol.Response({
+                reqFeatures: a,
+                requestType: "delete"
+            }),
+            e = this.deleteWithPOST ? "POST" : "DELETE",
+            c = {
+                url: c,
+                callback: this.createCallback(this.handleDelete, d, b),
+                headers: b.headers
+            };
+        this.deleteWithPOST && (c.data = this.format.write(a));
+        d.priv = OpenLayers.Request[e](c);
+        return d
+    },
+    handleDelete: function(a, b) {
+        this.handleResponse(a, b)
+    },
+    handleResponse: function(a, b) {
+        var c = a.priv;
+        b.callback && (200 <= c.status && 300 > c.status ? ("delete" != a.requestType && (a.features = this.parseFeatures(c)), a.code = OpenLayers.Protocol.Response.SUCCESS) : a.code = OpenLayers.Protocol.Response.FAILURE, b.callback.call(b.scope, a))
+    },
+    parseFeatures: function(a) {
+        var b = a.responseXML;
+        if (!b || !b.documentElement) b = a.responseText;
+        return !b || 0 >= b.length ? null : this.format.read(b)
+    },
+    commit: function(a, b) {
+        function c(a) {
+            for (var b =
+                    a.features ? a.features.length : 0, c = Array(b), e = 0; e < b; ++e) c[e] = a.features[e].fid;
+            o.insertIds = c;
+            d.apply(this, [a])
+        }
+
+        function d(a) {
+            this.callUserCallback(a, b);
+            n = n && a.success();
+            f++;
+            f >= m && b.callback && (o.code = n ? OpenLayers.Protocol.Response.SUCCESS : OpenLayers.Protocol.Response.FAILURE, b.callback.apply(b.scope, [o]))
+        }
+        var b = OpenLayers.Util.applyDefaults(b, this.options),
+            e = [],
+            f = 0,
+            g = {};
+        g[OpenLayers.State.INSERT] = [];
+        g[OpenLayers.State.UPDATE] = [];
+        g[OpenLayers.State.DELETE] = [];
+        for (var h, i, j = [], k = 0, l = a.length; k < l; ++k)
+            if (h =
+                a[k], i = g[h.state]) i.push(h), j.push(h);
+        var m = (0 < g[OpenLayers.State.INSERT].length ? 1 : 0) + g[OpenLayers.State.UPDATE].length + g[OpenLayers.State.DELETE].length,
+            n = !0,
+            o = new OpenLayers.Protocol.Response({
+                reqFeatures: j
+            });
+        h = g[OpenLayers.State.INSERT];
+        0 < h.length && e.push(this.create(h, OpenLayers.Util.applyDefaults({
+            callback: c,
+            scope: this
+        }, b.create)));
+        h = g[OpenLayers.State.UPDATE];
+        for (k = h.length - 1; 0 <= k; --k) e.push(this.update(h[k], OpenLayers.Util.applyDefaults({
+            callback: d,
+            scope: this
+        }, b.update)));
+        h = g[OpenLayers.State.DELETE];
+        for (k = h.length - 1; 0 <= k; --k) e.push(this["delete"](h[k], OpenLayers.Util.applyDefaults({
+            callback: d,
+            scope: this
+        }, b["delete"])));
+        return e
+    },
+    abort: function(a) {
+        a && a.priv.abort()
+    },
+    callUserCallback: function(a, b) {
+        var c = b[a.requestType];
+        c && c.callback && c.callback.call(c.scope, a)
+    },
+    CLASS_NAME: "OpenLayers.Protocol.HTTP"
+});
+OpenLayers.Strategy.Cluster = OpenLayers.Class(OpenLayers.Strategy, {
+    distance: 20,
+    threshold: null,
+    features: null,
+    clusters: null,
+    clustering: !1,
+    resolution: null,
+    activate: function() {
+        var a = OpenLayers.Strategy.prototype.activate.call(this);
+        if (a) this.layer.events.on({
+            beforefeaturesadded: this.cacheFeatures,
+            moveend: this.cluster,
+            scope: this
+        });
+        return a
+    },
+    deactivate: function() {
+        var a = OpenLayers.Strategy.prototype.deactivate.call(this);
+        a && (this.clearCache(), this.layer.events.un({
+            beforefeaturesadded: this.cacheFeatures,
+            moveend: this.cluster,
+            scope: this
+        }));
+        return a
+    },
+    cacheFeatures: function(a) {
+        var b = !0;
+        this.clustering || (this.clearCache(), this.features = a.features, this.cluster(), b = !1);
+        return b
+    },
+    clearCache: function() {
+        this.features = null
+    },
+    cluster: function(a) {
+        if ((!a || a.zoomChanged) && this.features)
+            if (a = this.layer.map.getResolution(), a != this.resolution || !this.clustersExist()) {
+                this.resolution = a;
+                for (var a = [], b, c, d, e = 0; e < this.features.length; ++e)
+                    if (b = this.features[e], b.geometry) {
+                        c = !1;
+                        for (var f = a.length - 1; 0 <= f; --f)
+                            if (d = a[f], this.shouldCluster(d, b)) {
+                                this.addToCluster(d,
+                                    b);
+                                c = !0;
+                                break
+                            }
+                        c || a.push(this.createCluster(this.features[e]))
+                    }
+                this.layer.removeAllFeatures();
+                if (0 < a.length) {
+                    if (1 < this.threshold) {
+                        b = a.slice();
+                        a = [];
+                        e = 0;
+                        for (d = b.length; e < d; ++e) c = b[e], c.attributes.count < this.threshold ? Array.prototype.push.apply(a, c.cluster) : a.push(c)
+                    }
+                    this.clustering = !0;
+                    this.layer.addFeatures(a);
+                    this.clustering = !1
+                }
+                this.clusters = a
+            }
+    },
+    clustersExist: function() {
+        var a = !1;
+        if (this.clusters && 0 < this.clusters.length && this.clusters.length == this.layer.features.length)
+            for (var a = !0, b = 0; b < this.clusters.length; ++b)
+                if (this.clusters[b] !=
+                    this.layer.features[b]) {
+                    a = !1;
+                    break
+                }
+        return a
+    },
+    shouldCluster: function(a, b) {
+        var c = a.geometry.getBounds().getCenterLonLat(),
+            d = b.geometry.getBounds().getCenterLonLat();
+        return Math.sqrt(Math.pow(c.lon - d.lon, 2) + Math.pow(c.lat - d.lat, 2)) / this.resolution <= this.distance
+    },
+    addToCluster: function(a, b) {
+        a.cluster.push(b);
+        a.attributes.count += 1
+    },
+    createCluster: function(a) {
+        var b = a.geometry.getBounds().getCenterLonLat(),
+            b = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(b.lon, b.lat), {
+                count: 1
+            });
+        b.cluster = [a];
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Strategy.Cluster"
+});
+OpenLayers.Strategy.Filter = OpenLayers.Class(OpenLayers.Strategy, {
+    filter: null,
+    cache: null,
+    caching: !1,
+    activate: function() {
+        var a = OpenLayers.Strategy.prototype.activate.apply(this, arguments);
+        a && (this.cache = [], this.layer.events.on({
+            beforefeaturesadded: this.handleAdd,
+            beforefeaturesremoved: this.handleRemove,
+            scope: this
+        }));
+        return a
+    },
+    deactivate: function() {
+        this.cache = null;
+        this.layer && this.layer.events && this.layer.events.un({
+            beforefeaturesadded: this.handleAdd,
+            beforefeaturesremoved: this.handleRemove,
+            scope: this
+        });
+        return OpenLayers.Strategy.prototype.deactivate.apply(this, arguments)
+    },
+    handleAdd: function(a) {
+        if (!this.caching && this.filter) {
+            var b = a.features;
+            a.features = [];
+            for (var c, d = 0, e = b.length; d < e; ++d) c = b[d], this.filter.evaluate(c) ? a.features.push(c) : this.cache.push(c)
+        }
+    },
+    handleRemove: function() {
+        this.caching || (this.cache = [])
+    },
+    setFilter: function(a) {
+        this.filter = a;
+        a = this.cache;
+        this.cache = [];
+        this.handleAdd({
+            features: this.layer.features
+        });
+        0 < this.cache.length && (this.caching = !0, this.layer.removeFeatures(this.cache.slice()),
+            this.caching = !1);
+        0 < a.length && (a = {
+            features: a
+        }, this.handleAdd(a), 0 < a.features.length && (this.caching = !0, this.layer.addFeatures(a.features), this.caching = !1))
+    },
+    CLASS_NAME: "OpenLayers.Strategy.Filter"
+});
+OpenLayers.Protocol.SOS = function(a) {
+    var a = OpenLayers.Util.applyDefaults(a, OpenLayers.Protocol.SOS.DEFAULTS),
+        b = OpenLayers.Protocol.SOS["v" + a.version.replace(/\./g, "_")];
+    if (!b) throw "Unsupported SOS version: " + a.version;
+    return new b(a)
+};
+OpenLayers.Protocol.SOS.DEFAULTS = {
+    version: "1.0.0"
+};
+OpenLayers.Format.WFSDescribeFeatureType = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        xsd: "http://www.w3.org/2001/XMLSchema"
+    },
+    readers: {
+        xsd: {
+            schema: function(a, b) {
+                var c = [],
+                    d = {};
+                this.readChildNodes(a, {
+                    complexTypes: c,
+                    customTypes: d
+                });
+                for (var e = a.attributes, f, g, h = 0, i = e.length; h < i; ++h) f = e[h], g = f.name, 0 == g.indexOf("xmlns") ? this.setNamespace(g.split(":")[1] || "", f.value) : b[g] = f.value;
+                b.featureTypes = c;
+                b.targetPrefix = this.namespaceAlias[b.targetNamespace];
+                h = 0;
+                for (i = c.length; h < i; ++h) e = c[h], f = d[e.typeName],
+                    d[e.typeName] && (e.typeName = f.name)
+            },
+            complexType: function(a, b) {
+                var c = {
+                    typeName: a.getAttribute("name")
+                };
+                this.readChildNodes(a, c);
+                b.complexTypes.push(c)
+            },
+            complexContent: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            extension: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            sequence: function(a, b) {
+                var c = {
+                    elements: []
+                };
+                this.readChildNodes(a, c);
+                b.properties = c.elements
+            },
+            element: function(a, b) {
+                if (b.elements) {
+                    for (var c = {}, d = a.attributes, e, f = 0, g = d.length; f < g; ++f) e = d[f], c[e.name] = e.value;
+                    d = c.type;
+                    d || (d = {}, this.readChildNodes(a,
+                        d), c.restriction = d, c.type = d.base);
+                    c.localType = (d.base || d).split(":").pop();
+                    b.elements.push(c)
+                }
+                b.complexTypes && (d = a.getAttribute("type"), c = d.split(":").pop(), b.customTypes[c] = {
+                    name: a.getAttribute("name"),
+                    type: d
+                })
+            },
+            simpleType: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            restriction: function(a, b) {
+                b.base = a.getAttribute("base");
+                this.readRestriction(a, b)
+            }
+        }
+    },
+    readRestriction: function(a, b) {
+        for (var c = a.childNodes, d, e, f = 0, g = c.length; f < g; ++f) d = c[f], 1 == d.nodeType && (e = d.nodeName.split(":").pop(), d = d.getAttribute("value"),
+            b[e] ? ("string" == typeof b[e] && (b[e] = [b[e]]), b[e].push(d)) : b[e] = d)
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var b = {};
+        this.readNode(a, b);
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Format.WFSDescribeFeatureType"
+});
+OpenLayers.Format.GeoRSS = OpenLayers.Class(OpenLayers.Format.XML, {
+    rssns: "http://backend.userland.com/rss2",
+    featureNS: "http://mapserver.gis.umn.edu/mapserver",
+    georssns: "http://www.georss.org/georss",
+    geons: "http://www.w3.org/2003/01/geo/wgs84_pos#",
+    featureTitle: "Untitled",
+    featureDescription: "No Description",
+    gmlParser: null,
+    xy: !1,
+    createGeometryFromItem: function(a) {
+        var b = this.getElementsByTagNameNS(a, this.georssns, "point"),
+            c = this.getElementsByTagNameNS(a, this.geons, "lat"),
+            d = this.getElementsByTagNameNS(a,
+                this.geons, "long"),
+            e = this.getElementsByTagNameNS(a, this.georssns, "line"),
+            f = this.getElementsByTagNameNS(a, this.georssns, "polygon"),
+            g = this.getElementsByTagNameNS(a, this.georssns, "where"),
+            a = this.getElementsByTagNameNS(a, this.georssns, "box");
+        if (0 < b.length || 0 < c.length && 0 < d.length) {
+            0 < b.length ? (c = OpenLayers.String.trim(b[0].firstChild.nodeValue).split(/\s+/), 2 != c.length && (c = OpenLayers.String.trim(b[0].firstChild.nodeValue).split(/\s*,\s*/))) : c = [parseFloat(c[0].firstChild.nodeValue), parseFloat(d[0].firstChild.nodeValue)];
+            var h = new OpenLayers.Geometry.Point(c[1], c[0])
+        } else if (0 < e.length) {
+            c = OpenLayers.String.trim(this.getChildValue(e[0])).split(/\s+/);
+            d = [];
+            e = 0;
+            for (f = c.length; e < f; e += 2) b = new OpenLayers.Geometry.Point(c[e + 1], c[e]), d.push(b);
+            h = new OpenLayers.Geometry.LineString(d)
+        } else if (0 < f.length) {
+            c = OpenLayers.String.trim(this.getChildValue(f[0])).split(/\s+/);
+            d = [];
+            e = 0;
+            for (f = c.length; e < f; e += 2) b = new OpenLayers.Geometry.Point(c[e + 1], c[e]), d.push(b);
+            h = new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(d)])
+        } else 0 <
+            g.length ? (this.gmlParser || (this.gmlParser = new OpenLayers.Format.GML({
+                xy: this.xy
+            })), h = this.gmlParser.parseFeature(g[0]).geometry) : 0 < a.length && (c = OpenLayers.String.trim(a[0].firstChild.nodeValue).split(/\s+/), d = [], 3 < c.length && (b = new OpenLayers.Geometry.Point(c[1], c[0]), d.push(b), b = new OpenLayers.Geometry.Point(c[1], c[2]), d.push(b), b = new OpenLayers.Geometry.Point(c[3], c[2]), d.push(b), b = new OpenLayers.Geometry.Point(c[3], c[0]), d.push(b), b = new OpenLayers.Geometry.Point(c[1], c[0]), d.push(b)), h = new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(d)]));
+        h && (this.internalProjection && this.externalProjection) && h.transform(this.externalProjection, this.internalProjection);
+        return h
+    },
+    createFeatureFromItem: function(a) {
+        var b = this.createGeometryFromItem(a),
+            c = this._getChildValue(a, "*", "title", this.featureTitle),
+            d = this._getChildValue(a, "*", "description", this._getChildValue(a, "*", "content", this._getChildValue(a, "*", "summary", this.featureDescription))),
+            e = this._getChildValue(a, "*", "link");
+        if (!e) try {
+            e = this.getElementsByTagNameNS(a, "*", "link")[0].getAttribute("href")
+        } catch (f) {
+            e =
+                null
+        }
+        a = this._getChildValue(a, "*", "id", null);
+        b = new OpenLayers.Feature.Vector(b, {
+            title: c,
+            description: d,
+            link: e
+        });
+        b.fid = a;
+        return b
+    },
+    _getChildValue: function(a, b, c, d) {
+        return (a = this.getElementsByTagNameNS(a, b, c)) && a[0] && a[0].firstChild && a[0].firstChild.nodeValue ? this.getChildValue(a[0]) : void 0 == d ? "" : d
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        var b = null,
+            b = this.getElementsByTagNameNS(a, "*", "item");
+        0 == b.length && (b = this.getElementsByTagNameNS(a, "*", "entry"));
+        for (var a = b.length, c = Array(a), d = 0; d < a; d++) c[d] = this.createFeatureFromItem(b[d]);
+        return c
+    },
+    write: function(a) {
+        var b;
+        if (OpenLayers.Util.isArray(a)) {
+            b = this.createElementNS(this.rssns, "rss");
+            for (var c = 0, d = a.length; c < d; c++) b.appendChild(this.createFeatureXML(a[c]))
+        } else b = this.createFeatureXML(a);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [b])
+    },
+    createFeatureXML: function(a) {
+        var b = this.buildGeometryNode(a.geometry),
+            c = this.createElementNS(this.rssns, "item"),
+            d = this.createElementNS(this.rssns, "title");
+        d.appendChild(this.createTextNode(a.attributes.title ? a.attributes.title : ""));
+        var e = this.createElementNS(this.rssns, "description");
+        e.appendChild(this.createTextNode(a.attributes.description ? a.attributes.description : ""));
+        c.appendChild(d);
+        c.appendChild(e);
+        a.attributes.link && (d = this.createElementNS(this.rssns, "link"), d.appendChild(this.createTextNode(a.attributes.link)), c.appendChild(d));
+        for (var f in a.attributes) "link" == f || ("title" == f || "description" == f) || (d = this.createTextNode(a.attributes[f]), e = f, -1 !=
+            f.search(":") && (e = f.split(":")[1]), e = this.createElementNS(this.featureNS, "feature:" + e), e.appendChild(d), c.appendChild(e));
+        c.appendChild(b);
+        return c
+    },
+    buildGeometryNode: function(a) {
+        this.internalProjection && this.externalProjection && (a = a.clone(), a.transform(this.internalProjection, this.externalProjection));
+        var b;
+        if ("OpenLayers.Geometry.Polygon" == a.CLASS_NAME) b = this.createElementNS(this.georssns, "georss:polygon"), b.appendChild(this.buildCoordinatesNode(a.components[0]));
+        else if ("OpenLayers.Geometry.LineString" ==
+            a.CLASS_NAME) b = this.createElementNS(this.georssns, "georss:line"), b.appendChild(this.buildCoordinatesNode(a));
+        else if ("OpenLayers.Geometry.Point" == a.CLASS_NAME) b = this.createElementNS(this.georssns, "georss:point"), b.appendChild(this.buildCoordinatesNode(a));
+        else throw "Couldn't parse " + a.CLASS_NAME;
+        return b
+    },
+    buildCoordinatesNode: function(a) {
+        var b = null;
+        a.components && (b = a.components);
+        if (b) {
+            for (var a = b.length, c = Array(a), d = 0; d < a; d++) c[d] = b[d].y + " " + b[d].x;
+            b = c.join(" ")
+        } else b = a.y + " " + a.x;
+        return this.createTextNode(b)
+    },
+    CLASS_NAME: "OpenLayers.Format.GeoRSS"
+});
+OpenLayers.Format.WPSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+    defaultVersion: "1.0.0",
+    CLASS_NAME: "OpenLayers.Format.WPSCapabilities"
+});
+OpenLayers.Format.WPSCapabilities.v1_0_0 = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        ows: "http://www.opengis.net/ows/1.1",
+        wps: "http://www.opengis.net/wps/1.0.0",
+        xlink: "http://www.w3.org/1999/xlink"
+    },
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    initialize: function(a) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+    },
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var b = {};
+        this.readNode(a, b);
+        return b
+    },
+    readers: {
+        wps: {
+            Capabilities: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            ProcessOfferings: function(a, b) {
+                b.processOfferings = {};
+                this.readChildNodes(a, b.processOfferings)
+            },
+            Process: function(a, b) {
+                var c = {
+                    processVersion: this.getAttributeNS(a, this.namespaces.wps, "processVersion")
+                };
+                this.readChildNodes(a, c);
+                b[c.identifier] = c
+            },
+            Languages: function(a, b) {
+                b.languages = [];
+                this.readChildNodes(a, b.languages)
+            },
+            Default: function(a, b) {
+                var c = {
+                    isDefault: !0
+                };
+                this.readChildNodes(a, c);
+                b.push(c)
+            },
+            Supported: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.push(c)
+            }
+        },
+        ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers.ows
+    },
+    CLASS_NAME: "OpenLayers.Format.WPSCapabilities.v1_0_0"
+});
+OpenLayers.Control.PinchZoom = OpenLayers.Class(OpenLayers.Control, {
+    type: OpenLayers.Control.TYPE_TOOL,
+    containerCenter: null,
+    pinchOrigin: null,
+    currentCenter: null,
+    autoActivate: !0,
+    initialize: function(a) {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+        this.handler = new OpenLayers.Handler.Pinch(this, {
+            start: this.pinchStart,
+            move: this.pinchMove,
+            done: this.pinchDone
+        }, this.handlerOptions)
+    },
+    activate: function() {
+        var a = OpenLayers.Control.prototype.activate.apply(this, arguments);
+        a && (this.map.events.on({
+            moveend: this.updateContainerCenter,
+            scope: this
+        }), this.updateContainerCenter());
+        return a
+    },
+    deactivate: function() {
+        var a = OpenLayers.Control.prototype.deactivate.apply(this, arguments);
+        this.map && this.map.events && this.map.events.un({
+            moveend: this.updateContainerCenter,
+            scope: this
+        });
+        return a
+    },
+    updateContainerCenter: function() {
+        var a = this.map.layerContainerDiv;
+        this.containerCenter = {
+            x: parseInt(a.style.left, 10) + 50,
+            y: parseInt(a.style.top, 10) + 50
+        }
+    },
+    pinchStart: function(a) {
+        this.currentCenter = this.pinchOrigin = a.xy
+    },
+    pinchMove: function(a, b) {
+        var c = b.scale,
+            d = this.containerCenter,
+            e = this.pinchOrigin,
+            f = a.xy,
+            g = Math.round(f.x - e.x + (c - 1) * (d.x - e.x)),
+            d = Math.round(f.y - e.y + (c - 1) * (d.y - e.y));
+        this.applyTransform("translate(" + g + "px, " + d + "px) scale(" + c + ")");
+        this.currentCenter = f
+    },
+    applyTransform: function(a) {
+        var b = this.map.layerContainerDiv.style;
+        b["-webkit-transform"] = a;
+        b["-moz-transform"] = a
+    },
+    pinchDone: function(a, b, c) {
+        this.applyTransform("");
+        a = this.map.getZoomForResolution(this.map.getResolution() / c.scale, !0);
+        if (a !== this.map.getZoom() || !this.currentCenter.equals(this.pinchOrigin)) {
+            var b =
+                this.map.getResolutionForZoom(a),
+                c = this.map.getLonLatFromPixel(this.pinchOrigin),
+                d = this.currentCenter,
+                e = this.map.getSize();
+            c.lon += b * (e.w / 2 - d.x);
+            c.lat -= b * (e.h / 2 - d.y);
+            this.map.div.clientWidth = this.map.div.clientWidth;
+            this.map.setCenter(c, a)
+        }
+    },
+    CLASS_NAME: "OpenLayers.Control.PinchZoom"
+});
+OpenLayers.Control.TouchNavigation = OpenLayers.Class(OpenLayers.Control, {
+    dragPan: null,
+    dragPanOptions: null,
+    pinchZoom: null,
+    pinchZoomOptions: null,
+    clickHandlerOptions: null,
+    documentDrag: !1,
+    autoActivate: !0,
+    initialize: function(a) {
+        this.handlers = {};
+        OpenLayers.Control.prototype.initialize.apply(this, arguments)
+    },
+    destroy: function() {
+        this.deactivate();
+        this.dragPan && this.dragPan.destroy();
+        this.dragPan = null;
+        this.pinchZoom && (this.pinchZoom.destroy(), delete this.pinchZoom);
+        OpenLayers.Control.prototype.destroy.apply(this,
+            arguments)
+    },
+    activate: function() {
+        return OpenLayers.Control.prototype.activate.apply(this, arguments) ? (this.dragPan.activate(), this.handlers.click.activate(), this.pinchZoom.activate(), !0) : !1
+    },
+    deactivate: function() {
+        return OpenLayers.Control.prototype.deactivate.apply(this, arguments) ? (this.dragPan.deactivate(), this.handlers.click.deactivate(), this.pinchZoom.deactivate(), !0) : !1
+    },
+    draw: function() {
+        var a = {
+                click: this.defaultClick,
+                dblclick: this.defaultDblClick
+            },
+            b = OpenLayers.Util.extend({
+                "double": !0,
+                stopDouble: !0,
+                pixelTolerance: 2
+            }, this.clickHandlerOptions);
+        this.handlers.click = new OpenLayers.Handler.Click(this, a, b);
+        this.dragPan = new OpenLayers.Control.DragPan(OpenLayers.Util.extend({
+            map: this.map,
+            documentDrag: this.documentDrag
+        }, this.dragPanOptions));
+        this.dragPan.draw();
+        this.pinchZoom = new OpenLayers.Control.PinchZoom(OpenLayers.Util.extend({
+            map: this.map
+        }, this.pinchZoomOptions))
+    },
+    defaultClick: function(a) {
+        a.lastTouches && 2 == a.lastTouches.length && this.map.zoomOut()
+    },
+    defaultDblClick: function(a) {
+        this.map.setCenter(this.map.getLonLatFromViewPortPx(a.xy),
+            this.map.zoom + 1)
+    },
+    CLASS_NAME: "OpenLayers.Control.TouchNavigation"
+});
+OpenLayers.Style2 = OpenLayers.Class({
+    id: null,
+    name: null,
+    title: null,
+    description: null,
+    layerName: null,
+    isDefault: !1,
+    rules: null,
+    initialize: function(a) {
+        OpenLayers.Util.extend(this, a);
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_")
+    },
+    destroy: function() {
+        for (var a = 0, b = this.rules.length; a < b; a++) this.rules[a].destroy();
+        delete this.rules
+    },
+    clone: function() {
+        var a = OpenLayers.Util.extend({}, this);
+        if (this.rules) {
+            a.rules = [];
+            for (var b = 0, c = this.rules.length; b < c; ++b) a.rules.push(this.rules[b].clone())
+        }
+        return new OpenLayers.Style2(a)
+    },
+    CLASS_NAME: "OpenLayers.Style2"
+});
+OpenLayers.Format.WFS = OpenLayers.Class(OpenLayers.Format.GML, {
+    layer: null,
+    wfsns: "http://www.opengis.net/wfs",
+    ogcns: "http://www.opengis.net/ogc",
+    initialize: function(a, b) {
+        OpenLayers.Format.GML.prototype.initialize.apply(this, [a]);
+        this.layer = b;
+        this.layer.featureNS && (this.featureNS = this.layer.featureNS);
+        this.layer.options.geometry_column && (this.geometryName = this.layer.options.geometry_column);
+        this.layer.options.typename && (this.featureName = this.layer.options.typename)
+    },
+    write: function(a) {
+        var b = this.createElementNS(this.wfsns,
+            "wfs:Transaction");
+        b.setAttribute("version", "1.0.0");
+        b.setAttribute("service", "WFS");
+        for (var c = 0; c < a.length; c++) switch (a[c].state) {
+            case OpenLayers.State.INSERT:
+                b.appendChild(this.insert(a[c]));
+                break;
+            case OpenLayers.State.UPDATE:
+                b.appendChild(this.update(a[c]));
+                break;
+            case OpenLayers.State.DELETE:
+                b.appendChild(this.remove(a[c]))
+        }
+        return OpenLayers.Format.XML.prototype.write.apply(this, [b])
+    },
+    createFeatureXML: function(a) {
+        var b = this.buildGeometryNode(a.geometry),
+            c = this.createElementNS(this.featureNS, "feature:" +
+                this.geometryName);
+        c.appendChild(b);
+        b = this.createElementNS(this.featureNS, "feature:" + this.featureName);
+        b.appendChild(c);
+        for (var d in a.attributes) {
+            var c = this.createTextNode(a.attributes[d]),
+                e = d; - 1 != d.search(":") && (e = d.split(":")[1]);
+            e = this.createElementNS(this.featureNS, "feature:" + e);
+            e.appendChild(c);
+            b.appendChild(e)
+        }
+        return b
+    },
+    insert: function(a) {
+        var b = this.createElementNS(this.wfsns, "wfs:Insert");
+        b.appendChild(this.createFeatureXML(a));
+        return b
+    },
+    update: function(a) {
+        a.fid || OpenLayers.Console.userError(OpenLayers.i18n("noFID"));
+        var b = this.createElementNS(this.wfsns, "wfs:Update");
+        b.setAttribute("typeName", this.featurePrefix + ":" + this.featureName);
+        b.setAttribute("xmlns:" + this.featurePrefix, this.featureNS);
+        var c = this.createElementNS(this.wfsns, "wfs:Property"),
+            d = this.createElementNS(this.wfsns, "wfs:Name"),
+            e = this.createTextNode(this.geometryName);
+        d.appendChild(e);
+        c.appendChild(d);
+        d = this.createElementNS(this.wfsns, "wfs:Value");
+        e = this.buildGeometryNode(a.geometry);
+        a.layer && e.setAttribute("srsName", a.layer.projection.getCode());
+        d.appendChild(e);
+        c.appendChild(d);
+        b.appendChild(c);
+        for (var f in a.attributes) c = this.createElementNS(this.wfsns, "wfs:Property"), d = this.createElementNS(this.wfsns, "wfs:Name"), d.appendChild(this.createTextNode(f)), c.appendChild(d), d = this.createElementNS(this.wfsns, "wfs:Value"), d.appendChild(this.createTextNode(a.attributes[f])), c.appendChild(d), b.appendChild(c);
+        c = this.createElementNS(this.ogcns, "ogc:Filter");
+        f = this.createElementNS(this.ogcns, "ogc:FeatureId");
+        f.setAttribute("fid", a.fid);
+        c.appendChild(f);
+        b.appendChild(c);
+        return b
+    },
+    remove: function(a) {
+        if (!a.fid) return OpenLayers.Console.userError(OpenLayers.i18n("noFID")), !1;
+        var b = this.createElementNS(this.wfsns, "wfs:Delete");
+        b.setAttribute("typeName", this.featurePrefix + ":" + this.featureName);
+        b.setAttribute("xmlns:" + this.featurePrefix, this.featureNS);
+        var c = this.createElementNS(this.ogcns, "ogc:Filter"),
+            d = this.createElementNS(this.ogcns, "ogc:FeatureId");
+        d.setAttribute("fid", a.fid);
+        c.appendChild(d);
+        b.appendChild(c);
+        return b
+    },
+    destroy: function() {
+        this.layer =
+            null
+    },
+    CLASS_NAME: "OpenLayers.Format.WFS"
+});
+OpenLayers.Format.SLD.v1_0_0_GeoServer = OpenLayers.Class(OpenLayers.Format.SLD.v1_0_0, {
+    version: "1.0.0",
+    profile: "GeoServer",
+    readers: OpenLayers.Util.applyDefaults({
+        sld: OpenLayers.Util.applyDefaults({
+            Priority: function(a, b) {
+                var c = this.readers.ogc._expression.call(this, a);
+                c && (b.priority = c)
+            },
+            VendorOption: function(a, b) {
+                b.vendorOptions || (b.vendorOptions = {});
+                b.vendorOptions[a.getAttribute("name")] = this.getChildValue(a)
+            }
+        }, OpenLayers.Format.SLD.v1_0_0.prototype.readers.sld)
+    }, OpenLayers.Format.SLD.v1_0_0.prototype.readers),
+    writers: OpenLayers.Util.applyDefaults({
+        sld: OpenLayers.Util.applyDefaults({
+            Priority: function(a) {
+                return this.writers.sld._OGCExpression.call(this, "sld:Priority", a)
+            },
+            VendorOption: function(a) {
+                return this.createElementNSPlus("sld:VendorOption", {
+                    attributes: {
+                        name: a.name
+                    },
+                    value: a.value
+                })
+            },
+            TextSymbolizer: function(a) {
+                var b = OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld.TextSymbolizer.apply(this, arguments);
+                !1 !== a.graphic && (a.externalGraphic || a.graphicName) && this.writeNode("Graphic", a, b);
+                "priority" in a &&
+                    this.writeNode("Priority", a.priority, b);
+                return this.addVendorOptions(b, a)
+            },
+            PointSymbolizer: function(a) {
+                return this.addVendorOptions(OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld.PointSymbolizer.apply(this, arguments), a)
+            },
+            LineSymbolizer: function(a) {
+                return this.addVendorOptions(OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld.LineSymbolizer.apply(this, arguments), a)
+            },
+            PolygonSymbolizer: function(a) {
+                return this.addVendorOptions(OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld.PolygonSymbolizer.apply(this,
+                    arguments), a)
+            }
+        }, OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld)
+    }, OpenLayers.Format.SLD.v1_0_0.prototype.writers),
+    addVendorOptions: function(a, b) {
+        if (b.vendorOptions)
+            for (var c in b.vendorOptions) this.writeNode("VendorOption", {
+                name: c,
+                value: b.vendorOptions[c]
+            }, a);
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Format.SLD.v1_0_0_GeoServer"
+});
+OpenLayers.Layer.Boxes = OpenLayers.Class(OpenLayers.Layer.Markers, {
+    drawMarker: function(a) {
+        var b = this.map.getLayerPxFromLonLat({
+                lon: a.bounds.left,
+                lat: a.bounds.top
+            }),
+            c = this.map.getLayerPxFromLonLat({
+                lon: a.bounds.right,
+                lat: a.bounds.bottom
+            });
+        null == c || null == b ? a.display(!1) : (b = a.draw(b, {
+            w: Math.max(1, c.x - b.x),
+            h: Math.max(1, c.y - b.y)
+        }), a.drawn || (this.div.appendChild(b), a.drawn = !0))
+    },
+    removeMarker: function(a) {
+        OpenLayers.Util.removeItem(this.markers, a);
+        null != a.div && a.div.parentNode == this.div && this.div.removeChild(a.div)
+    },
+    CLASS_NAME: "OpenLayers.Layer.Boxes"
+});
+OpenLayers.Format.WFSCapabilities.v1_0_0 = OpenLayers.Class(OpenLayers.Format.WFSCapabilities.v1, {
+    readers: {
+        wfs: OpenLayers.Util.applyDefaults({
+            Service: function(a, b) {
+                b.service = {};
+                this.readChildNodes(a, b.service)
+            },
+            Fees: function(a, b) {
+                var c = this.getChildValue(a);
+                c && "none" != c.toLowerCase() && (b.fees = c)
+            },
+            AccessConstraints: function(a, b) {
+                var c = this.getChildValue(a);
+                c && "none" != c.toLowerCase() && (b.accessConstraints = c)
+            },
+            OnlineResource: function(a, b) {
+                var c = this.getChildValue(a);
+                c && "none" != c.toLowerCase() && (b.onlineResource =
+                    c)
+            },
+            Keywords: function(a, b) {
+                var c = this.getChildValue(a);
+                c && "none" != c.toLowerCase() && (b.keywords = c.split(", "))
+            },
+            Capability: function(a, b) {
+                b.capability = {};
+                this.readChildNodes(a, b.capability)
+            },
+            Request: function(a, b) {
+                b.request = {};
+                this.readChildNodes(a, b.request)
+            },
+            GetFeature: function(a, b) {
+                b.getfeature = {
+                    href: {},
+                    formats: []
+                };
+                this.readChildNodes(a, b.getfeature)
+            },
+            ResultFormat: function(a, b) {
+                for (var c = a.childNodes, d, e = 0; e < c.length; e++) d = c[e], 1 == d.nodeType && b.formats.push(d.nodeName)
+            },
+            DCPType: function(a, b) {
+                this.readChildNodes(a,
+                    b)
+            },
+            HTTP: function(a, b) {
+                this.readChildNodes(a, b.href)
+            },
+            Get: function(a, b) {
+                b.get = a.getAttribute("onlineResource")
+            },
+            Post: function(a, b) {
+                b.post = a.getAttribute("onlineResource")
+            },
+            SRS: function(a, b) {
+                var c = this.getChildValue(a);
+                c && (b.srs = c)
+            }
+        }, OpenLayers.Format.WFSCapabilities.v1.prototype.readers.wfs)
+    },
+    CLASS_NAME: "OpenLayers.Format.WFSCapabilities.v1_0_0"
+});
+OpenLayers.Format.WMSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+    defaultVersion: "1.1.1",
+    profile: null,
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities"
+});
+OpenLayers.Format.WMSCapabilities.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        wms: "http://www.opengis.net/wms",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    defaultPrefix: "wms",
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        var b = a;
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var c = {};
+        this.readNode(a, c);
+        void 0 === c.service && (a = new OpenLayers.Format.OGCExceptionReport, c.error = a.read(b));
+        return c
+    },
+    readers: {
+        wms: {
+            Service: function(a,
+                b) {
+                b.service = {};
+                this.readChildNodes(a, b.service)
+            },
+            Name: function(a, b) {
+                b.name = this.getChildValue(a)
+            },
+            Title: function(a, b) {
+                b.title = this.getChildValue(a)
+            },
+            Abstract: function(a, b) {
+                b["abstract"] = this.getChildValue(a)
+            },
+            BoundingBox: function(a) {
+                var b = {};
+                b.bbox = [parseFloat(a.getAttribute("minx")), parseFloat(a.getAttribute("miny")), parseFloat(a.getAttribute("maxx")), parseFloat(a.getAttribute("maxy"))];
+                a = {
+                    x: parseFloat(a.getAttribute("resx")),
+                    y: parseFloat(a.getAttribute("resy"))
+                };
+                if (!isNaN(a.x) || !isNaN(a.y)) b.res =
+                    a;
+                return b
+            },
+            OnlineResource: function(a, b) {
+                b.href = this.getAttributeNS(a, this.namespaces.xlink, "href")
+            },
+            ContactInformation: function(a, b) {
+                b.contactInformation = {};
+                this.readChildNodes(a, b.contactInformation)
+            },
+            ContactPersonPrimary: function(a, b) {
+                b.personPrimary = {};
+                this.readChildNodes(a, b.personPrimary)
+            },
+            ContactPerson: function(a, b) {
+                b.person = this.getChildValue(a)
+            },
+            ContactOrganization: function(a, b) {
+                b.organization = this.getChildValue(a)
+            },
+            ContactPosition: function(a, b) {
+                b.position = this.getChildValue(a)
+            },
+            ContactAddress: function(a,
+                b) {
+                b.contactAddress = {};
+                this.readChildNodes(a, b.contactAddress)
+            },
+            AddressType: function(a, b) {
+                b.type = this.getChildValue(a)
+            },
+            Address: function(a, b) {
+                b.address = this.getChildValue(a)
+            },
+            City: function(a, b) {
+                b.city = this.getChildValue(a)
+            },
+            StateOrProvince: function(a, b) {
+                b.stateOrProvince = this.getChildValue(a)
+            },
+            PostCode: function(a, b) {
+                b.postcode = this.getChildValue(a)
+            },
+            Country: function(a, b) {
+                b.country = this.getChildValue(a)
+            },
+            ContactVoiceTelephone: function(a, b) {
+                b.phone = this.getChildValue(a)
+            },
+            ContactFacsimileTelephone: function(a,
+                b) {
+                b.fax = this.getChildValue(a)
+            },
+            ContactElectronicMailAddress: function(a, b) {
+                b.email = this.getChildValue(a)
+            },
+            Fees: function(a, b) {
+                var c = this.getChildValue(a);
+                c && "none" != c.toLowerCase() && (b.fees = c)
+            },
+            AccessConstraints: function(a, b) {
+                var c = this.getChildValue(a);
+                c && "none" != c.toLowerCase() && (b.accessConstraints = c)
+            },
+            Capability: function(a, b) {
+                b.capability = {
+                    nestedLayers: [],
+                    layers: []
+                };
+                this.readChildNodes(a, b.capability)
+            },
+            Request: function(a, b) {
+                b.request = {};
+                this.readChildNodes(a, b.request)
+            },
+            GetCapabilities: function(a,
+                b) {
+                b.getcapabilities = {
+                    formats: []
+                };
+                this.readChildNodes(a, b.getcapabilities)
+            },
+            Format: function(a, b) {
+                OpenLayers.Util.isArray(b.formats) ? b.formats.push(this.getChildValue(a)) : b.format = this.getChildValue(a)
+            },
+            DCPType: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            HTTP: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Get: function(a, b) {
+                b.get = {};
+                this.readChildNodes(a, b.get);
+                b.href || (b.href = b.get.href)
+            },
+            Post: function(a, b) {
+                b.post = {};
+                this.readChildNodes(a, b.post);
+                b.href || (b.href = b.get.href)
+            },
+            GetMap: function(a, b) {
+                b.getmap = {
+                    formats: []
+                };
+                this.readChildNodes(a, b.getmap)
+            },
+            GetFeatureInfo: function(a, b) {
+                b.getfeatureinfo = {
+                    formats: []
+                };
+                this.readChildNodes(a, b.getfeatureinfo)
+            },
+            Exception: function(a, b) {
+                b.exception = {
+                    formats: []
+                };
+                this.readChildNodes(a, b.exception)
+            },
+            Layer: function(a, b) {
+                var c, d;
+                b.capability ? (d = b.capability, c = b) : d = b;
+                var e = a.getAttributeNode("queryable"),
+                    f = e && e.specified ? a.getAttribute("queryable") : null,
+                    g = (e = a.getAttributeNode("cascaded")) && e.specified ? a.getAttribute("cascaded") : null,
+                    e = (e = a.getAttributeNode("opaque")) && e.specified ?
+                    a.getAttribute("opaque") : null,
+                    h = a.getAttribute("noSubsets"),
+                    i = a.getAttribute("fixedWidth"),
+                    j = a.getAttribute("fixedHeight"),
+                    k = c || {},
+                    l = OpenLayers.Util.extend;
+                c = {
+                    nestedLayers: [],
+                    styles: c ? [].concat(c.styles) : [],
+                    srs: c ? l({}, k.srs) : {},
+                    metadataURLs: [],
+                    bbox: c ? l({}, k.bbox) : {},
+                    llbbox: k.llbbox,
+                    dimensions: c ? l({}, k.dimensions) : {},
+                    authorityURLs: c ? l({}, k.authorityURLs) : {},
+                    identifiers: {},
+                    keywords: [],
+                    queryable: f && "" !== f ? "1" === f || "true" === f : k.queryable || !1,
+                    cascaded: null !== g ? parseInt(g) : k.cascaded || 0,
+                    opaque: e ? "1" ===
+                        e || "true" === e : k.opaque || !1,
+                    noSubsets: null !== h ? "1" === h || "true" === h : k.noSubsets || !1,
+                    fixedWidth: null != i ? parseInt(i) : k.fixedWidth || 0,
+                    fixedHeight: null != j ? parseInt(j) : k.fixedHeight || 0,
+                    minScale: k.minScale,
+                    maxScale: k.maxScale,
+                    attribution: k.attribution
+                };
+                b.nestedLayers.push(c);
+                c.capability = d;
+                this.readChildNodes(a, c);
+                delete c.capability;
+                if (c.name && (f = c.name.split(":"), g = d.request, e = g.getfeatureinfo, 0 < f.length && (c.prefix = f[0]), d.layers.push(c), void 0 === c.formats && (c.formats = g.getmap.formats), void 0 === c.infoFormats &&
+                        e)) c.infoFormats = e.formats
+            },
+            Attribution: function(a, b) {
+                b.attribution = {};
+                this.readChildNodes(a, b.attribution)
+            },
+            LogoURL: function(a, b) {
+                b.logo = {
+                    width: a.getAttribute("width"),
+                    height: a.getAttribute("height")
+                };
+                this.readChildNodes(a, b.logo)
+            },
+            Style: function(a, b) {
+                var c = {};
+                b.styles.push(c);
+                this.readChildNodes(a, c)
+            },
+            LegendURL: function(a, b) {
+                var c = {
+                    width: a.getAttribute("width"),
+                    height: a.getAttribute("height")
+                };
+                b.legend = c;
+                this.readChildNodes(a, c)
+            },
+            MetadataURL: function(a, b) {
+                var c = {
+                    type: a.getAttribute("type")
+                };
+                b.metadataURLs.push(c);
+                this.readChildNodes(a, c)
+            },
+            DataURL: function(a, b) {
+                b.dataURL = {};
+                this.readChildNodes(a, b.dataURL)
+            },
+            FeatureListURL: function(a, b) {
+                b.featureListURL = {};
+                this.readChildNodes(a, b.featureListURL)
+            },
+            AuthorityURL: function(a, b) {
+                var c = a.getAttribute("name"),
+                    d = {};
+                this.readChildNodes(a, d);
+                b.authorityURLs[c] = d.href
+            },
+            Identifier: function(a, b) {
+                var c = a.getAttribute("authority");
+                b.identifiers[c] = this.getChildValue(a)
+            },
+            KeywordList: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            SRS: function(a, b) {
+                b.srs[this.getChildValue(a)] = !0
+            }
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1"
+});
+OpenLayers.Format.WMSCapabilities.v1_3 = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1, {
+    readers: {
+        wms: OpenLayers.Util.applyDefaults({
+            WMS_Capabilities: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            LayerLimit: function(a, b) {
+                b.layerLimit = parseInt(this.getChildValue(a))
+            },
+            MaxWidth: function(a, b) {
+                b.maxWidth = parseInt(this.getChildValue(a))
+            },
+            MaxHeight: function(a, b) {
+                b.maxHeight = parseInt(this.getChildValue(a))
+            },
+            BoundingBox: function(a, b) {
+                var c = OpenLayers.Format.WMSCapabilities.v1.prototype.readers.wms.BoundingBox.apply(this, [a, b]);
+                c.srs = a.getAttribute("CRS");
+                b.bbox[c.srs] = c
+            },
+            CRS: function(a, b) {
+                this.readers.wms.SRS.apply(this, [a, b])
+            },
+            EX_GeographicBoundingBox: function(a, b) {
+                b.llbbox = [];
+                this.readChildNodes(a, b.llbbox)
+            },
+            westBoundLongitude: function(a, b) {
+                b[0] = this.getChildValue(a)
+            },
+            eastBoundLongitude: function(a, b) {
+                b[2] = this.getChildValue(a)
+            },
+            southBoundLatitude: function(a, b) {
+                b[1] = this.getChildValue(a)
+            },
+            northBoundLatitude: function(a, b) {
+                b[3] = this.getChildValue(a)
+            },
+            MinScaleDenominator: function(a, b) {
+                b.maxScale = parseFloat(this.getChildValue(a)).toPrecision(16)
+            },
+            MaxScaleDenominator: function(a, b) {
+                b.minScale = parseFloat(this.getChildValue(a)).toPrecision(16)
+            },
+            Dimension: function(a, b) {
+                var c = {
+                    name: a.getAttribute("name").toLowerCase(),
+                    units: a.getAttribute("units"),
+                    unitsymbol: a.getAttribute("unitSymbol"),
+                    nearestVal: "1" === a.getAttribute("nearestValue"),
+                    multipleVal: "1" === a.getAttribute("multipleValues"),
+                    "default": a.getAttribute("default") || "",
+                    current: "1" === a.getAttribute("current"),
+                    values: this.getChildValue(a).split(",")
+                };
+                b.dimensions[c.name] = c
+            },
+            Keyword: function(a,
+                b) {
+                var c = {
+                    value: this.getChildValue(a),
+                    vocabulary: a.getAttribute("vocabulary")
+                };
+                b.keywords && b.keywords.push(c)
+            }
+        }, OpenLayers.Format.WMSCapabilities.v1.prototype.readers.wms),
+        sld: {
+            UserDefinedSymbolization: function(a, b) {
+                this.readers.wms.UserDefinedSymbolization.apply(this, [a, b]);
+                b.userSymbols.inlineFeature = 1 == parseInt(a.getAttribute("InlineFeature"));
+                b.userSymbols.remoteWCS = 1 == parseInt(a.getAttribute("RemoteWCS"))
+            },
+            DescribeLayer: function(a, b) {
+                this.readers.wms.DescribeLayer.apply(this, [a, b])
+            },
+            GetLegendGraphic: function(a,
+                b) {
+                this.readers.wms.GetLegendGraphic.apply(this, [a, b])
+            }
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_3"
+});
+OpenLayers.Layer.Zoomify = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    size: null,
+    isBaseLayer: !0,
+    standardTileSize: 256,
+    tileOriginCorner: "tl",
+    numberOfTiers: 0,
+    tileCountUpToTier: null,
+    tierSizeInTiles: null,
+    tierImageSize: null,
+    initialize: function(a, b, c, d) {
+        this.initializeZoomify(c);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a, b, c, {}, d])
+    },
+    initializeZoomify: function(a) {
+        var a = a.clone(),
+            b = new OpenLayers.Size(Math.ceil(a.w / this.standardTileSize), Math.ceil(a.h / this.standardTileSize));
+        this.tierSizeInTiles = [b];
+        for (this.tierImageSize = [a]; a.w > this.standardTileSize || a.h > this.standardTileSize;) a = new OpenLayers.Size(Math.floor(a.w / 2), Math.floor(a.h / 2)), b = new OpenLayers.Size(Math.ceil(a.w / this.standardTileSize), Math.ceil(a.h / this.standardTileSize)), this.tierSizeInTiles.push(b), this.tierImageSize.push(a);
+        this.tierSizeInTiles.reverse();
+        this.tierImageSize.reverse();
+        this.numberOfTiers = this.tierSizeInTiles.length;
+        this.tileCountUpToTier = [0];
+        for (a = 1; a < this.numberOfTiers; a++) this.tileCountUpToTier.push(this.tierSizeInTiles[a -
+            1].w * this.tierSizeInTiles[a - 1].h + this.tileCountUpToTier[a - 1])
+    },
+    destroy: function() {
+        OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);
+        this.tileCountUpToTier.length = 0;
+        this.tierSizeInTiles.length = 0;
+        this.tierImageSize.length = 0
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.Zoomify(this.name, this.url, this.size, this.options));
+        return a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+    },
+    getURL: function(a) {
+        var a = this.adjustBounds(a),
+            b = this.map.getResolution(),
+            c = Math.round((a.left - this.tileOrigin.lon) /
+                (b * this.tileSize.w)),
+            a = Math.round((this.tileOrigin.lat - a.top) / (b * this.tileSize.h)),
+            b = this.map.getZoom(),
+            c = "TileGroup" + Math.floor((c + a * this.tierSizeInTiles[b].w + this.tileCountUpToTier[b]) / 256) + "/" + b + "-" + c + "-" + a + ".jpg",
+            a = this.url;
+        OpenLayers.Util.isArray(a) && (a = this.selectUrl(c, a));
+        return a + c
+    },
+    getImageSize: function() {
+        if (0 < arguments.length) {
+            var a = this.adjustBounds(arguments[0]),
+                b = this.map.getResolution(),
+                c = Math.round((a.left - this.tileOrigin.lon) / (b * this.tileSize.w)),
+                a = Math.round((this.tileOrigin.lat -
+                    a.top) / (b * this.tileSize.h)),
+                b = this.map.getZoom(),
+                d = this.standardTileSize,
+                e = this.standardTileSize;
+            c == this.tierSizeInTiles[b].w - 1 && (d = this.tierImageSize[b].w % this.standardTileSize);
+            a == this.tierSizeInTiles[b].h - 1 && (e = this.tierImageSize[b].h % this.standardTileSize);
+            return new OpenLayers.Size(d, e)
+        }
+        return this.tileSize
+    },
+    setMap: function(a) {
+        OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments);
+        this.tileOrigin = new OpenLayers.LonLat(this.map.maxExtent.left, this.map.maxExtent.top)
+    },
+    calculateGridLayout: function(a,
+        b, c) {
+        var d = c * this.tileSize.w,
+            c = c * this.tileSize.h,
+            e = a.left - b.lon,
+            f = Math.floor(e / d) - this.buffer,
+            a = b.lat - a.top + c,
+            g = Math.floor(a / c) - this.buffer;
+        return {
+            tilelon: d,
+            tilelat: c,
+            tileoffsetlon: b.lon + f * d,
+            tileoffsetlat: b.lat - c * g,
+            tileoffsetx: -(e / d - f) * this.tileSize.w,
+            tileoffsety: (g - a / c) * this.tileSize.h
+        }
+    },
+    CLASS_NAME: "OpenLayers.Layer.Zoomify"
+});
+OpenLayers.Layer.MapServer = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    DEFAULT_PARAMS: {
+        mode: "map",
+        map_imagetype: "png"
+    },
+    initialize: function(a, b, c, d) {
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, arguments);
+        this.params = OpenLayers.Util.applyDefaults(this.params, this.DEFAULT_PARAMS);
+        if (null == d || null == d.isBaseLayer) this.isBaseLayer = "true" != this.params.transparent && !0 != this.params.transparent
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.MapServer(this.name, this.url, this.params, this.getOptions()));
+        return a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+    },
+    getURL: function(a) {
+        var a = this.adjustBounds(a),
+            a = [a.left, a.bottom, a.right, a.top],
+            b = this.getImageSize();
+        return this.getFullRequestString({
+            mapext: a,
+            imgext: a,
+            map_size: [b.w, b.h],
+            imgx: b.w / 2,
+            imgy: b.h / 2,
+            imgxy: [b.w, b.h]
+        })
+    },
+    getFullRequestString: function(a, b) {
+        var c = null == b ? this.url : b,
+            d = OpenLayers.Util.extend({}, this.params),
+            d = OpenLayers.Util.extend(d, a),
+            e = OpenLayers.Util.getParameterString(d);
+        OpenLayers.Util.isArray(c) && (c = this.selectUrl(e, c));
+        var e = OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(c)),
+            f;
+        for (f in d) f.toUpperCase() in e && delete d[f];
+        e = OpenLayers.Util.getParameterString(d);
+        d = c;
+        e = e.replace(/,/g, "+");
+        "" != e && (f = c.charAt(c.length - 1), d = "&" == f || "?" == f ? d + e : -1 == c.indexOf("?") ? d + ("?" + e) : d + ("&" + e));
+        return d
+    },
+    CLASS_NAME: "OpenLayers.Layer.MapServer"
+});
+OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
+    xmlns: "urn:schemas-microsoft-com:vml",
+    symbolCache: {},
+    offset: null,
+    initialize: function(a) {
+        if (this.supported()) {
+            if (!document.namespaces.olv) {
+                document.namespaces.add("olv", this.xmlns);
+                for (var b = document.createStyleSheet(), c = "shape rect oval fill stroke imagedata group textbox".split(" "), d = 0, e = c.length; d < e; d++) b.addRule("olv\\:" + c[d], "behavior: url(#default#VML); position: absolute; display: inline-block;")
+            }
+            OpenLayers.Renderer.Elements.prototype.initialize.apply(this,
+                arguments)
+        }
+    },
+    supported: function() {
+        return !!document.namespaces
+    },
+    setExtent: function(a, b) {
+        var c = OpenLayers.Renderer.Elements.prototype.setExtent.apply(this, arguments),
+            d = this.getResolution(),
+            e = a.left / d | 0,
+            d = a.top / d - this.size.h | 0;
+        b || !this.offset ? (this.offset = {
+            x: e,
+            y: d
+        }, d = e = 0) : (e -= this.offset.x, d -= this.offset.y);
+        this.root.coordorigin = e - this.xOffset + " " + d;
+        for (var e = [this.root, this.vectorRoot, this.textRoot], f = 0, g = e.length; f < g; ++f) d = e[f], d.coordsize = this.size.w + " " + this.size.h;
+        this.root.style.flip = "y";
+        return c
+    },
+    setSize: function(a) {
+        OpenLayers.Renderer.prototype.setSize.apply(this, arguments);
+        for (var b = [this.rendererRoot, this.root, this.vectorRoot, this.textRoot], c = this.size.w + "px", d = this.size.h + "px", e, f = 0, g = b.length; f < g; ++f) e = b[f], e.style.width = c, e.style.height = d
+    },
+    getNodeType: function(a, b) {
+        var c = null;
+        switch (a.CLASS_NAME) {
+            case "OpenLayers.Geometry.Point":
+                c = b.externalGraphic ? "olv:rect" : this.isComplexSymbol(b.graphicName) ? "olv:shape" : "olv:oval";
+                break;
+            case "OpenLayers.Geometry.Rectangle":
+                c = "olv:rect";
+                break;
+            case "OpenLayers.Geometry.LineString":
+            case "OpenLayers.Geometry.LinearRing":
+            case "OpenLayers.Geometry.Polygon":
+            case "OpenLayers.Geometry.Curve":
+                c =
+                    "olv:shape"
+        }
+        return c
+    },
+    setStyle: function(a, b, c, d) {
+        var b = b || a._style,
+            c = c || a._options,
+            e = b.fillColor;
+        if ("OpenLayers.Geometry.Point" === a._geometryClass)
+            if (b.externalGraphic) {
+                c.isFilled = !0;
+                b.graphicTitle && (a.title = b.graphicTitle);
+                var e = b.graphicWidth || b.graphicHeight,
+                    f = b.graphicHeight || b.graphicWidth,
+                    e = e ? e : 2 * b.pointRadius,
+                    f = f ? f : 2 * b.pointRadius,
+                    g = this.getResolution(),
+                    h = void 0 != b.graphicXOffset ? b.graphicXOffset : -(0.5 * e),
+                    i = void 0 != b.graphicYOffset ? b.graphicYOffset : -(0.5 * f);
+                a.style.left = ((d.x - this.featureDx) /
+                    g - this.offset.x + h | 0) + "px";
+                a.style.top = (d.y / g - this.offset.y - (i + f) | 0) + "px";
+                a.style.width = e + "px";
+                a.style.height = f + "px";
+                a.style.flip = "y";
+                e = "none";
+                c.isStroked = !1
+            } else this.isComplexSymbol(b.graphicName) ? (f = this.importSymbol(b.graphicName), a.path = f.path, a.coordorigin = f.left + "," + f.bottom, f = f.size, a.coordsize = f + "," + f, this.drawCircle(a, d, b.pointRadius), a.style.flip = "y") : this.drawCircle(a, d, b.pointRadius);
+        c.isFilled ? a.fillcolor = e : a.filled = "false";
+        d = a.getElementsByTagName("fill");
+        d = 0 == d.length ? null : d[0];
+        if (c.isFilled) {
+            d ||
+                (d = this.createNode("olv:fill", a.id + "_fill"));
+            d.opacity = b.fillOpacity;
+            if ("OpenLayers.Geometry.Point" === a._geometryClass && b.externalGraphic && (b.graphicOpacity && (d.opacity = b.graphicOpacity), d.src = b.externalGraphic, d.type = "frame", !b.graphicWidth || !b.graphicHeight)) d.aspect = "atmost";
+            d.parentNode != a && a.appendChild(d)
+        } else d && a.removeChild(d);
+        e = b.rotation;
+        if (void 0 !== e || void 0 !== a._rotation) a._rotation = e, b.externalGraphic ? (this.graphicRotate(a, h, i, b), d.opacity = 0) : "OpenLayers.Geometry.Point" === a._geometryClass &&
+            (a.style.rotation = e || 0);
+        h = a.getElementsByTagName("stroke");
+        h = 0 == h.length ? null : h[0];
+        if (c.isStroked) {
+            if (h || (h = this.createNode("olv:stroke", a.id + "_stroke"), a.appendChild(h)), h.on = !0, h.color = b.strokeColor, h.weight = b.strokeWidth + "px", h.opacity = b.strokeOpacity, h.endcap = "butt" == b.strokeLinecap ? "flat" : b.strokeLinecap || "round", b.strokeDashstyle) h.dashstyle = this.dashStyle(b)
+        } else a.stroked = !1, h && (h.on = !1);
+        "inherit" != b.cursor && null != b.cursor && (a.style.cursor = b.cursor);
+        return a
+    },
+    graphicRotate: function(a, b, c,
+        d) {
+        var d = d || a._style,
+            e = d.rotation || 0,
+            f, g;
+        if (!d.graphicWidth || !d.graphicHeight) {
+            var h = new Image;
+            h.onreadystatechange = OpenLayers.Function.bind(function() {
+                if ("complete" == h.readyState || "interactive" == h.readyState) f = h.width / h.height, g = Math.max(2 * d.pointRadius, d.graphicWidth || 0, d.graphicHeight || 0), b *= f, d.graphicWidth = g * f, d.graphicHeight = g, this.graphicRotate(a, b, c, d)
+            }, this);
+            h.src = d.externalGraphic
+        } else {
+            g = Math.max(d.graphicWidth, d.graphicHeight);
+            f = d.graphicWidth / d.graphicHeight;
+            var i = Math.round(d.graphicWidth ||
+                    g * f),
+                j = Math.round(d.graphicHeight || g);
+            a.style.width = i + "px";
+            a.style.height = j + "px";
+            var k = document.getElementById(a.id + "_image");
+            k || (k = this.createNode("olv:imagedata", a.id + "_image"), a.appendChild(k));
+            k.style.width = i + "px";
+            k.style.height = j + "px";
+            k.src = d.externalGraphic;
+            k.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='', sizingMethod='scale')";
+            k = e * Math.PI / 180;
+            e = Math.sin(k);
+            k = Math.cos(k);
+            e = "progid:DXImageTransform.Microsoft.Matrix(M11=" + k + ",M12=" + -e + ",M21=" + e + ",M22=" + k + ",SizingMethod='auto expand')\n";
+            (k = d.graphicOpacity || d.fillOpacity) && 1 != k && (e += "progid:DXImageTransform.Microsoft.BasicImage(opacity=" + k + ")\n");
+            a.style.filter = e;
+            e = new OpenLayers.Geometry.Point(-b, -c);
+            i = (new OpenLayers.Bounds(0, 0, i, j)).toGeometry();
+            i.rotate(d.rotation, e);
+            i = i.getBounds();
+            a.style.left = Math.round(parseInt(a.style.left) + i.left) + "px";
+            a.style.top = Math.round(parseInt(a.style.top) - i.bottom) + "px"
+        }
+    },
+    postDraw: function(a) {
+        a.style.visibility = "visible";
+        var b = a._style.fillColor,
+            c = a._style.strokeColor;
+        "none" == b && a.fillcolor != b &&
+            (a.fillcolor = b);
+        "none" == c && a.strokecolor != c && (a.strokecolor = c)
+    },
+    setNodeDimension: function(a, b) {
+        var c = b.getBounds();
+        if (c) {
+            var d = this.getResolution(),
+                c = new OpenLayers.Bounds((c.left - this.featureDx) / d - this.offset.x | 0, c.bottom / d - this.offset.y | 0, (c.right - this.featureDx) / d - this.offset.x | 0, c.top / d - this.offset.y | 0);
+            a.style.left = c.left + "px";
+            a.style.top = c.top + "px";
+            a.style.width = c.getWidth() + "px";
+            a.style.height = c.getHeight() + "px";
+            a.coordorigin = c.left + " " + c.top;
+            a.coordsize = c.getWidth() + " " + c.getHeight()
+        }
+    },
+    dashStyle: function(a) {
+        a =
+            a.strokeDashstyle;
+        switch (a) {
+            case "solid":
+            case "dot":
+            case "dash":
+            case "dashdot":
+            case "longdash":
+            case "longdashdot":
+                return a;
+            default:
+                return a = a.split(/[ ,]/), 2 == a.length ? 1 * a[0] >= 2 * a[1] ? "longdash" : 1 == a[0] || 1 == a[1] ? "dot" : "dash" : 4 == a.length ? 1 * a[0] >= 2 * a[1] ? "longdashdot" : "dashdot" : "solid"
+        }
+    },
+    createNode: function(a, b) {
+        var c = document.createElement(a);
+        b && (c.id = b);
+        c.unselectable = "on";
+        c.onselectstart = OpenLayers.Function.False;
+        return c
+    },
+    nodeTypeCompare: function(a, b) {
+        var c = b,
+            d = c.indexOf(":"); - 1 != d && (c = c.substr(d +
+            1));
+        var e = a.nodeName,
+            d = e.indexOf(":"); - 1 != d && (e = e.substr(d + 1));
+        return c == e
+    },
+    createRenderRoot: function() {
+        return this.nodeFactory(this.container.id + "_vmlRoot", "div")
+    },
+    createRoot: function(a) {
+        return this.nodeFactory(this.container.id + a, "olv:group")
+    },
+    drawPoint: function(a, b) {
+        return this.drawCircle(a, b, 1)
+    },
+    drawCircle: function(a, b, c) {
+        if (!isNaN(b.x) && !isNaN(b.y)) {
+            var d = this.getResolution();
+            a.style.left = ((b.x - this.featureDx) / d - this.offset.x | 0) - c + "px";
+            a.style.top = (b.y / d - this.offset.y | 0) - c + "px";
+            b = 2 * c;
+            a.style.width =
+                b + "px";
+            a.style.height = b + "px";
+            return a
+        }
+        return !1
+    },
+    drawLineString: function(a, b) {
+        return this.drawLine(a, b, !1)
+    },
+    drawLinearRing: function(a, b) {
+        return this.drawLine(a, b, !0)
+    },
+    drawLine: function(a, b, c) {
+        this.setNodeDimension(a, b);
+        for (var d = this.getResolution(), e = b.components.length, f = Array(e), g, h, i = 0; i < e; i++) g = b.components[i], h = (g.x - this.featureDx) / d - this.offset.x | 0, g = g.y / d - this.offset.y | 0, f[i] = " " + h + "," + g + " l ";
+        a.path = "m" + f.join("") + (c ? " x e" : " e");
+        return a
+    },
+    drawPolygon: function(a, b) {
+        this.setNodeDimension(a,
+            b);
+        var c = this.getResolution(),
+            d = [],
+            e, f, g, h, i, j, k, l, m, n;
+        e = 0;
+        for (f = b.components.length; e < f; e++) {
+            d.push("m");
+            g = b.components[e].components;
+            h = 0 === e;
+            j = i = null;
+            k = 0;
+            for (l = g.length; k < l; k++) m = g[k], n = (m.x - this.featureDx) / c - this.offset.x | 0, m = m.y / c - this.offset.y | 0, n = " " + n + "," + m, d.push(n), 0 == k && d.push(" l"), h || (i ? i != n && (j ? j != n && (h = !0) : j = n) : i = n);
+            d.push(h ? " x " : " ")
+        }
+        d.push("e");
+        a.path = d.join("");
+        return a
+    },
+    drawRectangle: function(a, b) {
+        var c = this.getResolution();
+        a.style.left = ((b.x - this.featureDx) / c - this.offset.x | 0) +
+            "px";
+        a.style.top = (b.y / c - this.offset.y | 0) + "px";
+        a.style.width = (b.width / c | 0) + "px";
+        a.style.height = (b.height / c | 0) + "px";
+        return a
+    },
+    drawText: function(a, b, c) {
+        var d = this.nodeFactory(a + this.LABEL_ID_SUFFIX, "olv:rect"),
+            e = this.nodeFactory(a + this.LABEL_ID_SUFFIX + "_textbox", "olv:textbox"),
+            f = this.getResolution();
+        d.style.left = ((c.x - this.featureDx) / f - this.offset.x | 0) + "px";
+        d.style.top = (c.y / f - this.offset.y | 0) + "px";
+        d.style.flip = "y";
+        e.innerText = b.label;
+        "inherit" != b.cursor && null != b.cursor && (e.style.cursor = b.cursor);
+        b.fontColor &&
+            (e.style.color = b.fontColor);
+        b.fontOpacity && (e.style.filter = "alpha(opacity=" + 100 * b.fontOpacity + ")");
+        b.fontFamily && (e.style.fontFamily = b.fontFamily);
+        b.fontSize && (e.style.fontSize = b.fontSize);
+        b.fontWeight && (e.style.fontWeight = b.fontWeight);
+        b.fontStyle && (e.style.fontStyle = b.fontStyle);
+        !0 === b.labelSelect && (d._featureId = a, e._featureId = a, e._geometry = c, e._geometryClass = c.CLASS_NAME);
+        e.style.whiteSpace = "nowrap";
+        e.inset = "1px,0px,0px,0px";
+        d.parentNode || (d.appendChild(e), this.textRoot.appendChild(d));
+        b = b.labelAlign ||
+            "cm";
+        1 == b.length && (b += "m");
+        a = e.clientWidth * OpenLayers.Renderer.VML.LABEL_SHIFT[b.substr(0, 1)];
+        e = e.clientHeight * OpenLayers.Renderer.VML.LABEL_SHIFT[b.substr(1, 1)];
+        d.style.left = parseInt(d.style.left) - a - 1 + "px";
+        d.style.top = parseInt(d.style.top) + e + "px"
+    },
+    moveRoot: function(a) {
+        var b = this.map.getLayer(a.container.id);
+        b instanceof OpenLayers.Layer.Vector.RootContainer && (b = this.map.getLayer(this.container.id));
+        b && b.renderer.clear();
+        OpenLayers.Renderer.Elements.prototype.moveRoot.apply(this, arguments);
+        b && b.redraw()
+    },
+    importSymbol: function(a) {
+        var b = this.container.id + "-" + a,
+            c = this.symbolCache[b];
+        if (c) return c;
+        c = OpenLayers.Renderer.symbol[a];
+        if (!c) throw Error(a + " is not a valid symbol name");
+        for (var a = new OpenLayers.Bounds(Number.MAX_VALUE, Number.MAX_VALUE, 0, 0), d = ["m"], e = 0; e < c.length; e += 2) {
+            var f = c[e],
+                g = c[e + 1];
+            a.left = Math.min(a.left, f);
+            a.bottom = Math.min(a.bottom, g);
+            a.right = Math.max(a.right, f);
+            a.top = Math.max(a.top, g);
+            d.push(f);
+            d.push(g);
+            0 == e && d.push("l")
+        }
+        d.push("x e");
+        c = d.join(" ");
+        d = (a.getWidth() - a.getHeight()) / 2;
+        0 < d ? (a.bottom -= d, a.top += d) : (a.left += d, a.right -= d);
+        c = {
+            path: c,
+            size: a.getWidth(),
+            left: a.left,
+            bottom: a.bottom
+        };
+        return this.symbolCache[b] = c
+    },
+    CLASS_NAME: "OpenLayers.Renderer.VML"
+});
+OpenLayers.Renderer.VML.LABEL_SHIFT = {
+    l: 0,
+    c: 0.5,
+    r: 1,
+    t: 0,
+    m: 0.5,
+    b: 1
+};
+OpenLayers.Control.CacheRead = OpenLayers.Class(OpenLayers.Control, {
+    fetchEvent: "tileloadstart",
+    layers: null,
+    autoActivate: !0,
+    setMap: function(a) {
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+        var b, c = this.layers || a.layers;
+        for (b = c.length - 1; 0 <= b; --b) this.addLayer({
+            layer: c[b]
+        });
+        if (!this.layers) a.events.on({
+            addlayer: this.addLayer,
+            removeLayer: this.removeLayer,
+            scope: this
+        })
+    },
+    addLayer: function(a) {
+        a.layer.events.register(this.fetchEvent, this, this.fetch)
+    },
+    removeLayer: function(a) {
+        a.layer.events.unregister(this.fetchEvent,
+            this, this.fetch)
+    },
+    fetch: function(a) {
+        if (this.active && window.localStorage && a.tile instanceof OpenLayers.Tile.Image) {
+            var b = a.tile,
+                c = b.url;
+            !b.layer.crossOriginKeyword && (OpenLayers.ProxyHost && 0 === c.indexOf(OpenLayers.ProxyHost)) && (c = OpenLayers.Control.CacheWrite.urlMap[c]);
+            if (c = window.localStorage.getItem("olCache_" + c)) b.url = c, "tileerror" === a.type && b.setImgSrc(c)
+        }
+    },
+    destroy: function() {
+        if (this.layers || this.map) {
+            var a, b = this.layers || this.map.layers;
+            for (a = b.length - 1; 0 <= a; --a) this.removeLayer({
+                layer: b[a]
+            })
+        }
+        this.map &&
+            this.map.events.un({
+                addlayer: this.addLayer,
+                removeLayer: this.removeLayer,
+                scope: this
+            });
+        OpenLayers.Control.prototype.destroy.apply(this, arguments)
+    },
+    CLASS_NAME: "OpenLayers.Control.CacheRead"
+});
+OpenLayers.Protocol.WFS.v1_0_0 = OpenLayers.Class(OpenLayers.Protocol.WFS.v1, {
+    version: "1.0.0",
+    CLASS_NAME: "OpenLayers.Protocol.WFS.v1_0_0"
+});
+OpenLayers.Format.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Format.XML, {
+    layerIdentifier: "_layer",
+    featureIdentifier: "_feature",
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    gmlFormat: null,
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        var b = a.documentElement;
+        if (b) var c = this["read_" + b.nodeName],
+            a = c ? c.call(this, b) : (new OpenLayers.Format.GML(this.options ? this.options : {})).read(a);
+        return a
+    },
+    read_msGMLOutput: function(a) {
+        var b = [];
+        if (a = this.getSiblingNodesByTagCriteria(a, this.layerIdentifier))
+            for (var c = 0, d = a.length; c < d; ++c) {
+                var e = a[c],
+                    f = e.nodeName;
+                e.prefix && (f = f.split(":")[1]);
+                f = f.replace(this.layerIdentifier, "");
+                if (e = this.getSiblingNodesByTagCriteria(e, this.featureIdentifier))
+                    for (var g = 0; g < e.length; g++) {
+                        var h = e[g],
+                            i = this.parseGeometry(h),
+                            h = this.parseAttributes(h),
+                            h = new OpenLayers.Feature.Vector(i.geometry, h, null);
+                        h.bounds = i.bounds;
+                        h.type = f;
+                        b.push(h)
+                    }
+            }
+        return b
+    },
+    read_FeatureInfoResponse: function(a) {
+        for (var b = [], a = this.getElementsByTagNameNS(a,
+                "*", "FIELDS"), c = 0, d = a.length; c < d; c++) {
+            var e = a[c],
+                f = {},
+                g, h = e.attributes.length;
+            if (0 < h)
+                for (g = 0; g < h; g++) {
+                    var i = e.attributes[g];
+                    f[i.nodeName] = i.nodeValue
+                } else {
+                    e = e.childNodes;
+                    g = 0;
+                    for (h = e.length; g < h; ++g) i = e[g], 3 != i.nodeType && (f[i.getAttribute("name")] = i.getAttribute("value"))
+                }
+            b.push(new OpenLayers.Feature.Vector(null, f, null))
+        }
+        return b
+    },
+    getSiblingNodesByTagCriteria: function(a, b) {
+        var c = [],
+            d, e, f, g;
+        if (a && a.hasChildNodes()) {
+            d = a.childNodes;
+            f = d.length;
+            for (var h = 0; h < f; h++) {
+                for (g = d[h]; g && 1 != g.nodeType;) g = g.nextSibling,
+                    h++;
+                e = g ? g.nodeName : "";
+                0 < e.length && -1 < e.indexOf(b) ? c.push(g) : (e = this.getSiblingNodesByTagCriteria(g, b), 0 < e.length && (0 == c.length ? c = e : c.push(e)))
+            }
+        }
+        return c
+    },
+    parseAttributes: function(a) {
+        var b = {};
+        if (1 == a.nodeType)
+            for (var a = a.childNodes, c = a.length, d = 0; d < c; ++d) {
+                var e = a[d];
+                if (1 == e.nodeType) {
+                    var f = e.childNodes,
+                        e = e.prefix ? e.nodeName.split(":")[1] : e.nodeName;
+                    if (0 == f.length) b[e] = null;
+                    else if (1 == f.length && (f = f[0], 3 == f.nodeType || 4 == f.nodeType)) f = f.nodeValue.replace(this.regExes.trimSpace, ""), b[e] = f
+                }
+            }
+        return b
+    },
+    parseGeometry: function(a) {
+        this.gmlFormat || (this.gmlFormat = new OpenLayers.Format.GML);
+        var a = this.gmlFormat.parseFeature(a),
+            b, c = null;
+        a && (b = a.geometry && a.geometry.clone(), c = a.bounds && a.bounds.clone(), a.destroy());
+        return {
+            geometry: b,
+            bounds: c
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.WMSGetFeatureInfo"
+});
+OpenLayers.Control.WMTSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
+    hover: !1,
+    requestEncoding: "KVP",
+    drillDown: !1,
+    maxFeatures: 10,
+    clickCallback: "click",
+    layers: null,
+    queryVisible: !0,
+    infoFormat: "text/html",
+    vendorParams: {},
+    format: null,
+    formatOptions: null,
+    handlerOptions: null,
+    handler: null,
+    hoverRequest: null,
+    pending: 0,
+    initialize: function(a) {
+        a = a || {};
+        a.handlerOptions = a.handlerOptions || {};
+        OpenLayers.Control.prototype.initialize.apply(this, [a]);
+        this.format || (this.format = new OpenLayers.Format.WMSGetFeatureInfo(a.formatOptions));
+        !0 === this.drillDown && (this.hover = !1);
+        this.hover ? this.handler = new OpenLayers.Handler.Hover(this, {
+            move: this.cancelHover,
+            pause: this.getInfoForHover
+        }, OpenLayers.Util.extend(this.handlerOptions.hover || {}, {
+            delay: 250
+        })) : (a = {}, a[this.clickCallback] = this.getInfoForClick, this.handler = new OpenLayers.Handler.Click(this, a, this.handlerOptions.click || {}))
+    },
+    getInfoForClick: function(a) {
+        this.request(a.xy, {})
+    },
+    getInfoForHover: function(a) {
+        this.request(a.xy, {
+            hover: !0
+        })
+    },
+    cancelHover: function() {
+        this.hoverRequest && (--this.pending,
+            0 >= this.pending && (OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait"), this.pending = 0), this.hoverRequest.abort(), this.hoverRequest = null)
+    },
+    findLayers: function() {
+        for (var a = this.layers || this.map.layers, b = [], c, d = a.length - 1; 0 <= d; --d)
+            if (c = a[d], c instanceof OpenLayers.Layer.WMTS && c.requestEncoding === this.requestEncoding && (!this.queryVisible || c.getVisibility()))
+                if (b.push(c), !this.drillDown || this.hover) break;
+        return b
+    },
+    buildRequestOptions: function(a, b) {
+        var c = this.map.getLonLatFromPixel(b),
+            d =
+            a.getURL(new OpenLayers.Bounds(c.lon, c.lat, c.lon, c.lat)),
+            d = OpenLayers.Util.getParameters(d),
+            c = a.getTileInfo(c);
+        OpenLayers.Util.extend(d, {
+            service: "WMTS",
+            version: a.version,
+            request: "GetFeatureInfo",
+            infoFormat: this.infoFormat,
+            i: c.i,
+            j: c.j
+        });
+        OpenLayers.Util.applyDefaults(d, this.vendorParams);
+        return {
+            url: OpenLayers.Util.isArray(a.url) ? a.url[0] : a.url,
+            params: OpenLayers.Util.upperCaseObject(d),
+            callback: function(c) {
+                this.handleResponse(b, c, a)
+            },
+            scope: this
+        }
+    },
+    request: function(a, b) {
+        var b = b || {},
+            c = this.findLayers();
+        if (0 < c.length) {
+            for (var d, e, f = 0, g = c.length; f < g; f++) e = c[f], d = this.events.triggerEvent("beforegetfeatureinfo", {
+                xy: a,
+                layer: e
+            }), !1 !== d && (++this.pending, d = this.buildRequestOptions(e, a), d = OpenLayers.Request.GET(d), !0 === b.hover && (this.hoverRequest = d));
+            0 < this.pending && OpenLayers.Element.addClass(this.map.viewPortDiv, "olCursorWait")
+        }
+    },
+    handleResponse: function(a, b, c) {
+        --this.pending;
+        0 >= this.pending && (OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait"), this.pending = 0);
+        if (b.status && (200 > b.status ||
+                300 <= b.status)) this.events.triggerEvent("exception", {
+            xy: a,
+            request: b,
+            layer: c
+        });
+        else {
+            var d = b.responseXML;
+            if (!d || !d.documentElement) d = b.responseText;
+            var e, f;
+            try {
+                e = this.format.read(d)
+            } catch (g) {
+                f = !0, this.events.triggerEvent("exception", {
+                    xy: a,
+                    request: b,
+                    error: g,
+                    layer: c
+                })
+            }
+            f || this.events.triggerEvent("getfeatureinfo", {
+                text: b.responseText,
+                features: e,
+                request: b,
+                xy: a,
+                layer: c
+            })
+        }
+    },
+    CLASS_NAME: "OpenLayers.Control.WMTSGetFeatureInfo"
+});
+OpenLayers.Strategy.Paging = OpenLayers.Class(OpenLayers.Strategy, {
+    features: null,
+    length: 10,
+    num: null,
+    paging: !1,
+    activate: function() {
+        var a = OpenLayers.Strategy.prototype.activate.call(this);
+        if (a) this.layer.events.on({
+            beforefeaturesadded: this.cacheFeatures,
+            scope: this
+        });
+        return a
+    },
+    deactivate: function() {
+        var a = OpenLayers.Strategy.prototype.deactivate.call(this);
+        a && (this.clearCache(), this.layer.events.un({
+            beforefeaturesadded: this.cacheFeatures,
+            scope: this
+        }));
+        return a
+    },
+    cacheFeatures: function(a) {
+        this.paging || (this.clearCache(),
+            this.features = a.features, this.pageNext(a))
+    },
+    clearCache: function() {
+        if (this.features)
+            for (var a = 0; a < this.features.length; ++a) this.features[a].destroy();
+        this.num = this.features = null
+    },
+    pageCount: function() {
+        return Math.ceil((this.features ? this.features.length : 0) / this.length)
+    },
+    pageNum: function() {
+        return this.num
+    },
+    pageLength: function(a) {
+        a && 0 < a && (this.length = a);
+        return this.length
+    },
+    pageNext: function(a) {
+        var b = !1;
+        this.features && (null === this.num && (this.num = -1), b = this.page((this.num + 1) * this.length, a));
+        return b
+    },
+    pagePrevious: function() {
+        var a = !1;
+        this.features && (null === this.num && (this.num = this.pageCount()), a = this.page((this.num - 1) * this.length));
+        return a
+    },
+    page: function(a, b) {
+        var c = !1;
+        if (this.features && 0 <= a && a < this.features.length) {
+            var d = Math.floor(a / this.length);
+            d != this.num && (this.paging = !0, c = this.features.slice(a, a + this.length), this.layer.removeFeatures(this.layer.features), this.num = d, b && b.features ? b.features = c : this.layer.addFeatures(c), this.paging = !1, c = !0)
+        }
+        return c
+    },
+    CLASS_NAME: "OpenLayers.Strategy.Paging"
+});
+OpenLayers.Protocol.CSW.v2_0_2 = OpenLayers.Class(OpenLayers.Protocol, {
+    formatOptions: null,
+    initialize: function(a) {
+        OpenLayers.Protocol.prototype.initialize.apply(this, [a]);
+        a.format || (this.format = new OpenLayers.Format.CSWGetRecords.v2_0_2(OpenLayers.Util.extend({}, this.formatOptions)))
+    },
+    destroy: function() {
+        this.options && !this.options.format && this.format.destroy();
+        this.format = null;
+        OpenLayers.Protocol.prototype.destroy.apply(this)
+    },
+    read: function(a) {
+        a = OpenLayers.Util.extend({}, a);
+        OpenLayers.Util.applyDefaults(a,
+            this.options || {});
+        var b = new OpenLayers.Protocol.Response({
+                requestType: "read"
+            }),
+            c = this.format.write(a.params);
+        b.priv = OpenLayers.Request.POST({
+            url: a.url,
+            callback: this.createCallback(this.handleRead, b, a),
+            params: a.params,
+            headers: a.headers,
+            data: c
+        });
+        return b
+    },
+    handleRead: function(a, b) {
+        if (b.callback) {
+            var c = a.priv;
+            200 <= c.status && 300 > c.status ? (a.data = this.parseData(c), a.code = OpenLayers.Protocol.Response.SUCCESS) : a.code = OpenLayers.Protocol.Response.FAILURE;
+            b.callback.call(b.scope, a)
+        }
+    },
+    parseData: function(a) {
+        var b =
+            a.responseXML;
+        if (!b || !b.documentElement) b = a.responseText;
+        return !b || 0 >= b.length ? null : this.format.read(b)
+    },
+    CLASS_NAME: "OpenLayers.Protocol.CSW.v2_0_2"
+});
+OpenLayers.Format.WMSCapabilities.v1_1 = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1, {
+    readers: {
+        wms: OpenLayers.Util.applyDefaults({
+                WMT_MS_Capabilities: function(a, b) {
+                    this.readChildNodes(a, b)
+                },
+                Keyword: function(a, b) {
+                    b.keywords && b.keywords.push(this.getChildValue(a))
+                },
+                DescribeLayer: function(a, b) {
+                    b.describelayer = {
+                        formats: []
+                    };
+                    this.readChildNodes(a, b.describelayer)
+                },
+                GetLegendGraphic: function(a, b) {
+                    b.getlegendgraphic = {
+                        formats: []
+                    };
+                    this.readChildNodes(a, b.getlegendgraphic)
+                },
+                GetStyles: function(a, b) {
+                    b.getstyles = {
+                        formats: []
+                    };
+                    this.readChildNodes(a, b.getstyles)
+                },
+                PutStyles: function(a, b) {
+                    b.putstyles = {
+                        formats: []
+                    };
+                    this.readChildNodes(a, b.putstyles)
+                },
+                UserDefinedSymbolization: function(a, b) {
+                    var c = {
+                        supportSLD: 1 == parseInt(a.getAttribute("SupportSLD")),
+                        userLayer: 1 == parseInt(a.getAttribute("UserLayer")),
+                        userStyle: 1 == parseInt(a.getAttribute("UserStyle")),
+                        remoteWFS: 1 == parseInt(a.getAttribute("RemoteWFS"))
+                    };
+                    b.userSymbols = c
+                },
+                LatLonBoundingBox: function(a, b) {
+                    b.llbbox = [parseFloat(a.getAttribute("minx")), parseFloat(a.getAttribute("miny")),
+                        parseFloat(a.getAttribute("maxx")), parseFloat(a.getAttribute("maxy"))
+                    ]
+                },
+                BoundingBox: function(a, b) {
+                    var c = OpenLayers.Format.WMSCapabilities.v1.prototype.readers.wms.BoundingBox.apply(this, [a, b]);
+                    c.srs = a.getAttribute("SRS");
+                    b.bbox[c.srs] = c
+                },
+                ScaleHint: function(a, b) {
+                    var c = a.getAttribute("min"),
+                        d = a.getAttribute("max"),
+                        e = Math.pow(2, 0.5),
+                        f = OpenLayers.INCHES_PER_UNIT.m;
+                    b.maxScale = parseFloat((c / e * f * OpenLayers.DOTS_PER_INCH).toPrecision(13));
+                    b.minScale = parseFloat((d / e * f * OpenLayers.DOTS_PER_INCH).toPrecision(13))
+                },
+                Dimension: function(a, b) {
+                    var c = {
+                        name: a.getAttribute("name").toLowerCase(),
+                        units: a.getAttribute("units"),
+                        unitsymbol: a.getAttribute("unitSymbol")
+                    };
+                    b.dimensions[c.name] = c
+                },
+                Extent: function(a, b) {
+                    var c = a.getAttribute("name").toLowerCase();
+                    if (c in b.dimensions) {
+                        c = b.dimensions[c];
+                        c.nearestVal = "1" === a.getAttribute("nearestValue");
+                        c.multipleVal = "1" === a.getAttribute("multipleValues");
+                        c.current = "1" === a.getAttribute("current");
+                        c["default"] = a.getAttribute("default") || "";
+                        var d = this.getChildValue(a);
+                        c.values = d.split(",")
+                    }
+                }
+            },
+            OpenLayers.Format.WMSCapabilities.v1.prototype.readers.wms)
+    },
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_1"
+});
+OpenLayers.Control.Graticule = OpenLayers.Class(OpenLayers.Control, {
+    autoActivate: !0,
+    intervals: [45, 30, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.01, 0.005, 0.002, 0.001],
+    displayInLayerSwitcher: !0,
+    visible: !0,
+    numPoints: 50,
+    targetSize: 200,
+    layerName: null,
+    labelled: !0,
+    labelFormat: "dm",
+    lineSymbolizer: {
+        strokeColor: "#333",
+        strokeWidth: 1,
+        strokeOpacity: 0.5
+    },
+    labelSymbolizer: {},
+    gratLayer: null,
+    initialize: function(a) {
+        a = a || {};
+        a.layerName = a.layerName || OpenLayers.i18n("Graticule");
+        OpenLayers.Control.prototype.initialize.apply(this, [a]);
+        this.labelSymbolizer.stroke = !1;
+        this.labelSymbolizer.fill = !1;
+        this.labelSymbolizer.label = "${label}";
+        this.labelSymbolizer.labelAlign = "${labelAlign}";
+        this.labelSymbolizer.labelXOffset = "${xOffset}";
+        this.labelSymbolizer.labelYOffset = "${yOffset}"
+    },
+    destroy: function() {
+        this.deactivate();
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+        this.gratLayer && (this.gratLayer.destroy(), this.gratLayer = null)
+    },
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        if (!this.gratLayer) {
+            var a = new OpenLayers.Style({}, {
+                rules: [new OpenLayers.Rule({
+                    symbolizer: {
+                        Point: this.labelSymbolizer,
+                        Line: this.lineSymbolizer
+                    }
+                })]
+            });
+            this.gratLayer = new OpenLayers.Layer.Vector(this.layerName, {
+                styleMap: new OpenLayers.StyleMap({
+                    "default": a
+                }),
+                visibility: this.visible,
+                displayInLayerSwitcher: this.displayInLayerSwitcher
+            })
+        }
+        return this.div
+    },
+    activate: function() {
+        return OpenLayers.Control.prototype.activate.apply(this, arguments) ? (this.map.addLayer(this.gratLayer), this.map.events.register("moveend", this, this.update), this.update(), !0) : !1
+    },
+    deactivate: function() {
+        return OpenLayers.Control.prototype.deactivate.apply(this,
+            arguments) ? (this.map.events.unregister("moveend", this, this.update), this.map.removeLayer(this.gratLayer), !0) : !1
+    },
+    update: function() {
+        var a = this.map.getExtent();
+        if (a) {
+            this.gratLayer.destroyFeatures();
+            var b = new OpenLayers.Projection("EPSG:4326"),
+                c = this.map.getProjectionObject(),
+                d = this.map.getResolution();
+            c.proj && "longlat" == c.proj.projName && (this.numPoints = 1);
+            var e = this.map.getCenter(),
+                f = new OpenLayers.Pixel(e.lon, e.lat);
+            OpenLayers.Projection.transform(f, c, b);
+            for (var e = this.targetSize * d, e = e * e, g, d = 0; d < this.intervals.length; ++d) {
+                g =
+                    this.intervals[d];
+                var h = g / 2,
+                    i = f.offset({
+                        x: -h,
+                        y: -h
+                    }),
+                    h = f.offset({
+                        x: h,
+                        y: h
+                    });
+                OpenLayers.Projection.transform(i, b, c);
+                OpenLayers.Projection.transform(h, b, c);
+                if ((i.x - h.x) * (i.x - h.x) + (i.y - h.y) * (i.y - h.y) <= e) break
+            }
+            f.x = Math.floor(f.x / g) * g;
+            f.y = Math.floor(f.y / g) * g;
+            var d = 0,
+                e = [f.clone()],
+                h = f.clone(),
+                j;
+            do h = h.offset({
+                x: 0,
+                y: g
+            }), j = OpenLayers.Projection.transform(h.clone(), b, c), e.unshift(h); while (a.containsPixel(j) && 1E3 > ++d);
+            h = f.clone();
+            do h = h.offset({
+                x: 0,
+                y: -g
+            }), j = OpenLayers.Projection.transform(h.clone(), b, c), e.push(h);
+            while (a.containsPixel(j) && 1E3 > ++d);
+            d = 0;
+            i = [f.clone()];
+            h = f.clone();
+            do h = h.offset({
+                x: -g,
+                y: 0
+            }), j = OpenLayers.Projection.transform(h.clone(), b, c), i.unshift(h); while (a.containsPixel(j) && 1E3 > ++d);
+            h = f.clone();
+            do h = h.offset({
+                x: g,
+                y: 0
+            }), j = OpenLayers.Projection.transform(h.clone(), b, c), i.push(h); while (a.containsPixel(j) && 1E3 > ++d);
+            g = [];
+            for (d = 0; d < i.length; ++d) {
+                j = i[d].x;
+                for (var f = [], k = null, l = Math.min(e[0].y, 90), h = Math.max(e[e.length - 1].y, -90), m = (l - h) / this.numPoints, l = h, h = 0; h <= this.numPoints; ++h) {
+                    var n = new OpenLayers.Geometry.Point(j,
+                        l);
+                    n.transform(b, c);
+                    f.push(n);
+                    l += m;
+                    n.y >= a.bottom && !k && (k = n)
+                }
+                this.labelled && (k = new OpenLayers.Geometry.Point(k.x, a.bottom), j = {
+                    value: j,
+                    label: this.labelled ? OpenLayers.Util.getFormattedLonLat(j, "lon", this.labelFormat) : "",
+                    labelAlign: "cb",
+                    xOffset: 0,
+                    yOffset: 2
+                }, this.gratLayer.addFeatures(new OpenLayers.Feature.Vector(k, j)));
+                f = new OpenLayers.Geometry.LineString(f);
+                g.push(new OpenLayers.Feature.Vector(f))
+            }
+            for (h = 0; h < e.length; ++h)
+                if (l = e[h].y, !(-90 > l || 90 < l)) {
+                    f = [];
+                    d = i[0].x;
+                    m = (i[i.length - 1].x - d) / this.numPoints;
+                    j = d;
+                    k = null;
+                    for (d = 0; d <= this.numPoints; ++d) n = new OpenLayers.Geometry.Point(j, l), n.transform(b, c), f.push(n), j += m, n.x < a.right && (k = n);
+                    this.labelled && (k = new OpenLayers.Geometry.Point(a.right, k.y), j = {
+                        value: l,
+                        label: this.labelled ? OpenLayers.Util.getFormattedLonLat(l, "lat", this.labelFormat) : "",
+                        labelAlign: "rb",
+                        xOffset: -2,
+                        yOffset: 2
+                    }, this.gratLayer.addFeatures(new OpenLayers.Feature.Vector(k, j)));
+                    f = new OpenLayers.Geometry.LineString(f);
+                    g.push(new OpenLayers.Feature.Vector(f))
+                }
+            this.gratLayer.addFeatures(g)
+        }
+    },
+    CLASS_NAME: "OpenLayers.Control.Graticule"
+});
+OpenLayers.Layer.UTFGrid = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+    isBaseLayer: !1,
+    projection: new OpenLayers.Projection("EPSG:900913"),
+    useJSONP: !1,
+    tileClass: OpenLayers.Tile.UTFGrid,
+    initialize: function(a) {
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a.name, a.url, {}, a]);
+        this.tileOptions = OpenLayers.Util.extend({
+            utfgridResolution: this.utfgridResolution
+        }, this.tileOptions)
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.UTFGrid(this.getOptions()));
+        return a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+    },
+    getFeatureInfo: function(a) {
+        var b = null,
+            a = this.getTileData(a);
+        a.tile && (b = a.tile.getFeatureInfo(a.i, a.j));
+        return b
+    },
+    getFeatureId: function(a) {
+        var b = null,
+            a = this.getTileData(a);
+        a.tile && (b = a.tile.getFeatureId(a.i, a.j));
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Layer.UTFGrid"
+});
+OpenLayers.Layer.ArcGISCache = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+    url: null,
+    tileOrigin: null,
+    tileSize: new OpenLayers.Size(256, 256),
+    useArcGISServer: !0,
+    type: "png",
+    useScales: !1,
+    overrideDPI: !1,
+    initialize: function(a, b, c) {
+        OpenLayers.Layer.XYZ.prototype.initialize.apply(this, arguments);
+        this.resolutions && (this.serverResolutions = this.resolutions, this.maxExtent = this.getMaxExtentForResolution(this.resolutions[0]));
+        if (this.layerInfo) {
+            var d = this.layerInfo,
+                e = new OpenLayers.Bounds(d.fullExtent.xmin, d.fullExtent.ymin,
+                    d.fullExtent.xmax, d.fullExtent.ymax);
+            this.projection = "EPSG:" + d.spatialReference.wkid;
+            this.sphericalMercator = 102100 == d.spatialReference.wkid;
+            this.units = "esriFeet" == d.units ? "ft" : "m";
+            if (d.tileInfo) {
+                this.tileSize = new OpenLayers.Size(d.tileInfo.width || d.tileInfo.cols, d.tileInfo.height || d.tileInfo.rows);
+                this.tileOrigin = new OpenLayers.LonLat(d.tileInfo.origin.x, d.tileInfo.origin.y);
+                var f = new OpenLayers.Geometry.Point(e.left, e.top),
+                    e = new OpenLayers.Geometry.Point(e.right, e.bottom);
+                this.useScales ? this.scales = [] : this.resolutions = [];
+                this.lods = [];
+                for (var g in d.tileInfo.lods)
+                    if (d.tileInfo.lods.hasOwnProperty(g)) {
+                        var h = d.tileInfo.lods[g];
+                        this.useScales ? this.scales.push(h.scale) : this.resolutions.push(h.resolution);
+                        var i = this.getContainingTileCoords(f, h.resolution);
+                        h.startTileCol = i.x;
+                        h.startTileRow = i.y;
+                        i = this.getContainingTileCoords(e, h.resolution);
+                        h.endTileCol = i.x;
+                        h.endTileRow = i.y;
+                        this.lods.push(h)
+                    }
+                this.maxExtent = this.calculateMaxExtentWithLOD(this.lods[0]);
+                this.serverResolutions = this.resolutions;
+                this.overrideDPI &&
+                    d.tileInfo.dpi && (OpenLayers.DOTS_PER_INCH = d.tileInfo.dpi)
+            }
+        }
+    },
+    getContainingTileCoords: function(a, b) {
+        return new OpenLayers.Pixel(Math.max(Math.floor((a.x - this.tileOrigin.lon) / (this.tileSize.w * b)), 0), Math.max(Math.floor((this.tileOrigin.lat - a.y) / (this.tileSize.h * b)), 0))
+    },
+    calculateMaxExtentWithLOD: function(a) {
+        var b = this.tileOrigin.lon + a.startTileCol * this.tileSize.w * a.resolution,
+            c = this.tileOrigin.lat - a.startTileRow * this.tileSize.h * a.resolution;
+        return new OpenLayers.Bounds(b, c - (a.endTileRow - a.startTileRow +
+            1) * this.tileSize.h * a.resolution, b + (a.endTileCol - a.startTileCol + 1) * this.tileSize.w * a.resolution, c)
+    },
+    calculateMaxExtentWithExtent: function(a, b) {
+        var c = new OpenLayers.Geometry.Point(a.left, a.top),
+            d = new OpenLayers.Geometry.Point(a.right, a.bottom),
+            c = this.getContainingTileCoords(c, b),
+            d = this.getContainingTileCoords(d, b);
+        return this.calculateMaxExtentWithLOD({
+            resolution: b,
+            startTileCol: c.x,
+            startTileRow: c.y,
+            endTileCol: d.x,
+            endTileRow: d.y
+        })
+    },
+    getUpperLeftTileCoord: function(a) {
+        return this.getContainingTileCoords(new OpenLayers.Geometry.Point(this.maxExtent.left,
+            this.maxExtent.top), a)
+    },
+    getLowerRightTileCoord: function(a) {
+        return this.getContainingTileCoords(new OpenLayers.Geometry.Point(this.maxExtent.right, this.maxExtent.bottom), a)
+    },
+    getMaxExtentForResolution: function(a) {
+        var b = this.getUpperLeftTileCoord(a),
+            c = this.getLowerRightTileCoord(a),
+            d = this.tileOrigin.lon + b.x * this.tileSize.w * a,
+            e = this.tileOrigin.lat - b.y * this.tileSize.h * a;
+        return new OpenLayers.Bounds(d, e - (c.y - b.y + 1) * this.tileSize.h * a, d + (c.x - b.x + 1) * this.tileSize.w * a, e)
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.ArcGISCache(this.name,
+            this.url, this.options));
+        return OpenLayers.Layer.XYZ.prototype.clone.apply(this, [a])
+    },
+    getMaxExtent: function() {
+        return this.maxExtent = this.getMaxExtentForResolution(this.map.getResolution())
+    },
+    getTileOrigin: function() {
+        var a = this.getMaxExtent();
+        return new OpenLayers.LonLat(a.left, a.bottom)
+    },
+    getURL: function(a) {
+        var b = this.getResolution(),
+            c = this.tileOrigin.lon + b * this.tileSize.w / 2,
+            d = this.tileOrigin.lat - b * this.tileSize.h / 2,
+            a = a.getCenterLonLat(),
+            c = Math.round(Math.abs((a.lon - c) / (b * this.tileSize.w))),
+            d = Math.round(Math.abs((d -
+                a.lat) / (b * this.tileSize.h))),
+            a = this.map.getZoom();
+        if (this.lods) {
+            if (b = this.lods[this.map.getZoom()], c < b.startTileCol || c > b.endTileCol || d < b.startTileRow || d > b.endTileRow) return null
+        } else {
+            var e = this.getUpperLeftTileCoord(b),
+                b = this.getLowerRightTileCoord(b);
+            if (c < e.x || c >= b.x || d < e.y || d >= b.y) return null
+        }
+        b = this.url;
+        e = "" + c + d + a;
+        OpenLayers.Util.isArray(b) && (b = this.selectUrl(e, b));
+        this.useArcGISServer ? b += "/tile/${z}/${y}/${x}" : (c = "C" + this.zeroPad(c, 8, 16), d = "R" + this.zeroPad(d, 8, 16), a = "L" + this.zeroPad(a, 2, 16), b =
+            b + "/${z}/${y}/${x}." + this.type);
+        b = OpenLayers.String.format(b, {
+            x: c,
+            y: d,
+            z: a
+        });
+        return OpenLayers.Util.urlAppend(b, OpenLayers.Util.getParameterString(this.params))
+    },
+    zeroPad: function(a, b, c) {
+        for (a = a.toString(c || 10); a.length < b;) a = "0" + a;
+        return a
+    },
+    CLASS_NAME: "OpenLayers.Layer.ArcGISCache"
+});
+OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
+    hover: !1,
+    drillDown: !1,
+    maxFeatures: 10,
+    clickCallback: "click",
+    output: "features",
+    layers: null,
+    queryVisible: !1,
+    url: null,
+    layerUrls: null,
+    infoFormat: "text/html",
+    vendorParams: {},
+    format: null,
+    formatOptions: null,
+    handlerOptions: null,
+    handler: null,
+    hoverRequest: null,
+    initialize: function(a) {
+        a = a || {};
+        a.handlerOptions = a.handlerOptions || {};
+        OpenLayers.Control.prototype.initialize.apply(this, [a]);
+        this.format || (this.format = new OpenLayers.Format.WMSGetFeatureInfo(a.formatOptions));
+        !0 === this.drillDown && (this.hover = !1);
+        this.hover ? this.handler = new OpenLayers.Handler.Hover(this, {
+            move: this.cancelHover,
+            pause: this.getInfoForHover
+        }, OpenLayers.Util.extend(this.handlerOptions.hover || {}, {
+            delay: 250
+        })) : (a = {}, a[this.clickCallback] = this.getInfoForClick, this.handler = new OpenLayers.Handler.Click(this, a, this.handlerOptions.click || {}))
+    },
+    getInfoForClick: function(a) {
+        this.events.triggerEvent("beforegetfeatureinfo", {
+            xy: a.xy
+        });
+        OpenLayers.Element.addClass(this.map.viewPortDiv, "olCursorWait");
+        this.request(a.xy, {})
+    },
+    getInfoForHover: function(a) {
+        this.events.triggerEvent("beforegetfeatureinfo", {
+            xy: a.xy
+        });
+        this.request(a.xy, {
+            hover: !0
+        })
+    },
+    cancelHover: function() {
+        this.hoverRequest && (this.hoverRequest.abort(), this.hoverRequest = null)
+    },
+    findLayers: function() {
+        for (var a = this.layers || this.map.layers, b = [], c, d, e = a.length - 1; 0 <= e; --e)
+            if (c = a[e], c instanceof OpenLayers.Layer.WMS && (!this.queryVisible || c.getVisibility())) d = OpenLayers.Util.isArray(c.url) ? c.url[0] : c.url, !1 === this.drillDown && !this.url && (this.url = d), (!0 === this.drillDown ||
+                this.urlMatches(d)) && b.push(c);
+        return b
+    },
+    urlMatches: function(a) {
+        var b = OpenLayers.Util.isEquivalentUrl(this.url, a);
+        if (!b && this.layerUrls)
+            for (var c = 0, d = this.layerUrls.length; c < d; ++c)
+                if (OpenLayers.Util.isEquivalentUrl(this.layerUrls[c], a)) {
+                    b = !0;
+                    break
+                }
+        return b
+    },
+    buildWMSOptions: function(a, b, c, d) {
+        for (var e = [], f = [], g = 0, h = b.length; g < h; g++) null != b[g].params.LAYERS && (e = e.concat(b[g].params.LAYERS), f = f.concat(this.getStyleNames(b[g])));
+        b = b[0];
+        g = this.map.getProjection();
+        (h = b.projection) && h.equals(this.map.getProjectionObject()) &&
+            (g = h.getCode());
+        d = OpenLayers.Util.extend({
+            service: "WMS",
+            version: b.params.VERSION,
+            request: "GetFeatureInfo",
+            exceptions: b.params.EXCEPTIONS,
+            bbox: this.map.getExtent().toBBOX(null, b.reverseAxisOrder()),
+            feature_count: this.maxFeatures,
+            height: this.map.getSize().h,
+            width: this.map.getSize().w,
+            format: d,
+            info_format: b.params.INFO_FORMAT || this.infoFormat
+        }, 1.3 <= parseFloat(b.params.VERSION) ? {
+            crs: g,
+            i: parseInt(c.x),
+            j: parseInt(c.y)
+        } : {
+            srs: g,
+            x: parseInt(c.x),
+            y: parseInt(c.y)
+        });
+        0 != e.length && (d = OpenLayers.Util.extend({
+            layers: e,
+            query_layers: e,
+            styles: f
+        }, d));
+        OpenLayers.Util.applyDefaults(d, this.vendorParams);
+        return {
+            url: a,
+            params: OpenLayers.Util.upperCaseObject(d),
+            callback: function(b) {
+                this.handleResponse(c, b, a)
+            },
+            scope: this
+        }
+    },
+    getStyleNames: function(a) {
+        return a.params.STYLES ? a.params.STYLES : OpenLayers.Util.isArray(a.params.LAYERS) ? Array(a.params.LAYERS.length) : a.params.LAYERS.replace(/[^,]/g, "")
+    },
+    request: function(a, b) {
+        var c = this.findLayers();
+        if (0 == c.length) this.events.triggerEvent("nogetfeatureinfo"), OpenLayers.Element.removeClass(this.map.viewPortDiv,
+            "olCursorWait");
+        else if (b = b || {}, !1 === this.drillDown) {
+            var c = this.buildWMSOptions(this.url, c, a, c[0].params.FORMAT),
+                d = OpenLayers.Request.GET(c);
+            !0 === b.hover && (this.hoverRequest = d)
+        } else {
+            this._numRequests = this._requestCount = 0;
+            this.features = [];
+            for (var d = {}, e, f = 0, g = c.length; f < g; f++) {
+                var h = c[f];
+                e = OpenLayers.Util.isArray(h.url) ? h.url[0] : h.url;
+                e in d ? d[e].push(h) : (this._numRequests++, d[e] = [h])
+            }
+            for (e in d) c = d[e], c = this.buildWMSOptions(e, c, a, c[0].params.FORMAT), OpenLayers.Request.GET(c)
+        }
+    },
+    triggerGetFeatureInfo: function(a,
+        b, c) {
+        this.events.triggerEvent("getfeatureinfo", {
+            text: a.responseText,
+            features: c,
+            request: a,
+            xy: b
+        });
+        OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait")
+    },
+    handleResponse: function(a, b, c) {
+        var d = b.responseXML;
+        if (!d || !d.documentElement) d = b.responseText;
+        d = this.format.read(d);
+        !1 === this.drillDown ? this.triggerGetFeatureInfo(b, a, d) : (this._requestCount++, this._features = "object" === this.output ? (this._features || []).concat({
+                url: c,
+                features: d
+            }) : (this._features || []).concat(d), this._requestCount === this._numRequests &&
+            (this.triggerGetFeatureInfo(b, a, this._features.concat()), delete this._features, delete this._requestCount, delete this._numRequests))
+    },
+    CLASS_NAME: "OpenLayers.Control.WMSGetFeatureInfo"
+});
+OpenLayers.Format.WMSCapabilities.v1_3_0 = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1_3, {
+    version: "1.3.0",
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_3_0"
+});
+OpenLayers.Format.SOSGetFeatureOfInterest = OpenLayers.Class(OpenLayers.Format.XML, {
+    VERSION: "1.0.0",
+    namespaces: {
+        sos: "http://www.opengis.net/sos/1.0",
+        gml: "http://www.opengis.net/gml",
+        sa: "http://www.opengis.net/sampling/1.0",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    schemaLocation: "http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosAll.xsd",
+    defaultPrefix: "sos",
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    read: function(a) {
+        "string" ==
+        typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var b = {
+            features: []
+        };
+        this.readNode(a, b);
+        for (var a = [], c = 0, d = b.features.length; c < d; c++) {
+            var e = b.features[c];
+            this.internalProjection && (this.externalProjection && e.components[0]) && e.components[0].transform(this.externalProjection, this.internalProjection);
+            e = new OpenLayers.Feature.Vector(e.components[0], e.attributes);
+            a.push(e)
+        }
+        return a
+    },
+    readers: {
+        sa: {
+            SamplingPoint: function(a, b) {
+                if (!b.attributes) {
+                    var c = {
+                        attributes: {}
+                    };
+                    b.features.push(c);
+                    b = c
+                }
+                b.attributes.id = this.getAttributeNS(a, this.namespaces.gml, "id");
+                this.readChildNodes(a, b)
+            },
+            position: function(a, b) {
+                this.readChildNodes(a, b)
+            }
+        },
+        gml: OpenLayers.Util.applyDefaults({
+            FeatureCollection: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            featureMember: function(a, b) {
+                var c = {
+                    attributes: {}
+                };
+                b.features.push(c);
+                this.readChildNodes(a, c)
+            },
+            name: function(a, b) {
+                b.attributes.name = this.getChildValue(a)
+            },
+            pos: function(a, b) {
+                this.externalProjection || (this.externalProjection = new OpenLayers.Projection(a.getAttribute("srsName")));
+                OpenLayers.Format.GML.v3.prototype.readers.gml.pos.apply(this, [a, b])
+            }
+        }, OpenLayers.Format.GML.v3.prototype.readers.gml)
+    },
+    writers: {
+        sos: {
+            GetFeatureOfInterest: function(a) {
+                for (var b = this.createElementNSPlus("GetFeatureOfInterest", {
+                        attributes: {
+                            version: this.VERSION,
+                            service: "SOS",
+                            "xsi:schemaLocation": this.schemaLocation
+                        }
+                    }), c = 0, d = a.fois.length; c < d; c++) this.writeNode("FeatureOfInterestId", {
+                    foi: a.fois[c]
+                }, b);
+                return b
+            },
+            FeatureOfInterestId: function(a) {
+                return this.createElementNSPlus("FeatureOfInterestId", {
+                    value: a.foi
+                })
+            }
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.SOSGetFeatureOfInterest"
+});
+OpenLayers.Format.SOSGetObservation = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        ows: "http://www.opengis.net/ows",
+        gml: "http://www.opengis.net/gml",
+        sos: "http://www.opengis.net/sos/1.0",
+        ogc: "http://www.opengis.net/ogc",
+        om: "http://www.opengis.net/om/1.0",
+        sa: "http://www.opengis.net/sampling/1.0",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    regExes: {
+        trimSpace: /^\s*|\s*$/g,
+        removeSpace: /\s*/g,
+        splitSpace: /\s+/,
+        trimComma: /\s*,\s*/g
+    },
+    VERSION: "1.0.0",
+    schemaLocation: "http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosGetObservation.xsd",
+    defaultPrefix: "sos",
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var b = {
+            measurements: [],
+            observations: []
+        };
+        this.readNode(a, b);
+        return b
+    },
+    write: function(a) {
+        a = this.writeNode("sos:GetObservation", a);
+        a.setAttribute("xmlns:om", this.namespaces.om);
+        a.setAttribute("xmlns:ogc", this.namespaces.ogc);
+        this.setAttributeNS(a, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [a])
+    },
+    readers: {
+        om: {
+            ObservationCollection: function(a, b) {
+                b.id = this.getAttributeNS(a, this.namespaces.gml, "id");
+                this.readChildNodes(a, b)
+            },
+            member: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Measurement: function(a, b) {
+                var c = {};
+                b.measurements.push(c);
+                this.readChildNodes(a, c)
+            },
+            Observation: function(a, b) {
+                var c = {};
+                b.observations.push(c);
+                this.readChildNodes(a, c)
+            },
+            samplingTime: function(a, b) {
+                var c = {};
+                b.samplingTime = c;
+                this.readChildNodes(a, c)
+            },
+            observedProperty: function(a, b) {
+                b.observedProperty = this.getAttributeNS(a, this.namespaces.xlink,
+                    "href");
+                this.readChildNodes(a, b)
+            },
+            procedure: function(a, b) {
+                b.procedure = this.getAttributeNS(a, this.namespaces.xlink, "href");
+                this.readChildNodes(a, b)
+            },
+            featureOfInterest: function(a, b) {
+                var c = {
+                    features: []
+                };
+                b.fois = [];
+                b.fois.push(c);
+                this.readChildNodes(a, c);
+                for (var d = [], e = 0, f = c.features.length; e < f; e++) {
+                    var g = c.features[e];
+                    d.push(new OpenLayers.Feature.Vector(g.components[0], g.attributes))
+                }
+                c.features = d
+            },
+            result: function(a, b) {
+                var c = {};
+                b.result = c;
+                "" !== this.getChildValue(a) ? (c.value = this.getChildValue(a), c.uom =
+                    a.getAttribute("uom")) : this.readChildNodes(a, c)
+            }
+        },
+        sa: OpenLayers.Format.SOSGetFeatureOfInterest.prototype.readers.sa,
+        gml: OpenLayers.Util.applyDefaults({
+            TimeInstant: function(a, b) {
+                var c = {};
+                b.timeInstant = c;
+                this.readChildNodes(a, c)
+            },
+            timePosition: function(a, b) {
+                b.timePosition = this.getChildValue(a)
+            }
+        }, OpenLayers.Format.SOSGetFeatureOfInterest.prototype.readers.gml)
+    },
+    writers: {
+        sos: {
+            GetObservation: function(a) {
+                var b = this.createElementNSPlus("GetObservation", {
+                    attributes: {
+                        version: this.VERSION,
+                        service: "SOS"
+                    }
+                });
+                this.writeNode("offering",
+                    a, b);
+                a.eventTime && this.writeNode("eventTime", a, b);
+                for (var c in a.procedures) this.writeNode("procedure", a.procedures[c], b);
+                for (var d in a.observedProperties) this.writeNode("observedProperty", a.observedProperties[d], b);
+                a.foi && this.writeNode("featureOfInterest", a.foi, b);
+                this.writeNode("responseFormat", a, b);
+                a.resultModel && this.writeNode("resultModel", a, b);
+                a.responseMode && this.writeNode("responseMode", a, b);
+                return b
+            },
+            featureOfInterest: function(a) {
+                var b = this.createElementNSPlus("featureOfInterest");
+                this.writeNode("ObjectID",
+                    a.objectId, b);
+                return b
+            },
+            ObjectID: function(a) {
+                return this.createElementNSPlus("ObjectID", {
+                    value: a
+                })
+            },
+            responseFormat: function(a) {
+                return this.createElementNSPlus("responseFormat", {
+                    value: a.responseFormat
+                })
+            },
+            procedure: function(a) {
+                return this.createElementNSPlus("procedure", {
+                    value: a
+                })
+            },
+            offering: function(a) {
+                return this.createElementNSPlus("offering", {
+                    value: a.offering
+                })
+            },
+            observedProperty: function(a) {
+                return this.createElementNSPlus("observedProperty", {
+                    value: a
+                })
+            },
+            eventTime: function(a) {
+                var b = this.createElementNSPlus("eventTime");
+                "latest" === a.eventTime && this.writeNode("ogc:TM_Equals", a, b);
+                return b
+            },
+            resultModel: function(a) {
+                return this.createElementNSPlus("resultModel", {
+                    value: a.resultModel
+                })
+            },
+            responseMode: function(a) {
+                return this.createElementNSPlus("responseMode", {
+                    value: a.responseMode
+                })
+            }
+        },
+        ogc: {
+            TM_Equals: function(a) {
+                var b = this.createElementNSPlus("ogc:TM_Equals");
+                this.writeNode("ogc:PropertyName", {
+                    property: "urn:ogc:data:time:iso8601"
+                }, b);
+                "latest" === a.eventTime && this.writeNode("gml:TimeInstant", {
+                    value: "latest"
+                }, b);
+                return b
+            },
+            PropertyName: function(a) {
+                return this.createElementNSPlus("ogc:PropertyName", {
+                    value: a.property
+                })
+            }
+        },
+        gml: {
+            TimeInstant: function(a) {
+                var b = this.createElementNSPlus("gml:TimeInstant");
+                this.writeNode("gml:timePosition", a, b);
+                return b
+            },
+            timePosition: function(a) {
+                return this.createElementNSPlus("gml:timePosition", {
+                    value: a.value
+                })
+            }
+        }
+    },
+    CLASS_NAME: "OpenLayers.Format.SOSGetObservation"
+});
+OpenLayers.Control.UTFGrid = OpenLayers.Class(OpenLayers.Control, {
+    autoActivate: !0,
+    layers: null,
+    defaultHandlerOptions: {
+        delay: 300,
+        pixelTolerance: 4,
+        stopMove: !1,
+        single: !0,
+        "double": !1,
+        stopSingle: !1,
+        stopDouble: !1
+    },
+    handlerMode: "click",
+    setHandler: function(a) {
+        this.handlerMode = a;
+        this.resetHandler()
+    },
+    resetHandler: function() {
+        this.handler && (this.handler.deactivate(), this.handler.destroy(), this.handler = null);
+        "hover" == this.handlerMode ? this.handler = new OpenLayers.Handler.Hover(this, {
+                pause: this.handleEvent,
+                move: this.reset
+            },
+            this.handlerOptions) : "click" == this.handlerMode ? this.handler = new OpenLayers.Handler.Click(this, {
+            click: this.handleEvent
+        }, this.handlerOptions) : "move" == this.handlerMode && (this.handler = new OpenLayers.Handler.Hover(this, {
+            pause: this.handleEvent,
+            move: this.handleEvent
+        }, this.handlerOptions));
+        return this.handler ? !0 : !1
+    },
+    initialize: function(a) {
+        a = a || {};
+        a.handlerOptions = a.handlerOptions || this.defaultHandlerOptions;
+        OpenLayers.Control.prototype.initialize.apply(this, [a]);
+        this.resetHandler()
+    },
+    handleEvent: function(a) {
+        if (null ==
+            a) this.reset();
+        else {
+            var b = this.map.getLonLatFromPixel(a.xy);
+            if (b) {
+                var c = this.findLayers();
+                if (0 < c.length) {
+                    for (var d = {}, e, f, g = 0, h = c.length; g < h; g++) e = c[g], f = OpenLayers.Util.indexOf(this.map.layers, e), d[f] = e.getFeatureInfo(b);
+                    this.callback(d, b, a.xy)
+                }
+            }
+        }
+    },
+    callback: function() {},
+    reset: function() {
+        this.callback(null)
+    },
+    findLayers: function() {
+        for (var a = this.layers || this.map.layers, b = [], c, d = a.length - 1; 0 <= d; --d) c = a[d], c instanceof OpenLayers.Layer.UTFGrid && b.push(c);
+        return b
+    },
+    CLASS_NAME: "OpenLayers.Control.UTFGrid"
+});
+OpenLayers.Format.CQL = function() {
+    function a(a) {
+        function b() {
+            var a = e.pop();
+            switch (a.type) {
+                case "LOGICAL":
+                    var c = b(),
+                        g = b();
+                    return new OpenLayers.Filter.Logical({
+                        filters: [g, c],
+                        type: f[a.text.toUpperCase()]
+                    });
+                case "NOT":
+                    return c = b(), new OpenLayers.Filter.Logical({
+                        filters: [c],
+                        type: OpenLayers.Filter.Logical.NOT
+                    });
+                case "BETWEEN":
+                    return e.pop(), g = b(), a = b(), c = b(), new OpenLayers.Filter.Comparison({
+                        property: c,
+                        lowerBoundary: a,
+                        upperBoundary: g,
+                        type: OpenLayers.Filter.Comparison.BETWEEN
+                    });
+                case "COMPARISON":
+                    return g =
+                        b(), c = b(), new OpenLayers.Filter.Comparison({
+                            property: c,
+                            value: g,
+                            type: d[a.text.toUpperCase()]
+                        });
+                case "VALUE":
+                    return /^'.*'$/.test(a.text) ? a.text.substr(1, a.text.length - 2) : Number(a.text);
+                case "SPATIAL":
+                    switch (a.text.toUpperCase()) {
+                        case "BBOX":
+                            var c = b(),
+                                a = b(),
+                                g = b(),
+                                h = b(),
+                                i = b();
+                            return new OpenLayers.Filter.Spatial({
+                                type: OpenLayers.Filter.Spatial.BBOX,
+                                property: i,
+                                value: OpenLayers.Bounds.fromArray([h, g, a, c])
+                            });
+                        case "INTERSECTS":
+                            return g = b(), c = b(), new OpenLayers.Filter.Spatial({
+                                type: OpenLayers.Filter.Spatial.INTERSECTS,
+                                property: c,
+                                value: g
+                            });
+                        case "WITHIN":
+                            return g = b(), c = b(), new OpenLayers.Filter.Spatial({
+                                type: OpenLayers.Filter.Spatial.WITHIN,
+                                property: c,
+                                value: g
+                            });
+                        case "CONTAINS":
+                            return g = b(), c = b(), new OpenLayers.Filter.Spatial({
+                                type: OpenLayers.Filter.Spatial.CONTAINS,
+                                property: c,
+                                value: g
+                            });
+                        case "DWITHIN":
+                            return a = b(), g = b(), c = b(), new OpenLayers.Filter.Spatial({
+                                type: OpenLayers.Filter.Spatial.DWITHIN,
+                                value: g,
+                                property: c,
+                                distance: Number(a)
+                            })
+                    }
+                case "GEOMETRY":
+                    return OpenLayers.Geometry.fromWKT(a.text);
+                default:
+                    return a.text
+            }
+        }
+        for (var c = [], e = []; a.length;) {
+            var g = a.shift();
+            switch (g.type) {
+                case "PROPERTY":
+                case "GEOMETRY":
+                case "VALUE":
+                    e.push(g);
+                    break;
+                case "COMPARISON":
+                case "BETWEEN":
+                case "LOGICAL":
+                    for (var i = h[g.type]; 0 < c.length && h[c[c.length - 1].type] <= i;) e.push(c.pop());
+                    c.push(g);
+                    break;
+                case "SPATIAL":
+                case "NOT":
+                case "LPAREN":
+                    c.push(g);
+                    break;
+                case "RPAREN":
+                    for (; 0 < c.length && "LPAREN" != c[c.length - 1].type;) e.push(c.pop());
+                    c.pop();
+                    0 < c.length && "SPATIAL" == c[c.length - 1].type && e.push(c.pop());
+                case "COMMA":
+                case "END":
+                    break;
+                default:
+                    throw Error("Unknown token type " +
+                        g.type);
+            }
+        }
+        for (; 0 < c.length;) e.push(c.pop());
+        a = b();
+        if (0 < e.length) {
+            a = "Remaining tokens after building AST: \n";
+            for (c = e.length - 1; 0 <= c; c--) a += e[c].type + ": " + e[c].text + "\n";
+            throw Error(a);
+        }
+        return a
+    }
+    var b = {
+            PROPERTY: /^[_a-zA-Z]\w*/,
+            COMPARISON: /^(=|<>|<=|<|>=|>|LIKE)/i,
+            COMMA: /^,/,
+            LOGICAL: /^(AND|OR)/i,
+            VALUE: /^('\w+'|\d+(\.\d*)?|\.\d+)/,
+            LPAREN: /^\(/,
+            RPAREN: /^\)/,
+            SPATIAL: /^(BBOX|INTERSECTS|DWITHIN|WITHIN|CONTAINS)/i,
+            NOT: /^NOT/i,
+            BETWEEN: /^BETWEEN/i,
+            GEOMETRY: function(a) {
+                var b = /^(POINT|LINESTRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON|GEOMETRYCOLLECTION)/.exec(a);
+                if (b) {
+                    var c = a.length,
+                        b = a.indexOf("(", b[0].length);
+                    if (-1 < b)
+                        for (var d = 1; b < c && 0 < d;) switch (b++, a.charAt(b)) {
+                            case "(":
+                                d++;
+                                break;
+                            case ")":
+                                d--
+                        }
+                    return [a.substr(0, b + 1)]
+                }
+            },
+            END: /^$/
+        },
+        c = {
+            LPAREN: ["GEOMETRY", "SPATIAL", "PROPERTY", "VALUE", "LPAREN"],
+            RPAREN: ["NOT", "LOGICAL", "END", "RPAREN"],
+            PROPERTY: ["COMPARISON", "BETWEEN", "COMMA"],
+            BETWEEN: ["VALUE"],
+            COMPARISON: ["VALUE"],
+            COMMA: ["GEOMETRY", "VALUE", "PROPERTY"],
+            VALUE: ["LOGICAL", "COMMA", "RPAREN", "END"],
+            SPATIAL: ["LPAREN"],
+            LOGICAL: ["NOT", "VALUE", "SPATIAL", "PROPERTY", "LPAREN"],
+            NOT: ["PROPERTY", "LPAREN"],
+            GEOMETRY: ["COMMA", "RPAREN"]
+        },
+        d = {
+            "=": OpenLayers.Filter.Comparison.EQUAL_TO,
+            "<>": OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+            "<": OpenLayers.Filter.Comparison.LESS_THAN,
+            "<=": OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO,
+            ">": OpenLayers.Filter.Comparison.GREATER_THAN,
+            ">=": OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO,
+            LIKE: OpenLayers.Filter.Comparison.LIKE,
+            BETWEEN: OpenLayers.Filter.Comparison.BETWEEN
+        },
+        e = {},
+        f = {
+            AND: OpenLayers.Filter.Logical.AND,
+            OR: OpenLayers.Filter.Logical.OR
+        },
+        g = {},
+        h = {
+            RPAREN: 3,
+            LOGICAL: 2,
+            COMPARISON: 1
+        },
+        i;
+    for (i in d) d.hasOwnProperty(i) && (e[d[i]] = i);
+    for (i in f) f.hasOwnProperty(i) && (g[f[i]] = i);
+    return OpenLayers.Class(OpenLayers.Format, {
+        read: function(d) {
+            var e = d,
+                d = [],
+                f, g = ["NOT", "GEOMETRY", "SPATIAL", "PROPERTY", "LPAREN"];
+            do {
+                a: {
+                    f = g;
+                    for (var h = void 0, g = void 0, i = f.length, h = 0; h < i; h++) {
+                        var g = f[h],
+                            p = b[g] instanceof RegExp ? b[g].exec(e) : (0, b[g])(e);
+                        if (p) {
+                            f = p[0];
+                            e = e.substr(f.length).replace(/^\s*/, "");
+                            f = {
+                                type: g,
+                                text: f,
+                                remainder: e
+                            };
+                            break a
+                        }
+                    }
+                    d = "ERROR: In parsing: [" + e + "], expected one of: ";
+                    for (h = 0; h < i; h++) g = f[h], d += "\n    " + g + ": " + b[g];
+                    throw Error(d);
+                }
+                e = f.remainder;g = c[f.type];
+                if ("END" != f.type && !g) throw Error("No follows list for " + f.type);d.push(f)
+            } while ("END" != f.type);
+            d = a(d);
+            this.keepData && (this.data = d);
+            return d
+        },
+        write: function(a) {
+            if (a instanceof OpenLayers.Geometry) return a.toString();
+            switch (a.CLASS_NAME) {
+                case "OpenLayers.Filter.Spatial":
+                    switch (a.type) {
+                        case OpenLayers.Filter.Spatial.BBOX:
+                            return "BBOX(" + a.property + "," + a.value.toBBOX() + ")";
+                        case OpenLayers.Filter.Spatial.DWITHIN:
+                            return "DWITHIN(" +
+                                a.property + ", " + this.write(a.value) + ", " + a.distance + ")";
+                        case OpenLayers.Filter.Spatial.WITHIN:
+                            return "WITHIN(" + a.property + ", " + this.write(a.value) + ")";
+                        case OpenLayers.Filter.Spatial.INTERSECTS:
+                            return "INTERSECTS(" + a.property + ", " + this.write(a.value) + ")";
+                        case OpenLayers.Filter.Spatial.CONTAINS:
+                            return "CONTAINS(" + a.property + ", " + this.write(a.value) + ")";
+                        default:
+                            throw Error("Unknown spatial filter type: " + a.type);
+                    }
+                case "OpenLayers.Filter.Logical":
+                    if (a.type == OpenLayers.Filter.Logical.NOT) return "NOT (" + this.write(a.filters[0]) +
+                        ")";
+                    for (var b = "(", c = !0, d = 0; d < a.filters.length; d++) c ? c = !1 : b += ") " + g[a.type] + " (", b += this.write(a.filters[d]);
+                    return b + ")";
+                case "OpenLayers.Filter.Comparison":
+                    return a.type == OpenLayers.Filter.Comparison.BETWEEN ? a.property + " BETWEEN " + this.write(a.lowerBoundary) + " AND " + this.write(a.upperBoundary) : a.property + " " + e[a.type] + " " + this.write(a.value);
+                case void 0:
+                    if ("string" === typeof a) return "'" + a + "'";
+                    if ("number" === typeof a) return "" + a;
+                default:
+                    throw Error("Can't encode: " + a.CLASS_NAME + " " + a);
+            }
+        },
+        CLASS_NAME: "OpenLayers.Format.CQL"
+    })
+}();
+OpenLayers.Control.Split = OpenLayers.Class(OpenLayers.Control, {
+    layer: null,
+    source: null,
+    sourceOptions: null,
+    tolerance: null,
+    edge: !0,
+    deferDelete: !1,
+    mutual: !0,
+    targetFilter: null,
+    sourceFilter: null,
+    handler: null,
+    initialize: function(a) {
+        OpenLayers.Control.prototype.initialize.apply(this, [a]);
+        this.options = a || {};
+        this.options.source && this.setSource(this.options.source)
+    },
+    setSource: function(a) {
+        this.active ? (this.deactivate(), this.handler && (this.handler.destroy(), delete this.handler), this.source = a, this.activate()) : this.source =
+            a
+    },
+    activate: function() {
+        var a = OpenLayers.Control.prototype.activate.call(this);
+        if (a)
+            if (this.source) {
+                if (this.source.events) this.source.events.on({
+                    sketchcomplete: this.onSketchComplete,
+                    afterfeaturemodified: this.afterFeatureModified,
+                    scope: this
+                })
+            } else this.handler || (this.handler = new OpenLayers.Handler.Path(this, {
+                done: function(a) {
+                    this.onSketchComplete({
+                        feature: new OpenLayers.Feature.Vector(a)
+                    })
+                }
+            }, {
+                layerOptions: this.sourceOptions
+            })), this.handler.activate();
+        return a
+    },
+    deactivate: function() {
+        var a = OpenLayers.Control.prototype.deactivate.call(this);
+        a && this.source && this.source.events && this.layer.events.un({
+            sketchcomplete: this.onSketchComplete,
+            afterfeaturemodified: this.afterFeatureModified,
+            scope: this
+        });
+        return a
+    },
+    onSketchComplete: function(a) {
+        this.feature = null;
+        return !this.considerSplit(a.feature)
+    },
+    afterFeatureModified: function(a) {
+        a.modified && "function" === typeof a.feature.geometry.split && (this.feature = a.feature, this.considerSplit(a.feature))
+    },
+    removeByGeometry: function(a, b) {
+        for (var c = 0, d = a.length; c < d; ++c)
+            if (a[c].geometry === b) {
+                a.splice(c, 1);
+                break
+            }
+    },
+    isEligible: function(a) {
+        return a.geometry ? a.state !== OpenLayers.State.DELETE && "function" === typeof a.geometry.split && this.feature !== a && (!this.targetFilter || this.targetFilter.evaluate(a.attributes)) : !1
+    },
+    considerSplit: function(a) {
+        var b = !1,
+            c = !1;
+        if (!this.sourceFilter || this.sourceFilter.evaluate(a.attributes)) {
+            for (var d = this.layer && this.layer.features || [], e, f, g = [], h = [], i = this.layer === this.source && this.mutual, j = {
+                    edge: this.edge,
+                    tolerance: this.tolerance,
+                    mutual: i
+                }, k = [a.geometry], l, m, n, o = 0, p = d.length; o < p; ++o)
+                if (l =
+                    d[o], this.isEligible(l)) {
+                    m = [l.geometry];
+                    for (var q = 0; q < k.length; ++q) {
+                        n = k[q];
+                        for (var r = 0; r < m.length; ++r)
+                            if (e = m[r], n.getBounds().intersectsBounds(e.getBounds()) && (e = n.split(e, j)))
+                                if (f = this.events.triggerEvent("beforesplit", {
+                                        source: a,
+                                        target: l
+                                    }), !1 !== f && (i && (f = e[0], 1 < f.length && (f.unshift(q, 1), Array.prototype.splice.apply(k, f), q += f.length - 3), e = e[1]), 1 < e.length)) e.unshift(r, 1), Array.prototype.splice.apply(m, e), r += e.length - 3
+                    }
+                    m && 1 < m.length && (this.geomsToFeatures(l, m), this.events.triggerEvent("split", {
+                        original: l,
+                        features: m
+                    }), Array.prototype.push.apply(g, m), h.push(l), c = !0)
+                }
+            k && 1 < k.length && (this.geomsToFeatures(a, k), this.events.triggerEvent("split", {
+                original: a,
+                features: k
+            }), Array.prototype.push.apply(g, k), h.push(a), b = !0);
+            if (b || c) {
+                if (this.deferDelete) {
+                    d = [];
+                    o = 0;
+                    for (p = h.length; o < p; ++o) c = h[o], c.state === OpenLayers.State.INSERT ? d.push(c) : (c.state = OpenLayers.State.DELETE, this.layer.drawFeature(c));
+                    this.layer.destroyFeatures(d, {
+                        silent: !0
+                    });
+                    o = 0;
+                    for (p = g.length; o < p; ++o) g[o].state = OpenLayers.State.INSERT
+                } else this.layer.destroyFeatures(h, {
+                    silent: !0
+                });
+                this.layer.addFeatures(g, {
+                    silent: !0
+                });
+                this.events.triggerEvent("aftersplit", {
+                    source: a,
+                    features: g
+                })
+            }
+        }
+        return b
+    },
+    geomsToFeatures: function(a, b) {
+        var c = a.clone();
+        delete c.geometry;
+        for (var d, e = 0, f = b.length; e < f; ++e) d = c.clone(), d.geometry = b[e], d.state = OpenLayers.State.INSERT, b[e] = d
+    },
+    destroy: function() {
+        this.active && this.deactivate();
+        OpenLayers.Control.prototype.destroy.call(this)
+    },
+    CLASS_NAME: "OpenLayers.Control.Split"
+});
+OpenLayers.Layer.WMTS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    isBaseLayer: !0,
+    version: "1.0.0",
+    requestEncoding: "KVP",
+    url: null,
+    layer: null,
+    matrixSet: null,
+    style: null,
+    format: "image/jpeg",
+    tileOrigin: null,
+    tileFullExtent: null,
+    formatSuffix: null,
+    matrixIds: null,
+    dimensions: null,
+    params: null,
+    zoomOffset: 0,
+    serverResolutions: null,
+    formatSuffixMap: {
+        "image/png": "png",
+        "image/png8": "png",
+        "image/png24": "png",
+        "image/png32": "png",
+        png: "png",
+        "image/jpeg": "jpg",
+        "image/jpg": "jpg",
+        jpeg: "jpg",
+        jpg: "jpg"
+    },
+    matrix: null,
+    initialize: function(a) {
+        var b = {
+                url: !0,
+                layer: !0,
+                style: !0,
+                matrixSet: !0
+            },
+            c;
+        for (c in b)
+            if (!(c in a)) throw Error("Missing property '" + c + "' in layer configuration.");
+        a.params = OpenLayers.Util.upperCaseObject(a.params);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a.name, a.url, a.params, a]);
+        this.formatSuffix || (this.formatSuffix = this.formatSuffixMap[this.format] || this.format.split("/").pop());
+        if (this.matrixIds && (a = this.matrixIds.length) && "string" === typeof this.matrixIds[0]) {
+            b = this.matrixIds;
+            this.matrixIds = Array(a);
+            for (c = 0; c < a; ++c) this.matrixIds[c] = {
+                identifier: b[c]
+            }
+        }
+    },
+    setMap: function() {
+        OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments);
+        this.updateMatrixProperties()
+    },
+    updateMatrixProperties: function() {
+        if (this.matrix = this.getMatrix())
+            if (this.matrix.topLeftCorner && (this.tileOrigin = this.matrix.topLeftCorner), this.matrix.tileWidth && this.matrix.tileHeight && (this.tileSize = new OpenLayers.Size(this.matrix.tileWidth, this.matrix.tileHeight)), this.tileOrigin || (this.tileOrigin = new OpenLayers.LonLat(this.maxExtent.left, this.maxExtent.top)), !this.tileFullExtent) this.tileFullExtent =
+                this.maxExtent
+    },
+    moveTo: function(a, b, c) {
+        (b || !this.matrix) && this.updateMatrixProperties();
+        return OpenLayers.Layer.Grid.prototype.moveTo.apply(this, arguments)
+    },
+    clone: function(a) {
+        null == a && (a = new OpenLayers.Layer.WMTS(this.options));
+        return a = OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+    },
+    getIdentifier: function() {
+        return this.getServerZoom()
+    },
+    getMatrix: function() {
+        var a;
+        if (!this.matrixIds || 0 === this.matrixIds.length) a = {
+            identifier: this.getIdentifier()
+        };
+        else if ("scaleDenominator" in this.matrixIds[0])
+            for (var b =
+                    OpenLayers.METERS_PER_INCH * OpenLayers.INCHES_PER_UNIT[this.units] * this.getServerResolution() / 2.8E-4, c = Number.POSITIVE_INFINITY, d, e = 0, f = this.matrixIds.length; e < f; ++e) d = Math.abs(1 - this.matrixIds[e].scaleDenominator / b), d < c && (c = d, a = this.matrixIds[e]);
+        else a = this.matrixIds[this.getIdentifier()];
+        return a
+    },
+    getTileInfo: function(a) {
+        var b = this.getServerResolution(),
+            c = (a.lon - this.tileOrigin.lon) / (b * this.tileSize.w),
+            a = (this.tileOrigin.lat - a.lat) / (b * this.tileSize.h),
+            b = Math.floor(c),
+            d = Math.floor(a);
+        return {
+            col: b,
+            row: d,
+            i: Math.floor((c - b) * this.tileSize.w),
+            j: Math.floor((a - d) * this.tileSize.h)
+        }
+    },
+    getURL: function(a) {
+        var a = this.adjustBounds(a),
+            b = "";
+        if (!this.tileFullExtent || this.tileFullExtent.intersectsBounds(a)) {
+            var c = this.getTileInfo(a.getCenterLonLat()),
+                a = this.dimensions;
+            if ("REST" === this.requestEncoding.toUpperCase())
+                if (b = this.params, "string" === typeof this.url && -1 !== this.url.indexOf("{")) {
+                    var d = this.url.replace(/\{/g, "${"),
+                        c = {
+                            style: this.style,
+                            Style: this.style,
+                            TileMatrixSet: this.matrixSet,
+                            TileMatrix: this.matrix.identifier,
+                            TileRow: c.row,
+                            TileCol: c.col
+                        };
+                    if (a) {
+                        var e, f;
+                        for (f = a.length - 1; 0 <= f; --f) e = a[f], c[e] = b[e.toUpperCase()]
+                    }
+                    b = OpenLayers.String.format(d, c)
+                } else {
+                    d = this.version + "/" + this.layer + "/" + this.style + "/";
+                    if (a)
+                        for (f = 0; f < a.length; f++) b[a[f]] && (d = d + b[a[f]] + "/");
+                    d = d + this.matrixSet + "/" + this.matrix.identifier + "/" + c.row + "/" + c.col + "." + this.formatSuffix;
+                    b = OpenLayers.Util.isArray(this.url) ? this.selectUrl(d, this.url) : this.url;
+                    b.match(/\/$/) || (b += "/");
+                    b += d
+                } else "KVP" === this.requestEncoding.toUpperCase() && (b = {
+                SERVICE: "WMTS",
+                REQUEST: "GetTile",
+                VERSION: this.version,
+                LAYER: this.layer,
+                STYLE: this.style,
+                TILEMATRIXSET: this.matrixSet,
+                TILEMATRIX: this.matrix.identifier,
+                TILEROW: c.row,
+                TILECOL: c.col,
+                FORMAT: this.format
+            }, b = OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this, [b]))
+        }
+        return b
+    },
+    mergeNewParams: function(a) {
+        if ("KVP" === this.requestEncoding.toUpperCase()) return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this, [OpenLayers.Util.upperCaseObject(a)])
+    },
+    CLASS_NAME: "OpenLayers.Layer.WMTS"
+});
+OpenLayers.Protocol.SOS.v1_0_0 = OpenLayers.Class(OpenLayers.Protocol, {
+    fois: null,
+    formatOptions: null,
+    initialize: function(a) {
+        OpenLayers.Protocol.prototype.initialize.apply(this, [a]);
+        a.format || (this.format = new OpenLayers.Format.SOSGetFeatureOfInterest(this.formatOptions))
+    },
+    destroy: function() {
+        this.options && !this.options.format && this.format.destroy();
+        this.format = null;
+        OpenLayers.Protocol.prototype.destroy.apply(this)
+    },
+    read: function(a) {
+        a = OpenLayers.Util.extend({}, a);
+        OpenLayers.Util.applyDefaults(a, this.options || {});
+        var b = new OpenLayers.Protocol.Response({
+                requestType: "read"
+            }),
+            c = this.format,
+            c = OpenLayers.Format.XML.prototype.write.apply(c, [c.writeNode("sos:GetFeatureOfInterest", {
+                fois: this.fois
+            })]);
+        b.priv = OpenLayers.Request.POST({
+            url: a.url,
+            callback: this.createCallback(this.handleRead, b, a),
+            data: c
+        });
+        return b
+    },
+    handleRead: function(a, b) {
+        if (b.callback) {
+            var c = a.priv;
+            200 <= c.status && 300 > c.status ? (a.features = this.parseFeatures(c), a.code = OpenLayers.Protocol.Response.SUCCESS) : a.code = OpenLayers.Protocol.Response.FAILURE;
+            b.callback.call(b.scope, a)
+        }
+    },
+    parseFeatures: function(a) {
+        var b = a.responseXML;
+        if (!b || !b.documentElement) b = a.responseText;
+        return !b || 0 >= b.length ? null : this.format.read(b)
+    },
+    CLASS_NAME: "OpenLayers.Protocol.SOS.v1_0_0"
+});
+OpenLayers.Layer.KaMapCache = OpenLayers.Class(OpenLayers.Layer.KaMap, {
+    IMAGE_EXTENSIONS: {
+        jpeg: "jpg",
+        gif: "gif",
+        png: "png",
+        png8: "png",
+        png24: "png",
+        dithered: "png"
+    },
+    DEFAULT_FORMAT: "jpeg",
+    initialize: function(a, b, c, d) {
+        OpenLayers.Layer.KaMap.prototype.initialize.apply(this, arguments);
+        this.extension = this.IMAGE_EXTENSIONS[this.params.i.toLowerCase() || this.DEFAULT_FORMAT]
+    },
+    getURL: function(a) {
+        var a = this.adjustBounds(a),
+            b = this.map.getResolution(),
+            c = Math.round(1E4 * this.map.getScale()) / 1E4,
+            d = Math.round(a.left / b),
+            a = -Math.round(a.top / b),
+            b = Math.floor(d / this.tileSize.w / this.params.metaTileSize.w) * this.tileSize.w * this.params.metaTileSize.w,
+            e = Math.floor(a / this.tileSize.h / this.params.metaTileSize.h) * this.tileSize.h * this.params.metaTileSize.h,
+            c = ["/", this.params.map, "/", c, "/", this.params.g.replace(/\s/g, "_"), "/def/t", e, "/l", b, "/t", a, "l", d, ".", this.extension],
+            d = this.url;
+        OpenLayers.Util.isArray(d) && (d = this.selectUrl(c.join(""), d));
+        return d + c.join("")
+    },
+    CLASS_NAME: "OpenLayers.Layer.KaMapCache"
+});
+OpenLayers.Protocol.WFS.v1_1_0 = OpenLayers.Class(OpenLayers.Protocol.WFS.v1, {
+    version: "1.1.0",
+    initialize: function(a) {
+        OpenLayers.Protocol.WFS.v1.prototype.initialize.apply(this, arguments);
+        this.outputFormat && !this.readFormat && ("gml2" == this.outputFormat.toLowerCase() ? this.readFormat = new OpenLayers.Format.GML.v2({
+            featureType: this.featureType,
+            featureNS: this.featureNS,
+            geometryName: this.geometryName
+        }) : "json" == this.outputFormat.toLowerCase() && (this.readFormat = new OpenLayers.Format.GeoJSON))
+    },
+    CLASS_NAME: "OpenLayers.Protocol.WFS.v1_1_0"
+});
+OpenLayers.Format.WMSCapabilities.v1_1_1 = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1_1, {
+    version: "1.1.1",
+    readers: {
+        wms: OpenLayers.Util.applyDefaults({
+            SRS: function(a, b) {
+                b.srs[this.getChildValue(a)] = !0
+            }
+        }, OpenLayers.Format.WMSCapabilities.v1_1.prototype.readers.wms)
+    },
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_1_1"
+});
+OpenLayers.Format.WMSCapabilities.v1_1_1_WMSC = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1_1_1, {
+    version: "1.1.1",
+    profile: "WMSC",
+    readers: {
+        wms: OpenLayers.Util.applyDefaults({
+            VendorSpecificCapabilities: function(a, b) {
+                b.vendorSpecific = {
+                    tileSets: []
+                };
+                this.readChildNodes(a, b.vendorSpecific)
+            },
+            TileSet: function(a, b) {
+                var c = {
+                    srs: {},
+                    bbox: {},
+                    resolutions: []
+                };
+                this.readChildNodes(a, c);
+                b.tileSets.push(c)
+            },
+            Resolutions: function(a, b) {
+                for (var c = this.getChildValue(a).split(" "), d = 0, e = c.length; d < e; d++) "" != c[d] && b.resolutions.push(parseFloat(c[d]))
+            },
+            Width: function(a, b) {
+                b.width = parseInt(this.getChildValue(a))
+            },
+            Height: function(a, b) {
+                b.height = parseInt(this.getChildValue(a))
+            },
+            Layers: function(a, b) {
+                b.layers = this.getChildValue(a)
+            },
+            Styles: function(a, b) {
+                b.styles = this.getChildValue(a)
+            }
+        }, OpenLayers.Format.WMSCapabilities.v1_1_1.prototype.readers.wms)
+    },
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_1_1_WMSC"
+});
+OpenLayers.Format.WMSCapabilities.v1_1_0 = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1_1, {
+    version: "1.1.0",
+    readers: {
+        wms: OpenLayers.Util.applyDefaults({
+            SRS: function(a, b) {
+                for (var c = this.getChildValue(a).split(/ +/), d = 0, e = c.length; d < e; d++) b.srs[c[d]] = !0
+            }
+        }, OpenLayers.Format.WMSCapabilities.v1_1.prototype.readers.wms)
+    },
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_1_0"
+});
+OpenLayers.Control.LayerSwitcher = OpenLayers.Class(OpenLayers.Control, {
+    roundedCorner: !1,
+    roundedCornerColor: "darkblue",
+    layerStates: null,
+    layersDiv: null,
+    baseLayersDiv: null,
+    baseLayers: null,
+    dataLbl: null,
+    dataLayersDiv: null,
+    dataLayers: null,
+    minimizeDiv: null,
+    maximizeDiv: null,
+    ascending: !0,
+    initialize: function(a) {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+        this.layerStates = [];
+        this.roundedCorner && OpenLayers.Console.warn("roundedCorner option is deprecated")
+    },
+    destroy: function() {
+        this.clearLayersArray("base");
+        this.clearLayersArray("data");
+        this.map.events.un({
+            buttonclick: this.onButtonClick,
+            addlayer: this.redraw,
+            changelayer: this.redraw,
+            removelayer: this.redraw,
+            changebaselayer: this.redraw,
+            scope: this
+        });
+        this.events.unregister("buttonclick", this, this.onButtonClick);
+        OpenLayers.Control.prototype.destroy.apply(this, arguments)
+    },
+    setMap: function(a) {
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+        this.map.events.on({
+            addlayer: this.redraw,
+            changelayer: this.redraw,
+            removelayer: this.redraw,
+            changebaselayer: this.redraw,
+            scope: this
+        });
+        this.outsideViewport ? (this.events.attachToElement(this.div), this.events.register("buttonclick", this, this.onButtonClick)) : this.map.events.register("buttonclick", this, this.onButtonClick)
+    },
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this);
+        this.loadContents();
+        this.outsideViewport || this.minimizeControl();
+        this.redraw();
+        return this.div
+    },
+    onButtonClick: function(a) {
+        a = a.buttonElement;
+        a === this.minimizeDiv ? this.minimizeControl() : a === this.maximizeDiv ? this.maximizeControl() : a._layerSwitcher ===
+            this.id && (a["for"] && (a = document.getElementById(a["for"])), a.disabled || ("radio" == a.type ? (a.checked = !0, this.map.setBaseLayer(this.map.getLayer(a._layer))) : (a.checked = !a.checked, this.updateMap())))
+    },
+    clearLayersArray: function(a) {
+        this[a + "LayersDiv"].innerHTML = "";
+        this[a + "Layers"] = []
+    },
+    checkRedraw: function() {
+        var a = !1;
+        if (!this.layerStates.length || this.map.layers.length != this.layerStates.length) a = !0;
+        else
+            for (var b = 0, c = this.layerStates.length; b < c; b++) {
+                var d = this.layerStates[b],
+                    e = this.map.layers[b];
+                if (d.name !=
+                    e.name || d.inRange != e.inRange || d.id != e.id || d.visibility != e.visibility) {
+                    a = !0;
+                    break
+                }
+            }
+        return a
+    },
+    redraw: function() {
+        if (!this.checkRedraw()) return this.div;
+        this.clearLayersArray("base");
+        this.clearLayersArray("data");
+        var a = !1,
+            b = !1,
+            c = this.map.layers.length;
+        this.layerStates = Array(c);
+        for (var d = 0; d < c; d++) {
+            var e = this.map.layers[d];
+            this.layerStates[d] = {
+                name: e.name,
+                visibility: e.visibility,
+                inRange: e.inRange,
+                id: e.id
+            }
+        }
+        var f = this.map.layers.slice();
+        this.ascending || f.reverse();
+        d = 0;
+        for (c = f.length; d < c; d++) {
+            var e = f[d],
+                g = e.isBaseLayer;
+            if (e.displayInLayerSwitcher) {
+                g ? b = !0 : a = !0;
+                var h = g ? e == this.map.baseLayer : e.getVisibility(),
+                    i = document.createElement("input");
+                i.id = this.id + "_input_" + e.name;
+                i.name = g ? this.id + "_baseLayers" : e.name;
+                i.type = g ? "radio" : "checkbox";
+                i.value = e.name;
+                i.checked = h;
+                i.defaultChecked = h;
+                i.className = "olButton";
+                i._layer = e.id;
+                i._layerSwitcher = this.id;
+                !g && !e.inRange && (i.disabled = !0);
+                h = document.createElement("label");
+                h["for"] = i.id;
+                OpenLayers.Element.addClass(h, "labelSpan olButton");
+                h._layer = e.id;
+                h._layerSwitcher =
+                    this.id;
+                !g && !e.inRange && (h.style.color = "gray");
+                h.innerHTML = e.name;
+                h.style.verticalAlign = g ? "bottom" : "baseline";
+                var j = document.createElement("br");
+                (g ? this.baseLayers : this.dataLayers).push({
+                    layer: e,
+                    inputElem: i,
+                    labelSpan: h
+                });
+                e = g ? this.baseLayersDiv : this.dataLayersDiv;
+                e.appendChild(i);
+                e.appendChild(h);
+                e.appendChild(j)
+            }
+        }
+        this.dataLbl.style.display = a ? "" : "none";
+        this.baseLbl.style.display = b ? "" : "none";
+        return this.div
+    },
+    updateMap: function() {
+        for (var a = 0, b = this.baseLayers.length; a < b; a++) {
+            var c = this.baseLayers[a];
+            c.inputElem.checked && this.map.setBaseLayer(c.layer, !1)
+        }
+        a = 0;
+        for (b = this.dataLayers.length; a < b; a++) c = this.dataLayers[a], c.layer.setVisibility(c.inputElem.checked)
+    },
+    maximizeControl: function(a) {
+        this.div.style.width = "";
+        this.div.style.height = "";
+        this.showControls(!1);
+        null != a && OpenLayers.Event.stop(a)
+    },
+    minimizeControl: function(a) {
+        this.div.style.width = "0px";
+        this.div.style.height = "0px";
+        this.showControls(!0);
+        null != a && OpenLayers.Event.stop(a)
+    },
+    showControls: function(a) {
+        this.maximizeDiv.style.display = a ? "" : "none";
+        this.minimizeDiv.style.display = a ? "none" : "";
+        this.layersDiv.style.display = a ? "none" : ""
+    },
+    loadContents: function() {
+        this.layersDiv = document.createElement("div");
+        this.layersDiv.id = this.id + "_layersDiv";
+        OpenLayers.Element.addClass(this.layersDiv, "layersDiv");
+        this.baseLbl = document.createElement("div");
+        this.baseLbl.innerHTML = OpenLayers.i18n("Base Layer");
+        OpenLayers.Element.addClass(this.baseLbl, "baseLbl");
+        this.baseLayersDiv = document.createElement("div");
+        OpenLayers.Element.addClass(this.baseLayersDiv, "baseLayersDiv");
+        this.dataLbl = document.createElement("div");
+        this.dataLbl.innerHTML = OpenLayers.i18n("Overlays");
+        OpenLayers.Element.addClass(this.dataLbl, "dataLbl");
+        this.dataLayersDiv = document.createElement("div");
+        OpenLayers.Element.addClass(this.dataLayersDiv, "dataLayersDiv");
+        this.ascending ? (this.layersDiv.appendChild(this.baseLbl), this.layersDiv.appendChild(this.baseLayersDiv), this.layersDiv.appendChild(this.dataLbl), this.layersDiv.appendChild(this.dataLayersDiv)) : (this.layersDiv.appendChild(this.dataLbl), this.layersDiv.appendChild(this.dataLayersDiv),
+            this.layersDiv.appendChild(this.baseLbl), this.layersDiv.appendChild(this.baseLayersDiv));
+        this.div.appendChild(this.layersDiv);
+        this.roundedCorner && (OpenLayers.Rico.Corner.round(this.div, {
+            corners: "tl bl",
+            bgColor: "transparent",
+            color: this.roundedCornerColor,
+            blend: !1
+        }), OpenLayers.Rico.Corner.changeOpacity(this.layersDiv, 0.75));
+        var a = OpenLayers.Util.getImageLocation("layer-switcher-maximize.png");
+        this.maximizeDiv = OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MaximizeDiv", null, null, a, "absolute");
+        OpenLayers.Element.addClass(this.maximizeDiv, "maximizeDiv olButton");
+        this.maximizeDiv.style.display = "none";
+        this.div.appendChild(this.maximizeDiv);
+        a = OpenLayers.Util.getImageLocation("layer-switcher-minimize.png");
+        this.minimizeDiv = OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MinimizeDiv", null, null, a, "absolute");
+        OpenLayers.Element.addClass(this.minimizeDiv, "minimizeDiv olButton");
+        this.minimizeDiv.style.display = "none";
+        this.div.appendChild(this.minimizeDiv)
+    },
+    CLASS_NAME: "OpenLayers.Control.LayerSwitcher"
+});
+OpenLayers.Format.Atom = OpenLayers.Class(OpenLayers.Format.XML, {
+    namespaces: {
+        atom: "http://www.w3.org/2005/Atom",
+        georss: "http://www.georss.org/georss"
+    },
+    feedTitle: "untitled",
+    defaultEntryTitle: "untitled",
+    gmlParser: null,
+    xy: !1,
+    read: function(a) {
+        "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        return this.parseFeatures(a)
+    },
+    write: function(a) {
+        var b;
+        if (OpenLayers.Util.isArray(a)) {
+            b = this.createElementNSPlus("atom:feed");
+            b.appendChild(this.createElementNSPlus("atom:title", {
+                value: this.feedTitle
+            }));
+            for (var c = 0, d = a.length; c < d; c++) b.appendChild(this.buildEntryNode(a[c]))
+        } else b = this.buildEntryNode(a);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [b])
+    },
+    buildContentNode: function(a) {
+        var b = this.createElementNSPlus("atom:content", {
+            attributes: {
+                type: a.type || null
+            }
+        });
+        if (a.src) b.setAttribute("src", a.src);
+        else if ("text" == a.type || null == a.type) b.appendChild(this.createTextNode(a.value));
+        else if ("html" == a.type) {
+            if ("string" != typeof a.value) throw "HTML content must be in form of an escaped string";
+            b.appendChild(this.createTextNode(a.value))
+        } else "xhtml" ==
+            a.type ? b.appendChild(a.value) : "xhtml" == a.type || a.type.match(/(\+|\/)xml$/) ? b.appendChild(a.value) : b.appendChild(this.createTextNode(a.value));
+        return b
+    },
+    buildEntryNode: function(a) {
+        var b = a.attributes,
+            c = b.atom || {},
+            d = this.createElementNSPlus("atom:entry");
+        if (c.authors)
+            for (var e = OpenLayers.Util.isArray(c.authors) ? c.authors : [c.authors], f = 0, g = e.length; f < g; f++) d.appendChild(this.buildPersonConstructNode("author", e[f]));
+        if (c.categories)
+            for (var e = OpenLayers.Util.isArray(c.categories) ? c.categories : [c.categories],
+                    h, f = 0, g = e.length; f < g; f++) h = e[f], d.appendChild(this.createElementNSPlus("atom:category", {
+                attributes: {
+                    term: h.term,
+                    scheme: h.scheme || null,
+                    label: h.label || null
+                }
+            }));
+        c.content && d.appendChild(this.buildContentNode(c.content));
+        if (c.contributors) {
+            e = OpenLayers.Util.isArray(c.contributors) ? c.contributors : [c.contributors];
+            f = 0;
+            for (g = e.length; f < g; f++) d.appendChild(this.buildPersonConstructNode("contributor", e[f]))
+        }
+        a.fid && d.appendChild(this.createElementNSPlus("atom:id", {
+            value: a.fid
+        }));
+        if (c.links) {
+            e = OpenLayers.Util.isArray(c.links) ?
+                c.links : [c.links];
+            f = 0;
+            for (g = e.length; f < g; f++) h = e[f], d.appendChild(this.createElementNSPlus("atom:link", {
+                attributes: {
+                    href: h.href,
+                    rel: h.rel || null,
+                    type: h.type || null,
+                    hreflang: h.hreflang || null,
+                    title: h.title || null,
+                    length: h.length || null
+                }
+            }))
+        }
+        c.published && d.appendChild(this.createElementNSPlus("atom:published", {
+            value: c.published
+        }));
+        c.rights && d.appendChild(this.createElementNSPlus("atom:rights", {
+            value: c.rights
+        }));
+        if (c.summary || b.description) d.appendChild(this.createElementNSPlus("atom:summary", {
+            value: c.summary ||
+                b.description
+        }));
+        d.appendChild(this.createElementNSPlus("atom:title", {
+            value: c.title || b.title || this.defaultEntryTitle
+        }));
+        c.updated && d.appendChild(this.createElementNSPlus("atom:updated", {
+            value: c.updated
+        }));
+        a.geometry && (b = this.createElementNSPlus("georss:where"), b.appendChild(this.buildGeometryNode(a.geometry)), d.appendChild(b));
+        return d
+    },
+    initGmlParser: function() {
+        this.gmlParser = new OpenLayers.Format.GML.v3({
+            xy: this.xy,
+            featureNS: "http://example.com#feature",
+            internalProjection: this.internalProjection,
+            externalProjection: this.externalProjection
+        })
+    },
+    buildGeometryNode: function(a) {
+        this.gmlParser || this.initGmlParser();
+        return this.gmlParser.writeNode("feature:_geometry", a).firstChild
+    },
+    buildPersonConstructNode: function(a, b) {
+        var c = ["uri", "email"],
+            d = this.createElementNSPlus("atom:" + a);
+        d.appendChild(this.createElementNSPlus("atom:name", {
+            value: b.name
+        }));
+        for (var e = 0, f = c.length; e < f; e++) b[c[e]] && d.appendChild(this.createElementNSPlus("atom:" + c[e], {
+            value: b[c[e]]
+        }));
+        return d
+    },
+    getFirstChildValue: function(a, b, c,
+        d) {
+        return (a = this.getElementsByTagNameNS(a, b, c)) && 0 < a.length ? this.getChildValue(a[0], d) : d
+    },
+    parseFeature: function(a) {
+        var b = {},
+            c = null,
+            d = null,
+            e = null,
+            f = this.namespaces.atom;
+        this.parsePersonConstructs(a, "author", b);
+        d = this.getElementsByTagNameNS(a, f, "category");
+        0 < d.length && (b.categories = []);
+        for (var g = 0, h = d.length; g < h; g++) {
+            c = {};
+            c.term = d[g].getAttribute("term");
+            if (e = d[g].getAttribute("scheme")) c.scheme = e;
+            if (e = d[g].getAttribute("label")) c.label = e;
+            b.categories.push(c)
+        }
+        d = this.getElementsByTagNameNS(a, f, "content");
+        if (0 < d.length) {
+            c = {};
+            if (e = d[0].getAttribute("type")) c.type = e;
+            (e = d[0].getAttribute("src")) ? c.src = e: (c.value = "text" == c.type || "html" == c.type || null == c.type ? this.getFirstChildValue(a, f, "content", null) : "xhtml" == c.type || c.type.match(/(\+|\/)xml$/) ? this.getChildEl(d[0]) : this.getFirstChildValue(a, f, "content", null), b.content = c)
+        }
+        this.parsePersonConstructs(a, "contributor", b);
+        b.id = this.getFirstChildValue(a, f, "id", null);
+        d = this.getElementsByTagNameNS(a, f, "link");
+        0 < d.length && (b.links = Array(d.length));
+        for (var i = ["rel",
+                "type", "hreflang", "title", "length"
+            ], g = 0, h = d.length; g < h; g++) {
+            c = {};
+            c.href = d[g].getAttribute("href");
+            for (var j = 0, k = i.length; j < k; j++)(e = d[g].getAttribute(i[j])) && (c[i[j]] = e);
+            b.links[g] = c
+        }
+        if (c = this.getFirstChildValue(a, f, "published", null)) b.published = c;
+        if (c = this.getFirstChildValue(a, f, "rights", null)) b.rights = c;
+        if (c = this.getFirstChildValue(a, f, "summary", null)) b.summary = c;
+        b.title = this.getFirstChildValue(a, f, "title", null);
+        b.updated = this.getFirstChildValue(a, f, "updated", null);
+        c = {
+            title: b.title,
+            description: b.summary,
+            atom: b
+        };
+        a = this.parseLocations(a)[0];
+        a = new OpenLayers.Feature.Vector(a, c);
+        a.fid = b.id;
+        return a
+    },
+    parseFeatures: function(a) {
+        var b = [],
+            c = this.getElementsByTagNameNS(a, this.namespaces.atom, "entry");
+        0 == c.length && (c = [a]);
+        for (var a = 0, d = c.length; a < d; a++) b.push(this.parseFeature(c[a]));
+        return b
+    },
+    parseLocations: function(a) {
+        var b = this.namespaces.georss,
+            c = {
+                components: []
+            },
+            d = this.getElementsByTagNameNS(a, b, "where");
+        if (d && 0 < d.length) {
+            this.gmlParser || this.initGmlParser();
+            for (var e = 0, f = d.length; e < f; e++) this.gmlParser.readChildNodes(d[e],
+                c)
+        }
+        c = c.components;
+        if ((d = this.getElementsByTagNameNS(a, b, "point")) && 0 < d.length) {
+            e = 0;
+            for (f = d.length; e < f; e++) {
+                var g = OpenLayers.String.trim(d[e].firstChild.nodeValue).split(/\s+/);
+                2 != g.length && (g = OpenLayers.String.trim(d[e].firstChild.nodeValue).split(/\s*,\s*/));
+                c.push(new OpenLayers.Geometry.Point(g[1], g[0]))
+            }
+        }
+        var h = this.getElementsByTagNameNS(a, b, "line");
+        if (h && 0 < h.length)
+            for (var i, e = 0, f = h.length; e < f; e++) {
+                d = OpenLayers.String.trim(h[e].firstChild.nodeValue).split(/\s+/);
+                i = [];
+                for (var j = 0, k = d.length; j <
+                    k; j += 2) g = new OpenLayers.Geometry.Point(d[j + 1], d[j]), i.push(g);
+                c.push(new OpenLayers.Geometry.LineString(i))
+            }
+        if ((a = this.getElementsByTagNameNS(a, b, "polygon")) && 0 < a.length) {
+            e = 0;
+            for (f = a.length; e < f; e++) {
+                d = OpenLayers.String.trim(a[e].firstChild.nodeValue).split(/\s+/);
+                i = [];
+                j = 0;
+                for (k = d.length; j < k; j += 2) g = new OpenLayers.Geometry.Point(d[j + 1], d[j]), i.push(g);
+                c.push(new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(c)]))
+            }
+        }
+        if (this.internalProjection && this.externalProjection) {
+            e = 0;
+            for (f = c.length; e <
+                f; e++) c[e] && c[e].transform(this.externalProjection, this.internalProjection)
+        }
+        return c
+    },
+    parsePersonConstructs: function(a, b, c) {
+        for (var d = [], e = this.namespaces.atom, a = this.getElementsByTagNameNS(a, e, b), f = ["uri", "email"], g = 0, h = a.length; g < h; g++) {
+            var i = {};
+            i.name = this.getFirstChildValue(a[g], e, "name", null);
+            for (var j = 0, k = f.length; j < k; j++) {
+                var l = this.getFirstChildValue(a[g], e, f[j], null);
+                l && (i[f[j]] = l)
+            }
+            d.push(i)
+        }
+        0 < d.length && (c[b + "s"] = d)
+    },
+    CLASS_NAME: "OpenLayers.Format.Atom"
+});
+OpenLayers.Control.KeyboardDefaults = OpenLayers.Class(OpenLayers.Control, {
+    autoActivate: !0,
+    slideFactor: 75,
+    observeElement: null,
+    draw: function() {
+        this.handler = new OpenLayers.Handler.Keyboard(this, {
+            keydown: this.defaultKeyPress
+        }, {
+            observeElement: this.observeElement || document
+        })
+    },
+    defaultKeyPress: function(a) {
+        var b, c = !0;
+        switch (a.keyCode) {
+            case OpenLayers.Event.KEY_LEFT:
+                this.map.pan(-this.slideFactor, 0);
+                break;
+            case OpenLayers.Event.KEY_RIGHT:
+                this.map.pan(this.slideFactor, 0);
+                break;
+            case OpenLayers.Event.KEY_UP:
+                this.map.pan(0, -this.slideFactor);
+                break;
+            case OpenLayers.Event.KEY_DOWN:
+                this.map.pan(0, this.slideFactor);
+                break;
+            case 33:
+                b = this.map.getSize();
+                this.map.pan(0, -0.75 * b.h);
+                break;
+            case 34:
+                b = this.map.getSize();
+                this.map.pan(0, 0.75 * b.h);
+                break;
+            case 35:
+                b = this.map.getSize();
+                this.map.pan(0.75 * b.w, 0);
+                break;
+            case 36:
+                b = this.map.getSize();
+                this.map.pan(-0.75 * b.w, 0);
+                break;
+            case 43:
+            case 61:
+            case 187:
+            case 107:
+                this.map.zoomIn();
+                break;
+            case 45:
+            case 109:
+            case 189:
+            case 95:
+                this.map.zoomOut();
+                break;
+            default:
+                c = !1
+        }
+        c && OpenLayers.Event.stop(a)
+    },
+    CLASS_NAME: "OpenLayers.Control.KeyboardDefaults"
+});
+OpenLayers.Format.WMTSCapabilities.v1_0_0 = OpenLayers.Class(OpenLayers.Format.OWSCommon.v1_1_0, {
+    version: "1.0.0",
+    namespaces: {
+        ows: "http://www.opengis.net/ows/1.1",
+        wmts: "http://www.opengis.net/wmts/1.0",
+        xlink: "http://www.w3.org/1999/xlink"
+    },
+    yx: null,
+    defaultPrefix: "wmts",
+    initialize: function(a) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [a]);
+        this.options = a;
+        a = OpenLayers.Util.extend({}, OpenLayers.Format.WMTSCapabilities.prototype.yx);
+        this.yx = OpenLayers.Util.extend(a, this.yx)
+    },
+    read: function(a) {
+        "string" ==
+        typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]));
+        a && 9 == a.nodeType && (a = a.documentElement);
+        var b = {};
+        this.readNode(a, b);
+        b.version = this.version;
+        return b
+    },
+    readers: {
+        wmts: {
+            Capabilities: function(a, b) {
+                this.readChildNodes(a, b)
+            },
+            Contents: function(a, b) {
+                b.contents = {};
+                b.contents.layers = [];
+                b.contents.tileMatrixSets = {};
+                this.readChildNodes(a, b.contents)
+            },
+            Layer: function(a, b) {
+                var c = {
+                    styles: [],
+                    formats: [],
+                    dimensions: [],
+                    tileMatrixSetLinks: [],
+                    layers: []
+                };
+                this.readChildNodes(a, c);
+                b.layers.push(c)
+            },
+            Style: function(a,
+                b) {
+                var c = {};
+                c.isDefault = "true" === a.getAttribute("isDefault");
+                this.readChildNodes(a, c);
+                b.styles.push(c)
+            },
+            Format: function(a, b) {
+                b.formats.push(this.getChildValue(a))
+            },
+            TileMatrixSetLink: function(a, b) {
+                var c = {};
+                this.readChildNodes(a, c);
+                b.tileMatrixSetLinks.push(c)
+            },
+            TileMatrixSet: function(a, b) {
+                if (b.layers) {
+                    var c = {
+                        matrixIds: []
+                    };
+                    this.readChildNodes(a, c);
+                    b.tileMatrixSets[c.identifier] = c
+                } else b.tileMatrixSet = this.getChildValue(a)
+            },
+            TileMatrix: function(a, b) {
+                var c = {
+                    supportedCRS: b.supportedCRS
+                };
+                this.readChildNodes(a,
+                    c);
+                b.matrixIds.push(c)
+            },
+            ScaleDenominator: function(a, b) {
+                b.scaleDenominator = parseFloat(this.getChildValue(a))
+            },
+            TopLeftCorner: function(a, b) {
+                var c = this.getChildValue(a).split(" "),
+                    d;
+                b.supportedCRS && (d = !!this.yx[b.supportedCRS.replace(/urn:ogc:def:crs:(\w+):.+:(\w+)$/, "urn:ogc:def:crs:$1::$2")]);
+                b.topLeftCorner = d ? new OpenLayers.LonLat(c[1], c[0]) : new OpenLayers.LonLat(c[0], c[1])
+            },
+            TileWidth: function(a, b) {
+                b.tileWidth = parseInt(this.getChildValue(a))
+            },
+            TileHeight: function(a, b) {
+                b.tileHeight = parseInt(this.getChildValue(a))
+            },
+            MatrixWidth: function(a, b) {
+                b.matrixWidth = parseInt(this.getChildValue(a))
+            },
+            MatrixHeight: function(a, b) {
+                b.matrixHeight = parseInt(this.getChildValue(a))
+            },
+            ResourceURL: function(a, b) {
+                b.resourceUrl = b.resourceUrl || {};
+                b.resourceUrl[a.getAttribute("resourceType")] = {
+                    format: a.getAttribute("format"),
+                    template: a.getAttribute("template")
+                }
+            },
+            WSDL: function(a, b) {
+                b.wsdl = {};
+                b.wsdl.href = a.getAttribute("xlink:href")
+            },
+            ServiceMetadataURL: function(a, b) {
+                b.serviceMetadataUrl = {};
+                b.serviceMetadataUrl.href = a.getAttribute("xlink:href")
+            },
+            LegendURL: function(a, b) {
+                b.legend = {};
+                b.legend.href = a.getAttribute("xlink:href");
+                b.legend.format = a.getAttribute("format")
+            },
+            Dimension: function(a, b) {
+                var c = {
+                    values: []
+                };
+                this.readChildNodes(a, c);
+                b.dimensions.push(c)
+            },
+            Default: function(a, b) {
+                b["default"] = this.getChildValue(a)
+            },
+            Value: function(a, b) {
+                b.values.push(this.getChildValue(a))
+            }
+        },
+        ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers.ows
+    },
+    CLASS_NAME: "OpenLayers.Format.WMTSCapabilities.v1_0_0"
+});
\ No newline at end of file
diff --git a/PanoramicView/img/.DS_Store b/PanoramicView/img/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..5222d092f845a15e0c520d22acf56bcef52cdcd4
GIT binary patch
literal 6148
zcmZQzU|@7AO)+F(5MW?n;9!8zEL;p&0Z1N%F(jFwB0M1Tz-H(&<T7M3<S}G2=t1R1
zsnHM^4S~TM0-(Ih%aF>D$WY8s!hoEA3mEbk(miwXlaq4tlb}U}8v_G_#(yvXdr6uh
zhar)nk|C9$h(VX3n4z2@lc9tmnIQuzlFN|DP{EK1E)}X6QW^9Zu$aoE&cML16I6!$
z|4*c;kTM2T*5EXiaR~zhqXGj10~2MY7L+9Ulopp1F)%PlF@!P{gMC)apwE!TP{EMI
zkjaqGV8&p^V8CF&pwHmKkk3%gkjIe2kk63Fkiq~`$G|{1l(71zpd`r;YBQN8FfcIi
zG2}7iGZZnDFk}#n-7{#h%f(R4ki(G4kOKBI*0^H~Les;?P|T3eP)dw_j5pBq@-mb&
zq!OJDXMmF-B*h3bR59c;<TK>L{aDIS3}=ICBP{8T0pwp~Q-qLADPYK9Ai@l=|B=n$
zhMSSZkjPMkJ;j54j;sru?CDN0LTu#VhR~zrXb6mkz-S1-LjY7hfND?>?EtEu85kHE
zAT&sbfsug$+y!7{U|@l1Vg&aC7(j9$tsokt6-0xyGBAQzU^Bp485p5j8NuBUkUmhC
z1Vn?iGcYoMwKFh+ZDwF#1l!EOzzEUKzzDUO5!ypxglLCU{UCcF+F{NcrAI?xGz6d_
zzzm@UK=r>X0|T!9KSb3iIT`|^AuudMfRV)|*u@D{S>o^>sICQ7#|cn*P#p}a%^5-U
rG(;ar30Rg1GN32{=0M~?T0zx5xGH9Zv>`?t0<ZuYrAI?x073u&A^F?o

literal 0
HcmV?d00001

diff --git a/PanoramicView/img/east-mini.png b/PanoramicView/img/east-mini.png
new file mode 100644
index 0000000000000000000000000000000000000000..ecedc5ef9f2ea756eaebb78e187b543c221760b2
GIT binary patch
literal 342
zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4mJh`hOl#e;S3B6EX7WqAsieW95oy%9SjT%
zk|nMYCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+?-kFud?|aSX9Iot%*H;-5cD
z9oG@*#vN=Oy8r+GKi|+N*<r#Vd!9L|E=z*tkblDsspXEDnb!Z=+19BaHK<#|R$4OW
z2S3yA@AiMzuixLGk^jh)gXQ19zu)V>z3Kjc^yqRSqccM59SuHweBA$ERrUA(%^SZy
zGFs85(VXz$+S>B}d-q;XGR{!;WIK4^+uQH|R<Atk=$)=2_2v2b`~NR5pZ{N9$7W_t
zvxDKv<>vEi*4tKmcv$ao!mVawoBf9UH9vpuU-s-nJzt;Qr$zto@2~$qU1#U7_^2wY
wpPWWUMW5@ryH%&83$99yiV|05;WlG9Ek3i@Z2Bp41_lNOPgg&ebxsLQ04jWzE&u=k

literal 0
HcmV?d00001

diff --git a/PanoramicView/img/layer-switcher-maximize.png b/PanoramicView/img/layer-switcher-maximize.png
new file mode 100644
index 0000000000000000000000000000000000000000..f346086b38eb98effa931eb7c50ab5a221cf06c0
GIT binary patch
literal 405
zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4mJh`hOl#e;S3B6Ea{HEjtmSN`?>!lvNA9*
zFct^7J29*~C-ahlfk7eJBgmJ5p-PQ`p`nF=;THn~L&FOOhEf9thF1v;3|2E37{m+a
z><YADU|^6eag8Vm&QB{TPb^AhC@(M9%goCzPEIUH)ypqRpZ(58ih+UQou`Xqh{fsT
zAOHW`Gh3x4yx7L_NJ`-z#}WU=ANGztX$<xP=as#b^_m-GvK8u_rYRaUFVH)f$svFL
z$p56I;7%is<>eNZzyH_&{Pg+%`}_6(*;#WBBul6y6lw_w%=q&Ec>n$X`)hxHwO39S
zk893ak$S<c#4+`0<o~yCr#Elh{yl1k<KDf?A3l2a%-ewHkcT?Ri2n}{^BeFUns4uX
zh~pT0;)I7Q+7b;pQaCm_E;#V-Gy7!)?rzl|dzURT`n|vTFqgr%kB${<*S|N3k+~|M
z#co!*XnsJ`lSfV}CmuZDosuqC_;F>)nJpo@ZW_8b7?khl&96Cl+?RoYfx*+&&t;uc
GLK6VlAftT%

literal 0
HcmV?d00001

diff --git a/PanoramicView/img/layer-switcher-minimize.png b/PanoramicView/img/layer-switcher-minimize.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4aab0bf784076f86893d0c28a8cae36ec6c113e
GIT binary patch
literal 220
zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4mJh`hOl#e;S3B6EX7WqAsieW95oy%9SjT%
zk|nMYCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+?-kFywi<IEGl9PX6=%zdf@l
zgR(A96~mEFDzEA}j&QwTYn13wkz%=S%*6YM`H`N&GpEZxWIIkb{$Sq7X36l;OySv)
zqyPnh_bNvh@H(97PrKl*z^8sx!BoMH|42>-+h4Y%V1<2FQh%pNx@`5awm7BCu!c4E
V?p7lM4+aJX22WQ%mvv4FO#np_M<oCN

literal 0
HcmV?d00001

diff --git a/PanoramicView/img/north-mini.png b/PanoramicView/img/north-mini.png
new file mode 100644
index 0000000000000000000000000000000000000000..dfd7211ffc7bf3ec82c490c7e9f522a872eb5c2b
GIT binary patch
literal 378
zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4mJh`hOl#e;S3B6EX7WqAsieW95oy%9SjT%
zk|nMYCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+?-kF!Ff1IEGl9PX6)#zdf^6
zTEdHMERUoV?r|LPUs$0Waz<#ioC))f#tJ!s|LP5nSwA*Pu}s;(_DJ1Dg6Xir)@vGU
zj<HQw1x&YE{%>tne{9?%e^X)3y_@^~-uwUZ^7+SK)sFCZ97qa%@^<exdyYRpKY!mp
z?_Nz!TcnXgGL!S9-nHNVuZ@2H@9=?tfB8R3h8$+-4dXdEY0}^S7acuLxW%yLrZg-Q
z6yYrVxbnY!-Jiz93(f5E|B4H~BpScaWHysdJHPLTy!eWhmOY0<Gnjt;;{Nyl?{EI)
zj`92c{L$C7ox8ztfrBc`G@YGY_ZJ*E@b!Nu<Ntquf9EG|WZCYRnQ8sMykw37m%Cfu
ivG=B*K5j7OU|3`^vsh^Ip4|)#3=E#GelF{r5}E+67^T_(

literal 0
HcmV?d00001

diff --git a/PanoramicView/img/slider.png b/PanoramicView/img/slider.png
new file mode 100644
index 0000000000000000000000000000000000000000..433536422ead435c8e9e5b9dd1f209c7087994c3
GIT binary patch
literal 247
zcmeAS@N?(olHy`uVBq!ia0y~yU=U$oVBq9nV_;w~I>_U}z`(##?Bp53!NI{%!;#X#
zz`!6`;u=vBoS#-wo>-L1P+nfHmzkGcoSayYs+V7sKKq@G6axc8r>Bc!h{pNkl!Od}
zgoK0@OiB3)&yp1QYnUIcb+~hk!=ylTg5W6!*$q-D55l=(+8zc?X#AgOqo~N&b|oa4
z&252(@&ty93Jv{x3m&qzvGdy<@^vvR`1vWJt%E~$(wveH51855+goq&PMPo^?Zjzg
z_S=8{|F2hQ>v){3AJOpAX;r)8)#RD0UJ5Y8J+oA8Ru#}>U|?YIboFyt=akR{0EO>W
A_y7O^

literal 0
HcmV?d00001

diff --git a/PanoramicView/img/south-mini.png b/PanoramicView/img/south-mini.png
new file mode 100644
index 0000000000000000000000000000000000000000..2970875c4c2588c1345cc2c782cc40e7dfb667e3
GIT binary patch
literal 373
zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4mJh`hOl#e;S3B6EX7WqAsieW95oy%9SjT%
zk|nMYCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+?-kFtU5PIEGl9PEJU8@y}n@
z#)!wu`}WWMiyyNDS{M}>=QT4iU;nSp_UHHa_xoFq3jK+@z5l<WWAikfon96_U%ra}
z`TzU7yr1*Fnx8-8qpGY58*Qt<xz1s`dPU}#<PHCetVfS7|M&mLNA@;Fez}?-=MP?N
zKf7SLLbF-Y=7mdA?Asg_6{QPZ|GQ0aG`*p6^G4PG`@6pK<#A{TeOR(sYJ%gm9U>Lg
z>sh5gJwJc{e^u4zkCG`T8A8~Na^&<}Z*RZ<+rIW!Wlh@|=Gly<9r7LX6M|PPGkd;&
z!-tfZwuUbs4)ZoirS+aRuxX1p{PnPehu&=W7RApAdIz%vCN)mGaN`b#Z@T}&oCz~j
b&1@N_+?ZLc^>PO&U>Q7J{an^LB{Ts5K4hT1

literal 0
HcmV?d00001

diff --git a/PanoramicView/img/west-mini.png b/PanoramicView/img/west-mini.png
new file mode 100644
index 0000000000000000000000000000000000000000..363cd3d7b2e9aaa24625d57fb59293a063a55158
GIT binary patch
literal 360
zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4mJh`hOl#e;S3B6EX7WqAsieW95oy%9SjT%
zk|nMYCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+?-kF#Pg#aSX9Io&4kfe|u)D
zw1gMiSRP3!+~YXn-}uAcu_ukeUf{g4m$F`SgG{zUozpZ$gXRT#il-(VIPmrV<x6Fc
zOga{nfB7o@=l=fx59<Y9ys&6=<yA>2lv2>M`}+UQP4WN#|Nee&&-1`&1>0=KoSeP?
zy}iEu|NrCT@%oa6(+hfEG~K(G{r~>1ukY;j8cr)zSOo^p{#^h2TlIfV#wIpSZvTJw
zwZDG;umAT)^|S)d`j;=ywjUSJWV`yHYvY6oz5nHHemHD#tXMq1dGY&t-?I<@$M5@d
zBwt`7XHZntum7sv>;C=!{$4(=x#OIYn3(rJcelJ{h0B&^89HSiWMg=Ke`fI+8*Up0
P1_lOCS3j3^P6<r_Lo}k9

literal 0
HcmV?d00001

diff --git a/PanoramicView/img/zoom-minus-mini.png b/PanoramicView/img/zoom-minus-mini.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f0d77fff1cc3f68b512dce21bd789d7f59f2f62
GIT binary patch
literal 291
zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4mJh`hOl#e;S3B6EX7WqAsieW95oy%9SjT%
zk|nMYCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+?-kFl_a7aSX9Iot%*H;-9~)
zP1c12k}9gEZ}+zyi`gTwgl)ZJQ`6*s|9^b^{eQW?{l}yUQjCqBJ9vczXMXzs{r&#`
z_BB5m#hb4*Tv;UjMI`dTv9z228ydb=Y~1=asARn@tK^o6T#b7LQv!HJc~&t>rg*Y8
z>q!3l&)$C7hKpw=yBTwqfW3gd;$eXaa&<c#0}ik8G~rotO=_L|F^3{a!+Uesi#fxZ
tC-7`(Irhvg!>XDqwfTt7#+Qr?cP2Q_iwxN#&%nUI;OXk;vd$@?2>=yaZo~ip

literal 0
HcmV?d00001

diff --git a/PanoramicView/img/zoom-plus-mini.png b/PanoramicView/img/zoom-plus-mini.png
new file mode 100644
index 0000000000000000000000000000000000000000..a73ab4e951b38fde6f1f39124efb1fa01fdc01b2
GIT binary patch
literal 386
zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4mJh`hOl#e;S3B6EX7WqAsieW95oy%9SjT%
zk|nMYCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+?-kFp7A(IEGl9-aE;W@1TQ7
zTl#A5w_VHy?76#E*lO!N6v$J!I^o8I2+tcHC9k>G9h}t?u&VOe)ryr;xt$R;-QUm8
z);G>?V`S()9C7@?7E8T!<pS3<kMBoVw9?NsifnM7+V!L9WMujTn*(v5JyrZZb*g9u
zFJAOfTxi#`yM^*=wycbiJDB(UU|DrjQ05F3;~5p4na*3SxLrF^eJ8u*s?Gblmcze!
zNk@#@KaSR}M-9uqI=}jA*_pM~^6Abw!s59RCMTX(7g)?W__>DZ_1}M{hwr6FF3}KU
zfAE`8reFL~6>pr;8t&GE)q<CD^cGx=YAe~Ty=zwPdX0P&u}PMye<t#`{Z*g1&OhV8
p)KgEYFFH@tJE?H$T)&I?JJ!7U2e(=1GB7YOc)I$ztaD0e0suuGpSu76

literal 0
HcmV?d00001

diff --git a/PanoramicView/img/zoombar.png b/PanoramicView/img/zoombar.png
new file mode 100644
index 0000000000000000000000000000000000000000..47110ab3e5a5e3e9d01a9f6ad1ae4aa08d4e3a28
GIT binary patch
literal 350
zcmeAS@N?(olHy`uVBq!ia0y~yU=U(pVC3LnV_;wi`m#ihfq{Xg*vT`5gM)*kh9jke
zfq_A?#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDFz0H51uZLAr-gY-ZJEC
zHsEo4cwg}Ps#6;!BqVo;Oek2VQS$oQ(rv4>Z1_Itew)mCNagLMuA1|gRo;HKnVu-I
zPbh0`)HGHO4L+{hIYNv|f)LE4B&eVu#K@#1c#Qvxu*T9Uw%K>1q<t?bYFZ0R&Xfw+
zAFiS#xQy+}N70)qb7KS*gnmx(coxgj;j%-?;d}F@nLCAcuFK|WogsB0-m!hA=<~GW
z^OTpdi7@$Ie$sTUv^Kx2Fz;KlOT(|$ZBs72ypywzBjEgdr9}Bf9xNT&heR27DXRRt
w$OLgj;vWZ<LsuF+T2?Yn<mhC$t2a^Hxsfa9!JYCW3=9kmp00i_>zopr0Db&_X8-^I

literal 0
HcmV?d00001

diff --git a/PanoramicView/logo.jpg b/PanoramicView/logo.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1c69280004d285a2cffba12f58d40aa4c7ebcf97
GIT binary patch
literal 19870
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
M9atoa^Z&mI0JC?FHUIzs

literal 0
HcmV?d00001

diff --git a/PanoramicView/logo.png b/PanoramicView/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..a18c9f489a994bf29eeaefc6bb2719116fcd6bfe
GIT binary patch
literal 91699
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

literal 0
HcmV?d00001

diff --git a/PanoramicView/openlayers.html b/PanoramicView/openlayers.html
new file mode 100644
index 00000000..e73c533e
--- /dev/null
+++ b/PanoramicView/openlayers.html
@@ -0,0 +1,441 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+        <html xmlns="http://www.w3.org/1999/xhtml"
+          <head>
+            <meta http-equiv='imagetoolbar' content='no'/>
+            <style type="text/css"> v\:* {behavior:url(#default#VML);}
+                html, body { overflow: hidden; padding: 0; height: 100%; width: 100%; font-family: 'Lucida Grande',Geneva,Arial,Verdana,sans-serif; }
+                body { margin: 10px; background: #fff; }
+                h1 { margin: 0; padding: 6px; border:0; font-size: 20pt; }
+            #header { height: 50px; padding: 0;/* background-color: #eee;*/ border: 1px solid #888; }
+            #subheader { height: 12px; text-align: right; font-size: 10px; color: #555;}
+            #map { height: 95%; border: 1px solid #888; }
+            .olImageLoadError { display: none; }
+            .olControlLayerSwitcher .layersDiv { border-radius: 10px 0 0 10px; } 
+        </style>
+            <script src="OpenLayers.js"></script>
+            <script>
+            
+            
+              OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {                
+                defaultHandlerOptions: {
+                    'single': true,
+                    'double': false,
+                    'pixelTolerance': 0,
+                    'stopSingle': false,
+                    'stopDouble': false
+                },
+
+                initialize: function(options) {
+                    this.handlerOptions = OpenLayers.Util.extend(
+                        {}, this.defaultHandlerOptions
+                    );
+                    OpenLayers.Control.prototype.initialize.apply(
+                        this, arguments
+                    ); 
+                    this.handler = new OpenLayers.Handler.Click(
+                        this, {
+                            'click': this.trigger
+                        }, this.handlerOptions
+                    );
+                }, 
+
+                trigger: function(e) {
+                    var lonlat = map.getLonLatFromPixel(e.xy);
+                                              
+				    var b = map.getLonLatFromPixel(e.xy);
+				        
+				    displayProjection= null;
+					displayProjection && b.transform(map.getProjectionObject(), displayProjection);
+	        		var ret=b.lon.toFixed(b) +" , " + b.lat.toFixed(b);
+				  	step_x=-0.001333333333333333;
+                	step_y=0.001333333333333333;
+					ori_lat=3.0125822852714919;
+                	ori_lon=181.94317626951325; 
+					
+
+                		
+                	d=map.getMaxExtent({
+                    	restricted: !0
+                	});
+         			var tmp = new OpenLayers.LonLat( ((e.xy.x - map.minPx.x) * map.getResolution() + d.left)*step_x, ((map.minPx.y - e.xy.y) * map.getResolution() + d.top)*step_y);
+					
+    			    var lon_final_tmp = OpenLayers.Util.toFloat(tmp.lon)+ori_lon;
+      				lon_final=lon_final_tmp<0?360+lon_final_tmp:lon_final_tmp;
+					var lat_final = OpenLayers.Util.toFloat(tmp.lat)+ori_lat;
+        				
+        				
+        			document.getElementById("valuediv").value=lon_final.toFixed(4) +"," + lat_final.toFixed(4);
+        				
+        			//	if (lat_final<2.22813 && lat_final> -2.22813 && lon_final_tmp< 67.6027 && lon_final_tmp>-71.18)					        
+        		 	//		alert("You clicked near " + lon_final + " , " + lat_final);
+					//	else
+					//	  OpenLayers.Util.getElement("valuediv").innerHTML = "";
+
+                                              
+
+        				
+                                              
+                }
+
+            });
+  
+              var map;
+              
+               var mapBounds = new OpenLayers.Bounds( 0.0, -4398.0, 270674.0, 0.0);
+
+//              var mapBounds = new OpenLayers.Bounds(0.0, -4274.0, 155805.0, 0.0);
+
+              var mapMinZoom = 0;
+              var mapMaxZoom = 10;
+              var emptyTileURL = "http://www.maptiler.org/img/none.png";
+              OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
+
+              function init(){
+              var graticuleCtl1;
+              
+               graticuleCtl1 = new OpenLayers.Control.Graticule({
+                            lineSymbolizer:{strokeColor: "#ff0000", strokeWidth: 1, strokeOpacity: 0.8},
+
+                    labelled: true
+                });
+              
+              
+                  var options = {
+                      div: "map",
+                      controls: [
+                   //     graticuleCtl1,
+            			 new OpenLayers.Control.OverviewMap(),
+						],
+                      maxExtent: new OpenLayers.Bounds( 0.0, -4398.0, 270674.0, 0.0),
+                      maxResolution: 2048.000000,
+                      numZoomLevels: 11
+                  };
+  
+                    map = new OpenLayers.Map(options);
+
+  			    
+  			    map.events.register("mousemove", map, function(e) {
+          		     var position = this.events.getMousePosition(e);
+					
+						var a={x:position.x,y:position.y};
+				        var b = map.getLonLatFromPixel(a);
+
+				        displayProjection= null;
+
+	        			displayProjection && b.transform(map.getProjectionObject(), displayProjection);
+	        			
+        				var ret=b.lon.toFixed(b) +" , " + b.lat.toFixed(b)
+				        
+
+
+				      					step_x=-0.001333333333333333;
+                	step_y=0.001333333333333333;
+					ori_lat=3.0125822852714919;
+                	ori_lon=181.94317626951325; 
+                	                		
+                		d=map.getMaxExtent({
+	                   		restricted: !0
+    		            });
+         	
+         			    var tmp = new OpenLayers.LonLat( ((a.x - map.minPx.x) * map.getResolution() + d.left)*step_x, ((map.minPx.y - a.y) * map.getResolution() + d.top)*step_y);
+
+  	   				    var lon_final_tmp = OpenLayers.Util.toFloat(tmp.lon)+ori_lon;
+      				    lon_final=lon_final_tmp<0?360+lon_final_tmp:lon_final_tmp;
+        			    var lat_final = OpenLayers.Util.toFloat(tmp.lat)+ori_lat;
+        				
+        			if (lat_final<3.08588 && lat_final> -2.90 && lon_final_tmp< 181.943 && lon_final_tmp>-183.943)					        
+	              		  OpenLayers.Util.getElement("valuediv").innerHTML = lon_final_tmp.toFixed(4)+", "+lat_final.toFixed(4);
+	              		//  OpenLayers.Util.getElement("valuediv").innerHTML = a.x+", "+a.y;
+						else
+					  OpenLayers.Util.getElement("valuediv").innerHTML = "";
+
+
+          		  });
+
+                  var layer = new OpenLayers.Layer.TMS("TMS Layer", "",
+                  {
+                      serviceVersion: '.',
+                      layername: '.',
+                      alpha: true,
+                      type: 'png',
+                      getURL: getURL
+                  });
+
+                  map.addLayer(layer);
+                  
+            	 var polygonLayer = new OpenLayers.Layer.Vector("Polygon Layer");
+                 map.addLayer(polygonLayer);
+		        // map.zoomToExtent(mapBounds);
+
+               var mapBoundsInitialZoom = new OpenLayers.Bounds(135.337, 16000.0, 135.337, 20000.0);
+		         map.zoomToExtent(mapBoundsInitialZoom);
+
+        
+                 map.addControls([new OpenLayers.Control.PanZoomBar(),
+                                   new OpenLayers.Control.Navigation(),
+                                   new OpenLayers.Control.MousePosition(),
+                                   new OpenLayers.Control.ArgParser(),
+                                   new OpenLayers.Control.Attribution()]);
+
+                  map.addControl(new OpenLayers.Control.LayerSwitcher());
+      
+            
+      
+      
+       		pointControl = new OpenLayers.Control.DrawFeature(polygonLayer,  OpenLayers.Handler.Point);
+
+
+            
+            map.addControl(pointControl);
+            
+            // register a listener on each control
+  			pointControl.events.register('featureadded', pointControl, function(f)
+  			{
+  				if (polygonLayer.features.length >1)
+  				{
+  					polygonLayer.removeFeatures(polygonLayer.features[0]);
+  				}
+				v = OpenLayers.Util.getElement("valuediv").innerHTML;
+				OpenLayers.Util.getElement("selected_point").innerHTML = v;
+				OpenLayers.Util.getElement("selected_radius").innerHTML = "";
+
+			    window.status="";
+
+   			});
+
+
+			polygonControl = new OpenLayers.Control.DrawFeature(polygonLayer, OpenLayers.Handler.RegularPolygon, {
+            	              handlerOptions: {
+            	                sides: 4,
+                                irregular: true
+                	            }
+                	        });
+			
+			map.addControl(polygonControl);
+
+ 		 // register a listener on each control
+  			polygonControl.events.register('featureadded', polygonControl, function(f)
+  			{
+  				
+  						centerPixel=f.feature.geometry.getBounds().getCenterPixel();							
+						//lonlat del centro
+						var lonlat={lon:centerPixel.x,lat:centerPixel.y};
+						//lonlat del pixel top left
+						var lonlat_top={lon:f.feature.geometry.getBounds().left,lat:f.feature.geometry.getBounds().top};
+						//lonlat del pixel bot
+						var lonlat_bot={lon:f.feature.geometry.getBounds().left,lat:f.feature.geometry.getBounds().bottom};
+						//lonlat del pixel top right
+						var lonlat_right={lon:f.feature.geometry.getBounds().right,lat:f.feature.geometry.getBounds().top};
+
+
+
+
+						var a=map.getPixelFromLonLat(lonlat);
+	        			var b = map.getLonLatFromPixel(a);
+	        			
+	        			var a_top=map.getPixelFromLonLat(lonlat_top);
+	        			var b_top = map.getLonLatFromPixel(a_top);
+	        			
+	        			var a_bot=map.getPixelFromLonLat(lonlat_bot);
+	        			var b_bot = map.getLonLatFromPixel(a_bot);
+
+						var a_right = map.getPixelFromLonLat(lonlat_right);
+	        			var b_right = map.getLonLatFromPixel(a_right);
+
+				        //displayProjection= null;
+
+	        			//displayProjection && b.transform(map.getProjectionObject(), displayProjection);
+	        			
+	        			
+
+	        			  //var tmp = parseInt(10);
+        			//	var ret=b.lon.toFixed(b) +" , " + b.lat.toFixed(b)
+				        
+				 	
+                	//ori_lon=181.943; 
+					//ori_lat=2.8514;
+					//ori_lat=3.08588;
+					step_x=-0.001333333333333333;
+                	step_y=0.001333333333333333;
+					ori_lat=3.0125822852714919;
+                	ori_lon=181.94317626951325; 
+
+                		
+                	                		
+                		d=map.getMaxExtent({
+	                   		restricted: !0
+    		            });
+         	
+         	
+         				//COMPUTE CENTER GLON/GLAT
+         			    var tmp = new OpenLayers.LonLat( ((a.x - map.minPx.x) * map.getResolution() + d.left)*step_x, ((map.minPx.y - a.y) * map.getResolution() + d.top)*step_y);
+  	   				    var lon_final = OpenLayers.Util.toFloat(tmp.lon)+ori_lon;
+      				    //var lon_final=lon_final_tmp<0?360+lon_final_tmp:lon_final_tmp;
+        			    var lat_final = OpenLayers.Util.toFloat(tmp.lat)+ori_lat;
+
+						//COMPUTE TOP GLON/GLAT
+         			    var tmp_top = new OpenLayers.LonLat( ((a_top.x - map.minPx.x) * map.getResolution() + d.left)*step_x, ((map.minPx.y - a_top.y) * map.getResolution() + d.top)*step_y);
+  	   				    var lon_final_top = OpenLayers.Util.toFloat(tmp_top.lon)+ori_lon;
+      				   // var lon_final_top=lon_final_tmp<0?360+lon_final_tmp:lon_final_tmp;
+        			    var lat_final_top = OpenLayers.Util.toFloat(tmp_top.lat)+ori_lat;
+
+						//COMPUTE BOTTOM GLON/GLAT
+         			    var tmp_bot = new OpenLayers.LonLat( ((a_bot.x - map.minPx.x) * map.getResolution() + d.left)*step_x, ((map.minPx.y - a_bot.y) * map.getResolution() + d.top)*step_y);
+  	   				    var lon_final_bot = OpenLayers.Util.toFloat(tmp_bot.lon)+ori_lon;
+      				    //var lon_final_bot=lon_final_tmp<0?360+lon_final_tmp:lon_final_tmp;
+        			    var lat_final_bot = OpenLayers.Util.toFloat(tmp_bot.lat)+ori_lat;
+
+						//COMPUTE right GLON/GLAT
+         			    var tmp_right = new OpenLayers.LonLat( ((a_right.x - map.minPx.x) * map.getResolution() + d.left)*step_x, ((map.minPx.y - a_right.y) * map.getResolution() + d.top)*step_y);
+  	   				    var lon_final_right = OpenLayers.Util.toFloat(tmp_right.lon)+ori_lon;
+      				    //var lon_final_right = lon_final_tmp<0?360+lon_final_tmp:lon_final_tmp;
+        			    var lat_final_right = OpenLayers.Util.toFloat(tmp_right.lat)+ori_lat;
+
+
+						var db=Math.abs(lat_final_top-lat_final_bot);
+						var dl=Math.abs(lon_final_top-lon_final_right);
+
+			/*
+    				  	console.log("CENTER: "+lon_final.toFixed(4) +"," + lat_final.toFixed(4) );
+    				  	console.log("TOP: "+lon_final_top.toFixed(4) +"," + lat_final_top.toFixed(4) );
+    				  	console.log("BOT: "+lon_final_bot.toFixed(4) +"," + lat_final_bot.toFixed(4) );
+    				  	console.log("RIGHT: "+lon_final_right.toFixed(4) +"," + lat_final_right.toFixed(4) );*/
+						console.log("db: "+db.toFixed(4) +" dl: "+dl.toFixed(4) );
+			
+  				
+  				
+  				
+  				
+
+  				if (polygonLayer.features.length >1)
+  				{
+  					polygonLayer.removeFeatures(polygonLayer.features[0]);
+  				}
+				OpenLayers.Util.getElement("selected_point").innerHTML = lon_final.toFixed(4) +"," + lat_final.toFixed(4);
+				OpenLayers.Util.getElement("selected_radius").innerHTML = dl.toFixed(4) +"," + db.toFixed(4);
+			    window.status="";
+
+
+   			});
+
+
+     
+
+      
+		activatePointSelection(false);
+		activateRectangularSelection(false);
+        // activatePointSelection(true);
+        //activateRectangularSelection(true);
+         
+         var click = new OpenLayers.Control.Click();       
+         map.addControl(click);
+         click.activate();
+           
+        }
+
+     
+     
+     function activateRectangularSelection(e)
+     {
+     	if(e)
+		{          	
+	       	 polygonControl.activate();
+	       	 pointControl.deactivate();
+        }
+        else
+	    {
+	    	polygonControl.deactivate();
+		}
+     }
+     
+     
+    function activatePointSelection(e)
+          {
+          	if(e)
+			{          	
+	        	 pointControl.activate();
+	        	 polygonControl.deactivate();
+        	}
+        	 else
+	        {
+	        	 pointControl.deactivate();
+		  	}
+		  }
+          
+          
+      function getURL(bounds) {
+                  bounds = this.adjustBounds(bounds);
+                  var res = this.getServerResolution();
+
+                  var x = Math.round((bounds.left - this.tileOrigin.lon) / (res * this.tileSize.w));
+                  var y = Math.round((bounds.bottom - this.tileOrigin.lat) / (res * this.tileSize.h));
+                  var z = this.getServerZoom();
+                  var path = this.serviceVersion + "/" + this.layername + "/" + z + "/" + x + "/" + y + "." + this.type; 
+                  var url = this.url;
+        
+                  
+                  if (OpenLayers.Util.isArray(url)) {
+                      url = this.selectUrl(path, url);
+                  }
+                  if (mapBounds.intersectsBounds(bounds) && (z >= mapMinZoom) && (z <= mapMaxZoom)) {
+                      return url + path;
+                  } else {
+                      return emptyTileURL;
+                  }
+              }
+          
+      function getWindowHeight() {
+                if (self.innerHeight) return self.innerHeight;
+                    if (document.documentElement && document.documentElement.clientHeight)
+                        return document.documentElement.clientHeight;
+                    if (document.body) return document.body.clientHeight;
+                        return 0;
+                }
+
+       function getWindowWidth() {
+                    if (self.innerWidth) return self.innerWidth;
+                    if (document.documentElement && document.documentElement.clientWidth)
+                        return document.documentElement.clientWidth;
+                    if (document.body) return document.body.clientWidth;
+                        return 0;
+                }
+
+    function resize() {  
+                    var map = document.getElementById("map");  
+                    var header = document.getElementById("header");  
+                    var subheader = document.getElementById("subheader");  
+                    map.style.height = (getWindowHeight()-80) + "px";
+                    map.style.width = (getWindowWidth()-20) + "px";
+                    header.style.width = (getWindowWidth()-20) + "px";
+                    subheader.style.width = (getWindowWidth()-20) + "px";
+                    if (map.updateSize) { map.updateSize(); };
+                }
+
+                onresize=function(){ resize(); };
+
+
+             </script>
+              </head>
+              <body onload="init()">
+                <div id="header">
+                	<img src="./logo.png" alt="logo" height="50px">
+                    <div id="valuediv" style="float:right" value=""></div>
+                    <div id="selected_point" style="display:none;" value=""></div>
+                    <div id="selected_radius" style="display:none;" value=""></div>
+
+                </div>
+                <div id="subheader">
+                	<!--
+                		Generated by <a href="http://www.maptiler.org/">MapTiler</a>/<a href="http://www.klokan.cz/projects/gdal2tiles/">GDAL2Tiles</a>, Copyright &copy; 2008 <a href="http://www.klokan.cz/">Klokan Petr Pridal</a>,  <a href="http://www.gdal.org/">GDAL</a> &amp; <a href="http://www.osgeo.org/">OSGeo</a> <a href="http://code.google.com/soc/">GSoC</a>
+               		-->
+                <!-- PLEASE, LET THIS NOTE ABOUT AUTHOR AND PROJECT SOMEWHERE ON YOUR WEBSITE, OR AT LEAST IN THE COMMENT IN HTML. THANK YOU -->
+                </div>
+       
+                
+                
+        	<div id="map"></div>
+        		<script type="text/javascript" >
+                	resize();                
+                </script>
+              </body>
+            </html>
\ No newline at end of file
diff --git a/PanoramicView/style.css b/PanoramicView/style.css
new file mode 100644
index 00000000..8e0abb70
--- /dev/null
+++ b/PanoramicView/style.css
@@ -0,0 +1,484 @@
+div.olMap {
+    z-index: 0;
+    padding: 0 !important;
+    margin: 0 !important;
+    cursor: default;
+}
+
+div.olMapViewport {
+    text-align: left;
+}
+
+div.olLayerDiv {
+   -moz-user-select: none;
+   -khtml-user-select: none;
+}
+
+.olLayerGoogleCopyright {
+    left: 2px;
+    bottom: 2px;
+}
+.olLayerGoogleV3.olLayerGoogleCopyright {
+    right: auto !important;
+}
+.olLayerGooglePoweredBy {
+    left: 2px;
+    bottom: 15px;
+}
+.olLayerGoogleV3.olLayerGooglePoweredBy {
+    bottom: 15px !important;
+}
+.olControlAttribution {
+    font-size: smaller;
+    right: 3px;
+    bottom: 4.5em;
+    position: absolute;
+    display: block;
+}
+.olControlScale {
+    right: 3px;
+    bottom: 3em;
+    display: block;
+    position: absolute;
+    font-size: smaller;
+}
+.olControlScaleLine {
+   display: block;
+   position: absolute;
+   left: 10px;
+   bottom: 15px;
+   font-size: xx-small;
+}
+.olControlScaleLineBottom {
+   border: solid 2px black;
+   border-bottom: none;
+   margin-top:-2px;
+   text-align: center;
+}
+.olControlScaleLineTop {
+   border: solid 2px black;
+   border-top: none;
+   text-align: center;
+}
+
+.olControlPermalink {
+    right: 3px;
+    bottom: 1.5em;
+    display: block;
+    position: absolute;
+    font-size: smaller;
+}
+
+div.olControlMousePosition {
+    bottom: 0;
+    right: 3px;
+    display: block;
+    position: absolute;
+    font-family: Arial;
+    font-size: smaller;
+}
+
+.olControlOverviewMapContainer {
+    position: absolute;
+    bottom: 0;
+    right: 0;
+}
+
+.olControlOverviewMapElement {
+    padding: 10px 18px 10px 10px;
+    background-color: #00008B;
+    -moz-border-radius: 1em 0 0 0;
+}
+
+.olControlOverviewMapMinimizeButton,
+.olControlOverviewMapMaximizeButton {
+    height: 18px;
+    width: 18px;
+    right: 0;
+    bottom: 80px;
+    cursor: pointer;
+}
+
+.olControlOverviewMapExtentRectangle {
+    overflow: hidden;
+    background-image: url("img/blank.gif");
+    cursor: move;
+    border: 2px dotted red;
+}
+.olControlOverviewMapRectReplacement {
+    overflow: hidden;
+    cursor: move;
+    background-image: url("img/overview_replacement.gif");
+    background-repeat: no-repeat;
+    background-position: center;
+}
+
+.olLayerGeoRSSDescription {
+    float:left;
+    width:100%;
+    overflow:auto;
+    font-size:1.0em;
+}
+.olLayerGeoRSSClose {
+    float:right;
+    color:gray;
+    font-size:1.2em;
+    margin-right:6px;
+    font-family:sans-serif;
+}
+.olLayerGeoRSSTitle {
+    float:left;font-size:1.2em;
+}
+
+.olPopupContent {
+    padding:5px;
+    overflow: auto;
+}
+
+.olControlNavigationHistory {
+   background-image: url("img/navigation_history.png");
+   background-repeat: no-repeat;
+   width:  24px;
+   height: 24px;
+
+}
+.olControlNavigationHistoryPreviousItemActive {
+  background-position: 0 0;
+}
+.olControlNavigationHistoryPreviousItemInactive {
+   background-position: 0 -24px;
+}
+.olControlNavigationHistoryNextItemActive {
+   background-position: -24px 0;
+}
+.olControlNavigationHistoryNextItemInactive {
+   background-position: -24px -24px;
+}
+
+div.olControlSaveFeaturesItemActive {
+    background-image: url(img/save_features_on.png);
+    background-repeat: no-repeat;
+    background-position: 0 1px;
+}
+div.olControlSaveFeaturesItemInactive {
+    background-image: url(img/save_features_off.png);
+    background-repeat: no-repeat;
+    background-position: 0 1px;
+}
+
+.olHandlerBoxZoomBox {
+    border: 2px solid red;
+    position: absolute;
+    background-color: white;
+    opacity: 0.50;
+    font-size: 1px;
+    filter: alpha(opacity=50);
+}
+.olHandlerBoxSelectFeature {
+    border: 2px solid blue;
+    position: absolute;
+    background-color: white;
+    opacity: 0.50;
+    font-size: 1px;
+    filter: alpha(opacity=50);
+}
+
+.olControlPanPanel {
+    top: 10px;
+    left: 5px;
+}
+
+.olControlPanPanel div {
+    background-image: url(img/pan-panel.png);
+    height: 18px;
+    width: 18px;
+    cursor: pointer;
+    position: absolute;
+}
+
+.olControlPanPanel .olControlPanNorthItemInactive {
+    top: 0;
+    left: 9px;
+    background-position: 0 0;
+}
+.olControlPanPanel .olControlPanSouthItemInactive {
+    top: 36px;
+    left: 9px;
+    background-position: 18px 0;
+}
+.olControlPanPanel .olControlPanWestItemInactive {
+    position: absolute;
+    top: 18px;
+    left: 0;
+    background-position: 0 18px;
+}
+.olControlPanPanel .olControlPanEastItemInactive {
+    top: 18px;
+    left: 18px;
+    background-position: 18px 18px;
+}
+
+.olControlZoomPanel {
+    top: 71px;
+    left: 14px;
+}
+
+.olControlZoomPanel div {
+    background-image: url(img/zoom-panel.png);
+    position: absolute;
+    height: 18px;
+    width: 18px;
+    cursor: pointer;
+}
+
+.olControlZoomPanel .olControlZoomInItemInactive {
+    top: 0;
+    left: 0;
+    background-position: 0 0;
+}
+
+.olControlZoomPanel .olControlZoomToMaxExtentItemInactive {
+    top: 18px;
+    left: 0;
+    background-position: 0 -18px;
+}
+
+.olControlZoomPanel .olControlZoomOutItemInactive {
+    top: 36px;
+    left: 0;
+    background-position: 0 18px;
+}
+
+/*
+ * When a potential text is bigger than the image it move the image
+ * with some headers (closes #3154)
+ */
+.olControlPanZoomBar div {
+    font-size: 1px;
+}
+
+.olPopupCloseBox {
+  background: url("img/close.gif") no-repeat;
+  cursor: pointer;
+}
+
+.olFramedCloudPopupContent {
+    padding: 5px;
+    overflow: auto;
+}
+
+.olControlNoSelect {
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
+
+.olImageLoadError {
+    background-color: pink;
+    opacity: 0.5;
+    filter: alpha(opacity=50); /* IE */
+}
+
+/**
+ * Cursor styles
+ */
+
+.olCursorWait {
+    cursor: wait;
+}
+.olDragDown {
+    cursor: move;
+}
+.olDrawBox {
+    cursor: crosshair;
+}
+.olControlDragFeatureOver {
+    cursor: move;
+}
+.olControlDragFeatureActive.olControlDragFeatureOver.olDragDown {
+    cursor: -moz-grabbing;
+}
+
+/**
+ * Layer switcher
+ */
+.olControlLayerSwitcher {
+    position: absolute;
+    top: 25px;
+    right: 0;
+    width: 20em;
+    font-family: sans-serif;
+    font-weight: bold;
+    margin-top: 3px;
+    margin-left: 3px;
+    margin-bottom: 3px;
+    font-size: smaller;
+    color: white;
+    background-color: transparent;
+}
+
+.olControlLayerSwitcher .layersDiv {
+    padding-top: 5px;
+    padding-left: 10px;
+    padding-bottom: 5px;
+    padding-right: 10px;
+    background-color: darkblue;
+}
+
+.olControlLayerSwitcher .layersDiv .baseLbl,
+.olControlLayerSwitcher .layersDiv .dataLbl {
+    margin-top: 3px;
+    margin-left: 3px;
+    margin-bottom: 3px;
+}
+
+.olControlLayerSwitcher .layersDiv .baseLayersDiv,
+.olControlLayerSwitcher .layersDiv .dataLayersDiv {
+    padding-left: 10px;
+}
+
+.olControlLayerSwitcher .maximizeDiv,
+.olControlLayerSwitcher .minimizeDiv {
+    width: 18px;
+    height: 18px;
+    top: 5px;
+    right: 0;
+    cursor: pointer;
+}
+
+.olBingAttribution {
+    color: #DDD;
+}
+.olBingAttribution.road {
+    color: #333;
+}
+
+.olGoogleAttribution.hybrid, .olGoogleAttribution.satellite {
+    color: #EEE;
+}
+.olGoogleAttribution {
+    color: #333;
+}
+span.olGoogleAttribution a {
+    color: #77C;
+}
+span.olGoogleAttribution.hybrid a, span.olGoogleAttribution.satellite a {
+    color: #EEE;
+}
+
+/**
+ * Editing and navigation icons.
+ * (using the editing_tool_bar.png sprint image)
+ */
+.olControlNavToolbar ,
+.olControlEditingToolbar {
+    margin: 5px 5px 0 0;
+}
+.olControlNavToolbar div,
+.olControlEditingToolbar div {
+    background-image: url("img/editing_tool_bar.png");
+    background-repeat: no-repeat;
+    margin: 0 0 5px 5px;
+    width: 24px;
+    height: 22px;
+    cursor: pointer
+}
+/* positions */
+.olControlEditingToolbar {
+    right: 0;
+    top: 0;
+}
+.olControlNavToolbar {
+    top: 295px;
+    left: 9px;
+}
+/* layouts */
+.olControlEditingToolbar div {
+    float: right;
+}
+/* individual controls */
+.olControlNavToolbar .olControlNavigationItemInactive,
+.olControlEditingToolbar .olControlNavigationItemInactive {
+    background-position: -103px -1px;
+}
+.olControlNavToolbar .olControlNavigationItemActive ,
+.olControlEditingToolbar .olControlNavigationItemActive  {
+    background-position: -103px -24px;
+}
+.olControlNavToolbar .olControlZoomBoxItemInactive {
+    background-position: -128px -1px;
+}
+.olControlNavToolbar .olControlZoomBoxItemActive  {
+    background-position: -128px -24px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePointItemInactive {
+    background-position: -77px -1px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePointItemActive {
+    background-position: -77px -24px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePathItemInactive {
+    background-position: -51px -1px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePathItemActive {
+    background-position: -51px -24px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePolygonItemInactive{
+    background-position: -26px -1px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePolygonItemActive {
+    background-position: -26px -24px;
+}
+
+div.olControlZoom {
+    position: absolute;
+    top: 8px;
+    left: 8px;
+    background: rgba(255,255,255,0.4);
+    border-radius: 4px;
+    padding: 2px;
+}
+div.olControlZoom a {
+    display: block;
+    margin: 1px;
+    padding: 0;
+    color: white;
+    font-size: 18px;
+    font-family: 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
+    font-weight: bold;
+    text-decoration: none;
+    text-align: center;
+    height: 22px;
+    width:22px;
+    line-height: 19px;
+    background: #130085; /* fallback for IE - IE6 requires background shorthand*/
+    background: rgba(0, 60, 136, 0.5);
+    filter: alpha(opacity=80);
+}
+div.olControlZoom a:hover {
+    background: #130085; /* fallback for IE */
+    background: rgba(0, 60, 136, 0.7);
+    filter: alpha(opacity=100);
+}
+@media only screen and (max-width: 600px) {
+    div.olControlZoom a:hover {
+        background: rgba(0, 60, 136, 0.5);
+    }
+}
+a.olControlZoomIn {
+    border-radius: 4px 4px 0 0;
+}
+a.olControlZoomOut {
+    border-radius: 0 0 4px 4px;
+}
+
+
+/**
+ * Animations
+ */
+
+.olLayerGrid .olTileImage {
+    -webkit-transition: opacity 0.2s linear;
+    -moz-transition: opacity 0.2s linear;
+    -o-transition: opacity 0.2s linear;
+    transition: opacity 0.2s linear;
+}
diff --git a/PanoramicView/tilemapresource.xml b/PanoramicView/tilemapresource.xml
new file mode 100644
index 00000000..7eea67ab
--- /dev/null
+++ b/PanoramicView/tilemapresource.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+    <TileMap version="1.0.0" tilemapservice="http://tms.osgeo.org/1.0.0">
+      <Title>HiGal Pano Inner Galaxy Full Resolution.tif</Title>
+      <Abstract></Abstract>
+      <SRS></SRS>
+      <BoundingBox minx="0.00000000000000" miny="-4398.00000000000000" maxx="270674.00000000000000" maxy="0.00000000000000"/>
+      <Origin x="0.00000000000000" y="-4398.00000000000000"/>
+      <TileFormat width="256" height="256" mime-type="image/png" extension="png"/>
+      <TileSets profile="raster">
+        <TileSet href="0" units-per-pixel="2048.00000000000000" order="0"/>
+        <TileSet href="1" units-per-pixel="1024.00000000000000" order="1"/>
+        <TileSet href="2" units-per-pixel="512.00000000000000" order="2"/>
+        <TileSet href="3" units-per-pixel="256.00000000000000" order="3"/>
+        <TileSet href="4" units-per-pixel="128.00000000000000" order="4"/>
+        <TileSet href="5" units-per-pixel="64.00000000000000" order="5"/>
+        <TileSet href="6" units-per-pixel="32.00000000000000" order="6"/>
+        <TileSet href="7" units-per-pixel="16.00000000000000" order="7"/>
+        <TileSet href="8" units-per-pixel="8.00000000000000" order="8"/>
+        <TileSet href="9" units-per-pixel="4.00000000000000" order="9"/>
+        <TileSet href="10" units-per-pixel="2.00000000000000" order="10"/>
+        <TileSet href="11" units-per-pixel="1.00000000000000" order="11"/>
+      </TileSets>
+    </TileMap>
+    
\ No newline at end of file
-- 
GitLab