//http://pajhome.org.uk/crypt/md5/index.html
var hexcase=0;// hex output format. 0-lowercase; 1-uppercase
var chrsz=8;// bits per input character. 8-ASCII; 16-Unicode

function md5(s){return binl2hex(core_md5(str2binl(s),s.length*chrsz));}

function core_md5(x,len)
{x[len>>5] |= 0x80 <<((len) % 32);
x[(((len+64)>>>9)<<4)+14]=len;

var a=1732584193;
var b=-271733879;
var c=-1732584194;
var d=271733878;

	for(var i=0;i<x.length;i+=16)
	{
	var AA=a;
	var BB=b;
	var CC=c;
	var DD=d;

	a=ff(a,b,c,d,x[i+0],7,-680876936);d=ff(d,a,b,c,x[i+1],12,-389564586);c=ff(c,d,a,b,x[i+2],17,606105819);b=ff(b,c,d,a,x[i+3],22,0xC1BDCEEE);
	a=ff(a,b,c,d,x[i+4],7,-176418897);d=ff(d,a,b,c,x[i+5],12,1200080426);c=ff(c,d,a,b,x[i+6],17,0xA8304613);b=ff(b,c,d,a,x[i+7],22,-45705983);
	a=ff(a,b,c,d,x[i+8],7,1770035416);d=ff(d,a,b,c,x[i+9],12,0x8B44F7AF);c=ff(c,d,a,b,x[i+10],17,-42063);b=ff(b,c,d,a,x[i+11],22,0x895CD7BE);
	a=ff(a,b,c,d,x[i+12],7,1804603682);d=ff(d,a,b,c,x[i+13],12,-40341101);c=ff(c,d,a,b,x[i+14],17,0xA679438E);b=ff(b,c,d,a,x[i+15],22,1236535329);
	a=gg(a,b,c,d,x[i+1],5,-165796510);d=gg(d,a,b,c,x[i+6],9,0xC040B340);c=gg(c,d,a,b,x[i+11],14,643717713);b=gg(b,c,d,a,x[i+0],20,-373897302);
	a=gg(a,b,c,d,x[i+5],5,-701558691);d=gg(d,a,b,c,x[i+10],9,38016083);c=gg(c,d,a,b,x[i+15],14,-660478335);b=gg(b,c,d,a,x[i+4],20,-405537848);
	a=gg(a,b,c,d,x[i+9],5,568446438);d=gg(d,a,b,c,x[i+14],9,0xC33707D6);c=gg(c,d,a,b,x[i+3],14,-187363961);b=gg(b,c,d,a,x[i+8],20,1163531501);
	a=gg(a,b,c,d,x[i+13],5,0xA9E3E905);d=gg(d,a,b,c,x[i+2],9,-51403784);c=gg(c,d,a,b,x[i+7],14,1735328473);b=gg(b,c,d,a,x[i+12],20,0x8D2A4C8A);
	a=hh(a,b,c,d,x[i+5],4,-378558);d=hh(d,a,b,c,x[i+8],11,0x8771F681);c=hh(c,d,a,b,x[i+11],16,1839030562);b=hh(b,c,d,a,x[i+14],23,-35309556);
	a=hh(a,b,c,d,x[i+1],4,0xA4BEEA44);d=hh(d,a,b,c,x[i+4],11,1272893353);c=hh(c,d,a,b,x[i+7],16,-155497632);b=hh(b,c,d,a,x[i+10],23,0xBEBFBC70);
	a=hh(a,b,c,d,x[i+13],4,681279174);d=hh(d,a,b,c,x[i+0],11,-358537222);c=hh(c,d,a,b,x[i+3],16,-722521979);b=hh(b,c,d,a,x[i+6],23,76029189);
	a=hh(a,b,c,d,x[i+9],4,-640364487);d=hh(d,a,b,c,x[i+12],11,-421815835);c=hh(c,d,a,b,x[i+15],16,530742520);b=hh(b,c,d,a,x[i+2],23,-995338651);
	a=ii(a,b,c,d,x[i+0],6,-198630844);d=ii(d,a,b,c,x[i+7],10,1126891415);c=ii(c,d,a,b,x[i+14],15,0xAB9423A7);b=ii(b,c,d,a,x[i+5],21,-57434055);
	a=ii(a,b,c,d,x[i+12],6,1700485571);d=ii(d,a,b,c,x[i+3],10,0x8F0CCC92);c=ii(c,d,a,b,x[i+10],15,-1051523);b=ii(b,c,d,a,x[i+1],21,0x85845DD1);
	a=ii(a,b,c,d,x[i+8],6,1873313359);d=ii(d,a,b,c,x[i+15],10,-30611744);c=ii(c,d,a,b,x[i+6],15,0xA3014314);b=ii(b,c,d,a,x[i+13],21,1309151649);
	a=ii(a,b,c,d,x[i+4],6,-145523070);d=ii(d,a,b,c,x[i+11],10,0xBD3AF235);c=ii(c,d,a,b,x[i+2],15,718787259);b=ii(b,c,d,a,x[i+9],21,-343485551);

	a=sa(a,AA);b=sa(b,BB);c=sa(c,CC);d=sa(d,DD);
	}
return Array(a,b,c,d);}

function bit_rol(n,c){return (n<<c)|(n>>>(32-c));}
function jj(q,a,b,x,s,t){return sa(bit_rol(sa(sa(a,q),sa(x,t)),s),b);}
function ff(a,b,c,d,x,s,t){return jj((b&c)|((~b)&d),a,b,x,s,t);}
function gg(a,b,c,d,x,s,t){return jj((b&d)|(c&(~d)),a,b,x,s,t);}
function hh(a,b,c,d,x,s,t){return jj(b^c^d,a,b,x,s,t);}
function ii(a,b,c,d,x,s,t){return jj(c^(b|(~d)),a,b,x,s,t);}

function sa(x, y)
{var L=(x & 0xFFFF)+(y & 0xFFFF);
var m=(x>>16)+(y>>16)+(L>>16);
return (m<<16)|(L & 0xFFFF);}

function str2binl(s)
{var b=Array();
var m=(1<<chrsz)-1;
for(var i=0;i<s.length*chrsz;i+=chrsz)b[i>>5] |= (s.charCodeAt(i/chrsz) & m)<<(i%32);
return b;}

function binl2hex(b)
{var h=hexcase?"0123456789ABCDEF":"0123456789abcdef";
var str="";
for(var i=0;i<b.length*4;i++)str+=h.charAt((b[i>>2]>>((i%4)*8+4)) & 0xF)+h.charAt((b[i>>2]>>((i%4)*8)) & 0xF);
return str;}
