diff --git a/dist/commonjs/router/handler-info.js b/dist/commonjs/router/handler-info.js index 105c057d..a7641696 100644 --- a/dist/commonjs/router/handler-info.js +++ b/dist/commonjs/router/handler-info.js @@ -3,6 +3,7 @@ var bind = require("./utils").bind; var merge = require("./utils").merge; var serialize = require("./utils").serialize; var promiseLabel = require("./utils").promiseLabel; +var applyHook = require("./utils").applyHook; var Promise = require("rsvp/promise")["default"]; function HandlerInfo(_props) { @@ -89,14 +90,13 @@ HandlerInfo.prototype = { } args.push(payload); - var handler = this.handler; - var result = handler[hookName] && handler[hookName].apply(handler, args); + var result = applyHook(this.handler, hookName, args); if (result && result.isTransition) { result = null; } - return Promise.resolve(result, null, this.promiseLabel("Resolve value returned from one of the model hooks")); + return Promise.resolve(result, this.promiseLabel("Resolve value returned from one of the model hooks")); }, // overridden by subclasses diff --git a/dist/commonjs/router/handler-info/unresolved-handler-info-by-param.js b/dist/commonjs/router/handler-info/unresolved-handler-info-by-param.js index 5437a026..aec960b5 100644 --- a/dist/commonjs/router/handler-info/unresolved-handler-info-by-param.js +++ b/dist/commonjs/router/handler-info/unresolved-handler-info-by-param.js @@ -1,5 +1,6 @@ "use strict"; var HandlerInfo = require("../handler-info")["default"]; +var resolveHook = require("router/utils").resolveHook; var merge = require("router/utils").merge; var subclass = require("router/utils").subclass; var promiseLabel = require("router/utils").promiseLabel; @@ -18,8 +19,9 @@ var UnresolvedHandlerInfoByParam = subclass (HandlerInfo, { fullParams.queryParams = payload.queryParams; } - var hookName = typeof this.handler.deserialize === 'function' ? - 'deserialize' : 'model'; + var handler = this.handler; + var hookName = resolveHook(handler, 'deserialize') || + resolveHook(handler, 'model'); return this.runSharedModelHook(payload, hookName, [fullParams]); } diff --git a/dist/commonjs/router/router.js b/dist/commonjs/router/router.js index ca58eb2b..205f16e0 100644 --- a/dist/commonjs/router/router.js +++ b/dist/commonjs/router/router.js @@ -10,6 +10,7 @@ var serialize = require("./utils").serialize; var extractQueryParams = require("./utils").extractQueryParams; var getChangelist = require("./utils").getChangelist; var promiseLabel = require("./utils").promiseLabel; +var callHook = require("./utils").callHook; var TransitionState = require("./transition-state")["default"]; var logAbort = require("./transition").logAbort; var Transition = require("./transition").Transition; @@ -153,11 +154,9 @@ Router.prototype = { */ reset: function() { if (this.state) { - forEach(this.state.handlerInfos, function(handlerInfo) { + forEach(this.state.handlerInfos.slice().reverse(), function(handlerInfo) { var handler = handlerInfo.handler; - if (handler.exit) { - handler.exit(); - } + callHook(handler, 'exit'); }); } @@ -221,7 +220,7 @@ Router.prototype = { }, intermediateTransitionTo: function(name) { - doTransition(this, arguments, true); + return doTransition(this, arguments, true); }, refresh: function(pivotHandler) { @@ -441,8 +440,9 @@ function setupContexts(router, newState, transition) { forEach(partition.exited, function(handlerInfo) { var handler = handlerInfo.handler; delete handler.context; - if (handler.reset) { handler.reset(true, transition); } - if (handler.exit) { handler.exit(transition); } + + callHook(handler, 'reset', true, transition); + callHook(handler, 'exit', transition); }); var oldState = router.oldState = router.state; @@ -452,7 +452,7 @@ function setupContexts(router, newState, transition) { try { forEach(partition.reset, function(handlerInfo) { var handler = handlerInfo.handler; - if (handler.reset) { handler.reset(false, transition); } + callHook(handler, 'reset', false, transition); }); forEach(partition.updatedContext, function(handlerInfo) { @@ -483,15 +483,15 @@ function handlerEnteredOrUpdated(currentHandlerInfos, handlerInfo, enter, transi var handler = handlerInfo.handler, context = handlerInfo.context; - if (enter && handler.enter) { handler.enter(transition); } + callHook(handler, 'enter', transition); if (transition && transition.isAborted) { throw new TransitionAborted(); } handler.context = context; - if (handler.contextDidChange) { handler.contextDidChange(); } + callHook(handler, 'contextDidChange'); - if (handler.setup) { handler.setup(context, transition); } + callHook(handler, 'setup', context, transition); if (transition && transition.isAborted) { throw new TransitionAborted(); } @@ -554,7 +554,7 @@ function partitionHandlers(oldState, newState) { unchanged: [] }; - var handlerChanged, contextChanged, i, l; + var handlerChanged, contextChanged = false, i, l; for (i=0, l=newHandlers.length; i=0&&n;--t){var a=r[t];e.add(r,{as:a.handler});n=a.path==="/"||a.path===""||a.handler.slice(-6)===".index"}})},hasRoute:function(e){return this.recognizer.hasRoute(e)},queryParamsTransition:function(e,r,t,n){var a=this;A(this,n,e);if(!r&&this.activeTransition){return this.activeTransition}else{var i=new w(this);i.queryParamsOnly=true;t.queryParams=j(this,n.handlerInfos,n.queryParams,i);i.promise=i.promise.then(function(e){k(i,t,true);if(a.didTransition){a.didTransition(a.currentHandlerInfos)}return e},null,b("Transition complete"));return i}},transitionByIntent:function(e,r){var t=!!this.activeTransition;var n=t?this.activeTransition.state:this.state;var a;var i=this;try{var s=e.applyToState(n,this.recognizer,this.getHandler,r);var o=y(n.queryParams,s.queryParams);if(O(s.handlerInfos,n.handlerInfos)){if(o){a=this.queryParamsTransition(o,t,n,s);if(a){return a}}return new w(this)}if(r){z(this,s);return}a=new w(this,e,s);if(this.activeTransition){this.activeTransition.abort()}this.activeTransition=a;a.promise=a.promise.then(function(e){return S(a,e.state)},null,b("Settle transition promise when transition is finalized"));if(!t){U(this,s,a)}A(this,s,o);return a}catch(l){return new w(this,e,null,l)}},reset:function(){if(this.state){v(this.state.handlerInfos,function(e){var r=e.handler;if(r.exit){r.exit()}})}this.state=new I;this.currentHandlerInfos=null},activeTransition:null,handleURL:function(e){var r=c.call(arguments);if(e.charAt(0)!=="/"){r[0]="/"+e}return E(this,r).method(null)},updateURL:function(){throw new Error("updateURL is not implemented")},replaceURL:function(e){this.updateURL(e)},transitionTo:function(e){return E(this,arguments)},intermediateTransitionTo:function(e){E(this,arguments,true)},refresh:function(e){var r=this.activeTransition?this.activeTransition.state:this.state;var t=r.handlerInfos;var n={};for(var a=0,i=t.length;a=0;--l){var u=i[l];m(o,u.params);if(u.handler.inaccessibleByURL){n=null}}if(n){o.queryParams=e._visibleQueryParams||r.queryParams;var h=a.recognizer.generate(s,o);if(n==="replace"){a.replaceURL(h)}else{a.updateURL(h)}}}function S(e,r){try{d(e.router,e.sequence,"Resolved all models on destination route; finalizing transition.");var t=e.router,n=r.handlerInfos,a=e.sequence;z(t,r,e);if(e.isAborted){t.state.handlerInfos=t.currentHandlerInfos;return h.reject(x(e))}k(e,r,e.intent.url);e.isActive=false;t.activeTransition=null;f(t,t.currentHandlerInfos,true,["didTransition"]);if(t.didTransition){t.didTransition(t.currentHandlerInfos)}d(t,e.sequence,"TRANSITION COMPLETE.");return n[n.length-1].handler}catch(i){if(!(i instanceof P)){var s=e.state.handlerInfos;e.trigger(true,"error",i,e,s[s.length-1].handler);e.abort()}throw i}}function E(e,r,t){var n=r[0]||"/";var a=r[r.length-1];var i={};if(a&&a.hasOwnProperty("queryParams")){i=L.call(r).queryParams}var s;if(r.length===0){d(e,"Updating query params");var o=e.state.handlerInfos;s=new T({name:o[o.length-1].name,contexts:[],queryParams:i})}else if(n.charAt(0)==="/"){d(e,"Attempting URL transition to "+n);s=new q({url:n})}else{d(e,"Attempting transition to "+n);s=new T({name:r[0],contexts:c.call(r,1),queryParams:i})}return e.transitionByIntent(s,t)}function O(e,r){if(e.length!==r.length){return false}for(var t=0,n=e.length;t0){e._triggerWillChangeContext(a,t)}f(e,n,true,["willTransition",t])}l["default"]=R});n("router/transition-intent",["./utils","exports"],function(e,r){"use strict";var t=e.merge;function n(e){this.initialize(e);this.data=this.data||{}}n.prototype={initialize:null,applyToState:null};r["default"]=n});n("router/transition-intent/named-transition-intent",["../transition-intent","../transition-state","../handler-info/factory","../utils","exports"],function(e,r,t,n,a){"use strict";var i=e["default"];var s=r["default"];var o=t["default"];var l=n.isParam;var u=n.extractQueryParams;var h=n.merge;var f=n.subclass;a["default"]=f(i,{name:null,pivotHandler:null,contexts:null,queryParams:null,initialize:function(e){this.name=e.name;this.pivotHandler=e.pivotHandler;this.contexts=e.contexts||[];this.queryParams=e.queryParams},applyToState:function(e,r,t,n){var a=u([this.name].concat(this.contexts)),i=a[0],s=a[1],o=r.handlersFor(i[0]);var l=o[o.length-1].handler;return this.applyToHandlers(e,o,t,l,n)},applyToHandlers:function(e,r,t,n,a,i){var o;var l=new s;var u=this.contexts.slice(0);var f=r.length;if(this.pivotHandler){for(o=0;o=0;--o){var c=r[o];var v=c.handler;var m=t(v);var p=e.handlerInfos[o];var g=null;if(c.names.length>0){if(o>=f){g=this.createParamHandlerInfo(v,m,c.names,u,p)}else{g=this.getHandlerInfoForDynamicSegment(v,m,c.names,u,p,n,o)}}else{g=this.createParamHandlerInfo(v,m,c.names,u,p)}if(i){g=g.becomeResolved(null,g.context);var y=p&&p.context;if(c.names.length>0&&g.context===y){g.params=p&&p.params}g.context=y}var b=p;if(o>=f||g.shouldSupercede(p)){f=Math.min(o,f);b=g}if(a&&!i){b=b.becomeResolved(null,b.context)}l.handlerInfos.unshift(b)}if(u.length>0){throw new Error("More context objects were passed than there are dynamic segments for the route: "+n)}if(!a){this.invalidateChildren(l.handlerInfos,f)}h(l.queryParams,this.queryParams||{});return l},invalidateChildren:function(e,r){for(var t=r,n=e.length;t0){h=n[n.length-1];if(l(h)){return this.createParamHandlerInfo(e,r,t,n,a)}else{n.pop()}}else if(a&&a.name===e){return a}else{if(this.preTransitionState){var f=this.preTransitionState.handlerInfos[s];h=f&&f.context}else{return a}}return o("object",{name:e,handler:r,context:h,names:t})},createParamHandlerInfo:function(e,r,t,n,a){var i={};var s=t.length;while(s--){var u=a&&e===a.name&&a.params||{};var h=n[n.length-1];var f=t[s];if(l(h)){i[f]=""+n.pop()}else{if(u.hasOwnProperty(f)){i[f]=u[f]}else{throw new Error("You didn't provide enough string/numeric parameters to satisfy all of the dynamic segments for route "+e)}}}return o("param",{name:e,handler:r,params:i})}})});n("router/transition-intent/url-transition-intent",["../transition-intent","../transition-state","../handler-info/factory","../utils","exports"],function(e,r,t,n,a){"use strict";var i=e["default"];var s=r["default"];var o=t["default"];var l=n.oCreate;var u=n.merge;var h=n.subclass;a["default"]=h(i,{url:null,initialize:function(e){this.url=e.url},applyToState:function(e,r,t){var n=new s;var a=r.recognize(this.url),i={},l,h;if(!a){throw new f(this.url)}var d=false;for(l=0,h=a.length;l=t.length?t.length-1:r.resolveIndex;return o.reject({error:e,handlerWithError:a.handlerInfos[n].handler,wasAborted:l,state:a})}function f(e){var t=a.handlerInfos[r.resolveIndex].isResolved;a.handlerInfos[r.resolveIndex++]=e;if(!t){var n=e.handler;if(n&&n.redirect){n.redirect(e.context,r)}}return u().then(d,null,s("Resolve handler"))}function d(){if(r.resolveIndex===a.handlerInfos.length){return{error:null,state:a}}var e=a.handlerInfos[r.resolveIndex];return e.resolve(u,r).then(f,null,s("Proceed"))}}};n["default"]=l});n("router/transition",["rsvp/promise","./handler-info","./utils","exports"],function(e,r,t,n){"use strict";var a=e["default"];var i=r.ResolvedHandlerInfo;var s=t.trigger;var o=t.slice;var l=t.log;var u=t.promiseLabel;function h(e,r,t,n){var i=this;this.state=t||e.state;this.intent=r;this.router=e;this.data=this.intent&&this.intent.data||{};this.resolvedModels={};this.queryParams={};if(n){this.promise=a.reject(n);return}if(t){this.params=t.params;this.queryParams=t.queryParams;this.handlerInfos=t.handlerInfos;var s=t.handlerInfos.length;if(s){this.targetName=t.handlerInfos[t.handlerInfos.length-1].name}for(var o=0;o0&&e[t-1]&&e[t-1].hasOwnProperty("queryParams")){a=e[t-1].queryParams;n=r.call(e,0,t-1);return[n,a]}else{return[e,null]}}e.extractQueryParams=s;function o(e){for(var r in e){if(typeof e[r]==="number"){e[r]=""+e[r]}else if(n(e[r])){for(var t=0,a=e[r].length;t=0;s--){var o=r[s],l=o.handler;if(l.events&&l.events[a]){if(l.events[a].apply(l,n)===true){i=true}else{return}}}if(!i&&!t){throw new Error("Nothing handled the event '"+a+"'.")}}e.trigger=d;function c(e,r){var t;var i={all:{},changed:{},removed:{}};a(i.all,r);var s=false;o(e);o(r);for(t in e){if(e.hasOwnProperty(t)){if(!r.hasOwnProperty(t)){s=true;i.removed[t]=e[t]}}}for(t in r){if(r.hasOwnProperty(t)){if(n(e[t])&&n(r[t])){if(e[t].length!==r[t].length){i.changed[t]=r[t];s=true}else{for(var l=0,u=e[t].length;l=0&&n;--t){var a=r[t];e.add(r,{as:a.handler});n=a.path==="/"||a.path===""||a.handler.slice(-6)===".index"}})},hasRoute:function(e){return this.recognizer.hasRoute(e)},queryParamsTransition:function(e,r,t,n){var a=this;k(this,n,e);if(!r&&this.activeTransition){return this.activeTransition}else{var i=new P(this);i.queryParamsOnly=true;t.queryParams=U(this,n.handlerInfos,n.queryParams,i);i.promise=i.promise.then(function(e){S(i,t,true);if(a.didTransition){a.didTransition(a.currentHandlerInfos)}return e},null,b("Transition complete"));return i}},transitionByIntent:function(e,r){var t=!!this.activeTransition;var n=t?this.activeTransition.state:this.state;var a;var i=this;try{var s=e.applyToState(n,this.recognizer,this.getHandler,r);var o=y(n.queryParams,s.queryParams);if(j(s.handlerInfos,n.handlerInfos)){if(o){a=this.queryParamsTransition(o,t,n,s);if(a){return a}}return new P(this)}if(r){z(this,s);return}a=new P(this,e,s);if(this.activeTransition){this.activeTransition.abort()}this.activeTransition=a;a.promise=a.promise.then(function(e){return E(a,e.state)},null,b("Settle transition promise when transition is finalized"));if(!t){_(this,s,a)}k(this,s,o);return a}catch(l){return new P(this,e,null,l)}},reset:function(){if(this.state){v(this.state.handlerInfos.slice().reverse(),function(e){var r=e.handler;I(r,"exit")})}this.state=new x;this.currentHandlerInfos=null},activeTransition:null,handleURL:function(e){var r=c.call(arguments);if(e.charAt(0)!=="/"){r[0]="/"+e}return O(this,r).method(null)},updateURL:function(){throw new Error("updateURL is not implemented")},replaceURL:function(e){this.updateURL(e)},transitionTo:function(e){return O(this,arguments)},intermediateTransitionTo:function(e){return O(this,arguments,true)},refresh:function(e){var r=this.activeTransition?this.activeTransition.state:this.state;var t=r.handlerInfos;var n={};for(var a=0,i=t.length;a=0;--l){var u=i[l];m(o,u.params);if(u.handler.inaccessibleByURL){n=null}}if(n){o.queryParams=e._visibleQueryParams||r.queryParams;var h=a.recognizer.generate(s,o);if(n==="replace"){a.replaceURL(h)}else{a.updateURL(h)}}}function E(e,r){try{d(e.router,e.sequence,"Resolved all models on destination route; finalizing transition.");var t=e.router,n=r.handlerInfos,a=e.sequence;z(t,r,e);if(e.isAborted){t.state.handlerInfos=t.currentHandlerInfos;return h.reject(w(e))}S(e,r,e.intent.url);e.isActive=false;t.activeTransition=null;f(t,t.currentHandlerInfos,true,["didTransition"]);if(t.didTransition){t.didTransition(t.currentHandlerInfos)}d(t,e.sequence,"TRANSITION COMPLETE.");return n[n.length-1].handler}catch(i){if(!(i instanceof T)){var s=e.state.handlerInfos;e.trigger(true,"error",i,e,s[s.length-1].handler);e.abort()}throw i}}function O(e,r,t){var n=r[0]||"/";var a=r[r.length-1];var i={};if(a&&a.hasOwnProperty("queryParams")){i=R.call(r).queryParams}var s;if(r.length===0){d(e,"Updating query params");var o=e.state.handlerInfos;s=new q({name:o[o.length-1].name,contexts:[],queryParams:i})}else if(n.charAt(0)==="/"){d(e,"Attempting URL transition to "+n);s=new H({url:n})}else{d(e,"Attempting transition to "+n);s=new q({name:r[0],contexts:c.call(r,1),queryParams:i})}return e.transitionByIntent(s,t)}function j(e,r){if(e.length!==r.length){return false}for(var t=0,n=e.length;t0){e._triggerWillChangeContext(a,t)}f(e,n,true,["willTransition",t])}l["default"]=A});n("router/transition-intent",["./utils","exports"],function(e,r){"use strict";var t=e.merge;function n(e){this.initialize(e);this.data=this.data||{}}n.prototype={initialize:null,applyToState:null};r["default"]=n});n("router/transition-intent/named-transition-intent",["../transition-intent","../transition-state","../handler-info/factory","../utils","exports"],function(e,r,t,n,a){"use strict";var i=e["default"];var s=r["default"];var o=t["default"];var l=n.isParam;var u=n.extractQueryParams;var h=n.merge;var f=n.subclass;a["default"]=f(i,{name:null,pivotHandler:null,contexts:null,queryParams:null,initialize:function(e){this.name=e.name;this.pivotHandler=e.pivotHandler;this.contexts=e.contexts||[];this.queryParams=e.queryParams},applyToState:function(e,r,t,n){var a=u([this.name].concat(this.contexts)),i=a[0],s=a[1],o=r.handlersFor(i[0]);var l=o[o.length-1].handler;return this.applyToHandlers(e,o,t,l,n)},applyToHandlers:function(e,r,t,n,a,i){var o,l;var u=new s;var f=this.contexts.slice(0);var d=r.length;if(this.pivotHandler){for(o=0,l=r.length;o=0;--o){var v=r[o];var m=v.handler;var p=t(m);var g=e.handlerInfos[o];var y=null;if(v.names.length>0){if(o>=d){y=this.createParamHandlerInfo(m,p,v.names,f,g)}else{y=this.getHandlerInfoForDynamicSegment(m,p,v.names,f,g,n,o)}}else{y=this.createParamHandlerInfo(m,p,v.names,f,g)}if(i){y=y.becomeResolved(null,y.context);var b=g&&g.context;if(v.names.length>0&&y.context===b){y.params=g&&g.params}y.context=b}var I=g;if(o>=d||y.shouldSupercede(g)){d=Math.min(o,d);I=y}if(a&&!i){I=I.becomeResolved(null,I.context)}u.handlerInfos.unshift(I)}if(f.length>0){throw new Error("More context objects were passed than there are dynamic segments for the route: "+n)}if(!a){this.invalidateChildren(u.handlerInfos,d)}h(u.queryParams,this.queryParams||{});return u},invalidateChildren:function(e,r){for(var t=r,n=e.length;t0){h=n[n.length-1];if(l(h)){return this.createParamHandlerInfo(e,r,t,n,a)}else{n.pop()}}else if(a&&a.name===e){return a}else{if(this.preTransitionState){var f=this.preTransitionState.handlerInfos[s];h=f&&f.context}else{return a}}return o("object",{name:e,handler:r,context:h,names:t})},createParamHandlerInfo:function(e,r,t,n,a){var i={};var s=t.length;while(s--){var u=a&&e===a.name&&a.params||{};var h=n[n.length-1];var f=t[s];if(l(h)){i[f]=""+n.pop()}else{if(u.hasOwnProperty(f)){i[f]=u[f]}else{throw new Error("You didn't provide enough string/numeric parameters to satisfy all of the dynamic segments for route "+e)}}}return o("param",{name:e,handler:r,params:i})}})});n("router/transition-intent/url-transition-intent",["../transition-intent","../transition-state","../handler-info/factory","../utils","exports"],function(e,r,t,n,a){"use strict";var i=e["default"];var s=r["default"];var o=t["default"];var l=n.oCreate;var u=n.merge;var h=n.subclass;a["default"]=h(i,{url:null,initialize:function(e){this.url=e.url},applyToState:function(e,r,t){var n=new s;var a=r.recognize(this.url),i={},l,h;if(!a){throw new f(this.url)}var d=false;for(l=0,h=a.length;l=t.length?t.length-1:r.resolveIndex;return l.reject({error:e,handlerWithError:a.handlerInfos[n].handler,wasAborted:s,state:a})}function f(e){var t=a.handlerInfos[r.resolveIndex].isResolved;a.handlerInfos[r.resolveIndex++]=e;if(!t){var n=e.handler;o(n,"redirect",e.context,r)}return u().then(d,null,a.promiseLabel("Resolve handler"))}function d(){if(r.resolveIndex===a.handlerInfos.length){return{error:null,state:a}}var e=a.handlerInfos[r.resolveIndex];return e.resolve(u,r).then(f,null,a.promiseLabel("Proceed"))}}};n["default"]=u});n("router/transition",["rsvp/promise","./handler-info","./utils","exports"],function(e,r,t,n){"use strict";var a=e["default"];var i=r.ResolvedHandlerInfo;var s=t.trigger;var o=t.slice;var l=t.log;var u=t.promiseLabel;function h(e,r,t,n){var i=this;this.state=t||e.state;this.intent=r;this.router=e;this.data=this.intent&&this.intent.data||{};this.resolvedModels={};this.queryParams={};if(n){this.promise=a.reject(n);return}if(t){this.params=t.params;this.queryParams=t.queryParams;this.handlerInfos=t.handlerInfos;var s=t.handlerInfos.length;if(s){this.targetName=t.handlerInfos[s-1].name}for(var o=0;o0&&e[t-1]&&e[t-1].hasOwnProperty("queryParams")){a=e[t-1].queryParams;n=r.call(e,0,t-1);return[n,a]}else{return[e,null]}}e.extractQueryParams=s;function o(e){for(var r in e){if(typeof e[r]==="number"){e[r]=""+e[r]}else if(n(e[r])){for(var t=0,a=e[r].length;t=0;s--){var o=r[s],l=o.handler;if(l.events&&l.events[a]){if(l.events[a].apply(l,n)===true){i=true}else{return}}}if(!i&&!t){throw new Error("Nothing handled the event '"+a+"'.")}}e.trigger=d;function c(e,r){var t;var i={all:{},changed:{},removed:{}};a(i.all,r);var s=false;o(e);o(r);for(t in e){if(e.hasOwnProperty(t)){if(!r.hasOwnProperty(t)){s=true;i.removed[t]=e[t]}}}for(t in r){if(r.hasOwnProperty(t)){if(n(e[t])&&n(r[t])){if(e[t].length!==r[t].length){i.changed[t]=r[t];s=true}else{for(var l=0,u=e[t].length;l