solidus_backend 3.2.9 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,1548 +1,2042 @@
1
- // Underscore.js 1.8.3
2
- // http://underscorejs.org
3
- // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
4
- // Underscore may be freely distributed under the MIT license.
1
+ (function (global, factory) {
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
+ typeof define === 'function' && define.amd ? define('underscore', factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {
5
+ var current = global._;
6
+ var exports = global._ = factory();
7
+ exports.noConflict = function () { global._ = current; return exports; };
8
+ }()));
9
+ }(this, (function () {
10
+ // Underscore.js 1.13.6
11
+ // https://underscorejs.org
12
+ // (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
13
+ // Underscore may be freely distributed under the MIT license.
5
14
 
6
- (function() {
7
-
8
- // Baseline setup
9
- // --------------
10
-
11
- // Establish the root object, `window` in the browser, or `exports` on the server.
12
- var root = this;
15
+ // Current version.
16
+ var VERSION = '1.13.6';
13
17
 
14
- // Save the previous value of the `_` variable.
15
- var previousUnderscore = root._;
18
+ // Establish the root object, `window` (`self`) in the browser, `global`
19
+ // on the server, or `this` in some virtual machines. We use `self`
20
+ // instead of `window` for `WebWorker` support.
21
+ var root = (typeof self == 'object' && self.self === self && self) ||
22
+ (typeof global == 'object' && global.global === global && global) ||
23
+ Function('return this')() ||
24
+ {};
16
25
 
17
26
  // Save bytes in the minified (but not gzipped) version:
18
- var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
27
+ var ArrayProto = Array.prototype, ObjProto = Object.prototype;
28
+ var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
19
29
 
20
30
  // Create quick reference variables for speed access to core prototypes.
21
- var
22
- push = ArrayProto.push,
23
- slice = ArrayProto.slice,
24
- toString = ObjProto.toString,
25
- hasOwnProperty = ObjProto.hasOwnProperty;
31
+ var push = ArrayProto.push,
32
+ slice = ArrayProto.slice,
33
+ toString = ObjProto.toString,
34
+ hasOwnProperty = ObjProto.hasOwnProperty;
35
+
36
+ // Modern feature detection.
37
+ var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
38
+ supportsDataView = typeof DataView !== 'undefined';
26
39
 
27
- // All **ECMAScript 5** native function implementations that we hope to use
40
+ // All **ECMAScript 5+** native function implementations that we hope to use
28
41
  // are declared here.
29
- var
30
- nativeIsArray = Array.isArray,
31
- nativeKeys = Object.keys,
32
- nativeBind = FuncProto.bind,
33
- nativeCreate = Object.create;
34
-
35
- // Naked function reference for surrogate-prototype-swapping.
36
- var Ctor = function(){};
37
-
38
- // Create a safe reference to the Underscore object for use below.
39
- var _ = function(obj) {
40
- if (obj instanceof _) return obj;
41
- if (!(this instanceof _)) return new _(obj);
42
- this._wrapped = obj;
43
- };
42
+ var nativeIsArray = Array.isArray,
43
+ nativeKeys = Object.keys,
44
+ nativeCreate = Object.create,
45
+ nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
44
46
 
45
- // Export the Underscore object for **Node.js**, with
46
- // backwards-compatibility for the old `require()` API. If we're in
47
- // the browser, add `_` as a global object.
48
- if (typeof exports !== 'undefined') {
49
- if (typeof module !== 'undefined' && module.exports) {
50
- exports = module.exports = _;
51
- }
52
- exports._ = _;
53
- } else {
54
- root._ = _;
55
- }
47
+ // Create references to these builtin functions because we override them.
48
+ var _isNaN = isNaN,
49
+ _isFinite = isFinite;
56
50
 
57
- // Current version.
58
- _.VERSION = '1.8.3';
51
+ // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
52
+ var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
53
+ var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
54
+ 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
59
55
 
60
- // Internal function that returns an efficient (for current engines) version
61
- // of the passed-in callback, to be repeatedly applied in other Underscore
62
- // functions.
63
- var optimizeCb = function(func, context, argCount) {
64
- if (context === void 0) return func;
65
- switch (argCount == null ? 3 : argCount) {
66
- case 1: return function(value) {
67
- return func.call(context, value);
68
- };
69
- case 2: return function(value, other) {
70
- return func.call(context, value, other);
71
- };
72
- case 3: return function(value, index, collection) {
73
- return func.call(context, value, index, collection);
74
- };
75
- case 4: return function(accumulator, value, index, collection) {
76
- return func.call(context, accumulator, value, index, collection);
77
- };
78
- }
56
+ // The largest integer that can be represented exactly.
57
+ var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
58
+
59
+ // Some functions take a variable number of arguments, or a few expected
60
+ // arguments at the beginning and then a variable number of values to operate
61
+ // on. This helper accumulates all remaining arguments past the function’s
62
+ // argument length (or an explicit `startIndex`), into an array that becomes
63
+ // the last argument. Similar to ES6’s "rest parameter".
64
+ function restArguments(func, startIndex) {
65
+ startIndex = startIndex == null ? func.length - 1 : +startIndex;
79
66
  return function() {
80
- return func.apply(context, arguments);
67
+ var length = Math.max(arguments.length - startIndex, 0),
68
+ rest = Array(length),
69
+ index = 0;
70
+ for (; index < length; index++) {
71
+ rest[index] = arguments[index + startIndex];
72
+ }
73
+ switch (startIndex) {
74
+ case 0: return func.call(this, rest);
75
+ case 1: return func.call(this, arguments[0], rest);
76
+ case 2: return func.call(this, arguments[0], arguments[1], rest);
77
+ }
78
+ var args = Array(startIndex + 1);
79
+ for (index = 0; index < startIndex; index++) {
80
+ args[index] = arguments[index];
81
+ }
82
+ args[startIndex] = rest;
83
+ return func.apply(this, args);
81
84
  };
82
- };
85
+ }
83
86
 
84
- // A mostly-internal function to generate callbacks that can be applied
85
- // to each element in a collection, returning the desired result — either
86
- // identity, an arbitrary callback, a property matcher, or a property accessor.
87
- var cb = function(value, context, argCount) {
88
- if (value == null) return _.identity;
89
- if (_.isFunction(value)) return optimizeCb(value, context, argCount);
90
- if (_.isObject(value)) return _.matcher(value);
91
- return _.property(value);
92
- };
93
- _.iteratee = function(value, context) {
94
- return cb(value, context, Infinity);
95
- };
87
+ // Is a given variable an object?
88
+ function isObject(obj) {
89
+ var type = typeof obj;
90
+ return type === 'function' || (type === 'object' && !!obj);
91
+ }
96
92
 
97
- // An internal function for creating assigner functions.
98
- var createAssigner = function(keysFunc, undefinedOnly) {
99
- return function(obj) {
100
- var length = arguments.length;
101
- if (length < 2 || obj == null) return obj;
102
- for (var index = 1; index < length; index++) {
103
- var source = arguments[index],
104
- keys = keysFunc(source),
105
- l = keys.length;
106
- for (var i = 0; i < l; i++) {
107
- var key = keys[i];
108
- if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
109
- }
110
- }
111
- return obj;
112
- };
113
- };
93
+ // Is a given value equal to null?
94
+ function isNull(obj) {
95
+ return obj === null;
96
+ }
114
97
 
115
- // An internal function for creating a new object that inherits from another.
116
- var baseCreate = function(prototype) {
117
- if (!_.isObject(prototype)) return {};
118
- if (nativeCreate) return nativeCreate(prototype);
119
- Ctor.prototype = prototype;
120
- var result = new Ctor;
121
- Ctor.prototype = null;
122
- return result;
123
- };
98
+ // Is a given variable undefined?
99
+ function isUndefined(obj) {
100
+ return obj === void 0;
101
+ }
102
+
103
+ // Is a given value a boolean?
104
+ function isBoolean(obj) {
105
+ return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
106
+ }
107
+
108
+ // Is a given value a DOM element?
109
+ function isElement(obj) {
110
+ return !!(obj && obj.nodeType === 1);
111
+ }
124
112
 
125
- var property = function(key) {
113
+ // Internal function for creating a `toString`-based type tester.
114
+ function tagTester(name) {
115
+ var tag = '[object ' + name + ']';
126
116
  return function(obj) {
127
- return obj == null ? void 0 : obj[key];
117
+ return toString.call(obj) === tag;
128
118
  };
129
- };
130
-
131
- // Helper for collection methods to determine whether a collection
132
- // should be iterated as an array or as an object
133
- // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
134
- // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
135
- var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
136
- var getLength = property('length');
137
- var isArrayLike = function(collection) {
138
- var length = getLength(collection);
139
- return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
140
- };
119
+ }
141
120
 
142
- // Collection Functions
143
- // --------------------
121
+ var isString = tagTester('String');
144
122
 
145
- // The cornerstone, an `each` implementation, aka `forEach`.
146
- // Handles raw objects in addition to array-likes. Treats all
147
- // sparse array-likes as if they were dense.
148
- _.each = _.forEach = function(obj, iteratee, context) {
149
- iteratee = optimizeCb(iteratee, context);
150
- var i, length;
151
- if (isArrayLike(obj)) {
152
- for (i = 0, length = obj.length; i < length; i++) {
153
- iteratee(obj[i], i, obj);
154
- }
155
- } else {
156
- var keys = _.keys(obj);
157
- for (i = 0, length = keys.length; i < length; i++) {
158
- iteratee(obj[keys[i]], keys[i], obj);
159
- }
160
- }
161
- return obj;
162
- };
123
+ var isNumber = tagTester('Number');
163
124
 
164
- // Return the results of applying the iteratee to each element.
165
- _.map = _.collect = function(obj, iteratee, context) {
166
- iteratee = cb(iteratee, context);
167
- var keys = !isArrayLike(obj) && _.keys(obj),
168
- length = (keys || obj).length,
169
- results = Array(length);
170
- for (var index = 0; index < length; index++) {
171
- var currentKey = keys ? keys[index] : index;
172
- results[index] = iteratee(obj[currentKey], currentKey, obj);
173
- }
174
- return results;
175
- };
125
+ var isDate = tagTester('Date');
176
126
 
177
- // Create a reducing function iterating left or right.
178
- function createReduce(dir) {
179
- // Optimized iterator function as using arguments.length
180
- // in the main function will deoptimize the, see #1991.
181
- function iterator(obj, iteratee, memo, keys, index, length) {
182
- for (; index >= 0 && index < length; index += dir) {
183
- var currentKey = keys ? keys[index] : index;
184
- memo = iteratee(memo, obj[currentKey], currentKey, obj);
185
- }
186
- return memo;
187
- }
127
+ var isRegExp = tagTester('RegExp');
188
128
 
189
- return function(obj, iteratee, memo, context) {
190
- iteratee = optimizeCb(iteratee, context, 4);
191
- var keys = !isArrayLike(obj) && _.keys(obj),
192
- length = (keys || obj).length,
193
- index = dir > 0 ? 0 : length - 1;
194
- // Determine the initial value if none is provided.
195
- if (arguments.length < 3) {
196
- memo = obj[keys ? keys[index] : index];
197
- index += dir;
198
- }
199
- return iterator(obj, iteratee, memo, keys, index, length);
200
- };
201
- }
129
+ var isError = tagTester('Error');
202
130
 
203
- // **Reduce** builds up a single result from a list of values, aka `inject`,
204
- // or `foldl`.
205
- _.reduce = _.foldl = _.inject = createReduce(1);
131
+ var isSymbol = tagTester('Symbol');
206
132
 
207
- // The right-associative version of reduce, also known as `foldr`.
208
- _.reduceRight = _.foldr = createReduce(-1);
133
+ var isArrayBuffer = tagTester('ArrayBuffer');
209
134
 
210
- // Return the first value which passes a truth test. Aliased as `detect`.
211
- _.find = _.detect = function(obj, predicate, context) {
212
- var key;
213
- if (isArrayLike(obj)) {
214
- key = _.findIndex(obj, predicate, context);
215
- } else {
216
- key = _.findKey(obj, predicate, context);
217
- }
218
- if (key !== void 0 && key !== -1) return obj[key];
219
- };
135
+ var isFunction = tagTester('Function');
220
136
 
221
- // Return all the elements that pass a truth test.
222
- // Aliased as `select`.
223
- _.filter = _.select = function(obj, predicate, context) {
224
- var results = [];
225
- predicate = cb(predicate, context);
226
- _.each(obj, function(value, index, list) {
227
- if (predicate(value, index, list)) results.push(value);
228
- });
229
- return results;
230
- };
137
+ // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
138
+ // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
139
+ var nodelist = root.document && root.document.childNodes;
140
+ if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
141
+ isFunction = function(obj) {
142
+ return typeof obj == 'function' || false;
143
+ };
144
+ }
231
145
 
232
- // Return all the elements for which a truth test fails.
233
- _.reject = function(obj, predicate, context) {
234
- return _.filter(obj, _.negate(cb(predicate)), context);
235
- };
146
+ var isFunction$1 = isFunction;
236
147
 
237
- // Determine whether all of the elements match a truth test.
238
- // Aliased as `all`.
239
- _.every = _.all = function(obj, predicate, context) {
240
- predicate = cb(predicate, context);
241
- var keys = !isArrayLike(obj) && _.keys(obj),
242
- length = (keys || obj).length;
243
- for (var index = 0; index < length; index++) {
244
- var currentKey = keys ? keys[index] : index;
245
- if (!predicate(obj[currentKey], currentKey, obj)) return false;
246
- }
247
- return true;
248
- };
148
+ var hasObjectTag = tagTester('Object');
249
149
 
250
- // Determine if at least one element in the object matches a truth test.
251
- // Aliased as `any`.
252
- _.some = _.any = function(obj, predicate, context) {
253
- predicate = cb(predicate, context);
254
- var keys = !isArrayLike(obj) && _.keys(obj),
255
- length = (keys || obj).length;
256
- for (var index = 0; index < length; index++) {
257
- var currentKey = keys ? keys[index] : index;
258
- if (predicate(obj[currentKey], currentKey, obj)) return true;
259
- }
260
- return false;
261
- };
150
+ // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
151
+ // In IE 11, the most common among them, this problem also applies to
152
+ // `Map`, `WeakMap` and `Set`.
153
+ var hasStringTagBug = (
154
+ supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
155
+ ),
156
+ isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
262
157
 
263
- // Determine if the array or object contains a given item (using `===`).
264
- // Aliased as `includes` and `include`.
265
- _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
266
- if (!isArrayLike(obj)) obj = _.values(obj);
267
- if (typeof fromIndex != 'number' || guard) fromIndex = 0;
268
- return _.indexOf(obj, item, fromIndex) >= 0;
269
- };
158
+ var isDataView = tagTester('DataView');
270
159
 
271
- // Invoke a method (with arguments) on every item in a collection.
272
- _.invoke = function(obj, method) {
273
- var args = slice.call(arguments, 2);
274
- var isFunc = _.isFunction(method);
275
- return _.map(obj, function(value) {
276
- var func = isFunc ? method : value[method];
277
- return func == null ? func : func.apply(value, args);
278
- });
279
- };
160
+ // In IE 10 - Edge 13, we need a different heuristic
161
+ // to determine whether an object is a `DataView`.
162
+ function ie10IsDataView(obj) {
163
+ return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
164
+ }
280
165
 
281
- // Convenience version of a common use case of `map`: fetching a property.
282
- _.pluck = function(obj, key) {
283
- return _.map(obj, _.property(key));
284
- };
166
+ var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
285
167
 
286
- // Convenience version of a common use case of `filter`: selecting only objects
287
- // containing specific `key:value` pairs.
288
- _.where = function(obj, attrs) {
289
- return _.filter(obj, _.matcher(attrs));
290
- };
168
+ // Is a given value an array?
169
+ // Delegates to ECMA5's native `Array.isArray`.
170
+ var isArray = nativeIsArray || tagTester('Array');
291
171
 
292
- // Convenience version of a common use case of `find`: getting the first object
293
- // containing specific `key:value` pairs.
294
- _.findWhere = function(obj, attrs) {
295
- return _.find(obj, _.matcher(attrs));
296
- };
172
+ // Internal function to check whether `key` is an own property name of `obj`.
173
+ function has$1(obj, key) {
174
+ return obj != null && hasOwnProperty.call(obj, key);
175
+ }
297
176
 
298
- // Return the maximum element (or element-based computation).
299
- _.max = function(obj, iteratee, context) {
300
- var result = -Infinity, lastComputed = -Infinity,
301
- value, computed;
302
- if (iteratee == null && obj != null) {
303
- obj = isArrayLike(obj) ? obj : _.values(obj);
304
- for (var i = 0, length = obj.length; i < length; i++) {
305
- value = obj[i];
306
- if (value > result) {
307
- result = value;
308
- }
309
- }
310
- } else {
311
- iteratee = cb(iteratee, context);
312
- _.each(obj, function(value, index, list) {
313
- computed = iteratee(value, index, list);
314
- if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
315
- result = value;
316
- lastComputed = computed;
317
- }
318
- });
319
- }
320
- return result;
321
- };
177
+ var isArguments = tagTester('Arguments');
322
178
 
323
- // Return the minimum element (or element-based computation).
324
- _.min = function(obj, iteratee, context) {
325
- var result = Infinity, lastComputed = Infinity,
326
- value, computed;
327
- if (iteratee == null && obj != null) {
328
- obj = isArrayLike(obj) ? obj : _.values(obj);
329
- for (var i = 0, length = obj.length; i < length; i++) {
330
- value = obj[i];
331
- if (value < result) {
332
- result = value;
333
- }
334
- }
335
- } else {
336
- iteratee = cb(iteratee, context);
337
- _.each(obj, function(value, index, list) {
338
- computed = iteratee(value, index, list);
339
- if (computed < lastComputed || computed === Infinity && result === Infinity) {
340
- result = value;
341
- lastComputed = computed;
342
- }
343
- });
179
+ // Define a fallback version of the method in browsers (ahem, IE < 9), where
180
+ // there isn't any inspectable "Arguments" type.
181
+ (function() {
182
+ if (!isArguments(arguments)) {
183
+ isArguments = function(obj) {
184
+ return has$1(obj, 'callee');
185
+ };
344
186
  }
345
- return result;
346
- };
187
+ }());
347
188
 
348
- // Shuffle a collection, using the modern version of the
349
- // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
350
- _.shuffle = function(obj) {
351
- var set = isArrayLike(obj) ? obj : _.values(obj);
352
- var length = set.length;
353
- var shuffled = Array(length);
354
- for (var index = 0, rand; index < length; index++) {
355
- rand = _.random(0, index);
356
- if (rand !== index) shuffled[index] = shuffled[rand];
357
- shuffled[rand] = set[index];
358
- }
359
- return shuffled;
360
- };
189
+ var isArguments$1 = isArguments;
361
190
 
362
- // Sample **n** random values from a collection.
363
- // If **n** is not specified, returns a single random element.
364
- // The internal `guard` argument allows it to work with `map`.
365
- _.sample = function(obj, n, guard) {
366
- if (n == null || guard) {
367
- if (!isArrayLike(obj)) obj = _.values(obj);
368
- return obj[_.random(obj.length - 1)];
369
- }
370
- return _.shuffle(obj).slice(0, Math.max(0, n));
371
- };
191
+ // Is a given object a finite number?
192
+ function isFinite$1(obj) {
193
+ return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
194
+ }
372
195
 
373
- // Sort the object's values by a criterion produced by an iteratee.
374
- _.sortBy = function(obj, iteratee, context) {
375
- iteratee = cb(iteratee, context);
376
- return _.pluck(_.map(obj, function(value, index, list) {
377
- return {
378
- value: value,
379
- index: index,
380
- criteria: iteratee(value, index, list)
381
- };
382
- }).sort(function(left, right) {
383
- var a = left.criteria;
384
- var b = right.criteria;
385
- if (a !== b) {
386
- if (a > b || a === void 0) return 1;
387
- if (a < b || b === void 0) return -1;
388
- }
389
- return left.index - right.index;
390
- }), 'value');
391
- };
196
+ // Is the given value `NaN`?
197
+ function isNaN$1(obj) {
198
+ return isNumber(obj) && _isNaN(obj);
199
+ }
392
200
 
393
- // An internal function used for aggregate "group by" operations.
394
- var group = function(behavior) {
395
- return function(obj, iteratee, context) {
396
- var result = {};
397
- iteratee = cb(iteratee, context);
398
- _.each(obj, function(value, index) {
399
- var key = iteratee(value, index, obj);
400
- behavior(result, value, key);
401
- });
402
- return result;
201
+ // Predicate-generating function. Often useful outside of Underscore.
202
+ function constant(value) {
203
+ return function() {
204
+ return value;
403
205
  };
404
- };
206
+ }
405
207
 
406
- // Groups the object's values by a criterion. Pass either a string attribute
407
- // to group by, or a function that returns the criterion.
408
- _.groupBy = group(function(result, value, key) {
409
- if (_.has(result, key)) result[key].push(value); else result[key] = [value];
410
- });
208
+ // Common internal logic for `isArrayLike` and `isBufferLike`.
209
+ function createSizePropertyCheck(getSizeProperty) {
210
+ return function(collection) {
211
+ var sizeProperty = getSizeProperty(collection);
212
+ return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
213
+ }
214
+ }
411
215
 
412
- // Indexes the object's values by a criterion, similar to `groupBy`, but for
413
- // when you know that your index values will be unique.
414
- _.indexBy = group(function(result, value, key) {
415
- result[key] = value;
416
- });
216
+ // Internal helper to generate a function to obtain property `key` from `obj`.
217
+ function shallowProperty(key) {
218
+ return function(obj) {
219
+ return obj == null ? void 0 : obj[key];
220
+ };
221
+ }
417
222
 
418
- // Counts instances of an object that group by a certain criterion. Pass
419
- // either a string attribute to count by, or a function that returns the
420
- // criterion.
421
- _.countBy = group(function(result, value, key) {
422
- if (_.has(result, key)) result[key]++; else result[key] = 1;
423
- });
223
+ // Internal helper to obtain the `byteLength` property of an object.
224
+ var getByteLength = shallowProperty('byteLength');
424
225
 
425
- // Safely create a real, live array from anything iterable.
426
- _.toArray = function(obj) {
427
- if (!obj) return [];
428
- if (_.isArray(obj)) return slice.call(obj);
429
- if (isArrayLike(obj)) return _.map(obj, _.identity);
430
- return _.values(obj);
431
- };
226
+ // Internal helper to determine whether we should spend extensive checks against
227
+ // `ArrayBuffer` et al.
228
+ var isBufferLike = createSizePropertyCheck(getByteLength);
432
229
 
433
- // Return the number of elements in an object.
434
- _.size = function(obj) {
435
- if (obj == null) return 0;
436
- return isArrayLike(obj) ? obj.length : _.keys(obj).length;
437
- };
230
+ // Is a given value a typed array?
231
+ var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
232
+ function isTypedArray(obj) {
233
+ // `ArrayBuffer.isView` is the most future-proof, so use it when available.
234
+ // Otherwise, fall back on the above regular expression.
235
+ return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
236
+ isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
237
+ }
438
238
 
439
- // Split a collection into two arrays: one whose elements all satisfy the given
440
- // predicate, and one whose elements all do not satisfy the predicate.
441
- _.partition = function(obj, predicate, context) {
442
- predicate = cb(predicate, context);
443
- var pass = [], fail = [];
444
- _.each(obj, function(value, key, obj) {
445
- (predicate(value, key, obj) ? pass : fail).push(value);
446
- });
447
- return [pass, fail];
448
- };
449
-
450
- // Array Functions
451
- // ---------------
239
+ var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
240
+
241
+ // Internal helper to obtain the `length` property of an object.
242
+ var getLength = shallowProperty('length');
243
+
244
+ // Internal helper to create a simple lookup structure.
245
+ // `collectNonEnumProps` used to depend on `_.contains`, but this led to
246
+ // circular imports. `emulatedSet` is a one-off solution that only works for
247
+ // arrays of strings.
248
+ function emulatedSet(keys) {
249
+ var hash = {};
250
+ for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
251
+ return {
252
+ contains: function(key) { return hash[key] === true; },
253
+ push: function(key) {
254
+ hash[key] = true;
255
+ return keys.push(key);
256
+ }
257
+ };
258
+ }
452
259
 
453
- // Get the first element of an array. Passing **n** will return the first N
454
- // values in the array. Aliased as `head` and `take`. The **guard** check
455
- // allows it to work with `_.map`.
456
- _.first = _.head = _.take = function(array, n, guard) {
457
- if (array == null) return void 0;
458
- if (n == null || guard) return array[0];
459
- return _.initial(array, array.length - n);
460
- };
260
+ // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
261
+ // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
262
+ // needed.
263
+ function collectNonEnumProps(obj, keys) {
264
+ keys = emulatedSet(keys);
265
+ var nonEnumIdx = nonEnumerableProps.length;
266
+ var constructor = obj.constructor;
267
+ var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto;
461
268
 
462
- // Returns everything but the last entry of the array. Especially useful on
463
- // the arguments object. Passing **n** will return all the values in
464
- // the array, excluding the last N.
465
- _.initial = function(array, n, guard) {
466
- return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
467
- };
269
+ // Constructor is a special case.
270
+ var prop = 'constructor';
271
+ if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);
468
272
 
469
- // Get the last element of an array. Passing **n** will return the last N
470
- // values in the array.
471
- _.last = function(array, n, guard) {
472
- if (array == null) return void 0;
473
- if (n == null || guard) return array[array.length - 1];
474
- return _.rest(array, Math.max(0, array.length - n));
475
- };
273
+ while (nonEnumIdx--) {
274
+ prop = nonEnumerableProps[nonEnumIdx];
275
+ if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
276
+ keys.push(prop);
277
+ }
278
+ }
279
+ }
476
280
 
477
- // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
478
- // Especially useful on the arguments object. Passing an **n** will return
479
- // the rest N values in the array.
480
- _.rest = _.tail = _.drop = function(array, n, guard) {
481
- return slice.call(array, n == null || guard ? 1 : n);
482
- };
281
+ // Retrieve the names of an object's own properties.
282
+ // Delegates to **ECMAScript 5**'s native `Object.keys`.
283
+ function keys(obj) {
284
+ if (!isObject(obj)) return [];
285
+ if (nativeKeys) return nativeKeys(obj);
286
+ var keys = [];
287
+ for (var key in obj) if (has$1(obj, key)) keys.push(key);
288
+ // Ahem, IE < 9.
289
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
290
+ return keys;
291
+ }
483
292
 
484
- // Trim out all falsy values from an array.
485
- _.compact = function(array) {
486
- return _.filter(array, _.identity);
487
- };
293
+ // Is a given array, string, or object empty?
294
+ // An "empty" object has no enumerable own-properties.
295
+ function isEmpty(obj) {
296
+ if (obj == null) return true;
297
+ // Skip the more expensive `toString`-based type checks if `obj` has no
298
+ // `.length`.
299
+ var length = getLength(obj);
300
+ if (typeof length == 'number' && (
301
+ isArray(obj) || isString(obj) || isArguments$1(obj)
302
+ )) return length === 0;
303
+ return getLength(keys(obj)) === 0;
304
+ }
488
305
 
489
- // Internal implementation of a recursive `flatten` function.
490
- var flatten = function(input, shallow, strict, startIndex) {
491
- var output = [], idx = 0;
492
- for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
493
- var value = input[i];
494
- if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
495
- //flatten current level of array or arguments object
496
- if (!shallow) value = flatten(value, shallow, strict);
497
- var j = 0, len = value.length;
498
- output.length += len;
499
- while (j < len) {
500
- output[idx++] = value[j++];
501
- }
502
- } else if (!strict) {
503
- output[idx++] = value;
504
- }
306
+ // Returns whether an object has a given set of `key:value` pairs.
307
+ function isMatch(object, attrs) {
308
+ var _keys = keys(attrs), length = _keys.length;
309
+ if (object == null) return !length;
310
+ var obj = Object(object);
311
+ for (var i = 0; i < length; i++) {
312
+ var key = _keys[i];
313
+ if (attrs[key] !== obj[key] || !(key in obj)) return false;
505
314
  }
506
- return output;
507
- };
315
+ return true;
316
+ }
508
317
 
509
- // Flatten out an array, either recursively (by default), or just one level.
510
- _.flatten = function(array, shallow) {
511
- return flatten(array, shallow, false);
512
- };
318
+ // If Underscore is called as a function, it returns a wrapped object that can
319
+ // be used OO-style. This wrapper holds altered versions of all functions added
320
+ // through `_.mixin`. Wrapped objects may be chained.
321
+ function _$1(obj) {
322
+ if (obj instanceof _$1) return obj;
323
+ if (!(this instanceof _$1)) return new _$1(obj);
324
+ this._wrapped = obj;
325
+ }
513
326
 
514
- // Return a version of the array that does not contain the specified value(s).
515
- _.without = function(array) {
516
- return _.difference(array, slice.call(arguments, 1));
517
- };
327
+ _$1.VERSION = VERSION;
518
328
 
519
- // Produce a duplicate-free version of the array. If the array has already
520
- // been sorted, you have the option of using a faster algorithm.
521
- // Aliased as `unique`.
522
- _.uniq = _.unique = function(array, isSorted, iteratee, context) {
523
- if (!_.isBoolean(isSorted)) {
524
- context = iteratee;
525
- iteratee = isSorted;
526
- isSorted = false;
527
- }
528
- if (iteratee != null) iteratee = cb(iteratee, context);
529
- var result = [];
530
- var seen = [];
531
- for (var i = 0, length = getLength(array); i < length; i++) {
532
- var value = array[i],
533
- computed = iteratee ? iteratee(value, i, array) : value;
534
- if (isSorted) {
535
- if (!i || seen !== computed) result.push(value);
536
- seen = computed;
537
- } else if (iteratee) {
538
- if (!_.contains(seen, computed)) {
539
- seen.push(computed);
540
- result.push(value);
541
- }
542
- } else if (!_.contains(result, value)) {
543
- result.push(value);
544
- }
545
- }
546
- return result;
329
+ // Extracts the result from a wrapped and chained object.
330
+ _$1.prototype.value = function() {
331
+ return this._wrapped;
547
332
  };
548
333
 
549
- // Produce an array that contains the union: each distinct element from all of
550
- // the passed-in arrays.
551
- _.union = function() {
552
- return _.uniq(flatten(arguments, true, true));
553
- };
334
+ // Provide unwrapping proxies for some methods used in engine operations
335
+ // such as arithmetic and JSON stringification.
336
+ _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;
554
337
 
555
- // Produce an array that contains every item shared between all the
556
- // passed-in arrays.
557
- _.intersection = function(array) {
558
- var result = [];
559
- var argsLength = arguments.length;
560
- for (var i = 0, length = getLength(array); i < length; i++) {
561
- var item = array[i];
562
- if (_.contains(result, item)) continue;
563
- for (var j = 1; j < argsLength; j++) {
564
- if (!_.contains(arguments[j], item)) break;
565
- }
566
- if (j === argsLength) result.push(item);
567
- }
568
- return result;
338
+ _$1.prototype.toString = function() {
339
+ return String(this._wrapped);
569
340
  };
570
341
 
571
- // Take the difference between one array and a number of other arrays.
572
- // Only the elements present in just the first array will remain.
573
- _.difference = function(array) {
574
- var rest = flatten(arguments, true, true, 1);
575
- return _.filter(array, function(value){
576
- return !_.contains(rest, value);
577
- });
578
- };
342
+ // Internal function to wrap or shallow-copy an ArrayBuffer,
343
+ // typed array or DataView to a new view, reusing the buffer.
344
+ function toBufferView(bufferSource) {
345
+ return new Uint8Array(
346
+ bufferSource.buffer || bufferSource,
347
+ bufferSource.byteOffset || 0,
348
+ getByteLength(bufferSource)
349
+ );
350
+ }
579
351
 
580
- // Zip together multiple lists into a single array -- elements that share
581
- // an index go together.
582
- _.zip = function() {
583
- return _.unzip(arguments);
584
- };
352
+ // We use this string twice, so give it a name for minification.
353
+ var tagDataView = '[object DataView]';
585
354
 
586
- // Complement of _.zip. Unzip accepts an array of arrays and groups
587
- // each array's elements on shared indices
588
- _.unzip = function(array) {
589
- var length = array && _.max(array, getLength).length || 0;
590
- var result = Array(length);
355
+ // Internal recursive comparison function for `_.isEqual`.
356
+ function eq(a, b, aStack, bStack) {
357
+ // Identical objects are equal. `0 === -0`, but they aren't identical.
358
+ // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
359
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
360
+ // `null` or `undefined` only equal to itself (strict comparison).
361
+ if (a == null || b == null) return false;
362
+ // `NaN`s are equivalent, but non-reflexive.
363
+ if (a !== a) return b !== b;
364
+ // Exhaust primitive checks
365
+ var type = typeof a;
366
+ if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
367
+ return deepEq(a, b, aStack, bStack);
368
+ }
591
369
 
592
- for (var index = 0; index < length; index++) {
593
- result[index] = _.pluck(array, index);
370
+ // Internal recursive comparison function for `_.isEqual`.
371
+ function deepEq(a, b, aStack, bStack) {
372
+ // Unwrap any wrapped objects.
373
+ if (a instanceof _$1) a = a._wrapped;
374
+ if (b instanceof _$1) b = b._wrapped;
375
+ // Compare `[[Class]]` names.
376
+ var className = toString.call(a);
377
+ if (className !== toString.call(b)) return false;
378
+ // Work around a bug in IE 10 - Edge 13.
379
+ if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
380
+ if (!isDataView$1(b)) return false;
381
+ className = tagDataView;
382
+ }
383
+ switch (className) {
384
+ // These types are compared by value.
385
+ case '[object RegExp]':
386
+ // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
387
+ case '[object String]':
388
+ // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
389
+ // equivalent to `new String("5")`.
390
+ return '' + a === '' + b;
391
+ case '[object Number]':
392
+ // `NaN`s are equivalent, but non-reflexive.
393
+ // Object(NaN) is equivalent to NaN.
394
+ if (+a !== +a) return +b !== +b;
395
+ // An `egal` comparison is performed for other numeric values.
396
+ return +a === 0 ? 1 / +a === 1 / b : +a === +b;
397
+ case '[object Date]':
398
+ case '[object Boolean]':
399
+ // Coerce dates and booleans to numeric primitive values. Dates are compared by their
400
+ // millisecond representations. Note that invalid dates with millisecond representations
401
+ // of `NaN` are not equivalent.
402
+ return +a === +b;
403
+ case '[object Symbol]':
404
+ return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
405
+ case '[object ArrayBuffer]':
406
+ case tagDataView:
407
+ // Coerce to typed array so we can fall through.
408
+ return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
594
409
  }
595
- return result;
596
- };
597
410
 
598
- // Converts lists into objects. Pass either a single array of `[key, value]`
599
- // pairs, or two parallel arrays of the same length -- one of keys, and one of
600
- // the corresponding values.
601
- _.object = function(list, values) {
602
- var result = {};
603
- for (var i = 0, length = getLength(list); i < length; i++) {
604
- if (values) {
605
- result[list[i]] = values[i];
606
- } else {
607
- result[list[i][0]] = list[i][1];
608
- }
411
+ var areArrays = className === '[object Array]';
412
+ if (!areArrays && isTypedArray$1(a)) {
413
+ var byteLength = getByteLength(a);
414
+ if (byteLength !== getByteLength(b)) return false;
415
+ if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
416
+ areArrays = true;
609
417
  }
610
- return result;
611
- };
418
+ if (!areArrays) {
419
+ if (typeof a != 'object' || typeof b != 'object') return false;
612
420
 
613
- // Generator function to create the findIndex and findLastIndex functions
614
- function createPredicateIndexFinder(dir) {
615
- return function(array, predicate, context) {
616
- predicate = cb(predicate, context);
617
- var length = getLength(array);
618
- var index = dir > 0 ? 0 : length - 1;
619
- for (; index >= 0 && index < length; index += dir) {
620
- if (predicate(array[index], index, array)) return index;
421
+ // Objects with different constructors are not equivalent, but `Object`s or `Array`s
422
+ // from different frames are.
423
+ var aCtor = a.constructor, bCtor = b.constructor;
424
+ if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
425
+ isFunction$1(bCtor) && bCtor instanceof bCtor)
426
+ && ('constructor' in a && 'constructor' in b)) {
427
+ return false;
621
428
  }
622
- return -1;
623
- };
624
- }
625
-
626
- // Returns the first index on an array-like that passes a predicate test
627
- _.findIndex = createPredicateIndexFinder(1);
628
- _.findLastIndex = createPredicateIndexFinder(-1);
429
+ }
430
+ // Assume equality for cyclic structures. The algorithm for detecting cyclic
431
+ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
629
432
 
630
- // Use a comparator function to figure out the smallest index at which
631
- // an object should be inserted so as to maintain order. Uses binary search.
632
- _.sortedIndex = function(array, obj, iteratee, context) {
633
- iteratee = cb(iteratee, context, 1);
634
- var value = iteratee(obj);
635
- var low = 0, high = getLength(array);
636
- while (low < high) {
637
- var mid = Math.floor((low + high) / 2);
638
- if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
433
+ // Initializing stack of traversed objects.
434
+ // It's done here since we only need them for objects and arrays comparison.
435
+ aStack = aStack || [];
436
+ bStack = bStack || [];
437
+ var length = aStack.length;
438
+ while (length--) {
439
+ // Linear search. Performance is inversely proportional to the number of
440
+ // unique nested structures.
441
+ if (aStack[length] === a) return bStack[length] === b;
639
442
  }
640
- return low;
641
- };
642
443
 
643
- // Generator function to create the indexOf and lastIndexOf functions
644
- function createIndexFinder(dir, predicateFind, sortedIndex) {
645
- return function(array, item, idx) {
646
- var i = 0, length = getLength(array);
647
- if (typeof idx == 'number') {
648
- if (dir > 0) {
649
- i = idx >= 0 ? idx : Math.max(idx + length, i);
650
- } else {
651
- length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
652
- }
653
- } else if (sortedIndex && idx && length) {
654
- idx = sortedIndex(array, item);
655
- return array[idx] === item ? idx : -1;
444
+ // Add the first object to the stack of traversed objects.
445
+ aStack.push(a);
446
+ bStack.push(b);
447
+
448
+ // Recursively compare objects and arrays.
449
+ if (areArrays) {
450
+ // Compare array lengths to determine if a deep comparison is necessary.
451
+ length = a.length;
452
+ if (length !== b.length) return false;
453
+ // Deep compare the contents, ignoring non-numeric properties.
454
+ while (length--) {
455
+ if (!eq(a[length], b[length], aStack, bStack)) return false;
656
456
  }
657
- if (item !== item) {
658
- idx = predicateFind(slice.call(array, i, length), _.isNaN);
659
- return idx >= 0 ? idx + i : -1;
457
+ } else {
458
+ // Deep compare objects.
459
+ var _keys = keys(a), key;
460
+ length = _keys.length;
461
+ // Ensure that both objects contain the same number of properties before comparing deep equality.
462
+ if (keys(b).length !== length) return false;
463
+ while (length--) {
464
+ // Deep compare each member
465
+ key = _keys[length];
466
+ if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
660
467
  }
661
- for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
662
- if (array[idx] === item) return idx;
468
+ }
469
+ // Remove the first object from the stack of traversed objects.
470
+ aStack.pop();
471
+ bStack.pop();
472
+ return true;
473
+ }
474
+
475
+ // Perform a deep comparison to check if two objects are equal.
476
+ function isEqual(a, b) {
477
+ return eq(a, b);
478
+ }
479
+
480
+ // Retrieve all the enumerable property names of an object.
481
+ function allKeys(obj) {
482
+ if (!isObject(obj)) return [];
483
+ var keys = [];
484
+ for (var key in obj) keys.push(key);
485
+ // Ahem, IE < 9.
486
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
487
+ return keys;
488
+ }
489
+
490
+ // Since the regular `Object.prototype.toString` type tests don't work for
491
+ // some types in IE 11, we use a fingerprinting heuristic instead, based
492
+ // on the methods. It's not great, but it's the best we got.
493
+ // The fingerprint method lists are defined below.
494
+ function ie11fingerprint(methods) {
495
+ var length = getLength(methods);
496
+ return function(obj) {
497
+ if (obj == null) return false;
498
+ // `Map`, `WeakMap` and `Set` have no enumerable keys.
499
+ var keys = allKeys(obj);
500
+ if (getLength(keys)) return false;
501
+ for (var i = 0; i < length; i++) {
502
+ if (!isFunction$1(obj[methods[i]])) return false;
663
503
  }
664
- return -1;
504
+ // If we are testing against `WeakMap`, we need to ensure that
505
+ // `obj` doesn't have a `forEach` method in order to distinguish
506
+ // it from a regular `Map`.
507
+ return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
665
508
  };
666
509
  }
667
510
 
668
- // Return the position of the first occurrence of an item in an array,
669
- // or -1 if the item is not included in the array.
670
- // If the array is large and already in sort order, pass `true`
671
- // for **isSorted** to use binary search.
672
- _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
673
- _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
511
+ // In the interest of compact minification, we write
512
+ // each string in the fingerprints only once.
513
+ var forEachName = 'forEach',
514
+ hasName = 'has',
515
+ commonInit = ['clear', 'delete'],
516
+ mapTail = ['get', hasName, 'set'];
674
517
 
675
- // Generate an integer Array containing an arithmetic progression. A port of
676
- // the native Python `range()` function. See
677
- // [the Python documentation](http://docs.python.org/library/functions.html#range).
678
- _.range = function(start, stop, step) {
679
- if (stop == null) {
680
- stop = start || 0;
681
- start = 0;
682
- }
683
- step = step || 1;
518
+ // `Map`, `WeakMap` and `Set` each have slightly different
519
+ // combinations of the above sublists.
520
+ var mapMethods = commonInit.concat(forEachName, mapTail),
521
+ weakMapMethods = commonInit.concat(mapTail),
522
+ setMethods = ['add'].concat(commonInit, forEachName, hasName);
684
523
 
685
- var length = Math.max(Math.ceil((stop - start) / step), 0);
686
- var range = Array(length);
524
+ var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
687
525
 
688
- for (var idx = 0; idx < length; idx++, start += step) {
689
- range[idx] = start;
690
- }
691
-
692
- return range;
693
- };
694
-
695
- // Function (ahem) Functions
696
- // ------------------
697
-
698
- // Determines whether to execute a function as a constructor
699
- // or a normal function with the provided arguments
700
- var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
701
- if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
702
- var self = baseCreate(sourceFunc.prototype);
703
- var result = sourceFunc.apply(self, args);
704
- if (_.isObject(result)) return result;
705
- return self;
706
- };
707
-
708
- // Create a function bound to a given object (assigning `this`, and arguments,
709
- // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
710
- // available.
711
- _.bind = function(func, context) {
712
- if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
713
- if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
714
- var args = slice.call(arguments, 2);
715
- var bound = function() {
716
- return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
717
- };
718
- return bound;
719
- };
720
-
721
- // Partially apply a function by creating a version that has had some of its
722
- // arguments pre-filled, without changing its dynamic `this` context. _ acts
723
- // as a placeholder, allowing any combination of arguments to be pre-filled.
724
- _.partial = function(func) {
725
- var boundArgs = slice.call(arguments, 1);
726
- var bound = function() {
727
- var position = 0, length = boundArgs.length;
728
- var args = Array(length);
729
- for (var i = 0; i < length; i++) {
730
- args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
731
- }
732
- while (position < arguments.length) args.push(arguments[position++]);
733
- return executeBound(func, bound, this, this, args);
734
- };
735
- return bound;
736
- };
737
-
738
- // Bind a number of an object's methods to that object. Remaining arguments
739
- // are the method names to be bound. Useful for ensuring that all callbacks
740
- // defined on an object belong to it.
741
- _.bindAll = function(obj) {
742
- var i, length = arguments.length, key;
743
- if (length <= 1) throw new Error('bindAll must be passed function names');
744
- for (i = 1; i < length; i++) {
745
- key = arguments[i];
746
- obj[key] = _.bind(obj[key], obj);
747
- }
748
- return obj;
749
- };
750
-
751
- // Memoize an expensive function by storing its results.
752
- _.memoize = function(func, hasher) {
753
- var memoize = function(key) {
754
- var cache = memoize.cache;
755
- var address = '' + (hasher ? hasher.apply(this, arguments) : key);
756
- if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
757
- return cache[address];
758
- };
759
- memoize.cache = {};
760
- return memoize;
761
- };
762
-
763
- // Delays a function for the given number of milliseconds, and then calls
764
- // it with the arguments supplied.
765
- _.delay = function(func, wait) {
766
- var args = slice.call(arguments, 2);
767
- return setTimeout(function(){
768
- return func.apply(null, args);
769
- }, wait);
770
- };
771
-
772
- // Defers a function, scheduling it to run after the current call stack has
773
- // cleared.
774
- _.defer = _.partial(_.delay, _, 1);
775
-
776
- // Returns a function, that, when invoked, will only be triggered at most once
777
- // during a given window of time. Normally, the throttled function will run
778
- // as much as it can, without ever going more than once per `wait` duration;
779
- // but if you'd like to disable the execution on the leading edge, pass
780
- // `{leading: false}`. To disable execution on the trailing edge, ditto.
781
- _.throttle = function(func, wait, options) {
782
- var context, args, result;
783
- var timeout = null;
784
- var previous = 0;
785
- if (!options) options = {};
786
- var later = function() {
787
- previous = options.leading === false ? 0 : _.now();
788
- timeout = null;
789
- result = func.apply(context, args);
790
- if (!timeout) context = args = null;
791
- };
792
- return function() {
793
- var now = _.now();
794
- if (!previous && options.leading === false) previous = now;
795
- var remaining = wait - (now - previous);
796
- context = this;
797
- args = arguments;
798
- if (remaining <= 0 || remaining > wait) {
799
- if (timeout) {
800
- clearTimeout(timeout);
801
- timeout = null;
802
- }
803
- previous = now;
804
- result = func.apply(context, args);
805
- if (!timeout) context = args = null;
806
- } else if (!timeout && options.trailing !== false) {
807
- timeout = setTimeout(later, remaining);
808
- }
809
- return result;
810
- };
811
- };
812
-
813
- // Returns a function, that, as long as it continues to be invoked, will not
814
- // be triggered. The function will be called after it stops being called for
815
- // N milliseconds. If `immediate` is passed, trigger the function on the
816
- // leading edge, instead of the trailing.
817
- _.debounce = function(func, wait, immediate) {
818
- var timeout, args, context, timestamp, result;
819
-
820
- var later = function() {
821
- var last = _.now() - timestamp;
822
-
823
- if (last < wait && last >= 0) {
824
- timeout = setTimeout(later, wait - last);
825
- } else {
826
- timeout = null;
827
- if (!immediate) {
828
- result = func.apply(context, args);
829
- if (!timeout) context = args = null;
830
- }
831
- }
832
- };
833
-
834
- return function() {
835
- context = this;
836
- args = arguments;
837
- timestamp = _.now();
838
- var callNow = immediate && !timeout;
839
- if (!timeout) timeout = setTimeout(later, wait);
840
- if (callNow) {
841
- result = func.apply(context, args);
842
- context = args = null;
843
- }
844
-
845
- return result;
846
- };
847
- };
848
-
849
- // Returns the first function passed as an argument to the second,
850
- // allowing you to adjust arguments, run code before and after, and
851
- // conditionally execute the original function.
852
- _.wrap = function(func, wrapper) {
853
- return _.partial(wrapper, func);
854
- };
855
-
856
- // Returns a negated version of the passed-in predicate.
857
- _.negate = function(predicate) {
858
- return function() {
859
- return !predicate.apply(this, arguments);
860
- };
861
- };
862
-
863
- // Returns a function that is the composition of a list of functions, each
864
- // consuming the return value of the function that follows.
865
- _.compose = function() {
866
- var args = arguments;
867
- var start = args.length - 1;
868
- return function() {
869
- var i = start;
870
- var result = args[start].apply(this, arguments);
871
- while (i--) result = args[i].call(this, result);
872
- return result;
873
- };
874
- };
875
-
876
- // Returns a function that will only be executed on and after the Nth call.
877
- _.after = function(times, func) {
878
- return function() {
879
- if (--times < 1) {
880
- return func.apply(this, arguments);
881
- }
882
- };
883
- };
884
-
885
- // Returns a function that will only be executed up to (but not including) the Nth call.
886
- _.before = function(times, func) {
887
- var memo;
888
- return function() {
889
- if (--times > 0) {
890
- memo = func.apply(this, arguments);
891
- }
892
- if (times <= 1) func = null;
893
- return memo;
894
- };
895
- };
896
-
897
- // Returns a function that will be executed at most one time, no matter how
898
- // often you call it. Useful for lazy initialization.
899
- _.once = _.partial(_.before, 2);
900
-
901
- // Object Functions
902
- // ----------------
903
-
904
- // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
905
- var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
906
- var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
907
- 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
908
-
909
- function collectNonEnumProps(obj, keys) {
910
- var nonEnumIdx = nonEnumerableProps.length;
911
- var constructor = obj.constructor;
912
- var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
913
-
914
- // Constructor is a special case.
915
- var prop = 'constructor';
916
- if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
526
+ var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
917
527
 
918
- while (nonEnumIdx--) {
919
- prop = nonEnumerableProps[nonEnumIdx];
920
- if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
921
- keys.push(prop);
922
- }
923
- }
924
- }
925
-
926
- // Retrieve the names of an object's own properties.
927
- // Delegates to **ECMAScript 5**'s native `Object.keys`
928
- _.keys = function(obj) {
929
- if (!_.isObject(obj)) return [];
930
- if (nativeKeys) return nativeKeys(obj);
931
- var keys = [];
932
- for (var key in obj) if (_.has(obj, key)) keys.push(key);
933
- // Ahem, IE < 9.
934
- if (hasEnumBug) collectNonEnumProps(obj, keys);
935
- return keys;
936
- };
528
+ var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
937
529
 
938
- // Retrieve all the property names of an object.
939
- _.allKeys = function(obj) {
940
- if (!_.isObject(obj)) return [];
941
- var keys = [];
942
- for (var key in obj) keys.push(key);
943
- // Ahem, IE < 9.
944
- if (hasEnumBug) collectNonEnumProps(obj, keys);
945
- return keys;
946
- };
530
+ var isWeakSet = tagTester('WeakSet');
947
531
 
948
532
  // Retrieve the values of an object's properties.
949
- _.values = function(obj) {
950
- var keys = _.keys(obj);
951
- var length = keys.length;
533
+ function values(obj) {
534
+ var _keys = keys(obj);
535
+ var length = _keys.length;
952
536
  var values = Array(length);
953
537
  for (var i = 0; i < length; i++) {
954
- values[i] = obj[keys[i]];
538
+ values[i] = obj[_keys[i]];
955
539
  }
956
540
  return values;
957
- };
958
-
959
- // Returns the results of applying the iteratee to each element of the object
960
- // In contrast to _.map it returns an object
961
- _.mapObject = function(obj, iteratee, context) {
962
- iteratee = cb(iteratee, context);
963
- var keys = _.keys(obj),
964
- length = keys.length,
965
- results = {},
966
- currentKey;
967
- for (var index = 0; index < length; index++) {
968
- currentKey = keys[index];
969
- results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
970
- }
971
- return results;
972
- };
541
+ }
973
542
 
974
543
  // Convert an object into a list of `[key, value]` pairs.
975
- _.pairs = function(obj) {
976
- var keys = _.keys(obj);
977
- var length = keys.length;
544
+ // The opposite of `_.object` with one argument.
545
+ function pairs(obj) {
546
+ var _keys = keys(obj);
547
+ var length = _keys.length;
978
548
  var pairs = Array(length);
979
549
  for (var i = 0; i < length; i++) {
980
- pairs[i] = [keys[i], obj[keys[i]]];
550
+ pairs[i] = [_keys[i], obj[_keys[i]]];
981
551
  }
982
552
  return pairs;
983
- };
553
+ }
984
554
 
985
555
  // Invert the keys and values of an object. The values must be serializable.
986
- _.invert = function(obj) {
556
+ function invert(obj) {
987
557
  var result = {};
988
- var keys = _.keys(obj);
989
- for (var i = 0, length = keys.length; i < length; i++) {
990
- result[obj[keys[i]]] = keys[i];
558
+ var _keys = keys(obj);
559
+ for (var i = 0, length = _keys.length; i < length; i++) {
560
+ result[obj[_keys[i]]] = _keys[i];
991
561
  }
992
562
  return result;
993
- };
563
+ }
994
564
 
995
565
  // Return a sorted list of the function names available on the object.
996
- // Aliased as `methods`
997
- _.functions = _.methods = function(obj) {
566
+ function functions(obj) {
998
567
  var names = [];
999
568
  for (var key in obj) {
1000
- if (_.isFunction(obj[key])) names.push(key);
569
+ if (isFunction$1(obj[key])) names.push(key);
1001
570
  }
1002
571
  return names.sort();
1003
- };
572
+ }
573
+
574
+ // An internal function for creating assigner functions.
575
+ function createAssigner(keysFunc, defaults) {
576
+ return function(obj) {
577
+ var length = arguments.length;
578
+ if (defaults) obj = Object(obj);
579
+ if (length < 2 || obj == null) return obj;
580
+ for (var index = 1; index < length; index++) {
581
+ var source = arguments[index],
582
+ keys = keysFunc(source),
583
+ l = keys.length;
584
+ for (var i = 0; i < l; i++) {
585
+ var key = keys[i];
586
+ if (!defaults || obj[key] === void 0) obj[key] = source[key];
587
+ }
588
+ }
589
+ return obj;
590
+ };
591
+ }
1004
592
 
1005
593
  // Extend a given object with all the properties in passed-in object(s).
1006
- _.extend = createAssigner(_.allKeys);
594
+ var extend = createAssigner(allKeys);
1007
595
 
1008
- // Assigns a given object with all the own properties in the passed-in object(s)
596
+ // Assigns a given object with all the own properties in the passed-in
597
+ // object(s).
1009
598
  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
1010
- _.extendOwn = _.assign = createAssigner(_.keys);
1011
-
1012
- // Returns the first key on an object that passes a predicate test
1013
- _.findKey = function(obj, predicate, context) {
1014
- predicate = cb(predicate, context);
1015
- var keys = _.keys(obj), key;
1016
- for (var i = 0, length = keys.length; i < length; i++) {
1017
- key = keys[i];
1018
- if (predicate(obj[key], key, obj)) return key;
1019
- }
1020
- };
599
+ var extendOwn = createAssigner(keys);
1021
600
 
1022
- // Return a copy of the object only containing the whitelisted properties.
1023
- _.pick = function(object, oiteratee, context) {
1024
- var result = {}, obj = object, iteratee, keys;
1025
- if (obj == null) return result;
1026
- if (_.isFunction(oiteratee)) {
1027
- keys = _.allKeys(obj);
1028
- iteratee = optimizeCb(oiteratee, context);
1029
- } else {
1030
- keys = flatten(arguments, false, false, 1);
1031
- iteratee = function(value, key, obj) { return key in obj; };
1032
- obj = Object(obj);
1033
- }
1034
- for (var i = 0, length = keys.length; i < length; i++) {
1035
- var key = keys[i];
1036
- var value = obj[key];
1037
- if (iteratee(value, key, obj)) result[key] = value;
1038
- }
1039
- return result;
1040
- };
601
+ // Fill in a given object with default properties.
602
+ var defaults = createAssigner(allKeys, true);
1041
603
 
1042
- // Return a copy of the object without the blacklisted properties.
1043
- _.omit = function(obj, iteratee, context) {
1044
- if (_.isFunction(iteratee)) {
1045
- iteratee = _.negate(iteratee);
1046
- } else {
1047
- var keys = _.map(flatten(arguments, false, false, 1), String);
1048
- iteratee = function(value, key) {
1049
- return !_.contains(keys, key);
1050
- };
1051
- }
1052
- return _.pick(obj, iteratee, context);
1053
- };
604
+ // Create a naked function reference for surrogate-prototype-swapping.
605
+ function ctor() {
606
+ return function(){};
607
+ }
1054
608
 
1055
- // Fill in a given object with default properties.
1056
- _.defaults = createAssigner(_.allKeys, true);
609
+ // An internal function for creating a new object that inherits from another.
610
+ function baseCreate(prototype) {
611
+ if (!isObject(prototype)) return {};
612
+ if (nativeCreate) return nativeCreate(prototype);
613
+ var Ctor = ctor();
614
+ Ctor.prototype = prototype;
615
+ var result = new Ctor;
616
+ Ctor.prototype = null;
617
+ return result;
618
+ }
1057
619
 
1058
620
  // Creates an object that inherits from the given prototype object.
1059
621
  // If additional properties are provided then they will be added to the
1060
622
  // created object.
1061
- _.create = function(prototype, props) {
623
+ function create(prototype, props) {
1062
624
  var result = baseCreate(prototype);
1063
- if (props) _.extendOwn(result, props);
625
+ if (props) extendOwn(result, props);
1064
626
  return result;
1065
- };
627
+ }
1066
628
 
1067
629
  // Create a (shallow-cloned) duplicate of an object.
1068
- _.clone = function(obj) {
1069
- if (!_.isObject(obj)) return obj;
1070
- return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
1071
- };
630
+ function clone(obj) {
631
+ if (!isObject(obj)) return obj;
632
+ return isArray(obj) ? obj.slice() : extend({}, obj);
633
+ }
1072
634
 
1073
- // Invokes interceptor with the obj, and then returns obj.
635
+ // Invokes `interceptor` with the `obj` and then returns `obj`.
1074
636
  // The primary purpose of this method is to "tap into" a method chain, in
1075
637
  // order to perform operations on intermediate results within the chain.
1076
- _.tap = function(obj, interceptor) {
638
+ function tap(obj, interceptor) {
1077
639
  interceptor(obj);
1078
640
  return obj;
1079
- };
641
+ }
1080
642
 
1081
- // Returns whether an object has a given set of `key:value` pairs.
1082
- _.isMatch = function(object, attrs) {
1083
- var keys = _.keys(attrs), length = keys.length;
1084
- if (object == null) return !length;
1085
- var obj = Object(object);
643
+ // Normalize a (deep) property `path` to array.
644
+ // Like `_.iteratee`, this function can be customized.
645
+ function toPath$1(path) {
646
+ return isArray(path) ? path : [path];
647
+ }
648
+ _$1.toPath = toPath$1;
649
+
650
+ // Internal wrapper for `_.toPath` to enable minification.
651
+ // Similar to `cb` for `_.iteratee`.
652
+ function toPath(path) {
653
+ return _$1.toPath(path);
654
+ }
655
+
656
+ // Internal function to obtain a nested property in `obj` along `path`.
657
+ function deepGet(obj, path) {
658
+ var length = path.length;
1086
659
  for (var i = 0; i < length; i++) {
1087
- var key = keys[i];
1088
- if (attrs[key] !== obj[key] || !(key in obj)) return false;
660
+ if (obj == null) return void 0;
661
+ obj = obj[path[i]];
1089
662
  }
1090
- return true;
1091
- };
663
+ return length ? obj : void 0;
664
+ }
1092
665
 
666
+ // Get the value of the (deep) property on `path` from `object`.
667
+ // If any property in `path` does not exist or if the value is
668
+ // `undefined`, return `defaultValue` instead.
669
+ // The `path` is normalized through `_.toPath`.
670
+ function get(object, path, defaultValue) {
671
+ var value = deepGet(object, toPath(path));
672
+ return isUndefined(value) ? defaultValue : value;
673
+ }
1093
674
 
1094
- // Internal recursive comparison function for `isEqual`.
1095
- var eq = function(a, b, aStack, bStack) {
1096
- // Identical objects are equal. `0 === -0`, but they aren't identical.
1097
- // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
1098
- if (a === b) return a !== 0 || 1 / a === 1 / b;
1099
- // A strict comparison is necessary because `null == undefined`.
1100
- if (a == null || b == null) return a === b;
1101
- // Unwrap any wrapped objects.
1102
- if (a instanceof _) a = a._wrapped;
1103
- if (b instanceof _) b = b._wrapped;
1104
- // Compare `[[Class]]` names.
1105
- var className = toString.call(a);
1106
- if (className !== toString.call(b)) return false;
1107
- switch (className) {
1108
- // Strings, numbers, regular expressions, dates, and booleans are compared by value.
1109
- case '[object RegExp]':
1110
- // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
1111
- case '[object String]':
1112
- // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
1113
- // equivalent to `new String("5")`.
1114
- return '' + a === '' + b;
1115
- case '[object Number]':
1116
- // `NaN`s are equivalent, but non-reflexive.
1117
- // Object(NaN) is equivalent to NaN
1118
- if (+a !== +a) return +b !== +b;
1119
- // An `egal` comparison is performed for other numeric values.
1120
- return +a === 0 ? 1 / +a === 1 / b : +a === +b;
1121
- case '[object Date]':
1122
- case '[object Boolean]':
1123
- // Coerce dates and booleans to numeric primitive values. Dates are compared by their
1124
- // millisecond representations. Note that invalid dates with millisecond representations
1125
- // of `NaN` are not equivalent.
1126
- return +a === +b;
675
+ // Shortcut function for checking if an object has a given property directly on
676
+ // itself (in other words, not on a prototype). Unlike the internal `has`
677
+ // function, this public version can also traverse nested properties.
678
+ function has(obj, path) {
679
+ path = toPath(path);
680
+ var length = path.length;
681
+ for (var i = 0; i < length; i++) {
682
+ var key = path[i];
683
+ if (!has$1(obj, key)) return false;
684
+ obj = obj[key];
1127
685
  }
686
+ return !!length;
687
+ }
1128
688
 
1129
- var areArrays = className === '[object Array]';
1130
- if (!areArrays) {
1131
- if (typeof a != 'object' || typeof b != 'object') return false;
689
+ // Keep the identity function around for default iteratees.
690
+ function identity(value) {
691
+ return value;
692
+ }
1132
693
 
1133
- // Objects with different constructors are not equivalent, but `Object`s or `Array`s
1134
- // from different frames are.
1135
- var aCtor = a.constructor, bCtor = b.constructor;
1136
- if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
1137
- _.isFunction(bCtor) && bCtor instanceof bCtor)
1138
- && ('constructor' in a && 'constructor' in b)) {
1139
- return false;
1140
- }
694
+ // Returns a predicate for checking whether an object has a given set of
695
+ // `key:value` pairs.
696
+ function matcher(attrs) {
697
+ attrs = extendOwn({}, attrs);
698
+ return function(obj) {
699
+ return isMatch(obj, attrs);
700
+ };
701
+ }
702
+
703
+ // Creates a function that, when passed an object, will traverse that object’s
704
+ // properties down the given `path`, specified as an array of keys or indices.
705
+ function property(path) {
706
+ path = toPath(path);
707
+ return function(obj) {
708
+ return deepGet(obj, path);
709
+ };
710
+ }
711
+
712
+ // Internal function that returns an efficient (for current engines) version
713
+ // of the passed-in callback, to be repeatedly applied in other Underscore
714
+ // functions.
715
+ function optimizeCb(func, context, argCount) {
716
+ if (context === void 0) return func;
717
+ switch (argCount == null ? 3 : argCount) {
718
+ case 1: return function(value) {
719
+ return func.call(context, value);
720
+ };
721
+ // The 2-argument case is omitted because we’re not using it.
722
+ case 3: return function(value, index, collection) {
723
+ return func.call(context, value, index, collection);
724
+ };
725
+ case 4: return function(accumulator, value, index, collection) {
726
+ return func.call(context, accumulator, value, index, collection);
727
+ };
1141
728
  }
1142
- // Assume equality for cyclic structures. The algorithm for detecting cyclic
1143
- // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
729
+ return function() {
730
+ return func.apply(context, arguments);
731
+ };
732
+ }
1144
733
 
1145
- // Initializing stack of traversed objects.
1146
- // It's done here since we only need them for objects and arrays comparison.
1147
- aStack = aStack || [];
1148
- bStack = bStack || [];
1149
- var length = aStack.length;
1150
- while (length--) {
1151
- // Linear search. Performance is inversely proportional to the number of
1152
- // unique nested structures.
1153
- if (aStack[length] === a) return bStack[length] === b;
734
+ // An internal function to generate callbacks that can be applied to each
735
+ // element in a collection, returning the desired result either `_.identity`,
736
+ // an arbitrary callback, a property matcher, or a property accessor.
737
+ function baseIteratee(value, context, argCount) {
738
+ if (value == null) return identity;
739
+ if (isFunction$1(value)) return optimizeCb(value, context, argCount);
740
+ if (isObject(value) && !isArray(value)) return matcher(value);
741
+ return property(value);
742
+ }
743
+
744
+ // External wrapper for our callback generator. Users may customize
745
+ // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
746
+ // This abstraction hides the internal-only `argCount` argument.
747
+ function iteratee(value, context) {
748
+ return baseIteratee(value, context, Infinity);
749
+ }
750
+ _$1.iteratee = iteratee;
751
+
752
+ // The function we call internally to generate a callback. It invokes
753
+ // `_.iteratee` if overridden, otherwise `baseIteratee`.
754
+ function cb(value, context, argCount) {
755
+ if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);
756
+ return baseIteratee(value, context, argCount);
757
+ }
758
+
759
+ // Returns the results of applying the `iteratee` to each element of `obj`.
760
+ // In contrast to `_.map` it returns an object.
761
+ function mapObject(obj, iteratee, context) {
762
+ iteratee = cb(iteratee, context);
763
+ var _keys = keys(obj),
764
+ length = _keys.length,
765
+ results = {};
766
+ for (var index = 0; index < length; index++) {
767
+ var currentKey = _keys[index];
768
+ results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
1154
769
  }
770
+ return results;
771
+ }
1155
772
 
1156
- // Add the first object to the stack of traversed objects.
1157
- aStack.push(a);
1158
- bStack.push(b);
773
+ // Predicate-generating function. Often useful outside of Underscore.
774
+ function noop(){}
1159
775
 
1160
- // Recursively compare objects and arrays.
1161
- if (areArrays) {
1162
- // Compare array lengths to determine if a deep comparison is necessary.
1163
- length = a.length;
1164
- if (length !== b.length) return false;
1165
- // Deep compare the contents, ignoring non-numeric properties.
1166
- while (length--) {
1167
- if (!eq(a[length], b[length], aStack, bStack)) return false;
1168
- }
1169
- } else {
1170
- // Deep compare objects.
1171
- var keys = _.keys(a), key;
1172
- length = keys.length;
1173
- // Ensure that both objects contain the same number of properties before comparing deep equality.
1174
- if (_.keys(b).length !== length) return false;
1175
- while (length--) {
1176
- // Deep compare each member
1177
- key = keys[length];
1178
- if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
1179
- }
776
+ // Generates a function for a given object that returns a given property.
777
+ function propertyOf(obj) {
778
+ if (obj == null) return noop;
779
+ return function(path) {
780
+ return get(obj, path);
781
+ };
782
+ }
783
+
784
+ // Run a function **n** times.
785
+ function times(n, iteratee, context) {
786
+ var accum = Array(Math.max(0, n));
787
+ iteratee = optimizeCb(iteratee, context, 1);
788
+ for (var i = 0; i < n; i++) accum[i] = iteratee(i);
789
+ return accum;
790
+ }
791
+
792
+ // Return a random integer between `min` and `max` (inclusive).
793
+ function random(min, max) {
794
+ if (max == null) {
795
+ max = min;
796
+ min = 0;
1180
797
  }
1181
- // Remove the first object from the stack of traversed objects.
1182
- aStack.pop();
1183
- bStack.pop();
1184
- return true;
1185
- };
798
+ return min + Math.floor(Math.random() * (max - min + 1));
799
+ }
1186
800
 
1187
- // Perform a deep comparison to check if two objects are equal.
1188
- _.isEqual = function(a, b) {
1189
- return eq(a, b);
801
+ // A (possibly faster) way to get the current timestamp as an integer.
802
+ var now = Date.now || function() {
803
+ return new Date().getTime();
1190
804
  };
1191
805
 
1192
- // Is a given array, string, or object empty?
1193
- // An "empty" object has no enumerable own-properties.
1194
- _.isEmpty = function(obj) {
1195
- if (obj == null) return true;
1196
- if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
1197
- return _.keys(obj).length === 0;
1198
- };
806
+ // Internal helper to generate functions for escaping and unescaping strings
807
+ // to/from HTML interpolation.
808
+ function createEscaper(map) {
809
+ var escaper = function(match) {
810
+ return map[match];
811
+ };
812
+ // Regexes for identifying a key that needs to be escaped.
813
+ var source = '(?:' + keys(map).join('|') + ')';
814
+ var testRegexp = RegExp(source);
815
+ var replaceRegexp = RegExp(source, 'g');
816
+ return function(string) {
817
+ string = string == null ? '' : '' + string;
818
+ return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
819
+ };
820
+ }
1199
821
 
1200
- // Is a given value a DOM element?
1201
- _.isElement = function(obj) {
1202
- return !!(obj && obj.nodeType === 1);
822
+ // Internal list of HTML entities for escaping.
823
+ var escapeMap = {
824
+ '&': '&amp;',
825
+ '<': '&lt;',
826
+ '>': '&gt;',
827
+ '"': '&quot;',
828
+ "'": '&#x27;',
829
+ '`': '&#x60;'
1203
830
  };
1204
831
 
1205
- // Is a given value an array?
1206
- // Delegates to ECMA5's native Array.isArray
1207
- _.isArray = nativeIsArray || function(obj) {
1208
- return toString.call(obj) === '[object Array]';
832
+ // Function for escaping strings to HTML interpolation.
833
+ var _escape = createEscaper(escapeMap);
834
+
835
+ // Internal list of HTML entities for unescaping.
836
+ var unescapeMap = invert(escapeMap);
837
+
838
+ // Function for unescaping strings from HTML interpolation.
839
+ var _unescape = createEscaper(unescapeMap);
840
+
841
+ // By default, Underscore uses ERB-style template delimiters. Change the
842
+ // following template settings to use alternative delimiters.
843
+ var templateSettings = _$1.templateSettings = {
844
+ evaluate: /<%([\s\S]+?)%>/g,
845
+ interpolate: /<%=([\s\S]+?)%>/g,
846
+ escape: /<%-([\s\S]+?)%>/g
1209
847
  };
1210
848
 
1211
- // Is a given variable an object?
1212
- _.isObject = function(obj) {
1213
- var type = typeof obj;
1214
- return type === 'function' || type === 'object' && !!obj;
849
+ // When customizing `_.templateSettings`, if you don't want to define an
850
+ // interpolation, evaluation or escaping regex, we need one that is
851
+ // guaranteed not to match.
852
+ var noMatch = /(.)^/;
853
+
854
+ // Certain characters need to be escaped so that they can be put into a
855
+ // string literal.
856
+ var escapes = {
857
+ "'": "'",
858
+ '\\': '\\',
859
+ '\r': 'r',
860
+ '\n': 'n',
861
+ '\u2028': 'u2028',
862
+ '\u2029': 'u2029'
1215
863
  };
1216
864
 
1217
- // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
1218
- _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
1219
- _['is' + name] = function(obj) {
1220
- return toString.call(obj) === '[object ' + name + ']';
1221
- };
1222
- });
865
+ var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
1223
866
 
1224
- // Define a fallback version of the method in browsers (ahem, IE < 9), where
1225
- // there isn't any inspectable "Arguments" type.
1226
- if (!_.isArguments(arguments)) {
1227
- _.isArguments = function(obj) {
1228
- return _.has(obj, 'callee');
1229
- };
867
+ function escapeChar(match) {
868
+ return '\\' + escapes[match];
1230
869
  }
1231
870
 
1232
- // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
1233
- // IE 11 (#1621), and in Safari 8 (#1929).
1234
- if (typeof /./ != 'function' && typeof Int8Array != 'object') {
1235
- _.isFunction = function(obj) {
1236
- return typeof obj == 'function' || false;
1237
- };
1238
- }
871
+ // In order to prevent third-party code injection through
872
+ // `_.templateSettings.variable`, we test it against the following regular
873
+ // expression. It is intentionally a bit more liberal than just matching valid
874
+ // identifiers, but still prevents possible loopholes through defaults or
875
+ // destructuring assignment.
876
+ var bareIdentifier = /^\s*(\w|\$)+\s*$/;
1239
877
 
1240
- // Is a given object a finite number?
1241
- _.isFinite = function(obj) {
1242
- return isFinite(obj) && !isNaN(parseFloat(obj));
1243
- };
878
+ // JavaScript micro-templating, similar to John Resig's implementation.
879
+ // Underscore templating handles arbitrary delimiters, preserves whitespace,
880
+ // and correctly escapes quotes within interpolated code.
881
+ // NB: `oldSettings` only exists for backwards compatibility.
882
+ function template(text, settings, oldSettings) {
883
+ if (!settings && oldSettings) settings = oldSettings;
884
+ settings = defaults({}, settings, _$1.templateSettings);
1244
885
 
1245
- // Is the given value `NaN`? (NaN is the only number which does not equal itself).
1246
- _.isNaN = function(obj) {
1247
- return _.isNumber(obj) && obj !== +obj;
1248
- };
886
+ // Combine delimiters into one regular expression via alternation.
887
+ var matcher = RegExp([
888
+ (settings.escape || noMatch).source,
889
+ (settings.interpolate || noMatch).source,
890
+ (settings.evaluate || noMatch).source
891
+ ].join('|') + '|$', 'g');
1249
892
 
1250
- // Is a given value a boolean?
1251
- _.isBoolean = function(obj) {
1252
- return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
1253
- };
893
+ // Compile the template source, escaping string literals appropriately.
894
+ var index = 0;
895
+ var source = "__p+='";
896
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
897
+ source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
898
+ index = offset + match.length;
1254
899
 
1255
- // Is a given value equal to null?
1256
- _.isNull = function(obj) {
1257
- return obj === null;
1258
- };
900
+ if (escape) {
901
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
902
+ } else if (interpolate) {
903
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
904
+ } else if (evaluate) {
905
+ source += "';\n" + evaluate + "\n__p+='";
906
+ }
1259
907
 
1260
- // Is a given variable undefined?
1261
- _.isUndefined = function(obj) {
1262
- return obj === void 0;
1263
- };
908
+ // Adobe VMs need the match returned to produce the correct offset.
909
+ return match;
910
+ });
911
+ source += "';\n";
1264
912
 
1265
- // Shortcut function for checking if an object has a given property directly
1266
- // on itself (in other words, not on a prototype).
1267
- _.has = function(obj, key) {
1268
- return obj != null && hasOwnProperty.call(obj, key);
1269
- };
913
+ var argument = settings.variable;
914
+ if (argument) {
915
+ // Insure against third-party code injection. (CVE-2021-23358)
916
+ if (!bareIdentifier.test(argument)) throw new Error(
917
+ 'variable is not a bare identifier: ' + argument
918
+ );
919
+ } else {
920
+ // If a variable is not specified, place data values in local scope.
921
+ source = 'with(obj||{}){\n' + source + '}\n';
922
+ argument = 'obj';
923
+ }
924
+
925
+ source = "var __t,__p='',__j=Array.prototype.join," +
926
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
927
+ source + 'return __p;\n';
1270
928
 
1271
- // Utility Functions
1272
- // -----------------
929
+ var render;
930
+ try {
931
+ render = new Function(argument, '_', source);
932
+ } catch (e) {
933
+ e.source = source;
934
+ throw e;
935
+ }
1273
936
 
1274
- // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
1275
- // previous owner. Returns a reference to the Underscore object.
1276
- _.noConflict = function() {
1277
- root._ = previousUnderscore;
1278
- return this;
1279
- };
937
+ var template = function(data) {
938
+ return render.call(this, data, _$1);
939
+ };
1280
940
 
1281
- // Keep the identity function around for default iteratees.
1282
- _.identity = function(value) {
1283
- return value;
1284
- };
941
+ // Provide the compiled source as a convenience for precompilation.
942
+ template.source = 'function(' + argument + '){\n' + source + '}';
943
+
944
+ return template;
945
+ }
946
+
947
+ // Traverses the children of `obj` along `path`. If a child is a function, it
948
+ // is invoked with its parent as context. Returns the value of the final
949
+ // child, or `fallback` if any child is undefined.
950
+ function result(obj, path, fallback) {
951
+ path = toPath(path);
952
+ var length = path.length;
953
+ if (!length) {
954
+ return isFunction$1(fallback) ? fallback.call(obj) : fallback;
955
+ }
956
+ for (var i = 0; i < length; i++) {
957
+ var prop = obj == null ? void 0 : obj[path[i]];
958
+ if (prop === void 0) {
959
+ prop = fallback;
960
+ i = length; // Ensure we don't continue iterating.
961
+ }
962
+ obj = isFunction$1(prop) ? prop.call(obj) : prop;
963
+ }
964
+ return obj;
965
+ }
966
+
967
+ // Generate a unique integer id (unique within the entire client session).
968
+ // Useful for temporary DOM ids.
969
+ var idCounter = 0;
970
+ function uniqueId(prefix) {
971
+ var id = ++idCounter + '';
972
+ return prefix ? prefix + id : id;
973
+ }
974
+
975
+ // Start chaining a wrapped Underscore object.
976
+ function chain(obj) {
977
+ var instance = _$1(obj);
978
+ instance._chain = true;
979
+ return instance;
980
+ }
981
+
982
+ // Internal function to execute `sourceFunc` bound to `context` with optional
983
+ // `args`. Determines whether to execute a function as a constructor or as a
984
+ // normal function.
985
+ function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
986
+ if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
987
+ var self = baseCreate(sourceFunc.prototype);
988
+ var result = sourceFunc.apply(self, args);
989
+ if (isObject(result)) return result;
990
+ return self;
991
+ }
992
+
993
+ // Partially apply a function by creating a version that has had some of its
994
+ // arguments pre-filled, without changing its dynamic `this` context. `_` acts
995
+ // as a placeholder by default, allowing any combination of arguments to be
996
+ // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
997
+ var partial = restArguments(function(func, boundArgs) {
998
+ var placeholder = partial.placeholder;
999
+ var bound = function() {
1000
+ var position = 0, length = boundArgs.length;
1001
+ var args = Array(length);
1002
+ for (var i = 0; i < length; i++) {
1003
+ args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
1004
+ }
1005
+ while (position < arguments.length) args.push(arguments[position++]);
1006
+ return executeBound(func, bound, this, this, args);
1007
+ };
1008
+ return bound;
1009
+ });
1010
+
1011
+ partial.placeholder = _$1;
1012
+
1013
+ // Create a function bound to a given object (assigning `this`, and arguments,
1014
+ // optionally).
1015
+ var bind = restArguments(function(func, context, args) {
1016
+ if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
1017
+ var bound = restArguments(function(callArgs) {
1018
+ return executeBound(func, bound, context, this, args.concat(callArgs));
1019
+ });
1020
+ return bound;
1021
+ });
1022
+
1023
+ // Internal helper for collection methods to determine whether a collection
1024
+ // should be iterated as an array or as an object.
1025
+ // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
1026
+ // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
1027
+ var isArrayLike = createSizePropertyCheck(getLength);
1028
+
1029
+ // Internal implementation of a recursive `flatten` function.
1030
+ function flatten$1(input, depth, strict, output) {
1031
+ output = output || [];
1032
+ if (!depth && depth !== 0) {
1033
+ depth = Infinity;
1034
+ } else if (depth <= 0) {
1035
+ return output.concat(input);
1036
+ }
1037
+ var idx = output.length;
1038
+ for (var i = 0, length = getLength(input); i < length; i++) {
1039
+ var value = input[i];
1040
+ if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
1041
+ // Flatten current level of array or arguments object.
1042
+ if (depth > 1) {
1043
+ flatten$1(value, depth - 1, strict, output);
1044
+ idx = output.length;
1045
+ } else {
1046
+ var j = 0, len = value.length;
1047
+ while (j < len) output[idx++] = value[j++];
1048
+ }
1049
+ } else if (!strict) {
1050
+ output[idx++] = value;
1051
+ }
1052
+ }
1053
+ return output;
1054
+ }
1055
+
1056
+ // Bind a number of an object's methods to that object. Remaining arguments
1057
+ // are the method names to be bound. Useful for ensuring that all callbacks
1058
+ // defined on an object belong to it.
1059
+ var bindAll = restArguments(function(obj, keys) {
1060
+ keys = flatten$1(keys, false, false);
1061
+ var index = keys.length;
1062
+ if (index < 1) throw new Error('bindAll must be passed function names');
1063
+ while (index--) {
1064
+ var key = keys[index];
1065
+ obj[key] = bind(obj[key], obj);
1066
+ }
1067
+ return obj;
1068
+ });
1069
+
1070
+ // Memoize an expensive function by storing its results.
1071
+ function memoize(func, hasher) {
1072
+ var memoize = function(key) {
1073
+ var cache = memoize.cache;
1074
+ var address = '' + (hasher ? hasher.apply(this, arguments) : key);
1075
+ if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);
1076
+ return cache[address];
1077
+ };
1078
+ memoize.cache = {};
1079
+ return memoize;
1080
+ }
1081
+
1082
+ // Delays a function for the given number of milliseconds, and then calls
1083
+ // it with the arguments supplied.
1084
+ var delay = restArguments(function(func, wait, args) {
1085
+ return setTimeout(function() {
1086
+ return func.apply(null, args);
1087
+ }, wait);
1088
+ });
1089
+
1090
+ // Defers a function, scheduling it to run after the current call stack has
1091
+ // cleared.
1092
+ var defer = partial(delay, _$1, 1);
1093
+
1094
+ // Returns a function, that, when invoked, will only be triggered at most once
1095
+ // during a given window of time. Normally, the throttled function will run
1096
+ // as much as it can, without ever going more than once per `wait` duration;
1097
+ // but if you'd like to disable the execution on the leading edge, pass
1098
+ // `{leading: false}`. To disable execution on the trailing edge, ditto.
1099
+ function throttle(func, wait, options) {
1100
+ var timeout, context, args, result;
1101
+ var previous = 0;
1102
+ if (!options) options = {};
1103
+
1104
+ var later = function() {
1105
+ previous = options.leading === false ? 0 : now();
1106
+ timeout = null;
1107
+ result = func.apply(context, args);
1108
+ if (!timeout) context = args = null;
1109
+ };
1110
+
1111
+ var throttled = function() {
1112
+ var _now = now();
1113
+ if (!previous && options.leading === false) previous = _now;
1114
+ var remaining = wait - (_now - previous);
1115
+ context = this;
1116
+ args = arguments;
1117
+ if (remaining <= 0 || remaining > wait) {
1118
+ if (timeout) {
1119
+ clearTimeout(timeout);
1120
+ timeout = null;
1121
+ }
1122
+ previous = _now;
1123
+ result = func.apply(context, args);
1124
+ if (!timeout) context = args = null;
1125
+ } else if (!timeout && options.trailing !== false) {
1126
+ timeout = setTimeout(later, remaining);
1127
+ }
1128
+ return result;
1129
+ };
1130
+
1131
+ throttled.cancel = function() {
1132
+ clearTimeout(timeout);
1133
+ previous = 0;
1134
+ timeout = context = args = null;
1135
+ };
1136
+
1137
+ return throttled;
1138
+ }
1139
+
1140
+ // When a sequence of calls of the returned function ends, the argument
1141
+ // function is triggered. The end of a sequence is defined by the `wait`
1142
+ // parameter. If `immediate` is passed, the argument function will be
1143
+ // triggered at the beginning of the sequence instead of at the end.
1144
+ function debounce(func, wait, immediate) {
1145
+ var timeout, previous, args, result, context;
1146
+
1147
+ var later = function() {
1148
+ var passed = now() - previous;
1149
+ if (wait > passed) {
1150
+ timeout = setTimeout(later, wait - passed);
1151
+ } else {
1152
+ timeout = null;
1153
+ if (!immediate) result = func.apply(context, args);
1154
+ // This check is needed because `func` can recursively invoke `debounced`.
1155
+ if (!timeout) args = context = null;
1156
+ }
1157
+ };
1158
+
1159
+ var debounced = restArguments(function(_args) {
1160
+ context = this;
1161
+ args = _args;
1162
+ previous = now();
1163
+ if (!timeout) {
1164
+ timeout = setTimeout(later, wait);
1165
+ if (immediate) result = func.apply(context, args);
1166
+ }
1167
+ return result;
1168
+ });
1169
+
1170
+ debounced.cancel = function() {
1171
+ clearTimeout(timeout);
1172
+ timeout = args = context = null;
1173
+ };
1174
+
1175
+ return debounced;
1176
+ }
1177
+
1178
+ // Returns the first function passed as an argument to the second,
1179
+ // allowing you to adjust arguments, run code before and after, and
1180
+ // conditionally execute the original function.
1181
+ function wrap(func, wrapper) {
1182
+ return partial(wrapper, func);
1183
+ }
1184
+
1185
+ // Returns a negated version of the passed-in predicate.
1186
+ function negate(predicate) {
1187
+ return function() {
1188
+ return !predicate.apply(this, arguments);
1189
+ };
1190
+ }
1191
+
1192
+ // Returns a function that is the composition of a list of functions, each
1193
+ // consuming the return value of the function that follows.
1194
+ function compose() {
1195
+ var args = arguments;
1196
+ var start = args.length - 1;
1197
+ return function() {
1198
+ var i = start;
1199
+ var result = args[start].apply(this, arguments);
1200
+ while (i--) result = args[i].call(this, result);
1201
+ return result;
1202
+ };
1203
+ }
1204
+
1205
+ // Returns a function that will only be executed on and after the Nth call.
1206
+ function after(times, func) {
1207
+ return function() {
1208
+ if (--times < 1) {
1209
+ return func.apply(this, arguments);
1210
+ }
1211
+ };
1212
+ }
1213
+
1214
+ // Returns a function that will only be executed up to (but not including) the
1215
+ // Nth call.
1216
+ function before(times, func) {
1217
+ var memo;
1218
+ return function() {
1219
+ if (--times > 0) {
1220
+ memo = func.apply(this, arguments);
1221
+ }
1222
+ if (times <= 1) func = null;
1223
+ return memo;
1224
+ };
1225
+ }
1226
+
1227
+ // Returns a function that will be executed at most one time, no matter how
1228
+ // often you call it. Useful for lazy initialization.
1229
+ var once = partial(before, 2);
1230
+
1231
+ // Returns the first key on an object that passes a truth test.
1232
+ function findKey(obj, predicate, context) {
1233
+ predicate = cb(predicate, context);
1234
+ var _keys = keys(obj), key;
1235
+ for (var i = 0, length = _keys.length; i < length; i++) {
1236
+ key = _keys[i];
1237
+ if (predicate(obj[key], key, obj)) return key;
1238
+ }
1239
+ }
1240
+
1241
+ // Internal function to generate `_.findIndex` and `_.findLastIndex`.
1242
+ function createPredicateIndexFinder(dir) {
1243
+ return function(array, predicate, context) {
1244
+ predicate = cb(predicate, context);
1245
+ var length = getLength(array);
1246
+ var index = dir > 0 ? 0 : length - 1;
1247
+ for (; index >= 0 && index < length; index += dir) {
1248
+ if (predicate(array[index], index, array)) return index;
1249
+ }
1250
+ return -1;
1251
+ };
1252
+ }
1253
+
1254
+ // Returns the first index on an array-like that passes a truth test.
1255
+ var findIndex = createPredicateIndexFinder(1);
1256
+
1257
+ // Returns the last index on an array-like that passes a truth test.
1258
+ var findLastIndex = createPredicateIndexFinder(-1);
1259
+
1260
+ // Use a comparator function to figure out the smallest index at which
1261
+ // an object should be inserted so as to maintain order. Uses binary search.
1262
+ function sortedIndex(array, obj, iteratee, context) {
1263
+ iteratee = cb(iteratee, context, 1);
1264
+ var value = iteratee(obj);
1265
+ var low = 0, high = getLength(array);
1266
+ while (low < high) {
1267
+ var mid = Math.floor((low + high) / 2);
1268
+ if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
1269
+ }
1270
+ return low;
1271
+ }
1272
+
1273
+ // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
1274
+ function createIndexFinder(dir, predicateFind, sortedIndex) {
1275
+ return function(array, item, idx) {
1276
+ var i = 0, length = getLength(array);
1277
+ if (typeof idx == 'number') {
1278
+ if (dir > 0) {
1279
+ i = idx >= 0 ? idx : Math.max(idx + length, i);
1280
+ } else {
1281
+ length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
1282
+ }
1283
+ } else if (sortedIndex && idx && length) {
1284
+ idx = sortedIndex(array, item);
1285
+ return array[idx] === item ? idx : -1;
1286
+ }
1287
+ if (item !== item) {
1288
+ idx = predicateFind(slice.call(array, i, length), isNaN$1);
1289
+ return idx >= 0 ? idx + i : -1;
1290
+ }
1291
+ for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
1292
+ if (array[idx] === item) return idx;
1293
+ }
1294
+ return -1;
1295
+ };
1296
+ }
1297
+
1298
+ // Return the position of the first occurrence of an item in an array,
1299
+ // or -1 if the item is not included in the array.
1300
+ // If the array is large and already in sort order, pass `true`
1301
+ // for **isSorted** to use binary search.
1302
+ var indexOf = createIndexFinder(1, findIndex, sortedIndex);
1303
+
1304
+ // Return the position of the last occurrence of an item in an array,
1305
+ // or -1 if the item is not included in the array.
1306
+ var lastIndexOf = createIndexFinder(-1, findLastIndex);
1307
+
1308
+ // Return the first value which passes a truth test.
1309
+ function find(obj, predicate, context) {
1310
+ var keyFinder = isArrayLike(obj) ? findIndex : findKey;
1311
+ var key = keyFinder(obj, predicate, context);
1312
+ if (key !== void 0 && key !== -1) return obj[key];
1313
+ }
1314
+
1315
+ // Convenience version of a common use case of `_.find`: getting the first
1316
+ // object containing specific `key:value` pairs.
1317
+ function findWhere(obj, attrs) {
1318
+ return find(obj, matcher(attrs));
1319
+ }
1320
+
1321
+ // The cornerstone for collection functions, an `each`
1322
+ // implementation, aka `forEach`.
1323
+ // Handles raw objects in addition to array-likes. Treats all
1324
+ // sparse array-likes as if they were dense.
1325
+ function each(obj, iteratee, context) {
1326
+ iteratee = optimizeCb(iteratee, context);
1327
+ var i, length;
1328
+ if (isArrayLike(obj)) {
1329
+ for (i = 0, length = obj.length; i < length; i++) {
1330
+ iteratee(obj[i], i, obj);
1331
+ }
1332
+ } else {
1333
+ var _keys = keys(obj);
1334
+ for (i = 0, length = _keys.length; i < length; i++) {
1335
+ iteratee(obj[_keys[i]], _keys[i], obj);
1336
+ }
1337
+ }
1338
+ return obj;
1339
+ }
1340
+
1341
+ // Return the results of applying the iteratee to each element.
1342
+ function map(obj, iteratee, context) {
1343
+ iteratee = cb(iteratee, context);
1344
+ var _keys = !isArrayLike(obj) && keys(obj),
1345
+ length = (_keys || obj).length,
1346
+ results = Array(length);
1347
+ for (var index = 0; index < length; index++) {
1348
+ var currentKey = _keys ? _keys[index] : index;
1349
+ results[index] = iteratee(obj[currentKey], currentKey, obj);
1350
+ }
1351
+ return results;
1352
+ }
1353
+
1354
+ // Internal helper to create a reducing function, iterating left or right.
1355
+ function createReduce(dir) {
1356
+ // Wrap code that reassigns argument variables in a separate function than
1357
+ // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
1358
+ var reducer = function(obj, iteratee, memo, initial) {
1359
+ var _keys = !isArrayLike(obj) && keys(obj),
1360
+ length = (_keys || obj).length,
1361
+ index = dir > 0 ? 0 : length - 1;
1362
+ if (!initial) {
1363
+ memo = obj[_keys ? _keys[index] : index];
1364
+ index += dir;
1365
+ }
1366
+ for (; index >= 0 && index < length; index += dir) {
1367
+ var currentKey = _keys ? _keys[index] : index;
1368
+ memo = iteratee(memo, obj[currentKey], currentKey, obj);
1369
+ }
1370
+ return memo;
1371
+ };
1372
+
1373
+ return function(obj, iteratee, memo, context) {
1374
+ var initial = arguments.length >= 3;
1375
+ return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
1376
+ };
1377
+ }
1378
+
1379
+ // **Reduce** builds up a single result from a list of values, aka `inject`,
1380
+ // or `foldl`.
1381
+ var reduce = createReduce(1);
1382
+
1383
+ // The right-associative version of reduce, also known as `foldr`.
1384
+ var reduceRight = createReduce(-1);
1385
+
1386
+ // Return all the elements that pass a truth test.
1387
+ function filter(obj, predicate, context) {
1388
+ var results = [];
1389
+ predicate = cb(predicate, context);
1390
+ each(obj, function(value, index, list) {
1391
+ if (predicate(value, index, list)) results.push(value);
1392
+ });
1393
+ return results;
1394
+ }
1395
+
1396
+ // Return all the elements for which a truth test fails.
1397
+ function reject(obj, predicate, context) {
1398
+ return filter(obj, negate(cb(predicate)), context);
1399
+ }
1400
+
1401
+ // Determine whether all of the elements pass a truth test.
1402
+ function every(obj, predicate, context) {
1403
+ predicate = cb(predicate, context);
1404
+ var _keys = !isArrayLike(obj) && keys(obj),
1405
+ length = (_keys || obj).length;
1406
+ for (var index = 0; index < length; index++) {
1407
+ var currentKey = _keys ? _keys[index] : index;
1408
+ if (!predicate(obj[currentKey], currentKey, obj)) return false;
1409
+ }
1410
+ return true;
1411
+ }
1412
+
1413
+ // Determine if at least one element in the object passes a truth test.
1414
+ function some(obj, predicate, context) {
1415
+ predicate = cb(predicate, context);
1416
+ var _keys = !isArrayLike(obj) && keys(obj),
1417
+ length = (_keys || obj).length;
1418
+ for (var index = 0; index < length; index++) {
1419
+ var currentKey = _keys ? _keys[index] : index;
1420
+ if (predicate(obj[currentKey], currentKey, obj)) return true;
1421
+ }
1422
+ return false;
1423
+ }
1424
+
1425
+ // Determine if the array or object contains a given item (using `===`).
1426
+ function contains(obj, item, fromIndex, guard) {
1427
+ if (!isArrayLike(obj)) obj = values(obj);
1428
+ if (typeof fromIndex != 'number' || guard) fromIndex = 0;
1429
+ return indexOf(obj, item, fromIndex) >= 0;
1430
+ }
1431
+
1432
+ // Invoke a method (with arguments) on every item in a collection.
1433
+ var invoke = restArguments(function(obj, path, args) {
1434
+ var contextPath, func;
1435
+ if (isFunction$1(path)) {
1436
+ func = path;
1437
+ } else {
1438
+ path = toPath(path);
1439
+ contextPath = path.slice(0, -1);
1440
+ path = path[path.length - 1];
1441
+ }
1442
+ return map(obj, function(context) {
1443
+ var method = func;
1444
+ if (!method) {
1445
+ if (contextPath && contextPath.length) {
1446
+ context = deepGet(context, contextPath);
1447
+ }
1448
+ if (context == null) return void 0;
1449
+ method = context[path];
1450
+ }
1451
+ return method == null ? method : method.apply(context, args);
1452
+ });
1453
+ });
1454
+
1455
+ // Convenience version of a common use case of `_.map`: fetching a property.
1456
+ function pluck(obj, key) {
1457
+ return map(obj, property(key));
1458
+ }
1459
+
1460
+ // Convenience version of a common use case of `_.filter`: selecting only
1461
+ // objects containing specific `key:value` pairs.
1462
+ function where(obj, attrs) {
1463
+ return filter(obj, matcher(attrs));
1464
+ }
1465
+
1466
+ // Return the maximum element (or element-based computation).
1467
+ function max(obj, iteratee, context) {
1468
+ var result = -Infinity, lastComputed = -Infinity,
1469
+ value, computed;
1470
+ if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {
1471
+ obj = isArrayLike(obj) ? obj : values(obj);
1472
+ for (var i = 0, length = obj.length; i < length; i++) {
1473
+ value = obj[i];
1474
+ if (value != null && value > result) {
1475
+ result = value;
1476
+ }
1477
+ }
1478
+ } else {
1479
+ iteratee = cb(iteratee, context);
1480
+ each(obj, function(v, index, list) {
1481
+ computed = iteratee(v, index, list);
1482
+ if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) {
1483
+ result = v;
1484
+ lastComputed = computed;
1485
+ }
1486
+ });
1487
+ }
1488
+ return result;
1489
+ }
1490
+
1491
+ // Return the minimum element (or element-based computation).
1492
+ function min(obj, iteratee, context) {
1493
+ var result = Infinity, lastComputed = Infinity,
1494
+ value, computed;
1495
+ if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {
1496
+ obj = isArrayLike(obj) ? obj : values(obj);
1497
+ for (var i = 0, length = obj.length; i < length; i++) {
1498
+ value = obj[i];
1499
+ if (value != null && value < result) {
1500
+ result = value;
1501
+ }
1502
+ }
1503
+ } else {
1504
+ iteratee = cb(iteratee, context);
1505
+ each(obj, function(v, index, list) {
1506
+ computed = iteratee(v, index, list);
1507
+ if (computed < lastComputed || (computed === Infinity && result === Infinity)) {
1508
+ result = v;
1509
+ lastComputed = computed;
1510
+ }
1511
+ });
1512
+ }
1513
+ return result;
1514
+ }
1515
+
1516
+ // Safely create a real, live array from anything iterable.
1517
+ var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
1518
+ function toArray(obj) {
1519
+ if (!obj) return [];
1520
+ if (isArray(obj)) return slice.call(obj);
1521
+ if (isString(obj)) {
1522
+ // Keep surrogate pair characters together.
1523
+ return obj.match(reStrSymbol);
1524
+ }
1525
+ if (isArrayLike(obj)) return map(obj, identity);
1526
+ return values(obj);
1527
+ }
1528
+
1529
+ // Sample **n** random values from a collection using the modern version of the
1530
+ // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
1531
+ // If **n** is not specified, returns a single random element.
1532
+ // The internal `guard` argument allows it to work with `_.map`.
1533
+ function sample(obj, n, guard) {
1534
+ if (n == null || guard) {
1535
+ if (!isArrayLike(obj)) obj = values(obj);
1536
+ return obj[random(obj.length - 1)];
1537
+ }
1538
+ var sample = toArray(obj);
1539
+ var length = getLength(sample);
1540
+ n = Math.max(Math.min(n, length), 0);
1541
+ var last = length - 1;
1542
+ for (var index = 0; index < n; index++) {
1543
+ var rand = random(index, last);
1544
+ var temp = sample[index];
1545
+ sample[index] = sample[rand];
1546
+ sample[rand] = temp;
1547
+ }
1548
+ return sample.slice(0, n);
1549
+ }
1550
+
1551
+ // Shuffle a collection.
1552
+ function shuffle(obj) {
1553
+ return sample(obj, Infinity);
1554
+ }
1555
+
1556
+ // Sort the object's values by a criterion produced by an iteratee.
1557
+ function sortBy(obj, iteratee, context) {
1558
+ var index = 0;
1559
+ iteratee = cb(iteratee, context);
1560
+ return pluck(map(obj, function(value, key, list) {
1561
+ return {
1562
+ value: value,
1563
+ index: index++,
1564
+ criteria: iteratee(value, key, list)
1565
+ };
1566
+ }).sort(function(left, right) {
1567
+ var a = left.criteria;
1568
+ var b = right.criteria;
1569
+ if (a !== b) {
1570
+ if (a > b || a === void 0) return 1;
1571
+ if (a < b || b === void 0) return -1;
1572
+ }
1573
+ return left.index - right.index;
1574
+ }), 'value');
1575
+ }
1285
1576
 
1286
- // Predicate-generating functions. Often useful outside of Underscore.
1287
- _.constant = function(value) {
1288
- return function() {
1289
- return value;
1577
+ // An internal function used for aggregate "group by" operations.
1578
+ function group(behavior, partition) {
1579
+ return function(obj, iteratee, context) {
1580
+ var result = partition ? [[], []] : {};
1581
+ iteratee = cb(iteratee, context);
1582
+ each(obj, function(value, index) {
1583
+ var key = iteratee(value, index, obj);
1584
+ behavior(result, value, key);
1585
+ });
1586
+ return result;
1290
1587
  };
1291
- };
1292
-
1293
- _.noop = function(){};
1588
+ }
1294
1589
 
1295
- _.property = property;
1590
+ // Groups the object's values by a criterion. Pass either a string attribute
1591
+ // to group by, or a function that returns the criterion.
1592
+ var groupBy = group(function(result, value, key) {
1593
+ if (has$1(result, key)) result[key].push(value); else result[key] = [value];
1594
+ });
1296
1595
 
1297
- // Generates a function for a given object that returns a given property.
1298
- _.propertyOf = function(obj) {
1299
- return obj == null ? function(){} : function(key) {
1300
- return obj[key];
1301
- };
1302
- };
1596
+ // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
1597
+ // when you know that your index values will be unique.
1598
+ var indexBy = group(function(result, value, key) {
1599
+ result[key] = value;
1600
+ });
1303
1601
 
1304
- // Returns a predicate for checking whether an object has a given set of
1305
- // `key:value` pairs.
1306
- _.matcher = _.matches = function(attrs) {
1307
- attrs = _.extendOwn({}, attrs);
1308
- return function(obj) {
1309
- return _.isMatch(obj, attrs);
1310
- };
1311
- };
1602
+ // Counts instances of an object that group by a certain criterion. Pass
1603
+ // either a string attribute to count by, or a function that returns the
1604
+ // criterion.
1605
+ var countBy = group(function(result, value, key) {
1606
+ if (has$1(result, key)) result[key]++; else result[key] = 1;
1607
+ });
1312
1608
 
1313
- // Run a function **n** times.
1314
- _.times = function(n, iteratee, context) {
1315
- var accum = Array(Math.max(0, n));
1316
- iteratee = optimizeCb(iteratee, context, 1);
1317
- for (var i = 0; i < n; i++) accum[i] = iteratee(i);
1318
- return accum;
1319
- };
1609
+ // Split a collection into two arrays: one whose elements all pass the given
1610
+ // truth test, and one whose elements all do not pass the truth test.
1611
+ var partition = group(function(result, value, pass) {
1612
+ result[pass ? 0 : 1].push(value);
1613
+ }, true);
1320
1614
 
1321
- // Return a random integer between min and max (inclusive).
1322
- _.random = function(min, max) {
1323
- if (max == null) {
1324
- max = min;
1325
- min = 0;
1326
- }
1327
- return min + Math.floor(Math.random() * (max - min + 1));
1328
- };
1615
+ // Return the number of elements in a collection.
1616
+ function size(obj) {
1617
+ if (obj == null) return 0;
1618
+ return isArrayLike(obj) ? obj.length : keys(obj).length;
1619
+ }
1329
1620
 
1330
- // A (possibly faster) way to get the current timestamp as an integer.
1331
- _.now = Date.now || function() {
1332
- return new Date().getTime();
1333
- };
1621
+ // Internal `_.pick` helper function to determine whether `key` is an enumerable
1622
+ // property name of `obj`.
1623
+ function keyInObj(value, key, obj) {
1624
+ return key in obj;
1625
+ }
1334
1626
 
1335
- // List of HTML entities for escaping.
1336
- var escapeMap = {
1337
- '&': '&amp;',
1338
- '<': '&lt;',
1339
- '>': '&gt;',
1340
- '"': '&quot;',
1341
- "'": '&#x27;',
1342
- '`': '&#x60;'
1343
- };
1344
- var unescapeMap = _.invert(escapeMap);
1627
+ // Return a copy of the object only containing the allowed properties.
1628
+ var pick = restArguments(function(obj, keys) {
1629
+ var result = {}, iteratee = keys[0];
1630
+ if (obj == null) return result;
1631
+ if (isFunction$1(iteratee)) {
1632
+ if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
1633
+ keys = allKeys(obj);
1634
+ } else {
1635
+ iteratee = keyInObj;
1636
+ keys = flatten$1(keys, false, false);
1637
+ obj = Object(obj);
1638
+ }
1639
+ for (var i = 0, length = keys.length; i < length; i++) {
1640
+ var key = keys[i];
1641
+ var value = obj[key];
1642
+ if (iteratee(value, key, obj)) result[key] = value;
1643
+ }
1644
+ return result;
1645
+ });
1345
1646
 
1346
- // Functions for escaping and unescaping strings to/from HTML interpolation.
1347
- var createEscaper = function(map) {
1348
- var escaper = function(match) {
1349
- return map[match];
1350
- };
1351
- // Regexes for identifying a key that needs to be escaped
1352
- var source = '(?:' + _.keys(map).join('|') + ')';
1353
- var testRegexp = RegExp(source);
1354
- var replaceRegexp = RegExp(source, 'g');
1355
- return function(string) {
1356
- string = string == null ? '' : '' + string;
1357
- return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
1358
- };
1359
- };
1360
- _.escape = createEscaper(escapeMap);
1361
- _.unescape = createEscaper(unescapeMap);
1362
-
1363
- // If the value of the named `property` is a function then invoke it with the
1364
- // `object` as context; otherwise, return it.
1365
- _.result = function(object, property, fallback) {
1366
- var value = object == null ? void 0 : object[property];
1367
- if (value === void 0) {
1368
- value = fallback;
1647
+ // Return a copy of the object without the disallowed properties.
1648
+ var omit = restArguments(function(obj, keys) {
1649
+ var iteratee = keys[0], context;
1650
+ if (isFunction$1(iteratee)) {
1651
+ iteratee = negate(iteratee);
1652
+ if (keys.length > 1) context = keys[1];
1653
+ } else {
1654
+ keys = map(flatten$1(keys, false, false), String);
1655
+ iteratee = function(value, key) {
1656
+ return !contains(keys, key);
1657
+ };
1369
1658
  }
1370
- return _.isFunction(value) ? value.call(object) : value;
1371
- };
1659
+ return pick(obj, iteratee, context);
1660
+ });
1372
1661
 
1373
- // Generate a unique integer id (unique within the entire client session).
1374
- // Useful for temporary DOM ids.
1375
- var idCounter = 0;
1376
- _.uniqueId = function(prefix) {
1377
- var id = ++idCounter + '';
1378
- return prefix ? prefix + id : id;
1379
- };
1662
+ // Returns everything but the last entry of the array. Especially useful on
1663
+ // the arguments object. Passing **n** will return all the values in
1664
+ // the array, excluding the last N.
1665
+ function initial(array, n, guard) {
1666
+ return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
1667
+ }
1380
1668
 
1381
- // By default, Underscore uses ERB-style template delimiters, change the
1382
- // following template settings to use alternative delimiters.
1383
- _.templateSettings = {
1384
- evaluate : /<%([\s\S]+?)%>/g,
1385
- interpolate : /<%=([\s\S]+?)%>/g,
1386
- escape : /<%-([\s\S]+?)%>/g
1387
- };
1669
+ // Get the first element of an array. Passing **n** will return the first N
1670
+ // values in the array. The **guard** check allows it to work with `_.map`.
1671
+ function first(array, n, guard) {
1672
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
1673
+ if (n == null || guard) return array[0];
1674
+ return initial(array, array.length - n);
1675
+ }
1388
1676
 
1389
- // When customizing `templateSettings`, if you don't want to define an
1390
- // interpolation, evaluation or escaping regex, we need one that is
1391
- // guaranteed not to match.
1392
- var noMatch = /(.)^/;
1677
+ // Returns everything but the first entry of the `array`. Especially useful on
1678
+ // the `arguments` object. Passing an **n** will return the rest N values in the
1679
+ // `array`.
1680
+ function rest(array, n, guard) {
1681
+ return slice.call(array, n == null || guard ? 1 : n);
1682
+ }
1393
1683
 
1394
- // Certain characters need to be escaped so that they can be put into a
1395
- // string literal.
1396
- var escapes = {
1397
- "'": "'",
1398
- '\\': '\\',
1399
- '\r': 'r',
1400
- '\n': 'n',
1401
- '\u2028': 'u2028',
1402
- '\u2029': 'u2029'
1403
- };
1684
+ // Get the last element of an array. Passing **n** will return the last N
1685
+ // values in the array.
1686
+ function last(array, n, guard) {
1687
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
1688
+ if (n == null || guard) return array[array.length - 1];
1689
+ return rest(array, Math.max(0, array.length - n));
1690
+ }
1404
1691
 
1405
- var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
1692
+ // Trim out all falsy values from an array.
1693
+ function compact(array) {
1694
+ return filter(array, Boolean);
1695
+ }
1406
1696
 
1407
- var escapeChar = function(match) {
1408
- return '\\' + escapes[match];
1409
- };
1697
+ // Flatten out an array, either recursively (by default), or up to `depth`.
1698
+ // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
1699
+ function flatten(array, depth) {
1700
+ return flatten$1(array, depth, false);
1701
+ }
1410
1702
 
1411
- // JavaScript micro-templating, similar to John Resig's implementation.
1412
- // Underscore templating handles arbitrary delimiters, preserves whitespace,
1413
- // and correctly escapes quotes within interpolated code.
1414
- // NB: `oldSettings` only exists for backwards compatibility.
1415
- _.template = function(text, settings, oldSettings) {
1416
- if (!settings && oldSettings) settings = oldSettings;
1417
- settings = _.defaults({}, settings, _.templateSettings);
1703
+ // Take the difference between one array and a number of other arrays.
1704
+ // Only the elements present in just the first array will remain.
1705
+ var difference = restArguments(function(array, rest) {
1706
+ rest = flatten$1(rest, true, true);
1707
+ return filter(array, function(value){
1708
+ return !contains(rest, value);
1709
+ });
1710
+ });
1418
1711
 
1419
- // Combine delimiters into one regular expression via alternation.
1420
- var matcher = RegExp([
1421
- (settings.escape || noMatch).source,
1422
- (settings.interpolate || noMatch).source,
1423
- (settings.evaluate || noMatch).source
1424
- ].join('|') + '|$', 'g');
1712
+ // Return a version of the array that does not contain the specified value(s).
1713
+ var without = restArguments(function(array, otherArrays) {
1714
+ return difference(array, otherArrays);
1715
+ });
1425
1716
 
1426
- // Compile the template source, escaping string literals appropriately.
1427
- var index = 0;
1428
- var source = "__p+='";
1429
- text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
1430
- source += text.slice(index, offset).replace(escaper, escapeChar);
1431
- index = offset + match.length;
1717
+ // Produce a duplicate-free version of the array. If the array has already
1718
+ // been sorted, you have the option of using a faster algorithm.
1719
+ // The faster algorithm will not work with an iteratee if the iteratee
1720
+ // is not a one-to-one function, so providing an iteratee will disable
1721
+ // the faster algorithm.
1722
+ function uniq(array, isSorted, iteratee, context) {
1723
+ if (!isBoolean(isSorted)) {
1724
+ context = iteratee;
1725
+ iteratee = isSorted;
1726
+ isSorted = false;
1727
+ }
1728
+ if (iteratee != null) iteratee = cb(iteratee, context);
1729
+ var result = [];
1730
+ var seen = [];
1731
+ for (var i = 0, length = getLength(array); i < length; i++) {
1732
+ var value = array[i],
1733
+ computed = iteratee ? iteratee(value, i, array) : value;
1734
+ if (isSorted && !iteratee) {
1735
+ if (!i || seen !== computed) result.push(value);
1736
+ seen = computed;
1737
+ } else if (iteratee) {
1738
+ if (!contains(seen, computed)) {
1739
+ seen.push(computed);
1740
+ result.push(value);
1741
+ }
1742
+ } else if (!contains(result, value)) {
1743
+ result.push(value);
1744
+ }
1745
+ }
1746
+ return result;
1747
+ }
1432
1748
 
1433
- if (escape) {
1434
- source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
1435
- } else if (interpolate) {
1436
- source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
1437
- } else if (evaluate) {
1438
- source += "';\n" + evaluate + "\n__p+='";
1749
+ // Produce an array that contains the union: each distinct element from all of
1750
+ // the passed-in arrays.
1751
+ var union = restArguments(function(arrays) {
1752
+ return uniq(flatten$1(arrays, true, true));
1753
+ });
1754
+
1755
+ // Produce an array that contains every item shared between all the
1756
+ // passed-in arrays.
1757
+ function intersection(array) {
1758
+ var result = [];
1759
+ var argsLength = arguments.length;
1760
+ for (var i = 0, length = getLength(array); i < length; i++) {
1761
+ var item = array[i];
1762
+ if (contains(result, item)) continue;
1763
+ var j;
1764
+ for (j = 1; j < argsLength; j++) {
1765
+ if (!contains(arguments[j], item)) break;
1439
1766
  }
1767
+ if (j === argsLength) result.push(item);
1768
+ }
1769
+ return result;
1770
+ }
1440
1771
 
1441
- // Adobe VMs need the match returned to produce the correct offest.
1442
- return match;
1443
- });
1444
- source += "';\n";
1772
+ // Complement of zip. Unzip accepts an array of arrays and groups
1773
+ // each array's elements on shared indices.
1774
+ function unzip(array) {
1775
+ var length = (array && max(array, getLength).length) || 0;
1776
+ var result = Array(length);
1445
1777
 
1446
- // If a variable is not specified, place data values in local scope.
1447
- if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
1778
+ for (var index = 0; index < length; index++) {
1779
+ result[index] = pluck(array, index);
1780
+ }
1781
+ return result;
1782
+ }
1448
1783
 
1449
- source = "var __t,__p='',__j=Array.prototype.join," +
1450
- "print=function(){__p+=__j.call(arguments,'');};\n" +
1451
- source + 'return __p;\n';
1784
+ // Zip together multiple lists into a single array -- elements that share
1785
+ // an index go together.
1786
+ var zip = restArguments(unzip);
1452
1787
 
1453
- try {
1454
- var render = new Function(settings.variable || 'obj', '_', source);
1455
- } catch (e) {
1456
- e.source = source;
1457
- throw e;
1788
+ // Converts lists into objects. Pass either a single array of `[key, value]`
1789
+ // pairs, or two parallel arrays of the same length -- one of keys, and one of
1790
+ // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
1791
+ function object(list, values) {
1792
+ var result = {};
1793
+ for (var i = 0, length = getLength(list); i < length; i++) {
1794
+ if (values) {
1795
+ result[list[i]] = values[i];
1796
+ } else {
1797
+ result[list[i][0]] = list[i][1];
1798
+ }
1458
1799
  }
1800
+ return result;
1801
+ }
1459
1802
 
1460
- var template = function(data) {
1461
- return render.call(this, data, _);
1462
- };
1803
+ // Generate an integer Array containing an arithmetic progression. A port of
1804
+ // the native Python `range()` function. See
1805
+ // [the Python documentation](https://docs.python.org/library/functions.html#range).
1806
+ function range(start, stop, step) {
1807
+ if (stop == null) {
1808
+ stop = start || 0;
1809
+ start = 0;
1810
+ }
1811
+ if (!step) {
1812
+ step = stop < start ? -1 : 1;
1813
+ }
1463
1814
 
1464
- // Provide the compiled source as a convenience for precompilation.
1465
- var argument = settings.variable || 'obj';
1466
- template.source = 'function(' + argument + '){\n' + source + '}';
1815
+ var length = Math.max(Math.ceil((stop - start) / step), 0);
1816
+ var range = Array(length);
1467
1817
 
1468
- return template;
1469
- };
1818
+ for (var idx = 0; idx < length; idx++, start += step) {
1819
+ range[idx] = start;
1820
+ }
1470
1821
 
1471
- // Add a "chain" function. Start chaining a wrapped Underscore object.
1472
- _.chain = function(obj) {
1473
- var instance = _(obj);
1474
- instance._chain = true;
1475
- return instance;
1476
- };
1822
+ return range;
1823
+ }
1477
1824
 
1478
- // OOP
1479
- // ---------------
1480
- // If Underscore is called as a function, it returns a wrapped object that
1481
- // can be used OO-style. This wrapper holds altered versions of all the
1482
- // underscore functions. Wrapped objects may be chained.
1825
+ // Chunk a single array into multiple arrays, each containing `count` or fewer
1826
+ // items.
1827
+ function chunk(array, count) {
1828
+ if (count == null || count < 1) return [];
1829
+ var result = [];
1830
+ var i = 0, length = array.length;
1831
+ while (i < length) {
1832
+ result.push(slice.call(array, i, i += count));
1833
+ }
1834
+ return result;
1835
+ }
1483
1836
 
1484
1837
  // Helper function to continue chaining intermediate results.
1485
- var result = function(instance, obj) {
1486
- return instance._chain ? _(obj).chain() : obj;
1487
- };
1838
+ function chainResult(instance, obj) {
1839
+ return instance._chain ? _$1(obj).chain() : obj;
1840
+ }
1488
1841
 
1489
1842
  // Add your own custom functions to the Underscore object.
1490
- _.mixin = function(obj) {
1491
- _.each(_.functions(obj), function(name) {
1492
- var func = _[name] = obj[name];
1493
- _.prototype[name] = function() {
1843
+ function mixin(obj) {
1844
+ each(functions(obj), function(name) {
1845
+ var func = _$1[name] = obj[name];
1846
+ _$1.prototype[name] = function() {
1494
1847
  var args = [this._wrapped];
1495
1848
  push.apply(args, arguments);
1496
- return result(this, func.apply(_, args));
1849
+ return chainResult(this, func.apply(_$1, args));
1497
1850
  };
1498
1851
  });
1499
- };
1500
-
1501
- // Add all of the Underscore functions to the wrapper object.
1502
- _.mixin(_);
1852
+ return _$1;
1853
+ }
1503
1854
 
1504
- // Add all mutator Array functions to the wrapper.
1505
- _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
1855
+ // Add all mutator `Array` functions to the wrapper.
1856
+ each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
1506
1857
  var method = ArrayProto[name];
1507
- _.prototype[name] = function() {
1858
+ _$1.prototype[name] = function() {
1508
1859
  var obj = this._wrapped;
1509
- method.apply(obj, arguments);
1510
- if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
1511
- return result(this, obj);
1860
+ if (obj != null) {
1861
+ method.apply(obj, arguments);
1862
+ if ((name === 'shift' || name === 'splice') && obj.length === 0) {
1863
+ delete obj[0];
1864
+ }
1865
+ }
1866
+ return chainResult(this, obj);
1512
1867
  };
1513
1868
  });
1514
1869
 
1515
- // Add all accessor Array functions to the wrapper.
1516
- _.each(['concat', 'join', 'slice'], function(name) {
1870
+ // Add all accessor `Array` functions to the wrapper.
1871
+ each(['concat', 'join', 'slice'], function(name) {
1517
1872
  var method = ArrayProto[name];
1518
- _.prototype[name] = function() {
1519
- return result(this, method.apply(this._wrapped, arguments));
1873
+ _$1.prototype[name] = function() {
1874
+ var obj = this._wrapped;
1875
+ if (obj != null) obj = method.apply(obj, arguments);
1876
+ return chainResult(this, obj);
1520
1877
  };
1521
1878
  });
1522
1879
 
1523
- // Extracts the result from a wrapped and chained object.
1524
- _.prototype.value = function() {
1525
- return this._wrapped;
1526
- };
1880
+ // Named Exports
1881
+
1882
+ var allExports = {
1883
+ __proto__: null,
1884
+ VERSION: VERSION,
1885
+ restArguments: restArguments,
1886
+ isObject: isObject,
1887
+ isNull: isNull,
1888
+ isUndefined: isUndefined,
1889
+ isBoolean: isBoolean,
1890
+ isElement: isElement,
1891
+ isString: isString,
1892
+ isNumber: isNumber,
1893
+ isDate: isDate,
1894
+ isRegExp: isRegExp,
1895
+ isError: isError,
1896
+ isSymbol: isSymbol,
1897
+ isArrayBuffer: isArrayBuffer,
1898
+ isDataView: isDataView$1,
1899
+ isArray: isArray,
1900
+ isFunction: isFunction$1,
1901
+ isArguments: isArguments$1,
1902
+ isFinite: isFinite$1,
1903
+ isNaN: isNaN$1,
1904
+ isTypedArray: isTypedArray$1,
1905
+ isEmpty: isEmpty,
1906
+ isMatch: isMatch,
1907
+ isEqual: isEqual,
1908
+ isMap: isMap,
1909
+ isWeakMap: isWeakMap,
1910
+ isSet: isSet,
1911
+ isWeakSet: isWeakSet,
1912
+ keys: keys,
1913
+ allKeys: allKeys,
1914
+ values: values,
1915
+ pairs: pairs,
1916
+ invert: invert,
1917
+ functions: functions,
1918
+ methods: functions,
1919
+ extend: extend,
1920
+ extendOwn: extendOwn,
1921
+ assign: extendOwn,
1922
+ defaults: defaults,
1923
+ create: create,
1924
+ clone: clone,
1925
+ tap: tap,
1926
+ get: get,
1927
+ has: has,
1928
+ mapObject: mapObject,
1929
+ identity: identity,
1930
+ constant: constant,
1931
+ noop: noop,
1932
+ toPath: toPath$1,
1933
+ property: property,
1934
+ propertyOf: propertyOf,
1935
+ matcher: matcher,
1936
+ matches: matcher,
1937
+ times: times,
1938
+ random: random,
1939
+ now: now,
1940
+ escape: _escape,
1941
+ unescape: _unescape,
1942
+ templateSettings: templateSettings,
1943
+ template: template,
1944
+ result: result,
1945
+ uniqueId: uniqueId,
1946
+ chain: chain,
1947
+ iteratee: iteratee,
1948
+ partial: partial,
1949
+ bind: bind,
1950
+ bindAll: bindAll,
1951
+ memoize: memoize,
1952
+ delay: delay,
1953
+ defer: defer,
1954
+ throttle: throttle,
1955
+ debounce: debounce,
1956
+ wrap: wrap,
1957
+ negate: negate,
1958
+ compose: compose,
1959
+ after: after,
1960
+ before: before,
1961
+ once: once,
1962
+ findKey: findKey,
1963
+ findIndex: findIndex,
1964
+ findLastIndex: findLastIndex,
1965
+ sortedIndex: sortedIndex,
1966
+ indexOf: indexOf,
1967
+ lastIndexOf: lastIndexOf,
1968
+ find: find,
1969
+ detect: find,
1970
+ findWhere: findWhere,
1971
+ each: each,
1972
+ forEach: each,
1973
+ map: map,
1974
+ collect: map,
1975
+ reduce: reduce,
1976
+ foldl: reduce,
1977
+ inject: reduce,
1978
+ reduceRight: reduceRight,
1979
+ foldr: reduceRight,
1980
+ filter: filter,
1981
+ select: filter,
1982
+ reject: reject,
1983
+ every: every,
1984
+ all: every,
1985
+ some: some,
1986
+ any: some,
1987
+ contains: contains,
1988
+ includes: contains,
1989
+ include: contains,
1990
+ invoke: invoke,
1991
+ pluck: pluck,
1992
+ where: where,
1993
+ max: max,
1994
+ min: min,
1995
+ shuffle: shuffle,
1996
+ sample: sample,
1997
+ sortBy: sortBy,
1998
+ groupBy: groupBy,
1999
+ indexBy: indexBy,
2000
+ countBy: countBy,
2001
+ partition: partition,
2002
+ toArray: toArray,
2003
+ size: size,
2004
+ pick: pick,
2005
+ omit: omit,
2006
+ first: first,
2007
+ head: first,
2008
+ take: first,
2009
+ initial: initial,
2010
+ last: last,
2011
+ rest: rest,
2012
+ tail: rest,
2013
+ drop: rest,
2014
+ compact: compact,
2015
+ flatten: flatten,
2016
+ without: without,
2017
+ uniq: uniq,
2018
+ unique: uniq,
2019
+ union: union,
2020
+ intersection: intersection,
2021
+ difference: difference,
2022
+ unzip: unzip,
2023
+ transpose: unzip,
2024
+ zip: zip,
2025
+ object: object,
2026
+ range: range,
2027
+ chunk: chunk,
2028
+ mixin: mixin,
2029
+ 'default': _$1
2030
+ };
2031
+
2032
+ // Default Export
1527
2033
 
1528
- // Provide unwrapping proxy for some methods used in engine operations
1529
- // such as arithmetic and JSON stringification.
1530
- _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
2034
+ // Add all of the Underscore functions to the wrapper object.
2035
+ var _ = mixin(allExports);
2036
+ // Legacy Node.js API.
2037
+ _._ = _;
1531
2038
 
1532
- _.prototype.toString = function() {
1533
- return '' + this._wrapped;
1534
- };
2039
+ return _;
1535
2040
 
1536
- // AMD registration happens at the end for compatibility with AMD loaders
1537
- // that may not enforce next-turn semantics on modules. Even though general
1538
- // practice for AMD registration is to be anonymous, underscore registers
1539
- // as a named module because, like jQuery, it is a base library that is
1540
- // popular enough to be bundled in a third party lib, but not be part of
1541
- // an AMD load request. Those cases could generate an error when an
1542
- // anonymous define() is called outside of a loader request.
1543
- if (typeof define === 'function' && define.amd) {
1544
- define('underscore', [], function() {
1545
- return _;
1546
- });
1547
- }
1548
- }.call(this));
2041
+ })));
2042
+ //# sourceMappingURL=underscore-umd.js.map