react-animation-engine
Version:
Extract famo.us transitionable capabilities in 14kb for react. Mixin to transition between state values.
982 lines (911 loc) • 79.2 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define(factory);
else if(typeof exports === 'object')
exports["FamousAnimations"] = factory();
else
root["FamousAnimations"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };
Object.defineProperty(exports, '__esModule', {
value: true
});
// import {PropertyAnimator} from './animator';
var _TransitionableMixin = __webpack_require__(1);
var _TransitionableMixin2 = _interopRequireWildcard(_TransitionableMixin);
var _Transitionable = __webpack_require__(2);
var _Transitionable2 = _interopRequireWildcard(_Transitionable);
var _Easing = __webpack_require__(3);
var _Easing2 = _interopRequireWildcard(_Easing);
exports.TransitionableMixin = _TransitionableMixin2['default'];
exports.Transitionable = _Transitionable2['default'];
exports.Easing = _Easing2['default'];
// PropertyAnimator
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };
var _defineProperty = function (obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: key == null || typeof Symbol == 'undefined' || key.constructor !== Symbol, configurable: true, writable: true }); };
Object.defineProperty(exports, '__esModule', {
value: true
});
var _Transitionable = __webpack_require__(2);
var _Transitionable2 = _interopRequireWildcard(_Transitionable);
var _Easing = __webpack_require__(3);
var _Easing2 = _interopRequireWildcard(_Easing);
function TransitionableMixin(props) {
props = [].concat(props);
var _transitionables = {};
var mixin = {
componentWillUnmount: function componentWillUnmount() {
props.forEach(function (p) {
delete _transitionables[p];
});
},
componentWillMount: function componentWillMount() {
var _this = this;
props.forEach(function (p) {
// Create a transitionable
_transitionables[p] = new _Transitionable2['default'](_this.state[p]);
// Define a property
var property = p;
Object.defineProperty(_this, property, {
get: function get() {
return _transitionables[property].get();
},
set: function set(v) {
/* {value, duration , animation} */
if (typeof v != 'object') {
v = { value: v };
}
// Store the value
var value = v.value;
delete v.value;
// Use 'inSine' as default curve
if (!v.curve) {
v.curve = _Easing2['default'].inSine;
}
this.tween(property, value, v);
}
});
var trans = _transitionables[property];
trans.update(_this._syncProp.bind(_this, property));
_this._syncProp(property);
});
},
_syncProp: function _syncProp(prop) {
var trans = _transitionables[prop];
var state = _defineProperty({}, prop, trans.get());
this.setState(state);
},
tween: function tween(prop, value, animation, callback) {
var trans = _transitionables[prop];
trans.val(value, animation, callback);
},
halt: function halt(prop) {
if (prop) {
var trans = _transitionables[p];
trans.halt();
return;
} else {
props.forEach(function (p) {
var trans = _transitionables[p];
trans.halt();
});
}
}
};
return mixin;
}
exports['default'] = TransitionableMixin;
module.exports = exports['default'];
/***/ },
/* 2 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _inherits = function (subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };
var FamousTransitionable = __webpack_require__(4);
var allowAnimations = false;
var animationID = null;
var transitionables = [];
var listeners = [];
function haveAllFinishedAnimating() {
return transitionables.map(function (t) {
return t._isAnimating;
}).reduce(function (final, tIsAnimating) {
return final && !tIsAnimating;
}, true);
}
function executeListeners() {
for (var ls in listeners) {
listeners[ls]();
}
}
function requestCancelation() {
if (haveAllFinishedAnimating()) {
cancelAnimationFrame(animationID);
allowAnimations = false;
animationID = null;
}
}
// Setup animation
function animate() {
if (!allowAnimations) {
return;
}executeListeners();
animationID = requestAnimationFrame(animate);
}
var Transitionable = (function (_FamousTransitionable) {
function Transitionable(value) {
var _this = this;
_classCallCheck(this, Transitionable);
_get(Object.getPrototypeOf(Transitionable.prototype), 'constructor', this).call(this, value);
// Configure for globals
transitionables.push(this);
this._listenerFn = function () {
return _this._executeListeners();
};
listeners.push(this._listenerFn);
this._isAnimating = false;
}
_inherits(Transitionable, _FamousTransitionable);
_createClass(Transitionable, [{
key: 'update',
value: function update(fn) {
this._listeners = this._listeners || [];
this._listeners.push(fn);
}
}, {
key: 'val',
value: function val(value, animation, complete) {
var self = this;
// Call the original set
self.set(value, animation, function () {
// Last time execution
if (animationID) {
self._isAnimating = false;
}
requestCancelation();
if (complete) {
complete();
};
});
// Prepare for animation
self._isAnimating = true;
allowAnimations = true;
// Request animation start
animate();
}
}, {
key: '_executeListeners',
value: function _executeListeners() {
var _this2 = this;
// Execute listeners
if (this._listeners) {
this._listeners.forEach(function (fn) {
return fn(_this2.get());
});
}
}
}]);
return Transitionable;
})(FamousTransitionable);
module.exports = Transitionable;
/***/ },
/* 3 */
/***/ function(module, exports, __webpack_require__) {
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* @license MPL 2.0
* @copyright Famous Industries, Inc. 2015
*/
var Easing = {
inQuad: function (t) {
return t * t;
},
outQuad: function (t) {
return -(t -= 1) * t + 1;
},
inOutQuad: function (t) {
if ((t /= 0.5) < 1)
return 0.5 * t * t;
return -0.5 * (--t * (t - 2) - 1);
},
inCubic: function (t) {
return t * t * t;
},
outCubic: function (t) {
return --t * t * t + 1;
},
inOutCubic: function (t) {
if ((t /= 0.5) < 1)
return 0.5 * t * t * t;
return 0.5 * ((t -= 2) * t * t + 2);
},
inQuart: function (t) {
return t * t * t * t;
},
outQuart: function (t) {
return -(--t * t * t * t - 1);
},
inOutQuart: function (t) {
if ((t /= 0.5) < 1)
return 0.5 * t * t * t * t;
return -0.5 * ((t -= 2) * t * t * t - 2);
},
inQuint: function (t) {
return t * t * t * t * t;
},
outQuint: function (t) {
return --t * t * t * t * t + 1;
},
inOutQuint: function (t) {
if ((t /= 0.5) < 1)
return 0.5 * t * t * t * t * t;
return 0.5 * ((t -= 2) * t * t * t * t + 2);
},
inSine: function (t) {
return -1 * Math.cos(t * (Math.PI / 2)) + 1;
},
outSine: function (t) {
return Math.sin(t * (Math.PI / 2));
},
inOutSine: function (t) {
return -0.5 * (Math.cos(Math.PI * t) - 1);
},
inExpo: function (t) {
return t === 0 ? 0 : Math.pow(2, 10 * (t - 1));
},
outExpo: function (t) {
return t === 1 ? 1 : -Math.pow(2, -10 * t) + 1;
},
inOutExpo: function (t) {
if (t === 0)
return 0;
if (t === 1)
return 1;
if ((t /= 0.5) < 1)
return 0.5 * Math.pow(2, 10 * (t - 1));
return 0.5 * (-Math.pow(2, -10 * --t) + 2);
},
inCirc: function (t) {
return -(Math.sqrt(1 - t * t) - 1);
},
outCirc: function (t) {
return Math.sqrt(1 - --t * t);
},
inOutCirc: function (t) {
if ((t /= 0.5) < 1)
return -0.5 * (Math.sqrt(1 - t * t) - 1);
return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);
},
inElastic: function (t) {
var s = 1.70158;
var p = 0;
var a = 1;
if (t === 0)
return 0;
if (t === 1)
return 1;
if (!p)
p = 0.3;
s = p / (2 * Math.PI) * Math.asin(1 / a);
return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
},
outElastic: function (t) {
var s = 1.70158;
var p = 0;
var a = 1;
if (t === 0)
return 0;
if (t === 1)
return 1;
if (!p)
p = 0.3;
s = p / (2 * Math.PI) * Math.asin(1 / a);
return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;
},
inOutElastic: function (t) {
var s = 1.70158;
var p = 0;
var a = 1;
if (t === 0)
return 0;
if ((t /= 0.5) === 2)
return 1;
if (!p)
p = 0.3 * 1.5;
s = p / (2 * Math.PI) * Math.asin(1 / a);
if (t < 1)
return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;
},
inBack: function (t, s) {
if (s === undefined)
s = 1.70158;
return t * t * ((s + 1) * t - s);
},
outBack: function (t, s) {
if (s === undefined)
s = 1.70158;
return --t * t * ((s + 1) * t + s) + 1;
},
inOutBack: function (t, s) {
if (s === undefined)
s = 1.70158;
if ((t /= 0.5) < 1)
return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));
return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);
},
inBounce: function (t) {
return 1 - Easing.outBounce(1 - t);
},
outBounce: function (t) {
if (t < 1 / 2.75) {
return 7.5625 * t * t;
} else if (t < 2 / 2.75) {
return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;
} else if (t < 2.5 / 2.75) {
return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;
} else {
return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;
}
},
inOutBounce: function (t) {
if (t < 0.5)
return Easing.inBounce(t * 2) * 0.5;
return Easing.outBounce(t * 2 - 1) * 0.5 + 0.5;
}
};
module.exports = Easing;
/***/ },
/* 4 */
/***/ function(module, exports, __webpack_require__) {
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* @license MPL 2.0
* @copyright Famous Industries, Inc. 2015
*/
var MultipleTransition = __webpack_require__(5);
var TweenTransition = __webpack_require__(6);
function Transitionable(start) {
this.currentAction = null;
this.actionQueue = [];
this.callbackQueue = [];
this.state = 0;
this.velocity = undefined;
this._callback = undefined;
this._engineInstance = null;
this._currentMethod = null;
this.set(start);
}
var transitionMethods = {};
Transitionable.register = function register(methods) {
var success = true;
for (var method in methods) {
if (!Transitionable.registerMethod(method, methods[method]))
success = false;
}
return success;
};
Transitionable.registerMethod = function registerMethod(name, engineClass) {
if (!(name in transitionMethods)) {
transitionMethods[name] = engineClass;
return true;
} else
return false;
};
Transitionable.unregisterMethod = function unregisterMethod(name) {
if (name in transitionMethods) {
delete transitionMethods[name];
return true;
} else
return false;
};
function _loadNext() {
if (this._callback) {
var callback = this._callback;
this._callback = undefined;
callback();
}
if (this.actionQueue.length <= 0) {
this.set(this.get());
return;
}
this.currentAction = this.actionQueue.shift();
this._callback = this.callbackQueue.shift();
var method = null;
var endValue = this.currentAction[0];
var transition = this.currentAction[1];
if (transition instanceof Object && transition.method) {
method = transition.method;
if (typeof method === 'string')
method = transitionMethods[method];
} else {
method = TweenTransition;
}
if (this._currentMethod !== method) {
if (!(endValue instanceof Object) || method.SUPPORTS_MULTIPLE === true || endValue.length <= method.SUPPORTS_MULTIPLE) {
this._engineInstance = new method();
} else {
this._engineInstance = new MultipleTransition(method);
}
this._currentMethod = method;
}
this._engineInstance.reset(this.state, this.velocity);
if (this.velocity !== undefined)
transition.velocity = this.velocity;
this._engineInstance.set(endValue, transition, _loadNext.bind(this));
}
Transitionable.prototype.set = function set(endState, transition, callback) {
if (!transition) {
this.reset(endState);
if (callback)
callback();
return this;
}
var action = [
endState,
transition
];
this.actionQueue.push(action);
this.callbackQueue.push(callback);
if (!this.currentAction)
_loadNext.call(this);
return this;
};
Transitionable.prototype.reset = function reset(startState, startVelocity) {
this._currentMethod = null;
this._engineInstance = null;
this._callback = undefined;
this.state = startState;
this.velocity = startVelocity;
this.currentAction = null;
this.actionQueue = [];
this.callbackQueue = [];
};
Transitionable.prototype.delay = function delay(duration, callback) {
var endValue;
if (this.actionQueue.length)
endValue = this.actionQueue[this.actionQueue.length - 1][0];
else if (this.currentAction)
endValue = this.currentAction[0];
else
endValue = this.get();
return this.set(endValue, {
duration: duration,
curve: function () {
return 0;
}
}, callback);
};
Transitionable.prototype.get = function get(timestamp) {
if (this._engineInstance) {
if (this._engineInstance.getVelocity)
this.velocity = this._engineInstance.getVelocity();
this.state = this._engineInstance.get(timestamp);
}
return this.state;
};
Transitionable.prototype.isActive = function isActive() {
return !!this.currentAction;
};
Transitionable.prototype.halt = function halt() {
return this.set(this.get());
};
module.exports = Transitionable;
/***/ },
/* 5 */
/***/ function(module, exports, __webpack_require__) {
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* @license MPL 2.0
* @copyright Famous Industries, Inc. 2015
*/
var Utility = __webpack_require__(7);
function MultipleTransition(method) {
this.method = method;
this._instances = [];
this.state = [];
}
MultipleTransition.SUPPORTS_MULTIPLE = true;
MultipleTransition.prototype.get = function get() {
for (var i = 0; i < this._instances.length; i++) {
this.state[i] = this._instances[i].get();
}
return this.state;
};
MultipleTransition.prototype.set = function set(endState, transition, callback) {
var _allCallback = Utility.after(endState.length, callback);
for (var i = 0; i < endState.length; i++) {
if (!this._instances[i])
this._instances[i] = new this.method();
this._instances[i].set(endState[i], transition, _allCallback);
}
};
MultipleTransition.prototype.reset = function reset(startState) {
for (var i = 0; i < startState.length; i++) {
if (!this._instances[i])
this._instances[i] = new this.method();
this._instances[i].reset(startState[i]);
}
};
module.exports = MultipleTransition;
/***/ },
/* 6 */
/***/ function(module, exports, __webpack_require__) {
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* @license MPL 2.0
* @copyright Famous Industries, Inc. 2015
*/
function TweenTransition(options) {
this.options = Object.create(TweenTransition.DEFAULT_OPTIONS);
if (options)
this.setOptions(options);
this._startTime = 0;
this._startValue = 0;
this._updateTime = 0;
this._endValue = 0;
this._curve = undefined;
this._duration = 0;
this._active = false;
this._callback = undefined;
this.state = 0;
this.velocity = undefined;
}
TweenTransition.Curves = {
linear: function (t) {
return t;
},
easeIn: function (t) {
return t * t;
},
easeOut: function (t) {
return t * (2 - t);
},
easeInOut: function (t) {
if (t <= 0.5)
return 2 * t * t;
else
return -2 * t * t + 4 * t - 1;
},
easeOutBounce: function (t) {
return t * (3 - 2 * t);
},
spring: function (t) {
return (1 - t) * Math.sin(6 * Math.PI * t) + t;
}
};
TweenTransition.SUPPORTS_MULTIPLE = true;
TweenTransition.DEFAULT_OPTIONS = {
curve: TweenTransition.Curves.linear,
duration: 500,
speed: 0
};
var registeredCurves = {};
TweenTransition.registerCurve = function registerCurve(curveName, curve) {
if (!registeredCurves[curveName]) {
registeredCurves[curveName] = curve;
return true;
} else {
return false;
}
};
TweenTransition.unregisterCurve = function unregisterCurve(curveName) {
if (registeredCurves[curveName]) {
delete registeredCurves[curveName];
return true;
} else {
return false;
}
};
TweenTransition.getCurve = function getCurve(curveName) {
var curve = registeredCurves[curveName];
if (curve !== undefined)
return curve;
else
throw new Error('curve not registered');
};
TweenTransition.getCurves = function getCurves() {
return registeredCurves;
};
function _interpolate(a, b, t) {
return (1 - t) * a + t * b;
}
function _clone(obj) {
if (obj instanceof Object) {
if (obj instanceof Array)
return obj.slice(0);
else
return Object.create(obj);
} else
return obj;
}
function _normalize(transition, defaultTransition) {
var result = { curve: defaultTransition.curve };
if (defaultTransition.duration)
result.duration = defaultTransition.duration;
if (defaultTransition.speed)
result.speed = defaultTransition.speed;
if (transition instanceof Object) {
if (transition.duration !== undefined)
result.duration = transition.duration;
if (transition.curve)
result.curve = transition.curve;
if (transition.speed)
result.speed = transition.speed;
}
if (typeof result.curve === 'string')
result.curve = TweenTransition.getCurve(result.curve);
return result;
}
TweenTransition.prototype.setOptions = function setOptions(options) {
if (options.curve !== undefined)
this.options.curve = options.curve;
if (options.duration !== undefined)
this.options.duration = options.duration;
if (options.speed !== undefined)
this.options.speed = options.speed;
};
TweenTransition.prototype.set = function set(endValue, transition, callback) {
if (!transition) {
this.reset(endValue);
if (callback)
callback();
return;
}
this._startValue = _clone(this.get());
transition = _normalize(transition, this.options);
if (transition.speed) {
var startValue = this._startValue;
if (startValue instanceof Object) {
var variance = 0;
for (var i in startValue)
variance += (endValue[i] - startValue[i]) * (endValue[i] - startValue[i]);
transition.duration = Math.sqrt(variance) / transition.speed;
} else {
transition.duration = Math.abs(endValue - startValue) / transition.speed;
}
}
this._startTime = Date.now();
this._endValue = _clone(endValue);
this._startVelocity = _clone(transition.velocity);
this._duration = transition.duration;
this._curve = transition.curve;
this._active = true;
this._callback = callback;
};
TweenTransition.prototype.reset = function reset(startValue, startVelocity) {
if (this._callback) {
var callback = this._callback;
this._callback = undefined;
callback();
}
this.state = _clone(startValue);
this.velocity = _clone(startVelocity);
this._startTime = 0;
this._duration = 0;
this._updateTime = 0;
this._startValue = this.state;
this._startVelocity = this.velocity;
this._endValue = this.state;
this._active = false;
};
TweenTransition.prototype.getVelocity = function getVelocity() {
return this.velocity;
};
TweenTransition.prototype.get = function get(timestamp) {
this.update(timestamp);
return this.state;
};
function _calculateVelocity(current, start, curve, duration, t) {
var velocity;
var eps = 1e-7;
var speed = (curve(t) - curve(t - eps)) / eps;
if (current instanceof Array) {
velocity = [];
for (var i = 0; i < current.length; i++) {
if (typeof current[i] === 'number')
velocity[i] = speed * (current[i] - start[i]) / duration;
else
velocity[i] = 0;
}
} else
velocity = speed * (current - start) / duration;
return velocity;
}
function _calculateState(start, end, t) {
var state;
if (start instanceof Array) {
state = [];
for (var i = 0; i < start.length; i++) {
if (typeof start[i] === 'number')
state[i] = _interpolate(start[i], end[i], t);
else
state[i] = start[i];
}
} else
state = _interpolate(start, end, t);
return state;
}
TweenTransition.prototype.update = function update(timestamp) {
if (!this._active) {
if (this._callback) {
var callback = this._callback;
this._callback = undefined;
callback();
}
return;
}
if (!timestamp)
timestamp = Date.now();
if (this._updateTime >= timestamp)
return;
this._updateTime = timestamp;
var timeSinceStart = timestamp - this._startTime;
if (timeSinceStart >= this._duration) {
this.state = this._endValue;
this.velocity = _calculateVelocity(this.state, this._startValue, this._curve, this._duration, 1);
this._active = false;
} else if (timeSinceStart < 0) {
this.state = this._startValue;
this.velocity = this._startVelocity;
} else {
var t = timeSinceStart / this._duration;
this.state = _calculateState(this._startValue, this._endValue, this._curve(t));
this.velocity = _calculateVelocity(this.state, this._startValue, this._curve, this._duration, t);
}
};
TweenTransition.prototype.isActive = function isActive() {
return this._active;
};
TweenTransition.prototype.halt = function halt() {
this.reset(this.get());
};
TweenTransition.registerCurve('linear', TweenTransition.Curves.linear);
TweenTransition.registerCurve('easeIn', TweenTransition.Curves.easeIn);
TweenTransition.registerCurve('easeOut', TweenTransition.Curves.easeOut);
TweenTransition.registerCurve('easeInOut', TweenTransition.Curves.easeInOut);
TweenTransition.registerCurve('easeOutBounce', TweenTransition.Curves.easeOutBounce);
TweenTransition.registerCurve('spring', TweenTransition.Curves.spring);
TweenTransition.customCurve = function customCurve(v1, v2) {
v1 = v1 || 0;
v2 = v2 || 0;
return function (t) {
return v1 * t + (-2 * v1 - v2 + 3) * t * t + (v1 + v2 - 2) * t * t * t;
};
};
module.exports = TweenTransition;
/***/ },
/* 7 */
/***/ function(module, exports, __webpack_require__) {
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* @license MPL 2.0
* @copyright Famous Industries, Inc. 2015
*/
var Utility = {};
Utility.Direction = {
X: 0,
Y: 1,
Z: 2
};
Utility.after = function after(count, callback) {
var counter = count;
return function () {
counter--;
if (counter === 0)
callback.apply(this, arguments);
};
};
Utility.loadURL = function loadURL(url, callback) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function onreadystatechange() {
if (this.readyState === 4) {
if (callback)
callback(this.responseText);
}
};
xhr.open('GET', url);
xhr.send();
};
Utility.createDocumentFragmentFromHTML = function createDocumentFragmentFromHTML(html) {
var element = document.createElement('div');
element.innerHTML = html;
var result = document.createDocumentFragment();
while (element.hasChildNodes())
result.appendChild(element.firstChild);
return result;
};
Utility.clone = function clone(b) {
var a;
if (typeof b === 'object') {
a = b instanceof Array ? [] : {};
for (var key in b) {
if (typeof b[key] === 'object' && b[key] !== null) {
if (b[key] instanceof Array) {
a[key] = new Array(b[key].length);
for (var i = 0; i < b[key].length; i++) {
a[key][i] = Utility.clone(b[key][i]);
}
} else {
a[key] = Utility.clone(b[key]);
}
} else {
a[key] = b[key];
}
}
} else {
a = b;
}
return a;
};
module.exports = Utility;
/***/ }
/******/ ])
});
;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA5MzFiMWZkZmY4OWJjMzVmNWE4MyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21peGluLmpzIiwid2VicGFjazovLy8uL3NyYy90cmFuc2l0aW9uYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZhbW91cy90cmFuc2l0aW9ucy9FYXNpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYW1vdXMvdHJhbnNpdGlvbnMvVHJhbnNpdGlvbmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYW1vdXMvdHJhbnNpdGlvbnMvTXVsdGlwbGVUcmFuc2l0aW9uLmpzIiwid2VicGFjazovLy8uL34vZmFtb3VzL3RyYW5zaXRpb25zL1R3ZWVuVHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZhbW91cy91dGlsaXRpZXMvVXRpbGl0eS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Z0RDckNnQyxDQUFTOzs7OzJDQUNkLENBQWtCOzs7O21DQUMxQixDQUEyQjs7OztTQUkxQyxtQkFBbUI7U0FDbkIsY0FBYztTQUNkLE1BQU07Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0NUaUIsQ0FBa0I7Ozs7bUNBQzFCLENBQTJCOzs7O0FBRTlDLFVBQVMsbUJBQW1CLENBQUMsS0FBSyxFQUFFOztBQUVs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QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0EsVUFBUztBQUNUO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUI7Ozs7OztBQ3JLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDOzs7Ozs7QUN0SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLDRCQUE0QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIscUJBQXFCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQix1QkFBdUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDOzs7Ozs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsbUJBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7Ozs7OztBQ3BQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBbUMsbUJBQW1CO0FBQ3REO0FBQ0E7QUFDQSxrQkFBaUI7QUFDakI7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQiIsImZpbGUiOiJGYW1vdXNBbmltYXRpb25zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJGYW1vdXNBbmltYXRpb25zXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkZhbW91c0FuaW1hdGlvbnNcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiBcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb25cbiAqKi8iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHdlYnBhY2svYm9vdHN0cmFwIDkzMWIxZmRmZjg5YmMzNWY1YTgzXG4gKiovIiwiLy8gaW1wb3J0IHtQcm9wZXJ0eUFuaW1hdG9yfSBmcm9tICcuL2FuaW1hdG9yJztcbmltcG9ydCBUcmFuc2l0aW9uYWJsZU1peGluIGZyb20gJy4vbWl4aW4nO1xuaW1wb3J0IFRyYW5zaXRpb25hYmxlIGZyb20gJy4vdHJhbnNpdGlvbmFibGUnO1xuaW1wb3J0IEVhc2luZyBmcm9tICdmYW1vdXMvdHJhbnNpdGlvbnMvRWFzaW5nJztcblxuZXhwb3J0IHtcbiAgICAvLyBQcm9wZXJ0eUFuaW1hdG9yXG4gICAgVHJhbnNpdGlvbmFibGVNaXhpbixcbiAgICBUcmFuc2l0aW9uYWJsZSxcbiAgICBFYXNpbmdcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2luZGV4LmpzXG4gKiovIiwiaW1wb3J0IFRyYW5zaXRpb25hYmxlIGZyb20gJy4vdHJhbnNpdGlvbmFibGUnO1xuaW1wb3J0IEVhc2luZyBmcm9tICdmYW1vdXMvdHJhbnNpdGlvbnMvRWFzaW5nJztcblxuZnVuY3Rpb24gVHJhbnNpdGlvbmFibGVNaXhpbihwcm9wcykge1xuXG4gIHByb3BzID0gW10uY29uY2F0KHByb3BzKTtcblxuICB2YXIgX3RyYW5zaXRpb25hYmxlcyA9IHt9O1xuXG4gIHZhciBtaXhpbiA9IHtcblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgcHJvcHMuZm9yRWFjaCggcCA9PiB7XG4gICAgICAgIGRlbGV0ZSBfdHJhbnNpdGlvbmFibGVzW3BdO1xuICAgICAgfSlcbiAgICB9LFxuXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgcHJvcHMuZm9yRWFjaCggcCA9PiB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHRyYW5zaXRpb25hYmxlXG4gICAgICAgIF90cmFuc2l0aW9uYWJsZXNbcF0gPSBuZXcgVHJhbnNpdGlvbmFibGUodGhpcy5zdGF0ZVtwXSk7XG4gICAgICAgIC8vIERlZmluZSBhIHByb3BlcnR5XG4gICAgICAgIHZhciBwcm9wZXJ0eSA9IHA7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwge1xuICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdHJhbnNpdGlvbmFibGVzW3Byb3BlcnR5XS5nZXQoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0KHYpIHtcbiAgICAgICAgICAgIC8qIHt2YWx1ZSwgZHVyYXRpb24gLCBhbmltYXRpb259ICovXG4gICAgICAgICAgICBpZiAodHlwZW9mIHYgIT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICB2ID0ge3ZhbHVlOiB2fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSB2YWx1ZVxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdi52YWx1ZTtcbiAgICAgICAgICAgIGRlbGV0ZSB2LnZhbHVlO1xuICAgICAgICAgICAgLy8gVXNlICdpblNpbmUnIGFzIGRlZmF1bHQgY3VydmVcbiAgICAgICAgICAgIGlmICghdi5jdXJ2ZSkge3YuY3VydmUgPSBFYXNpbmcuaW5TaW5lfVxuICAgICAgICAgICAgdGhpcy50d2Vlbihwcm9wZXJ0eSwgdmFsdWUsIHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB0cmFucyA9IF90cmFuc2l0aW9uYWJsZXNbcHJvcGVydHldO1xuICAgICAgICB0cmFucy51cGRhdGUodGhpcy5fc3luY1Byb3AuYmluZCh0aGlzLCBwcm9wZXJ0eSkpXG4gICAgICAgIHRoaXMuX3N5bmNQcm9wKHByb3BlcnR5KTtcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIF9zeW5jUHJvcChwcm9wKSB7XG4gICAgICB2YXIgdHJhbnMgPSBfdHJhbnNpdGlvbmFibGVzW3Byb3BdO1xuICAgICAgdmFyIHN0YXRlID0ge1twcm9wXTogdHJhbnMuZ2V0KCl9O1xuICAgICAgdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgfSxcblxuICAgIHR3ZWVuKHByb3AsIHZhbHVlLCBhbmltYXRpb24sIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgdHJhbnMgPSBfdHJhbnNpdGlvbmFibGVzW3Byb3BdO1xuICAgICAgdHJhbnMudmFsKHZhbHVlLCBhbmltYXRpb24sIGNhbGxiYWNrKTtcbiAgICB9LFxuXG4gICAgaGFsdChwcm9wKSB7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICB2YXIgdHJhbnMgPSBfdHJhbnNpdGlvbmFibGVzW3BdO1xuICAgICAgICB0cmFucy5oYWx0KCk7XG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcHMuZm9yRWFjaCggcCA9PiB7XG4gICAgICAgICAgdmFyIHRyYW5zID0gX3RyYW5zaXRpb25hYmxlc1twXTtcbiAgICAgICAgICB0cmFucy5oYWx0KClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWl4aW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNpdGlvbmFibGVNaXhpbjtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL21peGluLmpzXG4gKiovIiwidmFyIEZhbW91c1RyYW5zaXRpb25hYmxlID0gcmVxdWlyZSgnZmFtb3VzL3RyYW5zaXRpb25zL1RyYW5zaXRpb25hYmxlJyk7XG5cbnZhciBhbGxvd0FuaW1hdGlvbnMgPSBmYWxzZTtcbnZhciBhbmltYXRpb25JRCA9IG51bGw7XG5cbnZhciB0cmFuc2l0aW9uYWJsZXMgPSBbXTtcbnZhciBsaXN0ZW5lcnMgPSBbXTtcblxuZnVuY3Rpb24gaGF2ZUFsbEZpbmlzaGVkQW5pbWF0aW5nKCkge1xuICAgIHJldHVybiB0cmFuc2l0aW9uYWJsZXNcbiAgICAgICAgICAgIC5tYXAodCA9PiB0Ll9pc0FuaW1hdGluZylcbiAgICAgICAgICAgIC5yZWR1Y2UoKGZpbmFsLCB0SXNBbmltYXRpbmcpID0+IGZpbmFsICYmICF0SXNBbmltYXRpbmcsIHRydWUpXG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVMaXN0ZW5lcnMoKSB7XG4gICAgZm9yICh2YXIgbHMgaW4gbGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyc1tsc10oKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdENhbmNlbGF0aW9uKCkge1xuICAgIGlmIChoYXZlQWxsRmluaXNoZWRBbmltYXRpbmcoKSkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShhbmltYXRpb25JRCk7XG4gICAgICAgIGFsbG93QW5pbWF0aW9ucyA9IGZhbHNlO1xuICAgICAgICBhbmltYXRpb25JRCA9IG51bGw7XG4gICAgfVxufVxuXG4vLyBTZXR1cCBhbmltYXRpb25cbmZ1bmN0aW9uIGFuaW1hdGUoKSB7XG4gICAgaWYgKCFhbGxvd0FuaW1hdGlvbnMpIHJldHVyblxuICAgIGV4ZWN1dGVMaXN0ZW5lcnMoKTtcbiAgICBhbmltYXRpb25JRCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbn1cblxuXG5jbGFzcyBUcmFuc2l0aW9uYWJsZSBleHRlbmRzIEZhbW91c1RyYW5zaXRpb25hYmxlIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICBzdXBlcih2YWx1ZSlcblxuICAgICAgICAvLyBDb25maWd1cmUgZm9yIGdsb2JhbHNcbiAgICAgICAgdHJhbnNpdGlvbmFibGVzLnB1c2godGhpcyk7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyRm4gPSAoKSA9PiB0aGlzLl9leGVjdXRlTGlzdGVuZXJzKCk7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKHRoaXMuX2xpc3RlbmVyRm4pO1xuXG4gICAgICAgIHRoaXMuX2lzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHVwZGF0ZShmbikge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGZuKTtcbiAgICB9XG4gICAgdmFsKHZhbHVlLCBhbmltYXRpb24sIGNvbXBsZXRlKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBzZXRcbiAgICAgICAgc2VsZi5zZXQodmFsdWUsIGFuaW1hdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gTGFzdCB0aW1lIGV4ZWN1dGlvblxuICAgICAgICAgIGlmIChhbmltYXRpb25JRCkge1xuICAgICAgICAgICAgICBzZWxmLl9pc0FuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcXVlc3RDYW5jZWxhdGlvbigpO1xuXG4gICAgICAgICAgaWYgKGNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUHJlcGFyZSBmb3IgYW5pbWF0aW9uXG4gICAgICAgIHNlbGYuX2lzQW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dBbmltYXRpb25zID0gdHJ1ZTtcblxuICAgICAgICAvLyBSZXF1ZXN0IGFuaW1hdGlvbiBzdGFydFxuICAgICAgICBhbmltYXRlKCk7XG4gICAgfVxuXG4gICAgX2V4ZWN1dGVMaXN0ZW5lcnMoKSB7XG4gICAgICAgIC8vIEV4ZWN1dGUgbGlzdGVuZXJzXG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaCggZm4gPT4gZm4odGhpcy5n