{"_id":"_design/geo","_rev":"19-fc08ab6eb2d2942cac2d3377f94dd1e5","rewrites":[{"to":"favicon.ico","from":"favicon.ico"},{"to":"style/*","from":"style/*"},{"to":"script/*","from":"script/*"},{"to":"images/*","from":"images/*"},{"to":"index.html","from":""},{"to":"/_spatiallist/geojson/full","from":"/data"},{"to":"./","from":"ddoc"},{"to":"../../","from":"api"},{"to":"../../*","from":"api/*"},{"to":"/_spatiallist/geojson/full","from":"/all","query":{"bbox":"-180,-90,180,90"}},{"to":"/_spatiallist/kml/full","from":"/kml","query":{"bbox":"-180,-90,180,90"}}],"vendor":{"geojson-utils":"(function() {\n var gju = this.gju = {};\n \n // Export the geojson object for **CommonJS**\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = gju;\n }\n \n // adapted from http://www.kevlindev.com/gui/math/intersection/Intersection.js\n gju.lineStringsIntersect = function(l1, l2) {\n var intersects = [];\n for (var i = 0; i <= l1.coordinates.length - 2; ++i) {\n for (var j = 0; j <= l2.coordinates.length - 2; ++j) { \n var a1 = {x: l1.coordinates[i][1], y: l1.coordinates[i][0]},\n a2 = {x: l1.coordinates[i+1][1], y: l1.coordinates[i+1][0]},\n b1 = {x: l2.coordinates[j][1], y: l2.coordinates[j][0]},\n b2 = {x: l2.coordinates[j+1][1], y: l2.coordinates[j+1][0]},\n ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x),\n ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x),\n u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n if ( u_b != 0 ) {\n var ua = ua_t / u_b,\n ub = ub_t / u_b;\n if ( 0 <= ua && ua <= 1 && 0 <= ub && ub <= 1 ) {\n intersects.push({ \n 'type': 'Point',\n 'coordinates': [a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y)]\n });\n }\n }\n }\n }\n if (intersects.length == 0) intersects = false;\n return intersects;\n }\n\n // adapted from http://jsfromhell.com/math/is-point-in-poly\n gju.pointInPolygon = function(point, polygon) {\n var x = point.coordinates[1],\n y = point.coordinates[0],\n poly = polygon.coordinates[0]; //TODO: support polygons with holes\n for (var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) {\n var px = poly[i][1], py = poly[i][0],\n jx = poly[j][1], jy = poly[j][0];\n if (((py <= y && y < jy) || (jy <= y && y < py)) && (x < (jx - px) * (y - py) / (jy - py) + px)) {\n c = [point];\n }\n }\n return c;\n }\n \n gju.numberToRadius = function(number) {\n return number * Math.PI / 180;\n }\n\n gju.numberToDegree = function(number) {\n return number * 180 / Math.PI;\n }\n \n // written with help from @tautologe \n gju.drawCircle = function(radiusInMeters, centerPoint) {\n var center = [centerPoint.coordinates[1], centerPoint.coordinates[0]],\n dist = (radiusInMeters / 1000) / 6371, // convert meters to radiant\n radCenter = [gju.numberToRadius(center[0]), gju.numberToRadius(center[1])],\n steps = 15, // 15 sided circle\n poly = [[center[0], center[1]]];\n for (var i = 0; i < steps + 1; i++) {\n \tvar brng = 2 * Math.PI * i / steps; \n \tvar lat = Math.asin(Math.sin(radCenter[0]) * Math.cos(dist) + \n Math.cos(radCenter[0]) * Math.sin(dist) * Math.cos(brng));\n \tvar lng = radCenter[1] + Math.atan2(Math.sin(brng) * Math.sin(dist) *\n Math.cos(radCenter[0]), \n Math.cos(dist) - Math.sin(radCenter[0]) *\n Math.sin(lat));\n poly[i] = [];\n poly[i][1] = gju.numberToDegree(lat);\n poly[i][0] = gju.numberToDegree(lng);\n }\n return { \"type\": \"Polygon\", \"coordinates\": [poly] };\n }\n\n gju.rectangleCentroid = function(rectangle) {\n var bbox = rectangle.coordinates[0];\n var xmin = bbox[0][0], ymin = bbox[0][1], xmax = bbox[1][0], ymax = bbox[1][1];\n var xwidth = xmax - xmin;\n var ywidth = ymax - ymin;\n return { 'type': 'Point', 'coordinates': [xmin + xwidth/2, ymin + ywidth/2] };\n }\n \n // from http://www.movable-type.co.uk/scripts/latlong.html\n gju.pointDistance = function(pt1, pt2) {\n var lon1 = pt1.coordinates[0], lat1 = pt1.coordinates[1],\n lon2 = pt2.coordinates[0], lat2 = pt2.coordinates[1],\n dLat = gju.numberToRadius(lat2 - lat1),\n dLon = gju.numberToRadius(lon2 - lon1),\n a = Math.sin(dLat/2) * Math.sin(dLat/2) +\n Math.cos(gju.numberToRadius(lat1)) * Math.cos(gju.numberToRadius(lat2)) * \n Math.sin(dLon/2) * Math.sin(dLon/2),\n c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n return (6371 * c) * 1000; // returns meters\n },\n \n // adapted from http://paulbourke.net/geometry/polyarea/javascript.txt\n gju.area = function(polygon) {\n var area = 0;\n // TODO: polygon holes at coordinates[1]\n var points = polygon.coordinates[0];\n var j = points.length - 1;\n var p1, p2;\n\n for (var i=0; i < points.length; j = i++) {\n var p1 = {x: points[i][1], y: points[i][0]};\n var p2 = {x: points[j][1], y: points[j][0]};\n area += p1.x * p2.y;\n area -= p1.y * p2.x;\n }\n\n area /= 2;\n return area;\n },\n\n // adapted from http://paulbourke.net/geometry/polyarea/javascript.txt\n gju.centroid = function(polygon) {\n var f, x = 0, y = 0;\n // TODO: polygon holes at coordinates[1]\n var points = polygon.coordinates[0];\n var j = points.length - 1;\n var p1, p2;\n\n for (var i=0; i < points.length; j = i++) {\n var p1 = {x: points[i][1], y: points[i][0]};\n var p2 = {x: points[j][1], y: points[j][0]};\n f = p1.x * p2.y - p2.x * p1.y;\n x += (p1.x + p2.x) * f;\n y += (p1.y + p2.y) * f;\n }\n\n f = gju.area(polygon) * 6;\n return { 'type': 'Point', 'coordinates': [y/f, x/f] };\n },\n\n gju.simplify = function (source, kink) {\n /* source[] array of geojson points */\n /* kink\tin metres, kinks above this depth kept */\n /* kink depth is the height of the triangle abc where a-b and b-c are two consecutive line segments */\n kink = kink || 20;\n source = source.map(function(o) { return {lng: o.coordinates[0], lat: o.coordinates[1]} });\n \n var\tn_source, n_stack, n_dest, start, end, i, sig; \n var dev_sqr, max_dev_sqr, band_sqr;\n var x12, y12, d12, x13, y13, d13, x23, y23, d23;\n var F = ((Math.PI / 180.0) * 0.5 );\n var index = new Array(); /* aray of indexes of source points to include in the reduced line */\n var sig_start = new Array(); /* indices of start & end of working section */\n var sig_end = new Array();\t\n \n /* check for simple cases */\n \n if ( source.length < 3 ) return(source); /* one or two points */\n \n /* more complex case. initialize stack */\n\n \tn_source = source.length;\n band_sqr = kink * 360.0 / (2.0 * Math.PI * 6378137.0);\t/* Now in degrees */\n band_sqr *= band_sqr;\n n_dest = 0;\n sig_start[0] = 0;\n sig_end[0] = n_source-1;\n n_stack = 1;\n\n /* while the stack is not empty ... */\n while ( n_stack > 0 ){\n\n /* ... pop the top-most entries off the stacks */\n\n start = sig_start[n_stack-1];\n end = sig_end[n_stack-1];\n n_stack--;\n\n if ( (end - start) > 1 ){ /* any intermediate points ? */ \n\n /* ... yes, so find most deviant intermediate point to\n either side of line joining start & end points */ \n\n x12 = (source[end].lng() - source[start].lng());\n y12 = (source[end].lat() - source[start].lat());\n if (Math.abs(x12) > 180.0) \n x12 = 360.0 - Math.abs(x12);\n x12 *= Math.cos(F * (source[end].lat() + source[start].lat()));/* use avg lat to reduce lng */\n d12 = (x12*x12) + (y12*y12);\n\n for ( i = start + 1, sig = start, max_dev_sqr = -1.0; i < end; i++ ){ \n\n x13 = (source[i].lng() - source[start].lng());\n y13 = (source[i].lat() - source[start].lat());\n if (Math.abs(x13) > 180.0) \n x13 = 360.0 - Math.abs(x13);\n x13 *= Math.cos (F * (source[i].lat() + source[start].lat()));\n d13 = (x13*x13) + (y13*y13);\n\n x23 = (source[i].lng() - source[end].lng());\n y23 = (source[i].lat() - source[end].lat());\n if (Math.abs(x23) > 180.0) \n x23 = 360.0 - Math.abs(x23);\n x23 *= Math.cos(F * (source[i].lat() + source[end].lat()));\n d23 = (x23*x23) + (y23*y23);\n\n if ( d13 >= ( d12 + d23 ) )\n dev_sqr = d23;\n else if ( d23 >= ( d12 + d13 ) )\n dev_sqr = d13;\n else\n dev_sqr = (x13 * y12 - y13 * x12) * (x13 * y12 - y13 * x12) / d12;// solve triangle\n\n if ( dev_sqr > max_dev_sqr ){\n sig = i;\n max_dev_sqr = dev_sqr;\n }\n }\n\n if ( max_dev_sqr < band_sqr ){ /* is there a sig. intermediate point ? */\n /* ... no, so transfer current start point */\n index[n_dest] = start;\n n_dest++;\n }\n else{\n /* ... yes, so push two sub-sections on stack for further processing */\n n_stack++;\n sig_start[n_stack-1] = sig;\n sig_end[n_stack-1] = end;\n n_stack++;\n sig_start[n_stack-1] = start;\n sig_end[n_stack-1] = sig;\n }\n }\n else{\n /* ... no intermediate points, so transfer current start point */\n index[n_dest] = start;\n n_dest++;\n }\n }\n\n /* transfer last point */\n index[n_dest] = n_source-1;\n n_dest++;\n\n /* make return array */\n var r = new Array();\n for(var i=0; i < n_dest; i++)\n r.push(source[index[i]]);\n return r.map(function(o) { return {type: \"Point\", coordinates: [o.lng, o.lat]} });;\n }\n})();"},"spatial":{"latlon":"/**\n * A simple spatial view that emits GeoJSON if your lat/long are stored as invidivual keys called \"lat\" and \"long\"\n */\nfunction(doc){\n\tif(doc.lat && doc.long){\n var geometry = {type: \"Point\", coordinates: [doc.long, doc.lat]};\n\t\temit(geometry, {\n\t\t\tid: doc._id,\n\t\t\tgeometry: geometry\t\t\n\t\t});\n\t}\n}","simple":"/**\n * A spatial view that emits the GeoJSON simplified using the Douglas-Puecker algorithm\n */\n \nfunction(doc) {\n // from https://gist.github.com/543273\n var simplify = function (source, kink) {\n /* source[] array of geojson points */\n /* kink\tin metres, kinks above this depth kept */\n /* kink depth is the height of the triangle abc where a-b and b-c are two consecutive line segments */\n kink = kink || 20;\n source = source.map(function(o) { return {lng: function() { return o[0]}, lat: function() {return o[1]}} });\n\n var\tn_source, n_stack, n_dest, start, end, i, sig; \n var dev_sqr, max_dev_sqr, band_sqr;\n var x12, y12, d12, x13, y13, d13, x23, y23, d23;\n var F = ((Math.PI / 180.0) * 0.5 );\n var index = new Array(); /* aray of indexes of source points to include in the reduced line */\n \t var sig_start = new Array(); /* indices of start & end of working section */\n var sig_end = new Array();\t\n\n /* check for simple cases */\n\n if ( source.length < 3 ) \n return(source); /* one or two points */\n\n /* more complex case. initialize stack */\n\n \tn_source = source.length;\n band_sqr = kink * 360.0 / (2.0 * Math.PI * 6378137.0);\t/* Now in degrees */\n band_sqr *= band_sqr;\n n_dest = 0;\n sig_start[0] = 0;\n sig_end[0] = n_source-1;\n n_stack = 1;\n\n /* while the stack is not empty ... */\n while ( n_stack > 0 ){\n\n /* ... pop the top-most entries off the stacks */\n\n start = sig_start[n_stack-1];\n end = sig_end[n_stack-1];\n n_stack--;\n\n if ( (end - start) > 1 ){ /* any intermediate points ? */ \n\n /* ... yes, so find most deviant intermediate point to\n either side of line joining start & end points */ \n\n x12 = (source[end].lng() - source[start].lng());\n y12 = (source[end].lat() - source[start].lat());\n if (Math.abs(x12) > 180.0) \n x12 = 360.0 - Math.abs(x12);\n x12 *= Math.cos(F * (source[end].lat() + source[start].lat()));/* use avg lat to reduce lng */\n d12 = (x12*x12) + (y12*y12);\n\n for ( i = start + 1, sig = start, max_dev_sqr = -1.0; i < end; i++ ){ \n\n x13 = (source[i].lng() - source[start].lng());\n y13 = (source[i].lat() - source[start].lat());\n if (Math.abs(x13) > 180.0) \n x13 = 360.0 - Math.abs(x13);\n x13 *= Math.cos (F * (source[i].lat() + source[start].lat()));\n d13 = (x13*x13) + (y13*y13);\n\n x23 = (source[i].lng() - source[end].lng());\n y23 = (source[i].lat() - source[end].lat());\n if (Math.abs(x23) > 180.0) \n x23 = 360.0 - Math.abs(x23);\n x23 *= Math.cos(F * (source[i].lat() + source[end].lat()));\n d23 = (x23*x23) + (y23*y23);\n\n if ( d13 >= ( d12 + d23 ) )\n dev_sqr = d23;\n else if ( d23 >= ( d12 + d13 ) )\n dev_sqr = d13;\n else\n dev_sqr = (x13 * y12 - y13 * x12) * (x13 * y12 - y13 * x12) / d12;// solve triangle\n\n if ( dev_sqr > max_dev_sqr ){\n sig = i;\n max_dev_sqr = dev_sqr;\n }\n }\n\n if ( max_dev_sqr < band_sqr ){ /* is there a sig. intermediate point ? */\n /* ... no, so transfer current start point */\n index[n_dest] = start;\n n_dest++;\n }\n else{\n /* ... yes, so push two sub-sections on stack for further processing */\n n_stack++;\n sig_start[n_stack-1] = sig;\n sig_end[n_stack-1] = end;\n n_stack++;\n sig_start[n_stack-1] = start;\n sig_end[n_stack-1] = sig;\n }\n }\n else{\n /* ... no intermediate points, so transfer current start point */\n index[n_dest] = start;\n n_dest++;\n }\n }\n\n /* transfer last point */\n index[n_dest] = n_source-1;\n n_dest++;\n\n /* make return array */\n var r = new Array();\n for(var i=0; i < n_dest; i++)\n r.push(source[index[i]]);\n return r.map(function(o) { return [o.lng(), o.lat()] });;\n }\n \n function clone(obj){\n if(obj == null || typeof(obj) != 'object')\n return obj;\n var temp = obj.constructor(); // changed\n for(var key in obj)\n temp[key] = clone(obj[key]);\n return temp;\n }\n \n\tif(doc.geometry) {\n\t var kink = 50;\n\t newDoc = clone(doc);\n\t if (doc.geometry.type === \"Polygon\") {\n newDoc.geometry.coordinates[0] = simplify(newDoc.geometry.coordinates[0], kink);\n \t\temit(newDoc.geometry, newDoc);\n\t\t} else if (doc.geometry.type === \"MultiPolygon\") {\n\t\t for(var i = 0; i < newDoc.geometry.coordinates.length; i++) {\n\t\t newDoc.geometry.coordinates[i][0] = simplify(newDoc.geometry.coordinates[i][0], kink);\n \t\temit(newDoc.geometry, newDoc);\n\t\t }\n\t\t}\n\t}\n}","full":"/**\n * A simple spatial view that emits the GeoJSON plus the complete documents. \n */\nfunction(doc){\n\tif(doc.geometry){\n\t\temit(doc.geometry, doc);\n\t}\n}","minimal":"/**\n * A simple spatial view that emits only the GeoJSON object further values. \n */\nfunction(doc){\n\tif(doc.geometry){\n\t\temit(doc.geometry, null);\n\t}\n}","basic":"/**\n * A simple spatial view that emits GeoJSON plus the original GeoJSON value and document id.\n */\nfunction(doc){\n\tif(doc.geometry){\n\t\temit(doc.geometry, {\n\t\t\tid: doc._id,\n\t\t\tgeometry: doc.geometry\t\t\t\n\t\t});\n\t}\n}"},"views":{"headers":{"map":"/**\n * Returns an array of all of the keys in the document.\n * \n * @author Max Ogden\n */\nfunction(doc) {\n var keys = [];\n for (var key in doc) {\n keys.push(key);\n }\n emit(doc, keys);\n}","reduce":"/**\n * Reduces the passed in view headers to a list of unique object key attributes\n *\n * @author Max Ogden\n */\nfunction(keys, values, rereduce) { \n\n function include(arr, obj) {\n return (arr.indexOf(obj) != -1);\n }\n \n var headers = [];\n for (var doc in values) {\n for (var header in values[doc]) {\n if(!include(headers, values[doc][header])) {\n headers.push(values[doc][header]);\n }\n }\n }\n \n return headers;\n}"},"all":{"map":"/**\n * A simple map function mocking _all, but allows usage with lists etc.\n * \n */\nfunction(doc) {\n emit(doc.id, doc);\n}"}},"lists":{"urlencode":"/**\n * Returns the urlencoded version of the view value \n *\n * @author Max Ogden\n */\nfunction(head, req) {\n // Send the same Content-Type as CouchDB would\n if (req.headers.Accept.indexOf('application/json')!=-1)\n start({\"headers\":{\"Content-Type\" : \"application/json\"}});\n else\n start({\"headers\":{\"Content-Type\" : \"text/plain\"}});\n\n if ('callback' in req.query) send(req.query['callback'] + \"(\");\n\n while (row = getRow()) {\n send(escape(JSON.stringify(row.value)));\n }\n \n if ('callback' in req.query) send(\")\");\n};","csv":"/**\n * Generates a CSV from all the rows in the view.\n *\n * Takes in a url encoded array of headers as an argument. You can\n * generate this by querying /_list/urlencode/headers. Pass it in\n * as the headers get parameter, e.g.: ?headers=%5B%22_id%22%2C%22_rev%5D\n *\n * @author Max Ogden\n */\nfunction(head, req) { \n if ('headers' in req.query) {\n var headers = eval(unescape(req.query.headers.split(',')));\n var row, sep = '\\n', headerSent = false, startedOutput = false;\n \n start({\"headers\":{\"Content-Type\" : \"text/x-csv\"}});\n send(headers.join(',') + \"\\n\");\n while (row = getRow()) {\n for (var header in headers) {\n if (row.value[headers[header]]) {\n if (startedOutput) send(\",\");\n send(\"\\\"\" + row.value[headers[header]] + \"\\\"\");\n } else {\n if (startedOutput) send(\",\");\n } \n startedOutput = true;\n }\n startedOutput = false;\n send('\\n');\n }\n } else {\n send(\"You must pass in the urlencoded headers you wish to build the CSV from. Query /_list/urlencode/headers\");\n }\n};","radius":"/**\n * This will take the centroid of the bbox parameter and a supplied radius\n * parameter in meters and filter the rectangularly shaped bounding box\n * result set by circular radius.\n *\n * @author Max Ogden\n */\nfunction(head, req) {\n var gju = require('vendor/geojson-utils'),\n row,\n out,\n radius = req.query.radius,\n bbox = JSON.parse(\"[\" + req.query.bbox + \"]\"),\n center = gju.rectangleCentroid({\n \"type\": \"Polygon\",\n \"coordinates\": [[[bbox[0], bbox[1]], [bbox[2], bbox[3]]]]\n }),\n callback = req.query.callback,\n circle = gju.drawCircle(radius, center),\n startedOutput = false;\n\n if (req.headers.Accept.indexOf('application/json') != -1)\n start({\"headers\":{\"Content-Type\" : \"application/json\"}});\n else\n start({\"headers\":{\"Content-Type\" : \"text/plain\"}});\n\n if ('callback' in req.query) send(req.query['callback'] + \"(\");\n send('{\"type\": \"FeatureCollection\", \"features\":[');\n while (row = getRow()) {\n if (gju.pointInPolygon(row.value.geometry, circle)) {\n if (startedOutput) send(\",\\n\");\n out = '{\"type\": \"Feature\", \"geometry\": ' + JSON.stringify(row.value.geometry);\n delete row.value.geometry;\n out += ', \"properties\": ' + JSON.stringify(row.value) + '}';\n send(out);\n startedOutput = true;\n }\n }\n send(\"\\n]}\");\n if ('callback' in req.query) send(\")\");\n};","kml":"/**\n * A list function that transforms a spatial view result set into a KML feed.\n * \n * @author Benjamin Erb\n */\nfunction(head, req) {\n var row, out, sep = '\\n';\n \n start({\"headers\":{\"Content-Type\" : \"application/vnd.google-earth.kml+xml\"}});\n send('\\n');\n send('\\n');\n send('\\n');\n send('GeoCouch Result - KML Feed\\n');\n while (row = getRow()) {\n \tif(row.value.geometry){\n send('\\t');\n send(''+row.id+'');\n send(''+row.value.geometry.coordinates[0]+','+row.value.geometry.coordinates[1]+',0');\n send('\\n');\n \t}\n }\n send('\\n');\n send('\\n');\n};","geojson":"/**\n * This function outputs a GeoJSON FeatureCollection (compatible with\n * OpenLayers). The geometry is stored in the geometry property, all other\n * properties in the properties property.\n * \n * @author Volker Mische\n */\nfunction(head, req) {\n var row, out, sep = '\\n';\n\n // Send the same Content-Type as CouchDB would\n if (typeof(req.headers.Accept) != \"undefined\" && req.headers.Accept.indexOf('application/json')!=-1)\n start({\"headers\":{\"Content-Type\" : \"application/json\"}});\n else\n start({\"headers\":{\"Content-Type\" : \"text/plain\"}});\n\n if ('callback' in req.query) send(req.query['callback'] + \"(\");\n\n send('{\"type\": \"FeatureCollection\", \"features\":[');\n while (row = getRow()) {\n out = '{\"type\": \"Feature\", \"id\": ' + JSON.stringify(row.id);\n out += ', \"geometry\": ' + JSON.stringify(row.value.geometry);\n delete row.value.geometry;\n out += ', \"properties\": ' + JSON.stringify(row.value) + '}';\n\n send(sep + out);\n sep = ',\\n';\n }\n send(\"]}\");\n if ('callback' in req.query) send(\")\");\n \n};"},"couchapp":{"signatures":{"style/stylesheet.css":"3ba12adf9c7d865d496332032228371b","index.html":"77971e22fb1db2944a645f373860d026","script/jquery.couch.js":"7334472a5df79f5d3a6b1b6638057544","style/reset.css":"f629e1c9af84d91cc88453ae26cdee4a","images/button-bg.png":"e9b9b5ee748b76ed871156a39f72ba7b","style/stylesheet_ie_lte_7.css":"0c5375d0bf5f322222ee00292d59e942","script/maptip.js":"75577e37ab36f80e1696cb421cbbe07f","script/polymaps.min.js":"0f70c37b53d4c629faf9202c60ae2789","style/map.css":"6162f9e279b3f2245297bd7646510b2c","images/loading.gif":"2da0807814ad64841cd597c4e8a653d1","script/polymaps-couchbb.js":"fab629880201a3e805c5d709a620b7e0","script/geojson-utils.js":"84784178070d3af5dfdec3a9a8bebe09","README.md":"8059cd0589c41d99b102e73502785582",".DS_Store":"bc91b1a0974ea994812f284c57440bb4","style/fileuploader.css":"e089cc128db69da8b2ee53dc7bec9601","script/polymaps-couchbb.min.js":"b408b21ea10b69b0c7878250b48542be","script/jquery.selectbox.js":"f53342231110034beda21fce3621d557","script/map.js":"baae58aa73db30d29f9bd7538fbb657e","script/jquery-1.7.1.min.js":"ddb84c1587287b2df08966081ef063bf","images/dropdown.png":"e32d36ea8f05de7be6e1a8edb0c171ab","images/ajax-loader.gif":"394bafc3cc4dfb3a0ee48c1f54669539"},"objects":{},"manifest":["lists/","lists/csv.js","lists/geojson.js","lists/kml.js","lists/radius.js","lists/urlencode.js","rewrites.json","spatial/","spatial/basic.js","spatial/full.js","spatial/latlon.js","spatial/minimal.js","spatial/simple.js","vendor/","vendor/geojson-utils.js","views/","views/all/","views/all/map.js","views/headers/","views/headers/map.js","views/headers/reduce.js"]},"_attachments":{"style/stylesheet.css":{"content_type":"text/css","revpos":9,"digest":"md5-trbhTlTPH0CtZGy36swl4g==","length":2535,"stub":true},"script/geojson-utils.js":{"content_type":"application/javascript","revpos":15,"digest":"md5-zDgqFg+oOGM4adcdKqLY7Q==","length":9018,"stub":true},"script/jquery.selectbox.js":{"content_type":"application/javascript","revpos":9,"digest":"md5-ddaqox7d4Ld+IBe791wrMQ==","length":13426,"stub":true},"style/reset.css":{"content_type":"text/css","revpos":9,"digest":"md5-um2Y2K02Hp+hbfD780MyBg==","length":1019,"stub":true},"images/button-bg.png":{"content_type":"image/png","revpos":9,"digest":"md5-6bm17nSLdu2HEVajn3K6ew==","length":2808,"stub":true},"style/map.css":{"content_type":"text/css","revpos":19,"digest":"md5-OKBw+1GmGSDAVdoKCDr9rQ==","length":5029,"stub":true},"script/maptip.js":{"content_type":"application/javascript","revpos":9,"digest":"md5-DqnkgwoWDbBCTvdYTkeaUQ==","length":3252,"stub":true},"script/polymaps-couchbb.js":{"content_type":"application/javascript","revpos":19,"digest":"md5-jsZ3LXEUGXSVlM7/YYEbpg==","length":65707,"stub":true},"script/jquery-1.7.1.min.js":{"content_type":"application/javascript","revpos":19,"digest":"md5-kDrm5DSU7ipIDNCUHWqsGw==","length":93868,"stub":true},"images/loading.gif":{"content_type":"image/gif","revpos":9,"digest":"md5-LaCAeBStZIQc1ZfE6KZT0Q==","length":1688,"stub":true},"script/polymaps.min.js":{"content_type":"application/javascript","revpos":12,"digest":"md5-uY0UP7icXHr9xozo66/mXQ==","length":32760,"stub":true},"script/jquery.couch.js":{"content_type":"application/javascript","revpos":9,"digest":"md5-aUfY83/u0Ht9AJyGju8shQ==","length":21939,"stub":true},"images/dropdown.png":{"content_type":"image/png","revpos":9,"digest":"md5-4y026o8F3nvm4ajtsMFxqw==","length":260,"stub":true},".DS_Store":{"content_type":"","revpos":19,"digest":"md5-vJGxoJdOqZSBLyhMV0QLtA==","length":6148,"stub":true},"style/fileuploader.css":{"content_type":"text/css","revpos":9,"digest":"md5-59d179amWBTA5bvOdfRA7A==","length":1471,"stub":true},"script/polymaps-couchbb.min.js":{"content_type":"application/javascript","revpos":19,"digest":"md5-I+LRq+gawtniNck0ZeuniQ==","length":32554,"stub":true},"index.html":{"content_type":"text/html","revpos":19,"digest":"md5-HhnP9//8rdMt5uEBW63kSA==","length":1293,"stub":true},"script/map.js":{"content_type":"application/javascript","revpos":19,"digest":"md5-sJEc1gfyuVgTYdEBUO40Cg==","length":7579,"stub":true},"style/stylesheet_ie_lte_7.css":{"content_type":"text/css","revpos":9,"digest":"md5-7U3mYDIbfiZSyq5sxtHUKQ==","length":129,"stub":true},"README.md":{"content_type":"","revpos":9,"digest":"md5-gFnNBYnEHZmxAuc1AnhVgg==","length":71,"stub":true},"images/ajax-loader.gif":{"content_type":"image/gif","revpos":9,"digest":"md5-OUuvw8xN+zoO5IwfVGaVOQ==","length":2608,"stub":true}}}