angularjs-rails 1.3.2 → 1.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/lib/angularjs-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/angular-animate.js +2 -2
  4. data/vendor/assets/javascripts/angular-aria.js +83 -23
  5. data/vendor/assets/javascripts/angular-cookies.js +1 -1
  6. data/vendor/assets/javascripts/angular-loader.js +6 -23
  7. data/vendor/assets/javascripts/angular-messages.js +1 -1
  8. data/vendor/assets/javascripts/angular-mocks.js +21 -17
  9. data/vendor/assets/javascripts/angular-resource.js +1 -1
  10. data/vendor/assets/javascripts/angular-route.js +19 -5
  11. data/vendor/assets/javascripts/angular-sanitize.js +20 -20
  12. data/vendor/assets/javascripts/angular-scenario.js +298 -269
  13. data/vendor/assets/javascripts/angular-touch.js +3 -3
  14. data/vendor/assets/javascripts/angular.js +292 -263
  15. data/vendor/assets/javascripts/unstable/angular-animate.js +2 -2
  16. data/vendor/assets/javascripts/unstable/angular-aria.js +83 -23
  17. data/vendor/assets/javascripts/unstable/angular-cookies.js +1 -1
  18. data/vendor/assets/javascripts/unstable/angular-loader.js +6 -23
  19. data/vendor/assets/javascripts/unstable/angular-messages.js +1 -1
  20. data/vendor/assets/javascripts/unstable/angular-mocks.js +21 -17
  21. data/vendor/assets/javascripts/unstable/angular-resource.js +1 -1
  22. data/vendor/assets/javascripts/unstable/angular-route.js +19 -5
  23. data/vendor/assets/javascripts/unstable/angular-sanitize.js +20 -20
  24. data/vendor/assets/javascripts/unstable/angular-scenario.js +298 -269
  25. data/vendor/assets/javascripts/unstable/angular-touch.js +3 -3
  26. data/vendor/assets/javascripts/unstable/angular.js +292 -263
  27. metadata +2 -2
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1889,7 +1889,7 @@ angular.module('ngAnimate', ['ng'])
1889
1889
  //the jqLite object, so we're safe to use a single variable to house
1890
1890
  //the styles since there is always only one element being animated
1891
1891
  var oldStyle = node.getAttribute('style') || '';
