You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ga...@apache.org on 2015/10/14 12:54:58 UTC

[28/39] stratos git commit: Deleting old artifacts in stratos-metering-service

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ecd7a08/extensions/das/modules/artifacts/metering-dashboard/capps/stratos-metering-service/GadgetMemberCount_1.0.0/Member_Count/js/vega.js
----------------------------------------------------------------------
diff --git a/extensions/das/modules/artifacts/metering-dashboard/capps/stratos-metering-service/GadgetMemberCount_1.0.0/Member_Count/js/vega.js b/extensions/das/modules/artifacts/metering-dashboard/capps/stratos-metering-service/GadgetMemberCount_1.0.0/Member_Count/js/vega.js
deleted file mode 100644
index cd6eb78..0000000
--- a/extensions/das/modules/artifacts/metering-dashboard/capps/stratos-metering-service/GadgetMemberCount_1.0.0/Member_Count/js/vega.js
+++ /dev/null
@@ -1,8006 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-// Define module using Universal Module Definition pattern
-// https://github.com/umdjs/umd/blob/master/amdWeb.js
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        // Support AMD. Register as an anonymous module.
-        // NOTE: List all dependencies in AMD style
-        define(['d3.min', 'topojson'], factory);
-    } else {
-        // No AMD. Set module as a global variable
-        // NOTE: Pass dependencies to factory function
-        // (assume that both d3 and topojson are also global.)
-        var tj = (typeof topojson === 'undefined') ? null : topojson;
-        vg = factory(d3, tj);
-    }
-}(
-//NOTE: The dependencies are passed to this function
-    function (d3, topojson) {
-//---------------------------------------------------
-// BEGIN code for this module
-//---------------------------------------------------
-
-        var vg = {
-            version: "1.4.3", // semantic versioning
-            d3: d3,      // stash d3 for use in property functions
-            topojson: topojson // stash topojson similarly
-        };
-// type checking functions
-        var toString = Object.prototype.toString;
-
-        vg.isObject = function (obj) {
-            return obj === Object(obj);
-        };
-
-        vg.isFunction = function (obj) {
-            return toString.call(obj) == '[object Function]';
-        };
-
-        vg.isString = function (obj) {
-            return toString.call(obj) == '[object String]';
-        };
-
-        vg.isArray = Array.isArray || function (obj) {
-                return toString.call(obj) == '[object Array]';
-            };
-
-        vg.isNumber = function (obj) {
-            return toString.call(obj) == '[object Number]';
-        };
-
-        vg.isBoolean = function (obj) {
-            return toString.call(obj) == '[object Boolean]';
-        };
-
-        vg.isTree = function (obj) {
-            return obj && obj.__vgtree__;
-        };
-
-        vg.tree = function (obj, children) {
-            var d = [obj];
-            d.__vgtree__ = true;
-            d.children = children || "children";
-            return d;
-        };
-
-        vg.number = function (s) {
-            return +s;
-        };
-
-        vg.boolean = function (s) {
-            return !!s;
-        };
-
-// utility functions
-
-        vg.identity = function (x) {
-            return x;
-        };
-
-        vg.true = function () {
-            return true;
-        };
-
-        vg.extend = function (obj) {
-            for (var x, name, i = 1, len = arguments.length; i < len; ++i) {
-                x = arguments[i];
-                for (name in x) {
-                    obj[name] = x[name];
-                }
-            }
-            return obj;
-        };
-
-        vg.duplicate = function (obj) {
-            return JSON.parse(JSON.stringify(obj));
-        };
-
-        vg.field = function (f) {
-            return f.split("\\.")
-                .map(function (d) {
-                    return d.split(".");
-                })
-                .reduce(function (a, b) {
-                    if (a.length) {
-                        a[a.length - 1] += "." + b.shift();
-                    }
-                    a.push.apply(a, b);
-                    return a;
-                }, []);
-        };
-
-        vg.accessor = function (f) {
-            var s;
-            return (vg.isFunction(f) || f == null)
-                ? f : vg.isString(f) && (s = vg.field(f)).length > 1
-                ? function (x) {
-                return s.reduce(function (x, f) {
-                    return x[f];
-                }, x);
-            }
-                : function (x) {
-                return x[f];
-            };
-        };
-
-        vg.mutator = function (f) {
-            var s;
-            return vg.isString(f) && (s = vg.field(f)).length > 1
-                ? function (x, v) {
-                for (var i = 0; i < s.length - 1; ++i) x = x[s[i]];
-                x[s[i]] = v;
-            }
-                : function (x, v) {
-                x[f] = v;
-            };
-        };
-
-        vg.comparator = function (sort) {
-            var sign = [];
-            if (sort === undefined) sort = [];
-            sort = vg.array(sort).map(function (f) {
-                var s = 1;
-                if (f[0] === "-") {
-                    s = -1;
-                    f = f.slice(1);
-                }
-                else if (f[0] === "+") {
-                    s = +1;
-                    f = f.slice(1);
-                }
-                sign.push(s);
-                return vg.accessor(f);
-            });
-            return function (a, b) {
-                var i, n, f, x, y;
-                for (i = 0, n = sort.length; i < n; ++i) {
-                    f = sort[i];
-                    x = f(a);
-                    y = f(b);
-                    if (x < y) return -1 * sign[i];
-                    if (x > y) return sign[i];
-                }
-                return 0;
-            };
-        };
-
-        vg.cmp = function (a, b) {
-            return a < b ? -1 : a > b ? 1 : 0;
-        };
-
-        vg.numcmp = function (a, b) {
-            return a - b;
-        };
-
-        vg.array = function (x) {
-            return x != null ? (vg.isArray(x) ? x : [x]) : [];
-        };
-
-        vg.values = function (x) {
-            return (vg.isObject(x) && !vg.isArray(x) && x.values) ? x.values : x;
-        };
-
-        vg.str = function (x) {
-            return vg.isArray(x) ? "[" + x.map(vg.str) + "]"
-                : vg.isObject(x) ? JSON.stringify(x)
-                : vg.isString(x) ? ("'" + vg_escape_str(x) + "'") : x;
-        };
-
-        var escape_str_re = /(^|[^\\])'/g;
-
-        function vg_escape_str(x) {
-            return x.replace(escape_str_re, "$1\\'");
-        }
-
-        vg.keys = function (x) {
-            var keys = [];
-            for (var key in x) keys.push(key);
-            return keys;
-        };
-
-        vg.unique = function (data, f, results) {
-            if (!vg.isArray(data) || data.length == 0) return [];
-            f = f || vg.identity;
-            results = results || [];
-            for (var v, i = 0, n = data.length; i < n; ++i) {
-                v = f(data[i]);
-                if (results.indexOf(v) < 0) results.push(v);
-            }
-            return results;
-        };
-
-        vg.minIndex = function (data, f) {
-            if (!vg.isArray(data) || data.length == 0) return -1;
-            f = f || vg.identity;
-            var idx = 0, min = f(data[0]), v = min;
-            for (var i = 1, n = data.length; i < n; ++i) {
-                v = f(data[i]);
-                if (v < min) {
-                    min = v;
-                    idx = i;
-                }
-            }
-            return idx;
-        };
-
-        vg.maxIndex = function (data, f) {
-            if (!vg.isArray(data) || data.length == 0) return -1;
-            f = f || vg.identity;
-            var idx = 0, max = f(data[0]), v = max;
-            for (var i = 1, n = data.length; i < n; ++i) {
-                v = f(data[i]);
-                if (v > max) {
-                    max = v;
-                    idx = i;
-                }
-            }
-            return idx;
-        };
-
-        vg.truncate = function (s, length, pos, word, ellipsis) {
-            var len = s.length;
-            if (len <= length) return s;
-            ellipsis = ellipsis || "...";
-            var l = Math.max(0, length - ellipsis.length);
-
-            switch (pos) {
-                case "left":
-                    return ellipsis + (word ? vg_truncateOnWord(s, l, 1) : s.slice(len - l));
-                case "middle":
-                case "center":
-                    var l1 = Math.ceil(l / 2), l2 = Math.floor(l / 2);
-                    return (word ? vg_truncateOnWord(s, l1) : s.slice(0, l1)) + ellipsis
-                        + (word ? vg_truncateOnWord(s, l2, 1) : s.slice(len - l2));
-                default:
-                    return (word ? vg_truncateOnWord(s, l) : s.slice(0, l)) + ellipsis;
-            }
-        }
-
-        function vg_truncateOnWord(s, len, rev) {
-            var cnt = 0, tok = s.split(vg_truncate_word_re);
-            if (rev) {
-                s = (tok = tok.reverse())
-                    .filter(function (w) {
-                        cnt += w.length;
-                        return cnt <= len;
-                    })
-                    .reverse();
-            } else {
-                s = tok.filter(function (w) {
-                    cnt += w.length;
-                    return cnt <= len;
-                });
-            }
-            return s.length ? s.join("").trim() : tok[0].slice(0, len);
-        }
-
-        var vg_truncate_word_re = /([\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u2028\u2029\u3000\uFEFF])/;
-
-// Logging
-
-        function vg_write(msg) {
-            vg.config.isNode
-                ? process.stderr.write(msg + "\n")
-                : console.log(msg);
-        }
-
-        vg.log = function (msg) {
-            vg_write("[Vega Log] " + msg);
-        };
-
-        vg.error = function (msg) {
-            msg = "[Vega Err] " + msg;
-            vg_write(msg);
-            if (typeof alert !== "undefined") alert(msg);
-        };
-        vg.config = {};
-
-// are we running in node.js?
-// via timetler.com/2012/10/13/environment-detection-in-javascript/
-        vg.config.isNode = typeof exports !== 'undefined' && this.exports !== exports;
-
-// Allows domain restriction when using data loading via XHR.
-// To enable, set it to a list of allowed domains
-// e.g., ['wikipedia.org', 'eff.org']
-        vg.config.domainWhiteList = false;
-
-// If true, disable potentially unsafe transforms (filter, formula)
-// involving possible JavaScript injection attacks.
-        vg.config.safeMode = false;
-
-// base url for loading external data files
-// used only for server-side operation
-        vg.config.baseURL = "";
-
-// version and namepsaces for exported svg
-        vg.config.svgNamespace =
-            'version="1.1" xmlns="http://www.w3.org/2000/svg" ' +
-            'xmlns:xlink="http://www.w3.org/1999/xlink"';
-
-// inset padding for automatic padding calculation
-        vg.config.autopadInset = 5;
-
-// extensible scale lookup table
-// all d3.scale.* instances also supported
-        vg.config.scale = {
-            time: d3.time.scale,
-            utc: d3.time.scale.utc
-        };
-
-// default rendering settings
-        vg.config.render = {
-            lineWidth: 1,
-            lineCap: "butt",
-            font: "sans-serif",
-            fontSize: 11
-        };
-
-// default axis properties
-        vg.config.axis = {
-            orient: "bottom",
-            ticks: 10,
-            padding: 3,
-            axisColor: "#000",
-            gridColor: "#d8d8d8",
-            tickColor: "#000",
-            tickLabelColor: "#000",
-            axisWidth: 1,
-            tickWidth: 1,
-            tickSize: 6,
-            tickLabelFontSize: 11,
-            tickLabelFont: "sans-serif",
-            titleColor: "#000",
-            titleFont: "sans-serif",
-            titleFontSize: 11,
-            titleFontWeight: "bold",
-            titleOffset: 35
-        };
-
-// default legend properties
-        vg.config.legend = {
-            orient: "right",
-            offset: 10,
-            padding: 3,
-            gradientStrokeColor: "#888",
-            gradientStrokeWidth: 1,
-            gradientHeight: 16,
-            gradientWidth: 100,
-            labelColor: "#000",
-            labelFontSize: 10,
-            labelFont: "sans-serif",
-            labelAlign: "left",
-            labelBaseline: "middle",
-            labelOffset: 8,
-            symbolShape: "circle",
-            symbolSize: 50,
-            symbolColor: "#888",
-            symbolStrokeWidth: 1,
-            titleColor: "#000",
-            titleFont: "sans-serif",
-            titleFontSize: 11,
-            titleFontWeight: "bold"
-        };
-
-// default color values
-        vg.config.color = {
-            rgb: [128, 128, 128],
-            lab: [50, 0, 0],
-            hcl: [0, 0, 50],
-            hsl: [0, 0, 0.5]
-        };
-
-// default scale ranges
-        vg.config.range = {
-            category10: [
-                "#1f77b4",
-                "#ff7f0e",
-                "#2ca02c",
-                "#d62728",
-                "#9467bd",
-                "#8c564b",
-                "#e377c2",
-                "#7f7f7f",
-                "#bcbd22",
-                "#17becf"
-            ],
-            category20: [
-                "#1f77b4",
-                "#aec7e8",
-                "#ff7f0e",
-                "#ffbb78",
-                "#2ca02c",
-                "#98df8a",
-                "#d62728",
-                "#ff9896",
-                "#9467bd",
-                "#c5b0d5",
-                "#8c564b",
-                "#c49c94",
-                "#e377c2",
-                "#f7b6d2",
-                "#7f7f7f",
-                "#c7c7c7",
-                "#bcbd22",
-                "#dbdb8d",
-                "#17becf",
-                "#9edae5"
-            ],
-            shapes: [
-                "circle",
-                "cross",
-                "diamond",
-                "square",
-                "triangle-down",
-                "triangle-up"
-            ]
-        };
-        vg.Bounds = (function () {
-            var bounds = function (b) {
-                this.clear();
-                if (b) this.union(b);
-            };
-
-            var prototype = bounds.prototype;
-
-            prototype.clear = function () {
-                this.x1 = +Number.MAX_VALUE;
-                this.y1 = +Number.MAX_VALUE;
-                this.x2 = -Number.MAX_VALUE;
-                this.y2 = -Number.MAX_VALUE;
-                return this;
-            };
-
-            prototype.set = function (x1, y1, x2, y2) {
-                this.x1 = x1;
-                this.y1 = y1;
-                this.x2 = x2;
-                this.y2 = y2;
-                return this;
-            };
-
-            prototype.add = function (x, y) {
-                if (x < this.x1) this.x1 = x;
-                if (y < this.y1) this.y1 = y;
-                if (x > this.x2) this.x2 = x;
-                if (y > this.y2) this.y2 = y;
-                return this;
-            };
-
-            prototype.expand = function (d) {
-                this.x1 -= d;
-                this.y1 -= d;
-                this.x2 += d;
-                this.y2 += d;
-                return this;
-            };
-
-            prototype.round = function () {
-                this.x1 = Math.floor(this.x1);
-                this.y1 = Math.floor(this.y1);
-                this.x2 = Math.ceil(this.x2);
-                this.y2 = Math.ceil(this.y2);
-                return this;
-            };
-
-            prototype.translate = function (dx, dy) {
-                this.x1 += dx;
-                this.x2 += dx;
-                this.y1 += dy;
-                this.y2 += dy;
-                return this;
-            };
-
-            prototype.rotate = function (angle, x, y) {
-                var cos = Math.cos(angle),
-                    sin = Math.sin(angle),
-                    cx = x - x * cos + y * sin,
-                    cy = y - x * sin - y * cos,
-                    x1 = this.x1, x2 = this.x2,
-                    y1 = this.y1, y2 = this.y2;
-
-                return this.clear()
-                    .add(cos * x1 - sin * y1 + cx, sin * x1 + cos * y1 + cy)
-                    .add(cos * x1 - sin * y2 + cx, sin * x1 + cos * y2 + cy)
-                    .add(cos * x2 - sin * y1 + cx, sin * x2 + cos * y1 + cy)
-                    .add(cos * x2 - sin * y2 + cx, sin * x2 + cos * y2 + cy);
-            }
-
-            prototype.union = function (b) {
-                if (b.x1 < this.x1) this.x1 = b.x1;
-                if (b.y1 < this.y1) this.y1 = b.y1;
-                if (b.x2 > this.x2) this.x2 = b.x2;
-                if (b.y2 > this.y2) this.y2 = b.y2;
-                return this;
-            };
-
-            prototype.encloses = function (b) {
-                return b && (
-                        this.x1 <= b.x1 &&
-                        this.x2 >= b.x2 &&
-                        this.y1 <= b.y1 &&
-                        this.y2 >= b.y2
-                    );
-            };
-
-            prototype.intersects = function (b) {
-                return b && !(
-                        this.x2 < b.x1 ||
-                        this.x1 > b.x2 ||
-                        this.y2 < b.y1 ||
-                        this.y1 > b.y2
-                    );
-            };
-
-            prototype.contains = function (x, y) {
-                return !(
-                    x < this.x1 ||
-                    x > this.x2 ||
-                    y < this.y1 ||
-                    y > this.y2
-                );
-            };
-
-            prototype.width = function () {
-                return this.x2 - this.x1;
-            };
-
-            prototype.height = function () {
-                return this.y2 - this.y1;
-            };
-
-            return bounds;
-        })();
-        vg.Gradient = (function () {
-
-            function gradient(type) {
-                this.id = "grad_" + (vg_gradient_id++);
-                this.type = type || "linear";
-                this.stops = [];
-                this.x1 = 0;
-                this.x2 = 1;
-                this.y1 = 0;
-                this.y2 = 0;
-            };
-
-            var prototype = gradient.prototype;
-
-            prototype.stop = function (offset, color) {
-                this.stops.push({
-                    offset: offset,
-                    color: color
-                });
-                return this;
-            };
-
-            return gradient;
-        })();
-
-        var vg_gradient_id = 0;
-        vg.canvas = {};
-        vg.canvas.path = (function () {
-
-            // Path parsing and rendering code taken from fabric.js -- Thanks!
-            var cmdLength = {m: 2, l: 2, h: 1, v: 1, c: 6, s: 4, q: 4, t: 2, a: 7},
-                re = [/([MLHVCSQTAZmlhvcsqtaz])/g, /###/, /(\d)-/g, /\s|,|###/];
-
-            function parse(path) {
-                var result = [],
-                    currentPath,
-                    chunks,
-                    parsed;
-
-                // First, break path into command sequence
-                path = path.slice().replace(re[0], '###$1').split(re[1]).slice(1);
-
-                // Next, parse each command in turn
-                for (var i = 0, j, chunksParsed, len = path.length; i < len; i++) {
-                    currentPath = path[i];
-                    chunks = currentPath.slice(1).trim().replace(re[2], '$1###-').split(re[3]);
-                    chunksParsed = [currentPath.charAt(0)];
-
-                    for (var j = 0, jlen = chunks.length; j < jlen; j++) {
-                        parsed = parseFloat(chunks[j]);
-                        if (!isNaN(parsed)) {
-                            chunksParsed.push(parsed);
-                        }
-                    }
-
-                    var command = chunksParsed[0].toLowerCase(),
-                        commandLength = cmdLength[command];
-
-                    if (chunksParsed.length - 1 > commandLength) {
-                        for (var k = 1, klen = chunksParsed.length; k < klen; k += commandLength) {
-                            result.push([chunksParsed[0]].concat(chunksParsed.slice(k, k + commandLength)));
-                        }
-                    }
-                    else {
-                        result.push(chunksParsed);
-                    }
-                }
-
-                return result;
-            }
-
-            function drawArc(g, x, y, coords, bounds, l, t) {
-                var rx = coords[0];
-                var ry = coords[1];
-                var rot = coords[2];
-                var large = coords[3];
-                var sweep = coords[4];
-                var ex = coords[5];
-                var ey = coords[6];
-                var segs = arcToSegments(ex, ey, rx, ry, large, sweep, rot, x, y);
-                for (var i = 0; i < segs.length; i++) {
-                    var bez = segmentToBezier.apply(null, segs[i]);
-                    g.bezierCurveTo.apply(g, bez);
-                    bounds.add(bez[0] - l, bez[1] - t);
-                    bounds.add(bez[2] - l, bez[3] - t);
-                    bounds.add(bez[4] - l, bez[5] - t);
-                }
-            }
-
-            function boundArc(x, y, coords, bounds) {
-                var rx = coords[0];
-                var ry = coords[1];
-                var rot = coords[2];
-                var large = coords[3];
-                var sweep = coords[4];
-                var ex = coords[5];
-                var ey = coords[6];
-                var segs = arcToSegments(ex, ey, rx, ry, large, sweep, rot, x, y);
-                for (var i = 0; i < segs.length; i++) {
-                    var bez = segmentToBezier.apply(null, segs[i]);
-                    bounds.add(bez[0], bez[1]);
-                    bounds.add(bez[2], bez[3]);
-                    bounds.add(bez[4], bez[5]);
-                }
-            }
-
-            var arcToSegmentsCache = {},
-                segmentToBezierCache = {},
-                join = Array.prototype.join,
-                argsStr;
-
-            // Copied from Inkscape svgtopdf, thanks!
-            function arcToSegments(x, y, rx, ry, large, sweep, rotateX, ox, oy) {
-                argsStr = join.call(arguments);
-                if (arcToSegmentsCache[argsStr]) {
-                    return arcToSegmentsCache[argsStr];
-                }
-
-                var th = rotateX * (Math.PI / 180);
-                var sin_th = Math.sin(th);
-                var cos_th = Math.cos(th);
-                rx = Math.abs(rx);
-                ry = Math.abs(ry);
-                var px = cos_th * (ox - x) * 0.5 + sin_th * (oy - y) * 0.5;
-                var py = cos_th * (oy - y) * 0.5 - sin_th * (ox - x) * 0.5;
-                var pl = (px * px) / (rx * rx) + (py * py) / (ry * ry);
-                if (pl > 1) {
-                    pl = Math.sqrt(pl);
-                    rx *= pl;
-                    ry *= pl;
-                }
-
-                var a00 = cos_th / rx;
-                var a01 = sin_th / rx;
-                var a10 = (-sin_th) / ry;
-                var a11 = (cos_th) / ry;
-                var x0 = a00 * ox + a01 * oy;
-                var y0 = a10 * ox + a11 * oy;
-                var x1 = a00 * x + a01 * y;
-                var y1 = a10 * x + a11 * y;
-
-                var d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0);
-                var sfactor_sq = 1 / d - 0.25;
-                if (sfactor_sq < 0) sfactor_sq = 0;
-                var sfactor = Math.sqrt(sfactor_sq);
-                if (sweep == large) sfactor = -sfactor;
-                var xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0);
-                var yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0);
-
-                var th0 = Math.atan2(y0 - yc, x0 - xc);
-                var th1 = Math.atan2(y1 - yc, x1 - xc);
-
-                var th_arc = th1 - th0;
-                if (th_arc < 0 && sweep == 1) {
-                    th_arc += 2 * Math.PI;
-                } else if (th_arc > 0 && sweep == 0) {
-                    th_arc -= 2 * Math.PI;
-                }
-
-                var segments = Math.ceil(Math.abs(th_arc / (Math.PI * 0.5 + 0.001)));
-                var result = [];
-                for (var i = 0; i < segments; i++) {
-                    var th2 = th0 + i * th_arc / segments;
-                    var th3 = th0 + (i + 1) * th_arc / segments;
-                    result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th];
-                }
-
-                return (arcToSegmentsCache[argsStr] = result);
-            }
-
-            function segmentToBezier(cx, cy, th0, th1, rx, ry, sin_th, cos_th) {
-                argsStr = join.call(arguments);
-                if (segmentToBezierCache[argsStr]) {
-                    return segmentToBezierCache[argsStr];
-                }
-
-                var a00 = cos_th * rx;
-                var a01 = -sin_th * ry;
-                var a10 = sin_th * rx;
-                var a11 = cos_th * ry;
-
-                var cos_th0 = Math.cos(th0);
-                var sin_th0 = Math.sin(th0);
-                var cos_th1 = Math.cos(th1);
-                var sin_th1 = Math.sin(th1);
-
-                var th_half = 0.5 * (th1 - th0);
-                var sin_th_h2 = Math.sin(th_half * 0.5);
-                var t = (8 / 3) * sin_th_h2 * sin_th_h2 / Math.sin(th_half);
-                var x1 = cx + cos_th0 - t * sin_th0;
-                var y1 = cy + sin_th0 + t * cos_th0;
-                var x3 = cx + cos_th1;
-                var y3 = cy + sin_th1;
-                var x2 = x3 + t * sin_th1;
-                var y2 = y3 - t * cos_th1;
-
-                return (segmentToBezierCache[argsStr] = [
-                    a00 * x1 + a01 * y1, a10 * x1 + a11 * y1,
-                    a00 * x2 + a01 * y2, a10 * x2 + a11 * y2,
-                    a00 * x3 + a01 * y3, a10 * x3 + a11 * y3
-                ]);
-            }
-
-            function render(g, path, l, t) {
-                var current, // current instruction
-                    previous = null,
-                    x = 0, // current x
-                    y = 0, // current y
-                    controlX = 0, // current control point x
-                    controlY = 0, // current control point y
-                    tempX,
-                    tempY,
-                    tempControlX,
-                    tempControlY,
-                    bounds = new vg.Bounds();
-                if (l == undefined) l = 0;
-                if (t == undefined) t = 0;
-
-                g.beginPath();
-
-                for (var i = 0, len = path.length; i < len; ++i) {
-                    current = path[i];
-
-                    switch (current[0]) { // first letter
-
-                        case 'l': // lineto, relative
-                            x += current[1];
-                            y += current[2];
-                            g.lineTo(x + l, y + t);
-                            bounds.add(x, y);
-                            break;
-
-                        case 'L': // lineto, absolute
-                            x = current[1];
-                            y = current[2];
-                            g.lineTo(x + l, y + t);
-                            bounds.add(x, y);
-                            break;
-
-                        case 'h': // horizontal lineto, relative
-                            x += current[1];
-                            g.lineTo(x + l, y + t);
-                            bounds.add(x, y);
-                            break;
-
-                        case 'H': // horizontal lineto, absolute
-                            x = current[1];
-                            g.lineTo(x + l, y + t);
-                            bounds.add(x, y);
-                            break;
-
-                        case 'v': // vertical lineto, relative
-                            y += current[1];
-                            g.lineTo(x + l, y + t);
-                            bounds.add(x, y);
-                            break;
-
-                        case 'V': // verical lineto, absolute
-                            y = current[1];
-                            g.lineTo(x + l, y + t);
-                            bounds.add(x, y);
-                            break;
-
-                        case 'm': // moveTo, relative
-                            x += current[1];
-                            y += current[2];
-                            g.moveTo(x + l, y + t);
-                            bounds.add(x, y);
-                            break;
-
-                        case 'M': // moveTo, absolute
-                            x = current[1];
-                            y = current[2];
-                            g.moveTo(x + l, y + t);
-                            bounds.add(x, y);
-                            break;
-
-                        case 'c': // bezierCurveTo, relative
-                            tempX = x + current[5];
-                            tempY = y + current[6];
-                            controlX = x + current[3];
-                            controlY = y + current[4];
-                            g.bezierCurveTo(
-                                x + current[1] + l, // x1
-                                y + current[2] + t, // y1
-                                controlX + l, // x2
-                                controlY + t, // y2
-                                tempX + l,
-                                tempY + t
-                            );
-                            bounds.add(x + current[1], y + current[2]);
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            x = tempX;
-                            y = tempY;
-                            break;
-
-                        case 'C': // bezierCurveTo, absolute
-                            x = current[5];
-                            y = current[6];
-                            controlX = current[3];
-                            controlY = current[4];
-                            g.bezierCurveTo(
-                                current[1] + l,
-                                current[2] + t,
-                                controlX + l,
-                                controlY + t,
-                                x + l,
-                                y + t
-                            );
-                            bounds.add(current[1], current[2]);
-                            bounds.add(controlX, controlY);
-                            bounds.add(x, y);
-                            break;
-
-                        case 's': // shorthand cubic bezierCurveTo, relative
-                                  // transform to absolute x,y
-                            tempX = x + current[3];
-                            tempY = y + current[4];
-                            // calculate reflection of previous control points
-                            controlX = 2 * x - controlX;
-                            controlY = 2 * y - controlY;
-                            g.bezierCurveTo(
-                                controlX + l,
-                                controlY + t,
-                                x + current[1] + l,
-                                y + current[2] + t,
-                                tempX + l,
-                                tempY + t
-                            );
-                            bounds.add(controlX, controlY);
-                            bounds.add(x + current[1], y + current[2]);
-                            bounds.add(tempX, tempY);
-
-                            // set control point to 2nd one of this command
-                            // "... the first control point is assumed to be the reflection of the second control point on the previous command relative to the current point."
-                            controlX = x + current[1];
-                            controlY = y + current[2];
-
-                            x = tempX;
-                            y = tempY;
-                            break;
-
-                        case 'S': // shorthand cubic bezierCurveTo, absolute
-                            tempX = current[3];
-                            tempY = current[4];
-                            // calculate reflection of previous control points
-                            controlX = 2 * x - controlX;
-                            controlY = 2 * y - controlY;
-                            g.bezierCurveTo(
-                                controlX + l,
-                                controlY + t,
-                                current[1] + l,
-                                current[2] + t,
-                                tempX + l,
-                                tempY + t
-                            );
-                            x = tempX;
-                            y = tempY;
-                            bounds.add(current[1], current[2]);
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            // set control point to 2nd one of this command
-                            // "... the first control point is assumed to be the reflection of the second control point on the previous command relative to the current point."
-                            controlX = current[1];
-                            controlY = current[2];
-
-                            break;
-
-                        case 'q': // quadraticCurveTo, relative
-                                  // transform to absolute x,y
-                            tempX = x + current[3];
-                            tempY = y + current[4];
-
-                            controlX = x + current[1];
-                            controlY = y + current[2];
-
-                            g.quadraticCurveTo(
-                                controlX + l,
-                                controlY + t,
-                                tempX + l,
-                                tempY + t
-                            );
-                            x = tempX;
-                            y = tempY;
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            break;
-
-                        case 'Q': // quadraticCurveTo, absolute
-                            tempX = current[3];
-                            tempY = current[4];
-
-                            g.quadraticCurveTo(
-                                current[1] + l,
-                                current[2] + t,
-                                tempX + l,
-                                tempY + t
-                            );
-                            x = tempX;
-                            y = tempY;
-                            controlX = current[1];
-                            controlY = current[2];
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            break;
-
-                        case 't': // shorthand quadraticCurveTo, relative
-
-                            // transform to absolute x,y
-                            tempX = x + current[1];
-                            tempY = y + current[2];
-
-                            if (previous[0].match(/[QqTt]/) === null) {
-                                // If there is no previous command or if the previous command was not a Q, q, T or t,
-                                // assume the control point is coincident with the current point
-                                controlX = x;
-                                controlY = y;
-                            }
-                            else if (previous[0] === 't') {
-                                // calculate reflection of previous control points for t
-                                controlX = 2 * x - tempControlX;
-                                controlY = 2 * y - tempControlY;
-                            }
-                            else if (previous[0] === 'q') {
-                                // calculate reflection of previous control points for q
-                                controlX = 2 * x - controlX;
-                                controlY = 2 * y - controlY;
-                            }
-
-                            tempControlX = controlX;
-                            tempControlY = controlY;
-
-                            g.quadraticCurveTo(
-                                controlX + l,
-                                controlY + t,
-                                tempX + l,
-                                tempY + t
-                            );
-                            x = tempX;
-                            y = tempY;
-                            controlX = x + current[1];
-                            controlY = y + current[2];
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            break;
-
-                        case 'T':
-                            tempX = current[1];
-                            tempY = current[2];
-
-                            // calculate reflection of previous control points
-                            controlX = 2 * x - controlX;
-                            controlY = 2 * y - controlY;
-                            g.quadraticCurveTo(
-                                controlX + l,
-                                controlY + t,
-                                tempX + l,
-                                tempY + t
-                            );
-                            x = tempX;
-                            y = tempY;
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            break;
-
-                        case 'a':
-                            drawArc(g, x + l, y + t, [
-                                current[1],
-                                current[2],
-                                current[3],
-                                current[4],
-                                current[5],
-                                current[6] + x + l,
-                                current[7] + y + t
-                            ], bounds, l, t);
-                            x += current[6];
-                            y += current[7];
-                            break;
-
-                        case 'A':
-                            drawArc(g, x + l, y + t, [
-                                current[1],
-                                current[2],
-                                current[3],
-                                current[4],
-                                current[5],
-                                current[6] + l,
-                                current[7] + t
-                            ], bounds, l, t);
-                            x = current[6];
-                            y = current[7];
-                            break;
-
-                        case 'z':
-                        case 'Z':
-                            g.closePath();
-                            break;
-                    }
-                    previous = current;
-                }
-                return bounds.translate(l, t);
-            }
-
-            function bounds(path, bounds) {
-                var current, // current instruction
-                    previous = null,
-                    x = 0, // current x
-                    y = 0, // current y
-                    controlX = 0, // current control point x
-                    controlY = 0, // current control point y
-                    tempX,
-                    tempY,
-                    tempControlX,
-                    tempControlY;
-
-                for (var i = 0, len = path.length; i < len; ++i) {
-                    current = path[i];
-
-                    switch (current[0]) { // first letter
-
-                        case 'l': // lineto, relative
-                            x += current[1];
-                            y += current[2];
-                            bounds.add(x, y);
-                            break;
-
-                        case 'L': // lineto, absolute
-                            x = current[1];
-                            y = current[2];
-                            bounds.add(x, y);
-                            break;
-
-                        case 'h': // horizontal lineto, relative
-                            x += current[1];
-                            bounds.add(x, y);
-                            break;
-
-                        case 'H': // horizontal lineto, absolute
-                            x = current[1];
-                            bounds.add(x, y);
-                            break;
-
-                        case 'v': // vertical lineto, relative
-                            y += current[1];
-                            bounds.add(x, y);
-                            break;
-
-                        case 'V': // verical lineto, absolute
-                            y = current[1];
-                            bounds.add(x, y);
-                            break;
-
-                        case 'm': // moveTo, relative
-                            x += current[1];
-                            y += current[2];
-                            bounds.add(x, y);
-                            break;
-
-                        case 'M': // moveTo, absolute
-                            x = current[1];
-                            y = current[2];
-                            bounds.add(x, y);
-                            break;
-
-                        case 'c': // bezierCurveTo, relative
-                            tempX = x + current[5];
-                            tempY = y + current[6];
-                            controlX = x + current[3];
-                            controlY = y + current[4];
-                            bounds.add(x + current[1], y + current[2]);
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            x = tempX;
-                            y = tempY;
-                            break;
-
-                        case 'C': // bezierCurveTo, absolute
-                            x = current[5];
-                            y = current[6];
-                            controlX = current[3];
-                            controlY = current[4];
-                            bounds.add(current[1], current[2]);
-                            bounds.add(controlX, controlY);
-                            bounds.add(x, y);
-                            break;
-
-                        case 's': // shorthand cubic bezierCurveTo, relative
-                                  // transform to absolute x,y
-                            tempX = x + current[3];
-                            tempY = y + current[4];
-                            // calculate reflection of previous control points
-                            controlX = 2 * x - controlX;
-                            controlY = 2 * y - controlY;
-                            bounds.add(controlX, controlY);
-                            bounds.add(x + current[1], y + current[2]);
-                            bounds.add(tempX, tempY);
-
-                            // set control point to 2nd one of this command
-                            // "... the first control point is assumed to be the reflection of the second control point on the previous command relative to the current point."
-                            controlX = x + current[1];
-                            controlY = y + current[2];
-
-                            x = tempX;
-                            y = tempY;
-                            break;
-
-                        case 'S': // shorthand cubic bezierCurveTo, absolute
-                            tempX = current[3];
-                            tempY = current[4];
-                            // calculate reflection of previous control points
-                            controlX = 2 * x - controlX;
-                            controlY = 2 * y - controlY;
-                            x = tempX;
-                            y = tempY;
-                            bounds.add(current[1], current[2]);
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            // set control point to 2nd one of this command
-                            // "... the first control point is assumed to be the reflection of the second control point on the previous command relative to the current point."
-                            controlX = current[1];
-                            controlY = current[2];
-
-                            break;
-
-                        case 'q': // quadraticCurveTo, relative
-                                  // transform to absolute x,y
-                            tempX = x + current[3];
-                            tempY = y + current[4];
-
-                            controlX = x + current[1];
-                            controlY = y + current[2];
-
-                            x = tempX;
-                            y = tempY;
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            break;
-
-                        case 'Q': // quadraticCurveTo, absolute
-                            tempX = current[3];
-                            tempY = current[4];
-
-                            x = tempX;
-                            y = tempY;
-                            controlX = current[1];
-                            controlY = current[2];
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            break;
-
-                        case 't': // shorthand quadraticCurveTo, relative
-
-                            // transform to absolute x,y
-                            tempX = x + current[1];
-                            tempY = y + current[2];
-
-                            if (previous[0].match(/[QqTt]/) === null) {
-                                // If there is no previous command or if the previous command was not a Q, q, T or t,
-                                // assume the control point is coincident with the current point
-                                controlX = x;
-                                controlY = y;
-                            }
-                            else if (previous[0] === 't') {
-                                // calculate reflection of previous control points for t
-                                controlX = 2 * x - tempControlX;
-                                controlY = 2 * y - tempControlY;
-                            }
-                            else if (previous[0] === 'q') {
-                                // calculate reflection of previous control points for q
-                                controlX = 2 * x - controlX;
-                                controlY = 2 * y - controlY;
-                            }
-
-                            tempControlX = controlX;
-                            tempControlY = controlY;
-
-                            x = tempX;
-                            y = tempY;
-                            controlX = x + current[1];
-                            controlY = y + current[2];
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            break;
-
-                        case 'T':
-                            tempX = current[1];
-                            tempY = current[2];
-
-                            // calculate reflection of previous control points
-                            controlX = 2 * x - controlX;
-                            controlY = 2 * y - controlY;
-
-                            x = tempX;
-                            y = tempY;
-                            bounds.add(controlX, controlY);
-                            bounds.add(tempX, tempY);
-                            break;
-
-                        case 'a':
-                            boundArc(x, y, [
-                                current[1],
-                                current[2],
-                                current[3],
-                                current[4],
-                                current[5],
-                                current[6] + x,
-                                current[7] + y
-                            ], bounds);
-                            x += current[6];
-                            y += current[7];
-                            break;
-
-                        case 'A':
-                            boundArc(x, y, [
-                                current[1],
-                                current[2],
-                                current[3],
-                                current[4],
-                                current[5],
-                                current[6],
-                                current[7]
-                            ], bounds);
-                            x = current[6];
-                            y = current[7];
-                            break;
-
-                        case 'z':
-                        case 'Z':
-                            break;
-                    }
-                    previous = current;
-                }
-                return bounds;
-            }
-
-            function area(items) {
-                var o = items[0];
-                var area;
-
-                if (o.orient === "horizontal") {
-                    area = d3.svg.area()
-                        .y(function (d) {
-                            return d.y;
-                        })
-                        .x0(function (d) {
-                            return d.x;
-                        })
-                        .x1(function (d) {
-                            return d.x + d.width;
-                        });
-                } else {
-                    area = d3.svg.area()
-                        .x(function (d) {
-                            return d.x;
-                        })
-                        .y1(function (d) {
-                            return d.y;
-                        })
-                        .y0(function (d) {
-                            return d.y + d.height;
-                        });
-                }
-
-                if (o.interpolate) area.interpolate(o.interpolate);
-                if (o.tension != null) area.tension(o.tension);
-                return area(items);
-            }
-
-            function line(items) {
-                var o = items[0];
-                var line = d3.svg.line()
-                    .x(function (d) {
-                        return d.x;
-                    })
-                    .y(function (d) {
-                        return d.y;
-                    });
-                if (o.interpolate) line.interpolate(o.interpolate);
-                if (o.tension != null) line.tension(o.tension);
-                return line(items);
-            }
-
-            return {
-                parse: parse,
-                render: render,
-                bounds: bounds,
-                area: area,
-                line: line
-            };
-
-        })();
-        vg.canvas.marks = (function () {
-
-            var parsePath = vg.canvas.path.parse,
-                renderPath = vg.canvas.path.render,
-                halfpi = Math.PI / 2,
-                sqrt3 = Math.sqrt(3),
-                tan30 = Math.tan(30 * Math.PI / 180),
-                tmpBounds = new vg.Bounds();
-
-            // path generators
-
-            function arcPath(g, o) {
-                var x = o.x || 0,
-                    y = o.y || 0,
-                    ir = o.innerRadius || 0,
-                    or = o.outerRadius || 0,
-                    sa = (o.startAngle || 0) - Math.PI / 2,
-                    ea = (o.endAngle || 0) - Math.PI / 2;
-                g.beginPath();
-                if (ir === 0) g.moveTo(x, y);
-                else g.arc(x, y, ir, sa, ea, 0);
-                g.arc(x, y, or, ea, sa, 1);
-                g.closePath();
-            }
-
-            function areaPath(g, items) {
-                var o = items[0],
-                    m = o.mark,
-                    p = m.pathCache || (m.pathCache = parsePath(vg.canvas.path.area(items)));
-                renderPath(g, p);
-            }
-
-            function linePath(g, items) {
-                var o = items[0],
-                    m = o.mark,
-                    p = m.pathCache || (m.pathCache = parsePath(vg.canvas.path.line(items)));
-                renderPath(g, p);
-            }
-
-            function pathPath(g, o) {
-                if (o.path == null) return;
-                var p = o.pathCache || (o.pathCache = parsePath(o.path));
-                return renderPath(g, p, o.x, o.y);
-            }
-
-            function symbolPath(g, o) {
-                g.beginPath();
-                var size = o.size != null ? o.size : 100,
-                    x = o.x, y = o.y, r, t, rx, ry;
-
-                if (o.shape == null || o.shape === "circle") {
-                    r = Math.sqrt(size / Math.PI);
-                    g.arc(x, y, r, 0, 2 * Math.PI, 0);
-                    g.closePath();
-                    return;
-                }
-
-                switch (o.shape) {
-                    case "cross":
-                        r = Math.sqrt(size / 5) / 2;
-                        t = 3 * r;
-                        g.moveTo(x - t, y - r);
-                        g.lineTo(x - r, y - r);
-                        g.lineTo(x - r, y - t);
-                        g.lineTo(x + r, y - t);
-                        g.lineTo(x + r, y - r);
-                        g.lineTo(x + t, y - r);
-                        g.lineTo(x + t, y + r);
-                        g.lineTo(x + r, y + r);
-                        g.lineTo(x + r, y + t);
-                        g.lineTo(x - r, y + t);
-                        g.lineTo(x - r, y + r);
-                        g.lineTo(x - t, y + r);
-                        break;
-
-                    case "diamond":
-                        ry = Math.sqrt(size / (2 * tan30));
-                        rx = ry * tan30;
-                        g.moveTo(x, y - ry);
-                        g.lineTo(x + rx, y);
-                        g.lineTo(x, y + ry);
-                        g.lineTo(x - rx, y);
-                        break;
-
-                    case "square":
-                        t = Math.sqrt(size);
-                        r = t / 2;
-                        g.rect(x - r, y - r, t, t);
-                        break;
-
-                    case "triangle-down":
-                        rx = Math.sqrt(size / sqrt3);
-                        ry = rx * sqrt3 / 2;
-                        g.moveTo(x, y + ry);
-                        g.lineTo(x + rx, y - ry);
-                        g.lineTo(x - rx, y - ry);
-                        break;
-
-                    case "triangle-up":
-                        rx = Math.sqrt(size / sqrt3);
-                        ry = rx * sqrt3 / 2;
-                        g.moveTo(x, y - ry);
-                        g.lineTo(x + rx, y + ry);
-                        g.lineTo(x - rx, y + ry);
-                }
-                g.closePath();
-            }
-
-            function lineStroke(g, items) {
-                var o = items[0],
-                    lw = o.strokeWidth,
-                    lc = o.strokeCap;
-                g.lineWidth = lw != null ? lw : vg.config.render.lineWidth;
-                g.lineCap = lc != null ? lc : vg.config.render.lineCap;
-                linePath(g, items);
-            }
-
-            function ruleStroke(g, o) {
-                var x1 = o.x || 0,
-                    y1 = o.y || 0,
-                    x2 = o.x2 != null ? o.x2 : x1,
-                    y2 = o.y2 != null ? o.y2 : y1,
-                    lw = o.strokeWidth,
-                    lc = o.strokeCap;
-
-                g.lineWidth = lw != null ? lw : vg.config.render.lineWidth;
-                g.lineCap = lc != null ? lc : vg.config.render.lineCap;
-                g.beginPath();
-                g.moveTo(x1, y1);
-                g.lineTo(x2, y2);
-            }
-
-            // drawing functions
-
-            function drawPathOne(path, g, o, items) {
-                var fill = o.fill, stroke = o.stroke, opac, lc, lw;
-
-                path(g, items);
-
-                opac = o.opacity == null ? 1 : o.opacity;
-                if (opac == 0 || !fill && !stroke) return;
-
-                if (fill) {
-                    g.globalAlpha = opac * (o.fillOpacity == null ? 1 : o.fillOpacity);
-                    g.fillStyle = color(g, o, fill);
-                    g.fill();
-                }
-
-                if (stroke) {
-                    lw = (lw = o.strokeWidth) != null ? lw : vg.config.render.lineWidth;
-                    if (lw > 0) {
-                        g.globalAlpha = opac * (o.strokeOpacity == null ? 1 : o.strokeOpacity);
-                        g.strokeStyle = color(g, o, stroke);
-                        g.lineWidth = lw;
-                        g.lineCap = (lc = o.strokeCap) != null ? lc : vg.config.render.lineCap;
-                        g.vgLineDash(o.strokeDash || null);
-                        g.vgLineDashOffset(o.strokeDashOffset || 0);
-                        g.stroke();
-                    }
-                }
-            }
-
-            function drawPathAll(path, g, scene, bounds) {
-                var i, len, item;
-                for (i = 0, len = scene.items.length; i < len; ++i) {
-                    item = scene.items[i];
-                    if (bounds && !bounds.intersects(item.bounds))
-                        continue; // bounds check
-                    drawPathOne(path, g, item, item);
-                }
-            }
-
-            function drawRect(g, scene, bounds) {
-                if (!scene.items.length) return;
-                var items = scene.items,
-                    o, fill, stroke, opac, lc, lw, x, y, w, h;
-
-                for (var i = 0, len = items.length; i < len; ++i) {
-                    o = items[i];
-                    if (bounds && !bounds.intersects(o.bounds))
-                        continue; // bounds check
-
-                    x = o.x || 0;
-                    y = o.y || 0;
-                    w = o.width || 0;
-                    h = o.height || 0;
-
-                    opac = o.opacity == null ? 1 : o.opacity;
-                    if (opac == 0) continue;
-
-                    if (fill = o.fill) {
-                        g.globalAlpha = opac * (o.fillOpacity == null ? 1 : o.fillOpacity);
-                        g.fillStyle = color(g, o, fill);
-                        g.fillRect(x, y, w, h);
-                    }
-
-                    if (stroke = o.stroke) {
-                        lw = (lw = o.strokeWidth) != null ? lw : vg.config.render.lineWidth;
-                        if (lw > 0) {
-                            g.globalAlpha = opac * (o.strokeOpacity == null ? 1 : o.strokeOpacity);
-                            g.strokeStyle = color(g, o, stroke);
-                            g.lineWidth = lw;
-                            g.lineCap = (lc = o.strokeCap) != null ? lc : vg.config.render.lineCap;
-                            g.vgLineDash(o.strokeDash || null);
-                            g.vgLineDashOffset(o.strokeDashOffset || 0);
-                            g.strokeRect(x, y, w, h);
-                        }
-                    }
-                }
-            }
-
-            function drawRule(g, scene, bounds) {
-                if (!scene.items.length) return;
-                var items = scene.items,
-                    o, stroke, opac, lc, lw, x1, y1, x2, y2;
-
-                for (var i = 0, len = items.length; i < len; ++i) {
-                    o = items[i];
-                    if (bounds && !bounds.intersects(o.bounds))
-                        continue; // bounds check
-
-                    x1 = o.x || 0;
-                    y1 = o.y || 0;
-                    x2 = o.x2 != null ? o.x2 : x1;
-                    y2 = o.y2 != null ? o.y2 : y1;
-
-                    opac = o.opacity == null ? 1 : o.opacity;
-                    if (opac == 0) continue;
-
-                    if (stroke = o.stroke) {
-                        lw = (lw = o.strokeWidth) != null ? lw : vg.config.render.lineWidth;
-                        if (lw > 0) {
-                            g.globalAlpha = opac * (o.strokeOpacity == null ? 1 : o.strokeOpacity);
-                            g.strokeStyle = color(g, o, stroke);
-                            g.lineWidth = lw;
-                            g.lineCap = (lc = o.strokeCap) != null ? lc : vg.config.render.lineCap;
-                            g.vgLineDash(o.strokeDash || null);
-                            g.vgLineDashOffset(o.strokeDashOffset || 0);
-                            g.beginPath();
-                            g.moveTo(x1, y1);
-                            g.lineTo(x2, y2);
-                            g.stroke();
-                        }
-                    }
-                }
-            }
-
-            function drawImage(g, scene, bounds) {
-                if (!scene.items.length) return;
-                var renderer = this,
-                    items = scene.items, o;
-
-                for (var i = 0, len = items.length; i < len; ++i) {
-                    o = items[i];
-                    if (bounds && !bounds.intersects(o.bounds))
-                        continue; // bounds check
-
-                    if (!(o.image && o.image.url === o.url)) {
-                        o.image = renderer.loadImage(o.url);
-                        o.image.url = o.url;
-                    }
-
-                    var x, y, w, h, opac;
-                    w = o.width || (o.image && o.image.width) || 0;
-                    h = o.height || (o.image && o.image.height) || 0;
-                    x = (o.x || 0) - (o.align === "center"
-                            ? w / 2 : (o.align === "right" ? w : 0));
-                    y = (o.y || 0) - (o.baseline === "middle"
-                            ? h / 2 : (o.baseline === "bottom" ? h : 0));
-
-                    if (o.image.loaded) {
-                        g.globalAlpha = (opac = o.opacity) != null ? opac : 1;
-                        g.drawImage(o.image, x, y, w, h);
-                    }
-                }
-            }
-
-            function drawText(g, scene, bounds) {
-                if (!scene.items.length) return;
-                var items = scene.items,
-                    o, fill, stroke, opac, lw, x, y, r, t;
-
-                for (var i = 0, len = items.length; i < len; ++i) {
-                    o = items[i];
-                    if (bounds && !bounds.intersects(o.bounds))
-                        continue; // bounds check
-
-                    g.font = vg.scene.fontString(o);
-                    g.textAlign = o.align || "left";
-                    g.textBaseline = o.baseline || "alphabetic";
-
-                    opac = o.opacity == null ? 1 : o.opacity;
-                    if (opac == 0) continue;
-
-                    x = o.x || 0;
-                    y = o.y || 0;
-                    if (r = o.radius) {
-                        t = (o.theta || 0) - Math.PI / 2;
-                        x += r * Math.cos(t);
-                        y += r * Math.sin(t);
-                    }
-
-                    if (o.angle) {
-                        g.save();
-                        g.translate(x, y);
-                        g.rotate(o.angle * Math.PI / 180);
-                        x = o.dx || 0;
-                        y = o.dy || 0;
-                    } else {
-                        x += (o.dx || 0);
-                        y += (o.dy || 0);
-                    }
-
-                    if (fill = o.fill) {
-                        g.globalAlpha = opac * (o.fillOpacity == null ? 1 : o.fillOpacity);
-                        g.fillStyle = color(g, o, fill);
-                        g.fillText(o.text, x, y);
-                    }
-
-                    if (stroke = o.stroke) {
-                        lw = (lw = o.strokeWidth) != null ? lw : 1;
-                        if (lw > 0) {
-                            g.globalAlpha = opac * (o.strokeOpacity == null ? 1 : o.strokeOpacity);
-                            g.strokeStyle = color(o, stroke);
-                            g.lineWidth = lw;
-                            g.strokeText(o.text, x, y);
-                        }
-                    }
-
-                    if (o.angle) g.restore();
-                }
-            }
-
-            function drawAll(pathFunc) {
-                return function (g, scene, bounds) {
-                    drawPathAll(pathFunc, g, scene, bounds);
-                }
-            }
-
-            function drawOne(pathFunc) {
-                return function (g, scene, bounds) {
-                    if (!scene.items.length) return;
-                    if (bounds && !bounds.intersects(scene.items[0].bounds))
-                        return; // bounds check
-                    drawPathOne(pathFunc, g, scene.items[0], scene.items);
-                }
-            }
-
-            function drawGroup(g, scene, bounds) {
-                if (!scene.items.length) return;
-                var items = scene.items, group, axes, legends,
-                    renderer = this, gx, gy, gb, i, n, j, m;
-
-                drawRect(g, scene, bounds);
-
-                for (i = 0, n = items.length; i < n; ++i) {
-                    group = items[i];
-                    axes = group.axisItems || [];
-                    legends = group.legendItems || [];
-                    gx = group.x || 0;
-                    gy = group.y || 0;
-
-                    // render group contents
-                    g.save();
-                    g.translate(gx, gy);
-                    if (group.clip) {
-                        g.beginPath();
-                        g.rect(0, 0, group.width || 0, group.height || 0);
-                        g.clip();
-                    }
-
-                    if (bounds) bounds.translate(-gx, -gy);
-
-                    for (j = 0, m = axes.length; j < m; ++j) {
-                        if (axes[j].def.layer === "back") {
-                            renderer.draw(g, axes[j], bounds);
-                        }
-                    }
-                    for (j = 0, m = group.items.length; j < m; ++j) {
-                        renderer.draw(g, group.items[j], bounds);
-                    }
-                    for (j = 0, m = axes.length; j < m; ++j) {
-                        if (axes[j].def.layer !== "back") {
-                            renderer.draw(g, axes[j], bounds);
-                        }
-                    }
-                    for (j = 0, m = legends.length; j < m; ++j) {
-                        renderer.draw(g, legends[j], bounds);
-                    }
-
-                    if (bounds) bounds.translate(gx, gy);
-                    g.restore();
-                }
-            }
-
-            function color(g, o, value) {
-                return (value.id)
-                    ? gradient(g, value, o.bounds)
-                    : value;
-            }
-
-            function gradient(g, p, b) {
-                var w = b.width(),
-                    h = b.height(),
-                    x1 = b.x1 + p.x1 * w,
-                    y1 = b.y1 + p.y1 * h,
-                    x2 = b.x1 + p.x2 * w,
-                    y2 = b.y1 + p.y2 * h,
-                    grad = g.createLinearGradient(x1, y1, x2, y2),
-                    stop = p.stops,
-                    i, n;
-
-                for (i = 0, n = stop.length; i < n; ++i) {
-                    grad.addColorStop(stop[i].offset, stop[i].color);
-                }
-                return grad;
-            }
-
-            // hit testing
-
-            function pickGroup(g, scene, x, y, gx, gy) {
-                if (scene.items.length === 0 ||
-                    scene.bounds && !scene.bounds.contains(gx, gy)) {
-                    return false;
-                }
-                var items = scene.items, subscene, group, hit, dx, dy,
-                    handler = this, i, j;
-
-                for (i = items.length; --i >= 0;) {
-                    group = items[i];
-                    dx = group.x || 0;
-                    dy = group.y || 0;
-
-                    g.save();
-                    g.translate(dx, dy);
-                    for (j = group.items.length; --j >= 0;) {
-                        subscene = group.items[j];
-                        if (subscene.interactive === false) continue;
-                        hit = handler.pick(subscene, x, y, gx - dx, gy - dy);
-                        if (hit) {
-                            g.restore();
-                            return hit;
-                        }
-                    }
-                    g.restore();
-                }
-
-                return scene.interactive
-                    ? pickAll(hitTests.group, g, scene, x, y, gx, gy)
-                    : false;
-            }
-
-            function pickAll(test, g, scene, x, y, gx, gy) {
-                if (!scene.items.length) return false;
-                var o, b, i;
-
-                if (g._ratio !== 1) {
-                    x *= g._ratio;
-                    y *= g._ratio;
-                }
-
-                for (i = scene.items.length; --i >= 0;) {
-                    o = scene.items[i];
-                    b = o.bounds;
-                    // first hit test against bounding box
-                    if ((b && !b.contains(gx, gy)) || !b) continue;
-                    // if in bounding box, perform more careful test
-                    if (test(g, o, x, y, gx, gy)) return o;
-                }
-                return false;
-            }
-
-            function pickArea(g, scene, x, y, gx, gy) {
-                if (!scene.items.length) return false;
-                var items = scene.items,
-                    o, b, i, di, dd, od, dx, dy;
-
-                b = items[0].bounds;
-                if (b && !b.contains(gx, gy)) return false;
-                if (g._ratio !== 1) {
-                    x *= g._ratio;
-                    y *= g._ratio;
-                }
-                if (!hitTests.area(g, items, x, y)) return false;
-                return items[0];
-            }
-
-            function pickLine(g, scene, x, y, gx, gy) {
-                if (!scene.items.length) return false;
-                var items = scene.items,
-                    o, b, i, di, dd, od, dx, dy;
-
-                b = items[0].bounds;
-                if (b && !b.contains(gx, gy)) return false;
-                if (g._ratio !== 1) {
-                    x *= g._ratio;
-                    y *= g._ratio;
-                }
-                if (!hitTests.line(g, items, x, y)) return false;
-                return items[0];
-            }
-
-            function pick(test) {
-                return function (g, scene, x, y, gx, gy) {
-                    return pickAll(test, g, scene, x, y, gx, gy);
-                };
-            }
-
-            function textHit(g, o, x, y, gx, gy) {
-                if (!o.fontSize) return false;
-                if (!o.angle) return true; // bounds sufficient if no rotation
-
-                var b = vg.scene.bounds.text(o, tmpBounds, true),
-                    a = -o.angle * Math.PI / 180,
-                    cos = Math.cos(a),
-                    sin = Math.sin(a),
-                    x = o.x,
-                    y = o.y,
-                    px = cos * gx - sin * gy + (x - x * cos + y * sin),
-                    py = sin * gx + cos * gy + (y - x * sin - y * cos);
-
-                return b.contains(px, py);
-            }
-
-            var hitTests = {
-                text: textHit,
-                rect: function (g, o, x, y) {
-                    return true;
-                }, // bounds test is sufficient
-                image: function (g, o, x, y) {
-                    return true;
-                }, // bounds test is sufficient
-                group: function (g, o, x, y) {
-                    return o.fill || o.stroke;
-                },
-                rule: function (g, o, x, y) {
-                    if (!g.isPointInStroke) return false;
-                    ruleStroke(g, o);
-                    return g.isPointInStroke(x, y);
-                },
-                line: function (g, s, x, y) {
-                    if (!g.isPointInStroke) return false;
-                    lineStroke(g, s);
-                    return g.isPointInStroke(x, y);
-                },
-                arc: function (g, o, x, y) {
-                    arcPath(g, o);
-                    return g.isPointInPath(x, y);
-                },
-                area: function (g, s, x, y) {
-                    areaPath(g, s);
-                    return g.isPointInPath(x, y);
-                },
-                path: function (g, o, x, y) {
-                    pathPath(g, o);
-                    return g.isPointInPath(x, y);
-                },
-                symbol: function (g, o, x, y) {
-                    symbolPath(g, o);
-                    return g.isPointInPath(x, y);
-                }
-            };
-
-            return {
-                draw: {
-                    group: drawGroup,
-                    area: drawOne(areaPath),
-                    line: drawOne(linePath),
-                    arc: drawAll(arcPath),
-                    path: drawAll(pathPath),
-                    symbol: drawAll(symbolPath),
-                    rect: drawRect,
-                    rule: drawRule,
-                    text: drawText,
-                    image: drawImage,
-                    drawOne: drawOne, // expose for extensibility
-                    drawAll: drawAll  // expose for extensibility
-                },
-                pick: {
-                    group: pickGroup,
-                    area: pickArea,
-                    line: pickLine,
-                    arc: pick(hitTests.arc),
-                    path: pick(hitTests.path),
-                    symbol: pick(hitTests.symbol),
-                    rect: pick(hitTests.rect),
-                    rule: pick(hitTests.rule),
-                    text: pick(hitTests.text),
-                    image: pick(hitTests.image),
-                    pickAll: pickAll  // expose for extensibility
-                }
-            };
-
-        })();
-        vg.canvas.Renderer = (function () {
-            var renderer = function () {
-                this._ctx = null;
-                this._el = null;
-                this._imgload = 0;
-            };
-
-            var prototype = renderer.prototype;
-
-            prototype.initialize = function (el, width, height, pad) {
-                this._el = el;
-
-                if (!el) return this; // early exit if no DOM element
-
-                // select canvas element
-                var canvas = d3.select(el)
-                    .selectAll("canvas.marks")
-                    .data([1]);
-
-                // create new canvas element if needed
-                canvas.enter()
-                    .append("canvas")
-                    .attr("class", "marks");
-
-                // remove extraneous canvas if needed
-                canvas.exit().remove();
-
-                return this.resize(width, height, pad);
-            };
-
-            prototype.resize = function (width, height, pad) {
-                this._width = width;
-                this._height = height;
-                this._padding = pad;
-
-                if (this._el) {
-                    var canvas = d3.select(this._el).select("canvas.marks");
-
-                    // initialize canvas attributes
-                    canvas
-                        .attr("width", width + pad.left + pad.right)
-                        .attr("height", height + pad.top + pad.bottom);
-
-                    // get the canvas graphics context
-                    var s;
-                    this._ctx = canvas.node().getContext("2d");
-                    this._ctx._ratio = (s = scaleCanvas(canvas.node(), this._ctx) || 1);
-                    this._ctx.setTransform(s, 0, 0, s, s * pad.left, s * pad.top);
-                }
-
-                initializeLineDash(this._ctx);
-                return this;
-            };
-
-            function scaleCanvas(canvas, ctx) {
-                // get canvas pixel data
-                var devicePixelRatio = window.devicePixelRatio || 1,
-                    backingStoreRatio = (
-                        ctx.webkitBackingStorePixelRatio ||
-                        ctx.mozBackingStorePixelRatio ||
-                        ctx.msBackingStorePixelRatio ||
-                        ctx.oBackingStorePixelRatio ||
-                        ctx.backingStorePixelRatio) || 1,
-                    ratio = devicePixelRatio / backingStoreRatio;
-
-                if (devicePixelRatio !== backingStoreRatio) {
-                    var w = canvas.width, h = canvas.height;
-                    // set actual and visible canvas size
-                    canvas.setAttribute("width", w * ratio);
-                    canvas.setAttribute("height", h * ratio);
-                    canvas.style.width = w + 'px';
-                    canvas.style.height = h + 'px';
-                }
-                return ratio;
-            }
-
-            function initializeLineDash(ctx) {
-                if (ctx.vgLineDash) return; // already set
-
-                var NODASH = [];
-                if (ctx.setLineDash) {
-                    ctx.vgLineDash = function (dash) {
-                        this.setLineDash(dash || NODASH);
-                    };
-                    ctx.vgLineDashOffset = function (off) {
-                        this.lineDashOffset = off;
-                    };
-                } else if (ctx.webkitLineDash !== undefined) {
-                    ctx.vgLineDash = function (dash) {
-                        this.webkitLineDash = dash || NODASH;
-                    };
-                    ctx.vgLineDashOffset = function (off) {
-                        this.webkitLineDashOffset = off;
-                    };
-                } else if (ctx.mozDash !== undefined) {
-                    ctx.vgLineDash = function (dash) {
-                        this.mozDash = dash;
-                    };
-                    ctx.vgLineDashOffset = function (off) { /* unsupported */
-                    };
-                } else {
-                    ctx.vgLineDash = function (dash) { /* unsupported */
-                    };
-                    ctx.vgLineDashOffset = function (off) { /* unsupported */
-                    };
-                }
-            }
-
-            prototype.context = function (ctx) {
-                if (ctx) {
-                    this._ctx = ctx;
-                    return this;
-                }
-                else return this._ctx;
-            };
-
-            prototype.element = function () {
-                return this._el;
-            };
-
-            prototype.pendingImages = function () {
-                return this._imgload;
-            };
-
-            function translatedBounds(item, bounds) {
-                var b = new vg.Bounds(bounds);
-                while ((item = item.mark.group) != null) {
-                    b.translate(item.x || 0, item.y || 0);
-                }
-                return b;
-            }
-
-            function getBounds(items) {
-                return !items ? null :
-                    vg.array(items).reduce(function (b, item) {
-                        return b.union(translatedBounds(item, item.bounds))
-                            .union(translatedBounds(item, item['bounds:prev']));
-                    }, new vg.Bounds());
-            }
-
-            function setBounds(g, bounds) {
-                var bbox = null;
-                if (bounds) {
-                    bbox = (new vg.Bounds(bounds)).round();
-                    g.beginPath();
-                    g.rect(bbox.x1, bbox.y1, bbox.width(), bbox.height());
-                    g.clip();
-                }
-                return bbox;
-            }
-
-            prototype.render = function (scene, items) {
-                var g = this._ctx,
-                    pad = this._padding,
-                    w = this._width + pad.left + pad.right,
-                    h = this._height + pad.top + pad.bottom,
-                    bb = null, bb2;
-
-                // setup
-                this._scene = scene;
-                g.save();
-                bb = setBounds(g, getBounds(items));
-                g.clearRect(-pad.left, -pad.top, w, h);
-
-                // render
-                this.draw(g, scene, bb);
-
-                // render again to handle possible bounds change
-                if (items) {
-                    g.restore();
-                    g.save();
-                    bb2 = setBounds(g, getBounds(items));
-                    if (!bb.encloses(bb2)) {
-                        g.clearRect(-pad.left, -pad.top, w, h);
-                        this.draw(g, scene, bb2);
-                    }
-                }
-
-                // takedown
-                g.restore();
-                this._scene = null;
-            };
-
-            prototype.draw = function (ctx, scene, bounds) {
-                var marktype = scene.marktype,
-                    renderer = vg.canvas.marks.draw[marktype];
-                renderer.call(this, ctx, scene, bounds);
-            };
-
-            prototype.renderAsync = function (scene) {
-                // TODO make safe for multiple scene rendering?
-                var renderer = this;
-                if (renderer._async_id) {
-                    clearTimeout(renderer._async_id);
-                }
-                renderer._async_id = setTimeout(function () {
-                    renderer.render(scene);
-                    delete renderer._async_id;
-                }, 50);
-            };
-
-            prototype.loadImage = function (uri) {
-                var renderer = this,
-                    scene = renderer._scene,
-                    image = null, url;
-
-                renderer._imgload += 1;
-                if (vg.config.isNode) {
-                    image = new (require("canvas").Image)();
-                    vg.data.load(uri, function (err, data) {
-                        if (err) {
-                            vg.error(err);
-                            return;
-                        }
-                        image.src = data;
-                        image.loaded = true;
-                        renderer._imgload -= 1;
-                    });
-                } else {
-                    image = new Image();
-                    url = vg.config.baseURL + uri;
-                    image.onload = function () {
-                        vg.log("LOAD IMAGE: " + url);
-                        image.loaded = true;
-                        renderer._imgload -= 1;
-                        renderer.renderAsync(scene);
-                    };
-                    image.src = url;
-                }
-
-                return image;
-            };
-
-            return renderer;
-        })();
-        vg.canvas.Handler = (function () {
-            var handler = function (el, model) {
-                this._active = null;
-                this._handlers = {};
-                if (el) this.initialize(el);
-                if (model) this.model(model);
-            };
-
-            var prototype = handler.prototype;
-
-            prototype.initialize = function (el, pad, obj) {
-                this._el = d3.select(el).node();
-                this._canvas = d3.select(el).select("canvas.marks").node();
-                this._padding = pad;
-                this._obj = obj || null;
-
-                // add event listeners
-                var canvas = this._canvas, that = this;
-                events.forEach(function (type) {
-                    canvas.addEventListener(type, function (evt) {
-                        prototype[type].call(that, evt);
-                    });
-                });
-
-                return this;
-            };
-
-            prototype.padding = function (pad) {
-                this._padding = pad;
-                return this;
-            };
-
-            prototype.model = function (model) {
-                if (!arguments.length) return this._model;
-                this._model = model;
-                return this;
-            };
-
-            prototype.handlers = function () {
-                var h = this._handlers;
-                return vg.keys(h).reduce(function (a, k) {
-                    return h[k].reduce(function (a, x) {
-                        return (a.push(x), a);
-                    }, a);
-                }, []);
-            };
-
-            // setup events
-            var events = [
-                "mousedown",
-                "mouseup",
-                "click",
-                "dblclick",
-                "wheel",
-                "keydown",
-                "keypress",
-                "keyup",
-                "mousewheel"
-            ];
-            events.forEach(function (type) {
-                prototype[type] = function (evt) {
-                    this.fire(type, evt);
-                };
-            });
-            events.push("mousemove");
-            events.push("mouseout");
-
-            function eventName(name) {
-                var i = name.indexOf(".");
-                return i < 0 ? name : name.slice(0, i);
-            }
-
-            prototype.mousemove = function (evt) {
-                var pad = this._padding,
-                    b = evt.target.getBoundingClientRect(),
-                    x = evt.clientX - b.left,
-                    y = evt.clientY - b.top,
-                    a = this._active,
-                    p = this.pick(this._model.scene(), x, y, x - pad.left, y - pad.top);
-
-                if (p === a) {
-                    this.fire("mousemove", evt);
-                    return;
-                } else if (a) {
-                    this.fire("mouseout", evt);
-                }
-                this._active = p;
-                if (p) {
-                    this.fire("mouseover", evt);
-                }
-            };
-
-            prototype.mouseout = function (evt) {
-                if (this._active) {
-                    this.fire("mouseout", evt);
-                }
-                this._active = null;
-            };
-
-            // to keep firefox happy
-            prototype.DOMMouseScroll = function (evt) {
-                this.fire("mousewheel", evt);
-            };
-
-            // fire an event
-            prototype.fire = function (type, evt) {
-                var a = this._active,
-                    h = this._handlers[type];
-                if (a && h) {
-                    for (var i = 0, len = h.length; i < len; ++i) {
-                        h[i].handler.call(this._obj, evt, a);
-                    }
-                }
-            };
-
-            // add an event handler
-            prototype.on = function (type, handler) {
-                var name = eventName(type),
-                    h = this._handlers;
-    

<TRUNCATED>