function HtmlDecode(s)
{
	var r = "";
	var re = /&(#x?)?([a-z0-9]+?);/gi;
	var md;
	var lastIndex = 0;
	while (md = re.exec(s)) {
		r += s.substring(lastIndex, md.index);
		lastIndex = md.index + md[0].length;
		
		if (md[1] && md[1] == '#') {
			r += String.fromCharCode(eval(md[2]));
		}
		else if (md[1] && md[1].toLowerCase() == '#x') {
			r += String.fromCharCode(eval('0x' + md[2]));
		}
		else if (md[2]) switch (md[2].toLowerCase()) {
			case 'quot': r += String.fromCharCode(0x0022); break;
			case 'amp': r += String.fromCharCode(0x0026); break;
			case 'lt': r += String.fromCharCode(0x003c); break;
			case 'gt': r += String.fromCharCode(0x003e); break;
			case 'nbsp': r += String.fromCharCode(0x00a0); break;
			case 'iexcl': r += String.fromCharCode(0x00a1); break;
			case 'cent': r += String.fromCharCode(0x00a2); break;
			case 'pound': r += String.fromCharCode(0x00a3); break;
			case 'curren': r += String.fromCharCode(0x00a4); break;
			case 'yen': r += String.fromCharCode(0x00a5); break;
			case 'brvbar': r += String.fromCharCode(0x00a6); break;
			case 'sect': r += String.fromCharCode(0x00a7); break;
			case 'uml': r += String.fromCharCode(0x00a8); break;
			case 'copy': r += String.fromCharCode(0x00a9); break;
			case 'ordf': r += String.fromCharCode(0x00aa); break;
			case 'laquo': r += String.fromCharCode(0x00ab); break;
			case 'not': r += String.fromCharCode(0x00ac); break;
			case 'shy': r += String.fromCharCode(0x00ad); break;
			case 'reg': r += String.fromCharCode(0x00ae); break;
			case 'macr': r += String.fromCharCode(0x00af); break;
			case 'deg': r += String.fromCharCode(0x00b0); break;
			case 'plusmn': r += String.fromCharCode(0x00b1); break;
			case 'sup2': r += String.fromCharCode(0x00b2); break;
			case 'sup3': r += String.fromCharCode(0x00b3); break;
			case 'acute': r += String.fromCharCode(0x00b4); break;
			case 'micro': r += String.fromCharCode(0x00b5); break;
			case 'para': r += String.fromCharCode(0x00b6); break;
			case 'middot': r += String.fromCharCode(0x00b7); break;
			case 'cedil': r += String.fromCharCode(0x00b8); break;
			case 'sup1': r += String.fromCharCode(0x00b9); break;
			case 'ordm': r += String.fromCharCode(0x00ba); break;
			case 'raquo': r += String.fromCharCode(0x00bb); break;
			case 'frac14': r += String.fromCharCode(0x00bc); break;
			case 'frac12': r += String.fromCharCode(0x00bd); break;
			case 'frac34': r += String.fromCharCode(0x00be); break;
			case 'iquest': r += String.fromCharCode(0x00bf); break;
			case 'Agrave': r += String.fromCharCode(0x00c0); break;
			case 'Aacute': r += String.fromCharCode(0x00c1); break;
			case 'Acirc': r += String.fromCharCode(0x00c2); break;
			case 'Atilde': r += String.fromCharCode(0x00c3); break;
			case 'Auml': r += String.fromCharCode(0x00c4); break;
			case 'Aring': r += String.fromCharCode(0x00c5); break;
			case 'AElig': r += String.fromCharCode(0x00c6); break;
			case 'Ccedil': r += String.fromCharCode(0x00c7); break;
			case 'Egrave': r += String.fromCharCode(0x00c8); break;
			case 'Eacute': r += String.fromCharCode(0x00c9); break;
			case 'Ecirc': r += String.fromCharCode(0x00ca); break;
			case 'Euml': r += String.fromCharCode(0x00cb); break;
			case 'Igrave': r += String.fromCharCode(0x00cc); break;
			case 'Iacute': r += String.fromCharCode(0x00cd); break;
			case 'Icirc': r += String.fromCharCode(0x00ce); break;
			case 'Iuml': r += String.fromCharCode(0x00cf); break;
			case 'ETH': r += String.fromCharCode(0x00d0); break;
			case 'Ntilde': r += String.fromCharCode(0x00d1); break;
			case 'Ograve': r += String.fromCharCode(0x00d2); break;
			case 'Oacute': r += String.fromCharCode(0x00d3); break;
			case 'Ocirc': r += String.fromCharCode(0x00d4); break;
			case 'Otilde': r += String.fromCharCode(0x00d5); break;
			case 'Ouml': r += String.fromCharCode(0x00d6); break;
			case 'times': r += String.fromCharCode(0x00d7); break;
			case 'Oslash': r += String.fromCharCode(0x00d8); break;
			case 'Ugrave': r += String.fromCharCode(0x00d9); break;
			case 'Uacute': r += String.fromCharCode(0x00da); break;
			case 'Ucirc': r += String.fromCharCode(0x00db); break;
			case 'Uuml': r += String.fromCharCode(0x00dc); break;
			case 'Yacute': r += String.fromCharCode(0x00dd); break;
			case 'THORN': r += String.fromCharCode(0x00de); break;
			case 'szlig': r += String.fromCharCode(0x00df); break;
			case 'agrave': r += String.fromCharCode(0x00e0); break;
			case 'aacute': r += String.fromCharCode(0x00e1); break;
			case 'acirc': r += String.fromCharCode(0x00e2); break;
			case 'atilde': r += String.fromCharCode(0x00e3); break;
			case 'auml': r += String.fromCharCode(0x00e4); break;
			case 'aring': r += String.fromCharCode(0x00e5); break;
			case 'aelig': r += String.fromCharCode(0x00e6); break;
			case 'ccedil': r += String.fromCharCode(0x00e7); break;
			case 'egrave': r += String.fromCharCode(0x00e8); break;
			case 'eacute': r += String.fromCharCode(0x00e9); break;
			case 'ecirc': r += String.fromCharCode(0x00ea); break;
			case 'euml': r += String.fromCharCode(0x00eb); break;
			case 'igrave': r += String.fromCharCode(0x00ec); break;
			case 'iacute': r += String.fromCharCode(0x00ed); break;
			case 'icirc': r += String.fromCharCode(0x00ee); break;
			case 'iuml': r += String.fromCharCode(0x00ef); break;
			case 'eth': r += String.fromCharCode(0x00f0); break;
			case 'ntilde': r += String.fromCharCode(0x00f1); break;
			case 'ograve': r += String.fromCharCode(0x00f2); break;
			case 'oacute': r += String.fromCharCode(0x00f3); break;
			case 'ocirc': r += String.fromCharCode(0x00f4); break;
			case 'otilde': r += String.fromCharCode(0x00f5); break;
			case 'ouml': r += String.fromCharCode(0x00f6); break;
			case 'divide': r += String.fromCharCode(0x00f7); break;
			case 'oslash': r += String.fromCharCode(0x00f8); break;
			case 'ugrave': r += String.fromCharCode(0x00f9); break;
			case 'uacute': r += String.fromCharCode(0x00fa); break;
			case 'ucirc': r += String.fromCharCode(0x00fb); break;
			case 'uuml': r += String.fromCharCode(0x00fc); break;
			case 'yacute': r += String.fromCharCode(0x00fd); break;
			case 'thorn': r += String.fromCharCode(0x00fe); break;
			case 'yuml': r += String.fromCharCode(0x00ff); break;
			case 'OElig': r += String.fromCharCode(0x0152); break;
			case 'oelig': r += String.fromCharCode(0x0153); break;
			case 'Scaron': r += String.fromCharCode(0x0160); break;
			case 'scaron': r += String.fromCharCode(0x0161); break;
			case 'Yuml': r += String.fromCharCode(0x0178); break;
			case 'fnof': r += String.fromCharCode(0x0192); break;
			case 'circ': r += String.fromCharCode(0x02c6); break;
			case 'tilde': r += String.fromCharCode(0x02dc); break;
			case 'Alpha': r += String.fromCharCode(0x0391); break;
			case 'Beta': r += String.fromCharCode(0x0392); break;
			case 'Gamma': r += String.fromCharCode(0x0393); break;
			case 'Delta': r += String.fromCharCode(0x0394); break;
			case 'Epsilon': r += String.fromCharCode(0x0395); break;
			case 'Zeta': r += String.fromCharCode(0x0396); break;
			case 'Eta': r += String.fromCharCode(0x0397); break;
			case 'Theta': r += String.fromCharCode(0x0398); break;
			case 'Iota': r += String.fromCharCode(0x0399); break;
			case 'Kappa': r += String.fromCharCode(0x039a); break;
			case 'Lambda': r += String.fromCharCode(0x039b); break;
			case 'Mu': r += String.fromCharCode(0x039c); break;
			case 'Nu': r += String.fromCharCode(0x039d); break;
			case 'Xi': r += String.fromCharCode(0x039e); break;
			case 'Omicron': r += String.fromCharCode(0x039f); break;
			case 'Pi': r += String.fromCharCode(0x03a0); break;
			case 'Rho': r += String.fromCharCode(0x03a1); break;
			case 'Sigma': r += String.fromCharCode(0x03a3); break;
			case 'Tau': r += String.fromCharCode(0x03a4); break;
			case 'Upsilon': r += String.fromCharCode(0x03a5); break;
			case 'Phi': r += String.fromCharCode(0x03a6); break;
			case 'Chi': r += String.fromCharCode(0x03a7); break;
			case 'Psi': r += String.fromCharCode(0x03a8); break;
			case 'Omega': r += String.fromCharCode(0x03a9); break;
			case 'alpha': r += String.fromCharCode(0x03b1); break;
			case 'beta': r += String.fromCharCode(0x03b2); break;
			case 'gamma': r += String.fromCharCode(0x03b3); break;
			case 'delta': r += String.fromCharCode(0x03b4); break;
			case 'epsilon': r += String.fromCharCode(0x03b5); break;
			case 'zeta': r += String.fromCharCode(0x03b6); break;
			case 'eta': r += String.fromCharCode(0x03b7); break;
			case 'theta': r += String.fromCharCode(0x03b8); break;
			case 'iota': r += String.fromCharCode(0x03b9); break;
			case 'kappa': r += String.fromCharCode(0x03ba); break;
			case 'lambda': r += String.fromCharCode(0x03bb); break;
			case 'mu': r += String.fromCharCode(0x03bc); break;
			case 'nu': r += String.fromCharCode(0x03bd); break;
			case 'xi': r += String.fromCharCode(0x03be); break;
			case 'omicron': r += String.fromCharCode(0x03bf); break;
			case 'pi': r += String.fromCharCode(0x03c0); break;
			case 'rho': r += String.fromCharCode(0x03c1); break;
			case 'sigmaf': r += String.fromCharCode(0x03c2); break;
			case 'sigma': r += String.fromCharCode(0x03c3); break;
			case 'tau': r += String.fromCharCode(0x03c4); break;
			case 'upsilon': r += String.fromCharCode(0x03c5); break;
			case 'phi': r += String.fromCharCode(0x03c6); break;
			case 'chi': r += String.fromCharCode(0x03c7); break;
			case 'psi': r += String.fromCharCode(0x03c8); break;
			case 'omega': r += String.fromCharCode(0x03c9); break;
			case 'thetasym': r += String.fromCharCode(0x03d1); break;
			case 'upsih': r += String.fromCharCode(0x03d2); break;
			case 'piv': r += String.fromCharCode(0x03d6); break;
			case 'ensp': r += String.fromCharCode(0x2002); break;
			case 'emsp': r += String.fromCharCode(0x2003); break;
			case 'thinsp': r += String.fromCharCode(0x2009); break;
			case 'zwnj': r += String.fromCharCode(0x200c); break;
			case 'zwj': r += String.fromCharCode(0x200d); break;
			case 'lrm': r += String.fromCharCode(0x200e); break;
			case 'rlm': r += String.fromCharCode(0x200f); break;
			case 'ndash': r += String.fromCharCode(0x2013); break;
			case 'mdash': r += String.fromCharCode(0x2014); break;
			case 'lsquo': r += String.fromCharCode(0x2018); break;
			case 'rsquo': r += String.fromCharCode(0x2019); break;
			case 'sbquo': r += String.fromCharCode(0x201a); break;
			case 'ldquo': r += String.fromCharCode(0x201c); break;
			case 'rdquo': r += String.fromCharCode(0x201d); break;
			case 'bdquo': r += String.fromCharCode(0x201e); break;
			case 'dagger': r += String.fromCharCode(0x2020); break;
			case 'Dagger': r += String.fromCharCode(0x2021); break;
			case 'bull': r += String.fromCharCode(0x2022); break;
			case 'hellip': r += String.fromCharCode(0x2026); break;
			case 'permil': r += String.fromCharCode(0x2030); break;
			case 'prime': r += String.fromCharCode(0x2032); break;
			case 'Prime': r += String.fromCharCode(0x2033); break;
			case 'lsaquo': r += String.fromCharCode(0x2039); break;
			case 'rsaquo': r += String.fromCharCode(0x203a); break;
			case 'oline': r += String.fromCharCode(0x203e); break;
			case 'frasl': r += String.fromCharCode(0x2044); break;
			case 'euro': r += String.fromCharCode(0x20ac); break;
			case 'image': r += String.fromCharCode(0x2111); break;
			case 'weierp': r += String.fromCharCode(0x2118); break;
			case 'real': r += String.fromCharCode(0x211c); break;
			case 'trade': r += String.fromCharCode(0x2122); break;
			case 'alefsym': r += String.fromCharCode(0x2135); break;
			case 'larr': r += String.fromCharCode(0x2190); break;
			case 'uarr': r += String.fromCharCode(0x2191); break;
			case 'rarr': r += String.fromCharCode(0x2192); break;
			case 'darr': r += String.fromCharCode(0x2193); break;
			case 'harr': r += String.fromCharCode(0x2194); break;
			case 'crarr': r += String.fromCharCode(0x21b5); break;
			case 'lArr': r += String.fromCharCode(0x21d0); break;
			case 'uArr': r += String.fromCharCode(0x21d1); break;
			case 'rArr': r += String.fromCharCode(0x21d2); break;
			case 'dArr': r += String.fromCharCode(0x21d3); break;
			case 'hArr': r += String.fromCharCode(0x21d4); break;
			case 'forall': r += String.fromCharCode(0x2200); break;
			case 'part': r += String.fromCharCode(0x2202); break;
			case 'exist': r += String.fromCharCode(0x2203); break;
			case 'empty': r += String.fromCharCode(0x2205); break;
			case 'nabla': r += String.fromCharCode(0x2207); break;
			case 'isin': r += String.fromCharCode(0x2208); break;
			case 'notin': r += String.fromCharCode(0x2209); break;
			case 'ni': r += String.fromCharCode(0x220b); break;
			case 'prod': r += String.fromCharCode(0x220f); break;
			case 'sum': r += String.fromCharCode(0x2211); break;
			case 'minus': r += String.fromCharCode(0x2212); break;
			case 'lowast': r += String.fromCharCode(0x2217); break;
			case 'radic': r += String.fromCharCode(0x221a); break;
			case 'prop': r += String.fromCharCode(0x221d); break;
			case 'infin': r += String.fromCharCode(0x221e); break;
			case 'ang': r += String.fromCharCode(0x2220); break;
			case 'and': r += String.fromCharCode(0x2227); break;
			case 'or': r += String.fromCharCode(0x2228); break;
			case 'cap': r += String.fromCharCode(0x2229); break;
			case 'cup': r += String.fromCharCode(0x222a); break;
			case 'int': r += String.fromCharCode(0x222b); break;
			case 'there4': r += String.fromCharCode(0x2234); break;
			case 'sim': r += String.fromCharCode(0x223c); break;
			case 'cong': r += String.fromCharCode(0x2245); break;
			case 'asymp': r += String.fromCharCode(0x2248); break;
			case 'ne': r += String.fromCharCode(0x2260); break;
			case 'equiv': r += String.fromCharCode(0x2261); break;
			case 'le': r += String.fromCharCode(0x2264); break;
			case 'ge': r += String.fromCharCode(0x2265); break;
			case 'sub': r += String.fromCharCode(0x2282); break;
			case 'sup': r += String.fromCharCode(0x2283); break;
			case 'nsub': r += String.fromCharCode(0x2284); break;
			case 'sube': r += String.fromCharCode(0x2286); break;
			case 'supe': r += String.fromCharCode(0x2287); break;
			case 'oplus': r += String.fromCharCode(0x2295); break;
			case 'otimes': r += String.fromCharCode(0x2297); break;
			case 'perp': r += String.fromCharCode(0x22a5); break;
			case 'sdot': r += String.fromCharCode(0x22c5); break;
			case 'lceil': r += String.fromCharCode(0x2308); break;
			case 'rceil': r += String.fromCharCode(0x2309); break;
			case 'lfloor': r += String.fromCharCode(0x230a); break;
			case 'rfloor': r += String.fromCharCode(0x230b); break;
			case 'lang': r += String.fromCharCode(0x2329); break;
			case 'rang': r += String.fromCharCode(0x232a); break;
			case 'loz': r += String.fromCharCode(0x25ca); break;
			case 'spades': r += String.fromCharCode(0x2660); break;
			case 'clubs': r += String.fromCharCode(0x2663); break;
			case 'hearts': r += String.fromCharCode(0x2665); break;
			case 'diams': r += String.fromCharCode(0x2666); break;
		}
	}
	return r + s.substring(lastIndex, s.length);;
}