{"version":3,"sources":["node_modules/lodash/_baseIsMap.js","node_modules/lodash/_baseGet.js","node_modules/lodash/_castPath.js","node_modules/lodash/_memoizeCapped.js","node_modules/lodash/_baseAssign.js","node_modules/lodash/invert.js","node_modules/lodash/_baseIndexOfWith.js","node_modules/lodash/_setToArray.js","node_modules/lodash/_getAllKeysIn.js","node_modules/lodash/_baseClone.js","node_modules/lodash/_baseAssignIn.js","node_modules/lodash/_hasPath.js","node_modules/object-path/index.js","node_modules/lodash/_arrayFilter.js","node_modules/lodash/_getTag.js","node_modules/lodash/_initCloneByTag.js","node_modules/lodash/toString.js","node_modules/lodash/cloneDeep.js","node_modules/lodash/_toKey.js","node_modules/lodash/pick.js","node_modules/lodash/without.js","node_modules/lodash/isMap.js","node_modules/lodash/_baseUnset.js","node_modules/lodash/_parent.js","node_modules/lodash/_copySymbolsIn.js","node_modules/lodash/hasIn.js","node_modules/lodash/_cloneDataView.js","node_modules/lodash/omit.js","node_modules/lodash/_getSymbolsIn.js","node_modules/lodash/_baseUniq.js","node_modules/lodash/_customOmitClone.js","node_modules/lodash/_baseDifference.js","node_modules/lodash/_createSet.js","node_modules/lodash/_stringToPath.js","node_modules/lodash/pullAll.js","node_modules/lodash/_getSymbols.js","node_modules/lodash/_copySymbols.js","node_modules/lodash/_basePick.js","node_modules/lodash/_basePickBy.js","node_modules/lodash/_baseSlice.js","node_modules/lodash/_baseIsSet.js","node_modules/lodash/uniq.js","node_modules/lodash/memoize.js","node_modules/lodash/_baseGetAllKeys.js","node_modules/lodash/_Promise.js","node_modules/lodash/_cloneSymbol.js","node_modules/lodash/_baseForOwn.js","node_modules/lodash/_cloneRegExp.js","node_modules/hammerjs/hammer.js","node_modules/lodash/stubArray.js","node_modules/lodash/isSet.js","node_modules/lodash/isEmpty.js","node_modules/lodash/_createInverter.js","node_modules/lodash/_Set.js","node_modules/lodash/_getAllKeys.js","node_modules/lodash/_isKey.js","node_modules/lodash/_baseInverter.js","node_modules/lodash/_basePullAll.js","node_modules/lodash/_flatRest.js","node_modules/lodash/last.js","node_modules/lodash/_baseSet.js","node_modules/lodash/_DataView.js","node_modules/lodash/_baseToString.js","node_modules/lodash/_initCloneArray.js","node_modules/lodash/_baseHasIn.js"],"names":["getTag","require","isObjectLike","module","exports","value","castPath","toKey","object","path","index","length","undefined","isArray","isKey","stringToPath","toString","memoize","func","result","key","cache","size","clear","copyObject","keys","source","constant","createInverter","identity","nativeObjectToString","Object","prototype","invert","call","array","fromIndex","comparator","set","Array","forEach","baseGetAllKeys","getSymbolsIn","keysIn","Stack","arrayEach","assignValue","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeys","getAllKeysIn","initCloneArray","initCloneByTag","initCloneObject","isBuffer","isMap","isObject","isSet","cloneableTags","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","isArr","tag","isFunc","stacked","get","subValue","add","props","isArguments","isIndex","isLength","hasFunc","root","factory","define","this","toStr","hasOwnProperty","obj","prop","isEmpty","i","type","getKey","intKey","parseInt","options","hasShallowProperty","getShallowPropertySafely","objectPath","reduce","proxy","bind","getShallowProperty","doNotReplace","split","map","currentPath","currentValue","slice","includeInheritedProps","String","Error","has","j","ensureExists","insert","at","arr","splice","empty","isBoolean","push","apply","arguments","coalesce","paths","defaultValue","len","nextObj","del","mod","create","withInheritedProps","predicate","resIndex","DataView","Map","Promise","Set","WeakMap","baseGetTag","toSource","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","resolve","Ctor","constructor","ctorString","cloneArrayBuffer","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","baseToString","CLONE_DEEP_FLAG","isSymbol","basePick","pick","flatRest","baseDifference","baseRest","isArrayLikeObject","without","values","baseIsMap","baseUnary","nodeUtil","nodeIsMap","last","parent","baseGet","baseSlice","baseHasIn","hasPath","dataView","buffer","byteOffset","byteLength","arrayMap","baseUnset","customOmitClone","omit","arrayPush","getPrototype","getSymbols","stubArray","getOwnPropertySymbols","SetCache","arrayIncludes","arrayIncludesWith","cacheHas","createSet","setToArray","iteratee","includes","isCommon","seen","outer","computed","seenIndex","isPlainObject","valuesLength","valuesIndex","noop","memoizeCapped","rePropName","reEscapeChar","string","charCodeAt","replace","match","number","quote","subString","basePullAll","arrayFilter","propertyIsEnumerable","nativeGetSymbols","symbol","basePickBy","hasIn","baseSet","start","end","baseUniq","MapCache","resolver","TypeError","memoized","args","Cache","keysFunc","symbolsFunc","getNative","Symbol","symbolProto","symbolValueOf","valueOf","baseFor","reFlags","regexp","exec","lastIndex","window","document","exportName","assign","VENDOR_PREFIXES","TEST_ELEMENT","createElement","round","Math","abs","now","Date","setTimeoutContext","fn","timeout","context","setTimeout","bindFn","invokeArrayArg","arg","each","iterator","deprecate","method","name","message","deprecationMessage","e","log","console","warn","target","output","nextKey","extend","dest","src","merge","inherit","child","base","properties","childP","baseP","_super","boolOrFn","val","ifUndefined","val1","val2","addEventListeners","types","handler","splitStr","addEventListener","removeEventListeners","removeEventListener","hasParent","node","parentNode","inStr","str","find","indexOf","trim","inArray","findByKey","toArray","uniqueArray","sort","results","a","b","prefixed","property","prefix","camelProp","toUpperCase","_uniqueId","getWindowForElement","element","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","test","navigator","userAgent","PROPS_XY","PROPS_CLIENT_XY","Input","manager","callback","self","inputTarget","domHandler","ev","enable","init","inputHandler","eventType","input","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","session","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","deltaTime","angle","getAngle","distance","getDistance","offset","offsetDelta","prevDelta","prevInput","x","deltaX","y","deltaY","computeDeltaXY","offsetDirection","getDirection","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","scale","rotation","getRotation","maxPointers","velocity","velocityX","velocityY","direction","lastInterval","v","computeIntervalInputData","srcEvent","computeInputData","emit","recognize","clientX","clientY","p1","p2","sqrt","atan2","PI","evEl","evTarget","evWin","destroy","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MouseInput","pressed","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","2","3","4","5","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","toLowerCase","isTouch","storeIndex","pointerId","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SingleTouchInput","started","normalizeSingleTouches","all","touches","changed","changedTouches","concat","TOUCH_INPUT_MAP","TouchInput","targetIds","getTouches","allTouches","identifier","targetTouches","changedTargetTouches","filter","touch","TouchMouseInput","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","isSyntheticEvent","t","dx","dy","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","style","NATIVE_TOUCH_ACTION","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","getTouchActionProps","TouchAction","compute","actions","update","touchAction","recognizers","recognizer","getTouchAction","hasPanX","hasPanY","cleanTouchActions","join","preventDefaults","prevented","preventDefault","hasNone","isTapPointer","isTapMovement","isTapTouchTime","DIRECTION_LEFT","DIRECTION_UP","preventSrc","Recognizer","defaults","id","state","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","Hammer","preset","Manager","recognizeWith","dropRecognizeWith","requireFailure","dropRequireFailure","hasRequireFailures","canRecognizeWith","event","additionalEvent","tryEmit","canEmit","inputDataClone","reset","process","attrTest","optionPointers","isRecognized","isValid","threshold","DIRECTION_HORIZONTAL","directionTest","hasMoved","inOut","time","validPointers","validMovement","validTime","clearTimeout","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","inputClass","cssProps","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","handlers","oldCssProps","createInputInstance","toggleCssProps","item","stop","force","stopped","curRecognizer","existing","remove","on","events","off","data","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","triggerDomEvent","INPUT_START","INPUT_MOVE","INPUT_END","INPUT_CANCEL","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","STATE_FAILED","DIRECTION_NONE","DIRECTION_RIGHT","DIRECTION_DOWN","DIRECTION_VERTICAL","DIRECTION_ALL","Tap","Pan","Swipe","Pinch","Rotate","Press","baseIsSet","nodeIsSet","baseKeys","isArrayLike","isPrototype","isTypedArray","baseInverter","setter","toIteratee","reIsDeepProp","reIsPlainProp","baseForOwn","accumulator","baseIndexOf","baseIndexOfWith","flatten","overRest","setToString","nested","newValue","objValue","symbolToString"],"mappings":"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","file":"hashed/13.e20a4c6c.chunk.js","sourcesContent":["var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n  return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var castPath = require('./_castPath'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = castPath(path, object);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var isArray = require('./isArray'),\n    isKey = require('./_isKey'),\n    stringToPath = require('./_stringToPath'),\n    toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n  if (isArray(value)) {\n    return value;\n  }\n  return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n","var copyObject = require('./_copyObject'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","var constant = require('./constant'),\n    createInverter = require('./_createInverter'),\n    identity = require('./identity');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */\nvar invert = createInverter(function(result, value, key) {\n  if (value != null &&\n      typeof value.toString != 'function') {\n    value = nativeObjectToString.call(value);\n  }\n\n  result[value] = key;\n}, constant(identity));\n\nmodule.exports = invert;\n","/**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOfWith(array, value, fromIndex, comparator) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (comparator(array[index], value)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseIndexOfWith;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbolsIn = require('./_getSymbolsIn'),\n    keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n  return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var Stack = require('./_Stack'),\n    arrayEach = require('./_arrayEach'),\n    assignValue = require('./_assignValue'),\n    baseAssign = require('./_baseAssign'),\n    baseAssignIn = require('./_baseAssignIn'),\n    cloneBuffer = require('./_cloneBuffer'),\n    copyArray = require('./_copyArray'),\n    copySymbols = require('./_copySymbols'),\n    copySymbolsIn = require('./_copySymbolsIn'),\n    getAllKeys = require('./_getAllKeys'),\n    getAllKeysIn = require('./_getAllKeysIn'),\n    getTag = require('./_getTag'),\n    initCloneArray = require('./_initCloneArray'),\n    initCloneByTag = require('./_initCloneByTag'),\n    initCloneObject = require('./_initCloneObject'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isMap = require('./isMap'),\n    isObject = require('./isObject'),\n    isSet = require('./isSet'),\n    keys = require('./keys'),\n    keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Deep clone\n *  2 - Flatten inherited properties\n *  4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n  var result,\n      isDeep = bitmask & CLONE_DEEP_FLAG,\n      isFlat = bitmask & CLONE_FLAT_FLAG,\n      isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n  if (customizer) {\n    result = object ? customizer(value, key, object, stack) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return copyArray(value, result);\n    }\n  } else {\n    var tag = getTag(value),\n        isFunc = tag == funcTag || tag == genTag;\n\n    if (isBuffer(value)) {\n      return cloneBuffer(value, isDeep);\n    }\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      result = (isFlat || isFunc) ? {} : initCloneObject(value);\n      if (!isDeep) {\n        return isFlat\n          ? copySymbolsIn(value, baseAssignIn(result, value))\n          : copySymbols(value, baseAssign(result, value));\n      }\n    } else {\n      if (!cloneableTags[tag]) {\n        return object ? value : {};\n      }\n      result = initCloneByTag(value, tag, isDeep);\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stack || (stack = new Stack);\n  var stacked = stack.get(value);\n  if (stacked) {\n    return stacked;\n  }\n  stack.set(value, result);\n\n  if (isSet(value)) {\n    value.forEach(function(subValue) {\n      result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n    });\n  } else if (isMap(value)) {\n    value.forEach(function(subValue, key) {\n      result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n    });\n  }\n\n  var keysFunc = isFull\n    ? (isFlat ? getAllKeysIn : getAllKeys)\n    : (isFlat ? keysIn : keys);\n\n  var props = isArr ? undefined : keysFunc(value);\n  arrayEach(props || value, function(subValue, key) {\n    if (props) {\n      key = subValue;\n      subValue = value[key];\n    }\n    // Recursively populate clone (susceptible to call stack limits).\n    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n  });\n  return result;\n}\n\nmodule.exports = baseClone;\n","var copyObject = require('./_copyObject'),\n    keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n  return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var castPath = require('./_castPath'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isIndex = require('./_isIndex'),\n    isLength = require('./isLength'),\n    toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object == null ? 0 : object.length;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","(function (root, factory) {\n  'use strict'\n\n  /*istanbul ignore next:cant test*/\n  if (typeof module === 'object' && typeof module.exports === 'object') {\n    module.exports = factory()\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define([], factory)\n  } else {\n    // Browser globals\n    root.objectPath = factory()\n  }\n})(this, function () {\n  'use strict'\n\n  var toStr = Object.prototype.toString\n\n  function hasOwnProperty (obj, prop) {\n    if (obj == null) {\n      return false\n    }\n    //to handle objects with null prototypes (too edge case?)\n    return Object.prototype.hasOwnProperty.call(obj, prop)\n  }\n\n  function isEmpty (value) {\n    if (!value) {\n      return true\n    }\n    if (isArray(value) && value.length === 0) {\n      return true\n    } else if (typeof value !== 'string') {\n      for (var i in value) {\n        if (hasOwnProperty(value, i)) {\n          return false\n        }\n      }\n      return true\n    }\n    return false\n  }\n\n  function toString (type) {\n    return toStr.call(type)\n  }\n\n  function isObject (obj) {\n    return typeof obj === 'object' && toString(obj) === '[object Object]'\n  }\n\n  var isArray = Array.isArray || function (obj) {\n    /*istanbul ignore next:cant test*/\n    return toStr.call(obj) === '[object Array]'\n  }\n\n  function isBoolean (obj) {\n    return typeof obj === 'boolean' || toString(obj) === '[object Boolean]'\n  }\n\n  function getKey (key) {\n    var intKey = parseInt(key)\n    if (intKey.toString() === key) {\n      return intKey\n    }\n    return key\n  }\n\n  function factory (options) {\n    options = options || {}\n\n    var objectPath = function (obj) {\n      return Object.keys(objectPath).reduce(function (proxy, prop) {\n        if (prop === 'create') {\n          return proxy\n        }\n\n        /*istanbul ignore else*/\n        if (typeof objectPath[prop] === 'function') {\n          proxy[prop] = objectPath[prop].bind(objectPath, obj)\n        }\n\n        return proxy\n      }, {})\n    }\n\n    var hasShallowProperty\n    if (options.includeInheritedProps) {\n      hasShallowProperty = function () {\n        return true\n      }\n    } else {\n      hasShallowProperty = function (obj, prop) {\n        return (typeof prop === 'number' && Array.isArray(obj)) || hasOwnProperty(obj, prop)\n      }\n    }\n\n    function getShallowProperty (obj, prop) {\n      if (hasShallowProperty(obj, prop)) {\n        return obj[prop]\n      }\n    }\n\n    var getShallowPropertySafely\n    if (options.includeInheritedProps) {\n      getShallowPropertySafely = function (obj, currentPath) {\n        if (typeof currentPath !== 'string' && typeof currentPath !== 'number') {\n          currentPath = String(currentPath)\n        }\n        var currentValue = getShallowProperty(obj, currentPath)\n        if (currentPath === '__proto__' || currentPath === 'prototype' ||\n          (currentPath === 'constructor' && typeof currentValue === 'function')) {\n          throw new Error('For security reasons, object\\'s magic properties cannot be set')\n        }\n        return currentValue\n      }\n    } else {\n      getShallowPropertySafely = function (obj, currentPath) {\n        return getShallowProperty(obj, currentPath)\n      }\n    }\n\n    function set (obj, path, value, doNotReplace) {\n      if (typeof path === 'number') {\n        path = [path]\n      }\n      if (!path || path.length === 0) {\n        return obj\n      }\n      if (typeof path === 'string') {\n        return set(obj, path.split('.').map(getKey), value, doNotReplace)\n      }\n      var currentPath = path[0]\n      var currentValue = getShallowPropertySafely(obj, currentPath)\n      if (path.length === 1) {\n        if (currentValue === void 0 || !doNotReplace) {\n          obj[currentPath] = value\n        }\n        return currentValue\n      }\n\n      if (currentValue === void 0) {\n        //check if we assume an array\n        if (typeof path[1] === 'number') {\n          obj[currentPath] = []\n        } else {\n          obj[currentPath] = {}\n        }\n      }\n\n      return set(obj[currentPath], path.slice(1), value, doNotReplace)\n    }\n\n    objectPath.has = function (obj, path) {\n      if (typeof path === 'number') {\n        path = [path]\n      } else if (typeof path === 'string') {\n        path = path.split('.')\n      }\n\n      if (!path || path.length === 0) {\n        return !!obj\n      }\n\n      for (var i = 0; i < path.length; i++) {\n        var j = getKey(path[i])\n\n        if ((typeof j === 'number' && isArray(obj) && j < obj.length) ||\n          (options.includeInheritedProps ? (j in Object(obj)) : hasOwnProperty(obj, j))) {\n          obj = obj[j]\n        } else {\n          return false\n        }\n      }\n\n      return true\n    }\n\n    objectPath.ensureExists = function (obj, path, value) {\n      return set(obj, path, value, true)\n    }\n\n    objectPath.set = function (obj, path, value, doNotReplace) {\n      return set(obj, path, value, doNotReplace)\n    }\n\n    objectPath.insert = function (obj, path, value, at) {\n      var arr = objectPath.get(obj, path)\n      at = ~~at\n      if (!isArray(arr)) {\n        arr = []\n        objectPath.set(obj, path, arr)\n      }\n      arr.splice(at, 0, value)\n    }\n\n    objectPath.empty = function (obj, path) {\n      if (isEmpty(path)) {\n        return void 0\n      }\n      if (obj == null) {\n        return void 0\n      }\n\n      var value, i\n      if (!(value = objectPath.get(obj, path))) {\n        return void 0\n      }\n\n      if (typeof value === 'string') {\n        return objectPath.set(obj, path, '')\n      } else if (isBoolean(value)) {\n        return objectPath.set(obj, path, false)\n      } else if (typeof value === 'number') {\n        return objectPath.set(obj, path, 0)\n      } else if (isArray(value)) {\n        value.length = 0\n      } else if (isObject(value)) {\n        for (i in value) {\n          if (hasShallowProperty(value, i)) {\n            delete value[i]\n          }\n        }\n      } else {\n        return objectPath.set(obj, path, null)\n      }\n    }\n\n    objectPath.push = function (obj, path /*, values */) {\n      var arr = objectPath.get(obj, path)\n      if (!isArray(arr)) {\n        arr = []\n        objectPath.set(obj, path, arr)\n      }\n\n      arr.push.apply(arr, Array.prototype.slice.call(arguments, 2))\n    }\n\n    objectPath.coalesce = function (obj, paths, defaultValue) {\n      var value\n\n      for (var i = 0, len = paths.length; i < len; i++) {\n        if ((value = objectPath.get(obj, paths[i])) !== void 0) {\n          return value\n        }\n      }\n\n      return defaultValue\n    }\n\n    objectPath.get = function (obj, path, defaultValue) {\n      if (typeof path === 'number') {\n        path = [path]\n      }\n      if (!path || path.length === 0) {\n        return obj\n      }\n      if (obj == null) {\n        return defaultValue\n      }\n      if (typeof path === 'string') {\n        return objectPath.get(obj, path.split('.'), defaultValue)\n      }\n\n      var currentPath = getKey(path[0])\n      var nextObj = getShallowPropertySafely(obj, currentPath)\n      if (nextObj === void 0) {\n        return defaultValue\n      }\n\n      if (path.length === 1) {\n        return nextObj\n      }\n\n      return objectPath.get(obj[currentPath], path.slice(1), defaultValue)\n    }\n\n    objectPath.del = function del (obj, path) {\n      if (typeof path === 'number') {\n        path = [path]\n      }\n\n      if (obj == null) {\n        return obj\n      }\n\n      if (isEmpty(path)) {\n        return obj\n      }\n      if (typeof path === 'string') {\n        return objectPath.del(obj, path.split('.'))\n      }\n\n      var currentPath = getKey(path[0])\n      getShallowPropertySafely(obj, currentPath)\n      if (!hasShallowProperty(obj, currentPath)) {\n        return obj\n      }\n\n      if (path.length === 1) {\n        if (isArray(obj)) {\n          obj.splice(currentPath, 1)\n        } else {\n          delete obj[currentPath]\n        }\n      } else {\n        return objectPath.del(obj[currentPath], path.slice(1))\n      }\n\n      return obj\n    }\n\n    return objectPath\n  }\n\n  var mod = factory()\n  mod.create = factory\n  mod.withInheritedProps = factory({includeInheritedProps: true})\n  return mod\n})\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n","var DataView = require('./_DataView'),\n    Map = require('./_Map'),\n    Promise = require('./_Promise'),\n    Set = require('./_Set'),\n    WeakMap = require('./_WeakMap'),\n    baseGetTag = require('./_baseGetTag'),\n    toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n    cloneDataView = require('./_cloneDataView'),\n    cloneRegExp = require('./_cloneRegExp'),\n    cloneSymbol = require('./_cloneSymbol'),\n    cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return cloneArrayBuffer(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case dataViewTag:\n      return cloneDataView(object, isDeep);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      return cloneTypedArray(object, isDeep);\n\n    case mapTag:\n      return new Ctor;\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      return cloneRegExp(object);\n\n    case setTag:\n      return new Ctor;\n\n    case symbolTag:\n      return cloneSymbol(object);\n  }\n}\n\nmodule.exports = initCloneByTag;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var basePick = require('./_basePick'),\n    flatRest = require('./_flatRest');\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = flatRest(function(object, paths) {\n  return object == null ? {} : basePick(object, paths);\n});\n\nmodule.exports = pick;\n","var baseDifference = require('./_baseDifference'),\n    baseRest = require('./_baseRest'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\nvar without = baseRest(function(array, values) {\n  return isArrayLikeObject(array)\n    ? baseDifference(array, values)\n    : [];\n});\n\nmodule.exports = without;\n","var baseIsMap = require('./_baseIsMap'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","var castPath = require('./_castPath'),\n    last = require('./last'),\n    parent = require('./_parent'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\nfunction baseUnset(object, path) {\n  path = castPath(path, object);\n  object = parent(object, path);\n  return object == null || delete object[toKey(last(path))];\n}\n\nmodule.exports = baseUnset;\n","var baseGet = require('./_baseGet'),\n    baseSlice = require('./_baseSlice');\n\n/**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\nfunction parent(object, path) {\n  return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n}\n\nmodule.exports = parent;\n","var copyObject = require('./_copyObject'),\n    getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n  return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var baseHasIn = require('./_baseHasIn'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","var arrayMap = require('./_arrayMap'),\n    baseClone = require('./_baseClone'),\n    baseUnset = require('./_baseUnset'),\n    castPath = require('./_castPath'),\n    copyObject = require('./_copyObject'),\n    customOmitClone = require('./_customOmitClone'),\n    flatRest = require('./_flatRest'),\n    getAllKeysIn = require('./_getAllKeysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\nvar omit = flatRest(function(object, paths) {\n  var result = {};\n  if (object == null) {\n    return result;\n  }\n  var isDeep = false;\n  paths = arrayMap(paths, function(path) {\n    path = castPath(path, object);\n    isDeep || (isDeep = path.length > 1);\n    return path;\n  });\n  copyObject(object, getAllKeysIn(object), result);\n  if (isDeep) {\n    result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n  }\n  var length = paths.length;\n  while (length--) {\n    baseUnset(result, paths[length]);\n  }\n  return result;\n});\n\nmodule.exports = omit;\n","var arrayPush = require('./_arrayPush'),\n    getPrototype = require('./_getPrototype'),\n    getSymbols = require('./_getSymbols'),\n    stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n  var result = [];\n  while (object) {\n    arrayPush(result, getSymbols(object));\n    object = getPrototype(object);\n  }\n  return result;\n};\n\nmodule.exports = getSymbolsIn;\n","var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    cacheHas = require('./_cacheHas'),\n    createSet = require('./_createSet'),\n    setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n","var isPlainObject = require('./isPlainObject');\n\n/**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\nfunction customOmitClone(value) {\n  return isPlainObject(value) ? undefined : value;\n}\n\nmodule.exports = customOmitClone;\n","var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    arrayMap = require('./_arrayMap'),\n    baseUnary = require('./_baseUnary'),\n    cacheHas = require('./_cacheHas');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      isCommon = true,\n      length = array.length,\n      result = [],\n      valuesLength = values.length;\n\n  if (!length) {\n    return result;\n  }\n  if (iteratee) {\n    values = arrayMap(values, baseUnary(iteratee));\n  }\n  if (comparator) {\n    includes = arrayIncludesWith;\n    isCommon = false;\n  }\n  else if (values.length >= LARGE_ARRAY_SIZE) {\n    includes = cacheHas;\n    isCommon = false;\n    values = new SetCache(values);\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee == null ? value : iteratee(value);\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var valuesIndex = valuesLength;\n      while (valuesIndex--) {\n        if (values[valuesIndex] === computed) {\n          continue outer;\n        }\n      }\n      result.push(value);\n    }\n    else if (!includes(values, computed, comparator)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseDifference;\n","var Set = require('./_Set'),\n    noop = require('./noop'),\n    setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  var result = [];\n  if (string.charCodeAt(0) === 46 /* . */) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, subString) {\n    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n","var basePullAll = require('./_basePullAll');\n\n/**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */\nfunction pullAll(array, values) {\n  return (array && array.length && values && values.length)\n    ? basePullAll(array, values)\n    : array;\n}\n\nmodule.exports = pullAll;\n","var arrayFilter = require('./_arrayFilter'),\n    stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nmodule.exports = getSymbols;\n","var copyObject = require('./_copyObject'),\n    getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n  return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","var basePickBy = require('./_basePickBy'),\n    hasIn = require('./hasIn');\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, paths) {\n  return basePickBy(object, paths, function(value, path) {\n    return hasIn(object, path);\n  });\n}\n\nmodule.exports = basePick;\n","var baseGet = require('./_baseGet'),\n    baseSet = require('./_baseSet'),\n    castPath = require('./_castPath');\n\n/**\n * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n  var index = -1,\n      length = paths.length,\n      result = {};\n\n  while (++index < length) {\n    var path = paths[index],\n        value = baseGet(object, path);\n\n    if (predicate(value, path)) {\n      baseSet(result, castPath(path, object), value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = basePickBy;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n  var index = -1,\n      length = array.length;\n\n  if (start < 0) {\n    start = -start > length ? 0 : (length + start);\n  }\n  end = end > length ? length : end;\n  if (end < 0) {\n    end += length;\n  }\n  length = start > end ? 0 : ((end - start) >>> 0);\n  start >>>= 0;\n\n  var result = Array(length);\n  while (++index < length) {\n    result[index] = array[index + start];\n  }\n  return result;\n}\n\nmodule.exports = baseSlice;\n","var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n  return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","var baseUniq = require('./_baseUniq');\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n  return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var arrayPush = require('./_arrayPush'),\n    isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var baseFor = require('./_baseFor'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n  result.lastIndex = regexp.lastIndex;\n  return result;\n}\n\nmodule.exports = cloneRegExp;\n","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n  'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n    return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n    if (Array.isArray(arg)) {\n        each(arg, context[fn], context);\n        return true;\n    }\n    return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n    var i;\n\n    if (!obj) {\n        return;\n    }\n\n    if (obj.forEach) {\n        obj.forEach(iterator, context);\n    } else if (obj.length !== undefined) {\n        i = 0;\n        while (i < obj.length) {\n            iterator.call(context, obj[i], i, obj);\n            i++;\n        }\n    } else {\n        for (i in obj) {\n            obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n        }\n    }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n    var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n    return function() {\n        var e = new Error('get-stack-trace');\n        var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n            .replace(/^\\s+at\\s+/gm, '')\n            .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n        var log = window.console && (window.console.warn || window.console.log);\n        if (log) {\n            log.call(window.console, deprecationMessage, stack);\n        }\n        return method.apply(this, arguments);\n    };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n    assign = function assign(target) {\n        if (target === undefined || target === null) {\n            throw new TypeError('Cannot convert undefined or null to object');\n        }\n\n        var output = Object(target);\n        for (var index = 1; index < arguments.length; index++) {\n            var source = arguments[index];\n            if (source !== undefined && source !== null) {\n                for (var nextKey in source) {\n                    if (source.hasOwnProperty(nextKey)) {\n                        output[nextKey] = source[nextKey];\n                    }\n                }\n            }\n        }\n        return output;\n    };\n} else {\n    assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n    var keys = Object.keys(src);\n    var i = 0;\n    while (i < keys.length) {\n        if (!merge || (merge && dest[keys[i]] === undefined)) {\n            dest[keys[i]] = src[keys[i]];\n        }\n        i++;\n    }\n    return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n    return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n    var baseP = base.prototype,\n        childP;\n\n    childP = child.prototype = Object.create(baseP);\n    childP.constructor = child;\n    childP._super = baseP;\n\n    if (properties) {\n        assign(childP, properties);\n    }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n    return function boundFn() {\n        return fn.apply(context, arguments);\n    };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n    if (typeof val == TYPE_FUNCTION) {\n        return val.apply(args ? args[0] || undefined : undefined, args);\n    }\n    return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n    return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.addEventListener(type, handler, false);\n    });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.removeEventListener(type, handler, false);\n    });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n    while (node) {\n        if (node == parent) {\n            return true;\n        }\n        node = node.parentNode;\n    }\n    return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n    return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n    return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n    if (src.indexOf && !findByKey) {\n        return src.indexOf(find);\n    } else {\n        var i = 0;\n        while (i < src.length) {\n            if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n                return i;\n            }\n            i++;\n        }\n        return -1;\n    }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n    return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n    var results = [];\n    var values = [];\n    var i = 0;\n\n    while (i < src.length) {\n        var val = key ? src[i][key] : src[i];\n        if (inArray(values, val) < 0) {\n            results.push(src[i]);\n        }\n        values[i] = val;\n        i++;\n    }\n\n    if (sort) {\n        if (!key) {\n            results = results.sort();\n        } else {\n            results = results.sort(function sortUniqueArray(a, b) {\n                return a[key] > b[key];\n            });\n        }\n    }\n\n    return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n    var prefix, prop;\n    var camelProp = property[0].toUpperCase() + property.slice(1);\n\n    var i = 0;\n    while (i < VENDOR_PREFIXES.length) {\n        prefix = VENDOR_PREFIXES[i];\n        prop = (prefix) ? prefix + camelProp : property;\n\n        if (prop in obj) {\n            return prop;\n        }\n        i++;\n    }\n    return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n    return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n    var doc = element.ownerDocument || element;\n    return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n    var self = this;\n    this.manager = manager;\n    this.callback = callback;\n    this.element = manager.element;\n    this.target = manager.options.inputTarget;\n\n    // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n    // so when disabled the input events are completely bypassed.\n    this.domHandler = function(ev) {\n        if (boolOrFn(manager.options.enable, [manager])) {\n            self.handler(ev);\n        }\n    };\n\n    this.init();\n\n}\n\nInput.prototype = {\n    /**\n     * should handle the inputEvent data and trigger the callback\n     * @virtual\n     */\n    handler: function() { },\n\n    /**\n     * bind the events\n     */\n    init: function() {\n        this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    },\n\n    /**\n     * unbind the events\n     */\n    destroy: function() {\n        this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n    var Type;\n    var inputClass = manager.options.inputClass;\n\n    if (inputClass) {\n        Type = inputClass;\n    } else if (SUPPORT_POINTER_EVENTS) {\n        Type = PointerEventInput;\n    } else if (SUPPORT_ONLY_TOUCH) {\n        Type = TouchInput;\n    } else if (!SUPPORT_TOUCH) {\n        Type = MouseInput;\n    } else {\n        Type = TouchMouseInput;\n    }\n    return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n    var pointersLen = input.pointers.length;\n    var changedPointersLen = input.changedPointers.length;\n    var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n    var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n    input.isFirst = !!isFirst;\n    input.isFinal = !!isFinal;\n\n    if (isFirst) {\n        manager.session = {};\n    }\n\n    // source event is the normalized value of the domEvents\n    // like 'touchstart, mouseup, pointerdown'\n    input.eventType = eventType;\n\n    // compute scale, rotation etc\n    computeInputData(manager, input);\n\n    // emit secret event\n    manager.emit('hammer.input', input);\n\n    manager.recognize(input);\n    manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n    var session = manager.session;\n    var pointers = input.pointers;\n    var pointersLength = pointers.length;\n\n    // store the first input to calculate the distance and direction\n    if (!session.firstInput) {\n        session.firstInput = simpleCloneInputData(input);\n    }\n\n    // to compute scale and rotation we need to store the multiple touches\n    if (pointersLength > 1 && !session.firstMultiple) {\n        session.firstMultiple = simpleCloneInputData(input);\n    } else if (pointersLength === 1) {\n        session.firstMultiple = false;\n    }\n\n    var firstInput = session.firstInput;\n    var firstMultiple = session.firstMultiple;\n    var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n    var center = input.center = getCenter(pointers);\n    input.timeStamp = now();\n    input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n    input.angle = getAngle(offsetCenter, center);\n    input.distance = getDistance(offsetCenter, center);\n\n    computeDeltaXY(session, input);\n    input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n    var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n    input.overallVelocityX = overallVelocity.x;\n    input.overallVelocityY = overallVelocity.y;\n    input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n    input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n    input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n    input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n        session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n    computeIntervalInputData(session, input);\n\n    // find the correct target\n    var target = manager.element;\n    if (hasParent(input.srcEvent.target, target)) {\n        target = input.srcEvent.target;\n    }\n    input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n    var center = input.center;\n    var offset = session.offsetDelta || {};\n    var prevDelta = session.prevDelta || {};\n    var prevInput = session.prevInput || {};\n\n    if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n        prevDelta = session.prevDelta = {\n            x: prevInput.deltaX || 0,\n            y: prevInput.deltaY || 0\n        };\n\n        offset = session.offsetDelta = {\n            x: center.x,\n            y: center.y\n        };\n    }\n\n    input.deltaX = prevDelta.x + (center.x - offset.x);\n    input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n    var last = session.lastInterval || input,\n        deltaTime = input.timeStamp - last.timeStamp,\n        velocity, velocityX, velocityY, direction;\n\n    if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n        var deltaX = input.deltaX - last.deltaX;\n        var deltaY = input.deltaY - last.deltaY;\n\n        var v = getVelocity(deltaTime, deltaX, deltaY);\n        velocityX = v.x;\n        velocityY = v.y;\n        velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n        direction = getDirection(deltaX, deltaY);\n\n        session.lastInterval = input;\n    } else {\n        // use latest velocity info if it doesn't overtake a minimum period\n        velocity = last.velocity;\n        velocityX = last.velocityX;\n        velocityY = last.velocityY;\n        direction = last.direction;\n    }\n\n    input.velocity = velocity;\n    input.velocityX = velocityX;\n    input.velocityY = velocityY;\n    input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n    // make a simple copy of the pointers because we will get a reference if we don't\n    // we only need clientXY for the calculations\n    var pointers = [];\n    var i = 0;\n    while (i < input.pointers.length) {\n        pointers[i] = {\n            clientX: round(input.pointers[i].clientX),\n            clientY: round(input.pointers[i].clientY)\n        };\n        i++;\n    }\n\n    return {\n        timeStamp: now(),\n        pointers: pointers,\n        center: getCenter(pointers),\n        deltaX: input.deltaX,\n        deltaY: input.deltaY\n    };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n    var pointersLength = pointers.length;\n\n    // no need to loop when only one touch\n    if (pointersLength === 1) {\n        return {\n            x: round(pointers[0].clientX),\n            y: round(pointers[0].clientY)\n        };\n    }\n\n    var x = 0, y = 0, i = 0;\n    while (i < pointersLength) {\n        x += pointers[i].clientX;\n        y += pointers[i].clientY;\n        i++;\n    }\n\n    return {\n        x: round(x / pointersLength),\n        y: round(y / pointersLength)\n    };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n    return {\n        x: x / deltaTime || 0,\n        y: y / deltaTime || 0\n    };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n    if (x === y) {\n        return DIRECTION_NONE;\n    }\n\n    if (abs(x) >= abs(y)) {\n        return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n    }\n    return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n\n    return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n    return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n    return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n    return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n    mousedown: INPUT_START,\n    mousemove: INPUT_MOVE,\n    mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n    this.evEl = MOUSE_ELEMENT_EVENTS;\n    this.evWin = MOUSE_WINDOW_EVENTS;\n\n    this.pressed = false; // mousedown state\n\n    Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function MEhandler(ev) {\n        var eventType = MOUSE_INPUT_MAP[ev.type];\n\n        // on start we want to have the left mouse button down\n        if (eventType & INPUT_START && ev.button === 0) {\n            this.pressed = true;\n        }\n\n        if (eventType & INPUT_MOVE && ev.which !== 1) {\n            eventType = INPUT_END;\n        }\n\n        // mouse must be down\n        if (!this.pressed) {\n            return;\n        }\n\n        if (eventType & INPUT_END) {\n            this.pressed = false;\n        }\n\n        this.callback(this.manager, eventType, {\n            pointers: [ev],\n            changedPointers: [ev],\n            pointerType: INPUT_TYPE_MOUSE,\n            srcEvent: ev\n        });\n    }\n});\n\nvar POINTER_INPUT_MAP = {\n    pointerdown: INPUT_START,\n    pointermove: INPUT_MOVE,\n    pointerup: INPUT_END,\n    pointercancel: INPUT_CANCEL,\n    pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n    2: INPUT_TYPE_TOUCH,\n    3: INPUT_TYPE_PEN,\n    4: INPUT_TYPE_MOUSE,\n    5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n    POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n    POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n    this.evEl = POINTER_ELEMENT_EVENTS;\n    this.evWin = POINTER_WINDOW_EVENTS;\n\n    Input.apply(this, arguments);\n\n    this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function PEhandler(ev) {\n        var store = this.store;\n        var removePointer = false;\n\n        var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n        var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n        var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n        var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n        // get index of the event in the store\n        var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n        // start and mouse must be down\n        if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n            if (storeIndex < 0) {\n                store.push(ev);\n                storeIndex = store.length - 1;\n            }\n        } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n            removePointer = true;\n        }\n\n        // it not found, so the pointer hasn't been down (so it's probably a hover)\n        if (storeIndex < 0) {\n            return;\n        }\n\n        // update the event in the store\n        store[storeIndex] = ev;\n\n        this.callback(this.manager, eventType, {\n            pointers: store,\n            changedPointers: [ev],\n            pointerType: pointerType,\n            srcEvent: ev\n        });\n\n        if (removePointer) {\n            // remove from the store\n            store.splice(storeIndex, 1);\n        }\n    }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n    this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n    this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n    this.started = false;\n\n    Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n    handler: function TEhandler(ev) {\n        var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n        // should we handle the touch events?\n        if (type === INPUT_START) {\n            this.started = true;\n        }\n\n        if (!this.started) {\n            return;\n        }\n\n        var touches = normalizeSingleTouches.call(this, ev, type);\n\n        // when done, reset the started state\n        if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n            this.started = false;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n    var all = toArray(ev.touches);\n    var changed = toArray(ev.changedTouches);\n\n    if (type & (INPUT_END | INPUT_CANCEL)) {\n        all = uniqueArray(all.concat(changed), 'identifier', true);\n    }\n\n    return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n    this.evTarget = TOUCH_TARGET_EVENTS;\n    this.targetIds = {};\n\n    Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n    handler: function MTEhandler(ev) {\n        var type = TOUCH_INPUT_MAP[ev.type];\n        var touches = getTouches.call(this, ev, type);\n        if (!touches) {\n            return;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n    var allTouches = toArray(ev.touches);\n    var targetIds = this.targetIds;\n\n    // when there is only one touch, the process can be simplified\n    if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n        targetIds[allTouches[0].identifier] = true;\n        return [allTouches, allTouches];\n    }\n\n    var i,\n        targetTouches,\n        changedTouches = toArray(ev.changedTouches),\n        changedTargetTouches = [],\n        target = this.target;\n\n    // get target touches from touches\n    targetTouches = allTouches.filter(function(touch) {\n        return hasParent(touch.target, target);\n    });\n\n    // collect touches\n    if (type === INPUT_START) {\n        i = 0;\n        while (i < targetTouches.length) {\n            targetIds[targetTouches[i].identifier] = true;\n            i++;\n        }\n    }\n\n    // filter changed touches to only contain touches that exist in the collected target ids\n    i = 0;\n    while (i < changedTouches.length) {\n        if (targetIds[changedTouches[i].identifier]) {\n            changedTargetTouches.push(changedTouches[i]);\n        }\n\n        // cleanup removed touches\n        if (type & (INPUT_END | INPUT_CANCEL)) {\n            delete targetIds[changedTouches[i].identifier];\n        }\n        i++;\n    }\n\n    if (!changedTargetTouches.length) {\n        return;\n    }\n\n    return [\n        // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n        uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n        changedTargetTouches\n    ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n    Input.apply(this, arguments);\n\n    var handler = bindFn(this.handler, this);\n    this.touch = new TouchInput(this.manager, handler);\n    this.mouse = new MouseInput(this.manager, handler);\n\n    this.primaryTouch = null;\n    this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n    /**\n     * handle mouse and touch events\n     * @param {Hammer} manager\n     * @param {String} inputEvent\n     * @param {Object} inputData\n     */\n    handler: function TMEhandler(manager, inputEvent, inputData) {\n        var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n            isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n        if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n            return;\n        }\n\n        // when we're in a touch event, record touches to  de-dupe synthetic mouse event\n        if (isTouch) {\n            recordTouches.call(this, inputEvent, inputData);\n        } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n            return;\n        }\n\n        this.callback(manager, inputEvent, inputData);\n    },\n\n    /**\n     * remove the event listeners\n     */\n    destroy: function destroy() {\n        this.touch.destroy();\n        this.mouse.destroy();\n    }\n});\n\nfunction recordTouches(eventType, eventData) {\n    if (eventType & INPUT_START) {\n        this.primaryTouch = eventData.changedPointers[0].identifier;\n        setLastTouch.call(this, eventData);\n    } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n        setLastTouch.call(this, eventData);\n    }\n}\n\nfunction setLastTouch(eventData) {\n    var touch = eventData.changedPointers[0];\n\n    if (touch.identifier === this.primaryTouch) {\n        var lastTouch = {x: touch.clientX, y: touch.clientY};\n        this.lastTouches.push(lastTouch);\n        var lts = this.lastTouches;\n        var removeLastTouch = function() {\n            var i = lts.indexOf(lastTouch);\n            if (i > -1) {\n                lts.splice(i, 1);\n            }\n        };\n        setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n    }\n}\n\nfunction isSyntheticEvent(eventData) {\n    var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n    for (var i = 0; i < this.lastTouches.length; i++) {\n        var t = this.lastTouches[i];\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n            return true;\n        }\n    }\n    return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n    this.manager = manager;\n    this.set(value);\n}\n\nTouchAction.prototype = {\n    /**\n     * set the touchAction value on the element or enable the polyfill\n     * @param {String} value\n     */\n    set: function(value) {\n        // find out the touch-action by the event handlers\n        if (value == TOUCH_ACTION_COMPUTE) {\n            value = this.compute();\n        }\n\n        if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n            this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n        }\n        this.actions = value.toLowerCase().trim();\n    },\n\n    /**\n     * just re-set the touchAction value\n     */\n    update: function() {\n        this.set(this.manager.options.touchAction);\n    },\n\n    /**\n     * compute the value for the touchAction property based on the recognizer's settings\n     * @returns {String} value\n     */\n    compute: function() {\n        var actions = [];\n        each(this.manager.recognizers, function(recognizer) {\n            if (boolOrFn(recognizer.options.enable, [recognizer])) {\n                actions = actions.concat(recognizer.getTouchAction());\n            }\n        });\n        return cleanTouchActions(actions.join(' '));\n    },\n\n    /**\n     * this method is called on each input cycle and provides the preventing of the browser behavior\n     * @param {Object} input\n     */\n    preventDefaults: function(input) {\n        var srcEvent = input.srcEvent;\n        var direction = input.offsetDirection;\n\n        // if the touch action did prevented once this session\n        if (this.manager.session.prevented) {\n            srcEvent.preventDefault();\n            return;\n        }\n\n        var actions = this.actions;\n        var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n        if (hasNone) {\n            //do not prevent defaults if this is a tap gesture\n\n            var isTapPointer = input.pointers.length === 1;\n            var isTapMovement = input.distance < 2;\n            var isTapTouchTime = input.deltaTime < 250;\n\n            if (isTapPointer && isTapMovement && isTapTouchTime) {\n                return;\n            }\n        }\n\n        if (hasPanX && hasPanY) {\n            // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n            return;\n        }\n\n        if (hasNone ||\n            (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n            (hasPanX && direction & DIRECTION_VERTICAL)) {\n            return this.preventSrc(srcEvent);\n        }\n    },\n\n    /**\n     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n     * @param {Object} srcEvent\n     */\n    preventSrc: function(srcEvent) {\n        this.manager.session.prevented = true;\n        srcEvent.preventDefault();\n    }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n    // none\n    if (inStr(actions, TOUCH_ACTION_NONE)) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n    var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n    // if both pan-x and pan-y are set (different recognizers\n    // for different directions, e.g. horizontal pan but vertical swipe?)\n    // we need none (as otherwise with pan-x pan-y combined none of these\n    // recognizers will work, since the browser would handle all panning\n    if (hasPanX && hasPanY) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    // pan-x OR pan-y\n    if (hasPanX || hasPanY) {\n        return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n    }\n\n    // manipulation\n    if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n        return TOUCH_ACTION_MANIPULATION;\n    }\n\n    return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n    if (!NATIVE_TOUCH_ACTION) {\n        return false;\n    }\n    var touchMap = {};\n    var cssSupports = window.CSS && window.CSS.supports;\n    ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n        // If css.supports is not supported but there is native touch-action assume it supports\n        // all values. This is the case for IE 10 and 11.\n        touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n    });\n    return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n *               Possible\n *                  |\n *            +-----+---------------+\n *            |                     |\n *      +-----+-----+               |\n *      |           |               |\n *   Failed      Cancelled          |\n *                          +-------+------+\n *                          |              |\n *                      Recognized       Began\n *                                         |\n *                                      Changed\n *                                         |\n *                                  Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n    this.options = assign({}, this.defaults, options || {});\n\n    this.id = uniqueId();\n\n    this.manager = null;\n\n    // default is enable true\n    this.options.enable = ifUndefined(this.options.enable, true);\n\n    this.state = STATE_POSSIBLE;\n\n    this.simultaneous = {};\n    this.requireFail = [];\n}\n\nRecognizer.prototype = {\n    /**\n     * @virtual\n     * @type {Object}\n     */\n    defaults: {},\n\n    /**\n     * set options\n     * @param {Object} options\n     * @return {Recognizer}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // also update the touchAction, in case something changed about the directions/enabled state\n        this.manager && this.manager.touchAction.update();\n        return this;\n    },\n\n    /**\n     * recognize simultaneous with an other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    recognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n            return this;\n        }\n\n        var simultaneous = this.simultaneous;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (!simultaneous[otherRecognizer.id]) {\n            simultaneous[otherRecognizer.id] = otherRecognizer;\n            otherRecognizer.recognizeWith(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRecognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        delete this.simultaneous[otherRecognizer.id];\n        return this;\n    },\n\n    /**\n     * recognizer can only run when an other is failing\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    requireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n            return this;\n        }\n\n        var requireFail = this.requireFail;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (inArray(requireFail, otherRecognizer) === -1) {\n            requireFail.push(otherRecognizer);\n            otherRecognizer.requireFailure(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the requireFailure link. it does not remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRequireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        var index = inArray(this.requireFail, otherRecognizer);\n        if (index > -1) {\n            this.requireFail.splice(index, 1);\n        }\n        return this;\n    },\n\n    /**\n     * has require failures boolean\n     * @returns {boolean}\n     */\n    hasRequireFailures: function() {\n        return this.requireFail.length > 0;\n    },\n\n    /**\n     * if the recognizer can recognize simultaneous with an other recognizer\n     * @param {Recognizer} otherRecognizer\n     * @returns {Boolean}\n     */\n    canRecognizeWith: function(otherRecognizer) {\n        return !!this.simultaneous[otherRecognizer.id];\n    },\n\n    /**\n     * You should use `tryEmit` instead of `emit` directly to check\n     * that all the needed recognizers has failed before emitting.\n     * @param {Object} input\n     */\n    emit: function(input) {\n        var self = this;\n        var state = this.state;\n\n        function emit(event) {\n            self.manager.emit(event, input);\n        }\n\n        // 'panstart' and 'panmove'\n        if (state < STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n\n        emit(self.options.event); // simple 'eventName' events\n\n        if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n            emit(input.additionalEvent);\n        }\n\n        // panend and pancancel\n        if (state >= STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n    },\n\n    /**\n     * Check that all the require failure recognizers has failed,\n     * if true, it emits a gesture event,\n     * otherwise, setup the state to FAILED.\n     * @param {Object} input\n     */\n    tryEmit: function(input) {\n        if (this.canEmit()) {\n            return this.emit(input);\n        }\n        // it's failing anyway\n        this.state = STATE_FAILED;\n    },\n\n    /**\n     * can we emit?\n     * @returns {boolean}\n     */\n    canEmit: function() {\n        var i = 0;\n        while (i < this.requireFail.length) {\n            if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n                return false;\n            }\n            i++;\n        }\n        return true;\n    },\n\n    /**\n     * update the recognizer\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        // make a new copy of the inputData\n        // so we can change the inputData without messing up the other recognizers\n        var inputDataClone = assign({}, inputData);\n\n        // is is enabled and allow recognizing?\n        if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n            this.reset();\n            this.state = STATE_FAILED;\n            return;\n        }\n\n        // reset when we've reached the end\n        if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n            this.state = STATE_POSSIBLE;\n        }\n\n        this.state = this.process(inputDataClone);\n\n        // the recognizer has recognized a gesture\n        // so trigger an event\n        if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n            this.tryEmit(inputDataClone);\n        }\n    },\n\n    /**\n     * return the state of the recognizer\n     * the actual recognizing happens in this method\n     * @virtual\n     * @param {Object} inputData\n     * @returns {Const} STATE\n     */\n    process: function(inputData) { }, // jshint ignore:line\n\n    /**\n     * return the preferred touch-action\n     * @virtual\n     * @returns {Array}\n     */\n    getTouchAction: function() { },\n\n    /**\n     * called when the gesture isn't allowed to recognize\n     * like when another is being recognized or it is disabled\n     * @virtual\n     */\n    reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n    if (state & STATE_CANCELLED) {\n        return 'cancel';\n    } else if (state & STATE_ENDED) {\n        return 'end';\n    } else if (state & STATE_CHANGED) {\n        return 'move';\n    } else if (state & STATE_BEGAN) {\n        return 'start';\n    }\n    return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n    if (direction == DIRECTION_DOWN) {\n        return 'down';\n    } else if (direction == DIRECTION_UP) {\n        return 'up';\n    } else if (direction == DIRECTION_LEFT) {\n        return 'left';\n    } else if (direction == DIRECTION_RIGHT) {\n        return 'right';\n    }\n    return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n    var manager = recognizer.manager;\n    if (manager) {\n        return manager.get(otherRecognizer);\n    }\n    return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n    Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof AttrRecognizer\n     */\n    defaults: {\n        /**\n         * @type {Number}\n         * @default 1\n         */\n        pointers: 1\n    },\n\n    /**\n     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {Boolean} recognized\n     */\n    attrTest: function(input) {\n        var optionPointers = this.options.pointers;\n        return optionPointers === 0 || input.pointers.length === optionPointers;\n    },\n\n    /**\n     * Process the input and return the state for the recognizer\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {*} State\n     */\n    process: function(input) {\n        var state = this.state;\n        var eventType = input.eventType;\n\n        var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n        var isValid = this.attrTest(input);\n\n        // on cancel input and we've recognized before, return STATE_CANCELLED\n        if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n            return state | STATE_CANCELLED;\n        } else if (isRecognized || isValid) {\n            if (eventType & INPUT_END) {\n                return state | STATE_ENDED;\n            } else if (!(state & STATE_BEGAN)) {\n                return STATE_BEGAN;\n            }\n            return state | STATE_CHANGED;\n        }\n        return STATE_FAILED;\n    }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n\n    this.pX = null;\n    this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PanRecognizer\n     */\n    defaults: {\n        event: 'pan',\n        threshold: 10,\n        pointers: 1,\n        direction: DIRECTION_ALL\n    },\n\n    getTouchAction: function() {\n        var direction = this.options.direction;\n        var actions = [];\n        if (direction & DIRECTION_HORIZONTAL) {\n            actions.push(TOUCH_ACTION_PAN_Y);\n        }\n        if (direction & DIRECTION_VERTICAL) {\n            actions.push(TOUCH_ACTION_PAN_X);\n        }\n        return actions;\n    },\n\n    directionTest: function(input) {\n        var options = this.options;\n        var hasMoved = true;\n        var distance = input.distance;\n        var direction = input.direction;\n        var x = input.deltaX;\n        var y = input.deltaY;\n\n        // lock to axis?\n        if (!(direction & options.direction)) {\n            if (options.direction & DIRECTION_HORIZONTAL) {\n                direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n                hasMoved = x != this.pX;\n                distance = Math.abs(input.deltaX);\n            } else {\n                direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n                hasMoved = y != this.pY;\n                distance = Math.abs(input.deltaY);\n            }\n        }\n        input.direction = direction;\n        return hasMoved && distance > options.threshold && direction & options.direction;\n    },\n\n    attrTest: function(input) {\n        return AttrRecognizer.prototype.attrTest.call(this, input) &&\n            (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n    },\n\n    emit: function(input) {\n\n        this.pX = input.deltaX;\n        this.pY = input.deltaY;\n\n        var direction = directionStr(input.direction);\n\n        if (direction) {\n            input.additionalEvent = this.options.event + direction;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'pinch',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n    },\n\n    emit: function(input) {\n        if (input.scale !== 1) {\n            var inOut = input.scale < 1 ? 'in' : 'out';\n            input.additionalEvent = this.options.event + inOut;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    this._timer = null;\n    this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PressRecognizer\n     */\n    defaults: {\n        event: 'press',\n        pointers: 1,\n        time: 251, // minimal time of the pointer to be pressed\n        threshold: 9 // a minimal movement is ok, but keep it low\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_AUTO];\n    },\n\n    process: function(input) {\n        var options = this.options;\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTime = input.deltaTime > options.time;\n\n        this._input = input;\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n            this.reset();\n        } else if (input.eventType & INPUT_START) {\n            this.reset();\n            this._timer = setTimeoutContext(function() {\n                this.state = STATE_RECOGNIZED;\n                this.tryEmit();\n            }, options.time, this);\n        } else if (input.eventType & INPUT_END) {\n            return STATE_RECOGNIZED;\n        }\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function(input) {\n        if (this.state !== STATE_RECOGNIZED) {\n            return;\n        }\n\n        if (input && (input.eventType & INPUT_END)) {\n            this.manager.emit(this.options.event + 'up', input);\n        } else {\n            this._input.timeStamp = now();\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof RotateRecognizer\n     */\n    defaults: {\n        event: 'rotate',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n    }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof SwipeRecognizer\n     */\n    defaults: {\n        event: 'swipe',\n        threshold: 10,\n        velocity: 0.3,\n        direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n        pointers: 1\n    },\n\n    getTouchAction: function() {\n        return PanRecognizer.prototype.getTouchAction.call(this);\n    },\n\n    attrTest: function(input) {\n        var direction = this.options.direction;\n        var velocity;\n\n        if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n            velocity = input.overallVelocity;\n        } else if (direction & DIRECTION_HORIZONTAL) {\n            velocity = input.overallVelocityX;\n        } else if (direction & DIRECTION_VERTICAL) {\n            velocity = input.overallVelocityY;\n        }\n\n        return this._super.attrTest.call(this, input) &&\n            direction & input.offsetDirection &&\n            input.distance > this.options.threshold &&\n            input.maxPointers == this.options.pointers &&\n            abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n    },\n\n    emit: function(input) {\n        var direction = directionStr(input.offsetDirection);\n        if (direction) {\n            this.manager.emit(this.options.event + direction, input);\n        }\n\n        this.manager.emit(this.options.event, input);\n    }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    // previous time and center,\n    // used for tap counting\n    this.pTime = false;\n    this.pCenter = false;\n\n    this._timer = null;\n    this._input = null;\n    this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'tap',\n        pointers: 1,\n        taps: 1,\n        interval: 300, // max time between the multi-tap taps\n        time: 250, // max time of the pointer to be down (like finger on the screen)\n        threshold: 9, // a minimal movement is ok, but keep it low\n        posThreshold: 10 // a multi-tap can be a bit off the initial position\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_MANIPULATION];\n    },\n\n    process: function(input) {\n        var options = this.options;\n\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTouchTime = input.deltaTime < options.time;\n\n        this.reset();\n\n        if ((input.eventType & INPUT_START) && (this.count === 0)) {\n            return this.failTimeout();\n        }\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (validMovement && validTouchTime && validPointers) {\n            if (input.eventType != INPUT_END) {\n                return this.failTimeout();\n            }\n\n            var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n            var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n            this.pTime = input.timeStamp;\n            this.pCenter = input.center;\n\n            if (!validMultiTap || !validInterval) {\n                this.count = 1;\n            } else {\n                this.count += 1;\n            }\n\n            this._input = input;\n\n            // if tap count matches we have recognized it,\n            // else it has began recognizing...\n            var tapCount = this.count % options.taps;\n            if (tapCount === 0) {\n                // no failing requirements, immediately trigger the tap event\n                // or wait as long as the multitap interval to trigger\n                if (!this.hasRequireFailures()) {\n                    return STATE_RECOGNIZED;\n                } else {\n                    this._timer = setTimeoutContext(function() {\n                        this.state = STATE_RECOGNIZED;\n                        this.tryEmit();\n                    }, options.interval, this);\n                    return STATE_BEGAN;\n                }\n            }\n        }\n        return STATE_FAILED;\n    },\n\n    failTimeout: function() {\n        this._timer = setTimeoutContext(function() {\n            this.state = STATE_FAILED;\n        }, this.options.interval, this);\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function() {\n        if (this.state == STATE_RECOGNIZED) {\n            this._input.tapCount = this.count;\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n    options = options || {};\n    options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n    return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n    /**\n     * set if DOM events are being triggered.\n     * But this is slower and unused by simple implementations, so disabled by default.\n     * @type {Boolean}\n     * @default false\n     */\n    domEvents: false,\n\n    /**\n     * The value for the touchAction property/fallback.\n     * When set to `compute` it will magically set the correct value based on the added recognizers.\n     * @type {String}\n     * @default compute\n     */\n    touchAction: TOUCH_ACTION_COMPUTE,\n\n    /**\n     * @type {Boolean}\n     * @default true\n     */\n    enable: true,\n\n    /**\n     * EXPERIMENTAL FEATURE -- can be removed/changed\n     * Change the parent input target element.\n     * If Null, then it is being set the to main element.\n     * @type {Null|EventTarget}\n     * @default null\n     */\n    inputTarget: null,\n\n    /**\n     * force an input class\n     * @type {Null|Function}\n     * @default null\n     */\n    inputClass: null,\n\n    /**\n     * Default recognizer setup when calling `Hammer()`\n     * When creating a new Manager these will be skipped.\n     * @type {Array}\n     */\n    preset: [\n        // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n        [RotateRecognizer, {enable: false}],\n        [PinchRecognizer, {enable: false}, ['rotate']],\n        [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n        [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n        [TapRecognizer],\n        [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n        [PressRecognizer]\n    ],\n\n    /**\n     * Some CSS properties can be used to improve the working of Hammer.\n     * Add them to this method and they will be set when creating a new Manager.\n     * @namespace\n     */\n    cssProps: {\n        /**\n         * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userSelect: 'none',\n\n        /**\n         * Disable the Windows Phone grippers when pressing an element.\n         * @type {String}\n         * @default 'none'\n         */\n        touchSelect: 'none',\n\n        /**\n         * Disables the default callout shown when you touch and hold a touch target.\n         * On iOS, when you touch and hold a touch target such as a link, Safari displays\n         * a callout containing information about the link. This property allows you to disable that callout.\n         * @type {String}\n         * @default 'none'\n         */\n        touchCallout: 'none',\n\n        /**\n         * Specifies whether zooming is enabled. Used by IE10>\n         * @type {String}\n         * @default 'none'\n         */\n        contentZooming: 'none',\n\n        /**\n         * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userDrag: 'none',\n\n        /**\n         * Overrides the highlight color shown when the user taps a link or a JavaScript\n         * clickable element in iOS. This property obeys the alpha value, if specified.\n         * @type {String}\n         * @default 'rgba(0,0,0,0)'\n         */\n        tapHighlightColor: 'rgba(0,0,0,0)'\n    }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n    this.options = assign({}, Hammer.defaults, options || {});\n\n    this.options.inputTarget = this.options.inputTarget || element;\n\n    this.handlers = {};\n    this.session = {};\n    this.recognizers = [];\n    this.oldCssProps = {};\n\n    this.element = element;\n    this.input = createInputInstance(this);\n    this.touchAction = new TouchAction(this, this.options.touchAction);\n\n    toggleCssProps(this, true);\n\n    each(this.options.recognizers, function(item) {\n        var recognizer = this.add(new (item[0])(item[1]));\n        item[2] && recognizer.recognizeWith(item[2]);\n        item[3] && recognizer.requireFailure(item[3]);\n    }, this);\n}\n\nManager.prototype = {\n    /**\n     * set options\n     * @param {Object} options\n     * @returns {Manager}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // Options that need a little more setup\n        if (options.touchAction) {\n            this.touchAction.update();\n        }\n        if (options.inputTarget) {\n            // Clean up existing event listeners and reinitialize\n            this.input.destroy();\n            this.input.target = options.inputTarget;\n            this.input.init();\n        }\n        return this;\n    },\n\n    /**\n     * stop recognizing for this session.\n     * This session will be discarded, when a new [input]start event is fired.\n     * When forced, the recognizer cycle is stopped immediately.\n     * @param {Boolean} [force]\n     */\n    stop: function(force) {\n        this.session.stopped = force ? FORCED_STOP : STOP;\n    },\n\n    /**\n     * run the recognizers!\n     * called by the inputHandler function on every movement of the pointers (touches)\n     * it walks through all the recognizers and tries to detect the gesture that is being made\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        var session = this.session;\n        if (session.stopped) {\n            return;\n        }\n\n        // run the touch-action polyfill\n        this.touchAction.preventDefaults(inputData);\n\n        var recognizer;\n        var recognizers = this.recognizers;\n\n        // this holds the recognizer that is being recognized.\n        // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n        // if no recognizer is detecting a thing, it is set to `null`\n        var curRecognizer = session.curRecognizer;\n\n        // reset when the last recognizer is recognized\n        // or when we're in a new session\n        if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n            curRecognizer = session.curRecognizer = null;\n        }\n\n        var i = 0;\n        while (i < recognizers.length) {\n            recognizer = recognizers[i];\n\n            // find out if we are allowed try to recognize the input for this one.\n            // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n            // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n            //      that is being recognized.\n            // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n            //      this can be setup with the `recognizeWith()` method on the recognizer.\n            if (session.stopped !== FORCED_STOP && ( // 1\n                    !curRecognizer || recognizer == curRecognizer || // 2\n                    recognizer.canRecognizeWith(curRecognizer))) { // 3\n                recognizer.recognize(inputData);\n            } else {\n                recognizer.reset();\n            }\n\n            // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n            // current active recognizer. but only if we don't already have an active recognizer\n            if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n                curRecognizer = session.curRecognizer = recognizer;\n            }\n            i++;\n        }\n    },\n\n    /**\n     * get a recognizer by its event name.\n     * @param {Recognizer|String} recognizer\n     * @returns {Recognizer|Null}\n     */\n    get: function(recognizer) {\n        if (recognizer instanceof Recognizer) {\n            return recognizer;\n        }\n\n        var recognizers = this.recognizers;\n        for (var i = 0; i < recognizers.length; i++) {\n            if (recognizers[i].options.event == recognizer) {\n                return recognizers[i];\n            }\n        }\n        return null;\n    },\n\n    /**\n     * add a recognizer to the manager\n     * existing recognizers with the same event name will be removed\n     * @param {Recognizer} recognizer\n     * @returns {Recognizer|Manager}\n     */\n    add: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'add', this)) {\n            return this;\n        }\n\n        // remove existing\n        var existing = this.get(recognizer.options.event);\n        if (existing) {\n            this.remove(existing);\n        }\n\n        this.recognizers.push(recognizer);\n        recognizer.manager = this;\n\n        this.touchAction.update();\n        return recognizer;\n    },\n\n    /**\n     * remove a recognizer by name or instance\n     * @param {Recognizer|String} recognizer\n     * @returns {Manager}\n     */\n    remove: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'remove', this)) {\n            return this;\n        }\n\n        recognizer = this.get(recognizer);\n\n        // let's make sure this recognizer exists\n        if (recognizer) {\n            var recognizers = this.recognizers;\n            var index = inArray(recognizers, recognizer);\n\n            if (index !== -1) {\n                recognizers.splice(index, 1);\n                this.touchAction.update();\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * bind event\n     * @param {String} events\n     * @param {Function} handler\n     * @returns {EventEmitter} this\n     */\n    on: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n        if (handler === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            handlers[event] = handlers[event] || [];\n            handlers[event].push(handler);\n        });\n        return this;\n    },\n\n    /**\n     * unbind event, leave emit blank to remove all handlers\n     * @param {String} events\n     * @param {Function} [handler]\n     * @returns {EventEmitter} this\n     */\n    off: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            if (!handler) {\n                delete handlers[event];\n            } else {\n                handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n            }\n        });\n        return this;\n    },\n\n    /**\n     * emit event to the listeners\n     * @param {String} event\n     * @param {Object} data\n     */\n    emit: function(event, data) {\n        // we also want to trigger dom events\n        if (this.options.domEvents) {\n            triggerDomEvent(event, data);\n        }\n\n        // no handlers, so skip it all\n        var handlers = this.handlers[event] && this.handlers[event].slice();\n        if (!handlers || !handlers.length) {\n            return;\n        }\n\n        data.type = event;\n        data.preventDefault = function() {\n            data.srcEvent.preventDefault();\n        };\n\n        var i = 0;\n        while (i < handlers.length) {\n            handlers[i](data);\n            i++;\n        }\n    },\n\n    /**\n     * destroy the manager and unbinds all events\n     * it doesn't unbind dom events, that is the user own responsibility\n     */\n    destroy: function() {\n        this.element && toggleCssProps(this, false);\n\n        this.handlers = {};\n        this.session = {};\n        this.input.destroy();\n        this.element = null;\n    }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n    var element = manager.element;\n    if (!element.style) {\n        return;\n    }\n    var prop;\n    each(manager.options.cssProps, function(value, name) {\n        prop = prefixed(element.style, name);\n        if (add) {\n            manager.oldCssProps[prop] = element.style[prop];\n            element.style[prop] = value;\n        } else {\n            element.style[prop] = manager.oldCssProps[prop] || '';\n        }\n    });\n    if (!add) {\n        manager.oldCssProps = {};\n    }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n    var gestureEvent = document.createEvent('Event');\n    gestureEvent.initEvent(event, true, true);\n    gestureEvent.gesture = data;\n    data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n    INPUT_START: INPUT_START,\n    INPUT_MOVE: INPUT_MOVE,\n    INPUT_END: INPUT_END,\n    INPUT_CANCEL: INPUT_CANCEL,\n\n    STATE_POSSIBLE: STATE_POSSIBLE,\n    STATE_BEGAN: STATE_BEGAN,\n    STATE_CHANGED: STATE_CHANGED,\n    STATE_ENDED: STATE_ENDED,\n    STATE_RECOGNIZED: STATE_RECOGNIZED,\n    STATE_CANCELLED: STATE_CANCELLED,\n    STATE_FAILED: STATE_FAILED,\n\n    DIRECTION_NONE: DIRECTION_NONE,\n    DIRECTION_LEFT: DIRECTION_LEFT,\n    DIRECTION_RIGHT: DIRECTION_RIGHT,\n    DIRECTION_UP: DIRECTION_UP,\n    DIRECTION_DOWN: DIRECTION_DOWN,\n    DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n    DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n    DIRECTION_ALL: DIRECTION_ALL,\n\n    Manager: Manager,\n    Input: Input,\n    TouchAction: TouchAction,\n\n    TouchInput: TouchInput,\n    MouseInput: MouseInput,\n    PointerEventInput: PointerEventInput,\n    TouchMouseInput: TouchMouseInput,\n    SingleTouchInput: SingleTouchInput,\n\n    Recognizer: Recognizer,\n    AttrRecognizer: AttrRecognizer,\n    Tap: TapRecognizer,\n    Pan: PanRecognizer,\n    Swipe: SwipeRecognizer,\n    Pinch: PinchRecognizer,\n    Rotate: RotateRecognizer,\n    Press: PressRecognizer,\n\n    on: addEventListeners,\n    off: removeEventListeners,\n    each: each,\n    merge: merge,\n    extend: extend,\n    assign: assign,\n    inherit: inherit,\n    bindFn: bindFn,\n    prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n//  style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n    define(function() {\n        return Hammer;\n    });\n} else if (typeof module != 'undefined' && module.exports) {\n    module.exports = Hammer;\n} else {\n    window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nmodule.exports = stubArray;\n","var baseIsSet = require('./_baseIsSet'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var baseKeys = require('./_baseKeys'),\n    getTag = require('./_getTag'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isArrayLike = require('./isArrayLike'),\n    isBuffer = require('./isBuffer'),\n    isPrototype = require('./_isPrototype'),\n    isTypedArray = require('./isTypedArray');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n  if (value == null) {\n    return true;\n  }\n  if (isArrayLike(value) &&\n      (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n        isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n    return !value.length;\n  }\n  var tag = getTag(value);\n  if (tag == mapTag || tag == setTag) {\n    return !value.size;\n  }\n  if (isPrototype(value)) {\n    return !baseKeys(value).length;\n  }\n  for (var key in value) {\n    if (hasOwnProperty.call(value, key)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nmodule.exports = isEmpty;\n","var baseInverter = require('./_baseInverter');\n\n/**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */\nfunction createInverter(setter, toIteratee) {\n  return function(object, iteratee) {\n    return baseInverter(object, setter, toIteratee(iteratee), {});\n  };\n}\n\nmodule.exports = createInverter;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbols = require('./_getSymbols'),\n    keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var baseForOwn = require('./_baseForOwn');\n\n/**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseInverter(object, setter, iteratee, accumulator) {\n  baseForOwn(object, function(value, key, object) {\n    setter(accumulator, iteratee(value), key, object);\n  });\n  return accumulator;\n}\n\nmodule.exports = baseInverter;\n","var arrayMap = require('./_arrayMap'),\n    baseIndexOf = require('./_baseIndexOf'),\n    baseIndexOfWith = require('./_baseIndexOfWith'),\n    baseUnary = require('./_baseUnary'),\n    copyArray = require('./_copyArray');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */\nfunction basePullAll(array, values, iteratee, comparator) {\n  var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n      index = -1,\n      length = values.length,\n      seen = array;\n\n  if (array === values) {\n    values = copyArray(values);\n  }\n  if (iteratee) {\n    seen = arrayMap(array, baseUnary(iteratee));\n  }\n  while (++index < length) {\n    var fromIndex = 0,\n        value = values[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n      if (seen !== array) {\n        splice.call(seen, fromIndex, 1);\n      }\n      splice.call(array, fromIndex, 1);\n    }\n  }\n  return array;\n}\n\nmodule.exports = basePullAll;\n","var flatten = require('./flatten'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n  return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n","var assignValue = require('./_assignValue'),\n    castPath = require('./_castPath'),\n    isIndex = require('./_isIndex'),\n    isObject = require('./isObject'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n  if (!isObject(object)) {\n    return object;\n  }\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      lastIndex = length - 1,\n      nested = object;\n\n  while (nested != null && ++index < length) {\n    var key = toKey(path[index]),\n        newValue = value;\n\n    if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n      return object;\n    }\n\n    if (index != lastIndex) {\n      var objValue = nested[key];\n      newValue = customizer ? customizer(objValue, key, nested) : undefined;\n      if (newValue === undefined) {\n        newValue = isObject(objValue)\n          ? objValue\n          : (isIndex(path[index + 1]) ? [] : {});\n      }\n    }\n    assignValue(nested, key, newValue);\n    nested = nested[key];\n  }\n  return object;\n}\n\nmodule.exports = baseSet;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var Symbol = require('./_Symbol'),\n    arrayMap = require('./_arrayMap'),\n    isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = new array.constructor(length);\n\n  // Add properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\nmodule.exports = initCloneArray;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n"],"sourceRoot":""}