From a249b315ca26a55b11f1eb9d5ef7e04d665cf271 Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Tue, 21 Jan 2014 19:59:59 -0800 Subject: [PATCH] Make `breakIndicator` use `expando` in underscore builds. --- dist/lodash.underscore.js | 221 +++++++++++++++++++++++++++------- dist/lodash.underscore.min.js | 72 +++++------ 2 files changed, 214 insertions(+), 79 deletions(-) diff --git a/dist/lodash.underscore.js b/dist/lodash.underscore.js index b2b90bf1e..a776b8fb1 100644 --- a/dist/lodash.underscore.js +++ b/dist/lodash.underscore.js @@ -12,13 +12,7 @@ /** Used as a safe reference for `undefined` in pre ES5 environments */ var undefined; - /** Used to generate unique IDs */ - var idCounter = 0; - - /** Used by methods to exit iteration */ - var breakIndicator = '__lodash_break_1335248838000__'; - - /** Used to compose bitmasks for `__bindData__` */ + /** Used to compose bitmasks for wrapper metadata */ var BIND_FLAG = 1, BIND_KEY_FLAG = 2, CURRY_FLAG = 4, @@ -26,6 +20,18 @@ PARTIAL_FLAG = 16, PARTIAL_RIGHT_FLAG = 32; + /** Used as the semantic version number */ + var version = '2.4.1'; + + /** Used as the property name for wrapper metadata */ + var expando = '__lodash@' + version + '__'; + + /** Used by methods to exit iteration */ + var breakIndicator = expando + 'breaker__'; + + /** Used to generate unique IDs */ + var idCounter = 0; + /** Used to match HTML entities and HTML characters */ var reEscapedHtml = /&(?:amp|lt|gt|quot|#x27);/g, reUnescapedHtml = /[&<>"']/g; @@ -35,9 +41,15 @@ reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g; + /** Used to detected named functions */ + var reFuncName = /^\s*function[ \n\r\t]+\w/; + /** Used to ensure capturing order of template delimiters */ var reNoMatch = /($^)/; + /** Used to detect functions containing a `this` reference */ + var reThis = /\bthis\b/; + /** Used to match unescaped characters in compiled string literals */ var reUnescapedString = /['\n\r\t\u2028\u2029\\]/g; @@ -52,6 +64,14 @@ regexpClass = '[object RegExp]', stringClass = '[object String]'; + /** Used as the property descriptor for wrapper metadata */ + var descriptor = { + 'configurable': false, + 'enumerable': false, + 'value': null, + 'writable': false + }; + /** * Used to convert characters to HTML entities: * @@ -229,7 +249,19 @@ hasOwnProperty = objectProto.hasOwnProperty, push = arrayRef.push, propertyIsEnumerable = objectProto.propertyIsEnumerable, - splice = arrayRef.splice; + splice = arrayRef.splice, + unshift = arrayRef.unshift; + + /** Used to set meta data on functions */ + var defineProperty = (function() { + // IE 8 only accepts DOM elements + try { + var o = {}, + func = isNative(func = Object.defineProperty) && func, + result = func(o, o, o) && func; + } catch(e) { } + return result; + }()); /* Native method shortcuts for methods with the same name as other `lodash` methods */ var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate, @@ -410,13 +442,13 @@ * sets its meta data. * * @private - * @param {Array} bindData The bind data array. + * @param {Array} data The metadata array. * @returns {Function} Returns the new bound function. */ - function baseBind(bindData) { - var func = bindData[0], - partialArgs = bindData[2], - thisArg = bindData[4]; + function baseBind(data) { + var func = data[0], + thisArg = data[3], + partialArgs = data[4]; function bound() { // `Function#bind` spec @@ -438,6 +470,7 @@ } return func.apply(thisArg, args || arguments); } + setData(bound, data); return bound; } @@ -485,6 +518,28 @@ if (typeof thisArg == 'undefined' || !('prototype' in func)) { return func; } + var data = func[expando]; + if (typeof data == 'undefined') { + if (support.funcNames) { + data = !func.name; + } + data = data || !support.funcDecomp; + if (!data) { + var source = fnToString.call(func); + if (!support.funcNames) { + data = !reFuncName.test(source); + } + if (!data) { + // checks if `func` references the `this` keyword and stores the result + data = reThis.test(source); + setData(func, data); + } + } + } + // exit early if there are no `this` references or `func` is bound + if (data === false || (data !== true && data[1] & BIND_FLAG)) { + return func; + } switch (argCount) { case 1: return function(value) { return func.call(thisArg, value); @@ -507,16 +562,16 @@ * sets its meta data. * * @private - * @param {Array} bindData The bind data array. + * @param {Array} data The metadata array. * @returns {Function} Returns the new function. */ - function baseCreateWrapper(bindData) { - var func = bindData[0], - bitmask = bindData[1], - partialArgs = bindData[2], - partialRightArgs = bindData[3], - thisArg = bindData[4], - arity = bindData[5]; + function baseCreateWrapper(data) { + var func = data[0], + bitmask = data[1], + arity = data[2], + thisArg = data[3], + partialArgs = data[4], + partialRightArgs = data[5]; var isBind = bitmask & BIND_FLAG, isBindKey = bitmask & BIND_KEY_FLAG, @@ -535,10 +590,15 @@ if (partialRightArgs) { push.apply(args, partialRightArgs); } - if (isCurry && args.length < arity) { + var argsLength = arguments.length; + if (isCurry && argsLength < arity) { bitmask |= PARTIAL_FLAG; - bitmask &= ~PARTIAL_RIGHT_FLAG; - return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~(BIND_FLAG | BIND_KEY_FLAG)), args, null, thisArg, arity]); + bitmask &= ~PARTIAL_RIGHT_FLAG + if (!isCurryBound) { + bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG); + } + var newArity = nativeMax(0, arity - argsLength); + return baseCreateWrapper([func, bitmask, newArity, thisArg, args]); } } args || (args = arguments); @@ -552,6 +612,7 @@ } return func.apply(thisBinding, args); } + setData(bound, data); return bound; } @@ -879,25 +940,23 @@ * @param {Function|string} func The function or method name to reference. * @param {number} bitmask The bitmask of flags to compose. * The bitmask may be composed of the following flags: - * 1 - `_.bind` - * 2 - `_.bindKey` - * 4 - `_.curry` - * 8 - `_.curry` (bound) + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` + * 8 - `_.curry` (bound) * 16 - `_.partial` * 32 - `_.partialRight` + * @param {number} [arity] The arity of `func`. + * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partialArgs] An array of arguments to prepend to those * provided to the new function. * @param {Array} [partialRightArgs] An array of arguments to append to those * provided to the new function. - * @param {*} [thisArg] The `this` binding of `func`. - * @param {number} [arity] The arity of `func`. * @returns {Function} Returns the new function. */ - function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) { + function createWrapper(func, bitmask, arity, thisArg, partialArgs, partialRightArgs) { var isBind = bitmask & BIND_FLAG, isBindKey = bitmask & BIND_KEY_FLAG, - isCurry = bitmask & CURRY_FLAG, - isCurryBound = bitmask & CURRY_BOUND_FLAG, isPartial = bitmask & PARTIAL_FLAG, isPartialRight = bitmask & PARTIAL_RIGHT_FLAG; @@ -905,16 +964,69 @@ throw new TypeError; } if (isPartial && !partialArgs.length) { - bitmask &= ~16; + bitmask &= ~PARTIAL_FLAG; isPartial = partialArgs = false; } if (isPartialRight && !partialRightArgs.length) { - bitmask &= ~32; + bitmask &= ~PARTIAL_RIGHT_FLAG; isPartialRight = partialRightArgs = false; } + var data = !isBindKey && func[expando]; + if (data && data !== true) { + // shallow clone `data` + data = slice(data); + + // clone partial left arguments + if (data[4]) { + data[4] = slice(data[4]); + } + // clone partial right arguments + if (data[5]) { + data[5] = slice(data[5]); + } + // set arity if provided + if (typeof arity == 'number') { + data[2] = arity; + } + // set `thisArg` if not previously bound + var bound = data[1] & BIND_FLAG; + if (isBind && !bound) { + data[3] = thisArg; + } + // set if currying a bound function + if (!isBind && bound) { + bitmask |= CURRY_BOUND_FLAG; + } + // append partial left arguments + if (isPartial) { + if (data[4]) { + push.apply(data[4], partialArgs); + } else { + data[4] = partialArgs; + } + } + // prepend partial right arguments + if (isPartialRight) { + if (data[5]) { + unshift.apply(data[5], partialRightArgs); + } else { + data[5] = partialRightArgs; + } + } + // merge flags + data[1] |= bitmask; + return createWrapper.apply(null, data); + } + if (arity == null) { + arity = isBindKey ? 0 : func.length; + } else if (arity < 0) { + arity = 0; + } // fast path for `_.bind` - var creater = (bitmask == BIND_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) ? baseBind : baseCreateWrapper; - return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]); + data = [func, bitmask, arity, thisArg, partialArgs, partialRightArgs]; + return (bitmask == BIND_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) + ? baseBind(data) + : baseCreateWrapper(data); } /** @@ -941,6 +1053,18 @@ return typeof value == 'function' && reNative.test(fnToString.call(value)); } + /** + * Sets wrapper metadata on a given function. + * + * @private + * @param {Function} func The function to set data on. + * @param {Array} value The data array to set. + */ + var setData = !defineProperty ? noop : function(func, value) { + descriptor.value = value; + defineProperty(func, expando, descriptor); + }; + /*--------------------------------------------------------------------------*/ /** @@ -3156,9 +3280,14 @@ * // => 'hi fred' */ function bind(func, thisArg) { - return arguments.length > 2 - ? createWrapper(func, BIND_FLAG | PARTIAL_FLAG, slice(arguments, 2), null, thisArg) - : createWrapper(func, BIND_FLAG, null, null, thisArg); + if (arguments.length < 3) { + return createWrapper(func, BIND_FLAG, null, thisArg); + } + var arity = func && (func[expando] ? func[expando][2] : func.length), + partialArgs = slice(arguments, 2); + + arity -= partialArgs.length; + return createWrapper(func, BIND_FLAG | PARTIAL_FLAG, arity, thisArg, partialArgs); } /** @@ -3194,7 +3323,7 @@ while (++index < length) { var key = funcs[index]; - object[key] = createWrapper(object[key], BIND_FLAG, null, null, object); + object[key] = createWrapper(object[key], BIND_FLAG, null, object); } return object; } @@ -3542,7 +3671,11 @@ * // => 'hi fred' */ function partial(func) { - return createWrapper(func, PARTIAL_FLAG, slice(arguments, 1)); + var arity = func && (func[expando] ? func[expando][2] : func.length), + partialArgs = slice(arguments, 1); + + arity -= partialArgs.length; + return createWrapper(func, PARTIAL_FLAG, arity, null, partialArgs); } /** @@ -3619,7 +3752,7 @@ * // => '

fred, barney, & pebbles

' */ function wrap(value, wrapper) { - return createWrapper(wrapper, PARTIAL_FLAG, [value]); + return createWrapper(wrapper, PARTIAL_FLAG, null, null, [value]); } /*--------------------------------------------------------------------------*/ @@ -5071,7 +5204,7 @@ * @memberOf _ * @type string */ - lodash.VERSION = '2.4.1'; + lodash.VERSION = version; // add "Chaining" functions to the wrapper lodash.prototype.chain = wrapperChain; diff --git a/dist/lodash.underscore.min.js b/dist/lodash.underscore.min.js index 6fa1588d2..2d01a6d64 100644 --- a/dist/lodash.underscore.min.js +++ b/dist/lodash.underscore.min.js @@ -3,38 +3,40 @@ * Lo-Dash 2.4.1 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE * Build: `lodash underscore exports="amd,commonjs,global,node" -o ./dist/lodash.underscore.js` */ -;(function(){function n(n){var r=[];if(!L(n))return r;for(var t in n)Pr.call(n,t)&&r.push(t);return r}function r(n,r){if(L(n))for(var t in n)if(r(n[t],t,n)===ir)break}function t(n,r,t){t=(t||0)-1;for(var e=n?n.length:0;++te||typeof t=="undefined"){t=1;break n}if(te(r,i)&&o.push(i)}return o}function v(n,r){var t=-1,e=n?n.length:0;if(typeof e=="number")for(;++tu(f,c))&&(t&&f.push(c),i.push(a))}return i}function _(n){return function(r,t,e){var u={};t=Z(t,e,3),e=-1;var o=r?r.length:0;if(typeof o=="number")for(;++ee?Xr(0,u+e):e||0;else if(e)return e=O(n,r),u&&n[e]===r?e:-1; -return t(n,r,e)}function A(n,r,t){if(typeof r!="number"&&null!=r){var e=0,u=-1,o=n?n.length:0;for(r=Z(r,t,3);++ur?r=Xr(u+r,0):r>u&&(r=u),typeof t=="undefined"?t=u:0>t?t=Xr(u+t,0):t>u&&(t=u),u=t-r||0,t=Array(u);++e>>1,t(n[e])u&&(u=t);else r=Z(r,t,3),v(n,function(n,t,o){t=r(n,t,o),t>e&&(e=t,u=n)});return u}function M(n,r,t,e){var u=3>arguments.length; -r=Z(r,e,4);var o=-1,i=n?n.length:0;if(typeof i=="number")for(u&&i&&(t=n[++o]);++oarguments.length;return r=Z(r,e,4),R(n,function(n,e,o){t=u?(u=false,n):r(t,n,e,o)}),t}function W(n){var r=-1,t=n?n.length:0,e=Array(typeof t=="number"?t:0);return v(n,function(n){var t;t=++r,t=0+zr(nt()*(t-0+1)),e[r]=e[t],e[t]=n}),e}function z(n,r,t){var e;r=Z(r,t,3),t=-1;var u=n?n.length:0;if(typeof u=="number")for(;++t=y;m?(i&&(i=clearTimeout(i)),s=a,f=n.apply(c,o)):i||(i=setTimeout(e,y))}return m&&l?l=clearTimeout(l):l||r===g||(l=setTimeout(u,r)),t&&(m=true,f=n.apply(c,o)),!m||l||i||(o=c=null),f}}function V(n,r,t){if(!n)return n;var e=arguments,u=0,o=e.length,i=typeof t;for("number"!=i&&"string"!=i||!e[3]||e[3][t]!==r||(o=2);++u"']/g,hr=/($^)/,yr=/['\n\r\t\u2028\u2029\\]/g,mr="[object Arguments]",_r="[object Array]",br="[object Boolean]",dr="[object Date]",wr="[object Number]",jr="[object Object]",xr="[object RegExp]",Tr="[object String]",Ar={"&":"&","<":"<",">":">",'"':""","'":"'"},Er={"&":"&","<":"<",">":">",""":'"',"'":"'"},Or={"function":true,object:true},Sr={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},kr=Or[typeof window]&&window||this,Nr=Or[typeof exports]&&exports&&!exports.nodeType&&exports,qr=Or[typeof global]&&global; -!qr||qr.global!==qr&&qr.window!==qr||(kr=qr);var Fr=Or[typeof module]&&module&&!module.nodeType&&module,Br=Fr&&Fr.exports===Nr&&Nr,Rr=Array.prototype,$r=Object.prototype,Ir=kr._,Mr=$r.toString,Dr=RegExp("^"+(Mr+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Wr=Math.ceil,zr=Math.floor,Cr=Function.prototype.toString,Pr=$r.hasOwnProperty,Ur=Rr.push,Vr=$r.propertyIsEnumerable,Gr=Rr.splice,Hr=w(Hr=Object.create)&&Hr,Jr=w(Jr=Array.isArray)&&Jr,Kr=kr.isFinite,Lr=kr.isNaN,Qr=w(Qr=Object.keys)&&Qr,Xr=Math.max,Yr=Math.min,Zr=w(Zr=Date.now)&&Zr,nt=Math.random; -a.prototype=f.prototype;var rt={};!function(){var n={0:1,length:1};rt.spliceObjects=(Gr.call(n,0,1),!n[0])}(1),f.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,variable:""},Hr||(l=function(){function n(){}return function(r){if(L(r)){n.prototype=r;var t=new n;n.prototype=null}return t||kr.Object()}}()),j(arguments)||(j=function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&Pr.call(n,"callee")&&!Vr.call(n,"callee")||false});var tt=_(function(n,r,t){Pr.call(n,t)?n[t]++:n[t]=1 -}),et=_(function(n,r,t){Pr.call(n,t)?n[t].push(r):n[t]=[r]}),ut=_(function(n,r,t){n[t]=r}),ot=$,it=Jr||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&Mr.call(n)==_r||false};K(/x/)&&(K=function(n){return typeof n=="function"&&"[object Function]"==Mr.call(n)});var ft=Qr?function(n){return L(n)?Qr(n):[]}:n,at=Zr||function(){return(new Date).getTime()};f.after=function(n,r){if(!K(r))throw new TypeError;return function(){return 1>--n?r.apply(this,arguments):void 0}},f.bind=P,f.bindAll=function(n){for(var r=1i(a,e)){for(r=t;--r;)if(0>i(n[r],e))continue n;a.push(e)}return a},f.invert=function(n){for(var r=-1,t=ft(n),e=t.length,u={};++rr?0:r);++nt?Xr(0,e+t):Yr(t,e-1))+1);e--;)if(n[e]===r)return e;return-1},f.mixin=tr,f.noConflict=function(){return kr._=Ir,this},f.random=function(n,r){return null==n&&null==r&&(r=1),n=+n||0,null==r?(r=n,n=0):r=+r||0,n+zr(nt()*(r-n+1))},f.reduce=M,f.reduceRight=D,f.result=function(n,r){if(null!=n){var t=n[r]; -return K(t)?n[r]():t}},f.size=function(n){var r=n?n.length:0;return typeof r=="number"?r:ft(n).length},f.some=z,f.sortedIndex=O,f.template=function(n,r,t){var e=f,u=e.templateSettings;n=(n||"")+"",t=G({},t,u);var i=0,a="__p+='",u=t.variable;n.replace(RegExp((t.escape||hr).source+"|"+(t.interpolate||hr).source+"|"+(t.evaluate||hr).source+"|$","g"),function(r,t,e,u,f){return a+=n.slice(i,f).replace(yr,o),t&&(a+="'+_.escape("+t+")+'"),u&&(a+="';"+u+";\n__p+='"),e&&(a+="'+((__t=("+e+"))==null?'':__t)+'"),i=f+r.length,r -}),a+="';",u||(u="obj",a="with("+u+"||{}){"+a+"}"),a="function("+u+"){var __t,__p='',__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}"+a+"return __p}";try{var c=Function("_","return "+a)(e)}catch(l){throw l.source=a,l}return r?c(r):(c.source=a,c)},f.unescape=function(n){return null==n?"":(n+="",0>n.indexOf(";")?n:n.replace(gr,i))},f.uniqueId=function(n){var r=++or+"";return n?n+r:r},f.all=N,f.any=z,f.detect=F,f.findWhere=function(n,r){return C(n,r,true)},f.foldl=M,f.foldr=D,f.include=k,f.inject=M,f.first=x,f.last=function(n,r,t){var e=0,u=n?n.length:0; -if(typeof r!="number"&&null!=r){var o=u;for(r=Z(r,t,3);o--&&r(n[o],o,n);)e++}else if(e=r,null==e||t)return n?n[u-1]:ur;return e=u-e,E(n,0e||typeof t=="undefined"){t=1;break n}if(te(r,i)&&o.push(i)}return o}function s(n,r){var t=-1,e=n?n.length:0;if(typeof e=="number")for(;++tu(f,l))&&(t&&f.push(l),i.push(a))}return i}function y(n){return function(r,t,e){var u={};t=X(t,e,3),e=-1;var o=r?r.length:0;if(typeof o=="number")for(;++et&&(t=0),s=[n,r,t,e,u,o],r==ur||r==(ur|ar)?f(s):c(s))}function b(){var r=(r=o.indexOf)===j?n:r;return r}function _(n){return typeof n=="function"&&Pr.test(Vr.call(n)) +}function d(n){return n&&typeof n=="object"&&typeof n.length=="number"&&zr.call(n)==_r||false}function w(n,r,t){var e=0,u=n?n.length:0;if(typeof r!="number"&&null!=r){var o=-1;for(r=X(r,t,3);++oe?tt(0,u+e):e||0;else if(e)return e=A(r,t),u&&r[e]===t?e:-1;return n(r,t,e)}function x(n,r,t){if(typeof r!="number"&&null!=r){var e=0,u=-1,o=n?n.length:0;for(r=X(r,t,3);++ur?r=tt(u+r,0):r>u&&(r=u),typeof t=="undefined"?t=u:0>t?t=tt(u+t,0):t>u&&(t=u),u=t-r||0,t=Array(u);++e>>1,t(n[e])u&&(u=t);else r=X(r,t,3),s(n,function(n,t,o){t=r(n,t,o),t>e&&(e=t,u=n)});return u}function $(n,r,t,e){var u=3>arguments.length;r=X(r,e,4);var o=-1,i=n?n.length:0;if(typeof i=="number")for(u&&i&&(t=n[++o]);++oarguments.length;return r=X(r,e,4),F(n,function(n,e,o){t=u?(u=false,n):r(t,n,e,o)}),t}function I(n){var r=-1,t=n?n.length:0,e=Array(typeof t=="number"?t:0);return s(n,function(n){var t;t=++r,t=0+Ur(ot()*(t-0+1)),e[r]=e[t],e[t]=n}),e}function M(n,r,t){var e;r=X(r,t,3),t=-1;var u=n?n.length:0;if(typeof u=="number")for(;++targuments.length)return m(n,ur,null,r);var t=n&&(n[cr]?n[cr][2]:n.length),e=T(arguments,2),t=t-e.length;return m(n,ur|ar,t,r,e)}function P(n,r,t){var e,u,o,i,f,a,l,c=0,p=false,s=true;if(!H(n))throw new TypeError;if(r=tt(0,r)||0,true===t)var g=true,s=false;else J(t)&&(g=t.leading,p="maxWait"in t&&(tt(r,t.maxWait)||0),s="trailing"in t?t.trailing:s);var v=function(){var t=r-(yt()-i);0=y;m?(u&&(u=clearTimeout(u)),c=i,o=n.apply(f,e)):u||(u=setTimeout(h,y))}return m&&a?a=clearTimeout(a):a||r===p||(a=setTimeout(v,r)),t&&(m=true,o=n.apply(f,e)),!m||a||u||(e=f=null),o}}function C(n,r,t){if(!n)return n;var e=arguments,u=0,o=e.length,i=typeof t;for("number"!=i&&"string"!=i||!e[3]||e[3][t]!==r||(o=2);++u"']/g,hr=/^\s*function[ \n\r\t]+\w/,yr=/($^)/,mr=/\bthis\b/,br=/['\n\r\t\u2028\u2029\\]/g,_r="[object Arguments]",dr="[object Array]",wr="[object Boolean]",jr="[object Date]",xr="[object Number]",Tr="[object Object]",Ar="[object RegExp]",Er="[object String]",Or={configurable:false,enumerable:false,value:null,writable:false},Sr={"&":"&","<":"<",">":">",'"':""","'":"'"},Nr={"&":"&","<":"<",">":">",""":'"',"'":"'"},kr={"function":true,object:true},qr={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},Fr=kr[typeof window]&&window||this,Br=kr[typeof exports]&&exports&&!exports.nodeType&&exports,Rr=kr[typeof global]&&global; +!Rr||Rr.global!==Rr&&Rr.window!==Rr||(Fr=Rr);var $r=kr[typeof module]&&module&&!module.nodeType&&module,Dr=$r&&$r.exports===Br&&Br,Ir=Array.prototype,Mr=Object.prototype,Wr=Fr._,zr=Mr.toString,Pr=RegExp("^"+(zr+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Cr=Math.ceil,Ur=Math.floor,Vr=Function.prototype.toString,Gr=Mr.hasOwnProperty,Hr=Ir.push,Jr=Mr.propertyIsEnumerable,Kr=Ir.splice,Lr=Ir.unshift,Qr=function(){try{var n={},r=_(r=Object.defineProperty)&&r,t=r(n,n,n)&&r +}catch(e){}return t}(),Xr=_(Xr=Object.create)&&Xr,Yr=_(Yr=Array.isArray)&&Yr,Zr=Fr.isFinite,nt=Fr.isNaN,rt=_(rt=Object.keys)&&rt,tt=Math.max,et=Math.min,ut=_(ut=Date.now)&&ut,ot=Math.random;i.prototype=o.prototype;var it={};!function(){var n={0:1,length:1};it.spliceObjects=(Kr.call(n,0,1),!n[0])}(1),o.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,variable:""},Xr||(a=function(){function n(){}return function(r){if(J(r)){n.prototype=r;var t=new n; +n.prototype=null}return t||Fr.Object()}}());var ft=Qr?function(n,r){Or.value=r,Qr(n,cr,Or)}:rr;d(arguments)||(d=function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&Gr.call(n,"callee")&&!Jr.call(n,"callee")||false});var at=function(n,r){if(!J(n))return n;for(var t in n)if(r(n[t],t,n)===pr)break;return n},lt=function(n){var r=[];if(!J(n))return r;for(var t in n)Gr.call(n,t)&&r.push(t);return r},ct=y(function(n,r,t){Gr.call(n,t)?n[t]++:n[t]=1}),pt=y(function(n,r,t){Gr.call(n,t)?n[t].push(r):n[t]=[r] +}),st=y(function(n,r,t){n[t]=r}),gt=B,vt=Yr||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&zr.call(n)==dr||false};H(/x/)&&(H=function(n){return typeof n=="function"&&"[object Function]"==zr.call(n)});var ht=rt?function(n){return J(n)?rt(n):[]}:lt,yt=ut||function(){return(new Date).getTime()};o.after=function(n,r){if(!H(r))throw new TypeError;return function(){return 1>--n?r.apply(this,arguments):void 0}},o.bind=z,o.bindAll=function(n){for(var r=1i(a,e)){for(r=t;--r;)if(0>i(n[r],e))continue n;a.push(e)}return a},o.invert=function(n){for(var r=-1,t=ht(n),e=t.length,u={};++rr?0:r);++nt?tt(0,e+t):et(t,e-1))+1);e--;)if(n[e]===r)return e;return-1},o.mixin=nr,o.noConflict=function(){return Fr._=Wr,this},o.random=function(n,r){return null==n&&null==r&&(r=1),n=+n||0,null==r?(r=n,n=0):r=+r||0,n+Ur(ot()*(r-n+1))},o.reduce=$,o.reduceRight=D,o.result=function(n,r){if(null!=n){var t=n[r]; +return H(t)?n[r]():t}},o.size=function(n){var r=n?n.length:0;return typeof r=="number"?r:ht(n).length},o.some=M,o.sortedIndex=A,o.template=function(n,r,t){var u=o,i=u.templateSettings;n=(n||"")+"",t=U({},t,i);var f=0,a="__p+='",i=t.variable;n.replace(RegExp((t.escape||yr).source+"|"+(t.interpolate||yr).source+"|"+(t.evaluate||yr).source+"|$","g"),function(r,t,u,o,i){return a+=n.slice(f,i).replace(br,e),t&&(a+="'+_.escape("+t+")+'"),o&&(a+="';"+o+";\n__p+='"),u&&(a+="'+((__t=("+u+"))==null?'':__t)+'"),f=i+r.length,r +}),a+="';",i||(i="obj",a="with("+i+"||{}){"+a+"}"),a="function("+i+"){var __t,__p='',__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}"+a+"return __p}";try{var l=Function("_","return "+a)(u)}catch(c){throw c.source=a,c}return r?l(r):(l.source=a,l)},o.unescape=function(n){return null==n?"":(n+="",0>n.indexOf(";")?n:n.replace(gr,u))},o.uniqueId=function(n){var r=++sr+"";return n?n+r:r},o.all=S,o.any=M,o.detect=k,o.findWhere=function(n,r){return W(n,r,true)},o.foldl=$,o.foldr=D,o.include=O,o.inject=$,o.first=w,o.last=function(n,r,t){var e=0,u=n?n.length:0; +if(typeof r!="number"&&null!=r){var o=u;for(r=X(r,t,3);o--&&r(n[o],o,n);)e++}else if(e=r,null==e||t)return n?n[u-1]:er;return e=u-e,T(n,0