]> source.dussan.org Git - svg.js.git/commitdiff
fix origin bug
authorUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Thu, 28 Jun 2018 20:58:51 +0000 (22:58 +0200)
committerUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Thu, 28 Jun 2018 20:58:51 +0000 (22:58 +0200)
dirty.html
dist/svg.js
package-lock.json
src/matrix.js
src/morph.js
src/runner.js

index 1b4322b940c7d3ee75f866b1d4fe672534316fd7..3eadb0e69a272f44f5b32d9c649b0d4320b1f1b0 100644 (file)
@@ -218,16 +218,13 @@ a.timeline().source(() => {
 })
 
 
-let obj = { shear: 2, rotate: 50, origin: [600, 600] }
+let obj = { rotate: 90, shear:2, origin: [600, 600], translate: [100, 100] }
 
 a.clone() // startPosition
 a.clone().transform(obj) // endPosition
-a.animate().transform(obj) // animation
+a.animate(new SVG.PID(0.1, 0.1)).transform(obj) // animation
 
 
-
-canvas.ellipse(30, 30)
-
 // Put an ellipse where we expect the object to be
 canvas.ellipse(30, 30).center(100, 500)
   .attr('opacity', 0.3)
index d387d53d18ffbb1a1fb68ae8762f95d9efd29f3e..aa9984bde43b5f12fda807702e51c9f7f26fa36b 100644 (file)
 * @copyright Wout Fierens <wout@mick-wout.com>
 * @license MIT
 *
-* BUILT: Thu Jun 28 2018 23:40:30 GMT+1000 (AEST)
+* BUILT: Thu Jun 28 2018 22:52:04 GMT+0200 (GMT+02:00)
 */;
-
-(function(root, factory) {
-  /* istanbul ignore next */
-  if (typeof define === 'function' && define.amd) {
-    define(function(){
-      return factory(root, root.document)
-    })
-  } else if (typeof exports === 'object') {
-    module.exports = root.document ? factory(root, root.document) : function(w){ return factory(w, w.document) }
-  } else {
-    root.SVG = factory(root, root.document)
-  }
-}(typeof window !== "undefined" ? window : this, function(window, document) {
-
-// Check that our browser supports svg
-var supported = !! document.createElementNS &&
-  !! document.createElementNS('http://www.w3.org/2000/svg','svg').createSVGRect
-
-// If we don't support svg, just exit without doing anything
-if (!supported)
-  return {supported: false}
-
-// Otherwise, the library will be here
-/* global createElement, capitalize */
-/* eslint-disable new-cap */
-
-// The main wrapping element
-var SVG = this.SVG = function (element) {
-  if (SVG.supported) {
-    element = createElement(element)
-    return element
-  }
-}
-
-// Svg must be supported if we reached this stage
-SVG.supported = true
-
-// Default namespaces
-SVG.ns = 'http://www.w3.org/2000/svg'
-SVG.xmlns = 'http://www.w3.org/2000/xmlns/'
-SVG.xlink = 'http://www.w3.org/1999/xlink'
-SVG.svgjs = 'http://svgjs.com/svgjs'
-
-// Element id sequence
-SVG.did = 1000
-
-// Get next named element id
-SVG.eid = function (name) {
-  return 'Svgjs' + capitalize(name) + (SVG.did++)
-}
-
-// Method for element creation
-SVG.create = function (name) {
-  // create element
-  return document.createElementNS(this.ns, name)
-}
-
-// Method for extending objects
-SVG.extend = function (modules, methods) {
-  var key, i
-
-  modules = Array.isArray(modules) ? modules : [modules]
-
-  for (i = modules.length - 1; i >= 0; i--) {
-    if (modules[i]) {
-      for (key in methods) {
-        modules[i].prototype[key] = methods[key]
-      }
-    }
-  }
-}
-
-// Invent new element
-SVG.invent = function (config) {
-  // Create element initializer
-  var initializer = typeof config.create === 'function' ? config.create
-    : function (node) {
-      config.inherit.call(this, node || SVG.create(config.create))
-    }
-
-  // Inherit prototype
-  if (config.inherit) {
-    initializer.prototype = new config.inherit()
-    initializer.prototype.constructor = initializer
-  }
-
-  // Extend with methods
-  if (config.extend) {
-    SVG.extend(initializer, config.extend)
-  }
-
-  // Attach construct method to parent
-  if (config.construct) { SVG.extend(config.parent || SVG.Container, config.construct) }
-
-  return initializer
-}
-
-// Adopt existing svg elements
-SVG.adopt = function (node) {
-  // check for presence of node
-  if (!node) return null
-
-  // make sure a node isn't already adopted
-  if (node.instance instanceof SVG.Element) return node.instance
-
-  if (!(node instanceof window.SVGElement)) {
-    return new SVG.HtmlNode(node)
-  }
-
-  // initialize variables
-  var element
-
-  // adopt with element-specific settings
-  if (node.nodeName === 'svg') {
-    element = new SVG.Doc(node)
-  } else if (node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient') {
-    element = new SVG.Gradient(node)
-  } else if (SVG[capitalize(node.nodeName)]) {
-    element = new SVG[capitalize(node.nodeName)](node)
-  } else {
-    element = new SVG.Parent(node)
-  }
-
-  return element
-}
-
-// Storage for regular expressions
-SVG.regex = {
-  // Parse unit value
-  numberAndUnit: /^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i,
-
-  // Parse hex value
-  hex: /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,
-
-  // Parse rgb value
-  rgb: /rgb\((\d+),(\d+),(\d+)\)/,
-
-  // Parse reference id
-  reference: /#([a-z0-9\-_]+)/i,
-
-  // splits a transformation chain
-  transforms: /\)\s*,?\s*/,
-
-  // Whitespace
-  whitespace: /\s/g,
-
-  // Test hex value
-  isHex: /^#[a-f0-9]{3,6}$/i,
-
-  // Test rgb value
-  isRgb: /^rgb\(/,
-
-  // Test css declaration
-  isCss: /[^:]+:[^;]+;?/,
-
-  // Test for blank string
-  isBlank: /^(\s+)?$/,
-
-  // Test for numeric string
-  isNumber: /^[+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,
-
-  // Test for percent value
-  isPercent: /^-?[\d.]+%$/,
-
-  // Test for image url
-  isImage: /\.(jpg|jpeg|png|gif|svg)(\?[^=]+.*)?/i,
-
-  // split at whitespace and comma
-  delimiter: /[\s,]+/,
-
-  // The following regex are used to parse the d attribute of a path
-
-  // Matches all hyphens which are not after an exponent
-  hyphen: /([^e])-/gi,
-
-  // Replaces and tests for all path letters
-  pathLetters: /[MLHVCSQTAZ]/gi,
-
-  // yes we need this one, too
-  isPathLetter: /[MLHVCSQTAZ]/i,
-
-  // matches 0.154.23.45
-  numbersWithDots: /((\d?\.\d+(?:e[+-]?\d+)?)((?:\.\d+(?:e[+-]?\d+)?)+))+/gi,
-
-  // matches .
-  dots: /\./g
-}
-
-
-SVG.utils = {
-  // Map function
-  map: function (array, block) {
-    var i
-    var il = array.length
-    var result = []
-
-    for (i = 0; i < il; i++) {
-      result.push(block(array[i]))
-    }
-
-    return result
-  },
-
-  // Filter function
-  filter: function (array, block) {
-    var i
-    var il = array.length
-    var result = []
-
-    for (i = 0; i < il; i++) {
-      if (block(array[i])) { result.push(array[i]) }
-    }
-
-    return result
-  },
-
-  // Degrees to radians
-  radians: function (d) {
-    return d % 360 * Math.PI / 180
-  },
-
-  // Radians to degrees
-  degrees: function (r) {
-    return r * 180 / Math.PI % 360
-  },
-
-  filterSVGElements: function (nodes) {
-    return this.filter(nodes, function (el) { return el instanceof window.SVGElement })
-  }
-
-}
-
-
-SVG.void = function () {}
-
-SVG.defaults = {
-
-  // Default animation values
-  timeline: {
-    duration: 400,
-    ease: '>',
-    delay: 0
-  },
-
-  // Default attribute values
-  attrs: {
-
-    // fill and stroke
-    'fill-opacity': 1,
-    'stroke-opacity': 1,
-    'stroke-width': 0,
-    'stroke-linejoin': 'miter',
-    'stroke-linecap': 'butt',
-    fill: '#000000',
-    stroke: '#000000',
-    opacity: 1,
-
-    // position
-    x: 0,
-    y: 0,
-    cx: 0,
-    cy: 0,
-
-    // size
-    width: 0,
-    height: 0,
-
-    // radius
-    r: 0,
-    rx: 0,
-    ry: 0,
-
-    // gradient
-    offset: 0,
-    'stop-opacity': 1,
-    'stop-color': '#000000',
-
-    // text
-    'font-size': 16,
-    'font-family': 'Helvetica, Arial, sans-serif',
-    'text-anchor': 'start'
-  }
-}
-
-SVG.Queue = SVG.invent({
-  create: function () {
-    this._first = null
-    this._last = null
-  },
-
-  extend: {
-    push: function (value) {
-      // An item stores an id and the provided value
-      var item = value.next ? value : { value: value, next: null, prev: null }
-
-      // Deal with the queue being empty or populated
-      if (this._last) {
-        item.prev = this._last
-        this._last.next = item
-        this._last = item
-      } else {
-        this._last = item
-        this._first = item
-      }
-
-      // Update the length and return the current item
-      return item
-    },
-
-    shift: function () {
-      // Check if we have a value
-      var remove = this._first
-      if (!remove) return null
-
-      // If we do, remove it and relink things
-      this._first = remove.next
-      if (this._first) this._first.prev = null
-      this._last = this._first ? this._last : null
-      return remove.value
-    },
-
-    // Shows us the first item in the list
-    first: function () {
-      return this._first && this._first.value
-    },
-
-    // Shows us the last item in the list
-    last: function () {
-      return this._last && this._last.value
-    },
-
-    // Removes the item that was returned from the push
-    remove: function (item) {
-      // Relink the previous item
-      if (item.prev) item.prev.next = item.next
-      if (item.next) item.next.prev = item.prev
-      if (item === this._last) this._last = item.prev
-      if (item === this._first) this._first = item.next
-
-      // Invalidate item
-      item.prev = null
-      item.next = null
-    }
-  }
-})
-
-/* globals fullHex, compToHex */
-
-/*
-
-Color {
-  constructor (a, b, c, space) {
-    space: 'hsl'
-    a: 30
-    b: 20
-    c: 10
-  },
-
-  toRgb () { return new Color in rgb space }
-  toHsl () { return new Color in hsl space }
-  toLab () { return new Color in lab space }
-
-  toArray () { [space, a, b, c] }
-  fromArray () { convert it back }
-}
-
-// Conversions aren't always exact because of monitor profiles etc...
-new Color(h, s, l, 'hsl') !== new Color(r, g, b).hsl()
-new Color(100, 100, 100, [space])
-new Color('hsl(30, 20, 10)')
-
-// Sugar
-SVG.rgb(30, 20, 50).lab()
-SVG.hsl()
-SVG.lab('rgb(100, 100, 100)')
-*/
-
-// Module for color convertions
-SVG.Color = function (color, g, b) {
-  var match
-
-  // initialize defaults
-  this.r = 0
-  this.g = 0
-  this.b = 0
-
-  if (!color) return
-
-  // parse color
-  if (typeof color === 'string') {
-    if (SVG.regex.isRgb.test(color)) {
-      // get rgb values
-      match = SVG.regex.rgb.exec(color.replace(SVG.regex.whitespace, ''))
-
-      // parse numeric values
-      this.r = parseInt(match[1])
-      this.g = parseInt(match[2])
-      this.b = parseInt(match[3])
-    } else if (SVG.regex.isHex.test(color)) {
-      // get hex values
-      match = SVG.regex.hex.exec(fullHex(color))
-
-      // parse numeric values
-      this.r = parseInt(match[1], 16)
-      this.g = parseInt(match[2], 16)
-      this.b = parseInt(match[3], 16)
-    }
-  } else if (Array.isArray(color)) {
-    this.r = color[0]
-    this.g = color[1]
-    this.b = color[2]
-  } else if (typeof color === 'object') {
-    this.r = color.r
-    this.g = color.g
-    this.b = color.b
-  } else if (arguments.length === 3) {
-    this.r = color
-    this.g = g
-    this.b = b
-  }
-}
-
-SVG.extend(SVG.Color, {
-  // Default to hex conversion
-  toString: function () {
-    return this.toHex()
-  },
-  toArray: function () {
-    return [this.r, this.g, this.b]
-  },
-  fromArray: function (a) {
-    return new SVG.Color(a)
-  },
-  // Build hex value
-  toHex: function () {
-    return '#' +
-      compToHex(Math.round(this.r)) +
-      compToHex(Math.round(this.g)) +
-      compToHex(Math.round(this.b))
-  },
-  // Build rgb value
-  toRgb: function () {
-    return 'rgb(' + [this.r, this.g, this.b].join() + ')'
-  },
-  // Calculate true brightness
-  brightness: function () {
-    return (this.r / 255 * 0.30) +
-      (this.g / 255 * 0.59) +
-      (this.b / 255 * 0.11)
-  },
-  // Make color morphable
-  morph: function (color) {
-    this.destination = new SVG.Color(color)
-
-    return this
-  },
-  // Get morphed color at given position
-  at: function (pos) {
-    // make sure a destination is defined
-    if (!this.destination) return this
-
-    // normalise pos
-    pos = pos < 0 ? 0 : pos > 1 ? 1 : pos
-
-    // generate morphed color
-    return new SVG.Color({
-      r: ~~(this.r + (this.destination.r - this.r) * pos),
-      g: ~~(this.g + (this.destination.g - this.g) * pos),
-      b: ~~(this.b + (this.destination.b - this.b) * pos)
-    })
-  }
-
-})
-
-// Testers
-
-// Test if given value is a color string
-SVG.Color.test = function (color) {
-  color += ''
-  return SVG.regex.isHex.test(color) ||
-    SVG.regex.isRgb.test(color)
-}
-
-// Test if given value is a rgb object
-SVG.Color.isRgb = function (color) {
-  return color && typeof color.r === 'number' &&
-    typeof color.g === 'number' &&
-    typeof color.b === 'number'
-}
-
-// Test if given value is a color
-SVG.Color.isColor = function (color) {
-  return SVG.Color.isRgb(color) || SVG.Color.test(color)
-}
-
-/* global arrayClone */
-
-// Module for array conversion
-SVG.Array = function (array, fallback) {
-  array = (array || []).valueOf()
-
-  // if array is empty and fallback is provided, use fallback
-  if (array.length === 0 && fallback) {
-    array = fallback.valueOf()
-  }
-
-  // parse array
-  this.value = this.parse(array)
-}
-
-SVG.extend(SVG.Array, {
-  // Make array morphable
-  morph: function (array) {
-    this.destination = this.parse(array)
-
-    // normalize length of arrays
-    if (this.value.length !== this.destination.length) {
-      var lastValue = this.value[this.value.length - 1]
-      var lastDestination = this.destination[this.destination.length - 1]
-
-      while (this.value.length > this.destination.length) {
-        this.destination.push(lastDestination)
-      }
-      while (this.value.length < this.destination.length) {
-        this.value.push(lastValue)
-      }
-    }
-
-    return this
-  },
-  // Clean up any duplicate points
-  settle: function () {
-    // find all unique values
-    for (var i = 0, il = this.value.length, seen = []; i < il; i++) {
-      if (seen.indexOf(this.value[i]) === -1) {
-        seen.push(this.value[i])
-      }
-    }
-
-    // set new value
-    this.value = seen
-    return seen
-  },
-  // Get morphed array at given position
-  at: function (pos) {
-    // make sure a destination is defined
-    if (!this.destination) return this
-
-    // generate morphed array
-    for (var i = 0, il = this.value.length, array = []; i < il; i++) {
-      array.push(this.value[i] + (this.destination[i] - this.value[i]) * pos)
-    }
-
-    return new SVG.Array(array)
-  },
-  toArray: function () {
-    return this.value
-  },
-  // Convert array to string
-  toString: function () {
-    return this.value.join(' ')
-  },
-  // Real value
-  valueOf: function () {
-    return this.value
-  },
-  // Parse whitespace separated string
-  parse: function (array) {
-    array = array.valueOf()
-
-    // if already is an array, no need to parse it
-    if (Array.isArray(array)) return array
-
-    return array.trim().split(SVG.regex.delimiter).map(parseFloat)
-  },
-  // Reverse array
-  reverse: function () {
-    this.value.reverse()
-
-    return this
-  },
-  clone: function () {
-    var clone = new this.constructor()
-    clone.value = arrayClone(this.value)
-    return clone
-  }
-})
-
-
-// Poly points array
-SVG.PointArray = function (array, fallback) {
-  SVG.Array.call(this, array, fallback || [[0, 0]])
-}
-
-// Inherit from SVG.Array
-SVG.PointArray.prototype = new SVG.Array()
-SVG.PointArray.prototype.constructor = SVG.PointArray
-
-SVG.extend(SVG.PointArray, {
-  // Convert array to string
-  toString: function () {
-    // convert to a poly point string
-    for (var i = 0, il = this.value.length, array = []; i < il; i++) {
-      array.push(this.value[i].join(','))
-    }
-
-    return array.join(' ')
-  },
-
-  toArray: function () {
-    return this.value.reduce(function (prev, curr) {
-      return [].concat.call(prev, curr)
-    }, [])
-  },
-
-  // Convert array to line object
-  toLine: function () {
-    return {
-      x1: this.value[0][0],
-      y1: this.value[0][1],
-      x2: this.value[1][0],
-      y2: this.value[1][1]
-    }
-  },
-
-  // Get morphed array at given position
-  at: function (pos) {
-    // make sure a destination is defined
-    if (!this.destination) return this
-
-    // generate morphed point string
-    for (var i = 0, il = this.value.length, array = []; i < il; i++) {
-      array.push([
-        this.value[i][0] + (this.destination[i][0] - this.value[i][0]) * pos,
-        this.value[i][1] + (this.destination[i][1] - this.value[i][1]) * pos
-      ])
-    }
-
-    return new SVG.PointArray(array)
-  },
-
-  // Parse point string and flat array
-  parse: function (array) {
-    var points = []
-
-    array = array.valueOf()
-
-    // if it is an array
-    if (Array.isArray(array)) {
-      // and it is not flat, there is no need to parse it
-      if (Array.isArray(array[0])) {
-        return array
-      }
-    } else { // Else, it is considered as a string
-      // parse points
-      array = array.trim().split(SVG.regex.delimiter).map(parseFloat)
-    }
-
-    // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints
-    // Odd number of coordinates is an error. In such cases, drop the last odd coordinate.
-    if (array.length % 2 !== 0) array.pop()
-
-    // wrap points in two-tuples and parse points as floats
-    for (var i = 0, len = array.length; i < len; i = i + 2) {
-      points.push([ array[i], array[i + 1] ])
-    }
-
-    return points
-  },
-
-  // Move point string
-  move: function (x, y) {
-    var box = this.bbox()
-
-    // get relative offset
-    x -= box.x
-    y -= box.y
-
-    // move every point
-    if (!isNaN(x) && !isNaN(y)) {
-      for (var i = this.value.length - 1; i >= 0; i--) {
-        this.value[i] = [this.value[i][0] + x, this.value[i][1] + y]
-      }
-    }
-
-    return this
-  },
-  // Resize poly string
-  size: function (width, height) {
-    var i
-    var box = this.bbox()
-
-    // recalculate position of all points according to new size
-    for (i = this.value.length - 1; i >= 0; i--) {
-      if (box.width) this.value[i][0] = ((this.value[i][0] - box.x) * width) / box.width + box.x
-      if (box.height) this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y
-    }
-
-    return this
-  },
-
-  // Get bounding box of points
-  bbox: function () {
-    var maxX = -Infinity
-    var maxY = -Infinity
-    var minX = Infinity
-    var minY = Infinity
-    this.value.forEach(function (el) {
-      maxX = Math.max(el[0], maxX)
-      maxY = Math.max(el[1], maxY)
-      minX = Math.min(el[0], minX)
-      minY = Math.min(el[1], minY)
-    })
-    return {x: minX, y: minY, width: maxX - minX, height: maxY - minY}
-  }
-})
-
-/* globals arrayToString, pathRegReplace */
-
-var pathHandlers = {
-  M: function (c, p, p0) {
-    p.x = p0.x = c[0]
-    p.y = p0.y = c[1]
-
-    return ['M', p.x, p.y]
-  },
-  L: function (c, p) {
-    p.x = c[0]
-    p.y = c[1]
-    return ['L', c[0], c[1]]
-  },
-  H: function (c, p) {
-    p.x = c[0]
-    return ['H', c[0]]
-  },
-  V: function (c, p) {
-    p.y = c[0]
-    return ['V', c[0]]
-  },
-  C: function (c, p) {
-    p.x = c[4]
-    p.y = c[5]
-    return ['C', c[0], c[1], c[2], c[3], c[4], c[5]]
-  },
-  S: function (c, p) {
-    p.x = c[2]
-    p.y = c[3]
-    return ['S', c[0], c[1], c[2], c[3]]
-  },
-  Q: function (c, p) {
-    p.x = c[2]
-    p.y = c[3]
-    return ['Q', c[0], c[1], c[2], c[3]]
-  },
-  T: function (c, p) {
-    p.x = c[0]
-    p.y = c[1]
-    return ['T', c[0], c[1]]
-  },
-  Z: function (c, p, p0) {
-    p.x = p0.x
-    p.y = p0.y
-    return ['Z']
-  },
-  A: function (c, p) {
-    p.x = c[5]
-    p.y = c[6]
-    return ['A', c[0], c[1], c[2], c[3], c[4], c[5], c[6]]
-  }
-}
-
-var mlhvqtcsaz = 'mlhvqtcsaz'.split('')
-
-for (var i = 0, il = mlhvqtcsaz.length; i < il; ++i) {
-  pathHandlers[mlhvqtcsaz[i]] = (function (i) {
-    return function (c, p, p0) {
-      if (i === 'H') c[0] = c[0] + p.x
-      else if (i === 'V') c[0] = c[0] + p.y
-      else if (i === 'A') {
-        c[5] = c[5] + p.x
-        c[6] = c[6] + p.y
-      } else {
-        for (var j = 0, jl = c.length; j < jl; ++j) {
-          c[j] = c[j] + (j % 2 ? p.y : p.x)
-        }
-      }
-
-      return pathHandlers[i](c, p, p0)
-    }
-  })(mlhvqtcsaz[i].toUpperCase())
-}
-
-// Path points array
-SVG.PathArray = function (array, fallback) {
-  SVG.Array.call(this, array, fallback || [['M', 0, 0]])
-}
-
-// Inherit from SVG.Array
-SVG.PathArray.prototype = new SVG.Array()
-SVG.PathArray.prototype.constructor = SVG.PathArray
-
-SVG.extend(SVG.PathArray, {
-  // Convert array to string
-  toString: function () {
-    return arrayToString(this.value)
-  },
-  toArray: function () {
-    return this.value.reduce(function (prev, curr) {
-      return [].concat.call(prev, curr)
-    }, [])
-  },
-  // Move path string
-  move: function (x, y) {
-    // get bounding box of current situation
-    var box = this.bbox()
-
-    // get relative offset
-    x -= box.x
-    y -= box.y
-
-    if (!isNaN(x) && !isNaN(y)) {
-      // move every point
-      for (var l, i = this.value.length - 1; i >= 0; i--) {
-        l = this.value[i][0]
-
-        if (l === 'M' || l === 'L' || l === 'T') {
-          this.value[i][1] += x
-          this.value[i][2] += y
-        } else if (l === 'H') {
-          this.value[i][1] += x
-        } else if (l === 'V') {
-          this.value[i][1] += y
-        } else if (l === 'C' || l === 'S' || l === 'Q') {
-          this.value[i][1] += x
-          this.value[i][2] += y
-          this.value[i][3] += x
-          this.value[i][4] += y
-
-          if (l === 'C') {
-            this.value[i][5] += x
-            this.value[i][6] += y
-          }
-        } else if (l === 'A') {
-          this.value[i][6] += x
-          this.value[i][7] += y
-        }
-      }
-    }
-
-    return this
-  },
-  // Resize path string
-  size: function (width, height) {
-    // get bounding box of current situation
-    var box = this.bbox()
-    var i, l
-
-    // recalculate position of all points according to new size
-    for (i = this.value.length - 1; i >= 0; i--) {
-      l = this.value[i][0]
-
-      if (l === 'M' || l === 'L' || l === 'T') {
-        this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x
-        this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y
-      } else if (l === 'H') {
-        this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x
-      } else if (l === 'V') {
-        this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y
-      } else if (l === 'C' || l === 'S' || l === 'Q') {
-        this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x
-        this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y
-        this.value[i][3] = ((this.value[i][3] - box.x) * width) / box.width + box.x
-        this.value[i][4] = ((this.value[i][4] - box.y) * height) / box.height + box.y
-
-        if (l === 'C') {
-          this.value[i][5] = ((this.value[i][5] - box.x) * width) / box.width + box.x
-          this.value[i][6] = ((this.value[i][6] - box.y) * height) / box.height + box.y
-        }
-      } else if (l === 'A') {
-        // resize radii
-        this.value[i][1] = (this.value[i][1] * width) / box.width
-        this.value[i][2] = (this.value[i][2] * height) / box.height
-
-        // move position values
-        this.value[i][6] = ((this.value[i][6] - box.x) * width) / box.width + box.x
-        this.value[i][7] = ((this.value[i][7] - box.y) * height) / box.height + box.y
-      }
-    }
-
-    return this
-  },
-  // Test if the passed path array use the same path data commands as this path array
-  equalCommands: function (pathArray) {
-    var i, il, equalCommands
-
-    pathArray = new SVG.PathArray(pathArray)
-
-    equalCommands = this.value.length === pathArray.value.length
-    for (i = 0, il = this.value.length; equalCommands && i < il; i++) {
-      equalCommands = this.value[i][0] === pathArray.value[i][0]
-    }
-
-    return equalCommands
-  },
-  // Make path array morphable
-  morph: function (pathArray) {
-    pathArray = new SVG.PathArray(pathArray)
-
-    if (this.equalCommands(pathArray)) {
-      this.destination = pathArray
-    } else {
-      this.destination = null
-    }
-
-    return this
-  },
-  // Get morphed path array at given position
-  at: function (pos) {
-    // make sure a destination is defined
-    if (!this.destination) return this
-
-    var sourceArray = this.value
-    var destinationArray = this.destination.value
-    var array = []
-    var pathArray = new SVG.PathArray()
-    var i, il, j, jl
-
-    // Animate has specified in the SVG spec
-    // See: https://www.w3.org/TR/SVG11/paths.html#PathElement
-    for (i = 0, il = sourceArray.length; i < il; i++) {
-      array[i] = [sourceArray[i][0]]
-      for (j = 1, jl = sourceArray[i].length; j < jl; j++) {
-        array[i][j] = sourceArray[i][j] + (destinationArray[i][j] - sourceArray[i][j]) * pos
-      }
-      // For the two flags of the elliptical arc command, the SVG spec say:
-      // Flags and booleans are interpolated as fractions between zero and one, with any non-zero value considered to be a value of one/true
-      // Elliptical arc command as an array followed by corresponding indexes:
-      // ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]
-      //   0    1   2        3                 4             5      6  7
-      if (array[i][0] === 'A') {
-        array[i][4] = +(array[i][4] !== 0)
-        array[i][5] = +(array[i][5] !== 0)
-      }
-    }
-
-    // Directly modify the value of a path array, this is done this way for performance
-    pathArray.value = array
-    return pathArray
-  },
-  // Absolutize and parse path to array
-  parse: function (array) {
-    // if it's already a patharray, no need to parse it
-    if (array instanceof SVG.PathArray) return array.valueOf()
-
-    // prepare for parsing
-    var s
-    var paramCnt = { 'M': 2, 'L': 2, 'H': 1, 'V': 1, 'C': 6, 'S': 4, 'Q': 4, 'T': 2, 'A': 7, 'Z': 0 }
-
-    if (typeof array === 'string') {
-      array = array
-        .replace(SVG.regex.numbersWithDots, pathRegReplace) // convert 45.123.123 to 45.123 .123
-        .replace(SVG.regex.pathLetters, ' $& ') // put some room between letters and numbers
-        .replace(SVG.regex.hyphen, '$1 -')      // add space before hyphen
-        .trim()                                 // trim
-        .split(SVG.regex.delimiter)   // split into array
-    } else {
-      array = array.reduce(function (prev, curr) {
-        return [].concat.call(prev, curr)
-      }, [])
-    }
-
-    // array now is an array containing all parts of a path e.g. ['M', '0', '0', 'L', '30', '30' ...]
-    var result = []
-    var p = new SVG.Point()
-    var p0 = new SVG.Point()
-    var index = 0
-    var len = array.length
-
-    do {
-      // Test if we have a path letter
-      if (SVG.regex.isPathLetter.test(array[index])) {
-        s = array[index]
-        ++index
-      // If last letter was a move command and we got no new, it defaults to [L]ine
-      } else if (s === 'M') {
-        s = 'L'
-      } else if (s === 'm') {
-        s = 'l'
-      }
-
-      result.push(pathHandlers[s].call(null,
-          array.slice(index, (index = index + paramCnt[s.toUpperCase()])).map(parseFloat),
-          p, p0
-        )
-      )
-    } while (len > index)
-
-    return result
-  },
-  // Get bounding box of path
-  bbox: function () {
-    SVG.parser().path.setAttribute('d', this.toString())
-    return SVG.parser.nodes.path.getBBox()
-  }
-
-})
-
-
-// Module for unit convertions
-SVG.Number = SVG.invent({
-  // Initialize
-  create: function (value, unit) {
-    unit = Array.isArray(value) ? value[1] : unit
-    value = Array.isArray(value) ? value[0] : value
-
-    // initialize defaults
-    this.value = 0
-    this.unit = unit || ''
-
-    // parse value
-    if (typeof value === 'number') {
-      // ensure a valid numeric value
-      this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value
-    } else if (typeof value === 'string') {
-      unit = value.match(SVG.regex.numberAndUnit)
-
-      if (unit) {
-        // make value numeric
-        this.value = parseFloat(unit[1])
-
-        // normalize
-        if (unit[5] === '%') { this.value /= 100 } else if (unit[5] === 's') {
-          this.value *= 1000
-        }
-
-        // store unit
-        this.unit = unit[5]
-      }
-    } else {
-      if (value instanceof SVG.Number) {
-        this.value = value.valueOf()
-        this.unit = value.unit
-      }
-    }
-  },
-  // Add methods
-  extend: {
-    // Stringalize
-    toString: function () {
-      return (this.unit === '%' ? ~~(this.value * 1e8) / 1e6
-        : this.unit === 's' ? this.value / 1e3
-        : this.value
-      ) + this.unit
-    },
-    toJSON: function () {
-      return this.toString()
-    },   // Convert to primitive
-    toArray: function () {
-      return [this.value, this.unit]
-    },
-    valueOf: function () {
-      return this.value
-    },
-    // Add number
-    plus: function (number) {
-      number = new SVG.Number(number)
-      return new SVG.Number(this + number, this.unit || number.unit)
-    },
-    // Subtract number
-    minus: function (number) {
-      number = new SVG.Number(number)
-      return new SVG.Number(this - number, this.unit || number.unit)
-    },
-    // Multiply number
-    times: function (number) {
-      number = new SVG.Number(number)
-      return new SVG.Number(this * number, this.unit || number.unit)
-    },
-    // Divide number
-    divide: function (number) {
-      number = new SVG.Number(number)
-      return new SVG.Number(this / number, this.unit || number.unit)
-    },
-    // Convert to different unit
-    to: function (unit) {
-      var number = new SVG.Number(this)
-
-      if (typeof unit === 'string') {
-        number.unit = unit
-      }
-
-      return number
-    },
-    // Make number morphable
-    morph: function (number) {
-      this.destination = new SVG.Number(number)
-
-      if (number.relative) {
-        this.destination.value += this.value
-      }
-
-      return this
-    },
-    // Get morphed number at given position
-    at: function (pos) {
-      // Make sure a destination is defined
-      if (!this.destination) return this
-
-      // Generate new morphed number
-      return new SVG.Number(this.destination)
-          .minus(this)
-          .times(pos)
-          .plus(this)
-    }
-  }
-})
-
-// Add events to elements
-/*
-;[ 'click',
-  'dblclick',
-  'mousedown',
-  'mouseup',
-  'mouseover',
-  'mouseout',
-  'mousemove',
-  'mouseenter',
-  'mouseleave',
-  'touchstart',
-  'touchmove',
-  'touchleave',
-  'touchend',
-  'touchcancel' ].forEach(function (event) {
-    // add event to SVG.Element
-    SVG.Element.prototype[event] = function (f) {
-    // bind event to element rather than element node
-      SVG.on(this, event, f)
-      return this
-    }
-  })
-*/
-
-SVG.listenerId = 0
-
-// Add event binder in the SVG namespace
-SVG.on = function (node, events, listener, binding, options) {
-  var l = listener.bind(binding || node)
-  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node
-
-  // events can be an array of events or a string of events
-  events = Array.isArray(events) ? events : events.split(SVG.regex.delimiter)
-
-  // ensure instance object for nodes which are not adopted
-  n.instance = n.instance || {events: {}}
-
-  // pull event handlers from the element
-  var bag = n.instance.events
-
-  // add id to listener
-  if (!listener._svgjsListenerId) {
-    listener._svgjsListenerId = ++SVG.listenerId
-  }
-
-  events.forEach(function (event) {
-    var ev = event.split('.')[0]
-    var ns = event.split('.')[1] || '*'
-
-    // ensure valid object
-    bag[ev] = bag[ev] || {}
-    bag[ev][ns] = bag[ev][ns] || {}
-
-    // reference listener
-    bag[ev][ns][listener._svgjsListenerId] = l
-
-    // add listener
-    n.addEventListener(ev, l, options || false)
-  })
-}
-
-// Add event unbinder in the SVG namespace
-SVG.off = function (node, events, listener, options) {
-  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node
-  if (!n.instance) return
-
-  // listener can be a function or a number
-  if (typeof listener === 'function') {
-    listener = listener._svgjsListenerId
-    if (!listener) return
-  }
-
-  // pull event handlers from the element
-  var bag = n.instance.events
-
-  // events can be an array of events or a string or undefined
-  events = Array.isArray(events) ? events : (events || '').split(SVG.regex.delimiter)
-
-  events.forEach(function (event) {
-    var ev = event && event.split('.')[0]
-    var ns = event && event.split('.')[1]
-    var namespace, l
-
-    if (listener) {
-      // remove listener reference
-      if (bag[ev] && bag[ev][ns || '*']) {
-        // removeListener
-        n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false)
-
-        delete bag[ev][ns || '*'][listener]
-      }
-    } else if (ev && ns) {
-      // remove all listeners for a namespaced event
-      if (bag[ev] && bag[ev][ns]) {
-        for (l in bag[ev][ns]) { SVG.off(n, [ev, ns].join('.'), l) }
-
-        delete bag[ev][ns]
-      }
-    } else if (ns) {
-      // remove all listeners for a specific namespace
-      for (event in bag) {
-        for (namespace in bag[event]) {
-          if (ns === namespace) { SVG.off(n, [event, ns].join('.')) }
-        }
-      }
-    } else if (ev) {
-      // remove all listeners for the event
-      if (bag[ev]) {
-        for (namespace in bag[ev]) { SVG.off(n, [ev, namespace].join('.')) }
-
-        delete bag[ev]
-      }
-    } else {
-      // remove all listeners on a given node
-      for (event in bag) { SVG.off(n, event) }
-
-      n.instance.events = {}
-    }
-  })
-}
-
-SVG.dispatch = function (node, event, data) {
-  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node
-
-  // Dispatch event
-  if (event instanceof window.Event) {
-    n.dispatchEvent(event)
-  } else {
-    event = new window.CustomEvent(event, {detail: data, cancelable: true})
-    n.dispatchEvent(event)
-  }
-  return event
-}
-
-SVG.EventTarget = SVG.invent({
-  create: function () {},
-  extend: {
-    // Bind given event to listener
-    on: function (event, listener, binding, options) {
-      SVG.on(this, event, listener, binding, options)
-      return this
-    },
-    // Unbind event from listener
-    off: function (event, listener) {
-      SVG.off(this, event, listener)
-      return this
-    },
-    dispatch: function (event, data) {
-      return SVG.dispatch(this, event, data)
-    },
-    // Fire given event
-    fire: function (event, data) {
-      this.dispatch(event, data)
-      return this
-    }
-  }
-})
-
-/* global createElement */
-
-SVG.HtmlNode = SVG.invent({
-  inherit: SVG.EventTarget,
-  create: function (element) {
-    this.node = element
-  },
-
-  extend: {
-    add: function (element, i) {
-      element = createElement(element)
-
-      if (element.node !== this.node.children[i]) {
-        this.node.insertBefore(element.node, this.node.children[i] || null)
-      }
-
-      return this
-    },
-
-    put: function (element, i) {
-      this.add(element, i)
-      return element
-    },
-
-    getEventTarget: function () {
-      return this.node
-    }
-  }
-})
-
-/* global proportionalSize, assignNewId, createElement, matches, is */
-
-SVG.Element = SVG.invent({
-  inherit: SVG.EventTarget,
-
-  // Initialize node
-  create: function (node) {
-    // event listener
-    this.events = {}
-
-    // initialize data object
-    this.dom = {}
-
-    // create circular reference
-    this.node = node
-    if (this.node) {
-      this.type = node.nodeName
-      this.node.instance = this
-      this.events = node.events || {}
-
-      if (node.hasAttribute('svgjs:data')) {
-        // pull svgjs data from the dom (getAttributeNS doesn't work in html5)
-        this.setData(JSON.parse(node.getAttribute('svgjs:data')) || {})
-      }
-    }
-  },
-
-  // Add class methods
-  extend: {
-    // Move over x-axis
-    x: function (x) {
-      return this.attr('x', x)
-    },
-
-    // Move over y-axis
-    y: function (y) {
-      return this.attr('y', y)
-    },
-
-    // Move by center over x-axis
-    cx: function (x) {
-      return x == null ? this.x() + this.width() / 2 : this.x(x - this.width() / 2)
-    },
-
-    // Move by center over y-axis
-    cy: function (y) {
-      return y == null
-        ? this.y() + this.height() / 2
-        : this.y(y - this.height() / 2)
-    },
-
-    // Move element to given x and y values
-    move: function (x, y) {
-      return this.x(x).y(y)
-    },
-
-    // Move element by its center
-    center: function (x, y) {
-      return this.cx(x).cy(y)
-    },
-
-    // Set width of element
-    width: function (width) {
-      return this.attr('width', width)
-    },
-
-    // Set height of element
-    height: function (height) {
-      return this.attr('height', height)
-    },
-
-    // Set element size to given width and height
-    size: function (width, height) {
-      var p = proportionalSize(this, width, height)
-
-      return this
-        .width(new SVG.Number(p.width))
-        .height(new SVG.Number(p.height))
-    },
-
-    // Clone element
-    clone: function (parent) {
-      // write dom data to the dom so the clone can pickup the data
-      this.writeDataToDom()
-
-      // clone element and assign new id
-      var clone = assignNewId(this.node.cloneNode(true))
-
-      // insert the clone in the given parent or after myself
-      if (parent) parent.add(clone)
-      else this.after(clone)
-
-      return clone
-    },
-
-    // Remove element
-    remove: function () {
-      if (this.parent()) { this.parent().removeElement(this) }
-
-      return this
-    },
-
-    // Replace element
-    replace: function (element) {
-      this.after(element).remove()
-
-      return element
-    },
-
-    // Add element to given container and return self
-    addTo: function (parent) {
-      return createElement(parent).put(this)
-    },
-
-    // Add element to given container and return container
-    putIn: function (parent) {
-      return createElement(parent).add(this)
-    },
-
-    // Get / set id
-    id: function (id) {
-      // generate new id if no id set
-      if (typeof id === 'undefined' && !this.node.id) {
-        this.node.id = SVG.eid(this.type)
-      }
-
-      // dont't set directly width this.node.id to make `null` work correctly
-      return this.attr('id', id)
-    },
-
-    // Checks whether the given point inside the bounding box of the element
-    inside: function (x, y) {
-      var box = this.bbox()
-
-      return x > box.x &&
-        y > box.y &&
-        x < box.x + box.width &&
-        y < box.y + box.height
-    },
-
-    // Show element
-    show: function () {
-      return this.css('display', '')
-    },
-
-    // Hide element
-    hide: function () {
-      return this.css('display', 'none')
-    },
-
-    // Is element visible?
-    visible: function () {
-      return this.css('display') !== 'none'
-    },
-
-    // Return id on string conversion
-    toString: function () {
-      return this.id()
-    },
-
-    // Return array of classes on the node
-    classes: function () {
-      var attr = this.attr('class')
-      return attr == null ? [] : attr.trim().split(SVG.regex.delimiter)
-    },
-
-    // Return true if class exists on the node, false otherwise
-    hasClass: function (name) {
-      return this.classes().indexOf(name) !== -1
-    },
-
-    // Add class to the node
-    addClass: function (name) {
-      if (!this.hasClass(name)) {
-        var array = this.classes()
-        array.push(name)
-        this.attr('class', array.join(' '))
-      }
-
-      return this
-    },
-
-    // Remove class from the node
-    removeClass: function (name) {
-      if (this.hasClass(name)) {
-        this.attr('class', this.classes().filter(function (c) {
-          return c !== name
-        }).join(' '))
-      }
-
-      return this
-    },
-
-    // Toggle the presence of a class on the node
-    toggleClass: function (name) {
-      return this.hasClass(name) ? this.removeClass(name) : this.addClass(name)
-    },
-
-    // Get referenced element form attribute value
-    reference: function (attr) {
-      return SVG.get(this.attr(attr))
-    },
-
-    // Returns the parent element instance
-    parent: function (type) {
-      var parent = this
-
-      // check for parent
-      if (!parent.node.parentNode) return null
-
-      // get parent element
-      parent = SVG.adopt(parent.node.parentNode)
-
-      if (!type) return parent
-
-      // loop trough ancestors if type is given
-      while (parent && parent.node instanceof window.SVGElement) {
-        if (typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent
-        parent = SVG.adopt(parent.node.parentNode)
-      }
-    },
-
-    // Get parent document
-    doc: function () {
-      var p = this.parent(SVG.Doc)
-      return p && p.doc()
-    },
-
-    // Get defs
-    defs: function () {
-      return this.doc().defs()
-    },
-
-    // return array of all ancestors of given type up to the root svg
-    parents: function (type) {
-      var parents = []
-      var parent = this
-
-      do {
-        parent = parent.parent(type)
-        if (!parent || !parent.node) break
-
-        parents.push(parent)
-      } while (parent.parent)
-
-      return parents
-    },
-
-    // matches the element vs a css selector
-    matches: function (selector) {
-      return matches(this.node, selector)
-    },
-
-    // Returns the svg node to call native svg methods on it
-    native: function () {
-      return this.node
-    },
-
-    // Import raw svg
-    svg: function (svg) {
-      var well, len
-
-      // act as a setter if svg is given
-      if (svg && this instanceof SVG.Parent) {
-        // create temporary holder
-        well = document.createElementNS(SVG.ns, 'svg')
-        // dump raw svg
-        well.innerHTML = svg
-
-        // transplant nodes
-        for (len = well.children.length; len--;) {
-          this.node.appendChild(well.firstElementChild)
-        }
-
-      // otherwise act as a getter
-      } else {
-        // write svgjs data to the dom
-        this.writeDataToDom()
-
-        return this.node.outerHTML
-      }
-
-      return this
-    },
-
-    // write svgjs data to the dom
-    writeDataToDom: function () {
-      // dump variables recursively
-      if (this.is(SVG.Parent)) {
-        this.each(function () {
-          this.writeDataToDom()
-        })
-      }
-
-      // remove previously set data
-      this.node.removeAttribute('svgjs:data')
-
-      if (Object.keys(this.dom).length) {
-        this.node.setAttribute('svgjs:data', JSON.stringify(this.dom)) // see #428
-      }
-      return this
-    },
-
-    // set given data to the elements data property
-    setData: function (o) {
-      this.dom = o
-      return this
-    },
-    is: function (obj) {
-      return is(this, obj)
-    },
-    getEventTarget: function () {
-      return this.node
-    }
-  }
-})
-
-/* global abcdef, arrayToMatrix, closeEnough, formatTransforms */
-
-SVG.Matrix = SVG.invent({
-  // Initialize
-  create: function (source) {
-    var base = arrayToMatrix([1, 0, 0, 1, 0, 0])
-
-    // ensure source as object
-    source = source instanceof SVG.Element ? source.matrixify()
-      : typeof source === 'string' ? arrayToMatrix(source.split(SVG.regex.delimiter).map(parseFloat))
-      : Array.isArray(source) ? arrayToMatrix(source)
-      : (typeof source === 'object' && (
-          source.a != null || source.b != null || source.c != null ||
-          source.d != null || source.e != null || source.f != null
-        )) ? source
-      : (typeof source === 'object') ? new SVG.Matrix().transform(source)
-      : arguments.length === 6 ? arrayToMatrix([].slice.call(arguments))
-      : base
-
-    // Merge the source matrix with the base matrix
-    this.a = source.a != null ? source.a : base.a
-    this.b = source.b != null ? source.b : base.b
-    this.c = source.c != null ? source.c : base.c
-    this.d = source.d != null ? source.d : base.d
-    this.e = source.e != null ? source.e : base.e
-    this.f = source.f != null ? source.f : base.f
-  },
-
-  // Add methods
-  extend: {
-
-    // Clones this matrix
-    clone: function () {
-      return new SVG.Matrix(this)
-    },
-
-    // Transform a matrix into another matrix by manipulating the space
-    transform: function (o) {
-      // Check if o is a matrix and then left multiply it directly
-      if (o.a != null) {
-        var matrix = new SVG.Matrix(o)
-        var newMatrix = this.lmultiply(matrix)
-        return newMatrix
-      }
-
-      // Get the proposed transformations and the current transformations
-      var t = formatTransforms(o)
-      var currentTransform = new SVG.Matrix(this)
-
-      // Construct the resulting matrix
-      var transformer = new SVG.Matrix()
-        .translate(-t.ox, -t.oy)
-        .scale(t.scaleX, t.scaleY)
-        .skew(t.skewX, t.skewY)
-        .shear(t.shear)
-        .rotate(t.theta)
-        .translate(t.ox, t.oy)
-        .translate(t.rx, t.ry)
-        .lmultiply(currentTransform)
-
-      // If we want the origin at a particular place, we force it there
-      if (isFinite(t.px) || isFinite(t.py)) {
-        // Figure out where the origin went and the delta to get there
-        var current = new SVG.Point(t.ox - t.rx, t.oy - t.ry).transform(transformer)
-        var dx = t.px ? t.px - current.x : 0
-        var dy = t.py ? t.py - current.y : 0
-
-        // Apply another translation
-        transformer = transformer.translate(dx, dy)
-      }
-
-      // We can apply translations after everything else
-      transformer = transformer.translate(t.tx, t.ty)
-      return transformer
-    },
-
-    // Applies a matrix defined by its affine parameters
-    compose: function (o) {
-      if (o.origin) {
-        o.originX = o.origin[0]
-        o.originY = o.origin[1]
-      }
-      // Get the parameters
-      var ox = o.originX || 0
-      var oy = o.originY || 0
-      var sx = o.scaleX || 1
-      var sy = o.scaleY || 1
-      var lam = o.shear || 0
-      var theta = o.rotate || 0
-      var tx = o.translateX || 0
-      var ty = o.translateY || 0
-
-      // Apply the standard matrix
-      var result = new SVG.Matrix()
-        .translate(-ox, -oy)
-        .scale(sx, sy)
-        .shear(lam)
-        .rotate(theta)
-        .translate(tx, ty)
-        .lmultiply(this)
-        .translate(ox, oy)
-      return result
-    },
-
-    // Decomposes this matrix into its affine parameters
-    decompose: function (ox=0, oy=0) {
-      // Get the parameters from the matrix
-      var a = this.a
-      var b = this.b
-      var c = this.c
-      var d = this.d
-      var e = this.e - ox
-      var f = this.f - oy
-
-      // Figure out if the winding direction is clockwise or counterclockwise
-      var determinant = a * d - b * c
-      var ccw = determinant > 0 ? 1 : -1
-
-      // Since we only shear in x, we can use the x basis to get the x scale
-      // and the rotation of the resulting matrix
-      var sx = ccw * Math.sqrt(a * a + b * b)
-      var theta = 180 / Math.PI * Math.atan2(ccw * b, ccw * a)
-
-      // We can then solve the y basis vector simultaneously to get the other
-      // two affine parameters directly from these parameters
-      var lam = (a * c + b * d) / determinant
-      var sy = ((c * sx) / (lam * a - b)) || ((d * sx) / (lam * b + a))
-
-      // Construct the decomposition and return it
-      return {
-        // Return the affine parameters
-        scaleX: sx,
-        scaleY: sy,
-        shear: lam,
-        rotate: theta,
-        translateX: e + ox,
-        translateY: f + oy,
-        originX: ox,
-        originY: oy,
-
-        // Return the matrix parameters
-        a: this.a,
-        b: this.b,
-        c: this.c,
-        d: this.d,
-        e: this.e + ox,
-        f: this.f + oy
-      }
-    },
-
-    // Morph one matrix into another
-    morph: function (matrix) {
-      // Store new destination
-      this.destination = new SVG.Matrix(matrix)
-      return this
-    },
-
-    // Get morphed matrix at a given position
-    at: function (pos) {
-      // Make sure a destination is defined
-      if (!this.destination) return this
-
-      // Calculate morphed matrix at a given position
-      var matrix = new SVG.Matrix({
-        a: this.a + (this.destination.a - this.a) * pos,
-        b: this.b + (this.destination.b - this.b) * pos,
-        c: this.c + (this.destination.c - this.c) * pos,
-        d: this.d + (this.destination.d - this.d) * pos,
-        e: this.e + (this.destination.e - this.e) * pos,
-        f: this.f + (this.destination.f - this.f) * pos
-      })
-
-      return matrix
-    },
-
-    // Left multiplies by the given matrix
-    multiply: function (matrix) {
-      // Get the matrices
-      var l = this
-      var r = new SVG.Matrix(matrix)
-
-      // Work out the product directly
-      var a = l.a * r.a + l.c * r.b
-      var b = l.b * r.a + l.d * r.b
-      var c = l.a * r.c + l.c * r.d
-      var d = l.b * r.c + l.d * r.d
-      var e = l.e + l.a * r.e + l.c * r.f
-      var f = l.f + l.b * r.e + l.d * r.f
-
-      // Form the matrix and return it
-      var product = new SVG.Matrix(a, b, c, d, e, f)
-      return product
-    },
-
-    lmultiply: function (matrix) {
-      var result = new SVG.Matrix(matrix).multiply(this)
-      return result
-    },
-
-    // Inverses matrix
-    inverse: function () {
-      // Get the current parameters out of the matrix
-      var a = this.a
-      var b = this.b
-      var c = this.c
-      var d = this.d
-      var e = this.e
-      var f = this.f
-
-      // Invert the 2x2 matrix in the top left
-      var det = a * d - b * c
-      if (!det) throw new Error('Cannot invert ' + this)
-
-      // Calculate the top 2x2 matrix
-      var na = d / det
-      var nb = -b / det
-      var nc = -c / det
-      var nd = a / det
-
-      // Apply the inverted matrix to the top right
-      var ne = -(na * e + nc * f)
-      var nf = -(nb * e + nd * f)
-
-      // Construct the inverted matrix
-      return new SVG.Matrix(na, nb, nc, nd, ne, nf)
-    },
-
-    // Translate matrix
-    translate: function (x, y) {
-      return new SVG.Matrix(this).translateO(x, y)
-    },
-
-    translateO: function (x, y) {
-      this.e += x || 0
-      this.f += y || 0
-      return this
-    },
-
-    // Scale matrix
-    scale: function (x, y, cx, cy) {
-      // Support uniform scaling
-      if (arguments.length === 1) {
-        y = x
-      } else if (arguments.length === 3) {
-        cy = cx
-        cx = y
-        y = x
-      }
-
-      // Scale the current matrix
-      var scale = new SVG.Matrix(x, 0, 0, y, 0, 0)
-      var matrix = this.around(cx, cy, scale)
-      return matrix
-    },
-
-    // Rotate matrix
-    rotate: function (r, cx, cy) {
-      // Convert degrees to radians
-      r = SVG.utils.radians(r)
-
-      // Construct the rotation matrix
-      var rotation = new SVG.Matrix(Math.cos(r), Math.sin(r), -Math.sin(r), Math.cos(r), 0, 0)
-      var matrix = this.around(cx, cy, rotation)
-      return matrix
-    },
-
-    // Flip matrix on x or y, at a given offset
-    flip: function (axis, around) {
-      return axis === 'x' ? this.scale(-1, 1, around, 0)
-        : axis === 'y' ? this.scale(1, -1, 0, around)
-        : this.scale(-1, -1, axis, around || axis) // Define an x, y flip point
-    },
-
-    // Shear matrix
-    shear: function (a, cx, cy) {
-      var shear = new SVG.Matrix(1, 0, a, 1, 0, 0)
-      var matrix = this.around(cx, cy, shear)
-      return matrix
-    },
-
-    // Skew Matrix
-    skew: function (x, y, cx, cy) {
-      // support uniformal skew
-      if (arguments.length === 1) {
-        y = x
-      } else if (arguments.length === 3) {
-        cy = cx
-        cx = y
-        y = x
-      }
-
-      // Convert degrees to radians
-      x = SVG.utils.radians(x)
-      y = SVG.utils.radians(y)
-
-      // Construct the matrix
-      var skew = new SVG.Matrix(1, Math.tan(y), Math.tan(x), 1, 0, 0)
-      var matrix = this.around(cx, cy, skew)
-      return matrix
-    },
-
-    // SkewX
-    skewX: function (x, cx, cy) {
-      return this.skew(x, 0, cx, cy)
-    },
-
-    // SkewY
-    skewY: function (y, cx, cy) {
-      return this.skew(0, y, cx, cy)
-    },
-
-    // Transform around a center point
-    around: function (cx, cy, matrix) {
-      var dx = cx || 0
-      var dy = cy || 0
-      return this.translate(-dx, -dy).lmultiply(matrix).translate(dx, dy)
-    },
-
-    // Convert to native SVGMatrix
-    native: function () {
-      // create new matrix
-      var matrix = SVG.parser.nodes.svg.node.createSVGMatrix()
-
-      // update with current values
-      for (var i = abcdef.length - 1; i >= 0; i--) {
-        matrix[abcdef[i]] = this[abcdef[i]]
-      }
-
-      return matrix
-    },
-
-    // Check if two matrices are equal
-    equals: function (other) {
-      var comp = new SVG.Matrix(other)
-      return closeEnough(this.a, comp.a) && closeEnough(this.b, comp.b) &&
-        closeEnough(this.c, comp.c) && closeEnough(this.d, comp.d) &&
-        closeEnough(this.e, comp.e) && closeEnough(this.f, comp.f)
-    },
-
-    // Convert matrix to string
-    toString: function () {
-      return 'matrix(' + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ')'
-    },
-
-    toArray: function () {
-      return [this.a, this.b, this.c, this.d, this.e, this.f]
-    },
-
-    valueOf: function () {
-      return {
-        a: this.a,
-        b: this.b,
-        c: this.c,
-        d: this.d,
-        e: this.e,
-        f: this.f
-      }
-    }
-  },
-
-  // Define parent
-  parent: SVG.Element,
-
-  // Add parent method
-  construct: {
-    // Get current matrix
-    ctm: function () {
-      return new SVG.Matrix(this.node.getCTM())
-    },
-    // Get current screen matrix
-    screenCTM: function () {
-      /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537
-         This is needed because FF does not return the transformation matrix
-         for the inner coordinate system when getScreenCTM() is called on nested svgs.
-         However all other Browsers do that */
-      if (this instanceof SVG.Doc && !this.isRoot()) {
-        var rect = this.rect(1, 1)
-        var m = rect.node.getScreenCTM()
-        rect.remove()
-        return new SVG.Matrix(m)
-      }
-      return new SVG.Matrix(this.node.getScreenCTM())
-    }
-  }
-})
-
-
-SVG.Point = SVG.invent({
-  // Initialize
-  create: function (x, y, base) {
-    var source
-    base = base || {x: 0, y: 0}
-
-    // ensure source as object
-    source = Array.isArray(x) ? {x: x[0], y: x[1]}
-      : typeof x === 'object' ? {x: x.x, y: x.y}
-      : {x: x, y: y}
-
-    // merge source
-    this.x = source.x == null ? base.x : source.x
-    this.y = source.y == null ? base.y : source.y
-  },
-
-  // Add methods
-  extend: {
-    // Clone point
-    clone: function () {
-      return new SVG.Point(this)
-    },
-
-    // Morph one point into another
-    morph: function (x, y) {
-      // store new destination
-      this.destination = new SVG.Point(x, y)
-      return this
-    },
-
-    // Get morphed point at a given position
-    at: function (pos) {
-      // make sure a destination is defined
-      if (!this.destination) return this
-
-      // calculate morphed matrix at a given position
-      var point = new SVG.Point({
-        x: this.x + (this.destination.x - this.x) * pos,
-        y: this.y + (this.destination.y - this.y) * pos
-      })
-      return point
-    },
-
-    // Convert to native SVGPoint
-    native: function () {
-      // create new point
-      var point = SVG.parser.nodes.svg.node.createSVGPoint()
-
-      // update with current values
-      point.x = this.x
-      point.y = this.y
-      return point
-    },
-
-    // transform point with matrix
-    transform: function (m) {
-      // Perform the matrix multiplication
-      var x = m.a * this.x + m.c * this.y + m.e
-      var y = m.b * this.x + m.d * this.y + m.f
-
-      // Return the required point
-      return new SVG.Point(x, y)
-    }
-  }
-})
-
-SVG.extend(SVG.Element, {
-
-  // Get point
-  point: function (x, y) {
-    return new SVG.Point(x, y).transform(this.screenCTM().inverse())
-  }
-})
-
-SVG.extend(SVG.Element, {
-  // Set svg element attribute
-  attr: function (a, v, n) {
-    // act as full getter
-    if (a == null) {
-      // get an object of attributes
-      a = {}
-      v = this.node.attributes
-      for (n = v.length - 1; n >= 0; n--) {
-        a[v[n].nodeName] = SVG.regex.isNumber.test(v[n].nodeValue)
-          ? parseFloat(v[n].nodeValue)
-          : v[n].nodeValue
-      }
-      return a
-    } else if (typeof a === 'object') {
-      // apply every attribute individually if an object is passed
-      for (v in a) this.attr(v, a[v])
-    } else if (v === null) {
-        // remove value
-      this.node.removeAttribute(a)
-    } else if (v == null) {
-      // act as a getter if the first and only argument is not an object
-      v = this.node.getAttribute(a)
-      return v == null ? SVG.defaults.attrs[a]
-        : SVG.regex.isNumber.test(v) ? parseFloat(v)
-        : v
-    } else {
-      // convert image fill and stroke to patterns
-      if (a === 'fill' || a === 'stroke') {
-        if (SVG.regex.isImage.test(v)) {
-          v = this.doc().defs().image(v)
-        }
-
-        if (v instanceof SVG.Image) {
-          v = this.doc().defs().pattern(0, 0, function () {
-            this.add(v)
-          })
-        }
-      }
-
-      // ensure correct numeric values (also accepts NaN and Infinity)
-      if (typeof v === 'number') {
-        v = new SVG.Number(v)
-      } else if (SVG.Color.isColor(v)) {
-        // ensure full hex color
-        v = new SVG.Color(v)
-      } else if (Array.isArray(v)) {
-        // parse array values
-        v = new SVG.Array(v)
-      }
-
-      // if the passed attribute is leading...
-      if (a === 'leading') {
-        // ... call the leading method instead
-        if (this.leading) {
-          this.leading(v)
-        }
-      } else {
-        // set given attribute on node
-        typeof n === 'string' ? this.node.setAttributeNS(n, a, v.toString())
-          : this.node.setAttribute(a, v.toString())
-      }
-
-      // rebuild if required
-      if (this.rebuild && (a === 'font-size' || a === 'x')) {
-        this.rebuild(a, v)
-      }
-    }
-
-    return this
-  }
-})
-
-/* global arrayToMatrix */
-
-SVG.extend(SVG.Element, {
-  // Reset all transformations
-  untransform: function () {
-    return this.attr('transform', null)
-  },
-
-  // merge the whole transformation chain into one matrix and returns it
-  matrixify: function () {
-    var matrix = (this.attr('transform') || '')
-      // split transformations
-      .split(SVG.regex.transforms).slice(0, -1).map(function (str) {
-        // generate key => value pairs
-        var kv = str.trim().split('(')
-        return [kv[0],
-          kv[1].split(SVG.regex.delimiter)
-            .map(function (str) { return parseFloat(str) })
-        ]
-      })
-      .reverse()
-      // merge every transformation into one matrix
-      .reduce(function (matrix, transform) {
-        if (transform[0] === 'matrix') {
-          return matrix.lmultiply(arrayToMatrix(transform[1]))
-        }
-        return matrix[transform[0]].apply(matrix, transform[1])
-      }, new SVG.Matrix())
-
-    return matrix
-  },
-
-  // add an element to another parent without changing the visual representation on the screen
-  toParent: function (parent) {
-    if (this === parent) return this
-    var ctm = this.screenCTM()
-    var pCtm = parent.screenCTM().inverse()
-
-    this.addTo(parent).untransform().transform(pCtm.multiply(ctm))
-
-    return this
-  },
-
-  // same as above with parent equals root-svg
-  toDoc: function () {
-    return this.toParent(this.doc())
-  }
-})
-
-SVG.extend(SVG.Element, {
-
-  // Add transformations
-  transform: function (o, relative) {
-    // Act as a getter if no object was passed
-    if (o == null || typeof o === 'string') {
-      var decomposed = new SVG.Matrix(this).decompose()
-      return decomposed[o] || decomposed
-    }
-
-    // Set the origin according to the defined transform
-    o.origin = getOrigin (o, this)
-
-    // The user can pass a boolean, an SVG.Element or an SVG.Matrix or nothing
-    var cleanRelative = relative === true ? this : (relative || false)
-    var result = new SVG.Matrix(cleanRelative).transform(o)
-    return this.attr('transform', result)
-  }
-})
-
-SVG.extend(SVG.Timeline, {
-  transform: function (o, relative, affine) {
-
-  //   // get target in case of the fx module, otherwise reference this
-  //   var target = this.target()
-  //     , matrix, bbox
-  //
-  //   // act as a getter
-  //   if (typeof o !== 'object') {
-  //     // get current matrix
-  //     matrix = new SVG.Matrix(target).extract()
-  //
-  //     return typeof o === 'string' ? matrix[o] : matrix
-  //   }
-  //
-  //   // ensure relative flag
-  //   relative = !!relative || !!o.relative
-  //
-  //   // act on matrix
-  //   if (o.a != null) {
-  //     matrix = new SVG.Matrix(o)
-  //
-  //   // act on rotation
-  //   } else if (o.rotation != null) {
-  //     // ensure centre point
-  //     ensureCentre(o, target)
-  //
-  //     // apply transformation
-  //     matrix = new SVG.Rotate(o.rotation, o.cx, o.cy)
-  //
-  //   // act on scale
-  //   } else if (o.scale != null || o.scaleX != null || o.scaleY != null) {
-  //     // ensure centre point
-  //     ensureCentre(o, target)
-  //
-  //     // ensure scale values on both axes
-  //     o.scaleX = o.scale != null ? o.scale : o.scaleX != null ? o.scaleX : 1
-  //     o.scaleY = o.scale != null ? o.scale : o.scaleY != null ? o.scaleY : 1
-  //
-  //     matrix = new SVG.Scale(o.scaleX, o.scaleY, o.cx, o.cy)
-  //
-  //   // act on skew
-  //   } else if (o.skewX != null || o.skewY != null) {
-  //     // ensure centre point
-  //     ensureCentre(o, target)
-  //
-  //     // ensure skew values on both axes
-  //     o.skewX = o.skewX != null ? o.skewX : 0
-  //     o.skewY = o.skewY != null ? o.skewY : 0
-  //
-  //     matrix = new SVG.Skew(o.skewX, o.skewY, o.cx, o.cy)
-  //
-  //   // act on flip
-  //   } else if (o.flip) {
-  //     if(o.flip == 'x' || o.flip == 'y') {
-  //       o.offset = o.offset == null ? target.bbox()['c' + o.flip] : o.offset
-  //     } else {
-  //       if(o.offset == null) {
-  //         bbox = target.bbox()
-  //         o.flip = bbox.cx
-  //         o.offset = bbox.cy
-  //       } else {
-  //         o.flip = o.offset
-  //       }
-  //     }
-  //
-  //     matrix = new SVG.Matrix().flip(o.flip, o.offset)
-  //
-  //   // act on translate
-  //   } else if (o.x != null || o.y != null) {
-  //     matrix = new SVG.Translate(o.x, o.y)
-  //   }
-  //
-  //   if(!matrix) return this
-  //
-  //   matrix.relative = relative
-  //
-  //   this.last().transforms.push(matrix)
-  //
-  //   return this._callStart()
-  // }
-  //     // ensure scale values on both axes
-  //     o.scaleX = o.scale != null ? o.scale : o.scaleX != null ? o.scaleX : 1
-  //     o.scaleY = o.scale != null ? o.scale : o.scaleY != null ? o.scaleY : 1
-  //
-  //     matrix = new SVG.Scale(o.scaleX, o.scaleY, o.cx, o.cy)
-  //
-  //   // act on skew
-  //   } else if (o.skewX != null || o.skewY != null) {
-  //     // ensure centre point
-  //     ensureCentre(o, target)
-  //
-  //     // ensure skew values on both axes
-  //     o.skewX = o.skewX != null ? o.skewX : 0
-  //     o.skewY = o.skewY != null ? o.skewY : 0
-  //
-  //     matrix = new SVG.Skew(o.skewX, o.skewY, o.cx, o.cy)
-  //
-  //   // act on flip
-  //   } else if (o.flip) {
-  //     if (o.flip === 'x' || o.flip === 'y') {
-  //       o.offset = o.offset == null ? target.bbox()['c' + o.flip] : o.offset
-  //     } else {
-  //       if (o.offset == null) {
-  //         bbox = target.bbox()
-  //         o.flip = bbox.cx
-  //         o.offset = bbox.cy
-  //       } else {
-  //         o.flip = o.offset
-  //       }
-  //     }
-  //
-  //     matrix = new SVG.Matrix().flip(o.flip, o.offset)
-  //
-  //   // act on translate
-  //   } else if (o.x != null || o.y != null) {
-  //     matrix = new SVG.Translate(o.x, o.y)
-  //   }
-  //
-  //   if (!matrix) return this
-  //
-  //   matrix.relative = relative
-  //
-  //   this.last().transforms.push(matrix)
-  //
-  //   return this._callStart()
-  }
-})
-
-/* global camelCase */
-
-SVG.extend(SVG.Element, {
-  // Dynamic style generator
-  css: function (s, v) {
-    var ret = {}
-    var t, i
-    if (arguments.length === 0) {
-      // get full style as object
-      this.node.style.cssText.split(/\s*;\s*/).filter(function (el) { return !!el.length }).forEach(function (el) {
-        t = el.split(/\s*:\s*/)
-        ret[t[0]] = t[1]
-      })
-      return ret
-    }
-
-    if (arguments.length < 2) {
-      // get style properties in the array
-      if (Array.isArray(s)) {
-        for (i = s.length; i--;) {
-          ret[camelCase(s[i])] = this.node.style[camelCase(s[i])]
-        }
-        return ret
-      }
-
-      // get style for property
-      if (typeof s === 'string') {
-        return this.node.style[camelCase(s)]
-      }
-
-      // set styles in object
-      if (typeof s === 'object') {
-        for (i in s) {
-          // set empty string if null/undefined/'' was given
-          this.node.style[camelCase(i)] = (s[i] == null || SVG.regex.isBlank.test(s[i])) ? '' : s[i]
-        }
-      }
-    }
-
-    // set style for property
-    if (arguments.length === 2) {
-      this.node.style[camelCase(s)] = (v == null || SVG.regex.isBlank.test(v)) ? '' : v
-    }
-
-    return this
-  }
-})
-
-/* global createElement */
-
-SVG.Parent = SVG.invent({
-  // Initialize node
-  create: function (node) {
-    SVG.Element.call(this, node)
-  },
-
-  // Inherit from
-  inherit: SVG.Element,
-
-  // Add class methods
-  extend: {
-    // Returns all child elements
-    children: function () {
-      return SVG.utils.map(this.node.children, function (node) {
-        return SVG.adopt(node)
-      })
-    },
-    // Add given element at a position
-    add: function (element, i) {
-      element = createElement(element)
-
-      if (element.node !== this.node.children[i]) {
-        this.node.insertBefore(element.node, this.node.children[i] || null)
-      }
-
-      return this
-    },
-    // Basically does the same as `add()` but returns the added element instead
-    put: function (element, i) {
-      this.add(element, i)
-      return element.instance || element
-    },
-    // Checks if the given element is a child
-    has: function (element) {
-      return this.index(element) >= 0
-    },
-    // Gets index of given element
-    index: function (element) {
-      return [].slice.call(this.node.children).indexOf(element.node)
-    },
-    // Get a element at the given index
-    get: function (i) {
-      return SVG.adopt(this.node.children[i])
-    },
-    // Get first child
-    first: function () {
-      return this.get(0)
-    },
-    // Get the last child
-    last: function () {
-      return this.get(this.node.children.length - 1)
-    },
-    // Iterates over all children and invokes a given block
-    each: function (block, deep) {
-      var children = this.children()
-      var i, il
-
-      for (i = 0, il = children.length; i < il; i++) {
-        if (children[i] instanceof SVG.Element) {
-          block.apply(children[i], [i, children])
-        }
-
-        if (deep && (children[i] instanceof SVG.Parent)) {
-          children[i].each(block, deep)
-        }
-      }
-
-      return this
-    },
-    // Remove a given child
-    removeElement: function (element) {
-      this.node.removeChild(element.node)
-
-      return this
-    },
-    // Remove all elements in this container
-    clear: function () {
-      // remove children
-      while (this.node.hasChildNodes()) {
-        this.node.removeChild(this.node.lastChild)
-      }
-
-      // remove defs reference
-      delete this._defs
-
-      return this
-    }
-  }
-
-})
-
-SVG.extend(SVG.Parent, {
-  flatten: function (parent) {
-    // flattens is only possible for nested svgs and groups
-    if (!(this instanceof SVG.G || this instanceof SVG.Doc)) {
-      return this
-    }
-
-    parent = parent || (this instanceof SVG.Doc && this.isRoot() ? this : this.parent(SVG.Parent))
-
-    this.each(function () {
-      if (this instanceof SVG.Defs) return this
-      if (this instanceof SVG.Parent) return this.flatten(parent)
-      return this.toParent(parent)
-    })
-
-    // we need this so that SVG.Doc does not get removed
-    this.node.firstElementChild || this.remove()
-
-    return this
-  },
-  ungroup: function (parent) {
-    // ungroup is only possible for nested svgs and groups
-    if (!(this instanceof SVG.G || (this instanceof SVG.Doc && !this.isRoot()))) {
-      return this
-    }
-
-    parent = parent || this.parent(SVG.Parent)
-
-    this.each(function () {
-      return this.toParent(parent)
-    })
-
-    // we need this so that SVG.Doc does not get removed
-    this.remove()
-
-    return this
-  }
-})
-
-SVG.Container = SVG.invent({
-  // Initialize node
-  create: function (node) {
-    SVG.Element.call(this, node)
-  },
-
-  // Inherit from
-  inherit: SVG.Parent
-})
-
-SVG.Defs = SVG.invent({
-  // Initialize node
-  create: 'defs',
-
-  // Inherit from
-  inherit: SVG.Container
-})
-
-SVG.G = SVG.invent({
-  // Initialize node
-  create: 'g',
-
-  // Inherit from
-  inherit: SVG.Container,
-
-  // Add class methods
-  extend: {
-  },
-
-  // Add parent method
-  construct: {
-    // Create a group element
-    group: function () {
-      return this.put(new SVG.G())
-    }
-  }
-})
-
-// ### This module adds backward / forward functionality to elements.
-
-//
-SVG.extend(SVG.Element, {
-  // Get all siblings, including myself
-  siblings: function () {
-    return this.parent().children()
-  },
-
-  // Get the curent position siblings
-  position: function () {
-    return this.parent().index(this)
-  },
-
-  // Get the next element (will return null if there is none)
-  next: function () {
-    return this.siblings()[this.position() + 1]
-  },
-
-  // Get the next element (will return null if there is none)
-  prev: function () {
-    return this.siblings()[this.position() - 1]
-  },
-
-  // Send given element one step forward
-  forward: function () {
-    var i = this.position() + 1
-    var p = this.parent()
-
-    // move node one step forward
-    p.removeElement(this).add(this, i)
-
-    // make sure defs node is always at the top
-    if (p instanceof SVG.Doc) {
-      p.node.appendChild(p.defs().node)
-    }
-
-    return this
-  },
-
-  // Send given element one step backward
-  backward: function () {
-    var i = this.position()
-
-    if (i > 0) {
-      this.parent().removeElement(this).add(this, i - 1)
-    }
-
-    return this
-  },
-
-  // Send given element all the way to the front
-  front: function () {
-    var p = this.parent()
-
-    // Move node forward
-    p.node.appendChild(this.node)
-
-    // Make sure defs node is always at the top
-    if (p instanceof SVG.Doc) {
-      p.node.appendChild(p.defs().node)
-    }
-
-    return this
-  },
-
-  // Send given element all the way to the back
-  back: function () {
-    if (this.position() > 0) {
-      this.parent().removeElement(this).add(this, 0)
-    }
-
-    return this
-  },
-
-  // Inserts a given element before the targeted element
-  before: function (element) {
-    element.remove()
-
-    var i = this.position()
-
-    this.parent().add(element, i)
-
-    return this
-  },
-
-  // Insters a given element after the targeted element
-  after: function (element) {
-    element.remove()
-
-    var i = this.position()
-
-    this.parent().add(element, i + 1)
-
-    return this
-  }
-})
-
-SVG.Mask = SVG.invent({
-  // Initialize node
-  create: 'mask',
-
-  // Inherit from
-  inherit: SVG.Container,
-
-  // Add class methods
-  extend: {
-    // Unmask all masked elements and remove itself
-    remove: function () {
-      // unmask all targets
-      this.targets().forEach(function (el) {
-        el.unmask()
-      })
-
-      // remove mask from parent
-      return SVG.Element.prototype.remove.call(this)
-    },
-
-    targets: function () {
-      return SVG.select('svg [mask*="' + this.id() + '"]')
-    }
-  },
-
-  // Add parent method
-  construct: {
-    // Create masking element
-    mask: function () {
-      return this.defs().put(new SVG.Mask())
-    }
-  }
-})
-
-SVG.extend(SVG.Element, {
-  // Distribute mask to svg element
-  maskWith: function (element) {
-    // use given mask or create a new one
-    var masker = element instanceof SVG.Mask ? element : this.parent().mask().add(element)
-
-    // apply mask
-    return this.attr('mask', 'url("#' + masker.id() + '")')
-  },
-  // Unmask element
-  unmask: function () {
-    return this.attr('mask', null)
-  },
-  masker: function () {
-    return this.reference('mask')
-  }
-})
-
-SVG.ClipPath = SVG.invent({
-  // Initialize node
-  create: 'clipPath',
-
-  // Inherit from
-  inherit: SVG.Container,
-
-  // Add class methods
-  extend: {
-    // Unclip all clipped elements and remove itself
-    remove: function () {
-      // unclip all targets
-      this.targets().forEach(function (el) {
-        el.unclip()
-      })
-
-      // remove clipPath from parent
-      return SVG.Element.prototype.remove.call(this)
-    },
-
-    targets: function () {
-      return SVG.select('svg [clip-path*="' + this.id() + '"]')
-    }
-  },
-
-  // Add parent method
-  construct: {
-    // Create clipping element
-    clip: function () {
-      return this.defs().put(new SVG.ClipPath())
-    }
-  }
-})
-
-//
-SVG.extend(SVG.Element, {
-  // Distribute clipPath to svg element
-  clipWith: function (element) {
-    // use given clip or create a new one
-    var clipper = element instanceof SVG.ClipPath ? element : this.parent().clip().add(element)
-
-    // apply mask
-    return this.attr('clip-path', 'url("#' + clipper.id() + '")')
-  },
-  // Unclip element
-  unclip: function () {
-    return this.attr('clip-path', null)
-  },
-  clipper: function () {
-    return this.reference('clip-path')
-  }
-
-})
-
-SVG.Gradient = SVG.invent({
-  // Initialize node
-  create: function (type) {
-    SVG.Element.call(this, typeof type === 'object' ? type : SVG.create(type + 'Gradient'))
-  },
-
-  // Inherit from
-  inherit: SVG.Container,
-
-  // Add class methods
-  extend: {
-    // Add a color stop
-    stop: function (offset, color, opacity) {
-      return this.put(new SVG.Stop()).update(offset, color, opacity)
-    },
-    // Update gradient
-    update: function (block) {
-      // remove all stops
-      this.clear()
-
-      // invoke passed block
-      if (typeof block === 'function') {
-        block.call(this, this)
-      }
-
-      return this
-    },
-    // Return the fill id
-    url: function () {
-      return 'url(#' + this.id() + ')'
-    },
-    // Alias string convertion to fill
-    toString: function () {
-      return this.url()
-    },
-    // custom attr to handle transform
-    attr: function (a, b, c) {
-      if (a === 'transform') a = 'gradientTransform'
-      return SVG.Container.prototype.attr.call(this, a, b, c)
-    }
-  },
-
-  // Add parent method
-  construct: {
-    // Create gradient element in defs
-    gradient: function (type, block) {
-      return this.defs().gradient(type, block)
-    }
-  }
-})
-
-// Add animatable methods to both gradient and fx module
-SVG.extend([SVG.Gradient, SVG.Timeline], {
-  // From position
-  from: function (x, y) {
-    return (this._target || this).type === 'radialGradient'
-      ? this.attr({ fx: new SVG.Number(x), fy: new SVG.Number(y) })
-      : this.attr({ x1: new SVG.Number(x), y1: new SVG.Number(y) })
-  },
-  // To position
-  to: function (x, y) {
-    return (this._target || this).type === 'radialGradient'
-      ? this.attr({ cx: new SVG.Number(x), cy: new SVG.Number(y) })
-      : this.attr({ x2: new SVG.Number(x), y2: new SVG.Number(y) })
-  }
-})
-
-// Base gradient generation
-SVG.extend(SVG.Defs, {
-  // define gradient
-  gradient: function (type, block) {
-    return this.put(new SVG.Gradient(type)).update(block)
-  }
-
-})
-
-SVG.Stop = SVG.invent({
-  // Initialize node
-  create: 'stop',
-
-  // Inherit from
-  inherit: SVG.Element,
-
-  // Add class methods
-  extend: {
-    // add color stops
-    update: function (o) {
-      if (typeof o === 'number' || o instanceof SVG.Number) {
-        o = {
-          offset: arguments[0],
-          color: arguments[1],
-          opacity: arguments[2]
-        }
-      }
-
-      // set attributes
-      if (o.opacity != null) this.attr('stop-opacity', o.opacity)
-      if (o.color != null) this.attr('stop-color', o.color)
-      if (o.offset != null) this.attr('offset', new SVG.Number(o.offset))
-
-      return this
-    }
-  }
-})
-
-SVG.Pattern = SVG.invent({
-  // Initialize node
-  create: 'pattern',
-
-  // Inherit from
-  inherit: SVG.Container,
-
-  // Add class methods
-  extend: {
-    // Return the fill id
-    url: function () {
-      return 'url(#' + this.id() + ')'
-    },
-    // Update pattern by rebuilding
-    update: function (block) {
-      // remove content
-      this.clear()
-
-      // invoke passed block
-      if (typeof block === 'function') {
-        block.call(this, this)
-      }
-
-      return this
-    },
-    // Alias string convertion to fill
-    toString: function () {
-      return this.url()
-    },
-    // custom attr to handle transform
-    attr: function (a, b, c) {
-      if (a === 'transform') a = 'patternTransform'
-      return SVG.Container.prototype.attr.call(this, a, b, c)
-    }
-
-  },
-
-  // Add parent method
-  construct: {
-    // Create pattern element in defs
-    pattern: function (width, height, block) {
-      return this.defs().pattern(width, height, block)
-    }
-  }
-})
-
-SVG.extend(SVG.Defs, {
-  // Define gradient
-  pattern: function (width, height, block) {
-    return this.put(new SVG.Pattern()).update(block).attr({
-      x: 0,
-      y: 0,
-      width: width,
-      height: height,
-      patternUnits: 'userSpaceOnUse'
-    })
-  }
-
-})
-
-SVG.Doc = SVG.invent({
-  // Initialize node
-  create: function (node) {
-    SVG.Element.call(this, node || SVG.create('svg'))
-
-    // set svg element attributes and ensure defs node
-    this.namespace()
-  },
-
-  // Inherit from
-  inherit: SVG.Container,
-
-  // Add class methods
-  extend: {
-    isRoot: function () {
-      return !this.node.parentNode || !(this.node.parentNode instanceof window.SVGElement) || this.node.parentNode.nodeName === '#document'
-    },
-    // Check if this is a root svg. If not, call docs from this element
-    doc: function () {
-      if (this.isRoot()) return this
-      return SVG.Element.prototype.doc.call(this)
-    },
-    // Add namespaces
-    namespace: function () {
-      if (!this.isRoot()) return this.doc().namespace()
-      return this
-        .attr({ xmlns: SVG.ns, version: '1.1' })
-        .attr('xmlns:xlink', SVG.xlink, SVG.xmlns)
-        .attr('xmlns:svgjs', SVG.svgjs, SVG.xmlns)
-    },
-    // Creates and returns defs element
-    defs: function () {
-      if (!this.isRoot()) return this.doc().defs()
-      return SVG.adopt(this.node.getElementsByTagName('defs')[0]) || this.put(new SVG.Defs())
-    },
-    // custom parent method
-    parent: function (type) {
-      if (this.isRoot()) {
-        return this.node.parentNode.nodeName === '#document' ? null : this.node.parentNode
-      }
-
-      return SVG.Element.prototype.parent.call(this, type)
-    },
-    // Removes the doc from the DOM
-    remove: function () {
-      if (!this.isRoot()) {
-        return SVG.Element.prototype.remove.call(this)
-      }
-
-      if (this.parent()) {
-        this.parent().removeChild(this.node)
-      }
-
-      return this
-    },
-    clear: function () {
-      // remove children
-      while (this.node.hasChildNodes()) {
-        this.node.removeChild(this.node.lastChild)
-      }
-      return this
-    }
-  },
-  construct: {
-    // Create nested svg document
-    nested: function () {
-      return this.put(new SVG.Doc())
-    }
-  }
-})
-
-
-SVG.Shape = SVG.invent({
-  // Initialize node
-  create: function (node) {
-    SVG.Element.call(this, node)
-  },
-
-  // Inherit from
-  inherit: SVG.Element
-})
-
-
-SVG.Bare = SVG.invent({
-  // Initialize
-  create: function (element, inherit) {
-    // construct element
-    SVG.Element.call(this, SVG.create(element))
-
-    // inherit custom methods
-    if (inherit) {
-      for (var method in inherit.prototype) {
-        if (typeof inherit.prototype[method] === 'function') {
-          this[method] = inherit.prototype[method]
-        }
-      }
-    }
-  },
-
-  // Inherit from
-  inherit: SVG.Element,
-
-  // Add methods
-  extend: {
-    // Insert some plain text
-    words: function (text) {
-      // remove contents
-      while (this.node.hasChildNodes()) {
-        this.node.removeChild(this.node.lastChild)
-      }
-
-      // create text node
-      this.node.appendChild(document.createTextNode(text))
-
-      return this
-    }
-  }
-})
-
-SVG.extend(SVG.Parent, {
-  // Create an element that is not described by SVG.js
-  element: function (element, inherit) {
-    return this.put(new SVG.Bare(element, inherit))
-  }
-})
-
-
-SVG.Symbol = SVG.invent({
-  // Initialize node
-  create: 'symbol',
-
-  // Inherit from
-  inherit: SVG.Container,
-
-  construct: {
-    // create symbol
-    symbol: function () {
-      return this.put(new SVG.Symbol())
-    }
-  }
-})
-
-
-SVG.Use = SVG.invent({
-  // Initialize node
-  create: 'use',
-
-  // Inherit from
-  inherit: SVG.Shape,
-
-  // Add class methods
-  extend: {
-    // Use element as a reference
-    element: function (element, file) {
-      // Set lined element
-      return this.attr('href', (file || '') + '#' + element, SVG.xlink)
-    }
-  },
-
-  // Add parent method
-  construct: {
-    // Create a use element
-    use: function (element, file) {
-      return this.put(new SVG.Use()).element(element, file)
-    }
-  }
-})
-
-
-SVG.Rect = SVG.invent({
-  // Initialize node
-  create: 'rect',
-
-  // Inherit from
-  inherit: SVG.Shape,
-
-  // Add parent method
-  construct: {
-    // Create a rect element
-    rect: function (width, height) {
-      return this.put(new SVG.Rect()).size(width, height)
-    }
-  }
-})
-
-/* global proportionalSize */
-
-SVG.Circle = SVG.invent({
-  // Initialize node
-  create: 'circle',
-
-  // Inherit from
-  inherit: SVG.Shape,
-
-  // Add parent method
-  construct: {
-    // Create circle element, based on ellipse
-    circle: function (size) {
-      return this.put(new SVG.Circle()).rx(new SVG.Number(size).divide(2)).move(0, 0)
-    }
-  }
-})
-
-SVG.extend([SVG.Circle, SVG.Timeline], {
-  // Radius x value
-  rx: function (rx) {
-    return this.attr('r', rx)
-  },
-  // Alias radius x value
-  ry: function (ry) {
-    return this.rx(ry)
-  }
-})
-
-SVG.Ellipse = SVG.invent({
-  // Initialize node
-  create: 'ellipse',
-
-  // Inherit from
-  inherit: SVG.Shape,
-
-  // Add parent method
-  construct: {
-    // Create an ellipse
-    ellipse: function (width, height) {
-      return this.put(new SVG.Ellipse()).size(width, height).move(0, 0)
-    }
-  }
-})
-
-SVG.extend([SVG.Ellipse, SVG.Rect, SVG.Timeline], {
-  // Radius x value
-  rx: function (rx) {
-    return this.attr('rx', rx)
-  },
-  // Radius y value
-  ry: function (ry) {
-    return this.attr('ry', ry)
-  }
-})
-
-// Add common method
-SVG.extend([SVG.Circle, SVG.Ellipse], {
-    // Move over x-axis
-  x: function (x) {
-    return x == null ? this.cx() - this.rx() : this.cx(x + this.rx())
-  },
-    // Move over y-axis
-  y: function (y) {
-    return y == null ? this.cy() - this.ry() : this.cy(y + this.ry())
-  },
-    // Move by center over x-axis
-  cx: function (x) {
-    return x == null ? this.attr('cx') : this.attr('cx', x)
-  },
-    // Move by center over y-axis
-  cy: function (y) {
-    return y == null ? this.attr('cy') : this.attr('cy', y)
-  },
-    // Set width of element
-  width: function (width) {
-    return width == null ? this.rx() * 2 : this.rx(new SVG.Number(width).divide(2))
-  },
-    // Set height of element
-  height: function (height) {
-    return height == null ? this.ry() * 2 : this.ry(new SVG.Number(height).divide(2))
-  },
-    // Custom size function
-  size: function (width, height) {
-    var p = proportionalSize(this, width, height)
-
-    return this
-        .rx(new SVG.Number(p.width).divide(2))
-        .ry(new SVG.Number(p.height).divide(2))
-  }
-})
-
-/* global proportionalSize */
-
-SVG.Line = SVG.invent({
-  // Initialize node
-  create: 'line',
-
-  // Inherit from
-  inherit: SVG.Shape,
-
-  // Add class methods
-  extend: {
-    // Get array
-    array: function () {
-      return new SVG.PointArray([
-        [ this.attr('x1'), this.attr('y1') ],
-        [ this.attr('x2'), this.attr('y2') ]
-      ])
-    },
-
-    // Overwrite native plot() method
-    plot: function (x1, y1, x2, y2) {
-      if (x1 == null) {
-        return this.array()
-      } else if (typeof y1 !== 'undefined') {
-        x1 = { x1: x1, y1: y1, x2: x2, y2: y2 }
-      } else {
-        x1 = new SVG.PointArray(x1).toLine()
-      }
-
-      return this.attr(x1)
-    },
-
-    // Move by left top corner
-    move: function (x, y) {
-      return this.attr(this.array().move(x, y).toLine())
-    },
-
-    // Set element size to given width and height
-    size: function (width, height) {
-      var p = proportionalSize(this, width, height)
-      return this.attr(this.array().size(p.width, p.height).toLine())
-    }
-  },
-
-  // Add parent method
-  construct: {
-    // Create a line element
-    line: function (x1, y1, x2, y2) {
-      // make sure plot is called as a setter
-      // x1 is not necessarily a number, it can also be an array, a string and a SVG.PointArray
-      return SVG.Line.prototype.plot.apply(
-        this.put(new SVG.Line())
-      , x1 != null ? [x1, y1, x2, y2] : [0, 0, 0, 0]
-      )
-    }
-  }
-})
-
-/* global proportionalSize */
-
-SVG.Polyline = SVG.invent({
-  // Initialize node
-  create: 'polyline',
-
-  // Inherit from
-  inherit: SVG.Shape,
-
-  // Add parent method
-  construct: {
-    // Create a wrapped polyline element
-    polyline: function (p) {
-      // make sure plot is called as a setter
-      return this.put(new SVG.Polyline()).plot(p || new SVG.PointArray())
-    }
-  }
-})
-
-SVG.Polygon = SVG.invent({
-  // Initialize node
-  create: 'polygon',
-
-  // Inherit from
-  inherit: SVG.Shape,
-
-  // Add parent method
-  construct: {
-    // Create a wrapped polygon element
-    polygon: function (p) {
-      // make sure plot is called as a setter
-      return this.put(new SVG.Polygon()).plot(p || new SVG.PointArray())
-    }
-  }
-})
-
-// Add polygon-specific functions
-SVG.extend([SVG.Polyline, SVG.Polygon], {
-  // Get array
-  array: function () {
-    return this._array || (this._array = new SVG.PointArray(this.attr('points')))
-  },
-
-  // Plot new path
-  plot: function (p) {
-    return (p == null) ? this.array()
-      : this.clear().attr('points', typeof p === 'string' ? p
-      : (this._array = new SVG.PointArray(p)))
-  },
-
-  // Clear array cache
-  clear: function () {
-    delete this._array
-    return this
-  },
-
-  // Move by left top corner
-  move: function (x, y) {
-    return this.attr('points', this.array().move(x, y))
-  },
-
-  // Set element size to given width and height
-  size: function (width, height) {
-    var p = proportionalSize(this, width, height)
-    return this.attr('points', this.array().size(p.width, p.height))
-  }
-})
-
-// unify all point to point elements
-SVG.extend([SVG.Line, SVG.Polyline, SVG.Polygon], {
-  // Define morphable array
-  MorphArray: SVG.PointArray,
-  // Move by left top corner over x-axis
-  x: function (x) {
-    return x == null ? this.bbox().x : this.move(x, this.bbox().y)
-  },
-  // Move by left top corner over y-axis
-  y: function (y) {
-    return y == null ? this.bbox().y : this.move(this.bbox().x, y)
-  },
-  // Set width of element
-  width: function (width) {
-    var b = this.bbox()
-
-    return width == null ? b.width : this.size(width, b.height)
-  },
-  // Set height of element
-  height: function (height) {
-    var b = this.bbox()
-
-    return height == null ? b.height : this.size(b.width, height)
-  }
-})
-
-/* global proportionalSize */
-
-SVG.Path = SVG.invent({
-  // Initialize node
-  create: 'path',
-
-  // Inherit from
-  inherit: SVG.Shape,
-
-  // Add class methods
-  extend: {
-    // Define morphable array
-    MorphArray: SVG.PathArray,
-    // Get array
-    array: function () {
-      return this._array || (this._array = new SVG.PathArray(this.attr('d')))
-    },
-    // Plot new path
-    plot: function (d) {
-      return (d == null) ? this.array()
-        : this.clear().attr('d', typeof d === 'string' ? d : (this._array = new SVG.PathArray(d)))
-    },
-    // Clear array cache
-    clear: function () {
-      delete this._array
-      return this
-    },
-    // Move by left top corner
-    move: function (x, y) {
-      return this.attr('d', this.array().move(x, y))
-    },
-    // Move by left top corner over x-axis
-    x: function (x) {
-      return x == null ? this.bbox().x : this.move(x, this.bbox().y)
-    },
-    // Move by left top corner over y-axis
-    y: function (y) {
-      return y == null ? this.bbox().y : this.move(this.bbox().x, y)
-    },
-    // Set element size to given width and height
-    size: function (width, height) {
-      var p = proportionalSize(this, width, height)
-      return this.attr('d', this.array().size(p.width, p.height))
-    },
-    // Set width of element
-    width: function (width) {
-      return width == null ? this.bbox().width : this.size(width, this.bbox().height)
-    },
-    // Set height of element
-    height: function (height) {
-      return height == null ? this.bbox().height : this.size(this.bbox().width, height)
-    }
-  },
-
-  // Add parent method
-  construct: {
-    // Create a wrapped path element
-    path: function (d) {
-      // make sure plot is called as a setter
-      return this.put(new SVG.Path()).plot(d || new SVG.PathArray())
-    }
-  }
-})
-
-SVG.Image = SVG.invent({
-  // Initialize node
-  create: 'image',
-
-  // Inherit from
-  inherit: SVG.Shape,
-
-  // Add class methods
-  extend: {
-    // (re)load image
-    load: function (url, callback) {
-      if (!url) return this
-
-      var img = new window.Image()
-
-      SVG.on(img, 'load', function (e) {
-        var p = this.parent(SVG.Pattern)
-
-        // ensure image size
-        if (this.width() === 0 && this.height() === 0) {
-          this.size(img.width, img.height)
-        }
-
-        if (p instanceof SVG.Pattern) {
-          // ensure pattern size if not set
-          if (p.width() === 0 && p.height() === 0) {
-            p.size(this.width(), this.height())
-          }
-        }
-
-        if (typeof callback === 'function') {
-          callback.call(this, {
-            width: img.width,
-            height: img.height,
-            ratio: img.width / img.height,
-            url: url
-          })
-        }
-      }, this)
-
-      SVG.on(img, 'load error', function () {
-        // dont forget to unbind memory leaking events
-        SVG.off(img)
-      })
-
-      return this.attr('href', (img.src = url), SVG.xlink)
-    }
-  },
-
-  // Add parent method
-  construct: {
-    // create image element, load image and set its size
-    image: function (source, callback) {
-      return this.put(new SVG.Image()).size(0, 0).load(source, callback)
-    }
-  }
-})
-
-SVG.Text = SVG.invent({
-  // Initialize node
-  create: function (node) {
-    SVG.Element.call(this, node || SVG.create('text'))
-    this.dom.leading = new SVG.Number(1.3)    // store leading value for rebuilding
-    this._rebuild = true                      // enable automatic updating of dy values
-    this._build = false                     // disable build mode for adding multiple lines
-
-    // set default font
-    this.attr('font-family', SVG.defaults.attrs['font-family'])
-  },
-
-  // Inherit from
-  inherit: SVG.Parent,
-
-  // Add class methods
-  extend: {
-    // Move over x-axis
-    x: function (x) {
-      // act as getter
-      if (x == null) {
-        return this.attr('x')
-      }
-
-      return this.attr('x', x)
-    },
-    // Move over y-axis
-    y: function (y) {
-      var oy = this.attr('y')
-      var o = typeof oy === 'number' ? oy - this.bbox().y : 0
-
-      // act as getter
-      if (y == null) {
-        return typeof oy === 'number' ? oy - o : oy
-      }
-
-      return this.attr('y', typeof y === 'number' ? y + o : y)
-    },
-    // Move center over x-axis
-    cx: function (x) {
-      return x == null ? this.bbox().cx : this.x(x - this.bbox().width / 2)
-    },
-    // Move center over y-axis
-    cy: function (y) {
-      return y == null ? this.bbox().cy : this.y(y - this.bbox().height / 2)
-    },
-    // Set the text content
-    text: function (text) {
-      // act as getter
-      if (text === undefined) {
-        var children = this.node.childNodes
-        var firstLine = 0
-        text = ''
-
-        for (var i = 0, len = children.length; i < len; ++i) {
-          // skip textPaths - they are no lines
-          if (children[i].nodeName === 'textPath') {
-            if (i === 0) firstLine = 1
-            continue
-          }
-
-          // add newline if its not the first child and newLined is set to true
-          if (i !== firstLine && children[i].nodeType !== 3 && SVG.adopt(children[i]).dom.newLined === true) {
-            text += '\n'
-          }
-
-          // add content of this node
-          text += children[i].textContent
-        }
-
-        return text
-      }
-
-      // remove existing content
-      this.clear().build(true)
-
-      if (typeof text === 'function') {
-        // call block
-        text.call(this, this)
-      } else {
-        // store text and make sure text is not blank
-        text = text.split('\n')
-
-        // build new lines
-        for (var j = 0, jl = text.length; j < jl; j++) {
-          this.tspan(text[j]).newLine()
-        }
-      }
-
-      // disable build mode and rebuild lines
-      return this.build(false).rebuild()
-    },
-    // Set / get leading
-    leading: function (value) {
-      // act as getter
-      if (value == null) {
-        return this.dom.leading
-      }
-
-      // act as setter
-      this.dom.leading = new SVG.Number(value)
-
-      return this.rebuild()
-    },
-    // Rebuild appearance type
-    rebuild: function (rebuild) {
-      // store new rebuild flag if given
-      if (typeof rebuild === 'boolean') {
-        this._rebuild = rebuild
-      }
-
-      // define position of all lines
-      if (this._rebuild) {
-        var self = this
-        var blankLineOffset = 0
-        var dy = this.dom.leading * new SVG.Number(this.attr('font-size'))
-
-        this.each(function () {
-          if (this.dom.newLined) {
-            this.attr('x', self.attr('x'))
-
-            if (this.text() === '\n') {
-              blankLineOffset += dy
-            } else {
-              this.attr('dy', dy + blankLineOffset)
-              blankLineOffset = 0
-            }
-          }
-        })
-
-        this.fire('rebuild')
-      }
-
-      return this
-    },
-    // Enable / disable build mode
-    build: function (build) {
-      this._build = !!build
-      return this
-    },
-    // overwrite method from parent to set data properly
-    setData: function (o) {
-      this.dom = o
-      this.dom.leading = new SVG.Number(o.leading || 1.3)
-      return this
-    }
-  },
-
-  // Add parent method
-  construct: {
-    // Create text element
-    text: function (text) {
-      return this.put(new SVG.Text()).text(text)
-    },
-    // Create plain text element
-    plain: function (text) {
-      return this.put(new SVG.Text()).plain(text)
-    }
-  }
-
-})
-
-SVG.Tspan = SVG.invent({
-  // Initialize node
-  create: 'tspan',
-
-  // Inherit from
-  inherit: SVG.Parent,
-
-  // Add class methods
-  extend: {
-    // Set text content
-    text: function (text) {
-      if (text == null) return this.node.textContent + (this.dom.newLined ? '\n' : '')
-
-      typeof text === 'function' ? text.call(this, this) : this.plain(text)
-
-      return this
-    },
-    // Shortcut dx
-    dx: function (dx) {
-      return this.attr('dx', dx)
-    },
-    // Shortcut dy
-    dy: function (dy) {
-      return this.attr('dy', dy)
-    },
-    // Create new line
-    newLine: function () {
-      // fetch text parent
-      var t = this.parent(SVG.Text)
-
-      // mark new line
-      this.dom.newLined = true
-
-      // apply new position
-      return this.dy(t.dom.leading * t.attr('font-size')).attr('x', t.x())
-    }
-  }
-})
-
-SVG.extend([SVG.Text, SVG.Tspan], {
-  // Create plain text node
-  plain: function (text) {
-    // clear if build mode is disabled
-    if (this._build === false) {
-      this.clear()
-    }
-
-    // create text node
-    this.node.appendChild(document.createTextNode(text))
-
-    return this
-  },
-  // Create a tspan
-  tspan: function (text) {
-    var tspan = new SVG.Tspan()
-
-    // clear if build mode is disabled
-    if (!this._build) {
-      this.clear()
-    }
-
-    // add new tspan
-    this.node.appendChild(tspan.node)
-
-    return tspan.text(text)
-  },
-  // FIXME: Does this also work for textpath?
-  // Get length of text element
-  length: function () {
-    return this.node.getComputedTextLength()
-  }
-})
-
-SVG.TextPath = SVG.invent({
-  // Initialize node
-  create: 'textPath',
-
-  // Inherit from
-  inherit: SVG.Text,
-
-  // Define parent class
-  parent: SVG.Parent,
-
-  // Add parent method
-  extend: {
-    MorphArray: SVG.PathArray,
-    // return the array of the path track element
-    array: function () {
-      var track = this.track()
-
-      return track ? track.array() : null
-    },
-    // Plot path if any
-    plot: function (d) {
-      var track = this.track()
-      var pathArray = null
-
-      if (track) {
-        pathArray = track.plot(d)
-      }
-
-      return (d == null) ? pathArray : this
-    },
-    // Get the path element
-    track: function () {
-      return this.reference('href')
-    }
-  },
-  construct: {
-    textPath: function (text, path) {
-      return this.defs().path(path).text(text).addTo(this)
-    }
-  }
-})
-
-SVG.extend([SVG.Text], {
-    // Create path for text to run on
-  path: function (track) {
-    var path = new SVG.TextPath()
-
-    // if d is a path, reuse it
-    if (!(track instanceof SVG.Path)) {
-      // create path element
-      track = this.doc().defs().path(track)
-    }
-
-    // link textPath to path and add content
-    path.attr('href', '#' + track, SVG.xlink)
-
-    // add textPath element as child node and return textPath
-    return this.put(path)
-  },
-  // Todo: make this plural?
-  // Get the textPath children
-  textPath: function () {
-    return this.select('textPath')
-  }
-})
-
-SVG.extend([SVG.Path], {
-  // creates a textPath from this path
-  text: function (text) {
-    if (text instanceof SVG.Text) {
-      var txt = text.text()
-      return text.clear().path(this).text(txt)
-    }
-    return this.parent().put(new SVG.Text()).path(this).text(text)
-  }
-  // TODO: Maybe add `targets` to get all textPaths associated with this path
-})
-
-SVG.A = SVG.invent({
-  // Initialize node
-  create: 'a',
-
-  // Inherit from
-  inherit: SVG.Container,
-
-  // Add class methods
-  extend: {
-    // Link url
-    to: function (url) {
-      return this.attr('href', url, SVG.xlink)
-    },
-    // Link target attribute
-    target: function (target) {
-      return this.attr('target', target)
-    }
-  },
-
-  // Add parent method
-  construct: {
-    // Create a hyperlink element
-    link: function (url) {
-      return this.put(new SVG.A()).to(url)
-    }
-  }
-})
-
-SVG.extend(SVG.Element, {
-  // Create a hyperlink element
-  linkTo: function (url) {
-    var link = new SVG.A()
-
-    if (typeof url === 'function') { url.call(link, link) } else {
-      link.to(url)
-    }
-
-    return this.parent().put(link).put(this)
-  }
-
-})
-
-SVG.Marker = SVG.invent({
-  // Initialize node
-  create: 'marker',
-
-  // Inherit from
-  inherit: SVG.Container,
-
-  // Add class methods
-  extend: {
-    // Set width of element
-    width: function (width) {
-      return this.attr('markerWidth', width)
-    },
-    // Set height of element
-    height: function (height) {
-      return this.attr('markerHeight', height)
-    },
-    // Set marker refX and refY
-    ref: function (x, y) {
-      return this.attr('refX', x).attr('refY', y)
-    },
-    // Update marker
-    update: function (block) {
-      // remove all content
-      this.clear()
-
-      // invoke passed block
-      if (typeof block === 'function') { block.call(this, this) }
-
-      return this
-    },
-    // Return the fill id
-    toString: function () {
-      return 'url(#' + this.id() + ')'
-    }
-  },
-
-  // Add parent method
-  construct: {
-    marker: function (width, height, block) {
-      // Create marker element in defs
-      return this.defs().marker(width, height, block)
-    }
-  }
-
-})
-
-SVG.extend(SVG.Defs, {
-  // Create marker
-  marker: function (width, height, block) {
-    // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto
-    return this.put(new SVG.Marker())
-      .size(width, height)
-      .ref(width / 2, height / 2)
-      .viewbox(0, 0, width, height)
-      .attr('orient', 'auto')
-      .update(block)
-  }
-
-})
-
-SVG.extend([SVG.Line, SVG.Polyline, SVG.Polygon, SVG.Path], {
-  // Create and attach markers
-  marker: function (marker, width, height, block) {
-    var attr = ['marker']
-
-    // Build attribute name
-    if (marker !== 'all') attr.push(marker)
-    attr = attr.join('-')
-
-    // Set marker attribute
-    marker = arguments[1] instanceof SVG.Marker
-      ? arguments[1]
-      : this.doc().marker(width, height, block)
-
-    return this.attr(attr, marker)
-  }
-})
-
-// // Define list of available attributes for stroke and fill
-// var sugar = {
-//   stroke: ['color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset'],
-//   fill: ['color', 'opacity', 'rule'],
-//   prefix: function (t, a) {
-//     return a === 'color' ? t : t + '-' + a
-//   }
-// }
-//
-// // Add sugar for fill and stroke
-// ;['fill', 'stroke'].forEach(function (m) {
-//   var extension = {}
-//   var i
-//
-//   extension[m] = function (o) {
-//     if (typeof o === 'undefined') {
-//       return this
-//     }
-//     if (typeof o === 'string' || SVG.Color.isRgb(o) || (o && typeof o.fill === 'function')) {
-//       this.attr(m, o)
-//     } else {
-//       // set all attributes from sugar.fill and sugar.stroke list
-//       for (i = sugar[m].length - 1; i >= 0; i--) {
-//         if (o[sugar[m][i]] != null) {
-//           this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]])
-//         }
-//       }
-//     }
-//
-//     return this
-//   }
-//
-//   SVG.extend([SVG.Element, SVG.Timeline], extension)
-// })
-//
-// SVG.extend([SVG.Element, SVG.Timeline], {
-//   // Let the user set the matrix directly
-//   matrix: function (mat, b, c, d, e, f) {
-//     // Act as a getter
-//     if (mat == null) {
-//       return new SVG.Matrix(this)
-//     }
-//
-//     // Act as a setter, the user can pass a matrix or a set of numbers
-//     return this.attr('transform', new SVG.Matrix(mat, b, c, d, e, f))
-//   },
-//
-//   // Map rotation to transform
-//   rotate: function (angle, cx, cy) {
-//     return this.transform({rotate: angle, ox: cx, oy: cy}, true)
-//   },
-//
-//   // Map skew to transform
-//   skew: function (x, y, cx, cy) {
-//     return arguments.length === 1 || arguments.length === 3
-//       ? this.transform({skew: x, ox: y, oy: cx}, true)
-//       : this.transform({skew: [x, y], ox: cx, oy: cy}, true)
-//   },
-//
-//   shear: function (lam, cx, cy) {
-//     return this.transform({shear: lam, ox: cx, oy: cy}, true)
-//   },
-//
-//   // Map scale to transform
-//   scale: function (x, y, cx, cy) {
-//     return arguments.length === 1 || arguments.length === 3
-//       ? this.transform({ scale: x, ox: y, oy: cx }, true)
-//       : this.transform({ scale: [x, y], ox: cx, oy: cy }, true)
-//   },
-//
-//   // Map translate to transform
-//   translate: function (x, y) {
-//     return this.transform({ translate: [x, y] }, true)
-//   },
-//
-//   // Map relative translations to transform
-//   relative: function (x, y) {
-//     return this.transform({ relative: [x, y] }, true)
-//   },
-//
-//   // Map flip to transform
-//   flip: function (direction, around) {
-//     var directionString = typeof direction === 'string' ? direction
-//       : isFinite(direction) ? 'both'
-//       : 'both'
-//     var origin = (direction === 'both' && isFinite(around)) ? [around, around]
-//       : (direction === 'x') ? [around, 0]
-//       : (direction === 'y') ? [0, around]
-//       : isFinite(direction) ? [direction, direction]
-//       : [0, 0]
-//     this.transform({flip: directionString, origin: origin}, true)
-//   },
-//
-//   // Opacity
-//   opacity: function (value) {
-//     return this.attr('opacity', value)
-//   },
-//
-//   // Relative move over x axis
-//   dx: function (x) {
-//     return this.x(new SVG.Number(x).plus(this instanceof SVG.Timeline ? 0 : this.x()), true)
-//   },
-//
-//   // Relative move over y axis
-//   dy: function (y) {
-//     return this.y(new SVG.Number(y).plus(this instanceof SVG.Timeline ? 0 : this.y()), true)
-//   },
-//
-//   // Relative move over x and y axes
-//   dmove: function (x, y) {
-//     return this.dx(x).dy(y)
-//   }
-// })
-//
-// SVG.extend([SVG.Rect, SVG.Ellipse, SVG.Circle, SVG.Gradient, SVG.Timeline], {
-//   // Add x and y radius
-//   radius: function (x, y) {
-//     var type = (this._target || this).type
-//     return type === 'radialGradient' || type === 'radialGradient'
-//       ? this.attr('r', new SVG.Number(x))
-//       : this.rx(x).ry(y == null ? x : y)
-//   }
-// })
-//
-// SVG.extend(SVG.Path, {
-//   // Get path length
-//   length: function () {
-//     return this.node.getTotalLength()
-//   },
-//   // Get point at length
-//   pointAt: function (length) {
-//     return new SVG.Point(this.node.getPointAtLength(length))
-//   }
-// })
-//
-// SVG.extend([SVG.Parent, SVG.Text, SVG.Tspan, SVG.Timeline], {
-//   // Set font
-//   font: function (a, v) {
-//     if (typeof a === 'object') {
-//       for (v in a) this.font(v, a[v])
-//     }
-//
-//     return a === 'leading'
-//         ? this.leading(v)
-//       : a === 'anchor'
-//         ? this.attr('text-anchor', v)
-//       : a === 'size' || a === 'family' || a === 'weight' || a === 'stretch' || a === 'variant' || a === 'style'
-//         ? this.attr('font-' + a, v)
-//       : this.attr(a, v)
-//   }
-// })
-
-
-SVG.extend(SVG.Element, {
-  // Store data values on svg nodes
-  data: function (a, v, r) {
-    if (typeof a === 'object') {
-      for (v in a) {
-        this.data(v, a[v])
-      }
-    } else if (arguments.length < 2) {
-      try {
-        return JSON.parse(this.attr('data-' + a))
-      } catch (e) {
-        return this.attr('data-' + a)
-      }
-    } else {
-      this.attr('data-' + a,
-        v === null ? null
-        : r === true || typeof v === 'string' || typeof v === 'number' ? v
-        : JSON.stringify(v)
-      )
-    }
-
-    return this
-  }
-})
-
-
-SVG.extend(SVG.Element, {
-  // Remember arbitrary data
-  remember: function (k, v) {
-    // remember every item in an object individually
-    if (typeof arguments[0] === 'object') {
-      for (var key in k) {
-        this.remember(key, k[key])
-      }
-    } else if (arguments.length === 1) {
-      // retrieve memory
-      return this.memory()[k]
-    } else {
-      // store memory
-      this.memory()[k] = v
-    }
-
-    return this
-  },
-
-  // Erase a given memory
-  forget: function () {
-    if (arguments.length === 0) {
-      this._memory = {}
-    } else {
-      for (var i = arguments.length - 1; i >= 0; i--) {
-        delete this.memory()[arguments[i]]
-      }
-    }
-    return this
-  },
-
-  // Initialize or return local memory object
-  memory: function () {
-    return this._memory || (this._memory = {})
-  }
-})
-
-/* global idFromReference */
-
-// Method for getting an element by id
-SVG.get = function (id) {
-  var node = document.getElementById(idFromReference(id) || id)
-  return SVG.adopt(node)
-}
-
-// Select elements by query string
-SVG.select = function (query, parent) {
-  return SVG.utils.map((parent || document).querySelectorAll(query), function (node) {
-    return SVG.adopt(node)
-  })
-}
-
-SVG.$$ = function (query, parent) {
-  return SVG.utils.map((parent || document).querySelectorAll(query), function (node) {
-    return SVG.adopt(node)
-  })
-}
-
-SVG.$ = function (query, parent) {
-  return SVG.adopt((parent || document).querySelector(query))
-}
-
-SVG.extend(SVG.Parent, {
-  // Scoped select method
-  select: function (query) {
-    return SVG.select(query, this.node)
-  }
-})
-
-/* eslint no-unused-vars: 0 */
-
-function createElement (element, makeNested) {
-  if (element instanceof SVG.Element) return element
-
-  if (typeof element === 'object') {
-    return SVG.adopt(element)
-  }
-
-  if (element == null) {
-    return new SVG.Doc()
-  }
-
-  if (typeof element === 'string' && element.charAt(0) !== '<') {
-    return SVG.adopt(document.querySelector(element))
-  }
-
-  var node = SVG.create('svg')
-  node.innerHTML = element
-
-  element = SVG.adopt(node.firstElementChild)
-
-  return element
-}
-
-function isNulledBox (box) {
-  return !box.w && !box.h && !box.x && !box.y
-}
-
-function domContains (node) {
-  return (document.documentElement.contains || function (node) {
-    // This is IE - it does not support contains() for top-level SVGs
-    while (node.parentNode) {
-      node = node.parentNode
-    }
-    return node === document
-  }).call(document.documentElement, node)
-}
-
-function pathRegReplace (a, b, c, d) {
-  return c + d.replace(SVG.regex.dots, ' .')
-}
-
-// creates deep clone of array
-function arrayClone (arr) {
-  var clone = arr.slice(0)
-  for (var i = clone.length; i--;) {
-    if (Array.isArray(clone[i])) {
-      clone[i] = arrayClone(clone[i])
-    }
-  }
-  return clone
-}
-
-// tests if a given element is instance of an object
-function is (el, obj) {
-  return el instanceof obj
-}
-
-// tests if a given selector matches an element
-function matches (el, selector) {
-  return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector)
-}
-
-// Convert dash-separated-string to camelCase
-function camelCase (s) {
-  return s.toLowerCase().replace(/-(.)/g, function (m, g) {
-    return g.toUpperCase()
-  })
-}
-
-// Capitalize first letter of a string
-function capitalize (s) {
-  return s.charAt(0).toUpperCase() + s.slice(1)
-}
-
-// Ensure to six-based hex
-function fullHex (hex) {
-  return hex.length === 4
-    ? [ '#',
-      hex.substring(1, 2), hex.substring(1, 2),
-      hex.substring(2, 3), hex.substring(2, 3),
-      hex.substring(3, 4), hex.substring(3, 4)
-    ].join('')
-    : hex
-}
-
-// Component to hex value
-function compToHex (comp) {
-  var hex = comp.toString(16)
-  return hex.length === 1 ? '0' + hex : hex
-}
-
-// Calculate proportional width and height values when necessary
-function proportionalSize (element, width, height) {
-  if (width == null || height == null) {
-    var box = element.bbox()
-
-    if (width == null) {
-      width = box.width / box.height * height
-    } else if (height == null) {
-      height = box.height / box.width * width
-    }
-  }
-
-  return {
-    width: width,
-    height: height
-  }
-}
-
-// Map matrix array to object
-function arrayToMatrix (a) {
-  return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] }
-}
-
-// Add centre point to transform object
-function ensureCentre (o, target) {
-  o.cx = o.cx == null ? target.bbox().cx : o.cx
-  o.cy = o.cy == null ? target.bbox().cy : o.cy
-}
-
-// PathArray Helpers
-function arrayToString (a) {
-  for (var i = 0, il = a.length, s = ''; i < il; i++) {
-    s += a[i][0]
-
-    if (a[i][1] != null) {
-      s += a[i][1]
-
-      if (a[i][2] != null) {
-        s += ' '
-        s += a[i][2]
-
-        if (a[i][3] != null) {
-          s += ' '
-          s += a[i][3]
-          s += ' '
-          s += a[i][4]
-
-          if (a[i][5] != null) {
-            s += ' '
-            s += a[i][5]
-            s += ' '
-            s += a[i][6]
-
-            if (a[i][7] != null) {
-              s += ' '
-              s += a[i][7]
-            }
-          }
-        }
-      }
-    }
-  }
-
-  return s + ' '
-}
-
-// Deep new id assignment
-function assignNewId (node) {
-  // do the same for SVG child nodes as well
-  for (var i = node.children.length - 1; i >= 0; i--) {
-    assignNewId(node.children[i])
-  }
-
-  if (node.id) {
-    return SVG.adopt(node).id(SVG.eid(node.nodeName))
-  }
-
-  return SVG.adopt(node)
-}
-
-// Add more bounding box properties
-function fullBox (b) {
-  if (b.x == null) {
-    b.x = 0
-    b.y = 0
-    b.width = 0
-    b.height = 0
-  }
-
-  b.w = b.width
-  b.h = b.height
-  b.x2 = b.x + b.width
-  b.y2 = b.y + b.height
-  b.cx = b.x + b.width / 2
-  b.cy = b.y + b.height / 2
-
-  return b
-}
-
-// Get id from reference string
-function idFromReference (url) {
-  var m = (url || '').toString().match(SVG.regex.reference)
-
-  if (m) return m[1]
-}
-
-// Create matrix array for looping
-var abcdef = 'abcdef'.split('')
-
-function closeEnough (a, b, threshold) {
-  return Math.abs(b - a) < (threshold || 1e-6)
-}
-
-// TODO: Refactor this to a static function of matrix.js
-function formatTransforms (o) {
-  // Get all of the parameters required to form the matrix
-  var flipBoth = o.flip === 'both' || o.flip === true
-  var flipX = o.flip && (flipBoth || o.flip === 'x') ? -1 : 1
-  var flipY = o.flip && (flipBoth || o.flip === 'y') ? -1 : 1
-  var skewX = o.skew && o.skew.length ? o.skew[0]
-    : isFinite(o.skew) ? o.skew
-    : isFinite(o.skewX) ? o.skewX
-    : 0
-  var skewY = o.skew && o.skew.length ? o.skew[1]
-    : isFinite(o.skew) ? o.skew
-    : isFinite(o.skewY) ? o.skewY
-    : 0
-  var scaleX = o.scale && o.scale.length ? o.scale[0] * flipX
-    : isFinite(o.scale) ? o.scale * flipX
-    : isFinite(o.scaleX) ? o.scaleX * flipX
-    : flipX
-  var scaleY = o.scale && o.scale.length ? o.scale[1] * flipY
-    : isFinite(o.scale) ? o.scale * flipY
-    : isFinite(o.scaleY) ? o.scaleY * flipY
-    : flipY
-  var shear = o.shear || 0
-  var theta = o.rotate || o.theta || 0
-  var origin = new SVG.Point(o.origin || o.around || o.ox || o.originX, o.oy || o.originY)
-  var ox = origin.x
-  var oy = origin.y
-  var position = new SVG.Point(o.position || o.px || o.positionX, o.py || o.positionY)
-  var px = position.x
-  var py = position.y
-  var translate = new SVG.Point(o.translate || o.tx || o.translateX, o.ty || o.translateY)
-  var tx = translate.x
-  var ty = translate.y
-  var relative = new SVG.Point(o.relative || o.rx || o.relativeX, o.ry || o.relativeY)
-  var rx = relative.x
-  var ry = relative.y
-
-  // Populate all of the values
-  return {
-    scaleX: scaleX,
-    scaleY: scaleY,
-    skewX: skewX,
-    skewY: skewY,
-    shear: shear,
-    theta: theta,
-    rx: rx,
-    ry: ry,
-    tx: tx,
-    ty: ty,
-    ox: ox,
-    oy: oy,
-    px: px,
-    py: py
-  }
-}
-
-function getOrigin (o, element) {
-  // Allow origin or around as the names
-  origin = o.around == null ? o.origin : o.around
-
-  // Allow the user to pass a string to rotate around a given point
-  if ( typeof origin === 'string' || origin == null ) {
-    // Get the bounding box of the element with no transformations applied
-    const string = (origin || 'center').toLowerCase().trim()
-    const { height, width, x, y } = element.bbox()
-
-    // Set the bounds eg : "bottom-left", "Top right", "middle" etc...
-    const ox = o.ox || string.includes('left') ? x
-      : string.includes('right') ? x + width
-      : x + width / 2
-    const oy = o.oy || string.includes('top') ? y
-      : string.includes('bottom') ? y + height
-      : y + height / 2
-    return [ox, oy]
-  }
-
-  // Return the origin as it is if it wasn't a string
-  return origin
-}
-
-/* globals fullBox, domContains, isNulledBox, Exception */
-
-SVG.Box = SVG.invent({
-  create: function (source) {
-    var base = [0, 0, 0, 0]
-    source = typeof source === 'string' ? source.split(SVG.regex.delimiter).map(parseFloat)
-      : Array.isArray(source) ? source
-      : typeof source === 'object' ? [source.left != null ? source.left
-      : source.x, source.top != null ? source.top : source.y, source.width, source.height]
-      : arguments.length === 4 ? [].slice.call(arguments)
-      : base
-
-    this.x = source[0]
-    this.y = source[1]
-    this.width = source[2]
-    this.height = source[3]
-
-    // add center, right, bottom...
-    fullBox(this)
-  },
-  extend: {
-    // Merge rect box with another, return a new instance
-    merge: function (box) {
-      var x = Math.min(this.x, box.x)
-      var y = Math.min(this.y, box.y)
-
-      return new SVG.Box(
-        x, y,
-        Math.max(this.x + this.width, box.x + box.width) - x,
-        Math.max(this.y + this.height, box.y + box.height) - y
-      )
-    },
-
-    transform: function (m) {
-      var xMin = Infinity
-      var xMax = -Infinity
-      var yMin = Infinity
-      var yMax = -Infinity
-
-      var pts = [
-        new SVG.Point(this.x, this.y),
-        new SVG.Point(this.x2, this.y),
-        new SVG.Point(this.x, this.y2),
-        new SVG.Point(this.x2, this.y2)
-      ]
-
-      pts.forEach(function (p) {
-        p = p.transform(m)
-        xMin = Math.min(xMin, p.x)
-        xMax = Math.max(xMax, p.x)
-        yMin = Math.min(yMin, p.y)
-        yMax = Math.max(yMax, p.y)
-      })
-
-      return new SVG.Box(
-        xMin, yMin,
-        xMax - xMin,
-        yMax - yMin
-      )
-    },
-
-    addOffset: function () {
-      // offset by window scroll position, because getBoundingClientRect changes when window is scrolled
-      this.x += window.pageXOffset
-      this.y += window.pageYOffset
-      return this
-    },
-    toString: function () {
-      return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height
-    },
-    toArray: function () {
-      return [this.x, this.y, this.width, this.height]
-    },
-    morph: function (x, y, width, height) {
-      this.destination = new SVG.Box(x, y, width, height)
-      return this
-    },
-
-    at: function (pos) {
-      if (!this.destination) return this
-
-      return new SVG.Box(
-          this.x + (this.destination.x - this.x) * pos
-        , this.y + (this.destination.y - this.y) * pos
-        , this.width + (this.destination.width - this.width) * pos
-        , this.height + (this.destination.height - this.height) * pos
-      )
-    }
-  },
-
-    // Define Parent
-  parent: SVG.Element,
-
-  // Constructor
-  construct: {
-    // Get bounding box
-    bbox: function () {
-      var box
-
-      try {
-        // find native bbox
-        box = this.node.getBBox()
-
-        if (isNulledBox(box) && !domContains(this.node)) {
-          throw new Exception('Element not in the dom')
-        }
-      } catch (e) {
-        try {
-          var clone = this.clone(SVG.parser().svg).show()
-          box = clone.node.getBBox()
-          clone.remove()
-        } catch (e) {
-          console.warn('Getting a bounding box of this element is not possible')
-        }
-      }
-
-      return new SVG.Box(box)
-    },
-
-    rbox: function (el) {
-      // IE11 throws an error when element not in dom
-      try {
-        var box = new SVG.Box(this.node.getBoundingClientRect())
-        if (el) return box.transform(el.screenCTM().inverse())
-        return box.addOffset()
-      } catch (e) {
-        return new SVG.Box()
-      }
-    }
-  }
-})
-
-SVG.extend([SVG.Doc, SVG.Symbol, SVG.Image, SVG.Pattern, SVG.Marker, SVG.ForeignObject, SVG.View], {
-  viewbox: function (x, y, width, height) {
-    // act as getter
-    if (x == null) return new SVG.Box(this.attr('viewBox'))
-
-    // act as setter
-    return this.attr('viewBox', new SVG.Box(x, y, width, height))
-  }
-})
-
-
-SVG.parser = function () {
-  var b
-
-  if (!SVG.parser.nodes.svg.node.parentNode) {
-    b = document.body || document.documentElement
-    SVG.parser.nodes.svg.addTo(b)
-  }
-
-  return SVG.parser.nodes
-}
-
-SVG.parser.nodes = {
-  svg: SVG().size(2, 0).css({
-    opacity: 0,
-    position: 'absolute',
-    left: '-100%',
-    top: '-100%',
-    overflow: 'hidden'
-  })
-}
-
-SVG.parser.nodes.path = SVG.parser.nodes.svg.path().node
+\r
+(function(root, factory) {\r
+  /* istanbul ignore next */\r
+  if (typeof define === 'function' && define.amd) {\r
+    define(function(){\r
+      return factory(root, root.document)\r
+    })\r
+  } else if (typeof exports === 'object') {\r
+    module.exports = root.document ? factory(root, root.document) : function(w){ return factory(w, w.document) }\r
+  } else {\r
+    root.SVG = factory(root, root.document)\r
+  }\r
+}(typeof window !== "undefined" ? window : this, function(window, document) {\r
+\r
+// Check that our browser supports svg\r
+var supported = !! document.createElementNS &&\r
+  !! document.createElementNS('http://www.w3.org/2000/svg','svg').createSVGRect\r
+\r
+// If we don't support svg, just exit without doing anything\r
+if (!supported)\r
+  return {supported: false}\r
+\r
+// Otherwise, the library will be here\r
+/* global createElement, capitalize */\r
+/* eslint-disable new-cap */\r
+\r
+// The main wrapping element\r
+var SVG = this.SVG = function (element) {\r
+  if (SVG.supported) {\r
+    element = createElement(element)\r
+    return element\r
+  }\r
+}\r
+\r
+// Svg must be supported if we reached this stage\r
+SVG.supported = true\r
+\r
+// Default namespaces\r
+SVG.ns = 'http://www.w3.org/2000/svg'\r
+SVG.xmlns = 'http://www.w3.org/2000/xmlns/'\r
+SVG.xlink = 'http://www.w3.org/1999/xlink'\r
+SVG.svgjs = 'http://svgjs.com/svgjs'\r
+\r
+// Element id sequence\r
+SVG.did = 1000\r
+\r
+// Get next named element id\r
+SVG.eid = function (name) {\r
+  return 'Svgjs' + capitalize(name) + (SVG.did++)\r
+}\r
+\r
+// Method for element creation\r
+SVG.create = function (name) {\r
+  // create element\r
+  return document.createElementNS(this.ns, name)\r
+}\r
+\r
+// Method for extending objects\r
+SVG.extend = function (modules, methods) {\r
+  var key, i\r
+\r
+  modules = Array.isArray(modules) ? modules : [modules]\r
+\r
+  for (i = modules.length - 1; i >= 0; i--) {\r
+    if (modules[i]) {\r
+      for (key in methods) {\r
+        modules[i].prototype[key] = methods[key]\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+// Invent new element\r
+SVG.invent = function (config) {\r
+  // Create element initializer\r
+  var initializer = typeof config.create === 'function' ? config.create\r
+    : function (node) {\r
+      config.inherit.call(this, node || SVG.create(config.create))\r
+    }\r
+\r
+  // Inherit prototype\r
+  if (config.inherit) {\r
+    initializer.prototype = new config.inherit()\r
+    initializer.prototype.constructor = initializer\r
+  }\r
+\r
+  // Extend with methods\r
+  if (config.extend) {\r
+    SVG.extend(initializer, config.extend)\r
+  }\r
+\r
+  // Attach construct method to parent\r
+  if (config.construct) { SVG.extend(config.parent || SVG.Container, config.construct) }\r
+\r
+  return initializer\r
+}\r
+\r
+// Adopt existing svg elements\r
+SVG.adopt = function (node) {\r
+  // check for presence of node\r
+  if (!node) return null\r
+\r
+  // make sure a node isn't already adopted\r
+  if (node.instance instanceof SVG.Element) return node.instance\r
+\r
+  if (!(node instanceof window.SVGElement)) {\r
+    return new SVG.HtmlNode(node)\r
+  }\r
+\r
+  // initialize variables\r
+  var element\r
+\r
+  // adopt with element-specific settings\r
+  if (node.nodeName === 'svg') {\r
+    element = new SVG.Doc(node)\r
+  } else if (node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient') {\r
+    element = new SVG.Gradient(node)\r
+  } else if (SVG[capitalize(node.nodeName)]) {\r
+    element = new SVG[capitalize(node.nodeName)](node)\r
+  } else {\r
+    element = new SVG.Parent(node)\r
+  }\r
+\r
+  return element\r
+}\r
+
+// Storage for regular expressions\r
+SVG.regex = {\r
+  // Parse unit value\r
+  numberAndUnit: /^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i,\r
+\r
+  // Parse hex value\r
+  hex: /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,\r
+\r
+  // Parse rgb value\r
+  rgb: /rgb\((\d+),(\d+),(\d+)\)/,\r
+\r
+  // Parse reference id\r
+  reference: /#([a-z0-9\-_]+)/i,\r
+\r
+  // splits a transformation chain\r
+  transforms: /\)\s*,?\s*/,\r
+\r
+  // Whitespace\r
+  whitespace: /\s/g,\r
+\r
+  // Test hex value\r
+  isHex: /^#[a-f0-9]{3,6}$/i,\r
+\r
+  // Test rgb value\r
+  isRgb: /^rgb\(/,\r
+\r
+  // Test css declaration\r
+  isCss: /[^:]+:[^;]+;?/,\r
+\r
+  // Test for blank string\r
+  isBlank: /^(\s+)?$/,\r
+\r
+  // Test for numeric string\r
+  isNumber: /^[+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,\r
+\r
+  // Test for percent value\r
+  isPercent: /^-?[\d.]+%$/,\r
+\r
+  // Test for image url\r
+  isImage: /\.(jpg|jpeg|png|gif|svg)(\?[^=]+.*)?/i,\r
+\r
+  // split at whitespace and comma\r
+  delimiter: /[\s,]+/,\r
+\r
+  // The following regex are used to parse the d attribute of a path\r
+\r
+  // Matches all hyphens which are not after an exponent\r
+  hyphen: /([^e])-/gi,\r
+\r
+  // Replaces and tests for all path letters\r
+  pathLetters: /[MLHVCSQTAZ]/gi,\r
+\r
+  // yes we need this one, too\r
+  isPathLetter: /[MLHVCSQTAZ]/i,\r
+\r
+  // matches 0.154.23.45\r
+  numbersWithDots: /((\d?\.\d+(?:e[+-]?\d+)?)((?:\.\d+(?:e[+-]?\d+)?)+))+/gi,\r
+\r
+  // matches .\r
+  dots: /\./g\r
+}\r
+
+\r
+SVG.utils = {\r
+  // Map function\r
+  map: function (array, block) {\r
+    var i\r
+    var il = array.length\r
+    var result = []\r
+\r
+    for (i = 0; i < il; i++) {\r
+      result.push(block(array[i]))\r
+    }\r
+\r
+    return result\r
+  },\r
+\r
+  // Filter function\r
+  filter: function (array, block) {\r
+    var i\r
+    var il = array.length\r
+    var result = []\r
+\r
+    for (i = 0; i < il; i++) {\r
+      if (block(array[i])) { result.push(array[i]) }\r
+    }\r
+\r
+    return result\r
+  },\r
+\r
+  // Degrees to radians\r
+  radians: function (d) {\r
+    return d % 360 * Math.PI / 180\r
+  },\r
+\r
+  // Radians to degrees\r
+  degrees: function (r) {\r
+    return r * 180 / Math.PI % 360\r
+  },\r
+\r
+  filterSVGElements: function (nodes) {\r
+    return this.filter(nodes, function (el) { return el instanceof window.SVGElement })\r
+  }\r
+\r
+}\r
+
+\r
+SVG.void = function () {}\r
+\r
+SVG.defaults = {\r
+\r
+  // Default animation values\r
+  timeline: {\r
+    duration: 400,\r
+    ease: '>',\r
+    delay: 0\r
+  },\r
+\r
+  // Default attribute values\r
+  attrs: {\r
+\r
+    // fill and stroke\r
+    'fill-opacity': 1,\r
+    'stroke-opacity': 1,\r
+    'stroke-width': 0,\r
+    'stroke-linejoin': 'miter',\r
+    'stroke-linecap': 'butt',\r
+    fill: '#000000',\r
+    stroke: '#000000',\r
+    opacity: 1,\r
+\r
+    // position\r
+    x: 0,\r
+    y: 0,\r
+    cx: 0,\r
+    cy: 0,\r
+\r
+    // size\r
+    width: 0,\r
+    height: 0,\r
+\r
+    // radius\r
+    r: 0,\r
+    rx: 0,\r
+    ry: 0,\r
+\r
+    // gradient\r
+    offset: 0,\r
+    'stop-opacity': 1,\r
+    'stop-color': '#000000',\r
+\r
+    // text\r
+    'font-size': 16,\r
+    'font-family': 'Helvetica, Arial, sans-serif',\r
+    'text-anchor': 'start'\r
+  }\r
+}\r
+
+SVG.Queue = SVG.invent({\r
+  create: function () {\r
+    this._first = null\r
+    this._last = null\r
+  },\r
+\r
+  extend: {\r
+    push: function (value) {\r
+      // An item stores an id and the provided value\r
+      var item = value.next ? value : { value: value, next: null, prev: null }\r
+\r
+      // Deal with the queue being empty or populated\r
+      if (this._last) {\r
+        item.prev = this._last\r
+        this._last.next = item\r
+        this._last = item\r
+      } else {\r
+        this._last = item\r
+        this._first = item\r
+      }\r
+\r
+      // Update the length and return the current item\r
+      return item\r
+    },\r
+\r
+    shift: function () {\r
+      // Check if we have a value\r
+      var remove = this._first\r
+      if (!remove) return null\r
+\r
+      // If we do, remove it and relink things\r
+      this._first = remove.next\r
+      if (this._first) this._first.prev = null\r
+      this._last = this._first ? this._last : null\r
+      return remove.value\r
+    },\r
+\r
+    // Shows us the first item in the list\r
+    first: function () {\r
+      return this._first && this._first.value\r
+    },\r
+\r
+    // Shows us the last item in the list\r
+    last: function () {\r
+      return this._last && this._last.value\r
+    },\r
+\r
+    // Removes the item that was returned from the push\r
+    remove: function (item) {\r
+      // Relink the previous item\r
+      if (item.prev) item.prev.next = item.next\r
+      if (item.next) item.next.prev = item.prev\r
+      if (item === this._last) this._last = item.prev\r
+      if (item === this._first) this._first = item.next\r
+\r
+      // Invalidate item\r
+      item.prev = null\r
+      item.next = null\r
+    }\r
+  }\r
+})\r
+
+/* globals fullHex, compToHex */\r
+\r
+/*\r
+\r
+Color {\r
+  constructor (a, b, c, space) {\r
+    space: 'hsl'\r
+    a: 30\r
+    b: 20\r
+    c: 10\r
+  },\r
+\r
+  toRgb () { return new Color in rgb space }\r
+  toHsl () { return new Color in hsl space }\r
+  toLab () { return new Color in lab space }\r
+\r
+  toArray () { [space, a, b, c] }\r
+  fromArray () { convert it back }\r
+}\r
+\r
+// Conversions aren't always exact because of monitor profiles etc...\r
+new Color(h, s, l, 'hsl') !== new Color(r, g, b).hsl()\r
+new Color(100, 100, 100, [space])\r
+new Color('hsl(30, 20, 10)')\r
+\r
+// Sugar\r
+SVG.rgb(30, 20, 50).lab()\r
+SVG.hsl()\r
+SVG.lab('rgb(100, 100, 100)')\r
+*/\r
+\r
+// Module for color convertions\r
+SVG.Color = function (color, g, b) {\r
+  var match\r
+\r
+  // initialize defaults\r
+  this.r = 0\r
+  this.g = 0\r
+  this.b = 0\r
+\r
+  if (!color) return\r
+\r
+  // parse color\r
+  if (typeof color === 'string') {\r
+    if (SVG.regex.isRgb.test(color)) {\r
+      // get rgb values\r
+      match = SVG.regex.rgb.exec(color.replace(SVG.regex.whitespace, ''))\r
+\r
+      // parse numeric values\r
+      this.r = parseInt(match[1])\r
+      this.g = parseInt(match[2])\r
+      this.b = parseInt(match[3])\r
+    } else if (SVG.regex.isHex.test(color)) {\r
+      // get hex values\r
+      match = SVG.regex.hex.exec(fullHex(color))\r
+\r
+      // parse numeric values\r
+      this.r = parseInt(match[1], 16)\r
+      this.g = parseInt(match[2], 16)\r
+      this.b = parseInt(match[3], 16)\r
+    }\r
+  } else if (Array.isArray(color)) {\r
+    this.r = color[0]\r
+    this.g = color[1]\r
+    this.b = color[2]\r
+  } else if (typeof color === 'object') {\r
+    this.r = color.r\r
+    this.g = color.g\r
+    this.b = color.b\r
+  } else if (arguments.length === 3) {\r
+    this.r = color\r
+    this.g = g\r
+    this.b = b\r
+  }\r
+}\r
+\r
+SVG.extend(SVG.Color, {\r
+  // Default to hex conversion\r
+  toString: function () {\r
+    return this.toHex()\r
+  },\r
+  toArray: function () {\r
+    return [this.r, this.g, this.b]\r
+  },\r
+  fromArray: function (a) {\r
+    return new SVG.Color(a)\r
+  },\r
+  // Build hex value\r
+  toHex: function () {\r
+    return '#' +\r
+      compToHex(Math.round(this.r)) +\r
+      compToHex(Math.round(this.g)) +\r
+      compToHex(Math.round(this.b))\r
+  },\r
+  // Build rgb value\r
+  toRgb: function () {\r
+    return 'rgb(' + [this.r, this.g, this.b].join() + ')'\r
+  },\r
+  // Calculate true brightness\r
+  brightness: function () {\r
+    return (this.r / 255 * 0.30) +\r
+      (this.g / 255 * 0.59) +\r
+      (this.b / 255 * 0.11)\r
+  },\r
+  // Make color morphable\r
+  morph: function (color) {\r
+    this.destination = new SVG.Color(color)\r
+\r
+    return this\r
+  },\r
+  // Get morphed color at given position\r
+  at: function (pos) {\r
+    // make sure a destination is defined\r
+    if (!this.destination) return this\r
+\r
+    // normalise pos\r
+    pos = pos < 0 ? 0 : pos > 1 ? 1 : pos\r
+\r
+    // generate morphed color\r
+    return new SVG.Color({\r
+      r: ~~(this.r + (this.destination.r - this.r) * pos),\r
+      g: ~~(this.g + (this.destination.g - this.g) * pos),\r
+      b: ~~(this.b + (this.destination.b - this.b) * pos)\r
+    })\r
+  }\r
+\r
+})\r
+\r
+// Testers\r
+\r
+// Test if given value is a color string\r
+SVG.Color.test = function (color) {\r
+  color += ''\r
+  return SVG.regex.isHex.test(color) ||\r
+    SVG.regex.isRgb.test(color)\r
+}\r
+\r
+// Test if given value is a rgb object\r
+SVG.Color.isRgb = function (color) {\r
+  return color && typeof color.r === 'number' &&\r
+    typeof color.g === 'number' &&\r
+    typeof color.b === 'number'\r
+}\r
+\r
+// Test if given value is a color\r
+SVG.Color.isColor = function (color) {\r
+  return SVG.Color.isRgb(color) || SVG.Color.test(color)\r
+}\r
+
+/* global arrayClone */\r
+\r
+// Module for array conversion\r
+SVG.Array = function (array, fallback) {\r
+  array = (array || []).valueOf()\r
+\r
+  // if array is empty and fallback is provided, use fallback\r
+  if (array.length === 0 && fallback) {\r
+    array = fallback.valueOf()\r
+  }\r
+\r
+  // parse array\r
+  this.value = this.parse(array)\r
+}\r
+\r
+SVG.extend(SVG.Array, {\r
+  // Make array morphable\r
+  morph: function (array) {\r
+    this.destination = this.parse(array)\r
+\r
+    // normalize length of arrays\r
+    if (this.value.length !== this.destination.length) {\r
+      var lastValue = this.value[this.value.length - 1]\r
+      var lastDestination = this.destination[this.destination.length - 1]\r
+\r
+      while (this.value.length > this.destination.length) {\r
+        this.destination.push(lastDestination)\r
+      }\r
+      while (this.value.length < this.destination.length) {\r
+        this.value.push(lastValue)\r
+      }\r
+    }\r
+\r
+    return this\r
+  },\r
+  // Clean up any duplicate points\r
+  settle: function () {\r
+    // find all unique values\r
+    for (var i = 0, il = this.value.length, seen = []; i < il; i++) {\r
+      if (seen.indexOf(this.value[i]) === -1) {\r
+        seen.push(this.value[i])\r
+      }\r
+    }\r
+\r
+    // set new value\r
+    this.value = seen\r
+    return seen\r
+  },\r
+  // Get morphed array at given position\r
+  at: function (pos) {\r
+    // make sure a destination is defined\r
+    if (!this.destination) return this\r
+\r
+    // generate morphed array\r
+    for (var i = 0, il = this.value.length, array = []; i < il; i++) {\r
+      array.push(this.value[i] + (this.destination[i] - this.value[i]) * pos)\r
+    }\r
+\r
+    return new SVG.Array(array)\r
+  },\r
+  toArray: function () {\r
+    return this.value\r
+  },\r
+  // Convert array to string\r
+  toString: function () {\r
+    return this.value.join(' ')\r
+  },\r
+  // Real value\r
+  valueOf: function () {\r
+    return this.value\r
+  },\r
+  // Parse whitespace separated string\r
+  parse: function (array) {\r
+    array = array.valueOf()\r
+\r
+    // if already is an array, no need to parse it\r
+    if (Array.isArray(array)) return array\r
+\r
+    return array.trim().split(SVG.regex.delimiter).map(parseFloat)\r
+  },\r
+  // Reverse array\r
+  reverse: function () {\r
+    this.value.reverse()\r
+\r
+    return this\r
+  },\r
+  clone: function () {\r
+    var clone = new this.constructor()\r
+    clone.value = arrayClone(this.value)\r
+    return clone\r
+  }\r
+})\r
+
+\r
+// Poly points array\r
+SVG.PointArray = function (array, fallback) {\r
+  SVG.Array.call(this, array, fallback || [[0, 0]])\r
+}\r
+\r
+// Inherit from SVG.Array\r
+SVG.PointArray.prototype = new SVG.Array()\r
+SVG.PointArray.prototype.constructor = SVG.PointArray\r
+\r
+SVG.extend(SVG.PointArray, {\r
+  // Convert array to string\r
+  toString: function () {\r
+    // convert to a poly point string\r
+    for (var i = 0, il = this.value.length, array = []; i < il; i++) {\r
+      array.push(this.value[i].join(','))\r
+    }\r
+\r
+    return array.join(' ')\r
+  },\r
+\r
+  toArray: function () {\r
+    return this.value.reduce(function (prev, curr) {\r
+      return [].concat.call(prev, curr)\r
+    }, [])\r
+  },\r
+\r
+  // Convert array to line object\r
+  toLine: function () {\r
+    return {\r
+      x1: this.value[0][0],\r
+      y1: this.value[0][1],\r
+      x2: this.value[1][0],\r
+      y2: this.value[1][1]\r
+    }\r
+  },\r
+\r
+  // Get morphed array at given position\r
+  at: function (pos) {\r
+    // make sure a destination is defined\r
+    if (!this.destination) return this\r
+\r
+    // generate morphed point string\r
+    for (var i = 0, il = this.value.length, array = []; i < il; i++) {\r
+      array.push([\r
+        this.value[i][0] + (this.destination[i][0] - this.value[i][0]) * pos,\r
+        this.value[i][1] + (this.destination[i][1] - this.value[i][1]) * pos\r
+      ])\r
+    }\r
+\r
+    return new SVG.PointArray(array)\r
+  },\r
+\r
+  // Parse point string and flat array\r
+  parse: function (array) {\r
+    var points = []\r
+\r
+    array = array.valueOf()\r
+\r
+    // if it is an array\r
+    if (Array.isArray(array)) {\r
+      // and it is not flat, there is no need to parse it\r
+      if (Array.isArray(array[0])) {\r
+        return array\r
+      }\r
+    } else { // Else, it is considered as a string\r
+      // parse points\r
+      array = array.trim().split(SVG.regex.delimiter).map(parseFloat)\r
+    }\r
+\r
+    // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints\r
+    // Odd number of coordinates is an error. In such cases, drop the last odd coordinate.\r
+    if (array.length % 2 !== 0) array.pop()\r
+\r
+    // wrap points in two-tuples and parse points as floats\r
+    for (var i = 0, len = array.length; i < len; i = i + 2) {\r
+      points.push([ array[i], array[i + 1] ])\r
+    }\r
+\r
+    return points\r
+  },\r
+\r
+  // Move point string\r
+  move: function (x, y) {\r
+    var box = this.bbox()\r
+\r
+    // get relative offset\r
+    x -= box.x\r
+    y -= box.y\r
+\r
+    // move every point\r
+    if (!isNaN(x) && !isNaN(y)) {\r
+      for (var i = this.value.length - 1; i >= 0; i--) {\r
+        this.value[i] = [this.value[i][0] + x, this.value[i][1] + y]\r
+      }\r
+    }\r
+\r
+    return this\r
+  },\r
+  // Resize poly string\r
+  size: function (width, height) {\r
+    var i\r
+    var box = this.bbox()\r
+\r
+    // recalculate position of all points according to new size\r
+    for (i = this.value.length - 1; i >= 0; i--) {\r
+      if (box.width) this.value[i][0] = ((this.value[i][0] - box.x) * width) / box.width + box.x\r
+      if (box.height) this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y\r
+    }\r
+\r
+    return this\r
+  },\r
+\r
+  // Get bounding box of points\r
+  bbox: function () {\r
+    var maxX = -Infinity\r
+    var maxY = -Infinity\r
+    var minX = Infinity\r
+    var minY = Infinity\r
+    this.value.forEach(function (el) {\r
+      maxX = Math.max(el[0], maxX)\r
+      maxY = Math.max(el[1], maxY)\r
+      minX = Math.min(el[0], minX)\r
+      minY = Math.min(el[1], minY)\r
+    })\r
+    return {x: minX, y: minY, width: maxX - minX, height: maxY - minY}\r
+  }\r
+})\r
+
+/* globals arrayToString, pathRegReplace */\r
+\r
+var pathHandlers = {\r
+  M: function (c, p, p0) {\r
+    p.x = p0.x = c[0]\r
+    p.y = p0.y = c[1]\r
+\r
+    return ['M', p.x, p.y]\r
+  },\r
+  L: function (c, p) {\r
+    p.x = c[0]\r
+    p.y = c[1]\r
+    return ['L', c[0], c[1]]\r
+  },\r
+  H: function (c, p) {\r
+    p.x = c[0]\r
+    return ['H', c[0]]\r
+  },\r
+  V: function (c, p) {\r
+    p.y = c[0]\r
+    return ['V', c[0]]\r
+  },\r
+  C: function (c, p) {\r
+    p.x = c[4]\r
+    p.y = c[5]\r
+    return ['C', c[0], c[1], c[2], c[3], c[4], c[5]]\r
+  },\r
+  S: function (c, p) {\r
+    p.x = c[2]\r
+    p.y = c[3]\r
+    return ['S', c[0], c[1], c[2], c[3]]\r
+  },\r
+  Q: function (c, p) {\r
+    p.x = c[2]\r
+    p.y = c[3]\r
+    return ['Q', c[0], c[1], c[2], c[3]]\r
+  },\r
+  T: function (c, p) {\r
+    p.x = c[0]\r
+    p.y = c[1]\r
+    return ['T', c[0], c[1]]\r
+  },\r
+  Z: function (c, p, p0) {\r
+    p.x = p0.x\r
+    p.y = p0.y\r
+    return ['Z']\r
+  },\r
+  A: function (c, p) {\r
+    p.x = c[5]\r
+    p.y = c[6]\r
+    return ['A', c[0], c[1], c[2], c[3], c[4], c[5], c[6]]\r
+  }\r
+}\r
+\r
+var mlhvqtcsaz = 'mlhvqtcsaz'.split('')\r
+\r
+for (var i = 0, il = mlhvqtcsaz.length; i < il; ++i) {\r
+  pathHandlers[mlhvqtcsaz[i]] = (function (i) {\r
+    return function (c, p, p0) {\r
+      if (i === 'H') c[0] = c[0] + p.x\r
+      else if (i === 'V') c[0] = c[0] + p.y\r
+      else if (i === 'A') {\r
+        c[5] = c[5] + p.x\r
+        c[6] = c[6] + p.y\r
+      } else {\r
+        for (var j = 0, jl = c.length; j < jl; ++j) {\r
+          c[j] = c[j] + (j % 2 ? p.y : p.x)\r
+        }\r
+      }\r
+\r
+      return pathHandlers[i](c, p, p0)\r
+    }\r
+  })(mlhvqtcsaz[i].toUpperCase())\r
+}\r
+\r
+// Path points array\r
+SVG.PathArray = function (array, fallback) {\r
+  SVG.Array.call(this, array, fallback || [['M', 0, 0]])\r
+}\r
+\r
+// Inherit from SVG.Array\r
+SVG.PathArray.prototype = new SVG.Array()\r
+SVG.PathArray.prototype.constructor = SVG.PathArray\r
+\r
+SVG.extend(SVG.PathArray, {\r
+  // Convert array to string\r
+  toString: function () {\r
+    return arrayToString(this.value)\r
+  },\r
+  toArray: function () {\r
+    return this.value.reduce(function (prev, curr) {\r
+      return [].concat.call(prev, curr)\r
+    }, [])\r
+  },\r
+  // Move path string\r
+  move: function (x, y) {\r
+    // get bounding box of current situation\r
+    var box = this.bbox()\r
+\r
+    // get relative offset\r
+    x -= box.x\r
+    y -= box.y\r
+\r
+    if (!isNaN(x) && !isNaN(y)) {\r
+      // move every point\r
+      for (var l, i = this.value.length - 1; i >= 0; i--) {\r
+        l = this.value[i][0]\r
+\r
+        if (l === 'M' || l === 'L' || l === 'T') {\r
+          this.value[i][1] += x\r
+          this.value[i][2] += y\r
+        } else if (l === 'H') {\r
+          this.value[i][1] += x\r
+        } else if (l === 'V') {\r
+          this.value[i][1] += y\r
+        } else if (l === 'C' || l === 'S' || l === 'Q') {\r
+          this.value[i][1] += x\r
+          this.value[i][2] += y\r
+          this.value[i][3] += x\r
+          this.value[i][4] += y\r
+\r
+          if (l === 'C') {\r
+            this.value[i][5] += x\r
+            this.value[i][6] += y\r
+          }\r
+        } else if (l === 'A') {\r
+          this.value[i][6] += x\r
+          this.value[i][7] += y\r
+        }\r
+      }\r
+    }\r
+\r
+    return this\r
+  },\r
+  // Resize path string\r
+  size: function (width, height) {\r
+    // get bounding box of current situation\r
+    var box = this.bbox()\r
+    var i, l\r
+\r
+    // recalculate position of all points according to new size\r
+    for (i = this.value.length - 1; i >= 0; i--) {\r
+      l = this.value[i][0]\r
+\r
+      if (l === 'M' || l === 'L' || l === 'T') {\r
+        this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r
+        this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y\r
+      } else if (l === 'H') {\r
+        this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r
+      } else if (l === 'V') {\r
+        this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y\r
+      } else if (l === 'C' || l === 'S' || l === 'Q') {\r
+        this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r
+        this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y\r
+        this.value[i][3] = ((this.value[i][3] - box.x) * width) / box.width + box.x\r
+        this.value[i][4] = ((this.value[i][4] - box.y) * height) / box.height + box.y\r
+\r
+        if (l === 'C') {\r
+          this.value[i][5] = ((this.value[i][5] - box.x) * width) / box.width + box.x\r
+          this.value[i][6] = ((this.value[i][6] - box.y) * height) / box.height + box.y\r
+        }\r
+      } else if (l === 'A') {\r
+        // resize radii\r
+        this.value[i][1] = (this.value[i][1] * width) / box.width\r
+        this.value[i][2] = (this.value[i][2] * height) / box.height\r
+\r
+        // move position values\r
+        this.value[i][6] = ((this.value[i][6] - box.x) * width) / box.width + box.x\r
+        this.value[i][7] = ((this.value[i][7] - box.y) * height) / box.height + box.y\r
+      }\r
+    }\r
+\r
+    return this\r
+  },\r
+  // Test if the passed path array use the same path data commands as this path array\r
+  equalCommands: function (pathArray) {\r
+    var i, il, equalCommands\r
+\r
+    pathArray = new SVG.PathArray(pathArray)\r
+\r
+    equalCommands = this.value.length === pathArray.value.length\r
+    for (i = 0, il = this.value.length; equalCommands && i < il; i++) {\r
+      equalCommands = this.value[i][0] === pathArray.value[i][0]\r
+    }\r
+\r
+    return equalCommands\r
+  },\r
+  // Make path array morphable\r
+  morph: function (pathArray) {\r
+    pathArray = new SVG.PathArray(pathArray)\r
+\r
+    if (this.equalCommands(pathArray)) {\r
+      this.destination = pathArray\r
+    } else {\r
+      this.destination = null\r
+    }\r
+\r
+    return this\r
+  },\r
+  // Get morphed path array at given position\r
+  at: function (pos) {\r
+    // make sure a destination is defined\r
+    if (!this.destination) return this\r
+\r
+    var sourceArray = this.value\r
+    var destinationArray = this.destination.value\r
+    var array = []\r
+    var pathArray = new SVG.PathArray()\r
+    var i, il, j, jl\r
+\r
+    // Animate has specified in the SVG spec\r
+    // See: https://www.w3.org/TR/SVG11/paths.html#PathElement\r
+    for (i = 0, il = sourceArray.length; i < il; i++) {\r
+      array[i] = [sourceArray[i][0]]\r
+      for (j = 1, jl = sourceArray[i].length; j < jl; j++) {\r
+        array[i][j] = sourceArray[i][j] + (destinationArray[i][j] - sourceArray[i][j]) * pos\r
+      }\r
+      // For the two flags of the elliptical arc command, the SVG spec say:\r
+      // Flags and booleans are interpolated as fractions between zero and one, with any non-zero value considered to be a value of one/true\r
+      // Elliptical arc command as an array followed by corresponding indexes:\r
+      // ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\r
+      //   0    1   2        3                 4             5      6  7\r
+      if (array[i][0] === 'A') {\r
+        array[i][4] = +(array[i][4] !== 0)\r
+        array[i][5] = +(array[i][5] !== 0)\r
+      }\r
+    }\r
+\r
+    // Directly modify the value of a path array, this is done this way for performance\r
+    pathArray.value = array\r
+    return pathArray\r
+  },\r
+  // Absolutize and parse path to array\r
+  parse: function (array) {\r
+    // if it's already a patharray, no need to parse it\r
+    if (array instanceof SVG.PathArray) return array.valueOf()\r
+\r
+    // prepare for parsing\r
+    var s\r
+    var paramCnt = { 'M': 2, 'L': 2, 'H': 1, 'V': 1, 'C': 6, 'S': 4, 'Q': 4, 'T': 2, 'A': 7, 'Z': 0 }\r
+\r
+    if (typeof array === 'string') {\r
+      array = array\r
+        .replace(SVG.regex.numbersWithDots, pathRegReplace) // convert 45.123.123 to 45.123 .123\r
+        .replace(SVG.regex.pathLetters, ' $& ') // put some room between letters and numbers\r
+        .replace(SVG.regex.hyphen, '$1 -')      // add space before hyphen\r
+        .trim()                                 // trim\r
+        .split(SVG.regex.delimiter)   // split into array\r
+    } else {\r
+      array = array.reduce(function (prev, curr) {\r
+        return [].concat.call(prev, curr)\r
+      }, [])\r
+    }\r
+\r
+    // array now is an array containing all parts of a path e.g. ['M', '0', '0', 'L', '30', '30' ...]\r
+    var result = []\r
+    var p = new SVG.Point()\r
+    var p0 = new SVG.Point()\r
+    var index = 0\r
+    var len = array.length\r
+\r
+    do {\r
+      // Test if we have a path letter\r
+      if (SVG.regex.isPathLetter.test(array[index])) {\r
+        s = array[index]\r
+        ++index\r
+      // If last letter was a move command and we got no new, it defaults to [L]ine\r
+      } else if (s === 'M') {\r
+        s = 'L'\r
+      } else if (s === 'm') {\r
+        s = 'l'\r
+      }\r
+\r
+      result.push(pathHandlers[s].call(null,\r
+          array.slice(index, (index = index + paramCnt[s.toUpperCase()])).map(parseFloat),\r
+          p, p0\r
+        )\r
+      )\r
+    } while (len > index)\r
+\r
+    return result\r
+  },\r
+  // Get bounding box of path\r
+  bbox: function () {\r
+    SVG.parser().path.setAttribute('d', this.toString())\r
+    return SVG.parser.nodes.path.getBBox()\r
+  }\r
+\r
+})\r
+
+\r
+// Module for unit convertions\r
+SVG.Number = SVG.invent({\r
+  // Initialize\r
+  create: function (value, unit) {\r
+    unit = Array.isArray(value) ? value[1] : unit\r
+    value = Array.isArray(value) ? value[0] : value\r
+\r
+    // initialize defaults\r
+    this.value = 0\r
+    this.unit = unit || ''\r
+\r
+    // parse value\r
+    if (typeof value === 'number') {\r
+      // ensure a valid numeric value\r
+      this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value\r
+    } else if (typeof value === 'string') {\r
+      unit = value.match(SVG.regex.numberAndUnit)\r
+\r
+      if (unit) {\r
+        // make value numeric\r
+        this.value = parseFloat(unit[1])\r
+\r
+        // normalize\r
+        if (unit[5] === '%') { this.value /= 100 } else if (unit[5] === 's') {\r
+          this.value *= 1000\r
+        }\r
+\r
+        // store unit\r
+        this.unit = unit[5]\r
+      }\r
+    } else {\r
+      if (value instanceof SVG.Number) {\r
+        this.value = value.valueOf()\r
+        this.unit = value.unit\r
+      }\r
+    }\r
+  },\r
+  // Add methods\r
+  extend: {\r
+    // Stringalize\r
+    toString: function () {\r
+      return (this.unit === '%' ? ~~(this.value * 1e8) / 1e6\r
+        : this.unit === 's' ? this.value / 1e3\r
+        : this.value\r
+      ) + this.unit\r
+    },\r
+    toJSON: function () {\r
+      return this.toString()\r
+    },   // Convert to primitive\r
+    toArray: function () {\r
+      return [this.value, this.unit]\r
+    },\r
+    valueOf: function () {\r
+      return this.value\r
+    },\r
+    // Add number\r
+    plus: function (number) {\r
+      number = new SVG.Number(number)\r
+      return new SVG.Number(this + number, this.unit || number.unit)\r
+    },\r
+    // Subtract number\r
+    minus: function (number) {\r
+      number = new SVG.Number(number)\r
+      return new SVG.Number(this - number, this.unit || number.unit)\r
+    },\r
+    // Multiply number\r
+    times: function (number) {\r
+      number = new SVG.Number(number)\r
+      return new SVG.Number(this * number, this.unit || number.unit)\r
+    },\r
+    // Divide number\r
+    divide: function (number) {\r
+      number = new SVG.Number(number)\r
+      return new SVG.Number(this / number, this.unit || number.unit)\r
+    },\r
+    // Convert to different unit\r
+    to: function (unit) {\r
+      var number = new SVG.Number(this)\r
+\r
+      if (typeof unit === 'string') {\r
+        number.unit = unit\r
+      }\r
+\r
+      return number\r
+    },\r
+    // Make number morphable\r
+    morph: function (number) {\r
+      this.destination = new SVG.Number(number)\r
+\r
+      if (number.relative) {\r
+        this.destination.value += this.value\r
+      }\r
+\r
+      return this\r
+    },\r
+    // Get morphed number at given position\r
+    at: function (pos) {\r
+      // Make sure a destination is defined\r
+      if (!this.destination) return this\r
+\r
+      // Generate new morphed number\r
+      return new SVG.Number(this.destination)\r
+          .minus(this)\r
+          .times(pos)\r
+          .plus(this)\r
+    }\r
+  }\r
+})\r
+
+// Add events to elements\r
+/*\r
+;[ 'click',\r
+  'dblclick',\r
+  'mousedown',\r
+  'mouseup',\r
+  'mouseover',\r
+  'mouseout',\r
+  'mousemove',\r
+  'mouseenter',\r
+  'mouseleave',\r
+  'touchstart',\r
+  'touchmove',\r
+  'touchleave',\r
+  'touchend',\r
+  'touchcancel' ].forEach(function (event) {\r
+    // add event to SVG.Element\r
+    SVG.Element.prototype[event] = function (f) {\r
+    // bind event to element rather than element node\r
+      SVG.on(this, event, f)\r
+      return this\r
+    }\r
+  })\r
+*/\r
+\r
+SVG.listenerId = 0\r
+\r
+// Add event binder in the SVG namespace\r
+SVG.on = function (node, events, listener, binding, options) {\r
+  var l = listener.bind(binding || node)\r
+  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node\r
+\r
+  // events can be an array of events or a string of events\r
+  events = Array.isArray(events) ? events : events.split(SVG.regex.delimiter)\r
+\r
+  // ensure instance object for nodes which are not adopted\r
+  n.instance = n.instance || {events: {}}\r
+\r
+  // pull event handlers from the element\r
+  var bag = n.instance.events\r
+\r
+  // add id to listener\r
+  if (!listener._svgjsListenerId) {\r
+    listener._svgjsListenerId = ++SVG.listenerId\r
+  }\r
+\r
+  events.forEach(function (event) {\r
+    var ev = event.split('.')[0]\r
+    var ns = event.split('.')[1] || '*'\r
+\r
+    // ensure valid object\r
+    bag[ev] = bag[ev] || {}\r
+    bag[ev][ns] = bag[ev][ns] || {}\r
+\r
+    // reference listener\r
+    bag[ev][ns][listener._svgjsListenerId] = l\r
+\r
+    // add listener\r
+    n.addEventListener(ev, l, options || false)\r
+  })\r
+}\r
+\r
+// Add event unbinder in the SVG namespace\r
+SVG.off = function (node, events, listener, options) {\r
+  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node\r
+  if (!n.instance) return\r
+\r
+  // listener can be a function or a number\r
+  if (typeof listener === 'function') {\r
+    listener = listener._svgjsListenerId\r
+    if (!listener) return\r
+  }\r
+\r
+  // pull event handlers from the element\r
+  var bag = n.instance.events\r
+\r
+  // events can be an array of events or a string or undefined\r
+  events = Array.isArray(events) ? events : (events || '').split(SVG.regex.delimiter)\r
+\r
+  events.forEach(function (event) {\r
+    var ev = event && event.split('.')[0]\r
+    var ns = event && event.split('.')[1]\r
+    var namespace, l\r
+\r
+    if (listener) {\r
+      // remove listener reference\r
+      if (bag[ev] && bag[ev][ns || '*']) {\r
+        // removeListener\r
+        n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false)\r
+\r
+        delete bag[ev][ns || '*'][listener]\r
+      }\r
+    } else if (ev && ns) {\r
+      // remove all listeners for a namespaced event\r
+      if (bag[ev] && bag[ev][ns]) {\r
+        for (l in bag[ev][ns]) { SVG.off(n, [ev, ns].join('.'), l) }\r
+\r
+        delete bag[ev][ns]\r
+      }\r
+    } else if (ns) {\r
+      // remove all listeners for a specific namespace\r
+      for (event in bag) {\r
+        for (namespace in bag[event]) {\r
+          if (ns === namespace) { SVG.off(n, [event, ns].join('.')) }\r
+        }\r
+      }\r
+    } else if (ev) {\r
+      // remove all listeners for the event\r
+      if (bag[ev]) {\r
+        for (namespace in bag[ev]) { SVG.off(n, [ev, namespace].join('.')) }\r
+\r
+        delete bag[ev]\r
+      }\r
+    } else {\r
+      // remove all listeners on a given node\r
+      for (event in bag) { SVG.off(n, event) }\r
+\r
+      n.instance.events = {}\r
+    }\r
+  })\r
+}\r
+\r
+SVG.dispatch = function (node, event, data) {\r
+  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node\r
+\r
+  // Dispatch event\r
+  if (event instanceof window.Event) {\r
+    n.dispatchEvent(event)\r
+  } else {\r
+    event = new window.CustomEvent(event, {detail: data, cancelable: true})\r
+    n.dispatchEvent(event)\r
+  }\r
+  return event\r
+}\r
+\r
+SVG.EventTarget = SVG.invent({\r
+  create: function () {},\r
+  extend: {\r
+    // Bind given event to listener\r
+    on: function (event, listener, binding, options) {\r
+      SVG.on(this, event, listener, binding, options)\r
+      return this\r
+    },\r
+    // Unbind event from listener\r
+    off: function (event, listener) {\r
+      SVG.off(this, event, listener)\r
+      return this\r
+    },\r
+    dispatch: function (event, data) {\r
+      return SVG.dispatch(this, event, data)\r
+    },\r
+    // Fire given event\r
+    fire: function (event, data) {\r
+      this.dispatch(event, data)\r
+      return this\r
+    }\r
+  }\r
+})\r
+
+/* global createElement */\r
+\r
+SVG.HtmlNode = SVG.invent({\r
+  inherit: SVG.EventTarget,\r
+  create: function (element) {\r
+    this.node = element\r
+  },\r
+\r
+  extend: {\r
+    add: function (element, i) {\r
+      element = createElement(element)\r
+\r
+      if (element.node !== this.node.children[i]) {\r
+        this.node.insertBefore(element.node, this.node.children[i] || null)\r
+      }\r
+\r
+      return this\r
+    },\r
+\r
+    put: function (element, i) {\r
+      this.add(element, i)\r
+      return element\r
+    },\r
+\r
+    getEventTarget: function () {\r
+      return this.node\r
+    }\r
+  }\r
+})\r
+
+/* global proportionalSize, assignNewId, createElement, matches, is */\r
+\r
+SVG.Element = SVG.invent({\r
+  inherit: SVG.EventTarget,\r
+\r
+  // Initialize node\r
+  create: function (node) {\r
+    // event listener\r
+    this.events = {}\r
+\r
+    // initialize data object\r
+    this.dom = {}\r
+\r
+    // create circular reference\r
+    this.node = node\r
+    if (this.node) {\r
+      this.type = node.nodeName\r
+      this.node.instance = this\r
+      this.events = node.events || {}\r
+\r
+      if (node.hasAttribute('svgjs:data')) {\r
+        // pull svgjs data from the dom (getAttributeNS doesn't work in html5)\r
+        this.setData(JSON.parse(node.getAttribute('svgjs:data')) || {})\r
+      }\r
+    }\r
+  },\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Move over x-axis\r
+    x: function (x) {\r
+      return this.attr('x', x)\r
+    },\r
+\r
+    // Move over y-axis\r
+    y: function (y) {\r
+      return this.attr('y', y)\r
+    },\r
+\r
+    // Move by center over x-axis\r
+    cx: function (x) {\r
+      return x == null ? this.x() + this.width() / 2 : this.x(x - this.width() / 2)\r
+    },\r
+\r
+    // Move by center over y-axis\r
+    cy: function (y) {\r
+      return y == null\r
+        ? this.y() + this.height() / 2\r
+        : this.y(y - this.height() / 2)\r
+    },\r
+\r
+    // Move element to given x and y values\r
+    move: function (x, y) {\r
+      return this.x(x).y(y)\r
+    },\r
+\r
+    // Move element by its center\r
+    center: function (x, y) {\r
+      return this.cx(x).cy(y)\r
+    },\r
+\r
+    // Set width of element\r
+    width: function (width) {\r
+      return this.attr('width', width)\r
+    },\r
+\r
+    // Set height of element\r
+    height: function (height) {\r
+      return this.attr('height', height)\r
+    },\r
+\r
+    // Set element size to given width and height\r
+    size: function (width, height) {\r
+      var p = proportionalSize(this, width, height)\r
+\r
+      return this\r
+        .width(new SVG.Number(p.width))\r
+        .height(new SVG.Number(p.height))\r
+    },\r
+\r
+    // Clone element\r
+    clone: function (parent) {\r
+      // write dom data to the dom so the clone can pickup the data\r
+      this.writeDataToDom()\r
+\r
+      // clone element and assign new id\r
+      var clone = assignNewId(this.node.cloneNode(true))\r
+\r
+      // insert the clone in the given parent or after myself\r
+      if (parent) parent.add(clone)\r
+      else this.after(clone)\r
+\r
+      return clone\r
+    },\r
+\r
+    // Remove element\r
+    remove: function () {\r
+      if (this.parent()) { this.parent().removeElement(this) }\r
+\r
+      return this\r
+    },\r
+\r
+    // Replace element\r
+    replace: function (element) {\r
+      this.after(element).remove()\r
+\r
+      return element\r
+    },\r
+\r
+    // Add element to given container and return self\r
+    addTo: function (parent) {\r
+      return createElement(parent).put(this)\r
+    },\r
+\r
+    // Add element to given container and return container\r
+    putIn: function (parent) {\r
+      return createElement(parent).add(this)\r
+    },\r
+\r
+    // Get / set id\r
+    id: function (id) {\r
+      // generate new id if no id set\r
+      if (typeof id === 'undefined' && !this.node.id) {\r
+        this.node.id = SVG.eid(this.type)\r
+      }\r
+\r
+      // dont't set directly width this.node.id to make `null` work correctly\r
+      return this.attr('id', id)\r
+    },\r
+\r
+    // Checks whether the given point inside the bounding box of the element\r
+    inside: function (x, y) {\r
+      var box = this.bbox()\r
+\r
+      return x > box.x &&\r
+        y > box.y &&\r
+        x < box.x + box.width &&\r
+        y < box.y + box.height\r
+    },\r
+\r
+    // Show element\r
+    show: function () {\r
+      return this.css('display', '')\r
+    },\r
+\r
+    // Hide element\r
+    hide: function () {\r
+      return this.css('display', 'none')\r
+    },\r
+\r
+    // Is element visible?\r
+    visible: function () {\r
+      return this.css('display') !== 'none'\r
+    },\r
+\r
+    // Return id on string conversion\r
+    toString: function () {\r
+      return this.id()\r
+    },\r
+\r
+    // Return array of classes on the node\r
+    classes: function () {\r
+      var attr = this.attr('class')\r
+      return attr == null ? [] : attr.trim().split(SVG.regex.delimiter)\r
+    },\r
+\r
+    // Return true if class exists on the node, false otherwise\r
+    hasClass: function (name) {\r
+      return this.classes().indexOf(name) !== -1\r
+    },\r
+\r
+    // Add class to the node\r
+    addClass: function (name) {\r
+      if (!this.hasClass(name)) {\r
+        var array = this.classes()\r
+        array.push(name)\r
+        this.attr('class', array.join(' '))\r
+      }\r
+\r
+      return this\r
+    },\r
+\r
+    // Remove class from the node\r
+    removeClass: function (name) {\r
+      if (this.hasClass(name)) {\r
+        this.attr('class', this.classes().filter(function (c) {\r
+          return c !== name\r
+        }).join(' '))\r
+      }\r
+\r
+      return this\r
+    },\r
+\r
+    // Toggle the presence of a class on the node\r
+    toggleClass: function (name) {\r
+      return this.hasClass(name) ? this.removeClass(name) : this.addClass(name)\r
+    },\r
+\r
+    // Get referenced element form attribute value\r
+    reference: function (attr) {\r
+      return SVG.get(this.attr(attr))\r
+    },\r
+\r
+    // Returns the parent element instance\r
+    parent: function (type) {\r
+      var parent = this\r
+\r
+      // check for parent\r
+      if (!parent.node.parentNode) return null\r
+\r
+      // get parent element\r
+      parent = SVG.adopt(parent.node.parentNode)\r
+\r
+      if (!type) return parent\r
+\r
+      // loop trough ancestors if type is given\r
+      while (parent && parent.node instanceof window.SVGElement) {\r
+        if (typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent\r
+        parent = SVG.adopt(parent.node.parentNode)\r
+      }\r
+    },\r
+\r
+    // Get parent document\r
+    doc: function () {\r
+      var p = this.parent(SVG.Doc)\r
+      return p && p.doc()\r
+    },\r
+\r
+    // Get defs\r
+    defs: function () {\r
+      return this.doc().defs()\r
+    },\r
+\r
+    // return array of all ancestors of given type up to the root svg\r
+    parents: function (type) {\r
+      var parents = []\r
+      var parent = this\r
+\r
+      do {\r
+        parent = parent.parent(type)\r
+        if (!parent || !parent.node) break\r
+\r
+        parents.push(parent)\r
+      } while (parent.parent)\r
+\r
+      return parents\r
+    },\r
+\r
+    // matches the element vs a css selector\r
+    matches: function (selector) {\r
+      return matches(this.node, selector)\r
+    },\r
+\r
+    // Returns the svg node to call native svg methods on it\r
+    native: function () {\r
+      return this.node\r
+    },\r
+\r
+    // Import raw svg\r
+    svg: function (svg) {\r
+      var well, len\r
+\r
+      // act as a setter if svg is given\r
+      if (svg && this instanceof SVG.Parent) {\r
+        // create temporary holder\r
+        well = document.createElementNS(SVG.ns, 'svg')\r
+        // dump raw svg\r
+        well.innerHTML = svg\r
+\r
+        // transplant nodes\r
+        for (len = well.children.length; len--;) {\r
+          this.node.appendChild(well.firstElementChild)\r
+        }\r
+\r
+      // otherwise act as a getter\r
+      } else {\r
+        // write svgjs data to the dom\r
+        this.writeDataToDom()\r
+\r
+        return this.node.outerHTML\r
+      }\r
+\r
+      return this\r
+    },\r
+\r
+    // write svgjs data to the dom\r
+    writeDataToDom: function () {\r
+      // dump variables recursively\r
+      if (this.is(SVG.Parent)) {\r
+        this.each(function () {\r
+          this.writeDataToDom()\r
+        })\r
+      }\r
+\r
+      // remove previously set data\r
+      this.node.removeAttribute('svgjs:data')\r
+\r
+      if (Object.keys(this.dom).length) {\r
+        this.node.setAttribute('svgjs:data', JSON.stringify(this.dom)) // see #428\r
+      }\r
+      return this\r
+    },\r
+\r
+    // set given data to the elements data property\r
+    setData: function (o) {\r
+      this.dom = o\r
+      return this\r
+    },\r
+    is: function (obj) {\r
+      return is(this, obj)\r
+    },\r
+    getEventTarget: function () {\r
+      return this.node\r
+    }\r
+  }\r
+})\r
+
+/* global abcdef, arrayToMatrix, closeEnough, formatTransforms */\r
+\r
+SVG.Matrix = SVG.invent({\r
+  // Initialize\r
+  create: function (source) {\r
+    var base = arrayToMatrix([1, 0, 0, 1, 0, 0])\r
+\r
+    // ensure source as object\r
+    source = source instanceof SVG.Element ? source.matrixify()\r
+      : typeof source === 'string' ? arrayToMatrix(source.split(SVG.regex.delimiter).map(parseFloat))\r
+      : Array.isArray(source) ? arrayToMatrix(source)\r
+      : (typeof source === 'object' && (\r
+          source.a != null || source.b != null || source.c != null ||\r
+          source.d != null || source.e != null || source.f != null\r
+        )) ? source\r
+      : (typeof source === 'object') ? new SVG.Matrix().transform(source)\r
+      : arguments.length === 6 ? arrayToMatrix([].slice.call(arguments))\r
+      : base\r
+\r
+    // Merge the source matrix with the base matrix\r
+    this.a = source.a != null ? source.a : base.a\r
+    this.b = source.b != null ? source.b : base.b\r
+    this.c = source.c != null ? source.c : base.c\r
+    this.d = source.d != null ? source.d : base.d\r
+    this.e = source.e != null ? source.e : base.e\r
+    this.f = source.f != null ? source.f : base.f\r
+  },\r
+\r
+  // Add methods\r
+  extend: {\r
+\r
+    // Clones this matrix\r
+    clone: function () {\r
+      return new SVG.Matrix(this)\r
+    },\r
+\r
+    // Transform a matrix into another matrix by manipulating the space\r
+    transform: function (o) {\r
+      // Check if o is a matrix and then left multiply it directly\r
+      if (o.a != null) {\r
+        var matrix = new SVG.Matrix(o)\r
+        var newMatrix = this.lmultiply(matrix)\r
+        return newMatrix\r
+      }\r
+\r
+      // Get the proposed transformations and the current transformations\r
+      var t = formatTransforms(o)\r
+      var currentTransform = new SVG.Matrix(this)\r
+\r
+      // Construct the resulting matrix\r
+      var transformer = new SVG.Matrix()\r
+        .translate(-t.ox, -t.oy)\r
+        .scale(t.scaleX, t.scaleY)\r
+        .skew(t.skewX, t.skewY)\r
+        .shear(t.shear)\r
+        .rotate(t.theta)\r
+        .translate(t.ox, t.oy)\r
+        .translate(t.rx, t.ry)\r
+        .lmultiply(currentTransform)\r
+\r
+      // If we want the origin at a particular place, we force it there\r
+      if (isFinite(t.px) || isFinite(t.py)) {\r
+        // Figure out where the origin went and the delta to get there\r
+        var current = new SVG.Point(t.ox - t.rx, t.oy - t.ry).transform(transformer)\r
+        var dx = t.px ? t.px - current.x : 0\r
+        var dy = t.py ? t.py - current.y : 0\r
+\r
+        // Apply another translation\r
+        transformer = transformer.translate(dx, dy)\r
+      }\r
+\r
+      // We can apply translations after everything else\r
+      transformer = transformer.translate(t.tx, t.ty)\r
+      return transformer\r
+    },\r
+\r
+    // Applies a matrix defined by its affine parameters\r
+    compose: function (o) {\r
+      if (o.origin) {\r
+        o.originX = o.origin[0]\r
+        o.originY = o.origin[1]\r
+      }\r
+      // Get the parameters\r
+      var ox = o.originX || 0\r
+      var oy = o.originY || 0\r
+      var sx = o.scaleX || 1\r
+      var sy = o.scaleY || 1\r
+      var lam = o.shear || 0\r
+      var theta = o.rotate || 0\r
+      var tx = o.translateX || 0\r
+      var ty = o.translateY || 0\r
+\r
+      // Apply the standard matrix\r
+      var result = new SVG.Matrix()\r
+        .translate(-ox, -oy)\r
+        .scale(sx, sy)\r
+        .shear(lam)\r
+        .rotate(theta)\r
+        .translate(tx, ty)\r
+        .lmultiply(this)\r
+        .translate(ox, oy)\r
+      return result\r
+    },\r
+\r
+    // Decomposes this matrix into its affine parameters\r
+    decompose: function (cx=0, cy=0) {\r
+      // Get the parameters from the matrix\r
+      var a = this.a\r
+      var b = this.b\r
+      var c = this.c\r
+      var d = this.d\r
+      var e = this.e\r
+      var f = this.f\r
+\r
+      // Figure out if the winding direction is clockwise or counterclockwise\r
+      var determinant = a * d - b * c\r
+      var ccw = determinant > 0 ? 1 : -1\r
+\r
+      // Since we only shear in x, we can use the x basis to get the x scale\r
+      // and the rotation of the resulting matrix\r
+      var sx = ccw * Math.sqrt(a * a + b * b)\r
+      var thetaRad = Math.atan2(ccw * b, ccw * a)\r
+      var theta = 180 / Math.PI * thetaRad\r
+      var ct = Math.cos(thetaRad)\r
+      var st = Math.sin(thetaRad)\r
+\r
+      // We can then solve the y basis vector simultaneously to get the other\r
+      // two affine parameters directly from these parameters\r
+      var lam = (a * c + b * d) / determinant\r
+      var sy = ((c * sx) / (lam * a - b)) || ((d * sx) / (lam * b + a))\r
+\r
+      let tx = e - cx + cx * ct * sx + cy * (lam * ct * sx - st * sy)\r
+      let ty = f - cy + cx * st * sx + cy * (lam * st * sx + ct * sy)\r
+\r
+      // Construct the decomposition and return it\r
+      return {\r
+        // Return the affine parameters\r
+        scaleX: sx,\r
+        scaleY: sy,\r
+        shear: lam,\r
+        rotate: theta,\r
+        translateX: tx,\r
+        translateY: ty,\r
+        originX: cx,\r
+        originY: cy,\r
+\r
+        // Return the matrix parameters\r
+        a: this.a,\r
+        b: this.b,\r
+        c: this.c,\r
+        d: this.d,\r
+        e: this.e,\r
+        f: this.f\r
+      }\r
+    },\r
+\r
+    // Morph one matrix into another\r
+    morph: function (matrix) {\r
+      // Store new destination\r
+      this.destination = new SVG.Matrix(matrix)\r
+      return this\r
+    },\r
+\r
+    // Get morphed matrix at a given position\r
+    at: function (pos) {\r
+      // Make sure a destination is defined\r
+      if (!this.destination) return this\r
+\r
+      // Calculate morphed matrix at a given position\r
+      var matrix = new SVG.Matrix({\r
+        a: this.a + (this.destination.a - this.a) * pos,\r
+        b: this.b + (this.destination.b - this.b) * pos,\r
+        c: this.c + (this.destination.c - this.c) * pos,\r
+        d: this.d + (this.destination.d - this.d) * pos,\r
+        e: this.e + (this.destination.e - this.e) * pos,\r
+        f: this.f + (this.destination.f - this.f) * pos\r
+      })\r
+\r
+      return matrix\r
+    },\r
+\r
+    // Left multiplies by the given matrix\r
+    multiply: function (matrix) {\r
+      // Get the matrices\r
+      var l = this\r
+      var r = new SVG.Matrix(matrix)\r
+\r
+      // Work out the product directly\r
+      var a = l.a * r.a + l.c * r.b\r
+      var b = l.b * r.a + l.d * r.b\r
+      var c = l.a * r.c + l.c * r.d\r
+      var d = l.b * r.c + l.d * r.d\r
+      var e = l.e + l.a * r.e + l.c * r.f\r
+      var f = l.f + l.b * r.e + l.d * r.f\r
+\r
+      // Form the matrix and return it\r
+      var product = new SVG.Matrix(a, b, c, d, e, f)\r
+      return product\r
+    },\r
+\r
+    lmultiply: function (matrix) {\r
+      var result = new SVG.Matrix(matrix).multiply(this)\r
+      return result\r
+    },\r
+\r
+    // Inverses matrix\r
+    inverse: function () {\r
+      // Get the current parameters out of the matrix\r
+      var a = this.a\r
+      var b = this.b\r
+      var c = this.c\r
+      var d = this.d\r
+      var e = this.e\r
+      var f = this.f\r
+\r
+      // Invert the 2x2 matrix in the top left\r
+      var det = a * d - b * c\r
+      if (!det) throw new Error('Cannot invert ' + this)\r
+\r
+      // Calculate the top 2x2 matrix\r
+      var na = d / det\r
+      var nb = -b / det\r
+      var nc = -c / det\r
+      var nd = a / det\r
+\r
+      // Apply the inverted matrix to the top right\r
+      var ne = -(na * e + nc * f)\r
+      var nf = -(nb * e + nd * f)\r
+\r
+      // Construct the inverted matrix\r
+      return new SVG.Matrix(na, nb, nc, nd, ne, nf)\r
+    },\r
+\r
+    // Translate matrix\r
+    translate: function (x, y) {\r
+      return new SVG.Matrix(this).translateO(x, y)\r
+    },\r
+\r
+    translateO: function (x, y) {\r
+      this.e += x || 0\r
+      this.f += y || 0\r
+      return this\r
+    },\r
+\r
+    // Scale matrix\r
+    scale: function (x, y, cx, cy) {\r
+      // Support uniform scaling\r
+      if (arguments.length === 1) {\r
+        y = x\r
+      } else if (arguments.length === 3) {\r
+        cy = cx\r
+        cx = y\r
+        y = x\r
+      }\r
+\r
+      // Scale the current matrix\r
+      var scale = new SVG.Matrix(x, 0, 0, y, 0, 0)\r
+      var matrix = this.around(cx, cy, scale)\r
+      return matrix\r
+    },\r
+\r
+    // Rotate matrix\r
+    rotate: function (r, cx, cy) {\r
+      // Convert degrees to radians\r
+      r = SVG.utils.radians(r)\r
+\r
+      // Construct the rotation matrix\r
+      var rotation = new SVG.Matrix(Math.cos(r), Math.sin(r), -Math.sin(r), Math.cos(r), 0, 0)\r
+      var matrix = this.around(cx, cy, rotation)\r
+      return matrix\r
+    },\r
+\r
+    // Flip matrix on x or y, at a given offset\r
+    flip: function (axis, around) {\r
+      return axis === 'x' ? this.scale(-1, 1, around, 0)\r
+        : axis === 'y' ? this.scale(1, -1, 0, around)\r
+        : this.scale(-1, -1, axis, around || axis) // Define an x, y flip point\r
+    },\r
+\r
+    // Shear matrix\r
+    shear: function (a, cx, cy) {\r
+      var shear = new SVG.Matrix(1, 0, a, 1, 0, 0)\r
+      var matrix = this.around(cx, cy, shear)\r
+      return matrix\r
+    },\r
+\r
+    // Skew Matrix\r
+    skew: function (x, y, cx, cy) {\r
+      // support uniformal skew\r
+      if (arguments.length === 1) {\r
+        y = x\r
+      } else if (arguments.length === 3) {\r
+        cy = cx\r
+        cx = y\r
+        y = x\r
+      }\r
+\r
+      // Convert degrees to radians\r
+      x = SVG.utils.radians(x)\r
+      y = SVG.utils.radians(y)\r
+\r
+      // Construct the matrix\r
+      var skew = new SVG.Matrix(1, Math.tan(y), Math.tan(x), 1, 0, 0)\r
+      var matrix = this.around(cx, cy, skew)\r
+      return matrix\r
+    },\r
+\r
+    // SkewX\r
+    skewX: function (x, cx, cy) {\r
+      return this.skew(x, 0, cx, cy)\r
+    },\r
+\r
+    // SkewY\r
+    skewY: function (y, cx, cy) {\r
+      return this.skew(0, y, cx, cy)\r
+    },\r
+\r
+    // Transform around a center point\r
+    around: function (cx, cy, matrix) {\r
+      var dx = cx || 0\r
+      var dy = cy || 0\r
+      return this.translate(-dx, -dy).lmultiply(matrix).translate(dx, dy)\r
+    },\r
+\r
+    // Convert to native SVGMatrix\r
+    native: function () {\r
+      // create new matrix\r
+      var matrix = SVG.parser.nodes.svg.node.createSVGMatrix()\r
+\r
+      // update with current values\r
+      for (var i = abcdef.length - 1; i >= 0; i--) {\r
+        matrix[abcdef[i]] = this[abcdef[i]]\r
+      }\r
+\r
+      return matrix\r
+    },\r
+\r
+    // Check if two matrices are equal\r
+    equals: function (other) {\r
+      var comp = new SVG.Matrix(other)\r
+      return closeEnough(this.a, comp.a) && closeEnough(this.b, comp.b) &&\r
+        closeEnough(this.c, comp.c) && closeEnough(this.d, comp.d) &&\r
+        closeEnough(this.e, comp.e) && closeEnough(this.f, comp.f)\r
+    },\r
+\r
+    // Convert matrix to string\r
+    toString: function () {\r
+      return 'matrix(' + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ')'\r
+    },\r
+\r
+    toArray: function () {\r
+      return [this.a, this.b, this.c, this.d, this.e, this.f]\r
+    },\r
+\r
+    valueOf: function () {\r
+      return {\r
+        a: this.a,\r
+        b: this.b,\r
+        c: this.c,\r
+        d: this.d,\r
+        e: this.e,\r
+        f: this.f\r
+      }\r
+    }\r
+  },\r
+\r
+  // Define parent\r
+  parent: SVG.Element,\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Get current matrix\r
+    ctm: function () {\r
+      return new SVG.Matrix(this.node.getCTM())\r
+    },\r
+    // Get current screen matrix\r
+    screenCTM: function () {\r
+      /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537\r
+         This is needed because FF does not return the transformation matrix\r
+         for the inner coordinate system when getScreenCTM() is called on nested svgs.\r
+         However all other Browsers do that */\r
+      if (this instanceof SVG.Doc && !this.isRoot()) {\r
+        var rect = this.rect(1, 1)\r
+        var m = rect.node.getScreenCTM()\r
+        rect.remove()\r
+        return new SVG.Matrix(m)\r
+      }\r
+      return new SVG.Matrix(this.node.getScreenCTM())\r
+    }\r
+  }\r
+})\r
+
+\r
+SVG.Point = SVG.invent({\r
+  // Initialize\r
+  create: function (x, y, base) {\r
+    var source\r
+    base = base || {x: 0, y: 0}\r
+\r
+    // ensure source as object\r
+    source = Array.isArray(x) ? {x: x[0], y: x[1]}\r
+      : typeof x === 'object' ? {x: x.x, y: x.y}\r
+      : {x: x, y: y}\r
+\r
+    // merge source\r
+    this.x = source.x == null ? base.x : source.x\r
+    this.y = source.y == null ? base.y : source.y\r
+  },\r
+\r
+  // Add methods\r
+  extend: {\r
+    // Clone point\r
+    clone: function () {\r
+      return new SVG.Point(this)\r
+    },\r
+\r
+    // Morph one point into another\r
+    morph: function (x, y) {\r
+      // store new destination\r
+      this.destination = new SVG.Point(x, y)\r
+      return this\r
+    },\r
+\r
+    // Get morphed point at a given position\r
+    at: function (pos) {\r
+      // make sure a destination is defined\r
+      if (!this.destination) return this\r
+\r
+      // calculate morphed matrix at a given position\r
+      var point = new SVG.Point({\r
+        x: this.x + (this.destination.x - this.x) * pos,\r
+        y: this.y + (this.destination.y - this.y) * pos\r
+      })\r
+      return point\r
+    },\r
+\r
+    // Convert to native SVGPoint\r
+    native: function () {\r
+      // create new point\r
+      var point = SVG.parser.nodes.svg.node.createSVGPoint()\r
+\r
+      // update with current values\r
+      point.x = this.x\r
+      point.y = this.y\r
+      return point\r
+    },\r
+\r
+    // transform point with matrix\r
+    transform: function (m) {\r
+      // Perform the matrix multiplication\r
+      var x = m.a * this.x + m.c * this.y + m.e\r
+      var y = m.b * this.x + m.d * this.y + m.f\r
+\r
+      // Return the required point\r
+      return new SVG.Point(x, y)\r
+    }\r
+  }\r
+})\r
+\r
+SVG.extend(SVG.Element, {\r
+\r
+  // Get point\r
+  point: function (x, y) {\r
+    return new SVG.Point(x, y).transform(this.screenCTM().inverse())\r
+  }\r
+})\r
+
+SVG.extend(SVG.Element, {\r
+  // Set svg element attribute\r
+  attr: function (a, v, n) {\r
+    // act as full getter\r
+    if (a == null) {\r
+      // get an object of attributes\r
+      a = {}\r
+      v = this.node.attributes\r
+      for (n = v.length - 1; n >= 0; n--) {\r
+        a[v[n].nodeName] = SVG.regex.isNumber.test(v[n].nodeValue)\r
+          ? parseFloat(v[n].nodeValue)\r
+          : v[n].nodeValue\r
+      }\r
+      return a\r
+    } else if (typeof a === 'object') {\r
+      // apply every attribute individually if an object is passed\r
+      for (v in a) this.attr(v, a[v])\r
+    } else if (v === null) {\r
+        // remove value\r
+      this.node.removeAttribute(a)\r
+    } else if (v == null) {\r
+      // act as a getter if the first and only argument is not an object\r
+      v = this.node.getAttribute(a)\r
+      return v == null ? SVG.defaults.attrs[a]\r
+        : SVG.regex.isNumber.test(v) ? parseFloat(v)\r
+        : v\r
+    } else {\r
+      // convert image fill and stroke to patterns\r
+      if (a === 'fill' || a === 'stroke') {\r
+        if (SVG.regex.isImage.test(v)) {\r
+          v = this.doc().defs().image(v)\r
+        }\r
+\r
+        if (v instanceof SVG.Image) {\r
+          v = this.doc().defs().pattern(0, 0, function () {\r
+            this.add(v)\r
+          })\r
+        }\r
+      }\r
+\r
+      // ensure correct numeric values (also accepts NaN and Infinity)\r
+      if (typeof v === 'number') {\r
+        v = new SVG.Number(v)\r
+      } else if (SVG.Color.isColor(v)) {\r
+        // ensure full hex color\r
+        v = new SVG.Color(v)\r
+      } else if (Array.isArray(v)) {\r
+        // parse array values\r
+        v = new SVG.Array(v)\r
+      }\r
+\r
+      // if the passed attribute is leading...\r
+      if (a === 'leading') {\r
+        // ... call the leading method instead\r
+        if (this.leading) {\r
+          this.leading(v)\r
+        }\r
+      } else {\r
+        // set given attribute on node\r
+        typeof n === 'string' ? this.node.setAttributeNS(n, a, v.toString())\r
+          : this.node.setAttribute(a, v.toString())\r
+      }\r
+\r
+      // rebuild if required\r
+      if (this.rebuild && (a === 'font-size' || a === 'x')) {\r
+        this.rebuild(a, v)\r
+      }\r
+    }\r
+\r
+    return this\r
+  }\r
+})\r
+
+/* global arrayToMatrix */\r
+\r
+SVG.extend(SVG.Element, {\r
+  // Reset all transformations\r
+  untransform: function () {\r
+    return this.attr('transform', null)\r
+  },\r
+\r
+  // merge the whole transformation chain into one matrix and returns it\r
+  matrixify: function () {\r
+    var matrix = (this.attr('transform') || '')\r
+      // split transformations\r
+      .split(SVG.regex.transforms).slice(0, -1).map(function (str) {\r
+        // generate key => value pairs\r
+        var kv = str.trim().split('(')\r
+        return [kv[0],\r
+          kv[1].split(SVG.regex.delimiter)\r
+            .map(function (str) { return parseFloat(str) })\r
+        ]\r
+      })\r
+      .reverse()\r
+      // merge every transformation into one matrix\r
+      .reduce(function (matrix, transform) {\r
+        if (transform[0] === 'matrix') {\r
+          return matrix.lmultiply(arrayToMatrix(transform[1]))\r
+        }\r
+        return matrix[transform[0]].apply(matrix, transform[1])\r
+      }, new SVG.Matrix())\r
+\r
+    return matrix\r
+  },\r
+\r
+  // add an element to another parent without changing the visual representation on the screen\r
+  toParent: function (parent) {\r
+    if (this === parent) return this\r
+    var ctm = this.screenCTM()\r
+    var pCtm = parent.screenCTM().inverse()\r
+\r
+    this.addTo(parent).untransform().transform(pCtm.multiply(ctm))\r
+\r
+    return this\r
+  },\r
+\r
+  // same as above with parent equals root-svg\r
+  toDoc: function () {\r
+    return this.toParent(this.doc())\r
+  }\r
+})\r
+\r
+SVG.extend(SVG.Element, {\r
+\r
+  // Add transformations\r
+  transform: function (o, relative) {\r
+    // Act as a getter if no object was passed\r
+    if (o == null || typeof o === 'string') {\r
+      var decomposed = new SVG.Matrix(this).decompose()\r
+      return decomposed[o] || decomposed\r
+    }\r
+\r
+    // Set the origin according to the defined transform\r
+    o.origin = getOrigin (o, this)\r
+\r
+    // The user can pass a boolean, an SVG.Element or an SVG.Matrix or nothing\r
+    var cleanRelative = relative === true ? this : (relative || false)\r
+    var result = new SVG.Matrix(cleanRelative).transform(o)\r
+    return this.attr('transform', result)\r
+  }\r
+})\r
+\r
+SVG.extend(SVG.Timeline, {\r
+  transform: function (o, relative, affine) {\r
+\r
+  //   // get target in case of the fx module, otherwise reference this\r
+  //   var target = this.target()\r
+  //     , matrix, bbox\r
+  //\r
+  //   // act as a getter\r
+  //   if (typeof o !== 'object') {\r
+  //     // get current matrix\r
+  //     matrix = new SVG.Matrix(target).extract()\r
+  //\r
+  //     return typeof o === 'string' ? matrix[o] : matrix\r
+  //   }\r
+  //\r
+  //   // ensure relative flag\r
+  //   relative = !!relative || !!o.relative\r
+  //\r
+  //   // act on matrix\r
+  //   if (o.a != null) {\r
+  //     matrix = new SVG.Matrix(o)\r
+  //\r
+  //   // act on rotation\r
+  //   } else if (o.rotation != null) {\r
+  //     // ensure centre point\r
+  //     ensureCentre(o, target)\r
+  //\r
+  //     // apply transformation\r
+  //     matrix = new SVG.Rotate(o.rotation, o.cx, o.cy)\r
+  //\r
+  //   // act on scale\r
+  //   } else if (o.scale != null || o.scaleX != null || o.scaleY != null) {\r
+  //     // ensure centre point\r
+  //     ensureCentre(o, target)\r
+  //\r
+  //     // ensure scale values on both axes\r
+  //     o.scaleX = o.scale != null ? o.scale : o.scaleX != null ? o.scaleX : 1\r
+  //     o.scaleY = o.scale != null ? o.scale : o.scaleY != null ? o.scaleY : 1\r
+  //\r
+  //     matrix = new SVG.Scale(o.scaleX, o.scaleY, o.cx, o.cy)\r
+  //\r
+  //   // act on skew\r
+  //   } else if (o.skewX != null || o.skewY != null) {\r
+  //     // ensure centre point\r
+  //     ensureCentre(o, target)\r
+  //\r
+  //     // ensure skew values on both axes\r
+  //     o.skewX = o.skewX != null ? o.skewX : 0\r
+  //     o.skewY = o.skewY != null ? o.skewY : 0\r
+  //\r
+  //     matrix = new SVG.Skew(o.skewX, o.skewY, o.cx, o.cy)\r
+  //\r
+  //   // act on flip\r
+  //   } else if (o.flip) {\r
+  //     if(o.flip == 'x' || o.flip == 'y') {\r
+  //       o.offset = o.offset == null ? target.bbox()['c' + o.flip] : o.offset\r
+  //     } else {\r
+  //       if(o.offset == null) {\r
+  //         bbox = target.bbox()\r
+  //         o.flip = bbox.cx\r
+  //         o.offset = bbox.cy\r
+  //       } else {\r
+  //         o.flip = o.offset\r
+  //       }\r
+  //     }\r
+  //\r
+  //     matrix = new SVG.Matrix().flip(o.flip, o.offset)\r
+  //\r
+  //   // act on translate\r
+  //   } else if (o.x != null || o.y != null) {\r
+  //     matrix = new SVG.Translate(o.x, o.y)\r
+  //   }\r
+  //\r
+  //   if(!matrix) return this\r
+  //\r
+  //   matrix.relative = relative\r
+  //\r
+  //   this.last().transforms.push(matrix)\r
+  //\r
+  //   return this._callStart()\r
+  // }\r
+  //     // ensure scale values on both axes\r
+  //     o.scaleX = o.scale != null ? o.scale : o.scaleX != null ? o.scaleX : 1\r
+  //     o.scaleY = o.scale != null ? o.scale : o.scaleY != null ? o.scaleY : 1\r
+  //\r
+  //     matrix = new SVG.Scale(o.scaleX, o.scaleY, o.cx, o.cy)\r
+  //\r
+  //   // act on skew\r
+  //   } else if (o.skewX != null || o.skewY != null) {\r
+  //     // ensure centre point\r
+  //     ensureCentre(o, target)\r
+  //\r
+  //     // ensure skew values on both axes\r
+  //     o.skewX = o.skewX != null ? o.skewX : 0\r
+  //     o.skewY = o.skewY != null ? o.skewY : 0\r
+  //\r
+  //     matrix = new SVG.Skew(o.skewX, o.skewY, o.cx, o.cy)\r
+  //\r
+  //   // act on flip\r
+  //   } else if (o.flip) {\r
+  //     if (o.flip === 'x' || o.flip === 'y') {\r
+  //       o.offset = o.offset == null ? target.bbox()['c' + o.flip] : o.offset\r
+  //     } else {\r
+  //       if (o.offset == null) {\r
+  //         bbox = target.bbox()\r
+  //         o.flip = bbox.cx\r
+  //         o.offset = bbox.cy\r
+  //       } else {\r
+  //         o.flip = o.offset\r
+  //       }\r
+  //     }\r
+  //\r
+  //     matrix = new SVG.Matrix().flip(o.flip, o.offset)\r
+  //\r
+  //   // act on translate\r
+  //   } else if (o.x != null || o.y != null) {\r
+  //     matrix = new SVG.Translate(o.x, o.y)\r
+  //   }\r
+  //\r
+  //   if (!matrix) return this\r
+  //\r
+  //   matrix.relative = relative\r
+  //\r
+  //   this.last().transforms.push(matrix)\r
+  //\r
+  //   return this._callStart()\r
+  }\r
+})\r
+
+/* global camelCase */\r
+\r
+SVG.extend(SVG.Element, {\r
+  // Dynamic style generator\r
+  css: function (s, v) {\r
+    var ret = {}\r
+    var t, i\r
+    if (arguments.length === 0) {\r
+      // get full style as object\r
+      this.node.style.cssText.split(/\s*;\s*/).filter(function (el) { return !!el.length }).forEach(function (el) {\r
+        t = el.split(/\s*:\s*/)\r
+        ret[t[0]] = t[1]\r
+      })\r
+      return ret\r
+    }\r
+\r
+    if (arguments.length < 2) {\r
+      // get style properties in the array\r
+      if (Array.isArray(s)) {\r
+        for (i = s.length; i--;) {\r
+          ret[camelCase(s[i])] = this.node.style[camelCase(s[i])]\r
+        }\r
+        return ret\r
+      }\r
+\r
+      // get style for property\r
+      if (typeof s === 'string') {\r
+        return this.node.style[camelCase(s)]\r
+      }\r
+\r
+      // set styles in object\r
+      if (typeof s === 'object') {\r
+        for (i in s) {\r
+          // set empty string if null/undefined/'' was given\r
+          this.node.style[camelCase(i)] = (s[i] == null || SVG.regex.isBlank.test(s[i])) ? '' : s[i]\r
+        }\r
+      }\r
+    }\r
+\r
+    // set style for property\r
+    if (arguments.length === 2) {\r
+      this.node.style[camelCase(s)] = (v == null || SVG.regex.isBlank.test(v)) ? '' : v\r
+    }\r
+\r
+    return this\r
+  }\r
+})\r
+
+/* global createElement */\r
+\r
+SVG.Parent = SVG.invent({\r
+  // Initialize node\r
+  create: function (node) {\r
+    SVG.Element.call(this, node)\r
+  },\r
+\r
+  // Inherit from\r
+  inherit: SVG.Element,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Returns all child elements\r
+    children: function () {\r
+      return SVG.utils.map(this.node.children, function (node) {\r
+        return SVG.adopt(node)\r
+      })\r
+    },\r
+    // Add given element at a position\r
+    add: function (element, i) {\r
+      element = createElement(element)\r
+\r
+      if (element.node !== this.node.children[i]) {\r
+        this.node.insertBefore(element.node, this.node.children[i] || null)\r
+      }\r
+\r
+      return this\r
+    },\r
+    // Basically does the same as `add()` but returns the added element instead\r
+    put: function (element, i) {\r
+      this.add(element, i)\r
+      return element.instance || element\r
+    },\r
+    // Checks if the given element is a child\r
+    has: function (element) {\r
+      return this.index(element) >= 0\r
+    },\r
+    // Gets index of given element\r
+    index: function (element) {\r
+      return [].slice.call(this.node.children).indexOf(element.node)\r
+    },\r
+    // Get a element at the given index\r
+    get: function (i) {\r
+      return SVG.adopt(this.node.children[i])\r
+    },\r
+    // Get first child\r
+    first: function () {\r
+      return this.get(0)\r
+    },\r
+    // Get the last child\r
+    last: function () {\r
+      return this.get(this.node.children.length - 1)\r
+    },\r
+    // Iterates over all children and invokes a given block\r
+    each: function (block, deep) {\r
+      var children = this.children()\r
+      var i, il\r
+\r
+      for (i = 0, il = children.length; i < il; i++) {\r
+        if (children[i] instanceof SVG.Element) {\r
+          block.apply(children[i], [i, children])\r
+        }\r
+\r
+        if (deep && (children[i] instanceof SVG.Parent)) {\r
+          children[i].each(block, deep)\r
+        }\r
+      }\r
+\r
+      return this\r
+    },\r
+    // Remove a given child\r
+    removeElement: function (element) {\r
+      this.node.removeChild(element.node)\r
+\r
+      return this\r
+    },\r
+    // Remove all elements in this container\r
+    clear: function () {\r
+      // remove children\r
+      while (this.node.hasChildNodes()) {\r
+        this.node.removeChild(this.node.lastChild)\r
+      }\r
+\r
+      // remove defs reference\r
+      delete this._defs\r
+\r
+      return this\r
+    }\r
+  }\r
+\r
+})\r
+
+SVG.extend(SVG.Parent, {\r
+  flatten: function (parent) {\r
+    // flattens is only possible for nested svgs and groups\r
+    if (!(this instanceof SVG.G || this instanceof SVG.Doc)) {\r
+      return this\r
+    }\r
+\r
+    parent = parent || (this instanceof SVG.Doc && this.isRoot() ? this : this.parent(SVG.Parent))\r
+\r
+    this.each(function () {\r
+      if (this instanceof SVG.Defs) return this\r
+      if (this instanceof SVG.Parent) return this.flatten(parent)\r
+      return this.toParent(parent)\r
+    })\r
+\r
+    // we need this so that SVG.Doc does not get removed\r
+    this.node.firstElementChild || this.remove()\r
+\r
+    return this\r
+  },\r
+  ungroup: function (parent) {\r
+    // ungroup is only possible for nested svgs and groups\r
+    if (!(this instanceof SVG.G || (this instanceof SVG.Doc && !this.isRoot()))) {\r
+      return this\r
+    }\r
+\r
+    parent = parent || this.parent(SVG.Parent)\r
+\r
+    this.each(function () {\r
+      return this.toParent(parent)\r
+    })\r
+\r
+    // we need this so that SVG.Doc does not get removed\r
+    this.remove()\r
+\r
+    return this\r
+  }\r
+})\r
+
+SVG.Container = SVG.invent({\r
+  // Initialize node\r
+  create: function (node) {\r
+    SVG.Element.call(this, node)\r
+  },\r
+\r
+  // Inherit from\r
+  inherit: SVG.Parent\r
+})\r
+
+SVG.Defs = SVG.invent({\r
+  // Initialize node\r
+  create: 'defs',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Container\r
+})\r
+
+SVG.G = SVG.invent({\r
+  // Initialize node\r
+  create: 'g',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Container,\r
+\r
+  // Add class methods\r
+  extend: {\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create a group element\r
+    group: function () {\r
+      return this.put(new SVG.G())\r
+    }\r
+  }\r
+})\r
+
+// ### This module adds backward / forward functionality to elements.\r
+\r
+//\r
+SVG.extend(SVG.Element, {\r
+  // Get all siblings, including myself\r
+  siblings: function () {\r
+    return this.parent().children()\r
+  },\r
+\r
+  // Get the curent position siblings\r
+  position: function () {\r
+    return this.parent().index(this)\r
+  },\r
+\r
+  // Get the next element (will return null if there is none)\r
+  next: function () {\r
+    return this.siblings()[this.position() + 1]\r
+  },\r
+\r
+  // Get the next element (will return null if there is none)\r
+  prev: function () {\r
+    return this.siblings()[this.position() - 1]\r
+  },\r
+\r
+  // Send given element one step forward\r
+  forward: function () {\r
+    var i = this.position() + 1\r
+    var p = this.parent()\r
+\r
+    // move node one step forward\r
+    p.removeElement(this).add(this, i)\r
+\r
+    // make sure defs node is always at the top\r
+    if (p instanceof SVG.Doc) {\r
+      p.node.appendChild(p.defs().node)\r
+    }\r
+\r
+    return this\r
+  },\r
+\r
+  // Send given element one step backward\r
+  backward: function () {\r
+    var i = this.position()\r
+\r
+    if (i > 0) {\r
+      this.parent().removeElement(this).add(this, i - 1)\r
+    }\r
+\r
+    return this\r
+  },\r
+\r
+  // Send given element all the way to the front\r
+  front: function () {\r
+    var p = this.parent()\r
+\r
+    // Move node forward\r
+    p.node.appendChild(this.node)\r
+\r
+    // Make sure defs node is always at the top\r
+    if (p instanceof SVG.Doc) {\r
+      p.node.appendChild(p.defs().node)\r
+    }\r
+\r
+    return this\r
+  },\r
+\r
+  // Send given element all the way to the back\r
+  back: function () {\r
+    if (this.position() > 0) {\r
+      this.parent().removeElement(this).add(this, 0)\r
+    }\r
+\r
+    return this\r
+  },\r
+\r
+  // Inserts a given element before the targeted element\r
+  before: function (element) {\r
+    element.remove()\r
+\r
+    var i = this.position()\r
+\r
+    this.parent().add(element, i)\r
+\r
+    return this\r
+  },\r
+\r
+  // Insters a given element after the targeted element\r
+  after: function (element) {\r
+    element.remove()\r
+\r
+    var i = this.position()\r
+\r
+    this.parent().add(element, i + 1)\r
+\r
+    return this\r
+  }\r
+})\r
+
+SVG.Mask = SVG.invent({\r
+  // Initialize node\r
+  create: 'mask',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Container,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Unmask all masked elements and remove itself\r
+    remove: function () {\r
+      // unmask all targets\r
+      this.targets().forEach(function (el) {\r
+        el.unmask()\r
+      })\r
+\r
+      // remove mask from parent\r
+      return SVG.Element.prototype.remove.call(this)\r
+    },\r
+\r
+    targets: function () {\r
+      return SVG.select('svg [mask*="' + this.id() + '"]')\r
+    }\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create masking element\r
+    mask: function () {\r
+      return this.defs().put(new SVG.Mask())\r
+    }\r
+  }\r
+})\r
+\r
+SVG.extend(SVG.Element, {\r
+  // Distribute mask to svg element\r
+  maskWith: function (element) {\r
+    // use given mask or create a new one\r
+    var masker = element instanceof SVG.Mask ? element : this.parent().mask().add(element)\r
+\r
+    // apply mask\r
+    return this.attr('mask', 'url("#' + masker.id() + '")')\r
+  },\r
+  // Unmask element\r
+  unmask: function () {\r
+    return this.attr('mask', null)\r
+  },\r
+  masker: function () {\r
+    return this.reference('mask')\r
+  }\r
+})\r
+
+SVG.ClipPath = SVG.invent({\r
+  // Initialize node\r
+  create: 'clipPath',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Container,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Unclip all clipped elements and remove itself\r
+    remove: function () {\r
+      // unclip all targets\r
+      this.targets().forEach(function (el) {\r
+        el.unclip()\r
+      })\r
+\r
+      // remove clipPath from parent\r
+      return SVG.Element.prototype.remove.call(this)\r
+    },\r
+\r
+    targets: function () {\r
+      return SVG.select('svg [clip-path*="' + this.id() + '"]')\r
+    }\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create clipping element\r
+    clip: function () {\r
+      return this.defs().put(new SVG.ClipPath())\r
+    }\r
+  }\r
+})\r
+\r
+//\r
+SVG.extend(SVG.Element, {\r
+  // Distribute clipPath to svg element\r
+  clipWith: function (element) {\r
+    // use given clip or create a new one\r
+    var clipper = element instanceof SVG.ClipPath ? element : this.parent().clip().add(element)\r
+\r
+    // apply mask\r
+    return this.attr('clip-path', 'url("#' + clipper.id() + '")')\r
+  },\r
+  // Unclip element\r
+  unclip: function () {\r
+    return this.attr('clip-path', null)\r
+  },\r
+  clipper: function () {\r
+    return this.reference('clip-path')\r
+  }\r
+\r
+})\r
+
+SVG.Gradient = SVG.invent({\r
+  // Initialize node\r
+  create: function (type) {\r
+    SVG.Element.call(this, typeof type === 'object' ? type : SVG.create(type + 'Gradient'))\r
+  },\r
+\r
+  // Inherit from\r
+  inherit: SVG.Container,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Add a color stop\r
+    stop: function (offset, color, opacity) {\r
+      return this.put(new SVG.Stop()).update(offset, color, opacity)\r
+    },\r
+    // Update gradient\r
+    update: function (block) {\r
+      // remove all stops\r
+      this.clear()\r
+\r
+      // invoke passed block\r
+      if (typeof block === 'function') {\r
+        block.call(this, this)\r
+      }\r
+\r
+      return this\r
+    },\r
+    // Return the fill id\r
+    url: function () {\r
+      return 'url(#' + this.id() + ')'\r
+    },\r
+    // Alias string convertion to fill\r
+    toString: function () {\r
+      return this.url()\r
+    },\r
+    // custom attr to handle transform\r
+    attr: function (a, b, c) {\r
+      if (a === 'transform') a = 'gradientTransform'\r
+      return SVG.Container.prototype.attr.call(this, a, b, c)\r
+    }\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create gradient element in defs\r
+    gradient: function (type, block) {\r
+      return this.defs().gradient(type, block)\r
+    }\r
+  }\r
+})\r
+\r
+// Add animatable methods to both gradient and fx module\r
+SVG.extend([SVG.Gradient, SVG.Timeline], {\r
+  // From position\r
+  from: function (x, y) {\r
+    return (this._target || this).type === 'radialGradient'\r
+      ? this.attr({ fx: new SVG.Number(x), fy: new SVG.Number(y) })\r
+      : this.attr({ x1: new SVG.Number(x), y1: new SVG.Number(y) })\r
+  },\r
+  // To position\r
+  to: function (x, y) {\r
+    return (this._target || this).type === 'radialGradient'\r
+      ? this.attr({ cx: new SVG.Number(x), cy: new SVG.Number(y) })\r
+      : this.attr({ x2: new SVG.Number(x), y2: new SVG.Number(y) })\r
+  }\r
+})\r
+\r
+// Base gradient generation\r
+SVG.extend(SVG.Defs, {\r
+  // define gradient\r
+  gradient: function (type, block) {\r
+    return this.put(new SVG.Gradient(type)).update(block)\r
+  }\r
+\r
+})\r
+\r
+SVG.Stop = SVG.invent({\r
+  // Initialize node\r
+  create: 'stop',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Element,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // add color stops\r
+    update: function (o) {\r
+      if (typeof o === 'number' || o instanceof SVG.Number) {\r
+        o = {\r
+          offset: arguments[0],\r
+          color: arguments[1],\r
+          opacity: arguments[2]\r
+        }\r
+      }\r
+\r
+      // set attributes\r
+      if (o.opacity != null) this.attr('stop-opacity', o.opacity)\r
+      if (o.color != null) this.attr('stop-color', o.color)\r
+      if (o.offset != null) this.attr('offset', new SVG.Number(o.offset))\r
+\r
+      return this\r
+    }\r
+  }\r
+})\r
+
+SVG.Pattern = SVG.invent({\r
+  // Initialize node\r
+  create: 'pattern',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Container,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Return the fill id\r
+    url: function () {\r
+      return 'url(#' + this.id() + ')'\r
+    },\r
+    // Update pattern by rebuilding\r
+    update: function (block) {\r
+      // remove content\r
+      this.clear()\r
+\r
+      // invoke passed block\r
+      if (typeof block === 'function') {\r
+        block.call(this, this)\r
+      }\r
+\r
+      return this\r
+    },\r
+    // Alias string convertion to fill\r
+    toString: function () {\r
+      return this.url()\r
+    },\r
+    // custom attr to handle transform\r
+    attr: function (a, b, c) {\r
+      if (a === 'transform') a = 'patternTransform'\r
+      return SVG.Container.prototype.attr.call(this, a, b, c)\r
+    }\r
+\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create pattern element in defs\r
+    pattern: function (width, height, block) {\r
+      return this.defs().pattern(width, height, block)\r
+    }\r
+  }\r
+})\r
+\r
+SVG.extend(SVG.Defs, {\r
+  // Define gradient\r
+  pattern: function (width, height, block) {\r
+    return this.put(new SVG.Pattern()).update(block).attr({\r
+      x: 0,\r
+      y: 0,\r
+      width: width,\r
+      height: height,\r
+      patternUnits: 'userSpaceOnUse'\r
+    })\r
+  }\r
+\r
+})\r
+
+SVG.Doc = SVG.invent({\r
+  // Initialize node\r
+  create: function (node) {\r
+    SVG.Element.call(this, node || SVG.create('svg'))\r
+\r
+    // set svg element attributes and ensure defs node\r
+    this.namespace()\r
+  },\r
+\r
+  // Inherit from\r
+  inherit: SVG.Container,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    isRoot: function () {\r
+      return !this.node.parentNode || !(this.node.parentNode instanceof window.SVGElement) || this.node.parentNode.nodeName === '#document'\r
+    },\r
+    // Check if this is a root svg. If not, call docs from this element\r
+    doc: function () {\r
+      if (this.isRoot()) return this\r
+      return SVG.Element.prototype.doc.call(this)\r
+    },\r
+    // Add namespaces\r
+    namespace: function () {\r
+      if (!this.isRoot()) return this.doc().namespace()\r
+      return this\r
+        .attr({ xmlns: SVG.ns, version: '1.1' })\r
+        .attr('xmlns:xlink', SVG.xlink, SVG.xmlns)\r
+        .attr('xmlns:svgjs', SVG.svgjs, SVG.xmlns)\r
+    },\r
+    // Creates and returns defs element\r
+    defs: function () {\r
+      if (!this.isRoot()) return this.doc().defs()\r
+      return SVG.adopt(this.node.getElementsByTagName('defs')[0]) || this.put(new SVG.Defs())\r
+    },\r
+    // custom parent method\r
+    parent: function (type) {\r
+      if (this.isRoot()) {\r
+        return this.node.parentNode.nodeName === '#document' ? null : this.node.parentNode\r
+      }\r
+\r
+      return SVG.Element.prototype.parent.call(this, type)\r
+    },\r
+    // Removes the doc from the DOM\r
+    remove: function () {\r
+      if (!this.isRoot()) {\r
+        return SVG.Element.prototype.remove.call(this)\r
+      }\r
+\r
+      if (this.parent()) {\r
+        this.parent().removeChild(this.node)\r
+      }\r
+\r
+      return this\r
+    },\r
+    clear: function () {\r
+      // remove children\r
+      while (this.node.hasChildNodes()) {\r
+        this.node.removeChild(this.node.lastChild)\r
+      }\r
+      return this\r
+    }\r
+  },\r
+  construct: {\r
+    // Create nested svg document\r
+    nested: function () {\r
+      return this.put(new SVG.Doc())\r
+    }\r
+  }\r
+})\r
+
+\r
+SVG.Shape = SVG.invent({\r
+  // Initialize node\r
+  create: function (node) {\r
+    SVG.Element.call(this, node)\r
+  },\r
+\r
+  // Inherit from\r
+  inherit: SVG.Element\r
+})\r
+
+\r
+SVG.Bare = SVG.invent({\r
+  // Initialize\r
+  create: function (element, inherit) {\r
+    // construct element\r
+    SVG.Element.call(this, SVG.create(element))\r
+\r
+    // inherit custom methods\r
+    if (inherit) {\r
+      for (var method in inherit.prototype) {\r
+        if (typeof inherit.prototype[method] === 'function') {\r
+          this[method] = inherit.prototype[method]\r
+        }\r
+      }\r
+    }\r
+  },\r
+\r
+  // Inherit from\r
+  inherit: SVG.Element,\r
+\r
+  // Add methods\r
+  extend: {\r
+    // Insert some plain text\r
+    words: function (text) {\r
+      // remove contents\r
+      while (this.node.hasChildNodes()) {\r
+        this.node.removeChild(this.node.lastChild)\r
+      }\r
+\r
+      // create text node\r
+      this.node.appendChild(document.createTextNode(text))\r
+\r
+      return this\r
+    }\r
+  }\r
+})\r
+\r
+SVG.extend(SVG.Parent, {\r
+  // Create an element that is not described by SVG.js\r
+  element: function (element, inherit) {\r
+    return this.put(new SVG.Bare(element, inherit))\r
+  }\r
+})\r
+
+\r
+SVG.Symbol = SVG.invent({\r
+  // Initialize node\r
+  create: 'symbol',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Container,\r
+\r
+  construct: {\r
+    // create symbol\r
+    symbol: function () {\r
+      return this.put(new SVG.Symbol())\r
+    }\r
+  }\r
+})\r
+
+\r
+SVG.Use = SVG.invent({\r
+  // Initialize node\r
+  create: 'use',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Shape,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Use element as a reference\r
+    element: function (element, file) {\r
+      // Set lined element\r
+      return this.attr('href', (file || '') + '#' + element, SVG.xlink)\r
+    }\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create a use element\r
+    use: function (element, file) {\r
+      return this.put(new SVG.Use()).element(element, file)\r
+    }\r
+  }\r
+})\r
+
+\r
+SVG.Rect = SVG.invent({\r
+  // Initialize node\r
+  create: 'rect',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Shape,\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create a rect element\r
+    rect: function (width, height) {\r
+      return this.put(new SVG.Rect()).size(width, height)\r
+    }\r
+  }\r
+})\r
+
+/* global proportionalSize */\r
+\r
+SVG.Circle = SVG.invent({\r
+  // Initialize node\r
+  create: 'circle',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Shape,\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create circle element, based on ellipse\r
+    circle: function (size) {\r
+      return this.put(new SVG.Circle()).rx(new SVG.Number(size).divide(2)).move(0, 0)\r
+    }\r
+  }\r
+})\r
+\r
+SVG.extend([SVG.Circle, SVG.Timeline], {\r
+  // Radius x value\r
+  rx: function (rx) {\r
+    return this.attr('r', rx)\r
+  },\r
+  // Alias radius x value\r
+  ry: function (ry) {\r
+    return this.rx(ry)\r
+  }\r
+})\r
+\r
+SVG.Ellipse = SVG.invent({\r
+  // Initialize node\r
+  create: 'ellipse',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Shape,\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create an ellipse\r
+    ellipse: function (width, height) {\r
+      return this.put(new SVG.Ellipse()).size(width, height).move(0, 0)\r
+    }\r
+  }\r
+})\r
+\r
+SVG.extend([SVG.Ellipse, SVG.Rect, SVG.Timeline], {\r
+  // Radius x value\r
+  rx: function (rx) {\r
+    return this.attr('rx', rx)\r
+  },\r
+  // Radius y value\r
+  ry: function (ry) {\r
+    return this.attr('ry', ry)\r
+  }\r
+})\r
+\r
+// Add common method\r
+SVG.extend([SVG.Circle, SVG.Ellipse], {\r
+    // Move over x-axis\r
+  x: function (x) {\r
+    return x == null ? this.cx() - this.rx() : this.cx(x + this.rx())\r
+  },\r
+    // Move over y-axis\r
+  y: function (y) {\r
+    return y == null ? this.cy() - this.ry() : this.cy(y + this.ry())\r
+  },\r
+    // Move by center over x-axis\r
+  cx: function (x) {\r
+    return x == null ? this.attr('cx') : this.attr('cx', x)\r
+  },\r
+    // Move by center over y-axis\r
+  cy: function (y) {\r
+    return y == null ? this.attr('cy') : this.attr('cy', y)\r
+  },\r
+    // Set width of element\r
+  width: function (width) {\r
+    return width == null ? this.rx() * 2 : this.rx(new SVG.Number(width).divide(2))\r
+  },\r
+    // Set height of element\r
+  height: function (height) {\r
+    return height == null ? this.ry() * 2 : this.ry(new SVG.Number(height).divide(2))\r
+  },\r
+    // Custom size function\r
+  size: function (width, height) {\r
+    var p = proportionalSize(this, width, height)\r
+\r
+    return this\r
+        .rx(new SVG.Number(p.width).divide(2))\r
+        .ry(new SVG.Number(p.height).divide(2))\r
+  }\r
+})\r
+
+/* global proportionalSize */\r
+\r
+SVG.Line = SVG.invent({\r
+  // Initialize node\r
+  create: 'line',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Shape,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Get array\r
+    array: function () {\r
+      return new SVG.PointArray([\r
+        [ this.attr('x1'), this.attr('y1') ],\r
+        [ this.attr('x2'), this.attr('y2') ]\r
+      ])\r
+    },\r
+\r
+    // Overwrite native plot() method\r
+    plot: function (x1, y1, x2, y2) {\r
+      if (x1 == null) {\r
+        return this.array()\r
+      } else if (typeof y1 !== 'undefined') {\r
+        x1 = { x1: x1, y1: y1, x2: x2, y2: y2 }\r
+      } else {\r
+        x1 = new SVG.PointArray(x1).toLine()\r
+      }\r
+\r
+      return this.attr(x1)\r
+    },\r
+\r
+    // Move by left top corner\r
+    move: function (x, y) {\r
+      return this.attr(this.array().move(x, y).toLine())\r
+    },\r
+\r
+    // Set element size to given width and height\r
+    size: function (width, height) {\r
+      var p = proportionalSize(this, width, height)\r
+      return this.attr(this.array().size(p.width, p.height).toLine())\r
+    }\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create a line element\r
+    line: function (x1, y1, x2, y2) {\r
+      // make sure plot is called as a setter\r
+      // x1 is not necessarily a number, it can also be an array, a string and a SVG.PointArray\r
+      return SVG.Line.prototype.plot.apply(\r
+        this.put(new SVG.Line())\r
+      , x1 != null ? [x1, y1, x2, y2] : [0, 0, 0, 0]\r
+      )\r
+    }\r
+  }\r
+})\r
+
+/* global proportionalSize */\r
+\r
+SVG.Polyline = SVG.invent({\r
+  // Initialize node\r
+  create: 'polyline',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Shape,\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create a wrapped polyline element\r
+    polyline: function (p) {\r
+      // make sure plot is called as a setter\r
+      return this.put(new SVG.Polyline()).plot(p || new SVG.PointArray())\r
+    }\r
+  }\r
+})\r
+\r
+SVG.Polygon = SVG.invent({\r
+  // Initialize node\r
+  create: 'polygon',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Shape,\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create a wrapped polygon element\r
+    polygon: function (p) {\r
+      // make sure plot is called as a setter\r
+      return this.put(new SVG.Polygon()).plot(p || new SVG.PointArray())\r
+    }\r
+  }\r
+})\r
+\r
+// Add polygon-specific functions\r
+SVG.extend([SVG.Polyline, SVG.Polygon], {\r
+  // Get array\r
+  array: function () {\r
+    return this._array || (this._array = new SVG.PointArray(this.attr('points')))\r
+  },\r
+\r
+  // Plot new path\r
+  plot: function (p) {\r
+    return (p == null) ? this.array()\r
+      : this.clear().attr('points', typeof p === 'string' ? p\r
+      : (this._array = new SVG.PointArray(p)))\r
+  },\r
+\r
+  // Clear array cache\r
+  clear: function () {\r
+    delete this._array\r
+    return this\r
+  },\r
+\r
+  // Move by left top corner\r
+  move: function (x, y) {\r
+    return this.attr('points', this.array().move(x, y))\r
+  },\r
+\r
+  // Set element size to given width and height\r
+  size: function (width, height) {\r
+    var p = proportionalSize(this, width, height)\r
+    return this.attr('points', this.array().size(p.width, p.height))\r
+  }\r
+})\r
+
+// unify all point to point elements\r
+SVG.extend([SVG.Line, SVG.Polyline, SVG.Polygon], {\r
+  // Define morphable array\r
+  MorphArray: SVG.PointArray,\r
+  // Move by left top corner over x-axis\r
+  x: function (x) {\r
+    return x == null ? this.bbox().x : this.move(x, this.bbox().y)\r
+  },\r
+  // Move by left top corner over y-axis\r
+  y: function (y) {\r
+    return y == null ? this.bbox().y : this.move(this.bbox().x, y)\r
+  },\r
+  // Set width of element\r
+  width: function (width) {\r
+    var b = this.bbox()\r
+\r
+    return width == null ? b.width : this.size(width, b.height)\r
+  },\r
+  // Set height of element\r
+  height: function (height) {\r
+    var b = this.bbox()\r
+\r
+    return height == null ? b.height : this.size(b.width, height)\r
+  }\r
+})\r
+
+/* global proportionalSize */\r
+\r
+SVG.Path = SVG.invent({\r
+  // Initialize node\r
+  create: 'path',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Shape,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Define morphable array\r
+    MorphArray: SVG.PathArray,\r
+    // Get array\r
+    array: function () {\r
+      return this._array || (this._array = new SVG.PathArray(this.attr('d')))\r
+    },\r
+    // Plot new path\r
+    plot: function (d) {\r
+      return (d == null) ? this.array()\r
+        : this.clear().attr('d', typeof d === 'string' ? d : (this._array = new SVG.PathArray(d)))\r
+    },\r
+    // Clear array cache\r
+    clear: function () {\r
+      delete this._array\r
+      return this\r
+    },\r
+    // Move by left top corner\r
+    move: function (x, y) {\r
+      return this.attr('d', this.array().move(x, y))\r
+    },\r
+    // Move by left top corner over x-axis\r
+    x: function (x) {\r
+      return x == null ? this.bbox().x : this.move(x, this.bbox().y)\r
+    },\r
+    // Move by left top corner over y-axis\r
+    y: function (y) {\r
+      return y == null ? this.bbox().y : this.move(this.bbox().x, y)\r
+    },\r
+    // Set element size to given width and height\r
+    size: function (width, height) {\r
+      var p = proportionalSize(this, width, height)\r
+      return this.attr('d', this.array().size(p.width, p.height))\r
+    },\r
+    // Set width of element\r
+    width: function (width) {\r
+      return width == null ? this.bbox().width : this.size(width, this.bbox().height)\r
+    },\r
+    // Set height of element\r
+    height: function (height) {\r
+      return height == null ? this.bbox().height : this.size(this.bbox().width, height)\r
+    }\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create a wrapped path element\r
+    path: function (d) {\r
+      // make sure plot is called as a setter\r
+      return this.put(new SVG.Path()).plot(d || new SVG.PathArray())\r
+    }\r
+  }\r
+})\r
+
+SVG.Image = SVG.invent({\r
+  // Initialize node\r
+  create: 'image',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Shape,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // (re)load image\r
+    load: function (url, callback) {\r
+      if (!url) return this\r
+\r
+      var img = new window.Image()\r
+\r
+      SVG.on(img, 'load', function (e) {\r
+        var p = this.parent(SVG.Pattern)\r
+\r
+        // ensure image size\r
+        if (this.width() === 0 && this.height() === 0) {\r
+          this.size(img.width, img.height)\r
+        }\r
+\r
+        if (p instanceof SVG.Pattern) {\r
+          // ensure pattern size if not set\r
+          if (p.width() === 0 && p.height() === 0) {\r
+            p.size(this.width(), this.height())\r
+          }\r
+        }\r
+\r
+        if (typeof callback === 'function') {\r
+          callback.call(this, {\r
+            width: img.width,\r
+            height: img.height,\r
+            ratio: img.width / img.height,\r
+            url: url\r
+          })\r
+        }\r
+      }, this)\r
+\r
+      SVG.on(img, 'load error', function () {\r
+        // dont forget to unbind memory leaking events\r
+        SVG.off(img)\r
+      })\r
+\r
+      return this.attr('href', (img.src = url), SVG.xlink)\r
+    }\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // create image element, load image and set its size\r
+    image: function (source, callback) {\r
+      return this.put(new SVG.Image()).size(0, 0).load(source, callback)\r
+    }\r
+  }\r
+})\r
+
+SVG.Text = SVG.invent({\r
+  // Initialize node\r
+  create: function (node) {\r
+    SVG.Element.call(this, node || SVG.create('text'))\r
+    this.dom.leading = new SVG.Number(1.3)    // store leading value for rebuilding\r
+    this._rebuild = true                      // enable automatic updating of dy values\r
+    this._build = false                     // disable build mode for adding multiple lines\r
+\r
+    // set default font\r
+    this.attr('font-family', SVG.defaults.attrs['font-family'])\r
+  },\r
+\r
+  // Inherit from\r
+  inherit: SVG.Parent,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Move over x-axis\r
+    x: function (x) {\r
+      // act as getter\r
+      if (x == null) {\r
+        return this.attr('x')\r
+      }\r
+\r
+      return this.attr('x', x)\r
+    },\r
+    // Move over y-axis\r
+    y: function (y) {\r
+      var oy = this.attr('y')\r
+      var o = typeof oy === 'number' ? oy - this.bbox().y : 0\r
+\r
+      // act as getter\r
+      if (y == null) {\r
+        return typeof oy === 'number' ? oy - o : oy\r
+      }\r
+\r
+      return this.attr('y', typeof y === 'number' ? y + o : y)\r
+    },\r
+    // Move center over x-axis\r
+    cx: function (x) {\r
+      return x == null ? this.bbox().cx : this.x(x - this.bbox().width / 2)\r
+    },\r
+    // Move center over y-axis\r
+    cy: function (y) {\r
+      return y == null ? this.bbox().cy : this.y(y - this.bbox().height / 2)\r
+    },\r
+    // Set the text content\r
+    text: function (text) {\r
+      // act as getter\r
+      if (text === undefined) {\r
+        var children = this.node.childNodes\r
+        var firstLine = 0\r
+        text = ''\r
+\r
+        for (var i = 0, len = children.length; i < len; ++i) {\r
+          // skip textPaths - they are no lines\r
+          if (children[i].nodeName === 'textPath') {\r
+            if (i === 0) firstLine = 1\r
+            continue\r
+          }\r
+\r
+          // add newline if its not the first child and newLined is set to true\r
+          if (i !== firstLine && children[i].nodeType !== 3 && SVG.adopt(children[i]).dom.newLined === true) {\r
+            text += '\n'\r
+          }\r
+\r
+          // add content of this node\r
+          text += children[i].textContent\r
+        }\r
+\r
+        return text\r
+      }\r
+\r
+      // remove existing content\r
+      this.clear().build(true)\r
+\r
+      if (typeof text === 'function') {\r
+        // call block\r
+        text.call(this, this)\r
+      } else {\r
+        // store text and make sure text is not blank\r
+        text = text.split('\n')\r
+\r
+        // build new lines\r
+        for (var j = 0, jl = text.length; j < jl; j++) {\r
+          this.tspan(text[j]).newLine()\r
+        }\r
+      }\r
+\r
+      // disable build mode and rebuild lines\r
+      return this.build(false).rebuild()\r
+    },\r
+    // Set / get leading\r
+    leading: function (value) {\r
+      // act as getter\r
+      if (value == null) {\r
+        return this.dom.leading\r
+      }\r
+\r
+      // act as setter\r
+      this.dom.leading = new SVG.Number(value)\r
+\r
+      return this.rebuild()\r
+    },\r
+    // Rebuild appearance type\r
+    rebuild: function (rebuild) {\r
+      // store new rebuild flag if given\r
+      if (typeof rebuild === 'boolean') {\r
+        this._rebuild = rebuild\r
+      }\r
+\r
+      // define position of all lines\r
+      if (this._rebuild) {\r
+        var self = this\r
+        var blankLineOffset = 0\r
+        var dy = this.dom.leading * new SVG.Number(this.attr('font-size'))\r
+\r
+        this.each(function () {\r
+          if (this.dom.newLined) {\r
+            this.attr('x', self.attr('x'))\r
+\r
+            if (this.text() === '\n') {\r
+              blankLineOffset += dy\r
+            } else {\r
+              this.attr('dy', dy + blankLineOffset)\r
+              blankLineOffset = 0\r
+            }\r
+          }\r
+        })\r
+\r
+        this.fire('rebuild')\r
+      }\r
+\r
+      return this\r
+    },\r
+    // Enable / disable build mode\r
+    build: function (build) {\r
+      this._build = !!build\r
+      return this\r
+    },\r
+    // overwrite method from parent to set data properly\r
+    setData: function (o) {\r
+      this.dom = o\r
+      this.dom.leading = new SVG.Number(o.leading || 1.3)\r
+      return this\r
+    }\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create text element\r
+    text: function (text) {\r
+      return this.put(new SVG.Text()).text(text)\r
+    },\r
+    // Create plain text element\r
+    plain: function (text) {\r
+      return this.put(new SVG.Text()).plain(text)\r
+    }\r
+  }\r
+\r
+})\r
+\r
+SVG.Tspan = SVG.invent({\r
+  // Initialize node\r
+  create: 'tspan',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Parent,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Set text content\r
+    text: function (text) {\r
+      if (text == null) return this.node.textContent + (this.dom.newLined ? '\n' : '')\r
+\r
+      typeof text === 'function' ? text.call(this, this) : this.plain(text)\r
+\r
+      return this\r
+    },\r
+    // Shortcut dx\r
+    dx: function (dx) {\r
+      return this.attr('dx', dx)\r
+    },\r
+    // Shortcut dy\r
+    dy: function (dy) {\r
+      return this.attr('dy', dy)\r
+    },\r
+    // Create new line\r
+    newLine: function () {\r
+      // fetch text parent\r
+      var t = this.parent(SVG.Text)\r
+\r
+      // mark new line\r
+      this.dom.newLined = true\r
+\r
+      // apply new position\r
+      return this.dy(t.dom.leading * t.attr('font-size')).attr('x', t.x())\r
+    }\r
+  }\r
+})\r
+\r
+SVG.extend([SVG.Text, SVG.Tspan], {\r
+  // Create plain text node\r
+  plain: function (text) {\r
+    // clear if build mode is disabled\r
+    if (this._build === false) {\r
+      this.clear()\r
+    }\r
+\r
+    // create text node\r
+    this.node.appendChild(document.createTextNode(text))\r
+\r
+    return this\r
+  },\r
+  // Create a tspan\r
+  tspan: function (text) {\r
+    var tspan = new SVG.Tspan()\r
+\r
+    // clear if build mode is disabled\r
+    if (!this._build) {\r
+      this.clear()\r
+    }\r
+\r
+    // add new tspan\r
+    this.node.appendChild(tspan.node)\r
+\r
+    return tspan.text(text)\r
+  },\r
+  // FIXME: Does this also work for textpath?\r
+  // Get length of text element\r
+  length: function () {\r
+    return this.node.getComputedTextLength()\r
+  }\r
+})\r
+
+SVG.TextPath = SVG.invent({\r
+  // Initialize node\r
+  create: 'textPath',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Text,\r
+\r
+  // Define parent class\r
+  parent: SVG.Parent,\r
+\r
+  // Add parent method\r
+  extend: {\r
+    MorphArray: SVG.PathArray,\r
+    // return the array of the path track element\r
+    array: function () {\r
+      var track = this.track()\r
+\r
+      return track ? track.array() : null\r
+    },\r
+    // Plot path if any\r
+    plot: function (d) {\r
+      var track = this.track()\r
+      var pathArray = null\r
+\r
+      if (track) {\r
+        pathArray = track.plot(d)\r
+      }\r
+\r
+      return (d == null) ? pathArray : this\r
+    },\r
+    // Get the path element\r
+    track: function () {\r
+      return this.reference('href')\r
+    }\r
+  },\r
+  construct: {\r
+    textPath: function (text, path) {\r
+      return this.defs().path(path).text(text).addTo(this)\r
+    }\r
+  }\r
+})\r
+\r
+SVG.extend([SVG.Text], {\r
+    // Create path for text to run on\r
+  path: function (track) {\r
+    var path = new SVG.TextPath()\r
+\r
+    // if d is a path, reuse it\r
+    if (!(track instanceof SVG.Path)) {\r
+      // create path element\r
+      track = this.doc().defs().path(track)\r
+    }\r
+\r
+    // link textPath to path and add content\r
+    path.attr('href', '#' + track, SVG.xlink)\r
+\r
+    // add textPath element as child node and return textPath\r
+    return this.put(path)\r
+  },\r
+  // Todo: make this plural?\r
+  // Get the textPath children\r
+  textPath: function () {\r
+    return this.select('textPath')\r
+  }\r
+})\r
+\r
+SVG.extend([SVG.Path], {\r
+  // creates a textPath from this path\r
+  text: function (text) {\r
+    if (text instanceof SVG.Text) {\r
+      var txt = text.text()\r
+      return text.clear().path(this).text(txt)\r
+    }\r
+    return this.parent().put(new SVG.Text()).path(this).text(text)\r
+  }\r
+  // TODO: Maybe add `targets` to get all textPaths associated with this path\r
+})\r
+
+SVG.A = SVG.invent({\r
+  // Initialize node\r
+  create: 'a',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Container,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Link url\r
+    to: function (url) {\r
+      return this.attr('href', url, SVG.xlink)\r
+    },\r
+    // Link target attribute\r
+    target: function (target) {\r
+      return this.attr('target', target)\r
+    }\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    // Create a hyperlink element\r
+    link: function (url) {\r
+      return this.put(new SVG.A()).to(url)\r
+    }\r
+  }\r
+})\r
+\r
+SVG.extend(SVG.Element, {\r
+  // Create a hyperlink element\r
+  linkTo: function (url) {\r
+    var link = new SVG.A()\r
+\r
+    if (typeof url === 'function') { url.call(link, link) } else {\r
+      link.to(url)\r
+    }\r
+\r
+    return this.parent().put(link).put(this)\r
+  }\r
+\r
+})\r
+
+SVG.Marker = SVG.invent({\r
+  // Initialize node\r
+  create: 'marker',\r
+\r
+  // Inherit from\r
+  inherit: SVG.Container,\r
+\r
+  // Add class methods\r
+  extend: {\r
+    // Set width of element\r
+    width: function (width) {\r
+      return this.attr('markerWidth', width)\r
+    },\r
+    // Set height of element\r
+    height: function (height) {\r
+      return this.attr('markerHeight', height)\r
+    },\r
+    // Set marker refX and refY\r
+    ref: function (x, y) {\r
+      return this.attr('refX', x).attr('refY', y)\r
+    },\r
+    // Update marker\r
+    update: function (block) {\r
+      // remove all content\r
+      this.clear()\r
+\r
+      // invoke passed block\r
+      if (typeof block === 'function') { block.call(this, this) }\r
+\r
+      return this\r
+    },\r
+    // Return the fill id\r
+    toString: function () {\r
+      return 'url(#' + this.id() + ')'\r
+    }\r
+  },\r
+\r
+  // Add parent method\r
+  construct: {\r
+    marker: function (width, height, block) {\r
+      // Create marker element in defs\r
+      return this.defs().marker(width, height, block)\r
+    }\r
+  }\r
+\r
+})\r
+\r
+SVG.extend(SVG.Defs, {\r
+  // Create marker\r
+  marker: function (width, height, block) {\r
+    // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto\r
+    return this.put(new SVG.Marker())\r
+      .size(width, height)\r
+      .ref(width / 2, height / 2)\r
+      .viewbox(0, 0, width, height)\r
+      .attr('orient', 'auto')\r
+      .update(block)\r
+  }\r
+\r
+})\r
+\r
+SVG.extend([SVG.Line, SVG.Polyline, SVG.Polygon, SVG.Path], {\r
+  // Create and attach markers\r
+  marker: function (marker, width, height, block) {\r
+    var attr = ['marker']\r
+\r
+    // Build attribute name\r
+    if (marker !== 'all') attr.push(marker)\r
+    attr = attr.join('-')\r
+\r
+    // Set marker attribute\r
+    marker = arguments[1] instanceof SVG.Marker\r
+      ? arguments[1]\r
+      : this.doc().marker(width, height, block)\r
+\r
+    return this.attr(attr, marker)\r
+  }\r
+})\r
+
+// // Define list of available attributes for stroke and fill\r
+// var sugar = {\r
+//   stroke: ['color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset'],\r
+//   fill: ['color', 'opacity', 'rule'],\r
+//   prefix: function (t, a) {\r
+//     return a === 'color' ? t : t + '-' + a\r
+//   }\r
+// }\r
+//\r
+// // Add sugar for fill and stroke\r
+// ;['fill', 'stroke'].forEach(function (m) {\r
+//   var extension = {}\r
+//   var i\r
+//\r
+//   extension[m] = function (o) {\r
+//     if (typeof o === 'undefined') {\r
+//       return this\r
+//     }\r
+//     if (typeof o === 'string' || SVG.Color.isRgb(o) || (o && typeof o.fill === 'function')) {\r
+//       this.attr(m, o)\r
+//     } else {\r
+//       // set all attributes from sugar.fill and sugar.stroke list\r
+//       for (i = sugar[m].length - 1; i >= 0; i--) {\r
+//         if (o[sugar[m][i]] != null) {\r
+//           this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]])\r
+//         }\r
+//       }\r
+//     }\r
+//\r
+//     return this\r
+//   }\r
+//\r
+//   SVG.extend([SVG.Element, SVG.Timeline], extension)\r
+// })\r
+//\r
+// SVG.extend([SVG.Element, SVG.Timeline], {\r
+//   // Let the user set the matrix directly\r
+//   matrix: function (mat, b, c, d, e, f) {\r
+//     // Act as a getter\r
+//     if (mat == null) {\r
+//       return new SVG.Matrix(this)\r
+//     }\r
+//\r
+//     // Act as a setter, the user can pass a matrix or a set of numbers\r
+//     return this.attr('transform', new SVG.Matrix(mat, b, c, d, e, f))\r
+//   },\r
+//\r
+//   // Map rotation to transform\r
+//   rotate: function (angle, cx, cy) {\r
+//     return this.transform({rotate: angle, ox: cx, oy: cy}, true)\r
+//   },\r
+//\r
+//   // Map skew to transform\r
+//   skew: function (x, y, cx, cy) {\r
+//     return arguments.length === 1 || arguments.length === 3\r
+//       ? this.transform({skew: x, ox: y, oy: cx}, true)\r
+//       : this.transform({skew: [x, y], ox: cx, oy: cy}, true)\r
+//   },\r
+//\r
+//   shear: function (lam, cx, cy) {\r
+//     return this.transform({shear: lam, ox: cx, oy: cy}, true)\r
+//   },\r
+//\r
+//   // Map scale to transform\r
+//   scale: function (x, y, cx, cy) {\r
+//     return arguments.length === 1 || arguments.length === 3\r
+//       ? this.transform({ scale: x, ox: y, oy: cx }, true)\r
+//       : this.transform({ scale: [x, y], ox: cx, oy: cy }, true)\r
+//   },\r
+//\r
+//   // Map translate to transform\r
+//   translate: function (x, y) {\r
+//     return this.transform({ translate: [x, y] }, true)\r
+//   },\r
+//\r
+//   // Map relative translations to transform\r
+//   relative: function (x, y) {\r
+//     return this.transform({ relative: [x, y] }, true)\r
+//   },\r
+//\r
+//   // Map flip to transform\r
+//   flip: function (direction, around) {\r
+//     var directionString = typeof direction === 'string' ? direction\r
+//       : isFinite(direction) ? 'both'\r
+//       : 'both'\r
+//     var origin = (direction === 'both' && isFinite(around)) ? [around, around]\r
+//       : (direction === 'x') ? [around, 0]\r
+//       : (direction === 'y') ? [0, around]\r
+//       : isFinite(direction) ? [direction, direction]\r
+//       : [0, 0]\r
+//     this.transform({flip: directionString, origin: origin}, true)\r
+//   },\r
+//\r
+//   // Opacity\r
+//   opacity: function (value) {\r
+//     return this.attr('opacity', value)\r
+//   },\r
+//\r
+//   // Relative move over x axis\r
+//   dx: function (x) {\r
+//     return this.x(new SVG.Number(x).plus(this instanceof SVG.Timeline ? 0 : this.x()), true)\r
+//   },\r
+//\r
+//   // Relative move over y axis\r
+//   dy: function (y) {\r
+//     return this.y(new SVG.Number(y).plus(this instanceof SVG.Timeline ? 0 : this.y()), true)\r
+//   },\r
+//\r
+//   // Relative move over x and y axes\r
+//   dmove: function (x, y) {\r
+//     return this.dx(x).dy(y)\r
+//   }\r
+// })\r
+//\r
+// SVG.extend([SVG.Rect, SVG.Ellipse, SVG.Circle, SVG.Gradient, SVG.Timeline], {\r
+//   // Add x and y radius\r
+//   radius: function (x, y) {\r
+//     var type = (this._target || this).type\r
+//     return type === 'radialGradient' || type === 'radialGradient'\r
+//       ? this.attr('r', new SVG.Number(x))\r
+//       : this.rx(x).ry(y == null ? x : y)\r
+//   }\r
+// })\r
+//\r
+// SVG.extend(SVG.Path, {\r
+//   // Get path length\r
+//   length: function () {\r
+//     return this.node.getTotalLength()\r
+//   },\r
+//   // Get point at length\r
+//   pointAt: function (length) {\r
+//     return new SVG.Point(this.node.getPointAtLength(length))\r
+//   }\r
+// })\r
+//\r
+// SVG.extend([SVG.Parent, SVG.Text, SVG.Tspan, SVG.Timeline], {\r
+//   // Set font\r
+//   font: function (a, v) {\r
+//     if (typeof a === 'object') {\r
+//       for (v in a) this.font(v, a[v])\r
+//     }\r
+//\r
+//     return a === 'leading'\r
+//         ? this.leading(v)\r
+//       : a === 'anchor'\r
+//         ? this.attr('text-anchor', v)\r
+//       : a === 'size' || a === 'family' || a === 'weight' || a === 'stretch' || a === 'variant' || a === 'style'\r
+//         ? this.attr('font-' + a, v)\r
+//       : this.attr(a, v)\r
+//   }\r
+// })\r
+
+\r
+SVG.extend(SVG.Element, {\r
+  // Store data values on svg nodes\r
+  data: function (a, v, r) {\r
+    if (typeof a === 'object') {\r
+      for (v in a) {\r
+        this.data(v, a[v])\r
+      }\r
+    } else if (arguments.length < 2) {\r
+      try {\r
+        return JSON.parse(this.attr('data-' + a))\r
+      } catch (e) {\r
+        return this.attr('data-' + a)\r
+      }\r
+    } else {\r
+      this.attr('data-' + a,\r
+        v === null ? null\r
+        : r === true || typeof v === 'string' || typeof v === 'number' ? v\r
+        : JSON.stringify(v)\r
+      )\r
+    }\r
+\r
+    return this\r
+  }\r
+})\r
+
+\r
+SVG.extend(SVG.Element, {\r
+  // Remember arbitrary data\r
+  remember: function (k, v) {\r
+    // remember every item in an object individually\r
+    if (typeof arguments[0] === 'object') {\r
+      for (var key in k) {\r
+        this.remember(key, k[key])\r
+      }\r
+    } else if (arguments.length === 1) {\r
+      // retrieve memory\r
+      return this.memory()[k]\r
+    } else {\r
+      // store memory\r
+      this.memory()[k] = v\r
+    }\r
+\r
+    return this\r
+  },\r
+\r
+  // Erase a given memory\r
+  forget: function () {\r
+    if (arguments.length === 0) {\r
+      this._memory = {}\r
+    } else {\r
+      for (var i = arguments.length - 1; i >= 0; i--) {\r
+        delete this.memory()[arguments[i]]\r
+      }\r
+    }\r
+    return this\r
+  },\r
+\r
+  // Initialize or return local memory object\r
+  memory: function () {\r
+    return this._memory || (this._memory = {})\r
+  }\r
+})\r
+
+/* global idFromReference */\r
+\r
+// Method for getting an element by id\r
+SVG.get = function (id) {\r
+  var node = document.getElementById(idFromReference(id) || id)\r
+  return SVG.adopt(node)\r
+}\r
+\r
+// Select elements by query string\r
+SVG.select = function (query, parent) {\r
+  return SVG.utils.map((parent || document).querySelectorAll(query), function (node) {\r
+    return SVG.adopt(node)\r
+  })\r
+}\r
+\r
+SVG.$$ = function (query, parent) {\r
+  return SVG.utils.map((parent || document).querySelectorAll(query), function (node) {\r
+    return SVG.adopt(node)\r
+  })\r
+}\r
+\r
+SVG.$ = function (query, parent) {\r
+  return SVG.adopt((parent || document).querySelector(query))\r
+}\r
+\r
+SVG.extend(SVG.Parent, {\r
+  // Scoped select method\r
+  select: function (query) {\r
+    return SVG.select(query, this.node)\r
+  }\r
+})\r
+
+/* eslint no-unused-vars: 0 */\r
+\r
+function createElement (element, makeNested) {\r
+  if (element instanceof SVG.Element) return element\r
+\r
+  if (typeof element === 'object') {\r
+    return SVG.adopt(element)\r
+  }\r
+\r
+  if (element == null) {\r
+    return new SVG.Doc()\r
+  }\r
+\r
+  if (typeof element === 'string' && element.charAt(0) !== '<') {\r
+    return SVG.adopt(document.querySelector(element))\r
+  }\r
+\r
+  var node = SVG.create('svg')\r
+  node.innerHTML = element\r
+\r
+  element = SVG.adopt(node.firstElementChild)\r
+\r
+  return element\r
+}\r
+\r
+function isNulledBox (box) {\r
+  return !box.w && !box.h && !box.x && !box.y\r
+}\r
+\r
+function domContains (node) {\r
+  return (document.documentElement.contains || function (node) {\r
+    // This is IE - it does not support contains() for top-level SVGs\r
+    while (node.parentNode) {\r
+      node = node.parentNode\r
+    }\r
+    return node === document\r
+  }).call(document.documentElement, node)\r
+}\r
+\r
+function pathRegReplace (a, b, c, d) {\r
+  return c + d.replace(SVG.regex.dots, ' .')\r
+}\r
+\r
+// creates deep clone of array\r
+function arrayClone (arr) {\r
+  var clone = arr.slice(0)\r
+  for (var i = clone.length; i--;) {\r
+    if (Array.isArray(clone[i])) {\r
+      clone[i] = arrayClone(clone[i])\r
+    }\r
+  }\r
+  return clone\r
+}\r
+\r
+// tests if a given element is instance of an object\r
+function is (el, obj) {\r
+  return el instanceof obj\r
+}\r
+\r
+// tests if a given selector matches an element\r
+function matches (el, selector) {\r
+  return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector)\r
+}\r
+\r
+// Convert dash-separated-string to camelCase\r
+function camelCase (s) {\r
+  return s.toLowerCase().replace(/-(.)/g, function (m, g) {\r
+    return g.toUpperCase()\r
+  })\r
+}\r
+\r
+// Capitalize first letter of a string\r
+function capitalize (s) {\r
+  return s.charAt(0).toUpperCase() + s.slice(1)\r
+}\r
+\r
+// Ensure to six-based hex\r
+function fullHex (hex) {\r
+  return hex.length === 4\r
+    ? [ '#',\r
+      hex.substring(1, 2), hex.substring(1, 2),\r
+      hex.substring(2, 3), hex.substring(2, 3),\r
+      hex.substring(3, 4), hex.substring(3, 4)\r
+    ].join('')\r
+    : hex\r
+}\r
+\r
+// Component to hex value\r
+function compToHex (comp) {\r
+  var hex = comp.toString(16)\r
+  return hex.length === 1 ? '0' + hex : hex\r
+}\r
+\r
+// Calculate proportional width and height values when necessary\r
+function proportionalSize (element, width, height) {\r
+  if (width == null || height == null) {\r
+    var box = element.bbox()\r
+\r
+    if (width == null) {\r
+      width = box.width / box.height * height\r
+    } else if (height == null) {\r
+      height = box.height / box.width * width\r
+    }\r
+  }\r
+\r
+  return {\r
+    width: width,\r
+    height: height\r
+  }\r
+}\r
+\r
+// Map matrix array to object\r
+function arrayToMatrix (a) {\r
+  return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] }\r
+}\r
+\r
+// Add centre point to transform object\r
+function ensureCentre (o, target) {\r
+  o.cx = o.cx == null ? target.bbox().cx : o.cx\r
+  o.cy = o.cy == null ? target.bbox().cy : o.cy\r
+}\r
+\r
+// PathArray Helpers\r
+function arrayToString (a) {\r
+  for (var i = 0, il = a.length, s = ''; i < il; i++) {\r
+    s += a[i][0]\r
+\r
+    if (a[i][1] != null) {\r
+      s += a[i][1]\r
+\r
+      if (a[i][2] != null) {\r
+        s += ' '\r
+        s += a[i][2]\r
+\r
+        if (a[i][3] != null) {\r
+          s += ' '\r
+          s += a[i][3]\r
+          s += ' '\r
+          s += a[i][4]\r
+\r
+          if (a[i][5] != null) {\r
+            s += ' '\r
+            s += a[i][5]\r
+            s += ' '\r
+            s += a[i][6]\r
+\r
+            if (a[i][7] != null) {\r
+              s += ' '\r
+              s += a[i][7]\r
+            }\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  return s + ' '\r
+}\r
+\r
+// Deep new id assignment\r
+function assignNewId (node) {\r
+  // do the same for SVG child nodes as well\r
+  for (var i = node.children.length - 1; i >= 0; i--) {\r
+    assignNewId(node.children[i])\r
+  }\r
+\r
+  if (node.id) {\r
+    return SVG.adopt(node).id(SVG.eid(node.nodeName))\r
+  }\r
+\r
+  return SVG.adopt(node)\r
+}\r
+\r
+// Add more bounding box properties\r
+function fullBox (b) {\r
+  if (b.x == null) {\r
+    b.x = 0\r
+    b.y = 0\r
+    b.width = 0\r
+    b.height = 0\r
+  }\r
+\r
+  b.w = b.width\r
+  b.h = b.height\r
+  b.x2 = b.x + b.width\r
+  b.y2 = b.y + b.height\r
+  b.cx = b.x + b.width / 2\r
+  b.cy = b.y + b.height / 2\r
+\r
+  return b\r
+}\r
+\r
+// Get id from reference string\r
+function idFromReference (url) {\r
+  var m = (url || '').toString().match(SVG.regex.reference)\r
+\r
+  if (m) return m[1]\r
+}\r
+\r
+// Create matrix array for looping\r
+var abcdef = 'abcdef'.split('')\r
+\r
+function closeEnough (a, b, threshold) {\r
+  return Math.abs(b - a) < (threshold || 1e-6)\r
+}\r
+\r
+// TODO: Refactor this to a static function of matrix.js\r
+function formatTransforms (o) {\r
+  // Get all of the parameters required to form the matrix\r
+  var flipBoth = o.flip === 'both' || o.flip === true\r
+  var flipX = o.flip && (flipBoth || o.flip === 'x') ? -1 : 1\r
+  var flipY = o.flip && (flipBoth || o.flip === 'y') ? -1 : 1\r
+  var skewX = o.skew && o.skew.length ? o.skew[0]\r
+    : isFinite(o.skew) ? o.skew\r
+    : isFinite(o.skewX) ? o.skewX\r
+    : 0\r
+  var skewY = o.skew && o.skew.length ? o.skew[1]\r
+    : isFinite(o.skew) ? o.skew\r
+    : isFinite(o.skewY) ? o.skewY\r
+    : 0\r
+  var scaleX = o.scale && o.scale.length ? o.scale[0] * flipX\r
+    : isFinite(o.scale) ? o.scale * flipX\r
+    : isFinite(o.scaleX) ? o.scaleX * flipX\r
+    : flipX\r
+  var scaleY = o.scale && o.scale.length ? o.scale[1] * flipY\r
+    : isFinite(o.scale) ? o.scale * flipY\r
+    : isFinite(o.scaleY) ? o.scaleY * flipY\r
+    : flipY\r
+  var shear = o.shear || 0\r
+  var theta = o.rotate || o.theta || 0\r
+  var origin = new SVG.Point(o.origin || o.around || o.ox || o.originX, o.oy || o.originY)\r
+  var ox = origin.x\r
+  var oy = origin.y\r
+  var position = new SVG.Point(o.position || o.px || o.positionX, o.py || o.positionY)\r
+  var px = position.x\r
+  var py = position.y\r
+  var translate = new SVG.Point(o.translate || o.tx || o.translateX, o.ty || o.translateY)\r
+  var tx = translate.x\r
+  var ty = translate.y\r
+  var relative = new SVG.Point(o.relative || o.rx || o.relativeX, o.ry || o.relativeY)\r
+  var rx = relative.x\r
+  var ry = relative.y\r
+\r
+  // Populate all of the values\r
+  return {\r
+    scaleX: scaleX,\r
+    scaleY: scaleY,\r
+    skewX: skewX,\r
+    skewY: skewY,\r
+    shear: shear,\r
+    theta: theta,\r
+    rx: rx,\r
+    ry: ry,\r
+    tx: tx,\r
+    ty: ty,\r
+    ox: ox,\r
+    oy: oy,\r
+    px: px,\r
+    py: py\r
+  }\r
+}\r
+\r
+function getOrigin (o, element) {\r
+  // Allow origin or around as the names\r
+  origin = o.around == null ? o.origin : o.around\r
+\r
+  // Allow the user to pass a string to rotate around a given point\r
+  if ( typeof origin === 'string' || origin == null ) {\r
+    // Get the bounding box of the element with no transformations applied\r
+    const string = (origin || 'center').toLowerCase().trim()\r
+    const { height, width, x, y } = element.bbox()\r
+\r
+    // Set the bounds eg : "bottom-left", "Top right", "middle" etc...\r
+    const ox = o.ox || string.includes('left') ? x\r
+      : string.includes('right') ? x + width\r
+      : x + width / 2\r
+    const oy = o.oy || string.includes('top') ? y\r
+      : string.includes('bottom') ? y + height\r
+      : y + height / 2\r
+    return [ox, oy]\r
+  }\r
+\r
+  // Return the origin as it is if it wasn't a string\r
+  return origin\r
+}\r
+
+/* globals fullBox, domContains, isNulledBox, Exception */\r
+\r
+SVG.Box = SVG.invent({\r
+  create: function (source) {\r
+    var base = [0, 0, 0, 0]\r
+    source = typeof source === 'string' ? source.split(SVG.regex.delimiter).map(parseFloat)\r
+      : Array.isArray(source) ? source\r
+      : typeof source === 'object' ? [source.left != null ? source.left\r
+      : source.x, source.top != null ? source.top : source.y, source.width, source.height]\r
+      : arguments.length === 4 ? [].slice.call(arguments)\r
+      : base\r
+\r
+    this.x = source[0]\r
+    this.y = source[1]\r
+    this.width = source[2]\r
+    this.height = source[3]\r
+\r
+    // add center, right, bottom...\r
+    fullBox(this)\r
+  },\r
+  extend: {\r
+    // Merge rect box with another, return a new instance\r
+    merge: function (box) {\r
+      var x = Math.min(this.x, box.x)\r
+      var y = Math.min(this.y, box.y)\r
+\r
+      return new SVG.Box(\r
+        x, y,\r
+        Math.max(this.x + this.width, box.x + box.width) - x,\r
+        Math.max(this.y + this.height, box.y + box.height) - y\r
+      )\r
+    },\r
+\r
+    transform: function (m) {\r
+      var xMin = Infinity\r
+      var xMax = -Infinity\r
+      var yMin = Infinity\r
+      var yMax = -Infinity\r
+\r
+      var pts = [\r
+        new SVG.Point(this.x, this.y),\r
+        new SVG.Point(this.x2, this.y),\r
+        new SVG.Point(this.x, this.y2),\r
+        new SVG.Point(this.x2, this.y2)\r
+      ]\r
+\r
+      pts.forEach(function (p) {\r
+        p = p.transform(m)\r
+        xMin = Math.min(xMin, p.x)\r
+        xMax = Math.max(xMax, p.x)\r
+        yMin = Math.min(yMin, p.y)\r
+        yMax = Math.max(yMax, p.y)\r
+      })\r
+\r
+      return new SVG.Box(\r
+        xMin, yMin,\r
+        xMax - xMin,\r
+        yMax - yMin\r
+      )\r
+    },\r
+\r
+    addOffset: function () {\r
+      // offset by window scroll position, because getBoundingClientRect changes when window is scrolled\r
+      this.x += window.pageXOffset\r
+      this.y += window.pageYOffset\r
+      return this\r
+    },\r
+    toString: function () {\r
+      return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height\r
+    },\r
+    toArray: function () {\r
+      return [this.x, this.y, this.width, this.height]\r
+    },\r
+    morph: function (x, y, width, height) {\r
+      this.destination = new SVG.Box(x, y, width, height)\r
+      return this\r
+    },\r
+\r
+    at: function (pos) {\r
+      if (!this.destination) return this\r
+\r
+      return new SVG.Box(\r
+          this.x + (this.destination.x - this.x) * pos\r
+        , this.y + (this.destination.y - this.y) * pos\r
+        , this.width + (this.destination.width - this.width) * pos\r
+        , this.height + (this.destination.height - this.height) * pos\r
+      )\r
+    }\r
+  },\r
+\r
+    // Define Parent\r
+  parent: SVG.Element,\r
+\r
+  // Constructor\r
+  construct: {\r
+    // Get bounding box\r
+    bbox: function () {\r
+      var box\r
+\r
+      try {\r
+        // find native bbox\r
+        box = this.node.getBBox()\r
+\r
+        if (isNulledBox(box) && !domContains(this.node)) {\r
+          throw new Exception('Element not in the dom')\r
+        }\r
+      } catch (e) {\r
+        try {\r
+          var clone = this.clone(SVG.parser().svg).show()\r
+          box = clone.node.getBBox()\r
+          clone.remove()\r
+        } catch (e) {\r
+          console.warn('Getting a bounding box of this element is not possible')\r
+        }\r
+      }\r
+\r
+      return new SVG.Box(box)\r
+    },\r
+\r
+    rbox: function (el) {\r
+      // IE11 throws an error when element not in dom\r
+      try {\r
+        var box = new SVG.Box(this.node.getBoundingClientRect())\r
+        if (el) return box.transform(el.screenCTM().inverse())\r
+        return box.addOffset()\r
+      } catch (e) {\r
+        return new SVG.Box()\r
+      }\r
+    }\r
+  }\r
+})\r
+\r
+SVG.extend([SVG.Doc, SVG.Symbol, SVG.Image, SVG.Pattern, SVG.Marker, SVG.ForeignObject, SVG.View], {\r
+  viewbox: function (x, y, width, height) {\r
+    // act as getter\r
+    if (x == null) return new SVG.Box(this.attr('viewBox'))\r
+\r
+    // act as setter\r
+    return this.attr('viewBox', new SVG.Box(x, y, width, height))\r
+  }\r
+})\r
+
+\r
+SVG.parser = function () {\r
+  var b\r
+\r
+  if (!SVG.parser.nodes.svg.node.parentNode) {\r
+    b = document.body || document.documentElement\r
+    SVG.parser.nodes.svg.addTo(b)\r
+  }\r
+\r
+  return SVG.parser.nodes\r
+}\r
+\r
+SVG.parser.nodes = {\r
+  svg: SVG().size(2, 0).css({\r
+    opacity: 0,\r
+    position: 'absolute',\r
+    left: '-100%',\r
+    top: '-100%',\r
+    overflow: 'hidden'\r
+  })\r
+}\r
+\r
+SVG.parser.nodes.path = SVG.parser.nodes.svg.path().node\r
 
 /* global requestAnimationFrame */
 
@@ -4718,8 +4724,8 @@ SVG.Animator = {
         : null
   }
 }
-
-
-return SVG
-
-}));
\ No newline at end of file
+\r
+\r
+return SVG\r
+\r
+}));\r
\ No newline at end of file
index 96d4bac13cd809267dd1d81511266a09dfc7dc40..9e9a409561d9a4c2a6efd2198e975596e45abd18 100644 (file)
       "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=",
       "dev": true,
       "requires": {
-        "mime-types": "2.1.18",
+        "mime-types": "~2.1.11",
         "negotiator": "0.6.1"
       }
     },
     "acorn": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz",
-      "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==",
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz",
+      "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==",
       "dev": true
     },
     "acorn-jsx": {
@@ -32,7 +32,7 @@
       "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
       "dev": true,
       "requires": {
-        "acorn": "3.3.0"
+        "acorn": "^3.0.4"
       },
       "dependencies": {
         "acorn": {
       "dev": true
     },
     "ajv": {
-      "version": "5.5.2",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-      "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+      "version": "4.11.8",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+      "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
       "dev": true,
       "requires": {
-        "co": "4.6.0",
-        "fast-deep-equal": "1.0.0",
-        "fast-json-stable-stringify": "2.0.0",
-        "json-schema-traverse": "0.3.1"
+        "co": "^4.6.0",
+        "json-stable-stringify": "^1.0.1"
       }
     },
     "ajv-keywords": {
@@ -73,9 +71,9 @@
       "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
       "dev": true,
       "requires": {
-        "kind-of": "3.2.2",
-        "longest": "1.0.1",
-        "repeat-string": "1.6.1"
+        "kind-of": "^3.0.2",
+        "longest": "^1.0.1",
+        "repeat-string": "^1.5.2"
       },
       "dependencies": {
         "kind-of": {
@@ -84,7 +82,7 @@
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "is-buffer": "1.1.6"
+            "is-buffer": "^1.1.5"
           }
         }
       }
       "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
       "dev": true,
       "requires": {
-        "ansi-wrap": "0.1.0"
+        "ansi-wrap": "^0.1.0"
       }
     },
     "ansi-escapes": {
       "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
       "dev": true,
       "requires": {
-        "micromatch": "2.3.11",
-        "normalize-path": "2.1.1"
+        "micromatch": "^2.1.5",
+        "normalize-path": "^2.0.0"
       },
       "dependencies": {
         "arr-diff": {
           "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
           "dev": true,
           "requires": {
-            "arr-flatten": "1.1.0"
+            "arr-flatten": "^1.0.1"
           }
         },
         "array-unique": {
           "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
           "dev": true,
           "requires": {
-            "expand-range": "1.8.2",
-            "preserve": "0.2.0",
-            "repeat-element": "1.1.2"
+            "expand-range": "^1.8.1",
+            "preserve": "^0.2.0",
+            "repeat-element": "^1.1.2"
           }
         },
         "expand-brackets": {
           "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
           "dev": true,
           "requires": {
-            "is-posix-bracket": "0.1.1"
+            "is-posix-bracket": "^0.1.0"
           }
         },
         "extglob": {
           "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
           "dev": true,
           "requires": {
-            "is-extglob": "1.0.0"
+            "is-extglob": "^1.0.0"
           }
         },
         "is-extglob": {
           "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
           "dev": true,
           "requires": {
-            "is-extglob": "1.0.0"
+            "is-extglob": "^1.0.0"
           }
         },
         "kind-of": {
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "is-buffer": "1.1.6"
+            "is-buffer": "^1.1.5"
           }
         },
         "micromatch": {
           "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
           "dev": true,
           "requires": {
-            "arr-diff": "2.0.0",
-            "array-unique": "0.2.1",
-            "braces": "1.8.5",
-            "expand-brackets": "0.1.5",
-            "extglob": "0.3.2",
-            "filename-regex": "2.0.1",
-            "is-extglob": "1.0.0",
-            "is-glob": "2.0.1",
-            "kind-of": "3.2.2",
-            "normalize-path": "2.1.1",
-            "object.omit": "2.0.1",
-            "parse-glob": "3.0.4",
-            "regex-cache": "0.4.4"
+            "arr-diff": "^2.0.0",
+            "array-unique": "^0.2.1",
+            "braces": "^1.8.2",
+            "expand-brackets": "^0.1.4",
+            "extglob": "^0.3.1",
+            "filename-regex": "^2.0.0",
+            "is-extglob": "^1.0.0",
+            "is-glob": "^2.0.1",
+            "kind-of": "^3.0.2",
+            "normalize-path": "^2.0.1",
+            "object.omit": "^2.0.0",
+            "parse-glob": "^3.0.4",
+            "regex-cache": "^0.4.2"
           }
         }
       }
     },
     "app-root-path": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz",
-      "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz",
+      "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=",
       "dev": true
     },
     "archy": {
       "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
       "dev": true,
       "requires": {
-        "sprintf-js": "1.0.3"
+        "sprintf-js": "~1.0.2"
       }
     },
     "arr-diff": {
       "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
       "dev": true,
       "requires": {
-        "array-uniq": "1.0.3"
+        "array-uniq": "^1.0.1"
       }
     },
     "array-uniq": {
       "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=",
       "dev": true,
       "requires": {
-        "define-properties": "1.1.2",
-        "es-abstract": "1.10.0"
+        "define-properties": "^1.1.2",
+        "es-abstract": "^1.7.0"
       }
     },
     "arraybuffer.slice": {
       "integrity": "sha1-dJRAWIh9goPhidlUYAlHvJj+AGI=",
       "dev": true,
       "requires": {
-        "escodegen": "1.2.0",
-        "esprima": "1.0.4",
-        "through": "2.3.8"
+        "escodegen": "~1.2.0",
+        "esprima": "~1.0.4",
+        "through": "~2.3.4"
       },
       "dependencies": {
         "escodegen": {
           "integrity": "sha1-Cd55Z3kcyVi3+Jot220jRRrzJ+E=",
           "dev": true,
           "requires": {
-            "esprima": "1.0.4",
-            "estraverse": "1.5.1",
-            "esutils": "1.0.0",
-            "source-map": "0.1.43"
+            "esprima": "~1.0.4",
+            "estraverse": "~1.5.0",
+            "esutils": "~1.0.0",
+            "source-map": "~0.1.30"
           }
         },
         "esprima": {
           "dev": true,
           "optional": true,
           "requires": {
-            "amdefine": "1.0.1"
+            "amdefine": ">=0.0.4"
           }
         }
       }
       "dev": true
     },
     "atob": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz",
-      "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
+      "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=",
       "dev": true
     },
     "aws-sign2": {
       "dev": true
     },
     "aws4": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
-      "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
+      "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
       "dev": true
     },
     "babel-code-frame": {
       "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
       "dev": true,
       "requires": {
-        "chalk": "1.1.3",
-        "esutils": "2.0.2",
-        "js-tokens": "3.0.2"
+        "chalk": "^1.1.3",
+        "esutils": "^2.0.2",
+        "js-tokens": "^3.0.2"
       }
     },
     "babel-runtime": {
       "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
       "dev": true,
       "requires": {
-        "core-js": "2.5.3",
-        "regenerator-runtime": "0.11.1"
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
       }
     },
     "backo2": {
       "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
       "dev": true,
       "requires": {
-        "cache-base": "1.0.1",
-        "class-utils": "0.3.6",
-        "component-emitter": "1.2.1",
-        "define-property": "1.0.0",
-        "isobject": "3.0.1",
-        "mixin-deep": "1.3.1",
-        "pascalcase": "0.1.1"
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
       },
       "dependencies": {
         "define-property": {
           "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
           "dev": true,
           "requires": {
-            "is-descriptor": "1.0.2"
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
           }
         }
       }
       "dev": true
     },
     "base64-js": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz",
-      "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
+      "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
       "dev": true
     },
     "base64id": {
       "dev": true,
       "optional": true,
       "requires": {
-        "tweetnacl": "0.14.5"
+        "tweetnacl": "^0.14.3"
       }
     },
     "beeper": {
       "dev": true
     },
     "body-parser": {
-      "version": "1.18.2",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
-      "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+      "version": "1.18.3",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
+      "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
       "dev": true,
       "requires": {
         "bytes": "3.0.0",
-        "content-type": "1.0.4",
+        "content-type": "~1.0.4",
         "debug": "2.6.9",
-        "depd": "1.1.2",
-        "http-errors": "1.6.2",
-        "iconv-lite": "0.4.19",
-        "on-finished": "2.3.0",
-        "qs": "6.5.1",
-        "raw-body": "2.3.2",
-        "type-is": "1.6.16"
+        "depd": "~1.1.2",
+        "http-errors": "~1.6.3",
+        "iconv-lite": "0.4.23",
+        "on-finished": "~2.3.0",
+        "qs": "6.5.2",
+        "raw-body": "2.3.3",
+        "type-is": "~1.6.16"
       },
       "dependencies": {
         "qs": {
-          "version": "6.5.1",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
-          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
           "dev": true
         }
       }
       "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
       "dev": true,
       "requires": {
-        "hoek": "2.16.3"
+        "hoek": "2.x.x"
       }
     },
     "brace-expansion": {
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
       "requires": {
-        "balanced-match": "1.0.0",
+        "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
     "braces": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz",
-      "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==",
-      "dev": true,
-      "requires": {
-        "arr-flatten": "1.1.0",
-        "array-unique": "0.3.2",
-        "define-property": "1.0.0",
-        "extend-shallow": "2.0.1",
-        "fill-range": "4.0.0",
-        "isobject": "3.0.1",
-        "kind-of": "6.0.2",
-        "repeat-element": "1.1.2",
-        "snapdragon": "0.8.1",
-        "snapdragon-node": "2.1.1",
-        "split-string": "3.1.0",
-        "to-regex": "3.0.2"
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
       },
       "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "1.0.2"
-          }
-        },
         "extend-shallow": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
           "dev": true,
           "requires": {
-            "is-extendable": "0.1.1"
+            "is-extendable": "^0.1.0"
           }
         }
       }
     },
     "brfs": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.4.4.tgz",
-      "integrity": "sha512-rX2qc9hkpLPiwdu1HkLY642rwwo3X6N+ZPyEPdNn3OUKV/B2BRP7dHdnkhGantOJLVoTluNYBi4VecHb2Kq2hw==",
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz",
+      "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==",
       "dev": true,
       "requires": {
-        "quote-stream": "1.0.2",
-        "resolve": "1.5.0",
-        "static-module": "2.1.1",
-        "through2": "2.0.3"
+        "quote-stream": "^1.0.1",
+        "resolve": "^1.1.5",
+        "static-module": "^2.2.0",
+        "through2": "^2.0.0"
       }
     },
     "brotli": {
       "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=",
       "dev": true,
       "requires": {
-        "base64-js": "1.2.3"
+        "base64-js": "^1.1.2"
       }
     },
     "browser-resolve": {
-      "version": "1.11.2",
-      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
-      "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=",
+      "version": "1.11.3",
+      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
+      "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
       "dev": true,
       "requires": {
         "resolve": "1.1.7"
       "dev": true,
       "requires": {
         "ast-transform": "0.0.0",
-        "ast-types": "0.7.8",
-        "browser-resolve": "1.11.2"
+        "ast-types": "^0.7.0",
+        "browser-resolve": "^1.8.1"
       }
     },
     "buffer-equal": {
       "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=",
       "dev": true
     },
+    "buffer-from": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz",
+      "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==",
+      "dev": true
+    },
     "bufferstreams": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.0.1.tgz",
       "integrity": "sha1-z7GtlWjTujz+k1upq92VLeiKqyo=",
       "dev": true,
       "requires": {
-        "readable-stream": "1.1.14"
+        "readable-stream": "^1.0.33"
       }
     },
     "builtin-modules": {
       "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
       "dev": true,
       "requires": {
-        "collection-visit": "1.0.0",
-        "component-emitter": "1.2.1",
-        "get-value": "2.0.6",
-        "has-value": "1.0.0",
-        "isobject": "3.0.1",
-        "set-value": "2.0.0",
-        "to-object-path": "0.3.0",
-        "union-value": "1.0.0",
-        "unset-value": "1.0.0"
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
       }
     },
     "caller-path": {
       "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
       "dev": true,
       "requires": {
-        "callsites": "0.2.0"
+        "callsites": "^0.2.0"
       }
     },
     "callsite": {
       "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
       "dev": true,
       "requires": {
-        "camelcase": "2.1.1",
-        "map-obj": "1.0.1"
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
       }
     },
     "caseless": {
       "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
       "dev": true,
       "requires": {
-        "align-text": "0.1.4",
-        "lazy-cache": "1.0.4"
-      },
-      "dependencies": {
-        "lazy-cache": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
-          "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
-          "dev": true
-        }
+        "align-text": "^0.1.3",
+        "lazy-cache": "^1.0.3"
       }
     },
     "chalk": {
       "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
       "dev": true,
       "requires": {
-        "ansi-styles": "2.2.1",
-        "escape-string-regexp": "1.0.5",
-        "has-ansi": "2.0.0",
-        "strip-ansi": "3.0.1",
-        "supports-color": "2.0.0"
+        "ansi-styles": "^2.2.1",
+        "escape-string-regexp": "^1.0.2",
+        "has-ansi": "^2.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^2.0.0"
       }
     },
     "chokidar": {
       "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
       "dev": true,
       "requires": {
-        "anymatch": "1.3.2",
-        "async-each": "1.0.1",
-        "fsevents": "1.1.3",
-        "glob-parent": "2.0.0",
-        "inherits": "2.0.3",
-        "is-binary-path": "1.0.1",
-        "is-glob": "2.0.1",
-        "path-is-absolute": "1.0.1",
-        "readdirp": "2.1.0"
+        "anymatch": "^1.3.0",
+        "async-each": "^1.0.0",
+        "fsevents": "^1.0.0",
+        "glob-parent": "^2.0.0",
+        "inherits": "^2.0.1",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^2.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.0.0"
       },
       "dependencies": {
         "is-extglob": {
           "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
           "dev": true,
           "requires": {
-            "is-extglob": "1.0.0"
+            "is-extglob": "^1.0.0"
           }
         }
       }
       "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
       "dev": true,
       "requires": {
-        "arr-union": "3.1.0",
-        "define-property": "0.2.5",
-        "isobject": "3.0.1",
-        "static-extend": "0.1.2"
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
       },
       "dependencies": {
         "define-property": {
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "is-descriptor": "0.1.6"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.6"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.6"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "0.1.6",
-            "is-data-descriptor": "0.1.4",
-            "kind-of": "5.1.0"
+            "is-descriptor": "^0.1.0"
           }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
         }
       }
     },
       "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
       "dev": true,
       "requires": {
-        "restore-cursor": "1.0.1"
+        "restore-cursor": "^1.0.1"
       }
     },
     "cli-width": {
       "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
       "dev": true,
       "requires": {
-        "string-width": "1.0.2",
-        "strip-ansi": "3.0.1",
-        "wrap-ansi": "2.1.0"
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wrap-ansi": "^2.0.0"
       }
     },
     "clone": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
-      "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
       "dev": true
     },
     "clone-buffer": {
       "dev": true
     },
     "cloneable-readable": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz",
-      "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
+      "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
       "dev": true,
       "requires": {
-        "inherits": "2.0.3",
-        "process-nextick-args": "1.0.7",
-        "through2": "2.0.3"
+        "inherits": "^2.0.1",
+        "process-nextick-args": "^2.0.0",
+        "readable-stream": "^2.3.5"
       },
       "dependencies": {
-        "process-nextick-args": {
-          "version": "1.0.7",
-          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
-          "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
           "dev": true
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "dev": true,
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
         }
       }
     },
       "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
       "dev": true,
       "requires": {
-        "map-visit": "1.0.0",
-        "object-visit": "1.0.1"
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
       }
     },
     "color-support": {
       "dev": true
     },
     "colors": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
-      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz",
+      "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==",
       "dev": true
     },
     "combine-lists": {
       "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
       "dev": true,
       "requires": {
-        "lodash": "4.17.5"
+        "lodash": "^4.5.0"
       },
       "dependencies": {
         "lodash": {
-          "version": "4.17.5",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
-          "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
           "dev": true
         }
       }
       "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
       "dev": true,
       "requires": {
-        "delayed-stream": "1.0.0"
+        "delayed-stream": "~1.0.0"
       }
     },
     "commander": {
-      "version": "2.14.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
-      "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==",
+      "version": "2.15.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+      "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
       "dev": true
     },
     "component-bind": {
       "dev": true
     },
     "concat-stream": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
-      "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
       "dev": true,
       "requires": {
-        "inherits": "2.0.3",
-        "readable-stream": "2.3.4",
-        "typedarray": "0.0.6"
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
       },
       "dependencies": {
         "isarray": {
           "dev": true
         },
         "readable-stream": {
-          "version": "2.3.4",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz",
-          "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==",
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "1.0.0",
-            "process-nextick-args": "2.0.0",
-            "safe-buffer": "5.1.1",
-            "string_decoder": "1.0.3",
-            "util-deprecate": "1.0.2"
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
           }
         },
         "string_decoder": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
-          "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
           "dev": true,
           "requires": {
-            "safe-buffer": "5.1.1"
+            "safe-buffer": "~5.1.0"
           }
         }
       }
     },
     "concat-with-sourcemaps": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.5.tgz",
-      "integrity": "sha512-YtnS0VEY+e2Khzsey/6mra9EoM6h/5gxaC0e3mcHpA5yfDxafhygytNmcJWodvUgyXzSiL5MSkPO6bQGgfliHw==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+      "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
       "dev": true,
       "requires": {
-        "source-map": "0.6.1"
+        "source-map": "^0.6.1"
       },
       "dependencies": {
         "source-map": {
       "requires": {
         "debug": "2.6.9",
         "finalhandler": "1.1.0",
-        "parseurl": "1.3.2",
+        "parseurl": "~1.3.2",
         "utils-merge": "1.0.1"
       }
     },
       "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=",
       "dev": true,
       "requires": {
-        "bluebird": "3.5.1"
+        "bluebird": "^3.1.1"
       }
     },
     "contains-path": {
       "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
       "dev": true
     },
+    "convert-source-map": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+      "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+      "dev": true
+    },
     "cookie": {
       "version": "0.3.1",
       "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
       "integrity": "sha1-8DJLvumXcRAeezraES8xPDk9uO0=",
       "dev": true,
       "requires": {
-        "each-props": "1.3.1",
-        "is-plain-object": "2.0.4"
+        "each-props": "^1.2.1",
+        "is-plain-object": "^2.0.1"
       }
     },
     "core-js": {
-      "version": "2.5.3",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
-      "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+      "version": "2.5.7",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
+      "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
       "dev": true
     },
     "core-util-is": {
           "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
           "dev": true,
           "requires": {
-            "aws-sign2": "0.6.0",
-            "aws4": "1.6.0",
-            "caseless": "0.11.0",
-            "combined-stream": "1.0.6",
-            "extend": "3.0.1",
-            "forever-agent": "0.6.1",
-            "form-data": "2.1.4",
-            "har-validator": "2.0.6",
-            "hawk": "3.1.3",
-            "http-signature": "1.1.1",
-            "is-typedarray": "1.0.0",
-            "isstream": "0.1.2",
-            "json-stringify-safe": "5.0.1",
-            "mime-types": "2.1.18",
-            "oauth-sign": "0.8.2",
-            "qs": "6.3.2",
-            "stringstream": "0.0.5",
-            "tough-cookie": "2.3.3",
-            "tunnel-agent": "0.4.3",
-            "uuid": "3.2.1"
+            "aws-sign2": "~0.6.0",
+            "aws4": "^1.2.1",
+            "caseless": "~0.11.0",
+            "combined-stream": "~1.0.5",
+            "extend": "~3.0.0",
+            "forever-agent": "~0.6.1",
+            "form-data": "~2.1.1",
+            "har-validator": "~2.0.6",
+            "hawk": "~3.1.3",
+            "http-signature": "~1.1.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.7",
+            "oauth-sign": "~0.8.1",
+            "qs": "~6.3.0",
+            "stringstream": "~0.0.4",
+            "tough-cookie": "~2.3.0",
+            "tunnel-agent": "~0.4.1",
+            "uuid": "^3.0.0"
           }
         }
       }
       "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
       "dev": true,
       "requires": {
-        "boom": "2.10.1"
+        "boom": "2.x.x"
       }
     },
     "currently-unhandled": {
       "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
       "dev": true,
       "requires": {
-        "array-find-index": "1.0.2"
+        "array-find-index": "^1.0.1"
       }
     },
     "custom-event": {
       "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
       "dev": true,
       "requires": {
-        "es5-ext": "0.10.39"
+        "es5-ext": "^0.10.9"
       }
     },
     "dashdash": {
       "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
       "dev": true,
       "requires": {
-        "assert-plus": "1.0.0"
+        "assert-plus": "^1.0.0"
       },
       "dependencies": {
         "assert-plus": {
       "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=",
       "dev": true,
       "requires": {
-        "is-obj": "1.0.1"
+        "is-obj": "^1.0.0"
       }
     },
     "deep-equal": {
       "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
       "dev": true,
       "requires": {
-        "clone": "1.0.3"
+        "clone": "^1.0.2"
       }
     },
     "define-properties": {
       "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
       "dev": true,
       "requires": {
-        "foreach": "2.0.5",
-        "object-keys": "1.0.11"
+        "foreach": "^2.0.5",
+        "object-keys": "^1.0.8"
       }
     },
     "define-property": {
       "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
       "dev": true,
       "requires": {
-        "is-descriptor": "1.0.2",
-        "isobject": "3.0.1"
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
       }
     },
     "deglob": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
-      "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz",
+      "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==",
       "dev": true,
       "requires": {
-        "find-root": "1.1.0",
-        "glob": "7.1.2",
-        "ignore": "3.3.7",
-        "pkg-config": "1.1.1",
-        "run-parallel": "1.1.7",
-        "uniq": "1.0.1"
+        "find-root": "^1.0.0",
+        "glob": "^7.0.5",
+        "ignore": "^3.0.9",
+        "pkg-config": "^1.1.0",
+        "run-parallel": "^1.1.2",
+        "uniq": "^1.0.1"
       }
     },
     "del": {
       "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
       "dev": true,
       "requires": {
-        "globby": "5.0.0",
-        "is-path-cwd": "1.0.0",
-        "is-path-in-cwd": "1.0.0",
-        "object-assign": "4.1.1",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1",
-        "rimraf": "2.6.2"
+        "globby": "^5.0.0",
+        "is-path-cwd": "^1.0.0",
+        "is-path-in-cwd": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "rimraf": "^2.2.8"
       }
     },
     "delayed-stream": {
       "integrity": "sha1-0wIYvRDQMPpCHfPrvIIoVGOjF4E=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "babel-runtime": "^6.11.6"
       }
     },
     "di": {
       "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
       "dev": true,
       "requires": {
-        "esutils": "2.0.2"
+        "esutils": "^2.0.2"
       }
     },
     "dom-serialize": {
       "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
       "dev": true,
       "requires": {
-        "custom-event": "1.0.1",
-        "ent": "2.2.0",
-        "extend": "3.0.1",
-        "void-elements": "2.0.1"
+        "custom-event": "~1.0.0",
+        "ent": "~2.2.0",
+        "extend": "^3.0.0",
+        "void-elements": "^2.0.0"
       }
     },
     "duplexer": {
       "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
       "dev": true,
       "requires": {
-        "readable-stream": "1.1.14"
+        "readable-stream": "~1.1.9"
       }
     },
     "each-props": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.1.tgz",
-      "integrity": "sha1-/BOPUeOid0KG1IWOAtbn3kYt4Vg=",
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
+      "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
       "dev": true,
       "requires": {
-        "is-plain-object": "2.0.4",
-        "object.defaults": "1.1.0"
+        "is-plain-object": "^2.0.1",
+        "object.defaults": "^1.1.0"
       }
     },
     "ecc-jsbn": {
       "dev": true,
       "optional": true,
       "requires": {
-        "jsbn": "0.1.1"
+        "jsbn": "~0.1.0"
       }
     },
     "ee-first": {
       "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
       "dev": true,
       "requires": {
-        "once": "1.3.3"
+        "once": "~1.3.0"
       },
       "dependencies": {
         "once": {
           "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
           "dev": true,
           "requires": {
-            "wrappy": "1.0.2"
+            "wrappy": "1"
           }
         }
       }
       "dev": true
     },
     "error-ex": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
-      "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
       "dev": true,
       "requires": {
-        "is-arrayish": "0.2.1"
+        "is-arrayish": "^0.2.1"
       }
     },
     "es-abstract": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz",
-      "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==",
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
+      "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
       "dev": true,
       "requires": {
-        "es-to-primitive": "1.1.1",
-        "function-bind": "1.1.1",
-        "has": "1.0.1",
-        "is-callable": "1.1.3",
-        "is-regex": "1.0.4"
+        "es-to-primitive": "^1.1.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.1",
+        "is-callable": "^1.1.3",
+        "is-regex": "^1.0.4"
       }
     },
     "es-to-primitive": {
       "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
       "dev": true,
       "requires": {
-        "is-callable": "1.1.3",
-        "is-date-object": "1.0.1",
-        "is-symbol": "1.0.1"
+        "is-callable": "^1.1.1",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.1"
       }
     },
     "es5-ext": {
-      "version": "0.10.39",
-      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.39.tgz",
-      "integrity": "sha512-AlaXZhPHl0po/uxMx1tyrlt1O86M6D5iVaDH8UgLfgek4kXTX6vzsRfJQWC2Ku+aG8pkw1XWzh9eTkwfVrsD5g==",
+      "version": "0.10.45",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz",
+      "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==",
       "dev": true,
       "requires": {
-        "es6-iterator": "2.0.3",
-        "es6-symbol": "3.1.1"
+        "es6-iterator": "~2.0.3",
+        "es6-symbol": "~3.1.1",
+        "next-tick": "1"
       }
     },
     "es6-iterator": {
       "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.39",
-        "es6-symbol": "3.1.1"
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
       }
     },
     "es6-map": {
       "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.39",
-        "es6-iterator": "2.0.3",
-        "es6-set": "0.1.5",
-        "es6-symbol": "3.1.1",
-        "event-emitter": "0.3.5"
+        "d": "1",
+        "es5-ext": "~0.10.14",
+        "es6-iterator": "~2.0.1",
+        "es6-set": "~0.1.5",
+        "es6-symbol": "~3.1.1",
+        "event-emitter": "~0.3.5"
       }
     },
     "es6-promise": {
       "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.39",
-        "es6-iterator": "2.0.3",
+        "d": "1",
+        "es5-ext": "~0.10.14",
+        "es6-iterator": "~2.0.1",
         "es6-symbol": "3.1.1",
-        "event-emitter": "0.3.5"
+        "event-emitter": "~0.3.5"
       }
     },
     "es6-symbol": {
       "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.39"
+        "d": "1",
+        "es5-ext": "~0.10.14"
       }
     },
     "es6-weak-map": {
       "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.39",
-        "es6-iterator": "2.0.3",
-        "es6-symbol": "3.1.1"
+        "d": "1",
+        "es5-ext": "^0.10.14",
+        "es6-iterator": "^2.0.1",
+        "es6-symbol": "^3.1.1"
       }
     },
     "escape-html": {
       "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
       "dev": true,
       "requires": {
-        "esprima": "2.7.3",
-        "estraverse": "1.9.3",
-        "esutils": "2.0.2",
-        "optionator": "0.8.2",
-        "source-map": "0.2.0"
+        "esprima": "^2.7.1",
+        "estraverse": "^1.9.1",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1",
+        "source-map": "~0.2.0"
       },
       "dependencies": {
+        "estraverse": {
+          "version": "1.9.3",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+          "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+          "dev": true
+        },
         "source-map": {
           "version": "0.2.0",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
           "dev": true,
           "optional": true,
           "requires": {
-            "amdefine": "1.0.1"
+            "amdefine": ">=0.0.4"
           }
         }
       }
       "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
       "dev": true,
       "requires": {
-        "es6-map": "0.1.5",
-        "es6-weak-map": "2.0.2",
-        "esrecurse": "4.2.0",
-        "estraverse": "4.2.0"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-          "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-          "dev": true
-        }
+        "es6-map": "^0.1.3",
+        "es6-weak-map": "^2.0.1",
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
       }
     },
     "eslint": {
-      "version": "3.18.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.18.0.tgz",
-      "integrity": "sha1-ZH6YXErnFQLSCsYsEJ9m1RBMiks=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "6.26.0",
-        "chalk": "1.1.3",
-        "concat-stream": "1.6.0",
-        "debug": "2.6.9",
-        "doctrine": "2.1.0",
-        "escope": "3.6.0",
-        "espree": "3.5.3",
-        "esquery": "1.0.0",
-        "estraverse": "4.2.0",
-        "esutils": "2.0.2",
-        "file-entry-cache": "2.0.0",
-        "glob": "7.1.2",
-        "globals": "9.18.0",
-        "ignore": "3.3.7",
-        "imurmurhash": "0.1.4",
-        "inquirer": "0.12.0",
-        "is-my-json-valid": "2.17.2",
-        "is-resolvable": "1.1.0",
-        "js-yaml": "3.6.1",
-        "json-stable-stringify": "1.0.1",
-        "levn": "0.3.0",
-        "lodash": "4.17.5",
-        "mkdirp": "0.5.1",
-        "natural-compare": "1.4.0",
-        "optionator": "0.8.2",
-        "path-is-inside": "1.0.2",
-        "pluralize": "1.2.1",
-        "progress": "1.1.8",
-        "require-uncached": "1.0.3",
-        "shelljs": "0.7.8",
-        "strip-bom": "3.0.0",
-        "strip-json-comments": "2.0.1",
-        "table": "3.8.3",
-        "text-table": "0.2.0",
-        "user-home": "2.0.0"
+      "version": "3.19.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz",
+      "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "^6.16.0",
+        "chalk": "^1.1.3",
+        "concat-stream": "^1.5.2",
+        "debug": "^2.1.1",
+        "doctrine": "^2.0.0",
+        "escope": "^3.6.0",
+        "espree": "^3.4.0",
+        "esquery": "^1.0.0",
+        "estraverse": "^4.2.0",
+        "esutils": "^2.0.2",
+        "file-entry-cache": "^2.0.0",
+        "glob": "^7.0.3",
+        "globals": "^9.14.0",
+        "ignore": "^3.2.0",
+        "imurmurhash": "^0.1.4",
+        "inquirer": "^0.12.0",
+        "is-my-json-valid": "^2.10.0",
+        "is-resolvable": "^1.0.0",
+        "js-yaml": "^3.5.1",
+        "json-stable-stringify": "^1.0.0",
+        "levn": "^0.3.0",
+        "lodash": "^4.0.0",
+        "mkdirp": "^0.5.0",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.8.2",
+        "path-is-inside": "^1.0.1",
+        "pluralize": "^1.2.1",
+        "progress": "^1.1.8",
+        "require-uncached": "^1.0.2",
+        "shelljs": "^0.7.5",
+        "strip-bom": "^3.0.0",
+        "strip-json-comments": "~2.0.1",
+        "table": "^3.7.8",
+        "text-table": "~0.2.0",
+        "user-home": "^2.0.0"
       },
       "dependencies": {
-        "estraverse": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-          "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-          "dev": true
-        },
         "lodash": {
-          "version": "4.17.5",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
-          "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
           "dev": true
         },
         "strip-bom": {
           "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
           "dev": true,
           "requires": {
-            "os-homedir": "1.0.2"
+            "os-homedir": "^1.0.0"
           }
         }
       }
     },
     "eslint-config-standard": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-7.1.0.tgz",
-      "integrity": "sha1-R+dp6gc59bLVaTsaUBwhyWUPr88=",
+      "version": "10.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz",
+      "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=",
       "dev": true
     },
     "eslint-config-standard-jsx": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.3.0.tgz",
-      "integrity": "sha1-yrCAGhWjYL9j+suXqyL73YjYpeA=",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz",
+      "integrity": "sha512-F8fRh2WFnTek7dZH9ZaE0PCBwdVGkwVWZmizla/DDNOmg7Tx6B/IlK5+oYpiX29jpu73LszeJj5i1axEZv6VMw==",
       "dev": true
     },
     "eslint-import-resolver-node": {
       "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=",
       "dev": true,
       "requires": {
-        "debug": "2.6.9",
-        "object-assign": "4.1.1",
-        "resolve": "1.5.0"
+        "debug": "^2.2.0",
+        "object-assign": "^4.0.1",
+        "resolve": "^1.1.6"
       }
     },
     "eslint-module-utils": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz",
-      "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz",
+      "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=",
       "dev": true,
       "requires": {
-        "debug": "2.6.9",
-        "pkg-dir": "1.0.0"
+        "debug": "^2.6.8",
+        "pkg-dir": "^1.0.0"
       }
     },
     "eslint-plugin-import": {
       "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=",
       "dev": true,
       "requires": {
-        "builtin-modules": "1.1.1",
-        "contains-path": "0.1.0",
-        "debug": "2.6.9",
+        "builtin-modules": "^1.1.1",
+        "contains-path": "^0.1.0",
+        "debug": "^2.2.0",
         "doctrine": "1.5.0",
-        "eslint-import-resolver-node": "0.2.3",
-        "eslint-module-utils": "2.1.1",
-        "has": "1.0.1",
-        "lodash.cond": "4.5.2",
-        "minimatch": "3.0.4",
-        "pkg-up": "1.0.0"
+        "eslint-import-resolver-node": "^0.2.0",
+        "eslint-module-utils": "^2.0.0",
+        "has": "^1.0.1",
+        "lodash.cond": "^4.3.0",
+        "minimatch": "^3.0.3",
+        "pkg-up": "^1.0.0"
       },
       "dependencies": {
         "doctrine": {
           "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
           "dev": true,
           "requires": {
-            "esutils": "2.0.2",
-            "isarray": "1.0.0"
+            "esutils": "^2.0.2",
+            "isarray": "^1.0.0"
           }
         },
         "isarray": {
       "integrity": "sha512-vIUQPuwbVYdz/CYnlTLsJrRy7iXHQjdEe5wz0XhhdTym3IInM/zZLlPf9nZ2mThsH0QcsieCOWs2vOeCy/22LQ==",
       "dev": true,
       "requires": {
-        "ignore": "3.3.7",
-        "minimatch": "3.0.4",
-        "object-assign": "4.1.1",
-        "resolve": "1.5.0",
+        "ignore": "^3.0.11",
+        "minimatch": "^3.0.2",
+        "object-assign": "^4.0.1",
+        "resolve": "^1.1.7",
         "semver": "5.3.0"
       },
       "dependencies": {
       }
     },
     "eslint-plugin-promise": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.4.2.tgz",
-      "integrity": "sha1-G+J5Pq/i0YtbEjuBNsJp+AT+cSI=",
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz",
+      "integrity": "sha1-ePu2/+BHIBYnVp6FpsU3OvKmj8o=",
       "dev": true
     },
     "eslint-plugin-react": {
-      "version": "6.9.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.9.0.tgz",
-      "integrity": "sha1-VMLpkGt2+dEBQgML3DTp1oQKC7I=",
+      "version": "6.10.3",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz",
+      "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=",
       "dev": true,
       "requires": {
-        "array.prototype.find": "2.0.4",
-        "doctrine": "1.5.0",
-        "jsx-ast-utils": "1.4.1"
+        "array.prototype.find": "^2.0.1",
+        "doctrine": "^1.2.2",
+        "has": "^1.0.1",
+        "jsx-ast-utils": "^1.3.4",
+        "object.assign": "^4.0.4"
       },
       "dependencies": {
         "doctrine": {
           "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
           "dev": true,
           "requires": {
-            "esutils": "2.0.2",
-            "isarray": "1.0.0"
+            "esutils": "^2.0.2",
+            "isarray": "^1.0.0"
           }
         },
         "isarray": {
       }
     },
     "eslint-plugin-standard": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz",
-      "integrity": "sha1-NYlpn/nJF/LCX3apFmh/ZBw2n/M=",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz",
+      "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=",
       "dev": true
     },
     "espree": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz",
-      "integrity": "sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ==",
+      "version": "3.5.4",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+      "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
       "dev": true,
       "requires": {
-        "acorn": "5.4.1",
-        "acorn-jsx": "3.0.1"
+        "acorn": "^5.5.0",
+        "acorn-jsx": "^3.0.0"
       }
     },
     "esprima": {
       "dev": true
     },
     "esquery": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
-      "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
+      "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
       "dev": true,
       "requires": {
-        "estraverse": "4.2.0"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-          "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-          "dev": true
-        }
+        "estraverse": "^4.0.0"
       }
     },
     "esrecurse": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
-      "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
       "dev": true,
       "requires": {
-        "estraverse": "4.2.0",
-        "object-assign": "4.1.1"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-          "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-          "dev": true
-        }
+        "estraverse": "^4.1.0"
       }
     },
     "estraverse": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
-      "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
       "dev": true
     },
     "esutils": {
       "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
       "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.39"
+        "d": "1",
+        "es5-ext": "~0.10.14"
       }
     },
     "eventemitter3": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
-      "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
+      "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
       "dev": true
     },
     "exit-hook": {
       "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
       "dev": true,
       "requires": {
-        "array-slice": "0.2.3",
-        "array-unique": "0.2.1",
-        "braces": "0.1.5"
+        "array-slice": "^0.2.3",
+        "array-unique": "^0.2.1",
+        "braces": "^0.1.2"
       },
       "dependencies": {
         "array-slice": {
           "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
           "dev": true,
           "requires": {
-            "expand-range": "0.1.1"
+            "expand-range": "^0.1.0"
           }
         },
         "expand-range": {
           "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
           "dev": true,
           "requires": {
-            "is-number": "0.1.1",
-            "repeat-string": "0.2.2"
+            "is-number": "^0.1.1",
+            "repeat-string": "^0.2.2"
           }
         },
         "is-number": {
       "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
       "dev": true,
       "requires": {
-        "debug": "2.6.9",
-        "define-property": "0.2.5",
-        "extend-shallow": "2.0.1",
-        "posix-character-classes": "0.1.1",
-        "regex-not": "1.0.2",
-        "snapdragon": "0.8.1",
-        "to-regex": "3.0.2"
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
       },
       "dependencies": {
         "define-property": {
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "is-descriptor": "0.1.6"
+            "is-descriptor": "^0.1.0"
           }
         },
         "extend-shallow": {
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
           "dev": true,
           "requires": {
-            "is-extendable": "0.1.1"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.6"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.6"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "0.1.6",
-            "is-data-descriptor": "0.1.4",
-            "kind-of": "5.1.0"
+            "is-extendable": "^0.1.0"
           }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
         }
       }
     },
       "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
       "dev": true,
       "requires": {
-        "fill-range": "2.2.3"
+        "fill-range": "^2.1.0"
       },
       "dependencies": {
         "fill-range": {
-          "version": "2.2.3",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
-          "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+          "version": "2.2.4",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+          "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
           "dev": true,
           "requires": {
-            "is-number": "2.1.0",
-            "isobject": "2.1.0",
-            "randomatic": "1.1.7",
-            "repeat-element": "1.1.2",
-            "repeat-string": "1.6.1"
+            "is-number": "^2.1.0",
+            "isobject": "^2.0.0",
+            "randomatic": "^3.0.0",
+            "repeat-element": "^1.1.2",
+            "repeat-string": "^1.5.2"
           }
         },
         "is-number": {
           "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
           "dev": true,
           "requires": {
-            "kind-of": "3.2.2"
+            "kind-of": "^3.0.2"
           }
         },
         "isarray": {
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "is-buffer": "1.1.6"
+            "is-buffer": "^1.1.5"
           }
         }
       }
       "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
       "dev": true,
       "requires": {
-        "homedir-polyfill": "1.0.1"
+        "homedir-polyfill": "^1.0.1"
       }
     },
     "extend": {
       "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
       "dev": true,
       "requires": {
-        "assign-symbols": "1.0.0",
-        "is-extendable": "1.0.1"
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
       },
       "dependencies": {
         "is-extendable": {
           "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
           "dev": true,
           "requires": {
-            "is-plain-object": "2.0.4"
+            "is-plain-object": "^2.0.4"
           }
         }
       }
       "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
       "dev": true,
       "requires": {
-        "array-unique": "0.3.2",
-        "define-property": "1.0.0",
-        "expand-brackets": "2.1.4",
-        "extend-shallow": "2.0.1",
-        "fragment-cache": "0.2.1",
-        "regex-not": "1.0.2",
-        "snapdragon": "0.8.1",
-        "to-regex": "3.0.2"
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
       },
       "dependencies": {
         "define-property": {
           "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
           "dev": true,
           "requires": {
-            "is-descriptor": "1.0.2"
+            "is-descriptor": "^1.0.0"
           }
         },
         "extend-shallow": {
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
           "dev": true,
           "requires": {
-            "is-extendable": "0.1.1"
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
           }
         }
       }
     },
     "extract-zip": {
-      "version": "1.6.6",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz",
-      "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=",
+      "version": "1.6.7",
+      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
+      "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
       "dev": true,
       "requires": {
-        "concat-stream": "1.6.0",
+        "concat-stream": "1.6.2",
         "debug": "2.6.9",
-        "mkdirp": "0.5.0",
+        "mkdirp": "0.5.1",
         "yauzl": "2.4.1"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "0.0.8",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
-          "dev": true
-        },
-        "mkdirp": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
-          "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
-          "dev": true,
-          "requires": {
-            "minimist": "0.0.8"
-          }
-        }
       }
     },
     "extsprintf": {
       "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=",
       "dev": true,
       "requires": {
-        "acorn": "5.4.1",
-        "foreach": "2.0.5",
+        "acorn": "^5.0.0",
+        "foreach": "^2.0.5",
         "isarray": "0.0.1",
-        "object-keys": "1.0.11"
+        "object-keys": "^1.0.6"
       }
     },
     "fancy-log": {
       "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
       "dev": true,
       "requires": {
-        "ansi-gray": "0.1.1",
-        "color-support": "1.1.3",
-        "time-stamp": "1.1.0"
+        "ansi-gray": "^0.1.1",
+        "color-support": "^1.1.3",
+        "time-stamp": "^1.0.0"
       }
     },
     "fast-deep-equal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
-      "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+      "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
       "dev": true
     },
     "fast-json-stable-stringify": {
       "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
       "dev": true,
       "requires": {
-        "pend": "1.2.0"
+        "pend": "~1.2.0"
       }
     },
     "figures": {
       "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
       "dev": true,
       "requires": {
-        "escape-string-regexp": "1.0.5",
-        "object-assign": "4.1.1"
+        "escape-string-regexp": "^1.0.5",
+        "object-assign": "^4.1.0"
       }
     },
     "file-entry-cache": {
       "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
       "dev": true,
       "requires": {
-        "flat-cache": "1.3.0",
-        "object-assign": "4.1.1"
+        "flat-cache": "^1.2.1",
+        "object-assign": "^4.0.1"
       }
     },
     "filename-regex": {
       "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
       "dev": true,
       "requires": {
-        "extend-shallow": "2.0.1",
-        "is-number": "3.0.0",
-        "repeat-string": "1.6.1",
-        "to-regex-range": "2.1.1"
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
       },
       "dependencies": {
         "extend-shallow": {
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
           "dev": true,
           "requires": {
-            "is-extendable": "0.1.1"
+            "is-extendable": "^0.1.0"
           }
         }
       }
       "dev": true,
       "requires": {
         "debug": "2.6.9",
-        "encodeurl": "1.0.2",
-        "escape-html": "1.0.3",
-        "on-finished": "2.3.0",
-        "parseurl": "1.3.2",
-        "statuses": "1.3.1",
-        "unpipe": "1.0.0"
+        "encodeurl": "~1.0.1",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.2",
+        "statuses": "~1.3.1",
+        "unpipe": "~1.0.0"
       },
       "dependencies": {
         "statuses": {
       "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
       "dev": true,
       "requires": {
-        "path-exists": "2.1.0",
-        "pinkie-promise": "2.0.1"
+        "path-exists": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
       }
     },
     "findup-sync": {
       "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
       "dev": true,
       "requires": {
-        "detect-file": "1.0.0",
-        "is-glob": "3.1.0",
-        "micromatch": "3.1.9",
-        "resolve-dir": "1.0.1"
+        "detect-file": "^1.0.0",
+        "is-glob": "^3.1.0",
+        "micromatch": "^3.0.4",
+        "resolve-dir": "^1.0.1"
       }
     },
     "fined": {
       "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
       "dev": true,
       "requires": {
-        "expand-tilde": "2.0.2",
-        "is-plain-object": "2.0.4",
-        "object.defaults": "1.1.0",
-        "object.pick": "1.3.0",
-        "parse-filepath": "1.0.2"
+        "expand-tilde": "^2.0.2",
+        "is-plain-object": "^2.0.3",
+        "object.defaults": "^1.1.0",
+        "object.pick": "^1.2.0",
+        "parse-filepath": "^1.0.1"
       }
     },
     "first-chunk-stream": {
       "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
       "dev": true,
       "requires": {
-        "circular-json": "0.3.3",
-        "del": "2.2.2",
-        "graceful-fs": "4.1.11",
-        "write": "0.2.1"
+        "circular-json": "^0.3.1",
+        "del": "^2.0.2",
+        "graceful-fs": "^4.1.2",
+        "write": "^0.2.1"
       },
       "dependencies": {
         "graceful-fs": {
         }
       }
     },
+    "follow-redirects": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz",
+      "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==",
+      "dev": true,
+      "requires": {
+        "debug": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
     "fontkit": {
       "version": "1.7.7",
       "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.7.7.tgz",
       "integrity": "sha1-668tjz/t8wKuPGS0vurdwkf827E=",
       "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "brfs": "1.4.4",
-        "brotli": "1.3.2",
-        "browserify-optional": "1.0.1",
-        "clone": "1.0.3",
-        "deep-equal": "1.0.1",
-        "dfa": "1.1.0",
-        "restructure": "0.5.4",
-        "tiny-inflate": "1.0.2",
-        "unicode-properties": "1.1.0",
-        "unicode-trie": "0.3.1"
+        "babel-runtime": "^6.11.6",
+        "brfs": "^1.4.0",
+        "brotli": "^1.2.0",
+        "browserify-optional": "^1.0.0",
+        "clone": "^1.0.1",
+        "deep-equal": "^1.0.0",
+        "dfa": "^1.0.0",
+        "restructure": "^0.5.3",
+        "tiny-inflate": "^1.0.2",
+        "unicode-properties": "^1.0.0",
+        "unicode-trie": "^0.3.0"
       }
     },
     "for-in": {
       "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
       "dev": true,
       "requires": {
-        "for-in": "1.0.2"
+        "for-in": "^1.0.1"
       }
     },
     "foreach": {
       "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
       "dev": true,
       "requires": {
-        "asynckit": "0.4.0",
-        "combined-stream": "1.0.6",
-        "mime-types": "2.1.18"
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.5",
+        "mime-types": "^2.1.12"
       }
     },
     "fragment-cache": {
       "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
       "dev": true,
       "requires": {
-        "map-cache": "0.2.2"
+        "map-cache": "^0.2.2"
       }
     },
     "fs-extra": {
       "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "jsonfile": "2.4.0",
-        "klaw": "1.3.1"
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^2.1.0",
+        "klaw": "^1.0.0"
       },
       "dependencies": {
         "graceful-fs": {
       "integrity": "sha1-gAI4I5gfn//+AWCei+Zo9prknnA=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11"
+        "graceful-fs": "^4.1.2"
       },
       "dependencies": {
         "graceful-fs": {
       "dev": true
     },
     "fsevents": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
-      "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
+      "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
       "dev": true,
       "optional": true,
       "requires": {
-        "nan": "2.9.2",
-        "node-pre-gyp": "0.6.39"
+        "nan": "^2.9.2",
+        "node-pre-gyp": "^0.10.0"
       },
       "dependencies": {
         "abbrev": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz",
-          "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=",
+          "version": "1.1.1",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
-        "ajv": {
-          "version": "4.11.8",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
-          "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "co": "4.6.0",
-            "json-stable-stringify": "1.0.1"
-          }
-        },
         "ansi-regex": {
           "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "bundled": true,
           "dev": true
         },
         "aproba": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz",
-          "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=",
+          "version": "1.2.0",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "are-we-there-yet": {
           "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
-          "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "delegates": "1.0.0",
-            "readable-stream": "2.2.9"
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.6"
           }
         },
-        "asn1": {
-          "version": "0.2.3",
-          "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
-          "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
-          "dev": true,
-          "optional": true
-        },
-        "assert-plus": {
-          "version": "0.2.0",
-          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
-          "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
-          "dev": true,
-          "optional": true
-        },
-        "asynckit": {
-          "version": "0.4.0",
-          "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-          "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-          "dev": true,
-          "optional": true
-        },
-        "aws-sign2": {
-          "version": "0.6.0",
-          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
-          "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
-          "dev": true,
-          "optional": true
-        },
-        "aws4": {
-          "version": "1.6.0",
-          "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
-          "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
-          "dev": true,
-          "optional": true
-        },
         "balanced-match": {
-          "version": "0.4.2",
-          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
-          "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
+          "version": "1.0.0",
+          "bundled": true,
           "dev": true
         },
-        "bcrypt-pbkdf": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
-          "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "tweetnacl": "0.14.5"
-          }
-        },
-        "block-stream": {
-          "version": "0.0.9",
-          "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
-          "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
-          "dev": true,
-          "requires": {
-            "inherits": "2.0.3"
-          }
-        },
-        "boom": {
-          "version": "2.10.1",
-          "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
-          "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
-          "dev": true,
-          "requires": {
-            "hoek": "2.16.3"
-          }
-        },
         "brace-expansion": {
-          "version": "1.1.7",
-          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz",
-          "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=",
+          "version": "1.1.11",
+          "bundled": true,
           "dev": true,
           "requires": {
-            "balanced-match": "0.4.2",
+            "balanced-match": "^1.0.0",
             "concat-map": "0.0.1"
           }
         },
-        "buffer-shims": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
-          "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=",
-          "dev": true
-        },
-        "caseless": {
-          "version": "0.12.0",
-          "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-          "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
-          "dev": true,
-          "optional": true
-        },
-        "co": {
-          "version": "4.6.0",
-          "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-          "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+        "chownr": {
+          "version": "1.0.1",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "code-point-at": {
           "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-          "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+          "bundled": true,
           "dev": true
         },
-        "combined-stream": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
-          "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
-          "dev": true,
-          "requires": {
-            "delayed-stream": "1.0.0"
-          }
-        },
         "concat-map": {
           "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-          "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+          "bundled": true,
           "dev": true
         },
         "console-control-strings": {
           "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-          "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+          "bundled": true,
           "dev": true
         },
         "core-util-is": {
           "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-          "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-          "dev": true
-        },
-        "cryptiles": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
-          "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
-          "dev": true,
-          "requires": {
-            "boom": "2.10.1"
-          }
-        },
-        "dashdash": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-          "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+          "bundled": true,
           "dev": true,
-          "optional": true,
-          "requires": {
-            "assert-plus": "1.0.0"
-          },
-          "dependencies": {
-            "assert-plus": {
-              "version": "1.0.0",
-              "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-              "dev": true,
-              "optional": true
-            }
-          }
+          "optional": true
         },
         "debug": {
-          "version": "2.6.8",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
-          "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+          "version": "2.6.9",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
           }
         },
         "deep-extend": {
-          "version": "0.4.2",
-          "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
-          "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+          "version": "0.5.1",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
-        "delayed-stream": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-          "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-          "dev": true
-        },
         "delegates": {
           "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-          "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "detect-libc": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz",
-          "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=",
-          "dev": true,
-          "optional": true
-        },
-        "ecc-jsbn": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
-          "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "jsbn": "0.1.1"
-          }
-        },
-        "extend": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
-          "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+          "version": "1.0.3",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
-        "extsprintf": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz",
-          "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=",
-          "dev": true
-        },
-        "forever-agent": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-          "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-          "dev": true,
-          "optional": true
-        },
-        "form-data": {
-          "version": "2.1.4",
-          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
-          "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+        "fs-minipass": {
+          "version": "1.2.5",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "asynckit": "0.4.0",
-            "combined-stream": "1.0.5",
-            "mime-types": "2.1.15"
+            "minipass": "^2.2.1"
           }
         },
         "fs.realpath": {
           "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-          "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-          "dev": true
-        },
-        "fstream": {
-          "version": "1.0.11",
-          "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
-          "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "4.1.11",
-            "inherits": "2.0.3",
-            "mkdirp": "0.5.1",
-            "rimraf": "2.6.1"
-          }
-        },
-        "fstream-ignore": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz",
-          "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=",
+          "bundled": true,
           "dev": true,
-          "optional": true,
-          "requires": {
-            "fstream": "1.0.11",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4"
-          }
+          "optional": true
         },
         "gauge": {
           "version": "2.7.4",
-          "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
-          "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "aproba": "1.1.1",
-            "console-control-strings": "1.1.0",
-            "has-unicode": "2.0.1",
-            "object-assign": "4.1.1",
-            "signal-exit": "3.0.2",
-            "string-width": "1.0.2",
-            "strip-ansi": "3.0.1",
-            "wide-align": "1.1.2"
-          }
-        },
-        "getpass": {
-          "version": "0.1.7",
-          "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-          "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "assert-plus": "1.0.0"
-          },
-          "dependencies": {
-            "assert-plus": {
-              "version": "1.0.0",
-              "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-              "dev": true,
-              "optional": true
-            }
+            "aproba": "^1.0.3",
+            "console-control-strings": "^1.0.0",
+            "has-unicode": "^2.0.0",
+            "object-assign": "^4.1.0",
+            "signal-exit": "^3.0.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wide-align": "^1.1.0"
           }
         },
         "glob": {
           "version": "7.1.2",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
-          "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "1.0.0",
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.1.11",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-          "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
-          "dev": true
-        },
-        "har-schema": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
-          "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
-          "dev": true,
-          "optional": true
-        },
-        "har-validator": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
-          "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "ajv": "4.11.8",
-            "har-schema": "1.0.5"
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
         },
         "has-unicode": {
           "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-          "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
-        "hawk": {
-          "version": "3.1.3",
-          "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
-          "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+        "iconv-lite": {
+          "version": "0.4.21",
+          "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
-            "boom": "2.10.1",
-            "cryptiles": "2.0.5",
-            "hoek": "2.16.3",
-            "sntp": "1.0.9"
+            "safer-buffer": "^2.1.0"
           }
         },
-        "hoek": {
-          "version": "2.16.3",
-          "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
-          "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
-          "dev": true
-        },
-        "http-signature": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
-          "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+        "ignore-walk": {
+          "version": "3.0.1",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "assert-plus": "0.2.0",
-            "jsprim": "1.4.0",
-            "sshpk": "1.13.0"
+            "minimatch": "^3.0.4"
           }
         },
         "inflight": {
           "version": "1.0.6",
-          "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-          "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+          "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
-            "once": "1.4.0",
-            "wrappy": "1.0.2"
+            "once": "^1.3.0",
+            "wrappy": "1"
           }
         },
         "inherits": {
           "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "bundled": true,
           "dev": true
         },
         "ini": {
-          "version": "1.3.4",
-          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
-          "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=",
+          "version": "1.3.5",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "is-fullwidth-code-point": {
           "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "bundled": true,
           "dev": true,
           "requires": {
-            "number-is-nan": "1.0.1"
+            "number-is-nan": "^1.0.0"
           }
         },
-        "is-typedarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-          "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-          "dev": true,
-          "optional": true
-        },
         "isarray": {
           "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-          "dev": true
-        },
-        "isstream": {
-          "version": "0.1.2",
-          "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-          "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
-          "dev": true,
-          "optional": true
-        },
-        "jodid25519": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz",
-          "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "jsbn": "0.1.1"
-          }
-        },
-        "jsbn": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-          "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
-          "dev": true,
-          "optional": true
-        },
-        "json-schema": {
-          "version": "0.2.3",
-          "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-          "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-          "dev": true,
-          "optional": true
-        },
-        "json-stable-stringify": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
-          "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "jsonify": "0.0.0"
-          }
-        },
-        "json-stringify-safe": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-          "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-          "dev": true,
-          "optional": true
-        },
-        "jsonify": {
-          "version": "0.0.0",
-          "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
-          "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
-        "jsprim": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz",
-          "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=",
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
-            "assert-plus": "1.0.0",
-            "extsprintf": "1.0.2",
-            "json-schema": "0.2.3",
-            "verror": "1.3.6"
-          },
-          "dependencies": {
-            "assert-plus": {
-              "version": "1.0.0",
-              "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-              "dev": true,
-              "optional": true
-            }
+            "brace-expansion": "^1.1.7"
           }
         },
-        "mime-db": {
-          "version": "1.27.0",
-          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz",
-          "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=",
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true,
           "dev": true
         },
-        "mime-types": {
-          "version": "2.1.15",
-          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz",
-          "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=",
+        "minipass": {
+          "version": "2.2.4",
+          "bundled": true,
           "dev": true,
           "requires": {
-            "mime-db": "1.27.0"
+            "safe-buffer": "^5.1.1",
+            "yallist": "^3.0.0"
           }
         },
-        "minimatch": {
-          "version": "3.0.4",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-          "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+        "minizlib": {
+          "version": "1.1.0",
+          "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
-            "brace-expansion": "1.1.7"
+            "minipass": "^2.2.1"
           }
         },
-        "minimist": {
-          "version": "0.0.8",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
-          "dev": true
-        },
         "mkdirp": {
           "version": "0.5.1",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-          "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+          "bundled": true,
           "dev": true,
           "requires": {
             "minimist": "0.0.8"
         },
         "ms": {
           "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
+        "needle": {
+          "version": "2.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "debug": "^2.1.2",
+            "iconv-lite": "^0.4.4",
+            "sax": "^1.2.4"
+          }
+        },
         "node-pre-gyp": {
-          "version": "0.6.39",
-          "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz",
-          "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==",
+          "version": "0.10.0",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "detect-libc": "1.0.2",
-            "hawk": "3.1.3",
-            "mkdirp": "0.5.1",
-            "nopt": "4.0.1",
-            "npmlog": "4.1.0",
-            "rc": "1.2.1",
-            "request": "2.81.0",
-            "rimraf": "2.6.1",
-            "semver": "5.3.0",
-            "tar": "2.2.1",
-            "tar-pack": "3.4.0"
+            "detect-libc": "^1.0.2",
+            "mkdirp": "^0.5.1",
+            "needle": "^2.2.0",
+            "nopt": "^4.0.1",
+            "npm-packlist": "^1.1.6",
+            "npmlog": "^4.0.2",
+            "rc": "^1.1.7",
+            "rimraf": "^2.6.1",
+            "semver": "^5.3.0",
+            "tar": "^4"
           }
         },
         "nopt": {
           "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
-          "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "abbrev": "1.1.0",
-            "osenv": "0.1.4"
+            "abbrev": "1",
+            "osenv": "^0.1.4"
+          }
+        },
+        "npm-bundled": {
+          "version": "1.0.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "npm-packlist": {
+          "version": "1.1.10",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ignore-walk": "^3.0.1",
+            "npm-bundled": "^1.0.1"
           }
         },
         "npmlog": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz",
-          "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==",
+          "version": "4.1.2",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "are-we-there-yet": "1.1.4",
-            "console-control-strings": "1.1.0",
-            "gauge": "2.7.4",
-            "set-blocking": "2.0.0"
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.3",
+            "set-blocking": "~2.0.0"
           }
         },
         "number-is-nan": {
           "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-          "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+          "bundled": true,
           "dev": true
         },
-        "oauth-sign": {
-          "version": "0.8.2",
-          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
-          "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
-          "dev": true,
-          "optional": true
-        },
         "object-assign": {
           "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-          "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "once": {
           "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-          "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+          "bundled": true,
           "dev": true,
           "requires": {
-            "wrappy": "1.0.2"
+            "wrappy": "1"
           }
         },
         "os-homedir": {
           "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-          "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "os-tmpdir": {
           "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-          "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "osenv": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
-          "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
+          "version": "0.1.5",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "os-homedir": "1.0.2",
-            "os-tmpdir": "1.0.2"
+            "os-homedir": "^1.0.0",
+            "os-tmpdir": "^1.0.0"
           }
         },
         "path-is-absolute": {
           "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-          "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-          "dev": true
-        },
-        "performance-now": {
-          "version": "0.2.0",
-          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
-          "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "process-nextick-args": {
-          "version": "1.0.7",
-          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
-          "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
-          "dev": true
-        },
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true,
-          "optional": true
-        },
-        "qs": {
-          "version": "6.4.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
-          "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+          "version": "2.0.0",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "rc": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz",
-          "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=",
+          "version": "1.2.7",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "deep-extend": "0.4.2",
-            "ini": "1.3.4",
-            "minimist": "1.2.0",
-            "strip-json-comments": "2.0.1"
+            "deep-extend": "^0.5.1",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
           },
           "dependencies": {
             "minimist": {
               "version": "1.2.0",
-              "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-              "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+              "bundled": true,
               "dev": true,
               "optional": true
             }
           }
         },
         "readable-stream": {
-          "version": "2.2.9",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz",
-          "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=",
-          "dev": true,
-          "requires": {
-            "buffer-shims": "1.0.0",
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "1.0.0",
-            "process-nextick-args": "1.0.7",
-            "string_decoder": "1.0.1",
-            "util-deprecate": "1.0.2"
-          }
-        },
-        "request": {
-          "version": "2.81.0",
-          "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
-          "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+          "version": "2.3.6",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "aws-sign2": "0.6.0",
-            "aws4": "1.6.0",
-            "caseless": "0.12.0",
-            "combined-stream": "1.0.5",
-            "extend": "3.0.1",
-            "forever-agent": "0.6.1",
-            "form-data": "2.1.4",
-            "har-validator": "4.2.1",
-            "hawk": "3.1.3",
-            "http-signature": "1.1.1",
-            "is-typedarray": "1.0.0",
-            "isstream": "0.1.2",
-            "json-stringify-safe": "5.0.1",
-            "mime-types": "2.1.15",
-            "oauth-sign": "0.8.2",
-            "performance-now": "0.2.0",
-            "qs": "6.4.0",
-            "safe-buffer": "5.0.1",
-            "stringstream": "0.0.5",
-            "tough-cookie": "2.3.2",
-            "tunnel-agent": "0.6.0",
-            "uuid": "3.0.1"
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
           }
         },
         "rimraf": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
-          "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
+          "version": "2.6.2",
+          "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
-            "glob": "7.1.2"
+            "glob": "^7.0.5"
           }
         },
         "safe-buffer": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
-          "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=",
+          "version": "5.1.1",
+          "bundled": true,
           "dev": true
         },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "sax": {
+          "version": "1.2.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
         "semver": {
-          "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
-          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+          "version": "5.5.0",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "set-blocking": {
           "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-          "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "signal-exit": {
           "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-          "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
-        "sntp": {
-          "version": "1.0.9",
-          "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
-          "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
           "dev": true,
           "requires": {
-            "hoek": "2.16.3"
-          }
-        },
-        "sshpk": {
-          "version": "1.13.0",
-          "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz",
-          "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "asn1": "0.2.3",
-            "assert-plus": "1.0.0",
-            "bcrypt-pbkdf": "1.0.1",
-            "dashdash": "1.14.1",
-            "ecc-jsbn": "0.1.1",
-            "getpass": "0.1.7",
-            "jodid25519": "1.0.2",
-            "jsbn": "0.1.1",
-            "tweetnacl": "0.14.5"
-          },
-          "dependencies": {
-            "assert-plus": {
-              "version": "1.0.0",
-              "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-              "dev": true,
-              "optional": true
-            }
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
           }
         },
         "string_decoder": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz",
-          "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "5.0.1"
-          }
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "version": "1.1.1",
+          "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
-            "code-point-at": "1.1.0",
-            "is-fullwidth-code-point": "1.0.0",
-            "strip-ansi": "3.0.1"
+            "safe-buffer": "~5.1.0"
           }
         },
-        "stringstream": {
-          "version": "0.0.5",
-          "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
-          "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
-          "dev": true,
-          "optional": true
-        },
         "strip-ansi": {
           "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "bundled": true,
           "dev": true,
           "requires": {
-            "ansi-regex": "2.1.1"
+            "ansi-regex": "^2.0.0"
           }
         },
         "strip-json-comments": {
           "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
         "tar": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
-          "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
-          "dev": true,
-          "requires": {
-            "block-stream": "0.0.9",
-            "fstream": "1.0.11",
-            "inherits": "2.0.3"
-          }
-        },
-        "tar-pack": {
-          "version": "3.4.0",
-          "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz",
-          "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=",
+          "version": "4.4.1",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "debug": "2.6.8",
-            "fstream": "1.0.11",
-            "fstream-ignore": "1.0.5",
-            "once": "1.4.0",
-            "readable-stream": "2.2.9",
-            "rimraf": "2.6.1",
-            "tar": "2.2.1",
-            "uid-number": "0.0.6"
+            "chownr": "^1.0.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.2.4",
+            "minizlib": "^1.1.0",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.1",
+            "yallist": "^3.0.2"
           }
         },
-        "tough-cookie": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
-          "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "punycode": "1.4.1"
-          }
-        },
-        "tunnel-agent": {
-          "version": "0.6.0",
-          "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-          "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "5.0.1"
-          }
-        },
-        "tweetnacl": {
-          "version": "0.14.5",
-          "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-          "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
-          "dev": true,
-          "optional": true
-        },
-        "uid-number": {
-          "version": "0.0.6",
-          "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz",
-          "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=",
-          "dev": true,
-          "optional": true
-        },
         "util-deprecate": {
           "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-          "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-          "dev": true
-        },
-        "uuid": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz",
-          "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=",
+          "bundled": true,
           "dev": true,
           "optional": true
         },
-        "verror": {
-          "version": "1.3.6",
-          "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz",
-          "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "extsprintf": "1.0.2"
-          }
-        },
         "wide-align": {
           "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
-          "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
+          "bundled": true,
           "dev": true,
           "optional": true,
           "requires": {
-            "string-width": "1.0.2"
+            "string-width": "^1.0.2"
           }
         },
         "wrappy": {
           "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-          "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+          "bundled": true,
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.0.2",
+          "bundled": true,
           "dev": true
         }
       }
       "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
       "dev": true,
       "requires": {
-        "globule": "0.1.0"
+        "globule": "~0.1.0"
       }
     },
     "generate-function": {
       "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
       "dev": true,
       "requires": {
-        "is-property": "1.0.2"
+        "is-property": "^1.0.0"
       }
     },
     "get-stdin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
+      "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=",
       "dev": true
     },
     "get-value": {
       "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
       "dev": true,
       "requires": {
-        "assert-plus": "1.0.0"
+        "assert-plus": "^1.0.0"
       },
       "dependencies": {
         "assert-plus": {
       }
     },
     "gl-matrix": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.4.0.tgz",
-      "integrity": "sha1-IImxMwGinuyCLZ2Z3/wfeO6aPFA=",
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.6.1.tgz",
+      "integrity": "sha512-fK37p7vkpw5H4WSypfa6TUV8nlB8+Fd1pZj15sMtvRPnfzArvTI4U4E25x2Hmp+UxZX11ve0aGaHarRieP+gSw==",
       "dev": true
     },
     "glob": {
       "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
       "dev": true,
       "requires": {
-        "fs.realpath": "1.0.0",
-        "inflight": "1.0.6",
-        "inherits": "2.0.3",
-        "minimatch": "3.0.4",
-        "once": "1.4.0",
-        "path-is-absolute": "1.0.1"
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
       }
     },
     "glob-base": {
       "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
       "dev": true,
       "requires": {
-        "glob-parent": "2.0.0",
-        "is-glob": "2.0.1"
+        "glob-parent": "^2.0.0",
+        "is-glob": "^2.0.0"
       },
       "dependencies": {
         "is-extglob": {
           "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
           "dev": true,
           "requires": {
-            "is-extglob": "1.0.0"
+            "is-extglob": "^1.0.0"
           }
         }
       }
       "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
       "dev": true,
       "requires": {
-        "is-glob": "2.0.1"
+        "is-glob": "^2.0.0"
       },
       "dependencies": {
         "is-extglob": {
           "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
           "dev": true,
           "requires": {
-            "is-extglob": "1.0.0"
+            "is-extglob": "^1.0.0"
           }
         }
       }
       "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
       "dev": true,
       "requires": {
-        "glob": "4.5.3",
-        "glob2base": "0.0.12",
-        "minimatch": "2.0.10",
-        "ordered-read-streams": "0.1.0",
-        "through2": "0.6.5",
-        "unique-stream": "1.0.0"
+        "glob": "^4.3.1",
+        "glob2base": "^0.0.12",
+        "minimatch": "^2.0.1",
+        "ordered-read-streams": "^0.1.0",
+        "through2": "^0.6.1",
+        "unique-stream": "^1.0.0"
       },
       "dependencies": {
         "glob": {
           "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
           "dev": true,
           "requires": {
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "2.0.10",
-            "once": "1.4.0"
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^2.0.1",
+            "once": "^1.3.0"
           }
         },
         "minimatch": {
           "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
           "dev": true,
           "requires": {
-            "brace-expansion": "1.1.11"
+            "brace-expansion": "^1.0.0"
           }
         },
         "readable-stream": {
           "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
             "isarray": "0.0.1",
-            "string_decoder": "0.10.31"
+            "string_decoder": "~0.10.x"
           }
         },
         "through2": {
           "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
           "dev": true,
           "requires": {
-            "readable-stream": "1.0.34",
-            "xtend": "4.0.1"
+            "readable-stream": ">=1.0.33-1 <1.1.0-0",
+            "xtend": ">=4.0.0 <4.1.0-0"
           }
         }
       }
       "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
       "dev": true,
       "requires": {
-        "gaze": "0.5.2"
+        "gaze": "^0.5.1"
       }
     },
     "glob2base": {
       "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
       "dev": true,
       "requires": {
-        "find-index": "0.1.1"
+        "find-index": "^0.1.1"
       }
     },
     "global-modules": {
       "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
       "dev": true,
       "requires": {
-        "global-prefix": "1.0.2",
-        "is-windows": "1.0.2",
-        "resolve-dir": "1.0.1"
+        "global-prefix": "^1.0.1",
+        "is-windows": "^1.0.1",
+        "resolve-dir": "^1.0.0"
       }
     },
     "global-prefix": {
       "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
       "dev": true,
       "requires": {
-        "expand-tilde": "2.0.2",
-        "homedir-polyfill": "1.0.1",
-        "ini": "1.3.5",
-        "is-windows": "1.0.2",
-        "which": "1.3.0"
+        "expand-tilde": "^2.0.2",
+        "homedir-polyfill": "^1.0.1",
+        "ini": "^1.3.4",
+        "is-windows": "^1.0.1",
+        "which": "^1.2.14"
       }
     },
     "globals": {
       "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
       "dev": true,
       "requires": {
-        "array-union": "1.0.2",
-        "arrify": "1.0.1",
-        "glob": "7.1.2",
-        "object-assign": "4.1.1",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1"
+        "array-union": "^1.0.1",
+        "arrify": "^1.0.0",
+        "glob": "^7.0.3",
+        "object-assign": "^4.0.1",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
       }
     },
     "globule": {
       "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
       "dev": true,
       "requires": {
-        "glob": "3.1.21",
-        "lodash": "1.0.2",
-        "minimatch": "0.2.14"
+        "glob": "~3.1.21",
+        "lodash": "~1.0.1",
+        "minimatch": "~0.2.11"
       },
       "dependencies": {
         "glob": {
           "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
           "dev": true,
           "requires": {
-            "graceful-fs": "1.2.3",
-            "inherits": "1.0.2",
-            "minimatch": "0.2.14"
+            "graceful-fs": "~1.2.0",
+            "inherits": "1",
+            "minimatch": "~0.2.11"
           }
         },
         "graceful-fs": {
           "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
           "dev": true,
           "requires": {
-            "lru-cache": "2.7.3",
-            "sigmund": "1.0.1"
+            "lru-cache": "2",
+            "sigmund": "~1.0.0"
           }
         }
       }
       "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
       "dev": true,
       "requires": {
-        "sparkles": "1.0.0"
+        "sparkles": "^1.0.0"
       }
     },
     "graceful-fs": {
       "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
       "dev": true,
       "requires": {
-        "natives": "1.1.1"
+        "natives": "^1.1.0"
       }
     },
     "gulp": {
       "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
       "dev": true,
       "requires": {
-        "archy": "1.0.0",
-        "chalk": "1.1.3",
-        "deprecated": "0.0.1",
-        "gulp-util": "3.0.8",
-        "interpret": "1.1.0",
-        "liftoff": "2.5.0",
-        "minimist": "1.2.0",
-        "orchestrator": "0.3.8",
-        "pretty-hrtime": "1.0.3",
-        "semver": "4.3.6",
-        "tildify": "1.2.0",
-        "v8flags": "2.1.1",
-        "vinyl-fs": "0.3.14"
+        "archy": "^1.0.0",
+        "chalk": "^1.0.0",
+        "deprecated": "^0.0.1",
+        "gulp-util": "^3.0.0",
+        "interpret": "^1.0.0",
+        "liftoff": "^2.1.0",
+        "minimist": "^1.1.0",
+        "orchestrator": "^0.3.0",
+        "pretty-hrtime": "^1.0.0",
+        "semver": "^4.1.0",
+        "tildify": "^1.0.0",
+        "v8flags": "^2.0.2",
+        "vinyl-fs": "^0.3.0"
       }
     },
     "gulp-chmod": {
       "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=",
       "dev": true,
       "requires": {
-        "deep-assign": "1.0.0",
-        "stat-mode": "0.2.2",
-        "through2": "2.0.3"
+        "deep-assign": "^1.0.0",
+        "stat-mode": "^0.2.0",
+        "through2": "^2.0.0"
       }
     },
     "gulp-cli": {
       "integrity": "sha1-b1u+LNC9tISdEs+eEkalhh+LT4g=",
       "dev": true,
       "requires": {
-        "archy": "1.0.0",
-        "chalk": "1.1.3",
-        "copy-props": "1.6.0",
-        "fancy-log": "1.3.2",
-        "gulplog": "1.0.0",
-        "interpret": "1.1.0",
-        "liftoff": "2.5.0",
-        "lodash.isfunction": "3.0.9",
-        "lodash.isplainobject": "4.0.6",
-        "lodash.sortby": "4.7.0",
-        "matchdep": "1.0.1",
-        "mute-stdout": "1.0.0",
-        "pretty-hrtime": "1.0.3",
-        "semver-greatest-satisfied-range": "1.1.0",
-        "tildify": "1.2.0",
-        "v8flags": "2.1.1",
-        "wreck": "6.3.0",
-        "yargs": "3.32.0"
+        "archy": "^1.0.0",
+        "chalk": "^1.1.0",
+        "copy-props": "^1.4.1",
+        "fancy-log": "^1.1.0",
+        "gulplog": "^1.0.0",
+        "interpret": "^1.0.0",
+        "liftoff": "^2.3.0",
+        "lodash.isfunction": "^3.0.8",
+        "lodash.isplainobject": "^4.0.4",
+        "lodash.sortby": "^4.5.0",
+        "matchdep": "^1.0.0",
+        "mute-stdout": "^1.0.0",
+        "pretty-hrtime": "^1.0.0",
+        "semver-greatest-satisfied-range": "^1.0.0",
+        "tildify": "^1.0.0",
+        "v8flags": "^2.0.9",
+        "wreck": "^6.3.0",
+        "yargs": "^3.28.0"
       }
     },
     "gulp-concat": {
       "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
       "dev": true,
       "requires": {
-        "concat-with-sourcemaps": "1.0.5",
-        "through2": "2.0.3",
-        "vinyl": "2.1.0"
+        "concat-with-sourcemaps": "^1.0.0",
+        "through2": "^2.0.0",
+        "vinyl": "^2.0.0"
       },
       "dependencies": {
         "clone": {
           "dev": true
         },
         "vinyl": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
-          "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
+          "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
           "dev": true,
           "requires": {
-            "clone": "2.1.1",
-            "clone-buffer": "1.0.0",
-            "clone-stats": "1.0.0",
-            "cloneable-readable": "1.0.0",
-            "remove-trailing-separator": "1.1.0",
-            "replace-ext": "1.0.0"
+            "clone": "^2.1.1",
+            "clone-buffer": "^1.0.0",
+            "clone-stats": "^1.0.0",
+            "cloneable-readable": "^1.0.0",
+            "remove-trailing-separator": "^1.0.1",
+            "replace-ext": "^1.0.0"
           }
         }
       }
     },
     "gulp-header": {
-      "version": "1.8.9",
-      "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.9.tgz",
-      "integrity": "sha1-yfEP7gYy2B6Tl4nG7PRaFRvzCYs=",
+      "version": "1.8.12",
+      "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz",
+      "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==",
       "dev": true,
       "requires": {
-        "concat-with-sourcemaps": "1.0.5",
-        "gulp-util": "3.0.8",
-        "object-assign": "4.1.1",
-        "through2": "2.0.3"
+        "concat-with-sourcemaps": "*",
+        "lodash.template": "^4.4.0",
+        "through2": "^2.0.0"
+      },
+      "dependencies": {
+        "lodash.template": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+          "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+          "dev": true,
+          "requires": {
+            "lodash._reinterpolate": "~3.0.0",
+            "lodash.templatesettings": "^4.0.0"
+          }
+        },
+        "lodash.templatesettings": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+          "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+          "dev": true,
+          "requires": {
+            "lodash._reinterpolate": "~3.0.0"
+          }
+        }
       }
     },
     "gulp-rename": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz",
-      "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.3.0.tgz",
+      "integrity": "sha512-nEuZB7/9i0IZ8AXORTizl2QLP9tcC9uWc/s329zElBLJw1CfOhmMXBxwVlCRKjDyrWuhVP0uBKl61KeQ32TiCg==",
       "dev": true
     },
     "gulp-size": {
       "integrity": "sha1-HCtk8X+QcdWr2Z0VS3s0gfj7oSg=",
       "dev": true,
       "requires": {
-        "chalk": "1.1.3",
-        "gulp-util": "3.0.8",
-        "gzip-size": "3.0.0",
-        "object-assign": "4.1.1",
-        "pretty-bytes": "3.0.1",
-        "stream-counter": "1.0.0",
-        "through2": "2.0.3"
+        "chalk": "^1.0.0",
+        "gulp-util": "^3.0.0",
+        "gzip-size": "^3.0.0",
+        "object-assign": "^4.0.1",
+        "pretty-bytes": "^3.0.1",
+        "stream-counter": "^1.0.0",
+        "through2": "^2.0.0"
       }
     },
     "gulp-standard": {
       "integrity": "sha512-w+VBktDzONh807qzV5FvngPgmzuGRWu7oMlIpIvOOmSPlyy/ixM138DGOuMWy1M9bRVMDKEfQSj0aGB2ZjzQSA==",
       "dev": true,
       "requires": {
-        "app-root-path": "2.0.1",
-        "colors": "1.1.2",
-        "log-symbols": "1.0.2",
-        "path": "0.12.7",
-        "plugin-error": "1.0.1",
-        "standard": "10.0.3",
-        "through2": "2.0.3"
+        "app-root-path": "^2.0.0",
+        "colors": "^1.1.2",
+        "log-symbols": "^1.0.2",
+        "path": "^0.12.7",
+        "plugin-error": "^1.0.0",
+        "standard": "^10.0.0",
+        "through2": "^2.0.0"
       },
       "dependencies": {
-        "eslint": {
-          "version": "3.19.0",
-          "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz",
-          "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=",
-          "dev": true,
-          "requires": {
-            "babel-code-frame": "6.26.0",
-            "chalk": "1.1.3",
-            "concat-stream": "1.6.0",
-            "debug": "2.6.9",
-            "doctrine": "2.1.0",
-            "escope": "3.6.0",
-            "espree": "3.5.3",
-            "esquery": "1.0.0",
-            "estraverse": "4.2.0",
-            "esutils": "2.0.2",
-            "file-entry-cache": "2.0.0",
-            "glob": "7.1.2",
-            "globals": "9.18.0",
-            "ignore": "3.3.7",
-            "imurmurhash": "0.1.4",
-            "inquirer": "0.12.0",
-            "is-my-json-valid": "2.17.2",
-            "is-resolvable": "1.1.0",
-            "js-yaml": "3.6.1",
-            "json-stable-stringify": "1.0.1",
-            "levn": "0.3.0",
-            "lodash": "4.17.5",
-            "mkdirp": "0.5.1",
-            "natural-compare": "1.4.0",
-            "optionator": "0.8.2",
-            "path-is-inside": "1.0.2",
-            "pluralize": "1.2.1",
-            "progress": "1.1.8",
-            "require-uncached": "1.0.3",
-            "shelljs": "0.7.8",
-            "strip-bom": "3.0.0",
-            "strip-json-comments": "2.0.1",
-            "table": "3.8.3",
-            "text-table": "0.2.0",
-            "user-home": "2.0.0"
-          }
-        },
-        "eslint-config-standard": {
-          "version": "10.2.1",
-          "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz",
-          "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=",
-          "dev": true
-        },
-        "eslint-config-standard-jsx": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz",
-          "integrity": "sha512-F8fRh2WFnTek7dZH9ZaE0PCBwdVGkwVWZmizla/DDNOmg7Tx6B/IlK5+oYpiX29jpu73LszeJj5i1axEZv6VMw==",
-          "dev": true
-        },
-        "eslint-plugin-promise": {
-          "version": "3.5.0",
-          "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz",
-          "integrity": "sha1-ePu2/+BHIBYnVp6FpsU3OvKmj8o=",
-          "dev": true
-        },
-        "eslint-plugin-react": {
-          "version": "6.10.3",
-          "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz",
-          "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=",
-          "dev": true,
-          "requires": {
-            "array.prototype.find": "2.0.4",
-            "doctrine": "1.5.0",
-            "has": "1.0.1",
-            "jsx-ast-utils": "1.4.1",
-            "object.assign": "4.1.0"
-          },
-          "dependencies": {
-            "doctrine": {
-              "version": "1.5.0",
-              "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
-              "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
-              "dev": true,
-              "requires": {
-                "esutils": "2.0.2",
-                "isarray": "1.0.0"
-              }
-            }
-          }
-        },
-        "eslint-plugin-standard": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz",
-          "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=",
-          "dev": true
-        },
-        "estraverse": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-          "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-          "dev": true
-        },
-        "get-stdin": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
-          "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=",
-          "dev": true
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-          "dev": true
-        },
-        "lodash": {
-          "version": "4.17.5",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
-          "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
-          "dev": true
-        },
-        "plugin-error": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
-          "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
-          "dev": true,
-          "requires": {
-            "ansi-colors": "1.1.0",
-            "arr-diff": "4.0.0",
-            "arr-union": "3.1.0",
-            "extend-shallow": "3.0.2"
-          }
-        },
         "standard": {
           "version": "10.0.3",
           "resolved": "https://registry.npmjs.org/standard/-/standard-10.0.3.tgz",
           "integrity": "sha512-JURZ+85ExKLQULckDFijdX5WHzN6RC7fgiZNSV4jFQVo+3tPoQGHyBrGekye/yf0aOfb4210EM5qPNlc2cRh4w==",
           "dev": true,
           "requires": {
-            "eslint": "3.19.0",
+            "eslint": "~3.19.0",
             "eslint-config-standard": "10.2.1",
             "eslint-config-standard-jsx": "4.0.2",
-            "eslint-plugin-import": "2.2.0",
-            "eslint-plugin-node": "4.2.3",
-            "eslint-plugin-promise": "3.5.0",
-            "eslint-plugin-react": "6.10.3",
-            "eslint-plugin-standard": "3.0.1",
-            "standard-engine": "7.0.0"
-          }
-        },
-        "standard-engine": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-7.0.0.tgz",
-          "integrity": "sha1-67d7nI/CyBZf+jU72Rug3/Qa9pA=",
-          "dev": true,
-          "requires": {
-            "deglob": "2.1.0",
-            "get-stdin": "5.0.1",
-            "minimist": "1.2.0",
-            "pkg-conf": "2.1.0"
-          }
-        },
-        "strip-bom": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
-          "dev": true
-        },
-        "user-home": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
-          "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
-          "dev": true,
-          "requires": {
-            "os-homedir": "1.0.2"
+            "eslint-plugin-import": "~2.2.0",
+            "eslint-plugin-node": "~4.2.2",
+            "eslint-plugin-promise": "~3.5.0",
+            "eslint-plugin-react": "~6.10.0",
+            "eslint-plugin-standard": "~3.0.1",
+            "standard-engine": "~7.0.0"
           }
         }
       }
       "integrity": "sha1-exeRa4UMoPBa9BkN0k6aweJunyY=",
       "dev": true,
       "requires": {
-        "through2": "0.6.5"
+        "through2": "^0.6.3"
       },
       "dependencies": {
         "readable-stream": {
           "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
             "isarray": "0.0.1",
-            "string_decoder": "0.10.31"
+            "string_decoder": "~0.10.x"
           }
         },
         "through2": {
           "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
           "dev": true,
           "requires": {
-            "readable-stream": "1.0.34",
-            "xtend": "4.0.1"
+            "readable-stream": ">=1.0.33-1 <1.1.0-0",
+            "xtend": ">=4.0.0 <4.1.0-0"
           }
         }
       }
       "integrity": "sha1-bbhbHQ7mPRgFhZK2WGSdZcLsRUE=",
       "dev": true,
       "requires": {
-        "gulplog": "1.0.0",
-        "has-gulplog": "0.1.0",
-        "lodash": "4.17.5",
-        "make-error-cause": "1.2.2",
-        "through2": "2.0.3",
-        "uglify-js": "2.8.29",
-        "uglify-save-license": "0.4.1",
-        "vinyl-sourcemaps-apply": "0.2.1"
+        "gulplog": "^1.0.0",
+        "has-gulplog": "^0.1.0",
+        "lodash": "^4.13.1",
+        "make-error-cause": "^1.1.1",
+        "through2": "^2.0.0",
+        "uglify-js": "~2.8.10",
+        "uglify-save-license": "^0.4.1",
+        "vinyl-sourcemaps-apply": "^0.2.0"
       },
       "dependencies": {
         "lodash": {
-          "version": "4.17.5",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
-          "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
           "dev": true
         }
       }
       "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
       "dev": true,
       "requires": {
-        "array-differ": "1.0.0",
-        "array-uniq": "1.0.3",
-        "beeper": "1.1.1",
-        "chalk": "1.1.3",
-        "dateformat": "2.2.0",
-        "fancy-log": "1.3.2",
-        "gulplog": "1.0.0",
-        "has-gulplog": "0.1.0",
-        "lodash._reescape": "3.0.0",
-        "lodash._reevaluate": "3.0.0",
-        "lodash._reinterpolate": "3.0.0",
-        "lodash.template": "3.6.2",
-        "minimist": "1.2.0",
-        "multipipe": "0.1.2",
-        "object-assign": "3.0.0",
+        "array-differ": "^1.0.0",
+        "array-uniq": "^1.0.2",
+        "beeper": "^1.0.0",
+        "chalk": "^1.0.0",
+        "dateformat": "^2.0.0",
+        "fancy-log": "^1.1.0",
+        "gulplog": "^1.0.0",
+        "has-gulplog": "^0.1.0",
+        "lodash._reescape": "^3.0.0",
+        "lodash._reevaluate": "^3.0.0",
+        "lodash._reinterpolate": "^3.0.0",
+        "lodash.template": "^3.0.0",
+        "minimist": "^1.1.0",
+        "multipipe": "^0.1.2",
+        "object-assign": "^3.0.0",
         "replace-ext": "0.0.1",
-        "through2": "2.0.3",
-        "vinyl": "0.5.3"
+        "through2": "^2.0.0",
+        "vinyl": "^0.5.0"
       },
       "dependencies": {
         "object-assign": {
       "integrity": "sha1-kPsLSieiZkM4Mv98YSLbXB7olMY=",
       "dev": true,
       "requires": {
-        "consolidate": "0.14.5",
-        "es6-promise": "3.3.1",
-        "fs-readfile-promise": "2.0.1",
-        "gulp-util": "3.0.8",
-        "js-yaml": "3.6.1",
-        "lodash": "4.17.5",
-        "node.extend": "1.1.6",
-        "through2": "2.0.3",
-        "tryit": "1.0.3",
-        "vinyl-bufferstream": "1.0.1"
+        "consolidate": "^0.14.1",
+        "es6-promise": "^3.1.2",
+        "fs-readfile-promise": "^2.0.1",
+        "gulp-util": "^3.0.3",
+        "js-yaml": "^3.2.6",
+        "lodash": "^4.11.1",
+        "node.extend": "^1.1.2",
+        "through2": "^2.0.1",
+        "tryit": "^1.0.1",
+        "vinyl-bufferstream": "^1.0.1"
       },
       "dependencies": {
         "lodash": {
-          "version": "4.17.5",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
-          "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
           "dev": true
         }
       }
       "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
       "dev": true,
       "requires": {
-        "glogg": "1.0.1"
+        "glogg": "^1.0.0"
       }
     },
     "gzip-size": {
       "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
       "dev": true,
       "requires": {
-        "duplexer": "0.1.1"
+        "duplexer": "^0.1.1"
       }
     },
     "handlebars": {
       "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
       "dev": true,
       "requires": {
-        "async": "1.5.2",
-        "optimist": "0.6.1",
-        "source-map": "0.4.4",
-        "uglify-js": "2.8.29"
+        "async": "^1.4.0",
+        "optimist": "^0.6.1",
+        "source-map": "^0.4.4",
+        "uglify-js": "^2.6"
       },
       "dependencies": {
         "source-map": {
           "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
           "dev": true,
           "requires": {
-            "amdefine": "1.0.1"
+            "amdefine": ">=0.0.4"
           }
         }
       }
       "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
       "dev": true,
       "requires": {
-        "chalk": "1.1.3",
-        "commander": "2.14.1",
-        "is-my-json-valid": "2.17.2",
-        "pinkie-promise": "2.0.1"
+        "chalk": "^1.1.1",
+        "commander": "^2.9.0",
+        "is-my-json-valid": "^2.12.4",
+        "pinkie-promise": "^2.0.0"
       }
     },
     "has": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
-      "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
       "dev": true,
       "requires": {
-        "function-bind": "1.1.1"
+        "function-bind": "^1.1.1"
       }
     },
     "has-ansi": {
       "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
       "dev": true,
       "requires": {
-        "ansi-regex": "2.1.1"
+        "ansi-regex": "^2.0.0"
       }
     },
     "has-binary": {
       "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
       "dev": true,
       "requires": {
-        "sparkles": "1.0.0"
+        "sparkles": "^1.0.0"
       }
     },
     "has-symbols": {
       "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
       "dev": true,
       "requires": {
-        "get-value": "2.0.6",
-        "has-values": "1.0.0",
-        "isobject": "3.0.1"
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
       }
     },
     "has-values": {
       "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
       "dev": true,
       "requires": {
-        "is-number": "3.0.0",
-        "kind-of": "4.0.0"
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
       },
       "dependencies": {
         "kind-of": {
           "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
           "dev": true,
           "requires": {
-            "is-buffer": "1.1.6"
+            "is-buffer": "^1.1.5"
           }
         }
       }
       "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=",
       "dev": true,
       "requires": {
-        "is-stream": "1.1.0",
-        "pinkie-promise": "2.0.1"
+        "is-stream": "^1.0.1",
+        "pinkie-promise": "^2.0.0"
       }
     },
     "hawk": {
       "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
       "dev": true,
       "requires": {
-        "boom": "2.10.1",
-        "cryptiles": "2.0.5",
-        "hoek": "2.16.3",
-        "sntp": "1.0.9"
+        "boom": "2.x.x",
+        "cryptiles": "2.x.x",
+        "hoek": "2.x.x",
+        "sntp": "1.x.x"
       }
     },
     "hoek": {
       "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
       "dev": true,
       "requires": {
-        "os-homedir": "1.0.2",
-        "os-tmpdir": "1.0.2"
+        "os-homedir": "^1.0.0",
+        "os-tmpdir": "^1.0.1"
       }
     },
     "homedir-polyfill": {
       "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
       "dev": true,
       "requires": {
-        "parse-passwd": "1.0.0"
+        "parse-passwd": "^1.0.0"
       }
     },
     "hosted-git-info": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
-      "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz",
+      "integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A==",
       "dev": true
     },
     "http-errors": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
-      "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+      "version": "1.6.3",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
       "dev": true,
       "requires": {
-        "depd": "1.1.1",
+        "depd": "~1.1.2",
         "inherits": "2.0.3",
-        "setprototypeof": "1.0.3",
-        "statuses": "1.4.0"
-      },
-      "dependencies": {
-        "depd": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
-          "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
-          "dev": true
-        }
+        "setprototypeof": "1.1.0",
+        "statuses": ">= 1.4.0 < 2"
       }
     },
     "http-proxy": {
-      "version": "1.16.2",
-      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz",
-      "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=",
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
+      "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
       "dev": true,
       "requires": {
-        "eventemitter3": "1.2.0",
-        "requires-port": "1.0.0"
+        "eventemitter3": "^3.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
       }
     },
     "http-signature": {
       "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
       "dev": true,
       "requires": {
-        "assert-plus": "0.2.0",
-        "jsprim": "1.4.1",
-        "sshpk": "1.13.1"
+        "assert-plus": "^0.2.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
       }
     },
     "iconv-lite": {
-      "version": "0.4.19",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
-      "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
-      "dev": true
+      "version": "0.4.23",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+      "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
     },
     "ignore": {
-      "version": "3.3.7",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
-      "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
+      "version": "3.3.10",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+      "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
       "dev": true
     },
     "image-size": {
       "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
       "dev": true,
       "requires": {
-        "repeating": "2.0.1"
+        "repeating": "^2.0.0"
       }
     },
     "indexof": {
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
       "dev": true,
       "requires": {
-        "once": "1.4.0",
-        "wrappy": "1.0.2"
+        "once": "^1.3.0",
+        "wrappy": "1"
       }
     },
     "inherits": {
       "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=",
       "dev": true,
       "requires": {
-        "ansi-escapes": "1.4.0",
-        "ansi-regex": "2.1.1",
-        "chalk": "1.1.3",
-        "cli-cursor": "1.0.2",
-        "cli-width": "2.2.0",
-        "figures": "1.7.0",
-        "lodash": "4.17.5",
-        "readline2": "1.0.1",
-        "run-async": "0.1.0",
-        "rx-lite": "3.1.2",
-        "string-width": "1.0.2",
-        "strip-ansi": "3.0.1",
-        "through": "2.3.8"
+        "ansi-escapes": "^1.1.0",
+        "ansi-regex": "^2.0.0",
+        "chalk": "^1.0.0",
+        "cli-cursor": "^1.0.1",
+        "cli-width": "^2.0.0",
+        "figures": "^1.3.5",
+        "lodash": "^4.3.0",
+        "readline2": "^1.0.1",
+        "run-async": "^0.1.0",
+        "rx-lite": "^3.1.2",
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.0",
+        "through": "^2.3.6"
       },
       "dependencies": {
         "lodash": {
-          "version": "4.17.5",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
-          "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
           "dev": true
         }
       }
       "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
       "dev": true,
       "requires": {
-        "is-relative": "1.0.0",
-        "is-windows": "1.0.2"
+        "is-relative": "^1.0.0",
+        "is-windows": "^1.0.1"
       }
     },
     "is-accessor-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
       "dev": true,
       "requires": {
-        "kind-of": "6.0.2"
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
       }
     },
     "is-arrayish": {
       "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
       "dev": true,
       "requires": {
-        "binary-extensions": "1.11.0"
+        "binary-extensions": "^1.0.0"
       }
     },
     "is-buffer": {
       "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
       "dev": true,
       "requires": {
-        "builtin-modules": "1.1.1"
+        "builtin-modules": "^1.0.0"
       }
     },
     "is-callable": {
       "dev": true
     },
     "is-data-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
       "dev": true,
       "requires": {
-        "kind-of": "6.0.2"
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
       }
     },
     "is-date-object": {
       "dev": true
     },
     "is-descriptor": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
       "dev": true,
       "requires": {
-        "is-accessor-descriptor": "1.0.0",
-        "is-data-descriptor": "1.0.0",
-        "kind-of": "6.0.2"
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
       }
     },
     "is-dotfile": {
       "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
       "dev": true,
       "requires": {
-        "is-primitive": "2.0.0"
+        "is-primitive": "^2.0.0"
       }
     },
     "is-extendable": {
       "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
       "dev": true,
       "requires": {
-        "number-is-nan": "1.0.1"
+        "number-is-nan": "^1.0.0"
       }
     },
     "is-fullwidth-code-point": {
       "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
       "dev": true,
       "requires": {
-        "number-is-nan": "1.0.1"
+        "number-is-nan": "^1.0.0"
       }
     },
     "is-glob": {
       "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
       "dev": true,
       "requires": {
-        "is-extglob": "2.1.1"
+        "is-extglob": "^2.1.0"
       }
     },
     "is-my-ip-valid": {
       "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
       "dev": true,
       "requires": {
-        "generate-function": "2.0.0",
-        "generate-object-property": "1.2.0",
-        "is-my-ip-valid": "1.0.0",
-        "jsonpointer": "4.0.1",
-        "xtend": "4.0.1"
+        "generate-function": "^2.0.0",
+        "generate-object-property": "^1.1.0",
+        "is-my-ip-valid": "^1.0.0",
+        "jsonpointer": "^4.0.0",
+        "xtend": "^4.0.0"
       }
     },
     "is-number": {
       "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
       "dev": true,
       "requires": {
-        "kind-of": "3.2.2"
+        "kind-of": "^3.0.2"
       },
       "dependencies": {
         "kind-of": {
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "is-buffer": "1.1.6"
+            "is-buffer": "^1.1.5"
           }
         }
       }
       "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
       "dev": true
     },
-    "is-odd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
-      "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
-      "dev": true,
-      "requires": {
-        "is-number": "4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
-          "dev": true
-        }
-      }
-    },
     "is-path-cwd": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
       "dev": true
     },
     "is-path-in-cwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
-      "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+      "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
       "dev": true,
       "requires": {
-        "is-path-inside": "1.0.1"
+        "is-path-inside": "^1.0.0"
       }
     },
     "is-path-inside": {
       "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
       "dev": true,
       "requires": {
-        "path-is-inside": "1.0.2"
+        "path-is-inside": "^1.0.1"
       }
     },
     "is-plain-object": {
       "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
       "requires": {
-        "isobject": "3.0.1"
+        "isobject": "^3.0.1"
       }
     },
     "is-posix-bracket": {
       "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
       "dev": true,
       "requires": {
-        "has": "1.0.1"
+        "has": "^1.0.1"
       }
     },
     "is-relative": {
       "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
       "dev": true,
       "requires": {
-        "is-unc-path": "1.0.0"
+        "is-unc-path": "^1.0.0"
       }
     },
     "is-resolvable": {
       "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
       "dev": true,
       "requires": {
-        "unc-path-regex": "0.1.2"
+        "unc-path-regex": "^0.1.2"
       }
     },
     "is-utf8": {
       "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
       "dev": true,
       "requires": {
-        "abbrev": "1.0.9",
-        "async": "1.5.2",
-        "escodegen": "1.8.1",
-        "esprima": "2.7.3",
-        "glob": "5.0.15",
-        "handlebars": "4.0.11",
-        "js-yaml": "3.6.1",
-        "mkdirp": "0.5.1",
-        "nopt": "3.0.6",
-        "once": "1.4.0",
-        "resolve": "1.1.7",
-        "supports-color": "3.2.3",
-        "which": "1.3.0",
-        "wordwrap": "1.0.0"
+        "abbrev": "1.0.x",
+        "async": "1.x",
+        "escodegen": "1.8.x",
+        "esprima": "2.7.x",
+        "glob": "^5.0.15",
+        "handlebars": "^4.0.1",
+        "js-yaml": "3.x",
+        "mkdirp": "0.5.x",
+        "nopt": "3.x",
+        "once": "1.x",
+        "resolve": "1.1.x",
+        "supports-color": "^3.1.0",
+        "which": "^1.1.1",
+        "wordwrap": "^1.0.0"
       },
       "dependencies": {
         "glob": {
           "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
           "dev": true,
           "requires": {
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "2 || 3",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
         },
         "resolve": {
           "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
           "dev": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "has-flag": "^1.0.0"
           }
-        },
-        "wordwrap": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
-          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
-          "dev": true
         }
       }
     },
       "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=",
       "dev": true,
       "requires": {
-        "argparse": "1.0.10",
-        "esprima": "2.7.3"
+        "argparse": "^1.0.7",
+        "esprima": "^2.6.0"
       }
     },
     "jsbn": {
       "optional": true
     },
     "json-parse-better-errors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz",
-      "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
       "dev": true
     },
     "json-schema": {
       "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
       "dev": true,
       "requires": {
-        "jsonify": "0.0.0"
+        "jsonify": "~0.0.0"
       }
     },
     "json-stringify-safe": {
       "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11"
+        "graceful-fs": "^4.1.6"
       },
       "dependencies": {
         "graceful-fs": {
       "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==",
       "dev": true,
       "requires": {
-        "bluebird": "3.5.1",
-        "body-parser": "1.18.2",
-        "chokidar": "1.7.0",
-        "colors": "1.1.2",
-        "combine-lists": "1.0.1",
-        "connect": "3.6.6",
-        "core-js": "2.5.3",
-        "di": "0.0.1",
-        "dom-serialize": "2.2.1",
-        "expand-braces": "0.1.2",
-        "glob": "7.1.2",
-        "graceful-fs": "4.1.11",
-        "http-proxy": "1.16.2",
-        "isbinaryfile": "3.0.2",
-        "lodash": "3.10.1",
-        "log4js": "0.6.38",
-        "mime": "1.6.0",
-        "minimatch": "3.0.4",
-        "optimist": "0.6.1",
-        "qjobs": "1.2.0",
-        "range-parser": "1.2.0",
-        "rimraf": "2.6.2",
-        "safe-buffer": "5.1.1",
+        "bluebird": "^3.3.0",
+        "body-parser": "^1.16.1",
+        "chokidar": "^1.4.1",
+        "colors": "^1.1.0",
+        "combine-lists": "^1.0.0",
+        "connect": "^3.6.0",
+        "core-js": "^2.2.0",
+        "di": "^0.0.1",
+        "dom-serialize": "^2.2.0",
+        "expand-braces": "^0.1.1",
+        "glob": "^7.1.1",
+        "graceful-fs": "^4.1.2",
+        "http-proxy": "^1.13.0",
+        "isbinaryfile": "^3.0.0",
+        "lodash": "^3.8.0",
+        "log4js": "^0.6.31",
+        "mime": "^1.3.4",
+        "minimatch": "^3.0.2",
+        "optimist": "^0.6.1",
+        "qjobs": "^1.1.4",
+        "range-parser": "^1.2.0",
+        "rimraf": "^2.6.0",
+        "safe-buffer": "^5.0.1",
         "socket.io": "1.7.3",
-        "source-map": "0.5.7",
+        "source-map": "^0.5.3",
         "tmp": "0.0.31",
-        "useragent": "2.3.0"
+        "useragent": "^2.1.12"
       },
       "dependencies": {
         "graceful-fs": {
       }
     },
     "karma-coverage": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.1.tgz",
-      "integrity": "sha1-Wv+LOc9plNwi3kyENix2ABtjfPY=",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.2.tgz",
+      "integrity": "sha512-eQawj4Cl3z/CjxslYy9ariU4uDh7cCNFZHNWXWRpl0pNeblY/4wHR7M7boTYXWrn9bY0z2pZmr11eKje/S/hIw==",
       "dev": true,
       "requires": {
-        "dateformat": "1.0.12",
-        "istanbul": "0.4.5",
-        "lodash": "3.10.1",
-        "minimatch": "3.0.4",
-        "source-map": "0.5.7"
+        "dateformat": "^1.0.6",
+        "istanbul": "^0.4.0",
+        "lodash": "^4.17.0",
+        "minimatch": "^3.0.0",
+        "source-map": "^0.5.1"
       },
       "dependencies": {
         "dateformat": {
           "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
           "dev": true,
           "requires": {
-            "get-stdin": "4.0.1",
-            "meow": "3.7.0"
+            "get-stdin": "^4.0.1",
+            "meow": "^3.3.0"
           }
         },
+        "get-stdin": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+          "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+          "dev": true
+        },
         "lodash": {
-          "version": "3.10.1",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
           "dev": true
         }
       }
       "dev": true
     },
     "karma-jasmine": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.1.tgz",
-      "integrity": "sha1-b+hA51oRYAydkehLM8RY4cRqNSk=",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz",
+      "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=",
       "dev": true
     },
     "karma-phantomjs-launcher": {
       "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=",
       "dev": true,
       "requires": {
-        "lodash": "4.17.5",
-        "phantomjs-prebuilt": "2.1.16"
+        "lodash": "^4.0.1",
+        "phantomjs-prebuilt": "^2.1.7"
       },
       "dependencies": {
         "lodash": {
-          "version": "4.17.5",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
-          "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
           "dev": true
         }
       }
       "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11"
+        "graceful-fs": "^4.1.9"
       },
       "dependencies": {
         "graceful-fs": {
       }
     },
     "lazy-cache": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
-      "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
-      "dev": true,
-      "requires": {
-        "set-getter": "0.1.0"
-      }
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+      "dev": true
     },
     "lcid": {
       "version": "1.0.0",
       "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
       "dev": true,
       "requires": {
-        "invert-kv": "1.0.0"
+        "invert-kv": "^1.0.0"
       }
     },
     "lcov-parse": {
       "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
       "dev": true,
       "requires": {
-        "prelude-ls": "1.1.2",
-        "type-check": "0.3.2"
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
       }
     },
     "liftoff": {
       "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
       "dev": true,
       "requires": {
-        "extend": "3.0.1",
-        "findup-sync": "2.0.0",
-        "fined": "1.1.0",
-        "flagged-respawn": "1.0.0",
-        "is-plain-object": "2.0.4",
-        "object.map": "1.0.1",
-        "rechoir": "0.6.2",
-        "resolve": "1.5.0"
+        "extend": "^3.0.0",
+        "findup-sync": "^2.0.0",
+        "fined": "^1.0.1",
+        "flagged-respawn": "^1.0.0",
+        "is-plain-object": "^2.0.4",
+        "object.map": "^1.0.0",
+        "rechoir": "^0.6.2",
+        "resolve": "^1.1.7"
       }
     },
     "load-json-file": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
-      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+      "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "parse-json": "2.2.0",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1",
-        "strip-bom": "2.0.0"
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^4.0.0",
+        "pify": "^3.0.0",
+        "strip-bom": "^3.0.0"
       },
       "dependencies": {
         "graceful-fs": {
           "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
           "dev": true
         },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
         "strip-bom": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
-          "dev": true,
-          "requires": {
-            "is-utf8": "0.2.1"
-          }
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
         }
       }
     },
       "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
       "dev": true,
       "requires": {
-        "p-locate": "2.0.0",
-        "path-exists": "3.0.0"
+        "p-locate": "^2.0.0",
+        "path-exists": "^3.0.0"
       },
       "dependencies": {
         "path-exists": {
       "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
       "dev": true,
       "requires": {
-        "lodash._root": "3.0.1"
+        "lodash._root": "^3.0.0"
       }
     },
     "lodash.isarguments": {
       "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
       "dev": true,
       "requires": {
-        "lodash._getnative": "3.9.1",
-        "lodash.isarguments": "3.1.0",
-        "lodash.isarray": "3.0.4"
+        "lodash._getnative": "^3.0.0",
+        "lodash.isarguments": "^3.0.0",
+        "lodash.isarray": "^3.0.0"
       }
     },
     "lodash.restparam": {
       "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
       "dev": true,
       "requires": {
-        "lodash._basecopy": "3.0.1",
-        "lodash._basetostring": "3.0.1",
-        "lodash._basevalues": "3.0.0",
-        "lodash._isiterateecall": "3.0.9",
-        "lodash._reinterpolate": "3.0.0",
-        "lodash.escape": "3.2.0",
-        "lodash.keys": "3.1.2",
-        "lodash.restparam": "3.6.1",
-        "lodash.templatesettings": "3.1.1"
+        "lodash._basecopy": "^3.0.0",
+        "lodash._basetostring": "^3.0.0",
+        "lodash._basevalues": "^3.0.0",
+        "lodash._isiterateecall": "^3.0.0",
+        "lodash._reinterpolate": "^3.0.0",
+        "lodash.escape": "^3.0.0",
+        "lodash.keys": "^3.0.0",
+        "lodash.restparam": "^3.0.0",
+        "lodash.templatesettings": "^3.0.0"
       }
     },
     "lodash.templatesettings": {
       "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
       "dev": true,
       "requires": {
-        "lodash._reinterpolate": "3.0.0",
-        "lodash.escape": "3.2.0"
+        "lodash._reinterpolate": "^3.0.0",
+        "lodash.escape": "^3.0.0"
       }
     },
     "log-driver": {
       "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
       "dev": true,
       "requires": {
-        "chalk": "1.1.3"
+        "chalk": "^1.0.0"
       }
     },
     "log4js": {
       "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=",
       "dev": true,
       "requires": {
-        "readable-stream": "1.0.34",
-        "semver": "4.3.6"
+        "readable-stream": "~1.0.2",
+        "semver": "~4.3.3"
       },
       "dependencies": {
         "readable-stream": {
           "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
             "isarray": "0.0.1",
-            "string_decoder": "0.10.31"
+            "string_decoder": "~0.10.x"
           }
         }
       }
       "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
       "dev": true,
       "requires": {
-        "currently-unhandled": "0.4.1",
-        "signal-exit": "3.0.2"
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
       }
     },
     "lru-cache": {
       "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
       "dev": true
     },
+    "magic-string": {
+      "version": "0.22.5",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
+      "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
+      "dev": true,
+      "requires": {
+        "vlq": "^0.2.2"
+      }
+    },
     "make-error": {
       "version": "1.3.4",
       "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz",
       "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=",
       "dev": true,
       "requires": {
-        "make-error": "1.3.4"
+        "make-error": "^1.2.0"
       }
     },
     "make-iterator": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.0.tgz",
-      "integrity": "sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs=",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+      "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
       "dev": true,
       "requires": {
-        "kind-of": "3.2.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "1.1.6"
-          }
-        }
+        "kind-of": "^6.0.2"
       }
     },
     "map-cache": {
       "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
       "dev": true,
       "requires": {
-        "object-visit": "1.0.1"
+        "object-visit": "^1.0.0"
       }
     },
     "matchdep": {
       "integrity": "sha1-pXozgESR+64girqPaDgEN6vC3KU=",
       "dev": true,
       "requires": {
-        "findup-sync": "0.3.0",
-        "micromatch": "2.3.11",
-        "resolve": "1.1.7",
+        "findup-sync": "~0.3.0",
+        "micromatch": "^2.3.7",
+        "resolve": "~1.1.6",
         "stack-trace": "0.0.9"
       },
       "dependencies": {
           "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
           "dev": true,
           "requires": {
-            "arr-flatten": "1.1.0"
+            "arr-flatten": "^1.0.1"
           }
         },
         "array-unique": {
           "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
           "dev": true,
           "requires": {
-            "expand-range": "1.8.2",
-            "preserve": "0.2.0",
-            "repeat-element": "1.1.2"
+            "expand-range": "^1.8.1",
+            "preserve": "^0.2.0",
+            "repeat-element": "^1.1.2"
           }
         },
         "expand-brackets": {
           "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
           "dev": true,
           "requires": {
-            "is-posix-bracket": "0.1.1"
+            "is-posix-bracket": "^0.1.0"
           }
         },
         "extglob": {
           "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
           "dev": true,
           "requires": {
-            "is-extglob": "1.0.0"
+            "is-extglob": "^1.0.0"
           }
         },
         "findup-sync": {
           "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
           "dev": true,
           "requires": {
-            "glob": "5.0.15"
+            "glob": "~5.0.0"
           }
         },
         "glob": {
           "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
           "dev": true,
           "requires": {
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "2 || 3",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
         },
         "is-extglob": {
           "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
           "dev": true,
           "requires": {
-            "is-extglob": "1.0.0"
+            "is-extglob": "^1.0.0"
           }
         },
         "kind-of": {
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "is-buffer": "1.1.6"
+            "is-buffer": "^1.1.5"
           }
         },
         "micromatch": {
           "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
           "dev": true,
           "requires": {
-            "arr-diff": "2.0.0",
-            "array-unique": "0.2.1",
-            "braces": "1.8.5",
-            "expand-brackets": "0.1.5",
-            "extglob": "0.3.2",
-            "filename-regex": "2.0.1",
-            "is-extglob": "1.0.0",
-            "is-glob": "2.0.1",
-            "kind-of": "3.2.2",
-            "normalize-path": "2.1.1",
-            "object.omit": "2.0.1",
-            "parse-glob": "3.0.4",
-            "regex-cache": "0.4.4"
+            "arr-diff": "^2.0.0",
+            "array-unique": "^0.2.1",
+            "braces": "^1.8.2",
+            "expand-brackets": "^0.1.4",
+            "extglob": "^0.3.1",
+            "filename-regex": "^2.0.0",
+            "is-extglob": "^1.0.0",
+            "is-glob": "^2.0.1",
+            "kind-of": "^3.0.2",
+            "normalize-path": "^2.0.1",
+            "object.omit": "^2.0.0",
+            "parse-glob": "^3.0.4",
+            "regex-cache": "^0.4.2"
           }
         },
         "resolve": {
         }
       }
     },
+    "math-random": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
+      "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
+      "dev": true
+    },
     "media-typer": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
       "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
       "dev": true,
       "requires": {
-        "camelcase-keys": "2.1.0",
-        "decamelize": "1.2.0",
-        "loud-rejection": "1.6.0",
-        "map-obj": "1.0.1",
-        "minimist": "1.2.0",
-        "normalize-package-data": "2.4.0",
-        "object-assign": "4.1.1",
-        "read-pkg-up": "1.0.1",
-        "redent": "1.0.0",
-        "trim-newlines": "1.0.0"
+        "camelcase-keys": "^2.0.0",
+        "decamelize": "^1.1.2",
+        "loud-rejection": "^1.0.0",
+        "map-obj": "^1.0.1",
+        "minimist": "^1.1.3",
+        "normalize-package-data": "^2.3.4",
+        "object-assign": "^4.0.1",
+        "read-pkg-up": "^1.0.1",
+        "redent": "^1.0.0",
+        "trim-newlines": "^1.0.0"
+      }
+    },
+    "merge-source-map": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz",
+      "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.5.6"
       }
     },
     "micromatch": {
-      "version": "3.1.9",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz",
-      "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "4.0.0",
-        "array-unique": "0.3.2",
-        "braces": "2.3.1",
-        "define-property": "2.0.2",
-        "extend-shallow": "3.0.2",
-        "extglob": "2.0.4",
-        "fragment-cache": "0.2.1",
-        "kind-of": "6.0.2",
-        "nanomatch": "1.2.9",
-        "object.pick": "1.3.0",
-        "regex-not": "1.0.2",
-        "snapdragon": "0.8.1",
-        "to-regex": "3.0.2"
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
       }
     },
     "mime": {
       "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
       "dev": true,
       "requires": {
-        "mime-db": "1.33.0"
+        "mime-db": "~1.33.0"
       }
     },
     "minimatch": {
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
       "dev": true,
       "requires": {
-        "brace-expansion": "1.1.11"
+        "brace-expansion": "^1.1.7"
       }
     },
     "minimist": {
       "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
       "dev": true,
       "requires": {
-        "for-in": "1.0.2",
-        "is-extendable": "1.0.1"
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
       },
       "dependencies": {
         "is-extendable": {
           "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
           "dev": true,
           "requires": {
-            "is-plain-object": "2.0.4"
+            "is-plain-object": "^2.0.4"
           }
         }
       }
       "dev": true
     },
     "nan": {
-      "version": "2.9.2",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz",
-      "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==",
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+      "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
       "dev": true,
       "optional": true
     },
     "nanomatch": {
-      "version": "1.2.9",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
-      "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
       "dev": true,
       "requires": {
-        "arr-diff": "4.0.0",
-        "array-unique": "0.3.2",
-        "define-property": "2.0.2",
-        "extend-shallow": "3.0.2",
-        "fragment-cache": "0.2.1",
-        "is-odd": "2.0.0",
-        "is-windows": "1.0.2",
-        "kind-of": "6.0.2",
-        "object.pick": "1.3.0",
-        "regex-not": "1.0.2",
-        "snapdragon": "0.8.1",
-        "to-regex": "3.0.2"
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
       }
     },
     "natives": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz",
-      "integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA==",
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz",
+      "integrity": "sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg==",
       "dev": true
     },
     "natural-compare": {
       "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
       "dev": true
     },
+    "next-tick": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+      "dev": true
+    },
     "node.extend": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz",
       "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=",
       "dev": true,
       "requires": {
-        "is": "3.2.1"
+        "is": "^3.1.0"
       }
     },
     "nopt": {
       "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
       "dev": true,
       "requires": {
-        "abbrev": "1.0.9"
+        "abbrev": "1"
       }
     },
     "normalize-package-data": {
       "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
       "dev": true,
       "requires": {
-        "hosted-git-info": "2.5.0",
-        "is-builtin-module": "1.0.0",
-        "semver": "4.3.6",
-        "validate-npm-package-license": "3.0.1"
+        "hosted-git-info": "^2.1.4",
+        "is-builtin-module": "^1.0.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
       }
     },
     "normalize-path": {
       "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
       "dev": true,
       "requires": {
-        "remove-trailing-separator": "1.1.0"
+        "remove-trailing-separator": "^1.0.1"
       }
     },
     "number-is-nan": {
       "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
       "dev": true,
       "requires": {
-        "copy-descriptor": "0.1.1",
-        "define-property": "0.2.5",
-        "kind-of": "3.2.2"
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
       },
       "dependencies": {
         "define-property": {
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "is-descriptor": "0.1.6"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "0.1.6",
-            "is-data-descriptor": "0.1.4",
-            "kind-of": "5.1.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "5.1.0",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-              "dev": true
-            }
+            "is-descriptor": "^0.1.0"
           }
         },
         "kind-of": {
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "is-buffer": "1.1.6"
+            "is-buffer": "^1.1.5"
           }
         }
       }
       "dev": true
     },
     "object-keys": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
-      "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=",
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
+      "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
       "dev": true
     },
     "object-visit": {
       "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
       "dev": true,
       "requires": {
-        "isobject": "3.0.1"
+        "isobject": "^3.0.0"
       }
     },
     "object.assign": {
       "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
       "dev": true,
       "requires": {
-        "define-properties": "1.1.2",
-        "function-bind": "1.1.1",
-        "has-symbols": "1.0.0",
-        "object-keys": "1.0.11"
+        "define-properties": "^1.1.2",
+        "function-bind": "^1.1.1",
+        "has-symbols": "^1.0.0",
+        "object-keys": "^1.0.11"
       }
     },
     "object.defaults": {
       "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
       "dev": true,
       "requires": {
-        "array-each": "1.0.1",
-        "array-slice": "1.1.0",
-        "for-own": "1.0.0",
-        "isobject": "3.0.1"
+        "array-each": "^1.0.1",
+        "array-slice": "^1.0.0",
+        "for-own": "^1.0.0",
+        "isobject": "^3.0.0"
       }
     },
     "object.map": {
       "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
       "dev": true,
       "requires": {
-        "for-own": "1.0.0",
-        "make-iterator": "1.0.0"
+        "for-own": "^1.0.0",
+        "make-iterator": "^1.0.0"
       }
     },
     "object.omit": {
       "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
       "dev": true,
       "requires": {
-        "for-own": "0.1.5",
-        "is-extendable": "0.1.1"
+        "for-own": "^0.1.4",
+        "is-extendable": "^0.1.1"
       },
       "dependencies": {
         "for-own": {
           "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
           "dev": true,
           "requires": {
-            "for-in": "1.0.2"
+            "for-in": "^1.0.1"
           }
         }
       }
       "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
       "dev": true,
       "requires": {
-        "isobject": "3.0.1"
+        "isobject": "^3.0.1"
       }
     },
     "on-finished": {
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
       "dev": true,
       "requires": {
-        "wrappy": "1.0.2"
+        "wrappy": "1"
       }
     },
     "onetime": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+      "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
       "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
       "dev": true
     },
       "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
       "dev": true,
       "requires": {
-        "minimist": "0.0.10",
-        "wordwrap": "0.0.2"
+        "minimist": "~0.0.1",
+        "wordwrap": "~0.0.2"
       },
       "dependencies": {
         "minimist": {
           "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
           "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
           "dev": true
+        },
+        "wordwrap": {
+          "version": "0.0.3",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+          "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+          "dev": true
         }
       }
     },
       "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
       "dev": true,
       "requires": {
-        "deep-is": "0.1.3",
-        "fast-levenshtein": "2.0.6",
-        "levn": "0.3.0",
-        "prelude-ls": "1.1.2",
-        "type-check": "0.3.2",
-        "wordwrap": "1.0.0"
-      },
-      "dependencies": {
-        "wordwrap": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
-          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
-          "dev": true
-        }
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.4",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "wordwrap": "~1.0.0"
       }
     },
     "options": {
       "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
       "dev": true,
       "requires": {
-        "end-of-stream": "0.1.5",
-        "sequencify": "0.0.7",
-        "stream-consume": "0.1.1"
+        "end-of-stream": "~0.1.5",
+        "sequencify": "~0.0.7",
+        "stream-consume": "~0.1.0"
       }
     },
     "ordered-read-streams": {
       "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
       "dev": true,
       "requires": {
-        "lcid": "1.0.0"
+        "lcid": "^1.0.0"
       }
     },
     "os-tmpdir": {
       "dev": true
     },
     "p-limit": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
-      "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
       "dev": true,
       "requires": {
-        "p-try": "1.0.0"
+        "p-try": "^1.0.0"
       }
     },
     "p-locate": {
       "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
       "dev": true,
       "requires": {
-        "p-limit": "1.2.0"
+        "p-limit": "^1.1.0"
       }
     },
     "p-try": {
       "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
       "dev": true,
       "requires": {
-        "is-absolute": "1.0.0",
-        "map-cache": "0.2.2",
-        "path-root": "0.1.1"
+        "is-absolute": "^1.0.0",
+        "map-cache": "^0.2.0",
+        "path-root": "^0.1.1"
       }
     },
     "parse-glob": {
       "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
       "dev": true,
       "requires": {
-        "glob-base": "0.3.0",
-        "is-dotfile": "1.0.3",
-        "is-extglob": "1.0.0",
-        "is-glob": "2.0.1"
+        "glob-base": "^0.3.0",
+        "is-dotfile": "^1.0.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.0"
       },
       "dependencies": {
         "is-extglob": {
           "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
           "dev": true,
           "requires": {
-            "is-extglob": "1.0.0"
+            "is-extglob": "^1.0.0"
           }
         }
       }
     },
     "parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
       "dev": true,
       "requires": {
-        "error-ex": "1.3.1"
+        "error-ex": "^1.3.1",
+        "json-parse-better-errors": "^1.0.1"
       }
     },
     "parse-passwd": {
       "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=",
       "dev": true,
       "requires": {
-        "better-assert": "1.0.2"
+        "better-assert": "~1.0.0"
       }
     },
     "parseqs": {
       "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
       "dev": true,
       "requires": {
-        "better-assert": "1.0.2"
+        "better-assert": "~1.0.0"
       }
     },
     "parseuri": {
       "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
       "dev": true,
       "requires": {
-        "better-assert": "1.0.2"
+        "better-assert": "~1.0.0"
       }
     },
     "parseurl": {
       "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
       "dev": true,
       "requires": {
-        "process": "0.11.10",
-        "util": "0.10.3"
+        "process": "^0.11.1",
+        "util": "^0.10.3"
       }
     },
     "path-exists": {
       "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
       "dev": true,
       "requires": {
-        "pinkie-promise": "2.0.1"
+        "pinkie-promise": "^2.0.0"
       }
     },
     "path-is-absolute": {
       "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
       "dev": true,
       "requires": {
-        "path-root-regex": "0.1.2"
+        "path-root-regex": "^0.1.0"
       }
     },
     "path-root-regex": {
       "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1"
+        "graceful-fs": "^4.1.2",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
       },
       "dependencies": {
         "graceful-fs": {
       "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=",
       "dev": true,
       "requires": {
-        "es6-promise": "4.2.4",
-        "extract-zip": "1.6.6",
-        "fs-extra": "1.0.0",
-        "hasha": "2.2.0",
-        "kew": "0.7.0",
-        "progress": "1.1.8",
-        "request": "2.83.0",
-        "request-progress": "2.0.1",
-        "which": "1.3.0"
+        "es6-promise": "^4.0.3",
+        "extract-zip": "^1.6.5",
+        "fs-extra": "^1.0.0",
+        "hasha": "^2.2.0",
+        "kew": "^0.7.0",
+        "progress": "^1.1.8",
+        "request": "^2.81.0",
+        "request-progress": "^2.0.1",
+        "which": "^1.2.10"
       },
       "dependencies": {
         "es6-promise": {
       "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
       "dev": true,
       "requires": {
-        "pinkie": "2.0.4"
+        "pinkie": "^2.0.0"
       }
     },
     "pkg-conf": {
       "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=",
       "dev": true,
       "requires": {
-        "find-up": "2.1.0",
-        "load-json-file": "4.0.0"
+        "find-up": "^2.0.0",
+        "load-json-file": "^4.0.0"
       },
       "dependencies": {
         "find-up": {
           "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
           "dev": true,
           "requires": {
-            "locate-path": "2.0.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.1.11",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-          "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
-          "dev": true
-        },
-        "load-json-file": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
-          "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "4.1.11",
-            "parse-json": "4.0.0",
-            "pify": "3.0.0",
-            "strip-bom": "3.0.0"
-          }
-        },
-        "parse-json": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
-          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
-          "dev": true,
-          "requires": {
-            "error-ex": "1.3.1",
-            "json-parse-better-errors": "1.0.1"
+            "locate-path": "^2.0.0"
           }
-        },
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-          "dev": true
-        },
-        "strip-bom": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
-          "dev": true
         }
       }
     },
       "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=",
       "dev": true,
       "requires": {
-        "debug-log": "1.0.1",
-        "find-root": "1.1.0",
-        "xtend": "4.0.1"
+        "debug-log": "^1.0.0",
+        "find-root": "^1.0.0",
+        "xtend": "^4.0.1"
       }
     },
     "pkg-dir": {
       "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
       "dev": true,
       "requires": {
-        "find-up": "1.1.2"
+        "find-up": "^1.0.0"
       }
     },
     "pkg-up": {
       "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=",
       "dev": true,
       "requires": {
-        "find-up": "1.1.2"
+        "find-up": "^1.0.0"
+      }
+    },
+    "plugin-error": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+      "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^1.0.1",
+        "arr-diff": "^4.0.0",
+        "arr-union": "^3.1.0",
+        "extend-shallow": "^3.0.2"
       }
     },
     "pluralize": {
       "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=",
       "dev": true,
       "requires": {
-        "number-is-nan": "1.0.1"
+        "number-is-nan": "^1.0.0"
       }
     },
     "pretty-hrtime": {
       "dev": true,
       "requires": {
         "buffer-equal": "0.0.1",
-        "minimist": "1.2.0",
-        "through2": "2.0.3"
+        "minimist": "^1.1.3",
+        "through2": "^2.0.0"
       }
     },
     "randomatic": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
-      "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
+      "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
       "dev": true,
       "requires": {
-        "is-number": "3.0.0",
-        "kind-of": "4.0.0"
+        "is-number": "^4.0.0",
+        "kind-of": "^6.0.0",
+        "math-random": "^1.0.1"
       },
       "dependencies": {
-        "kind-of": {
+        "is-number": {
           "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "1.1.6"
-          }
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+          "dev": true
         }
       }
     },
       "dev": true
     },
     "raw-body": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
-      "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
+      "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
       "dev": true,
       "requires": {
         "bytes": "3.0.0",
-        "http-errors": "1.6.2",
-        "iconv-lite": "0.4.19",
+        "http-errors": "1.6.3",
+        "iconv-lite": "0.4.23",
         "unpipe": "1.0.0"
       }
     },
       "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
       "dev": true,
       "requires": {
-        "load-json-file": "1.1.0",
-        "normalize-package-data": "2.4.0",
-        "path-type": "1.1.0"
+        "load-json-file": "^1.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^1.0.0"
+      },
+      "dependencies": {
+        "graceful-fs": {
+          "version": "4.1.11",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+          "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+          "dev": true
+        },
+        "load-json-file": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+          "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^2.2.0",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0",
+            "strip-bom": "^2.0.0"
+          }
+        },
+        "parse-json": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+          "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.2.0"
+          }
+        },
+        "strip-bom": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+          "dev": true,
+          "requires": {
+            "is-utf8": "^0.2.0"
+          }
+        }
       }
     },
     "read-pkg-up": {
       "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
       "dev": true,
       "requires": {
-        "find-up": "1.1.2",
-        "read-pkg": "1.1.0"
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
       }
     },
     "readable-stream": {
       "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
       "dev": true,
       "requires": {
-        "core-util-is": "1.0.2",
-        "inherits": "2.0.3",
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.1",
         "isarray": "0.0.1",
-        "string_decoder": "0.10.31"
+        "string_decoder": "~0.10.x"
       }
     },
     "readdirp": {
       "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "minimatch": "3.0.4",
-        "readable-stream": "2.3.4",
-        "set-immediate-shim": "1.0.1"
+        "graceful-fs": "^4.1.2",
+        "minimatch": "^3.0.2",
+        "readable-stream": "^2.0.2",
+        "set-immediate-shim": "^1.0.1"
       },
       "dependencies": {
         "graceful-fs": {
           "dev": true
         },
         "readable-stream": {
-          "version": "2.3.4",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz",
-          "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==",
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "1.0.0",
-            "process-nextick-args": "2.0.0",
-            "safe-buffer": "5.1.1",
-            "string_decoder": "1.0.3",
-            "util-deprecate": "1.0.2"
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
           }
         },
         "string_decoder": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
-          "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
           "dev": true,
           "requires": {
-            "safe-buffer": "5.1.1"
+            "safe-buffer": "~5.1.0"
           }
         }
       }
       "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=",
       "dev": true,
       "requires": {
-        "code-point-at": "1.1.0",
-        "is-fullwidth-code-point": "1.0.0",
+        "code-point-at": "^1.0.0",
+        "is-fullwidth-code-point": "^1.0.0",
         "mute-stream": "0.0.5"
       }
     },
       "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
       "dev": true,
       "requires": {
-        "resolve": "1.5.0"
+        "resolve": "^1.1.6"
       }
     },
     "redent": {
       "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
       "dev": true,
       "requires": {
-        "indent-string": "2.1.0",
-        "strip-indent": "1.0.1"
+        "indent-string": "^2.1.0",
+        "strip-indent": "^1.0.1"
       }
     },
     "regenerator-runtime": {
       "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
       "dev": true,
       "requires": {
-        "is-equal-shallow": "0.1.3"
+        "is-equal-shallow": "^0.1.3"
       }
     },
     "regex-not": {
       "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
       "dev": true,
       "requires": {
-        "extend-shallow": "3.0.2",
-        "safe-regex": "1.1.0"
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
       }
     },
     "remove-trailing-separator": {
       "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
       "dev": true,
       "requires": {
-        "is-finite": "1.0.2"
+        "is-finite": "^1.0.0"
       }
     },
     "replace-ext": {
       "dev": true
     },
     "request": {
-      "version": "2.83.0",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
-      "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==",
-      "dev": true,
-      "requires": {
-        "aws-sign2": "0.7.0",
-        "aws4": "1.6.0",
-        "caseless": "0.12.0",
-        "combined-stream": "1.0.6",
-        "extend": "3.0.1",
-        "forever-agent": "0.6.1",
-        "form-data": "2.3.2",
-        "har-validator": "5.0.3",
-        "hawk": "6.0.2",
-        "http-signature": "1.2.0",
-        "is-typedarray": "1.0.0",
-        "isstream": "0.1.2",
-        "json-stringify-safe": "5.0.1",
-        "mime-types": "2.1.18",
-        "oauth-sign": "0.8.2",
-        "performance-now": "2.1.0",
-        "qs": "6.5.1",
-        "safe-buffer": "5.1.1",
-        "stringstream": "0.0.5",
-        "tough-cookie": "2.3.3",
-        "tunnel-agent": "0.6.0",
-        "uuid": "3.2.1"
+      "version": "2.87.0",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
+      "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
+      "dev": true,
+      "requires": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.6.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.5",
+        "extend": "~3.0.1",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.1",
+        "har-validator": "~5.0.3",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.17",
+        "oauth-sign": "~0.8.2",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.1",
+        "safe-buffer": "^5.1.1",
+        "tough-cookie": "~2.3.3",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.1.0"
       },
       "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "^4.6.0",
+            "fast-deep-equal": "^1.0.0",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.3.0"
+          }
+        },
         "assert-plus": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
           "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
           "dev": true
         },
-        "boom": {
-          "version": "4.3.1",
-          "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
-          "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
-          "dev": true,
-          "requires": {
-            "hoek": "4.2.1"
-          }
-        },
         "caseless": {
           "version": "0.12.0",
           "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
           "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
           "dev": true
         },
-        "cryptiles": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
-          "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
-          "dev": true,
-          "requires": {
-            "boom": "5.2.0"
-          },
-          "dependencies": {
-            "boom": {
-              "version": "5.2.0",
-              "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
-              "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
-              "dev": true,
-              "requires": {
-                "hoek": "4.2.1"
-              }
-            }
-          }
-        },
         "form-data": {
           "version": "2.3.2",
           "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
           "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
           "dev": true,
           "requires": {
-            "asynckit": "0.4.0",
+            "asynckit": "^0.4.0",
             "combined-stream": "1.0.6",
-            "mime-types": "2.1.18"
+            "mime-types": "^2.1.12"
           }
         },
         "har-validator": {
           "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
           "dev": true,
           "requires": {
-            "ajv": "5.5.2",
-            "har-schema": "2.0.0"
-          }
-        },
-        "hawk": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
-          "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
-          "dev": true,
-          "requires": {
-            "boom": "4.3.1",
-            "cryptiles": "3.1.2",
-            "hoek": "4.2.1",
-            "sntp": "2.1.0"
+            "ajv": "^5.1.0",
+            "har-schema": "^2.0.0"
           }
         },
-        "hoek": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
-          "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==",
-          "dev": true
-        },
         "http-signature": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
           "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
           "dev": true,
           "requires": {
-            "assert-plus": "1.0.0",
-            "jsprim": "1.4.1",
-            "sshpk": "1.13.1"
+            "assert-plus": "^1.0.0",
+            "jsprim": "^1.2.2",
+            "sshpk": "^1.7.0"
           }
         },
         "qs": {
-          "version": "6.5.1",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
-          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
           "dev": true
         },
-        "sntp": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
-          "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
-          "dev": true,
-          "requires": {
-            "hoek": "4.2.1"
-          }
-        },
         "tunnel-agent": {
           "version": "0.6.0",
           "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
           "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
           "dev": true,
           "requires": {
-            "safe-buffer": "5.1.1"
+            "safe-buffer": "^5.0.1"
           }
         }
       }
       "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=",
       "dev": true,
       "requires": {
-        "throttleit": "1.0.0"
+        "throttleit": "^1.0.0"
       }
     },
     "require-uncached": {
       "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
       "dev": true,
       "requires": {
-        "caller-path": "0.1.0",
-        "resolve-from": "1.0.1"
+        "caller-path": "^0.1.0",
+        "resolve-from": "^1.0.0"
       }
     },
     "requires-port": {
       "dev": true
     },
     "resolve": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
-      "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
+      "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
       "dev": true,
       "requires": {
-        "path-parse": "1.0.5"
+        "path-parse": "^1.0.5"
       }
     },
     "resolve-dir": {
       "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
       "dev": true,
       "requires": {
-        "expand-tilde": "2.0.2",
-        "global-modules": "1.0.0"
+        "expand-tilde": "^2.0.0",
+        "global-modules": "^1.0.0"
       }
     },
     "resolve-from": {
       "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
       "dev": true,
       "requires": {
-        "exit-hook": "1.1.1",
-        "onetime": "1.1.0"
+        "exit-hook": "^1.0.0",
+        "onetime": "^1.0.0"
       }
     },
     "restructure": {
       "integrity": "sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg=",
       "dev": true,
       "requires": {
-        "browserify-optional": "1.0.1"
+        "browserify-optional": "^1.0.0"
       }
     },
     "ret": {
       "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
       "dev": true,
       "requires": {
-        "align-text": "0.1.4"
+        "align-text": "^0.1.1"
       }
     },
     "rimraf": {
       "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
       "dev": true,
       "requires": {
-        "glob": "7.1.2"
+        "glob": "^7.0.5"
       }
     },
     "run-async": {
       "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=",
       "dev": true,
       "requires": {
-        "once": "1.4.0"
+        "once": "^1.3.0"
       }
     },
     "run-parallel": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.7.tgz",
-      "integrity": "sha512-nB641a6enJOh0fdsFHR9SiVCiOlAyjMplImDdjV3kWCzJZw9rwzvGwmpGuPmfX//Yxblh0pkzPcFcxA81iwmxA==",
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
+      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
       "dev": true
     },
     "rx-lite": {
       "dev": true
     },
     "safe-buffer": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
-      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
       "dev": true
     },
     "safe-regex": {
       "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
       "dev": true,
       "requires": {
-        "ret": "0.1.15"
+        "ret": "~0.1.10"
       }
     },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
     "sax": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
       "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
       "dev": true,
       "requires": {
-        "sver-compat": "1.5.0"
+        "sver-compat": "^1.5.0"
       }
     },
     "sequencify": {
       "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=",
       "dev": true
     },
-    "set-getter": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
-      "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
-      "dev": true,
-      "requires": {
-        "to-object-path": "0.3.0"
-      }
-    },
     "set-immediate-shim": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
       "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
       "dev": true,
       "requires": {
-        "extend-shallow": "2.0.1",
-        "is-extendable": "0.1.1",
-        "is-plain-object": "2.0.4",
-        "split-string": "3.1.0"
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
       },
       "dependencies": {
         "extend-shallow": {
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
           "dev": true,
           "requires": {
-            "is-extendable": "0.1.1"
+            "is-extendable": "^0.1.0"
           }
         }
       }
     },
     "setprototypeof": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
-      "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
       "dev": true
     },
     "shallow-copy": {
       "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
       "dev": true,
       "requires": {
-        "glob": "7.1.2",
-        "interpret": "1.1.0",
-        "rechoir": "0.6.2"
+        "glob": "^7.0.0",
+        "interpret": "^1.0.0",
+        "rechoir": "^0.6.2"
       }
     },
     "sigmund": {
       "dev": true
     },
     "snapdragon": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz",
-      "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=",
-      "dev": true,
-      "requires": {
-        "base": "0.11.2",
-        "debug": "2.6.9",
-        "define-property": "0.2.5",
-        "extend-shallow": "2.0.1",
-        "map-cache": "0.2.2",
-        "source-map": "0.5.7",
-        "source-map-resolve": "0.5.1",
-        "use": "2.0.2"
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
       },
       "dependencies": {
         "define-property": {
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "is-descriptor": "0.1.6"
+            "is-descriptor": "^0.1.0"
           }
         },
         "extend-shallow": {
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
           "dev": true,
           "requires": {
-            "is-extendable": "0.1.1"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.6"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.6"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "0.1.6",
-            "is-data-descriptor": "0.1.4",
-            "kind-of": "5.1.0"
+            "is-extendable": "^0.1.0"
           }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
         }
       }
     },
       "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
       "dev": true,
       "requires": {
-        "define-property": "1.0.0",
-        "isobject": "3.0.1",
-        "snapdragon-util": "3.0.1"
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
       },
       "dependencies": {
         "define-property": {
           "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
           "dev": true,
           "requires": {
-            "is-descriptor": "1.0.2"
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
           }
         }
       }
       "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
       "dev": true,
       "requires": {
-        "kind-of": "3.2.2"
+        "kind-of": "^3.2.0"
       },
       "dependencies": {
         "kind-of": {
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "is-buffer": "1.1.6"
+            "is-buffer": "^1.1.5"
           }
         }
       }
       "integrity": "sha1-ahfUeYy7yLxuETFTaUkHqLrJSU0=",
       "dev": true,
       "requires": {
-        "chalk": "1.1.3",
-        "inherits": "2.0.3",
-        "minimist": "1.2.0",
-        "readable-stream": "2.3.4",
-        "standard": "9.0.2",
-        "standard-json": "1.0.2",
-        "text-table": "0.2.0"
+        "chalk": "^1.1.0",
+        "inherits": "^2.0.1",
+        "minimist": "^1.1.1",
+        "readable-stream": "^2.0.6",
+        "standard": "*",
+        "standard-json": "^1.0.0",
+        "text-table": "^0.2.0"
       },
       "dependencies": {
         "isarray": {
           "dev": true
         },
         "readable-stream": {
-          "version": "2.3.4",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz",
-          "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==",
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "1.0.0",
-            "process-nextick-args": "2.0.0",
-            "safe-buffer": "5.1.1",
-            "string_decoder": "1.0.3",
-            "util-deprecate": "1.0.2"
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
           }
         },
         "string_decoder": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
-          "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
           "dev": true,
           "requires": {
-            "safe-buffer": "5.1.1"
+            "safe-buffer": "~5.1.0"
           }
         }
       }
       "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
       "dev": true,
       "requires": {
-        "hoek": "2.16.3"
+        "hoek": "2.x.x"
       }
     },
     "socket.io": {
       "dev": true
     },
     "source-map-resolve": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
-      "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+      "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
       "dev": true,
       "requires": {
-        "atob": "2.0.3",
-        "decode-uri-component": "0.2.0",
-        "resolve-url": "0.2.1",
-        "source-map-url": "0.4.0",
-        "urix": "0.1.0"
+        "atob": "^2.1.1",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
       }
     },
     "source-map-url": {
       "dev": true
     },
     "sparkles": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
-      "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
+      "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==",
       "dev": true
     },
     "spdx-correct": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
-      "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+      "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
       "dev": true,
       "requires": {
-        "spdx-license-ids": "1.2.2"
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
       }
     },
-    "spdx-expression-parse": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
-      "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
+    "spdx-exceptions": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+      "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
       "dev": true
     },
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
     "spdx-license-ids": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
-      "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+      "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
       "dev": true
     },
     "split-string": {
       "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
       "dev": true,
       "requires": {
-        "extend-shallow": "3.0.2"
+        "extend-shallow": "^3.0.0"
       }
     },
     "sprintf-js": {
       "dev": true
     },
     "sshpk": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
-      "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
-      "dev": true,
-      "requires": {
-        "asn1": "0.2.3",
-        "assert-plus": "1.0.0",
-        "bcrypt-pbkdf": "1.0.1",
-        "dashdash": "1.14.1",
-        "ecc-jsbn": "0.1.1",
-        "getpass": "0.1.7",
-        "jsbn": "0.1.1",
-        "tweetnacl": "0.14.5"
+      "version": "1.14.2",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
+      "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
+      "dev": true,
+      "requires": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
       },
       "dependencies": {
         "assert-plus": {
       "integrity": "sha1-m9O5RnSS4hKxkU14VTlD/5tI/Zk=",
       "dev": true,
       "requires": {
-        "eslint": "3.18.0",
+        "eslint": "~3.18.0",
         "eslint-config-standard": "7.1.0",
         "eslint-config-standard-jsx": "3.3.0",
-        "eslint-plugin-promise": "3.4.2",
-        "eslint-plugin-react": "6.9.0",
-        "eslint-plugin-standard": "2.0.1",
-        "standard-engine": "5.4.0"
+        "eslint-plugin-promise": "~3.4.0",
+        "eslint-plugin-react": "~6.9.0",
+        "eslint-plugin-standard": "~2.0.1",
+        "standard-engine": "~5.4.0"
+      },
+      "dependencies": {
+        "eslint": {
+          "version": "3.18.0",
+          "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.18.0.tgz",
+          "integrity": "sha1-ZH6YXErnFQLSCsYsEJ9m1RBMiks=",
+          "dev": true,
+          "requires": {
+            "babel-code-frame": "^6.16.0",
+            "chalk": "^1.1.3",
+            "concat-stream": "^1.5.2",
+            "debug": "^2.1.1",
+            "doctrine": "^2.0.0",
+            "escope": "^3.6.0",
+            "espree": "^3.4.0",
+            "esquery": "^1.0.0",
+            "estraverse": "^4.2.0",
+            "esutils": "^2.0.2",
+            "file-entry-cache": "^2.0.0",
+            "glob": "^7.0.3",
+            "globals": "^9.14.0",
+            "ignore": "^3.2.0",
+            "imurmurhash": "^0.1.4",
+            "inquirer": "^0.12.0",
+            "is-my-json-valid": "^2.10.0",
+            "is-resolvable": "^1.0.0",
+            "js-yaml": "^3.5.1",
+            "json-stable-stringify": "^1.0.0",
+            "levn": "^0.3.0",
+            "lodash": "^4.0.0",
+            "mkdirp": "^0.5.0",
+            "natural-compare": "^1.4.0",
+            "optionator": "^0.8.2",
+            "path-is-inside": "^1.0.1",
+            "pluralize": "^1.2.1",
+            "progress": "^1.1.8",
+            "require-uncached": "^1.0.2",
+            "shelljs": "^0.7.5",
+            "strip-bom": "^3.0.0",
+            "strip-json-comments": "~2.0.1",
+            "table": "^3.7.8",
+            "text-table": "~0.2.0",
+            "user-home": "^2.0.0"
+          }
+        },
+        "eslint-config-standard": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-7.1.0.tgz",
+          "integrity": "sha1-R+dp6gc59bLVaTsaUBwhyWUPr88=",
+          "dev": true
+        },
+        "eslint-config-standard-jsx": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.3.0.tgz",
+          "integrity": "sha1-yrCAGhWjYL9j+suXqyL73YjYpeA=",
+          "dev": true
+        },
+        "eslint-plugin-promise": {
+          "version": "3.4.2",
+          "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.4.2.tgz",
+          "integrity": "sha1-G+J5Pq/i0YtbEjuBNsJp+AT+cSI=",
+          "dev": true
+        },
+        "eslint-plugin-react": {
+          "version": "6.9.0",
+          "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.9.0.tgz",
+          "integrity": "sha1-VMLpkGt2+dEBQgML3DTp1oQKC7I=",
+          "dev": true,
+          "requires": {
+            "array.prototype.find": "^2.0.1",
+            "doctrine": "^1.2.2",
+            "jsx-ast-utils": "^1.3.4"
+          },
+          "dependencies": {
+            "doctrine": {
+              "version": "1.5.0",
+              "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+              "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+              "dev": true,
+              "requires": {
+                "esutils": "^2.0.2",
+                "isarray": "^1.0.0"
+              }
+            }
+          }
+        },
+        "eslint-plugin-standard": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz",
+          "integrity": "sha1-NYlpn/nJF/LCX3apFmh/ZBw2n/M=",
+          "dev": true
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+          "dev": true
+        },
+        "standard-engine": {
+          "version": "5.4.0",
+          "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-5.4.0.tgz",
+          "integrity": "sha1-4OhpWeoHhkJdM4PkDBv3DS+YVXk=",
+          "dev": true,
+          "requires": {
+            "deglob": "^2.1.0",
+            "get-stdin": "^5.0.1",
+            "home-or-tmp": "^2.0.0",
+            "minimist": "^1.1.0",
+            "pkg-conf": "^2.0.0"
+          }
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
+        },
+        "user-home": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
+          "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
+          "dev": true,
+          "requires": {
+            "os-homedir": "^1.0.0"
+          }
+        }
       }
     },
     "standard-engine": {
-      "version": "5.4.0",
-      "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-5.4.0.tgz",
-      "integrity": "sha1-4OhpWeoHhkJdM4PkDBv3DS+YVXk=",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-7.0.0.tgz",
+      "integrity": "sha1-67d7nI/CyBZf+jU72Rug3/Qa9pA=",
       "dev": true,
       "requires": {
-        "deglob": "2.1.0",
-        "get-stdin": "5.0.1",
-        "home-or-tmp": "2.0.0",
-        "minimist": "1.2.0",
-        "pkg-conf": "2.1.0"
-      },
-      "dependencies": {
-        "get-stdin": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
-          "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=",
-          "dev": true
-        }
+        "deglob": "^2.1.0",
+        "get-stdin": "^5.0.1",
+        "minimist": "^1.1.0",
+        "pkg-conf": "^2.0.0"
       }
     },
     "standard-json": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/standard-json/-/standard-json-1.0.2.tgz",
-      "integrity": "sha1-gt6koUx4zZ4104zeS4isa2JZaiM=",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/standard-json/-/standard-json-1.0.3.tgz",
+      "integrity": "sha512-lhMP+KREBcfyyMe2ObJlEjJ0lc0ItA9uny83d9ZL6ggYtB79DuaAKCxJVoiflg5EV3D2rpuWn+n4+zXjWXk0sQ==",
       "dev": true,
       "requires": {
-        "concat-stream": "1.6.0"
+        "concat-stream": "^1.5.0"
       }
     },
     "stat-mode": {
       "integrity": "sha512-6flshd3F1Gwm+Ksxq463LtFd1liC77N/PX1FVVc3OzL3hAmo2fwHFbuArkcfi7s9rTNsLEhcRmXGFZhlgy40uw==",
       "dev": true,
       "requires": {
-        "escodegen": "1.8.1"
+        "escodegen": "^1.8.1"
       }
     },
     "static-extend": {
       "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
       "dev": true,
       "requires": {
-        "define-property": "0.2.5",
-        "object-copy": "0.1.0"
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
       },
       "dependencies": {
         "define-property": {
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "is-descriptor": "0.1.6"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.6"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.6"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "0.1.6",
-            "is-data-descriptor": "0.1.4",
-            "kind-of": "5.1.0"
+            "is-descriptor": "^0.1.0"
           }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
         }
       }
     },
     "static-module": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.1.1.tgz",
-      "integrity": "sha512-PPLCnxRl74wV38rG1T0rH8Fl2wIktTXFo7/varrZjtSGb/vndZIGkpe4HJVd8hoBYXRkRHW6hlCRAHvmDgrYQQ==",
-      "dev": true,
-      "requires": {
-        "concat-stream": "1.6.0",
-        "duplexer2": "0.1.4",
-        "escodegen": "1.9.0",
-        "falafel": "2.1.0",
-        "has": "1.0.1",
-        "object-inspect": "1.4.1",
-        "quote-stream": "1.0.2",
-        "readable-stream": "2.3.4",
-        "shallow-copy": "0.0.1",
-        "static-eval": "2.0.0",
-        "through2": "2.0.3"
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz",
+      "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==",
+      "dev": true,
+      "requires": {
+        "concat-stream": "~1.6.0",
+        "convert-source-map": "^1.5.1",
+        "duplexer2": "~0.1.4",
+        "escodegen": "~1.9.0",
+        "falafel": "^2.1.0",
+        "has": "^1.0.1",
+        "magic-string": "^0.22.4",
+        "merge-source-map": "1.0.4",
+        "object-inspect": "~1.4.0",
+        "quote-stream": "~1.0.2",
+        "readable-stream": "~2.3.3",
+        "shallow-copy": "~0.0.1",
+        "static-eval": "^2.0.0",
+        "through2": "~2.0.3"
       },
       "dependencies": {
         "duplexer2": {
           "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
           "dev": true,
           "requires": {
-            "readable-stream": "2.3.4"
+            "readable-stream": "^2.0.2"
           }
         },
         "escodegen": {
-          "version": "1.9.0",
-          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
-          "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+          "version": "1.9.1",
+          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+          "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
           "dev": true,
           "requires": {
-            "esprima": "3.1.3",
-            "estraverse": "4.2.0",
-            "esutils": "2.0.2",
-            "optionator": "0.8.2",
-            "source-map": "0.5.7"
+            "esprima": "^3.1.3",
+            "estraverse": "^4.2.0",
+            "esutils": "^2.0.2",
+            "optionator": "^0.8.1",
+            "source-map": "~0.6.1"
           }
         },
         "esprima": {
           "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
           "dev": true
         },
-        "estraverse": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-          "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-          "dev": true
-        },
         "isarray": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
           "dev": true
         },
         "readable-stream": {
-          "version": "2.3.4",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz",
-          "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==",
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "1.0.0",
-            "process-nextick-args": "2.0.0",
-            "safe-buffer": "5.1.1",
-            "string_decoder": "1.0.3",
-            "util-deprecate": "1.0.2"
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
           }
         },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true,
+          "optional": true
+        },
         "string_decoder": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
-          "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
           "dev": true,
           "requires": {
-            "safe-buffer": "5.1.1"
+            "safe-buffer": "~5.1.0"
           }
         }
       }
     },
     "statuses": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-      "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
       "dev": true
     },
     "stream-consume": {
       "integrity": "sha1-kc8lac5NxQYf6816yyY5SloRR1E=",
       "dev": true
     },
-    "string_decoder": {
-      "version": "0.10.31",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-      "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
-      "dev": true
-    },
     "string-width": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
       "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
       "dev": true,
       "requires": {
-        "code-point-at": "1.1.0",
-        "is-fullwidth-code-point": "1.0.0",
-        "strip-ansi": "3.0.1"
+        "code-point-at": "^1.0.0",
+        "is-fullwidth-code-point": "^1.0.0",
+        "strip-ansi": "^3.0.0"
       }
     },
+    "string_decoder": {
+      "version": "0.10.31",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+      "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+      "dev": true
+    },
     "stringstream": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
-      "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz",
+      "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==",
       "dev": true
     },
     "strip-ansi": {
       "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
       "dev": true,
       "requires": {
-        "ansi-regex": "2.1.1"
+        "ansi-regex": "^2.0.0"
       }
     },
     "strip-bom": {
       "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
       "dev": true,
       "requires": {
-        "first-chunk-stream": "1.0.0",
-        "is-utf8": "0.2.1"
+        "first-chunk-stream": "^1.0.0",
+        "is-utf8": "^0.2.0"
       }
     },
     "strip-indent": {
       "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
       "dev": true,
       "requires": {
-        "get-stdin": "4.0.1"
+        "get-stdin": "^4.0.1"
+      },
+      "dependencies": {
+        "get-stdin": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+          "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+          "dev": true
+        }
       }
     },
     "strip-json-comments": {
       "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
       "dev": true,
       "requires": {
-        "es6-iterator": "2.0.3",
-        "es6-symbol": "3.1.1"
+        "es6-iterator": "^2.0.1",
+        "es6-symbol": "^3.1.1"
       }
     },
     "svgdom": {
       "integrity": "sha1-djlZYSQUjJ8eBlntNGgtN5s2dO4=",
       "dev": true,
       "requires": {
-        "fontkit": "1.7.7",
-        "gl-matrix": "2.4.0",
-        "image-size": "0.5.5",
-        "sax": "1.2.4"
+        "fontkit": "^1.5.4",
+        "gl-matrix": "^2.3.2",
+        "image-size": "^0.5.1",
+        "sax": "^1.2.2"
       }
     },
     "table": {
       "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=",
       "dev": true,
       "requires": {
-        "ajv": "4.11.8",
-        "ajv-keywords": "1.5.1",
-        "chalk": "1.1.3",
-        "lodash": "4.17.5",
+        "ajv": "^4.7.0",
+        "ajv-keywords": "^1.0.0",
+        "chalk": "^1.1.1",
+        "lodash": "^4.0.0",
         "slice-ansi": "0.0.4",
-        "string-width": "2.1.1"
+        "string-width": "^2.0.0"
       },
       "dependencies": {
-        "ajv": {
-          "version": "4.11.8",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
-          "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
-          "dev": true,
-          "requires": {
-            "co": "4.6.0",
-            "json-stable-stringify": "1.0.1"
-          }
-        },
         "ansi-regex": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
           "dev": true
         },
         "lodash": {
-          "version": "4.17.5",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
-          "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
           "dev": true
         },
         "string-width": {
           "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
           "dev": true,
           "requires": {
-            "is-fullwidth-code-point": "2.0.0",
-            "strip-ansi": "4.0.0"
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
           }
         },
         "strip-ansi": {
           "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
           "dev": true,
           "requires": {
-            "ansi-regex": "3.0.0"
+            "ansi-regex": "^3.0.0"
           }
         }
       }
       "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
       "dev": true,
       "requires": {
-        "readable-stream": "2.3.4",
-        "xtend": "4.0.1"
+        "readable-stream": "^2.1.5",
+        "xtend": "~4.0.1"
       },
       "dependencies": {
         "isarray": {
           "dev": true
         },
         "readable-stream": {
-          "version": "2.3.4",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz",
-          "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==",
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "1.0.0",
-            "process-nextick-args": "2.0.0",
-            "safe-buffer": "5.1.1",
-            "string_decoder": "1.0.3",
-            "util-deprecate": "1.0.2"
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
           }
         },
         "string_decoder": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
-          "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
           "dev": true,
           "requires": {
-            "safe-buffer": "5.1.1"
+            "safe-buffer": "~5.1.0"
           }
         }
       }
       "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
       "dev": true,
       "requires": {
-        "os-homedir": "1.0.2"
+        "os-homedir": "^1.0.0"
       }
     },
     "time-stamp": {
       "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=",
       "dev": true,
       "requires": {
-        "os-tmpdir": "1.0.2"
+        "os-tmpdir": "~1.0.1"
       }
     },
     "to-array": {
       "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
       "dev": true,
       "requires": {
-        "kind-of": "3.2.2"
+        "kind-of": "^3.0.2"
       },
       "dependencies": {
         "kind-of": {
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "is-buffer": "1.1.6"
+            "is-buffer": "^1.1.5"
           }
         }
       }
       "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
       "dev": true,
       "requires": {
-        "define-property": "2.0.2",
-        "extend-shallow": "3.0.2",
-        "regex-not": "1.0.2",
-        "safe-regex": "1.1.0"
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
       }
     },
     "to-regex-range": {
       "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
       "dev": true,
       "requires": {
-        "is-number": "3.0.0",
-        "repeat-string": "1.6.1"
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
       }
     },
     "tough-cookie": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
-      "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+      "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
       "dev": true,
       "requires": {
-        "punycode": "1.4.1"
+        "punycode": "^1.4.1"
       }
     },
     "trim-newlines": {
       "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
       "dev": true,
       "requires": {
-        "prelude-ls": "1.1.2"
+        "prelude-ls": "~1.1.2"
       }
     },
     "type-is": {
       "dev": true,
       "requires": {
         "media-typer": "0.3.0",
-        "mime-types": "2.1.18"
+        "mime-types": "~2.1.18"
       }
     },
     "typedarray": {
       "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
       "dev": true,
       "requires": {
-        "source-map": "0.5.7",
-        "uglify-to-browserify": "1.0.2",
-        "yargs": "3.10.0"
+        "source-map": "~0.5.1",
+        "uglify-to-browserify": "~1.0.0",
+        "yargs": "~3.10.0"
       },
       "dependencies": {
         "camelcase": {
           "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
           "dev": true,
           "requires": {
-            "center-align": "0.1.3",
-            "right-align": "0.1.3",
+            "center-align": "^0.1.1",
+            "right-align": "^0.1.1",
             "wordwrap": "0.0.2"
           }
         },
           "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
           "dev": true
         },
+        "wordwrap": {
+          "version": "0.0.2",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+          "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+          "dev": true
+        },
         "yargs": {
           "version": "3.10.0",
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
           "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
           "dev": true,
           "requires": {
-            "camelcase": "1.2.1",
-            "cliui": "2.1.0",
-            "decamelize": "1.2.0",
+            "camelcase": "^1.0.2",
+            "cliui": "^2.1.0",
+            "decamelize": "^1.0.0",
             "window-size": "0.1.0"
           }
         }
       "integrity": "sha1-epbu9J91aC6mnSMV7smsQ//fAME=",
       "dev": true,
       "requires": {
-        "brfs": "1.4.4",
-        "unicode-trie": "0.3.1"
+        "brfs": "^1.4.0",
+        "unicode-trie": "^0.3.0"
       }
     },
     "unicode-trie": {
       "integrity": "sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU=",
       "dev": true,
       "requires": {
-        "pako": "0.2.9",
-        "tiny-inflate": "1.0.2"
+        "pako": "^0.2.5",
+        "tiny-inflate": "^1.0.0"
       }
     },
     "union-value": {
       "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
       "dev": true,
       "requires": {
-        "arr-union": "3.1.0",
-        "get-value": "2.0.6",
-        "is-extendable": "0.1.1",
-        "set-value": "0.4.3"
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^0.4.3"
       },
       "dependencies": {
         "extend-shallow": {
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
           "dev": true,
           "requires": {
-            "is-extendable": "0.1.1"
+            "is-extendable": "^0.1.0"
           }
         },
         "set-value": {
           "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
           "dev": true,
           "requires": {
-            "extend-shallow": "2.0.1",
-            "is-extendable": "0.1.1",
-            "is-plain-object": "2.0.4",
-            "to-object-path": "0.3.0"
+            "extend-shallow": "^2.0.1",
+            "is-extendable": "^0.1.1",
+            "is-plain-object": "^2.0.1",
+            "to-object-path": "^0.3.0"
           }
         }
       }
       "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
       "dev": true,
       "requires": {
-        "has-value": "0.3.1",
-        "isobject": "3.0.1"
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
       },
       "dependencies": {
         "has-value": {
           "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
           "dev": true,
           "requires": {
-            "get-value": "2.0.6",
-            "has-values": "0.1.4",
-            "isobject": "2.1.0"
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
           },
           "dependencies": {
             "isobject": {
       "dev": true
     },
     "use": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz",
-      "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+      "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
       "dev": true,
       "requires": {
-        "define-property": "0.2.5",
-        "isobject": "3.0.1",
-        "lazy-cache": "2.0.2"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "0.1.6"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.6"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.6"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "0.1.6",
-            "is-data-descriptor": "0.1.4",
-            "kind-of": "5.1.0"
-          }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
+        "kind-of": "^6.0.2"
       }
     },
     "user-home": {
       "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==",
       "dev": true,
       "requires": {
-        "lru-cache": "4.1.1",
-        "tmp": "0.0.31"
+        "lru-cache": "4.1.x",
+        "tmp": "0.0.x"
       },
       "dependencies": {
         "lru-cache": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
-          "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+          "version": "4.1.3",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+          "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
           "dev": true,
           "requires": {
-            "pseudomap": "1.0.2",
-            "yallist": "2.1.2"
+            "pseudomap": "^1.0.2",
+            "yallist": "^2.1.2"
           }
         }
       }
     },
     "util": {
-      "version": "0.10.3",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
-      "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+      "version": "0.10.4",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
       "dev": true,
       "requires": {
-        "inherits": "2.0.1"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
-          "dev": true
-        }
+        "inherits": "2.0.3"
       }
     },
     "util-deprecate": {
       "dev": true
     },
     "uuid": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
-      "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.0.tgz",
+      "integrity": "sha512-ijO9N2xY/YaOqQ5yz5c4sy2ZjWmA6AR6zASb/gdpeKZ8+948CxwfMW9RrKVk5may6ev8c0/Xguu32e2Llelpqw==",
       "dev": true
     },
     "v8flags": {
       "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
       "dev": true,
       "requires": {
-        "user-home": "1.1.1"
+        "user-home": "^1.1.1"
       }
     },
     "validate-npm-package-license": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
-      "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
+      "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
       "dev": true,
       "requires": {
-        "spdx-correct": "1.0.2",
-        "spdx-expression-parse": "1.0.4"
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
       }
     },
     "verror": {
       "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
       "dev": true,
       "requires": {
-        "assert-plus": "1.0.0",
+        "assert-plus": "^1.0.0",
         "core-util-is": "1.0.2",
-        "extsprintf": "1.3.0"
+        "extsprintf": "^1.2.0"
       },
       "dependencies": {
         "assert-plus": {
       "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
       "dev": true,
       "requires": {
-        "clone": "1.0.3",
-        "clone-stats": "0.0.1",
+        "clone": "^1.0.0",
+        "clone-stats": "^0.0.1",
         "replace-ext": "0.0.1"
       }
     },
       "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
       "dev": true,
       "requires": {
-        "defaults": "1.0.3",
-        "glob-stream": "3.1.18",
-        "glob-watcher": "0.0.6",
-        "graceful-fs": "3.0.11",
-        "mkdirp": "0.5.1",
-        "strip-bom": "1.0.0",
-        "through2": "0.6.5",
-        "vinyl": "0.4.6"
+        "defaults": "^1.0.0",
+        "glob-stream": "^3.1.5",
+        "glob-watcher": "^0.0.6",
+        "graceful-fs": "^3.0.0",
+        "mkdirp": "^0.5.0",
+        "strip-bom": "^1.0.0",
+        "through2": "^0.6.1",
+        "vinyl": "^0.4.0"
       },
       "dependencies": {
         "clone": {
           "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
           "dev": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
             "isarray": "0.0.1",
-            "string_decoder": "0.10.31"
+            "string_decoder": "~0.10.x"
           }
         },
         "through2": {
           "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
           "dev": true,
           "requires": {
-            "readable-stream": "1.0.34",
-            "xtend": "4.0.1"
+            "readable-stream": ">=1.0.33-1 <1.1.0-0",
+            "xtend": ">=4.0.0 <4.1.0-0"
           }
         },
         "vinyl": {
           "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
           "dev": true,
           "requires": {
-            "clone": "0.2.0",
-            "clone-stats": "0.0.1"
+            "clone": "^0.2.0",
+            "clone-stats": "^0.0.1"
           }
         }
       }
       "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
       "dev": true,
       "requires": {
-        "source-map": "0.5.7"
+        "source-map": "^0.5.1"
       }
     },
+    "vlq": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+      "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
+      "dev": true
+    },
     "void-elements": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
       "dev": true
     },
     "which": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
-      "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
       "requires": {
-        "isexe": "2.0.0"
+        "isexe": "^2.0.0"
       }
     },
     "window-size": {
       "dev": true
     },
     "wordwrap": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
-      "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+      "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
       "dev": true
     },
     "wrap-ansi": {
       "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
       "dev": true,
       "requires": {
-        "string-width": "1.0.2",
-        "strip-ansi": "3.0.1"
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1"
       }
     },
     "wrappy": {
       "integrity": "sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs=",
       "dev": true,
       "requires": {
-        "boom": "2.10.1",
-        "hoek": "2.16.3"
+        "boom": "2.x.x",
+        "hoek": "2.x.x"
       }
     },
     "write": {
       "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
       "dev": true,
       "requires": {
-        "mkdirp": "0.5.1"
+        "mkdirp": "^0.5.1"
       }
     },
     "ws": {
       "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=",
       "dev": true,
       "requires": {
-        "options": "0.0.6",
-        "ultron": "1.0.2"
+        "options": ">=0.0.5",
+        "ultron": "1.0.x"
       }
     },
     "wtf-8": {
       "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
       "dev": true,
       "requires": {
-        "camelcase": "2.1.1",
-        "cliui": "3.2.0",
-        "decamelize": "1.2.0",
-        "os-locale": "1.4.0",
-        "string-width": "1.0.2",
-        "window-size": "0.1.4",
-        "y18n": "3.2.1"
+        "camelcase": "^2.0.1",
+        "cliui": "^3.0.3",
+        "decamelize": "^1.1.1",
+        "os-locale": "^1.4.0",
+        "string-width": "^1.0.1",
+        "window-size": "^0.1.4",
+        "y18n": "^3.2.0"
       }
     },
     "yauzl": {
       "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
       "dev": true,
       "requires": {
-        "fd-slicer": "1.0.1"
+        "fd-slicer": "~1.0.1"
       }
     },
     "yeast": {
index 25d686a78e8f0ca0996928a49f1bc22dfdc3db89..31d3d58a97a8a4a29c836610b79a8512e2ba9114 100644 (file)
@@ -103,14 +103,14 @@ SVG.Matrix = SVG.invent({
     },
 
     // Decomposes this matrix into its affine parameters
-    decompose: function (ox=0, oy=0) {
+    decompose: function (cx=0, cy=0) {
       // Get the parameters from the matrix
       var a = this.a
       var b = this.b
       var c = this.c
       var d = this.d
-      var e = this.e - ox
-      var f = this.f - oy
+      var e = this.e
+      var f = this.f
 
       // Figure out if the winding direction is clockwise or counterclockwise
       var determinant = a * d - b * c
@@ -119,13 +119,19 @@ SVG.Matrix = SVG.invent({
       // Since we only shear in x, we can use the x basis to get the x scale
       // and the rotation of the resulting matrix
       var sx = ccw * Math.sqrt(a * a + b * b)
-      var theta = 180 / Math.PI * Math.atan2(ccw * b, ccw * a)
+      var thetaRad = Math.atan2(ccw * b, ccw * a)
+      var theta = 180 / Math.PI * thetaRad
+      var ct = Math.cos(thetaRad)
+      var st = Math.sin(thetaRad)
 
       // We can then solve the y basis vector simultaneously to get the other
       // two affine parameters directly from these parameters
       var lam = (a * c + b * d) / determinant
       var sy = ((c * sx) / (lam * a - b)) || ((d * sx) / (lam * b + a))
 
+      let tx = e - cx + cx * ct * sx + cy * (lam * ct * sx - st * sy)
+      let ty = f - cy + cx * st * sx + cy * (lam * st * sx + ct * sy)
+
       // Construct the decomposition and return it
       return {
         // Return the affine parameters
@@ -133,18 +139,18 @@ SVG.Matrix = SVG.invent({
         scaleY: sy,
         shear: lam,
         rotate: theta,
-        translateX: e + ox,
-        translateY: f + oy,
-        originX: ox,
-        originY: oy,
+        translateX: tx,
+        translateY: ty,
+        originX: cx,
+        originY: cy,
 
         // Return the matrix parameters
         a: this.a,
         b: this.b,
         c: this.c,
         d: this.d,
-        e: this.e + ox,
-        f: this.f + oy
+        e: this.e,
+        f: this.f
       }
     },
 
index 67d14f7528930bd0f129f294db27fc9f1bbcfa0b..022c51e1a233b9b1765d4f88d29eb8362212ed2b 100644 (file)
@@ -161,17 +161,12 @@ SVG.Morphable.TransformBag = SVG.invent({
     SVG.Matrix.call(this, obj)
 
     if (obj && obj.origin) {
-      obj.originX = origin[0]
-      obj.originY = origin[1]
+      obj.originX = obj.origin[0]
+      obj.originY = obj.origin[1]
     }
 
     this.originX = obj && obj.originX || 0
     this.originY = obj && obj.originY || 0
-
-    /*if (obj && obj.origin){
-      this.translateO(-obj.origin[0], -obj.origin[1])
-    }*/
-    //this.value = new SVG.Matrix(obj)
   },
 
   extend: {
index 6094aafaf1da9c9def13ffa6f91d4c67e5839729..963f31b44c4a9feab6d877d22927bb8aa45cbef1 100644 (file)
@@ -673,21 +673,17 @@ SVG.extend(SVG.Runner, {
 
     morpher = new SVG.Morphable().type(morphType)
     morpher.stepper(this._stepper)
-    //morpher.to(transforms)
+    morpher.to(transforms)
 
     this.queue(function() {
       let element = this.element()
       element.addRunner(this)
 
-      if (!origin/* && affine*/) {
+      if (!origin && affine) {
         origin = getOrigin(transforms, element)
         transforms.origin = origin
 
-        console.log('Affine Parameters:', transforms)
-
         morpher.to(transforms)
-
-        console.log('End parameters:', morpher.to())
       }
 
       if (!relative && !this._isDeclarative) {
@@ -699,25 +695,17 @@ SVG.extend(SVG.Runner, {
       let startMatrix = new SVG.Matrix(relative ? undefined : element)
 
       // make sure to add an origin if we morph affine
-      //if (affine) {
-        /*startMatrix = startMatrix.decompose(origin[0], origin[1])
-
-        startMatrix = new SVG.Matrix().compose(startMatrix)*/
-
+      if (affine) {
         startMatrix.origin = origin
-      //}
+      }
 
       // FIXME: correct the rotation so that it takes the shortest path
 
       morpher.from(startMatrix)
-
-      console.log('Start Parameters:', morpher.from())
-
     }, function (pos) {
 
       if (!relative) this.clearTransform()
       var matrix = morpher.at(pos)
-      // matrix = matrix.translate(origin[0], origin[1])
       this.addTransform(matrix)
       return morpher.done()