1892
- if (oldStyle.charAt(oldStyle.length-1) !== ';') {
1892
+ if (oldStyle.charAt(oldStyle.length - 1) !== ';') {
1893
1893
  oldStyle += ';';
1894
1894
  }
1895
1895
  node.setAttribute('style', oldStyle + ' ' + style);
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -10,33 +10,49 @@
10
10
  * @name ngAria
11
11
  * @description
12
12
  *
13
- * The `ngAria` module provides support for adding <abbr title="Accessible Rich Internet Applications">ARIA</abbr>
14
- * attributes that convey state or semantic information about the application in order to allow assistive technologies
15
- * to convey appropriate information to persons with disabilities.
13
+ * The `ngAria` module provides support for common
14
+ * [<abbr title="Accessible Rich Internet Applications">ARIA</abbr>](http://www.w3.org/TR/wai-aria/)
15
+ * attributes that convey state or semantic information about the application for users
16
+ * of assistive technologies, such as screen readers.
16
17
  *
17
18
  * <div doc-module-components="ngAria"></div>
18
19
  *
19
- * # Usage
20
- * To enable the addition of the ARIA tags, just require the module into your application and the tags will
21
- * hook into your ng-show/ng-hide, input, textarea, button, select and ng-required directives and adds the
22
- * appropriate ARIA attributes.
20
+ * ## Usage
23
21
  *
24
- * Currently, the following ARIA attributes are implemented:
22
+ * For ngAria to do its magic, simply include the module as a dependency. The directives supported
23
+ * by ngAria are:
24
+ * `ngModel`, `ngDisabled`, `ngShow`, `ngHide`, `ngClick`, `ngDblClick`, and `ngMessages`.
25
25
  *
26
- * + aria-hidden
27
- * + aria-checked
28
- * + aria-disabled
29
- * + aria-required
30
- * + aria-invalid
31
- * + aria-multiline
32
- * + aria-valuenow
33
- * + aria-valuemin
34
- * + aria-valuemax
35
- * + tabindex
26
+ * Below is a more detailed breakdown of the attributes handled by ngAria:
36
27
  *
37
- * You can disable individual ARIA attributes by using the {@link ngAria.$ariaProvider#config config} method.
28
+ * | Directive | Supported Attributes |
29
+ * |---------------------------------------------|----------------------------------------------------------------------------------------|
30
+ * | {@link ng.directive:ngModel ngModel} | aria-checked, aria-valuemin, aria-valuemax, aria-valuenow, aria-invalid, aria-required |
31
+ * | {@link ng.directive:ngDisabled ngDisabled} | aria-disabled |
32
+ * | {@link ng.directive:ngShow ngShow} | aria-hidden |
33
+ * | {@link ng.directive:ngHide ngHide} | aria-hidden |
34
+ * | {@link ng.directive:ngClick ngClick} | tabindex |
35
+ * | {@link ng.directive:ngDblclick ngDblclick} | tabindex |
36
+ * | {@link module:ngMessages ngMessages} | aria-live |
37
+ *
38
+ * Find out more information about each directive by reading the
39
+ * {@link guide/accessibility ngAria Developer Guide}.
40
+ *
41
+ * ##Example
42
+ * Using ngDisabled with ngAria:
43
+ * ```html
44
+ * <md-checkbox ng-disabled="disabled">
45
+ * ```
46
+ * Becomes:
47
+ * ```html
48
+ * <md-checkbox ng-disabled="disabled" aria-disabled="true">
49
+ * ```
50
+ *
51
+ * ##Disabling Attributes
52
+ * It's possible to disable individual attributes added by ngAria with the
53
+ * {@link ngAria.$ariaProvider#config config} method. For more details, see the
54
+ * {@link guide/accessibility Developer Guide}.
38
55
  */
39
-
40
56
  /* global -ngAriaModule */
41
57
  var ngAriaModule = angular.module('ngAria', ['ng']).
42
58
  provider('$aria', $AriaProvider);
@@ -47,10 +63,20 @@ var ngAriaModule = angular.module('ngAria', ['ng']).
47
63
  *
48
64
  * @description
49
65
  *
50
- * Used for configuring ARIA attributes.
66
+ * Used for configuring the ARIA attributes injected and managed by ngAria.
67
+ *
68
+ * ```js
69
+ * angular.module('myApp', ['ngAria'], function config($ariaProvider) {
70
+ * $ariaProvider.config({
71
+ * ariaValue: true,
72
+ * tabindex: false
73
+ * });
74
+ * });
75
+ *```
51
76
  *
52
77
  * ## Dependencies
53
78
  * Requires the {@link ngAria} module to be installed.
79
+ *
54
80
  */
55
81
  function $AriaProvider() {
56
82
  var config = {
@@ -113,7 +139,41 @@ function $AriaProvider() {
113
139
  *
114
140
  * @description
115
141
  *
116
- * Contains helper methods for applying ARIA attributes to HTML
142
+ * The $aria service contains helper methods for applying common
143
+ * [ARIA](http://www.w3.org/TR/wai-aria/) attributes to HTML directives.
144
+ *
145
+ * ngAria injects common accessibility attributes that tell assistive technologies when HTML
146
+ * elements are enabled, selected, hidden, and more. To see how this is performed with ngAria,
147
+ * let's review a code snippet from ngAria itself:
148
+ *
149
+ *```js
150
+ * ngAriaModule.directive('ngDisabled', ['$aria', function($aria) {
151
+ * return $aria.$$watchExpr('ngDisabled', 'aria-disabled');
152
+ * }])
153
+ *```
154
+ * Shown above, the ngAria module creates a directive with the same signature as the
155
+ * traditional `ng-disabled` directive. But this ngAria version is dedicated to
156
+ * solely managing accessibility attributes. The internal `$aria` service is used to watch the
157
+ * boolean attribute `ngDisabled`. If it has not been explicitly set by the developer,
158
+ * `aria-disabled` is injected as an attribute with its value synchronized to the value in
159
+ * `ngDisabled`.
160
+ *
161
+ * Because ngAria hooks into the `ng-disabled` directive, developers do not have to do
162
+ * anything to enable this feature. The `aria-disabled` attribute is automatically managed
163
+ * simply as a silent side-effect of using `ng-disabled` with the ngAria module.
164
+ *
165
+ * The full list of directives that interface with ngAria:
166
+ * * **ngModel**
167
+ * * **ngShow**
168
+ * * **ngHide**
169
+ * * **ngClick**
170
+ * * **ngDblclick**
171
+ * * **ngMessages**
172
+ * * **ngDisabled**
173
+ *
174
+ * Read the {@link guide/accessibility ngAria Developer Guide} for a thorough explanation of each
175
+ * directive.
176
+ *
117
177
  *
118
178
  * ## Dependencies
119
179
  * Requires the {@link ngAria} module to be installed.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -43,40 +43,23 @@ function minErr(module, ErrorConstructor) {
43
43
  prefix = '[' + (module ? module + ':' : '') + code + '] ',
44
44
  template = arguments[1],
45
45
  templateArgs = arguments,
46
- stringify = function(obj) {
47
- if (typeof obj === 'function') {
48
- return obj.toString().replace(/ \{[\s\S]*$/, '');
49
- } else if (typeof obj === 'undefined') {
50
- return 'undefined';
51
- } else if (typeof obj !== 'string') {
52
- return JSON.stringify(obj);
53
- }
54
- return obj;
55
- },
46
+
56
47
  message, i;
57
48
 
58
49
  message = prefix + template.replace(/\{\d+\}/g, function(match) {
59
50
  var index = +match.slice(1, -1), arg;
60
51
 
61
52
  if (index + 2 < templateArgs.length) {
62
- arg = templateArgs[index + 2];
63
- if (typeof arg === 'function') {
64
- return arg.toString().replace(/ ?\{[\s\S]*$/, '');
65
- } else if (typeof arg === 'undefined') {
66
- return 'undefined';
67
- } else if (typeof arg !== 'string') {
68
- return toJson(arg);
69
- }
70
- return arg;
53
+ return toDebugString(templateArgs[index + 2]);
71
54
  }
72
55
  return match;
73
56
  });
74
57
 
75
- message = message + '\nhttp://errors.angularjs.org/1.3.2/' +
58
+ message = message + '\nhttp://errors.angularjs.org/1.3.3/' +
76
59
  (module ? module + '/' : '') + code;
77
60
  for (i = 2; i < arguments.length; i++) {
78
- message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
79
- encodeURIComponent(stringify(arguments[i]));
61
+ message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
62
+ encodeURIComponent(toDebugString(arguments[i]));
80
63
  }
81
64
  return new ErrorConstructor(message);
82
65
  };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -117,7 +117,7 @@ angular.mock.$Browser = function() {
117
117
  self.defer.now += delay;
118
118
  } else {
119
119
  if (self.deferredFns.length) {
120
- self.defer.now = self.deferredFns[self.deferredFns.length-1].time;
120
+ self.defer.now = self.deferredFns[self.deferredFns.length - 1].time;
121
121
  } else {
122
122
  throw new Error('No deferred tasks to be flushed');
123
123
  }
@@ -428,7 +428,7 @@ angular.mock.$LogProvider = function() {
428
428
  });
429
429
  });
430
430
  if (errors.length) {
431
- errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or "+
431
+ errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or " +
432
432
  "an expected log message was not checked and removed:");
433
433
  errors.push('');
434
434
  throw new Error(errors.join('\n---------\n'));
@@ -461,17 +461,17 @@ angular.mock.$LogProvider = function() {
461
461
  * @returns {promise} A promise which will be notified on each iteration.
462
462
  */
463
463
  angular.mock.$IntervalProvider = function() {
464
- this.$get = ['$rootScope', '$q',
465
- function($rootScope, $q) {
464
+ this.$get = ['$browser', '$rootScope', '$q', '$$q',
465
+ function($browser, $rootScope, $q, $$q) {
466
466
  var repeatFns = [],
467
467
  nextRepeatId = 0,
468
468
  now = 0;
469
469
 
470
470
  var $interval = function(fn, delay, count, invokeApply) {
471
- var deferred = $q.defer(),
472
- promise = deferred.promise,
473
- iteration = 0,
474
- skipApply = (angular.isDefined(invokeApply) && !invokeApply);
471
+ var iteration = 0,
472
+ skipApply = (angular.isDefined(invokeApply) && !invokeApply),
473
+ deferred = (skipApply ? $$q : $q).defer(),
474
+ promise = deferred.promise;
475
475
 
476
476
  count = (angular.isDefined(count)) ? count : 0;
477
477
  promise.then(null, null, fn);
@@ -494,7 +494,11 @@ angular.mock.$IntervalProvider = function() {
494
494
  }
495
495
  }
496
496
 
497
- if (!skipApply) $rootScope.$apply();
497
+ if (skipApply) {
498
+ $browser.defer.flush();
499
+ } else {
500
+ $rootScope.$apply();
501
+ }
498
502
  }
499
503
 
500
504
  repeatFns.push({
@@ -581,10 +585,10 @@ function jsonStringToDate(string) {
581
585
  tzMin = int(match[9] + match[11]);
582
586
  }
583
587
  date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
584
- date.setUTCHours(int(match[4]||0) - tzHour,
585
- int(match[5]||0) - tzMin,
586
- int(match[6]||0),
587
- int(match[7]||0));
588
+ date.setUTCHours(int(match[4] || 0) - tzHour,
589
+ int(match[5] || 0) - tzMin,
590
+ int(match[6] || 0),
591
+ int(match[7] || 0));
588
592
  return date;
589
593
  }
590
594
  return string;
@@ -663,7 +667,7 @@ angular.mock.TzDate = function(offset, timestamp) {
663
667
  }
664
668
 
665
669
  var localOffset = new Date(timestamp).getTimezoneOffset();
666
- self.offsetDiff = localOffset*60*1000 - offset*1000*60*60;
670
+ self.offsetDiff = localOffset * 60 * 1000 - offset * 1000 * 60 * 60;
667
671
  self.date = new Date(timestamp + self.offsetDiff);
668
672
 
669
673
  self.getTime = function() {
@@ -815,7 +819,7 @@ angular.mock.animate = angular.module('ngAnimateMock', ['ng'])
815
819
  animate.queue.push({
816
820
  event: method,
817
821
  element: arguments[0],
818
- options: arguments[arguments.length-1],
822
+ options: arguments[arguments.length - 1],
819
823
  args: arguments
820
824
  });
821
825
  return $delegate[method].apply($delegate, arguments);
@@ -1770,7 +1774,7 @@ angular.mock.$RAFDecorator = ['$delegate', function($delegate) {
1770
1774
  }
1771
1775
 
1772
1776
  var length = queue.length;
1773
- for (var i=0;i<length;i++) {
1777
+ for (var i = 0; i < length; i++) {
1774
1778
  queue[i]();
1775
1779
  }
1776
1780
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -151,6 +151,9 @@ function $RouteProvider() {
151
151
  if (angular.isUndefined(routeCopy.reloadOnSearch)) {
152
152
  routeCopy.reloadOnSearch = true;
153
153
  }
154
+ if (angular.isUndefined(routeCopy.caseInsensitiveMatch)) {
155
+ routeCopy.caseInsensitiveMatch = this.caseInsensitiveMatch;
156
+ }
154
157
  routes[path] = angular.extend(
155
158
  routeCopy,
156
159
  path && pathRegExp(path, routeCopy)
@@ -158,9 +161,9 @@ function $RouteProvider() {
158
161
 
159
162
  // create redirection for trailing slashes
160
163
  if (path) {
161
- var redirectPath = (path[path.length-1] == '/')
162
- ? path.substr(0, path.length-1)
163
- : path +'/';
164
+ var redirectPath = (path[path.length - 1] == '/')
165
+ ? path.substr(0, path.length - 1)
166
+ : path + '/';
164
167
 
165
168
  routes[redirectPath] = angular.extend(
166
169
  {redirectTo: path},
@@ -171,6 +174,17 @@ function $RouteProvider() {
171
174
  return this;
172
175
  };
173
176
 
177
+ /**
178
+ * @ngdoc property
179
+ * @name $routeProvider#caseInsensitiveMatch
180
+ * @description
181
+ *
182
+ * A boolean property indicating if routes defined
183
+ * using this provider should be matched using a case sensitive
184
+ * algorithm. Defaults to `false`.
185
+ */
186
+ this.caseInsensitiveMatch = false;
187
+
174
188
  /**
175
189
  * @param path {string} path
176
190
  * @param opts {Object} options
@@ -639,7 +653,7 @@ function $RouteProvider() {
639
653
  */
640
654
  function interpolate(string, params) {
641
655
  var result = [];
642
- angular.forEach((string||'').split(':'), function(segment, i) {
656
+ angular.forEach((string || '').split(':'), function(segment, i) {
643
657
  if (i === 0) {
644
658
  result.push(segment);
645
659
  } else {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -218,29 +218,29 @@ var validElements = angular.extend({},
218
218
  //Attributes that have href and hence need to be sanitized
219
219
  var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap,xlink:href");
220
220
 
221
- var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+
222
- 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+
223
- 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+
224
- 'scope,scrolling,shape,size,span,start,summary,target,title,type,'+
221
+ var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' +
222
+ 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' +
223
+ 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' +
224
+ 'scope,scrolling,shape,size,span,start,summary,target,title,type,' +
225
225
  'valign,value,vspace,width');
226
226
 
227
227
  // SVG attributes (without "id" and "name" attributes)
228
228
  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes
229
- var svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,'+
230
- 'attributeName,attributeType,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,'+
231
- 'color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,'+
232
- 'font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,'+
233
- 'gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,'+
234
- 'keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,'+
235
- 'markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,'+
236
- 'overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,'+
237
- 'repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,'+
238
- 'stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,'+
239
- 'stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,'+
240
- 'stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,'+
241
- 'underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,'+
242
- 'viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,'+
243
- 'xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,'+
229
+ var svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +
230
+ 'attributeName,attributeType,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,' +
231
+ 'color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,' +
232
+ 'font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,' +
233
+ 'gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,' +
234
+ 'keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,' +
235
+ 'markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,' +
236
+ 'overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,' +
237
+ 'repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,' +
238
+ 'stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,' +
239
+ 'stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,' +
240
+ 'stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,' +
241
+ 'underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,' +
242
+ 'viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,' +
243
+ 'xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,' +
244
244
  'zoomAndPan');
245
245
 
246
246
  var validAttrs = angular.extend({},
@@ -9190,7 +9190,7 @@ return jQuery;
9190
9190
  }));
9191
9191
 
9192
9192
  /**
9193
- * @license AngularJS v1.3.2
9193
+ * @license AngularJS v1.3.3
9194
9194
  * (c) 2010-2014 Google, Inc. http://angularjs.org
9195
9195
  * License: MIT
9196
9196
  */
@@ -9234,40 +9234,23 @@ function minErr(module, ErrorConstructor) {
9234
9234
  prefix = '[' + (module ? module + ':' : '') + code + '] ',
9235
9235
  template = arguments[1],
9236
9236
  templateArgs = arguments,
9237
- stringify = function(obj) {
9238
- if (typeof obj === 'function') {
9239
- return obj.toString().replace(/ \{[\s\S]*$/, '');
9240
- } else if (typeof obj === 'undefined') {
9241
- return 'undefined';
9242
- } else if (typeof obj !== 'string') {
9243
- return JSON.stringify(obj);
9244
- }
9245
- return obj;
9246
- },
9237
+
9247
9238
  message, i;
9248
9239
 
9249
9240
  message = prefix + template.replace(/\{\d+\}/g, function(match) {
9250
9241
  var index = +match.slice(1, -1), arg;
9251
9242
 
9252
9243
  if (index + 2 < templateArgs.length) {
9253
- arg = templateArgs[index + 2];
9254
- if (typeof arg === 'function') {
9255
- return arg.toString().replace(/ ?\{[\s\S]*$/, '');
9256
- } else if (typeof arg === 'undefined') {
9257
- return 'undefined';
9258
- } else if (typeof arg !== 'string') {
9259
- return toJson(arg);
9260
- }
9261
- return arg;
9244
+ return toDebugString(templateArgs[index + 2]);
9262
9245
  }
9263
9246
  return match;
9264
9247
  });
9265
9248
 
9266
- message = message + '\nhttp://errors.angularjs.org/1.3.2/' +
9249
+ message = message + '\nhttp://errors.angularjs.org/1.3.3/' +
9267
9250
  (module ? module + '/' : '') + code;
9268
9251
  for (i = 2; i < arguments.length; i++) {
9269
- message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
9270
- encodeURIComponent(stringify(arguments[i]));
9252
+ message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
9253
+ encodeURIComponent(toDebugString(arguments[i]));
9271
9254
  }
9272
9255
  return new ErrorConstructor(message);
9273
9256
  };
@@ -9907,7 +9890,7 @@ function includes(array, obj) {
9907
9890
 
9908
9891
  function arrayRemove(array, value) {
9909
9892
  var index = array.indexOf(value);
9910
- if (index >=0)
9893
+ if (index >= 0)
9911
9894
  array.splice(index, 1);
9912
9895
  return value;
9913
9896
  }
@@ -10108,7 +10091,7 @@ function equals(o1, o2) {
10108
10091
  if (isArray(o1)) {
10109
10092
  if (!isArray(o2)) return false;
10110
10093
  if ((length = o1.length) == o2.length) {
10111
- for (key=0; key<length; key++) {
10094
+ for (key = 0; key < length; key++) {
10112
10095
  if (!equals(o1[key], o2[key])) return false;
10113
10096
  }
10114
10097
  return true;
@@ -10194,7 +10177,7 @@ function bind(self, fn) {
10194
10177
  return curryArgs.length
10195
10178
  ? function() {
10196
10179
  return arguments.length
10197
- ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))
10180
+ ? fn.apply(self, concat(curryArgs, arguments, 0))
10198
10181
  : fn.apply(self, curryArgs);
10199
10182
  }
10200
10183
  : function() {
@@ -10394,7 +10377,7 @@ var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];
10394
10377
  function getNgAttribute(element, ngAttr) {
10395
10378
  var attr, i, ii = ngAttrPrefixes.length;
10396
10379
  element = jqLite(element);
10397
- for (i=0; i<ii; ++i) {
10380
+ for (i = 0; i < ii; ++i) {
10398
10381
  attr = ngAttrPrefixes[i] + ngAttr;
10399
10382
  if (isString(attr = element.attr(attr))) {
10400
10383
  return attr;
@@ -11179,6 +11162,34 @@ function setupModuleLoader(window) {
11179
11162
 
11180
11163
  }
11181
11164
 
11165
+ /* global: toDebugString: true */
11166
+
11167
+ function serializeObject(obj) {
11168
+ var seen = [];
11169
+
11170
+ return JSON.stringify(obj, function(key, val) {
11171
+ val = toJsonReplacer(key, val);
11172
+ if (isObject(val)) {
11173
+
11174
+ if (seen.indexOf(val) >= 0) return '<<already seen>>';
11175
+
11176
+ seen.push(val);
11177
+ }
11178
+ return val;
11179
+ });
11180
+ }
11181
+
11182
+ function toDebugString(obj) {
11183
+ if (typeof obj === 'function') {
11184
+ return obj.toString().replace(/ \{[\s\S]*$/, '');
11185
+ } else if (typeof obj === 'undefined') {
11186
+ return 'undefined';
11187
+ } else if (typeof obj !== 'string') {
11188
+ return serializeObject(obj);
11189
+ }
11190
+ return obj;
11191
+ }
11192
+
11182
11193
  /* global angularModule: true,
11183
11194
  version: true,
11184
11195
 
@@ -11281,11 +11292,11 @@ function setupModuleLoader(window) {
11281
11292
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11282
11293
  */
11283
11294
  var version = {
11284
- full: '1.3.2', // all of these placeholder strings will be replaced by grunt's
11295
+ full: '1.3.3', // all of these placeholder strings will be replaced by grunt's
11285
11296
  major: 1, // package task
11286
11297
  minor: 3,
11287
- dot: 2,
11288
- codeName: 'cardiovasculatory-magnification'
11298
+ dot: 3,
11299
+ codeName: 'undersea-arithmetic'
11289
11300
  };
11290
11301
 
11291
11302
 
@@ -12018,7 +12029,7 @@ forEach({
12018
12029
  }
12019
12030
  } else {
12020
12031
  return (element[name] ||
12021
- (element.attributes.getNamedItem(name)|| noop).specified)
12032
+ (element.attributes.getNamedItem(name) || noop).specified)
12022
12033
  ? lowercasedName
12023
12034
  : undefined;
12024
12035
  }
@@ -13354,7 +13365,7 @@ function $AnchorScrollProvider() {
13354
13365
  * @name $anchorScrollProvider#disableAutoScrolling
13355
13366
  *
13356
13367
  * @description
13357
- * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically will detect changes to
13368
+ * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to
13358
13369
  * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.<br />
13359
13370
  * Use this method to disable automatic scrolling.
13360
13371
  *
@@ -14003,8 +14014,7 @@ function $$AsyncCallbackProvider() {
14003
14014
  /**
14004
14015
  * @param {object} window The global window object.
14005
14016
  * @param {object} document jQuery wrapped document.
14006
- * @param {function()} XHR XMLHttpRequest constructor.
14007
- * @param {object} $log console.log or an object with the same interface.
14017
+ * @param {object} $log window.console or an object with the same interface.
14008
14018
  * @param {object} $sniffer $sniffer service
14009
14019
  */
14010
14020
  function Browser(window, document, $log, $sniffer) {
@@ -14354,8 +14364,8 @@ function Browser(window, document, $log, $sniffer) {
14354
14364
  // - 20 cookies per unique domain
14355
14365
  // - 4096 bytes per cookie
14356
14366
  if (cookieLength > 4096) {
14357
- $log.warn("Cookie '"+ name +
14358
- "' possibly not set or overflowed because it was too large ("+
14367
+ $log.warn("Cookie '" + name +
14368
+ "' possibly not set or overflowed because it was too large (" +
14359
14369
  cookieLength + " > 4096 bytes)!");
14360
14370
  }
14361
14371
  }
@@ -15020,7 +15030,7 @@ function $TemplateCacheProvider() {
15020
15030
  *
15021
15031
  *
15022
15032
  * #### `bindToController`
15023
- * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController` will
15033
+ * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController: true` will
15024
15034
  * allow a component to have its properties bound to the controller, rather than to scope. When the controller
15025
15035
  * is instantiated, the initial values of the isolate scope bindings are already available.
15026
15036
  *
@@ -15869,16 +15879,16 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15869
15879
 
15870
15880
  // for each tuples
15871
15881
  var nbrUrisWith2parts = Math.floor(rawUris.length / 2);
15872
- for (var i=0; i<nbrUrisWith2parts; i++) {
15873
- var innerIdx = i*2;
15882
+ for (var i = 0; i < nbrUrisWith2parts; i++) {
15883
+ var innerIdx = i * 2;
15874
15884
  // sanitize the uri
15875
15885
  result += $$sanitizeUri(trim(rawUris[innerIdx]), true);
15876
15886
  // add the descriptor
15877
- result += (" " + trim(rawUris[innerIdx+1]));
15887
+ result += (" " + trim(rawUris[innerIdx + 1]));
15878
15888
  }
15879
15889
 
15880
15890
  // split the last item into uri and descriptor
15881
- var lastTuple = trim(rawUris[i*2]).split(/\s/);
15891
+ var lastTuple = trim(rawUris[i * 2]).split(/\s/);
15882
15892
 
15883
15893
  // sanitize the last uri
15884
15894
  result += $$sanitizeUri(trim(lastTuple[0]), true);
@@ -16072,7 +16082,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16072
16082
  if (!node) {
16073
16083
  return 'html';
16074
16084
  } else {
16075
- return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg': 'html';
16085
+ return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg' : 'html';
16076
16086
  }
16077
16087
  }
16078
16088
 
@@ -16885,7 +16895,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16885
16895
  var match = null;
16886
16896
  if (hasDirectives.hasOwnProperty(name)) {
16887
16897
  for (var directive, directives = $injector.get(name + Suffix),
16888
- i = 0, ii = directives.length; i<ii; i++) {
16898
+ i = 0, ii = directives.length; i < ii; i++) {
16889
16899
  try {
16890
16900
  directive = directives[i];
16891
16901
  if ((maxPriority === undefined || maxPriority > directive.priority) &&
@@ -16914,7 +16924,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16914
16924
  function directiveIsMultiElement(name) {
16915
16925
  if (hasDirectives.hasOwnProperty(name)) {
16916
16926
  for (var directive, directives = $injector.get(name + Suffix),
16917
- i = 0, ii = directives.length; i<ii; i++) {
16927
+ i = 0, ii = directives.length; i < ii; i++) {
16918
16928
  directive = directives[i];
16919
16929
  if (directive.multiElement) {
16920
16930
  return true;
@@ -17133,7 +17143,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
17133
17143
  case 'svg':
17134
17144
  case 'math':
17135
17145
  var wrapper = document.createElement('div');
17136
- wrapper.innerHTML = '<'+type+'>'+template+'</'+type+'>';
17146
+ wrapper.innerHTML = '<' + type + '>' + template + '</' + type + '>';
17137
17147
  return wrapper.childNodes[0].childNodes;
17138
17148
  default:
17139
17149
  return template;
@@ -17490,6 +17500,10 @@ function $ControllerProvider() {
17490
17500
  * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global
17491
17501
  * `window` object (not recommended)
17492
17502
  *
17503
+ * The string can use the `controller as property` syntax, where the controller instance is published
17504
+ * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this
17505
+ * to work correctly.
17506
+ *
17493
17507
  * @param {Object} locals Injection locals for Controller.
17494
17508
  * @return {Object} Instance of given controller.
17495
17509
  *
@@ -17664,7 +17678,7 @@ function defaultHttpResponseTransform(data, headers) {
17664
17678
  // strip json vulnerability protection prefix
17665
17679
  data = data.replace(JSON_PROTECTION_PREFIX, '');
17666
17680
  var contentType = headers('Content-Type');
17667
- if ((contentType && contentType.indexOf(APPLICATION_JSON) === 0) ||
17681
+ if ((contentType && contentType.indexOf(APPLICATION_JSON) === 0 && data.trim()) ||
17668
17682
  (JSON_START.test(data) && JSON_END.test(data))) {
17669
17683
  data = fromJson(data);
17670
17684
  }
@@ -19235,7 +19249,8 @@ function $InterpolateProvider() {
19235
19249
 
19236
19250
  function parseStringifyInterceptor(value) {
19237
19251
  try {
19238
- return stringify(getValue(value));
19252
+ value = getValue(value);
19253
+ return allOrNothing && !isDefined(value) ? value : stringify(value);
19239
19254
  } catch (err) {
19240
19255
  var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text,
19241
19256
  err.toString());
@@ -19559,8 +19574,8 @@ function encodePath(path) {
19559
19574
  return segments.join('/');
19560
19575
  }
19561
19576
 
19562
- function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {
19563
- var parsedUrl = urlResolve(absoluteUrl, appBase);
19577
+ function parseAbsoluteUrl(absoluteUrl, locationObj) {
19578
+ var parsedUrl = urlResolve(absoluteUrl);
19564
19579
 
19565
19580
  locationObj.$$protocol = parsedUrl.protocol;
19566
19581
  locationObj.$$host = parsedUrl.hostname;
@@ -19568,12 +19583,12 @@ function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {
19568
19583
  }
19569
19584
 
19570
19585
 
19571
- function parseAppUrl(relativeUrl, locationObj, appBase) {
19586
+ function parseAppUrl(relativeUrl, locationObj) {
19572
19587
  var prefixed = (relativeUrl.charAt(0) !== '/');
19573
19588
  if (prefixed) {
19574
19589
  relativeUrl = '/' + relativeUrl;
19575
19590
  }
19576
- var match = urlResolve(relativeUrl, appBase);
19591
+ var match = urlResolve(relativeUrl);
19577
19592
  locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?
19578
19593
  match.pathname.substring(1) : match.pathname);
19579
19594
  locationObj.$$search = parseKeyValue(match.search);
@@ -19628,7 +19643,7 @@ function LocationHtml5Url(appBase, basePrefix) {
19628
19643
  this.$$html5 = true;
19629
19644
  basePrefix = basePrefix || '';
19630
19645
  var appBaseNoFile = stripFile(appBase);
19631
- parseAbsoluteUrl(appBase, this, appBase);
19646
+ parseAbsoluteUrl(appBase, this);
19632
19647
 
19633
19648
 
19634
19649
  /**
@@ -19643,7 +19658,7 @@ function LocationHtml5Url(appBase, basePrefix) {
19643
19658
  appBaseNoFile);
19644
19659
  }
19645
19660
 
19646
- parseAppUrl(pathUrl, this, appBase);
19661
+ parseAppUrl(pathUrl, this);
19647
19662
 
19648
19663
  if (!this.$$path) {
19649
19664
  this.$$path = '/';
@@ -19706,7 +19721,7 @@ function LocationHtml5Url(appBase, basePrefix) {
19706
19721
  function LocationHashbangUrl(appBase, hashPrefix) {
19707
19722
  var appBaseNoFile = stripFile(appBase);
19708
19723
 
19709
- parseAbsoluteUrl(appBase, this, appBase);
19724
+ parseAbsoluteUrl(appBase, this);
19710
19725
 
19711
19726
 
19712
19727
  /**
@@ -19726,7 +19741,7 @@ function LocationHashbangUrl(appBase, hashPrefix) {
19726
19741
  throw $locationMinErr('ihshprfx', 'Invalid url "{0}", missing hash prefix "{1}".', url,
19727
19742
  hashPrefix);
19728
19743
  }
19729
- parseAppUrl(withoutHashUrl, this, appBase);
19744
+ parseAppUrl(withoutHashUrl, this);
19730
19745
 
19731
19746
  this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);
19732
19747
 
@@ -20366,11 +20381,19 @@ function $LocationProvider() {
20366
20381
  $rootScope.$evalAsync(function() {
20367
20382
  var oldUrl = $location.absUrl();
20368
20383
  var oldState = $location.$$state;
20384
+ var defaultPrevented;
20369
20385
 
20370
20386
  $location.$$parse(newUrl);
20371
20387
  $location.$$state = newState;
20372
- if ($rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
20373
- newState, oldState).defaultPrevented) {
20388
+
20389
+ defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
20390
+ newState, oldState).defaultPrevented;
20391
+
20392
+ // if the location was changed by a `$locationChangeStart` handler then stop
20393
+ // processing this location change
20394
+ if ($location.absUrl() !== newUrl) return;
20395
+
20396
+ if (defaultPrevented) {
20374
20397
  $location.$$parse(oldUrl);
20375
20398
  $location.$$state = oldState;
20376
20399
  setBrowserUrlWithFallback(oldUrl, false, oldState);
@@ -20394,13 +20417,20 @@ function $LocationProvider() {
20394
20417
  initializing = false;
20395
20418
 
20396
20419
  $rootScope.$evalAsync(function() {
20397
- if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl,
20398
- $location.$$state, oldState).defaultPrevented) {
20420
+ var newUrl = $location.absUrl();
20421
+ var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
20422
+ $location.$$state, oldState).defaultPrevented;
20423
+
20424
+ // if the location was changed by a `$locationChangeStart` handler then stop
20425
+ // processing this location change
20426
+ if ($location.absUrl() !== newUrl) return;
20427
+
20428
+ if (defaultPrevented) {
20399
20429
  $location.$$parse(oldUrl);
20400
20430
  $location.$$state = oldState;
20401
20431
  } else {
20402
20432
  if (urlOrStateChanged) {
20403
- setBrowserUrlWithFallback($location.absUrl(), currentReplace,
20433
+ setBrowserUrlWithFallback(newUrl, currentReplace,
20404
20434
  oldState === $location.$$state ? null : $location.$$state);
20405
20435
  }
20406
20436
  afterLocationChange(oldUrl, oldState);
@@ -20590,7 +20620,7 @@ var $parseMinErr = minErr('$parse');
20590
20620
  // Sandboxing Angular Expressions
20591
20621
  // ------------------------------
20592
20622
  // Angular expressions are generally considered safe because these expressions only have direct
20593
- // access to $scope and locals. However, one can obtain the ability to execute arbitrary JS code by
20623
+ // access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by
20594
20624
  // obtaining a reference to native JS functions such as the Function constructor.
20595
20625
  //
20596
20626
  // As an example, consider the following Angular expression:
@@ -20599,7 +20629,7 @@ var $parseMinErr = minErr('$parse');
20599
20629
  //
20600
20630
  // This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits
20601
20631
  // against the expression language, but not to prevent exploits that were enabled by exposing
20602
- // sensitive JavaScript or browser apis on Scope. Exposing such objects on a Scope is never a good
20632
+ // sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good
20603
20633
  // practice and therefore we are not even trying to protect against interaction with an object
20604
20634
  // explicitly exposed in this way.
20605
20635
  //
@@ -20607,6 +20637,8 @@ var $parseMinErr = minErr('$parse');
20607
20637
  // window or some DOM object that has a reference to window is published onto a Scope.
20608
20638
  // Similarly we prevent invocations of function known to be dangerous, as well as assignments to
20609
20639
  // native objects.
20640
+ //
20641
+ // See https://docs.angularjs.org/guide/security
20610
20642
 
20611
20643
 
20612
20644
  function ensureSafeMemberName(name, fullExpression) {
@@ -20615,7 +20647,7 @@ function ensureSafeMemberName(name, fullExpression) {
20615
20647
  || name === "__proto__") {
20616
20648
  throw $parseMinErr('isecfld',
20617
20649
  'Attempting to access a disallowed field in Angular expressions! '
20618
- +'Expression: {0}', fullExpression);
20650
+ + 'Expression: {0}', fullExpression);
20619
20651
  }
20620
20652
  return name;
20621
20653
  }
@@ -20692,24 +20724,24 @@ var OPERATORS = extend(createMap(), {
20692
20724
  }
20693
20725
  return a;
20694
20726
  }
20695
- return isDefined(b)?b:undefined;},
20727
+ return isDefined(b) ? b : undefined;},
20696
20728
  '-':function(self, locals, a, b) {
20697
20729
  a=a(self, locals); b=b(self, locals);
20698
- return (isDefined(a)?a:0)-(isDefined(b)?b:0);
20730
+ return (isDefined(a) ? a : 0) - (isDefined(b) ? b : 0);
20699
20731
  },
20700
- '*':function(self, locals, a, b) {return a(self, locals)*b(self, locals);},
20701
- '/':function(self, locals, a, b) {return a(self, locals)/b(self, locals);},
20702
- '%':function(self, locals, a, b) {return a(self, locals)%b(self, locals);},
20703
- '===':function(self, locals, a, b) {return a(self, locals)===b(self, locals);},
20704
- '!==':function(self, locals, a, b) {return a(self, locals)!==b(self, locals);},
20705
- '==':function(self, locals, a, b) {return a(self, locals)==b(self, locals);},
20706
- '!=':function(self, locals, a, b) {return a(self, locals)!=b(self, locals);},
20707
- '<':function(self, locals, a, b) {return a(self, locals)<b(self, locals);},
20708
- '>':function(self, locals, a, b) {return a(self, locals)>b(self, locals);},
20709
- '<=':function(self, locals, a, b) {return a(self, locals)<=b(self, locals);},
20710
- '>=':function(self, locals, a, b) {return a(self, locals)>=b(self, locals);},
20711
- '&&':function(self, locals, a, b) {return a(self, locals)&&b(self, locals);},
20712
- '||':function(self, locals, a, b) {return a(self, locals)||b(self, locals);},
20732
+ '*':function(self, locals, a, b) {return a(self, locals) * b(self, locals);},
20733
+ '/':function(self, locals, a, b) {return a(self, locals) / b(self, locals);},
20734
+ '%':function(self, locals, a, b) {return a(self, locals) % b(self, locals);},
20735
+ '===':function(self, locals, a, b) {return a(self, locals) === b(self, locals);},
20736
+ '!==':function(self, locals, a, b) {return a(self, locals) !== b(self, locals);},
20737
+ '==':function(self, locals, a, b) {return a(self, locals) == b(self, locals);},
20738
+ '!=':function(self, locals, a, b) {return a(self, locals) != b(self, locals);},
20739
+ '<':function(self, locals, a, b) {return a(self, locals) < b(self, locals);},
20740
+ '>':function(self, locals, a, b) {return a(self, locals) > b(self, locals);},
20741
+ '<=':function(self, locals, a, b) {return a(self, locals) <= b(self, locals);},
20742
+ '>=':function(self, locals, a, b) {return a(self, locals) >= b(self, locals);},
20743
+ '&&':function(self, locals, a, b) {return a(self, locals) && b(self, locals);},
20744
+ '||':function(self, locals, a, b) {return a(self, locals) || b(self, locals);},
20713
20745
  '!':function(self, locals, a) {return !a(self, locals);},
20714
20746
 
20715
20747
  //Tokenized as operators but parsed as assignment/filters
@@ -20735,44 +20767,31 @@ Lexer.prototype = {
20735
20767
  lex: function(text) {
20736
20768
  this.text = text;
20737
20769
  this.index = 0;
20738
- this.ch = undefined;
20739
20770
  this.tokens = [];
20740
20771
 
20741
20772
  while (this.index < this.text.length) {
20742
- this.ch = this.text.charAt(this.index);
20743
- if (this.is('"\'')) {
20744
- this.readString(this.ch);
20745
- } else if (this.isNumber(this.ch) || this.is('.') && this.isNumber(this.peek())) {
20773
+ var ch = this.text.charAt(this.index);
20774
+ if (ch === '"' || ch === "'") {
20775
+ this.readString(ch);
20776
+ } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) {
20746
20777
  this.readNumber();
20747
- } else if (this.isIdent(this.ch)) {
20778
+ } else if (this.isIdent(ch)) {
20748
20779
  this.readIdent();
20749
- } else if (this.is('(){}[].,;:?')) {
20750
- this.tokens.push({
20751
- index: this.index,
20752
- text: this.ch
20753
- });
20780
+ } else if (this.is(ch, '(){}[].,;:?')) {
20781
+ this.tokens.push({index: this.index, text: ch});
20754
20782
  this.index++;
20755
- } else if (this.isWhitespace(this.ch)) {
20783
+ } else if (this.isWhitespace(ch)) {
20756
20784
  this.index++;
20757
20785
  } else {
20758
- var ch2 = this.ch + this.peek();
20786
+ var ch2 = ch + this.peek();
20759
20787
  var ch3 = ch2 + this.peek(2);
20760
- var fn = OPERATORS[this.ch];
20761
- var fn2 = OPERATORS[ch2];
20762
- var fn3 = OPERATORS[ch3];
20763
- if (fn3) {
20764
- this.tokens.push({index: this.index, text: ch3, fn: fn3});
20765
- this.index += 3;
20766
- } else if (fn2) {
20767
- this.tokens.push({index: this.index, text: ch2, fn: fn2});
20768
- this.index += 2;
20769
- } else if (fn) {
20770
- this.tokens.push({
20771
- index: this.index,
20772
- text: this.ch,
20773
- fn: fn
20774
- });
20775
- this.index += 1;
20788
+ var op1 = OPERATORS[ch];
20789
+ var op2 = OPERATORS[ch2];
20790
+ var op3 = OPERATORS[ch3];
20791
+ if (op1 || op2 || op3) {
20792
+ var token = op3 ? ch3 : (op2 ? ch2 : ch);
20793
+ this.tokens.push({index: this.index, text: token, operator: true});
20794
+ this.index += token.length;
20776
20795
  } else {
20777
20796
  this.throwError('Unexpected next character ', this.index, this.index + 1);
20778
20797
  }
@@ -20781,8 +20800,8 @@ Lexer.prototype = {
20781
20800
  return this.tokens;
20782
20801
  },
20783
20802
 
20784
- is: function(chars) {
20785
- return chars.indexOf(this.ch) !== -1;
20803
+ is: function(ch, chars) {
20804
+ return chars.indexOf(ch) !== -1;
20786
20805
  },
20787
20806
 
20788
20807
  peek: function(i) {
@@ -20791,7 +20810,7 @@ Lexer.prototype = {
20791
20810
  },
20792
20811
 
20793
20812
  isNumber: function(ch) {
20794
- return ('0' <= ch && ch <= '9');
20813
+ return ('0' <= ch && ch <= '9') && typeof ch === "string";
20795
20814
  },
20796
20815
 
20797
20816
  isWhitespace: function(ch) {
@@ -20844,79 +20863,28 @@ Lexer.prototype = {
20844
20863
  }
20845
20864
  this.index++;
20846
20865
  }
20847
- number = 1 * number;
20848
20866
  this.tokens.push({
20849
20867
  index: start,
20850
20868
  text: number,
20851
20869
  constant: true,
20852
- fn: function() { return number; }
20870
+ value: Number(number)
20853
20871
  });
20854
20872
  },
20855
20873
 
20856
20874
  readIdent: function() {
20857
- var expression = this.text;
20858
-
20859
- var ident = '';
20860
20875
  var start = this.index;
20861
-
20862
- var lastDot, peekIndex, methodName, ch;
20863
-
20864
20876
  while (this.index < this.text.length) {
20865
- ch = this.text.charAt(this.index);
20866
- if (ch === '.' || this.isIdent(ch) || this.isNumber(ch)) {
20867
- if (ch === '.') lastDot = this.index;
20868
- ident += ch;
20869
- } else {
20877
+ var ch = this.text.charAt(this.index);
20878
+ if (!(this.isIdent(ch) || this.isNumber(ch))) {
20870
20879
  break;
20871
20880
  }
20872
20881
  this.index++;
20873
20882
  }
20874
-
20875
- //check if the identifier ends with . and if so move back one char
20876
- if (lastDot && ident[ident.length - 1] === '.') {
20877
- this.index--;
20878
- ident = ident.slice(0, -1);
20879
- lastDot = ident.lastIndexOf('.');
20880
- if (lastDot === -1) {
20881
- lastDot = undefined;
20882
- }
20883
- }
20884
-
20885
- //check if this is not a method invocation and if it is back out to last dot
20886
- if (lastDot) {
20887
- peekIndex = this.index;
20888
- while (peekIndex < this.text.length) {
20889
- ch = this.text.charAt(peekIndex);
20890
- if (ch === '(') {
20891
- methodName = ident.substr(lastDot - start + 1);
20892
- ident = ident.substr(0, lastDot - start);
20893
- this.index = peekIndex;
20894
- break;
20895
- }
20896
- if (this.isWhitespace(ch)) {
20897
- peekIndex++;
20898
- } else {
20899
- break;
20900
- }
20901
- }
20902
- }
20903
-
20904
20883
  this.tokens.push({
20905
20884
  index: start,
20906
- text: ident,
20907
- fn: CONSTANTS[ident] || getterFn(ident, this.options, expression)
20885
+ text: this.text.slice(start, this.index),
20886
+ identifier: true
20908
20887
  });
20909
-
20910
- if (methodName) {
20911
- this.tokens.push({
20912
- index: lastDot,
20913
- text: '.'
20914
- });
20915
- this.tokens.push({
20916
- index: lastDot + 1,
20917
- text: methodName
20918
- });
20919
- }
20920
20888
  },
20921
20889
 
20922
20890
  readString: function(quote) {
@@ -20947,9 +20915,8 @@ Lexer.prototype = {
20947
20915
  this.tokens.push({
20948
20916
  index: start,
20949
20917
  text: rawString,
20950
- string: string,
20951
20918
  constant: true,
20952
- fn: function() { return string; }
20919
+ value: string
20953
20920
  });
20954
20921
  return;
20955
20922
  } else {
@@ -21010,16 +20977,12 @@ Parser.prototype = {
21010
20977
  primary = this.arrayDeclaration();
21011
20978
  } else if (this.expect('{')) {
21012
20979
  primary = this.object();
20980
+ } else if (this.peek().identifier) {
20981
+ primary = this.identifier();
20982
+ } else if (this.peek().constant) {
20983
+ primary = this.constant();
21013
20984
  } else {
21014
- var token = this.expect();
21015
- primary = token.fn;
21016
- if (!primary) {
21017
- this.throwError('not a primary expression', token);
21018
- }
21019
- if (token.constant) {
21020
- primary.constant = true;
21021
- primary.literal = true;
21022
- }
20985
+ this.throwError('not a primary expression', this.peek());
21023
20986
  }
21024
20987
 
21025
20988
  var next, context;
@@ -21053,8 +21016,11 @@ Parser.prototype = {
21053
21016
  },
21054
21017
 
21055
21018
  peek: function(e1, e2, e3, e4) {
21056
- if (this.tokens.length > 0) {
21057
- var token = this.tokens[0];
21019
+ return this.peekAhead(0, e1, e2, e3, e4);
21020
+ },
21021
+ peekAhead: function(i, e1, e2, e3, e4) {
21022
+ if (this.tokens.length > i) {
21023
+ var token = this.tokens[i];
21058
21024
  var t = token.text;
21059
21025
  if (t === e1 || t === e2 || t === e3 || t === e4 ||
21060
21026
  (!e1 && !e2 && !e3 && !e4)) {
@@ -21074,12 +21040,19 @@ Parser.prototype = {
21074
21040
  },
21075
21041
 
21076
21042
  consume: function(e1) {
21077
- if (!this.expect(e1)) {
21043
+ if (this.tokens.length === 0) {
21044
+ throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);
21045
+ }
21046
+
21047
+ var token = this.expect(e1);
21048
+ if (!token) {
21078
21049
  this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());
21079
21050
  }
21051
+ return token;
21080
21052
  },
21081
21053
 
21082
- unaryFn: function(fn, right) {
21054
+ unaryFn: function(op, right) {
21055
+ var fn = OPERATORS[op];
21083
21056
  return extend(function $parseUnaryFn(self, locals) {
21084
21057
  return fn(self, locals, right);
21085
21058
  }, {
@@ -21088,7 +21061,8 @@ Parser.prototype = {
21088
21061
  });
21089
21062
  },
21090
21063
 
21091
- binaryFn: function(left, fn, right, isBranching) {
21064
+ binaryFn: function(left, op, right, isBranching) {
21065
+ var fn = OPERATORS[op];
21092
21066
  return extend(function $parseBinaryFn(self, locals) {
21093
21067
  return fn(self, locals, left, right);
21094
21068
  }, {
@@ -21097,6 +21071,28 @@ Parser.prototype = {
21097
21071
  });
21098
21072
  },
21099
21073
 
21074
+ identifier: function() {
21075
+ var id = this.consume().text;
21076
+
21077
+ //Continue reading each `.identifier` unless it is a method invocation
21078
+ while (this.peek('.') && this.peekAhead(1).identifier && !this.peekAhead(2, '(')) {
21079
+ id += this.consume().text + this.consume().text;
21080
+ }
21081
+
21082
+ return CONSTANTS[id] || getterFn(id, this.options, this.text);
21083
+ },
21084
+
21085
+ constant: function() {
21086
+ var value = this.consume().value;
21087
+
21088
+ return extend(function $parseConstant() {
21089
+ return value;
21090
+ }, {
21091
+ constant: true,
21092
+ literal: true
21093
+ });
21094
+ },
21095
+
21100
21096
  statements: function() {
21101
21097
  var statements = [];
21102
21098
  while (true) {
@@ -21128,8 +21124,7 @@ Parser.prototype = {
21128
21124
  },
21129
21125
 
21130
21126
  filter: function(inputFn) {
21131
- var token = this.expect();
21132
- var fn = this.$filter(token.text);
21127
+ var fn = this.$filter(this.consume().text);
21133
21128
  var argsFn;
21134
21129
  var args;
21135
21130
 
@@ -21192,7 +21187,7 @@ Parser.prototype = {
21192
21187
  var token;
21193
21188
  if ((token = this.expect('?'))) {
21194
21189
  middle = this.assignment();
21195
- if ((token = this.expect(':'))) {
21190
+ if (this.consume(':')) {
21196
21191
  var right = this.assignment();
21197
21192
 
21198
21193
  return extend(function $parseTernary(self, locals) {
@@ -21200,9 +21195,6 @@ Parser.prototype = {
21200
21195
  }, {
21201
21196
  constant: left.constant && middle.constant && right.constant
21202
21197
  });
21203
-
21204
- } else {
21205
- this.throwError('expected :', token);
21206
21198
  }
21207
21199
  }
21208
21200
 
@@ -21213,7 +21205,7 @@ Parser.prototype = {
21213
21205
  var left = this.logicalAND();
21214
21206
  var token;
21215
21207
  while ((token = this.expect('||'))) {
21216
- left = this.binaryFn(left, token.fn, this.logicalAND(), true);
21208
+ left = this.binaryFn(left, token.text, this.logicalAND(), true);
21217
21209
  }
21218
21210
  return left;
21219
21211
  },
@@ -21222,7 +21214,7 @@ Parser.prototype = {
21222
21214
  var left = this.equality();
21223
21215
  var token;
21224
21216
  if ((token = this.expect('&&'))) {
21225
- left = this.binaryFn(left, token.fn, this.logicalAND(), true);
21217
+ left = this.binaryFn(left, token.text, this.logicalAND(), true);
21226
21218
  }
21227
21219
  return left;
21228
21220
  },
@@ -21231,7 +21223,7 @@ Parser.prototype = {
21231
21223
  var left = this.relational();
21232
21224
  var token;
21233
21225
  if ((token = this.expect('==','!=','===','!=='))) {
21234
- left = this.binaryFn(left, token.fn, this.equality());
21226
+ left = this.binaryFn(left, token.text, this.equality());
21235
21227
  }
21236
21228
  return left;
21237
21229
  },
@@ -21240,7 +21232,7 @@ Parser.prototype = {
21240
21232
  var left = this.additive();
21241
21233
  var token;
21242
21234
  if ((token = this.expect('<', '>', '<=', '>='))) {
21243
- left = this.binaryFn(left, token.fn, this.relational());
21235
+ left = this.binaryFn(left, token.text, this.relational());
21244
21236
  }
21245
21237
  return left;
21246
21238
  },
@@ -21249,7 +21241,7 @@ Parser.prototype = {
21249
21241
  var left = this.multiplicative();
21250
21242
  var token;
21251
21243
  while ((token = this.expect('+','-'))) {
21252
- left = this.binaryFn(left, token.fn, this.multiplicative());
21244
+ left = this.binaryFn(left, token.text, this.multiplicative());
21253
21245
  }
21254
21246
  return left;
21255
21247
  },
@@ -21258,7 +21250,7 @@ Parser.prototype = {
21258
21250
  var left = this.unary();
21259
21251
  var token;
21260
21252
  while ((token = this.expect('*','/','%'))) {
21261
- left = this.binaryFn(left, token.fn, this.unary());
21253
+ left = this.binaryFn(left, token.text, this.unary());
21262
21254
  }
21263
21255
  return left;
21264
21256
  },
@@ -21268,9 +21260,9 @@ Parser.prototype = {
21268
21260
  if (this.expect('+')) {
21269
21261
  return this.primary();
21270
21262
  } else if ((token = this.expect('-'))) {
21271
- return this.binaryFn(Parser.ZERO, token.fn, this.unary());
21263
+ return this.binaryFn(Parser.ZERO, token.text, this.unary());
21272
21264
  } else if ((token = this.expect('!'))) {
21273
- return this.unaryFn(token.fn, this.unary());
21265
+ return this.unaryFn(token.text, this.unary());
21274
21266
  } else {
21275
21267
  return this.primary();
21276
21268
  }
@@ -21278,7 +21270,7 @@ Parser.prototype = {
21278
21270
 
21279
21271
  fieldAccess: function(object) {
21280
21272
  var expression = this.text;
21281
- var field = this.expect().text;
21273
+ var field = this.consume().text;
21282
21274
  var getter = getterFn(field, this.options, expression);
21283
21275
 
21284
21276
  return extend(function $parseFieldAccess(scope, locals, self) {
@@ -21363,8 +21355,7 @@ Parser.prototype = {
21363
21355
  // Support trailing commas per ES5.1.
21364
21356
  break;
21365
21357
  }
21366
- var elementFn = this.expression();
21367
- elementFns.push(elementFn);
21358
+ elementFns.push(this.expression());
21368
21359
  } while (this.expect(','));
21369
21360
  }
21370
21361
  this.consume(']');
@@ -21390,11 +21381,16 @@ Parser.prototype = {
21390
21381
  // Support trailing commas per ES5.1.
21391
21382
  break;
21392
21383
  }
21393
- var token = this.expect();
21394
- keys.push(token.string || token.text);
21384
+ var token = this.consume();
21385
+ if (token.constant) {
21386
+ keys.push(token.value);
21387
+ } else if (token.identifier) {
21388
+ keys.push(token.text);
21389
+ } else {
21390
+ this.throwError("invalid key", token);
21391
+ }
21395
21392
  this.consume(':');
21396
- var value = this.expression();
21397
- valueFns.push(value);
21393
+ valueFns.push(this.expression());
21398
21394
  } while (this.expect(','));
21399
21395
  }
21400
21396
  this.consume('}');
@@ -21836,13 +21832,21 @@ function $ParseProvider() {
21836
21832
 
21837
21833
  function addInterceptor(parsedExpression, interceptorFn) {
21838
21834
  if (!interceptorFn) return parsedExpression;
21835
+ var watchDelegate = parsedExpression.$$watchDelegate;
21839
21836
 
21840
- var fn = function interceptedExpression(scope, locals) {
21837
+ var regularWatch =
21838
+ watchDelegate !== oneTimeLiteralWatchDelegate &&
21839
+ watchDelegate !== oneTimeWatchDelegate;
21840
+
21841
+ var fn = regularWatch ? function regularInterceptedExpression(scope, locals) {
21842
+ var value = parsedExpression(scope, locals);
21843
+ return interceptorFn(value, scope, locals);
21844
+ } : function oneTimeInterceptedExpression(scope, locals) {
21841
21845
  var value = parsedExpression(scope, locals);
21842
21846
  var result = interceptorFn(value, scope, locals);
21843
21847
  // we only return the interceptor's result if the
21844
21848
  // initial value is defined (for bind-once)
21845
- return isDefined(value) || interceptorFn.$stateful ? result : value;
21849
+ return isDefined(value) ? result : value;
21846
21850
  };
21847
21851
 
21848
21852
  // Propagate $$watchDelegates other then inputsWatchDelegate
@@ -21867,7 +21871,11 @@ function $ParseProvider() {
21867
21871
  * @requires $rootScope
21868
21872
  *
21869
21873
  * @description
21870
- * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).
21874
+ * A service that helps you run functions asynchronously, and use their return values (or exceptions)
21875
+ * when they are done processing.
21876
+ *
21877
+ * This is an implementation of promises/deferred objects inspired by
21878
+ * [Kris Kowal's Q](https://github.com/kriskowal/q).
21871
21879
  *
21872
21880
  * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred
21873
21881
  * implementations, and the other which resembles ES6 promises to some degree.
@@ -22003,16 +22011,12 @@ function $ParseProvider() {
22003
22011
  *
22004
22012
  * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`
22005
22013
  *
22006
- * - `finally(callback)` – allows you to observe either the fulfillment or rejection of a promise,
22014
+ * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise,
22007
22015
  * but to do so without modifying the final value. This is useful to release resources or do some
22008
22016
  * clean-up that needs to be done whether the promise was rejected or resolved. See the [full
22009
22017
  * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for
22010
22018
  * more information.
22011
22019
  *
22012
- * Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as
22013
- * property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to
22014
- * make your code IE8 and Android 2.x compatible.
22015
- *
22016
22020
  * # Chaining promises
22017
22021
  *
22018
22022
  * Because calling the `then` method of a promise returns a new derived promise, it is easily
@@ -23235,11 +23239,11 @@ function $RootScopeProvider() {
23235
23239
  if (ttl < 5) {
23236
23240
  logIdx = 4 - ttl;
23237
23241
  if (!watchLog[logIdx]) watchLog[logIdx] = [];
23238
- logMsg = (isFunction(watch.exp))
23239
- ? 'fn: ' + (watch.exp.name || watch.exp.toString())
23240
- : watch.exp;
23241
- logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);
23242
- watchLog[logIdx].push(logMsg);
23242
+ watchLog[logIdx].push({
23243
+ msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp,
23244
+ newVal: value,
23245
+ oldVal: last
23246
+ });
23243
23247
  }
23244
23248
  } else if (watch === lastDirtyWatch) {
23245
23249
  // If the most recently dirty watcher is now clean, short circuit since the remaining watchers
@@ -23272,7 +23276,7 @@ function $RootScopeProvider() {
23272
23276
  throw $rootScopeMinErr('infdig',
23273
23277
  '{0} $digest() iterations reached. Aborting!\n' +
23274
23278
  'Watchers fired in the last 5 iterations: {1}',
23275
- TTL, toJson(watchLog));
23279
+ TTL, watchLog);
23276
23280
  }
23277
23281
 
23278
23282
  } while (dirty || asyncQueue.length);
@@ -23623,7 +23627,7 @@ function $RootScopeProvider() {
23623
23627
  do {
23624
23628
  namedListeners = scope.$$listeners[name] || empty;
23625
23629
  event.currentScope = scope;
23626
- for (i=0, length=namedListeners.length; i<length; i++) {
23630
+ for (i = 0, length = namedListeners.length; i < length; i++) {
23627
23631
 
23628
23632
  // if listeners were deregistered, defragment the array
23629
23633
  if (!namedListeners[i]) {
@@ -23697,7 +23701,7 @@ function $RootScopeProvider() {
23697
23701
  while ((current = next)) {
23698
23702
  event.currentScope = current;
23699
23703
  listeners = current.$$listeners[name] || [];
23700
- for (i=0, length = listeners.length; i<length; i++) {
23704
+ for (i = 0, length = listeners.length; i < length; i++) {
23701
23705
  // if listeners were deregistered, defragment the array
23702
23706
  if (!listeners[i]) {
23703
23707
  listeners.splice(i, 1);
@@ -23853,7 +23857,7 @@ function $$SanitizeUriProvider() {
23853
23857
  var normalizedVal;
23854
23858
  normalizedVal = urlResolve(uri).href;
23855
23859
  if (normalizedVal !== '' && !normalizedVal.match(regex)) {
23856
- return 'unsafe:'+normalizedVal;
23860
+ return 'unsafe:' + normalizedVal;
23857
23861
  }
23858
23862
  return uri;
23859
23863
  };
@@ -24952,7 +24956,7 @@ function $SnifferProvider() {
24952
24956
  transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));
24953
24957
  animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));
24954
24958
 
24955
- if (android && (!transitions||!animations)) {
24959
+ if (android && (!transitions || !animations)) {
24956
24960
  transitions = isString(document.body.style.webkitTransition);
24957
24961
  animations = isString(document.body.style.webkitAnimation);
24958
24962
  }
@@ -25023,7 +25027,7 @@ function $TemplateRequestProvider() {
25023
25027
  if (isArray(transformResponse)) {
25024
25028
  var original = transformResponse;
25025
25029
  transformResponse = [];
25026
- for (var i=0; i<original.length; ++i) {
25030
+ for (var i = 0; i < original.length; ++i) {
25027
25031
  var transformer = original[i];
25028
25032
  if (transformer !== defaultHttpResponseTransform) {
25029
25033
  transformResponse.push(transformer);
@@ -25267,7 +25271,7 @@ function $TimeoutProvider() {
25267
25271
  // exactly the behavior needed here. There is little value is mocking these out for this
25268
25272
  // service.
25269
25273
  var urlParsingNode = document.createElement("a");
25270
- var originUrl = urlResolve(window.location.href, true);
25274
+ var originUrl = urlResolve(window.location.href);
25271
25275
 
25272
25276
 
25273
25277
  /**
@@ -25322,7 +25326,7 @@ var originUrl = urlResolve(window.location.href, true);
25322
25326
  * | pathname | The pathname, beginning with "/"
25323
25327
  *
25324
25328
  */
25325
- function urlResolve(url, base) {
25329
+ function urlResolve(url) {
25326
25330
  var href = url;
25327
25331
 
25328
25332
  if (msie) {
@@ -25702,8 +25706,8 @@ function filterFilter() {
25702
25706
  }
25703
25707
  return false;
25704
25708
  }
25705
- text = (''+text).toLowerCase();
25706
- return (''+obj).toLowerCase().indexOf(text) > -1;
25709
+ text = ('' + text).toLowerCase();
25710
+ return ('' + obj).toLowerCase().indexOf(text) > -1;
25707
25711
  };
25708
25712
  }
25709
25713
  }
@@ -25963,7 +25967,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
25963
25967
  if (whole.length >= (lgroup + group)) {
25964
25968
  pos = whole.length - lgroup;
25965
25969
  for (i = 0; i < pos; i++) {
25966
- if ((pos - i)%group === 0 && i !== 0) {
25970
+ if ((pos - i) % group === 0 && i !== 0) {
25967
25971
  formatedText += groupSep;
25968
25972
  }
25969
25973
  formatedText += whole.charAt(i);
@@ -25971,7 +25975,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
25971
25975
  }
25972
25976
 
25973
25977
  for (i = pos; i < whole.length; i++) {
25974
- if ((whole.length - i)%lgroup === 0 && i !== 0) {
25978
+ if ((whole.length - i) % lgroup === 0 && i !== 0) {
25975
25979
  formatedText += groupSep;
25976
25980
  }
25977
25981
  formatedText += whole.charAt(i);
@@ -26211,10 +26215,10 @@ function dateFilter($locale) {
26211
26215
  tzMin = int(match[9] + match[11]);
26212
26216
  }
26213
26217
  dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));
26214
- var h = int(match[4]||0) - tzHour;
26215
- var m = int(match[5]||0) - tzMin;
26216
- var s = int(match[6]||0);
26217
- var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000);
26218
+ var h = int(match[4] || 0) - tzHour;
26219
+ var m = int(match[5] || 0) - tzMin;
26220
+ var s = int(match[6] || 0);
26221
+ var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);
26218
26222
  timeSetter.call(date, h, m, s, ms);
26219
26223
  return date;
26220
26224
  }
@@ -26446,7 +26450,7 @@ function limitToFilter() {
26446
26450
  n = input.length;
26447
26451
  }
26448
26452
 
26449
- for (; i<n; i++) {
26453
+ for (; i < n; i++) {
26450
26454
  out.push(input[i]);
26451
26455
  }
26452
26456
 
@@ -26573,7 +26577,7 @@ orderByFilter.$inject = ['$parse'];
26573
26577
  function orderByFilter($parse) {
26574
26578
  return function(array, sortPredicate, reverseOrder) {
26575
26579
  if (!(isArrayLike(array))) return array;
26576
- sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate];
26580
+ sortPredicate = isArray(sortPredicate) ? sortPredicate : [sortPredicate];
26577
26581
  if (sortPredicate.length === 0) { sortPredicate = ['+']; }
26578
26582
  sortPredicate = sortPredicate.map(function(predicate) {
26579
26583
  var descending = false, get = predicate || identity;
@@ -26600,9 +26604,7 @@ function orderByFilter($parse) {
26600
26604
  return compare(get(a),get(b));
26601
26605
  }, descending);
26602
26606
  });
26603
- var arrayCopy = [];
26604
- for (var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }
26605
- return arrayCopy.sort(reverseComparator(comparator, reverseOrder));
26607
+ return slice.call(array).sort(reverseComparator(comparator, reverseOrder));
26606
26608
 
26607
26609
  function comparator(o1, o2) {
26608
26610
  for (var i = 0; i < sortPredicate.length; i++) {
@@ -27664,9 +27666,14 @@ var inputType = {
27664
27666
  * minlength.
27665
27667
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
27666
27668
  * maxlength.
27667
- * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
27668
- * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
27669
- * patterns defined as scope expressions.
27669
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
27670
+ * that contains the regular expression body that will be converted to a regular expression
27671
+ * as in the ngPattern directive.
27672
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
27673
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
27674
+ * If the expression evaluates to a RegExp object then this is used directly.
27675
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
27676
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
27670
27677
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
27671
27678
  * interaction with the input element.
27672
27679
  * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
@@ -28207,9 +28214,14 @@ var inputType = {
28207
28214
  * minlength.
28208
28215
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
28209
28216
  * maxlength.
28210
- * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
28211
- * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
28212
- * patterns defined as scope expressions.
28217
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
28218
+ * that contains the regular expression body that will be converted to a regular expression
28219
+ * as in the ngPattern directive.
28220
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
28221
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
28222
+ * If the expression evaluates to a RegExp object then this is used directly.
28223
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
28224
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
28213
28225
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
28214
28226
  * interaction with the input element.
28215
28227
  *
@@ -28289,9 +28301,14 @@ var inputType = {
28289
28301
  * minlength.
28290
28302
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
28291
28303
  * maxlength.
28292
- * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
28293
- * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
28294
- * patterns defined as scope expressions.
28304
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
28305
+ * that contains the regular expression body that will be converted to a regular expression
28306
+ * as in the ngPattern directive.
28307
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
28308
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
28309
+ * If the expression evaluates to a RegExp object then this is used directly.
28310
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
28311
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
28295
28312
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
28296
28313
  * interaction with the input element.
28297
28314
  *
@@ -28372,9 +28389,14 @@ var inputType = {
28372
28389
  * minlength.
28373
28390
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
28374
28391
  * maxlength.
28375
- * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
28376
- * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
28377
- * patterns defined as scope expressions.
28392
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
28393
+ * that contains the regular expression body that will be converted to a regular expression
28394
+ * as in the ngPattern directive.
28395
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
28396
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
28397
+ * If the expression evaluates to a RegExp object then this is used directly.
28398
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
28399
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
28378
28400
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
28379
28401
  * interaction with the input element.
28380
28402
  *
@@ -28685,8 +28707,8 @@ function createDateParser(regexp, mapping) {
28685
28707
  // When a date is JSON'ified to wraps itself inside of an extra
28686
28708
  // set of double quotes. This makes the date parsing code unable
28687
28709
  // to match the date string and parse it as a date.
28688
- if (iso.charAt(0) == '"' && iso.charAt(iso.length-1) == '"') {
28689
- iso = iso.substring(1, iso.length-1);
28710
+ if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') {
28711
+ iso = iso.substring(1, iso.length - 1);
28690
28712
  }
28691
28713
  if (ISO_DATE_REGEXP.test(iso)) {
28692
28714
  return new Date(iso);
@@ -29133,12 +29155,17 @@ var VALID_CLASS = 'ng-valid',
29133
29155
  * @property {string} $viewValue Actual string value in the view.
29134
29156
  * @property {*} $modelValue The value in the model that the control is bound to.
29135
29157
  * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever
29136
- the control reads value from the DOM. The functions are called in array order, each passing the value
29137
- through to the next. The last return value is forwarded to the $validators collection.
29138
- Used to sanitize / convert the value.
29139
- Returning undefined from a parser means a parse error occurred. No $validators will
29140
- run and the 'ngModel' will not be updated until the parse error is resolved. The parse error is stored
29141
- in 'ngModel.$error.parse'.
29158
+ the control reads value from the DOM. The functions are called in array order, each passing
29159
+ its return value through to the next. The last return value is forwarded to the
29160
+ {@link ngModel.NgModelController#$validators `$validators`} collection.
29161
+
29162
+ Parsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue
29163
+ `$viewValue`}.
29164
+
29165
+ Returning `undefined` from a parser means a parse error occurred. In that case,
29166
+ no {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel`
29167
+ will be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`}
29168
+ is set to `true`. The parse error is stored in `ngModel.$error.parse`.
29142
29169
 
29143
29170
  *
29144
29171
  * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever
@@ -29263,7 +29290,7 @@ var VALID_CLASS = 'ng-valid',
29263
29290
 
29264
29291
  // Listen for change events to enable binding
29265
29292
  element.on('blur keyup change', function() {
29266
- scope.$apply(read);
29293
+ scope.$evalAsync(read);
29267
29294
  });
29268
29295
  read(); // initialize
29269
29296
 
@@ -30199,7 +30226,7 @@ var patternDirective = function() {
30199
30226
  var regexp, patternExp = attr.ngPattern || attr.pattern;
30200
30227
  attr.$observe('pattern', function(regex) {
30201
30228
  if (isString(regex) && regex.length > 0) {
30202
- regex = new RegExp(regex);
30229
+ regex = new RegExp('^' + regex + '$');
30203
30230
  }
30204
30231
 
30205
30232
  if (regex && !regex.test) {
@@ -30490,7 +30517,7 @@ var ngValueDirective = function() {
30490
30517
  * `ngModelOptions` has an effect on the element it's declared on and its descendants.
30491
30518
  *
30492
30519
  * @param {Object} ngModelOptions options to apply to the current model. Valid keys are:
30493
- * - `updateOn`: string specifying which event should be the input bound to. You can set several
30520
+ * - `updateOn`: string specifying which event should the input be bound to. You can set several
30494
30521
  * events using an space delimited list. There is a special event called `default` that
30495
30522
  * matches the default events belonging of the control.
30496
30523
  * - `debounce`: integer value which contains the debounce model update value in milliseconds. A
@@ -33358,7 +33385,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
33358
33385
  });
33359
33386
  throw ngRepeatMinErr('dupes',
33360
33387
  "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}",
33361
- expression, trackById, toJson(value));
33388
+ expression, trackById, value);
33362
33389
  } else {
33363
33390
  // new never before seen block
33364
33391
  nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined};
@@ -34164,7 +34191,7 @@ var ngOptionsMinErr = minErr('ngOptions');
34164
34191
  * In many cases, `ngRepeat` can be used on `<option>` elements instead of `ngOptions` to achieve a
34165
34192
  * similar result. However, the `ngOptions` provides some benefits such as reducing memory and
34166
34193
  * increasing speed by not creating a new scope for each repeated instance, as well as providing
34167
- * more flexibility in how the `select`'s model is assigned via `select as`. `ngOptions should be
34194
+ * more flexibility in how the `select`'s model is assigned via `select as`. `ngOptions` should be
34168
34195
  * used when the `select` model needs to be bound to a non-string value. This is because an option
34169
34196
  * element can only be bound to string values at present.
34170
34197
  *
@@ -34762,13 +34789,14 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
34762
34789
  lastElement = null; // start at the beginning
34763
34790
  for (index = 0, length = optionGroup.length; index < length; index++) {
34764
34791
  option = optionGroup[index];
34765
- if ((existingOption = existingOptions[index+1])) {
34792
+ if ((existingOption = existingOptions[index + 1])) {
34766
34793
  // reuse elements
34767
34794
  lastElement = existingOption.element;
34768
34795
  if (existingOption.label !== option.label) {
34769
34796
  updateLabelMap(labelMap, existingOption.label, false);
34770
34797
  updateLabelMap(labelMap, option.label, true);
34771
34798
  lastElement.text(existingOption.label = option.label);
34799
+ lastElement.prop('label', existingOption.label);
34772
34800
  }
34773
34801
  if (existingOption.id !== option.id) {
34774
34802
  lastElement.val(existingOption.id = option.id);
@@ -34798,6 +34826,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
34798
34826
  .val(option.id)
34799
34827
  .prop('selected', option.selected)
34800
34828
  .attr('selected', option.selected)
34829
+ .prop('label', option.label)
34801
34830
  .text(option.label);
34802
34831
  }
34803
34832
 
@@ -35109,10 +35138,10 @@ function callerFile(offset) {
35109
35138
  if (line) {
35110
35139
  if (line.indexOf('@') !== -1) {
35111
35140
  // Firefox
35112
- line = line.substring(line.indexOf('@')+1);
35141
+ line = line.substring(line.indexOf('@') + 1);
35113
35142
  } else {
35114
35143
  // Chrome
35115
- line = line.substring(line.indexOf('(')+1).replace(')', '');
35144
+ line = line.substring(line.indexOf('(') + 1).replace(')', '');
35116
35145
  }
35117
35146
  }
35118
35147
 
@@ -35196,7 +35225,7 @@ _jQuery.fn.bindings = function(windowJquery, bindExp) {
35196
35225
  var element = windowJquery(this),
35197
35226
  bindings;
35198
35227
  if (bindings = element.data('$binding')) {
35199
- for (var expressions = [], binding, j=0, jj=bindings.length; j<jj; j++) {
35228
+ for (var expressions = [], binding, j=0, jj=bindings.length; j < jj; j++) {
35200
35229
  binding = bindings[j];
35201
35230
 
35202
35231
  if (binding.expressions) {
@@ -35572,7 +35601,7 @@ angular.scenario.Describe.prototype.it = function(name, body) {
35572
35601
  */
35573
35602
  angular.scenario.Describe.prototype.iit = function(name, body) {
35574
35603
  this.it.apply(this, arguments);
35575
- this.its[this.its.length-1].only = true;
35604
+ this.its[this.its.length - 1].only = true;
35576
35605
  };
35577
35606
 
35578
35607
  /**
@@ -35884,7 +35913,7 @@ angular.scenario.ObjectModel.Spec.prototype.addStep = function(name) {
35884
35913
  * @return {Object} the step
35885
35914
  */
35886
35915
  angular.scenario.ObjectModel.Spec.prototype.getLastStep = function() {
35887
- return this.steps[this.steps.length-1];
35916
+ return this.steps[this.steps.length - 1];
35888
35917
  };
35889
35918
 
35890
35919
  /**
@@ -36459,7 +36488,7 @@ angular.scenario.dsl('expect', function() {
36459
36488
  */
36460
36489
  angular.scenario.dsl('using', function() {
36461
36490
  return function(selector, label) {
36462
- this.selector = _jQuery.trim((this.selector||'') + ' ' + selector);
36491
+ this.selector = _jQuery.trim((this.selector || '') + ' ' + selector);
36463
36492
  if (angular.isString(label) && label.length) {
36464
36493
  this.label = label + ' ( ' + this.selector + ' )';
36465
36494
  } else {