http://git-wip-us.apache.org/repos/asf/struts/blob/810711cc/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-mocks.js
----------------------------------------------------------------------
diff --git 
a/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-mocks.js
 
b/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-mocks.js
index 2626caa..1266950 100644
--- 
a/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-mocks.js
+++ 
b/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-mocks.js
@@ -1,13 +1,14 @@
 /**
- * @license AngularJS v1.0.8
- * (c) 2010-2012 Google, Inc. http://angularjs.org
+ * @license AngularJS v1.2.23
+ * (c) 2010-2014 Google, Inc. http://angularjs.org
  * License: MIT
- *
- * TODO(vojta): wrap whole file into closure during build
  */
+(function(window, angular, undefined) {
+
+'use strict';
 
 /**
- * @ngdoc overview
+ * @ngdoc object
  * @name angular.mock
  * @description
  *
@@ -18,7 +19,7 @@ angular.mock = {};
 /**
  * ! This is a private undocumented service !
  *
- * @name ngMock.$browser
+ * @name $browser
  *
  * @description
  * This service is a mock implementation of {@link ng.$browser}. It provides 
fake
@@ -75,6 +76,12 @@ angular.mock.$Browser = function() {
   };
 
 
+  /**
+   * @name $browser#defer.now
+   *
+   * @description
+   * Current milliseconds mock time.
+   */
   self.defer.now = 0;
 
 
@@ -95,8 +102,7 @@ angular.mock.$Browser = function() {
 
 
   /**
-   * @name ngMock.$browser#defer.flush
-   * @methodOf ngMock.$browser
+   * @name $browser#defer.flush
    *
    * @description
    * Flushes all pending requests and executes the defer callbacks.
@@ -110,7 +116,7 @@ angular.mock.$Browser = function() {
       if (self.deferredFns.length) {
         self.defer.now = self.deferredFns[self.deferredFns.length-1].time;
       } else {
-        throw Error('No deferred tasks to be flushed');
+        throw new Error('No deferred tasks to be flushed');
       }
     }
 
@@ -118,13 +124,6 @@ angular.mock.$Browser = function() {
       self.deferredFns.shift().fn();
     }
   };
-  /**
-   * @name ngMock.$browser#defer.now
-   * @propertyOf ngMock.$browser
-   *
-   * @description
-   * Current milliseconds mock time.
-   */
 
   self.$$baseHref = '';
   self.baseHref = function() {
@@ -134,8 +133,7 @@ angular.mock.$Browser = function() {
 angular.mock.$Browser.prototype = {
 
 /**
-  * @name ngMock.$browser#poll
-  * @methodOf ngMock.$browser
+  * @name $browser#poll
   *
   * @description
   * run all fns in pollFns
@@ -162,7 +160,7 @@ angular.mock.$Browser.prototype = {
 
   cookies:  function(name, value) {
     if (name) {
-      if (value == undefined) {
+      if (angular.isUndefined(value)) {
         delete this.cookieHash[name];
       } else {
         if (angular.isString(value) &&       //strings only
@@ -186,17 +184,17 @@ angular.mock.$Browser.prototype = {
 
 
 /**
- * @ngdoc object
- * @name ngMock.$exceptionHandlerProvider
+ * @ngdoc provider
+ * @name $exceptionHandlerProvider
  *
  * @description
- * Configures the mock implementation of {@link ng.$exceptionHandler} to 
rethrow or to log errors passed
- * into the `$exceptionHandler`.
+ * Configures the mock implementation of {@link ng.$exceptionHandler} to 
rethrow or to log errors
+ * passed into the `$exceptionHandler`.
  */
 
 /**
- * @ngdoc object
- * @name ngMock.$exceptionHandler
+ * @ngdoc service
+ * @name $exceptionHandler
  *
  * @description
  * Mock implementation of {@link ng.$exceptionHandler} that rethrows or logs 
errors passed
@@ -204,7 +202,7 @@ angular.mock.$Browser.prototype = {
  * information.
  *
  *
- * <pre>
+ * ```js
  *   describe('$exceptionHandlerProvider', function() {
  *
  *     it('should capture log messages and exceptions', function() {
@@ -225,7 +223,7 @@ angular.mock.$Browser.prototype = {
  *       });
  *     });
  *   });
- * </pre>
+ * ```
  */
 
 angular.mock.$ExceptionHandlerProvider = function() {
@@ -233,8 +231,7 @@ angular.mock.$ExceptionHandlerProvider = function() {
 
   /**
    * @ngdoc method
-   * @name ngMock.$exceptionHandlerProvider#mode
-   * @methodOf ngMock.$exceptionHandlerProvider
+   * @name $exceptionHandlerProvider#mode
    *
    * @description
    * Sets the logging mode.
@@ -244,10 +241,10 @@ angular.mock.$ExceptionHandlerProvider = function() {
    *   - `rethrow`: If any errors are passed into the handler in tests, it 
typically
    *                means that there is a bug in the application or test, so 
this mock will
    *                make these tests fail.
-   *   - `log`: Sometimes it is desirable to test that an error is thrown, for 
this case the `log` mode stores an
-   *            array of errors in `$exceptionHandler.errors`, to allow later 
assertion of them.
-   *            See {@link ngMock.$log#assertEmpty assertEmpty()} and
-   *             {@link ngMock.$log#reset reset()}
+   *   - `log`: Sometimes it is desirable to test that an error is thrown, for 
this case the `log`
+   *            mode stores an array of errors in `$exceptionHandler.errors`, 
to allow later
+   *            assertion of them. See {@link ngMock.$log#assertEmpty 
assertEmpty()} and
+   *            {@link ngMock.$log#reset reset()}
    */
   this.mode = function(mode) {
     switch(mode) {
@@ -270,7 +267,7 @@ angular.mock.$ExceptionHandlerProvider = function() {
         handler.errors = errors;
         break;
       default:
-        throw Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes 
are allowed!");
+        throw new Error("Unknown mode '" + mode + "', only 'log'/'rethrow' 
modes are allowed!");
     }
   };
 
@@ -284,7 +281,7 @@ angular.mock.$ExceptionHandlerProvider = function() {
 
 /**
  * @ngdoc service
- * @name ngMock.$log
+ * @name $log
  *
  * @description
  * Mock implementation of {@link ng.$log} that gathers all logged messages in 
arrays
@@ -293,24 +290,37 @@ angular.mock.$ExceptionHandlerProvider = function() {
  *
  */
 angular.mock.$LogProvider = function() {
+  var debug = true;
 
   function concat(array1, array2, index) {
     return array1.concat(Array.prototype.slice.call(array2, index));
   }
 
+  this.debugEnabled = function(flag) {
+    if (angular.isDefined(flag)) {
+      debug = flag;
+      return this;
+    } else {
+      return debug;
+    }
+  };
 
   this.$get = function () {
     var $log = {
       log: function() { $log.log.logs.push(concat([], arguments, 0)); },
       warn: function() { $log.warn.logs.push(concat([], arguments, 0)); },
       info: function() { $log.info.logs.push(concat([], arguments, 0)); },
-      error: function() { $log.error.logs.push(concat([], arguments, 0)); }
+      error: function() { $log.error.logs.push(concat([], arguments, 0)); },
+      debug: function() {
+        if (debug) {
+          $log.debug.logs.push(concat([], arguments, 0));
+        }
+      }
     };
 
     /**
      * @ngdoc method
-     * @name ngMock.$log#reset
-     * @methodOf ngMock.$log
+     * @name $log#reset
      *
      * @description
      * Reset all of the logging arrays to empty.
@@ -318,86 +328,97 @@ angular.mock.$LogProvider = function() {
     $log.reset = function () {
       /**
        * @ngdoc property
-       * @name ngMock.$log#log.logs
-       * @propertyOf ngMock.$log
+       * @name $log#log.logs
        *
        * @description
        * Array of messages logged using {@link ngMock.$log#log}.
        *
        * @example
-       * <pre>
+       * ```js
        * $log.log('Some Log');
        * var first = $log.log.logs.unshift();
-       * </pre>
+       * ```
        */
       $log.log.logs = [];
       /**
        * @ngdoc property
-       * @name ngMock.$log#warn.logs
-       * @propertyOf ngMock.$log
+       * @name $log#info.logs
        *
        * @description
-       * Array of messages logged using {@link ngMock.$log#warn}.
+       * Array of messages logged using {@link ngMock.$log#info}.
        *
        * @example
-       * <pre>
-       * $log.warn('Some Warning');
-       * var first = $log.warn.logs.unshift();
-       * </pre>
+       * ```js
+       * $log.info('Some Info');
+       * var first = $log.info.logs.unshift();
+       * ```
        */
-      $log.warn.logs = [];
+      $log.info.logs = [];
       /**
        * @ngdoc property
-       * @name ngMock.$log#info.logs
-       * @propertyOf ngMock.$log
+       * @name $log#warn.logs
        *
        * @description
-       * Array of messages logged using {@link ngMock.$log#info}.
+       * Array of messages logged using {@link ngMock.$log#warn}.
        *
        * @example
-       * <pre>
-       * $log.info('Some Info');
-       * var first = $log.info.logs.unshift();
-       * </pre>
+       * ```js
+       * $log.warn('Some Warning');
+       * var first = $log.warn.logs.unshift();
+       * ```
        */
-      $log.info.logs = [];
+      $log.warn.logs = [];
       /**
        * @ngdoc property
-       * @name ngMock.$log#error.logs
-       * @propertyOf ngMock.$log
+       * @name $log#error.logs
        *
        * @description
        * Array of messages logged using {@link ngMock.$log#error}.
        *
        * @example
-       * <pre>
-       * $log.log('Some Error');
+       * ```js
+       * $log.error('Some Error');
        * var first = $log.error.logs.unshift();
-       * </pre>
+       * ```
        */
       $log.error.logs = [];
+        /**
+       * @ngdoc property
+       * @name $log#debug.logs
+       *
+       * @description
+       * Array of messages logged using {@link ngMock.$log#debug}.
+       *
+       * @example
+       * ```js
+       * $log.debug('Some Error');
+       * var first = $log.debug.logs.unshift();
+       * ```
+       */
+      $log.debug.logs = [];
     };
 
     /**
      * @ngdoc method
-     * @name ngMock.$log#assertEmpty
-     * @methodOf ngMock.$log
+     * @name $log#assertEmpty
      *
      * @description
-     * Assert that the all of the logging methods have no logged messages. If 
messages present, an exception is thrown.
+     * Assert that the all of the logging methods have no logged messages. If 
messages present, an
+     * exception is thrown.
      */
     $log.assertEmpty = function() {
       var errors = [];
-      angular.forEach(['error', 'warn', 'info', 'log'], function(logLevel) {
+      angular.forEach(['error', 'warn', 'info', 'log', 'debug'], 
function(logLevel) {
         angular.forEach($log[logLevel].logs, function(log) {
           angular.forEach(log, function (logItem) {
-            errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + 
'\n' + (logItem.stack || ''));
+            errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + 
'\n' +
+                        (logItem.stack || ''));
           });
         });
       });
       if (errors.length) {
-        errors.unshift("Expected $log to be empty! Either a message was logged 
unexpectedly, or an expected " +
-          "log message was not checked and removed:");
+        errors.unshift("Expected $log to be empty! Either a message was logged 
unexpectedly, or "+
+          "an expected log message was not checked and removed:");
         errors.push('');
         throw new Error(errors.join('\n---------\n'));
       }
@@ -409,202 +430,381 @@ angular.mock.$LogProvider = function() {
 };
 
 
-(function() {
-  var R_ISO8061_STR = 
/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;
+/**
+ * @ngdoc service
+ * @name $interval
+ *
+ * @description
+ * Mock implementation of the $interval service.
+ *
+ * Use {@link ngMock.$interval#flush `$interval.flush(millis)`} to
+ * move forward by `millis` milliseconds and trigger any functions scheduled 
to run in that
+ * time.
+ *
+ * @param {function()} fn A function that should be called repeatedly.
+ * @param {number} delay Number of milliseconds between each function call.
+ * @param {number=} [count=0] Number of times to repeat. If not set, or 0, 
will repeat
+ *   indefinitely.
+ * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty 
checking, otherwise
+ *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} 
block.
+ * @returns {promise} A promise which will be notified on each iteration.
+ */
+angular.mock.$IntervalProvider = function() {
+  this.$get = ['$rootScope', '$q',
+       function($rootScope,   $q) {
+    var repeatFns = [],
+        nextRepeatId = 0,
+        now = 0;
+
+    var $interval = function(fn, delay, count, invokeApply) {
+      var deferred = $q.defer(),
+          promise = deferred.promise,
+          iteration = 0,
+          skipApply = (angular.isDefined(invokeApply) && !invokeApply);
+
+      count = (angular.isDefined(count)) ? count : 0;
+      promise.then(null, null, fn);
+
+      promise.$$intervalId = nextRepeatId;
+
+      function tick() {
+        deferred.notify(iteration++);
+
+        if (count > 0 && iteration >= count) {
+          var fnIndex;
+          deferred.resolve(iteration);
 
-  function jsonStringToDate(string) {
-    var match;
-    if (match = string.match(R_ISO8061_STR)) {
-      var date = new Date(0),
-          tzHour = 0,
-          tzMin  = 0;
-      if (match[9]) {
-        tzHour = int(match[9] + match[10]);
-        tzMin = int(match[9] + match[11]);
+          angular.forEach(repeatFns, function(fn, index) {
+            if (fn.id === promise.$$intervalId) fnIndex = index;
+          });
+
+          if (fnIndex !== undefined) {
+            repeatFns.splice(fnIndex, 1);
+          }
+        }
+
+        if (!skipApply) $rootScope.$apply();
       }
-      date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
-      date.setUTCHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, 
int(match[6]||0), int(match[7]||0));
-      return date;
+
+      repeatFns.push({
+        nextTime:(now + delay),
+        delay: delay,
+        fn: tick,
+        id: nextRepeatId,
+        deferred: deferred
+      });
+      repeatFns.sort(function(a,b){ return a.nextTime - b.nextTime;});
+
+      nextRepeatId++;
+      return promise;
+    };
+    /**
+     * @ngdoc method
+     * @name $interval#cancel
+     *
+     * @description
+     * Cancels a task associated with the `promise`.
+     *
+     * @param {promise} promise A promise from calling the `$interval` 
function.
+     * @returns {boolean} Returns `true` if the task was successfully 
cancelled.
+     */
+    $interval.cancel = function(promise) {
+      if(!promise) return false;
+      var fnIndex;
+
+      angular.forEach(repeatFns, function(fn, index) {
+        if (fn.id === promise.$$intervalId) fnIndex = index;
+      });
+
+      if (fnIndex !== undefined) {
+        repeatFns[fnIndex].deferred.reject('canceled');
+        repeatFns.splice(fnIndex, 1);
+        return true;
+      }
+
+      return false;
+    };
+
+    /**
+     * @ngdoc method
+     * @name $interval#flush
+     * @description
+     *
+     * Runs interval tasks scheduled to be run in the next `millis` 
milliseconds.
+     *
+     * @param {number=} millis maximum timeout amount to flush up until.
+     *
+     * @return {number} The amount of time moved forward.
+     */
+    $interval.flush = function(millis) {
+      now += millis;
+      while (repeatFns.length && repeatFns[0].nextTime <= now) {
+        var task = repeatFns[0];
+        task.fn();
+        task.nextTime += task.delay;
+        repeatFns.sort(function(a,b){ return a.nextTime - b.nextTime;});
+      }
+      return millis;
+    };
+
+    return $interval;
+  }];
+};
+
+
+/* jshint -W101 */
+/* The R_ISO8061_STR regex is never going to fit into the 100 char limit!
+ * This directive should go inside the anonymous function but a bug in JSHint 
means that it would
+ * not be enacted early enough to prevent the warning.
+ */
+var R_ISO8061_STR = 
/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;
+
+function jsonStringToDate(string) {
+  var match;
+  if (match = string.match(R_ISO8061_STR)) {
+    var date = new Date(0),
+        tzHour = 0,
+        tzMin  = 0;
+    if (match[9]) {
+      tzHour = int(match[9] + match[10]);
+      tzMin = int(match[9] + match[11]);
     }
-    return string;
+    date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
+    date.setUTCHours(int(match[4]||0) - tzHour,
+                     int(match[5]||0) - tzMin,
+                     int(match[6]||0),
+                     int(match[7]||0));
+    return date;
   }
+  return string;
+}
 
-  function int(str) {
-    return parseInt(str, 10);
+function int(str) {
+  return parseInt(str, 10);
+}
+
+function padNumber(num, digits, trim) {
+  var neg = '';
+  if (num < 0) {
+    neg =  '-';
+    num = -num;
   }
+  num = '' + num;
+  while(num.length < digits) num = '0' + num;
+  if (trim)
+    num = num.substr(num.length - digits);
+  return neg + num;
+}
 
-  function padNumber(num, digits, trim) {
-    var neg = '';
-    if (num < 0) {
-      neg =  '-';
-      num = -num;
-    }
-    num = '' + num;
-    while(num.length < digits) num = '0' + num;
-    if (trim)
-      num = num.substr(num.length - digits);
-    return neg + num;
+
+/**
+ * @ngdoc type
+ * @name angular.mock.TzDate
+ * @description
+ *
+ * *NOTE*: this is not an injectable instance, just a globally available mock 
class of `Date`.
+ *
+ * Mock of the Date type which has its timezone specified via constructor arg.
+ *
+ * The main purpose is to create Date-like instances with timezone fixed to 
the specified timezone
+ * offset, so that we can test code that depends on local timezone settings 
without dependency on
+ * the time zone settings of the machine where the code is running.
+ *
+ * @param {number} offset Offset of the *desired* timezone in hours (fractions 
will be honored)
+ * @param {(number|string)} timestamp Timestamp representing the desired time 
in *UTC*
+ *
+ * @example
+ * !!!! WARNING !!!!!
+ * This is not a complete Date object so only methods that were implemented 
can be called safely.
+ * To make matters worse, TzDate instances inherit stuff from Date via a 
prototype.
+ *
+ * We do our best to intercept calls to "unimplemented" methods, but since the 
list of methods is
+ * incomplete we might be missing some non-standard methods. This can result 
in errors like:
+ * "Date.prototype.foo called on incompatible Object".
+ *
+ * ```js
+ * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z');
+ * newYearInBratislava.getTimezoneOffset() => -60;
+ * newYearInBratislava.getFullYear() => 2010;
+ * newYearInBratislava.getMonth() => 0;
+ * newYearInBratislava.getDate() => 1;
+ * newYearInBratislava.getHours() => 0;
+ * newYearInBratislava.getMinutes() => 0;
+ * newYearInBratislava.getSeconds() => 0;
+ * ```
+ *
+ */
+angular.mock.TzDate = function (offset, timestamp) {
+  var self = new Date(0);
+  if (angular.isString(timestamp)) {
+    var tsStr = timestamp;
+
+    self.origDate = jsonStringToDate(timestamp);
+
+    timestamp = self.origDate.getTime();
+    if (isNaN(timestamp))
+      throw {
+        name: "Illegal Argument",
+        message: "Arg '" + tsStr + "' passed into TzDate constructor is not a 
valid date string"
+      };
+  } else {
+    self.origDate = new Date(timestamp);
   }
 
+  var localOffset = new Date(timestamp).getTimezoneOffset();
+  self.offsetDiff = localOffset*60*1000 - offset*1000*60*60;
+  self.date = new Date(timestamp + self.offsetDiff);
 
-  /**
-   * @ngdoc object
-   * @name angular.mock.TzDate
-   * @description
-   *
-   * *NOTE*: this is not an injectable instance, just a globally available 
mock class of `Date`.
-   *
-   * Mock of the Date type which has its timezone specified via constructor 
arg.
-   *
-   * The main purpose is to create Date-like instances with timezone fixed to 
the specified timezone
-   * offset, so that we can test code that depends on local timezone settings 
without dependency on
-   * the time zone settings of the machine where the code is running.
-   *
-   * @param {number} offset Offset of the *desired* timezone in hours 
(fractions will be honored)
-   * @param {(number|string)} timestamp Timestamp representing the desired 
time in *UTC*
-   *
-   * @example
-   * !!!! WARNING !!!!!
-   * This is not a complete Date object so only methods that were implemented 
can be called safely.
-   * To make matters worse, TzDate instances inherit stuff from Date via a 
prototype.
-   *
-   * We do our best to intercept calls to "unimplemented" methods, but since 
the list of methods is
-   * incomplete we might be missing some non-standard methods. This can result 
in errors like:
-   * "Date.prototype.foo called on incompatible Object".
-   *
-   * <pre>
-   * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z');
-   * newYearInBratislava.getTimezoneOffset() => -60;
-   * newYearInBratislava.getFullYear() => 2010;
-   * newYearInBratislava.getMonth() => 0;
-   * newYearInBratislava.getDate() => 1;
-   * newYearInBratislava.getHours() => 0;
-   * newYearInBratislava.getMinutes() => 0;
-   * </pre>
-   *
-   */
-  angular.mock.TzDate = function (offset, timestamp) {
-    var self = new Date(0);
-    if (angular.isString(timestamp)) {
-      var tsStr = timestamp;
-
-      self.origDate = jsonStringToDate(timestamp);
-
-      timestamp = self.origDate.getTime();
-      if (isNaN(timestamp))
-        throw {
-          name: "Illegal Argument",
-          message: "Arg '" + tsStr + "' passed into TzDate constructor is not 
a valid date string"
-        };
-    } else {
-      self.origDate = new Date(timestamp);
-    }
+  self.getTime = function() {
+    return self.date.getTime() - self.offsetDiff;
+  };
 
-    var localOffset = new Date(timestamp).getTimezoneOffset();
-    self.offsetDiff = localOffset*60*1000 - offset*1000*60*60;
-    self.date = new Date(timestamp + self.offsetDiff);
+  self.toLocaleDateString = function() {
+    return self.date.toLocaleDateString();
+  };
 
-    self.getTime = function() {
-      return self.date.getTime() - self.offsetDiff;
-    };
+  self.getFullYear = function() {
+    return self.date.getFullYear();
+  };
 
-    self.toLocaleDateString = function() {
-      return self.date.toLocaleDateString();
-    };
+  self.getMonth = function() {
+    return self.date.getMonth();
+  };
 
-    self.getFullYear = function() {
-      return self.date.getFullYear();
-    };
+  self.getDate = function() {
+    return self.date.getDate();
+  };
 
-    self.getMonth = function() {
-      return self.date.getMonth();
-    };
+  self.getHours = function() {
+    return self.date.getHours();
+  };
 
-    self.getDate = function() {
-      return self.date.getDate();
-    };
+  self.getMinutes = function() {
+    return self.date.getMinutes();
+  };
 
-    self.getHours = function() {
-      return self.date.getHours();
-    };
+  self.getSeconds = function() {
+    return self.date.getSeconds();
+  };
 
-    self.getMinutes = function() {
-      return self.date.getMinutes();
-    };
+  self.getMilliseconds = function() {
+    return self.date.getMilliseconds();
+  };
 
-    self.getSeconds = function() {
-      return self.date.getSeconds();
-    };
+  self.getTimezoneOffset = function() {
+    return offset * 60;
+  };
 
-    self.getTimezoneOffset = function() {
-      return offset * 60;
-    };
+  self.getUTCFullYear = function() {
+    return self.origDate.getUTCFullYear();
+  };
 
-    self.getUTCFullYear = function() {
-      return self.origDate.getUTCFullYear();
-    };
+  self.getUTCMonth = function() {
+    return self.origDate.getUTCMonth();
+  };
 
-    self.getUTCMonth = function() {
-      return self.origDate.getUTCMonth();
-    };
+  self.getUTCDate = function() {
+    return self.origDate.getUTCDate();
+  };
 
-    self.getUTCDate = function() {
-      return self.origDate.getUTCDate();
-    };
+  self.getUTCHours = function() {
+    return self.origDate.getUTCHours();
+  };
 
-    self.getUTCHours = function() {
-      return self.origDate.getUTCHours();
-    };
+  self.getUTCMinutes = function() {
+    return self.origDate.getUTCMinutes();
+  };
 
-    self.getUTCMinutes = function() {
-      return self.origDate.getUTCMinutes();
-    };
+  self.getUTCSeconds = function() {
+    return self.origDate.getUTCSeconds();
+  };
 
-    self.getUTCSeconds = function() {
-      return self.origDate.getUTCSeconds();
-    };
+  self.getUTCMilliseconds = function() {
+    return self.origDate.getUTCMilliseconds();
+  };
 
-    self.getUTCMilliseconds = function() {
-      return self.origDate.getUTCMilliseconds();
+  self.getDay = function() {
+    return self.date.getDay();
+  };
+
+  // provide this method only on browsers that already have it
+  if (self.toISOString) {
+    self.toISOString = function() {
+      return padNumber(self.origDate.getUTCFullYear(), 4) + '-' +
+            padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' +
+            padNumber(self.origDate.getUTCDate(), 2) + 'T' +
+            padNumber(self.origDate.getUTCHours(), 2) + ':' +
+            padNumber(self.origDate.getUTCMinutes(), 2) + ':' +
+            padNumber(self.origDate.getUTCSeconds(), 2) + '.' +
+            padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z';
     };
+  }
 
-    self.getDay = function() {
-      return self.date.getDay();
+  //hide all methods not implemented in this mock that the Date prototype 
exposes
+  var unimplementedMethods = ['getUTCDay',
+      'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds',
+      'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 
'setUTCFullYear',
+      'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 
'setUTCSeconds',
+      'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 
'toLocaleString',
+      'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 
'toUTCString', 'valueOf'];
+
+  angular.forEach(unimplementedMethods, function(methodName) {
+    self[methodName] = function() {
+      throw new Error("Method '" + methodName + "' is not implemented in the 
TzDate mock");
     };
+  });
 
-    // provide this method only on browsers that already have it
-    if (self.toISOString) {
-      self.toISOString = function() {
-        return padNumber(self.origDate.getUTCFullYear(), 4) + '-' +
-              padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' +
-              padNumber(self.origDate.getUTCDate(), 2) + 'T' +
-              padNumber(self.origDate.getUTCHours(), 2) + ':' +
-              padNumber(self.origDate.getUTCMinutes(), 2) + ':' +
-              padNumber(self.origDate.getUTCSeconds(), 2) + '.' +
-              padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z'
-      }
-    }
+  return self;
+};
+
+//make "tzDateInstance instanceof Date" return true
+angular.mock.TzDate.prototype = Date.prototype;
+/* jshint +W101 */
+
+angular.mock.animate = angular.module('ngAnimateMock', ['ng'])
+
+  .config(['$provide', function($provide) {
 
-    //hide all methods not implemented in this mock that the Date prototype 
exposes
-    var unimplementedMethods = ['getMilliseconds', 'getUTCDay',
-        'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds',
-        'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 
'setUTCFullYear',
-        'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 
'setUTCSeconds',
-        'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 
'toLocaleString',
-        'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 
'toUTCString', 'valueOf'];
-
-    angular.forEach(unimplementedMethods, function(methodName) {
-      self[methodName] = function() {
-        throw Error("Method '" + methodName + "' is not implemented in the 
TzDate mock");
+    var reflowQueue = [];
+    $provide.value('$$animateReflow', function(fn) {
+      var index = reflowQueue.length;
+      reflowQueue.push(fn);
+      return function cancel() {
+        reflowQueue.splice(index, 1);
       };
     });
 
-    return self;
-  };
+    $provide.decorator('$animate', function($delegate, $$asyncCallback) {
+      var animate = {
+        queue : [],
+        enabled : $delegate.enabled,
+        triggerCallbacks : function() {
+          $$asyncCallback.flush();
+        },
+        triggerReflow : function() {
+          angular.forEach(reflowQueue, function(fn) {
+            fn();
+          });
+          reflowQueue = [];
+        }
+      };
 
-  //make "tzDateInstance instanceof Date" return true
-  angular.mock.TzDate.prototype = Date.prototype;
-})();
+      angular.forEach(
+        ['enter','leave','move','addClass','removeClass','setClass'], 
function(method) {
+        animate[method] = function() {
+          animate.queue.push({
+            event : method,
+            element : arguments[0],
+            args : arguments
+          });
+          $delegate[method].apply($delegate, arguments);
+        };
+      });
+
+      return animate;
+    });
+
+  }]);
 
 
 /**
@@ -614,9 +814,11 @@ angular.mock.$LogProvider = function() {
  *
  * *NOTE*: this is not an injectable instance, just a globally available 
function.
  *
- * Method for serializing common angular objects (scope, elements, etc..) into 
strings, useful for debugging.
+ * Method for serializing common angular objects (scope, elements, etc..) into 
strings, useful for
+ * debugging.
  *
- * This method is also available on window, where it can be used to display 
objects on debug console.
+ * This method is also available on window, where it can be used to display 
objects on debug
+ * console.
  *
  * @param {*} object - any object to turn into string.
  * @return {string} a serialized string of the argument
@@ -646,6 +848,8 @@ angular.mock.dump = function(object) {
       } else if (object instanceof Error) {
         out = object.stack || ('' + object.name + ': ' + object.message);
       } else {
+        // TODO(i): this prevents methods being logged,
+        // we should have a better way to serialize objects
         out = angular.toJson(object, true);
       }
     } else {
@@ -659,7 +863,7 @@ angular.mock.dump = function(object) {
     offset = offset ||  '  ';
     var log = [offset + 'Scope(' + scope.$id + '): {'];
     for ( var key in scope ) {
-      if (scope.hasOwnProperty(key) && !key.match(/^(\$|this)/)) {
+      if (Object.prototype.hasOwnProperty.call(scope, key) && 
!key.match(/^(\$|this)/)) {
         log.push('  ' + key + ': ' + angular.toJson(scope[key]));
       }
     }
@@ -674,8 +878,8 @@ angular.mock.dump = function(object) {
 };
 
 /**
- * @ngdoc object
- * @name ngMock.$httpBackend
+ * @ngdoc service
+ * @name $httpBackend
  * @description
  * Fake HTTP backend implementation suitable for unit testing applications 
that use the
  * {@link ng.$http $http service}.
@@ -684,8 +888,8 @@ angular.mock.dump = function(object) {
  * development please see {@link ngMockE2E.$httpBackend e2e $httpBackend mock}.
  *
  * During unit testing, we want our unit tests to run quickly and have no 
external dependencies so
- * we don’t want to send {@link 
https://developer.mozilla.org/en/xmlhttprequest XHR} or
- * {@link http://en.wikipedia.org/wiki/JSONP JSONP} requests to a real server. 
All we really need is
+ * we don’t want to send 
[XHR](https://developer.mozilla.org/en/xmlhttprequest) or
+ * [JSONP](http://en.wikipedia.org/wiki/JSONP) requests to a real server. All 
we really need is
  * to verify whether a certain request has been sent or not, or alternatively 
just let the
  * application make requests, respond with pre-trained responses and assert 
that the end result is
  * what we expect it to be.
@@ -696,7 +900,7 @@ angular.mock.dump = function(object) {
  * When an Angular application needs some data from a server, it calls the 
$http service, which
  * sends the request to a real server using $httpBackend service. With 
dependency injection, it is
  * easy to inject $httpBackend mock (which has the same API as $httpBackend) 
and use it to verify
- * the requests and respond with some testing data without sending a request 
to real server.
+ * the requests and respond with some testing data without sending a request 
to a real server.
  *
  * There are two ways to specify what test data should be returned as http 
responses by the mock
  * backend when the code under test makes http requests:
@@ -763,20 +967,19 @@ angular.mock.dump = function(object) {
  *
  * # Flushing HTTP requests
  *
- * The $httpBackend used in production, always responds to requests with 
responses asynchronously.
- * If we preserved this behavior in unit testing, we'd have to create async 
unit tests, which are
- * hard to write, follow and maintain. At the same time the testing mock, 
can't respond
- * synchronously because that would change the execution of the code under 
test. For this reason the
- * mock $httpBackend has a `flush()` method, which allows the test to 
explicitly flush pending
- * requests and thus preserving the async api of the backend, while allowing 
the test to execute
- * synchronously.
+ * The $httpBackend used in production always responds to requests 
asynchronously. If we preserved
+ * this behavior in unit testing, we'd have to create async unit tests, which 
are hard to write,
+ * to follow and to maintain. But neither can the testing mock respond 
synchronously; that would
+ * change the execution of the code under test. For this reason, the mock 
$httpBackend has a
+ * `flush()` method, which allows the test to explicitly flush pending 
requests. This preserves
+ * the async api of the backend, while allowing the test to execute 
synchronously.
  *
  *
  * # Unit testing with mock $httpBackend
- * The following code shows how to setup and use the mock backend in unit 
testing a controller.
- * First we create the controller under test
+ * The following code shows how to setup and use the mock backend when unit 
testing a controller.
+ * First we create the controller under test:
  *
-  <pre>
+  ```js
   // The controller code
   function MyController($scope, $http) {
     var authToken;
@@ -797,11 +1000,11 @@ angular.mock.dump = function(object) {
       });
     };
   }
-  </pre>
+  ```
  *
- * Now we setup the mock backend and create the test specs.
+ * Now we setup the mock backend and create the test specs:
  *
-  <pre>
+  ```js
     // testing controller
     describe('MyController', function() {
        var $httpBackend, $rootScope, createController;
@@ -867,10 +1070,10 @@ angular.mock.dump = function(object) {
          $httpBackend.flush();
        });
     });
-   </pre>
+   ```
  */
 angular.mock.$HttpBackendProvider = function() {
-  this.$get = [createHttpBackendMock];
+  this.$get = ['$rootScope', createHttpBackendMock];
 };
 
 /**
@@ -887,24 +1090,25 @@ angular.mock.$HttpBackendProvider = function() {
  * @param {Object=} $browser Auto-flushing enabled if specified
  * @return {Object} Instance of $httpBackend mock
  */
-function createHttpBackendMock($delegate, $browser) {
+function createHttpBackendMock($rootScope, $delegate, $browser) {
   var definitions = [],
       expectations = [],
       responses = [],
-      responsesPush = angular.bind(responses, responses.push);
+      responsesPush = angular.bind(responses, responses.push),
+      copy = angular.copy;
 
-  function createResponse(status, data, headers) {
+  function createResponse(status, data, headers, statusText) {
     if (angular.isFunction(status)) return status;
 
     return function() {
       return angular.isNumber(status)
-          ? [status, data, headers]
+          ? [status, data, headers, statusText]
           : [200, status, data];
     };
   }
 
   // TODO(vojta): change params to: method, url, data, headers, callback
-  function $httpBackend(method, url, data, callback, headers) {
+  function $httpBackend(method, url, data, callback, headers, timeout, 
withCredentials) {
     var xhr = new MockXhr(),
         expectation = expectations[0],
         wasExpected = false;
@@ -915,24 +1119,43 @@ function createHttpBackendMock($delegate, $browser) {
           : angular.toJson(data);
     }
 
+    function wrapResponse(wrapped) {
+      if (!$browser && timeout && timeout.then) timeout.then(handleTimeout);
+
+      return handleResponse;
+
+      function handleResponse() {
+        var response = wrapped.response(method, url, data, headers);
+        xhr.$$respHeaders = response[2];
+        callback(copy(response[0]), copy(response[1]), 
xhr.getAllResponseHeaders(),
+                 copy(response[3] || ''));
+      }
+
+      function handleTimeout() {
+        for (var i = 0, ii = responses.length; i < ii; i++) {
+          if (responses[i] === handleResponse) {
+            responses.splice(i, 1);
+            callback(-1, undefined, '');
+            break;
+          }
+        }
+      }
+    }
+
     if (expectation && expectation.match(method, url)) {
       if (!expectation.matchData(data))
-        throw Error('Expected ' + expectation + ' with different data\n' +
+        throw new Error('Expected ' + expectation + ' with different data\n' +
             'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT:      ' + 
data);
 
       if (!expectation.matchHeaders(headers))
-        throw Error('Expected ' + expectation + ' with different headers\n' +
-            'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT:      ' +
-            prettyPrint(headers));
+        throw new Error('Expected ' + expectation + ' with different 
headers\n' +
+                        'EXPECTED: ' + prettyPrint(expectation.headers) + 
'\nGOT:      ' +
+                        prettyPrint(headers));
 
       expectations.shift();
 
       if (expectation.response) {
-        responses.push(function() {
-          var response = expectation.response(method, url, data, headers);
-          xhr.$$respHeaders = response[2];
-          callback(response[0], response[1], xhr.getAllResponseHeaders());
-        });
+        responses.push(wrapResponse(expectation));
         return;
       }
       wasExpected = true;
@@ -943,48 +1166,46 @@ function createHttpBackendMock($delegate, $browser) {
       if (definition.match(method, url, data, headers || {})) {
         if (definition.response) {
           // if $browser specified, we do auto flush all requests
-          ($browser ? $browser.defer : responsesPush)(function() {
-            var response = definition.response(method, url, data, headers);
-            xhr.$$respHeaders = response[2];
-            callback(response[0], response[1], xhr.getAllResponseHeaders());
-          });
+          ($browser ? $browser.defer : 
responsesPush)(wrapResponse(definition));
         } else if (definition.passThrough) {
-          $delegate(method, url, data, callback, headers);
-        } else throw Error('No response defined !');
+          $delegate(method, url, data, callback, headers, timeout, 
withCredentials);
+        } else throw new Error('No response defined !');
         return;
       }
     }
     throw wasExpected ?
-        Error('No response defined !') :
-        Error('Unexpected request: ' + method + ' ' + url + '\n' +
-              (expectation ? 'Expected ' + expectation : 'No more request 
expected'));
+        new Error('No response defined !') :
+        new Error('Unexpected request: ' + method + ' ' + url + '\n' +
+                  (expectation ? 'Expected ' + expectation : 'No more request 
expected'));
   }
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#when
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#when
    * @description
    * Creates a new backend definition.
    *
    * @param {string} method HTTP method.
    * @param {string|RegExp} url HTTP url.
-   * @param {(string|RegExp)=} data HTTP request body.
+   * @param {(string|RegExp|function(string))=} data HTTP request body or 
function that receives
+   *   data string and returns true if the data is as expected.
    * @param {(Object|function(Object))=} headers HTTP headers or function that 
receives http header
    *   object and returns true if the headers match the current definition.
-   * @returns {requestHandler} Returns an object with `respond` method that 
control how a matched
+   * @returns {requestHandler} Returns an object with `respond` method that 
controls how a matched
    *   request is handled.
    *
-   *  - respond – `{function([status,] data[, 
headers])|function(function(method, url, data, headers)}`
-   *    – The respond method takes a set of static data to be returned or a 
function that can return
-   *    an array containing response status (number), response data (string) 
and response headers
-   *    (Object).
+   *  - respond –
+   *      `{function([status,] data[, headers, statusText])
+   *      | function(function(method, url, data, headers)}`
+   *    – The respond method takes a set of static data to be returned or a 
function that can
+   *    return an array containing response status (number), response data 
(string), response
+   *    headers (Object), and the text for the status (string).
    */
   $httpBackend.when = function(method, url, data, headers) {
     var definition = new MockHttpExpectation(method, url, data, headers),
         chain = {
-          respond: function(status, data, headers) {
-            definition.response = createResponse(status, data, headers);
+          respond: function(status, data, headers, statusText) {
+            definition.response = createResponse(status, data, headers, 
statusText);
           }
         };
 
@@ -1000,8 +1221,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#whenGET
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#whenGET
    * @description
    * Creates a new backend definition for GET requests. For more info see 
`when()`.
    *
@@ -1013,8 +1233,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#whenHEAD
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#whenHEAD
    * @description
    * Creates a new backend definition for HEAD requests. For more info see 
`when()`.
    *
@@ -1026,8 +1245,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#whenDELETE
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#whenDELETE
    * @description
    * Creates a new backend definition for DELETE requests. For more info see 
`when()`.
    *
@@ -1039,13 +1257,13 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#whenPOST
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#whenPOST
    * @description
    * Creates a new backend definition for POST requests. For more info see 
`when()`.
    *
    * @param {string|RegExp} url HTTP url.
-   * @param {(string|RegExp)=} data HTTP request body.
+   * @param {(string|RegExp|function(string))=} data HTTP request body or 
function that receives
+   *   data string and returns true if the data is as expected.
    * @param {(Object|function(Object))=} headers HTTP headers.
    * @returns {requestHandler} Returns an object with `respond` method that 
control how a matched
    * request is handled.
@@ -1053,13 +1271,13 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#whenPUT
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#whenPUT
    * @description
    * Creates a new backend definition for PUT requests.  For more info see 
`when()`.
    *
    * @param {string|RegExp} url HTTP url.
-   * @param {(string|RegExp)=} data HTTP request body.
+   * @param {(string|RegExp|function(string))=} data HTTP request body or 
function that receives
+   *   data string and returns true if the data is as expected.
    * @param {(Object|function(Object))=} headers HTTP headers.
    * @returns {requestHandler} Returns an object with `respond` method that 
control how a matched
    * request is handled.
@@ -1067,8 +1285,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#whenJSONP
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#whenJSONP
    * @description
    * Creates a new backend definition for JSONP requests. For more info see 
`when()`.
    *
@@ -1081,8 +1298,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#expect
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#expect
    * @description
    * Creates a new request expectation.
    *
@@ -1096,17 +1312,19 @@ function createHttpBackendMock($delegate, $browser) {
    * @returns {requestHandler} Returns an object with `respond` method that 
control how a matched
    *  request is handled.
    *
-   *  - respond – `{function([status,] data[, 
headers])|function(function(method, url, data, headers)}`
-   *    – The respond method takes a set of static data to be returned or a 
function that can return
-   *    an array containing response status (number), response data (string) 
and response headers
-   *    (Object).
+   *  - respond –
+   *    `{function([status,] data[, headers, statusText])
+   *    | function(function(method, url, data, headers)}`
+   *    – The respond method takes a set of static data to be returned or a 
function that can
+   *    return an array containing response status (number), response data 
(string), response
+   *    headers (Object), and the text for the status (string).
    */
   $httpBackend.expect = function(method, url, data, headers) {
     var expectation = new MockHttpExpectation(method, url, data, headers);
     expectations.push(expectation);
     return {
-      respond: function(status, data, headers) {
-        expectation.response = createResponse(status, data, headers);
+      respond: function (status, data, headers, statusText) {
+        expectation.response = createResponse(status, data, headers, 
statusText);
       }
     };
   };
@@ -1114,8 +1332,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#expectGET
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#expectGET
    * @description
    * Creates a new request expectation for GET requests. For more info see 
`expect()`.
    *
@@ -1127,8 +1344,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#expectHEAD
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#expectHEAD
    * @description
    * Creates a new request expectation for HEAD requests. For more info see 
`expect()`.
    *
@@ -1140,8 +1356,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#expectDELETE
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#expectDELETE
    * @description
    * Creates a new request expectation for DELETE requests. For more info see 
`expect()`.
    *
@@ -1153,8 +1368,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#expectPOST
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#expectPOST
    * @description
    * Creates a new request expectation for POST requests. For more info see 
`expect()`.
    *
@@ -1169,8 +1383,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#expectPUT
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#expectPUT
    * @description
    * Creates a new request expectation for PUT requests. For more info see 
`expect()`.
    *
@@ -1185,8 +1398,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#expectPATCH
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#expectPATCH
    * @description
    * Creates a new request expectation for PATCH requests. For more info see 
`expect()`.
    *
@@ -1201,8 +1413,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#expectJSONP
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#expectJSONP
    * @description
    * Creates a new request expectation for JSONP requests. For more info see 
`expect()`.
    *
@@ -1215,8 +1426,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#flush
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#flush
    * @description
    * Flushes all pending requests using the trained responses.
    *
@@ -1225,11 +1435,12 @@ function createHttpBackendMock($delegate, $browser) {
    *   is called an exception is thrown (as this typically a sign of 
programming error).
    */
   $httpBackend.flush = function(count) {
-    if (!responses.length) throw Error('No pending request to flush !');
+    $rootScope.$digest();
+    if (!responses.length) throw new Error('No pending request to flush !');
 
     if (angular.isDefined(count)) {
       while (count--) {
-        if (!responses.length) throw Error('No more pending request to flush 
!');
+        if (!responses.length) throw new Error('No more pending request to 
flush !');
         responses.shift()();
       }
     } else {
@@ -1243,8 +1454,7 @@ function createHttpBackendMock($delegate, $browser) {
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#verifyNoOutstandingExpectation
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#verifyNoOutstandingExpectation
    * @description
    * Verifies that all of the requests defined via the `expect` api were made. 
If any of the
    * requests were not made, verifyNoOutstandingExpectation throws an 
exception.
@@ -1252,42 +1462,41 @@ function createHttpBackendMock($delegate, $browser) {
    * Typically, you would call this method following each test case that 
asserts requests using an
    * "afterEach" clause.
    *
-   * <pre>
+   * ```js
    *   afterEach($httpBackend.verifyNoOutstandingExpectation);
-   * </pre>
+   * ```
    */
   $httpBackend.verifyNoOutstandingExpectation = function() {
+    $rootScope.$digest();
     if (expectations.length) {
-      throw Error('Unsatisfied requests: ' + expectations.join(', '));
+      throw new Error('Unsatisfied requests: ' + expectations.join(', '));
     }
   };
 
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#verifyNoOutstandingRequest
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#verifyNoOutstandingRequest
    * @description
    * Verifies that there are no outstanding requests that need to be flushed.
    *
    * Typically, you would call this method following each test case that 
asserts requests using an
    * "afterEach" clause.
    *
-   * <pre>
+   * ```js
    *   afterEach($httpBackend.verifyNoOutstandingRequest);
-   * </pre>
+   * ```
    */
   $httpBackend.verifyNoOutstandingRequest = function() {
     if (responses.length) {
-      throw Error('Unflushed requests: ' + responses.length);
+      throw new Error('Unflushed requests: ' + responses.length);
     }
   };
 
 
   /**
    * @ngdoc method
-   * @name ngMock.$httpBackend#resetExpectations
-   * @methodOf ngMock.$httpBackend
+   * @name $httpBackend#resetExpectations
    * @description
    * Resets all request expectations, but preserves all backend definitions. 
Typically, you would
    * call resetExpectations during a multiple-phase test when you want to 
reuse the same instance of
@@ -1304,14 +1513,14 @@ function createHttpBackendMock($delegate, $browser) {
   function createShortMethods(prefix) {
     angular.forEach(['GET', 'DELETE', 'JSONP'], function(method) {
      $httpBackend[prefix + method] = function(url, headers) {
-       return $httpBackend[prefix](method, url, undefined, headers)
-     }
+       return $httpBackend[prefix](method, url, undefined, headers);
+     };
     });
 
     angular.forEach(['PUT', 'POST', 'PATCH'], function(method) {
       $httpBackend[prefix + method] = function(url, data, headers) {
-        return $httpBackend[prefix](method, url, data, headers)
-      }
+        return $httpBackend[prefix](method, url, data, headers);
+      };
     });
   }
 }
@@ -1344,7 +1553,8 @@ function MockHttpExpectation(method, url, data, headers) {
   this.matchData = function(d) {
     if (angular.isUndefined(data)) return true;
     if (data && angular.isFunction(data.test)) return data.test(d);
-    if (data && !angular.isString(data)) return angular.toJson(data) == d;
+    if (data && angular.isFunction(data)) return data(d);
+    if (data && !angular.isString(data)) return angular.equals(data, 
angular.fromJson(d));
     return data == d;
   };
 
@@ -1353,6 +1563,10 @@ function MockHttpExpectation(method, url, data, headers) 
{
   };
 }
 
+function createMockXhr() {
+  return new MockXhr();
+}
+
 function MockXhr() {
 
   // hack for testing $http, $httpBackend
@@ -1375,7 +1589,8 @@ function MockXhr() {
   };
 
   this.getResponseHeader = function(name) {
-    // the lookup must be case insensitive, that's why we try two quick 
lookups and full scan at last
+    // the lookup must be case insensitive,
+    // that's why we try two quick lookups first and full scan last
     var header = this.$$respHeaders[name];
     if (header) return header;
 
@@ -1404,22 +1619,96 @@ function MockXhr() {
 
 
 /**
- * @ngdoc function
- * @name ngMock.$timeout
+ * @ngdoc service
+ * @name $timeout
  * @description
  *
  * This service is just a simple decorator for {@link ng.$timeout $timeout} 
service
- * that adds a "flush" method.
+ * that adds a "flush" and "verifyNoPendingTasks" methods.
  */
 
-/**
- * @ngdoc method
- * @name ngMock.$timeout#flush
- * @methodOf ngMock.$timeout
- * @description
- *
- * Flushes the queue of pending tasks.
- */
+angular.mock.$TimeoutDecorator = function($delegate, $browser) {
+
+  /**
+   * @ngdoc method
+   * @name $timeout#flush
+   * @description
+   *
+   * Flushes the queue of pending tasks.
+   *
+   * @param {number=} delay maximum timeout amount to flush up until
+   */
+  $delegate.flush = function(delay) {
+    $browser.defer.flush(delay);
+  };
+
+  /**
+   * @ngdoc method
+   * @name $timeout#verifyNoPendingTasks
+   * @description
+   *
+   * Verifies that there are no pending tasks that need to be flushed.
+   */
+  $delegate.verifyNoPendingTasks = function() {
+    if ($browser.deferredFns.length) {
+      throw new Error('Deferred tasks to flush (' + 
$browser.deferredFns.length + '): ' +
+          formatPendingTasksAsString($browser.deferredFns));
+    }
+  };
+
+  function formatPendingTasksAsString(tasks) {
+    var result = [];
+    angular.forEach(tasks, function(task) {
+      result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}');
+    });
+
+    return result.join(', ');
+  }
+
+  return $delegate;
+};
+
+angular.mock.$RAFDecorator = function($delegate) {
+  var queue = [];
+  var rafFn = function(fn) {
+    var index = queue.length;
+    queue.push(fn);
+    return function() {
+      queue.splice(index, 1);
+    };
+  };
+
+  rafFn.supported = $delegate.supported;
+
+  rafFn.flush = function() {
+    if(queue.length === 0) {
+      throw new Error('No rAF callbacks present');
+    }
+
+    var length = queue.length;
+    for(var i=0;i<length;i++) {
+      queue[i]();
+    }
+
+    queue = [];
+  };
+
+  return rafFn;
+};
+
+angular.mock.$AsyncCallbackDecorator = function($delegate) {
+  var callbacks = [];
+  var addFn = function(fn) {
+    callbacks.push(fn);
+  };
+  addFn.flush = function() {
+    angular.forEach(callbacks, function(fn) {
+      fn();
+    });
+    callbacks = [];
+  };
+  return addFn;
+};
 
 /**
  *
@@ -1427,49 +1716,57 @@ function MockXhr() {
 angular.mock.$RootElementProvider = function() {
   this.$get = function() {
     return angular.element('<div ng-app></div>');
-  }
+  };
 };
 
 /**
- * @ngdoc overview
+ * @ngdoc module
  * @name ngMock
+ * @packageName angular-mocks
  * @description
  *
- * The `ngMock` is an angular module which is used with `ng` module and adds 
unit-test configuration as well as useful
- * mocks to the {@link AUTO.$injector $injector}.
+ * # ngMock
+ *
+ * The `ngMock` module provides support to inject and mock Angular services 
into unit tests.
+ * In addition, ngMock also extends various core ng services such that they 
can be
+ * inspected and controlled in a synchronous manner within test code.
+ *
+ *
+ * <div doc-module-components="ngMock"></div>
+ *
  */
 angular.module('ngMock', ['ng']).provider({
   $browser: angular.mock.$BrowserProvider,
   $exceptionHandler: angular.mock.$ExceptionHandlerProvider,
   $log: angular.mock.$LogProvider,
+  $interval: angular.mock.$IntervalProvider,
   $httpBackend: angular.mock.$HttpBackendProvider,
   $rootElement: angular.mock.$RootElementProvider
-}).config(function($provide) {
-  $provide.decorator('$timeout', function($delegate, $browser) {
-    $delegate.flush = function(delay) {
-      $browser.defer.flush(delay);
-    };
-    return $delegate;
-  });
-});
-
+}).config(['$provide', function($provide) {
+  $provide.decorator('$timeout', angular.mock.$TimeoutDecorator);
+  $provide.decorator('$$rAF', angular.mock.$RAFDecorator);
+  $provide.decorator('$$asyncCallback', angular.mock.$AsyncCallbackDecorator);
+}]);
 
 /**
- * @ngdoc overview
+ * @ngdoc module
  * @name ngMockE2E
+ * @module ngMockE2E
+ * @packageName angular-mocks
  * @description
  *
  * The `ngMockE2E` is an angular module which contains mocks suitable for 
end-to-end testing.
  * Currently there is only one mock present in this module -
  * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock.
  */
-angular.module('ngMockE2E', ['ng']).config(function($provide) {
+angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
   $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
-});
+}]);
 
 /**
- * @ngdoc object
- * @name ngMockE2E.$httpBackend
+ * @ngdoc service
+ * @name $httpBackend
+ * @module ngMockE2E
  * @description
  * Fake HTTP backend implementation suitable for end-to-end testing or 
backend-less development of
  * applications that use the {@link ng.$http $http service}.
@@ -1489,13 +1786,13 @@ angular.module('ngMockE2E', 
['ng']).config(function($provide) {
  * use the `passThrough` request handler of `when` instead of `respond`.
  *
  * Additionally, we don't want to manually have to flush mocked out requests 
like we do during unit
- * testing. For this reason the e2e $httpBackend automatically flushes mocked 
out requests
+ * testing. For this reason the e2e $httpBackend flushes mocked out requests
  * automatically, closely simulating the behavior of the XMLHttpRequest object.
  *
  * To setup the application to run with this http backend, you have to create 
a module that depends
  * on the `ngMockE2E` and your application modules and defines the fake 
backend:
  *
- * <pre>
+ * ```js
  *   myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']);
  *   myAppDev.run(function($httpBackend) {
  *     phones = [{name: 'phone1'}, {name: 'phone2'}];
@@ -1505,20 +1802,22 @@ angular.module('ngMockE2E', 
['ng']).config(function($provide) {
  *
  *     // adds a new phone to the phones array
  *     $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
- *       phones.push(angular.fromJson(data));
+ *       var phone = angular.fromJson(data);
+ *       phones.push(phone);
+ *       return [200, phone, {}];
  *     });
  *     $httpBackend.whenGET(/^\/templates\//).passThrough();
  *     //...
  *   });
- * </pre>
+ * ```
  *
  * Afterwards, bootstrap your app with this new module.
  */
 
 /**
  * @ngdoc method
- * @name ngMockE2E.$httpBackend#when
- * @methodOf ngMockE2E.$httpBackend
+ * @name $httpBackend#when
+ * @module ngMockE2E
  * @description
  * Creates a new backend definition.
  *
@@ -1530,19 +1829,21 @@ angular.module('ngMockE2E', 
['ng']).config(function($provide) {
  * @returns {requestHandler} Returns an object with `respond` and 
`passThrough` methods that
  *   control how a matched request is handled.
  *
- *  - respond – `{function([status,] data[, 
headers])|function(function(method, url, data, headers)}`
+ *  - respond –
+ *    `{function([status,] data[, headers, statusText])
+ *    | function(function(method, url, data, headers)}`
  *    – The respond method takes a set of static data to be returned or a 
function that can return
- *    an array containing response status (number), response data (string) and 
response headers
- *    (Object).
- *  - passThrough – `{function()}` – Any request matching a backend 
definition with `passThrough`
- *    handler, will be pass through to the real backend (an XHR request will 
be made to the
- *    server.
+ *    an array containing response status (number), response data (string), 
response headers
+ *    (Object), and the text for the status (string).
+ *  - passThrough – `{function()}` – Any request matching a backend 
definition with
+ *    `passThrough` handler will be passed through to the real backend (an XHR 
request will be made
+ *    to the server.)
  */
 
 /**
  * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenGET
- * @methodOf ngMockE2E.$httpBackend
+ * @name $httpBackend#whenGET
+ * @module ngMockE2E
  * @description
  * Creates a new backend definition for GET requests. For more info see 
`when()`.
  *
@@ -1554,8 +1855,8 @@ angular.module('ngMockE2E', 
['ng']).config(function($provide) {
 
 /**
  * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenHEAD
- * @methodOf ngMockE2E.$httpBackend
+ * @name $httpBackend#whenHEAD
+ * @module ngMockE2E
  * @description
  * Creates a new backend definition for HEAD requests. For more info see 
`when()`.
  *
@@ -1567,8 +1868,8 @@ angular.module('ngMockE2E', 
['ng']).config(function($provide) {
 
 /**
  * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenDELETE
- * @methodOf ngMockE2E.$httpBackend
+ * @name $httpBackend#whenDELETE
+ * @module ngMockE2E
  * @description
  * Creates a new backend definition for DELETE requests. For more info see 
`when()`.
  *
@@ -1580,8 +1881,8 @@ angular.module('ngMockE2E', 
['ng']).config(function($provide) {
 
 /**
  * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenPOST
- * @methodOf ngMockE2E.$httpBackend
+ * @name $httpBackend#whenPOST
+ * @module ngMockE2E
  * @description
  * Creates a new backend definition for POST requests. For more info see 
`when()`.
  *
@@ -1594,8 +1895,8 @@ angular.module('ngMockE2E', 
['ng']).config(function($provide) {
 
 /**
  * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenPUT
- * @methodOf ngMockE2E.$httpBackend
+ * @name $httpBackend#whenPUT
+ * @module ngMockE2E
  * @description
  * Creates a new backend definition for PUT requests.  For more info see 
`when()`.
  *
@@ -1608,8 +1909,8 @@ angular.module('ngMockE2E', 
['ng']).config(function($provide) {
 
 /**
  * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenPATCH
- * @methodOf ngMockE2E.$httpBackend
+ * @name $httpBackend#whenPATCH
+ * @module ngMockE2E
  * @description
  * Creates a new backend definition for PATCH requests.  For more info see 
`when()`.
  *
@@ -1622,8 +1923,8 @@ angular.module('ngMockE2E', 
['ng']).config(function($provide) {
 
 /**
  * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenJSONP
- * @methodOf ngMockE2E.$httpBackend
+ * @name $httpBackend#whenJSONP
+ * @module ngMockE2E
  * @description
  * Creates a new backend definition for JSONP requests. For more info see 
`when()`.
  *
@@ -1632,7 +1933,8 @@ angular.module('ngMockE2E', 
['ng']).config(function($provide) {
  *   control how a matched request is handled.
  */
 angular.mock.e2e = {};
-angular.mock.e2e.$httpBackendDecorator = ['$delegate', '$browser', 
createHttpBackendMock];
+angular.mock.e2e.$httpBackendDecorator =
+  ['$rootScope', '$delegate', '$browser', createHttpBackendMock];
 
 
 angular.mock.clearDataCache = function() {
@@ -1640,28 +1942,43 @@ angular.mock.clearDataCache = function() {
       cache = angular.element.cache;
 
   for(key in cache) {
-    if (cache.hasOwnProperty(key)) {
+    if (Object.prototype.hasOwnProperty.call(cache,key)) {
       var handle = cache[key].handle;
 
-      handle && angular.element(handle.elem).unbind();
+      handle && angular.element(handle.elem).off();
       delete cache[key];
     }
   }
 };
 
 
+if(window.jasmine || window.mocha) {
+
+  var currentSpec = null,
+      isSpecRunning = function() {
+        return !!currentSpec;
+      };
 
-window.jasmine && (function(window) {
 
-  afterEach(function() {
-    var spec = getCurrentSpec();
-    var injector = spec.$injector;
+  (window.beforeEach || window.setup)(function() {
+    currentSpec = this;
+  });
+
+  (window.afterEach || window.teardown)(function() {
+    var injector = currentSpec.$injector;
+
+    angular.forEach(currentSpec.$modules, function(module) {
+      if (module && module.$$hashKey) {
+        module.$$hashKey = undefined;
+      }
+    });
 
-    spec.$injector = null;
-    spec.$modules = null;
+    currentSpec.$injector = null;
+    currentSpec.$modules = null;
+    currentSpec = null;
 
     if (injector) {
-      injector.get('$rootElement').unbind();
+      injector.get('$rootElement').off();
       injector.get('$browser').pollFns.length = 0;
     }
 
@@ -1680,44 +1997,44 @@ window.jasmine && (function(window) {
     angular.callbacks.counter = 0;
   });
 
-  function getCurrentSpec() {
-    return jasmine.getEnv().currentSpec;
-  }
-
-  function isSpecRunning() {
-    var spec = getCurrentSpec();
-    return spec && spec.queue.running;
-  }
-
   /**
    * @ngdoc function
    * @name angular.mock.module
    * @description
    *
    * *NOTE*: This function is also published on window for easy access.<br>
-   * *NOTE*: Only available with {@link http://pivotal.github.com/jasmine/ 
jasmine}.
+   * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or 
mocha
    *
    * This function registers a module configuration code. It collects the 
configuration information
    * which will be used when the injector is created by {@link 
angular.mock.inject inject}.
    *
    * See {@link angular.mock.inject inject} for usage example
    *
-   * @param {...(string|Function)} fns any number of modules which are 
represented as string
+   * @param {...(string|Function|Object)} fns any number of modules which are 
represented as string
    *        aliases or as anonymous module initialization functions. The 
modules are used to
-   *        configure the injector. The 'ng' and 'ngMock' modules are 
automatically loaded.
+   *        configure the injector. The 'ng' and 'ngMock' modules are 
automatically loaded. If an
+   *        object literal is passed they will be registered as values in the 
module, the key being
+   *        the module name and the value being what is returned.
    */
   window.module = angular.mock.module = function() {
     var moduleFns = Array.prototype.slice.call(arguments, 0);
     return isSpecRunning() ? workFn() : workFn;
     /////////////////////
     function workFn() {
-      var spec = getCurrentSpec();
-      if (spec.$injector) {
-        throw Error('Injector already created, can not register a module!');
+      if (currentSpec.$injector) {
+        throw new Error('Injector already created, can not register a 
module!');
       } else {
-        var modules = spec.$modules || (spec.$modules = []);
+        var modules = currentSpec.$modules || (currentSpec.$modules = []);
         angular.forEach(moduleFns, function(module) {
-          modules.push(module);
+          if (angular.isObject(module) && !angular.isArray(module)) {
+            modules.push(function($provide) {
+              angular.forEach(module, function(value, key) {
+                $provide.value(key, value);
+              });
+            });
+          } else {
+            modules.push(module);
+          }
         });
       }
     }
@@ -1729,16 +2046,48 @@ window.jasmine && (function(window) {
    * @description
    *
    * *NOTE*: This function is also published on window for easy access.<br>
-   * *NOTE*: Only available with {@link http://pivotal.github.com/jasmine/ 
jasmine}.
+   * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or 
mocha
    *
    * The inject function wraps a function into an injectable function. The 
inject() creates new
-   * instance of {@link AUTO.$injector $injector} per test, which is then used 
for
+   * instance of {@link auto.$injector $injector} per test, which is then used 
for
    * resolving references.
    *
-   * See also {@link angular.mock.module module}
    *
+   * ## Resolving References (Underscore Wrapping)
+   * Often, we would like to inject a reference once, in a `beforeEach()` 
block and reuse this
+   * in multiple `it()` clauses. To be able to do this we must assign the 
reference to a variable
+   * that is declared in the scope of the `describe()` block. Since we would, 
most likely, want
+   * the variable to have the same name of the reference we have a problem, 
since the parameter
+   * to the `inject()` function would hide the outer variable.
+   *
+   * To help with this, the injected parameters can, optionally, be enclosed 
with underscores.
+   * These are ignored by the injector when the reference name is resolved.
+   *
+   * For example, the parameter `_myService_` would be resolved as the 
reference `myService`.
+   * Since it is available in the function body as _myService_, we can then 
assign it to a variable
+   * defined in an outer scope.
+   *
+   * ```
+   * // Defined out reference variable outside
+   * var myService;
+   *
+   * // Wrap the parameter in underscores
+   * beforeEach( inject( function(_myService_){
+   *   myService = _myService_;
+   * }));
+   *
+   * // Use myService in a series of tests.
+   * it('makes use of myService', function() {
+   *   myService.doStuff();
+   * });
+   *
+   * ```
+   *
+   * See also {@link angular.mock.module angular.mock.module}
+   *
+   * ## Example
    * Example of what a typical jasmine tests looks like with the inject method.
-   * <pre>
+   * ```js
    *
    *   angular.module('myApplicationModule', [])
    *       .value('mode', 'app')
@@ -1769,32 +2118,50 @@ window.jasmine && (function(window) {
    *       inject(function(version) {
    *         expect(version).toEqual('overridden');
    *       });
-   *     ));
+   *     });
    *   });
    *
-   * </pre>
+   * ```
    *
    * @param {...Function} fns any number of functions which will be injected 
using the injector.
    */
+
+
+
+  var ErrorAddingDeclarationLocationStack = function(e, errorForStack) {
+    this.message = e.message;
+    this.name = e.name;
+    if (e.line) this.line = e.line;
+    if (e.sourceId) this.sourceId = e.sourceId;
+    if (e.stack && errorForStack)
+      this.stack = e.stack + '\n' + errorForStack.stack;
+    if (e.stackArray) this.stackArray = e.stackArray;
+  };
+  ErrorAddingDeclarationLocationStack.prototype.toString = 
Error.prototype.toString;
+
   window.inject = angular.mock.inject = function() {
     var blockFns = Array.prototype.slice.call(arguments, 0);
     var errorForStack = new Error('Declaration Location');
-    return isSpecRunning() ? workFn() : workFn;
+    return isSpecRunning() ? workFn.call(currentSpec) : workFn;
     /////////////////////
     function workFn() {
-      var spec = getCurrentSpec();
-      var modules = spec.$modules || [];
+      var modules = currentSpec.$modules || [];
+
       modules.unshift('ngMock');
       modules.unshift('ng');
-      var injector = spec.$injector;
+      var injector = currentSpec.$injector;
       if (!injector) {
-        injector = spec.$injector = angular.injector(modules);
+        injector = currentSpec.$injector = angular.injector(modules);
       }
       for(var i = 0, ii = blockFns.length; i < ii; i++) {
         try {
+          /* jshint -W040 *//* Jasmine explicitly provides a `this` object 
when calling functions */
           injector.invoke(blockFns[i] || angular.noop, this);
+          /* jshint +W040 */
         } catch (e) {
-          if(e.stack && errorForStack) e.stack +=  '\n' + errorForStack.stack;
+          if (e.stack && errorForStack) {
+            throw new ErrorAddingDeclarationLocationStack(e, errorForStack);
+          }
           throw e;
         } finally {
           errorForStack = null;
@@ -1802,4 +2169,7 @@ window.jasmine && (function(window) {
       }
     }
   };
-})(window);
+}
+
+
+})(window, window.angular);

Reply via email to