itt=function(f)
{var t1=new Date().getTime();f();console.log(new Date().getTime()-t1);};function ts_to_string(ts)
{return new Date(ts*1000).toLocaleString();}
function ts_now()
{return Math.floor(new Date().getTime()/1000);}
jsfilters={'timesince':timesince,'date':ts_to_string,scorify:scorify};function timesince(t,now,detail){var conv=[[31536000,'year','years'],[2592000,'month','months'],[604800,'week','weeks'],[86400,'day','days'],[3600,'hour','hours'],[60,'minute','minutes']];if(!now){now=ts_now();}
if(!detail)detail=2;var delta=now-t;if(delta<0)delta=0;var parts=[];var temp;for(var i=0;i<conv.length;i++){temp=Math.floor(delta/conv[i][0]);if(temp){delta=delta-conv[i][0]*temp;parts.push(temp+' '+conv[i][(temp!=1)+1]);}}
parts.push(delta+' '+((delta==1)?'second':'seconds'));parts=parts.slice(0,detail);return parts.join(', ');}
function scorify(score){if(!score)return'+0';if(score<0)return""+score;return'+'+score;}
String.prototype.format=function(){var str=this;for(var i=0;i<arguments.length;i++){var re=new RegExp('\\{'+(i)+'\\}','gm');str=str.replace(re,arguments[i]);}
return str;};String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,'');};String.prototype.asInt=function(){return parseInt(this);};String.prototype.substitute=function(settings)
{var val=""+this;var params=val.match(/%\w*/g);for(var i=0,j=params.length;i<j;i++)
{var param=params[i];val=val.replace(RegExp(param+"[^a-zA-Z0-9_-]"),(settings[param.substr(1)]||"")+"'");}
return val;};function $log(what){for(var q in what)
console.log(q," : ",what[q],"("+typeof(what[q])+")");}