Adds d3.js -- http://mbostock.github.com/d3
authordsc <dsc@less.ly>
Wed, 22 Feb 2012 23:19:23 +0000 (15:19 -0800)
committerdsc <dsc@less.ly>
Wed, 22 Feb 2012 23:19:23 +0000 (15:19 -0800)
593 files changed:
static/vendor/d3 [new symlink]
static/vendor/d3-2.7.5/.gitignore [new file with mode: 0644]
static/vendor/d3-2.7.5/.gitmodules [new file with mode: 0644]
static/vendor/d3-2.7.5/.npmignore [new file with mode: 0644]
static/vendor/d3-2.7.5/LICENSE [new file with mode: 0644]
static/vendor/d3-2.7.5/Makefile [new file with mode: 0644]
static/vendor/d3-2.7.5/README.md [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.chart.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.chart.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.csv.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.csv.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.geo.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.geo.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.geom.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.geom.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.layout.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.layout.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.time.js [new file with mode: 0644]
static/vendor/d3-2.7.5/d3.time.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/albers/albers.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/area/area-radial.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/area/area.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/axis/axis-alternating.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/axis/axis-ggplot2.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/axis/axis-multiples.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/axis/axis-orientations.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/axis/axis-transition.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/azimuthal/azimuthal.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/azimuthal/azimuthal.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/azimuthal/azimuthal.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bar/bar-hierarchy.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bar/bar.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bar/sample-data.csv [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bonne/bonne.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/box/box.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/box/box.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/box/box.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/brush/brush-ordinal.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/brush/brush-x.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/brush/brush-y.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/brush/brush.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bubble/bubble.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bubble/bubble.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bubble/bubble.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bullet/bullet.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bullet/bullet.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bullet/bullet.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bullet/bullets.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bundle/bundle-radial.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bundle/bundle-radial.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bundle/bundle-radial.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bundle/bundle-treemap.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bundle/bundle-treemap.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bundle/bundle-treemap.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/bundle/packages.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/button.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/calendar/calendar.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/calendar/dji-area.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/calendar/dji.csv [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/calendar/dji.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/calendar/dji.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/calendar/vix.csv [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/calendar/vix.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/calendar/vix.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cartogram/cartogram.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cartogram/cartogram.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cartogram/cartogram.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cartogram/demers.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cartogram/demers.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cartogram/demers.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cartogram/dorling.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cartogram/dorling.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cartogram/dorling.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/chord/chord-flare.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/chord/chord.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/chord/chord.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/chord/chord.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/choropleth/choropleth-area.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/choropleth/choropleth-bounds.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/choropleth/choropleth.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/choropleth/choropleth.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/choropleth/choropleth.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/choropleth/unemployment.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/clock/clock.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/clock/clock.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/clock/clock.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cluster/cluster-radial.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cluster/cluster-radial.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cluster/cluster.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cluster/cluster.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/cluster/cluster.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/contour/contour.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/crimea/crimea-stacked-area.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/crimea/crimea-stacked-bar.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/crimea/crimea.csv [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/custom/custom.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/README.md [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/faithful.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/flare-imports.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/flare.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/morley.csv [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/sample.csv [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/sample.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/sample.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/sample.txt [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/sample.xml [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/stocks.csv [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/unemployment.csv [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/us-borders.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/us-counties.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/us-state-centroids.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/us-states.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/data/world-countries.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/delaunay/delaunay.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/donut/donut.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/dot/dot.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/drag/drag.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/force/README [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/force/force-bounds.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/force/force-cluster.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/force/force-collapsible.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/force/force-dynamic.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/force/force-map.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/force/force-multi-foci.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/force/force.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/force/force.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/force/force.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/force/miserables.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/great-arc/great-arc.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-data-key.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-data-nested-key.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-data-nested.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-data.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-event.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-node-key.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-order.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-sort.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-transform.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-transition-undefined.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-transition.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/hello-webkit-transition.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/select-enter-add.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hello-world/selectAll-enter-add.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/histogram/histogram.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/horizon/horizon.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/horizon/horizon.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/horizon/horizon.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/horizon/unemployment.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/hull/hull.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/kde/kde.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/kde/kde.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/kde/kde.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/line/line.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/line/line.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/line/line.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/marimekko/marimekko.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/marimekko/marimekko.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/marker/marker.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/mercator/mercator.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/moire/moire.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/node-canvas/us-counties.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/pack/pack.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/pack/pack.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/pack/pack.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/parallel/cars.csv [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/parallel/parallel.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/partition/partition-icicle-zoom.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/partition/partition-icicle.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/partition/partition-sunburst-zoom.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/partition/partition-sunburst.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/partition/partition-sunburst.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/pie/pie-transition.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/pie/pie.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/population/population.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/population/population.csv [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/population/population.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/population/population.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/qq/qq.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/qq/qq.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/qq/qq.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/qq/stats.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/qq/turkers.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/quadtree/quadtree.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/rollup/rollup.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/showreel/showreel.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/sizzle/sizzle.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/sort/sort.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/sort/sort.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/sort/sort.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/spline/spline.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/spline/spline.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/spline/spline.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/splom/flowers.json [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/splom/splom.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/splom/splom.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/splom/splom.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/stream/stack.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/stream/stack.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/stream/stack.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/stream/stream.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/stream/stream.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/stream/stream.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/stream/stream_layers.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/superformula/dot.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/superformula/explorer.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/superformula/superformula.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/superformula/superformula.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/symbol-map/symbol-map.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/touch/touch.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/transform/test.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/transform/transform.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/tree/tree-dynamic.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/tree/tree-interactive.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/tree/tree-radial.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/tree/tree-radial.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/tree/tree.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/tree/tree.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/tree/tree.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/treemap/treemap-svg.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/treemap/treemap-svg.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/treemap/treemap.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/treemap/treemap.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/treemap/treemap.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/voroboids/boid.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/voroboids/voroboids.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/voroboids/voroboids.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/voroboids/voroboids.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/voronoi/voronoi.css [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/voronoi/voronoi.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/voronoi/voronoi.js [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/zoom-pan/zoom-pan-transform.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/zoom-pan/zoom-pan.html [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/zoom/sp500.csv [new file with mode: 0644]
static/vendor/d3-2.7.5/examples/zoom/zoom.html [new file with mode: 0644]
static/vendor/d3-2.7.5/index.js [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/colorbrewer/LICENSE [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/colorbrewer/colorbrewer.css [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/colorbrewer/colorbrewer.js [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/jit/LICENSE [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/jquery-ui/LICENSE [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-bg_flat_10_000000_40x100.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-icons_222222_256x240.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-icons_228ef1_256x240.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-icons_ef8c08_256x240.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-icons_ffd27a_256x240.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/images/ui-icons_ffffff_256x240.png [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/jquery-ui.css [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery-ui/jquery-ui.min.js [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/jquery/LICENSE [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/jquery/jquery.js [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/jquery/jquery.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/polymaps/LICENSE [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/protovis/LICENSE [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/science/LICENSE [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/science/science.js [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/science/science.lin.js [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/science/science.lin.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/science/science.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/science/science.stats.js [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/science/science.stats.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/sizzle/LICENSE [new file with mode: 0644]
static/vendor/d3-2.7.5/lib/sizzle/sizzle.js [new file with mode: 0755]
static/vendor/d3-2.7.5/lib/sizzle/sizzle.min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/package.json [new file with mode: 0644]
static/vendor/d3-2.7.5/src/behavior/behavior.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/behavior/drag.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/behavior/zoom.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/chart/box.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/chart/bullet.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/chart/chart.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/chart/horizon.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/chart/qq.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/compat/date.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/compat/style.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/array.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/ascending.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/bisect.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/collapse.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/core.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/descending.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/dispatch.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/ease.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/entries.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/event.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/extent.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/first.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/format.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/formatPrefix.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/functor.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/hsl.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/html.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/interpolate.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/json.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/keys.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/last.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/max.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/mean.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/median.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/merge.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/min.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/nest.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/noop.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/ns.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/number.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/permute.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/quantile.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/random.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/range.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/rebind.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/requote.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/rgb.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/round.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-append.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-attr.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-call.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-classed.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-data.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-each.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-empty.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-enter-select.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-enter.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-filter.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-html.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-insert.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-map.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-node.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-on.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-order.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-property.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-remove.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-root.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-select.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-selectAll.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-sort.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-style.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-text.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection-transition.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/selection.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/split.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/sum.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/text.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/this.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/timer.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transform.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transition-attr.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transition-delay.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transition-duration.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transition-each.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transition-remove.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transition-select.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transition-selectAll.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transition-style.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transition-text.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transition-transition.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transition.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/transpose.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/uninterpolate.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/values.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/xhr.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/xml.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/core/zip.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/csv/csv.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/csv/format.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/csv/parse.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/end.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/externs.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/albers.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/azimuthal.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/bonne.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/bounds.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/circle.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/equirectangular.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/geo.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/greatArc.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/greatCircle.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/mercator.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/path.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geo/type.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geom/contour.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geom/delaunay.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geom/geom.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geom/hull.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geom/polygon.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geom/quadtree.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/geom/voronoi.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/bundle.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/chord.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/cluster.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/force.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/hierarchy.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/histogram.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/layout.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/pack.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/partition.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/pie.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/stack.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/tree.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/layout/treemap.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/package.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/bilinear.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/category.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/linear.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/log.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/nice.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/ordinal.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/polylinear.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/pow.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/quantile.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/quantize.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/scale.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/scale/sqrt.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/start.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/arc.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/area-radial.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/area.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/axis.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/brush.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/chord.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/diagonal-radial.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/diagonal.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/line-radial.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/line.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/mouse.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/svg.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/symbol.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/svg/touches.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/day.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/days.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/format-iso.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/format-utc.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/format.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/hour.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/hours.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/minute.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/minutes.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/month.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/months.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/range.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/scale-utc.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/scale.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/second.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/seconds.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/time.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/week.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/weeks.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/year.js [new file with mode: 0644]
static/vendor/d3-2.7.5/src/time/years.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/ascending-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/bisect-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/descending-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/dispatch-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/ease-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/entries-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/extent-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/first-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/format-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/formatPrefix-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/functor-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/hsl-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/html-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/interpolate-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/json-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/keys-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/last-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/max-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/mean-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/median-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/merge-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/min-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/nest-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/ns-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/permute-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/quantile-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/range-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/rebind-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/requote-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/rgb-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/round-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/select-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selectAll-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-append-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-attr-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-call-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-classed-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-data-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-each-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-empty-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-filter-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-html-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-insert-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-map-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-node-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-on-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-order-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-property-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-remove-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-select-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-selectAll-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-sort-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-style-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/selection-text-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/split-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/sum-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/text-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/timer-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-attr.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-attrTween.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-call.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-delay.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-duration.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-each.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-id.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-remove.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-select.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-selectAll.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-style.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-styleTween.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-text.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-time.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-transition.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test-tween.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transition-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/transpose-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/values-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/version-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/xhr-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/xml-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/core/zip-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/csv/csv-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/csv/format-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/csv/parse-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/env-assert.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/env-fragment.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/env-xhr.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/env.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/geo/albers-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/geo/azimuthal-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/geo/bonne-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/geo/equirectangular-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/geo/greatArc-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/geo/mercator-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/geo/path-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/geom/polygon-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/layout/cluster-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/layout/hierarchy-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/layout/histogram-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/layout/pack-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/layout/partition-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/layout/pie-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/layout/tree-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/layout/treemap-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/scale/category-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/scale/linear-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/scale/log-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/scale/ordinal-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/scale/pow-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/scale/quantile-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/scale/quantize-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/scale/sqrt-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/svg/arc-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/svg/area-radial-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/svg/area-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/svg/axis-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/svg/line-radial-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/svg/line-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/svg/symbol-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/day-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/days-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/format-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/hour-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/hours-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/minute-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/minutes-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/month-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/months-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/scale-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/second-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/seconds-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/week-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/weeks-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/year-test.js [new file with mode: 0644]
static/vendor/d3-2.7.5/test/time/years-test.js [new file with mode: 0644]

diff --git a/static/vendor/d3 b/static/vendor/d3
new file mode 120000 (symlink)
index 0000000..a92620b
--- /dev/null
@@ -0,0 +1 @@
+d3-2.7.5
\ No newline at end of file
diff --git a/static/vendor/d3-2.7.5/.gitignore b/static/vendor/d3-2.7.5/.gitignore
new file mode 100644 (file)
index 0000000..8cc5a84
--- /dev/null
@@ -0,0 +1,3 @@
+_site
+node_modules
+.DS_Store
diff --git a/static/vendor/d3-2.7.5/.gitmodules b/static/vendor/d3-2.7.5/.gitmodules
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/static/vendor/d3-2.7.5/.npmignore b/static/vendor/d3-2.7.5/.npmignore
new file mode 100644 (file)
index 0000000..146266d
--- /dev/null
@@ -0,0 +1,4 @@
+examples/
+test/
+lib/
+.DS_Store
diff --git a/static/vendor/d3-2.7.5/LICENSE b/static/vendor/d3-2.7.5/LICENSE
new file mode 100644 (file)
index 0000000..f154b09
--- /dev/null
@@ -0,0 +1,26 @@
+Copyright (c) 2010, Michael Bostock
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* The name Michael Bostock may not be used to endorse or promote products
+  derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/static/vendor/d3-2.7.5/Makefile b/static/vendor/d3-2.7.5/Makefile
new file mode 100644 (file)
index 0000000..0667874
--- /dev/null
@@ -0,0 +1,273 @@
+# See the README for installation instructions.
+
+NODE_PATH ?= ./node_modules
+JS_COMPILER = $(NODE_PATH)/uglify-js/bin/uglifyjs
+JS_TESTER = $(NODE_PATH)/vows/bin/vows
+
+JS_FILES = \
+       d3.js \
+       d3.chart.js \
+       d3.layout.js \
+       d3.csv.js \
+       d3.geo.js \
+       d3.geom.js \
+       d3.time.js
+
+all: \
+       $(JS_FILES) \
+       $(JS_FILES:.js=.min.js) \
+       package.json
+
+# Modify this rule to build your own custom release.
+# Run `make d3.custom.min.js` to produce the minified version.
+
+d3.custom.js: \
+       d3.js \
+       d3.layout.js \
+       d3.csv.js \
+       d3.geo.js \
+       d3.geom.js \
+       d3.time.js
+
+.INTERMEDIATE d3.js: \
+       src/start.js \
+       d3.core.js \
+       d3.scale.js \
+       d3.svg.js \
+       d3.behavior.js \
+       src/end.js
+
+d3.core.js: \
+       src/compat/date.js \
+       src/compat/style.js \
+       src/core/core.js \
+       src/core/array.js \
+       src/core/this.js \
+       src/core/functor.js \
+       src/core/rebind.js \
+       src/core/ascending.js \
+       src/core/descending.js \
+       src/core/mean.js \
+       src/core/median.js \
+       src/core/min.js \
+       src/core/max.js \
+       src/core/extent.js \
+       src/core/random.js \
+       src/core/number.js \
+       src/core/sum.js \
+       src/core/quantile.js \
+       src/core/transpose.js \
+       src/core/zip.js \
+       src/core/bisect.js \
+       src/core/first.js \
+       src/core/last.js \
+       src/core/nest.js \
+       src/core/keys.js \
+       src/core/values.js \
+       src/core/entries.js \
+       src/core/permute.js \
+       src/core/merge.js \
+       src/core/split.js \
+       src/core/collapse.js \
+       src/core/range.js \
+       src/core/requote.js \
+       src/core/round.js \
+       src/core/xhr.js \
+       src/core/text.js \
+       src/core/json.js \
+       src/core/html.js \
+       src/core/xml.js \
+       src/core/ns.js \
+       src/core/dispatch.js \
+       src/core/format.js \
+       src/core/formatPrefix.js \
+       src/core/ease.js \
+       src/core/event.js \
+       src/core/interpolate.js \
+       src/core/uninterpolate.js \
+       src/core/rgb.js \
+       src/core/hsl.js \
+       src/core/selection.js \
+       src/core/selection-select.js \
+       src/core/selection-selectAll.js \
+       src/core/selection-attr.js \
+       src/core/selection-classed.js \
+       src/core/selection-style.js \
+       src/core/selection-property.js \
+       src/core/selection-text.js \
+       src/core/selection-html.js \
+       src/core/selection-append.js \
+       src/core/selection-insert.js \
+       src/core/selection-remove.js \
+       src/core/selection-data.js \
+       src/core/selection-filter.js \
+       src/core/selection-map.js \
+       src/core/selection-order.js \
+       src/core/selection-sort.js \
+       src/core/selection-on.js \
+       src/core/selection-each.js \
+       src/core/selection-call.js \
+       src/core/selection-empty.js \
+       src/core/selection-node.js \
+       src/core/selection-transition.js \
+       src/core/selection-root.js \
+       src/core/selection-enter.js \
+       src/core/selection-enter-select.js \
+       src/core/transition.js \
+       src/core/transition-select.js \
+       src/core/transition-selectAll.js \
+       src/core/transition-attr.js \
+       src/core/transition-style.js \
+       src/core/transition-text.js \
+       src/core/transition-remove.js \
+       src/core/transition-delay.js \
+       src/core/transition-duration.js \
+       src/core/transition-each.js \
+       src/core/transition-transition.js \
+       src/core/timer.js \
+       src/core/transform.js \
+       src/core/noop.js
+
+d3.scale.js: \
+       src/scale/scale.js \
+       src/scale/nice.js \
+       src/scale/linear.js \
+       src/scale/bilinear.js \
+       src/scale/polylinear.js \
+       src/scale/log.js \
+       src/scale/pow.js \
+       src/scale/sqrt.js \
+       src/scale/ordinal.js \
+       src/scale/category.js \
+       src/scale/quantile.js \
+       src/scale/quantize.js
+
+d3.svg.js: \
+       src/svg/svg.js \
+       src/svg/arc.js \
+       src/svg/line.js \
+       src/svg/line-radial.js \
+       src/svg/area.js \
+       src/svg/area-radial.js \
+       src/svg/chord.js \
+       src/svg/diagonal.js \
+       src/svg/diagonal-radial.js \
+       src/svg/mouse.js \
+       src/svg/touches.js \
+       src/svg/symbol.js \
+       src/svg/axis.js \
+       src/svg/brush.js
+
+d3.behavior.js: \
+       src/behavior/behavior.js \
+       src/behavior/drag.js \
+       src/behavior/zoom.js
+
+d3.chart.js: \
+       src/start.js \
+       src/chart/chart.js \
+       src/chart/box.js \
+       src/chart/bullet.js \
+       src/chart/horizon.js \
+       src/chart/qq.js \
+       src/end.js
+
+d3.layout.js: \
+       src/start.js \
+       src/layout/layout.js \
+       src/layout/bundle.js \
+       src/layout/chord.js \
+       src/layout/force.js \
+       src/layout/partition.js \
+       src/layout/pie.js \
+       src/layout/stack.js \
+       src/layout/histogram.js \
+       src/layout/hierarchy.js \
+       src/layout/pack.js \
+       src/layout/cluster.js \
+       src/layout/tree.js \
+       src/layout/treemap.js \
+       src/end.js
+
+d3.geo.js: \
+       src/start.js \
+       src/geo/geo.js \
+       src/geo/azimuthal.js \
+       src/geo/albers.js \
+       src/geo/bonne.js \
+       src/geo/equirectangular.js \
+       src/geo/mercator.js \
+       src/geo/type.js \
+       src/geo/path.js \
+       src/geo/bounds.js \
+       src/geo/circle.js \
+       src/geo/greatArc.js \
+       src/geo/greatCircle.js \
+       src/end.js
+
+d3.csv.js: \
+       src/start.js \
+       src/csv/csv.js \
+       src/csv/parse.js \
+       src/csv/format.js \
+       src/end.js
+
+d3.time.js: \
+       src/start.js \
+       src/time/time.js \
+       src/time/format.js \
+       src/time/format-utc.js \
+       src/time/format-iso.js \
+       src/time/range.js \
+       src/time/second.js \
+       src/time/seconds.js \
+       src/time/minute.js \
+       src/time/minutes.js \
+       src/time/hour.js \
+       src/time/hours.js \
+       src/time/day.js \
+       src/time/days.js \
+       src/time/week.js \
+       src/time/weeks.js \
+       src/time/month.js \
+       src/time/months.js \
+       src/time/year.js \
+       src/time/years.js \
+       src/time/scale.js \
+       src/time/scale-utc.js \
+       src/end.js
+
+d3.geom.js: \
+       src/start.js \
+       src/geom/geom.js \
+       src/geom/contour.js \
+       src/geom/hull.js \
+       src/geom/polygon.js \
+       src/geom/voronoi.js \
+       src/geom/delaunay.js \
+       src/geom/quadtree.js \
+       src/end.js
+
+test: all
+       @$(JS_TESTER)
+
+%.min.js: %.js Makefile
+       @rm -f $@
+       $(JS_COMPILER) < $< > $@
+
+d3.%: Makefile
+       @rm -f $@
+       cat $(filter %.js,$^) > $@
+       @chmod a-w $@
+
+install:
+       mkdir -p node_modules
+       npm install
+
+package.json: d3.js src/package.js
+       @rm -f $@
+       node src/package.js > $@
+       @chmod a-w $@
+
+clean:
+       rm -f d3*.js
diff --git a/static/vendor/d3-2.7.5/README.md b/static/vendor/d3-2.7.5/README.md
new file mode 100644 (file)
index 0000000..94cd51a
--- /dev/null
@@ -0,0 +1,51 @@
+# D3
+
+**D3** is a small, free JavaScript library for manipulating HTML documents
+based on data. D3 can help you quickly visualize your data as HTML or SVG,
+handle interactivity, and incorporate smooth transitions and staged animations
+into your pages. You can use D3 as a visualization framework (like Protovis),
+or you can use it to build dynamic pages (like jQuery).
+
+### Browser Support
+
+D3 should work on any browser, with minimal requirements such as JavaScript
+and the [W3C DOM](http://www.w3.org/DOM/) API. By default D3 requires the
+[Selectors API](http://www.w3.org/TR/selectors-api/) Level 1, but you can
+preload [Sizzle](http://sizzlejs.com/) for compatibility with older browsers.
+Some of the included D3 examples use additional browser features, such as
+[SVG](http://www.w3.org/TR/SVG/) and [CSS3
+Transitions](http://www.w3.org/TR/css3-transitions/). These features are not
+required to use D3, but are useful for visualization! D3 is not a
+compatibility layer. The examples should work on Firefox, Chrome (Chromium),
+Safari (WebKit), Opera and IE9.
+
+Note: Chrome has strict permissions for reading files out of the local file
+system. Some examples use AJAX which works differently via HTTP instead of local
+files. For the best experience, load the D3 examples from your own machine via
+HTTP. Any static file web server will work; for example you can run Python's
+built-in server:
+
+    python -m SimpleHTTPServer 8888
+
+Once this is running, go to: <http://localhost:8888/examples/>
+
+### Development Setup
+
+This repository should work out of the box if you just want to create new
+visualizations using D3. On the other hand, if you want to extend D3 with new
+features, fix bugs, or run tests, you'll need to install a few more things.
+
+D3's test framework uses [Vows](http://vowsjs.org), which depends on
+[Node.js](http://nodejs.org/) and [NPM](http://npmjs.org/). If you are
+developing on Mac OS X, an easy way to install Node and NPM is using
+[Homebrew](http://mxcl.github.com/homebrew/):
+
+    brew install node
+    brew install npm
+
+Next, from the root directory of this repository, install D3's dependencies:
+
+    make install
+
+You can see the list of dependencies in package.json. NPM will install the
+packages in the node_modules directory.
diff --git a/static/vendor/d3-2.7.5/d3.chart.js b/static/vendor/d3-2.7.5/d3.chart.js
new file mode 100644 (file)
index 0000000..281d007
--- /dev/null
@@ -0,0 +1,984 @@
+(function(){d3.chart = {};
+// Inspired by http://informationandvisualization.de/blog/box-plot
+d3.chart.box = function() {
+  var width = 1,
+      height = 1,
+      duration = 0,
+      domain = null,
+      value = Number,
+      whiskers = d3_chart_boxWhiskers,
+      quartiles = d3_chart_boxQuartiles,
+      tickFormat = null;
+
+  // For each small multiple…
+  function box(g) {
+    g.each(function(d, i) {
+      d = d.map(value).sort(d3.ascending);
+      var g = d3.select(this),
+          n = d.length,
+          min = d[0],
+          max = d[n - 1];
+
+      // Compute quartiles. Must return exactly 3 elements.
+      var quartileData = d.quartiles = quartiles(d);
+
+      // Compute whiskers. Must return exactly 2 elements, or null.
+      var whiskerIndices = whiskers && whiskers.call(this, d, i),
+          whiskerData = whiskerIndices && whiskerIndices.map(function(i) { return d[i]; });
+
+      // Compute outliers. If no whiskers are specified, all data are "outliers".
+      // We compute the outliers as indices, so that we can join across transitions!
+      var outlierIndices = whiskerIndices
+          ? d3.range(0, whiskerIndices[0]).concat(d3.range(whiskerIndices[1] + 1, n))
+          : d3.range(n);
+
+      // Compute the new x-scale.
+      var x1 = d3.scale.linear()
+          .domain(domain && domain.call(this, d, i) || [min, max])
+          .range([height, 0]);
+
+      // Retrieve the old x-scale, if this is an update.
+      var x0 = this.__chart__ || d3.scale.linear()
+          .domain([0, Infinity])
+          .range(x1.range());
+
+      // Stash the new scale.
+      this.__chart__ = x1;
+
+      // Note: the box, median, and box tick elements are fixed in number,
+      // so we only have to handle enter and update. In contrast, the outliers
+      // and other elements are variable, so we need to exit them! Variable
+      // elements also fade in and out.
+
+      // Update center line: the vertical line spanning the whiskers.
+      var center = g.selectAll("line.center")
+          .data(whiskerData ? [whiskerData] : []);
+
+      center.enter().insert("svg:line", "rect")
+          .attr("class", "center")
+          .attr("x1", width / 2)
+          .attr("y1", function(d) { return x0(d[0]); })
+          .attr("x2", width / 2)
+          .attr("y2", function(d) { return x0(d[1]); })
+          .style("opacity", 1e-6)
+        .transition()
+          .duration(duration)
+          .style("opacity", 1)
+          .attr("y1", function(d) { return x1(d[0]); })
+          .attr("y2", function(d) { return x1(d[1]); });
+
+      center.transition()
+          .duration(duration)
+          .style("opacity", 1)
+          .attr("y1", function(d) { return x1(d[0]); })
+          .attr("y2", function(d) { return x1(d[1]); });
+
+      center.exit().transition()
+          .duration(duration)
+          .style("opacity", 1e-6)
+          .attr("y1", function(d) { return x1(d[0]); })
+          .attr("y2", function(d) { return x1(d[1]); })
+          .remove();
+
+      // Update innerquartile box.
+      var box = g.selectAll("rect.box")
+          .data([quartileData]);
+
+      box.enter().append("svg:rect")
+          .attr("class", "box")
+          .attr("x", 0)
+          .attr("y", function(d) { return x0(d[2]); })
+          .attr("width", width)
+          .attr("height", function(d) { return x0(d[0]) - x0(d[2]); })
+        .transition()
+          .duration(duration)
+          .attr("y", function(d) { return x1(d[2]); })
+          .attr("height", function(d) { return x1(d[0]) - x1(d[2]); });
+
+      box.transition()
+          .duration(duration)
+          .attr("y", function(d) { return x1(d[2]); })
+          .attr("height", function(d) { return x1(d[0]) - x1(d[2]); });
+
+      // Update median line.
+      var medianLine = g.selectAll("line.median")
+          .data([quartileData[1]]);
+
+      medianLine.enter().append("svg:line")
+          .attr("class", "median")
+          .attr("x1", 0)
+          .attr("y1", x0)
+          .attr("x2", width)
+          .attr("y2", x0)
+        .transition()
+          .duration(duration)
+          .attr("y1", x1)
+          .attr("y2", x1);
+
+      medianLine.transition()
+          .duration(duration)
+          .attr("y1", x1)
+          .attr("y2", x1);
+
+      // Update whiskers.
+      var whisker = g.selectAll("line.whisker")
+          .data(whiskerData || []);
+
+      whisker.enter().insert("svg:line", "circle, text")
+          .attr("class", "whisker")
+          .attr("x1", 0)
+          .attr("y1", x0)
+          .attr("x2", width)
+          .attr("y2", x0)
+          .style("opacity", 1e-6)
+        .transition()
+          .duration(duration)
+          .attr("y1", x1)
+          .attr("y2", x1)
+          .style("opacity", 1);
+
+      whisker.transition()
+          .duration(duration)
+          .attr("y1", x1)
+          .attr("y2", x1)
+          .style("opacity", 1);
+
+      whisker.exit().transition()
+          .duration(duration)
+          .attr("y1", x1)
+          .attr("y2", x1)
+          .style("opacity", 1e-6)
+          .remove();
+
+      // Update outliers.
+      var outlier = g.selectAll("circle.outlier")
+          .data(outlierIndices, Number);
+
+      outlier.enter().insert("svg:circle", "text")
+          .attr("class", "outlier")
+          .attr("r", 5)
+          .attr("cx", width / 2)
+          .attr("cy", function(i) { return x0(d[i]); })
+          .style("opacity", 1e-6)
+        .transition()
+          .duration(duration)
+          .attr("cy", function(i) { return x1(d[i]); })
+          .style("opacity", 1);
+
+      outlier.transition()
+          .duration(duration)
+          .attr("cy", function(i) { return x1(d[i]); })
+          .style("opacity", 1);
+
+      outlier.exit().transition()
+          .duration(duration)
+          .attr("cy", function(i) { return x1(d[i]); })
+          .style("opacity", 1e-6)
+          .remove();
+
+      // Compute the tick format.
+      var format = tickFormat || x1.tickFormat(8);
+
+      // Update box ticks.
+      var boxTick = g.selectAll("text.box")
+          .data(quartileData);
+
+      boxTick.enter().append("svg:text")
+          .attr("class", "box")
+          .attr("dy", ".3em")
+          .attr("dx", function(d, i) { return i & 1 ? 6 : -6 })
+          .attr("x", function(d, i) { return i & 1 ? width : 0 })
+          .attr("y", x0)
+          .attr("text-anchor", function(d, i) { return i & 1 ? "start" : "end"; })
+          .text(format)
+        .transition()
+          .duration(duration)
+          .attr("y", x1);
+
+      boxTick.transition()
+          .duration(duration)
+          .text(format)
+          .attr("y", x1);
+
+      // Update whisker ticks. These are handled separately from the box
+      // ticks because they may or may not exist, and we want don't want
+      // to join box ticks pre-transition with whisker ticks post-.
+      var whiskerTick = g.selectAll("text.whisker")
+          .data(whiskerData || []);
+
+      whiskerTick.enter().append("svg:text")
+          .attr("class", "whisker")
+          .attr("dy", ".3em")
+          .attr("dx", 6)
+          .attr("x", width)
+          .attr("y", x0)
+          .text(format)
+          .style("opacity", 1e-6)
+        .transition()
+          .duration(duration)
+          .attr("y", x1)
+          .style("opacity", 1);
+
+      whiskerTick.transition()
+          .duration(duration)
+          .text(format)
+          .attr("y", x1)
+          .style("opacity", 1);
+
+      whiskerTick.exit().transition()
+          .duration(duration)
+          .attr("y", x1)
+          .style("opacity", 1e-6)
+          .remove();
+    });
+    d3.timer.flush();
+  }
+
+  box.width = function(x) {
+    if (!arguments.length) return width;
+    width = x;
+    return box;
+  };
+
+  box.height = function(x) {
+    if (!arguments.length) return height;
+    height = x;
+    return box;
+  };
+
+  box.tickFormat = function(x) {
+    if (!arguments.length) return tickFormat;
+    tickFormat = x;
+    return box;
+  };
+
+  box.duration = function(x) {
+    if (!arguments.length) return duration;
+    duration = x;
+    return box;
+  };
+
+  box.domain = function(x) {
+    if (!arguments.length) return domain;
+    domain = x == null ? x : d3.functor(x);
+    return box;
+  };
+
+  box.value = function(x) {
+    if (!arguments.length) return value;
+    value = x;
+    return box;
+  };
+
+  box.whiskers = function(x) {
+    if (!arguments.length) return whiskers;
+    whiskers = x;
+    return box;
+  };
+
+  box.quartiles = function(x) {
+    if (!arguments.length) return quartiles;
+    quartiles = x;
+    return box;
+  };
+
+  return box;
+};
+
+function d3_chart_boxWhiskers(d) {
+  return [0, d.length - 1];
+}
+
+function d3_chart_boxQuartiles(d) {
+  return [
+    d3.quantile(d, .25),
+    d3.quantile(d, .5),
+    d3.quantile(d, .75)
+  ];
+}
+// Chart design based on the recommendations of Stephen Few. Implementation
+// based on the work of Clint Ivy, Jamie Love, and Jason Davies.
+// http://projects.instantcognition.com/protovis/bulletchart/
+d3.chart.bullet = function() {
+  var orient = "left", // TODO top & bottom
+      reverse = false,
+      duration = 0,
+      ranges = d3_chart_bulletRanges,
+      markers = d3_chart_bulletMarkers,
+      measures = d3_chart_bulletMeasures,
+      width = 380,
+      height = 30,
+      tickFormat = null;
+
+  // For each small multiple…
+  function bullet(g) {
+    g.each(function(d, i) {
+      var rangez = ranges.call(this, d, i).slice().sort(d3.descending),
+          markerz = markers.call(this, d, i).slice().sort(d3.descending),
+          measurez = measures.call(this, d, i).slice().sort(d3.descending),
+          g = d3.select(this);
+
+      // Compute the new x-scale.
+      var x1 = d3.scale.linear()
+          .domain([0, Math.max(rangez[0], markerz[0], measurez[0])])
+          .range(reverse ? [width, 0] : [0, width]);
+
+      // Retrieve the old x-scale, if this is an update.
+      var x0 = this.__chart__ || d3.scale.linear()
+          .domain([0, Infinity])
+          .range(x1.range());
+
+      // Stash the new scale.
+      this.__chart__ = x1;
+
+      // Derive width-scales from the x-scales.
+      var w0 = d3_chart_bulletWidth(x0),
+          w1 = d3_chart_bulletWidth(x1);
+
+      // Update the range rects.
+      var range = g.selectAll("rect.range")
+          .data(rangez);
+
+      range.enter().append("svg:rect")
+          .attr("class", function(d, i) { return "range s" + i; })
+          .attr("width", w0)
+          .attr("height", height)
+          .attr("x", reverse ? x0 : 0)
+        .transition()
+          .duration(duration)
+          .attr("width", w1)
+          .attr("x", reverse ? x1 : 0);
+
+      range.transition()
+          .duration(duration)
+          .attr("x", reverse ? x1 : 0)
+          .attr("width", w1)
+          .attr("height", height);
+
+      // Update the measure rects.
+      var measure = g.selectAll("rect.measure")
+          .data(measurez);
+
+      measure.enter().append("svg:rect")
+          .attr("class", function(d, i) { return "measure s" + i; })
+          .attr("width", w0)
+          .attr("height", height / 3)
+          .attr("x", reverse ? x0 : 0)
+          .attr("y", height / 3)
+        .transition()
+          .duration(duration)
+          .attr("width", w1)
+          .attr("x", reverse ? x1 : 0);
+
+      measure.transition()
+          .duration(duration)
+          .attr("width", w1)
+          .attr("height", height / 3)
+          .attr("x", reverse ? x1 : 0)
+          .attr("y", height / 3);
+
+      // Update the marker lines.
+      var marker = g.selectAll("line.marker")
+          .data(markerz);
+
+      marker.enter().append("svg:line")
+          .attr("class", "marker")
+          .attr("x1", x0)
+          .attr("x2", x0)
+          .attr("y1", height / 6)
+          .attr("y2", height * 5 / 6)
+        .transition()
+          .duration(duration)
+          .attr("x1", x1)
+          .attr("x2", x1);
+
+      marker.transition()
+          .duration(duration)
+          .attr("x1", x1)
+          .attr("x2", x1)
+          .attr("y1", height / 6)
+          .attr("y2", height * 5 / 6);
+
+      // Compute the tick format.
+      var format = tickFormat || x1.tickFormat(8);
+
+      // Update the tick groups.
+      var tick = g.selectAll("g.tick")
+          .data(x1.ticks(8), function(d) {
+            return this.textContent || format(d);
+          });
+
+      // Initialize the ticks with the old scale, x0.
+      var tickEnter = tick.enter().append("svg:g")
+          .attr("class", "tick")
+          .attr("transform", d3_chart_bulletTranslate(x0))
+          .style("opacity", 1e-6);
+
+      tickEnter.append("svg:line")
+          .attr("y1", height)
+          .attr("y2", height * 7 / 6);
+
+      tickEnter.append("svg:text")
+          .attr("text-anchor", "middle")
+          .attr("dy", "1em")
+          .attr("y", height * 7 / 6)
+          .text(format);
+
+      // Transition the entering ticks to the new scale, x1.
+      tickEnter.transition()
+          .duration(duration)
+          .attr("transform", d3_chart_bulletTranslate(x1))
+          .style("opacity", 1);
+
+      // Transition the updating ticks to the new scale, x1.
+      var tickUpdate = tick.transition()
+          .duration(duration)
+          .attr("transform", d3_chart_bulletTranslate(x1))
+          .style("opacity", 1);
+
+      tickUpdate.select("line")
+          .attr("y1", height)
+          .attr("y2", height * 7 / 6);
+
+      tickUpdate.select("text")
+          .attr("y", height * 7 / 6);
+
+      // Transition the exiting ticks to the new scale, x1.
+      tick.exit().transition()
+          .duration(duration)
+          .attr("transform", d3_chart_bulletTranslate(x1))
+          .style("opacity", 1e-6)
+          .remove();
+    });
+    d3.timer.flush();
+  }
+
+  // left, right, top, bottom
+  bullet.orient = function(x) {
+    if (!arguments.length) return orient;
+    orient = x;
+    reverse = orient == "right" || orient == "bottom";
+    return bullet;
+  };
+
+  // ranges (bad, satisfactory, good)
+  bullet.ranges = function(x) {
+    if (!arguments.length) return ranges;
+    ranges = x;
+    return bullet;
+  };
+
+  // markers (previous, goal)
+  bullet.markers = function(x) {
+    if (!arguments.length) return markers;
+    markers = x;
+    return bullet;
+  };
+
+  // measures (actual, forecast)
+  bullet.measures = function(x) {
+    if (!arguments.length) return measures;
+    measures = x;
+    return bullet;
+  };
+
+  bullet.width = function(x) {
+    if (!arguments.length) return width;
+    width = x;
+    return bullet;
+  };
+
+  bullet.height = function(x) {
+    if (!arguments.length) return height;
+    height = x;
+    return bullet;
+  };
+
+  bullet.tickFormat = function(x) {
+    if (!arguments.length) return tickFormat;
+    tickFormat = x;
+    return bullet;
+  };
+
+  bullet.duration = function(x) {
+    if (!arguments.length) return duration;
+    duration = x;
+    return bullet;
+  };
+
+  return bullet;
+};
+
+function d3_chart_bulletRanges(d) {
+  return d.ranges;
+}
+
+function d3_chart_bulletMarkers(d) {
+  return d.markers;
+}
+
+function d3_chart_bulletMeasures(d) {
+  return d.measures;
+}
+
+function d3_chart_bulletTranslate(x) {
+  return function(d) {
+    return "translate(" + x(d) + ",0)";
+  };
+}
+
+function d3_chart_bulletWidth(x) {
+  var x0 = x(0);
+  return function(d) {
+    return Math.abs(x(d) - x0);
+  };
+}
+// Implements a horizon layout, which is a variation of a single-series
+// area chart where the area is folded into multiple bands. Color is used to
+// encode band, allowing the size of the chart to be reduced significantly
+// without impeding readability. This layout algorithm is based on the work of
+// J. Heer, N. Kong and M. Agrawala in "Sizing the Horizon: The Effects of Chart
+// Size and Layering on the Graphical Perception of Time Series Visualizations",
+// CHI 2009. http://hci.stanford.edu/publications/2009/heer-horizon-chi09.pdf
+d3.chart.horizon = function() {
+  var bands = 1, // between 1 and 5, typically
+      mode = "offset", // or mirror
+      interpolate = "linear", // or basis, monotone, step-before, etc.
+      x = d3_chart_horizonX,
+      y = d3_chart_horizonY,
+      w = 960,
+      h = 40,
+      duration = 0;
+
+  var color = d3.scale.linear()
+      .domain([-1, 0, 1])
+      .range(["#d62728", "#fff", "#1f77b4"]);
+
+  // For each small multiple…
+  function horizon(g) {
+    g.each(function(d, i) {
+      var g = d3.select(this),
+          n = 2 * bands + 1,
+          xMin = Infinity,
+          xMax = -Infinity,
+          yMax = -Infinity,
+          x0, // old x-scale
+          y0, // old y-scale
+          id; // unique id for paths
+
+      // Compute x- and y-values along with extents.
+      var data = d.map(function(d, i) {
+        var xv = x.call(this, d, i),
+            yv = y.call(this, d, i);
+        if (xv < xMin) xMin = xv;
+        if (xv > xMax) xMax = xv;
+        if (-yv > yMax) yMax = -yv;
+        if (yv > yMax) yMax = yv;
+        return [xv, yv];
+      });
+
+      // Compute the new x- and y-scales.
+      var x1 = d3.scale.linear().domain([xMin, xMax]).range([0, w]),
+          y1 = d3.scale.linear().domain([0, yMax]).range([0, h * bands]);
+
+      // Retrieve the old scales, if this is an update.
+      if (this.__chart__) {
+        x0 = this.__chart__.x;
+        y0 = this.__chart__.y;
+        id = this.__chart__.id;
+      } else {
+        x0 = d3.scale.linear().domain([0, Infinity]).range(x1.range());
+        y0 = d3.scale.linear().domain([0, Infinity]).range(y1.range());
+        id = ++d3_chart_horizonId;
+      }
+
+      // We'll use a defs to store the area path and the clip path.
+      var defs = g.selectAll("defs")
+          .data([data]);
+
+      var defsEnter = defs.enter().append("svg:defs");
+
+      // The clip path is a simple rect.
+      defsEnter.append("svg:clipPath")
+          .attr("id", "d3_chart_horizon_clip" + id)
+        .append("svg:rect")
+          .attr("width", w)
+          .attr("height", h);
+
+      defs.select("rect").transition()
+          .duration(duration)
+          .attr("width", w)
+          .attr("height", h);
+
+      // The area path is rendered with our resuable d3.svg.area.
+      defsEnter.append("svg:path")
+          .attr("id", "d3_chart_horizon_path" + id)
+          .attr("d", d3_chart_horizonArea
+          .interpolate(interpolate)
+          .x(function(d) { return x0(d[0]); })
+          .y0(h * bands)
+          .y1(function(d) { return h * bands - y0(d[1]); }))
+        .transition()
+          .duration(duration)
+          .attr("d", d3_chart_horizonArea
+          .x(function(d) { return x1(d[0]); })
+          .y1(function(d) { return h * bands - y1(d[1]); }));
+
+      defs.select("path").transition()
+          .duration(duration)
+          .attr("d", d3_chart_horizonArea);
+
+      // We'll use a container to clip all horizon layers at once.
+      g.selectAll("g")
+          .data([null])
+        .enter().append("svg:g")
+          .attr("clip-path", "url(#d3_chart_horizon_clip" + id + ")");
+
+      // Define the transform function based on the mode.
+      var transform = mode == "offset"
+          ? function(d) { return "translate(0," + (d + (d < 0) - bands) * h + ")"; }
+          : function(d) { return (d < 0 ? "scale(1,-1)" : "") + "translate(0," + (d - bands) * h + ")"; };
+
+      // Instantiate each copy of the path with different transforms.
+      var u = g.select("g").selectAll("use")
+          .data(d3.range(-1, -bands - 1, -1).concat(d3.range(1, bands + 1)), Number);
+
+      // TODO don't fudge the enter transition
+      u.enter().append("svg:use")
+          .attr("xlink:href", "#d3_chart_horizon_path" + id)
+          .attr("transform", function(d) { return transform(d + (d > 0 ? 1 : -1)); })
+          .style("fill", color)
+        .transition()
+          .duration(duration)
+          .attr("transform", transform);
+
+      u.transition()
+          .duration(duration)
+          .attr("transform", transform)
+          .style("fill", color);
+
+      u.exit().transition()
+          .duration(duration)
+          .attr("transform", transform)
+          .remove();
+
+      // Stash the new scales.
+      this.__chart__ = {x: x1, y: y1, id: id};
+    });
+    d3.timer.flush();
+  }
+
+  horizon.duration = function(x) {
+    if (!arguments.length) return duration;
+    duration = +x;
+    return horizon;
+  };
+
+  horizon.bands = function(x) {
+    if (!arguments.length) return bands;
+    bands = +x;
+    color.domain([-bands, 0, bands]);
+    return horizon;
+  };
+
+  horizon.mode = function(x) {
+    if (!arguments.length) return mode;
+    mode = x + "";
+    return horizon;
+  };
+
+  horizon.colors = function(x) {
+    if (!arguments.length) return color.range();
+    color.range(x);
+    return horizon;
+  };
+
+  horizon.interpolate = function(x) {
+    if (!arguments.length) return interpolate;
+    interpolate = x + "";
+    return horizon;
+  };
+
+  horizon.x = function(z) {
+    if (!arguments.length) return x;
+    x = z;
+    return horizon;
+  };
+
+  horizon.y = function(z) {
+    if (!arguments.length) return y;
+    y = z;
+    return horizon;
+  };
+
+  horizon.width = function(x) {
+    if (!arguments.length) return w;
+    w = +x;
+    return horizon;
+  };
+
+  horizon.height = function(x) {
+    if (!arguments.length) return h;
+    h = +x;
+    return horizon;
+  };
+
+  return horizon;
+};
+
+var d3_chart_horizonArea = d3.svg.area(),
+    d3_chart_horizonId = 0;
+
+function d3_chart_horizonX(d) {
+  return d[0];
+}
+
+function d3_chart_horizonY(d) {
+  return d[1];
+}
+// Based on http://vis.stanford.edu/protovis/ex/qqplot.html
+d3.chart.qq = function() {
+  var width = 1,
+      height = 1,
+      duration = 0,
+      domain = null,
+      tickFormat = null,
+      n = 100,
+      x = d3_chart_qqX,
+      y = d3_chart_qqY;
+
+  // For each small multiple…
+  function qq(g) {
+    g.each(function(d, i) {
+      var g = d3.select(this),
+          qx = d3_chart_qqQuantiles(n, x.call(this, d, i)),
+          qy = d3_chart_qqQuantiles(n, y.call(this, d, i)),
+          xd = domain && domain.call(this, d, i) || [d3.min(qx), d3.max(qx)], // new x-domain
+          yd = domain && domain.call(this, d, i) || [d3.min(qy), d3.max(qy)], // new y-domain
+          x0, // old x-scale
+          y0; // old y-scale
+
+      // Compute the new x-scale.
+      var x1 = d3.scale.linear()
+          .domain(xd)
+          .range([0, width]);
+
+      // Compute the new y-scale.
+      var y1 = d3.scale.linear()
+          .domain(yd)
+          .range([height, 0]);
+
+      // Retrieve the old scales, if this is an update.
+      if (this.__chart__) {
+        x0 = this.__chart__.x;
+        y0 = this.__chart__.y;
+      } else {
+        x0 = d3.scale.linear().domain([0, Infinity]).range(x1.range());
+        y0 = d3.scale.linear().domain([0, Infinity]).range(y1.range());
+      }
+
+      // Stash the new scales.
+      this.__chart__ = {x: x1, y: y1};
+
+      // Update diagonal line.
+      var diagonal = g.selectAll("line.diagonal")
+          .data([null]);
+
+      diagonal.enter().append("svg:line")
+          .attr("class", "diagonal")
+          .attr("x1", x1(yd[0]))
+          .attr("y1", y1(xd[0]))
+          .attr("x2", x1(yd[1]))
+          .attr("y2", y1(xd[1]));
+
+      diagonal.transition()
+          .duration(duration)
+          .attr("x1", x1(yd[0]))
+          .attr("y1", y1(xd[0]))
+          .attr("x2", x1(yd[1]))
+          .attr("y2", y1(xd[1]));
+
+      // Update quantile plots.
+      var circle = g.selectAll("circle")
+          .data(d3.range(n).map(function(i) {
+            return {x: qx[i], y: qy[i]};
+          }));
+
+      circle.enter().append("svg:circle")
+          .attr("class", "quantile")
+          .attr("r", 4.5)
+          .attr("cx", function(d) { return x0(d.x); })
+          .attr("cy", function(d) { return y0(d.y); })
+          .style("opacity", 1e-6)
+        .transition()
+          .duration(duration)
+          .attr("cx", function(d) { return x1(d.x); })
+          .attr("cy", function(d) { return y1(d.y); })
+          .style("opacity", 1);
+
+      circle.transition()
+          .duration(duration)
+          .attr("cx", function(d) { return x1(d.x); })
+          .attr("cy", function(d) { return y1(d.y); })
+          .style("opacity", 1);
+
+      circle.exit().transition()
+          .duration(duration)
+          .attr("cx", function(d) { return x1(d.x); })
+          .attr("cy", function(d) { return y1(d.y); })
+          .style("opacity", 1e-6)
+          .remove();
+
+      var xformat = tickFormat || x1.tickFormat(4),
+          yformat = tickFormat || y1.tickFormat(4),
+          tx = function(d) { return "translate(" + x1(d) + "," + height + ")"; },
+          ty = function(d) { return "translate(0," + y1(d) + ")"; };
+
+      // Update x-ticks.
+      var xtick = g.selectAll("g.x.tick")
+          .data(x1.ticks(4), function(d) {
+            return this.textContent || xformat(d);
+          });
+
+      var xtickEnter = xtick.enter().append("svg:g")
+          .attr("class", "x tick")
+          .attr("transform", function(d) { return "translate(" + x0(d) + "," + height + ")"; })
+          .style("opacity", 1e-6);
+
+      xtickEnter.append("svg:line")
+          .attr("y1", 0)
+          .attr("y2", -6);
+
+      xtickEnter.append("svg:text")
+          .attr("text-anchor", "middle")
+          .attr("dy", "1em")
+          .text(xformat);
+
+      // Transition the entering ticks to the new scale, x1.
+      xtickEnter.transition()
+          .duration(duration)
+          .attr("transform", tx)
+          .style("opacity", 1);
+
+      // Transition the updating ticks to the new scale, x1.
+      xtick.transition()
+          .duration(duration)
+          .attr("transform", tx)
+          .style("opacity", 1);
+
+      // Transition the exiting ticks to the new scale, x1.
+      xtick.exit().transition()
+          .duration(duration)
+          .attr("transform", tx)
+          .style("opacity", 1e-6)
+          .remove();
+
+      // Update ticks.
+      var ytick = g.selectAll("g.y.tick")
+          .data(y1.ticks(4), function(d) {
+            return this.textContent || yformat(d);
+          });
+
+      var ytickEnter = ytick.enter().append("svg:g")
+          .attr("class", "y tick")
+          .attr("transform", function(d) { return "translate(0," + y0(d) + ")"; })
+          .style("opacity", 1e-6);
+
+      ytickEnter.append("svg:line")
+          .attr("x1", 0)
+          .attr("x2", 6);
+
+      ytickEnter.append("svg:text")
+          .attr("text-anchor", "end")
+          .attr("dx", "-.5em")
+          .attr("dy", ".3em")
+          .text(yformat);
+
+      // Transition the entering ticks to the new scale, y1.
+      ytickEnter.transition()
+          .duration(duration)
+          .attr("transform", ty)
+          .style("opacity", 1);
+
+      // Transition the updating ticks to the new scale, y1.
+      ytick.transition()
+          .duration(duration)
+          .attr("transform", ty)
+          .style("opacity", 1);
+
+      // Transition the exiting ticks to the new scale, y1.
+      ytick.exit().transition()
+          .duration(duration)
+          .attr("transform", ty)
+          .style("opacity", 1e-6)
+          .remove();
+    });
+  }
+
+  qq.width = function(x) {
+    if (!arguments.length) return width;
+    width = x;
+    return qq;
+  };
+
+  qq.height = function(x) {
+    if (!arguments.length) return height;
+    height = x;
+    return qq;
+  };
+
+  qq.duration = function(x) {
+    if (!arguments.length) return duration;
+    duration = x;
+    return qq;
+  };
+
+  qq.domain = function(x) {
+    if (!arguments.length) return domain;
+    domain = x == null ? x : d3.functor(x);
+    return qq;
+  };
+
+  qq.count = function(z) {
+    if (!arguments.length) return n;
+    n = z;
+    return qq;
+  };
+
+  qq.x = function(z) {
+    if (!arguments.length) return x;
+    x = z;
+    return qq;
+  };
+
+  qq.y = function(z) {
+    if (!arguments.length) return y;
+    y = z;
+    return qq;
+  };
+
+  qq.tickFormat = function(x) {
+    if (!arguments.length) return tickFormat;
+    tickFormat = x;
+    return qq;
+  };
+
+  return qq;
+};
+
+function d3_chart_qqQuantiles(n, values) {
+  var m = values.length - 1;
+  values = values.slice().sort(d3.ascending);
+  return d3.range(n).map(function(i) {
+    return values[~~(i * m / n)];
+  });
+}
+
+function d3_chart_qqX(d) {
+  return d.x;
+}
+
+function d3_chart_qqY(d) {
+  return d.y;
+}
+})();
diff --git a/static/vendor/d3-2.7.5/d3.chart.min.js b/static/vendor/d3-2.7.5/d3.chart.min.js
new file mode 100644 (file)
index 0000000..464690d
--- /dev/null
@@ -0,0 +1 @@
+(function(){function a(a){return[0,a.length-1]}function b(a){return[d3.quantile(a,.25),d3.quantile(a,.5),d3.quantile(a,.75)]}function c(a){return a.ranges}function d(a){return a.markers}function e(a){return a.measures}function f(a){return function(b){return"translate("+a(b)+",0)"}}function g(a){var b=a(0);return function(c){return Math.abs(a(c)-b)}}function j(a){return a[0]}function k(a){return a[1]}function l(a,b){var c=b.length-1;return b=b.slice().sort(d3.ascending),d3.range(a).map(function(d){return b[~~(d*c/a)]})}function m(a){return a.x}function n(a){return a.y}d3.chart={},d3.chart.box=function(){function k(a){a.each(function(a,b){a=a.map(g).sort(d3.ascending);var k=d3.select(this),l=a.length,m=a[0],n=a[l-1],o=a.quartiles=i(a),p=h&&h.call(this,a,b),q=p&&p.map(function(b){return a[b]}),r=p?d3.range(0,p[0]).concat(d3.range(p[1]+1,l)):d3.range(l),s=d3.scale.linear().domain(f&&f.call(this,a,b)||[m,n]).range([d,0]),t=this.__chart__||d3.scale.linear().domain([0,Infinity]).range(s.range());this.__chart__=s;var u=k.selectAll("line.center").data(q?[q]:[]);u.enter().insert("svg:line","rect").attr("class","center").attr("x1",c/2).attr("y1",function(a){return t(a[0])}).attr("x2",c/2).attr("y2",function(a){return t(a[1])}).style("opacity",1e-6).transition().duration(e).style("opacity",1).attr("y1",function(a){return s(a[0])}).attr("y2",function(a){return s(a[1])}),u.transition().duration(e).style("opacity",1).attr("y1",function(a){return s(a[0])}).attr("y2",function(a){return s(a[1])}),u.exit().transition().duration(e).style("opacity",1e-6).attr("y1",function(a){return s(a[0])}).attr("y2",function(a){return s(a[1])}).remove();var v=k.selectAll("rect.box").data([o]);v.enter().append("svg:rect").attr("class","box").attr("x",0).attr("y",function(a){return t(a[2])}).attr("width",c).attr("height",function(a){return t(a[0])-t(a[2])}).transition().duration(e).attr("y",function(a){return s(a[2])}).attr("height",function(a){return s(a[0])-s(a[2])}),v.transition().duration(e).attr("y",function(a){return s(a[2])}).attr("height",function(a){return s(a[0])-s(a[2])});var w=k.selectAll("line.median").data([o[1]]);w.enter().append("svg:line").attr("class","median").attr("x1",0).attr("y1",t).attr("x2",c).attr("y2",t).transition().duration(e).attr("y1",s).attr("y2",s),w.transition().duration(e).attr("y1",s).attr("y2",s);var x=k.selectAll("line.whisker").data(q||[]);x.enter().insert("svg:line","circle, text").attr("class","whisker").attr("x1",0).attr("y1",t).attr("x2",c).attr("y2",t).style("opacity",1e-6).transition().duration(e).attr("y1",s).attr("y2",s).style("opacity",1),x.transition().duration(e).attr("y1",s).attr("y2",s).style("opacity",1),x.exit().transition().duration(e).attr("y1",s).attr("y2",s).style("opacity",1e-6).remove();var y=k.selectAll("circle.outlier").data(r,Number);y.enter().insert("svg:circle","text").attr("class","outlier").attr("r",5).attr("cx",c/2).attr("cy",function(b){return t(a[b])}).style("opacity",1e-6).transition().duration(e).attr("cy",function(b){return s(a[b])}).style("opacity",1),y.transition().duration(e).attr("cy",function(b){return s(a[b])}).style("opacity",1),y.exit().transition().duration(e).attr("cy",function(b){return s(a[b])}).style("opacity",1e-6).remove();var z=j||s.tickFormat(8),A=k.selectAll("text.box").data(o);A.enter().append("svg:text").attr("class","box").attr("dy",".3em").attr("dx",function(a,b){return b&1?6:-6}).attr("x",function(a,b){return b&1?c:0}).attr("y",t).attr("text-anchor",function(a,b){return b&1?"start":"end"}).text(z).transition().duration(e).attr("y",s),A.transition().duration(e).text(z).attr("y",s);var B=k.selectAll("text.whisker").data(q||[]);B.enter().append("svg:text").attr("class","whisker").attr("dy",".3em").attr("dx",6).attr("x",c).attr("y",t).text(z).style("opacity",1e-6).transition().duration(e).attr("y",s).style("opacity",1),B.transition().duration(e).text(z).attr("y",s).style("opacity",1),B.exit().transition().duration(e).attr("y",s).style("opacity",1e-6).remove()}),d3.timer.flush()}var c=1,d=1,e=0,f=null,g=Number,h=a,i=b,j=null;return k.width=function(a){return arguments.length?(c=a,k):c},k.height=function(a){return arguments.length?(d=a,k):d},k.tickFormat=function(a){return arguments.length?(j=a,k):j},k.duration=function(a){return arguments.length?(e=a,k):e},k.domain=function(a){return arguments.length?(f=a==null?a:d3.functor(a),k):f},k.value=function(a){return arguments.length?(g=a,k):g},k.whiskers=function(a){return arguments.length?(h=a,k):h},k.quartiles=function(a){return arguments.length?(i=a,k):i},k},d3.chart.bullet=function(){function o(a){a.each(function(a,c){var d=i.call(this,a,c).slice().sort(d3.descending),e=j.call(this,a,c).slice().sort(d3.descending),o=k.call(this,a,c).slice().sort(d3.descending),p=d3.select(this),q=d3.scale.linear().domain([0,Math.max(d[0],e[0],o[0])]).range(b?[l,0]:[0,l]),r=this.__chart__||d3.scale.linear().domain([0,Infinity]).range(q.range());this.__chart__=q;var s=g(r),t=g(q),u=p.selectAll("rect.range").data(d);u.enter().append("svg:rect").attr("class",function(a,b){return"range s"+b}).attr("width",s).attr("height",m).attr("x",b?r:0).transition().duration(h).attr("width",t).attr("x",b?q:0),u.transition().duration(h).attr("x",b?q:0).attr("width",t).attr("height",m);var v=p.selectAll("rect.measure").data(o);v.enter().append("svg:rect").attr("class",function(a,b){return"measure s"+b}).attr("width",s).attr("height",m/3).attr("x",b?r:0).attr("y",m/3).transition().duration(h).attr("width",t).attr("x",b?q:0),v.transition().duration(h).attr("width",t).attr("height",m/3).attr("x",b?q:0).attr("y",m/3);var w=p.selectAll("line.marker").data(e);w.enter().append("svg:line").attr("class","marker").attr("x1",r).attr("x2",r).attr("y1",m/6).attr("y2",m*5/6).transition().duration(h).attr("x1",q).attr("x2",q),w.transition().duration(h).attr("x1",q).attr("x2",q).attr("y1",m/6).attr("y2",m*5/6);var x=n||q.tickFormat(8),y=p.selectAll("g.tick").data(q.ticks(8),function(a){return this.textContent||x(a)}),z=y.enter().append("svg:g").attr("class","tick").attr("transform",f(r)).style("opacity",1e-6);z.append("svg:line").attr("y1",m).attr("y2",m*7/6),z.append("svg:text").attr("text-anchor","middle").attr("dy","1em").attr("y",m*7/6).text(x),z.transition().duration(h).attr("transform",f(q)).style("opacity",1);var A=y.transition().duration(h).attr("transform",f(q)).style("opacity",1);A.select("line").attr("y1",m).attr("y2",m*7/6),A.select("text").attr("y",m*7/6),y.exit().transition().duration(h).attr("transform",f(q)).style("opacity",1e-6).remove()}),d3.timer.flush()}var a="left",b=!1,h=0,i=c,j=d,k=e,l=380,m=30,n=null;return o.orient=function(c){return arguments.length?(a=c,b=a=="right"||a=="bottom",o):a},o.ranges=function(a){return arguments.length?(i=a,o):i},o.markers=function(a){return arguments.length?(j=a,o):j},o.measures=function(a){return arguments.length?(k=a,o):k},o.width=function(a){return arguments.length?(l=a,o):l},o.height=function(a){return arguments.length?(m=a,o):m},o.tickFormat=function(a){return arguments.length?(n=a,o):n},o.duration=function(a){return arguments.length?(h=a,o):h},o},d3.chart.horizon=function(){function n(j){j.each(function(j,k){var n=d3.select(this),o=2*a+1,p=Infinity,q=-Infinity,r=-Infinity,s,t,u,v=j.map(function(a,b){var c=d.call(this,a,b),f=e.call(this,a,b);return c<p&&(p=c),c>q&&(q=c),-f>r&&(r=-f),f>r&&(r=f),[c,f]}),z=d3.scale.linear().domain([p,q]).range([0,f]),A=d3.scale.linear().domain([0,r]).range([0,g*a]);this.__chart__?(s=this.__chart__.x,t=this.__chart__.y,u=this.__chart__.id):(s=d3.scale.linear().domain([0,Infinity]).range(z.range()),t=d3.scale.linear().domain([0,Infinity]).range(A.range()),u=++i);var B=n.selectAll("defs").data([v]),C=B.enter().append("svg:defs");C.append("svg:clipPath").attr("id","d3_chart_horizon_clip"+u).append("svg:rect").attr("width",f).attr("height",g),B.select("rect").transition().duration(l).attr("width",f).attr("height",g),C.append("svg:path").attr("id","d3_chart_horizon_path"+u).attr("d",h.interpolate(c).x(function(a){return s(a[0])}).y0(g*a).y1(function(b){return g*a-t(b[1])})).transition().duration(l).attr("d",h.x(function(a){return z(a[0])}).y1(function(b){return g*a-A(b[1])})),B.select("path").transition().duration(l).attr("d",h),n.selectAll("g").data([null]).enter().append("svg:g").attr("clip-path","url(#d3_chart_horizon_clip"+u+")");var D=b=="offset"?function(b){return"translate(0,"+(b+(b<0)-a)*g+")"}:function(b){return(b<0?"scale(1,-1)":"")+"translate(0,"+(b-a)*g+")"},E=n.select("g").selectAll("use").data(d3.range(-1,-a-1,-1).concat(d3.range(1,a+1)),Number);E.enter().append("svg:use").attr("xlink:href","#d3_chart_horizon_path"+u).attr("transform",function(a){return D(a+(a>0?1:-1))}).style("fill",m).transition().duration(l).attr("transform",D),E.transition().duration(l).attr("transform",D).style("fill",m),E.exit().transition().duration(l).attr("transform",D).remove(),this.__chart__={x:z,y:A,id:u}}),d3.timer.flush()}var a=1,b="offset",c="linear",d=j,e=k,f=960,g=40,l=0,m=d3.scale.linear().domain([-1,0,1]).range(["#d62728","#fff","#1f77b4"]);return n.duration=function(a){return arguments.length?(l=+a,n):l},n.bands=function(b){return arguments.length?(a=+b,m.domain([-a,0,a]),n):a},n.mode=function(a){return arguments.length?(b=a+"",n):b},n.colors=function(a){return arguments.length?(m.range(a),n):m.range()},n.interpolate=function(a){return arguments.length?(c=a+"",n):c},n.x=function(a){return arguments.length?(d=a,n):d},n.y=function(a){return arguments.length?(e=a,n):e},n.width=function(a){return arguments.length?(f=+a,n):f},n.height=function(a){return arguments.length?(g=+a,n):g},n};var h=d3.svg.area(),i=0;d3.chart.qq=function(){function i(i){i.each(function(i,j){var k=d3.select(this),m=l(f,g.call(this,i,j)),n=l(f,h.call(this,i,j)),o=d&&d.call(this,i,j)||[d3.min(m),d3.max(m)],p=d&&d.call(this,i,j)||[d3.min(n),d3.max(n)],q,r,s=d3.scale.linear().domain(o).range([0,a]),t=d3.scale.linear().domain(p).range([b,0]);this.__chart__?(q=this.__chart__.x,r=this.__chart__.y):(q=d3.scale.linear().domain([0,Infinity]).range(s.range()),r=d3.scale.linear().domain([0,Infinity]).range(t.range())),this.__chart__={x:s,y:t};var u=k.selectAll("line.diagonal").data([null]);u.enter().append("svg:line").attr("class","diagonal").attr("x1",s(p[0])).attr("y1",t(o[0])).attr("x2",s(p[1])).attr("y2",t(o[1])),u.transition().duration(c).attr("x1",s(p[0])).attr("y1",t(o[0])).attr("x2",s(p[1])).attr("y2",t(o[1]));var v=k.selectAll("circle").data(d3.range(f).map(function(a){return{x:m[a],y:n[a]}}));v.enter().append("svg:circle").attr("class","quantile").attr("r",4.5).attr("cx",function(a){return q(a.x)}).attr("cy",function(a){return r(a.y)}).style("opacity",1e-6).transition().duration(c).attr("cx",function(a){return s(a.x)}).attr("cy",function(a){return t(a.y)}).style("opacity",1),v.transition().duration(c).attr("cx",function(a){return s(a.x)}).attr("cy",function(a){return t(a.y)}).style("opacity",1),v.exit().transition().duration(c).attr("cx",function(a){return s(a.x)}).attr("cy",function(a){return t(a.y)}).style("opacity",1e-6).remove();var w=e||s.tickFormat(4),z=e||t.tickFormat(4),A=function(a){return"translate("+s(a)+","+b+")"},B=function(a){return"translate(0,"+t(a)+")"},C=k.selectAll("g.x.tick").data(s.ticks(4),function(a){return this.textContent||w(a)}),D=C.enter().append("svg:g").attr("class","x tick").attr("transform",function(a){return"translate("+q(a)+","+b+")"}).style("opacity",1e-6);D.append("svg:line").attr("y1",0).attr("y2",-6),D.append("svg:text").attr("text-anchor","middle").attr("dy","1em").text(w),D.transition().duration(c).attr("transform",A).style("opacity",1),C.transition().duration(c).attr("transform",A).style("opacity",1),C.exit().transition().duration(c).attr("transform",A).style("opacity",1e-6).remove();var E=k.selectAll("g.y.tick").data(t.ticks(4),function(a){return this.textContent||z(a)}),F=E.enter().append("svg:g").attr("class","y tick").attr("transform",function(a){return"translate(0,"+r(a)+")"}).style("opacity",1e-6);F.append("svg:line").attr("x1",0).attr("x2",6),F.append("svg:text").attr("text-anchor","end").attr("dx","-.5em").attr("dy",".3em").text(z),F.transition().duration(c).attr("transform",B).style("opacity",1),E.transition().duration(c).attr("transform",B).style("opacity",1),E.exit().transition().duration(c).attr("transform",B).style("opacity",1e-6).remove()})}var a=1,b=1,c=0,d=null,e=null,f=100,g=m,h=n;return i.width=function(b){return arguments.length?(a=b,i):a},i.height=function(a){return arguments.length?(b=a,i):b},i.duration=function(a){return arguments.length?(c=a,i):c},i.domain=function(a){return arguments.length?(d=a==null?a:d3.functor(a),i):d},i.count=function(a){return arguments.length?(f=a,i):f},i.x=function(a){return arguments.length?(g=a,i):g},i.y=function(a){return arguments.length?(h=a,i):h},i.tickFormat=function(a){return arguments.length?(e=a,i):e},i}})();
\ No newline at end of file
diff --git a/static/vendor/d3-2.7.5/d3.csv.js b/static/vendor/d3-2.7.5/d3.csv.js
new file mode 100644 (file)
index 0000000..7565b83
--- /dev/null
@@ -0,0 +1,92 @@
+(function(){d3.csv = function(url, callback) {
+  d3.text(url, "text/csv", function(text) {
+    callback(text && d3.csv.parse(text));
+  });
+};
+d3.csv.parse = function(text) {
+  var header;
+  return d3.csv.parseRows(text, function(row, i) {
+    if (i) {
+      var o = {}, j = -1, m = header.length;
+      while (++j < m) o[header[j]] = row[j];
+      return o;
+    } else {
+      header = row;
+      return null;
+    }
+  });
+};
+
+d3.csv.parseRows = function(text, f) {
+  var EOL = {}, // sentinel value for end-of-line
+      EOF = {}, // sentinel value for end-of-file
+      rows = [], // output rows
+      re = /\r\n|[,\r\n]/g, // field separator regex
+      n = 0, // the current line number
+      t, // the current token
+      eol; // is the current token followed by EOL?
+
+  re.lastIndex = 0; // work-around bug in FF 3.6
+
+  /** @private Returns the next token. */
+  function token() {
+    if (re.lastIndex >= text.length) return EOF; // special case: end of file
+    if (eol) { eol = false; return EOL; } // special case: end of line
+
+    // special case: quotes
+    var j = re.lastIndex;
+    if (text.charCodeAt(j) === 34) {
+      var i = j;
+      while (i++ < text.length) {
+        if (text.charCodeAt(i) === 34) {
+          if (text.charCodeAt(i + 1) !== 34) break;
+          i++;
+        }
+      }
+      re.lastIndex = i + 2;
+      var c = text.charCodeAt(i + 1);
+      if (c === 13) {
+        eol = true;
+        if (text.charCodeAt(i + 2) === 10) re.lastIndex++;
+      } else if (c === 10) {
+        eol = true;
+      }
+      return text.substring(j + 1, i).replace(/""/g, "\"");
+    }
+
+    // common case
+    var m = re.exec(text);
+    if (m) {
+      eol = m[0].charCodeAt(0) !== 44;
+      return text.substring(j, m.index);
+    }
+    re.lastIndex = text.length;
+    return text.substring(j);
+  }
+
+  while ((t = token()) !== EOF) {
+    var a = [];
+    while ((t !== EOL) && (t !== EOF)) {
+      a.push(t);
+      t = token();
+    }
+    if (f && !(a = f(a, n++))) continue;
+    rows.push(a);
+  }
+
+  return rows;
+};
+d3.csv.format = function(rows) {
+  return rows.map(d3_csv_formatRow).join("\n");
+};
+
+function d3_csv_formatRow(row) {
+  return row.map(d3_csv_formatValue).join(",");
+}
+
+function d3_csv_formatValue(text) {
+  return /[",\n]/.test(text)
+      ? "\"" + text.replace(/\"/g, "\"\"") + "\""
+      : text;
+}
+})();
diff --git a/static/vendor/d3-2.7.5/d3.csv.min.js b/static/vendor/d3-2.7.5/d3.csv.min.js
new file mode 100644 (file)
index 0000000..3a384ea
--- /dev/null
@@ -0,0 +1 @@
+(function(){function a(a){return a.map(b).join(",")}function b(a){return/[",\n]/.test(a)?'"'+a.replace(/\"/g,'""')+'"':a}d3.csv=function(a,b){d3.text(a,"text/csv",function(a){b(a&&d3.csv.parse(a))})},d3.csv.parse=function(a){var b;return d3.csv.parseRows(a,function(a,c){if(c){var d={},e=-1,f=b.length;while(++e<f)d[b[e]]=a[e];return d}return b=a,null})},d3.csv.parseRows=function(a,b){function j(){if(f.lastIndex>=a.length)return d;if(i)return i=!1,c;var b=f.lastIndex;if(a.charCodeAt(b)===34){var e=b;while(e++<a.length)if(a.charCodeAt(e)===34){if(a.charCodeAt(e+1)!==34)break;e++}f.lastIndex=e+2;var g=a.charCodeAt(e+1);return g===13?(i=!0,a.charCodeAt(e+2)===10&&f.lastIndex++):g===10&&(i=!0),a.substring(b+1,e).replace(/""/g,'"')}var h=f.exec(a);return h?(i=h[0].charCodeAt(0)!==44,a.substring(b,h.index)):(f.lastIndex=a.length,a.substring(b))}var c={},d={},e=[],f=/\r\n|[,\r\n]/g,g=0,h,i;f.lastIndex=0;while((h=j())!==d){var k=[];while(h!==c&&h!==d)k.push(h),h=j();if(b&&!(k=b(k,g++)))continue;e.push(k)}return e},d3.csv.format=function(b){return b.map(a).join("\n")}})();
\ No newline at end of file
diff --git a/static/vendor/d3-2.7.5/d3.geo.js b/static/vendor/d3-2.7.5/d3.geo.js
new file mode 100644 (file)
index 0000000..2b40252
--- /dev/null
@@ -0,0 +1,938 @@
+(function(){d3.geo = {};
+
+var d3_geo_radians = Math.PI / 180;
+// TODO clip input coordinates on opposite hemisphere
+d3.geo.azimuthal = function() {
+  var mode = "orthographic", // or stereographic, gnomonic, equidistant or equalarea
+      origin,
+      scale = 200,
+      translate = [480, 250],
+      x0,
+      y0,
+      cy0,
+      sy0;
+
+  function azimuthal(coordinates) {
+    var x1 = coordinates[0] * d3_geo_radians - x0,
+        y1 = coordinates[1] * d3_geo_radians,
+        cx1 = Math.cos(x1),
+        sx1 = Math.sin(x1),
+        cy1 = Math.cos(y1),
+        sy1 = Math.sin(y1),
+        cc = mode !== "orthographic" ? sy0 * sy1 + cy0 * cy1 * cx1 : null,
+        c,
+        k = mode === "stereographic" ? 1 / (1 + cc)
+          : mode === "gnomonic" ? 1 / cc
+          : mode === "equidistant" ? (c = Math.acos(cc), c ? c / Math.sin(c) : 0)
+          : mode === "equalarea" ? Math.sqrt(2 / (1 + cc))
+          : 1,
+        x = k * cy1 * sx1,
+        y = k * (sy0 * cy1 * cx1 - cy0 * sy1);
+    return [
+      scale * x + translate[0],
+      scale * y + translate[1]
+    ];
+  }
+
+  azimuthal.invert = function(coordinates) {
+    var x = (coordinates[0] - translate[0]) / scale,
+        y = (coordinates[1] - translate[1]) / scale,
+        p = Math.sqrt(x * x + y * y),
+        c = mode === "stereographic" ? 2 * Math.atan(p)
+          : mode === "gnomonic" ? Math.atan(p)
+          : mode === "equidistant" ? p
+          : mode === "equalarea" ? 2 * Math.asin(.5 * p)
+          : Math.asin(p),
+        sc = Math.sin(c),
+        cc = Math.cos(c);
+    return [
+      (x0 + Math.atan2(x * sc, p * cy0 * cc + y * sy0 * sc)) / d3_geo_radians,
+      Math.asin(cc * sy0 - (p ? (y * sc * cy0) / p : 0)) / d3_geo_radians
+    ];
+  };
+
+  azimuthal.mode = function(x) {
+    if (!arguments.length) return mode;
+    mode = x + "";
+    return azimuthal;
+  };
+
+  azimuthal.origin = function(x) {
+    if (!arguments.length) return origin;
+    origin = x;
+    x0 = origin[0] * d3_geo_radians;
+    y0 = origin[1] * d3_geo_radians;
+    cy0 = Math.cos(y0);
+    sy0 = Math.sin(y0);
+    return azimuthal;
+  };
+
+  azimuthal.scale = function(x) {
+    if (!arguments.length) return scale;
+    scale = +x;
+    return azimuthal;
+  };
+
+  azimuthal.translate = function(x) {
+    if (!arguments.length) return translate;
+    translate = [+x[0], +x[1]];
+    return azimuthal;
+  };
+
+  return azimuthal.origin([0, 0]);
+};
+// Derived from Tom Carden's Albers implementation for Protovis.
+// http://gist.github.com/476238
+// http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html
+
+d3.geo.albers = function() {
+  var origin = [-98, 38],
+      parallels = [29.5, 45.5],
+      scale = 1000,
+      translate = [480, 250],
+      lng0, // d3_geo_radians * origin[0]
+      n,
+      C,
+      p0;
+
+  function albers(coordinates) {
+    var t = n * (d3_geo_radians * coordinates[0] - lng0),
+        p = Math.sqrt(C - 2 * n * Math.sin(d3_geo_radians * coordinates[1])) / n;
+    return [
+      scale * p * Math.sin(t) + translate[0],
+      scale * (p * Math.cos(t) - p0) + translate[1]
+    ];
+  }
+
+  albers.invert = function(coordinates) {
+    var x = (coordinates[0] - translate[0]) / scale,
+        y = (coordinates[1] - translate[1]) / scale,
+        p0y = p0 + y,
+        t = Math.atan2(x, p0y),
+        p = Math.sqrt(x * x + p0y * p0y);
+    return [
+      (lng0 + t / n) / d3_geo_radians,
+      Math.asin((C - p * p * n * n) / (2 * n)) / d3_geo_radians
+    ];
+  };
+
+  function reload() {
+    var phi1 = d3_geo_radians * parallels[0],
+        phi2 = d3_geo_radians * parallels[1],
+        lat0 = d3_geo_radians * origin[1],
+        s = Math.sin(phi1),
+        c = Math.cos(phi1);
+    lng0 = d3_geo_radians * origin[0];
+    n = .5 * (s + Math.sin(phi2));
+    C = c * c + 2 * n * s;
+    p0 = Math.sqrt(C - 2 * n * Math.sin(lat0)) / n;
+    return albers;
+  }
+
+  albers.origin = function(x) {
+    if (!arguments.length) return origin;
+    origin = [+x[0], +x[1]];
+    return reload();
+  };
+
+  albers.parallels = function(x) {
+    if (!arguments.length) return parallels;
+    parallels = [+x[0], +x[1]];
+    return reload();
+  };
+
+  albers.scale = function(x) {
+    if (!arguments.length) return scale;
+    scale = +x;
+    return albers;
+  };
+
+  albers.translate = function(x) {
+    if (!arguments.length) return translate;
+    translate = [+x[0], +x[1]];
+    return albers;
+  };
+
+  return reload();
+};
+
+// A composite projection for the United States, 960x500. The set of standard
+// parallels for each region comes from USGS, which is published here:
+// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
+// TODO allow the composite projection to be rescaled?
+d3.geo.albersUsa = function() {
+  var lower48 = d3.geo.albers();
+
+  var alaska = d3.geo.albers()
+      .origin([-160, 60])
+      .parallels([55, 65]);
+
+  var hawaii = d3.geo.albers()
+      .origin([-160, 20])
+      .parallels([8, 18]);
+
+  var puertoRico = d3.geo.albers()
+      .origin([-60, 10])
+      .parallels([8, 18]);
+
+  function albersUsa(coordinates) {
+    var lon = coordinates[0],
+        lat = coordinates[1];
+    return (lat > 50 ? alaska
+        : lon < -140 ? hawaii
+        : lat < 21 ? puertoRico
+        : lower48)(coordinates);
+  }
+
+  albersUsa.scale = function(x) {
+    if (!arguments.length) return lower48.scale();
+    lower48.scale(x);
+    alaska.scale(x * .6);
+    hawaii.scale(x);
+    puertoRico.scale(x * 1.5);
+    return albersUsa.translate(lower48.translate());
+  };
+
+  albersUsa.translate = function(x) {
+    if (!arguments.length) return lower48.translate();
+    var dz = lower48.scale() / 1000,
+        dx = x[0],
+        dy = x[1];
+    lower48.translate(x);
+    alaska.translate([dx - 400 * dz, dy + 170 * dz]);
+    hawaii.translate([dx - 190 * dz, dy + 200 * dz]);
+    puertoRico.translate([dx + 580 * dz, dy + 430 * dz]);
+    return albersUsa;
+  };
+
+  return albersUsa.scale(lower48.scale());
+};
+d3.geo.bonne = function() {
+  var scale = 200,
+      translate = [480, 250],
+      x0, // origin longitude in radians
+      y0, // origin latitude in radians
+      y1, // parallel latitude in radians
+      c1; // cot(y1)
+
+  function bonne(coordinates) {
+    var x = coordinates[0] * d3_geo_radians - x0,
+        y = coordinates[1] * d3_geo_radians - y0;
+    if (y1) {
+      var p = c1 + y1 - y, E = x * Math.cos(y) / p;
+      x = p * Math.sin(E);
+      y = p * Math.cos(E) - c1;
+    } else {
+      x *= Math.cos(y);
+      y *= -1;
+    }
+    return [
+      scale * x + translate[0],
+      scale * y + translate[1]
+    ];
+  }
+
+  bonne.invert = function(coordinates) {
+    var x = (coordinates[0] - translate[0]) / scale,
+        y = (coordinates[1] - translate[1]) / scale;
+    if (y1) {
+      var c = c1 + y, p = Math.sqrt(x * x + c * c);
+      y = c1 + y1 - p;
+      x = x0 + p * Math.atan2(x, c) / Math.cos(y);
+    } else {
+      y *= -1;
+      x /= Math.cos(y);
+    }
+    return [
+      x / d3_geo_radians,
+      y / d3_geo_radians
+    ];
+  };
+
+  // 90° for Werner, 0° for Sinusoidal
+  bonne.parallel = function(x) {
+    if (!arguments.length) return y1 / d3_geo_radians;
+    c1 = 1 / Math.tan(y1 = x * d3_geo_radians);
+    return bonne;
+  };
+
+  bonne.origin = function(x) {
+    if (!arguments.length) return [x0 / d3_geo_radians, y0 / d3_geo_radians];
+    x0 = x[0] * d3_geo_radians;
+    y0 = x[1] * d3_geo_radians;
+    return bonne;
+  };
+
+  bonne.scale = function(x) {
+    if (!arguments.length) return scale;
+    scale = +x;
+    return bonne;
+  };
+
+  bonne.translate = function(x) {
+    if (!arguments.length) return translate;
+    translate = [+x[0], +x[1]];
+    return bonne;
+  };
+
+  return bonne.origin([0, 0]).parallel(45);
+};
+d3.geo.equirectangular = function() {
+  var scale = 500,
+      translate = [480, 250];
+
+  function equirectangular(coordinates) {
+    var x = coordinates[0] / 360,
+        y = -coordinates[1] / 360;
+    return [
+      scale * x + translate[0],
+      scale * y + translate[1]
+    ];
+  }
+
+  equirectangular.invert = function(coordinates) {
+    var x = (coordinates[0] - translate[0]) / scale,
+        y = (coordinates[1] - translate[1]) / scale;
+    return [
+      360 * x,
+      -360 * y
+    ];
+  };
+
+  equirectangular.scale = function(x) {
+    if (!arguments.length) return scale;
+    scale = +x;
+    return equirectangular;
+  };
+
+  equirectangular.translate = function(x) {
+    if (!arguments.length) return translate;
+    translate = [+x[0], +x[1]];
+    return equirectangular;
+  };
+
+  return equirectangular;
+};
+d3.geo.mercator = function() {
+  var scale = 500,
+      translate = [480, 250];
+
+  function mercator(coordinates) {
+    var x = coordinates[0] / 360,
+        y = -(Math.log(Math.tan(Math.PI / 4 + coordinates[1] * d3_geo_radians / 2)) / d3_geo_radians) / 360;
+    return [
+      scale * x + translate[0],
+      scale * Math.max(-.5, Math.min(.5, y)) + translate[1]
+    ];
+  }
+
+  mercator.invert = function(coordinates) {
+    var x = (coordinates[0] - translate[0]) / scale,
+        y = (coordinates[1] - translate[1]) / scale;
+    return [
+      360 * x,
+      2 * Math.atan(Math.exp(-360 * y * d3_geo_radians)) / d3_geo_radians - 90
+    ];
+  };
+
+  mercator.scale = function(x) {
+    if (!arguments.length) return scale;
+    scale = +x;
+    return mercator;
+  };
+
+  mercator.translate = function(x) {
+    if (!arguments.length) return translate;
+    translate = [+x[0], +x[1]];
+    return mercator;
+  };
+
+  return mercator;
+};
+function d3_geo_type(types, defaultValue) {
+  return function(object) {
+    return object && object.type in types ? types[object.type](object) : defaultValue;
+  };
+}
+/**
+ * Returns a function that, given a GeoJSON object (e.g., a feature), returns
+ * the corresponding SVG path. The function can be customized by overriding the
+ * projection. Point features are mapped to circles with a default radius of
+ * 4.5px; the radius can be specified either as a constant or a function that
+ * is evaluated per object.
+ */
+d3.geo.path = function() {
+  var pointRadius = 4.5,
+      pointCircle = d3_path_circle(pointRadius),
+      projection = d3.geo.albersUsa();
+
+  function path(d, i) {
+    if (typeof pointRadius === "function") {
+      pointCircle = d3_path_circle(pointRadius.apply(this, arguments));
+    }
+    return pathType(d) || null;
+  }
+
+  function project(coordinates) {
+    return projection(coordinates).join(",");
+  }
+
+  var pathType = d3_geo_type({
+
+    FeatureCollection: function(o) {
+      var path = [],
+          features = o.features,
+          i = -1, // features.index
+          n = features.length;
+      while (++i < n) path.push(pathType(features[i].geometry));
+      return path.join("");
+    },
+
+    Feature: function(o) {
+      return pathType(o.geometry);
+    },
+
+    Point: function(o) {
+      return "M" + project(o.coordinates) + pointCircle;
+    },
+
+    MultiPoint: function(o) {
+      var path = [],
+          coordinates = o.coordinates,
+          i = -1, // coordinates.index
+          n = coordinates.length;
+      while (++i < n) path.push("M", project(coordinates[i]), pointCircle);
+      return path.join("");
+    },
+
+    LineString: function(o) {
+      var path = ["M"],
+          coordinates = o.coordinates,
+          i = -1, // coordinates.index
+          n = coordinates.length;
+      while (++i < n) path.push(project(coordinates[i]), "L");
+      path.pop();
+      return path.join("");
+    },
+
+    MultiLineString: function(o) {
+      var path = [],
+          coordinates = o.coordinates,
+          i = -1, // coordinates.index
+          n = coordinates.length,
+          subcoordinates, // coordinates[i]
+          j, // subcoordinates.index
+          m; // subcoordinates.length
+      while (++i < n) {
+        subcoordinates = coordinates[i];
+        j = -1;
+        m = subcoordinates.length;
+        path.push("M");
+        while (++j < m) path.push(project(subcoordinates[j]), "L");
+        path.pop();
+      }
+      return path.join("");
+    },
+
+    Polygon: function(o) {
+      var path = [],
+          coordinates = o.coordinates,
+          i = -1, // coordinates.index
+          n = coordinates.length,
+          subcoordinates, // coordinates[i]
+          j, // subcoordinates.index
+          m; // subcoordinates.length
+      while (++i < n) {
+        subcoordinates = coordinates[i];
+        j = -1;
+        if ((m = subcoordinates.length - 1) > 0) {
+          path.push("M");
+          while (++j < m) path.push(project(subcoordinates[j]), "L");
+          path[path.length - 1] = "Z";
+        }
+      }
+      return path.join("");
+    },
+
+    MultiPolygon: function(o) {
+      var path = [],
+          coordinates = o.coordinates,
+          i = -1, // coordinates index
+          n = coordinates.length,
+          subcoordinates, // coordinates[i]
+          j, // subcoordinates index
+          m, // subcoordinates.length
+          subsubcoordinates, // subcoordinates[j]
+          k, // subsubcoordinates index
+          p; // subsubcoordinates.length
+      while (++i < n) {
+        subcoordinates = coordinates[i];
+        j = -1;
+        m = subcoordinates.length;
+        while (++j < m) {
+          subsubcoordinates = subcoordinates[j];
+          k = -1;
+          if ((p = subsubcoordinates.length - 1) > 0) {
+            path.push("M");
+            while (++k < p) path.push(project(subsubcoordinates[k]), "L");
+            path[path.length - 1] = "Z";
+          }
+        }
+      }
+      return path.join("");
+    },
+
+    GeometryCollection: function(o) {
+      var path = [],
+          geometries = o.geometries,
+          i = -1, // geometries index
+          n = geometries.length;
+      while (++i < n) path.push(pathType(geometries[i]));
+      return path.join("");
+    }
+
+  });
+
+  var areaType = path.area = d3_geo_type({
+
+    FeatureCollection: function(o) {
+      var area = 0,
+          features = o.features,
+          i = -1, // features.index
+          n = features.length;
+      while (++i < n) area += areaType(features[i]);
+      return area;
+    },
+
+    Feature: function(o) {
+      return areaType(o.geometry);
+    },
+
+    Polygon: function(o) {
+      return polygonArea(o.coordinates);
+    },
+
+    MultiPolygon: function(o) {
+      var sum = 0,
+          coordinates = o.coordinates,
+          i = -1, // coordinates index
+          n = coordinates.length;
+      while (++i < n) sum += polygonArea(coordinates[i]);
+      return sum;
+    },
+
+    GeometryCollection: function(o) {
+      var sum = 0,
+          geometries = o.geometries,
+          i = -1, // geometries index
+          n = geometries.length;
+      while (++i < n) sum += areaType(geometries[i]);
+      return sum;
+    }
+
+  }, 0);
+
+  function polygonArea(coordinates) {
+    var sum = area(coordinates[0]), // exterior ring
+        i = 0, // coordinates.index
+        n = coordinates.length;
+    while (++i < n) sum -= area(coordinates[i]); // holes
+    return sum;
+  }
+
+  function polygonCentroid(coordinates) {
+    var polygon = d3.geom.polygon(coordinates[0].map(projection)), // exterior ring
+        area = polygon.area(),
+        centroid = polygon.centroid(area < 0 ? (area *= -1, 1) : -1),
+        x = centroid[0],
+        y = centroid[1],
+        z = area,
+        i = 0, // coordinates index
+        n = coordinates.length;
+    while (++i < n) {
+      polygon = d3.geom.polygon(coordinates[i].map(projection)); // holes
+      area = polygon.area();
+      centroid = polygon.centroid(area < 0 ? (area *= -1, 1) : -1);
+      x -= centroid[0];
+      y -= centroid[1];
+      z -= area;
+    }
+    return [x, y, 6 * z]; // weighted centroid
+  }
+
+  var centroidType = path.centroid = d3_geo_type({
+
+    // TODO FeatureCollection
+    // TODO Point
+    // TODO MultiPoint
+    // TODO LineString
+    // TODO MultiLineString
+    // TODO GeometryCollection
+
+    Feature: function(o) {
+      return centroidType(o.geometry);
+    },
+
+    Polygon: function(o) {
+      var centroid = polygonCentroid(o.coordinates);
+      return [centroid[0] / centroid[2], centroid[1] / centroid[2]];
+    },
+
+    MultiPolygon: function(o) {
+      var area = 0,
+          coordinates = o.coordinates,
+          centroid,
+          x = 0,
+          y = 0,
+          z = 0,
+          i = -1, // coordinates index
+          n = coordinates.length;
+      while (++i < n) {
+        centroid = polygonCentroid(coordinates[i]);
+        x += centroid[0];
+        y += centroid[1];
+        z += centroid[2];
+      }
+      return [x / z, y / z];
+    }
+
+  });
+
+  function area(coordinates) {
+    return Math.abs(d3.geom.polygon(coordinates.map(projection)).area());
+  }
+
+  path.projection = function(x) {
+    projection = x;
+    return path;
+  };
+
+  path.pointRadius = function(x) {
+    if (typeof x === "function") pointRadius = x;
+    else {
+      pointRadius = +x;
+      pointCircle = d3_path_circle(pointRadius);
+    }
+    return path;
+  };
+
+  return path;
+};
+
+function d3_path_circle(radius) {
+  return "m0," + radius
+      + "a" + radius + "," + radius + " 0 1,1 0," + (-2 * radius)
+      + "a" + radius + "," + radius + " 0 1,1 0," + (+2 * radius)
+      + "z";
+}
+/**
+ * Given a GeoJSON object, returns the corresponding bounding box. The bounding
+ * box is represented by a two-dimensional array: [[left, bottom], [right,
+ * top]], where left is the minimum longitude, bottom is the minimum latitude,
+ * right is maximum longitude, and top is the maximum latitude.
+ */
+d3.geo.bounds = function(feature) {
+  var left = Infinity,
+      bottom = Infinity,
+      right = -Infinity,
+      top = -Infinity;
+  d3_geo_bounds(feature, function(x, y) {
+    if (x < left) left = x;
+    if (x > right) right = x;
+    if (y < bottom) bottom = y;
+    if (y > top) top = y;
+  });
+  return [[left, bottom], [right, top]];
+};
+
+function d3_geo_bounds(o, f) {
+  if (o.type in d3_geo_boundsTypes) d3_geo_boundsTypes[o.type](o, f);
+}
+
+var d3_geo_boundsTypes = {
+  Feature: d3_geo_boundsFeature,
+  FeatureCollection: d3_geo_boundsFeatureCollection,
+  GeometryCollection: d3_geo_boundsGeometryCollection,
+  LineString: d3_geo_boundsLineString,
+  MultiLineString: d3_geo_boundsMultiLineString,
+  MultiPoint: d3_geo_boundsLineString,
+  MultiPolygon: d3_geo_boundsMultiPolygon,
+  Point: d3_geo_boundsPoint,
+  Polygon: d3_geo_boundsPolygon
+};
+
+function d3_geo_boundsFeature(o, f) {
+  d3_geo_bounds(o.geometry, f);
+}
+
+function d3_geo_boundsFeatureCollection(o, f) {
+  for (var a = o.features, i = 0, n = a.length; i < n; i++) {
+    d3_geo_bounds(a[i].geometry, f);
+  }
+}
+
+function d3_geo_boundsGeometryCollection(o, f) {
+  for (var a = o.geometries, i = 0, n = a.length; i < n; i++) {
+    d3_geo_bounds(a[i], f);
+  }
+}
+
+function d3_geo_boundsLineString(o, f) {
+  for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
+    f.apply(null, a[i]);
+  }
+}
+
+function d3_geo_boundsMultiLineString(o, f) {
+  for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
+    for (var b = a[i], j = 0, m = b.length; j < m; j++) {
+      f.apply(null, b[j]);
+    }
+  }
+}
+
+function d3_geo_boundsMultiPolygon(o, f) {
+  for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
+    for (var b = a[i][0], j = 0, m = b.length; j < m; j++) {
+      f.apply(null, b[j]);
+    }
+  }
+}
+
+function d3_geo_boundsPoint(o, f) {
+  f.apply(null, o.coordinates);
+}
+
+function d3_geo_boundsPolygon(o, f) {
+  for (var a = o.coordinates[0], i = 0, n = a.length; i < n; i++) {
+    f.apply(null, a[i]);
+  }
+}
+// TODO breakAtDateLine?
+
+d3.geo.circle = function() {
+  var origin = [0, 0],
+      degrees = 90 - 1e-2,
+      radians = degrees * d3_geo_radians,
+      arc = d3.geo.greatArc().target(Object);
+
+  function circle() {
+    // TODO render a circle as a Polygon
+  }
+
+  function visible(point) {
+    return arc.distance(point) < radians;
+  }
+
+  circle.clip = function(d) {
+    arc.source(typeof origin === "function" ? origin.apply(this, arguments) : origin);
+    return clipType(d);
+  };
+
+  var clipType = d3_geo_type({
+
+    FeatureCollection: function(o) {
+      var features = o.features.map(clipType).filter(Object);
+      return features && (o = Object.create(o), o.features = features, o);
+    },
+
+    Feature: function(o) {
+      var geometry = clipType(o.geometry);
+      return geometry && (o = Object.create(o), o.geometry = geometry, o);
+    },
+
+    Point: function(o) {
+      return visible(o.coordinates) && o;
+    },
+
+    MultiPoint: function(o) {
+      var coordinates = o.coordinates.filter(visible);
+      return coordinates.length && {
+        type: o.type,
+        coordinates: coordinates
+      };
+    },
+
+    LineString: function(o) {
+      var coordinates = clip(o.coordinates);
+      return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o);
+    },
+
+    MultiLineString: function(o) {
+      var coordinates = o.coordinates.map(clip).filter(function(d) { return d.length; });
+      return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o);
+    },
+
+    Polygon: function(o) {
+      var coordinates = o.coordinates.map(clip);
+      return coordinates[0].length && (o = Object.create(o), o.coordinates = coordinates, o);
+    },
+
+    MultiPolygon: function(o) {
+      var coordinates = o.coordinates.map(function(d) { return d.map(clip); }).filter(function(d) { return d[0].length; });
+      return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o);
+    },
+
+    GeometryCollection: function(o) {
+      var geometries = o.geometries.map(clipType).filter(Object);
+      return geometries.length && (o = Object.create(o), o.geometries = geometries, o);
+    }
+
+  });
+
+  function clip(coordinates) {
+    var i = -1,
+        n = coordinates.length,
+        clipped = [],
+        p0,
+        p1,
+        p2,
+        d0,
+        d1;
+
+    while (++i < n) {
+      d1 = arc.distance(p2 = coordinates[i]);
+      if (d1 < radians) {
+        if (p1) clipped.push(d3_geo_greatArcInterpolate(p1, p2)((d0 - radians) / (d0 - d1)));
+        clipped.push(p2);
+        p0 = p1 = null;
+      } else {
+        p1 = p2;
+        if (!p0 && clipped.length) {
+          clipped.push(d3_geo_greatArcInterpolate(clipped[clipped.length - 1], p1)((radians - d0) / (d1 - d0)));
+          p0 = p1;
+        }
+      }
+      d0 = d1;
+    }
+
+    if (p1 && clipped.length) {
+      d1 = arc.distance(p2 = clipped[0]);
+      clipped.push(d3_geo_greatArcInterpolate(p1, p2)((d0 - radians) / (d0 - d1)));
+    }
+
+    return resample(clipped);
+  }
+
+  // Resample coordinates, creating great arcs between each.
+  function resample(coordinates) {
+    var i = 0,
+        n = coordinates.length,
+        j,
+        m,
+        resampled = n ? [coordinates[0]] : coordinates,
+        resamples,
+        origin = arc.source();
+
+    while (++i < n) {
+      resamples = arc.source(coordinates[i - 1])(coordinates[i]).coordinates;
+      for (j = 0, m = resamples.length; ++j < m;) resampled.push(resamples[j]);
+    }
+
+    arc.source(origin);
+    return resampled;
+  }
+
+  circle.origin = function(x) {
+    if (!arguments.length) return origin;
+    origin = x;
+    return circle;
+  };
+
+  circle.angle = function(x) {
+    if (!arguments.length) return degrees;
+    radians = (degrees = +x) * d3_geo_radians;
+    return circle;
+  };
+
+  // Precision is specified in degrees.
+  circle.precision = function(x) {
+    if (!arguments.length) return arc.precision();
+    arc.precision(x);
+    return circle;
+  };
+
+  return circle;
+}
+d3.geo.greatArc = function() {
+  var source = d3_geo_greatArcSource,
+      target = d3_geo_greatArcTarget,
+      precision = 6 * d3_geo_radians;
+
+  function greatArc() {
+    var a = typeof source === "function" ? source.apply(this, arguments) : source,
+        b = typeof target === "function" ? target.apply(this, arguments) : target,
+        i = d3_geo_greatArcInterpolate(a, b),
+        dt = precision / i.d,
+        t = 0,
+        coordinates = [a];
+    while ((t += dt) < 1) coordinates.push(i(t));
+    coordinates.push(b);
+    return {
+      type: "LineString",
+      coordinates: coordinates
+    };
+  }
+
+  // Length returned in radians; multiply by radius for distance.
+  greatArc.distance = function() {
+    var a = typeof source === "function" ? source.apply(this, arguments) : source,
+        b = typeof target === "function" ? target.apply(this, arguments) : target;
+     return d3_geo_greatArcInterpolate(a, b).d;
+  };
+
+  greatArc.source = function(x) {
+    if (!arguments.length) return source;
+    source = x;
+    return greatArc;
+  };
+
+  greatArc.target = function(x) {
+    if (!arguments.length) return target;
+    target = x;
+    return greatArc;
+  };
+
+  // Precision is specified in degrees.
+  greatArc.precision = function(x) {
+    if (!arguments.length) return precision / d3_geo_radians;
+    precision = x * d3_geo_radians;
+    return greatArc;
+  };
+
+  return greatArc;
+};
+
+function d3_geo_greatArcSource(d) {
+  return d.source;
+}
+
+function d3_geo_greatArcTarget(d) {
+  return d.target;
+}
+
+function d3_geo_greatArcInterpolate(a, b) {
+  var x0 = a[0] * d3_geo_radians, cx0 = Math.cos(x0), sx0 = Math.sin(x0),
+      y0 = a[1] * d3_geo_radians, cy0 = Math.cos(y0), sy0 = Math.sin(y0),
+      x1 = b[0] * d3_geo_radians, cx1 = Math.cos(x1), sx1 = Math.sin(x1),
+      y1 = b[1] * d3_geo_radians, cy1 = Math.cos(y1), sy1 = Math.sin(y1),
+      d = interpolate.d = Math.acos(Math.max(-1, Math.min(1, sy0 * sy1 + cy0 * cy1 * Math.cos(x1 - x0)))),
+      sd = Math.sin(d);
+
+  // From http://williams.best.vwh.net/avform.htm#Intermediate
+  function interpolate(t) {
+    var A = Math.sin(d - (t *= d)) / sd,
+        B = Math.sin(t) / sd,
+        x = A * cy0 * cx0 + B * cy1 * cx1,
+        y = A * cy0 * sx0 + B * cy1 * sx1,
+        z = A * sy0       + B * sy1;
+    return [
+      Math.atan2(y, x) / d3_geo_radians,
+      Math.atan2(z, Math.sqrt(x * x + y * y)) / d3_geo_radians
+    ];
+  }
+
+  return interpolate;
+}
+d3.geo.greatCircle = d3.geo.circle;
+})();
diff --git a/static/vendor/d3-2.7.5/d3.geo.min.js b/static/vendor/d3-2.7.5/d3.geo.min.js
new file mode 100644 (file)
index 0000000..a4fcd24
--- /dev/null
@@ -0,0 +1 @@
+(function(){function b(a,b){return function(c){return c&&c.type in a?a[c.type](c):b}}function c(a){return"m0,"+a+"a"+a+","+a+" 0 1,1 0,"+ -2*a+"a"+a+","+a+" 0 1,1 0,"+2*a+"z"}function d(a,b){a.type in e&&e[a.type](a,b)}function f(a,b){d(a.geometry,b)}function g(a,b){for(var c=a.features,e=0,f=c.length;e<f;e++)d(c[e].geometry,b)}function h(a,b){for(var c=a.geometries,e=0,f=c.length;e<f;e++)d(c[e],b)}function i(a,b){for(var c=a.coordinates,d=0,e=c.length;d<e;d++)b.apply(null,c[d])}function j(a,b){for(var c=a.coordinates,d=0,e=c.length;d<e;d++)for(var f=c[d],g=0,h=f.length;g<h;g++)b.apply(null,f[g])}function k(a,b){for(var c=a.coordinates,d=0,e=c.length;d<e;d++)for(var f=c[d][0],g=0,h=f.length;g<h;g++)b.apply(null,f[g])}function l(a,b){b.apply(null,a.coordinates)}function m(a,b){for(var c=a.coordinates[0],d=0,e=c.length;d<e;d++)b.apply(null,c[d])}function n(a){return a.source}function o(a){return a.target}function p(b,c){function r(b){var c=Math.sin(p-(b*=p))/q,d=Math.sin(b)/q,g=c*h*e+d*n*k,j=c*h*f+d*n*l,m=c*i+d*o;return[Math.atan2(j,g)/a,Math.atan2(m,Math.sqrt(g*g+j*j))/a]}var d=b[0]*a,e=Math.cos(d),f=Math.sin(d),g=b[1]*a,h=Math.cos(g),i=Math.sin(g),j=c[0]*a,k=Math.cos(j),l=Math.sin(j),m=c[1]*a,n=Math.cos(m),o=Math.sin(m),p=r.d=Math.acos(Math.max(-1,Math.min(1,i*o+h*n*Math.cos(j-d)))),q=Math.sin(p);return r}d3.geo={};var a=Math.PI/180;d3.geo.azimuthal=function(){function j(c){var g=c[0]*a-f,j=c[1]*a,k=Math.cos(g),l=Math.sin(g),m=Math.cos(j),n=Math.sin(j),o=b!=="orthographic"?i*n+h*m*k:null,p,q=b==="stereographic"?1/(1+o):b==="gnomonic"?1/o:b==="equidistant"?(p=Math.acos(o),p?p/Math.sin(p):0):b==="equalarea"?Math.sqrt(2/(1+o)):1,r=q*m*l,s=q*(i*m*k-h*n);return[d*r+e[0],d*s+e[1]]}var b="orthographic",c,d=200,e=[480,250],f,g,h,i;return j.invert=function(c){var g=(c[0]-e[0])/d,j=(c[1]-e[1])/d,k=Math.sqrt(g*g+j*j),l=b==="stereographic"?2*Math.atan(k):b==="gnomonic"?Math.atan(k):b==="equidistant"?k:b==="equalarea"?2*Math.asin(.5*k):Math.asin(k),m=Math.sin(l),n=Math.cos(l);return[(f+Math.atan2(g*m,k*h*n+j*i*m))/a,Math.asin(n*i-(k?j*m*h/k:0))/a]},j.mode=function(a){return arguments.length?(b=a+"",j):b},j.origin=function(b){return arguments.length?(c=b,f=c[0]*a,g=c[1]*a,h=Math.cos(g),i=Math.sin(g),j):c},j.scale=function(a){return arguments.length?(d=+a,j):d},j.translate=function(a){return arguments.length?(e=[+a[0],+a[1]],j):e},j.origin([0,0])},d3.geo.albers=function(){function j(b){var c=g*(a*b[0]-f),j=Math.sqrt(h-2*g*Math.sin(a*b[1]))/g;return[d*j*Math.sin(c)+e[0],d*(j*Math.cos(c)-i)+e[1]]}function k(){var d=a*c[0],e=a*c[1],k=a*b[1],l=Math.sin(d),m=Math.cos(d);return f=a*b[0],g=.5*(l+Math.sin(e)),h=m*m+2*g*l,i=Math.sqrt(h-2*g*Math.sin(k))/g,j}var b=[-98,38],c=[29.5,45.5],d=1e3,e=[480,250],f,g,h,i;return j.invert=function(b){var c=(b[0]-e[0])/d,j=(b[1]-e[1])/d,k=i+j,l=Math.atan2(c,k),m=Math.sqrt(c*c+k*k);return[(f+l/g)/a,Math.asin((h-m*m*g*g)/(2*g))/a]},j.origin=function(a){return arguments.length?(b=[+a[0],+a[1]],k()):b},j.parallels=function(a){return arguments.length?(c=[+a[0],+a[1]],k()):c},j.scale=function(a){return arguments.length?(d=+a,j):d},j.translate=function(a){return arguments.length?(e=[+a[0],+a[1]],j):e},k()},d3.geo.albersUsa=function(){function e(e){var f=e[0],g=e[1];return(g>50?b:f<-140?c:g<21?d:a)(e)}var a=d3.geo.albers(),b=d3.geo.albers().origin([-160,60]).parallels([55,65]),c=d3.geo.albers().origin([-160,20]).parallels([8,18]),d=d3.geo.albers().origin([-60,10]).parallels([8,18]);return e.scale=function(f){return arguments.length?(a.scale(f),b.scale(f*.6),c.scale(f),d.scale(f*1.5),e.translate(a.translate())):a.scale()},e.translate=function(f){if(!arguments.length)return a.translate();var g=a.scale()/1e3,h=f[0],i=f[1];return a.translate(f),b.translate([h-400*g,i+170*g]),c.translate([h-190*g,i+200*g]),d.translate([h+580*g,i+430*g]),e},e.scale(a.scale())},d3.geo.bonne=function(){function h(h){var i=h[0]*a-d,j=h[1]*a-e;if(f){var k=g+f-j,l=i*Math.cos(j)/k;i=k*Math.sin(l),j=k*Math.cos(l)-g}else i*=Math.cos(j),j*=-1;return[b*i+c[0],b*j+c[1]]}var b=200,c=[480,250],d,e,f,g;return h.invert=function(e){var h=(e[0]-c[0])/b,i=(e[1]-c[1])/b;if(f){var j=g+i,k=Math.sqrt(h*h+j*j);i=g+f-k,h=d+k*Math.atan2(h,j)/Math.cos(i)}else i*=-1,h/=Math.cos(i);return[h/a,i/a]},h.parallel=function(b){return arguments.length?(g=1/Math.tan(f=b*a),h):f/a},h.origin=function(b){return arguments.length?(d=b[0]*a,e=b[1]*a,h):[d/a,e/a]},h.scale=function(a){return arguments.length?(b=+a,h):b},h.translate=function(a){return arguments.length?(c=[+a[0],+a[1]],h):c},h.origin([0,0]).parallel(45)},d3.geo.equirectangular=function(){function c(c){var d=c[0]/360,e=-c[1]/360;return[a*d+b[0],a*e+b[1]]}var a=500,b=[480,250];return c.invert=function(c){var d=(c[0]-b[0])/a,e=(c[1]-b[1])/a;return[360*d,-360*e]},c.scale=function(b){return arguments.length?(a=+b,c):a},c.translate=function(a){return arguments.length?(b=[+a[0],+a[1]],c):b},c},d3.geo.mercator=function(){function d(d){var e=d[0]/360,f=-(Math.log(Math.tan(Math.PI/4+d[1]*a/2))/a)/360;return[b*e+c[0],b*Math.max(-0.5,Math.min(.5,f))+c[1]]}var b=500,c=[480,250];return d.invert=function(d){var e=(d[0]-c[0])/b,f=(d[1]-c[1])/b;return[360*e,2*Math.atan(Math.exp(-360*f*a))/a-90]},d.scale=function(a){return arguments.length?(b=+a,d):b},d.translate=function(a){return arguments.length?(c=[+a[0],+a[1]],d):c},d},d3.geo.path=function(){function f(b,e){return typeof a=="function"&&(d=c(a.apply(this,arguments))),h(b)||null}function g(a){return e(a).join(",")}function j(a){var b=m(a[0]),c=0,d=a.length;while(++c<d)b-=m(a[c]);return b}function k(a){var b=d3.geom.polygon(a[0].map(e)),c=b.area(),d=b.centroid(c<0?(c*=-1,1):-1),f=d[0],g=d[1],h=c,i=0,j=a.length;while(++i<j)b=d3.geom.polygon(a[i].map(e)),c=b.area(),d=b.centroid(c<0?(c*=-1,1):-1),f-=d[0],g-=d[1],h-=c;return[f,g,6*h]}function m(a){return Math.abs(d3.geom.polygon(a.map(e)).area())}var a=4.5,d=c(a),e=d3.geo.albersUsa(),h=b({FeatureCollection:function(a){var b=[],c=a.features,d=-1,e=c.length;while(++d<e)b.push(h(c[d].geometry));return b.join("")},Feature:function(a){return h(a.geometry)},Point:function(a){return"M"+g(a.coordinates)+d},MultiPoint:function(a){var b=[],c=a.coordinates,e=-1,f=c.length;while(++e<f)b.push("M",g(c[e]),d);return b.join("")},LineString:function(a){var b=["M"],c=a.coordinates,d=-1,e=c.length;while(++d<e)b.push(g(c[d]),"L");return b.pop(),b.join("")},MultiLineString:function(a){var b=[],c=a.coordinates,d=-1,e=c.length,f,h,i;while(++d<e){f=c[d],h=-1,i=f.length,b.push("M");while(++h<i)b.push(g(f[h]),"L");b.pop()}return b.join("")},Polygon:function(a){var b=[],c=a.coordinates,d=-1,e=c.length,f,h,i;while(++d<e){f=c[d],h=-1;if((i=f.length-1)>0){b.push("M");while(++h<i)b.push(g(f[h]),"L");b[b.length-1]="Z"}}return b.join("")},MultiPolygon:function(a){var b=[],c=a.coordinates,d=-1,e=c.length,f,h,i,j,k,l;while(++d<e){f=c[d],h=-1,i=f.length;while(++h<i){j=f[h],k=-1;if((l=j.length-1)>0){b.push("M");while(++k<l)b.push(g(j[k]),"L");b[b.length-1]="Z"}}}return b.join("")},GeometryCollection:function(a){var b=[],c=a.geometries,d=-1,e=c.length;while(++d<e)b.push(h(c[d]));return b.join("")}}),i=f.area=b({FeatureCollection:function(a){var b=0,c=a.features,d=-1,e=c.length;while(++d<e)b+=i(c[d]);return b},Feature:function(a){return i(a.geometry)},Polygon:function(a){return j(a.coordinates)},MultiPolygon:function(a){var b=0,c=a.coordinates,d=-1,e=c.length;while(++d<e)b+=j(c[d]);return b},GeometryCollection:function(a){var b=0,c=a.geometries,d=-1,e=c.length;while(++d<e)b+=i(c[d]);return b}},0),l=f.centroid=b({Feature:function(a){return l(a.geometry)},Polygon:function(a){var b=k(a.coordinates);return[b[0]/b[2],b[1]/b[2]]},MultiPolygon:function(a){var b=0,c=a.coordinates,d,e=0,f=0,g=0,h=-1,i=c.length;while(++h<i)d=k(c[h]),e+=d[0],f+=d[1],g+=d[2];return[e/g,f/g]}});return f.projection=function(a){return e=a,f},f.pointRadius=function(b){return typeof b=="function"?a=b:(a=+b,d=c(a)),f},f},d3.geo.bounds=function(a){var b=Infinity,c=Infinity,e=-Infinity,f=-Infinity;return d(a,function(a,d){a<b&&(b=a),a>e&&(e=a),d<c&&(c=d),d>f&&(f=d)}),[[b,c],[e,f]]};var e={Feature:f,FeatureCollection:g,GeometryCollection:h,LineString:i,MultiLineString:j,MultiPoint:i,MultiPolygon:k,Point:l,Polygon:m};d3.geo.circle=function(){function g(){}function h(a){return f.distance(a)<e}function j(a){var b=-1,c=a.length,d=[],g,h,i,j,l;while(++b<c)l=f.distance(i=a[b]),l<e?(h&&d.push(p(h,i)((j-e)/(j-l))),d.push(i),g=h=null):(h=i,!g&&d.length&&(d.push(p(d[d.length-1],h)((e-j)/(l-j))),g=h)),j=l;return h&&d.length&&(l=f.distance(i=d[0]),d.push(p(h,i)((j-e)/(j-l)))),k(d)}function k(a){var b=0,c=a.length,d,e,g=c?[a[0]]:a,h,i=f.source();while(++b<c){h=f.source(a[b-1])(a[b]).coordinates;for(d=0,e=h.length;++d<e;)g.push(h[d])}return f.source(i),g}var c=[0,0],d=89.99,e=d*a,f=d3.geo.greatArc().target(Object);g.clip=function(a){return f.source(typeof c=="function"?c.apply(this,arguments):c),i(a)};var i=b({FeatureCollection:function(a){var b=a.features.map(i).filter(Object);return b&&(a=Object.create(a),a.features=b,a)},Feature:function(a){var b=i(a.geometry);return b&&(a=Object.create(a),a.geometry=b,a)},Point:function(a){return h(a.coordinates)&&a},MultiPoint:function(a){var b=a.coordinates.filter(h);return b.length&&{type:a.type,coordinates:b}},LineString:function(a){var b=j(a.coordinates);return b.length&&(a=Object.create(a),a.coordinates=b,a)},MultiLineString:function(a){var b=a.coordinates.map(j).filter(function(a){return a.length});return b.length&&(a=Object.create(a),a.coordinates=b,a)},Polygon:function(a){var b=a.coordinates.map(j);return b[0].length&&(a=Object.create(a),a.coordinates=b,a)},MultiPolygon:function(a){var b=a.coordinates.map(function(a){return a.map(j)}).filter(function(a){return a[0].length});return b.length&&(a=Object.create(a),a.coordinates=b,a)},GeometryCollection:function(a){var b=a.geometries.map(i).filter(Object);return b.length&&(a=Object.create(a),a.geometries=b,a)}});return g.origin=function(a){return arguments.length?(c=a,g):c},g.angle=function(b){return arguments.length?(e=(d=+b)*a,g):d},g.precision=function(a){return arguments.length?(f.precision(a),g):f.precision()},g},d3.geo.greatArc=function(){function e(){var a=typeof b=="function"?b.apply(this,arguments):b,e=typeof c=="function"?c.apply(this,arguments):c,f=p(a,e),g=d/f.d,h=0,i=[a];while((h+=g)<1)i.push(f(h));return i.push(e),{type:"LineString",coordinates:i}}var b=n,c=o,d=6*a;return e.distance=function(){var a=typeof b=="function"?b.apply(this,arguments):b,d=typeof c=="function"?c.apply(this,arguments):c;return p(a,d).d},e.source=function(a){return arguments.length?(b=a,e):b},e.target=function(a){return arguments.length?(c=a,e):c},e.precision=function(b){return arguments.length?(d=b*a,e):d/a},e},d3.geo.greatCircle=d3.geo.circle})();
\ No newline at end of file
diff --git a/static/vendor/d3-2.7.5/d3.geom.js b/static/vendor/d3-2.7.5/d3.geom.js
new file mode 100644 (file)
index 0000000..ba3d22e
--- /dev/null
@@ -0,0 +1,835 @@
+(function(){d3.geom = {};
+/**
+ * Computes a contour for a given input grid function using the <a
+ * href="http://en.wikipedia.org/wiki/Marching_squares">marching
+ * squares</a> algorithm. Returns the contour polygon as an array of points.
+ *
+ * @param grid a two-input function(x, y) that returns true for values
+ * inside the contour and false for values outside the contour.
+ * @param start an optional starting point [x, y] on the grid.
+ * @returns polygon [[x1, y1], [x2, y2], …]
+ */
+d3.geom.contour = function(grid, start) {
+  var s = start || d3_geom_contourStart(grid), // starting point
+      c = [],    // contour polygon
+      x = s[0],  // current x position
+      y = s[1],  // current y position
+      dx = 0,    // next x direction
+      dy = 0,    // next y direction
+      pdx = NaN, // previous x direction
+      pdy = NaN, // previous y direction
+      i = 0;
+
+  do {
+    // determine marching squares index
+    i = 0;
+    if (grid(x-1, y-1)) i += 1;
+    if (grid(x,   y-1)) i += 2;
+    if (grid(x-1, y  )) i += 4;
+    if (grid(x,   y  )) i += 8;
+
+    // determine next direction
+    if (i === 6) {
+      dx = pdy === -1 ? -1 : 1;
+      dy = 0;
+    } else if (i === 9) {
+      dx = 0;
+      dy = pdx === 1 ? -1 : 1;
+    } else {
+      dx = d3_geom_contourDx[i];
+      dy = d3_geom_contourDy[i];
+    }
+
+    // update contour polygon
+    if (dx != pdx && dy != pdy) {
+      c.push([x, y]);
+      pdx = dx;
+      pdy = dy;
+    }
+
+    x += dx;
+    y += dy;
+  } while (s[0] != x || s[1] != y);
+
+  return c;
+};
+
+// lookup tables for marching directions
+var d3_geom_contourDx = [1, 0, 1, 1,-1, 0,-1, 1,0, 0,0,0,-1, 0,-1,NaN],
+    d3_geom_contourDy = [0,-1, 0, 0, 0,-1, 0, 0,1,-1,1,1, 0,-1, 0,NaN];
+
+function d3_geom_contourStart(grid) {
+  var x = 0,
+      y = 0;
+
+  // search for a starting point; begin at origin
+  // and proceed along outward-expanding diagonals
+  while (true) {
+    if (grid(x,y)) {
+      return [x,y];
+    }
+    if (x === 0) {
+      x = y + 1;
+      y = 0;
+    } else {
+      x = x - 1;
+      y = y + 1;
+    }
+  }
+}
+/**
+ * Computes the 2D convex hull of a set of points using Graham's scanning
+ * algorithm. The algorithm has been implemented as described in Cormen,
+ * Leiserson, and Rivest's Introduction to Algorithms. The running time of
+ * this algorithm is O(n log n), where n is the number of input points.
+ *
+ * @param vertices [[x1, y1], [x2, y2], …]
+ * @returns polygon [[x1, y1], [x2, y2], …]
+ */
+d3.geom.hull = function(vertices) {
+  if (vertices.length < 3) return [];
+
+  var len = vertices.length,
+      plen = len - 1,
+      points = [],
+      stack = [],
+      i, j, h = 0, x1, y1, x2, y2, u, v, a, sp;
+
+  // find the starting ref point: leftmost point with the minimum y coord
+  for (i=1; i<len; ++i) {
+    if (vertices[i][1] < vertices[h][1]) {
+      h = i;
+    } else if (vertices[i][1] == vertices[h][1]) {
+      h = (vertices[i][0] < vertices[h][0] ? i : h);
+    }
+  }
+
+  // calculate polar angles from ref point and sort
+  for (i=0; i<len; ++i) {
+    if (i === h) continue;
+    y1 = vertices[i][1] - vertices[h][1];
+    x1 = vertices[i][0] - vertices[h][0];
+    points.push({angle: Math.atan2(y1, x1), index: i});
+  }
+  points.sort(function(a, b) { return a.angle - b.angle; });
+
+  // toss out duplicate angles
+  a = points[0].angle;
+  v = points[0].index;
+  u = 0;
+  for (i=1; i<plen; ++i) {
+    j = points[i].index;
+    if (a == points[i].angle) {
+      // keep angle for point most distant from the reference
+      x1 = vertices[v][0] - vertices[h][0];
+      y1 = vertices[v][1] - vertices[h][1];
+      x2 = vertices[j][0] - vertices[h][0];
+      y2 = vertices[j][1] - vertices[h][1];
+      if ((x1*x1 + y1*y1) >= (x2*x2 + y2*y2)) {
+        points[i].index = -1;
+      } else {
+        points[u].index = -1;
+        a = points[i].angle;
+        u = i;
+        v = j;
+      }
+    } else {
+      a = points[i].angle;
+      u = i;
+      v = j;
+    }
+  }
+
+  // initialize the stack
+  stack.push(h);
+  for (i=0, j=0; i<2; ++j) {
+    if (points[j].index !== -1) {
+      stack.push(points[j].index);
+      i++;
+    }
+  }
+  sp = stack.length;
+
+  // do graham's scan
+  for (; j<plen; ++j) {
+    if (points[j].index === -1) continue; // skip tossed out points
+    while (!d3_geom_hullCCW(stack[sp-2], stack[sp-1], points[j].index, vertices)) {
+      --sp;
+    }
+    stack[sp++] = points[j].index;
+  }
+
+  // construct the hull
+  var poly = [];
+  for (i=0; i<sp; ++i) {
+    poly.push(vertices[stack[i]]);
+  }
+  return poly;
+}
+
+// are three points in counter-clockwise order?
+function d3_geom_hullCCW(i1, i2, i3, v) {
+  var t, a, b, c, d, e, f;
+  t = v[i1]; a = t[0]; b = t[1];
+  t = v[i2]; c = t[0]; d = t[1];
+  t = v[i3]; e = t[0]; f = t[1];
+  return ((f-b)*(c-a) - (d-b)*(e-a)) > 0;
+}
+// Note: requires coordinates to be counterclockwise and convex!
+d3.geom.polygon = function(coordinates) {
+
+  coordinates.area = function() {
+    var i = 0,
+        n = coordinates.length,
+        a = coordinates[n - 1][0] * coordinates[0][1],
+        b = coordinates[n - 1][1] * coordinates[0][0];
+    while (++i < n) {
+      a += coordinates[i - 1][0] * coordinates[i][1];
+      b += coordinates[i - 1][1] * coordinates[i][0];
+    }
+    return (b - a) * .5;
+  };
+
+  coordinates.centroid = function(k) {
+    var i = -1,
+        n = coordinates.length,
+        x = 0,
+        y = 0,
+        a,
+        b = coordinates[n - 1],
+        c;
+    if (!arguments.length) k = -1 / (6 * coordinates.area());
+    while (++i < n) {
+      a = b;
+      b = coordinates[i];
+      c = a[0] * b[1] - b[0] * a[1];
+      x += (a[0] + b[0]) * c;
+      y += (a[1] + b[1]) * c;
+    }
+    return [x * k, y * k];
+  };
+
+  // The Sutherland-Hodgman clipping algorithm.
+  coordinates.clip = function(subject) {
+    var input,
+        i = -1,
+        n = coordinates.length,
+        j,
+        m,
+        a = coordinates[n - 1],
+        b,
+        c,
+        d;
+    while (++i < n) {
+      input = subject.slice();
+      subject.length = 0;
+      b = coordinates[i];
+      c = input[(m = input.length) - 1];
+      j = -1;
+      while (++j < m) {
+        d = input[j];
+        if (d3_geom_polygonInside(d, a, b)) {
+          if (!d3_geom_polygonInside(c, a, b)) {
+            subject.push(d3_geom_polygonIntersect(c, d, a, b));
+          }
+          subject.push(d);
+        } else if (d3_geom_polygonInside(c, a, b)) {
+          subject.push(d3_geom_polygonIntersect(c, d, a, b));
+        }
+        c = d;
+      }
+      a = b;
+    }
+    return subject;
+  };
+
+  return coordinates;
+};
+
+function d3_geom_polygonInside(p, a, b) {
+  return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
+}
+
+// Intersect two infinite lines cd and ab.
+function d3_geom_polygonIntersect(c, d, a, b) {
+  var x1 = c[0], x2 = d[0], x3 = a[0], x4 = b[0],
+      y1 = c[1], y2 = d[1], y3 = a[1], y4 = b[1],
+      x13 = x1 - x3,
+      x21 = x2 - x1,
+      x43 = x4 - x3,
+      y13 = y1 - y3,
+      y21 = y2 - y1,
+      y43 = y4 - y3,
+      ua = (x43 * y13 - y43 * x13) / (y43 * x21 - x43 * y21);
+  return [x1 + ua * x21, y1 + ua * y21];
+}
+// Adapted from Nicolas Garcia Belmonte's JIT implementation:
+// http://blog.thejit.org/2010/02/12/voronoi-tessellation/
+// http://blog.thejit.org/assets/voronoijs/voronoi.js
+// See lib/jit/LICENSE for details.
+
+// Notes:
+//
+// This implementation does not clip the returned polygons, so if you want to
+// clip them to a particular shape you will need to do that either in SVG or by
+// post-processing with d3.geom.polygon's clip method.
+//
+// If any vertices are coincident or have NaN positions, the behavior of this
+// method is undefined. Most likely invalid polygons will be returned. You
+// should filter invalid points, and consolidate coincident points, before
+// computing the tessellation.
+
+/**
+ * @param vertices [[x1, y1], [x2, y2], …]
+ * @returns polygons [[[x1, y1], [x2, y2], …], …]
+ */
+d3.geom.voronoi = function(vertices) {
+  var polygons = vertices.map(function() { return []; });
+
+  d3_voronoi_tessellate(vertices, function(e) {
+    var s1,
+        s2,
+        x1,
+        x2,
+        y1,
+        y2;
+    if (e.a === 1 && e.b >= 0) {
+      s1 = e.ep.r;
+      s2 = e.ep.l;
+    } else {
+      s1 = e.ep.l;
+      s2 = e.ep.r;
+    }
+    if (e.a === 1) {
+      y1 = s1 ? s1.y : -1e6;
+      x1 = e.c - e.b * y1;
+      y2 = s2 ? s2.y : 1e6;
+      x2 = e.c - e.b * y2;
+    } else {
+      x1 = s1 ? s1.x : -1e6;
+      y1 = e.c - e.a * x1;
+      x2 = s2 ? s2.x : 1e6;
+      y2 = e.c - e.a * x2;
+    }
+    var v1 = [x1, y1],
+        v2 = [x2, y2];
+    polygons[e.region.l.index].push(v1, v2);
+    polygons[e.region.r.index].push(v1, v2);
+  });
+
+  // Reconnect the polygon segments into counterclockwise loops.
+  return polygons.map(function(polygon, i) {
+    var cx = vertices[i][0],
+        cy = vertices[i][1];
+    polygon.forEach(function(v) {
+      v.angle = Math.atan2(v[0] - cx, v[1] - cy);
+    });
+    return polygon.sort(function(a, b) {
+      return a.angle - b.angle;
+    }).filter(function(d, i) {
+      return !i || (d.angle - polygon[i - 1].angle > 1e-10);
+    });
+  });
+};
+
+var d3_voronoi_opposite = {"l": "r", "r": "l"};
+
+function d3_voronoi_tessellate(vertices, callback) {
+
+  var Sites = {
+    list: vertices
+      .map(function(v, i) {
+        return {
+          index: i,
+          x: v[0],
+          y: v[1]
+        };
+      })
+      .sort(function(a, b) {
+        return a.y < b.y ? -1
+          : a.y > b.y ? 1
+          : a.x < b.x ? -1
+          : a.x > b.x ? 1
+          : 0;
+      }),
+    bottomSite: null
+  };
+
+  var EdgeList = {
+    list: [],
+    leftEnd: null,
+    rightEnd: null,
+
+    init: function() {
+      EdgeList.leftEnd = EdgeList.createHalfEdge(null, "l");
+      EdgeList.rightEnd = EdgeList.createHalfEdge(null, "l");
+      EdgeList.leftEnd.r = EdgeList.rightEnd;
+      EdgeList.rightEnd.l = EdgeList.leftEnd;
+      EdgeList.list.unshift(EdgeList.leftEnd, EdgeList.rightEnd);
+    },
+
+    createHalfEdge: function(edge, side) {
+      return {
+        edge: edge,
+        side: side,
+        vertex: null,
+        "l": null,
+        "r": null
+      };
+    },
+
+    insert: function(lb, he) {
+      he.l = lb;
+      he.r = lb.r;
+      lb.r.l = he;
+      lb.r = he;
+    },
+
+    leftBound: function(p) {
+      var he = EdgeList.leftEnd;
+      do {
+        he = he.r;
+      } while (he != EdgeList.rightEnd && Geom.rightOf(he, p));
+      he = he.l;
+      return he;
+    },
+
+    del: function(he) {
+      he.l.r = he.r;
+      he.r.l = he.l;
+      he.edge = null;
+    },
+
+    right: function(he) {
+      return he.r;
+    },
+
+    left: function(he) {
+      return he.l;
+    },
+
+    leftRegion: function(he) {
+      return he.edge == null
+          ? Sites.bottomSite
+          : he.edge.region[he.side];
+    },
+
+    rightRegion: function(he) {
+      return he.edge == null
+          ? Sites.bottomSite
+          : he.edge.region[d3_voronoi_opposite[he.side]];
+    }
+  };
+
+  var Geom = {
+
+    bisect: function(s1, s2) {
+      var newEdge = {
+        region: {"l": s1, "r": s2},
+        ep: {"l": null, "r": null}
+      };
+
+      var dx = s2.x - s1.x,
+          dy = s2.y - s1.y,
+          adx = dx > 0 ? dx : -dx,
+          ady = dy > 0 ? dy : -dy;
+
+      newEdge.c = s1.x * dx + s1.y * dy
+          + (dx * dx + dy * dy) * .5;
+
+      if (adx > ady) {
+        newEdge.a = 1;
+        newEdge.b = dy / dx;
+        newEdge.c /= dx;
+      } else {
+        newEdge.b = 1;
+        newEdge.a = dx / dy;
+        newEdge.c /= dy;
+      }
+
+      return newEdge;
+    },
+
+    intersect: function(el1,