Skip to content

Instantly share code, notes, and snippets.

@leebyron
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save leebyron/10589be4c139f462b13f to your computer and use it in GitHub Desktop.
Save leebyron/10589be4c139f462b13f to your computer and use it in GitHub Desktop.
Immutable vs transducers.js (inline)
var Benchmark = require('benchmark');
var t = require('transducers.js');
var Immutable = require('immutable');
var suite = Benchmark.Suite('transducers');
function benchArray(n) {
var arr = new Immutable.Range(0, n).toVector();
suite
.add('Immutable map/filter (' + n + ')', function() {
var lazy = arr.map(function(x) { return x + 10; })
.map(function(x) { return x * 2; })
.filter(function(x) { return x % 5 === 0; })
.filter(function(x) { return x % 2 === 0; });
lazy.toVector();
})
.add('transducer map/filter (' + n + ')', function() {
var transform = t.compose(
t.map(function(x) { return x + 10; }),
t.map(function(x) { return x * 2; }),
t.filter(function(x) { return x % 5 === 0; }),
t.filter(function(x) { return x % 2 === 0; })
);
Immutable.Vector.from(t.seq(arr, transform))
});
}
benchArray(1000);
benchArray(100000);
suite.on('cycle', function(event) {
console.log(String(event.target));
});
suite.run();
require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}if(canPost){var queue=[];window.addEventListener("message",function(ev){var source=ev.source;if((source===window||source===null)&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];function noop(){}process.on=noop;process.addListener=noop;process.once=noop;process.off=noop;process.removeListener=noop;process.removeAllListeners=noop;process.emit=noop;process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],benchmark:[function(require,module,exports){(function(process,global){(function(window,undefined){"use strict";var counter=0;var doc=isHostType(window,"document")&&document;var freeDefine=typeof define=="function"&&typeof define.amd=="object"&&define.amd&&define;var freeExports=typeof exports=="object"&&exports&&(typeof global=="object"&&global&&global==global.global&&(window=global),exports);var freeRequire=typeof require=="function"&&require;var getAllKeys=Object.getOwnPropertyNames;var getDescriptor=Object.getOwnPropertyDescriptor;var hasOwnProperty={}.hasOwnProperty;var isExtensible=Object.isExtensible||function(){return true};var microtimeObject=req("microtime");var perfObject=isHostType(window,"performance")&&performance;var perfName=perfObject&&(perfObject.now&&"now"||perfObject.webkitNow&&"webkitNow");var processObject=isHostType(window,"process")&&process;var propertyIsEnumerable={}.propertyIsEnumerable;var setDescriptor=Object.defineProperty;var toString={}.toString;var trash=doc&&doc.createElement("div");var uid="uid"+ +new Date;var calledBy={};var divisors={1:4096,2:512,3:64,4:8,5:0};var tTable={1:12.706,2:4.303,3:3.182,4:2.776,5:2.571,6:2.447,7:2.365,8:2.306,9:2.262,10:2.228,11:2.201,12:2.179,13:2.16,14:2.145,15:2.131,16:2.12,17:2.11,18:2.101,19:2.093,20:2.086,21:2.08,22:2.074,23:2.069,24:2.064,25:2.06,26:2.056,27:2.052,28:2.048,29:2.045,30:2.042,infinity:1.96};var uTable={5:[0,1,2],6:[1,2,3,5],7:[1,3,5,6,8],8:[2,4,6,8,10,13],9:[2,4,7,10,12,15,17],10:[3,5,8,11,14,17,20,23],11:[3,6,9,13,16,19,23,26,30],12:[4,7,11,14,18,22,26,29,33,37],13:[4,8,12,16,20,24,28,33,37,41,45],14:[5,9,13,17,22,26,31,36,40,45,50,55],15:[5,10,14,19,24,29,34,39,44,49,54,59,64],16:[6,11,15,21,26,31,37,42,47,53,59,64,70,75],17:[6,11,17,22,28,34,39,45,51,57,63,67,75,81,87],18:[7,12,18,24,30,36,42,48,55,61,67,74,80,86,93,99],19:[7,13,19,25,32,38,45,52,58,65,72,78,85,92,99,106,113],20:[8,14,20,27,34,41,48,55,62,69,76,83,90,98,105,112,119,127],21:[8,15,22,29,36,43,50,58,65,73,80,88,96,103,111,119,126,134,142],22:[9,16,23,30,38,45,53,61,69,77,85,93,101,109,117,125,133,141,150,158],23:[9,17,24,32,40,48,56,64,73,81,89,98,106,115,123,132,140,149,157,166,175],24:[10,17,25,33,42,50,59,67,76,85,94,102,111,120,129,138,147,156,165,174,183,192],25:[10,18,27,35,44,53,62,71,80,89,98,107,117,126,135,145,154,163,173,182,192,201,211],26:[11,19,28,37,46,55,64,74,83,93,102,112,122,132,141,151,161,171,181,191,200,210,220,230],27:[11,20,29,38,48,57,67,77,87,97,107,118,125,138,147,158,168,178,188,199,209,219,230,240,250],28:[12,21,30,40,50,60,70,80,90,101,111,122,132,143,154,164,175,186,196,207,218,228,239,250,261,272],29:[13,22,32,42,52,62,73,83,94,105,116,127,138,149,160,171,182,193,204,215,226,238,249,260,271,282,294],30:[13,23,33,43,54,65,76,87,98,109,120,131,143,154,166,177,189,200,212,223,235,247,258,270,282,293,305,317]};var support={};(function(){support.air=isClassOf(window.runtime,"ScriptBridgingProxyObject");support.argumentsClass=isClassOf(arguments,"Arguments");support.browser=doc&&isHostType(window,"navigator");support.charByIndex="x"[0]+Object("x")[0]=="xx";support.charByOwnIndex=support.charByIndex&&hasKey("x","0");support.java=isClassOf(window.java,"JavaPackage");support.timeout=isHostType(window,"setTimeout")&&isHostType(window,"clearTimeout");try{support.decompilation=Function("return ("+function(x){return{x:""+(1+x)+"",y:0}}+")")()(0).x==="1"}catch(e){support.decompilation=false}try{var o={};support.descriptors=(setDescriptor(o,o,o),"value"in getDescriptor(o,o))}catch(e){support.descriptors=false}try{support.getAllKeys=/\bvalueOf\b/.test(getAllKeys(Object.prototype))}catch(e){support.getAllKeys=false}support.iteratesOwnFirst=function(){var props=[];function ctor(){this.x=1}ctor.prototype={y:1};for(var prop in new ctor){props.push(prop)}return props[0]=="x"}();try{support.nodeClass=({toString:0}+"",toString.call(doc||0)!="[object Object]")}catch(e){support.nodeClass=true}})();var timer={ns:Date,start:null,stop:null};var noArgumentsClass=!support.argumentsClass,noCharByIndex=!support.charByIndex,noCharByOwnIndex=!support.charByOwnIndex;var abs=Math.abs,floor=Math.floor,max=Math.max,min=Math.min,pow=Math.pow,sqrt=Math.sqrt;function Benchmark(name,fn,options){var me=this;if(me==null||me.constructor!=Benchmark){return new Benchmark(name,fn,options)}if(isClassOf(name,"Object")){options=name}else if(isClassOf(name,"Function")){options=fn;fn=name}else if(isClassOf(fn,"Object")){options=fn;fn=null;me.name=name}else{me.name=name}setOptions(me,options);me.id||(me.id=++counter);me.fn==null&&(me.fn=fn);me.stats=deepClone(me.stats);me.times=deepClone(me.times)}function Deferred(clone){var me=this;if(me==null||me.constructor!=Deferred){return new Deferred(clone)}me.benchmark=clone;clock(me)}function Event(type){var me=this;return me==null||me.constructor!=Event?new Event(type):type instanceof Event?type:extend(me,{timeStamp:+new Date},typeof type=="string"?{type:type}:type)}function Suite(name,options){var me=this;if(me==null||me.constructor!=Suite){return new Suite(name,options)}if(isClassOf(name,"Object")){options=name}else{me.name=name}setOptions(me,options)}function concat(){var value,j=-1,length=arguments.length,result=slice.call(this),index=result.length;while(++j<length){value=arguments[j];if(isClassOf(value,"Array")){for(var k=0,l=value.length;k<l;k++,index++){if(k in value){result[index]=value[k]}}}else{result[index++]=value}}return result}function insert(start,deleteCount,elements){var deleteEnd=start+deleteCount,elementCount=elements?elements.length:0,index=start-1,length=start+elementCount,object=this,result=Array(deleteCount),tail=slice.call(object,deleteEnd);while(++index<deleteEnd){if(index in object){result[index-start]=object[index];delete object[index]}}index=start-1;while(++index<length){object[index]=elements[index-start]}start=index--;length=max(0,(object.length>>>0)-deleteCount+elementCount);while(++index<length){if(index-start in tail){object[index]=tail[index-start]}else if(index in object){delete object[index]}}deleteCount=deleteCount>elementCount?deleteCount-elementCount:0;while(deleteCount--){index=length+deleteCount;if(index in object){delete object[index]}}object.length=length;return result}function reverse(){var upperIndex,value,index=-1,object=Object(this),length=object.length>>>0,middle=floor(length/2);if(length>1){while(++index<middle){upperIndex=length-index-1;value=upperIndex in object?object[upperIndex]:uid;if(index in object){object[upperIndex]=object[index]}else{delete object[upperIndex]}if(value!=uid){object[index]=value}else{delete object[index]}}}return object}function shift(){return insert.call(this,0,1)[0]}function slice(start,end){var index=-1,object=Object(this),length=object.length>>>0,result=[];start=toInteger(start);start=start<0?max(length+start,0):min(start,length);start--;end=end==null?length:toInteger(end);end=end<0?max(length+end,0):min(end,length);while((++index,++start)<end){if(start in object){result[index]=object[start]}}return result}function splice(start,deleteCount){var object=Object(this),length=object.length>>>0;start=toInteger(start);start=start<0?max(length+start,0):min(start,length);deleteCount=arguments.length==1?length-start:min(max(toInteger(deleteCount),0),length-start);return insert.call(object,start,deleteCount,slice.call(arguments,2))}function toInteger(value){value=+value;return value===0||!isFinite(value)?value||0:value-value%1}function unshift(){var object=Object(this);insert.call(object,0,0,arguments);return object.length}function bind(fn,thisArg){return function(){fn.apply(thisArg,arguments)}}function createFunction(){createFunction=function(args,body){var result,anchor=freeDefine?define.amd:Benchmark,prop=uid+"createFunction";runScript((freeDefine?"define.amd.":"Benchmark.")+prop+"=function("+args+"){"+body+"}");result=anchor[prop];delete anchor[prop];return result};createFunction=support.browser&&(createFunction("",'return"'+uid+'"')||noop)()==uid?createFunction:Function;return createFunction.apply(null,arguments)}function delay(bench,fn){bench._timerId=setTimeout(fn,bench.delay*1e3)}function destroyElement(element){trash.appendChild(element);trash.innerHTML=""}function forProps(){var forShadowed,skipSeen,forArgs=true,shadowed=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"];(function(enumFlag,key){function Klass(){this.valueOf=0}Klass.prototype.valueOf=0;for(key in new Klass){enumFlag+=key=="valueOf"?1:0}for(key in arguments){key=="0"&&(forArgs=false)}skipSeen=enumFlag==2;forShadowed=!enumFlag})(0);forProps=function(object,callback,options){options||(options={});var result=object;object=Object(object);var ctor,key,keys,skipCtor,done=!result,which=options.which,allFlag=which=="all",index=-1,iteratee=object,length=object.length,ownFlag=allFlag||which=="own",seen={},skipProto=isClassOf(object,"Function"),thisArg=options.bind;if(thisArg!==undefined){callback=bind(callback,thisArg)}if(allFlag&&support.getAllKeys){for(index=0,keys=getAllKeys(object),length=keys.length;index<length;index++){key=keys[index];if(callback(object[key],key,object)===false){break}}}else{for(key in object){if(done=!(skipProto&&key=="prototype")&&!(skipSeen&&(hasKey(seen,key)||!(seen[key]=true)))&&(!ownFlag||ownFlag&&hasKey(object,key))&&callback(object[key],key,object)===false){break}}if(!done&&(forArgs&&isArguments(object)||(noCharByIndex||noCharByOwnIndex)&&isClassOf(object,"String")&&(iteratee=noCharByIndex?object.split(""):object))){while(++index<length){if(done=callback(iteratee[index],String(index),object)===false){break}}}if(!done&&forShadowed){ctor=object.constructor;skipCtor=ctor&&ctor.prototype&&ctor.prototype.constructor===ctor;for(index=0;index<7;index++){key=shadowed[index];if(!(skipCtor&&key=="constructor")&&hasKey(object,key)&&callback(object[key],key,object)===false){break}}}}return result};return forProps.apply(null,arguments)}function getFirstArgument(fn){return!hasKey(fn,"toString")&&(/^[\s(]*function[^(]*\(([^\s,)]+)/.exec(fn)||0)[1]||""}function getMean(sample){return reduce(sample,function(sum,x){return sum+x})/sample.length||0}function getSource(fn,altSource){var result=altSource;if(isStringable(fn)){result=String(fn)}else if(support.decompilation){result=(/^[^{]+\{([\s\S]*)}\s*$/.exec(fn)||0)[1]}result=(result||"").replace(/^\s+|\s+$/g,"");return/^(?:\/\*+[\w|\W]*?\*\/|\/\/.*?[\n\r\u2028\u2029]|\s)*(["'])use strict\1;?$/.test(result)?"":result}function isArguments(){isArguments=function(value){return toString.call(value)=="[object Arguments]"};if(noArgumentsClass){isArguments=function(value){return hasKey(value,"callee")&&!(propertyIsEnumerable&&propertyIsEnumerable.call(value,"callee"))}}return isArguments(arguments[0])}function isClassOf(value,name){return value!=null&&toString.call(value)=="[object "+name+"]"}function isHostType(object,property){var type=object!=null?typeof object[property]:"number";return!/^(?:boolean|number|string|undefined)$/.test(type)&&(type=="object"?!!object[property]:true)}function isPlainObject(value){var result=false;if(!(value&&typeof value=="object")||noArgumentsClass&&isArguments(value)){return result}var ctor=value.constructor;if((support.nodeClass||!(typeof value.toString!="function"&&typeof(value+"")=="string"))&&(!isClassOf(ctor,"Function")||ctor instanceof ctor)){if(support.iteratesOwnFirst){forProps(value,function(subValue,subKey){result=subKey});return result===false||hasKey(value,result)}forProps(value,function(subValue,subKey){result=!hasKey(value,subKey);return false});return result===false}return result}function isStringable(value){return hasKey(value,"toString")||isClassOf(value,"String")}function methodize(fn){return function(){var args=[this];args.push.apply(args,arguments);return fn.apply(null,args)}}function noop(){}function req(id){try{var result=freeExports&&freeRequire(id)}catch(e){}return result||null}function runScript(code){var anchor=freeDefine?define.amd:Benchmark,script=doc.createElement("script"),sibling=doc.getElementsByTagName("script")[0],parent=sibling.parentNode,prop=uid+"runScript",prefix="("+(freeDefine?"define.amd.":"Benchmark.")+prop+"||function(){})();";try{script.appendChild(doc.createTextNode(prefix+code));anchor[prop]=function(){destroyElement(script)}}catch(e){parent=parent.cloneNode(false);sibling=null;script.text=code}parent.insertBefore(script,sibling);delete anchor[prop]}function setOptions(bench,options){options=extend({},bench.constructor.options,options);bench.options=forOwn(options,function(value,key){if(value!=null){if(/^on[A-Z]/.test(key)){forEach(key.split(" "),function(key){bench.on(key.slice(2).toLowerCase(),value)})}else if(!hasKey(bench,key)){bench[key]=deepClone(value)}}})}function resolve(){var me=this,clone=me.benchmark,bench=clone._original;if(bench.aborted){me.teardown();clone.running=false;cycle(me)}else if(++me.cycles<clone.count){if(support.timeout){setTimeout(function(){clone.compiled.call(me,timer)},0)}else{clone.compiled.call(me,timer)}}else{timer.stop(me);me.teardown();delay(clone,function(){cycle(me)})}}function deepClone(value){var accessor,circular,clone,ctor,descriptor,extensible,key,length,markerKey,parent,result,source,subIndex,data={value:value},index=0,marked=[],queue={length:0},unmarked=[];function Marker(object){this.raw=object}function forPropsCallback(subValue,subKey){if(subValue&&subValue.constructor==Marker){return}if(subValue===Object(subValue)){queue[queue.length++]={key:subKey,parent:clone,source:value}}else{try{clone[subKey]=subValue}catch(e){}}}function getMarkerKey(object){var result=uid;while(object[result]&&object[result].constructor!=Marker){result+=1}return result}do{key=data.key;parent=data.parent;source=data.source;clone=value=source?source[key]:data.value;accessor=circular=descriptor=false;if(value===Object(value)){if(isClassOf(value.deepClone,"Function")){clone=value.deepClone()}else{ctor=value.constructor;switch(toString.call(value)){case"[object Array]":clone=new ctor(value.length);break;case"[object Boolean]":clone=new ctor(value==true);break;case"[object Date]":clone=new ctor(+value);break;case"[object Object]":isPlainObject(value)&&(clone={});break;case"[object Number]":case"[object String]":clone=new ctor(value);break;case"[object RegExp]":clone=ctor(value.source,(value.global?"g":"")+(value.ignoreCase?"i":"")+(value.multiline?"m":""))}}if(clone&&clone!=value&&!(descriptor=source&&support.descriptors&&getDescriptor(source,key),accessor=descriptor&&(descriptor.get||descriptor.set))){if(extensible=isExtensible(value)){markerKey=getMarkerKey(value);if(value[markerKey]){circular=clone=value[markerKey].raw}}else{for(subIndex=0,length=unmarked.length;subIndex<length;subIndex++){data=unmarked[subIndex];if(data.object===value){circular=clone=data.clone;break}}}if(!circular){if(extensible){value[markerKey]=new Marker(clone);marked.push({key:markerKey,object:value})}else{unmarked.push({clone:clone,object:value})}forProps(value,forPropsCallback,{which:"all"})}}}if(parent){if(accessor||descriptor&&!(descriptor.configurable&&descriptor.enumerable&&descriptor.writable)){if("value"in descriptor){descriptor.value=clone}setDescriptor(parent,key,descriptor)}else{parent[key]=clone}}else{result=clone}}while(data=queue[index++]);for(index=0,length=marked.length;index<length;index++){data=marked[index];delete data.object[data.key]}return result}function each(object,callback,thisArg){var result=object;object=Object(object);var fn=callback,index=-1,length=object.length,isSnapshot=!!(object.snapshotItem&&(length=object.snapshotLength)),isSplittable=(noCharByIndex||noCharByOwnIndex)&&isClassOf(object,"String"),isConvertable=isSnapshot||isSplittable||"item"in object,origObject=object;if(length===length>>>0){if(isConvertable){callback=function(value,index){return fn.call(this,value,index,origObject)};if(isSplittable){object=object.split("")}else{object=[];while(++index<length){object[index]=isSnapshot?result.snapshotItem(index):result[index]}}}forEach(object,callback,thisArg)}else{forOwn(object,callback,thisArg)}return result}function extend(destination,source){var result=destination;delete arguments[0];forEach(arguments,function(source){forProps(source,function(value,key){result[key]=value})});return result}function filter(array,callback,thisArg){var result;if(callback=="successful"){callback=function(bench){return bench.cycles&&isFinite(bench.hz)}}else if(callback=="fastest"||callback=="slowest"){result=filter(array,"successful").sort(function(a,b){a=a.stats;b=b.stats;return(a.mean+a.moe>b.mean+b.moe?1:-1)*(callback=="fastest"?1:-1)});result=filter(result,function(bench){return result[0].compare(bench)==0})}return result||reduce(array,function(result,value,index){return callback.call(thisArg,value,index,array)?(result.push(value),result):result},[])}function forEach(array,callback,thisArg){var index=-1,length=(array=Object(array)).length>>>0;if(thisArg!==undefined){callback=bind(callback,thisArg)}while(++index<length){if(index in array&&callback(array[index],index,array)===false){break}}return array}function forOwn(object,callback,thisArg){return forProps(object,callback,{bind:thisArg,which:"own"})}function formatNumber(number){number=String(number).split(".");return number[0].replace(/(?=(?:\d{3})+$)(?!\b)/g,",")+(number[1]?"."+number[1]:"")}function hasKey(){hasKey=function(object,key){var parent=object!=null&&(object.constructor||Object).prototype;return!!parent&&key in Object(object)&&!(key in parent&&object[key]===parent[key])};if(isClassOf(hasOwnProperty,"Function")){hasKey=function(object,key){return object!=null&&hasOwnProperty.call(object,key)}}else if({}.__proto__==Object.prototype){hasKey=function(object,key){var result=false;if(object!=null){object=Object(object);object.__proto__=[object.__proto__,object.__proto__=null,result=key in object][0]}return result}}return hasKey.apply(this,arguments)}function indexOf(array,value,fromIndex){var index=toInteger(fromIndex),length=(array=Object(array)).length>>>0;index=(index<0?max(0,length+index):index)-1;while(++index<length){if(index in array&&value===array[index]){return index}}return-1}function interpolate(string,object){forOwn(object,function(value,key){string=string.replace(RegExp("#\\{"+key.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")+"\\}","g"),value)});return string}function invoke(benches,name){var args,bench,queued,index=-1,eventProps={currentTarget:benches},options={onStart:noop,onCycle:noop,onComplete:noop},result=map(benches,function(bench){return bench});function execute(){var listeners,async=isAsync(bench);if(async){bench.on("complete",getNext);listeners=bench.events.complete;listeners.splice(0,0,listeners.pop())}result[index]=isClassOf(bench&&bench[name],"Function")?bench[name].apply(bench,args):undefined;return!async&&getNext()}function getNext(event){var cycleEvent,last=bench,async=isAsync(last);if(async){last.off("complete",getNext);last.emit("complete")}eventProps.type="cycle";eventProps.target=last;cycleEvent=Event(eventProps);options.onCycle.call(benches,cycleEvent);if(!cycleEvent.aborted&&raiseIndex()!==false){bench=queued?benches[0]:result[index];if(isAsync(bench)){delay(bench,execute)}else if(async){while(execute()){}}else{return true}}else{eventProps.type="complete";options.onComplete.call(benches,Event(eventProps))}if(event){event.aborted=true}else{return false}}function isAsync(object){var async=args[0]&&args[0].async;return Object(object).constructor==Benchmark&&name=="run"&&((async==null?object.options.async:async)&&support.timeout||object.defer)}function raiseIndex(){var length=result.length;if(queued){do{++index>0&&shift.call(benches)}while((length=benches.length)&&!("0"in benches))}else{while(++index<length&&!(index in result)){}}return(queued?length:index<length)?index:index=false}if(isClassOf(name,"String")){args=slice.call(arguments,2)}else{options=extend(options,name);name=options.name;args=isClassOf(args="args"in options?options.args:[],"Array")?args:[args];queued=options.queued}if(raiseIndex()!==false){bench=result[index];eventProps.type="start";eventProps.target=bench;options.onStart.call(benches,Event(eventProps));if(benches.aborted&&benches.constructor==Suite&&name=="run"){eventProps.type="cycle";options.onCycle.call(benches,Event(eventProps));eventProps.type="complete";options.onComplete.call(benches,Event(eventProps))}else{if(isAsync(bench)){delay(bench,execute)}else{while(execute()){}}}}return result}function join(object,separator1,separator2){var result=[],length=(object=Object(object)).length,arrayLike=length===length>>>0;separator2||(separator2=": ");each(object,function(value,key){result.push(arrayLike?value:key+separator2+value)});return result.join(separator1||",")}function map(array,callback,thisArg){return reduce(array,function(result,value,index){result[index]=callback.call(thisArg,value,index,array);return result},Array(Object(array).length>>>0))}function pluck(array,property){return map(array,function(object){return object==null?undefined:object[property]})}function reduce(array,callback,accumulator){var noaccum=arguments.length<3;forEach(array,function(value,index){accumulator=noaccum?(noaccum=false,value):callback(accumulator,value,index,array)});return accumulator}function abortSuite(){var event,me=this,resetting=calledBy.resetSuite;if(me.running){event=Event("abort");me.emit(event);if(!event.cancelled||resetting){calledBy.abortSuite=true;me.reset();delete calledBy.abortSuite;if(!resetting){me.aborted=true;invoke(me,"abort")}}}return me}function add(name,fn,options){var me=this,bench=Benchmark(name,fn,options),event=Event({type:"add",target:bench});if(me.emit(event),!event.cancelled){me.push(bench)}return me}function cloneSuite(options){var me=this,result=new me.constructor(extend({},me.options,options));forOwn(me,function(value,key){if(!hasKey(result,key)){result[key]=value&&isClassOf(value.clone,"Function")?value.clone():deepClone(value)}});return result}function filterSuite(callback){var me=this,result=new me.constructor;result.push.apply(result,filter(me,callback));return result}function resetSuite(){var event,me=this,aborting=calledBy.abortSuite;if(me.running&&!aborting){calledBy.resetSuite=true;me.abort();delete calledBy.resetSuite}else if((me.aborted||me.running)&&(me.emit(event=Event("reset")),!event.cancelled)){me.running=false;if(!aborting){invoke(me,"reset")}}return me}function runSuite(options){var me=this;me.reset();me.running=true;options||(options={});invoke(me,{name:"run",args:options,queued:options.queued,onStart:function(event){me.emit(event)},onCycle:function(event){var bench=event.target;if(bench.error){me.emit({type:"error",target:bench})}me.emit(event);event.aborted=me.aborted},onComplete:function(event){me.running=false;me.emit(event)}});return me}function emit(type){var listeners,me=this,event=Event(type),events=me.events,args=(arguments[0]=event,arguments);event.currentTarget||(event.currentTarget=me);event.target||(event.target=me);delete event.result;if(events&&(listeners=hasKey(events,event.type)&&events[event.type])){forEach(listeners.slice(),function(listener){if((event.result=listener.apply(me,args))===false){event.cancelled=true}return!event.aborted})}return event.result}function listeners(type){var me=this,events=me.events||(me.events={});return hasKey(events,type)?events[type]:events[type]=[]}function off(type,listener){var me=this,events=me.events;events&&each(type?type.split(" "):events,function(listeners,type){var index;if(typeof listeners=="string"){type=listeners;listeners=hasKey(events,type)&&events[type]}if(listeners){if(listener){index=indexOf(listeners,listener);if(index>-1){listeners.splice(index,1)}}else{listeners.length=0}}});return me}function on(type,listener){var me=this,events=me.events||(me.events={});forEach(type.split(" "),function(type){(hasKey(events,type)?events[type]:events[type]=[]).push(listener)});return me}function abort(){var event,me=this,resetting=calledBy.reset;if(me.running){event=Event("abort");me.emit(event);if(!event.cancelled||resetting){calledBy.abort=true;me.reset();delete calledBy.abort;if(support.timeout){clearTimeout(me._timerId);delete me._timerId}if(!resetting){me.aborted=true;me.running=false}}}return me}function clone(options){var me=this,result=new me.constructor(extend({},me,options));result.options=extend({},me.options,options);forOwn(me,function(value,key){if(!hasKey(result,key)){result[key]=deepClone(value)}});return result}function compare(other){var critical,zStat,me=this,sample1=me.stats.sample,sample2=other.stats.sample,size1=sample1.length,size2=sample2.length,maxSize=max(size1,size2),minSize=min(size1,size2),u1=getU(sample1,sample2),u2=getU(sample2,sample1),u=min(u1,u2);function getScore(xA,sampleB){return reduce(sampleB,function(total,xB){return total+(xB>xA?0:xB<xA?1:.5)},0)}function getU(sampleA,sampleB){return reduce(sampleA,function(total,xA){return total+getScore(xA,sampleB)},0)}function getZ(u){return(u-size1*size2/2)/sqrt(size1*size2*(size1+size2+1)/12)}if(me==other){return 0}if(size1+size2>30){zStat=getZ(u);return abs(zStat)>1.96?zStat>0?-1:1:0}critical=maxSize<5||minSize<3?0:uTable[maxSize][minSize-3];return u<=critical?u==u1?1:-1:0}function reset(){var data,event,me=this,index=0,changes={length:0},queue={length:0};if(me.running&&!calledBy.abort){calledBy.reset=true;me.abort();delete calledBy.reset}else{data={destination:me,source:extend({},me.constructor.prototype,me.options)};do{forOwn(data.source,function(value,key){var changed,destination=data.destination,currValue=destination[key];if(value&&typeof value=="object"){if(isClassOf(value,"Array")){if(!isClassOf(currValue,"Array")){changed=currValue=[]}if(currValue.length!=value.length){changed=currValue=currValue.slice(0,value.length);currValue.length=value.length}}else if(!currValue||typeof currValue!="object"){changed=currValue={}}if(changed){changes[changes.length++]={destination:destination,key:key,value:currValue}}queue[queue.length++]={destination:currValue,source:value}}else if(value!==currValue&&!(value==null||isClassOf(value,"Function"))){changes[changes.length++]={destination:destination,key:key,value:value}}})}while(data=queue[index++]);if(changes.length&&(me.emit(event=Event("reset")),!event.cancelled)){forEach(changes,function(data){data.destination[data.key]=data.value})}}return me}function toStringBench(){var me=this,error=me.error,hz=me.hz,id=me.id,stats=me.stats,size=stats.sample.length,pm=support.java?"+/-":"±",result=me.name||(isNaN(id)?id:"<Test #"+id+">");if(error){result+=": "+join(error)}else{result+=" x "+formatNumber(hz.toFixed(hz<100?2:0))+" ops/sec "+pm+stats.rme.toFixed(2)+"% ("+size+" run"+(size==1?"":"s")+" sampled)"}return result}function clock(){var applet,options=Benchmark.options,template={begin:"s$=new n$",end:"r$=(new n$-s$)/1e3",uid:uid},timers=[{ns:timer.ns,res:max(.0015,getRes("ms")),unit:"ms"}];clock=function(clone){var deferred;if(clone instanceof Deferred){deferred=clone;clone=deferred.benchmark}var bench=clone._original,fn=bench.fn,fnArg=deferred?getFirstArgument(fn)||"deferred":"",stringable=isStringable(fn);var source={setup:getSource(bench.setup,preprocess("m$.setup()")),fn:getSource(fn,preprocess("m$.fn("+fnArg+")")),fnArg:fnArg,teardown:getSource(bench.teardown,preprocess("m$.teardown()"))};var count=bench.count=clone.count,decompilable=support.decompilation||stringable,id=bench.id,isEmpty=!(source.fn||stringable),name=bench.name||(typeof id=="number"?"<Test #"+id+">":id),ns=timer.ns,result=0;clone.minTime=bench.minTime||(bench.minTime=bench.options.minTime=options.minTime);if(applet){try{ns.nanoTime()}catch(e){ns=timer.ns=new applet.Packages.nano}}var compiled=bench.compiled=createFunction(preprocess("t$"),interpolate(preprocess(deferred?"var d$=this,#{fnArg}=d$,m$=d$.benchmark._original,f$=m$.fn,su$=m$.setup,td$=m$.teardown;"+"if(!d$.cycles){"+'d$.fn=function(){var #{fnArg}=d$;if(typeof f$=="function"){try{#{fn}\n}catch(e$){f$(d$)}}else{#{fn}\n}};'+'d$.teardown=function(){d$.cycles=0;if(typeof td$=="function"){try{#{teardown}\n}catch(e$){td$()}}else{#{teardown}\n}};'+'if(typeof su$=="function"){try{#{setup}\n}catch(e$){su$()}}else{#{setup}\n};'+"t$.start(d$);"+"}d$.fn();return{}":"var r$,s$,m$=this,f$=m$.fn,i$=m$.count,n$=t$.ns;#{setup}\n#{begin};"+'while(i$--){#{fn}\n}#{end};#{teardown}\nreturn{elapsed:r$,uid:"#{uid}"}'),source));try{if(isEmpty){throw new Error('The test "'+name+'" is empty. This may be the result of dead code removal.')}else if(!deferred){bench.count=1;compiled=(compiled.call(bench,timer)||{}).uid==uid&&compiled;bench.count=count}}catch(e){compiled=null;clone.error=e||new Error(String(e));bench.count=count}if(decompilable&&!compiled&&!deferred&&!isEmpty){compiled=createFunction(preprocess("t$"),interpolate(preprocess((clone.error&&!stringable?"var r$,s$,m$=this,f$=m$.fn,i$=m$.count":"function f$(){#{fn}\n}var r$,s$,m$=this,i$=m$.count")+",n$=t$.ns;#{setup}\n#{begin};m$.f$=f$;while(i$--){m$.f$()}#{end};"+"delete m$.f$;#{teardown}\nreturn{elapsed:r$}"),source));try{bench.count=1;compiled.call(bench,timer);bench.compiled=compiled;bench.count=count;delete clone.error}catch(e){bench.count=count;if(clone.error){compiled=null}else{bench.compiled=compiled;clone.error=e||new Error(String(e))}}}clone.compiled=compiled;if(!clone.error){result=compiled.call(deferred||bench,timer).elapsed}return result};function getRes(unit){var measured,begin,count=30,divisor=1e3,ns=timer.ns,sample=[];while(count--){if(unit=="us"){divisor=1e6;if(ns.stop){ns.start();while(!(measured=ns.microseconds())){}}else if(ns[perfName]){divisor=1e3;measured=Function("n","var r,s=n."+perfName+"();while(!(r=n."+perfName+"()-s)){};return r")(ns)}else{begin=ns();while(!(measured=ns()-begin)){}}}else if(unit=="ns"){divisor=1e9;if(ns.nanoTime){begin=ns.nanoTime();while(!(measured=ns.nanoTime()-begin)){}}else{begin=(begin=ns())[0]+begin[1]/divisor;while(!(measured=(measured=ns())[0]+measured[1]/divisor-begin)){}divisor=1}}else{begin=new ns;while(!(measured=new ns-begin)){}}if(measured>0){sample.push(measured)}else{sample.push(Infinity);break}}return getMean(sample)/divisor}function preprocess(code){return interpolate(code,template).replace(/\$/g,/\d+/.exec(uid))}each(doc&&doc.applets||[],function(element){return!(timer.ns=applet="nanoTime"in element&&element)});try{if(typeof timer.ns.nanoTime()=="number"){timers.push({ns:timer.ns,res:getRes("ns"),unit:"ns"})}}catch(e){}try{if(timer.ns=new(window.chrome||window.chromium).Interval){timers.push({ns:timer.ns,res:getRes("us"),unit:"us"})
}}catch(e){}if(timer.ns=perfName&&perfObject){timers.push({ns:timer.ns,res:getRes("us"),unit:"us"})}if(processObject&&typeof(timer.ns=processObject.hrtime)=="function"){timers.push({ns:timer.ns,res:getRes("ns"),unit:"ns"})}if(microtimeObject&&typeof(timer.ns=microtimeObject.now)=="function"){timers.push({ns:timer.ns,res:getRes("us"),unit:"us"})}timer=reduce(timers,function(timer,other){return other.res<timer.res?other:timer});if(timer.unit!="ns"&&applet){applet=destroyElement(applet)}if(timer.res==Infinity){throw new Error("Benchmark.js was unable to find a working timer.")}if(timer.unit=="ns"){if(timer.ns.nanoTime){extend(template,{begin:"s$=n$.nanoTime()",end:"r$=(n$.nanoTime()-s$)/1e9"})}else{extend(template,{begin:"s$=n$()",end:"r$=n$(s$);r$=r$[0]+(r$[1]/1e9)"})}}else if(timer.unit=="us"){if(timer.ns.stop){extend(template,{begin:"s$=n$.start()",end:"r$=n$.microseconds()/1e6"})}else if(perfName){extend(template,{begin:"s$=n$."+perfName+"()",end:"r$=(n$."+perfName+"()-s$)/1e3"})}else{extend(template,{begin:"s$=n$()",end:"r$=(n$()-s$)/1e6"})}}timer.start=createFunction(preprocess("o$"),preprocess("var n$=this.ns,#{begin};o$.elapsed=0;o$.timeStamp=s$"));timer.stop=createFunction(preprocess("o$"),preprocess("var n$=this.ns,s$=o$.timeStamp,#{end};o$.elapsed=r$"));options.minTime||(options.minTime=max(timer.res/2/.01,.05));return clock.apply(null,arguments)}function compute(bench,options){options||(options={});var async=options.async,elapsed=0,initCount=bench.initCount,minSamples=bench.minSamples,queue=[],sample=bench.stats.sample;function enqueue(){queue.push(bench.clone({_original:bench,events:{abort:[update],cycle:[update],error:[update],start:[update]}}))}function update(event){var clone=this,type=event.type;if(bench.running){if(type=="start"){clone.count=bench.initCount}else{if(type=="error"){bench.error=clone.error}if(type=="abort"){bench.abort();bench.emit("cycle")}else{event.currentTarget=event.target=bench;bench.emit(event)}}}else if(bench.aborted){clone.events.abort.length=0;clone.abort()}}function evaluate(event){var critical,df,mean,moe,rme,sd,sem,variance,clone=event.target,done=bench.aborted,now=+new Date,size=sample.push(clone.times.period),maxedOut=size>=minSamples&&(elapsed+=now-clone.times.timeStamp)/1e3>bench.maxTime,times=bench.times,varOf=function(sum,x){return sum+pow(x-mean,2)};if(done||clone.hz==Infinity){maxedOut=!(size=sample.length=queue.length=0)}if(!done){mean=getMean(sample);variance=reduce(sample,varOf,0)/(size-1)||0;sd=sqrt(variance);sem=sd/sqrt(size);df=size-1;critical=tTable[Math.round(df)||1]||tTable.infinity;moe=sem*critical;rme=moe/mean*100||0;extend(bench.stats,{deviation:sd,mean:mean,moe:moe,rme:rme,sem:sem,variance:variance});if(maxedOut){bench.initCount=initCount;bench.running=false;done=true;times.elapsed=(now-times.timeStamp)/1e3}if(bench.hz!=Infinity){bench.hz=1/mean;times.cycle=mean*bench.count;times.period=mean}}if(queue.length<2&&!maxedOut){enqueue()}event.aborted=done}enqueue();invoke(queue,{name:"run",args:{async:async},queued:true,onCycle:evaluate,onComplete:function(){bench.emit("complete")}})}function cycle(clone,options){options||(options={});var deferred;if(clone instanceof Deferred){deferred=clone;clone=clone.benchmark}var clocked,cycles,divisor,event,minTime,period,async=options.async,bench=clone._original,count=clone.count,times=clone.times;if(clone.running){cycles=++clone.cycles;clocked=deferred?deferred.elapsed:clock(clone);minTime=clone.minTime;if(cycles>bench.cycles){bench.cycles=cycles}if(clone.error){event=Event("error");event.message=clone.error;clone.emit(event);if(!event.cancelled){clone.abort()}}}if(clone.running){bench.times.cycle=times.cycle=clocked;period=bench.times.period=times.period=clocked/count;bench.hz=clone.hz=1/period;bench.initCount=clone.initCount=count;clone.running=clocked<minTime;if(clone.running){if(!clocked&&(divisor=divisors[clone.cycles])!=null){count=floor(4e6/divisor)}if(count<=clone.count){count+=Math.ceil((minTime-clocked)/period)}clone.running=count!=Infinity}}event=Event("cycle");clone.emit(event);if(event.aborted){clone.abort()}if(clone.running){clone.count=count;if(deferred){clone.compiled.call(deferred,timer)}else if(async){delay(clone,function(){cycle(clone,options)})}else{cycle(clone)}}else{if(support.browser){runScript(uid+"=1;delete "+uid)}clone.emit("complete")}}function run(options){var me=this,event=Event("start");me.running=false;me.reset();me.running=true;me.count=me.initCount;me.times.timeStamp=+new Date;me.emit(event);if(!event.cancelled){options={async:((options=options&&options.async)==null?me.async:options)&&support.timeout};if(me._original){if(me.defer){Deferred(me)}else{cycle(me,options)}}else{compute(me,options)}}return me}extend(Benchmark,{options:{async:false,defer:false,delay:.005,id:undefined,initCount:1,maxTime:5,minSamples:5,minTime:0,name:undefined,onAbort:undefined,onComplete:undefined,onCycle:undefined,onError:undefined,onReset:undefined,onStart:undefined},platform:req("platform")||window.platform||{description:window.navigator&&navigator.userAgent||null,layout:null,product:null,name:null,manufacturer:null,os:null,prerelease:null,version:null,toString:function(){return this.description||""}},version:"1.0.0",support:support,deepClone:deepClone,each:each,extend:extend,filter:filter,forEach:forEach,forOwn:forOwn,formatNumber:formatNumber,hasKey:(hasKey(Benchmark,""),hasKey),indexOf:indexOf,interpolate:interpolate,invoke:invoke,join:join,map:map,pluck:pluck,reduce:reduce});extend(Benchmark.prototype,{count:0,cycles:0,hz:0,compiled:undefined,error:undefined,fn:undefined,aborted:false,running:false,setup:noop,teardown:noop,stats:{moe:0,rme:0,sem:0,deviation:0,mean:0,sample:[],variance:0},times:{cycle:0,elapsed:0,period:0,timeStamp:0},abort:abort,clone:clone,compare:compare,emit:emit,listeners:listeners,off:off,on:on,reset:reset,run:run,toString:toStringBench});extend(Deferred.prototype,{benchmark:null,cycles:0,elapsed:0,timeStamp:0,resolve:resolve});extend(Event.prototype,{aborted:false,cancelled:false,currentTarget:undefined,result:undefined,target:undefined,timeStamp:0,type:""});Suite.options={name:undefined};extend(Suite.prototype,{length:0,aborted:false,running:false,forEach:methodize(forEach),indexOf:methodize(indexOf),invoke:methodize(invoke),join:[].join,map:methodize(map),pluck:methodize(pluck),pop:[].pop,push:[].push,sort:[].sort,reduce:methodize(reduce),abort:abortSuite,add:add,clone:cloneSuite,emit:emit,filter:filterSuite,listeners:listeners,off:off,on:on,reset:resetSuite,run:runSuite,concat:concat,reverse:reverse,shift:shift,slice:slice,splice:splice,unshift:unshift});extend(Benchmark,{Deferred:Deferred,Event:Event,Suite:Suite});if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){define(function(){return Benchmark})}else if(freeExports){if(typeof module=="object"&&module&&module.exports==freeExports){(module.exports=Benchmark).Benchmark=Benchmark}else{freeExports.Benchmark=Benchmark}}else{window["Benchmark"]=Benchmark}if(support.air){clock({_original:{fn:noop,count:1,options:{}}})}})(this)}).call(this,require("_process"),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{_process:1}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({"transducers.js":[function(require,module,exports){var symbolExists=typeof Symbol!=="undefined";var protocols={iterator:symbolExists?Symbol.iterator:"@@iterator",transformer:symbolExists?Symbol("transformer"):"@@transformer"};function throwProtocolError(name,coll){throw new Error("don't know how to "+name+" collection: "+coll)}function fulfillsProtocol(obj,name){if(name==="iterator"){return obj[protocols.iterator]||obj.next}return obj[protocols[name]]}function getProtocolProperty(obj,name){return obj[protocols[name]]}function iterator(coll){var iter=getProtocolProperty(coll,"iterator");if(iter){return iter.call(coll)}else if(coll.next){return coll}else if(isArray(coll)){return new ArrayIterator(coll)}else if(isObject(coll)){return new ObjectIterator(coll)}}function ArrayIterator(arr){this.arr=arr;this.index=0}ArrayIterator.prototype.next=function(){if(this.index<this.arr.length){return{value:this.arr[this.index++],done:false}}return{done:true}};function ObjectIterator(obj){this.obj=obj;this.keys=Object.keys(obj);this.index=0}ObjectIterator.prototype.next=function(){if(this.index<this.keys.length){var k=this.keys[this.index++];return{value:[k,this.obj[k]],done:false}}return{done:true}};var toString=Object.prototype.toString;var isArray=typeof Array.isArray==="function"?Array.isArray:function(obj){return toString.call(obj)=="[object Array]"};function isFunction(x){return typeof x==="function"}function isObject(x){return x instanceof Object&&Object.getPrototypeOf(x)===Object.getPrototypeOf({})}function isNumber(x){return typeof x==="number"}function Reduced(val){this.val=val}function reduce(coll,xform,init){if(isArray(coll)){var result=init;var index=-1;var len=coll.length;while(++index<len){result=xform.step(result,coll[index]);if(result instanceof Reduced){return result.val}}return xform.result(result)}else if(isObject(coll)||fulfillsProtocol(coll,"iterator")){var result=init;var iter=iterator(coll);var val=iter.next();while(!val.done){result=xform.step(result,val.value);if(result instanceof Reduced){return result.val}val=iter.next()}return xform.result(result)}throwProtocolError("iterate",coll)}function transduce(coll,xform,reducer,init){xform=xform(reducer);if(init===undefined){init=xform.init()}return reduce(coll,xform,init)}function compose(){var funcs=Array.prototype.slice.call(arguments);return function(r){var value=r;for(var i=funcs.length-1;i>=0;i--){value=funcs[i](value)}return value}}function transformer(f){return{init:function(){throw new Error("init value unavailable")},result:function(v){return v},step:f}}function bound(f,ctx,count){count=count!=null?count:1;if(!ctx){return f}else{switch(count){case 1:return function(x){return f.call(ctx,x)};case 2:return function(x,y){return f.call(ctx,x,y)};default:return f.bind(ctx)}}}function arrayMap(arr,f,ctx){var index=-1;var length=arr.length;var result=Array(length);f=bound(f,ctx,2);while(++index<length){result[index]=f(arr[index],index)}return result}function arrayFilter(arr,f,ctx){var len=arr.length;var result=[];f=bound(f,ctx,2);for(var i=0;i<len;i++){if(f(arr[i],i)){result.push(arr[i])}}return result}function Map(f,xform){this.xform=xform;this.f=f}Map.prototype.init=function(){return this.xform.init()};Map.prototype.result=function(v){return this.xform.result(v)};Map.prototype.step=function(res,input){return this.xform.step(res,this.f(input))};function map(coll,f,ctx){if(isFunction(coll)){ctx=f;f=coll;coll=null}f=bound(f,ctx);if(coll){if(isArray(coll)){return arrayMap(coll,f,ctx)}return seq(coll,map(f))}return function(xform){return new Map(f,xform)}}function Filter(f,xform){this.xform=xform;this.f=f}Filter.prototype.init=function(){return this.xform.init()};Filter.prototype.result=function(v){return this.xform.result(v)};Filter.prototype.step=function(res,input){if(this.f(input)){return this.xform.step(res,input)}return res};function filter(coll,f,ctx){if(isFunction(coll)){ctx=f;f=coll;coll=null}f=bound(f,ctx);if(coll){if(isArray(coll)){return arrayFilter(coll,f,ctx)}return seq(coll,filter(f))}return function(xform){return new Filter(f,xform)}}function remove(coll,f,ctx){if(isFunction(coll)){ctx=f;f=coll;coll=null}f=bound(f,ctx);return filter(coll,function(x){return!f(x)})}function keep(coll){return filter(coll,function(x){return x!=null})}function Dedupe(xform){this.xform=xform;this.last=undefined}Dedupe.prototype.init=function(){return this.xform.init()};Dedupe.prototype.result=function(v){return this.xform.result(v)};Dedupe.prototype.step=function(result,input){if(input!==this.last){this.last=input;return this.xform.step(result,input)}return result};function dedupe(coll){if(coll){return seq(coll,dedupe())}return function(xform){return new Dedupe(xform)}}function TakeWhile(f,xform){this.xform=xform;this.f=f}TakeWhile.prototype.init=function(){return this.xform.init()};TakeWhile.prototype.result=function(v){return this.xform.result(v)};TakeWhile.prototype.step=function(result,input){if(this.f(input)){return this.xform.step(result,input)}return new Reduced(result)};function takeWhile(coll,f,ctx){if(isFunction(coll)){ctx=f;f=coll;coll=null}f=bound(f,ctx);if(coll){return seq(coll,takeWhile(f))}return function(xform){return new TakeWhile(f,xform)}}function Take(n,xform){this.n=n;this.i=0;this.xform=xform}Take.prototype.init=function(){return this.xform.init()};Take.prototype.result=function(v){return this.xform.result(v)};Take.prototype.step=function(result,input){if(this.i++<this.n){return this.xform.step(result,input)}return new Reduced(result)};function take(coll,n){if(isNumber(coll)){n=coll;coll=null}if(coll){return seq(coll,take(n))}return function(xform){return new Take(n,xform)}}function Drop(n,xform){this.n=n;this.i=0;this.xform=xform}Drop.prototype.init=function(){return this.xform.init()};Drop.prototype.result=function(v){return this.xform.result(v)};Drop.prototype.step=function(result,input){if(this.i++<this.n){return result}return this.xform.step(result,input)};function drop(coll,n){if(isNumber(coll)){n=coll;coll=null}if(coll){return seq(coll,drop(n))}return function(xform){return new Drop(n,xform)}}function DropWhile(f,xform){this.xform=xform;this.f=f;this.dropping=true}DropWhile.prototype.init=function(){return this.xform.init()};DropWhile.prototype.result=function(v){return this.xform.result(v)};DropWhile.prototype.step=function(result,input){if(this.dropping){if(this.f(input)){return result}else{this.dropping=false}}return this.xform.step(result,input)};function dropWhile(coll,f,ctx){if(isFunction(coll)){ctx=f;f=coll;coll=null}f=bound(f,ctx);if(coll){return seq(coll,dropWhile(f))}return function(xform){return new DropWhile(f,xform)}}function Cat(xform){this.xform=xform}Cat.prototype.init=function(){return this.xform.init()};Cat.prototype.result=function(v){return this.xform.result(v)};Cat.prototype.step=function(result,input){var xform=this.xform;var newxform={init:function(){return xform.init()},result:function(v){return v},step:function(result,input){var val=xform.step(result,input);return val instanceof Reduced?new Reduced(val):val}};return reduce(input,newxform,result)};function cat(xform){return new Cat(xform)}function mapcat(f,ctx){f=bound(f,ctx);return compose(map(f),cat)}function push(arr,x){arr.push(x);return arr}function merge(obj,x){if(isArray(x)&&x.length===2){obj[x[0]]=x[1]}else{var keys=Object.keys(x);var len=keys.length;for(var i=0;i<len;i++){obj[keys[i]]=x[keys[i]]}}return obj}var arrayReducer={init:function(){return[]},result:function(v){return v},step:push};var objReducer={init:function(){return{}},result:function(v){return v},step:merge};function getReducer(coll){if(isArray(coll)){return arrayReducer}else if(isObject(coll)){return objReducer}else if(fulfillsProtocol(coll,"transformer")){return getProtocolProperty(coll,"transformer")}throwProtocolError("getReducer",coll)}function toArray(coll,xform){if(!xform){return reduce(coll,arrayReducer,[])}return transduce(coll,xform,arrayReducer,[])}function toObj(coll,xform){if(!xform){return reduce(coll,objReducer,{})}return transduce(coll,xform,objReducer,{})}function toIter(coll,xform){if(!xform){return iterator(coll)}return new LazyTransformer(xform,coll)}function seq(coll,xform){if(isArray(coll)){return transduce(coll,xform,arrayReducer,[])}else if(isObject(coll)){return transduce(coll,xform,objReducer,{})}else if(fulfillsProtocol(coll,"transformer")){var transformer=getProtocolProperty(coll,"transformer");return transduce(coll,xform,transformer,transformer.init())}else if(fulfillsProtocol(coll,"iterator")){return new LazyTransformer(xform,coll)}throwProtocolError("sequence",coll)}function into(to,xform,from){if(isArray(to)){return transduce(from,xform,arrayReducer,to)}else if(isObject(to)){return transduce(from,xform,objReducer,to)}else if(fulfillsProtocol(to,"transformer")){return transduce(from,xform,getProtocolProperty(to,"transformer"),to)}throwProtocolError("into",to)}var stepper={result:function(v){return v instanceof Reduced?v.val:v},step:function(lt,x){lt.items.push(x);return lt.rest}};function Stepper(xform,iter){this.xform=xform(stepper);this.iter=iter}Stepper.prototype.step=function(lt){var len=lt.items.length;while(lt.items.length===len){var n=this.iter.next();if(n.done||n.value instanceof Reduced){this.xform.result(this);break}this.xform.step(lt,n.value)}};function LazyTransformer(xform,coll){this.iter=iterator(coll);this.items=[];this.stepper=new Stepper(xform,iterator(coll))}LazyTransformer.prototype[protocols.iterator]=function(){return this};LazyTransformer.prototype.next=function(){this.step();if(this.items.length){return{value:this.items.pop(),done:false}}else{return{done:true}}};LazyTransformer.prototype.step=function(){if(!this.items.length){this.stepper.step(this)}};function range(n){var arr=new Array(n);for(var i=0;i<arr.length;i++){arr[i]=i}return arr}module.exports={reduce:reduce,transformer:transformer,Reduced:Reduced,iterator:iterator,push:push,merge:merge,transduce:transduce,seq:seq,toArray:toArray,toObj:toObj,toIter:toIter,into:into,compose:compose,map:map,filter:filter,remove:remove,cat:cat,mapcat:mapcat,keep:keep,dedupe:dedupe,take:take,takeWhile:takeWhile,drop:drop,dropWhile:dropWhile,range:range,protocols:protocols,LazyTransformer:LazyTransformer}},{}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({immutable:[function(require,module,exports){function universalModule(){var $Object=Object;function createClass(ctor,methods,staticMethods,superClass){var proto;if(superClass){var superProto=superClass.prototype;proto=$Object.create(superProto)}else{proto=ctor.prototype}$Object.keys(methods).forEach(function(key){proto[key]=methods[key]});$Object.keys(staticMethods).forEach(function(key){ctor[key]=staticMethods[key]});proto.constructor=ctor;ctor.prototype=proto;return ctor}function superCall(self,proto,name,args){return $Object.getPrototypeOf(proto)[name].apply(self,args)}function defaultSuperCall(self,proto,args){superCall(self,proto,"constructor",args)}var $traceurRuntime={};$traceurRuntime.createClass=createClass;$traceurRuntime.superCall=superCall;$traceurRuntime.defaultSuperCall=defaultSuperCall;"use strict";var DELETE="delete";var SHIFT=5;var SIZE=1<<SHIFT;var MASK=SIZE-1;var NOT_SET={};var CHANGE_LENGTH={value:false};var DID_ALTER={value:false};function MakeRef(ref){ref.value=false;return ref}function SetRef(ref){ref&&(ref.value=true)}function OwnerID(){}function arrCopy(arr,offset){offset=offset||0;var len=Math.max(0,arr.length-offset);var newArr=new Array(len);for(var ii=0;ii<len;ii++){newArr[ii]=arr[ii+offset]}return newArr}function invariant(condition,error){if(!condition)throw new Error(error)}function hash(o){if(!o){return 0}if(o===true){return 1}var type=typeof o;if(type==="number"){if((o|0)===o){return o&HASH_MAX_VAL}o=""+o;type="string"}if(type==="string"){return o.length>STRING_HASH_CACHE_MIN_STRLEN?cachedHashString(o):hashString(o)}if(o.hashCode){return hash(typeof o.hashCode==="function"?o.hashCode():o.hashCode)}return hashJSObj(o)}function cachedHashString(string){var hash=stringHashCache[string];if(hash==null){hash=hashString(string);if(STRING_HASH_CACHE_SIZE===STRING_HASH_CACHE_MAX_SIZE){STRING_HASH_CACHE_SIZE=0;stringHashCache={}}STRING_HASH_CACHE_SIZE++;stringHashCache[string]=hash}return hash}function hashString(string){var hash=0;for(var ii=0;ii<string.length;ii++){hash=31*hash+string.charCodeAt(ii)&HASH_MAX_VAL}return hash}function hashJSObj(obj){var hash=obj[UID_HASH_KEY];if(hash)return hash;if(!canDefineProperty){hash=obj.propertyIsEnumerable&&obj.propertyIsEnumerable[UID_HASH_KEY];if(hash)return hash;hash=getIENodeHash(obj);if(hash)return hash}if(!canDefineProperty||Object.isExtensible(obj)){hash=++objHashUID&HASH_MAX_VAL;if(canDefineProperty){Object.defineProperty(obj,UID_HASH_KEY,{enumerable:false,configurable:false,writable:false,value:hash})}else if(propertyIsEnumerable&&obj.propertyIsEnumerable===propertyIsEnumerable){obj.propertyIsEnumerable=function(){return propertyIsEnumerable.apply(this,arguments)};obj.propertyIsEnumerable[UID_HASH_KEY]=hash}else if(obj.nodeType){obj[UID_HASH_KEY]=hash}else{throw new Error("Unable to set a non-enumerable property on object.")}return hash}else{throw new Error("Non-extensible objects are not allowed as keys.")}}var propertyIsEnumerable=Object.prototype.propertyIsEnumerable;var canDefineProperty=function(){try{Object.defineProperty({},"x",{});return true}catch(e){return false}}();function getIENodeHash(node){if(node&&node.nodeType>0){switch(node.nodeType){case 1:return node.uniqueID;case 9:return node.documentElement&&node.documentElement.uniqueID}}}var HASH_MAX_VAL=2147483647;var objHashUID=0;var UID_HASH_KEY="__immutablehash__";if(typeof Symbol!=="undefined"){UID_HASH_KEY=Symbol(UID_HASH_KEY)}var STRING_HASH_CACHE_MIN_STRLEN=16;var STRING_HASH_CACHE_MAX_SIZE=255;var STRING_HASH_CACHE_SIZE=0;var stringHashCache={};var ITERATE_KEYS=0;var ITERATE_VALUES=1;var ITERATE_ENTRIES=2;var FAUX_ITERATOR_SYMBOL="@@iterator";var ITERATOR_SYMBOL=typeof Symbol!=="undefined"?Symbol.iterator:FAUX_ITERATOR_SYMBOL;var Iterator=function Iterator(next){this.next=next};$traceurRuntime.createClass(Iterator,{toString:function(){return"[Iterator]"}},{});var IteratorPrototype=Iterator.prototype;IteratorPrototype.inspect=IteratorPrototype.toSource=function(){return this.toString()};IteratorPrototype[ITERATOR_SYMBOL]=function(){return this};function iteratorValue(type,k,v,iteratorResult){var value=type===0?k:type===1?v:[k,v];iteratorResult?iteratorResult.value=value:iteratorResult={value:value,done:false};return iteratorResult}function iteratorDone(){return{value:undefined,done:true}}function isIterable(maybeIterable){return!!_iteratorFn(maybeIterable)}function isIterator(maybeIterator){return maybeIterator&&typeof maybeIterator.next==="function"}function getIterator(iterable){var iteratorFn=_iteratorFn(iterable);if(typeof iteratorFn==="function"){return iteratorFn.call(iterable)}}function _iteratorFn(iterable){return iterable&&(iterable[ITERATOR_SYMBOL]||iterable[FAUX_ITERATOR_SYMBOL])}var Sequence=function Sequence(value){return $Sequence.from(arguments.length===1?value:Array.prototype.slice.call(arguments))};var $Sequence=Sequence;$traceurRuntime.createClass(Sequence,{toArray:function(){assertNotInfinite(this.length);var array=new Array(this.length||0);this.valueSeq().__iterate(function(v,i){array[i]=v});return array},toJS:function(){return this.map(function(value){return value instanceof $Sequence?value.toJS():value}).__toJS()},toMap:function(){assertNotInfinite(this.length);return Map.from(this)},toObject:function(){assertNotInfinite(this.length);var object={};this.__iterate(function(v,k){object[k]=v});return object},toOrderedMap:function(){assertNotInfinite(this.length);return OrderedMap.from(this)},toSet:function(){assertNotInfinite(this.length);return Set.from(this)},toVector:function(){assertNotInfinite(this.length);return Vector.from(this)},toString:function(){return this.__toString("Seq {","}")},__toString:function(head,tail){if(this.length===0){return head+tail}return head+" "+this.map(this.__toStringMapper).join(", ")+" "+tail},__toStringMapper:function(v,k){return k+": "+quoteString(v)},concat:function(){for(var values=[],$__2=0;$__2<arguments.length;$__2++)values[$__2]=arguments[$__2];return concatFactory(this,values,true)},contains:function(searchValue){return this.find(function(value){return is(value,searchValue)},null,NOT_SET)!==NOT_SET},entries:function(){return this.__iterator(ITERATE_ENTRIES)},every:function(predicate,context){var returnValue=true;this.__iterate(function(v,k,c){if(!predicate.call(context,v,k,c)){returnValue=false;return false}});return returnValue},filter:function(predicate,context){return filterFactory(this,predicate,context,true)},find:function(predicate,context,notSetValue){var foundValue=notSetValue;this.__iterate(function(v,k,c){if(predicate.call(context,v,k,c)){foundValue=v;return false}});return foundValue},forEach:function(sideEffect,context){return this.__iterate(context?sideEffect.bind(context):sideEffect)},join:function(separator){separator=separator!==undefined?""+separator:",";var joined="";var isFirst=true;this.__iterate(function(v){isFirst?isFirst=false:joined+=separator;joined+=v!=null?v:""});return joined},keys:function(){return this.__iterator(ITERATE_KEYS)},map:function(mapper,context){return mapFactory(this,mapper,context)},reduce:function(reducer,initialReduction,context){var reduction;var useFirst;if(arguments.length<2){useFirst=true}else{reduction=initialReduction}this.__iterate(function(v,k,c){if(useFirst){useFirst=false;reduction=v}else{reduction=reducer.call(context,reduction,v,k,c)}});return reduction},reduceRight:function(reducer,initialReduction,context){var reversed=this.toKeyedSeq().reverse();return reversed.reduce.apply(reversed,arguments)},reverse:function(){return reverseFactory(this)},slice:function(begin,end){if(wholeSlice(begin,end,this.length)){return this}var resolvedBegin=resolveBegin(begin,this.length);var resolvedEnd=resolveEnd(end,this.length);if(resolvedBegin!==resolvedBegin||resolvedEnd!==resolvedEnd){return this.cacheResult().slice(begin,end)}var skipped=resolvedBegin===0?this:this.skip(resolvedBegin);return resolvedEnd==null||resolvedEnd===this.length?skipped:skipped.take(resolvedEnd-resolvedBegin)},some:function(predicate,context){return!this.every(not(predicate),context)},sort:function(comparator){return this.sortBy(valueMapper,comparator)},values:function(){return this.__iterator(ITERATE_VALUES)},butLast:function(){return this.slice(0,-1)},count:function(predicate,context){if(!predicate){if(this.length==null){this.length=this.__iterate(returnTrue)}return this.length}return this.filter(predicate,context).count()},countBy:function(grouper,context){var $__0=this;var groupMap={};var groups=[];this.__iterate(function(v,k){var g=grouper.call(context,v,k,$__0);var h=hash(g);if(!groupMap.hasOwnProperty(h)){groupMap[h]=groups.length;groups.push([g,1])}else{groups[groupMap[h]][1]++}});return $Sequence(groups).fromEntrySeq()},equals:function(other){if(this===other){return true}if(!(other instanceof $Sequence)){return false}if(this.length!=null&&other.length!=null){if(this.length!==other.length){return false}if(this.length===0&&other.length===0){return true}}if(this.__hash!=null&&other.__hash!=null&&this.__hash!==other.__hash){return false}return this.__deepEquals(other)},__deepEquals:function(other){var entries=this.entries();return other.every(function(v,k){var entry=entries.next().value;return entry&&is(entry[0],k)&&is(entry[1],v)})&&entries.next().done},entrySeq:function(){var sequence=this;if(sequence._cache){return $Sequence(sequence._cache)}var entriesSequence=sequence.toKeyedSeq().map(entryMapper).valueSeq();entriesSequence.fromEntries=function(){return sequence};return entriesSequence},findKey:function(predicate,context){var foundKey;this.__iterate(function(v,k,c){if(predicate.call(context,v,k,c)){foundKey=k;return false}});return foundKey},findLast:function(predicate,context,notSetValue){return this.toKeyedSeq().reverse().find(predicate,context,notSetValue)},findLastKey:function(predicate,context){return this.toKeyedSeq().reverse().findKey(predicate,context)},first:function(){return this.find(returnTrue)},flatMap:function(mapper,context){return this.map(mapper,context).flatten()},flatten:function(){return flattenFactory(this,true)},flip:function(){return flipFactory(this)},get:function(searchKey,notSetValue){return this.find(function(_,key){return is(key,searchKey)},null,notSetValue)},getIn:function(searchKeyPath,notSetValue){var nested=this;if(searchKeyPath){for(var ii=0;ii<searchKeyPath.length;ii++){nested=nested&&nested.get?nested.get(searchKeyPath[ii],NOT_SET):NOT_SET;if(nested===NOT_SET){return notSetValue}}}return nested},groupBy:function(grouper,context){return groupByFactory(this,grouper,context,true)},has:function(searchKey){return this.get(searchKey,NOT_SET)!==NOT_SET},keySeq:function(){return this.flip().valueSeq()},last:function(){return this.findLast(returnTrue)},mapEntries:function(mapper,context){var $__0=this;return this.entrySeq().map(function(entry,index){return mapper.call(context,entry,index,$__0)}).fromEntrySeq()},mapKeys:function(mapper,context){var $__0=this;return this.flip().map(function(k,v){return mapper.call(context,k,v,$__0)}).flip()},rest:function(){return this.slice(1)},skip:function(amount){return skipFactory(this,amount,true)},skipLast:function(amount){return this.reverse().skip(amount).reverse()},skipWhile:function(predicate,context){return skipWhileFactory(this,predicate,context,true)},skipUntil:function(predicate,context){return this.skipWhile(not(predicate),context)},sortBy:function(mapper,comparator){comparator=comparator||defaultComparator;var seq=this;return $Sequence(this.entrySeq().entrySeq().toArray().sort(function(a,b){return comparator(mapper(a[1][1],a[1][0],seq),mapper(b[1][1],b[1][0],seq))||a[0]-b[0]})).fromEntrySeq().valueSeq().fromEntrySeq()},take:function(amount){return takeFactory(this,amount)},takeLast:function(amount){return this.reverse().take(amount).reverse()},takeWhile:function(predicate,context){return takeWhileFactory(this,predicate,context)},takeUntil:function(predicate,context){return this.takeWhile(not(predicate),context)},toKeyedSeq:function(){return this},valueSeq:function(){return new ValuesSequence(this)},cacheResult:function(){if(!this._cache&&this.__iterateUncached){assertNotInfinite(this.length);this._cache=this.entrySeq().toArray();if(this.length==null){this.length=this._cache.length}}return this},hashCode:function(){return this.__hash||(this.__hash=this.length===Infinity?0:this.reduce(function(h,v,k){return h+(hash(v)^(v===k?0:hash(k)))&HASH_MAX_VAL},0))},__makeSequence:function(){return Object.create(SequencePrototype)},__iterate:function(fn,reverse){return iterate(this,fn,reverse,true)},__iterator:function(type,reverse){return iterator(this,type,reverse,true)}},{from:function(value){if(value instanceof $Sequence){return value}if(!Array.isArray(value)){if(isIterator(value)){return new IteratorSequence(value)}if(isIterable(value)){return new IterableSequence(value)}if(value&&value.constructor===Object){return new ObjectSequence(value)}value=[value]}return new ArraySequence(value)}});var SequencePrototype=Sequence.prototype;SequencePrototype[ITERATOR_SYMBOL]=SequencePrototype.entries;SequencePrototype.toJSON=SequencePrototype.toJS;SequencePrototype.__toJS=SequencePrototype.toObject;SequencePrototype.inspect=SequencePrototype.toSource=function(){return this.toString()};SequencePrototype.chain=SequencePrototype.flatMap;var IndexedSequence=function IndexedSequence(){$traceurRuntime.defaultSuperCall(this,$IndexedSequence.prototype,arguments)};var $IndexedSequence=IndexedSequence;$traceurRuntime.createClass(IndexedSequence,{toString:function(){return this.__toString("Seq [","]")},concat:function(){for(var values=[],$__3=0;$__3<arguments.length;$__3++)values[$__3]=arguments[$__3];return concatFactory(this,values,false)
},filter:function(predicate,context){return filterFactory(this,predicate,context,false)},findIndex:function(predicate,context){var key=this.findKey(predicate,context);return key==null?-1:key},indexOf:function(searchValue){return this.findIndex(function(value){return is(value,searchValue)})},lastIndexOf:function(searchValue){return this.toKeyedSeq().reverse().indexOf(searchValue)},splice:function(index,removeNum){var numArgs=arguments.length;removeNum=Math.max(removeNum|0,0);if(numArgs===0||numArgs===2&&!removeNum){return this}index=resolveBegin(index,this.length);var spliced=this.slice(0,index);return numArgs===1?spliced:spliced.concat(arrCopy(arguments,2),this.slice(index+removeNum))},findLastIndex:function(predicate,context){return this.toKeyedSeq().reverse().findIndex(predicate,context)},first:function(){return this.get(0)},flatten:function(){return flattenFactory(this,false)},flip:function(){return flipFactory(this.toKeyedSeq())},fromEntrySeq:function(){return new FromEntriesSequence(this)},get:function(index,notSetValue){index=wrapIndex(this,index);return index<0||(this.length===Infinity||this.length!=null&&index>this.length)?notSetValue:this.find(function(_,key){return key===index},null,notSetValue)},groupBy:function(grouper,context){return groupByFactory(this,grouper,context,false)},has:function(index){index=wrapIndex(this,index);return index>=0&&(this.length!=null?this.length===Infinity||index<this.length:this.indexOf(index)!==-1)},interpose:function(separator){return interposeFactory(this,separator)},last:function(){return this.get(this.length?this.length-1:0)},skip:function(amount){var $__0=this;var skipSeq=skipFactory(this,amount,false);if(skipSeq!==this){skipSeq.get=function(index,notSetValue){return $__0.get(index-amount,notSetValue)}}return skipSeq},skipWhile:function(predicate,context){return skipWhileFactory(this,predicate,context,false)},sortBy:function(mapper,comparator){comparator=comparator||defaultComparator;var seq=this;return Sequence(this.entrySeq().toArray().sort(function(a,b){return comparator(mapper(a[1],a[0],seq),mapper(b[1],b[0],seq))||a[0]-b[0]})).fromEntrySeq().valueSeq()},take:function(amount){var $__0=this;var takeSeq=takeFactory(this,amount);if(takeSeq!==this){takeSeq.get=function(index,notSetValue){return index<amount?$__0.get(index,notSetValue):notSetValue}}return takeSeq},toKeyedSeq:function(){return new KeyedIndexedSequence(this)},valueSeq:function(){return this},__makeSequence:function(){return Object.create(IndexedSequencePrototype)},__iterate:function(fn,reverse){return iterate(this,fn,reverse,false)},__iterator:function(type,reverse){return iterator(this,type,reverse,false)}},{},Sequence);var IndexedSequencePrototype=IndexedSequence.prototype;IndexedSequencePrototype[ITERATOR_SYMBOL]=IndexedSequencePrototype.values;IndexedSequencePrototype.__toJS=IndexedSequencePrototype.toArray;IndexedSequencePrototype.__toStringMapper=quoteString;var IteratorSequence=function IteratorSequence(iterator){this._iterator=iterator;this._iteratorCache=[]};$traceurRuntime.createClass(IteratorSequence,{__iterateUncached:function(fn,reverse){if(reverse){return this.cacheResult().__iterate(fn,reverse)}var iterator=this._iterator;var cache=this._iteratorCache;var iterations=0;while(iterations<cache.length){if(fn(cache[iterations],iterations++,this)===false){return iterations}}var step;while(!(step=iterator.next()).done){var val=step.value;cache[iterations]=val;if(fn(val,iterations++,this)===false){break}}return iterations},__iteratorUncached:function(type,reverse){if(reverse){return this.cacheResult().__iterator(type,reverse)}var iterator=this._iterator;var cache=this._iteratorCache;var iterations=0;return new Iterator(function(){if(iterations>=cache.length){var step=iterator.next();if(step.done){return step}cache[iterations]=step.value}return iteratorValue(type,iterations,cache[iterations++])})}},{},IndexedSequence);var IterableSequence=function IterableSequence(iterable){this._iterable=iterable;this.length=iterable.length||iterable.size};$traceurRuntime.createClass(IterableSequence,{__iterateUncached:function(fn,reverse){if(reverse){return this.cacheResult().__iterate(fn,reverse)}var iterable=this._iterable;var iterator=getIterator(iterable);var iterations=0;if(isIterator(iterator)){var step;while(!(step=iterator.next()).done){if(fn(step.value,iterations++,this)===false){break}}}return iterations},__iteratorUncached:function(type,reverse){if(reverse){return this.cacheResult().__iterator(type,reverse)}var iterable=this._iterable;var iterator=getIterator(iterable);if(!isIterator(iterator)){return new Iterator(function(){return iteratorDone()})}var iterations=0;return new Iterator(function(){var step=iterator.next();return step.done?step:iteratorValue(type,iterations++,step.value)})}},{},IndexedSequence);var ObjectSequence=function ObjectSequence(object){var keys=Object.keys(object);this._object=object;this._keys=keys;this.length=keys.length};$traceurRuntime.createClass(ObjectSequence,{toObject:function(){return this._object},get:function(key,notSetValue){if(notSetValue!==undefined&&!this.has(key)){return notSetValue}return this._object[key]},has:function(key){return this._object.hasOwnProperty(key)},__iterate:function(fn,reverse){var object=this._object;var keys=this._keys;var maxIndex=keys.length-1;for(var ii=0;ii<=maxIndex;ii++){var key=keys[reverse?maxIndex-ii:ii];if(fn(object[key],key,this)===false){return ii+1}}return ii},__iterator:function(type,reverse){var object=this._object;var keys=this._keys;var maxIndex=keys.length-1;var ii=0;return new Iterator(function(){var key=keys[reverse?maxIndex-ii:ii];return ii++>maxIndex?iteratorDone():iteratorValue(type,key,object[key])})}},{},Sequence);var ArraySequence=function ArraySequence(array){this._array=array;this.length=array.length};$traceurRuntime.createClass(ArraySequence,{toArray:function(){return this._array},get:function(index,notSetValue){return this.has(index)?this._array[wrapIndex(this,index)]:notSetValue},__iterate:function(fn,reverse){var array=this._array;var maxIndex=array.length-1;for(var ii=0;ii<=maxIndex;ii++){if(fn(array[reverse?maxIndex-ii:ii],ii,this)===false){return ii+1}}return ii},__iterator:function(type,reverse){var array=this._array;var maxIndex=array.length-1;var ii=0;return new Iterator(function(){return ii>maxIndex?iteratorDone():iteratorValue(type,ii,array[reverse?maxIndex-ii++:ii++])})}},{},IndexedSequence);function ensureLength(indexedSeq){if(indexedSeq.length==null){indexedSeq.cacheResult()}invariant(indexedSeq.length<Infinity,"Cannot reverse infinite range.");return indexedSeq.length}function wholeSlice(begin,end,length){return(begin===0||length!=null&&begin<=-length)&&(end==null||length!=null&&end>=length)}function resolveBegin(begin,length){return resolveIndex(begin,length,0)}function resolveEnd(end,length){return resolveIndex(end,length,length)}function resolveIndex(index,length,defaultIndex){return index==null?defaultIndex:index<0?Math.max(0,length+index):length?Math.min(length,index):index}function valueMapper(v){return v}function entryMapper(v,k){return[k,v]}function returnTrue(){return true}function not(predicate){return function(){return!predicate.apply(this,arguments)}}function quoteString(value){return typeof value==="string"?JSON.stringify(value):value}function defaultComparator(a,b){return a>b?1:a<b?-1:0}function wrapIndex(seq,index){if(index<0){if(seq.length==null){seq.cacheResult()}return seq.length+index}return index}function assertNotInfinite(length){invariant(length!==Infinity,"Cannot perform this action with an infinite sequence.")}function iterate(sequence,fn,reverse,useKeys){var cache=sequence._cache;if(cache){var maxIndex=cache.length-1;for(var ii=0;ii<=maxIndex;ii++){var entry=cache[reverse?maxIndex-ii:ii];if(fn(entry[1],useKeys?entry[0]:ii,sequence)===false){return ii+1}}return ii}return sequence.__iterateUncached(fn,reverse)}function iterator(sequence,type,reverse,useKeys){var cache=sequence._cache;if(cache){var maxIndex=cache.length-1;var ii=0;return new Iterator(function(){var entry=cache[reverse?maxIndex-ii:ii];return ii++>maxIndex?iteratorDone():iteratorValue(type,useKeys?entry[0]:ii-1,entry[1])})}return sequence.__iteratorUncached(type,reverse)}var ValuesSequence=function ValuesSequence(seq){this._seq=seq;this.length=seq.length};$traceurRuntime.createClass(ValuesSequence,{get:function(key,notSetValue){return this._seq.get(key,notSetValue)},has:function(key){return this._seq.has(key)},cacheResult:function(){this._seq.cacheResult();this.length=this._seq.length;return this},__iterate:function(fn,reverse){var $__0=this;var iterations=0;return this._seq.__iterate(function(v){return fn(v,iterations++,$__0)},reverse)},__iterator:function(type,reverse){var iterator=this._seq.__iterator(ITERATE_VALUES,reverse);var iterations=0;return new Iterator(function(){var step=iterator.next();return step.done?step:iteratorValue(type,iterations++,step.value,step)})}},{},IndexedSequence);var KeyedIndexedSequence=function KeyedIndexedSequence(indexedSeq){this._seq=indexedSeq;this.length=indexedSeq.length};$traceurRuntime.createClass(KeyedIndexedSequence,{get:function(key,notSetValue){return this._seq.get(key,notSetValue)},has:function(key){return this._seq.has(key)},valueSeq:function(){return this._seq},reverse:function(){var $__0=this;var reversedSequence=reverseFactory(this);reversedSequence.valueSeq=function(){return $__0._seq.reverse()};return reversedSequence},map:function(mapper,context){var $__0=this;var mappedSequence=mapFactory(this,mapper,context);mappedSequence.valueSeq=function(){return $__0._seq.map(mapper,context)};return mappedSequence},cacheResult:function(){this._seq.cacheResult();this.length=this._seq.length;return this},__iterate:function(fn,reverse){var $__0=this;var ii=reverse?ensureLength(this):0;return this._seq.__iterate(function(v){return fn(v,reverse?--ii:ii++,$__0)},reverse)},__iterator:function(type,reverse){var iterator=this._seq.__iterator(ITERATE_VALUES,reverse);var ii=reverse?ensureLength(this):0;return new Iterator(function(){var step=iterator.next();return step.done?step:iteratorValue(type,reverse?--ii:ii++,step.value,step)})}},{},Sequence);var FromEntriesSequence=function FromEntriesSequence(entriesSeq){this._seq=entriesSeq;this.length=entriesSeq.length};$traceurRuntime.createClass(FromEntriesSequence,{entrySeq:function(){return this._seq},cacheResult:function(){this._seq.cacheResult();this.length=this._seq.length;return this},__iterate:function(fn,reverse){var $__0=this;return this._seq.__iterate(function(entry){return entry&&fn(entry[1],entry[0],$__0)},reverse)},__iterator:function(type,reverse){var iterator=this._seq.__iterator(ITERATE_VALUES,reverse);return new Iterator(function(){while(true){var step=iterator.next();if(step.done){return step}var entry=step.value;if(entry){return type===ITERATE_ENTRIES?step:iteratorValue(type,entry[0],entry[1],step)}}})}},{},Sequence);function flipFactory(sequence){var flipSequence=sequence.__makeSequence();flipSequence.length=sequence.length;flipSequence.flip=function(){return sequence};flipSequence.reverse=function(){var reversedSequence=sequence.reverse.apply(this);reversedSequence.flip=function(){return sequence.reverse()};return reversedSequence};flipSequence.has=function(key){return sequence.contains(key)};flipSequence.contains=function(key){return sequence.has(key)};flipSequence.__iterateUncached=function(fn,reverse){var $__0=this;return sequence.__iterate(function(v,k){return fn(k,v,$__0)!==false},reverse)};flipSequence.__iteratorUncached=function(type,reverse){if(type===ITERATE_ENTRIES){var iterator=sequence.__iterator(type,reverse);return new Iterator(function(){var step=iterator.next();if(!step.done){var k=step.value[0];step.value[0]=step.value[1];step.value[1]=k}return step})}return sequence.__iterator(type===ITERATE_VALUES?ITERATE_KEYS:ITERATE_VALUES,reverse)};return flipSequence}function mapFactory(sequence,mapper,context){var mappedSequence=sequence.__makeSequence();mappedSequence.length=sequence.length;mappedSequence.has=function(key){return sequence.has(key)};mappedSequence.get=function(key,notSetValue){var v=sequence.get(key,NOT_SET);return v===NOT_SET?notSetValue:mapper.call(context,v,key,sequence)};mappedSequence.__iterateUncached=function(fn,reverse){var $__0=this;return sequence.__iterate(function(v,k,c){return fn(mapper.call(context,v,k,c),k,$__0)!==false},reverse)};mappedSequence.__iteratorUncached=function(type,reverse){var iterator=sequence.__iterator(ITERATE_ENTRIES,reverse);return new Iterator(function(){var step=iterator.next();if(step.done){return step}var entry=step.value;var key=entry[0];return iteratorValue(type,key,mapper.call(context,entry[1],key,sequence),step)})};return mappedSequence}function reverseFactory(sequence){var reversedSequence=sequence.__makeSequence();reversedSequence.length=sequence.length;reversedSequence.reverse=function(){return sequence};reversedSequence.flip=function(){var flipSequence=sequence.flip.apply(this);flipSequence.reverse=function(){return sequence.flip()};return flipSequence};reversedSequence.get=function(key,notSetValue){return sequence.get(key,notSetValue)};reversedSequence.has=function(key){return sequence.has(key)};reversedSequence.contains=function(value){return sequence.contains(value)};reversedSequence.cacheResult=function(){sequence.cacheResult();this.length=sequence.length;return this};reversedSequence.__iterate=function(fn,reverse){var $__0=this;return sequence.__iterate(function(v,k){return fn(v,k,$__0)},!reverse)};reversedSequence.__iterator=function(type,reverse){return sequence.__iterator(type,!reverse)};return reversedSequence}function filterFactory(sequence,predicate,context,useKeys){var filterSequence=sequence.__makeSequence();filterSequence.has=function(key){var v=sequence.get(key,NOT_SET);return v!==NOT_SET&&!!predicate.call(context,v,key,sequence)};filterSequence.get=function(key,notSetValue){var v=sequence.get(key,NOT_SET);return v!==NOT_SET&&predicate.call(context,v,key,sequence)?v:notSetValue};filterSequence.__iterateUncached=function(fn,reverse){var $__0=this;var iterations=0;sequence.__iterate(function(v,k,c){if(predicate.call(context,v,k,c)){iterations++;return fn(v,useKeys?k:iterations-1,$__0)}},reverse);return iterations};filterSequence.__iteratorUncached=function(type,reverse){var iterator=sequence.__iterator(ITERATE_ENTRIES,reverse);var iterations=0;return new Iterator(function(){while(true){var step=iterator.next();if(step.done){return step}var entry=step.value;var key=entry[0];var value=entry[1];if(predicate.call(context,value,key,sequence)){return iteratorValue(type,useKeys?key:iterations++,value,step)}}})};return filterSequence}function groupByFactory(seq,grouper,context,useKeys){var groupMap={};var groups=[];seq.__iterate(function(v,k){var g=grouper.call(context,v,k,seq);var h=hash(g);var e=useKeys?[k,v]:v;if(!groupMap.hasOwnProperty(h)){groupMap[h]=groups.length;groups.push([g,[e]])}else{groups[groupMap[h]][1].push(e)}});return Sequence(groups).fromEntrySeq().map(useKeys?function(group){return Sequence(group).fromEntrySeq()}:function(group){return Sequence(group)})}function takeFactory(sequence,amount){if(amount>sequence.length){return sequence}if(amount<0){amount=0}var takeSequence=sequence.__makeSequence();takeSequence.length=sequence.length&&Math.min(sequence.length,amount);takeSequence.__iterateUncached=function(fn,reverse){var $__0=this;if(amount===0){return 0}if(reverse){return this.cacheResult().__iterate(fn,reverse)}var iterations=0;sequence.__iterate(function(v,k){return++iterations&&fn(v,k,$__0)!==false&&iterations<amount});return iterations};takeSequence.__iteratorUncached=function(type,reverse){if(reverse){return this.cacheResult().__iterator(type,reverse)}var iterator=amount&&sequence.__iterator(type,reverse);var iterations=0;return new Iterator(function(){if(iterations++>amount){return iteratorDone()}return iterator.next()})};return takeSequence}function takeWhileFactory(sequence,predicate,context){var takeSequence=sequence.__makeSequence();takeSequence.__iterateUncached=function(fn,reverse){var $__0=this;if(reverse){return this.cacheResult().__iterate(fn,reverse)}var iterations=0;sequence.__iterate(function(v,k,c){return predicate.call(context,v,k,c)&&++iterations&&fn(v,k,$__0)});return iterations};takeSequence.__iteratorUncached=function(type,reverse){var $__0=this;if(reverse){return this.cacheResult().__iterator(type,reverse)}var iterator=sequence.__iterator(ITERATE_ENTRIES,reverse);var iterating=true;return new Iterator(function(){if(!iterating){return iteratorDone()}var step=iterator.next();if(step.done){return step}var entry=step.value;var k=entry[0];var v=entry[1];if(!predicate.call(context,v,k,$__0)){iterating=false;return iteratorDone()}return type===ITERATE_ENTRIES?step:iteratorValue(type,k,v,step)})};return takeSequence}function skipFactory(sequence,amount,useKeys){if(amount<=0){return sequence}var skipSequence=sequence.__makeSequence();skipSequence.length=sequence.length&&Math.max(0,sequence.length-amount);skipSequence.__iterateUncached=function(fn,reverse){var $__0=this;if(reverse){return this.cacheResult().__iterate(fn,reverse)}var skipped=0;var isSkipping=true;var iterations=0;sequence.__iterate(function(v,k){if(!(isSkipping&&(isSkipping=skipped++<amount))){iterations++;return fn(v,useKeys?k:iterations-1,$__0)}});return iterations};skipSequence.__iteratorUncached=function(type,reverse){if(reverse){return this.cacheResult().__iterator(type,reverse)}var iterator=amount&&sequence.__iterator(type,reverse);var skipped=0;var iterations=0;return new Iterator(function(){while(skipped<amount){skipped++;iterator.next()}var step=iterator.next();if(useKeys||type===ITERATE_VALUES){return step}else if(type===ITERATE_KEYS){return iteratorValue(type,iterations++,null,step)}else{return iteratorValue(type,iterations++,step.value[1],step)}})};return skipSequence}function skipWhileFactory(sequence,predicate,context,useKeys){var skipSequence=sequence.__makeSequence();skipSequence.__iterateUncached=function(fn,reverse){var $__0=this;if(reverse){return this.cacheResult().__iterate(fn,reverse)}var isSkipping=true;var iterations=0;sequence.__iterate(function(v,k,c){if(!(isSkipping&&(isSkipping=predicate.call(context,v,k,c)))){iterations++;return fn(v,useKeys?k:iterations-1,$__0)}});return iterations};skipSequence.__iteratorUncached=function(type,reverse){var $__0=this;if(reverse){return this.cacheResult().__iterator(type,reverse)}var iterator=sequence.__iterator(ITERATE_ENTRIES,reverse);var skipping=true;var iterations=0;return new Iterator(function(){var step,k,v;do{step=iterator.next();if(step.done){if(useKeys||type===ITERATE_VALUES){return step}else if(type===ITERATE_KEYS){return iteratorValue(type,iterations++,null,step)}else{return iteratorValue(type,iterations++,step.value[1],step)}}var entry=step.value;k=entry[0];v=entry[1];skipping&&(skipping=predicate.call(context,v,k,$__0))}while(skipping);return type===ITERATE_ENTRIES?step:iteratorValue(type,k,v,step)})};return skipSequence}function concatFactory(sequence,values,useKeys){var sequences=[sequence].concat(values);var concatSequence=Sequence(sequences);if(useKeys){concatSequence=concatSequence.toKeyedSeq()}concatSequence=concatSequence.flatten();concatSequence.length=sequences.reduce(function(sum,seq){if(sum!==undefined){var len=Sequence(seq).length;if(len!=null){return sum+len}}},0);return concatSequence}function flattenFactory(sequence,useKeys){var flatSequence=sequence.__makeSequence();flatSequence.__iterateUncached=function(fn,reverse){var $__0=this;var iterations=0;sequence.__iterate(function(seq){var stopped=false;Sequence(seq).__iterate(function(v,k){if(fn(v,useKeys?k:iterations++,$__0)===false){stopped=true;return false}},reverse);return!stopped},reverse);return iterations};flatSequence.__iteratorUncached=function(type,reverse){var sequenceIterator=sequence.__iterator(ITERATE_VALUES,reverse);var iterator;var iterations=0;return new Iterator(function(){while(true){if(iterator){var step=iterator.next();if(!step.done){if(useKeys||type===ITERATE_VALUES){return step}else if(type===ITERATE_KEYS){return iteratorValue(type,iterations++,null,step)}else{return iteratorValue(type,iterations++,step.value[1],step)}}}var sequenceStep=sequenceIterator.next();if(sequenceStep.done){return sequenceStep}iterator=Sequence(sequenceStep.value).__iterator(type,reverse)}})};return flatSequence}function interposeFactory(sequence,separator){var interposedSequence=sequence.__makeSequence();interposedSequence.length=sequence.length&&sequence.length*2-1;interposedSequence.__iterateUncached=function(fn,reverse){var $__0=this;var iterations=0;sequence.__iterate(function(v,k){return(!iterations||fn(separator,iterations++,$__0)!==false)&&fn(v,iterations++,$__0)!==false},reverse);return iterations};interposedSequence.__iteratorUncached=function(type,reverse){var iterator=sequence.__iterator(ITERATE_VALUES,reverse);var iterations=0;var step;return new Iterator(function(){if(!step||iterations%2){step=iterator.next();if(step.done){return step}}return iterations%2?iteratorValue(type,iterations++,separator):iteratorValue(type,iterations++,step.value,step)})};return interposedSequence}var Cursor=function Cursor(rootData,keyPath,onChange,value){value=value?value:rootData.getIn(keyPath);this.length=value instanceof Sequence?value.length:null;this._rootData=rootData;this._keyPath=keyPath;this._onChange=onChange};$traceurRuntime.createClass(Cursor,{deref:function(notSetValue){return this._rootData.getIn(this._keyPath,notSetValue)},get:function(key,notSetValue){if(Array.isArray(key)&&key.length===0){return this}var value=this._rootData.getIn(this._keyPath.concat(key),NOT_SET);return value===NOT_SET?notSetValue:wrappedValue(this,key,value)},set:function(key,value){return updateCursor(this,function(m){return m.set(key,value)},key)},remove:function(key){return updateCursor(this,function(m){return m.remove(key)},key)},clear:function(){return updateCursor(this,function(m){return m.clear()})},update:function(keyOrFn,notSetValue,updater){return arguments.length===1?updateCursor(this,keyOrFn):updateCursor(this,function(map){return map.update(keyOrFn,notSetValue,updater)},keyOrFn)},withMutations:function(fn){return updateCursor(this,function(m){return(m||Map.empty()).withMutations(fn)})},cursor:function(subKey){return Array.isArray(subKey)&&subKey.length===0?this:subCursor(this,subKey)},__iterate:function(fn,reverse){var $__0=this;var deref=this.deref();return deref&&deref.__iterate?deref.__iterate(function(v,k){return fn(wrappedValue($__0,k,v),k,$__0)},reverse):0},__iterator:function(type,reverse){var $__0=this;var deref=this.deref();var iterator=deref&&deref.__iterator&&deref.__iterator(ITERATE_ENTRIES,reverse);return new Iterator(function(){if(!iterator){return iteratorDone()}var step=iterator.next();if(step.done){return step}var entry=step.value;var k=entry[0];var v=entry[1];return iteratorValue(type,k,wrappedValue($__0,k,v),step)})}},{},Sequence);Cursor.prototype[DELETE]=Cursor.prototype.remove;Cursor.prototype.getIn=Cursor.prototype.get;function wrappedValue(cursor,key,value){return value instanceof Sequence?subCursor(cursor,key,value):value}function subCursor(cursor,key,value){return new Cursor(cursor._rootData,cursor._keyPath.concat(key),cursor._onChange,value)}function updateCursor(cursor,changeFn,changeKey){var newRootData=cursor._rootData.updateIn(cursor._keyPath,changeKey?Map.empty():undefined,changeFn);var keyPath=cursor._keyPath||[];cursor._onChange&&cursor._onChange.call(undefined,newRootData,cursor._rootData,changeKey?keyPath.concat(changeKey):keyPath);return new Cursor(newRootData,cursor._keyPath,cursor._onChange)}function is(first,second){if(first instanceof Cursor){first=first.deref()}if(second instanceof Cursor){second=second.deref()}if(first===second){return first!==0||second!==0||1/first===1/second}if(first!==first){return second!==second}if(first instanceof Sequence){return first.equals(second)}return false}var Map=function Map(sequence){var map=$Map.empty();return sequence?sequence.constructor===$Map?sequence:map.merge(sequence):map};var $Map=Map;$traceurRuntime.createClass(Map,{toString:function(){return this.__toString("Map {","}")},get:function(k,notSetValue){return this._root?this._root.get(0,hash(k),k,notSetValue):notSetValue},set:function(k,v){return updateMap(this,k,v)},remove:function(k){return updateMap(this,k,NOT_SET)},update:function(k,notSetValue,updater){return arguments.length===1?this.updateIn([],null,k):this.updateIn([k],notSetValue,updater)},updateIn:function(keyPath,notSetValue,updater){var $__13;if(!updater){$__13=[notSetValue,updater],updater=$__13[0],notSetValue=$__13[1],$__13}return updateInDeepMap(this,keyPath,notSetValue,updater,0)},clear:function(){if(this.length===0){return this}if(this.__ownerID){this.length=0;this._root=null;this.__hash=undefined;this.__altered=true;return this}return $Map.empty()},merge:function(){return mergeIntoMapWith(this,null,arguments)},mergeWith:function(merger){for(var seqs=[],$__4=1;$__4<arguments.length;$__4++)seqs[$__4-1]=arguments[$__4];return mergeIntoMapWith(this,merger,seqs)},mergeDeep:function(){return mergeIntoMapWith(this,deepMerger(null),arguments)},mergeDeepWith:function(merger){for(var seqs=[],$__5=1;$__5<arguments.length;$__5++)seqs[$__5-1]=arguments[$__5];return mergeIntoMapWith(this,deepMerger(merger),seqs)},cursor:function(keyPath,onChange){if(!onChange&&typeof keyPath==="function"){onChange=keyPath;keyPath=[]}else if(arguments.length===0){keyPath=[]}else if(!Array.isArray(keyPath)){keyPath=[keyPath]}return new Cursor(this,keyPath,onChange)},withMutations:function(fn){var mutable=this.asMutable();fn(mutable);return mutable.wasAltered()?mutable.__ensureOwner(this.__ownerID):this},asMutable:function(){return this.__ownerID?this:this.__ensureOwner(new OwnerID)},asImmutable:function(){return this.__ensureOwner()},wasAltered:function(){return this.__altered},__iterator:function(type,reverse){return new MapIterator(this,type,reverse)},__iterate:function(fn,reverse){var $__0=this;var iterations=0;this._root&&this._root.iterate(function(entry){iterations++;return fn(entry[1],entry[0],$__0)},reverse);return iterations},__ensureOwner:function(ownerID){if(ownerID===this.__ownerID){return this}if(!ownerID){this.__ownerID=ownerID;this.__altered=false;return this}return makeMap(this.length,this._root,ownerID,this.__hash)}},{empty:function(){return EMPTY_MAP||(EMPTY_MAP=makeMap(0))}},Sequence);var MapPrototype=Map.prototype;MapPrototype[DELETE]=MapPrototype.remove;Map.from=Map;var BitmapIndexedNode=function BitmapIndexedNode(ownerID,bitmap,nodes){this.ownerID=ownerID;this.bitmap=bitmap;this.nodes=nodes};var $BitmapIndexedNode=BitmapIndexedNode;$traceurRuntime.createClass(BitmapIndexedNode,{get:function(shift,hash,key,notSetValue){var bit=1<<((shift===0?hash:hash>>>shift)&MASK);var bitmap=this.bitmap;return(bitmap&bit)===0?notSetValue:this.nodes[popCount(bitmap&bit-1)].get(shift+SHIFT,hash,key,notSetValue)},update:function(ownerID,shift,hash,key,value,didChangeLength,didAlter){var hashFrag=(shift===0?hash:hash>>>shift)&MASK;var bit=1<<hashFrag;var bitmap=this.bitmap;var exists=(bitmap&bit)!==0;if(!exists&&value===NOT_SET){return this}var idx=popCount(bitmap&bit-1);var nodes=this.nodes;var node=exists?nodes[idx]:null;var newNode=updateNode(node,ownerID,shift+SHIFT,hash,key,value,didChangeLength,didAlter);if(newNode===node){return this}if(!exists&&newNode&&nodes.length>=MAX_BITMAP_SIZE){return expandNodes(ownerID,nodes,bitmap,hashFrag,newNode)}if(exists&&!newNode&&nodes.length===2&&isLeafNode(nodes[idx^1])){return nodes[idx^1]}if(exists&&newNode&&nodes.length===1&&isLeafNode(newNode)){return newNode}var isEditable=ownerID&&ownerID===this.ownerID;var newBitmap=exists?newNode?bitmap:bitmap^bit:bitmap|bit;var newNodes=exists?newNode?setIn(nodes,idx,newNode,isEditable):spliceOut(nodes,idx,isEditable):spliceIn(nodes,idx,newNode,isEditable);if(isEditable){this.bitmap=newBitmap;this.nodes=newNodes;return this}return new $BitmapIndexedNode(ownerID,newBitmap,newNodes)},iterate:function(fn,reverse){var nodes=this.nodes;for(var ii=0,maxIndex=nodes.length-1;ii<=maxIndex;ii++){if(nodes[reverse?maxIndex-ii:ii].iterate(fn,reverse)===false){return false}}}},{});var ArrayNode=function ArrayNode(ownerID,count,nodes){this.ownerID=ownerID;this.count=count;this.nodes=nodes};var $ArrayNode=ArrayNode;$traceurRuntime.createClass(ArrayNode,{get:function(shift,hash,key,notSetValue){var idx=(shift===0?hash:hash>>>shift)&MASK;var node=this.nodes[idx];return node?node.get(shift+SHIFT,hash,key,notSetValue):notSetValue},update:function(ownerID,shift,hash,key,value,didChangeLength,didAlter){var idx=(shift===0?hash:hash>>>shift)&MASK;var removed=value===NOT_SET;var nodes=this.nodes;var node=nodes[idx];if(removed&&!node){return this}var newNode=updateNode(node,ownerID,shift+SHIFT,hash,key,value,didChangeLength,didAlter);if(newNode===node){return this}var newCount=this.count;if(!node){newCount++}else if(!newNode){newCount--;if(newCount<MIN_ARRAY_SIZE){return packNodes(ownerID,nodes,newCount,idx)}}var isEditable=ownerID&&ownerID===this.ownerID;var newNodes=setIn(nodes,idx,newNode,isEditable);if(isEditable){this.count=newCount;this.nodes=newNodes;return this}return new $ArrayNode(ownerID,newCount,newNodes)},iterate:function(fn,reverse){var nodes=this.nodes;for(var ii=0,maxIndex=nodes.length-1;ii<=maxIndex;ii++){var node=nodes[reverse?maxIndex-ii:ii];if(node&&node.iterate(fn,reverse)===false){return false}}}},{});var HashCollisionNode=function HashCollisionNode(ownerID,hash,entries){this.ownerID=ownerID;this.hash=hash;this.entries=entries};var $HashCollisionNode=HashCollisionNode;$traceurRuntime.createClass(HashCollisionNode,{get:function(shift,hash,key,notSetValue){var entries=this.entries;for(var ii=0,len=entries.length;ii<len;ii++){if(is(key,entries[ii][0])){return entries[ii][1]}}return notSetValue},update:function(ownerID,shift,hash,key,value,didChangeLength,didAlter){var removed=value===NOT_SET;if(hash!==this.hash){if(removed){return this}SetRef(didAlter);SetRef(didChangeLength);return mergeIntoNode(this,ownerID,shift,hash,[key,value])}var entries=this.entries;var idx=0;for(var len=entries.length;idx<len;idx++){if(is(key,entries[idx][0])){break}}var exists=idx<len;if(removed&&!exists){return this}SetRef(didAlter);(removed||!exists)&&SetRef(didChangeLength);if(removed&&len===2){return new ValueNode(ownerID,this.hash,entries[idx^1])}var isEditable=ownerID&&ownerID===this.ownerID;var newEntries=isEditable?entries:arrCopy(entries);if(exists){if(removed){idx===len-1?newEntries.pop():newEntries[idx]=newEntries.pop()}else{newEntries[idx]=[key,value]}}else{newEntries.push([key,value])}if(isEditable){this.entries=newEntries;return this}return new $HashCollisionNode(ownerID,this.hash,newEntries)},iterate:function(fn,reverse){var entries=this.entries;for(var ii=0,maxIndex=entries.length-1;ii<=maxIndex;ii++){if(fn(entries[reverse?maxIndex-ii:ii])===false){return false}}}},{});var ValueNode=function ValueNode(ownerID,hash,entry){this.ownerID=ownerID;this.hash=hash;this.entry=entry};var $ValueNode=ValueNode;$traceurRuntime.createClass(ValueNode,{get:function(shift,hash,key,notSetValue){return is(key,this.entry[0])?this.entry[1]:notSetValue},update:function(ownerID,shift,hash,key,value,didChangeLength,didAlter){var removed=value===NOT_SET;var keyMatch=is(key,this.entry[0]);if(keyMatch?value===this.entry[1]:removed){return this}SetRef(didAlter);if(removed){SetRef(didChangeLength);return null}if(keyMatch){if(ownerID&&ownerID===this.ownerID){this.entry[1]=value;return this}return new $ValueNode(ownerID,hash,[key,value])}SetRef(didChangeLength);return mergeIntoNode(this,ownerID,shift,hash,[key,value])},iterate:function(fn){return fn(this.entry)}},{});var MapIterator=function MapIterator(map,type,reverse){this._type=type;this._reverse=reverse;this._stack=map._root&&mapIteratorFrame(map._root)};$traceurRuntime.createClass(MapIterator,{next:function(){var type=this._type;
var stack=this._stack;while(stack){var node=stack.node;var index=stack.index++;var maxIndex;if(node.entry){if(index===0){return mapIteratorValue(type,node.entry)}}else if(node.entries){maxIndex=node.entries.length-1;if(index<=maxIndex){return mapIteratorValue(type,node.entries[this._reverse?maxIndex-index:index])}}else{maxIndex=node.nodes.length-1;if(index<=maxIndex){var subNode=node.nodes[this._reverse?maxIndex-index:index];if(subNode){if(subNode.entry){return mapIteratorValue(type,subNode.entry)}stack=this._stack=mapIteratorFrame(subNode,stack)}continue}}stack=this._stack=this._stack.__prev}return iteratorDone()}},{},Iterator);function mapIteratorValue(type,entry){return iteratorValue(type,entry[0],entry[1])}function mapIteratorFrame(node,prev){return{node:node,index:0,__prev:prev}}function makeMap(length,root,ownerID,hash){var map=Object.create(MapPrototype);map.length=length;map._root=root;map.__ownerID=ownerID;map.__hash=hash;map.__altered=false;return map}function updateMap(map,k,v){var didChangeLength=MakeRef(CHANGE_LENGTH);var didAlter=MakeRef(DID_ALTER);var newRoot=updateNode(map._root,map.__ownerID,0,hash(k),k,v,didChangeLength,didAlter);if(!didAlter.value){return map}var newLength=map.length+(didChangeLength.value?v===NOT_SET?-1:1:0);if(map.__ownerID){map.length=newLength;map._root=newRoot;map.__hash=undefined;map.__altered=true;return map}return newRoot?makeMap(newLength,newRoot):Map.empty()}function updateNode(node,ownerID,shift,hash,key,value,didChangeLength,didAlter){if(!node){if(value===NOT_SET){return node}SetRef(didAlter);SetRef(didChangeLength);return new ValueNode(ownerID,hash,[key,value])}return node.update(ownerID,shift,hash,key,value,didChangeLength,didAlter)}function isLeafNode(node){return node.constructor===ValueNode||node.constructor===HashCollisionNode}function mergeIntoNode(node,ownerID,shift,hash,entry){if(node.hash===hash){return new HashCollisionNode(ownerID,hash,[node.entry,entry])}var idx1=(shift===0?node.hash:node.hash>>>shift)&MASK;var idx2=(shift===0?hash:hash>>>shift)&MASK;var newNode;var nodes=idx1===idx2?[mergeIntoNode(node,ownerID,shift+SHIFT,hash,entry)]:(newNode=new ValueNode(ownerID,hash,entry),idx1<idx2?[node,newNode]:[newNode,node]);return new BitmapIndexedNode(ownerID,1<<idx1|1<<idx2,nodes)}function packNodes(ownerID,nodes,count,excluding){var bitmap=0;var packedII=0;var packedNodes=new Array(count);for(var ii=0,bit=1,len=nodes.length;ii<len;ii++,bit<<=1){var node=nodes[ii];if(node!=null&&ii!==excluding){bitmap|=bit;packedNodes[packedII++]=node}}return new BitmapIndexedNode(ownerID,bitmap,packedNodes)}function expandNodes(ownerID,nodes,bitmap,including,node){var count=0;var expandedNodes=new Array(SIZE);for(var ii=0;bitmap!==0;ii++,bitmap>>>=1){expandedNodes[ii]=bitmap&1?nodes[count++]:null}expandedNodes[including]=node;return new ArrayNode(ownerID,count+1,expandedNodes)}function mergeIntoMapWith(map,merger,iterables){var seqs=[];for(var ii=0;ii<iterables.length;ii++){var seq=iterables[ii];if(!(seq instanceof Sequence)){seq=Sequence(seq);if(seq instanceof IndexedSequence){seq=seq.fromEntrySeq()}}seq&&seqs.push(seq)}return mergeIntoCollectionWith(map,merger,seqs)}function deepMerger(merger){return function(existing,value){return existing&&existing.mergeDeepWith?existing.mergeDeepWith(merger,value):merger?merger(existing,value):value}}function mergeIntoCollectionWith(collection,merger,seqs){if(seqs.length===0){return collection}return collection.withMutations(function(collection){var mergeIntoMap=merger?function(value,key){var existing=collection.get(key,NOT_SET);collection.set(key,existing===NOT_SET?value:merger(existing,value))}:function(value,key){collection.set(key,value)};for(var ii=0;ii<seqs.length;ii++){seqs[ii].forEach(mergeIntoMap)}})}function updateInDeepMap(collection,keyPath,notSetValue,updater,pathOffset){var pathLen=keyPath.length;if(pathOffset===pathLen){return updater(collection)}invariant(collection.set,"updateIn with invalid keyPath");var notSet=pathOffset===pathLen-1?notSetValue:Map.empty();var key=keyPath[pathOffset];var existing=collection.get(key,notSet);var value=updateInDeepMap(existing,keyPath,notSetValue,updater,pathOffset+1);return value===existing?collection:collection.set(key,value)}function popCount(x){x=x-(x>>1&1431655765);x=(x&858993459)+(x>>2&858993459);x=x+(x>>4)&252645135;x=x+(x>>8);x=x+(x>>16);return x&127}function setIn(array,idx,val,canEdit){var newArray=canEdit?array:arrCopy(array);newArray[idx]=val;return newArray}function spliceIn(array,idx,val,canEdit){var newLen=array.length+1;if(canEdit&&idx+1===newLen){array[idx]=val;return array}var newArray=new Array(newLen);var after=0;for(var ii=0;ii<newLen;ii++){if(ii===idx){newArray[ii]=val;after=-1}else{newArray[ii]=array[ii+after]}}return newArray}function spliceOut(array,idx,canEdit){var newLen=array.length-1;if(canEdit&&idx===newLen){array.pop();return array}var newArray=new Array(newLen);var after=0;for(var ii=0;ii<newLen;ii++){if(ii===idx){after=1}newArray[ii]=array[ii+after]}return newArray}var MAX_BITMAP_SIZE=SIZE/2;var MIN_ARRAY_SIZE=SIZE/4;var EMPTY_MAP;var Vector=function Vector(){for(var values=[],$__6=0;$__6<arguments.length;$__6++)values[$__6]=arguments[$__6];return $Vector.from(values)};var $Vector=Vector;$traceurRuntime.createClass(Vector,{toString:function(){return this.__toString("Vector [","]")},get:function(index,notSetValue){index=wrapIndex(this,index);if(index<0||index>=this.length){return notSetValue}index+=this._origin;var node=vectorNodeFor(this,index);return node&&node.array[index&MASK]},set:function(index,value){return updateVector(this,index,value)},remove:function(index){return updateVector(this,index,NOT_SET)},clear:function(){if(this.length===0){return this}if(this.__ownerID){this.length=this._origin=this._size=0;this._level=SHIFT;this._root=this._tail=null;this.__hash=undefined;this.__altered=true;return this}return $Vector.empty()},push:function(){var values=arguments;var oldLength=this.length;return this.withMutations(function(vect){setVectorBounds(vect,0,oldLength+values.length);for(var ii=0;ii<values.length;ii++){vect.set(oldLength+ii,values[ii])}})},pop:function(){return setVectorBounds(this,0,-1)},unshift:function(){var values=arguments;return this.withMutations(function(vect){setVectorBounds(vect,-values.length);for(var ii=0;ii<values.length;ii++){vect.set(ii,values[ii])}})},shift:function(){return setVectorBounds(this,1)},merge:function(){return mergeIntoVectorWith(this,null,arguments)},mergeWith:function(merger){for(var seqs=[],$__7=1;$__7<arguments.length;$__7++)seqs[$__7-1]=arguments[$__7];return mergeIntoVectorWith(this,merger,seqs)},mergeDeep:function(){return mergeIntoVectorWith(this,deepMerger(null),arguments)},mergeDeepWith:function(merger){for(var seqs=[],$__8=1;$__8<arguments.length;$__8++)seqs[$__8-1]=arguments[$__8];return mergeIntoVectorWith(this,deepMerger(merger),seqs)},setLength:function(length){return setVectorBounds(this,0,length)},slice:function(begin,end){var sliceSequence=$traceurRuntime.superCall(this,$Vector.prototype,"slice",[begin,end]);if(sliceSequence!==this){var vector=this;var length=vector.length;sliceSequence.toVector=function(){return setVectorBounds(vector,begin<0?Math.max(0,length+begin):length?Math.min(length,begin):begin,end==null?length:end<0?Math.max(0,length+end):length?Math.min(length,end):end)}}return sliceSequence},__iterator:function(type,reverse){return new VectorIterator(this,type,reverse)},__iterate:function(fn,reverse){var $__0=this;var iterations=0;var eachFn=function(v){return fn(v,iterations++,$__0)};var tailOffset=getTailOffset(this._size);if(reverse){iterateVNode(this._tail,0,tailOffset-this._origin,this._size-this._origin,eachFn,reverse)&&iterateVNode(this._root,this._level,-this._origin,tailOffset-this._origin,eachFn,reverse)}else{iterateVNode(this._root,this._level,-this._origin,tailOffset-this._origin,eachFn,reverse)&&iterateVNode(this._tail,0,tailOffset-this._origin,this._size-this._origin,eachFn,reverse)}return iterations},__ensureOwner:function(ownerID){if(ownerID===this.__ownerID){return this}if(!ownerID){this.__ownerID=ownerID;return this}return makeVector(this._origin,this._size,this._level,this._root,this._tail,ownerID,this.__hash)}},{empty:function(){return EMPTY_VECT||(EMPTY_VECT=makeVector(0,0,SHIFT))},from:function(sequence){if(!sequence||sequence.length===0){return $Vector.empty()}if(sequence.constructor===$Vector){return sequence}var isArray=Array.isArray(sequence);if(sequence.length>0&&sequence.length<SIZE){return makeVector(0,sequence.length,SHIFT,null,new VNode(isArray?arrCopy(sequence):Sequence(sequence).toArray()))}if(!isArray){sequence=Sequence(sequence).valueSeq()}return $Vector.empty().merge(sequence)}},IndexedSequence);var VectorPrototype=Vector.prototype;VectorPrototype[DELETE]=VectorPrototype.remove;VectorPrototype.update=MapPrototype.update;VectorPrototype.updateIn=MapPrototype.updateIn;VectorPrototype.cursor=MapPrototype.cursor;VectorPrototype.withMutations=MapPrototype.withMutations;VectorPrototype.asMutable=MapPrototype.asMutable;VectorPrototype.asImmutable=MapPrototype.asImmutable;VectorPrototype.wasAltered=MapPrototype.wasAltered;var VNode=function VNode(array,ownerID){this.array=array;this.ownerID=ownerID};var $VNode=VNode;$traceurRuntime.createClass(VNode,{removeBefore:function(ownerID,level,index){if(index===level?1<<level:0||this.array.length===0){return this}var originIndex=index>>>level&MASK;if(originIndex>=this.array.length){return new $VNode([],ownerID)}var removingFirst=originIndex===0;var newChild;if(level>0){var oldChild=this.array[originIndex];newChild=oldChild&&oldChild.removeBefore(ownerID,level-SHIFT,index);if(newChild===oldChild&&removingFirst){return this}}if(removingFirst&&!newChild){return this}var editable=editableVNode(this,ownerID);if(!removingFirst){for(var ii=0;ii<originIndex;ii++){editable.array[ii]=undefined}}if(newChild){editable.array[originIndex]=newChild}return editable},removeAfter:function(ownerID,level,index){if(index===level?1<<level:0||this.array.length===0){return this}var sizeIndex=index-1>>>level&MASK;if(sizeIndex>=this.array.length){return this}var removingLast=sizeIndex===this.array.length-1;var newChild;if(level>0){var oldChild=this.array[sizeIndex];newChild=oldChild&&oldChild.removeAfter(ownerID,level-SHIFT,index);if(newChild===oldChild&&removingLast){return this}}if(removingLast&&!newChild){return this}var editable=editableVNode(this,ownerID);if(!removingLast){editable.array.pop()}if(newChild){editable.array[sizeIndex]=newChild}return editable}},{});function iterateVNode(node,level,offset,max,fn,reverse){var ii;var array=node&&node.array;if(level===0){var from=offset<0?-offset:0;var to=max-offset;if(to>SIZE){to=SIZE}for(ii=from;ii<to;ii++){if(fn(array&&array[reverse?from+to-1-ii:ii])===false){return false}}}else{var step=1<<level;var newLevel=level-SHIFT;for(ii=0;ii<=MASK;ii++){var levelIndex=reverse?MASK-ii:ii;var newOffset=offset+(levelIndex<<level);if(newOffset<max&&newOffset+step>0){var nextNode=array&&array[levelIndex];if(!iterateVNode(nextNode,newLevel,newOffset,max,fn,reverse)){return false}}}}return true}var VectorIterator=function VectorIterator(vector,type,reverse){this._type=type;this._reverse=!!reverse;this._maxIndex=vector.length-1;var tailOffset=getTailOffset(vector._size);var rootStack=vectIteratorFrame(vector._root&&vector._root.array,vector._level,-vector._origin,tailOffset-vector._origin-1);var tailStack=vectIteratorFrame(vector._tail&&vector._tail.array,0,tailOffset-vector._origin,vector._size-vector._origin-1);this._stack=reverse?tailStack:rootStack;this._stack.__prev=reverse?rootStack:tailStack};$traceurRuntime.createClass(VectorIterator,{next:function(){var stack=this._stack;while(stack){var array=stack.array;var rawIndex=stack.index++;if(this._reverse){rawIndex=MASK-rawIndex;if(rawIndex>stack.rawMax){rawIndex=stack.rawMax;stack.index=SIZE-rawIndex}}if(rawIndex>=0&&rawIndex<SIZE&&rawIndex<=stack.rawMax){var value=array&&array[rawIndex];if(stack.level===0){var type=this._type;var index;if(type!==1){index=stack.offset+(rawIndex<<stack.level);if(this._reverse){index=this._maxIndex-index}}return iteratorValue(type,index,value)}else{this._stack=stack=vectIteratorFrame(value&&value.array,stack.level-SHIFT,stack.offset+(rawIndex<<stack.level),stack.max,stack)}continue}stack=this._stack=this._stack.__prev}return iteratorDone()}},{},Iterator);function vectIteratorFrame(array,level,offset,max,prevFrame){return{array:array,level:level,offset:offset,max:max,rawMax:max-offset>>level,index:0,__prev:prevFrame}}function makeVector(origin,size,level,root,tail,ownerID,hash){var vect=Object.create(VectorPrototype);vect.length=size-origin;vect._origin=origin;vect._size=size;vect._level=level;vect._root=root;vect._tail=tail;vect.__ownerID=ownerID;vect.__hash=hash;vect.__altered=false;return vect}function updateVector(vector,index,value){index=wrapIndex(vector,index);if(index>=vector.length||index<0){return value===NOT_SET?vector:vector.withMutations(function(vect){index<0?setVectorBounds(vect,index).set(0,value):setVectorBounds(vect,0,index+1).set(index,value)})}index+=vector._origin;var newTail=vector._tail;var newRoot=vector._root;var didAlter=MakeRef(DID_ALTER);if(index>=getTailOffset(vector._size)){newTail=updateVNode(newTail,vector.__ownerID,0,index,value,didAlter)}else{newRoot=updateVNode(newRoot,vector.__ownerID,vector._level,index,value,didAlter)}if(!didAlter.value){return vector}if(vector.__ownerID){vector._root=newRoot;vector._tail=newTail;vector.__hash=undefined;vector.__altered=true;return vector}return makeVector(vector._origin,vector._size,vector._level,newRoot,newTail)}function updateVNode(node,ownerID,level,index,value,didAlter){var removed=value===NOT_SET;var newNode;var idx=index>>>level&MASK;var nodeHas=node&&idx<node.array.length;if(removed&&!nodeHas){return node}if(level>0){var lowerNode=node&&node.array[idx];var newLowerNode=updateVNode(lowerNode,ownerID,level-SHIFT,index,value,didAlter);if(newLowerNode===lowerNode){return node}newNode=editableVNode(node,ownerID);newNode.array[idx]=newLowerNode;return newNode}if(!removed&&nodeHas&&node.array[idx]===value){return node}SetRef(didAlter);newNode=editableVNode(node,ownerID);if(removed&&idx===newNode.array.length-1){newNode.array.pop()}else{newNode.array[idx]=removed?undefined:value}return newNode}function editableVNode(node,ownerID){if(ownerID&&node&&ownerID===node.ownerID){return node}return new VNode(node?node.array.slice():[],ownerID)}function vectorNodeFor(vector,rawIndex){if(rawIndex>=getTailOffset(vector._size)){return vector._tail}if(rawIndex<1<<vector._level+SHIFT){var node=vector._root;var level=vector._level;while(node&&level>0){node=node.array[rawIndex>>>level&MASK];level-=SHIFT}return node}}function setVectorBounds(vector,begin,end){var owner=vector.__ownerID||new OwnerID;var oldOrigin=vector._origin;var oldSize=vector._size;var newOrigin=oldOrigin+begin;var newSize=end==null?oldSize:end<0?oldSize+end:oldOrigin+end;if(newOrigin===oldOrigin&&newSize===oldSize){return vector}if(newOrigin>=newSize){return vector.clear()}var newLevel=vector._level;var newRoot=vector._root;var offsetShift=0;while(newOrigin+offsetShift<0){newRoot=new VNode(newRoot&&newRoot.array.length?[null,newRoot]:[],owner);newLevel+=SHIFT;offsetShift+=1<<newLevel}if(offsetShift){newOrigin+=offsetShift;oldOrigin+=offsetShift;newSize+=offsetShift;oldSize+=offsetShift}var oldTailOffset=getTailOffset(oldSize);var newTailOffset=getTailOffset(newSize);while(newTailOffset>=1<<newLevel+SHIFT){newRoot=new VNode(newRoot&&newRoot.array.length?[newRoot]:[],owner);newLevel+=SHIFT}var oldTail=vector._tail;var newTail=newTailOffset<oldTailOffset?vectorNodeFor(vector,newSize-1):newTailOffset>oldTailOffset?new VNode([],owner):oldTail;if(oldTail&&newTailOffset>oldTailOffset&&newOrigin<oldSize&&oldTail.array.length){newRoot=editableVNode(newRoot,owner);var node=newRoot;for(var level=newLevel;level>SHIFT;level-=SHIFT){var idx=oldTailOffset>>>level&MASK;node=node.array[idx]=editableVNode(node.array[idx],owner)}node.array[oldTailOffset>>>SHIFT&MASK]=oldTail}if(newSize<oldSize){newTail=newTail&&newTail.removeAfter(owner,0,newSize)}if(newOrigin>=newTailOffset){newOrigin-=newTailOffset;newSize-=newTailOffset;newLevel=SHIFT;newRoot=null;newTail=newTail&&newTail.removeBefore(owner,0,newOrigin)}else if(newOrigin>oldOrigin||newTailOffset<oldTailOffset){var beginIndex,endIndex;offsetShift=0;do{beginIndex=newOrigin>>>newLevel&MASK;endIndex=newTailOffset-1>>>newLevel&MASK;if(beginIndex===endIndex){if(beginIndex){offsetShift+=(1<<newLevel)*beginIndex}newLevel-=SHIFT;newRoot=newRoot&&newRoot.array[beginIndex]}}while(newRoot&&beginIndex===endIndex);if(newRoot&&newOrigin>oldOrigin){newRoot=newRoot&&newRoot.removeBefore(owner,newLevel,newOrigin-offsetShift)}if(newRoot&&newTailOffset<oldTailOffset){newRoot=newRoot&&newRoot.removeAfter(owner,newLevel,newTailOffset-offsetShift)}if(offsetShift){newOrigin-=offsetShift;newSize-=offsetShift}}if(vector.__ownerID){vector.length=newSize-newOrigin;vector._origin=newOrigin;vector._size=newSize;vector._level=newLevel;vector._root=newRoot;vector._tail=newTail;vector.__hash=undefined;vector.__altered=true;return vector}return makeVector(newOrigin,newSize,newLevel,newRoot,newTail)}function mergeIntoVectorWith(vector,merger,iterables){var seqs=[];for(var ii=0;ii<iterables.length;ii++){var seq=iterables[ii];seq&&seqs.push(Sequence(seq))}var maxLength=Math.max.apply(null,seqs.map(function(s){return s.length||0}));if(maxLength>vector.length){vector=vector.setLength(maxLength)}return mergeIntoCollectionWith(vector,merger,seqs)}function getTailOffset(size){return size<SIZE?0:size-1>>>SHIFT<<SHIFT}var EMPTY_VECT;var Set=function Set(){for(var values=[],$__9=0;$__9<arguments.length;$__9++)values[$__9]=arguments[$__9];return $Set.from(values)};var $Set=Set;$traceurRuntime.createClass(Set,{toString:function(){return this.__toString("Set {","}")},has:function(value){return this._map.has(value)},get:function(value,notSetValue){return this.has(value)?value:notSetValue},add:function(value){var newMap=this._map.set(value,null);if(this.__ownerID){this.length=newMap.length;this._map=newMap;return this}return newMap===this._map?this:makeSet(newMap)},remove:function(value){var newMap=this._map.remove(value);if(this.__ownerID){this.length=newMap.length;this._map=newMap;return this}return newMap===this._map?this:newMap.length===0?$Set.empty():makeSet(newMap)},clear:function(){if(this.length===0){return this}if(this.__ownerID){this.length=0;this._map.clear();return this}return $Set.empty()},union:function(){var seqs=arguments;if(seqs.length===0){return this}return this.withMutations(function(set){for(var ii=0;ii<seqs.length;ii++){Sequence(seqs[ii]).forEach(function(value){return set.add(value)})}})},intersect:function(){for(var seqs=[],$__10=0;$__10<arguments.length;$__10++)seqs[$__10]=arguments[$__10];if(seqs.length===0){return this}seqs=seqs.map(function(seq){return Sequence(seq)});var originalSet=this;return this.withMutations(function(set){originalSet.forEach(function(value){if(!seqs.every(function(seq){return seq.contains(value)})){set.remove(value)}})})},subtract:function(){for(var seqs=[],$__11=0;$__11<arguments.length;$__11++)seqs[$__11]=arguments[$__11];if(seqs.length===0){return this}seqs=seqs.map(function(seq){return Sequence(seq)});var originalSet=this;return this.withMutations(function(set){originalSet.forEach(function(value){if(seqs.some(function(seq){return seq.contains(value)})){set.remove(value)}})})},isSubset:function(seq){seq=Sequence(seq);return this.every(function(value){return seq.contains(value)})},isSuperset:function(seq){var set=this;seq=Sequence(seq);return seq.every(function(value){return set.contains(value)})},wasAltered:function(){return this._map.wasAltered()},hashCode:function(){return this._map.hashCode()},__iterate:function(fn,reverse){var $__0=this;return this._map.__iterate(function(_,k){return fn(k,k,$__0)},reverse)},__iterator:function(type,reverse){return this._map.map(function(_,k){return k}).__iterator(type,reverse)},__ensureOwner:function(ownerID){if(ownerID===this.__ownerID){return this}var newMap=this._map.__ensureOwner(ownerID);if(!ownerID){this.__ownerID=ownerID;this._map=newMap;return this}return makeSet(newMap,ownerID)}},{empty:function(){return EMPTY_SET||(EMPTY_SET=makeSet(Map.empty()))},from:function(sequence){var set=$Set.empty();return sequence?sequence.constructor===$Set?sequence:set.union(sequence):set},fromKeys:function(sequence){return $Set.from(Sequence(sequence).flip())}},Sequence);var SetPrototype=Set.prototype;SetPrototype[DELETE]=SetPrototype.remove;SetPrototype[ITERATOR_SYMBOL]=SetPrototype.values;SetPrototype.contains=SetPrototype.has;SetPrototype.mergeDeep=SetPrototype.merge=SetPrototype.union;SetPrototype.mergeDeepWith=SetPrototype.mergeWith=function(merger){for(var seqs=[],$__12=1;$__12<arguments.length;$__12++)seqs[$__12-1]=arguments[$__12];return this.merge.apply(this,seqs)};SetPrototype.withMutations=MapPrototype.withMutations;SetPrototype.asMutable=MapPrototype.asMutable;SetPrototype.asImmutable=MapPrototype.asImmutable;SetPrototype.__toJS=IndexedSequencePrototype.__toJS;SetPrototype.__toStringMapper=IndexedSequencePrototype.__toStringMapper;function makeSet(map,ownerID){var set=Object.create(SetPrototype);set.length=map?map.length:0;set._map=map;set.__ownerID=ownerID;return set}var EMPTY_SET;var OrderedMap=function OrderedMap(sequence){var map=$OrderedMap.empty();return sequence?sequence.constructor===$OrderedMap?sequence:map.merge(sequence):map};var $OrderedMap=OrderedMap;$traceurRuntime.createClass(OrderedMap,{toString:function(){return this.__toString("OrderedMap {","}")},get:function(k,notSetValue){var index=this._map.get(k);return index!=null?this._vector.get(index)[1]:notSetValue},clear:function(){if(this.length===0){return this}if(this.__ownerID){this.length=0;this._map.clear();this._vector.clear();return this}return $OrderedMap.empty()},set:function(k,v){return updateOrderedMap(this,k,v)},remove:function(k){return updateOrderedMap(this,k,NOT_SET)},wasAltered:function(){return this._map.wasAltered()||this._vector.wasAltered()},__iterate:function(fn,reverse){var $__0=this;return this._vector.__iterate(function(entry){return entry&&fn(entry[1],entry[0],$__0)},reverse)},__iterator:function(type,reverse){return this._vector.fromEntrySeq().__iterator(type,reverse)},__ensureOwner:function(ownerID){if(ownerID===this.__ownerID){return this}var newMap=this._map.__ensureOwner(ownerID);var newVector=this._vector.__ensureOwner(ownerID);if(!ownerID){this.__ownerID=ownerID;this._map=newMap;this._vector=newVector;return this}return makeOrderedMap(newMap,newVector,ownerID,this.__hash)}},{empty:function(){return EMPTY_ORDERED_MAP||(EMPTY_ORDERED_MAP=makeOrderedMap(Map.empty(),Vector.empty()))}},Map);OrderedMap.from=OrderedMap;OrderedMap.prototype[DELETE]=OrderedMap.prototype.remove;function makeOrderedMap(map,vector,ownerID,hash){var omap=Object.create(OrderedMap.prototype);omap.length=map?map.length:0;omap._map=map;omap._vector=vector;omap.__ownerID=ownerID;omap.__hash=hash;return omap}function updateOrderedMap(omap,k,v){var map=omap._map;var vector=omap._vector;var i=map.get(k);var has=i!==undefined;var removed=v===NOT_SET;if(!has&&removed||has&&v===vector.get(i)[1]){return omap}if(!has){i=vector.length}var newMap=removed?map.remove(k):has?map:map.set(k,i);var newVector=removed?vector.remove(i):vector.set(i,[k,v]);if(omap.__ownerID){omap.length=newMap.length;omap._map=newMap;omap._vector=newVector;omap.__hash=undefined;return omap}return makeOrderedMap(newMap,newVector)}var EMPTY_ORDERED_MAP;var Record=function Record(defaultValues,name){var RecordType=function(values){if(!(this instanceof RecordType)){return new RecordType(values)}this._map=Map(values)};defaultValues=Sequence(defaultValues);var RecordTypePrototype=RecordType.prototype=Object.create(RecordPrototype);RecordTypePrototype.constructor=RecordType;RecordTypePrototype._name=name;RecordTypePrototype._defaultValues=defaultValues;var keys=Object.keys(defaultValues);RecordType.prototype.length=keys.length;if(Object.defineProperty){defaultValues.forEach(function(_,key){Object.defineProperty(RecordType.prototype,key,{get:function(){return this.get(key)},set:function(value){invariant(this.__ownerID,"Cannot set on an immutable record.");this.set(key,value)}})})}return RecordType};var $Record=Record;$traceurRuntime.createClass(Record,{toString:function(){return this.__toString((this._name||"Record")+" {","}")},has:function(k){return this._defaultValues.has(k)},get:function(k,notSetValue){if(notSetValue!==undefined&&!this.has(k)){return notSetValue}return this._map.get(k,this._defaultValues.get(k))},clear:function(){if(this.__ownerID){this._map.clear();return this}var Record=Object.getPrototypeOf(this).constructor;return $Record._empty||($Record._empty=makeRecord(this,Map.empty()))},set:function(k,v){if(k==null||!this.has(k)){return this}var newMap=this._map.set(k,v);if(this.__ownerID||newMap===this._map){return this}return makeRecord(this,newMap)},remove:function(k){if(k==null||!this.has(k)){return this}var newMap=this._map.remove(k);if(this.__ownerID||newMap===this._map){return this}return makeRecord(this,newMap)},keys:function(){return this._map.keys()},values:function(){return this._map.values()},entries:function(){return this._map.entries()},wasAltered:function(){return this._map.wasAltered()},__iterator:function(type,reverse){return this._map.__iterator(type,reverse)},__iterate:function(fn,reverse){var record=this;return this._defaultValues.map(function(_,k){return record.get(k)}).__iterate(fn,reverse)},__ensureOwner:function(ownerID){if(ownerID===this.__ownerID){return this}var newMap=this._map&&this._map.__ensureOwner(ownerID);if(!ownerID){this.__ownerID=ownerID;this._map=newMap;return this}return makeRecord(this,newMap,ownerID)}},{},Sequence);var RecordPrototype=Record.prototype;RecordPrototype[DELETE]=RecordPrototype.remove;RecordPrototype.merge=MapPrototype.merge;RecordPrototype.mergeWith=MapPrototype.mergeWith;RecordPrototype.mergeDeep=MapPrototype.mergeDeep;RecordPrototype.mergeDeepWith=MapPrototype.mergeDeepWith;RecordPrototype.update=MapPrototype.update;RecordPrototype.updateIn=MapPrototype.updateIn;RecordPrototype.cursor=MapPrototype.cursor;RecordPrototype.withMutations=MapPrototype.withMutations;RecordPrototype.asMutable=MapPrototype.asMutable;RecordPrototype.asImmutable=MapPrototype.asImmutable;function makeRecord(likeRecord,map,ownerID){var record=Object.create(Object.getPrototypeOf(likeRecord));record._map=map;record.__ownerID=ownerID;return record}var Range=function Range(start,end,step){if(!(this instanceof $Range)){return new $Range(start,end,step)}invariant(step!==0,"Cannot step a Range by 0");start=start||0;if(end==null){end=Infinity}if(start===end&&__EMPTY_RANGE){return __EMPTY_RANGE}step=step==null?1:Math.abs(step);if(end<start){step=-step}this._start=start;this._end=end;this._step=step;this.length=Math.max(0,Math.ceil((end-start)/step-1)+1)};var $Range=Range;$traceurRuntime.createClass(Range,{toString:function(){if(this.length===0){return"Range []"}return"Range [ "+this._start+"..."+this._end+(this._step>1?" by "+this._step:"")+" ]"},get:function(index,notSetValue){index=wrapIndex(this,index);return this.has(index)?this._start+index*this._step:notSetValue},contains:function(searchValue){var possibleIndex=(searchValue-this._start)/this._step;return possibleIndex>=0&&possibleIndex<this.length&&possibleIndex===Math.floor(possibleIndex)},slice:function(begin,end){if(wholeSlice(begin,end,this.length)){return this}begin=resolveBegin(begin,this.length);end=resolveEnd(end,this.length);if(end<=begin){return __EMPTY_RANGE}return new $Range(this.get(begin,this._end),this.get(end,this._end),this._step)},indexOf:function(searchValue){var offsetValue=searchValue-this._start;if(offsetValue%this._step===0){var index=offsetValue/this._step;if(index>=0&&index<this.length){return index}}return-1},lastIndexOf:function(searchValue){return this.indexOf(searchValue)},take:function(amount){return this.slice(0,Math.max(0,amount))},skip:function(amount){return this.slice(Math.max(0,amount))},__iterate:function(fn,reverse){var maxIndex=this.length-1;var step=this._step;var value=reverse?this._start+maxIndex*step:this._start;for(var ii=0;ii<=maxIndex;ii++){if(fn(value,ii,this)===false){return ii+1}value+=reverse?-step:step}return ii},__iterator:function(type,reverse){var maxIndex=this.length-1;var step=this._step;var value=reverse?this._start+maxIndex*step:this._start;var ii=0;return new Iterator(function(){var v=value;value+=reverse?-step:step;return ii>maxIndex?iteratorDone():iteratorValue(type,ii++,v)})},__deepEquals:function(other){return other instanceof $Range?this._start===other._start&&this._end===other._end&&this._step===other._step:$traceurRuntime.superCall(this,$Range.prototype,"__deepEquals",[other])}},{},IndexedSequence);var RangePrototype=Range.prototype;RangePrototype.__toJS=RangePrototype.toArray;RangePrototype.first=VectorPrototype.first;RangePrototype.last=VectorPrototype.last;var __EMPTY_RANGE=Range(0,0);var Repeat=function Repeat(value,times){if(times===0&&EMPTY_REPEAT){return EMPTY_REPEAT}if(!(this instanceof $Repeat)){return new $Repeat(value,times)}this._value=value;this.length=times==null?Infinity:Math.max(0,times)};var $Repeat=Repeat;$traceurRuntime.createClass(Repeat,{toString:function(){if(this.length===0){return"Repeat []"}return"Repeat [ "+this._value+" "+this.length+" times ]"},get:function(index,notSetValue){return this.has(index)?this._value:notSetValue},contains:function(searchValue){return is(this._value,searchValue)},slice:function(begin,end){var length=this.length;begin=begin<0?Math.max(0,length+begin):Math.min(length,begin);end=end==null?length:end>0?Math.min(length,end):Math.max(0,length+end);return end>begin?new $Repeat(this._value,end-begin):EMPTY_REPEAT},reverse:function(){return this},indexOf:function(searchValue){if(is(this._value,searchValue)){return 0}return-1},lastIndexOf:function(searchValue){if(is(this._value,searchValue)){return this.length}return-1},__iterate:function(fn,reverse){for(var ii=0;ii<this.length;ii++){if(fn(this._value,ii,this)===false){return ii+1}}return ii},__iterator:function(type,reverse){var $__0=this;var ii=0;return new Iterator(function(){return ii<$__0.length?iteratorValue(type,ii++,$__0._value):iteratorDone()})},__deepEquals:function(other){return other instanceof $Repeat?is(this._value,other._value):$traceurRuntime.superCall(this,$Repeat.prototype,"__deepEquals",[other])}},{},IndexedSequence);var RepeatPrototype=Repeat.prototype;RepeatPrototype.last=RepeatPrototype.first;RepeatPrototype.has=RangePrototype.has;RepeatPrototype.take=RangePrototype.take;RepeatPrototype.skip=RangePrototype.skip;RepeatPrototype.__toJS=RangePrototype.__toJS;var EMPTY_REPEAT=new Repeat(undefined,0);function fromJS(json,converter){if(converter){return _fromJSWith(converter,json,"",{"":json})}return _fromJSDefault(json)}function _fromJSWith(converter,json,key,parentJSON){if(json&&(Array.isArray(json)||json.constructor===Object)){return converter.call(parentJSON,key,Sequence(json).map(function(v,k){return _fromJSWith(converter,v,k,json)}))}return json}function _fromJSDefault(json){if(json){if(Array.isArray(json)){return Sequence(json).map(_fromJSDefault).toVector()}if(json.constructor===Object){return Sequence(json).map(_fromJSDefault).toMap()}}return json}var Immutable={Sequence:Sequence,Map:Map,Vector:Vector,Set:Set,OrderedMap:OrderedMap,Record:Record,Range:Range,Repeat:Repeat,is:is,fromJS:fromJS};return Immutable}typeof exports==="object"?module.exports=universalModule():typeof define==="function"&&define.amd?define(universalModule):Immutable=universalModule()},{}]},{},[]);var Benchmark=require("benchmark");var t=require("transducers.js");var Immutable=require("immutable");var suite=Benchmark.Suite("transducers");function benchArray(n){var arr=new Immutable.Range(0,n).toVector();suite.add("Immutable map/filter ("+n+")",function(){var lazy=arr.map(function(x){return x+10
}).map(function(x){return x*2}).filter(function(x){return x%5===0}).filter(function(x){return x%2===0});lazy.toVector()}).add("transducer map/filter ("+n+")",function(){var transform=t.compose(t.map(function(x){return x+10}),t.map(function(x){return x*2}),t.filter(function(x){return x%5===0}),t.filter(function(x){return x%2===0}));Immutable.Vector.from(t.seq(arr,transform))})}benchArray(1e3);benchArray(1e5);suite.on("cycle",function(event){console.log(String(event.target))});suite.run();
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"benchmark": "1.0.0",
"transducers.js": "0.2.2",
"immutable": "2.3.0"
}
}
<style type='text/css'>html, body { margin: 0; padding: 0; border: 0; }
body, html { height: 100%; width: 100%; }</style>
// Chrome 38
Immutable map/filter (1000) x 2,609 ops/sec ±3.12% (18 runs sampled)
transducer map/filter (1000) x 1,024 ops/sec ±2.24% (64 runs sampled)
Immutable map/filter (100000) x 27.00 ops/sec ±2.43% (38 runs sampled)
transducer map/filter (100000) x 10.78 ops/sec ±2.19% (31 runs sampled)
@leebyron
Copy link
Author

@jlongster
Copy link

Commented on the other benchmark, no idea why your results are so different on the same browser. http://jlongster.com/s/bench-immut.png

Firefox is slower probably because of the iterator we're having to create (its GC isn't as good as Chrome's yet, lots of good GGC stuff coming though). But that can be fixed with the transformer protocol: https://github.com/jlongster/transducers.js#the-transformer-protocol

Anyway, the perf here should not be that different between our libs. To me, the big advantage is that we can apply these perf gains to all data structures. immutable-js does already have pretty good optimized transforms.

@jlongster
Copy link

You can try cognitect's lib also to make sure that it's not a weird problem with my lib, but we both implement this in extremely similar ways: https://github.com/cognitect-labs/transducers-js

@swannodette
Copy link

For me in Chrome 38

Immutable map/filter (1000) x 9,577 ops/sec ±1.11% (53 runs sampled) VM982:5
transducer map/filter (1000) x 12,266 ops/sec ±0.67% (67 runs sampled) VM982:5
Immutable map/filter (100000) x 102 ops/sec ±0.46% (61 runs sampled) VM982:5
transducer map/filter (100000) x 129 ops/sec ±0.35% (58 runs sampled) 

@swannodette
Copy link

I've also made a version that uses asMutable which should toast other approaches https://gist.github.com/swannodette/ccc6cecc05afa4373e59 :)

@jlongster
Copy link

I like that completing function. I had done the transient-type thing as well but with the experimental monkeypatch: https://github.com/jlongster/transducers.js/blob/master/tests/tests.js#L25. I am curious how much overhead the iterator uses; I don't see the results of the third benchmark in your gist?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment