{"mappings":"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","sources":["node_modules/hammerjs/hammer.js","src/particles.js","src/index.js"],"sourcesContent":["/*! 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.\\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","const frameTime = 1000 / 24 // 24 FPS\n\nexport class Particles {\n constructor(settings) {\n this.element = null\n this.context = null\n this.ratio = null\n this.breakpoints = []\n this.activeBreakpoint = null\n this.breakpointSettings = []\n this.originalSettings = null\n this.storage = []\n\n this.options = {\n responsive: null,\n selector: null,\n maxParticles: 100,\n sizeVariations: 3,\n showParticles: true,\n speed: 0.5,\n color: '#000000',\n minDistance: 120,\n // connectParticles: false,\n ...settings,\n }\n this.originalSettings = JSON.parse(JSON.stringify(this.options))\n\n this._anim = this._animate.bind(this)\n\n this._initializeCanvas()\n this._initializeEvents()\n this._registerBreakpoints()\n this._checkResponsive()\n this._initializeStorage()\n this.lastTS = performance.now()\n this._animate(this.lastTS)\n\n return this\n }\n\n // destroy() {\n // this.storage = []\n // this.element.remove()\n\n // window.removeEventListener('resize', this.listener, false)\n // window.cancelAnimationFrame(this._animation)\n // }\n\n /**\n * Setup the canvas element.\n *\n * @private\n */\n _initializeCanvas() {\n let devicePixelRatio\n let backingStoreRatio\n\n if (!this.options.selector) {\n console.warn(\n 'particles.js: No selector specified! Check https://github.com/marcbruederlin/particles.js#options'\n )\n return false\n }\n\n this.element = document.querySelector(this.options.selector)\n this.element.setAttribute(\n 'viewBox',\n `0 0 ${this.element.clientWidth} ${this.element.clientHeight}`\n )\n // this.element.setAttribute('height', this.element.clientHeight)\n // this.context = this.element.getContext('2d')\n\n // devicePixelRatio = window.devicePixelRatio || 1\n // backingStoreRatio =\n // this.context.webkitBackingStorePixelRatio ||\n // this.context.mozBackingStorePixelRatio ||\n // this.context.msBackingStorePixelRatio ||\n // this.context.oBackingStorePixelRatio ||\n // this.context.backingStorePixelRatio ||\n // 1\n\n // this.ratio = devicePixelRatio / backingStoreRatio\n // this.element.width = this.element.offsetParent\n // ? this.element.offsetParent.clientWidth * this.ratio\n // : this.element.clientWidth * this.ratio\n\n // if (this.element.offsetParent && this.element.offsetParent.nodeName === 'BODY') {\n // this.element.height = window.innerHeight * this.ratio\n // } else {\n // this.element.height = this.element.offsetParent\n // ? this.element.offsetParent.clientHeight * this.ratio\n // : this.element.clientHeight * this.ratio\n // }\n // this.element.style.width = '100%'\n // this.element.style.height = '100%'\n\n // this.context.scale(this.ratio, this.ratio)\n }\n\n /**\n * Register event listeners.\n *\n * @private\n */\n _initializeEvents() {\n this.listener = this._resize.bind(this)\n window.addEventListener('resize', this.listener, false)\n }\n\n /**\n * Initialize the particle storage.\n *\n * @private\n */\n _initializeStorage() {\n for (const particle of this.storage) {\n particle.element.remove()\n }\n\n this.storage = []\n\n for (let i = 0; i < this.options.maxParticles; i++) {\n this.storage.push(new Particle(this.element, this.options))\n }\n }\n\n /**\n * Register responsive breakpoints if the user declared some.\n *\n * @private\n */\n _registerBreakpoints() {\n let breakpoint\n let currentBreakpoint\n let l\n const responsiveSettings = this.options.responsive || null\n\n if (\n typeof responsiveSettings === 'object' &&\n responsiveSettings !== null &&\n responsiveSettings.length\n ) {\n for (breakpoint in responsiveSettings) {\n l = this.breakpoints.length - 1\n currentBreakpoint = responsiveSettings[breakpoint].breakpoint\n\n if (responsiveSettings.hasOwnProperty(breakpoint)) {\n while (l >= 0) {\n if (this.breakpoints[l] && this.breakpoints[l] === currentBreakpoint) {\n this.breakpoints.splice(l, 1)\n }\n\n l--\n }\n\n this.breakpoints.push(currentBreakpoint)\n this.breakpointSettings[currentBreakpoint] =\n responsiveSettings[breakpoint].options\n }\n }\n\n this.breakpoints.sort((a, b) => b - a)\n }\n }\n\n /**\n * Check if a breakpoint is active and load the breakpoints options.\n *\n * @private\n */\n _checkResponsive() {\n let breakpoint\n let targetBreakpoint = false\n const windowWidth = window.innerWidth\n\n if (\n this.options.responsive &&\n this.options.responsive.length &&\n this.options.responsive !== null\n ) {\n targetBreakpoint = null\n\n for (breakpoint in this.breakpoints) {\n if (this.breakpoints.hasOwnProperty(breakpoint)) {\n if (windowWidth <= this.breakpoints[breakpoint]) {\n targetBreakpoint = this.breakpoints[breakpoint]\n }\n }\n }\n\n if (targetBreakpoint !== null) {\n this.activeBreakpoint = targetBreakpoint\n this.options = { ...this.options, ...this.breakpointSettings[targetBreakpoint] }\n } else {\n if (this.activeBreakpoint !== null) {\n this.activeBreakpoint = null\n targetBreakpoint = null\n\n this.options = { ...this.options, ...this.originalSettings }\n }\n }\n }\n }\n\n /**\n * Rebuild the storage and update the canvas.\n *\n * @private\n */\n _refresh() {\n this._initializeStorage()\n this._draw()\n }\n\n /**\n * Kick off various things on window resize.\n *\n * @private\n */\n _resize() {\n // this.element.width = this.element.offsetParent\n // ? this.element.offsetParent.clientWidth * this.ratio\n // : this.element.clientWidth * this.ratio\n\n // if (this.element.offsetParent && this.element.offsetParent.nodeName === 'BODY') {\n // this.element.height = window.innerHeight * this.ratio\n // } else {\n // this.element.height = this.element.offsetParent\n // ? this.element.offsetParent.clientHeight * this.ratio\n // : this.element.clientHeight * this.ratio\n // }\n\n // this.context.scale(this.ratio, this.ratio)\n\n clearTimeout(this.windowDelay)\n\n this.windowDelay = window.setTimeout(() => {\n this._checkResponsive()\n this._refresh()\n }, 50)\n }\n\n /**\n * Animates the plugin particles by calling the draw method.\n *\n * @private\n */\n _animate(ts) {\n if (ts - this.lastTS >= frameTime) {\n this.lastTS = ts\n this._draw()\n }\n\n this._animation = window.requestAnimationFrame(this._anim)\n }\n\n /**\n * Restarts the particles animation by calling _animate.\n *\n * @public\n */\n resumeAnimation() {\n if (!this._animation) {\n this._animation = window.requestAnimationFrame(this._anim)\n }\n }\n\n /**\n * Pauses/stops the particle animation.\n *\n * @public\n */\n pauseAnimation() {\n if (!this._animation) return\n\n window.cancelAnimationFrame(this._animation)\n\n this._animation = null\n }\n\n /**\n * Draws the plugin particles.\n *\n * @private\n */\n _draw() {\n const element = this.element\n const parentWidth = element.offsetParent\n ? element.offsetParent.clientWidth\n : element.clientWidth\n let parentHeight = element.offsetParent\n ? element.offsetParent.clientHeight\n : element.clientHeight\n\n if (element.offsetParent && element.offsetParent.nodeName === 'BODY') {\n parentHeight = window.innerHeight\n }\n\n // this.context.clearRect(0, 0, element.width, element.height)\n // this.context.beginPath()\n\n for (const particle of this.storage) {\n // if (this.options.showParticles) {\n // particle._draw()\n // }\n\n particle._updateCoordinates(parentWidth, parentHeight)\n }\n\n // if (this.options.connectParticles) {\n // storage.sort(particleCompareFunc)\n // this._updateEdges()\n // }\n }\n\n // _updateEdges() {\n // const minDistance = this.options.minDistance\n // const storage = this.storage\n // const storageLength = storage.length\n\n // for (let i = 0; i < storageLength; i++) {\n // const p1 = storage[i]\n\n // for (let j = i + 1; j < storageLength; j++) {\n // const p2 = storage[j]\n // let distance\n // const r = p1.x - p2.x\n // const dy = p1.y - p2.y\n\n // distance = Math.sqrt(r * r + dy * dy)\n\n // if (Math.abs(r) > minDistance) {\n // break\n // }\n\n // if (distance <= minDistance) {\n // this._drawEdge(p1, p2, 1.2 - distance / minDistance)\n // }\n // }\n // }\n // }\n\n // _drawEdge({ x, y, color }, { x, y, color }, opacity) {\n // const gradient = this.context.createLinearGradient(x, y, x, y)\n\n // const color1 = _hex2rgb(color)\n // const color2 = _hex2rgb(color)\n\n // gradient.addColorStop(0, `rgba(${color1.r},${color1.g},${color1.b},${opacity})`)\n // gradient.addColorStop(1, `rgba(${color2.r},${color2.g},${color2.b},${opacity})`)\n\n // this.context.beginPath()\n // this.context.strokeStyle = gradient\n // this.context.moveTo(x, y)\n // this.context.lineTo(x, y)\n // this.context.stroke()\n // this.context.fill()\n // this.context.closePath()\n // }\n}\n\nclass Particle {\n constructor(parent, options) {\n const speed = options.speed\n // const color =\n // options.color instanceof Array\n // ? options.color[Math.floor(Math.random() * options.color.length)]\n // : options.color\n\n this.element = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n // this.element.setAttribute('fill', color)\n this.element.classList.add('particle')\n this.element.setAttribute('transform', 'rotate(45)')\n parent.appendChild(this.element)\n this.options = options\n\n const canvas = document.querySelector(options.selector)\n this.x = canvas.offsetParent\n ? Math.random() * canvas.offsetParent.clientWidth\n : Math.random() * canvas.clientWidth\n\n if (canvas.offsetParent && canvas.offsetParent.nodeName === 'BODY') {\n this.y = Math.random() * window.innerHeight\n } else {\n this.y = canvas.offsetParent\n ? Math.random() * canvas.offsetParent.clientHeight\n : Math.random() * canvas.clientHeight\n }\n\n this.vx = Math.random() * speed * 2 - speed\n this.vy = Math.random() * speed * 2 - speed\n this.radius = 0.5 + Math.random() * Math.random() // * options.sizeVariations\n // this.color = color\n\n this.element.setAttribute('width', this.radius * 2)\n this.element.setAttribute('height', this.radius * 2)\n\n this._draw()\n }\n\n _draw() {\n // this.context.save()\n // this.context.translate(this.x, this.y)\n // this.context.moveTo(0, 0)\n // this.context.beginPath()\n // this.context.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false)\n // this.context.fillStyle = this.color\n // this.context.fill()\n // this.context.restore()\n }\n\n _updateCoordinates(parentWidth, parentHeight) {\n let x = this.x + this.vx\n let y = this.y + this.vy\n const radius = this.radius\n\n if (x + radius > parentWidth) {\n x = radius\n } else if (x - radius < 0) {\n x = parentWidth - radius\n }\n\n if (y + radius > parentHeight) {\n y = radius\n } else if (y - radius < 0) {\n y = parentHeight - radius\n }\n\n this.x = x\n this.y = y\n\n this.element.setAttribute('x', x)\n this.element.setAttribute('y', y)\n }\n}\n\n// function particleCompareFunc({ x, y }, { x, y }) {\n// if (x < x) {\n// return -1\n// } else if (x > x) {\n// return 1\n// } else if (y < y) {\n// return -1\n// } else if (y > y) {\n// return 1\n// }\n\n// return 0\n// }\n\n// function _hex2rgb(hex) {\n// const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n\n// return result\n// ? {\n// r: parseInt(result[1], 16),\n// g: parseInt(result[2], 16),\n// b: parseInt(result[3], 16),\n// }\n// : null\n// }\n","import Hammer from 'hammerjs'\nimport { Particles } from './particles'\n\nlet lastActivePageName = undefined\nlet activePageName = undefined\nlet activePageClass = undefined\nlet activeAnimation = undefined\nlet animating = false\n\nactivePageName = pathNameToPageName()\nactivePageClass = 'page-' + activePageName\ndocument.title = pageNameToTitle(activePageName)\nhistory.replaceState(null, document.title, pageNameToPath(activePageName))\n\nlet lastWheelEvent\n\ndocument.addEventListener(\n 'wheel',\n (e) => {\n e.preventDefault()\n\n // prevent touchpad event repeat\n if (\n lastWheelEvent === undefined ||\n Math.sign(e.deltaY) !== Math.sign(lastWheelEvent.deltaY) ||\n Math.sign(e.deltaX) !== Math.sign(lastWheelEvent.deltaX)\n ) {\n if (activePageName === 'home') {\n if (Math.sign(e.deltaY) === 1) {\n changePage('work')\n } else if (Math.sign(e.deltaX) === 1) {\n changePage('about')\n }\n } else if (activePageName === 'about') {\n if (Math.sign(e.deltaX) === -1) {\n changePage('home')\n }\n } else if (activePageName === 'work') {\n if (Math.sign(e.deltaY) === -1) {\n changePage('home')\n }\n }\n }\n\n lastWheelEvent = e\n },\n { passive: false }\n)\n\ndocument.body.addEventListener('animationend', endPageAnimation)\n\nconst mapping = {\n 'about.html': 'about',\n 'work.html': 'work',\n}\n\nconst pageButtons = document.getElementsByClassName('button-for-page')\nfor (const b of pageButtons) {\n b.addEventListener('click', (e) => {\n e.preventDefault()\n changePage(mapping[b.getAttribute('href').replace('/', '')] || 'home')\n })\n}\n\nwindow.addEventListener('popstate', () => {\n changePage(pathNameToPageName(), false)\n})\n\nfunction changePage(page, addToHist = true) {\n if (activePageName === page) return\n\n lastActivePageName = activePageName\n activePageName = page\n\n if (animating) {\n changePageAnimation()\n } else {\n startPageAnimation()\n }\n\n document.title = pageNameToTitle(activePageName)\n\n if (addToHist) {\n history.pushState(null, document.title, pageNameToPath(activePageName))\n }\n}\n\nfunction startPageAnimation() {\n animating = true\n activeAnimation = 'anim-from-' + lastActivePageName + '-to-' + activePageName\n\n document.body.classList.add(activeAnimation)\n}\n\nfunction changePageAnimation() {\n const lastActiveAnimation = activeAnimation\n activeAnimation = 'anim-from-' + lastActivePageName + '-to-' + activePageName\n document.body.classList.replace(lastActiveAnimation, activeAnimation)\n\n const lastActivePageClass = activePageClass\n activePageClass = 'page-' + lastActivePageName\n document.body.classList.replace(lastActivePageClass, activePageClass)\n}\n\nfunction endPageAnimation() {\n if (!animating) return\n animating = false\n\n const lastActivePageClass = activePageClass\n activePageClass = 'page-' + activePageName\n document.body.classList.replace(lastActivePageClass, activePageClass)\n\n document.body.classList.remove(activeAnimation)\n}\n\nfunction pathNameToPageName() {\n switch (window.location.pathname) {\n case '/about':\n return 'about'\n case '/work':\n return 'work'\n default:\n return 'home'\n }\n}\n\nfunction pageNameToPath(name) {\n switch (name) {\n case 'about':\n return '/about'\n case 'work':\n return '/work'\n default:\n return '/'\n }\n}\n\nfunction pageNameToTitle(name) {\n const defaultTitle = 'Teodor Tanasoaia'\n switch (name) {\n case 'about':\n return 'About - ' + defaultTitle\n case 'work':\n return 'Work - ' + defaultTitle\n default:\n return defaultTitle\n }\n}\n\nconst hammer = new Hammer.Manager(document.body)\nhammer.add(new Hammer.Swipe())\n\nhammer.on('swipeleft', () => {\n if (activePageName === 'home') changePage('about')\n})\n\nhammer.on('swiperight', () => {\n if (activePageName === 'about') changePage('home')\n})\n\nhammer.on('swipeup', () => {\n if (activePageName === 'home') changePage('work')\n})\n\nhammer.on('swipedown', () => {\n if (activePageName === 'work') changePage('home')\n})\n\nconst _ = new Particles({\n selector: '#particles',\n speed: 0.2,\n // color: '#FAFAFA',\n // sizeVariations: 2,\n maxParticles: 16 * 4,\n responsive: [\n {\n breakpoint: 992,\n options: {\n maxParticles: 12 * 4,\n },\n },\n {\n breakpoint: 576,\n options: {\n maxParticles: 8 * 4,\n },\n },\n ],\n})\n"],"names":["window","document","exportName","undefined","assign","VENDOR_PREFIXES","TEST_ELEMENT","createElement","round","Math","abs","now","Date","setTimeoutContext","fn","timeout","context","setTimeout","bindFn","invokeArrayArg","arg","Array","isArray","each","obj","iterator","i","forEach","length","call","hasOwnProperty","deprecate","method","name","message","deprecationMessage","e","Error","stack","replace","log","console","warn","apply","this","arguments","Object","target","TypeError","output","index","source","nextKey","extend","dest","src","merge","keys","merge1","inherit","child","base","properties","childP","baseP","prototype","create","constructor","_super","boolOrFn","val","args","ifUndefined","val1","val2","addEventListeners","types","handler","splitStr","type","addEventListener","removeEventListeners","removeEventListener","hasParent","node","parent","parentNode","inStr","str","find","indexOf","trim","split","inArray","findByKey","toArray","slice","uniqueArray","key","sort","results","values","push","a","b","prefixed","property","prefix","prop","camelProp","toUpperCase","_uniqueId","getWindowForElement","element","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","test","navigator","userAgent","INPUT_TYPE_TOUCH","INPUT_TYPE_MOUSE","DIRECTION_VERTICAL","DIRECTION_UP","PROPS_XY","PROPS_CLIENT_XY","Input","manager","callback","self","options","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","start","end","rotation","getRotation","maxPointers","velocity","velocityX","velocityY","direction","last","lastInterval","v","computeIntervalInputData","srcEvent","computeInputData","emit","recognize","clientX","clientY","p1","p2","props","sqrt","atan2","PI","evEl","evTarget","evWin","destroy","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MOUSE_ELEMENT_EVENTS","MOUSE_WINDOW_EVENTS","MouseInput","pressed","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","toLowerCase","isTouch","storeIndex","pointerId","splice","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","SingleTouchInput","started","normalizeSingleTouches","all","touches","changed","changedTouches","concat","TOUCH_INPUT_MAP","TOUCH_TARGET_EVENTS","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_COMPUTE","TOUCH_ACTION_AUTO","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_NONE","TOUCH_ACTION_PAN_X","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","getTouchActionProps","TouchAction","value","set","compute","actions","update","touchAction","recognizers","recognizer","getTouchAction","hasPanX","hasPanY","cleanTouchActions","join","preventDefaults","prevented","preventDefault","hasNone","isTapPointer","isTapMovement","isTapTouchTime","DIRECTION_LEFT","preventSrc","STATE_FAILED","Recognizer","defaults","id","state","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","get","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","toggleCssProps","item","add","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","DIRECTION_NONE","DIRECTION_RIGHT","DIRECTION_DOWN","DIRECTION_ALL","Tap","Pan","Swipe","Pinch","Rotate","Press","define","amd","$cebfe6726e901212$exports","$a12d09b59ed67c52$var$Particle","speed","createElementNS","classList","setAttribute","appendChild","canvas","querySelector","selector","offsetParent","random","clientWidth","nodeName","innerHeight","clientHeight","vx","vy","radius","_draw","_updateCoordinates","parentWidth","parentHeight","$35da740d59af89ba$var$lastActivePageName","$35da740d59af89ba$var$activePageName","$35da740d59af89ba$var$activePageClass","$35da740d59af89ba$var$activeAnimation","$35da740d59af89ba$var$lastWheelEvent","$35da740d59af89ba$var$animating","$35da740d59af89ba$var$pathNameToPageName","title","$35da740d59af89ba$var$pageNameToTitle","history","replaceState","$35da740d59af89ba$var$pageNameToPath","sign","$35da740d59af89ba$var$changePage","passive","body","lastActivePageClass","$35da740d59af89ba$var$mapping","$35da740d59af89ba$var$pageButtons","getElementsByClassName","getAttribute","page","addToHist","lastActiveAnimation","$35da740d59af89ba$var$changePageAnimation","pushState","location","pathname","defaultTitle","$35da740d59af89ba$var$hammer","$parcel$interopDefault","settings","ratio","breakpoints","activeBreakpoint","breakpointSettings","originalSettings","storage","responsive","maxParticles","sizeVariations","showParticles","color","minDistance","JSON","parse","stringify","_anim","_animate","bind","_initializeCanvas","_initializeEvents","_registerBreakpoints","_checkResponsive","_initializeStorage","lastTS","performance","listener","_resize","particle","breakpoint","currentBreakpoint","l","responsiveSettings","targetBreakpoint","windowWidth","innerWidth","_refresh","windowDelay","ts","_animation","requestAnimationFrame","resumeAnimation","pauseAnimation","cancelAnimationFrame"],"version":3,"file":"work.dd686d6b.js.map"}