summaryrefslogtreecommitdiffstats
path: root/js/vendor/angular-animate
diff options
context:
space:
mode:
authorBernhard Posselt <dev@bernhard-posselt.com>2015-04-30 18:30:11 +0200
committerBernhard Posselt <dev@bernhard-posselt.com>2015-04-30 18:30:11 +0200
commiteb28c3b137c8a0d61377087c9a04b820151b0b7c (patch)
treec1ebf149f43fa653a4ef1c3f33df04557094e834 /js/vendor/angular-animate
parent2e54780c1496bfa39cd035b9ac40ed851d2198f1 (diff)
update deps
Diffstat (limited to 'js/vendor/angular-animate')
-rw-r--r--js/vendor/angular-animate/.bower.json10
-rw-r--r--js/vendor/angular-animate/angular-animate.js369
-rw-r--r--js/vendor/angular-animate/angular-animate.min.js88
-rw-r--r--js/vendor/angular-animate/angular-animate.min.js.map4
-rw-r--r--js/vendor/angular-animate/bower.json4
-rw-r--r--js/vendor/angular-animate/package.json2
6 files changed, 346 insertions, 131 deletions
diff --git a/js/vendor/angular-animate/.bower.json b/js/vendor/angular-animate/.bower.json
index 0f44e04c4..dc1346b69 100644
--- a/js/vendor/angular-animate/.bower.json
+++ b/js/vendor/angular-animate/.bower.json
@@ -1,17 +1,17 @@
{
"name": "angular-animate",
- "version": "1.4.0-rc.0",
+ "version": "1.4.0-rc.1",
"main": "./angular-animate.js",
"ignore": [],
"dependencies": {
- "angular": "1.4.0-rc.0"
+ "angular": "1.4.0-rc.1"
},
"homepage": "https://github.com/angular/bower-angular-animate",
- "_release": "1.4.0-rc.0",
+ "_release": "1.4.0-rc.1",
"_resolution": {
"type": "version",
- "tag": "v1.4.0-rc.0",
- "commit": "a75c362178f4aac89b1daf1d8e9711f47ffa96da"
+ "tag": "v1.4.0-rc.1",
+ "commit": "872a7357132b252b0856edeea082d6e57d516ea7"
},
"_source": "git://github.com/angular/bower-angular-animate.git",
"_target": "~1.4.*",
diff --git a/js/vendor/angular-animate/angular-animate.js b/js/vendor/angular-animate/angular-animate.js
index c6e8fb592..66fc23934 100644
--- a/js/vendor/angular-animate/angular-animate.js
+++ b/js/vendor/angular-animate/angular-animate.js
@@ -1,5 +1,5 @@
/**
- * @license AngularJS v1.4.0-rc.0
+ * @license AngularJS v1.4.0-rc.1
* (c) 2010-2015 Google, Inc. http://angularjs.org
* License: MIT
*/
@@ -27,6 +27,13 @@ var isPromiseLike = function(p) {
return p && p.then ? true : false;
}
+function assertArg(arg, name, reason) {
+ if (!arg) {
+ throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required"));
+ }
+ return arg;
+}
+
function mergeClasses(a,b) {
if (!a && !b) return '';
if (!a) return b;
@@ -115,7 +122,6 @@ function applyAnimationClassesFactory($$jqLite) {
}
if (options.removeClass) {
$$removeClass($$jqLite, element, options.removeClass);
- element.removeClass(options.removeClass);
options.removeClass = null;
}
}
@@ -417,19 +423,7 @@ var $$AnimateChildrenDirective = [function() {
* start: Function,
*
* // ends (aborts) the animation
- * end: Function,
- *
- * // the total number of seconds that the animation will run for
- * duration: Number,
- *
- * // the total number of seconds that the animation will delay for before starting
- * delay: Number,
- *
- * // whether or not transitions were detected and will therefore be used for the animation
- * transitions: Boolean,
- *
- * // whether or not keyframe animations were detected and will therefore be used for the animation
- * keyframes: Boolean
+ * end: Function
* }
* ```
*
@@ -481,6 +475,7 @@ var $$AnimateChildrenDirective = [function() {
* ({@link ngAnimate#css-staggering-animations Click here to learn how CSS-based staggering works in ngAnimate.})
* * `staggerIndex` - The numeric index representing the stagger item (e.g. a value of 5 is equal to the sixth item in the stagger; therefore when a
* `stagger` option value of `0.1` is used then there will be a stagger delay of `600ms`)
+ * `applyClassesEarly` - Whether or not the classes being added or removed will be used when detecting the animation. This is set by `$animate` when enter/leave/move animations are fired to ensure that the CSS classes are resolved in time. (Note that this will prevent any transitions from occuring on the classes being added and removed.)
*
* @return {null|object} an object with a start method and details about the animation. If no animation is detected then a value of `null` will be returned.
*
@@ -753,9 +748,12 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
//WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND
//WILL TAKE YEARS AWAY FROM YOUR LIFE.
var width = bod.offsetWidth + 1;
- forEach(rafWaitQueue, function(cb) {
- cb(width);
- });
+
+ // we use a for loop to ensure that if the queue is changed
+ // during this looping then it will consider new requests
+ for (var i = 0; i < rafWaitQueue.length; i++) {
+ rafWaitQueue[i](width);
+ }
rafWaitQueue.length = 0;
});
}
@@ -823,6 +821,17 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
addRemoveClassName += pendClasses(options.removeClass, '-remove');
}
+ // there may be a situation where a structural animation is combined together
+ // with CSS classes that need to resolve before the animation is computed.
+ // However this means that there is no explicit CSS code to block the animation
+ // from happening (by setting 0s none in the class name). If this is the case
+ // we need to apply the classes before the first rAF so we know to continue if
+ // there actually is a detected transition or keyframe animation
+ if (options.applyClassesEarly && addRemoveClassName.length) {
+ applyAnimationClasses(element, options);
+ addRemoveClassName = '';
+ }
+
var setupClasses = [structuralClassName, addRemoveClassName].join(' ').trim();
var fullClassName = classes + ' ' + setupClasses;
var activeClasses = pendClasses(setupClasses, '-active');
@@ -904,10 +913,10 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
flags.applyTransitionDuration = hasToStyles && (
(flags.hasTransitions && !flags.hasTransitionAll)
|| (flags.hasAnimations && !flags.hasTransitions));
- flags.applyAnimationDuration = options.duration && flags.hasAnimations;
- flags.applyTransitionDelay = truthyTimingValue(options.delay) && (flags.applyTransitionDuration || flags.hasTransitions);
- flags.applyAnimationDelay = truthyTimingValue(options.delay) && flags.hasAnimations;
- flags.recalculateTimingStyles = addRemoveClassName.length > 0;
+ flags.applyAnimationDuration = options.duration && flags.hasAnimations;
+ flags.applyTransitionDelay = truthyTimingValue(options.delay) && (flags.applyTransitionDuration || flags.hasTransitions);
+ flags.applyAnimationDelay = truthyTimingValue(options.delay) && flags.hasAnimations;
+ flags.recalculateTimingStyles = addRemoveClassName.length > 0;
if (flags.applyTransitionDuration || flags.applyAnimationDuration) {
maxDuration = options.duration ? parseFloat(options.duration) : maxDuration;
@@ -926,42 +935,6 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
}
}
- flags.transitionClassBlock = timings.transitionProperty === 'none' &&
- timings.transitionDuration === 0;
-
- // there may be a situation where a structural animation is combined together
- // with CSS classes that need to resolve before the animation is computed.
- // However this means that there is no explicit CSS code to block the animation
- // from happening (by setting 0s none in the class name). If this is the case
- // we need to apply the classes before the first rAF so we know to continue if
- // there actually is a detected transition or keyframe animation
- var applyClassesEarly = maxDuration === 0
- && isStructural
- && addRemoveClassName.length > 0
- && !flags.transitionClassBlock;
-
- // this is an early check to avoid having to do another call to getComputedStyle
- // call which is expensive. GCS calls are cached to speed things up.
- if (!applyClassesEarly && maxDuration === 0 && !flags.recalculateTimingStyles) {
- close();
- return false;
- }
-
- if (applyClassesEarly) {
- applyAnimationClasses(element, options);
-
- // no need to calculate this anymore
- flags.recalculateTimingStyles = false;
-
- fullClassName = node.className + ' ' + setupClasses;
- cacheKey = gcsHashFn(node, fullClassName);
-
- timings = computeTimings(node, fullClassName, cacheKey);
- relativeDelay = timings.maxDelay;
- maxDelay = Math.max(relativeDelay, 0);
- maxDuration = timings.maxDuration;
- }
-
if (maxDuration === 0 && !flags.recalculateTimingStyles) {
close();
return false;
@@ -983,9 +956,8 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
stagger.animationDuration === 0;
}
- if (flags.blockTransition) {
- applyAnimationFromStyles(element, options);
- } else {
+ applyAnimationFromStyles(element, options);
+ if (!flags.blockTransition) {
blockTransitions(node, false);
}
@@ -1300,27 +1272,39 @@ var $$AnimateCssDriverProvider = ['$$animationProvider', function($$animationPro
rootBodyElement.append(clone);
- var animatorOut = prepareOutAnimation();
+ var animatorIn, animatorOut = prepareOutAnimation();
+
+ // the user may not end up using the `out` animation and
+ // only making use of the `in` animation or vice-versa.
+ // In either case we should allow this and not assume the
+ // animation is over unless both animations are not used.
if (!animatorOut) {
- return end();
+ animatorIn = prepareInAnimation();
+ if (!animatorIn) {
+ return end();
+ }
}
+ var startingAnimator = animatorOut || animatorIn;
+
return {
start: function() {
var runner;
- var currentAnimation = animatorOut.start();
+ var currentAnimation = startingAnimator.start();
currentAnimation.done(function() {
currentAnimation = null;
- var animatorIn = prepareInAnimation();
- if (animatorIn) {
- currentAnimation = animatorIn.start();
- currentAnimation.done(function() {
- currentAnimation = null;
- end();
- runner.complete();
- });
- return currentAnimation;
+ if (!animatorIn) {
+ animatorIn = prepareInAnimation();
+ if (animatorIn) {
+ currentAnimation = animatorIn.start();
+ currentAnimation.done(function() {
+ currentAnimation = null;
+ end();
+ runner.complete();
+ });
+ return currentAnimation;
+ }
}
// in the event that there is no `in` animation
end();
@@ -1446,8 +1430,13 @@ var $$AnimateCssDriverProvider = ['$$animationProvider', function($$animationPro
function prepareRegularAnimation(animationDetails) {
var element = animationDetails.element;
var options = animationDetails.options || {};
+
options.structural = animationDetails.structural;
+ // structural animations ensure that the CSS classes are always applied
+ // before the detection starts.
+ options.applyClassesEarly = options.structural;
+
// we special case the leave animation since we want to ensure that
// the element is removed as soon as the animation is over. Otherwise
// a flicker might appear or the element may not be removed at all
@@ -1771,6 +1760,7 @@ var $$AnimateJsDriverProvider = ['$$animationProvider', function($$animationProv
}];
var NG_ANIMATE_ATTR_NAME = 'data-ng-animate';
+var NG_ANIMATE_PIN_DATA = '$ngAnimatePin';
var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
var PRE_DIGEST_STATE = 1;
var RUNNING_STATE = 2;
@@ -1937,6 +1927,12 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
}
},
+ pin: function(element, parentElement) {
+ assertArg(isElement(element), 'element', 'not an element');
+ assertArg(isElement(parentElement), 'parentElement', 'not an element');
+ element.data(NG_ANIMATE_PIN_DATA, parentElement);
+ },
+
push: function(element, event, options, domOperation) {
options = options || {};
options.domOperation = domOperation;
@@ -2020,7 +2016,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
var className = [node.className, options.addClass, options.removeClass].join(' ');
if (!isAnimatableClassName(className)) {
- runner.end();
+ close();
return runner;
}
@@ -2151,6 +2147,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
// it, otherwise if it's the same then the end result will be the same too
if (animationCancelled || (isStructural && animationDetails.event !== event)) {
options.domOperation();
+ runner.end();
}
return;
@@ -2245,7 +2242,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
// animations to properly function (otherwise any CSS selectors may not work)
function examineParentAnimation(node, animationDetails) {
// enter/leave/move always have priority
- if (animationDetails.structural) return;
+ if (animationDetails.structural || !hasAnimationClasses(animationDetails.options)) return;
if (animationDetails.state === RUNNING_STATE) {
animationDetails.runner.end();
@@ -2260,7 +2257,18 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
var parentAnimationDetected = false;
var animateChildren;
+ var parentHost = element.data(NG_ANIMATE_PIN_DATA);
+ if (parentHost) {
+ parent = parentHost;
+ }
+
while (parent && parent.length) {
+ if (!rootElementDetected) {
+ // angular doesn't want to attempt to animate elements outside of the application
+ // therefore we need to ensure that the rootElement is an ancestor of the current element
+ rootElementDetected = isMatchingElement(parent, $rootElement);
+ }
+
var parentNode = parent[0];
if (parentNode.nodeType !== ELEMENT_NODE) {
// no point in inspecting the #document element
@@ -2289,6 +2297,12 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
// angular doesn't want to attempt to animate elements outside of the application
// therefore we need to ensure that the rootElement is an ancestor of the current element
rootElementDetected = isMatchingElement(parent, $rootElement);
+ if (!rootElementDetected) {
+ parentHost = parent.data(NG_ANIMATE_PIN_DATA);
+ if (parentHost) {
+ parent = parentHost;
+ }
+ }
}
if (!bodyElementDetected) {
@@ -3149,6 +3163,207 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
*
* To learn more about what's possible be sure to visit the {@link ngAnimate.$animateCss $animateCss service}.
*
+ * ## Animation Anchoring (via `ng-animate-ref`)
+ *
+ * ngAnimate in AngularJS 1.4 comes packed with the ability to cross-animate elements between
+ * structural areas of an application (like views) by pairing up elements using an attribute
+ * called `ng-animate-ref`.
+ *
+ * Let's say for example we have two views that are managed by `ng-view` and we want to show
+ * that there is a relationship between two components situated in different views. By using the
+ * `ng-animate-ref` attribute we can identify that the two components are paired together and we
+ * can then attach an animation, which is triggered when the view changes.
+ *
+ * ```html
+ * <!-- index.html -->
+ * <div ng-view class="view-animation">
+ * </div>
+ *
+ * <!-- home.html -->
+ * <a href="#/banner-page">
+ * <img src="./banner.jpg" ng-animate-ref="banner">
+ * </a>
+ *
+ * <!-- banner-page.html -->
+ * <img src="./banner.jpg" ng-animate-ref="banner">
+ * ```
+ *
+ * Now, when the view changes (once the link is clicked), ngAnimate will examine the
+ * HTML contents to see if there is a match reference between any components in the view
+ * that is leaving and the view that is entering. It will then attempt to trigger a CSS
+ * animation on the `.view-animation-anchor` CSS class (notice how `.view-animation` is
+ * a shared CSS class on the ng-view element? This means that view-animation will apply to
+ * both the enter and leave animations).
+ *
+ * The two images match since they share the same ref value. ngAnimate will now apply a
+ * suffixed version of each of the shared CSS classes with `-anchor`. Therefore we will
+ * have a shared class of `view-animation-anchor` which we can use to setup our transition animation.
+ *
+ * We can now attach a transition onto the `.view-animation-anchor` CSS class and then
+ * ngAnimate will handle the entire transition for us as well as the addition and removal of
+ * any changes of CSS classes between the elements:
+ *
+ * ```css
+ * .view-animation-anchor {
+ * /&#42; this animation will last for 1 second since there are
+ * two phases to the animation (an `in` and an `out` phase) &#42;/
+ * transition:0.5s linear all;
+ * }
+ * ```
+ *
+ * There are two stages for an anchor animation: `out` and `in`. The `out` stage happens first and that
+ * is when the element is animated away from its origin. Once that animation is over then the `in` stage
+ * occurs which animates the element to its destination. The reason why there are two animations is to
+ * give enough time for the enter animation on the new element to be ready.
+ *
+ * The example above sets up a transition for both the in and out phases, but we can also target the out or
+ * in phases directly via `ng-anchor-out` and `ng-anchor-in`.
+ *
+ * ```css
+ * .view-animation-anchor.ng-anchor-out {
+ * transition: 0.5s linear all;
+ *
+ * /&#42; the scale will be applied during the out animation,
+ * but will be animated away when the in animation runs &#42;/
+ * transform: scale(1.2);
+ * }
+ *
+ * .view-animation-anchor.ng-anchor-in {
+ * transition: 1s linear all;
+ * }
+ * ```
+ *
+ *
+ *
+ *
+ * ### Anchoring Demo
+ *
+ <example module="anchoringExample"
+ name="anchoringExample"
+ id="anchoringExample"
+ deps="angular-animate.js;angular-route.js"
+ animations="true">
+ <file name="index.html">
+ <a href="#/">Home</a>
+ <hr />
+ <div class="view-container">
+ <div ng-view class="view"></div>
+ </div>
+ </file>
+ <file name="script.js">
+ angular.module('anchoringExample', ['ngAnimate', 'ngRoute'])
+ .config(['$routeProvider', function($routeProvider) {
+ $routeProvider.when('/', {
+ templateUrl: 'home.html',
+ controller: 'HomeController as home'
+ });
+ $routeProvider.when('/profile/:id', {
+ templateUrl: 'profile.html',
+ controller: 'ProfileController as profile'
+ });
+ }])
+ .run(['$rootScope', function($rootScope) {
+ $rootScope.records = [
+ { id:1, title: "Miss Beulah Roob" },
+ { id:2, title: "Trent Morissette" },
+ { id:3, title: "Miss Ava Pouros" },
+ { id:4, title: "Rod Pouros" },
+ { id:5, title: "Abdul Rice" },
+ { id:6, title: "Laurie Rutherford Sr." },
+ { id:7, title: "Nakia McLaughlin" },
+ { id:8, title: "Jordon Blanda DVM" },
+ { id:9, title: "Rhoda Hand" },
+ { id:10, title: "Alexandrea Sauer" }
+ ];
+ }])
+ .controller('HomeController', [function() {
+ //empty
+ }])
+ .controller('ProfileController', ['$rootScope', '$routeParams', function($rootScope, $routeParams) {
+ var index = parseInt($routeParams.id, 10);
+ var record = $rootScope.records[index - 1];
+
+ this.title = record.title;
+ this.id = record.id;
+ }]);
+ </file>
+ <file name="home.html">
+ <h2>Welcome to the home page</h1>
+ <p>Please click on an element</p>
+ <a class="record"
+ ng-href="#/profile/{{ record.id }}"
+ ng-animate-ref="{{ record.id }}"
+ ng-repeat="record in records">
+ {{ record.title }}
+ </a>
+ </file>
+ <file name="profile.html">
+ <div class="profile record" ng-animate-ref="{{ profile.id }}">
+ {{ profile.title }}
+ </div>
+ </file>
+ <file name="animations.css">
+ .record {
+ display:block;
+ font-size:20px;
+ }
+ .profile {
+ background:black;
+ color:white;
+ font-size:100px;
+ }
+ .view-container {
+ position:relative;
+ }
+ .view-container > .view.ng-animate {
+ position:absolute;
+ top:0;
+ left:0;
+ width:100%;
+ min-height:500px;
+ }
+ .view.ng-enter {
+ transition:0.5s linear all;
+ transform:translateX(100%);
+ }
+ .view.ng-enter.ng-enter-active {
+ transform:translateX(0%);
+ }
+ .view.ng-leave {
+ transition:0.5s linear all;
+ }
+ .view.ng-leave.ng-leave-active {
+ transform:translateX(-100%);
+ }
+ .view-anchor {
+ transition:0.5s linear all;
+ }
+ </file>
+ </example>
+ *
+ * ### How is the element transported?
+ *
+ * When an anchor animation occurs, ngAnimate will clone the starting element and position it exactly where the starting
+ * element is located on screen via absolute positioning. The cloned element will be placed inside of the root element
+ * of the application (where ng-app was defined) and all of the CSS classes of the starting element will be applied. The
+ * element will then animate into the `out` and `in` animations and will eventually reach the coordinates and match
+ * the dimensions of the destination element. During the entire animation a CSS class of `.ng-animate-shim` will be applied
+ * to both the starting and destination elements in order to hide them from being visible (the CSS styling for the class
+ * is: `visibility:hidden`). Once the anchor reaches its destination then it will be removed and the destination element
+ * will become visible since the shim class will be removed.
+ *
+ * ### How is the morphing handled?
+ *
+ * CSS Anchoring relies on transitions and keyframes and the internal code is intelligent enough to figure out
+ * what CSS classes differ between the starting element and the destination element. These different CSS classes
+ * will be added/removed on the anchor element and a transition will be applied (the transition that is provided
+ * in the anchor class). Long story short, ngAnimate will figure out what classes to add and remove which will
+ * make the transition of the element as smooth and automatic as possible. Be sure to use simple CSS classes that
+ * do not rely on DOM nesting structure so that the anchor element appears the same as the starting element (since
+ * the cloned element is placed inside of root element which is likely close to the body element).
+ *
+ * Note that if the root element is on the `<html>` element then the cloned node will be placed inside of body.
+ *
*
* ## Using $animate in your directive code
*
@@ -3224,12 +3439,12 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
* anymore.)
*
* In addition to the animation promise, we can also make use of animation-related callbacks within our directives and controller code by registering
- * an event listener using the `$animate` service. Let's say for example that an animation was triggered on our `ng-view` element and we wanted our
+ * an event listener using the `$animate` service. Let's say for example that an animation was triggered on our view
* routing controller to hook into that:
*
* ```js
* ngModule.controller('HomePageController', ['$animate', function($animate) {
- * $animate.on('enter', '[ng-view]', function(element) {
+ * $animate.on('enter', ngViewElement, function(element) {
* // the animation for this route has completed
* }]);
* }])
diff --git a/js/vendor/angular-animate/angular-animate.min.js b/js/vendor/angular-animate/angular-animate.min.js
index 0a615089e..878798ed0 100644
--- a/js/vendor/angular-animate/angular-animate.min.js
+++ b/js/vendor/angular-animate/angular-animate.min.js
@@ -1,49 +1,49 @@
/*
- AngularJS v1.4.0-rc.0
+ AngularJS v1.4.0-rc.1
(c) 2010-2015 Google, Inc. http://angularjs.org
License: MIT
*/
-(function(H,s,$){'use strict';function sa(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;aa(a)&&(a=a.join(" "));aa(b)&&(b=b.join(" "));return a+" "+b}function Aa(a){var b={};a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from);return b}function ca(a,b,c){var d="";a=aa(a)?a:a&&T(a)&&a.length?a.split(/\s+/):[];p(a,function(a,t){a&&0<a.length&&(d+=0<t?" ":"",d+=c?b+a:a+b)});return d}function Ba(a){return 1===a.nodeType?I(a):0===a.length?[]:1===a.length?1===a[0].nodeType&&a:I(ka(a))}function ka(a){if(!a[0])return a;
-for(var b=0;b<a.length;b++){var c=a[b];if(1==c.nodeType)return c}}function Ca(a,b,c){p(b,function(b){a.addClass(b,c)})}function Da(a,b,c){p(b,function(b){a.removeClass(b,c)})}function ha(a){return function(b,c){c.addClass&&(Ca(a,b,c.addClass),c.addClass=null);c.removeClass&&(Da(a,b,c.removeClass),b.removeClass(c.removeClass),c.removeClass=null)}}function ia(a){a=a||{};if(!a.$$prepared){var b=a.domOperation||L;a.domOperation=function(){a.$$domOperationFired=!0;b();b=L};a.$$prepared=!0}return a}function da(a,
-b){ta(a,b);ua(a,b)}function ta(a,b){b.from&&(a.css(b.from),b.from=null)}function ua(a,b){b.to&&(a.css(b.to),b.to=null)}function Q(a,b,c){var d=(b.addClass||"")+" "+(c.addClass||""),g=(b.removeClass||"")+" "+(c.removeClass||"");a=Ea(a.attr("class"),d,g);va(b,c);b.addClass=a.addClass?a.addClass:null;b.removeClass=a.removeClass?a.removeClass:null;return b}function Ea(a,b,c){function d(a){T(a)&&(a=a.split(" "));var b={};p(a,function(a){a.length&&(b[a]=!0)});return b}var g={};a=d(a);b=d(b);p(b,function(a,
-b){g[b]=1});c=d(c);p(c,function(a,b){g[b]=1===g[b]?null:-1});var t={addClass:"",removeClass:""};p(g,function(b,c){var d,g;1===b?(d="addClass",g=!a[c]):-1===b&&(d="removeClass",g=a[c]);g&&(t[d].length&&(t[d]+=" "),t[d]+=c)});return t}function wa(a,b,c){var d=Object.create(null),g=a.getComputedStyle(b)||{};p(c,function(a,b){var c=g[a];if(c){var k=c.charAt(0);if("-"===k||"+"===k||0<=k)c=Fa(c);0===c&&(c=null);d[b]=c}});return d}function Fa(a){var b=0;a=a.split(/\s*,\s*/);p(a,function(a){"s"==a.charAt(a.length-
-1)&&(a=a.substring(0,a.length-1));a=parseFloat(a)||0;b=b?Math.max(a,b):a});return b}function la(a){return 0===a||null!=a}function xa(a,b){var c=N,d=a+"s";b?c+="Duration":d+=" linear all";return[c,d]}function ja(a,b){var c=b?"-"+b+"s":"";ea(a,[fa,c]);return[fa,c]}function ma(a,b){var c=b?"paused":"",d=U+"PlayState";ea(a,[d,c]);return[d,c]}function ea(a,b){a.style[b[0]]=b[1]}function ya(){var a=Object.create(null);return{flush:function(){a=Object.create(null)},count:function(b){return(b=a[b])?b.total:
-0},get:function(b){return(b=a[b])&&b.value},put:function(b,c){a[b]?a[b].total++:a[b]={total:1,value:c}}}}var L=s.noop,va=s.extend,I=s.element,p=s.forEach,aa=s.isArray,T=s.isString,na=s.isObject,Ga=s.isUndefined,Ha=s.isDefined,Ia=s.isFunction,Ja=s.isElement,N,oa,U,pa;H.ontransitionend===$&&H.onwebkittransitionend!==$?(N="WebkitTransition",oa="webkitTransitionEnd transitionend"):(N="transition",oa="transitionend");H.onanimationend===$&&H.onwebkitanimationend!==$?(U="WebkitAnimation",pa="webkitAnimationEnd animationend"):
-(U="animation",pa="animationend");var qa=U+"Delay",ra=U+"Duration",fa=N+"Delay";H=N+"Duration";var Ka={transitionDuration:H,transitionDelay:fa,transitionProperty:N+"Property",animationDuration:ra,animationDelay:qa,animationIterationCount:U+"IterationCount"},La={transitionDuration:H,transitionDelay:fa,animationDuration:ra,animationDelay:qa};s.module("ngAnimate",[]).directive("ngAnimateChildren",[function(){return function(a,b,c){a=c.ngAnimateChildren;s.isString(a)&&0===a.length?b.data("$$ngAnimateChildren",
-!0):c.$observe("ngAnimateChildren",function(a){b.data("$$ngAnimateChildren","on"===a||"true"===a)})}}]).factory("$$rAFMutex",["$$rAF",function(a){return function(){var b=!1;a(function(){b=!0});return function(c){b?c():a(c)}}}]).factory("$$AnimateRunner",["$q","$$rAFMutex",function(a,b){function c(a){this.setHost(a);this._doneCallbacks=[];this._runInAnimationFrame=b();this._state=0}c.chain=function(a,b){function c(){if(F===a.length)b(!0);else a[F](function(a){!1===a?b(!1):(F++,c())})}var F=0;c()};
-c.all=function(a,b){function c(t){f=f&&t;++F===a.length&&b(f)}var F=0,f=!0;p(a,function(a){a.done(c)})};c.prototype={setHost:function(a){this.host=a||{}},done:function(a){2===this._state?a():this._doneCallbacks.push(a)},progress:L,getPromise:function(){if(!this.promise){var b=this;this.promise=a(function(a,c){b.done(function(b){!1===b?c():a()})})}return this.promise},then:function(a,b){return this.getPromise().then(a,b)},"catch":function(a){return this.getPromise()["catch"](a)},"finally":function(a){return this.getPromise()["finally"](a)},
-pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end();this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel();this._resolve(!1)},complete:function(a){var b=this;0===b._state&&(b._state=1,b._runInAnimationFrame(function(){b._resolve(a)}))},_resolve:function(a){2!==this._state&&(p(this._doneCallbacks,function(b){b(a)}),this._doneCallbacks.length=0,this._state=2)}};return c}]).provider("$$animateQueue",
-["$animateProvider",function(a){function b(a,b,c,f){return d[a].some(function(a){return a(b,c,f)})}function c(a,b){a=a||{};var c=0<(a.addClass||"").length,d=0<(a.removeClass||"").length;return b?c&&d:c||d}var d=this.rules={skip:[],cancel:[],join:[]};d.join.push(function(a,b,d){return!b.structural&&c(b.options)});d.skip.push(function(a,b,d){return!b.structural&&!c(b.options)});d.skip.push(function(a,b,c){return"leave"==c.event&&b.structural});d.skip.push(function(a,b,c){return c.structural&&!b.structural});
-d.cancel.push(function(a,b,c){return c.structural&&b.structural});d.cancel.push(function(a,b,c){return 2===c.state&&b.structural});this.$get=["$$rAF","$rootScope","$rootElement","$document","$$HashMap","$$animation","$$AnimateRunner","$templateRequest","$$jqLite",function(d,t,F,f,k,h,J,v,ga){function G(a,b){var c=a[0],l=[],e=u[b];e&&p(e,function(a){a.node.contains(c)&&l.push(a.callback)});return l}function ba(a,b,c,l){d(function(){p(G(b,a),function(a){a(b,c,l)})})}function C(a,R,n){function r(b,c,
-l,e){ba(c,a,l,e);b.progress(c,l,e)}function d(b){za(a,n);da(a,n);n.domOperation();g.complete(!b)}a=Ba(a);var u=a[0];n=ia(n);var P=a.parent(),g=new J;if(!u)return g.end(),g;aa(n.addClass)&&(n.addClass=n.addClass.join(" "));aa(n.removeClass)&&(n.removeClass=n.removeClass.join(" "));n.from&&!na(n.from)&&(n.from=null);n.to&&!na(n.to)&&(n.to=null);var f=[u.className,n.addClass,n.removeClass].join(" ");if(!z(f))return g.end(),g;var p=0<=["enter","move","leave"].indexOf(R),k=!D||l.get(u),f=!k&&q.get(u)||
-{},Z=!!f.state;k||Z&&1==f.state||(k=!e(a,P,R));if(k)return d(),g;p&&K(a);k={structural:p,element:a,event:R,options:n,runner:g};if(Z){if(b("skip",a,k,f)){if(2===f.state)return d(),g;Q(a,f.options,n);return f.runner}if(b("cancel",a,k,f))2===f.state?f.runner.end():Q(a,k.options,f.options);else if(b("join",a,k,f))if(2===f.state)Q(a,n,{});else return R=k.event=f.event,n=Q(a,f.options,k.options),g}else Q(a,n,{});(Z=k.structural)||(Z="animate"===k.event&&0<Object.keys(k.options.to||{}).length||c(k.options));
-if(!Z)return d(),g;B(P);var v=(f.counter||0)+1;k.counter=v;E(a,1,k);t.$$postDigest(function(){var b=q.get(u),l=!b,b=b||{},e=a.parent()||[],D=0<e.length&&("animate"===b.event||b.structural||c(b.options));l||b.counter!==v||!D?(l&&(za(a,n),da(a,n)),(l||p&&b.event!==R)&&n.domOperation()):(R=!b.structural&&c(b.options,!0)?"setClass":b.event,B(e),E(a,2),b=h(a,R,b.options),b.done(function(b){d(!b);(b=q.get(u))&&b.counter===v&&y(a);r(g,R,"close",{})}),g.setHost(b),r(g,R,"start",{}))});return g}function K(a){a=
-a[0].querySelectorAll("[data-ng-animate]");p(a,function(a){var b=parseInt(a.getAttribute("data-ng-animate")),c=q.get(a);switch(b){case 2:c.runner.end();case 1:c&&q.remove(a)}})}function y(a){a=a.length?a[0]:a;a.removeAttribute("data-ng-animate");q.remove(a)}function x(a,b){a=a.length?a[0]:a;b=b.length?b[0]:b;return a===b}function B(a){a=a[0];do{if(!a||1!==a.nodeType)break;var b=q.get(a);if(b){var c=a;b.structural||(2===b.state&&b.runner.end(),y(c))}a=a.parentNode}while(1)}function e(a,b,c){for(var e=
-c=a=!1,D;b&&b.length;){var d=b[0];if(1!==d.nodeType)break;var u=q.get(d)||{};e||(e=u.structural||l.get(d));if(Ga(D)||!0===D)d=b.data("$$ngAnimateChildren"),Ha(d)&&(D=d);if(e&&!1===D)break;c||(c=x(b,F));a||(a=x(b,r));b=b.parent()}return(!e||D)&&c&&a}function E(a,b,c){c=c||{};c.state=b;a=a.length?a[0]:a;a.setAttribute("data-ng-animate",b);c=(b=q.get(a))?va(b,c):c;q.put(a,c)}var q=new k,l=new k,D=null,P=t.$watch(function(){return 0===v.totalPendingRequests},function(a){a&&(P(),t.$$postDigest(function(){t.$$postDigest(function(){null===
-D&&(D=!0)})}))}),r=I(f[0].body),u={},Z=a.classNameFilter(),z=Z?function(a){return Z.test(a)}:function(){return!0},za=ha(ga);return{on:function(a,b,c){b=ka(b);u[a]=u[a]||[];u[a].push({node:b,callback:c})},off:function(a,b,c){function l(a,b,c){var e=ka(b);return a.filter(function(a){return!(a.node===e&&(!c||a.callback===c))})}var e=u[a];e&&(u[a]=1===arguments.length?null:l(e,b,c))},push:function(a,b,c,l){c=c||{};c.domOperation=l;return C(a,b,c)},enabled:function(a,b){var c=arguments.length;if(0===c)b=
-!!D;else if(Ja(a)){var e=a.length?a[0]:a,d=l.get(e);1===c?b=!d:(b=!!b)?d&&l.remove(e):l.put(e,!0)}else b=D=!!a;return b}}}]}]).provider("$$animation",["$animateProvider",function(a){function b(a){return a.data("$$animationRunner")}var c=this.drivers=[];this.$get=["$$jqLite","$rootScope","$injector","$$AnimateRunner",function(a,g,t,F){var f=[],k=ha(a);return function(h,J,v){function ga(a){a=a.hasAttribute("ng-animate-ref")?[a]:a.querySelectorAll("[ng-animate-ref]");var b=[];p(a,function(a){var c=a.getAttribute("ng-animate-ref");
-c&&c.length&&b.push(a)});return b}function G(a){var b=[],c={};p(a,function(a,e){var l=a.element[0],d=0<=["enter","move"].indexOf(a.event),l=a.structural?ga(l):[];if(l.length){var u=d?"to":"from";p(l,function(a){var b=a.getAttribute("ng-animate-ref");c[b]=c[b]||{};c[b][u]={animationID:e,element:I(a)}})}else b.push(a)});var e={},d={};p(c,function(c,g){var f=c.from,B=c.to;if(f&&B){var k=a[f.animationID],q=a[B.animationID],P=f.animationID.toString();if(!d[P]){var E=d[P]={start:function(){k.start();q.start()},
-close:function(){k.close();q.close()},classes:ba(k.classes,q.classes),from:k,to:q,anchors:[]};E.classes.length?b.push(E):(b.push(k),b.push(q))}d[P].anchors.push({out:f.element,"in":B.element})}else f=f?f.animationID:B.animationID,B=f.toString(),e[B]||(e[B]=!0,b.push(a[f]))});return b}function ba(a,b){a=a.split(" ");b=b.split(" ");for(var c=[],e=0;e<a.length;e++){var d=a[e];if("ng-"!==d.substring(0,3))for(var f=0;f<b.length;f++)if(d===b[f]){c.push(d);break}}return c.join(" ")}function C(a){for(var b=
-c.length-1;0<=b;b--){var e=c[b];if(t.has(e)&&(e=t.get(e)(a)))return e}}function K(a,c){a.from&&a.to?(b(a.from.element).setHost(c),b(a.to.element).setHost(c)):b(a.element).setHost(c)}function y(){var a=b(h);!a||"leave"===J&&v.$$domOperationFired||a.end()}function x(b){h.off("$destroy",y);h.removeData("$$animationRunner");k(h,v);da(h,v);v.domOperation();q&&a.removeClass(h,q);h.removeClass("ng-animate");e.complete(!b)}v=ia(v);var B=0<=["enter","move","leave"].indexOf(J),e=new F({end:function(){x()},
-cancel:function(){x(!0)}});if(!c.length)return x(),e;h.data("$$animationRunner",e);var E=sa(h.attr("class"),sa(v.addClass,v.removeClass)),q=v.tempClasses;q&&(E+=" "+q,v.tempClasses=null);f.push({element:h,classes:E,event:J,structural:B,options:v,start:function(){h.addClass("ng-animate");q&&a.addClass(h,q)},close:x});h.on("$destroy",y);if(1<f.length)return e;g.$$postDigest(function(){var a=[];p(f,function(c){b(c.element)&&a.push(c)});f.length=0;p(G(a),function(a){var b=a.start,c=a.close,e=C(a);(e=
-e&&e.start)?(b(),b=e(),b.done(function(a){c(!a)}),K(a,b)):c()})});return e}}]}]).provider("$animateCss",["$animateProvider",function(a){var b=ya(),c=ya();this.$get=["$window","$$jqLite","$$AnimateRunner","$timeout","$document","$sniffer","$$rAF",function(a,g,t,F,f,k,h){function J(a,b){var c=a.parentNode;return(c.$$ngAnimateParentKey||(c.$$ngAnimateParentKey=++C))+"-"+a.getAttribute("class")+"-"+b}function v(f,e,k,q){var l;0<b.count(k)&&(l=c.get(k),l||(e=ca(e,"-stagger"),g.addClass(f,e),l=wa(a,f,q),
-l.animationDuration=Math.max(l.animationDuration,0),l.transitionDuration=Math.max(l.transitionDuration,0),g.removeClass(f,e),c.put(k,l)));return l||{}}function ga(a){y&&y();x.push(a);y=h(function(){y=null;b.flush();c.flush();var a=K.offsetWidth+1;p(x,function(b){b(a)});x.length=0})}function G(c,e,f){e=b.get(f);e||(e=wa(a,c,Ka),"infinite"===e.animationIterationCount&&(e.animationIterationCount=1));b.put(f,e);c=e;f=c.animationDelay;e=c.transitionDelay;c.maxDelay=f&&e?Math.max(f,e):f||e;c.maxDuration=
-Math.max(c.animationDuration*c.animationIterationCount,c.transitionDuration);return c}var ba=ha(g),C=0,K=f[0].body,y,x=[];return function(a,c){function d(){l()}function f(){l(!0)}function l(b){if(!(K||x&&C)){K=!0;C=!1;g.removeClass(a,Y);g.removeClass(a,$);ma