/*
 * Hackvertor
 * Legal bit:
 * Do not remove this notice.
 * Copyright (c) 2007 by Gareth Heyes
 *  
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the license.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.   
*/

// <![CDATA[
if(!btoa) {	
	
	function btoa(s) {
	   var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
	   // the result/encrypted string, the padding string, and the pad count
	   var r = ""; var p = ""; var c = s.length % 3;
	 
	   // add a right zero pad to make this string a multiple of 3 characters
	   if (c > 0) { for (; c < 3; c++) { p += '='; s += "\0"; } }
	 
	   // increment over the length of the string, three characters at a time
	   for (c = 0; c < s.length; c += 3) {
	 
		 // we add newlines after every 76 output characters, according to the MIME specs
		 if (c > 0 && (c / 3 * 4) % 76 == 0) { r += "\r\n"; }
	 
		 // these three 8-bit (ASCII) characters become one 24-bit number
		 var n = (s.charCodeAt(c) << 16) + (s.charCodeAt(c+1) << 8) + s.charCodeAt(c+2);
	 
		 // this 24-bit number gets separated into four 6-bit numbers
		 n = [(n >>> 18) & 63, (n >>> 12) & 63, (n >>> 6) & 63, n & 63];
	 
		 // those four 6-bit numbers are used as indices into the base64 character list
		 r += base64chars[n[0]] + base64chars[n[1]] + base64chars[n[2]] + base64chars[n[3]];
	   }
	 
	   // add the actual padding string, after removing the zero pad
	   return r.substring(0, r.length - p.length) + p;
	 }
	function atob(s) {
	   var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');	
	   var base64inv = {}; for (var i = 0; i < base64chars.length; i++) { base64inv[base64chars[i]] = i; }	   
	   // replace any incoming padding with a zero pad (the 'A' character is zero)
	   var p = (s.charAt(s.length-1) == '=' ? (s.charAt(s.length-2) == '='
		? 'AA' : 'A') : ""); var r = ""; s = s.substr(0, s.length - p.length) + p;
	   // remove/ignore any characters not in the base64 characters list -- particularly newlines
	   s = s.replace(new RegExp('[^'+base64chars.join("")+']', 'g'), "");	 
	   // increment over the length of this encrypted string, four characters at a time
	   for (var c = 0; c < s.length; c += 4) {
	 
		 // each of these four characters represents a 6-bit index in the base64 characters list
		 //  which, when concatenated, will give the 24-bit number for the original 3 characters
		 var n = (base64inv[s.charAt(c)] << 18) + base64inv[s.charAt(c+3)] +
		  (base64inv[s.charAt(c+1)] << 12) + (base64inv[s.charAt(c+2)] << 6);
	 
		 // split the 24-bit number into the original three 8-bit (ASCII) characters
		 r += String.fromCharCode((n >>> 16) & 255, (n >>> 8) & 255, n & 255);
	   }
	   // remove any zero pad that was added to make this a multiple of 24 bits
	   return r.substring(0, r.length - p.length);
	 }	 
}
var tagNumber = 0;
var realTime = 0;
var jsBuiltInProps = ['Attr','BehaviorUrnsCollection','BookmarkCollection','CompatibleInfo','CompatibleInfoCollection','ControlRangeCollection','CSSCurrentStyleDeclaration','CSSRuleList','CSSRuleStyleDeclaration','CSSStyleDeclaration','CSSStyleRule','CSSStyleSheet','DataTransfer','DOMImplementation','Element','Event','History','HTCElementBehaviorDefaults','HTMLAnchorElement','HTMLAreaElement','HTMLAreasCollection','HTMLBaseElement','HTMLBaseFontElement','HTMLBGSoundElement','HTMLBlockElement','HTMLBodyElement','HTMLBRElement','HTMLButtonElement','HTMLCollection','HTMLCommentElement','HTMLDDElement','HTMLDivElement','HTMLDListElement','HTMLDocument','HTMLDTElement','HTMLEmbedElement','HTMLFieldSetElement','HTMLFontElement','HTMLFormElement','HTMLFrameElement','HTMLFrameSetElement','HTMLGenericElement','HTMLHeadElement','HTMLHeadingElement','HTMLHRElement','HTMLHtmlElement','HTMLIFrameElement','HTMLImageElement','HTMLInputElement','HTMLIsIndexElement','HTMLLabelElement','HTMLLegendElement','HTMLLIElement','HTMLLinkElement','HTMLMapElement','HTMLMarqueeElement','HTMLMetaElement','HTMLModelessDialog','HTMLNamespaceInfo','HTMLNamespaceInfoCollection','HTMLNextIdElement','HTMLNoShowElement','HTMLObjectElement','HTMLOListElement','HTMLOptionElement','HTMLParagraphElement','HTMLParamElement','HTMLPhraseElement','HTMLPluginsCollection','HTMLPopup','HTMLScriptElement','HTMLSelectElement','HTMLSpanElement','HTMLStyleElement','HTMLTableCaptionElement','HTMLTableCellElement','HTMLTableColElement','HTMLTableElement','HTMLTableRowElement','HTMLTableSectionElement','HTMLTextAreaElement','HTMLTextElement','HTMLTitleElement','HTMLUListElement','HTMLUnknownElement','Image','Location','NamedNodeMap','Navigator','NodeList','Option','Screen','Selection','StaticNodeList','Storage','StyleSheetList','StyleSheetPage','StyleSheetPageList','Text','TextRange','TextRangeCollection','TextRectangle','TextRectangleList','Window','XDomainRequest','defineProperty','getOwnPropertyDescriptor','documentElement','contentDocument','contentWindow','defaultView','width','updateInterval','pixelDepth','logicalYDPI','logicalXDPI','height','fontSmoothingEnabled','deviceYDPI','deviceXDPI','colorDepth','bufferDepth','availWidth','availHeight','forward','go','back','statusText','status','responseXML','responseText','readyState','onreadystatechange','setRequestHeader','send','getResponseHeader','getAllResponseHeaders','abort','GetObject','ScriptEngineMinorVersion','ScriptEngineMajorVersion','ScriptEngineBuildVersion','ScriptEngine','getPrototypeOf','stack','lineNumber','fileName','reduceRight','reduce','some','map','every','forEach','filter','trimRight','trimLeft','trim','toLocaleUpperCase','toLocaleLowerCase','quote','localeCompare','arity','callee','caller','length','constructor','prototype','valueOf','toString','toLocaleString','toSource','toJSON','arguments',							 'call','propertyIsEnumerable','isPrototypeOf','hasOwnProperty','parent','__parent__','__proto__','__defineSetter','__defineGetter__','__count__','__iterator__','__noSuchMethod__','__lookupGetter__','__lookupSetter__','__caller__',				     		 'watch','unwatch','onpropertychange','dimensions','getItem','lbound','toArray','ubound','global','ignoreCase','multiline',	'source','compile','exec','test','$*','$&','$+','$*','$`','$\'','$','$1','$2','$3','$4','$5','$6','$7','$8','$9','index','input','lastIndex','lastMatch','lastParen','leftContext','rightContext',							 'MAX_VALUE','MIN_VALUE','NaN','NEGATIVE_INFINITY','POSITIVE_INFINITY','toExponential','toFixed','toPrecision','abs','acos','asin',							 'atan','atan2','ceil','cos','exp','floor','log','max','min','pow','random','round','sin','sqrt','tan','E','LN2','LN10','LOG2E',							 'LOG10E','PI','SQRT1_2','SQRT2','stringify','parse','Infinity','undefined','decodeURI','decodeURIComponent','encodeURI','encodeURIComponent',							 'escape','eval','isFinite','isNaN','parseFloat','parseInt','unescape','apply','description','message','name','number','atEnd','item',							 'moveFirst','moveNext','write','writeln','getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes','getMonth','getSeconds','getTime',							 'getTimezoneOffset','getUTCDate','getUTCDay','getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth','getUTCSeconds','getVarDate',							 'getYear','setDate','setFullYear','setHours','setMilliseconds','setMinutes','setMonth','setSeconds','setTime','setUTCDate','setUTCFullYear','setUTCHours',							 'setUTCMilliseconds','setUTCMinutes','setUTCMonth','setUTCSeconds','setYear','toDateString','toGMTString','toLocaleDateString','toLocaleTimeString',							 'toTimeString','toUTCString','UTC','concat','join','pop','push','reverse','shift','slice','sort','splice','unshift','anchor','big','blink','bold','charAt',							 'charCodeAt','fixed','fontcolor','fontsize','fromCharCode','indexOf','italics','lastIndexOf','link','match','replace','search',					 		 'small','split','strike','sub','substr','substring','sup','toLowerCase','toUpperCase','all','anchors','applets','areas','attributes','behaviorUrns','blockFormats','boundElements','cells','childNodes','children','controlRange','elements','embeds','filters','fonts','forms','frames','images','imports','links','mimeTypes','namespaces','options','pages','plugins','rows','rules','scripts','styleSheets','tBodies','add','addBehavior','AddChannel','AddDesktopComponent','addElement','AddFavorite','addImport','addPageRule','addReadRequest','addRule','alert','appendChild','appendData','applyElement','assign','atan','attachEvent','AutoCompleteSaveForm','AutoScan','blur','charCodeAt','ChooseColorDlg','clear','clearAttributes','clearData','clearInterval','clearRequest','clearTimeout','click','cloneNode','close','collapse','compareEndPoints','componentFromPoint','confirm','contains','createAttribute','createCaption','createComment','createControlRange','createDocumentFragment','createElement','createEventObject','createPopup','createRange','createStyleSheet','createTextNode','createTextRange','createTFoot','createTHead','deleteCaption','deleteCell','deleteData','deleteRow','deleteTFoot','deleteTHead','detachEvent','doImport','doReadRequest','doScroll','dragDrop','duplicate','elementFromPoint','empty','escape','execCommand','execScript','findText','fireEvent','firstPage','focus','fontColor','fontSize','getAdjacentText','getAttribute','getAttributeNode','getBookmark','getCharset','getClientRects','getData','getElementById','getElementsByName','getElementsByTagName','getExpression','getNamedItem','getTimezoneOffset','getYear','hasChildNodes','hasFocus','hide','ImportExportFavorites','inRange','insertAdjacentElement','insertAdjacentText','insertBefore','insertCell','insertData','insertRow','isEqual','IsSubscribed','javaEnabled','lastPage','mergeAttributes','move','moveBy','moveEnd','moveRow','moveStart','moveTo','moveToBookmark','moveToElementText','moveToPoint','namedItem','namedRecordset','navigate','NavigateAndFind','nextPage','normalize','open','parentElement','pasteHTML','previousPage','print','prompt','queryCommandEnabled','queryCommandIndeterm','queryCommandState','queryCommandValue','recalc','refresh','plugin','releaseCapture','remove','removeAttribute','removeAttributeNode','removeBehavior','removeChild','removeExpression','removeNode','removeRule','location','String','replaceChild','replaceData','replaceNode','reset','resizeBy','scroll','scrollBy','scrollIntoView','scrollTo','select','form','control','setActive','setAttributeNode','setCapture','setExpression','setTimeout','setUTCMilliseconds','show','ShowBrowserUI','showHelp','showModalDialog','showModelessDialog','small','splitText','start','stop','submit','substringData','swapNode','tags','taintEnabled','urns','Array','attribute','Boolean','clientInformation','clipboardData','currentStyle','dataTransfer','Date','defaults','Dialog','Helper','document','event','external','history','implementation','Math','mimeType','namespace','navigator','Number','Object','page','popup','rule','runtimeStyle','screen','selection','style','styleSheet','TextNode','TextRange','TextRectangle','userProfile','window','abbr','align','allowTransparency','appMinorVersion','availLeft','BaseHref','borderColor','boundingLeft','cancelBubble','cellSpacing','clientY','code','cols','cookieEnabled','ctrlKey','dataFld','defaultCharset','dialogLeft','doctype','effectAllowed','fgColor','fileUpdatedDate','frameElement','headers','hostname','httpEquiv','isContentEditable','keyCode','lastModified','LOG10E','lowsrc','Methods','noHref','offsetHeight','offsetY','ownerDocument','profile','readOnly','rel','rowIndex','scheme','screenX','scrollHeight','selected','shiftKey','sourceIndex','srcElement','tabStop','text','body','title','trueSpeed','type','textarea','URLUnencoded','vAlign','table','value','viewMasterTab','XMLDocument'].sort();

function HackvertorTags() {
	this.tags = [];
	this.tags['Encode'] 			= 	['reverse_hex','second_nibble_uri','first_nibble_uri','double_nibble_uri','double_uri','malformed_uri','overlong_utf8','xor_range_encode','base999','dec','hex','uni','oct','xor','base36','punycode','base62','base64','hex_ent','dec_ent','uni_hwfw','uni_hwfw_chars','urlenc','realurlenc','enc_uri','enc_uri_comp','htmlent','utf7','utf8','utf16','us_ascii','rot13','rot47','uuencode'].sort();
	this.tags['Decode'] 			= 	['d_reverse_hex','concealed_sequence','xor_range_decode','d_base999','d_javascript','d_string','d_base36','auto_decode','auto_decode_repeat','d_punycode','d_base62','d_base64','d_bin','d_dec','d_hex','d_uni','d_oct','d_enc','d_realenc','d_htmlent','d_utf7','d_utf8','d_utf16','d_us_ascii','d_rot13','d_rot47','uudecode','d_css_esc'].sort();
	this.tags['Compression']		=	['jsmapcompress','jsmapuncompress','paircompress','pairuncompress','jsuncompress30','jscompress30','jsunipack','jsuniuncompress','jsunicompress'].sort();
	this.tags['IP']					=	['ip2dword','ip2oct','ip2hex','dword2ip','oct2ip','hex2ip'].sort();
	this.tags['Code Morphing']		=	['e4x_dec_morph_random','e4x_hex_morph_random','uni_morph_random','hex_morph_random','oct_morph_random','escape_morph_random','charcode_morph_random','variable_morph_random','ternary_morph_random',
							 			 'uni_morph_full','hex_morph_full','oct_morph_full','escape_morph_full','charcode_morph_full','ternary_morph_full','e4x_hex_morph_full','e4x_dec_morph_full'].sort();
	this.tags['Filter Evasion'] 	= 	['backslashesc','backslashnullesc','backslashznullesc','toternary'].sort();
	this.tags['Math'] 				=	['convert_base','arithmetic','increment','decrement','rotate','zerofill','range','dec2bin','bin2dec','hex2rgb','rgb2hex','dec2hex','dec2oct','hex2dec','oct2dec'].sort();
	this.tags['String'] 			= 	['frequency','to_chr_num','from_chr_num','extract','str_insert','rand_lexicon','lang_trans','unique','arrayify','charfill','sort','trans','javachar','tocharcodes','fromcharcodes','dquote','squote','bticks','stripnewlines','ucfirst',
						    			 'upper','lower','mixed','find','replace','splitjoin','splitjointag','repeat','reverse','slength','substr'].sort();
	this.tags['Script'] 			= 	['htmlize','jsvariable','javascriptlish','js2str','tosource','jstest'].sort();
	this.tags['Fuzzing'] 			= 	['randchars','randnum','randletters','randletternums','nullents','nullchars','nullnamedents'].sort();	
	this.tags['Hashing'] 			= 	['skein512','md4','md5','sha1','sha2','hmac_md4','hmac_md5','hmac_sha1'].sort();
	this.tags['Common Inputs'] 		= 	['c_rtl_off','c_rtl_on','c_ltr_off','c_ltr_on','c_divstyle','c_js','c_alert','c_script','c_eval','c_link','c_iframe','c_null','c_tab','c_newline','c_maxunicode'].sort();
	this.tags['XSS'] 				= 	['cssexpression','name_gen','location_gen','jsurl_gen','dom_gen','expression_gen','xbl'].sort();
	this.tags['SQL']				= 	['sqlchr','sqlcomment','sqlchar','sqlascii','sqlor','sqlhex'].sort();
	this.tags['Date']				= 	['date2timestamp','timestamp2date'].sort();
	this.tags['Encrypt']			=	['vigenere_enc','vigenere_dec','caesar_enc','morse_enc','caesar_dec','morse_dec'].sort();														 								 								 		
	this.tags['Char Tables'] = chartablesKeys.sort();
	this.tags['Hacker tags'] = ['sirdarckcat','ascetik','hasegawa','sirdarckcat_twitter_enc','sirdarckcat_twitter_de'].sort();
	
	this.buildSelectMenu = function(obj) {
		for(var category in this.tags) {
			var optionObj = document.createElement('option');
			if(category == 'Encode') {
				optionObj.selected = 'selected';
			}
			optionObj.value = this.tags[category].join(',');
			optionObj.appendChild(document.createTextNode(category));
			obj.appendChild(optionObj);
		}
		optionObj = null;
		obj = null;
	}
	this.getCategory = function(category) {
		return this.tags[category];
	}
	this.getCategories = function() {
		var allCategories = [];
		for(var i in this.tags) {
			allCategories.push(i);
		}
		return allCategories;	
	}
	this.getAllTags = function() {		
		var allTags = [];
		for(var i in this.tags) {
			allTags.push(this.tags[i]);
		}
		return allTags;
	}
}
function Hackvertor() {
	var input, prefixes,supportedConversions, options;			
	this.startTag = '<@';
	this.endTag = '>';	  
	this.options = [];
	this.params = [];
	this.supportedConversions = hvtags.getAllTags();
	
	this.setInput = function(input) {
		this.input = input;
	}
	this.execute = function() {
		return this.findMatches();
	}
	this.findMatches = function() {
		var conversions = this.supportedConversions;
		var output = this.input;
		var regexpString;
		var tagOrder = [];
		var re = new RegExp(this.startTag+'[\\w\\d]+(\\([^)]*\\))?\\s\/'+this.endTag + '|' + this.startTag+'\/[\\w\\d]+'+'\\'+this.endTag,'g');
		var matchedTags = output.match(re);
		if(matchedTags != null) {
			for(var i=0;i<matchedTags.length;i++) {				
				matchedTags[i] = matchedTags[i].replace(/\(.+\)\s*/,'');
				tagOrder.push(matchedTags[i].replace(new RegExp('['+this.startTag+this.endTag+'\/]','g'), ''));
			}
			for(var i=0;i<tagOrder.length;i++) {
				regexpString = this.startTag+'('+tagOrder[i]+')(\\(.*\\))?'+this.endTag+'((.|[\r\n])*?)'+this.startTag+'\/('+tagOrder[i]+')'+this.endTag + '|' + this.startTag+'('+tagOrder[i]+')(\\(.*\\))?'+'\\s*\\/'+this.endTag;
				var re = new RegExp(regexpString);
				var matches = '';					    			
				var r = re.exec(output);
				if(r != null) {
					this.resetParams();
					r[1] = !r[1] ? r[6]:r[1];
					var type = r[1].replace(/_[\s\d]+$/,'');
					var actualTagName = r[1];		
					var params = !r[2] ? r[7] : r[2];
					if(params != null) {
						this.setParams(params);
					}
					var code = r[3];
					try {
						if(code === undefined) {
							code = '';
						}												
						matches = this.convert(code, type) + '';
						// Replace dolars hack
						matches = matches.replace(/\$/g,'$$$$');
						regexpString = this.startTag+'('+actualTagName+')(\\(.*\\))?'+this.endTag+'((.|[\r\n])*)'+this.startTag+'\/('+actualTagName+')'+this.endTag+'|'+this.startTag+'('+actualTagName+')(\\(.*\\))?\\s*\/'+this.endTag;												
						output = output.replace(new RegExp(regexpString),matches);						
					} catch(e) {
						if (!realTime) {
							alert('--Error Performing conversion--\n' + e);
						}
						return 'Please check syntax.';
					}
				}
			}
		}
		
		return output;
	}
	this.setParams = function(params) {
		params = params.replace(/^\(|\)$/g,'');
		params = params.replace(/((['])([^']*|\\['])(['])|(["])([^"]*|\\["])(["]))/g, function($0, $1, $2, $3, $4, $5, $6) { 							
			return $5 == '"' ? $6.urlencode() : $3.urlencode(); 
		});
		this.params = params.split(',');
		for(var i in this.params) {
			this.params[i] = unescape(this.params[i]);
		}
	}
	this.resetParams = function() {
		this.params = [];
	}	
	this.getKey = function(keys) {		
		var html = '';		
		if(keys != null) {
			keys = keys.split(',');			
			for(var i=0;i<keys.length;i++) {
				html += '<span class="highlight" onmousedown="hv.addTag(this)">'+keys[i]+'</span> ';
			}		
		} else {		
			for(var i=0;i<this.supportedConversions.length;i++) {
				html += '<span class="highlight" onmousedown="hv.addTag(this)">'+this.supportedConversions[i]+'</span> ';
			}
		}
		return html;
	}				
	this.convert = function(code, tagType) {				
	
		switch(tagType) {
			default:
				var charTable = chartables[tagType];
				if(typeof charTable == 'object') {
					var code = code.getCharacterCodes();
					for(var i=0;i<code.length;i++) {
						var cChar = String.fromCharCode(charTable['p'+code[i]]);
						if(cChar == null) {
							cChar = '';	
						} 
						code[i] = cChar;
					}
					return code.join('');
				} else {
					return code;
				}
			break;
			case "uni_morph_full":
			case "hex_morph_full":	
			case "oct_morph_full":
			case "escape_morph_full":
			case "charcode_morph_full":
			case "ternary_morph_full":
			case "e4x_hex_morph_full":
			case "e4x_dec_morph_full":
				
				switch(tagType) {
					case "uni_morph_full":
						code = "'" + code.tounicode() + "'";
					break;
					case "hex_morph_full":
						code = "'" + code.tohex() + "'";
					break;
					case "oct_morph_full":
						code = "'" + code.tooctal() + "'";
					break;
					case "escape_morph_full":
						code = 'unescape(/' + code.urlencode() + '/.source)';
					break;
					case "charcode_morph_full":
						code = 'String.fromCharCode(' + code.getCharacterCodes() + ')';
					break;
					case "ternary_morph_full":
						code = code.toternary();
					break;
					case "e4x_morph_full":
						code = '<>'+code.tohex_ent(';')+'</>+[]';
					break;
					case "e4x_hex_morph_full":
						code = '<>'+code.tohex_ent(';')+'</>+[]';
					break;
					case "e4x_dec_morph_full":
						code = '<>'+code.todec_ent(';')+'</>+[]';
					break;				
				}				
				return 'eval(' + code + ')';
			break;
			case "uni_morph_random":								
				
				code = code.replace(/([$_a-zA-Z]+)\(/g, function($1, $2) {
						var rand = getRandom(0,$1.length-1);
						$1 = $1.split('');
						$1[rand] = $1[rand].tounicode();
						return $1.join('');
					     });
				
				code = code.replace(/\(([^'"\/]+)\)/g, function($1, $2) {
						var rand = getRandom(0,$1.length-1);
						$1 = $1.split('');
						$1[rand] = $1[rand].tounicode();
						return $1.join('');
					     });
				
				code = code.replace(/(['"\/])([^'"\/]+)(['"\/])/g, function($0, $1, $2, $3) {
						var rand = getRandom(0,$2.length-1);												
						$2= $2.split('');
						
						$2[rand] = $2[rand].tounicode();
						
						return $1 + $2.join('') + $3;
						});				
				
				
				return code;
			break;
			case "oct_morph_random":
			case "hex_morph_random":
			case "escape_morph_random":
			case "charcode_morph_random":
			case "variable_morph_random":
			case "ternary_morph_random":
			case "e4x_hex_morph_random":
			case "e4x_dec_morph_random":				
				
				code = code.replace(/(['"\/])([^'"\/]+)(['"\/])/g, function($0, $1, $2, $3) {
						var rand = getRandom(0,$2.length-1);												
						$2= $2.split('');
						switch(tagType) {
							case 'hex_morph_random':
								$2[rand] = $2[rand].tohex();
								return $1 + $2.join('') + $3;	
							break;
							case 'oct_morph_random':							
								$2[rand] = $2[rand].tooct();
								return $1 + $2.join('') + $3;
							break;
							case "escape_morph_random":
								$2[rand] = $2[rand].urlencode();
								return 'unescape(' + $1 + $2.join('') + $3 + ')';
							break;
							case "charcode_morph_random":
								$2[rand] = $1+'+String.fromCharCode(' + $2[rand].getCharacterCodes() + ')+'+$1;
								return $1 + $2.join('') + $3;
							break;
							case "variable_morph_random":
								$2[rand] = $1+'+\''+$2[rand]+'\'+'+$1;
								return $1 + $2.join('') + $3;
							break;
							case "ternary_morph_random":		
								$2[rand] = $1+'+'+$2[rand].toternary('&&','$,_,xy')+'+'+$1;
								return $1 + $2.join('') + $3;								
							break;
							case "e4x_hex_morph_random":
								$2[rand] = $1+'+<>'+$2[rand].tohex_ent(';')+'</>+'+$1;
								return $1 + $2.join('') + $3;
							break;
							case "e4x_dec_morph_random":
								$2[rand] = $1+'+<>'+$2[rand].todec_ent(';')+'</>+'+$1;
								return $1 + $2.join('') + $3;
							break;						
						}						
						});				
				return code;
			break;			
			case "reverse_hex":
				code = code.split("");
				for(var i=0;i<code.length;i++) {
					code[i] = code[i].charCodeAt(0).toString(16);
				}
				return code.reverse().join("");
			break;
			case "d_reverse_hex":
				var decode = [];
				code.replace(/[0-f][0-f]/gi, function(c) {
					decode.push(String.fromCharCode(parseInt(c,16)));
				});				
				return decode.reverse().join("");			
			break;			
			case "javascriptlish":
				return code.toJavascriptlish();
			break;			
			case "concealed_sequence":
				code = code.split(",");
				var converted = [];
				for(var i=0;i<code.length;i++) {
					if(typeof code[i-1] == 'undefined') {
						continue;
					}				
					converted.push(Math.abs(parseInt(code[i-1])-parseInt(code[i])).toString(16));
				}
				var possibleSequences = [];
				converted = converted.join("");				
				return converted;
			break;
			case "htmlize":
				var regexp = new RegExp(this.params[0]);	
				var html = this.params[1];
				var joinText = this.params[2];									
				code = code.split(new RegExp(regexp));
				for(var i=0;i<code.length;i++) {
					code[i] = html.replace('{text}',code[i].replace(/^[\s]+|[\s]+$/g,''));
				}
				return code.join(joinText);		
			break;
			case "jsvariable":
				var start = parseInt(this.params[0]);
				var end = parseInt(this.params[1]);				
				var validVariables = [];
					for(i=start;i<end;i++) {
						var variableTest = String.fromCharCode(i);		
						try { 
							eval(variableTest); 
						} catch(e) {
							if((e+'').indexOf('is not defined') != -1) {
								validVariables.push(variableTest);
							}
							if(e.description && e.description.indexOf('is undefined') != -1) {
								validVariables.push(variableTest);
							}
							
						}
					}
					return validVariables.join(', ');				
			break;
			case "overlong_utf8":				
				var length = parseInt(this.params[0]);
				var rawchars = this.params[1]=='true';
				
				function overLongUTF8(chr,n,rawchars){//thanks sdc for making a smaller version!
				    if(n<2)return escape(String.fromCharCode(chr));
				    var chars=[String.fromCharCode((0x100-(1<<(8-n)))|((1<<(7-n))-1&&(chr>>(6*(n-1)))))];
				    chr%=n<7?1<<6*(n-1):Math.pow(2,6*(n-1));
				    for(var i=1;i<n;i++){
				        chars.push(String.fromCharCode(0x80|(63&(chr>>6*(n-i-1)))));
				        chr%=n<7?1<<6*(n-i-1):Math.pow(2,6*(n-i-1));
				    }					
				    return rawchars ? chars.join('') : escape(chars.join(''));
				}												
				var output = [];
				code = code.split("");
				for (var i = 0; i < code.length; i++) {
					output.push(overLongUTF8(code[i].charCodeAt(0),length,rawchars));
				}
				return output.join("");
			break;
			case "first_nibble_uri":
				return code.urlencode().replace(/%./g,function(c) {
					return '%' + c.replace(/%/,'').urlencode();
				});				
			break;
			case "second_nibble_uri":
				return code.urlencode().replace(/%../g,function(c) {
					return c.slice(0,2) + c.slice(-1).urlencode();
				});				
			break;
			case "double_nibble_uri":
				return code.urlencode().replace(/%../g,function(c) {
					return '%' + c.replace(/%/,'').urlencode();
				});
			break;
			case "double_uri":
				return code.urlencode().replace(/[%]/g,'%25');
			break;
			case "malformed_uri":
				var length = parseInt(this.params[0]);
				var output = [];
				var fakeHex = {0:'W',1:'X',2:'Y',3:'Z',4:'[',5:'\\',6:']',7:'^','8':'?',9:'@','a':'!','b':'"','c':'#','d':'$','e':'%','f':'&'};				
				code = code.split("");
				for (var i = 0; i < code.length; i++) {
					switch(length) {
						case 1:
							output.push('%');
							var first = code[i].charCodeAt(0).toString(16).zeroFill(2).slice(0,1);
							var second = code[i].charCodeAt(0).toString(16).zeroFill(2).slice(-1);
							if(typeof fakeHex[second] != 'undefined') {
								first = fakeHex[first];
								second = fakeHex[second];
							} else {
								first = fakeHex[first];	
							}													
							output.push(first);
							output.push(second);								
						break;
						case 2:
							var firstChar = (code[i].charCodeAt(0) >> 6 | 0xC0).toString(16).zeroFill(2).split("");							
							var secondChar = (code[i].charCodeAt(0) & 0x3F | 0x80).toString(16).zeroFill(2).split("");							
							output.push('%');
							if(typeof fakeHex[firstChar[0]] != 'undefined') {
								first = fakeHex[firstChar[0]];
							} else {
								first = firstChar[0];
							}																
							if(typeof fakeHex[firstChar[1]] != 'undefined') {
								second = fakeHex[firstChar[1]];
							} else {
								second = firstChar[1];	
							}																
							output.push(first);
							output.push(second);
							output.push('%');
							if(typeof fakeHex[secondChar[0]] != 'undefined') {
								first = fakeHex[secondChar[0]];
							} else {
								first = secondChar[0];
							}																
							if(typeof fakeHex[secondChar[1]] != 'undefined') {
								second = fakeHex[secondChar[1]];
							} else {
								second = secondChar[1];	
							}																
							output.push(first);
							output.push(second);																																								
						break;
					}					
				}
				return output.join("");
			break;
			case "frequency":				
				var splitChar = this.params[0];
				var converted = [];
				var codeStr = code;
				code = code.split(new RegExp(splitChar,'m'));
				for(var i=0;i<code.length;i++) {
					var num = code[i];
					var count = 0;
					for(var j=0;j<code.length;j++) {
						if(code[i] == code[j]) {
							count++;														
						}
					}
					var found = 0;
					var obj = null;
					for(var j =0;j<converted.length;j++) {
						if(code[i] == converted[j].letter) {
							found = 1;
							obj = converted[j];
							break;
						}
					}
					if (!found) {
						converted.push({
							letter: code[i],
							count: count
						});
					}
				}								
				converted = converted.sort(function(a,b){ 
							return a.count<b.count 								   							   							    							    							   
						});
								
				var output = [];
				for(var i = 0;i<converted.length;i++) {
					var data = [];
					for(var j in converted[i]) {
						data.push(j+':'+converted[i][j]);
					}
					output.push(data.join(","));
				}					
				
				output = "Frequences:\n" + output.join("\n");														
				return output;
			break;
			case "to_chr_num":
				var splitChar = this.params[0];
				var chrmap = this.params[1];
				var joinchr = this.params[2];
				if(splitChar == null) {
					return chrmap.indexOf(code)+1;
				} else {
					code = code.split(new RegExp(splitChar,'m'));
					for(var i=0;i<code.length;i++) {
						code[i] = chrmap.indexOf(code[i])+1;
					}
					return code.join(joinChar);
				}
			break;
			case "from_chr_num":
				var splitChar = this.params[0];
				var chrmap = this.params[1];
				var joinchr = this.params[2];
				if(splitChar == null) {
					return code.from_chr_num(chrmap);
				} else {
					code = code.split(splitChar);
					for(var i=0;i<code.length;i++) {
						code[i] = code[i].from_chr_num(chrmap);
					}
					return code.join(joinChar);
				}				
			break;
			case "extract":				
				var pos = parseInt(this.params[0]);
				var length = parseInt(this.params[1]);
				var chr = this.params[2];
				var extract = '';
				for(var i=pos;i<code.length;i+=length) {
					extract += code.substr(i,length);
					if(i + length < code.length) {
						extract += chr;
					}
				}	
				return extract;
			break;
			case "str_insert":
				code = code.split('');
				var converted = '';
				var str = this.params[0] + '';
				var at = parseInt(this.params[1]);
				var pos = parseInt(this.params[2]);				
				for(var i=0;i<code.length;i++) {
					if(i % at == 0) {
						if (pos) {
							code[i] += str;
						} else {
							code[i] = str + code[i];
						}
					}
					converted += code[i];
				}
				return converted;
			break;
			case "rand_lexicon":
				lexicons = {
					a: ['ABANDON', 'ABDOMEN', 'ABDUCTED', 'ABERRATION', 'ABJURED', 'ABLEST', 'ABLUTION', 'ABOLISH', 'ABOMINATED', 'ABORT', 'ABORTIONIST', 'ABOUNDED', 'ABRIDGED', 'ABRUPT', 'ABSORB', 'ABSTENTION', 'ABSTRACT', 'ABUTTED', 'ACCEPT', 'ACCEPTED', 'ACCESSED', 'ACCIDENT', 'ACCLIMATIZATION', 'ACCOMMODATION', 'ACCREDITED', 'ACID', 'ACORN', 'ACOUSTICIAN', 'ACT', 'ACTED', 'ACUTEST', 'AD', 'ADAMANT', 'ADD', 'ADDUCTION', 'ADJOINED', 'ADMIXED', 'ADORN', 'ADULTHOOD', 'ADVOCATED', 'ADZ', 'AERATED', 'AFFORDED', 'AFORESAID', 'AFTERTHOUGHT', 'AGNIZED', 'AGRONOMIST', 'AHEAD', 'AIRED', 'AIRIEST', 'AIRMEN', 'AKRON', 'ALBEIT', 'ALDERMEN', 'ALEVIN', 'ALLAYED', 'ALLEGATION', 'ALLEGED', 'ALLERTON', 'ALSIP', 'ALVIN', 'AMAH', 'AMAZED', 'AMENDED', 'AMERINDIAN', 'AMOEBOID', 'AMPHIPLOID', 'AN', 'ANAPEST', 'ANEROID', 'ANGERED', 'ANGOLAN', 'ANIMATED', 'ANIMATION', 'ANNISTON', 'ANNUALIZED', 'ANODIZATION', 'ANOINT', 'ANTEED', 'ANTICIPATED', 'ANTITOXIN', 'ANTITRUST', 'AORIST', 'APOGEAN', 'APPALLED', 'APPOSED', 'AQUEDUCT', 'ARCH', 'ARGUMENT', 'ARIGHT', 'AROUND', 'ARRAIGN', 'ARROWHEAD', 'ARTICLED', 'ARYAN', 'ASAP', 'ASSASSIN', 'ASSERT', 'ASSERTED', 'ASSESSED', 'ASSEVERATED', 'ASSN', 'ASSUAGED', 'ASSUMPTION', 'ASTEROID', 'ASTOUND', 'AT', 'ATHIRST', 'ATOP', 'ATT', 'ATTENUATED', 'ATTITUDINIZED', 'ATTRACT', 'ATTRIBUTION', 'ATTRITED', 'AUCTION', 'AUDIENT', 'AUDITED', 'AUTOSUGGESTION', 'AVANT', 'AVIARIST', 'AVIATION', 'AVOCATION', 'AVOIDED', 'AVOUCH', 'AVOWED', 'AWED', 'AWKWARD'],
					b: ['BABOONISH', 'BACKDROP', 'BAD', 'BADINAGED', 'BAGGIEST', 'BAH', 'BAIT', 'BALANCED', 'BALLOONIST', 'BAN', 'BANED', 'BANGLADESH', 'BANTERED', 'BARB', 'BARD', 'BAREBACKED', 'BAROGRAPH', 'BARONET', 'BASALT', 'BASEBOARD', 'BASILICAN', 'BASINED', 'BASSOON', 'BATH', 'BATON', 'BATTEMENT', 'BATTEN', 'BATTENED', 'BEACHHEAD', 'BEAMIEST', 'BEATEN', 'BEATIFIED', 'BECKON', 'BECLOUDED', 'BEETLED', 'BEFUDDLEMENT', 'BEGGARED', 'BEGOT', 'BEGUILED', 'BEHOLDEN', 'BEHOOVED', 'BELAYED', 'BELLIGERENT', 'BEMUSEMENT', 'BEN', 'BENEATH', 'BENNINGTON', 'BEQUEATHED', 'BERRIED', 'BERWYN', 'BESEECHED', 'BETAKEN', 'BETH', 'BETTERED', 'BEWITCHMENT', 'BIBBED', 'BIDDEFORD', 'BIFURCATED', 'BIGHEARTED', 'BIKED', 'BILKED', 'BILLET', 'BIPARTITION', 'BIPED', 'BIRTH', 'BISCUIT', 'BISECTION', 'BITCH', 'BITTED', 'BITTEREST', 'BIVOUACKED', 'BLAB', 'BLACKBIRD', 'BLADED', 'BLAH', 'BLAIN', 'BLIND', 'BLINDED', 'BLINDFOLDED', 'BLITHEST', 'BLONDEST', 'BLOODIED', 'BLOODSHOT', 'BLOODSTAIN', 'BLOWOUT', 'BLOWZIEST', 'BLUED', 'BLUEFIELD', 'BLUEPRINT', 'BOB', 'BOLD', 'BOND', 'BONNET', 'BOOBED', 'BOOED', 'BOOKSHOP', 'BOOST', 'BOOT', 'BOOZED', 'BORON', 'BORROWED', 'BORSCHT', 'BOSOMED', 'BOTCH', 'BOUNDED', 'BOUT', 'BOWED', 'BRAGGED', 'BRAN', 'BRASH', 'BRASHEST', 'BRAWN', 'BREAKFAST', 'BREED', 'BRIDLED', 'BRIGHT', 'BROADCASTED', 'BROOD', 'BROODIEST', 'BROOKLYN', 'BROTH', 'BROWN', 'BROWNED', 'BUCKET', 'BUD', 'BUDDHIST', 'BUILDUP', 'BUILT', 'BULKHEAD', 'BULLETIN', 'BULLHEAD', 'BULLISH', 'BULRUSH', 'BUMP', 'BUMPIEST', 'BUN', 'BUNION', 'BURBLED', 'BURIEN', 'BURP', 'BURRED', 'BURT', 'BUSHELED', 'BUSIED', 'BUSSED', 'BUTTERFLIED'],
					c: ['CAB', 'CABARET', 'CABIN', 'CABINET', 'CACHED', 'CAESAREAN', 'CAJOLEMENT', 'CAKED', 'CALMEST', 'CALUMET', 'CANAAN', 'CANDID', 'CANED', 'CANON', 'CAP', 'CAPPED', 'CARD', 'CARET', 'CARNATION', 'CARP', 'CARROLTON', 'CARTLOAD', 'CASEMENTED', 'CATALOGED', 'CATALOGUED', 'CATALYST', 'CATCHWORD', 'CATECHIST', 'CATECHIZED', 'CATENATION', 'CELLIST', 'CEREBRATION', 'CHAINED', 'CHAMP', 'CHAMPAIGN', 'CHAMPION', 'CHANSON', 'CHAPLET', 'CHATTED', 'CHAUFFEURED', 'CHEAP', 'CHEAPENED', 'CHEAPEST', 'CHEAPIST', 'CHECKED', 'CHEVRON', 'CHEWIEST', 'CHICKWEED', 'CHIFFON', 'CHILD', 'CHILDBIRTH', 'CHINTZ', 'CHIRRUP', 'CHISELLED', 'CHLORINATION', 'CHOP', 'CHOPPIEST', 'CHORTLED', 'CHRONOLOGIST', 'CHUNKIEST', 'CHURCHMANSHIP', 'CHURNED', 'CIRCUITED', 'CIT', 'CLACKED', 'CLAMPED', 'CLAP', 'CLEARED', 'CLEAT', 'CLENCH', 'CLERGYMEN', 'CLINCH', 'CLINGIEST', 'CLOSEMOUTHED', 'CLOTHESPIN', 'CLOUDED', 'CLUMPIEST', 'CLUTCH', 'CLUTCHED', 'COAGULATED', 'COALITION', 'COARSEST', 'COAXED', 'COB', 'COBWEB', 'COBWEBBED', 'COFFEEPOT', 'COGNITION', 'COIL-START', 'COITION', 'COLLATERALIZED', 'COLLIMATED', 'COMB', 'COMMANDANT', 'COMMENCED', 'COMMENT', 'COMMISSION', 'COMMITTEEMEN', 'COMMUNION', 'COMPANION', 'COMPENSATED', 'COMPLAISANT', 'COMPLIMENTED', 'COMPOSITION', 'CONCERNMENT', 'CONCERT', 'CONCESSION', 'CONCOCTED', 'CONCUSSION', 'CONDEMNED', 'CONDITIONED', 'CONDUCT', 'CONED', 'CONFECTION', 'CONFIDANT', 'CONFINED', 'CONFLICTION', 'CONFOUNDED', 'CONFUCIAN', 'CONGEALMENT', 'CONGEST', 'CONGESTED', 'CONGRATULATION', 'CONGREGATED', 'CONJOIN', 'CONJURED', 'CONNED', 'CONSECRATION', 'CONSENT', 'CONSOLIDATED', 'CONSTITUTED', 'CONSUMED', 'CONTEMPLATED', 'CONTEST', 'CONTEXT', 'CONTINUATION', 'CONTRIVED', 'CONVOLVED', 'COOKOUT', 'COON', 'COOPERATED', 'COPENHAGEN', 'COPILOT', 'CORDON', 'CORELATED', 'CORINTHIAN', 'CORNISH', 'CORP', 'CORRELATION', 'COSMONAUT', 'COSTUMED', 'COUGH', 'COULDN\'T', 'COUNCILMEN', 'COUNTERFEITED', 'COUNTERMAND', 'COVENANT', 'COVERT', 'COWBIRD', 'COWMAN', 'COZ', 'CP', 'CRAWFISH', 'CREMATION', 'CREPT', 'CRIB', 'CRIMPED', 'CRITERION', 'CROTCH', 'CROWD', 'CRT', 'CRUCIFIED', 'CRUD', 'CRUMPET', 'CRUSHED', 'CT', 'CULT', 'CUMQUAT', 'CUP', 'CURATORSHIP', 'CURBED', 'CURED', 'CUSHIONED', 'CUT', 'CUTEST', 'CYAN', 'CYST', 'CZ'],
					d: ['DAFFIEST', 'DAMN', 'DAMOCLEAN', 'DAMPEN', 'DAN', 'DANDIFICATION', 'DANDIFIED', 'DANISH', 'DANKEST', 'DARTED', 'DARWINIST', 'DAUB', 'DAVIT', 'DAWN', 'DAZZLED', 'DB', 'DEADBEST', 'DEBAUCH', 'DEBAUCHED', 'DECADENT', 'DECAPOD', 'DECEIVED', 'DECOMPRESSED', 'DECOYED', 'DEFERRED', 'DEFIED', 'DEFLATED', 'DEFLECT', 'DEFOREST', 'DEGENERATED', 'DEIST', 'DELTOID', 'DEMANDED', 'DEMOLISHED', 'DEMON', 'DEMONSTRATION', 'DENOMINATION', 'DENT', 'DENTED', 'DEODORANT', 'DEPARTMENT', 'DEPEND', 'DEPICT', 'DEPOLARIZATION', 'DEPORTATION', 'DERELICT', 'DERVISH', 'DESICCATED', 'DESOLATED', 'DESPONDENT', 'DESTINATION', 'DETACHED', 'DETERMINANT', 'DETERRED', 'DETONATION', 'DEVEST', 'DEVESTED', 'DEVOTION', 'DEVOURED', 'DEVOUT', 'DID', 'DILAPIDATION', 'DILATED', 'DILATION', 'DIMMEST', 'DIMOUT', 'DIMWIT', 'DIN', 'DINED', 'DINT', 'DIPLOMAT', 'DIRTIEST', 'DISALLOWED', 'DISASSOCIATION', 'DISCIPLESHIP', 'DISCOMFORT', 'DISENCHANT', 'DISENTANGLEMENT', 'DISFRANCHISED', 'DISFRANCHISEMENT', 'DISGUST', 'DISHEARTENMENT', 'DISINTEREST', 'DISINTERMENT', 'DISMOUNTED', 'DISOBLIGED', 'DISPATCHED', 'DISPUTATION', 'DISRESPECT', 'DISSIPATION', 'DISTAIN', 'DISTRAIN', 'DISTRICTED', 'DIVED', 'DIVVIED', 'DIXIELAND', 'DJ', 'DOBERMAN', 'DOCKETED', 'DOCUMENTATION', 'DODGED', 'DOESN\'T', 'DOGFISH', 'DOGSLED', 'DOLLIED', 'DOLPHIN', 'DOMINATION', 'DON\'T', 'DOORSTEP', 'DOTHAN', 'DOUBTED', 'DOWDIEST', 'DOWNIEST', 'DOWNRIGHT', 'DOWNWARD', 'DOYEN', 'DOZ', 'DOZEN', 'DRAB', 'DRABBED', 'DRAFT', 'DRAFTSMAN', 'DRAMATIST', 'DRAT', 'DRIEST', 'DRIFT', 'DROWSED', 'DRUID', 'DRUNKARD', 'DUB', 'DUCAT', 'DUCKED', 'DUET', 'DUMONT', 'DUMPED', 'DURST', 'DWARFED', 'DWELT', 'DYED', 'DYNAST', 'DYSFUNCTION', 'DZ'],
					e: ['EAGLET', 'EARTH', 'EASED', 'EAST', 'ECLAT', 'ECOLOGIST', 'EDEN', 'EERIEST', 'EFFERENT', 'EFFORT', 'EFT', 'EH', 'EIGHTH', 'EIGHTIETH', 'EJECTION', 'ELAN', 'ELECTROPLATED', 'ELEVATION', 'ELIZABETHAN', 'ELOQUENT', 'EMASCULATION', 'EMBALMED', 'EMBALMMENT', 'EMBOLDENED', 'EMBRACEMENT', 'EMIGRANT', 'EMIT', 'EMITTED', 'EMPATHIZED', 'EMPTIEST', 'ENAMELED', 'ENCODED', 'ENCORED', 'ENCRYPT', 'ENDICOTT', 'ENERGIZED', 'ENFIELD', 'ENGENDERED', 'ENGROSSED', 'ENHANCEMENT', 'ENID', 'ENLIVENMENT', 'ENNOBLED', 'ENROLMENT', 'ENSCONCED', 'ENSHRINED', 'ENTOMB', 'ENTRAP', 'ENTREAT', 'ENTRENCHED', 'ENWIND', 'ENWRAPPED', 'EON', 'EPITOMIZED', 'ERSATZ', 'ESCHEAT', 'ESCROWED', 'EST', 'ETCHED', 'EVACUANT', 'EVALUATED', 'EVANESCENT', 'EVENT', 'EVICT', 'EVICTION', 'EVOLUTION', 'EVOLVEMENT', 'EXCLAIMED', 'EXCLAMATION', 'EXCUSED', 'EXECRATED', 'EXEMPLIFIED', 'EXEMPT', 'EXHILARATED', 'EXHILARATION', 'EXILED', 'EXISTED', 'EXIT', 'EXITED', 'EXPECTORATION', 'EXPENDED', 'EXPIRED', 'EXPLOIT', 'EXPORT', 'EXPORTATION', 'EXPRESSION', 'EXPURGATED', 'EXTERMINATION', 'EXTINCTION', 'EXTOLMENT', 'EXTORT', 'EXTROVERSION', 'EXTRUSION', 'EYEWASH'],
					f: ['FABRICATED', 'FACT', 'FACTIONALIST', 'FAD', 'FAIR-TRADED', 'FAIRYLAND', 'FAITH', 'FAKED', 'FALSIFIED', 'FASCINATED', 'FASTED', 'FASTEST', 'FAUN', 'FEINT', 'FELON', 'FERGUSON', 'FERMAT', 'FERMENTED', 'FERRIED', 'FERVID', 'FETID', 'FETISH', 'FEZ', 'FICKLEST', 'FID', 'FIERIEST', 'FILL-IN', 'FILLIP', 'FINNED', 'FIORD', 'FIREBOAT', 'FIREFIGHT', 'FIREPROOFED', 'FIRMED', 'FISTED', 'FIT', 'FIXED', 'FLAB', 'FLATBED', 'FLATBOAT', 'FLATTED', 'FLATTOP', 'FLESHED', 'FLIED', 'FLIP', 'FLIPPANT', 'FLIT', 'FLITTED', 'FLOCCULENT', 'FLOODLIGHT', 'FLOWERPOT', 'FLOYD', 'FLUID', 'FLUORIDATED', 'FOCALIZATION', 'FOLD', 'FONDANT', 'FOOD', 'FOOTSTEP', 'FORECAST', 'FOREMEN', 'FORESTED', 'FOREWARN', 'FOREWARNED', 'FORFEITED', 'FORMALIZATION', 'FORMAT', 'FORNICATION', 'FORSOOTH', 'FORTIETH', 'FOURFOLD', 'FOXED', 'FRAGMENTED', 'FRANKLIN', 'FRAUGHT', 'FRAYED', 'FRENCHMAN', 'FREON', 'FREQUENT', 'FRESH', 'FRESHEST', 'FRINGIEST', 'FRIZZIEST', 'FROGMAN', 'FROGMEN', 'FRONT', 'FROTHIEST', 'FROWNED', 'FRUCTIFIED', 'FT', 'FUD', 'FUELLED', 'FUN', 'FUNDED', 'FUNNED', 'FUNNELLED', 'FUSSED', 'FUSTIEST'],
					g: ['GAB', 'GADSDEN', 'GALLIVANT', 'GALLOP', 'GALVANIZATION', 'GAMIEST', 'GAMUT', 'GANGED', 'GANGLAND', 'GAP', 'GARAGED', 'GARISH', 'GARMENT', 'GARRET', 'GASIFIED', 'GASP', 'GAUD', 'GAUGED', 'GAUNTEST', 'GELATIN', 'GELD', 'GENT', 'GEORGIAN', 'GERALD', 'GERARD', 'GERRYMANDERED', 'GERUND', 'GET', 'GETUP', 'GHETTOIZED', 'GHZ', 'GIGGED', 'GIGGLED', 'GILBERT', 'GIMP', 'GIN', 'GIRTH', 'GLARED', 'GLEN', 'GLOP', 'GLUT', 'GNAT', 'GNAWN', 'GNP', 'GOAT', 'GOB', 'GOD', 'GONAD', 'GOODHEARTED', 'GORDON', 'GOUT', 'GP', 'GRAD', 'GRAINED', 'GRANDILOQUENT', 'GRANDSON', 'GRAPHED', 'GRAVELED', 'GRAVEN', 'GREAT', 'GREEN', 'GRID', 'GRIDDED', 'GRIND', 'GRISTLIEST', 'GROOVED', 'GROSSEST', 'GROT', 'GROTON', 'GROUPED', 'GROWNUP', 'GRUDGED', 'GUARANTEED', 'GUARD', 'GUARDSMEN', 'GUDGEON', 'GUEST', 'GUIDED', 'GUIDON', 'GUMMIEST', 'GUMPTION', 'GUN', 'GUNMAN', 'GUNSMITH', 'GUTTED'],
					h: ['HACKLED', 'HADN\'T', 'HAGGISH', 'HAH', 'HAIRED', 'HALLOWEEN', 'HALOED', 'HAMMERHEAD', 'HAMPERED', 'HANDGUN', 'HAND-ME-DOWN', 'HANDOUT', 'HANDWOVEN', 'HANDYMEN', 'HARD', 'HARDHEADED', 'HARPSICHORD', 'HART', 'HARTFORD', 'HARVEST', 'HASN\'T', 'HASTED', 'HATBAND', 'HAUNCH', 'HAVERFORD', 'HAWAIIAN', 'HAWKWEED', 'HAYWARD', 'HEARKENED', 'HEART', 'HEARTBURN', 'HEARTEN', 'HEAVENWARD', 'HEBRON', 'HECATOMB', 'HE\'D', 'HEDGED', 'HEFTED', 'HEIGHT', 'HELEN', 'HELLBROTH', 'HELLCAT', 'HELMETED', 'HEMMED', 'HEMOSTAT', 'HENCEFORTH', 'HERBERT', 'HERD', 'HEREIN', 'HICCUP', 'HIGH', 'HIGHEST', 'HIGHHANDED', 'HIGH-PRESSURED', 'HIGHT', 'HILLCREST', 'HILLIEST', 'HIND', 'HINDERED', 'HINDSIGHT', 'HINGED', 'HINT', 'HIT', 'HOARSEN', 'HOB', 'HOCKSHOP', 'HOED', 'HOGSHEAD', 'HOGWASH', 'HOISTED', 'HOLDOUT', 'HOLLAND', 'HOLLOWED', 'HOMEBOUND', 'HOMEGROWN', 'HOMESTRETCH', 'HOMIEST', 'HONEYCOMBED', 'HONIED', 'HOOCH', 'HOP', 'HOPPED', 'HORSED', 'HORTICULTURIST', 'HOTCHPOT', 'HOTHEAD', 'HOUNDED', 'HOUSEBOAT', 'HOUSEBROKEN', 'HT', 'HUDDLED', 'HUFFED', 'HUFFIEST', 'HUGGED', 'HULLED', 'HUMANKIND', 'HUMBLEST', 'HUMPH', 'HUNCHBACKED', 'HUNT', 'HURLED', 'HURRAH', 'HURT', 'HUSH', 'HUSTLED', 'HUTCHINSON', 'HYPED', 'HYPERTROPHIED', 'HYPNOTIST', 'HZ'],
					j: ['JABBED', 'JABOT', 'JACKETED', 'JANGLED', 'JAUNDICED', 'JAUNT', 'JAUNTED', 'JAVELIN', 'JAWED', 'JAZZ', 'JEEP', 'JERKIN', 'JILT', 'JINN', 'JOAN', 'JOCUND', 'JOHNSON', 'JOLT', 'JOSTLED', 'JOYPOP', 'JUDGMENT', 'JUICED', 'JUKED', 'JULIAN', 'JUMP', 'JUNCTION', 'JUT'],
					k: ['KAPH', 'KAPUT', 'KAT', 'KEELBOAT', 'KEELSON', 'KEEN', 'KENTWOOD', 'KENYON', 'KETCH', 'KEYPUNCHED', 'KIBBLED', 'KILOBIT', 'KIN', 'KIND', 'KINDLED', 'KINGBOLT', 'KINGLET', 'KINGPIN', 'KINSHIP', 'KIRKLAND', 'KIT', 'KITED', 'KLATCH', 'KLUDGED', 'KNELT', 'KNISH', 'KNOBBIEST', 'KNOWN', 'KNUCKLEHEADED', 'KOBOLD', 'KOLITSCH', 'KRUGERRAND', 'KUMQUAT', 'KURT'],
					l: ['LAGOON', 'LAID', 'LAIN', 'LAKED', 'LAMBASTED', 'LANDED', 'LASED', 'LASERJET', 'LASHED', 'LATIN', 'LAUREATION', 'LAYTON', 'LEAFIEST', 'LEAFLET', 'LEAPT', 'LEAST', 'LED', 'LEEBOARD', 'LEERED', 'LEEWARD', 'LEGALIZATION', 'LEGGIEST', 'LEGION', 'LEGITIMIZED', 'LEND-LEASED', 'LENGTHIEST', 'LENSED', 'LENTEN', 'LEOTARD', 'LEPRECHAUN', 'LESSEN', 'LEST', 'LET', 'LEV', 'LEVERED', 'LIAISON', 'LIBBED', 'LIBYAN', 'LIED', 'LIEN', 'LIFE-SIZED', 'LIKENED', 'LILT', 'LIMB', 'LIMIT', 'LIMPET', 'LINDENWOLD', 'LINEAMENT', 'LINEMAN', 'LINEN', 'LINEUP', 'LINNAEAN', 'LIONIZED', 'LIPPED', 'LISP', 'LIST', 'LIT', 'LIVID', 'LOBATED', 'LOCATED', 'LOGAN', 'LOLLED', 'LOMBARD', 'LONGED', 'LONGWOOD', 'LORDSHIP', 'LOST', 'LOT', 'LOTION', 'LOUD', 'LOUSIEST', 'LUCKIEST', 'LUGLUGGED', 'LUMBERTON', 'LURID', 'LUST', 'LYNNWOOD'],
					m: ['MAIDENHOOD', 'MAIMED', 'MAJORED', 'MALLARD', 'MANDATED', 'MANIFEST', 'MANSION', 'MARKED', 'MARKET', 'MARMOSET', 'MARRIED', 'MARSH', 'MARSHIEST', 'MASHED', 'MAT', 'MATURATION', 'MAUDLIN', 'MAXIMALIST', 'MAYWOOD', 'MAZED', 'MAZIEST', 'MEADOWSWEET', 'MELIORATED', 'MELTED', 'MENTION', 'MERCHANTMAN', 'MERCURATED', 'MERGED', 'MESHED', 'MESMERIST', 'MESSIAH', 'MESSIEST', 'METED', 'MICHIGAN', 'MICROFILMED', 'MID', 'MIDMOST', 'MIGHT', 'MIGRATION', 'MILBURN', 'MILEPOST', 'MILKMAID', 'MILKMAN', 'MILQUETOAST', 'MILTON', 'MISANTHROPIST', 'MISCEGENATION', 'MISCONDUCT', 'MISCONSTRUED', 'MISCREANT', 'MISDIRECT', 'MISFILED', 'MISGUIDED', 'MISQUOTED', 'MISTRUST', 'MISTYPED', 'MISUSED', 'MOAN', 'MOB', 'MOD', 'MODELED', 'MOIST', 'MOISTEN', 'MOLDED', 'MON', 'MONETIZED', 'MONGOLIAN', 'MONIST', 'MONITION', 'MONITORED', 'MONKEYED', 'MONOVALENT', 'MOOED', 'MOON', 'MOONLIGHT', 'MOONLIGHTED', 'MOP', 'MORTON', 'MOTH', 'MOTTLED', 'MOUNT', 'MOUSIEST', 'MOUTHED', 'MOUTHWASH', 'MOWN', 'MPH', 'MT', 'MULCT', 'MULISH', 'MULLION', 'MULTIMILLION', 'MULTIPLICAND', 'MULTIPRONGED', 'MUNCH', 'MURED', 'MUSHED', 'MUSHIEST', 'MUSTERED', 'MUTANT', 'MYCOLOGIST', 'MYELIN', 'MYOSIN'],
					n: ['NAT', 'NATION', 'NAUGHTIEST', 'NEAP', 'NEAPOLITAN', 'NEED', 'NEGLIGENT', 'NEST', 'NET', 'NEUROLOGIST', 'NIB', 'NIGGARD', 'NIGH', 'NIGHTSHIRT', 'NIMCOMPOOP', 'NOBBIEST', 'NOBBLED', 'NOBELWOMAN', 'NOBLEWOMAN', 'NONACID', 'NONACQUISITION', 'NONCITIZEN', 'NONCONSIDERATION', 'NONDESCRIPT', 'NONFAT', 'NONMEMBERSHIP', 'NONRESISTANT', 'NONSLIP', 'NORMALIZATION', 'NORMAN', 'NOSH', 'NOURISH', 'NOV', 'NOVEMDECILLION', 'NTH', 'NUDIST', 'NUN', 'NURTURED', 'NV'],
					o: ['OARED', 'OBEISANT', 'OBFUSCATED', 'OBJECT', 'OBSCURANTIST', 'OBSOLESCENT', 'OBSTETRICIAN', 'OBTRUSION', 'OCCULT', 'OCCULTATION', 'OCHERED', 'OCTANT', 'OCTET', 'OCTODECILLIONTH', 'OD', 'ODIN', 'OFFERED', 'OFFHAND', 'OFFPRINT', 'OH', 'OILBIRD', 'OLD', 'OLDEST', 'OLDISH', 'OMELET', 'OMIT', 'ON', 'ONRUSH', 'ONSET', 'ONSLAUGHT', 'OPENED', 'OPPRESSED', 'OPTION', 'OPULENT', 'ORBITED', 'ORCHESTRATED', 'ORCHID', 'ORDAINED', 'ORDERED', 'OREGON', 'ORLAND', 'OTHERWORLD', 'OUCH', 'OUST', 'OUT', 'OUTCROP', 'OUTFITTED', 'OUTLAST', 'OUTLASTED', 'OUTPUT', 'OUTSHOUT', 'OUTSIT', 'OUTSMARTED', 'OUTSPEND', 'OVEN', 'OVERCONFIDENT', 'OVERDRIVEN', 'OVERINDULGED', 'OVERMATCHED', 'OVERRAN', 'OVERSKIRT', 'OVERSOFT', 'OVERTRUMP', 'OXEN', 'OXYHEMOGLOBIN'],
					p: ['PACED', 'PACKED', 'PAGED', 'PAGINATED', 'PAIN', 'PAINED', 'PAIRED', 'PALEONTOLOGIST', 'PALLED', 'PALMIST', 'PALTRIEST', 'PAMPHLET', 'PAN', 'PANNED', 'PARATROOP', 'PARCELLED', 'PARCHMENT', 'PARKLAND', 'PARRED', 'PARRIED', 'PARROT', 'PARROTED', 'PARTED', 'PAST', 'PASTELIST', 'PAT', 'PATCH', 'PATIENT', 'PATRON', 'PATRONIZED', 'PAWTUCKET', 'PAYED', 'PAYLOAD', 'PEALED', 'PEANUT', 'PEAT', 'PEBBLED', 'PECTIN', 'PECULATION', 'PEDANT', 'PEDESTALLED', 'PEDIATRIST', 'PEELED', 'PEEN', 'PEERED', 'PEEVED', 'PELLET', 'PELLETED', 'PELT', 'PELTED', 'PENDED', 'PENETRATION', 'PEOPLED', 'PEPPERED', 'PERAMBULATION', 'PERFORMED', 'PERILED', 'PEROXIDED', 'PERSIST', 'PERSON', 'PERSUASION', 'PERVERT', 'PET', 'PETULANT', 'PHONED', 'PHONETICIAN', 'PHYSIOGNOMIST', 'PIGGED', 'PIN', 'PINED', 'PINFISH', 'PINIONED', 'PINKEST', 'PINNACLED', 'PINNED', 'PINPOINTED', 'PIP', 'PISTOLLED', 'PITCHOUT', 'PITH', 'PLAID', 'PLAIT', 'PLANCHET', 'PLANET', 'PLANTAIN', 'PLANTATION', 'PLASTID', 'PLATTED', 'PLAYFIELD', 'PLAYPEN', 'PLOD', 'PLUMB', 'PLURALIZED', 'PLUSH', 'POET', 'POINTED', 'POLAND', 'POLAROID', 'POLLINATION', 'POLYGAMIST', 'POMADED', 'POMP', 'POMPON', 'POMPTON', 'POOCH', 'POP', 'PORIFERAN', 'PORTENT', 'POSED', 'POSIT', 'POSTPAID', 'POSTULATION', 'POTION', 'POTTSTOWN', 'POULTICED', 'POWERED', 'PREDICAMENT', 'PREDICATION', 'PREDISPOSED', 'PREDOMINATED', 'PREEXIST', 'PREEXISTENT', 'PREFECT', 'PREFERRED', 'PREFIGURED', 'PREHEAT', 'PRESERVED', 'PRETTIEST', 'PREVAILED', 'PREVARICATION', 'PREVIEWED', 'PRIED', 'PRIMETEST', 'PRIMMED', 'PROCTOLOGIST', 'PROCURED', 'PROD', 'PROHIBIT', 'PROMOTION', 'PRONOUN', 'PROSED', 'PROSPECT', 'PROSTRATED', 'PROTON', 'PROTRACT', 'PROVOKED', 'PROWLED', 'PT', 'PUBESCENT', 'PULLED', 'PULLMAN', 'PULP', 'PULVERIZED', 'PUMPKIN', 'PUN', 'PUNISH', 'PUNNED', 'PURDAH', 'PURIST', 'PUTOUT', 'PUTT', 'PYTHON'],
					q: ['QED', 'QUIESCENT', 'QUIET', 'QUIETEST', 'QUINTUPLED', 'QUIP', 'QUOIN', 'QUOIT'],
					r: ['RABBET', 'RACIST', 'RADICALIZED', 'RADIOCARBON', 'RADIOLOGIST', 'RADON', 'RAFT', 'RAGGED', 'RAGOUT', 'RAID', 'RAIN', 'RAINSPOUT', 'RAMBLED', 'RAMJET', 'RAMMED', 'RANKED', 'RAPPED', 'RAT', 'RATION', 'RATLIN', 'RATTRAP', 'RAUNCHIEST', 'RAVELMENT', 'RAVISH', 'REACT', 'READIED', 'READOPT', 'READORN', 'REAPPEARED', 'REARMED', 'REARRANGEMENT', 'REATTACH', 'REATTEMPT', 'REBIND', 'REBOUNDED', 'REBUILD', 'REBUTTED', 'RECALCITRANT', 'RECALCULATION', 'RECALLED', 'RECLAIMED', 'RECOIN', 'RECOLORED', 'RECONFIRMATION', 'RECONSIDERATION', 'RECOUNTED', 'RECRUDESCENT', 'RED', 'REDD', 'REDEMANDED', 'REDESCEND', 'REDIRECTION', 'REDOUBLED', 'REDSKIN', 'REED', 'REEDIEST', 'REEKED', 'REENACT', 'REFITTED', 'REFLOURISH', 'REFORMED', 'REFRACTION', 'REFRAIN', 'REFROZEN', 'REFURNISH', 'REFUSED', 'REFUTATION', 'REGENERATED', 'REGIMENT', 'REGIMENTATION', 'REGRANT', 'REGRETTED', 'REHEATED', 'REIMPLANTED', 'REIN', 'REINSERTED', 'REINSTALLED', 'REINVITED', 'RELAPSED', 'RELICT', 'RELIGHT', 'RELOCATION', 'RELUCTATED', 'REMANDED', 'RENT', 'REP', 'REPAINTED', 'REPAIRMAN', 'REPASSED', 'REPLANTATION', 'REPLENISH', 'REPOLISH', 'REPORT', 'REPROACH', 'REPROBATION', 'REPUBLISH', 'REPUTATION', 'REPUTED', 'RERUN', 'RESECTED', 'RESH', 'RESINATED', 'RESONANT', 'RESORTED', 'RESOWED', 'RESPECT', 'RESPECTED', 'RESPIRED', 'RESTART', 'RESTAURANT', 'RESTRICTION', 'RESURGENT', 'RETAIN', 'RETCH', 'RETEST', 'RETOOLED', 'RETRACED', 'RETRIEVED', 'RETURNED', 'REUNIFICATION', 'REV', 'REVALUATION', 'REVAMPED', 'REVELED', 'REVERT', 'REVIVED', 'REVOLT', 'RHEUMATOID', 'RHOMB', 'RHYMED', 'RICHLAND', 'RICHMOND', 'RIDERSHIP', 'RIDGEFIELD', 'RIND', 'RIVED', 'RIVEN', 'RIVETED', 'ROD', 'ROILED', 'ROILIEST', 'RON', 'RONALD', 'ROOKED', 'ROOSTED', 'ROOTED', 'ROUGH', 'ROUGHEN', 'ROUNDEST', 'ROUNDLET', 'ROUTED', 'ROVED', 'ROWELLED', 'RUB', 'RUBICUND', 'RUDIMENT', 'RUDOLPH', 'RUFFED', 'RUGGED', 'RUNAROUND', 'RUNDOWN', 'RUNT', 'RUSHIEST', 'RUSSET', 'RUTH', 'RUTHANN', 'RUTTED'],
					s: ['SACRED', 'SADDEN', 'SAFEGUARD', 'SAGGED', 'SAILED', 'SALAD', 'SALESWOMAN', 'SALT', 'SAMOAN', 'SAN', 'SANDBLAST', 'SANDED', 'SANDWORT', 'SAPPIEST', 'SASH', 'SAT', 'SAUNTERED', 'SAWFISH', 'SAXHORN', 'SB', 'SCABBED', 'SCAFFOLD', 'SCALLION', 'SCALP', 'SCAN', 'SCARFPIN', 'SCATTERED', 'SCHMALTZ', 'SCHMALTZIEST', 'SCHOOLED', 'SCOOP', 'SCOOTED', 'SCORECARD', 'SCOT', 'SCOTSMAN', 'SCRAGGIEST', 'SCRAMMED', 'SCRAPED', 'SCREECHIEST', 'SCREED', 'SCRUBBED', 'SCRUNCH', 'SCULLED', 'SCULPTED', 'SCULPTURED', 'SCUMBLED', 'SCUMMED', 'SCUTCH', 'SD', 'SEABIRD', 'SEALSKIN', 'SECTARIAN', 'SEDATED', 'SEEDED', 'SENSATIONALIST', 'SENTIENT', 'SEQUENCED', 'SERIALIST', 'SERIALIZED', 'SERVICED', 'SESAMOID', 'SET', 'SEVENTY-SIXTH', 'SEXAGENARIAN', 'SEXTANT', 'SEXTILLION', 'SEXTUPLED', 'SHAH', 'SHAN', 'SHAPEUP', 'SHARED', 'SHEEN', 'SHELVED', 'SHIP', 'SHIRTWAIST', 'SHOD', 'SHOED', 'SHOPPED', 'SHORED', 'SHOREFRONT', 'SHORTEN', 'SHORTHAND', 'SHOTTEN', 'SHOVELLED', 'SHOWN', 'SHREWD', 'SHRIVELLED', 'SHUDDERED', 'SHUNNED', 'SHUNT', 'SHUT', 'SIB', 'SIDEBOARD', 'SIDEMAN', 'SIDESPIN', 'SIEGED', 'SIEVED', 'SIGNALMAN', 'SIGNET', 'SIGNPOST', 'SILKEN', 'SILKIEST', 'SILUROID', 'SILVERSMITH', 'SINEWED', 'SIPPED', 'SIRRAH', 'SIZZLED', 'SKEIN', 'SKID', 'SKILLET', 'SKIN', 'SKINTIGHT', 'SKULKED', 'SKYLIGHT', 'SLAGGED', 'SLANDERED', 'SLAVISH', 'SLED', 'SLEDDED', 'SLEEKEN', 'SLENDEREST', 'SLIPKNOT', 'SLIPPED', 'SLITHERED', 'SLOPPIEST', 'SLOT', 'SLOVEN', 'SLUBBED', 'SLUGGED', 'SLUICED', 'SLUMPED', 'SLURP', 'SMART', 'SMEARED', 'SMIDGEN', 'SMILED', 'SMIRCH', 'SMITH', 'SMOKED', 'SMUT', 'SNAP', 'SNATH', 'SNEAKED', 'SNIGGERED', 'SNITCH', 'SNOUT', 'SNUB', 'SOAPED', 'SOAPIEST', 'SOARED', 'SOBERED', 'SOBERIZED', 'SOCIALIZED', 'SOFT', 'SOLARIZATION', 'SOLATION', 'SOLD', 'SOLEMN', 'SOLEMNIZED', 'SONANT', 'SONNETIZED', 'SORPTION', 'SORT', 'SOT', 'SOWN', 'SPACEBAND', 'SPACKLED', 'SPARKIEST', 'SPARTAN', 'SPAT', 'SPEARMAN', 'SPECIATED', 'SPECTATED', 'SPELTZ', 'SPEND', 'SPHEROID', 'SPIKELET', 'SPILT', 'SPLINTERED', 'SPOKED', 'SPOOLED', 'SPOONED', 'SPORRAN', 'SPOT', 'SPOUSED', 'SPREAD', 'SPRINGIEST', 'SPURT', 'SQUALID', 'SQUAT', 'SQUEALED', 'SQUEEGEED', 'SQUELCH', 'SQUIB', 'SQUIBBED', 'SQUIFFED', 'SQUIRISH', 'SQUIRRELED', 'STABBED', 'STALINIST', 'STALLED', 'STALLION', 'STALWART', 'STAMPED', 'STANCHION', 'STANDARD', 'STANDPOINT', 'STAPHYLINID', 'STEADFAST', 'STEADIEST', 'STEPCHILDREN', 'STERILANT', 'STERN', 'STICKMAN', 'STICKUP', 'STIMULATED', 'STIRRED', 'STOCKIST', 'STODGIEST', 'STOLEN', 'STOMATILOGIST', 'STONEWALLED', 'STOUTENED', 'STOUTEST', 'STP', 'STRAGGLIEST', 'STRAIT', 'STRANGEST', 'STRAPPED', 'STRAWBOARD', 'STREAMWOOD', 'STREET', 'STREWN', 'STRIDENT', 'STRIKEBOUND', 'STRINGBOARD', 'STRIPT', 'STROLLED', 'STRONGMAN', 'STROWN', 'STUDENTSHIP', 'STUFFIEST', 'STULTIFICATION', 'STUMPIEST', 'STYED', 'SUB', 'SUBEDIT', 'SUBINFEUDATED', 'SUBJACENT', 'SUBLATION', 'SUBREGION', 'SUBSCRIBED', 'SUBSTANDARD', 'SUBTENANT', 'SUBTITLED', 'SUCKED', 'SUDSIEST', 'SUET', 'SUFFRAGIST', 'SUGARED', 'SULFONATED', 'SULFURETED', 'SUMMARIZED', 'SUMMED', 'SUNDERED', 'SUNKEN', 'SUNLAMP', 'SUPERADDITION', 'SUPERCONDUCT', 'SUPERINTEND', 'SUPERMARKET', 'SUPERVENTION', 'SUPINATION', 'SUPPOSED', 'SUPPRESSED', 'SUPPURATION', 'SURROUNDED', 'SUSPECT', 'SUSPECTED', 'SWAB', 'SWAGMAN', 'SWAIN', 'SWAMP', 'SWAN', 'SWANNED', 'SWASHBUCKLED', 'SWATH', 'SWAYED', 'SWEETEST', 'SWERVED', 'SWIRLED', 'SWITCH', 'SWOT', 'SYMBOLED', 'SYNCH', 'SYNCOPATED', 'SYNOD'],
					t: ['TABBED', 'TABLESPOON', 'TACH', 'TAD', 'TAGSTART', 'TAINT', 'TAJ', 'TALKATHON', 'TALLISH', 'TAMP', 'TAMPION', 'TAN', 'TANKED', 'TANTALIZATION', 'TANZANIAN', 'TARBUSH', 'TARGETED', 'TARN', 'TARPAULIN', 'TARTLET', 'TAUNTED', 'TAUTENED', 'TAVERN', 'TAXED', 'TAXICAB', 'TAXIDERMIST', 'TEARDROP', 'TECHED', 'TECHNICALIZATION', 'TEENIEST', 'TEGUMENT', 'TELEGRAPH', 'TELEOSTEAN', 'TELETYPED', 'TENANT', 'TENET', 'TENSION', 'TENTED', 'TEPID', 'TERREPLEIN', 'TERRORIZED', 'TESSERACT', 'TEUTON', 'TH', 'THEGN', 'THEORIST', 'THEURGIST', 'THEY\'D', 'THIEVED', 'THIEVISH', 'THIN', 'THINCLAD', 'THIRDHAND', 'THISTLEDOWN', 'THOUGHT', 'THOUSAND', 'THREADIEST', 'THRIVEN', 'THRUMMED', 'THYROCALCITONIN', 'THYROID', 'TICKETED', 'TICKLED', 'TIDBIT', 'TIFFED', 'TIGERISH', 'TILT', 'TILTH', 'TIMBERED', 'TIMEOUT', 'TIMIDEST', 'TINCT', 'TINGED', 'TINIEST', 'TINKLED', 'TIT', 'TOAD', 'TOADIED', 'TOASTIEST', 'TOBOGGANIST', 'TOD', 'TODDLED', 'TOEHOLD', 'TOFT', 'TOLERANT', 'TOLERATED', 'TOMCOD', 'TONED', 'TONSURED', 'TOOTHBRUSH', 'TOPNOTCH', 'TORRENT', 'TORRID', 'TOTALITARIAN', 'TOTIPOTENT', 'TOURED', 'TOWBOAT', 'TOWHEADED', 'TOWN', 'TOWNSWOMAN', 'TOXICANT', 'TOYON', 'TRACTION', 'TRADESMAN', 'TRAINBAND', 'TRAIPSED', 'TRAMMELED', 'TRANSECT', 'TRANSFIXION', 'TRANSHIP', 'TRANSPORT', 'TRANSPOSED', 'TRAUMATIZED', 'TRAVAILED', 'TRENCHANT', 'TRESPASSED', 'TRICKISH', 'TRICORNERED', 'TRIDENT', 'TRIFLURALIN', 'TRIGGERMAN', 'TRIGLYPH', 'TRIJET', 'TRILLED', 'TRIPLICATED', 'TRIPLICATION', 'TRISTEARIN', 'TRIVET', 'TROLLEYED', 'TROLLOP', 'TROOP', 'TROOPED', 'TROUBLED', 'TRUCKLED', 'TRUCKMAN', 'TRUDGED', 'TRUEST', 'TRUMPET', 'TRUST', 'TUBIFICID', 'TUCKERED', 'TUCKET', 'TUFT', 'TUGBOAT', 'TURBINATED', 'TURBORAMJET', 'TURD', 'TURNED', 'TURNOUT', 'TURRET', 'TURRETED', 'TUSCAN', 'TUSSAH', 'TUT', 'TWENTY-FIRST', 'TWIGGED', 'TWILLED', 'TWIN', 'TWIXT', 'TYPESET', 'TYROCIDIN', 'TYROTHRICIN'],
					u: ['UCB', 'UGLIFICATION', 'UMBILICATION', 'UMLAUT', 'UMPTEEN', 'UN', 'UNABBREVIATED', 'UNABSORBED', 'UNACCOMMODATED', 'UNACCOMPLISHED', 'UNACCUSTOMED', 'UNAMAZED', 'UNAMBIVALENT', 'UNAMPLIFIED', 'UNANELED', 'UNANIMATED', 'UNAPPRECIATION', 'UNASSUAGED', 'UNATTESTED', 'UNAVOWED', 'UNAWED', 'UNBAKED', 'UNBARBED', 'UNBEKNOWNST', 'UNBELT', 'UNBIGOTED', 'UNBLOWN', 'UNBLUNTED', 'UNBOLT', 'UNBURNISHED', 'UNBURNT', 'UNCAGED', 'UNCILIATED', 'UNCOFFINED', 'UNCOMPLETED', 'UNCONCERN', 'UNCOUPLED', 'UNCREASED', 'UNCRITICIZED', 'UNCROSSED', 'UNCROWDED', 'UNCURDLED', 'UNDEAD', 'UNDEEDED', 'UNDEFACED', 'UNDEFENDED', 'UNDELIVERED', 'UNDERACT', 'UNDERBRED', 'UNDERFED', 'UNDERVALUED', 'UNDERWEIGHT', 'UNDIAGNOSED', 'UNDIGESTED', 'UNDIGNIFIED', 'UNDILATED', 'UNDISTRACTED', 'UNDIVERSIFIED', 'UNDOCKED', 'UNDOCUMENTED', 'UNDULATED', 'UNENGAGED', 'UNENTANGLED', 'UNENVIED', 'UNESCORTED', 'UNEXAGGERATED', 'UNEXPIRED', 'UNFANNED', 'UNFATHERED', 'UNFEDERATED', 'UNFETTERED', 'UNFLAWED', 'UNFLEXED', 'UNFRIEND', 'UNFROZEN', 'UNFUSED', 'UNGIRD', 'UNGIRT', 'UNGLAMORIZED', 'UNGLAZED', 'UNGRASPED', 'UNHANGED', 'UNHARMED', 'UNHEARD', 'UNHIRED', 'UNHUNTED', 'UNIMAGINED', 'UNIMFLECTED', 'UNIMPLEMENTED', 'UNIMPROVED', 'UNINTERESTED', 'UNION', 'UNIONIZED', 'UNIONTOWN', 'UNISON', 'UNITIZATION', 'UNIV', 'UNJADED', 'UNJOINT', 'UNJUST', 'UNLADED', 'UNLEVIED', 'UNLICKED', 'UNLINED', 'UNLIST', 'UNLIT', 'UNLOAD', 'UNLOOSENED', 'UNMAN', 'UNMARRED', 'UNMENTIONED', 'UNMONEYED', 'UNMOVED', 'UNNOTED', 'UNOBLITERATED', 'UNPADDED', 'UNPARALYZED', 'UNPARDONED', 'UNPARTED', 'UNPARTITIONED', 'UNPERVERTED', 'UNPLASTERED', 'UNPRACTICED', 'UNPRESSED', 'UNPRINCIPLED', 'UNPROSTITUTED', 'UNPURGED', 'UNQUESTIONED', 'UNRATED', 'UNRECLAIMED', 'UNREDEEMED', 'UNREELED', 'UNREEVED', 'UNRESERVED', 'UNREVEALED', 'UNRIVALED', 'UNROASTED', 'UNSCATHED', 'UNSETTLEMENT', 'UNSHELLED', 'UNSNAP', 'UNSOPHISTICATED', 'UNSPLIT', 'UNSPOKEN', 'UNSTAINED', 'UNSTUDIED', 'UNSWEPT', 'UNTAMED', 'UNTAPPED', 'UNTHATCHED', 'UNTORN', 'UNTREAD', 'UNUSED', 'UNUTTERED', 'UNWEARIED', 'UNWEDDED', 'UNWISH', 'UNWOVEN', 'UNWROUGHT', 'UPPED', 'UPSHIFT', 'UPSHOT', 'URINATION', 'UROCHORD', 'UROPOD', 'USURPED', 'UT', 'UTAH', 'UTMOST', 'UTOPIAN'],
					v: ['VACUOLATED', 'VACUUMED', 'VALANCED', 'VALUATED', 'VAN', 'VAPID', 'VAPORIZATION', 'VAPORIZED', 'VASOTOCIN', 'VAULT', 'VAULTED', 'VAWARD', 'VD', 'VEHEMENT', 'VELD', 'VENDITION', 'VENERATION', 'VENTED', 'VERSIFICATION', 'VERT', 'VESICATION', 'VESTIBULED', 'VET', 'VETERINARIAN', 'VEXILLOLOGIST', 'VICED', 'VIDICON', 'VILLAIN', 'VINEGARISH', 'VINELAND', 'VIP', 'VISAED', 'VISED', 'VISION', 'VISITANT', 'VITIATED', 'VIVANT', 'VIVERRID', 'VIVID', 'VOLANT', 'VOMITED', 'VOTED'],
					w: ['WAFTED', 'WAILED', 'WAIN', 'WAISTCOATED', 'WALKOUT', 'WAMBLED', 'WANGLED', 'WANT', 'WANTON', 'WARED', 'WARIEST', 'WARRANT', 'WASH', 'WASHBOARD', 'WASHWOMAN', 'WATCHBAND', 'WATCHED', 'WATERIEST', 'WATERWORN', 'WEEN', 'WELKIN', 'WELT', 'WEN', 'WEND', 'WESLEYAN', 'WESTERN', 'WESTFIELD', 'WESTPORT', 'WETLAND', 'WHALED', 'WHAT', 'WHEATEN', 'WHELP', 'WHINED', 'WHIP', 'WHIRRED', 'WHIST', 'WHITEHEAD', 'WHITETHROAT', 'WHOLESALED', 'WIDEST', 'WIDTH', 'WIEFERICH', 'WIENERWURST', 'WIFEHOOD', 'WIGEON', 'WIGGED', 'WILDWOOD', 'WINCH', 'WIND', 'WINDBURNED', 'WINDSCREEN', 'WINESHOP', 'WIREMAN', 'WITCH', 'WITHOUT', 'WITTIEST', 'WOAD', 'WOLCOTT', 'WOMAN', 'WOMB', 'WON', 'WONDERMENT', 'WONT', 'WOODENHEAD', 'WOODLOT', 'WOOLSHED', 'WORKMEN', 'WORKUP', 'WORRYWART', 'WORSEN', 'WORSTED', 'WORTHINGTON', 'WOULDN\'T', 'WOULDST', 'WRESTED', 'WRETCH', 'WRIT', 'WT', 'WYLIECOAT', 'WYND'],
					x: ['XENOLITH', 'XYLOGRAPH'],
					y: ['YACKED', 'YAMEN', 'YAP', 'YARDMAN', 'YARN', 'YD', 'YEASTIEST', 'YELLED', 'YIDDISH', 'YIELDED', 'YOGHURT', 'YOU\'D'],
					z: ['ZEN', 'ZENITH', 'ZEST', 'ZONATED', 'ZOOPLANKTON']
				};
				var letter = this.params[0] + '';
				letter = letter.toLowerCase();
				letter = letter.replace(/[^a-z]/g,'');
				letter = letter.substr(0,1);
				return lexicons[letter][getRandom(0,lexicons[letter].length)];
			break;
			case "lang_trans":		
				var from = this.params[0] + '';
				var to = this.params[1] + '';																				
				from = from.substr(0,10);				
				to = to.substr(0,10);						
				if(code == '') {
					var langs = 'Supported languages are:-\n';
					for(lang in google.language.Languages) {
						langs += lang + '=' + google.language.Languages[lang] + '\n';
					}
					return langs;
				}		
				var completed = 0;			
				var complete = function(result) {							  	
				  completed = 1;
				  if(!result.error) {			  	
				    code = result.translation;
				  } else {
				  	code = 'Error translating.';
				  }
				}
				google.language.translate(code, from, to, complete);
				alert("Translating...");					
			return code; 			
			break;			
			case "unique":
				var regexp = this.params[0];
				code = code.split(new RegExp(regexp));
				var result = [];
				var found = "";
				for(var i=0;i<code.length;i++) {
					if(!new RegExp(found).test(code[i]) || found == '') {
						var escaped = code[i].replace(/([\\.^$*+?{}\[\]\|\(\)!])/g,"\\$1");					
						if(/^[\d\w]/.test(escaped)) {
							escaped = '\\b' + escaped;
						}
						if(/[\d\w]$/.test(escaped)) {
							escaped = escaped + '\\b';
						}						
						result.push(code[i]);						
						if(found != '') {
							found += '|';
						}
						found += escaped;						
					}
				}
				return result.join(",");
			break;
			case "arrayify":
				var regexp = this.params[0];
				var arrayType = this.params[1].toLowerCase();
				code = code.split(new RegExp(regexp));
				var result = [];
				var quoteType = 'single';
				
				switch(arrayType) {
					case "c":
					case "java":
					case "vbscript":
						quoteType = 'double';
					break;
				}
				
				for(var i=0;i<code.length;i++) {
					if(code[i] == '') {
						continue;
					}
					
					if(/^([.]?[0-9]+[.]?[0-9]*|true|false)$/i.test(code[i]) 
						&& arrayType != 'java' && arrayType != 'c') {
						result.push(code[i]);
						continue;
					}
					
					quoteType === 'single' ? result.push("'" + code[i].replace(/'/g,'\\\'') + "'") 
										   : result.push('"' + code[i].replace(/"/g,'\\"') + '"');
				}							
				switch(arrayType) {
					case "php":
						return '$myArray = array(' + result.join(',') + ');';
					break;
					case "js":					
					case "javascript":
						return 'var myArray = [' + result.join(',') + '];';
					break;
					case "python":
					case "ruby":
						return 'myArray = [' + result.join(',') + '];';
					break;
					case "java":
						return 'String[] myArray = {' + result.join(',') + '}';
					break;
					case "c":
						return 'char *myArray[] = {' + result.join(',') + '}';
					break;
					case "vbscript":
						var arrayData = 'Dim myArray('+code.length+')\n';
						for (var i = 0; i < result.length; i++) {							
							arrayData += 'myArray('+i+') = ' + result[i] + '\n';
						}
						return arrayData;
					break;
					case "perl":
						return '@myArray = ('+result.join(',')+')';
					break;
					default:
						return 'Error supported languages are:-\nphp|js|ruby|java|c|vbscript|perl|python';
					break;
				}			
			break;
			case "morse_enc":
				return morseEncrypt(code);
			break;
			case "morse_dec":
				return morseDecrypt(code);
			break;
			case "vigenere_dec":
			case "vigenere_enc":
				var key = this.params[0].getCharacterCodes();
				code = code.getCharacterCodes();
				var keyPos = 0;
				for(var i=0;i<code.length;i++) {
					code[i] = (parseInt(code[i])^key[keyPos]);
					if (keyPos + 1 == key.length) {
						keyPos = 0;
					} else {
						keyPos++;
					}
				}
				return code.join(',').fromcharcodes();
			break;			
			case "caesar_enc":
				var charShf = this.params[0];
				return caeserEncrypt(code,charShf);
			break;
			case "caesar_dec":
				var charShf = this.params[0];
				return caeserDecrypt(code,charShf);
			break;
			case "timestamp2date":
				var date = new Date();
				date.setTime(parseInt(code));				
				return date;
			break;
			case "date2timestamp":
				var dateTime = code.split(' ');
				var date = dateTime[0];
				var time = dateTime[1];
				date = date.split(/[\/\-\.]/);
				var day = date[0];
				var month = date[1];
				var year = date[2];
				time = time.split(':');
				var hour = time[0];
				var min = time[1];
				var sec = time[2];
				var ms = time[3];
				var dateObj = new Date(parseInt(year),parseInt(month),parseInt(day),parseInt(hour),parseInt(min),parseInt(sec),parseInt(ms));
				return dateObj.getTime();				
			break;
			case "sqlhex":
				return code.sqlhex();		
			break;
			case "sqlor":
				return code.sqlor();
			break;
			case "sqlconcat":
				return code.sqlconcat();	
			break;
			case "sqlascii":
				return code.sqlascii();	
			break;
			case "sqlchr":
				return code.sqlchr();		
			break;
			case "sqlcomment":
				return code.sqlcomment();			
			break;
			case "sqlchar":
				return code.sqlchar();		
			break;
			case "c_maxunicode":
				return 65535;
			break;
			case "c_null":
				return String.fromCharCode(0);	
			break;
			case "c_tab":
				return String.fromCharCode(9);				
			break;
			case "c_newline":
				return String.fromCharCode(10);				
			break;
			case "c_divstyle":
				code = '<div style="' + code + '"></div>';
				return code;						
			break;			
			case "c_rtl_on":
				return String.fromCharCode(8238);
			break;	
			case "c_rtl_off":
				return String.fromCharCode(8236);
			break;
			case "c_ltr_on":
				return String.fromCharCode(8237);
			break;	
			case "c_ltr_off":
				return String.fromCharCode(8236);
			break;								
			case "c_js":
				code = "javascript:" + code;
				return code;			
			break;
			case "c_alert":
				code = "alert(" + code + ");";
				return code;			
			break;	
			case "c_script":
				if(code == '') {
					return "<script/src=//0x.lv>#alert('XSS')";
				}
				code = "<script>" + code + "</script>";
				return code;						
			break;
			case "c_eval":
				code = "eval(" + code + ")";
				return code;									
			break;
			case "c_link":
				code = '<a href="' + code + '">Test</a>';
				return code;												
			break;	
			case "c_iframe":
				code = '<iframe src="' + code + '"></iframe>';
				return code;			
			break;				
			case "randnum":
				var numberOfChars = parseInt(this.params[0]);
				var from = parseInt(this.params[1]);
				var to = parseInt(this.params[2]);

				if(isNaN(numberOfChars)) {
					numberOfChars = 1;
				}
				
				var randChars = '';
				for(var i=0;i<numberOfChars;i++) {
					randChars += getRandom(from,to);
				}
				return randChars;
			break;
			case "randletternums":
			case "randletters":									
				var numberOfChars = parseInt(this.params[0]);
				
				if(isNaN(numberOfChars)) {
					numberOfChars = 1;
				}				
				
				var randChars = '';
				if(tagType == 'randletters') {
					var chars = 'abcdefghijklmnopqrstuvwxyz';
				} else {
					var chars = 'abcdefghijklmnopqrstuvwxyz0123456789';					
				}
				for(var i=0;i<numberOfChars;i++) {
					if(getRandom(0,1) == 1) {
						randChars += chars.charAt(getRandom(0, chars.length));				
					} else {
						randChars += chars.charAt(getRandom(0, chars.length)).toUpperCase();				
					}
				}
				return randChars;
			break;
			case "randchars":
				var numberOfChars = parseInt(this.params[0]);
				if(isNaN(numberOfChars)) {
					numberOfChars = 1;
				}
				var randChars = '';
				for(var i=0;i<numberOfChars;i++) {
					randChars += String.fromCharCode(getRandom(0,65536));
				}
				return randChars;
			break;
			case "bticks":
				return code.backticks();
			break;
			case "squote":
				return code.singlequotes();
			break;
			case "dquote":
				return code.doublequotes();
			break;
			case "backslashnullesc":
				return code.backslashnullesc();
			break;
			case "backslashznullesc":
				return code.backslashznullesc();
			break;
			case "backslashesc":
				return code.backslashesc();
			break;
			case "arithmetic":
				var value = this.params[0];
				var operator = this.params[1];	
				var splitChar = this.params[2];	
				var chars = code.split(splitChar);
				var previous;
				for(var i=0;i<chars.length;i++) {
					if(value == 0) {
						previous = chars[i-1];
						if(typeof previous == 'undefined') {
							continue;
						}
					}
					switch(operator) {
						case "+":
							chars[i] = parseFloat(chars[i]) + parseFloat(value!=0?value:previous);
						break;
						case "-":
							chars[i] = chars[i] - (value!=0?value:previous);
						break;
						case "/":
							chars[i] = chars[i] / (value!=0?value:previous);
						break;
						case "*":
							chars[i] = chars[i] * (value!=0?value:previous);
						break;
						case "%":
							chars[i] = chars[i] % (value!=0?value:previous);
						break;
						case ">>":
							chars[i] = chars[i] >> (value!=0?value:previous);
						break;
						case ">>>":
							chars[i] = chars[i] >>> (value!=0?value:previous);
						break;
						case "<<":
							chars[i] = chars[i] << (value!=0?value:previous);
						break;											
					}
				}
				return chars.join(splitChar);
			break;
			case "xor_range_encode":
				var splitChar = this.params[0];			
				var key = this.params[1].split(""), keyPos = 0;
				var num1, num2;
				code = code.split(splitChar);							
				var converted = [];
				for(var i=0;i<code.length;i++) {										
					if(keyPos >= key.length) {
						keyPos = 0;
					}				
					num1 = (code[i]).charCodeAt();					
					num2 = key[keyPos].charCodeAt();
					keyPos++;					
					converted.push(String.fromCharCode(num1 ^ num2));
				}
				return converted.join(splitChar);
			break;
			case "xor_range_decode":
				var splitChar = this.params[0];
				var key = this.params[1], keyPos = 0;
				code = code.split(splitChar);
				converted = [];
				for(var i=0;i<code.length;i++) {
					if(keyPos >= key.length) {
						keyPos = 0;
					}				
					num1 = code[i].charCodeAt();
					num2 = key[keyPos].charCodeAt();
					keyPos++;
					converted.push(String.fromCharCode(num1^num2));										
				}
				return converted.join(splitChar)
			break;
			case "convert_base":
				var splitChar = this.params[0];
				code = code.split(splitChar);			
				var from = parseInt(this.params[1]);
				var to = parseInt(this.params[2]);
				for(var i=0;i<code.length;i++) {
					code[i] = parseInt(code[i],from).toString(to);
				}
				return code.join(splitChar);
			break;
			case "increment":
				var value = this.params[0];
				var splitChar = this.params[1];
				var chars = code.split(splitChar);
				for(var i=0;i<chars.length;i++) {
					var convertNumber = parseFloat(chars[i]);
					if(value == 0) {
						convertNumber += convertNumber;
					} else {
						convertNumber += parseFloat(value);
					}
					chars[i] = convertNumber;
				}
				return chars.join(splitChar);
			break;
			case "decrement":
				var value = this.params[0];
				var splitChar = this.params[1];
				var chars = code.split(splitChar);
				for(var i=0;i<chars.length;i++) {
					var convertNumber = parseFloat(chars[i]);
					if(value == 0) {
						convertNumber -= convertNumber;
					} else {
						convertNumber -= parseFloat(value);
					}
					chars[i] = convertNumber;
				}
				return chars.join(splitChar);
			break;
			case "zerofill":
				var amount = parseInt(this.params[0]);
				return code.zeroFill(amount);
			break;
			case "rotate":
				var from = parseInt(this.params[0]);
				var to = parseInt(this.params[1]);
				var by = parseInt(this.params[2]);
				return code.rotate(from, to, by);				
			break;
			case "charfill":
				var amount = parseInt(this.params[0]);
				var schar = this.params[1];
				if(schar == '') {
					throw 'Second param is required.';					
				}
				return code.charFill(amount,schar);
			break;
			case "range":
				var start = parseInt(code);
				var end = parseInt(this.params[0]) + 1;
				var numbers = [];
				for(var i=start;i<end;i++) {
					numbers.push(i);
				}
				return numbers.join(',');
			break;
			case "javachar":
				return code.javachar();
			break;
			case "toternary":				
				return code.toternary();
			break;
			case "tocharcodes":
				var splitChar = this.params[0];
				var joinChar = this.params[1];				
				code = code.split(splitChar);
				for(var i=0;i<code.length;i++) {
					code[i] = code[i].charCodeAt();
				}
				return code.join(joinChar);
			break;
			case "fromcharcodes":				
				return code.fromcharcodes();
			break;
			case "utf8":
				return code.encode_utf8();
			break;
			case "d_utf8":
				return code.decode_utf8();
			break;
			case "utf7":
				return code.utf7_encode(this.params[0]);
			break;
			case "d_utf7":
				return code.utf7_decode();
			break;
			case "us_ascii":
				return code.us_ascii();
			break;
			case "d_us_ascii":
				return code.us_ascii_decode();
			break;		
			case "urlenc":								
				return escape(code);
			break;
			case "realurlenc":				
				return code.urlencode();
			break;
			case "enc_uri":
				return encodeURI(code);
			break;
			case "enc_uri_comp":
				return encodeURIComponent(code);
			break;			
			case "htmlent":
				return code.htmlEntities('encode');
			break;
			case "uni":				
				return code.tounicode(this.params[0]);
			break;
			case "uni_hwfw_chars":
				 var chars = code.tounicodehwfw(',').split(',');
				 chars.shift();
				 code = '';
				 for(var i=0;i<chars.length;i++) {
					var strchar = chars[i].fromhex();
				 	code += String.fromCharCode(strchar);
				 }
				 return code;
			break;
			case "uni_hwfw":
				return code.tounicodehwfw(this.params[0]);
			break;
			case "uuencode":
				return code.uuencode();
			break;
			case "uudecode":
				return code.uudecode();
			break;	
			case "dword2ip":
			case "oct2ip":
			case "hex2ip":
				if(~code.indexOf('.')) {
					code = code.split('.');
					var base = 10;
					switch(tagType) {
						case "hex2ip":
							base = 16;
						break;
						case "oct2ip":
							base = 8;
						break;
					}
					for(var i=0;i<code.length;i++) {
						code[i] = parseInt(code[i],base);
					}
					return code.join('.');
				} else {
					switch(tagType) {
						case "oct2ip":
							code = parseInt(code,8); 
						break;
						case "hex2ip":
							code = parseInt(code,16);
						break;
					}
					code = parseInt(code).toString(16).replace(/(.{2})/g,function($0,$1){ return parseInt($1,16) + '.' });
					return code.replace(/\.$/,'');				
				}
			break;
			case "jsmapcompress":
				return JSMapCompress.encode(code);
			break;
			case "jsmapuncompress":
				return JSMapCompress.decode(code);
			break;			
			case "paircompress":
				return PairCompress.encode(code);
			break;
			case "pairuncompress":
				return PairCompress.decode(code);
			break;
			case "jscompress30":
				var distance = 9;										
				code = code.replace(/[\r\n\t]/g,'');
				code = code.split("");
				var removeChrs = [];
				var chars = {'"':1,"'":11,"+":21};				
				var output = '';				
				for(var i=0;i<code.length;i++) {
					if(/['"+]/.test(code[i])) {
						var chr = code[i];
						var start = i+1;
						var end = (i+1)+distance;
						for(var j=start;j<end;j++) {
							if(chr == code[j] && !new RegExp("^"+removeChrs.join("|")+"$").test(i)) {
								code[i] = String.fromCharCode(chars[chr]+(j-i));																
								removeChrs.push(j);
								break;
							}
						}
						if(new RegExp("^"+removeChrs.join("|")+"$").test(i)) {
							continue;
						}												
					} 
					output += code[i];
				}											
				return output;
			break;
			case "jsuncompress30":
				var distance = 9;				
				var chars = {1:'"',11:"'",21:"+"};
				var addChrs = {};
				var output = '';				
				code = code.split("");
				for (var i = 0; i < code.length; i++) {
					var chrCode = code[i].charCodeAt();
					if(chrCode < 32) {
						var start = chrCode;
						var end = start-distance;
						for(var j=start;j>=end;j--) {
							if(typeof chars[j] != 'undefined') {
								code[i] = chars[j];																
								var offset = i+start-j;
								addChrs[offset] = chars[j];
							}
						}
					}
					output += code[i];																																																															
					if(addChrs[i+1]){
						output += addChrs[i+1];
					}					
				}				
				return output;
			break;
			case "jsunicompress":
				return code.replace(/[!-~]/g, function(c){
					return c.charCodeAt(0);
				}).replace(/[0]|\d{1,4}/g,function(d) {					
					return String.fromCharCode(parseInt(d,10));
				});
			break;
			case "jsuniuncompress":
				return code.replace(/[^\s]/g,function(c){
					return c.charCodeAt();
				}).replace(/[3][2-9]|[4-9][0-9]|[1][0-1][0-9]|[1][2][0-6]/g,function(d){
					return String.fromCharCode(d);
				});
			break;
			case "jsunipack":
				code = code.replace(/[!-~]/g, function(c){
					return c.charCodeAt(0);
				}).replace(/[0]|\d{1,4}/g,function(d) {					
					return String.fromCharCode(parseInt(d,10));
				});
				return 'eval("'+code+'".replace(/[^\s]/g,function(c){return c.charCodeAt()}).replace(/[3][2-9]|[4-9][0-9]|[1][0-1][0-9]|[1][2][0-6]/g,function(d){return String.fromCharCode(d)}))';			
			break; 
			case "ip2dword":
			case "ip2oct":
			case "ip2hex":
				code = code.split('.');
				if(tagType == 'ip2dword') {
					var repeat = parseInt(this.params[0]);
				} else {
					var zeroPad = this.params[0];
					var separator = this.params[1];
					if(code.length == 4 || code.length == 1) {
						for(var i=0;i<code.length;i++) {
							code[i] = (separator == '' ? '' : zeroPad) + '' + parseInt(code[i]).toString(tagType == 'ip2oct' ? 8 : 16);
						}
						return (separator == '' ? zeroPad : '') + code.join(separator);					
					}
				}
				var prefix = '';
				var base = 10;
				var result = 0;																				
				var qty = Math.pow(256,code.length);
				if(code.length % 2 == 1) {
					for(var i=0;i<code.length;i+=3) {
						result += parseInt(code[i]);
						result *= 256;
						if(code[i+1] != undefined) {
							result += parseInt(code[i+1]);
						}
						if(code[i+2] != undefined) {
							result *= 256;
							result += parseInt(code[i+2]);
						}
					}
				} else {
					for(var i=0;i<code.length;i+=2) {
						if(i % 4 == 2) {
							result *= 256;
						}
						result += parseInt(code[i]);
						result *= 256;					
						result += parseInt(code[i+1]);					
					}			
				}
				
				switch(tagType) {
					case "ip2oct":
						base = 8;
						prefix = '0';
					break;
					case "ip2hex":
						base = 16;
						prefix = '0x';
					break;
				}
				if(repeat > 0) {
					return prefix + (result + (qty * repeat));	
				} else {
					return prefix + result.toString(base);
				}
			break;	
			case "rot13":
				return code.rot13();
			break;
			case "d_rot13":
				return code.decode_rot13();				
			break;
			case "rot47":
				return code.rot47();
			break;
			case "d_rot47":
				return code.decode_rot47();				
			break;		
			case "oct":								
				return code.tooctal();
			break;	
			case "dec":				
				return code.todec();			
			break;
			case "dec_ent":	
				var ending = this.params[0];
				return code.todec_ent(ending);	
			break;
			case "hex_ent":	
				var ending = this.params[0];
				return code.tohex_ent(ending);
			break;
			case "hex":								
				return code.tohex();
			break;			
			case "hex2rgb":
				return code.hex2rgb();
			break;
			case "rgb2hex":
				return code.rgb2hex();
			break;			
			case "d_htmlent":
				return code.htmlEntities('decode');
			break;			
			case "d_realenc":
			case "d_enc":
				code = unescape(code);
				return code;
			break;
			case "d_uni":				
				return code.fromunicode();
			break;				
			case "d_oct":		
				return code.fromoctal();
			break;			
			case "d_dec":				
				return code.fromdec();
			break;
			case "d_hex":	
				return code.fromhex();
			break;
			case "d_punycode":
				return punycode.decode(code, true);
			break;
			case "d_utf16":
				return utf16.decode(code);
			break;			
			case "punycode":
				return punycode.encode(code, true);
			break;
			case "utf16":
				return utf16.encode(code);
			break;
			case "xor":
				var key = parseInt(this.params[0]);
				code = code.getCharacterCodes();
				for(var i=0;i<code.length;i++) {
					code[i] = parseInt(code[i]) ^ key;
				}
				return code.join(',').fromcharcodes();
			break;			
			case "base64":
				return btoa(code);
			break;
			case "base999":
																		var chars = ['$','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','T','U','V','W','X','Y','Z','_','b','c','d','f','g','h','m','n','o','p','q','r','s','t','u','v','w','x','y','z','ª','µ','º','À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß','à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô','õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','Ā','ā','Ă','ă','Ą','ą','Ć','ć','Ĉ','ĉ','Ċ','ċ','Č','č','Ď','ď','Đ','đ','Ē','ē','Ĕ','ĕ','Ė','ė','Ę','ę','Ě','ě','Ĝ','ĝ','Ğ','ğ','Ġ','ġ','Ģ','ģ','Ĥ','ĥ','Ħ','ħ','Ĩ','ĩ','Ī','ī','Ĭ','ĭ','Į','į','İ','ı','Ĳ','ĳ','Ĵ','ĵ','Ķ','ķ','ĸ','Ĺ','ĺ','Ļ','ļ','Ľ','ľ','Ŀ','ŀ','Ł','ł','Ń','ń','Ņ','ņ','Ň','ň','ŉ','Ŋ','ŋ','Ō','ō','Ŏ','ŏ','Ő','ő','Œ','œ','Ŕ','ŕ','Ŗ','ŗ','Ř','ř','Ś','ś','Ŝ','ŝ','Ş','ş','Š','š','Ţ','ţ','Ť','ť','Ŧ','ŧ','Ũ','ũ','Ū','ū','Ŭ','ŭ','Ů','ů','Ű','ű','Ų','ų','Ŵ','ŵ','Ŷ','ŷ','Ÿ','Ź','ź','Ż','ż','Ž','ž','ſ','ƀ','Ɓ','Ƃ','ƃ','Ƅ','ƅ','Ɔ','Ƈ','ƈ','Ɖ','Ɗ','Ƌ','ƌ','ƍ','Ǝ','Ə','Ɛ','Ƒ','ƒ','Ɠ','Ɣ','ƕ','Ɩ','Ɨ','Ƙ','ƙ','ƚ','ƛ','Ɯ','Ɲ','ƞ','Ɵ','Ơ','ơ','Ƣ','ƣ','Ƥ','ƥ','Ʀ','Ƨ','ƨ','Ʃ','ƪ','ƫ','Ƭ','ƭ','Ʈ','Ư','ư','Ʊ','Ʋ','Ƴ','ƴ','Ƶ','ƶ','Ʒ','Ƹ','ƹ','ƺ','ƻ','Ƽ','ƽ','ƾ','ƿ','ǀ','ǁ','ǂ','ǃ','Ǆ','ǅ','ǆ','Ǉ','ǈ','ǉ','Ǌ','ǋ','ǌ','Ǎ','ǎ','Ǐ','ǐ','Ǒ','ǒ','Ǔ','ǔ','Ǖ','ǖ','Ǘ','ǘ','Ǚ','ǚ','Ǜ','ǜ','ǝ','Ǟ','ǟ','Ǡ','ǡ','Ǣ','ǣ','Ǥ','ǥ','Ǧ','ǧ','Ǩ','ǩ','Ǫ','ǫ','Ǭ','ǭ','Ǯ','ǯ','ǰ','Ǳ','ǲ','ǳ','Ǵ','ǵ','Ǻ','ǻ','Ǽ','ǽ','Ǿ','ǿ','Ȁ','ȁ','Ȃ','ȃ','Ȅ','ȅ','Ȇ','ȇ','Ȉ','ȉ','Ȋ','ȋ','Ȍ','ȍ','Ȏ','ȏ','Ȑ','ȑ','Ȓ','ȓ','Ȕ','ȕ','Ȗ','ȗ','ɐ','ɑ','ɒ','ɓ','ɔ','ɕ','ɖ','ɗ','ɘ','ə','ɚ','ɛ','ɜ','ɝ','ɞ','ɟ','ɠ','ɡ','ɢ','ɣ','ɤ','ɥ','ɦ','ɧ','ɨ','ɩ','ɪ','ɫ','ɬ','ɭ','ɮ','ɯ','ɰ','ɱ','ɲ','ɳ','ɴ','ɵ','ɶ','ɷ','ɸ','ɹ','ɺ','ɻ','ɼ','ɽ','ɾ','ɿ','ʀ','ʁ','ʂ','ʃ','ʄ','ʅ','ʆ','ʇ','ʈ','ʉ','ʊ','ʋ','ʌ','ʍ','ʎ','ʏ','ʐ','ʑ','ʒ','ʓ','ʔ','ʕ','ʖ','ʗ','ʘ','ʙ','ʚ','ʛ','ʜ','ʝ','ʞ','ʟ','ʠ','ʡ','ʢ','ʣ','ʤ','ʥ','ʦ','ʧ','ʨ','ʰ','ʱ','ʲ','ʳ','ʴ','ʵ','ʶ','ʷ','ʸ','ʻ','ʼ','ʽ','ʾ','ʿ','ˀ','ˁ','ː','ˑ','ˠ','ˡ','ˢ','ˣ','ˤ','ͺ','Ά','Έ','Ή','Ί','Ό','Ύ','Ώ','ΐ','Α','Β','Γ','Δ','Ε','Ζ','Η','Θ','Ι','Κ','Λ','Μ','Ν','Ξ','Ο','Π','Ρ','Σ','Τ','Υ','Φ','Χ','Ψ','Ω','Ϊ','Ϋ','ά','έ','ή','ί','ΰ','α','β','γ','δ','ε','ζ','η','θ','ι','κ','λ','μ','ν','ξ','ο','π','ρ','ς','σ','τ','υ','φ','χ','ψ','ω','ϊ','ϋ','ό','ύ','ώ','ϐ','ϑ','ϒ','ϓ','ϔ','ϕ','ϖ','Ϛ','Ϝ','Ϟ','Ϡ','ϰ','ϱ','ϲ','ϳ','Ё','Ђ','Ѓ','Є','Ѕ','І','Ї','Ј','Љ','Њ','Ћ','Ќ','Ў','Џ','А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я','а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я','ё','ђ','ѓ','є','ѕ','і','ї','ј','љ','њ','ћ','ќ','ў','џ','Ѡ','ѡ','Ѣ','ѣ','Ѥ','ѥ','Ѧ','ѧ','Ѩ','ѩ','Ѫ','ѫ','Ѭ','ѭ','Ѯ','ѯ','Ѱ','ѱ','Ѳ','ѳ','Ѵ','ѵ','Ѷ','ѷ','Ѹ','ѹ','Ѻ','ѻ','Ѽ','ѽ','Ѿ','ѿ','Ҁ','ҁ','Ґ','ґ','Ғ','ғ','Ҕ','ҕ','Җ','җ','Ҙ','ҙ','Қ','қ','Ҝ','ҝ','Ҟ','ҟ','Ҡ','ҡ','Ң','ң','Ҥ','ҥ','Ҧ','ҧ','Ҩ','ҩ','Ҫ','ҫ','Ҭ','ҭ','Ү','ү','Ұ','ұ','Ҳ','ҳ','Ҵ','ҵ','Ҷ','ҷ','Ҹ','ҹ','Һ','һ','Ҽ','ҽ','Ҿ','ҿ','Ӏ','Ӂ','ӂ','Ӄ','ӄ','Ӈ','ӈ','Ӌ','ӌ','Ӑ','ӑ','Ӓ','ӓ','Ӕ','ӕ','Ӗ','ӗ','Ә','ә','Ӛ','ӛ','Ӝ','ӝ','Ӟ','ӟ','Ӡ','ӡ','Ӣ','ӣ','Ӥ','ӥ','Ӧ','ӧ','Ө','ө','Ӫ','ӫ','Ӯ','ӯ','Ӱ','ӱ','Ӳ','ӳ','Ӵ','ӵ','Ӹ','ӹ','Ա','Բ','Գ','Դ','Ե','Զ','Է','Ը','Թ','Ժ','Ի','Լ','Խ','Ծ','Կ','Հ','Ձ','Ղ','Ճ','Մ','Յ','Ն','Շ','Ո','Չ','Պ','Ջ','Ռ','Ս','Վ','Տ','Ր','Ց','Ւ','Փ','Ք','Օ','Ֆ','ՙ','ա','բ','գ','դ','ե','զ','է','ը','թ','ժ','ի','լ','խ','ծ','կ','հ','ձ','ղ','ճ','մ','յ','ն','շ','ո','չ','պ','ջ','ռ','ս','վ','տ','ր','ց','ւ','փ','ք','օ','ֆ','և','א','ב','ג','ד','ה','ו','ז','ח','ט','י','ך','כ','ל','ם','מ','ן','נ','ס','ע','ף','פ','ץ','צ','ק','ר','ש','ת','װ','ױ','ײ','ء','آ','أ','ؤ','إ','ئ','ا','ب','ة','ت','ث','ج','ح','خ','د','ذ','ر','ز','س','ش','ص','ض','ط','ظ','ع','غ','ـ','ف','ق','ك','ل','م','ن','ه','अ','आ','इ','ई','उ','ऊ','ऋ','ऌ','ऍ','ऎ','ए','ऐ','ऑ','ऒ','ओ','औ','क','ख','ग','घ','ङ','च','छ','ज','झ','ञ','ट','ठ','ड','ढ','ण','त','थ','द','ध','न','ऩ','प','फ','ब','भ','म','य','र','ऱ','ल','ळ','ऴ','व','श','ष','स'];
				  code = code + '';
					return code.replace(/([0]|\d{1,3})/g, function($0,d) {					
						return typeof chars[d] != 'undefined' ? chars[d] : d;
					});
			break;
			case "d_base999":				
					var chars = {'$':0,'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'H':8,'I':9,'J':10,'K':11,'L':12,'M':13,'N':14,'O':15,'P':16,'Q':17,'T':18,'U':19,'V':20,'W':21,'X':22,'Y':23,'Z':24,'_':25,'b':26,'c':27,'d':28,'f':29,'g':30,'h':31,'m':32,'n':33,'o':34,'p':35,'q':36,'r':37,'s':38,'t':39,'u':40,'v':41,'w':42,'x':43,'y':44,'z':45,'ª':46,'µ':47,'º':48,'À':49,'Á':50,'Â':51,'Ã':52,'Ä':53,'Å':54,'Æ':55,'Ç':56,'È':57,'É':58,'Ê':59,'Ë':60,'Ì':61,'Í':62,'Î':63,'Ï':64,'Ð':65,'Ñ':66,'Ò':67,'Ó':68,'Ô':69,'Õ':70,'Ö':71,'Ø':72,'Ù':73,'Ú':74,'Û':75,'Ü':76,'Ý':77,'Þ':78,'ß':79,'à':80,'á':81,'â':82,'ã':83,'ä':84,'å':85,'æ':86,'ç':87,'è':88,'é':89,'ê':90,'ë':91,'ì':92,'í':93,'î':94,'ï':95,'ð':96,'ñ':97,'ò':98,'ó':99,'ô':100,'õ':101,'ö':102,'ø':103,'ù':104,'ú':105,'û':106,'ü':107,'ý':108,'þ':109,'ÿ':110,'Ā':111,'ā':112,'Ă':113,'ă':114,'Ą':115,'ą':116,'Ć':117,'ć':118,'Ĉ':119,'ĉ':120,'Ċ':121,'ċ':122,'Č':123,'č':124,'Ď':125,'ď':126,'Đ':127,'đ':128,'Ē':129,'ē':130,'Ĕ':131,'ĕ':132,'Ė':133,'ė':134,'Ę':135,'ę':136,'Ě':137,'ě':138,'Ĝ':139,'ĝ':140,'Ğ':141,'ğ':142,'Ġ':143,'ġ':144,'Ģ':145,'ģ':146,'Ĥ':147,'ĥ':148,'Ħ':149,'ħ':150,'Ĩ':151,'ĩ':152,'Ī':153,'ī':154,'Ĭ':155,'ĭ':156,'Į':157,'į':158,'İ':159,'ı':160,'Ĳ':161,'ĳ':162,'Ĵ':163,'ĵ':164,'Ķ':165,'ķ':166,'ĸ':167,'Ĺ':168,'ĺ':169,'Ļ':170,'ļ':171,'Ľ':172,'ľ':173,'Ŀ':174,'ŀ':175,'Ł':176,'ł':177,'Ń':178,'ń':179,'Ņ':180,'ņ':181,'Ň':182,'ň':183,'ŉ':184,'Ŋ':185,'ŋ':186,'Ō':187,'ō':188,'Ŏ':189,'ŏ':190,'Ő':191,'ő':192,'Œ':193,'œ':194,'Ŕ':195,'ŕ':196,'Ŗ':197,'ŗ':198,'Ř':199,'ř':200,'Ś':201,'ś':202,'Ŝ':203,'ŝ':204,'Ş':205,'ş':206,'Š':207,'š':208,'Ţ':209,'ţ':210,'Ť':211,'ť':212,'Ŧ':213,'ŧ':214,'Ũ':215,'ũ':216,'Ū':217,'ū':218,'Ŭ':219,'ŭ':220,'Ů':221,'ů':222,'Ű':223,'ű':224,'Ų':225,'ų':226,'Ŵ':227,'ŵ':228,'Ŷ':229,'ŷ':230,'Ÿ':231,'Ź':232,'ź':233,'Ż':234,'ż':235,'Ž':236,'ž':237,'ſ':238,'ƀ':239,'Ɓ':240,'Ƃ':241,'ƃ':242,'Ƅ':243,'ƅ':244,'Ɔ':245,'Ƈ':246,'ƈ':247,'Ɖ':248,'Ɗ':249,'Ƌ':250,'ƌ':251,'ƍ':252,'Ǝ':253,'Ə':254,'Ɛ':255,'Ƒ':256,'ƒ':257,'Ɠ':258,'Ɣ':259,'ƕ':260,'Ɩ':261,'Ɨ':262,'Ƙ':263,'ƙ':264,'ƚ':265,'ƛ':266,'Ɯ':267,'Ɲ':268,'ƞ':269,'Ɵ':270,'Ơ':271,'ơ':272,'Ƣ':273,'ƣ':274,'Ƥ':275,'ƥ':276,'Ʀ':277,'Ƨ':278,'ƨ':279,'Ʃ':280,'ƪ':281,'ƫ':282,'Ƭ':283,'ƭ':284,'Ʈ':285,'Ư':286,'ư':287,'Ʊ':288,'Ʋ':289,'Ƴ':290,'ƴ':291,'Ƶ':292,'ƶ':293,'Ʒ':294,'Ƹ':295,'ƹ':296,'ƺ':297,'ƻ':298,'Ƽ':299,'ƽ':300,'ƾ':301,'ƿ':302,'ǀ':303,'ǁ':304,'ǂ':305,'ǃ':306,'Ǆ':307,'ǅ':308,'ǆ':309,'Ǉ':310,'ǈ':311,'ǉ':312,'Ǌ':313,'ǋ':314,'ǌ':315,'Ǎ':316,'ǎ':317,'Ǐ':318,'ǐ':319,'Ǒ':320,'ǒ':321,'Ǔ':322,'ǔ':323,'Ǖ':324,'ǖ':325,'Ǘ':326,'ǘ':327,'Ǚ':328,'ǚ':329,'Ǜ':330,'ǜ':331,'ǝ':332,'Ǟ':333,'ǟ':334,'Ǡ':335,'ǡ':336,'Ǣ':337,'ǣ':338,'Ǥ':339,'ǥ':340,'Ǧ':341,'ǧ':342,'Ǩ':343,'ǩ':344,'Ǫ':345,'ǫ':346,'Ǭ':347,'ǭ':348,'Ǯ':349,'ǯ':350,'ǰ':351,'Ǳ':352,'ǲ':353,'ǳ':354,'Ǵ':355,'ǵ':356,'Ǻ':357,'ǻ':358,'Ǽ':359,'ǽ':360,'Ǿ':361,'ǿ':362,'Ȁ':363,'ȁ':364,'Ȃ':365,'ȃ':366,'Ȅ':367,'ȅ':368,'Ȇ':369,'ȇ':370,'Ȉ':371,'ȉ':372,'Ȋ':373,'ȋ':374,'Ȍ':375,'ȍ':376,'Ȏ':377,'ȏ':378,'Ȑ':379,'ȑ':380,'Ȓ':381,'ȓ':382,'Ȕ':383,'ȕ':384,'Ȗ':385,'ȗ':386,'ɐ':387,'ɑ':388,'ɒ':389,'ɓ':390,'ɔ':391,'ɕ':392,'ɖ':393,'ɗ':394,'ɘ':395,'ə':396,'ɚ':397,'ɛ':398,'ɜ':399,'ɝ':400,'ɞ':401,'ɟ':402,'ɠ':403,'ɡ':404,'ɢ':405,'ɣ':406,'ɤ':407,'ɥ':408,'ɦ':409,'ɧ':410,'ɨ':411,'ɩ':412,'ɪ':413,'ɫ':414,'ɬ':415,'ɭ':416,'ɮ':417,'ɯ':418,'ɰ':419,'ɱ':420,'ɲ':421,'ɳ':422,'ɴ':423,'ɵ':424,'ɶ':425,'ɷ':426,'ɸ':427,'ɹ':428,'ɺ':429,'ɻ':430,'ɼ':431,'ɽ':432,'ɾ':433,'ɿ':434,'ʀ':435,'ʁ':436,'ʂ':437,'ʃ':438,'ʄ':439,'ʅ':440,'ʆ':441,'ʇ':442,'ʈ':443,'ʉ':444,'ʊ':445,'ʋ':446,'ʌ':447,'ʍ':448,'ʎ':449,'ʏ':450,'ʐ':451,'ʑ':452,'ʒ':453,'ʓ':454,'ʔ':455,'ʕ':456,'ʖ':457,'ʗ':458,'ʘ':459,'ʙ':460,'ʚ':461,'ʛ':462,'ʜ':463,'ʝ':464,'ʞ':465,'ʟ':466,'ʠ':467,'ʡ':468,'ʢ':469,'ʣ':470,'ʤ':471,'ʥ':472,'ʦ':473,'ʧ':474,'ʨ':475,'ʰ':476,'ʱ':477,'ʲ':478,'ʳ':479,'ʴ':480,'ʵ':481,'ʶ':482,'ʷ':483,'ʸ':484,'ʻ':485,'ʼ':486,'ʽ':487,'ʾ':488,'ʿ':489,'ˀ':490,'ˁ':491,'ː':492,'ˑ':493,'ˠ':494,'ˡ':495,'ˢ':496,'ˣ':497,'ˤ':498,'ͺ':499,'Ά':500,'Έ':501,'Ή':502,'Ί':503,'Ό':504,'Ύ':505,'Ώ':506,'ΐ':507,'Α':508,'Β':509,'Γ':510,'Δ':511,'Ε':512,'Ζ':513,'Η':514,'Θ':515,'Ι':516,'Κ':517,'Λ':518,'Μ':519,'Ν':520,'Ξ':521,'Ο':522,'Π':523,'Ρ':524,'Σ':525,'Τ':526,'Υ':527,'Φ':528,'Χ':529,'Ψ':530,'Ω':531,'Ϊ':532,'Ϋ':533,'ά':534,'έ':535,'ή':536,'ί':537,'ΰ':538,'α':539,'β':540,'γ':541,'δ':542,'ε':543,'ζ':544,'η':545,'θ':546,'ι':547,'κ':548,'λ':549,'μ':550,'ν':551,'ξ':552,'ο':553,'π':554,'ρ':555,'ς':556,'σ':557,'τ':558,'υ':559,'φ':560,'χ':561,'ψ':562,'ω':563,'ϊ':564,'ϋ':565,'ό':566,'ύ':567,'ώ':568,'ϐ':569,'ϑ':570,'ϒ':571,'ϓ':572,'ϔ':573,'ϕ':574,'ϖ':575,'Ϛ':576,'Ϝ':577,'Ϟ':578,'Ϡ':579,'ϰ':580,'ϱ':581,'ϲ':582,'ϳ':583,'Ё':584,'Ђ':585,'Ѓ':586,'Є':587,'Ѕ':588,'І':589,'Ї':590,'Ј':591,'Љ':592,
																																	'Њ':593,'Ћ':594,'Ќ':595,'Ў':596,'Џ':597,'А':598,'Б':599,'В':600,'Г':601,'Д':602,'Е':603,'Ж':604,'З':605,'И':606,'Й':607,'К':608,'Л':609,'М':610,'Н':611,'О':612,'П':613,'Р':614,'С':615,'Т':616,'У':617,'Ф':618,'Х':619,'Ц':620,'Ч':621,'Ш':622,'Щ':623,'Ъ':624,'Ы':625,'Ь':626,'Э':627,'Ю':628,'Я':629,'а':630,'б':631,'в':632,'г':633,'д':634,'е':635,'ж':636,'з':637,'и':638,'й':639,'к':640,'л':641,'м':642,'н':643,'о':644,'п':645,'р':646,'с':647,'т':648,'у':649,'ф':650,'х':651,'ц':652,'ч':653,'ш':654,'щ':655,'ъ':656,'ы':657,'ь':658,'э':659,'ю':660,'я':661,'ё':662,'ђ':663,'ѓ':664,'є':665,'ѕ':666,'і':667,'ї':668,'ј':669,'љ':670,'њ':671,'ћ':672,'ќ':673,'ў':674,'џ':675,'Ѡ':676,'ѡ':677,'Ѣ':678,'ѣ':679,'Ѥ':680,'ѥ':681,'Ѧ':682,'ѧ':683,'Ѩ':684,'ѩ':685,'Ѫ':686,'ѫ':687,'Ѭ':688,'ѭ':689,'Ѯ':690,'ѯ':691,'Ѱ':692,'ѱ':693,'Ѳ':694,'ѳ':695,'Ѵ':696,'ѵ':697,'Ѷ':698,'ѷ':699,'Ѹ':700,'ѹ':701,'Ѻ':702,'ѻ':703,'Ѽ':704,'ѽ':705,'Ѿ':706,'ѿ':707,'Ҁ':708,'ҁ':709,'Ґ':710,'ґ':711,'Ғ':712,'ғ':713,'Ҕ':714,'ҕ':715,'Җ':716,'җ':717,'Ҙ':718,'ҙ':719,'Қ':720,'қ':721,'Ҝ':722,'ҝ':723,'Ҟ':724,'ҟ':725,'Ҡ':726,'ҡ':727,'Ң':728,'ң':729,'Ҥ':730,'ҥ':731,'Ҧ':732,'ҧ':733,'Ҩ':734,'ҩ':735,'Ҫ':736,'ҫ':737,'Ҭ':738,'ҭ':739,'Ү':740,'ү':741,'Ұ':742,'ұ':743,'Ҳ':744,'ҳ':745,'Ҵ':746,'ҵ':747,'Ҷ':748,'ҷ':749,'Ҹ':750,'ҹ':751,'Һ':752,'һ':753,'Ҽ':754,'ҽ':755,'Ҿ':756,'ҿ':757,'Ӏ':758,'Ӂ':759,'ӂ':760,'Ӄ':761,'ӄ':762,'Ӈ':763,'ӈ':764,'Ӌ':765,'ӌ':766,'Ӑ':767,'ӑ':768,'Ӓ':769,'ӓ':770,'Ӕ':771,'ӕ':772,'Ӗ':773,'ӗ':774,'Ә':775,'ә':776,'Ӛ':777,'ӛ':778,'Ӝ':779,'ӝ':780,'Ӟ':781,'ӟ':782,'Ӡ':783,'ӡ':784,'Ӣ':785,'ӣ':786,'Ӥ':787,'ӥ':788,'Ӧ':789,'ӧ':790,'Ө':791,'ө':792,'Ӫ':793,'ӫ':794,'Ӯ':795,'ӯ':796,'Ӱ':797,'ӱ':798,'Ӳ':799,'ӳ':800,'Ӵ':801,'ӵ':802,'Ӹ':803,'ӹ':804,'Ա':805,'Բ':806,'Գ':807,'Դ':808,'Ե':809,'Զ':810,'Է':811,'Ը':812,'Թ':813,'Ժ':814,'Ի':815,'Լ':816,'Խ':817,'Ծ':818,'Կ':819,'Հ':820,'Ձ':821,'Ղ':822,'Ճ':823,'Մ':824,'Յ':825,'Ն':826,'Շ':827,'Ո':828,'Չ':829,'Պ':830,'Ջ':831,'Ռ':832,'Ս':833,'Վ':834,'Տ':835,'Ր':836,'Ց':837,'Ւ':838,'Փ':839,'Ք':840,'Օ':841,'Ֆ':842,'ՙ':843,'ա':844,'բ':845,'գ':846,'դ':847,'ե':848,'զ':849,'է':850,'ը':851,'թ':852,'ժ':853,'ի':854,'լ':855,'խ':856,'ծ':857,'կ':858,'հ':859,'ձ':860,'ղ':861,'ճ':862,'մ':863,'յ':864,'ն':865,'շ':866,'ո':867,'չ':868,'պ':869,'ջ':870,'ռ':871,'ս':872,'վ':873,'տ':874,'ր':875,'ց':876,'ւ':877,'փ':878,'ք':879,'օ':880,'ֆ':881,'և':882,'א':883,'ב':884,'ג':885,'ד':886,'ה':887,'ו':888,'ז':889,'ח':890,'ט':891,'י':892,'ך':893,'כ':894,'ל':895,'ם':896,'מ':897,'ן':898,'נ':899,'ס':900,'ע':901,'ף':902,'פ':903,'ץ':904,'צ':905,'ק':906,'ר':907,'ש':908,'ת':909,'װ':910,'ױ':911,'ײ':912,'ء':913,'آ':914,'أ':915,'ؤ':916,'إ':917,'ئ':918,'ا':919,'ب':920,'ة':921,'ت':922,'ث':923,'ج':924,'ح':925,'خ':926,'د':927,'ذ':928,'ر':929,'ز':930,'س':931,'ش':932,'ص':933,'ض':934,'ط':935,'ظ':936,'ع':937,'غ':938,'ـ':939,'ف':940,'ق':941,'ك':942,'ل':943,'م':944,'ن':945,'ه':946,'अ':947,'आ':948,'इ':949,'ई':950,'उ':951,'ऊ':952,'ऋ':953,'ऌ':954,'ऍ':955,'ऎ':956,'ए':957,'ऐ':958,'ऑ':959,'ऒ':960,'ओ':961,'औ':962,'क':963,'ख':964,'ग':965,'घ':966,'ङ':967,'च':968,'छ':969,'ज':970,'झ':971,'ञ':972,'ट':973,'ठ':974,'ड':975,'ढ':976,'ण':977,'त':978,'थ':979,'द':980,'ध':981,'न':982,'ऩ':983,'प':984,'फ':985,'ब':986,'भ':987,'म':988,'य':989,'र':990,'ऱ':991,'ल':992,'ळ':993,'ऴ':994,'व':995,'श':996,'ष':997,'स':998,'स':999} 
					code = code + '';
					return code.replace(/./g,function(c) {
						c = c + '';
						return typeof chars[c] != 'undefined' ? chars[c] + '' : c + '';
					});
			break;
			case "base62":
				var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split('');
				return code.replace(/(\d{1,2})/g,function($0, d){
					return chars[d] ? chars[d] : d;
				});				
			break;
			case "d_base62":
				var chars = {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,G:16,H:17,I:18,J:19,K:20,L:21,M:22,N:23,O:24,P:25,Q:26,R:27,S:28,T:29,U:30,V:31,W:32,X:33,Y:34,Z:35,a:36,b:37,c:38,d:39,e:40,f:41,g:42,h:43,i:44,j:45,k:46,l:47,m:48,n:49,o:50,p:51,q:52,r:53,s:54,t:55,u:56,v:57,w:58,x:59,y:60,z:61};
				return code.replace(/(\w)/g,function($0, c){
					return chars[c] ? chars[c] : c;
				});
			break;
			case "base36":
				if(/[^\d]/.test(code)) {				
					var converted = [];
					code = code.split(',');
					for(var i=0;i<code.length;i++) {
						converted.push(parseInt(code[i]).toString(36));
					}
					return converted.join(',');
				} else {
					return parseInt(code).toString(36);
				}				
			break;
			case "d_javascript":
				var result;			
				var html = '';
				var parser = JSReg.create();
					parser.setDebugObjects({result: function(code){										
											result = code;
											},
											onComplete: function(){
												document.body.removeChild(parser.environment);
											}
											});
					
					if (window.__defineSetter__) {
						var htmlLog = function(str) {
							html += str;
						}
						var obj = {					
							$write$:htmlLog,
							$body$:htmlLog 						
						}					
						obj.$body$.__defineSetter__('$innerHTML$',htmlLog);
						obj.__defineSetter__('$innerHTML$',htmlLog);
						parser.setDocument(obj);
					}
					try {				
						parser.runCheck();
						parser.eval(code);
					} 
					catch (e) {			
						alert(e.description||e);
					}

				alert('Decoding javascript...');
				if(html != '') {
					result += '\nHTML:'+html;
				}				
				return result;
			break;
			case "d_string":
				var splitChar = this.params[0];
				var result = this.params[1];
				code = code.split(splitChar);
				var msg = 'String identified as:';
				if (code.length > 1) {
					var msgs = [];
					result = result.getCharacterCodes();									
					for(var i=0;i<code.length;i++) {
						for (var j = 0; j < 36; j++) {
							var base = j + 1;
							var baseConverted = parseInt(code[i], base);
							if (baseConverted == result[i]) {
								msgs.push('Char'+i+':base'+base);								
								continue;
							}							
						}
					}		
					
					for (var i = 0; i < 200; i++) {
						var matches = [];
						for (var j = 0; j < code.length; j++) {;
							if((parseInt(code[j].charCodeAt(0)) ^ i) == parseInt(result[j])) {
								matches.push(i);
							}
						}
						if(matches.length == result.length) {							
							return msg + '\n' + 'XOR the key is:'+i;
						}																								
					}					
								
					for (var i = 0; i < 200; i++) {
						var matches = [];
						for (var j = 0; j < code.length; j++) {
							if(parseInt(code[j])-i == parseInt(result[j])) {
								matches.push(i)
							}
						}
						if(matches.length == result.length) {
							return msg + '\n' + 'offset is -'+i;
						}
						var matches = [];
						for (var j = 0; j < code.length; j++) {
							if(parseInt(code[j])+i == parseInt(result[j])) {
								matches.push(i)
							}
						}
						if(matches.length == result.length) {
							return msg + '\n' + 'offset is +'+i;
						}
						var matches = [];
						for (var j = 0; j < code.length; j++) {
							if(parseInt(code[j])*i == parseInt(result[j])) {
								matches.push(i)
							}
						}
						if(matches.length == result.length) {
							return msg + '\n' + 'offset is *'+i;
						}
						var matches = [];
						for (var j = 0; j < code.length; j++) {
							if(parseInt(code[j])/i == parseInt(result[j])) {
								matches.push(i)
							}
						}
						if(matches.length == result.length) {
							return msg + '\n' + 'offset is /'+i;
						}																								
					}					
										
					for (var k = 0; k < 36; k++) {
						var base = k + 1;												
						for (var i = 0; i < 200; i++) {
							
							var matches = [];
							for (var j = 0; j < code.length; j++) {
								var baseConverted = parseInt(code[j], base);
								if (baseConverted - i == parseInt(result[j])) {
									matches.push(i)
								}
							}
							if (matches.length == result.length) {
								return msg + '\n' + 'base' + base + '->' + 'offset is -' + i;
							}
							var matches = [];
							for (var j = 0; j < code.length; j++) {
								var baseConverted = parseInt(code[j], base);
								if (baseConverted + i == parseInt(result[j])) {
									matches.push(i)
								}
							}
							if (matches.length == result.length) {
								return msg + '\n' + 'base' + base + '->' + 'offset is +' + i;
							}
							var matches = [];
							for (var j = 0; j < code.length; j++) {
								var baseConverted = parseInt(code[j], base);
								if (baseConverted * i == parseInt(result[j])) {									
									matches.push(i)
								}
							}
							if (matches.length == result.length) {
								return msg + '\n' + 'base' + base + '->' + 'offset is *' + i;
							}
							var matches = [];
							for (var j = 0; j < code.length; j++) {
								var baseConverted = parseInt(code[j], base);
								if (baseConverted / i == parseInt(result[j])) {
									matches.push(i)
								}
							}
							if (matches.length == result.length) {
								return msg + '\n' + 'base' + base + '->' + 'offset is /' + i;
							}
						}
					}																				
					if (msgs.length > 0) {
						return msg + '\n' + msgs.join(',');
					} else {
						return msg + 'Unknown';
					}
				} else {	
																		
					for (var i = 0; i < 36; i++) {
						var base = i + 1;
						if (parseInt(code, base) == result) {
							return msg + 'base' + base;
						}
						if (parseInt(result, base) == code) {
							return msg + 'base' + base;
						}						
					}
					if(code.toString().reverse() == result) {
						return msg + 'Reversed string';
					}
					
					if(!new RegExp('[^'+code.toString().regExpEscape()+']').test(result)) {
						return msg + 'Possible anagram';
					}
					
					code = code.toString();					
					var resultCharCodes = result.getCharacterCodes();					
					var cCodes = code.getCharacterCodes();																																																
					
					for (var i = 0; i < 200; i++) {
						var matches = [];
						for (var j = 0; j < cCodes.length; j++) {;
							if((parseInt(cCodes[j]) ^ i) == parseInt(resultCharCodes[j])) {
								matches.push(i);
							}
						}
						if(matches.length == resultCharCodes.length) {							
							return msg + '\n' + 'XOR the key is:'+i;
						}																								
					}
					
					
					for (var i = 0; i < 200; i++) {
						var converted = code.toString().getCharacterCodes().join(',').rotate(33, 126, i).split(',');						
						if(converted.join('') == resultCharCodes.join('')) {
							return msg + 'rot' + i;
						}
					}
					
					try {
						if(atob(code) == result) {
							return msg + 'base64';
						}
					} catch(e){}

					if(code.uudecode() === result) {
						return msg + 'uuencoded';
					}
					
					if(code.utf7_decode('') == result) {						
						return msg + 'utf7';
					}
					
					if(hex_md4(result) == code) {
						return msg + 'md4';
					}
					
					if(hex_md5(result) == code) {
						return msg + 'md5';
					}
					if(hex_sha1(result) == code) {
						return msg + 'sha1';
					}					
					if(hex_sha256(result) == code) {
						return msg + 'sha2';
					}	
					if(unescape(code) == result) {
						return msg + 'urlencoded';
					}
					for (var i = 0; i < 200; i++) {
						if(caeserDecrypt(code, i) == result) {
							return msg + 'caeser shift:'+i;							
						}
					}
					var matches = [];
					for (var j = 0; j < cCodes.length; j++) {;
						matches.push(String.fromCharCode((parseInt(cCodes[j]) ^ parseInt(resultCharCodes[j]))));						
					}
					if(matches.length > 0) {							
						return msg + '\n' + 'partial key or sub cipher:'+matches.join('');
					}											
																																												
				}
				return msg+'Unknown';
			break;
			case "d_base36":
				var converted = [];
				code = code.split(',');
				for(var i=0;i<code.length;i++) {
					converted.push(parseInt(code[i],36));
				}
				return converted.join(',');
			break;
			case "d_base64":
				return atob(code);
			break;
			case "d_css_esc":
				return code.fromcssescapes();
			break;
			case "auto_decode_repeat":
				return code.auto_decode_repeat();
			break;
			case "auto_decode":				
				var convertedCode = code.auto_decode();
				if(convertedCode == false) {
					return code;
				} else {
					return convertedCode;
				}				
			break;
			case "skein512":
				code = code.getCharacterCodes();
				for(var i=0;i<code.length;i++) {
					code[i] = parseInt(code[i],10).toString(16);
				}
				return skein512.hash(code.join(""));
			break;
			case "hmac_md4":
				var hmacKey = this.params[0];
				return hex_hmac_md4(hmacKey,code);
			break;
			case "hmac_md5":
				var hmacKey = this.params[0];
				return hex_hmac_md5(hmacKey,code);
			break;
			case "hmac_sha1":
				var hmacKey = this.params[0];
				return hex_hmac_sha1(hmacKey,code);
			break;			
			case "md4":
				return hex_md4(code);
			break;
			case "md5":
				return hex_md5(code);
			break;
			case "sha1":
				return hex_sha1(code);
			break;
			case "sha2":
				return hex_sha256(code);
			break;
			case "bin2dec":
				var splitChar = this.params[0];
				if(splitChar == null) {
					return code.frombinary();
				} else {
					code = code.split(splitChar);
					for(var i=0;i<code.length;i++) {
						code[i] = code[i].frombinary();
					}
					return code.join(splitChar);
				}						
			break;
			case "dec2bin":
				var splitChar = this.params[0];
				if(splitChar == null) {
					return code.tobinary();
				} else {
					code = code.split(splitChar);
					for(var i=0;i<code.length;i++) {
						code[i] = code[i].tobinary();
					}
					return code.join(splitChar);
				}			
			break;
			case "d_bin":
				return code.frombinary();
			break;
			case "dec2hex":
				var splitChar = this.params[0];
				if(splitChar == null) {
					return code.dec2hex();
				} else {
					code = code.split(splitChar);
					for(var i=0;i<code.length;i++) {
						code[i] = code[i].dec2hex();
					}
					return code.join(splitChar);
				}
			break;			
			case "dec2oct":
				var splitChar = this.params[0];
				if(splitChar == null) {
					return code.dec2oct();
				} else {
					code = code.split(splitChar);
					for(var i=0;i<code.length;i++) {
						code[i] = code[i].dec2oct();
					}
					return code.join(splitChar);
				}			
			break;
			case "oct2dec":
			case "hex2dec":

				if(tagType == 'hex2dec') {
					var base = 16;
				} else {
					var base = 8;
				}
									
				var splitChar = this.params[0];
				if(splitChar == null) {
					return parseInt(code);
				} else {
					code = code.split(splitChar);
					for(var i=0;i<code.length;i++) {
						code[i] = parseInt(code[i], base);
					}
					return code.join(splitChar);
				}					
			break;
			case "sort":
				if(code.indexOf(',') == -1) {					
					return code.split('').sort().join('');
				} else {
					return code.split(',').sort().join(',');
				}
			break;
			case "trans":
				var from = this.params[0];
				var to = this.params[1];				
				return code.trans(from, to);
			break;
			case "tosource":
				return new Function(code).toSource(0);				
			break;
			case "jstest":
				var response = '';			
				response += '---E4X---\n';
				response += 'Variables:';
				try {
					eval('x=<test></test>');
					response += 'true';
				} catch(e) {
					response += 'false';
				}
				response +='\n';
				response += 'Inline:';
				try {
					eval('<test></test>');
					response += 'true';
				} catch(e) {
					response += 'false';
				}
				response +='\n';				
				response += '---Variables---\n';	
				response += 'constants:';
				try {
					eval("const XXYYZZ=1;");
					response += 'true';
				} catch(e) {
					response += 'false';
				}
				response += '\n';
				response += '---Objects---\n';				
				response += '.valueOf:' + (({}).valueOf?true:false)+'\n';
				response += '.toSource:' + (({}).toSource?true:false)+'\n';
				response += '.toString:' + (({}).toString?true:false)+'\n';								
				response += '---Functions---\n';
				response += '.name:' + ((function x(){}).name?true:false)+'\n';
				response += '.callee:' + ((function(){ try {return arguments.callee ? true : false;}catch(e){return false;} })())+'\n';				
				response += '.caller:' + ((function(){ try {return arguments.callee.caller ? true : false;}catch(e){return false;} })())+'\n';
				response += 'unicode encoding:';
				try {
					eval("function x(){};\\u0078()");
					response += 'true';
				} catch(e) {
					response += 'false';
				}							
				response += '\n';
				response += 'unicode encode parenthesis?:';
				try {
					eval("function x(){};\\u0078\\u0028\\u0029");
					response += 'true';
				} catch(e) {
					response += 'false';
				}							
				response += '\n';
				response += 'setter function x(){}:';
				try {
					eval("setter function x(){}");
					response += 'true';					
				} catch(e) {
					response += 'false';
				}
				response += '\n';
				response += 'getter function x(){}:';
				try {
					eval("getter function x(){}");
					response += 'true';					
				} catch(e) {
					response += 'false';
				}
				response += '\n';
				response += 'function get x(){}:';
				try {
					eval("function get x(){}");
					response += 'true';					
				} catch(e) {
					response += 'false';
				}
				response += '\n';				
				response += 'function set x(){}:';
				try {
					eval("function set x(){}");
					response += 'true';					
				} catch(e) {
					response += 'false';
				}
				response += '\n';												
								
				response += '---Arrays---\n';				
				response += 'indexOf():' + ([].indexOf?true:false)+'\n';
				response += 'lastIndexOf():' + ([].lastIndexOf?true:false)+'\n';				
				response += 'every():' + ([].every?true:false)+'\n';
				response += 'filter():' + ([].filter?true:false)+'\n';
				response += 'forEach():' + ([].forEach?true:false)+'\n';								
				response += 'map():' + ([].map?true:false)+'\n';
				response += 'some():' + ([].some?true:false)+'\n';
				response += 'reduce():' + ([].reduce?true:false)+'\n';
				response += 'reduceRight():' + ([].reduceRight?true:false)+'\n';				
				
				response += '---Strings---\n';
				response += 'String Indexes:' + ('test'[0]=='t')+'\n';
				response += '---Getters/Setters---\n';
				response += '__defineGetter__:' + (window.__defineGetter__?true:false)+'\n';
				response += '__defineSetter__:' + (window.__defineSetter__?true:false)+'\n';				
				response += '__lookupGetter__:' + (window.__lookupGetter__?true:false)+'\n';								
				response += '__lookupSetter__:' + (window.__lookupSetter__?true:false)+'\n';												
				response += '---IE specific---\n';				
				response += 'toStaticHTML():' + (window.toStaticHTML?true:false)+'\n';																
				response += '---Destructuring assignments---\n';
				response += 'Arrays:';
				try {
					eval('var a = 1;var b = 2;[a, b]=[b, a];');
					response += 'true';					
				} catch(e) {
					response += 'false';
				}
				response +='\n';		
				response += 'Assignment correct?:';									
				try {
					response += a == 2 && b == 1 ? true : false;
				} catch(e) { response += 'false'; }
				response +='\n';		
				response += '---Expression closures---\n';
				response += 'Variable:';
				try {
					eval('var x=function(x) x * x;');
					response += 'true';					
				} catch(e) {
					response += 'false';
				}	
				response +='\n';		
				response += 'Inline:';
				try {
					eval('function(x) x * x;');
					response += 'true';					
				} catch(e) {
					response += 'false';
				}						
				response +='\n';	
				response += '---DOM prototypes overwrites __syntax___---\n';
				response += 'location:';
				try {
					eval("window.__defineGetter__('location',function() { return 'Overwrite' });overwrite=location=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';

				response += 'location.hash:';
				try {
					eval("location.__defineGetter__('hash',function() { return 'Overwrite' });overwrite=location.hash=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';
				response += 'location.host:';
				try {
					eval("location.__defineGetter__('host',function() { return 'Overwrite' });overwrite=location.host=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';
				response += 'location.hostname:';
				try {
					eval("location.__defineGetter__('hostname',function() { return 'Overwrite'});overwrite=location.hostname=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';
				response += 'location.href:';
				try {
					eval("location.__defineGetter__('href',function() { return 'Overwrite' });overwrite=location.href=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';
				response += 'location.search:';
				try {
					eval("location.__defineGetter__('search',function() { return 'Overwrite' });overwrite=location.search=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';

				response += 'document.domain:';
				try {
					eval("document.__defineGetter__('domain',function() { return 'Overwrite' });overwrite=document.domain=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';

				response += 'document.referrer:';
				try {
					eval("document.__defineGetter__('referrer',function() { return 'Overwrite' });overwrite=document.referrer=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';


				response += 'document.URL:';
				try {
					eval("document.__defineGetter__('URL',function() { return 'Overwrite' });overwrite=document.URL=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';

				response += 'navigator.userAgent:';
				try {
					eval("navigator.__defineGetter__('userAgent',function() { return 'Overwrite' });overwrite=navigator.userAgent=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';

				response += '---DOM prototypes overwrites defineProperty---\n';
				response += 'location:';																								
				try {
					eval("Object.defineProperty(window,'location',{get:function(){ return 'Overwrite';}});overwrite=location=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';

				response += 'location.hash:';																								
				try {
					eval("Object.defineProperty(location,'hash',{get:function(){ return 'Overwrite';}});overwrite=location.hash=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';
				response += 'location.host:';
				try {
					eval("Object.defineProperty(location,'host',{get:function(){ return 'Overwrite';}});overwrite=location.host=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';
				response += 'location.hostname:';
				try {
					eval("Object.defineProperty(location,'hostname',{get:function(){ return 'Overwrite';}});overwrite=location.hostname=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';
				response += 'location.href:';
				try {
					eval("Object.defineProperty(location,'href',{get:function(){ return 'Overwrite';}});overwrite=location.href=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';
				response += 'location.search:';
				try {
					eval("Object.defineProperty(location,'search',{get:function(){ return 'Overwrite';}});overwrite=location.search=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';

				response += 'document.domain:';
				try {
					eval("Object.defineProperty(document,'domain',{get:function(){ return 'Overwrite';}});overwrite=document.domain=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';

				response += 'document.referrer:';
				try {
					eval("Object.defineProperty(document,'referrer',{get:function(){ return 'Overwrite';}});overwrite=document.referrer=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';


				response += 'document.URL:';
				try {
					eval("Object.defineProperty(document,'URL',{get:function(){ return 'Overwrite';}});overwrite=document.URL=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';

				response += 'navigator.userAgent:';
				try {
					eval("Object.defineProperty(navigator,'userAgent',{get:function(){ return 'Overwrite';}});overwrite=navigator.userAgent=='Overwrite'?true:false;");
				} catch(e) { overwrite = false; };
				response += ''+overwrite+'\n';


				return response;
			break;		
			case "js2str":
				if(confirm('Run this code?\n' + code)) {
					return eval(code);
				} else {
					return '';
				}
			break;
			case "stripnewlines":
				return code.replace(/\n/g, '');
			break;
			case "nullnamedents":
				var chars = '', strchar = '';
				var numberOfChars = parseInt(this.params[0]);
				if(isNaN(numberOfChars)) {
					numberOfChars = 1;
				}
				var nullEnts = ['&zwj;','&zwnj;','&lrm;','&rlm;'];
				for(var i = 0; i < numberOfChars; i++) {
					strchar += nullEnts[getRandom(0, nullEnts.length-1)];				
					chars += strchar;					
				}
				return chars;				
			break;
			case "nullchars":
			case "nullents":
				var chars = '', strchar = '';
				var numberOfChars = parseInt(this.params[0]);
				if(isNaN(numberOfChars)) {
					numberOfChars = 1;
				}
				var nullEnts = ['&#8204','&#8205','&#8206','&#8207','&#8234','&#8235','&#8236','&#8237','&#8238','&#8298','&#8299','&#8300','&#8301','&#8302','&#8303','&#65279',
						  		 '&#x200c;','&#x200f;','&#x202a;','&#x202b;','&#x202c;','&#x202d;','&#x202e;','&#x206a;','&#x206b;','&#x206c;','&#x206d;','&#x206e;','&#x206f;','&#xfeff;'];
				for(var i = 0; i < numberOfChars; i++) {
					strchar += nullEnts[getRandom(0, nullEnts.length-1)];
					if(tagType == 'nullchars') {
						strchar = strchar.replace(/[&#;]/g,'');
						strchar = String.fromCharCode(strchar);
						chars += strchar;
					} else {
						chars += strchar;
					}
				}
				return chars;		
			break;
			case "ucfirst":
				return code.ucfirst();
			break;
			case "upper":
				return code.toUpperCase();
			break;
			case "lower":
				return code.toLowerCase();
			break;
			case "mixed":
				return code.toMixedCase();
			break;
			case "find":
				var regexpstr = this.params[0];
				var flags = this.params[1];
				var re = new RegExp(regexpstr, flags);	
				return code.match(re);			
			break;
			case "replace":
				var findStr = this.params[0];
				var replaceStr = this.params[1].replace(/\\n/,'\n').replace(/\\t/,'\t');
				return code.replace(new RegExp(findStr,'g'),replaceStr);
			break;
			case "splitjoin":
				var splitChar = this.params[0];
				var joinChar = this.params[1];
				code = code.split(splitChar);
				return code.join(joinChar);
			break;	
			case "splitjointag":
				var splitChar = this.params[0];
				var joinChar = this.params[1];
				var tagName = this.params[2];
				code = code.split(splitChar);
				var str = [];
				for(var i=0;i<code.length;i++) {
					var strchar = code[i];
					var addedTag = tagName + '_' + tagNumber + '';
					str.push(this.startTag + addedTag + this.endTag + strchar + this.startTag + '/' + addedTag + this.endTag);
					tagNumber++;
				}
				return str.join(joinChar);
			break;
			case "repeat":
				var amount = parseInt(this.params[0]);
				return code.repeat(amount);
			break;
			case "reverse":
				return code.reverse();
			break;
			case "substr":
				var start = parseInt(this.params[0]);
				var length = parseInt(this.params[1]);
				return code.substr(start,length);
			break;
			case "slength":
				return code.length;
			break;	
			case "name_gen":
				var vectorQuotes = ['"','\''];
				var vectorSeparators = [';',','];
				var vectors = ['eval(name)','location=name','name=document.cookie',"name=document['cookie']","new Function(name)()","execScript(name)"];
				var vector = vectors[Math.floor(Math.random()*vectors.length)];
				vector = vector.replace(/([a-z]+)/g,function($0) {
					var randChar = Math.floor(Math.random()*$0.length);		
					var uni = '\\u00' + $0.charCodeAt(randChar).toString(16);
					$0 = $0.split('');
					$0[randChar] = uni;
					return $0.join('');
				});
				return vectorQuotes[Math.floor(Math.random()*vectorQuotes.length)] + vectorSeparators[Math.floor(Math.random()*vectorSeparators.length)] + vector;			
			break;
			case "location_gen":
				var vectorQuotes = ['"','\''];
				var vectorSeparators = [';',','];
				var vectors = ['location','window.location','document.URL','window[\'location\']','document.location'];
				var vector = vectors[Math.floor(Math.random()*vectors.length)];
				vector = vector.replace(/([a-z]+)/g,function($0) {
					var randChar = Math.floor(Math.random()*$0.length);		
					var uni = '\\u00' + $0.charCodeAt(randChar).toString(16);
					$0 = $0.split('');
					$0[randChar] = uni;
					return $0.join('');
				});
				return vectorQuotes[Math.floor(Math.random()*vectorQuotes.length)] + vectorSeparators[Math.floor(Math.random()*vectorSeparators.length)] + vector + "='javascript:alert(1)'";			
			break;
			case "jsurl_gen":
				var javascriptURL = 'javascript:';
				return javascriptURL.replace(/./g,function($0) {
					var zeros = getRandom(1,6);
					var url = '';
					if (getRandom(0, 1)) {
						url = '&#x' + $0.charCodeAt(0).toString(16).zeroFill(zeros) + ';';
					} else {
						url = '&#' + $0.charCodeAt(0).toString().zeroFill(zeros) + (getRandom(0,1) ? ';' : '');
					}								
					return url;
				})
			break;
			case "dom_gen":
				var vectorQuotes = ['"','\''];
				var vectorSeparators = [';',',','in ','instanceof ','+','-','/','%','^','*'];
				return vectorQuotes[Math.floor(Math.random()*vectorQuotes.length)] + vectorSeparators[Math.floor(Math.random()*vectorSeparators.length)] + 'alert(1)//';			
			break;
			case "xbl":
				return '<link href="http://www.businessinfo.co.uk/labs/xss/binding.css" type=text/css rel=stylesheet media=all>';
			break;
			case "expression_gen":
				if(code == '') {
					var vector = 'xss:expression(alert(1))';
				} else {
					var vector = code;
				}				
				
				vector = vector.replace(/expression/, function($0){
					return $0.replace(/([xprsion])/,function($1) { 
						return '\\' + $1; 
					});
				});
				
				if(!/&.+;/.test(vector)) {					
					vector = vector.replace(/:.+/, function($0){
						return $0.replace(/[a-z][a-z]|[()]/i,function($0){
							
						var numberOfChars = getRandom(0,20);
						var randChars = '';
						for(var i=0;i<numberOfChars;i++) {							
							randChars += String.fromCharCode(getRandom(97,122));
						}																			
							return $0 + '/*' + randChars + '*/'
						});
					});						
				}
								
				vector = vector.replace(/:.+/, function($0){
					return $0.replace(/\/\*.+\*\/|[\\][a-z]|[a-z][a-z]|[()]|\\0*[0-9a-fA-F]{1,2}/i,function($0){						
						if (Math.floor(Math.random() * 2) == 1) {
							return $0.tohex_ent(';')
						} else {							
							var semiColons = Math.floor(Math.random() * 2) == 1 ? ';' : '';
							return $0.todec_ent(semiColons);
						}
					});
				});								
				
				vector = vector.replace(/\w+:.+/, function($0){
					return $0.replace(/[a-z][a-z]|[()]/i,function($0){
						var zeros = Math.floor(Math.random()*50);
						var randomSpaces = Math.floor(Math.random()*2);						
						return $0.tounicode('\\'+'0'.repeat(zeros)) + (randomSpaces == 1 ? ' ' : '');
					});
				});				
				
								
				return vector;		
			break;
			case "cssexpression":
				if(code.length == 0) {
					code = 'alert(/XSS/)';
				}
				return "xss:expression(window.x?0:("+code+",window.x=1));";						
			break;
			case "hasegawa":
				var symbols = (this.params[0]+'').split('');
				var func = '';
				var symbol = '$';
				var symbol1 = "$";	
				var symbol2 = "$$";	
				var symbol3 = "$$$";
				var symbol4 = "$$$$";
				var symbol5 = "$$$$$";
				var symbol6 = "$$$$$$";
				
				for(var i=0;i<6;i++) {
					if (symbols.length > 0) {
						var pos = getRandom(0, symbols.length - 1);
						var symbol = symbols[pos];
						symbols.splice(pos, 1);
					} else {
						symbol += symbol;
					}
					switch(i) {
						case 0:
							symbol1 = symbol;
						break;
						case 1:
							symbol2 = symbol;
						break;
						case 2:
							symbol3 = symbol;
						break;
						case 3:
							symbol4 = symbol;
						break;
						case 4:
							symbol5 = symbol;
						break;
						case 5:
							symbol6 = symbol;
						break;																														
					}
				}
								
				var nums = [symbol1+"-"+symbol1,symbol1+"-"+symbol2,symbol2,symbol1,symbol2+"+"+symbol2,symbol2+"+"+symbol1,symbol1+"+"+symbol1,symbol3,symbol4,symbol1+"*"+symbol1];					
				func += symbol2+"=-~-~[],"+symbol1+"=-~"+symbol2+","+symbol4+"="+symbol2+"<<"+symbol2+","+symbol3+"="+symbol4+"+~[];";
				func += symbol5+"=("+nums[0]+")["+symbol6+"=(''+{})["+nums[5]+"]+(''+{})["+nums[1]+"]+([]."+symbol1+"+'')["+nums[1]+"]+(!!''+'')["+nums[3]+"]+({}+'')["+nums[6]+"]+(!''+'')["+nums[1]+"]+(!''+'')["+nums[2]+"]+(''+{})["+nums[5]+"]+({}+'')["+nums[6]+"]+(''+{})["+nums[1]+"]+(!''+'')["+nums[1]+"]]["+symbol6+"]";				
				
				code = code.replace(/.+/,function(c) {
					var output = [];
					c = c + '';
					for (var j = 0; j < c.length; j++) {
						var cc = c.charCodeAt(j).toString(8).split('');
						for (var i = 0; i < cc.length; i++) {
							cc[i] = "(" + nums[cc[i]] + ")";
						}
						output.push('\'\\\\\'+' + cc.join('+'));
					}									
					return "+"+symbol5+"((!''+'')["+nums[1]+"]+(!''+'')["+nums[3]+"]+(!''+'')["+nums[0]+"]+(!''+'')["+nums[2]+"]+((!''+''))["+nums[1]+"]+([].$+'')["+nums[1]+"]"+"+\'\\''"+"+"+'\'\'+'+output.join('+')+"+\'\\'')()";
				});
				return func+';'+''+symbol5+'('+code.replace(/^\+/,'')+')()';
			break;
			case "sirdarckcat_twitter_enc":
				return code.replace(/[\x01-\xFF]{1,2}/g,function(_){var u=_.charCodeAt(),d=_[1]?_.charCodeAt(1):0;return String.fromCharCode((u<<8)+d)}); 
			break;
			case "sirdarckcat_twitter_de":
				return code.replace(/./g,function(_){var d=_.charCodeAt();return String.fromCharCode(d>>8,d%256);}); 
			break;			
			case "sirdarckcat":
				return (function bs(n) {return parseInt(n, n = n.split().sort().pop().charCodeAt() - 86) + "..toString(" + n + ")";})(code);
			break;
			case "ascetik":
				var charnum = parseInt(this.params[0]);
				code = code.getCharacterCodes();
				var converted = '';
				for(var i=0;i<code.length;i++) {
					converted += String.fromCharCode((charnum << 8) | parseInt(code[i]));
				}
				return converted;
			break;
		}
	}
	this.setOption = function(option, value) {
		this.options[option] = value;
	}
	this.getOption = function(option) {
		return this.options[option];
	}
	this.getSelectedText = function() {    
	var txt = '';    
		if(window.getSelection) {
		   txt = window.getSelection();
		} else if (document.getSelection) {
			txt = document.getSelection();
		} else if (document.selection) {
			txt = document.selection.createRange().text;
		} else {
			return;      
		}
		
		var input = document.getElementById('input');
		if(txt == '') {
		  txt = (input.value).substring(input.selectionStart,input.selectionEnd);      
		  return txt;
		} else { 
		  return txt;
		}
	}
	this.addTag = function(spanElement) {
		var singleTags = /\b(?:rand_lexicon|c_rtl_on|c_rtl_off|c_ltr_on|c_ltr_off|dom_gen|jsurl_gen|location_gen|name_gen|jstest|charfill|jsvariable|cssexpression|c_js|c_null|c_tab|c_newline|c_maxunicode|randchars|randnum|randletters|randletternums|nullents|nullchars|nullnamedents)\b/;
				
		var txt = this.getSelectedText();
		var data;
		var input = document.getElementById('input');
		var realTagName = spanElement.innerHTML;
		var tagName = realTagName + '_' + tagNumber + '';		
		tagNumber++;		
		var firstTagName = tagName;
		switch(realTagName) {
			case "malformed_uri":
				firstTagName += '(1)';
			break;
			case "overlong_utf8":
				firstTagName += '(6,false)';
			break;
			case "hasegawa":
				firstTagName += '("ªÀÁÂÃÄÆÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ$_")';
			break;
			case "tocharcodes":
				firstTagName += '("",",")';
			break;
			case "xor_range_encode":
			case "xor_range_decode":
				firstTagName += '(",","secretkey")';
			break;
			case "frequency":
				firstTagName += '(",")';
			break;
			case "to_chr_num":
			case "from_chr_num":
				firstTagName += '(",",abcdefghijklmnopqrstuvwxyz0123456789,"")';
			break;
			case "extract":
				firstTagName += '(0,2,",")';			
			break;
			case "vigenere_dec":
			case "vigenere_enc":
				firstTagName += '(key)';			
			break;
			case "xor":
				firstTagName += '(10)';
			break;
			case "d_string":
				firstTagName += '(",",test)';
			break;
			case "str_insert":
				firstTagName += '(a,1,0)';
			break;
			case "rand_lexicon":
				firstTagName += '(a)';
			break;
			case "lang_trans":
				firstTagName += '(en,es)';
			break;
			case "htmlize":
				firstTagName += '(regexp,<span>{text}</span>,"")';			
			break;
			case "jsvariable":
				firstTagName += '(from, to)';			
			break;
			case "ascetik":
				firstTagName += '(1)';
			break;
			case "ip2dword":
				firstTagName += '(numToRepeat)';
			break;
			case "ip2oct":
				firstTagName += '(0,.)';
			break;
			case "ip2hex":
				firstTagName += '(0x,.)';
			break;
			case "unique":
				firstTagName += '(regexp)';
			break;
			case "arrayify":
				firstTagName += '(regexp,php|js|ruby|java|c|vbscript|perl|python)';
			break;
			case "utf7":
				firstTagName += '("\\s\\t\\r\'(),-./:?\\w\\d=+!")';
			break;
			case "rotate":
				firstTagName += '(from,to,by)';
			break;
			case "convert_base":
				firstTagName += '(\',\',from,to)';
			break;
			case "dec2bin":
			case "oct2dec":
			case "dec2oct":
			case "hex2dec":
			case "dec2hex":
			case "bin2dec":
				firstTagName += '(\',\')';
			break;
			case "range":
				firstTagName += '(100)';
			break;
			case "arithmetic":
				firstTagName += '(10,+,\',\')';
			break;
			case "increment":
				firstTagName += '(10,\',\')';
			break;
			case "decrement":
				firstTagName += '(10,\',\')';
			break;		
			case "nullchars":
			case "nullents":
			case "nullnamedents":	
				firstTagName += '(amount)';
			break;
			case "trans":	
				firstTagName += '(from,to)';
			break;
			case "zerofill":
				firstTagName += '(amount)';
			break;
			case "charfill":
				firstTagName += '(amount,char)';
			break;
			case "uni_hwfw":
			case "uni":
				firstTagName += '(\\u)';
			break;
			case "hex_ent":
			case "dec_ent":
				firstTagName += '(;)';
			break;						
			case "find":
				firstTagName += '(regexp,gim)';
			break;
			case "replace":
				firstTagName += '(findStr,replaceStr)';
			break;
			case "splitjoin":
				firstTagName += '(splitChar,joinChar)';
			break;
			case "splitjointag":
				firstTagName += '(splitChar,joinChar,tagName)';
			break;		
			case "repeat":
				firstTagName += '(amountNum)';
			break;	
			case "substr":
				firstTagName += '(start,length)';
			break;
			case "caesar_dec":
			case "caesar_enc":
				firstTagName += '(keyshift)';
			break;
			case "randnum":
				firstTagName += '(numberOfChars,from,to)';
			break;
			case "randletternums":
			case "randletters":
			case "randchars":
				firstTagName += '(numberOfChars)';			
			break;
			case "hmac_md4":
			case "hmac_md5":
			case "hmac_sha1":
				firstTagName += '(hmac_key)';			
			break;
		}
		
		if(!document.selection || navigator.userAgent.indexOf("Opera") > -1) {
			data = document.getElementById('input').value;
			if (singleTags.test(realTagName)) {
				data = data.substr(0, input.selectionStart) + hv.startTag + firstTagName + ' /' + hv.endTag + data.substr(input.selectionEnd, data.length);
			}
			else {
				data = data.substr(0, input.selectionStart) + hv.startTag + firstTagName + hv.endTag + txt + hv.startTag + '/' + tagName + hv.endTag + data.substr(input.selectionEnd, data.length);
			}
			document.getElementById('input').value=data;
		} else {
			data = document.getElementById('input').value;
			if(document.selection) {			
				var range = document.selection.createRange();
				var stored_range = range.duplicate();
				stored_range.moveToElementText(input);
				stored_range.setEndPoint( 'EndToEnd', range );
				input.selectionStart = stored_range.text.length - range.text.length;
				input.selectionEnd = input.selectionStart + range.text.length;
				if (singleTags.test(realTagName)) {
					data = data.substr(0, input.selectionStart) + hv.startTag + firstTagName + ' /' + hv.endTag + data.substr(input.selectionEnd, data.length);
				} else {
					data = data.substr(0, input.selectionStart) + hv.startTag + firstTagName + hv.endTag + txt + hv.startTag + '/' + tagName + hv.endTag + data.substr(input.selectionEnd, data.length);					
				}
			} else {
				if (singleTags.test(realTagName)) {
					data += hv.startTag + firstTagName + ' /' + hv.endTag;				
				} else {
					data += hv.startTag + firstTagName + hv.endTag + txt + hv.startTag + '/' + tagName + hv.endTag;
				}
			}
			document.getElementById('input').value=data;
			showLengths();
		}	
	}	
}
function showLengths() {
	document.getElementById('inputCharLen').innerHTML=+document.getElementById('input').value.length;
	document.getElementById('outputCharLen').innerHTML=+document.getElementById('output').value.length;
}
function runConvert() {
	hv.setInput(document.getElementById('input').value);
	document.getElementById('output').value = hv.execute();	
	if(!realTime) {	
		document.getElementById('output').focus();	
		selectOutput();
	}	
	showLengths();
}
function buildJSMenus() {
	var objects = document.getElementById('objects');
	var operators = document.getElementById('operators');
	var statements = document.getElementById('statements');
	var events = document.getElementById('events');	
	var HTMLTags = document.getElementById('HTMLTags');
	var attributes = document.getElementById('attributes');
	var htmlEnts = document.getElementById('htmlEnts');	
	var returnToWindow = document.getElementById('returnToWindow');
	var cssProperties = document.getElementById('cssProperties');
	
	var objectsList = ['ActiveXObject','ActiveXObject("Microsoft.XMLHTTP")','Array','Boolean','Date','Debug','Enumerator','Error','EvalError','Function','JSON','JavaArray','JavaClass','JavaObject','JavaPackage','Math','Namespace()','Number','Object','Packages','QName()','RangeError','ReferenceError','RegExp','String','SyntaxError','TypeError','URIError','VBArray','XML()','XMLHttpRequest','XMLList()','arguments','isXMLName()','java','netscape','sun'];
	var statementList = ['default xml namespace ..','export','let',':','import','for each...in','break','catch','@cc_on','//','/*..*/','continue','debugger','do...while','for','for...in','Statement','function','@if','if...else','return','@set','switch','this','throw','try','var','while','with'].sort();
	var operatorsList = ['*=','/=','%=','+=','-=','<<=','>>=','>>>=','&=','^=','|=','yield','set','new','let','get','=',',','?:','||','&&','|','^','&','==','!=','===','!==','<','<=','>','>=','instanceof','<<','>>','>>>','+','-','*','/','%','++','--','~','!','in','delete','new','typeof','void','.','[]','()'].sort();
	var eventsList = ['onabort','onactivate','onafterprint','onafterupdate','onbeforeactivate','onbeforecopy','onbeforecut','onbeforedeactivate','onbeforeeditfocus','onbeforepaste','onbeforeprint','onbeforeunload','onbegin','onblur','onbounce','oncellchange','onchange','onclick','oncontextmenu','oncontrolselect','oncopy','oncut','ondataavailable','ondatasetchanged','ondatasetcomplete','ondblclick','ondeactivate','ondrag','ondragend','ondragleave','ondragenter','ondragover','ondragdrop','ondrop','onend','onerror','onerrorupdate','onexit','onfilterchange','onfinish','onfocus','onfocusin','onfocusout','onhelp','onkeydown','onkeypress','onkeyup','onlayoutcomplete','onload','onlosecapture','onmediacomplete','onmediaerror','onmousedown','onmouseenter','onmouseleave','onmousemove','onmouseout','onmouseover','onmouseup','onmousewheel','onmove','onmoveend','onmovestart','onoutofsync','onpaste','onpause','onprogress','onpropertychange','onreadystatechange','onrepeat','onreset','onresize','onresizeend','onresizestart','onresume','onreverse','onrowenter','onrowexit','onrowdelete','onrowinserted','onscroll','onseek','onselect','onselectionchange','onselectstart','onstart','onstop','onsynchrestored','onsubmit','ontimeerror','ontrackchange','onunload','onurlflip','seeksegmenttime','oncanplay','oncanplaythrough','ondragstart','ondurationchange','onemptied','onended','onloadeddata','onloadedmetadata','onloadstart','onmessage','onoffline','ononline','onplay','onplaying','onratechange','onsearch','onseeked','onseeking','onstalled','onstorage','onsuspend','ontimeupdate','onvolumechange','onwaiting','onwebkitanimationend','onwebkitanimationiteration','onwebkitanimationstart','onwebkittransitionend'].sort();
	var tagsList = ['video','time','source','section','rule','progress','output','nest','nav','meter','m','header','footer','figure','event-source','datatemplate','datalist','datagrid','command','colgroup','canvas','audio','aside','article','embed','a','abbr','acronym','address','applet','area','b','base','bdo','big','body','br','button','caption','center','cite','code','col','dd','del','dfn','dir','div','dl','dt','em','font','form','frame','h1','h2','h3','h4','h5','h6','head','hr','html','i','iframe','img','input','ins','isindex','kbd','label','legend','li','link','map','menu','meta','object','ol','option','p','param','pre','q','s','samp','script','select','small','span','strike','strong','style','sub','sup','table','tbody','td','tfoot','th','thead','title','tr','tt','u','ul','var','blink','marquee','!doctype','basefont','bgsound','blockquote','fieldset','frameset','ilayer','image','keygen','listing','multicol','nobr','noembed','noframes','noscript','nolayer','optgroup','plaintext','rb','rbc','rp','rtc','rt','ruby','spacer','textarea','wbr','xml','xmp'].sort();
	
	var attributesList = ['template','tabindex','registrationmark','ref','irrelevant','draggable','dir','contentextmenu','contenteditable','accesskey','abbr','accept','action','align','alink','alt','axis','char','charoff','charset','checked','cite','class','classid','clear','code','colspan','compact','content','coords','data','datetime','declare','defer','enctype','for','frame','headers','height','href','hreflang','hspace','id','ismap','lang','link','media','method','name','nohref','nowrap','object','onblur','onload','profile','prompt','rel','rev','rowspan','rules','scheme','scope','shape','size','span','src','standby','start','style','summary','target','text','title','type','usemap','valign','value','version','vlink','vspace','width','accept-charset','archive','background','bgcolor','border','cellpadding','cellspacing','codebase','codetype','color','cols','face','frameborder','http-equiv','label','language','marginheight','marginwidth','maxlength','multiple','noresize','noshade','readonly','rows','scrolling','selected','valuetype'].sort();
	
	var cssPropsList = ['--standard--','azimuth','background','background-attachment','background-color','background-image','background-position','background-repeat','border','border-collapse','border-color','border-spacing','border-style','border-top','border-right','border-bottom','border-left','border-top-color','border-right-color','border-bottom-color','border-left-color','border-top-style','border-right-style','border-bottom-style','border-left-style','border-top-width','border-right-width','border-bottom-width','border-left-width','border-width','bottom','caption-side','clear','clip','color','content','counter-increment','counter-reset','cue','cue-after','cue-before','cursor','direction','display','elevation','empty-cells','float','font','font-family','font-size','font-size-adjust','font-stretch','font-style','font-variant','font-weight','height','left','letter-spacing','line-height','list-style','list-style-image','list-style-position','list-style-type','margin','margin-top','margin-right','margin-bottom','margin-left','marker-offset','marks','max-height','max-width','min-height','min-width','orphans','outline','outline-color','outline-style','outline-width','overflow','padding','padding-top','padding-right','padding-bottom','padding-left','page','page-break-after','page-break-before','page-break-inside','pause','pause-after','pause-before','pitch','pitch-range','play-during','position','quotes','richness','right','size','speak','speak-header','speak-numeral','speak-punctuation','speech-rate','stress','table-layout','text-align','text-decoration','text-indent','text-shadow','text-transform','top','unicode-bidi','vertical-align','visibility','voice-family','volume','white-space','widows','width','word-spacing','z-index',
						'--mozilla--','-moz-appearance','-moz-background-clip','-moz-background-inline-policy','-moz-background-origin','-moz-border-bottom-colors','-moz-border-left-colors','-moz-border-right-colors','-moz-border-top-colors','-moz-binding','-moz-border-end','-moz-border-end-color','-moz-border-end-style','-moz-border-end-width','-moz-border-image','-moz-border-radius','-moz-border-radius-bottomleft','-moz-border-radius-bottomright','-moz-border-radius-topleft','-moz-border-radius-topright','-moz-border-start','-moz-border-start-color','-moz-border-start-style','-moz-border-start-width','-moz-box-align','-moz-box-direction','-moz-box-flex','-moz-box-flexgroup','-moz-box-ordinal-group','-moz-box-orient','-moz-box-pack','-moz-box-shadow','-moz-box-sizing','-moz-column-count','-moz-column-gap','-moz-column-width','-moz-column-rule','-moz-column-rule-width','-moz-column-rule-style','-moz-column-rule-color','-moz-float-edge','-moz-force-broken-image-icon','-moz-image-region','-moz-margin-end','-moz-margin-start','-moz-opacity','-moz-outline','-moz-outline-color','-moz-outline-offset','-moz-outline-radius','-moz-outline-radius-bottomleft','-moz-outline-radius-bottomright','-moz-outline-radius-topleft','-moz-outline-radius-topright','-moz-outline-style','-moz-outline-width','-moz-padding-end','-moz-padding-start','-moz-stack-sizing','-moz-transform','-moz-transform-origin','-moz-user-focus','-moz-user-input','-moz-user-modify','-moz-user-select','-moz-window-shadow',
						'--ie--','-ms-accelerator','-ms-background-position-x','-ms-background-position-y','-ms-behavior','-ms-block-progression','-ms-filter','-ms-ime-mode','-ms-layout-grid','-ms-layout-grid-char','-ms-layout-grid-line','-ms-layout-grid-mode','-ms-layout-grid-type','-ms-line-break','-ms-line-grid-mode','-ms-interpolation-mode','-ms-overflow-x','-ms-overflow-y','-ms-scrollbar-3dlight-color','-ms-scrollbar-arrow-color','-ms-scrollbar-base-color','-ms-scrollbar-darkshadow-color','-ms-scrollbar-face-color','-ms-scrollbar-highlight-color','-ms-scrollbar-shadow-color','-ms-scrollbar-track-color','-ms-text-align-last','-ms-text-autospace','-ms-text-justify','-ms-text-kashida-space','-ms-text-overflow','-ms-text-underline-position','-ms-word-break','-ms-word-wrap','-ms-writing-mode','-ms-zoom',
						'--opera--','-o-replace','-o-set-link-source','-o-use-link-source',
						'--webkit--','-webkit-appearance','-webkit-background-clip','-webkit-background-composite','-webkit-background-origin','-webkit-background-size','-webkit-binding','-webkit-border-bottom-left-radius','-webkit-border-bottom-right-radius','-webkit-border-fit','-webkit-border-horizontal-spacing','-webkit-border-image','-webkit-border-radius','-webkit-border-top-left-radius','-webkit-border-top-right-radius','-webkit-border-vertical-spacing','-webkit-box-align','-webkit-box-direction','-webkit-box-flex','-webkit-box-flex-group','-webkit-box-lines','-webkit-box-ordinal-group','-webkit-box-orient','-webkit-box-pack','-webkit-box-shadow','-webkit-box-sizing','-webkit-column-break-after','-webkit-column-break-before','-webkit-column-break-inside','-webkit-column-count','-webkit-column-gap','-webkit-column-rule','-webkit-column-rule-color','-webkit-column-rule-style','-webkit-column-rule-width','-webkit-column-width','-webkit-columns','-webkit-dashboard-region','-webkit-font-size-delta','-webkit-highlight','-webkit-line-break','-webkit-line-clamp','-webkit-margin-bottom-collapse','-webkit-margin-collapse','-webkit-margin-start','-webkit-margin-top-collapse','-webkit-marquee','-webkit-marquee-direction','-webkit-marquee-increment','-webkit-marquee-repetition','-webkit-marquee-speed','-webkit-marquee-style','-webkit-match-nearest-mail-blockquote-color','-webkit-nbsp-mode','-webkit-padding-start','-webkit-rtl-ordering','-webkit-text-decorations-in-effect','-webkit-text-fill-color','-webkit-text-security','-webkit-text-size-adjust','-webkit-text-stroke','-webkit-text-stroke-color','-webkit-text-stroke-width','-webkit-user-drag','-webkit-user-modify','-webkit-user-select'						
						];
	
	var htmlEntsList = ['nbsp','iexcl','cent','pound','curren','yen','brvbar','sect','uml','copy','ordf','laquo','not','shy','reg','macr',
						'deg','plusmn','sup2','sup3','acute','micro','para','middot','cedil','sup1','ordm','raquo','frac14','frac12','frac34',
						'iquest','Agrave','Aacute','Acirc','Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute','Ecirc','Euml','Igrave',
						'Iacute','Icirc','Iuml','ETH','Ntilde','Ograve','Oacute','Ocirc','Otilde','Ouml','times','Oslash','Ugrave','Uacute',
						'Ucirc','Uuml','Yacute','THORN','szlig','agrave','aacute','acirc','atilde','auml','aring','aelig','ccedil','egrave',
						'eacute','ecirc','euml','igrave','iacute','icirc','iuml','eth','ntilde','ograve','oacute','ocirc','otilde','ouml',
						'divide','oslash','ugrave','uacute','ucirc','uuml','yacute','thorn','yuml',
						'fnof','Alpha','Beta','Gamma','Delta','Epsilon','Zeta','Eta','Theta','Iota','Kappa','Lambda','Mu','Nu','Xi','Omicron',
						'Pi','Rho','Sigma','Tau','Upsilon','Phi','Chi','Psi','Omega','alpha','beta','gamma','delta','epsilon','zeta','eta',
						'theta','iota','kappa','lambda','mu','nu','xi','omicron','pi','rho','sigmaf','sigma','tau','upsilon','phi','chi','psi',
						'omega','thetasym','upsih','piv','bull','hellip','prime','Prime','oline','frasl','weierp','image','real','trade',
						'alefsym','larr','uarr','rarr','darr','harr','crarr','lArr','uArr','rArr','dArr','hArr','forall','part','exist',
						'empty','nabla','isin','notin','ni','prod','sum','minus','lowast','radic','prop','infin','ang','and','or','cap',
						'cup','int','there4','sim','cong','asymp','ne','equiv','le','ge','sub','sup','nsub','sube','supe','oplus','otimes',
						'perp','sdot','lceil','rceil','lfloor','rfloor','lang','rang','loz','spades','clubs','hearts','diams',
						'quot','amp','lt','gt','OElig','oelig','Scaron','scaron','Yuml','circ','tilde','ensp','emsp','thinsp','zwnj','zwj',
						'lrm','rlm','ndash','mdash','lsquo','rsquo','sbquo','ldquo','rdquo','bdquo','dagger','Dagger','permil','lsaquo',
						'rsaquo','euro'].sort();
						
	var returnToWindowVectors = ['this','frames','top','self','parent','constructor','window.window','content','window[0]','(function(){ return arguments.callee.caller.arguments.callee.caller.arguments[0].view })();',
								 '[].sort.apply(null)','x=[].sort,x()','x={}.valueOf,x()','x=[].valueOf,x()','parent','__proto__.__parent__','constructor','({}).valueOf.call(null)',
								 '[].sort.call(null)','(function(){}).__proto__.__parent__','var win = null;var forEach = [].forEach;forEach(function(val, prop,thisp) {win = thisp;}, []);win',
								 'document.documentElement.ownerDocument.defaultView','(function(){ return arguments.callee.constructor.__parent__; })()','x=[].some,x(function(x,y,win){ alert(win) })',"x=''.split,x(null)"].sort();
				  
	for(var i=0;i<objectsList.length;i++) {
		var optn = document.createElement("OPTION");
		optn.text = objectsList[i];
		optn.value = objectsList[i];
		objects.options.add(optn);
		objects.onchange=function() {
			document.getElementById('output').value += this.value;
		}			
	}
	for(var i=0;i<statementList.length;i++) {
		var optn = document.createElement("OPTION");
		optn.text = statementList[i];
		optn.value = statementList[i];
		statements.options.add(optn);
		statements.onchange=function() {
			document.getElementById('output').value += this.value;
		}		
	}	
	for(var i=0;i<operatorsList.length;i++) {
		var optn = document.createElement("OPTION");
		optn.text = operatorsList[i];
		optn.value = operatorsList[i];		
		operators.options.add(optn);
		operators.onchange=function() {
			document.getElementById('output').value += this.value;
		}
	}	
	
	for(var i=0;i<eventsList.length;i++) {
		var optn = document.createElement("OPTION");
		optn.text = eventsList[i];
		optn.value = eventsList[i];		
		events.options.add(optn);
		events.onchange=function() {
			document.getElementById('output').value += this.value;
		}
	}	
	
	for(var i=0;i<tagsList.length;i++) {
		var optn = document.createElement("OPTION");
		optn.text = tagsList[i];
		optn.value = tagsList[i];		
		HTMLTags.options.add(optn);
		HTMLTags.onchange=function() {
			document.getElementById('output').value += '<' + this.value + '>' + '</' + this.value + '>';
		}
	}	
	
	for(var i=0;i<attributesList.length;i++) {
		var optn = document.createElement("OPTION");
		optn.text = attributesList[i];
		optn.value = attributesList[i];		
		attributes.options.add(optn);
		attributes.onchange=function() {
			document.getElementById('output').value += this.value;
		}
	}

	for(var i=0;i<cssPropsList.length;i++) {
		var optn = document.createElement("OPTION");
		optn.text = cssPropsList[i];
		optn.value = cssPropsList[i];		
		cssProperties.options.add(optn);
		cssProperties.onchange=function() {
			document.getElementById('output').value += this.value;
		}
	}	
	
	for(var i=0;i<htmlEntsList.length;i++) {
		var optn = document.createElement("OPTION");
		optn.text = htmlEntsList[i];
		optn.value = htmlEntsList[i];		
		htmlEnts.options.add(optn);
		htmlEnts.onchange=function() {
			document.getElementById('output').value += '&' + this.value + ';';
		}
	}			

	
	for(var i=0;i<returnToWindowVectors.length;i++) {
		var optn = document.createElement("OPTION");
		optn.text = returnToWindowVectors[i];
		optn.value = returnToWindowVectors[i];		
		returnToWindow.options.add(optn);
		returnToWindow.onchange=function() {
			document.getElementById('output').value += this.value;
		}
	}		
		
}
window.onload = function() {	
	buildJSMenus();
	hvtags.buildSelectMenu(document.getElementById('tagSelection'));
	changeTags(document.getElementById('tagSelection').options[document.getElementById('tagSelection').selectedIndex].value);
	if(navigator.userAgent.indexOf("Opera") == -1) {
		loadDomObject('document');
	}
	document.getElementById('input').focus();
	var hash = location.hash.slice(1);
	if (hash) {
		var input = unescape(hash);
	} else {
		var input = unescape(location.search.slice(7));
	}
	if(!input.match(/[^a-zA-Z=+0-9\/]/)) {
		try {
			if(input.length > 0) {
				input = atob(input);
				document.getElementById('input').value = input;
				setTimeout(function() {
				runConvert();
				document.getElementById('output').focus();
				selectOutput();		
				},500);
			}
		} catch(e) {}
	
	}
	document.getElementById('input').onchange = document.getElementById('input').onkeyup = showLengths;
	document.getElementById('output').onchange = document.getElementById('output').onkeyup = showLengths;		
}
function sendOutput() {
  var url = document.getElementById('url').value;
  self.location = url + encodeURIComponent(document.getElementById('output').value);
}
function windowNamePayload() {
  var namePayload=prompt('Enter payload');
  var html = '<iframe src="'+document.getElementById('url').value+encodeURIComponent(encodeURIComponent(document.getElementById('output').value))+'" name="'+namePayload+'"><\/iframe>';
  self.location="data:text/html,"+html;
}
function selectOutput() {
	var output = document.getElementById('output');
	output.focus();
	output.select();
}
function selectInput() {
	var input = document.getElementById('input');
	input.focus();
	input.select();
}
function toggleRealTime(btn) {
	if(btn.value == 'Turn Realtime ON') {
		realTime = setInterval('runConvert()', 50);
		btn.value = 'Turn Realtime OFF';
	} else {
		clearTimeout(realTime);
		btn.value = 'Turn Realtime ON';
	}
}
function changeTags(tags) {
	if(tags == 'all') {
		document.getElementById('key').innerHTML = hv.getKey();
	} else if(tags != '') {
		document.getElementById('key').innerHTML = hv.getKey(tags);
	} else {
		document.getElementById('key').innerHTML = '';
	}
}
function swapInput() {
	document.getElementById('input').value=document.getElementById('output').value;document.getElementById('output').value=''
	document.getElementById('input').focus();
	showLengths();
}
function closePreview() {
	document.getElementById('htmlpreview').style.display = 'none';
}
function clearTags() {
	var input = document.getElementById('input').value;
	var regexpString = hv.startTag+'([_0-9a-zA-Z]+)(\\(.*\\))?'+hv.endTag;
	input = input.replace(new RegExp(regexpString,'g'),'');
	var regexpString = hv.startTag+'\/([_0-9a-zA-Z]+)'+hv.endTag;
	input = input.replace(new RegExp(regexpString,'g'),'');	
	document.getElementById('input').value = input;
	document.getElementById('input').focus();
	showLengths();
}
function log(str) {
	document.getElementById('logWindow').innerHTML += str;
}
function clearLog() {
	document.getElementById('logWindow').innerHTML = '';
}
function compareInputOutput() {
	var input = eval(document.getElementById('input').value);
	var output = eval(document.getElementById('output').value);
	var props = [];
	for(var i in input) {
		try {
			if(output[i] === undefined) {
				props.push(i + '=' + 'undefined');
			} else {
				if(output[i] != input[i]) {
					props.push(i + '=' + output[i]);
				}
			}
		} catch(e) {}
	}
	document.getElementById('output').value += '\n-------------\n';
	for(var i=0;i<jsBuiltInProps.length;i++) {
		var prop = jsBuiltInProps[i];
		try {
			if(output[prop] != input[prop]) {
				props.push(prop + '=' + output[prop]);
			}
		} catch(e) {}		
	}
	document.getElementById('output').value += props.join('\n');	
	var props = [];
	for(var i in output) {
		try {
			if(input[i] === undefined) {
				props.push(i + '=' + 'undefined');
			} else {
				if(output[i] != input[i]) {
					props.push(i + '=' + input[i]);
				}
			}			
		} catch(e) {}
	}
	document.getElementById('input').value += '\n-------------\n';
	for(var i=0;i<jsBuiltInProps.length;i++) {
		var prop = jsBuiltInProps[i];
		try {
			if(output[prop] != input[prop]) {
				props.push(prop + '=' + input[prop]);
			}
		} catch(e) {}		
	}
	document.getElementById('input').value += props.join('\n');	
}
function inspectHTML() {
   document.getElementById('htmlpreview').style.display = 'block';
   var ifrm = document.getElementById('iframe').contentWindow.document;
   ifrm.open();
   ifrm.writeln('' + document.getElementById('output').value);
   ifrm.close();
   var tags = [];
   document.getElementById('output').value.replace(/<([\w]+)/g, function($0,tag) {
   	tags.push(tag.toUpperCase());
   });
   tags = tags.join('|').replace(/[|]$/,'');
   
   var walk_the_DOM = function walk(node, func) {
   		func(node);
		node = node.firstChild;
		while(node) {
			walk(node, func);
			node = node.nextSibling;
		}
   }
   var html = '';
   html += '<style>table {border-collapse:collapse}th{background-color:#efefef;}th,td {text-align:left;padding:5px;}td{border:1px solid #CCC;}body,table{font: 12px "Lucida Grande", verdana, arial, helvetica, sans-serif;}<\/style>';
   html += '<table>';
   html += '<tr>';        
   html += '<th>Attribute</th>';         
   html += '<th>Value</th>';   
   html += '</tr>';      
   var inspectAttributes = function(node, valueType, isValue) {
		   	for (var attr in node) {
		   		if (node.nodeType != 1) {
		   			continue;
		   		}
				try {
					var value = node[attr] + '';
				} catch(e) {
					var value = "DENIED";
				}
				
				if(isValue) {
					if(value != valueType) {
						continue;
					}
				} else {
					if (value == valueType) {
						continue;
					}
				}
				
		   		value = value.replace(/['"\\&<>]/g, function(str){
		   			switch (str) {
		   				case "'":
		   					return '&#39;';
		   					break;
		   				case '"':
		   					return '&quot;';
		   					break;
		   				case '\\':
		   					return '&#92;';
		   					break;
		   				case '>':
		   					return '&gt;';
		   					break;
		   				case '<':
		   					return '&lt;';
		   					break;
		   			}
		   		});
		   		html += '<tr>';
		   		html += '<td>' + attr + '</td>';
		   		html += '<td>' + value + '</td>';
		   		html += '</tr>';
		   	}		   	   	
   }
   var getAttributes = function() {
   		walk_the_DOM(ifrm, function(node) {
			
		   if (new RegExp(tags).test(node.tagName)) {
		   	if (node.nodeType == 1) {
		   		html += '<tr><th colspan="2">' + node.tagName + '</th></tr>';
		   	}
			
			inspectAttributes(node, '', true);
			inspectAttributes(node, '', false);
			
		   }
		});
   }();
   ifrm.open();
   ifrm.writeln(html);
   ifrm.close();	  
}
function testHTML(optContent) {
   document.getElementById('htmlpreview').style.display = 'block';
   var ifrm = document.getElementById('iframe').contentWindow.document;
   document.getElementById('domObject').value = 'window.frames.iframe.document';
   loadDomObject('window.frames.iframe.document');
   ifrm.open();
    if(optContent == null) {
   		ifrm.writeln('' + document.getElementById('output').value);
    } else {
		ifrm.writeln('' + optContent);
	}
	ifrm.close();
}
function executeTestHTML() {
	testHTML(testString(document.getElementById('output').value));
}
function testString(code, alertOutput) {
	clearErrors();
	if(code == '') {
		return false;
	}
	try {
		try { throw new Error() } catch(ex) { relativeLineNumber = ex.lineNumber }
		if(alertOutput) {
			evalResult = eval(code);
			alert('Result:\n'+evalResult + '\nType:\n' + typeof evalResult)
		} else {
			evalResult = eval(code);
			return evalResult;
		}
	} catch(ex) {
		error = ex.message+' (line '+(ex.lineNumber - relativeLineNumber)+')';
		sendError(error);
	}	
}
function createURL() {	
	var input = btoa(document.getElementById('input').value);
	window.open('http://www.businessinfo.co.uk/labs/hackvertor/hackvertor.php#'+encodeURIComponent(input));
}
function sendError(error) {
	var errorConsole = document.getElementById('errorConsole');
	errorConsole.style.display = 'block';
	errorConsole.innerHTML = error;
}
function clearErrors() {
	var errorConsole = document.getElementById('errorConsole');
	errorConsole.innerHTML = '';
	errorConsole.style.display = 'none';
}
function clearHackvertor() {
	clearErrors();
	document.getElementById('input').value='';
	document.getElementById('output').value='';
	document.getElementById('input').focus();
	showLengths();
}
function hackvertlet() {
	var input = document.getElementById('input');
	if(input.value == '') {
		input.value = 'Hackvertlet';
		selectInput();
	} else {
		var hackvertletName = prompt('Please enter a name for your Hackvertlet');
		if(hackvertletName == null) {
			return false;
		}
		self.location = 'data:text/html,<p>Drag the link below to your bookmarks</p><a href="javascript:txt=document.getSelection();self.location=\'http://www.businessinfo.co.uk/labs/hackvertor/hackvertor.php?input=\'+encodeURIComponent(btoa(atob(\''+btoa(input.value)+'\').replace(/Hackvertlet/g,txt)));">'+hackvertletName.replace(/[^!. a-zA-Z0-9_\-]/g,'')+'</a>';
	}
}
function sendPCE() {
	var output = document.getElementById('output').value;
	output = encodeURIComponent(output);
	self.location = 'http://h4k.in/encoding/?hv='+output;
}
function inspectOutput(output) {
     var html = '';
	 try {
		 var obj = eval(output);
		 var prop;
		 var props = [];
		 for(var i=-65535;i<65535;i++) {
			 try {
				prop = obj[String.fromCharCode(i)];
			 	if(prop !== null && prop !== undefined) {
			 	  	prop = (prop.toString()).escapeHTML();
                     		props.push('<tr><td>' + i + '->' + String.fromCharCode(i) + '</td>' + '<td>' + prop + '</td></tr>');
			 	}
			 } catch(e) {
			 	props.push('<tr><td>' + i + '->' + String.fromCharCode(i) + '</td>' + '<td>' + e + '- '+e.description+'</td></tr>');
			 }
			 try {
				prop = obj[i];
			 	if(prop) {
                     		prop = (prop.toString()).escapeHTML();
			 	}
				if(prop === undefined) {
					continue;
				}	  
				props.push('<tr><td>'+ i + '</td>' + '<td>' + prop + '</td></tr>');
			} catch(e) {
				props.push('<tr><td>'+ i + '</td>' + '<td>' + e + '- '+e.description+'</td></tr>');
			}
		}
		document.getElementById('htmlpreview').style.display = 'block';
		var ifrm = document.getElementById('iframe').contentWindow.document;
		document.getElementById('domObject').value = 'window.frames.iframe.document';
		loadDomObject('window.frames.iframe.document');
		ifrm.open();
		html += '<html>';
		html += '<head>';
		html += '<style>';
		html += 'table {border-collapse:collapse}\nth{background-color:#efefef;}\nth,td {text-align:left;padding:5px;}\ntd{border:1px solid #CCC;}\nbody,table{font: 12px "Lucida Grande", verdana, arial, helvetica, sans-serif;}';
		html += '</style>';
		html += '</head>';
		html += '<body>';
		html += '<table>';
            html += '<tr>';
            html += '<th>Name</th>';
            html += '<th>Value</th>';
            html += '</tr>';
            html += '<tr><th colspan="2">Built in properties</th></tr>';
            for(var i=0;i<jsBuiltInProps.length;i++) {
			try {
				var val = obj[jsBuiltInProps[i]];
				if(val === undefined) {
					continue;
				}
				if(val) {
					val = (val+'').escapeHTML();
				}
				html += '<tr>';
				html += '<td>' + jsBuiltInProps[i] + '</td>';
				html += '<td>' + val + '</td>';
				html += '</tr>';
			} catch(e) {
				html += '<tr>';
				html += '<td>' + jsBuiltInProps[i] + '</td>';
				html += '<td>' + e + '- '+e.description+'</td>';
				html += '</tr>';
			}
		}
		
            html += '<tr><th colspan="2">Normal properties</th></tr>';
		for(var i in obj) {
			try {
                  	var val = obj[i];
				if(val === undefined) {
					continue;
				}
				if(val) {
					val = (val+'').escapeHTML();
				}
			} catch(e) {val = e + '-' + e.description;};
                  html += '<tr>';
			html += '<td>'+ i + '</td>' + '<td>' + val + '</td>';
		      html += '</tr>';
            }
            html += '<tr>';
		html += '<th colspan="2">Hidden Properties</th>';
	      html += '</tr>';
	      html += '' + props.join('');
		html += '</table>';
		html += '</body>';
		html += '</html>';
		ifrm.writeln(html);
            ifrm.close();
		return props;
	 } catch(e) {
	 	alert('--Inspection failed--\n'+e + '\n' + e.description); 
	}
}

hvtags = new HackvertorTags;
hv = new Hackvertor;

getRandom = function(minVal, maxVal) {	
 	var randVal = minVal+(Math.random()*(maxVal-minVal));
    return Math.round(randVal);	
}
String.prototype.repeat = function(amount) {
	var str = '';
	for(var i=0;i<amount;i++) {
		str += this;
	}
	return str;
}
String.prototype.zeroFill = Number.prototype.zeroFill = function(d) {
	var str = this + '';
    while (str.length < d) {
      str = "0" + str; 
	}
    return str;
} 
String.prototype.charFill = Number.prototype.charFill = function(d, schar) {
	var str = this + '';
	while (str.length < d) {
		str = schar + str; 
	}
    return str;
} 
String.prototype.getCharacterCodes = function() {
	var len = this.length;
	var codes = [];
	for(var i=0; i<len;i++) {
		codes.push(this.charCodeAt(i));
	}
	return codes;
}
String.prototype.sqlhex = function() {
	var codes = this.getCharacterCodes();
	var code = [];
	var len = codes.length;
	for(var i=0;i<len;i++) {
		code.push(codes[i].toString(16));
	}
	return code.join('');	
}
String.prototype.sqlor = function() {
	var codes = this.getCharacterCodes();
	var code = [];
	var len = codes.length;
	for(var i=0;i<len;i++) {
		code.push("'"+String.fromCharCode(codes[i])+"'");
	}
	return code.join('||');				
}
String.prototype.sqlconcat = function() {
	var codes = this.getCharacterCodes();
	var code = [];
	var len = codes.length;
	for(var i=0;i<len;i++) {
		code.push('"'+String.fromCharCode(codes[i])+'"');
	}
	return 'CONCAT(' + code.join(',') + ')';						
}
String.prototype.sqlascii = function() {
	var codes = this.getCharacterCodes();
	var code = [];
	var len = codes.length;
	for(var i=0;i<len;i++) {
		code.push('ASCII('+codes[i]+')');
	}
	return code.join('+');		
}
String.prototype.sqlchr = function() {
	var codes = this.getCharacterCodes();
	var code = [];
	var len = codes.length;
	for(var i=0;i<len;i++) {
		code.push('chr('+codes[i]+')');
	}
	return code.join('||');		
}
String.prototype.sqlcomment = function() {
	var codes = this.getCharacterCodes();
	var code = [];
	var len = codes.length;
	for(var i=0;i<len;i++) {
		code.push('/**/'+String.fromCharCode(codes[i]));
	}
	return code.join('');	
}
String.prototype.sqlchar = function() {
	var codes = this.getCharacterCodes();
	var code = [];
	var len = codes.length;
	for(var i=0;i<len;i++) {
		code.push('CHAR(0x'+codes[i].toString(16)+')');
	}
	return code.join('+');	
}
String.prototype.backticks = function() {
	return "`" + this + "`";
}
String.prototype.singlequotes = function() {
	return "'" + this + "'";
}
String.prototype.doublequotes = function() {
	return '"' + this + '"';
}
String.prototype.backslashnullesc = function() {
	return this.replace(/([mozingurls.lx#\/\-\/])/gi, '\\0$1');
}
String.prototype.backslashznullesc = function() {
	return this.replace(/([mozingurls.lx#\/\-\/])/gi, '\\000000$1');
}
String.prototype.backslashesc = function() {
	return this.replace(/([mozingurls.lx#\/\-\/])/gi, '\\$1');				
}
String.prototype.javachar = function() {
	var codes = this.getCharacterCodes();
	var code = [];
	var len = codes.length;
	for(var i=0;i<len;i++) {
		code.push('java.lang.Character('+codes[i]+')');
	}
	return code.join('+');
}
String.prototype.toternary = function() {				
	var vector = '';		
	var operators = ['>','<','==','!='];	
	var operator = operators[getRandom(0,operators.length-1)];
	var separateStatements = '+';
	var number1 = getRandom(0,9);
	var number2 = getRandom(0,9);
	var statement = number1+' '+operator+' '+number2;
	var randstring = '';
	var str = this;	
	var len = str.length;
	var chars = 'abcdefghijklmnopqrstuvwxyz';
	for(var i=0;i<getRandom(0,len);i++) {
		if(getRandom(0,1) == 1) {
			randstring += chars.charAt(getRandom(0, chars.length));				
		} else {
			randstring += chars.charAt(getRandom(0, chars.length)).toUpperCase();				
		}
	}
	vector += statement;
	if(eval(statement) == true) {		
		vector += " ? '$vector' : '$randstring'";
	} else {		
		vector += " ? '$randstring' : '$vector'";
	}	
	vector = vector.replace('$randstring',randstring);	
	var concatString = [];	
	for(var i=0; i<len;i++) {
		var c = str.charAt(i);
		c = c.replace(/'/g,'\\\'');
		concatString.push('('+vector.replace("$vector", c)+')');
	}
	return '(' + concatString.join(separateStatements) + ')';	
}
String.prototype.urlencode = function() {
	var codes = this.getCharacterCodes();
	var code = '';
	var len = codes.length;
	for(var i=0; i<len;i++) {
		code += '%' + codes[i].toString(16).zeroFill(2);
	}
	return code;
}
String.prototype.tounicode = function(prefix) {
	if(prefix == null) {
		var prefix = '\\u';
	}
	var codes = this.getCharacterCodes();
	var code = '';
	var len = codes.length;
	for(var i=0; i<len;i++) {
		code += prefix + codes[i].toString(16).zeroFill(4);
	}
	return code;
}
String.prototype.tounicodehwfw = function(prefix) {
	if(prefix == null) {
		var prefix = '\\u';
	}	
	var codes = this.getCharacterCodes();
	var code = '';
	var len = codes.length;
	for(var i=0; i<len;i++) {
		var c = codes[i]-32;
		code += prefix + c.toString(16).zeroFill(2).charFill(4, 'f');
	}
	return code;
}
String.prototype.tooctal = function() {
	var codes = this.getCharacterCodes();
	var code = '';
	var len = codes.length;
	for(var i=0; i<len;i++) {
		code += '\\' + codes[i].toString(8);
	}	
	return code;
}
String.prototype.todec = function() {
	var codes = this.getCharacterCodes();
	var code = '';
	var len = codes.length;
	for(var i=0; i<len;i++) {
		code += '\\' + codes[i];
	}	
	return code;
}
String.prototype.todec_ent = function(ending) {
	var codes = this.getCharacterCodes();
	var code = '';
	var len = codes.length;
	for(var i=0; i<len;i++) {
		code += '&#' + codes[i] + ending;
	}	
	return code;
}
String.prototype.tohex = function() {
	var codes = this.getCharacterCodes();
	var code = '';
	var len = codes.length;
	for(var i=0; i<len;i++) {
		code += '\\x' + codes[i].toString(16);
	}
	return code;
}
String.prototype.tohex_ent = function(ending) {
	var codes = this.getCharacterCodes();
	var code = '';
	var len = codes.length;
	for(var i=0; i<len;i++) {
		code += '&#x' + codes[i].toString(16) + ending;
	}
	return code;
}
String.prototype.fromunicode = function() {
	var code = this;
	code = code.replace(/[uU]/g,'');
	code = code.split('\\');
	decode = '';
	for(var i=1;i<code.length;i++) {
		decode += String.fromCharCode(parseInt(code[i], 16));
	}
	return decode;
}
String.prototype.fromoctal = function() {
	var code = this;
	if(code.indexOf("\\") == -1) {
		return parseInt(code, 8);
	}						
	code = code.split('\\');
	decode = '';
	for(var i=1;i<code.length;i++) {
		decode += String.fromCharCode(parseInt(code[i], 8));
	}
	return decode;
}
String.prototype.fromdec = function() {
	var code = this;
	if(code.indexOf("#") == -1) {
		code = code.split('\\');
	} else {
		code = code.replace(/&/g, '');
		code = code.replace(/;/g, '');
		code = code.split('#');
	}					
	decode = '';
	for(var i=1; i<code.length;i++) {
		decode += String.fromCharCode(code[i]);
	}
	return decode;
}
String.prototype.fromhex = function() {
	var code = this;
	if(code.indexOf("#") == -1 && code.indexOf("\\") == -1) {
		return parseInt(code, 16);
	}
	
	if(code.indexOf("#") == -1) {
		code = code.replace(/[xX]/g, '');
		code = code.replace(/;/g, '');						
		code = code.split('\\');
	} else {
		code = code.replace(/&/g, '');
		code = code.replace(/[xX]/g, '');
		code = code.replace(/;/g, '');
		code = code.split('#');
	}					
	decode = '';
	for(var i=1; i<code.length;i++) {
		decode += String.fromCharCode(parseInt(code[i], 16));
	}
	return decode;
}
String.prototype.fromcssescapes = function() {
	var code = this;
	code = code.split('\\');
	decode = '';
	for(var i=1; i<code.length;i++) {
		decode += String.fromCharCode(parseInt(code[i], 16));
	}
	return decode;
}
String.prototype.tobinary = function() {
	var code = this;
	var bin = '', x2=code, log2=0, answer = [];
	while(x2>=2){
		x2=x2/2;
		log2=log2+1;
	}				
	for(l2=log2; l2>=0; l2--){
		var power=Math.pow(2,l2);
		if (code>=power) {
			answer[l2]="1";
			code=code-power;
		}		
		else answer[l2]="0";
	}
	for (i=log2; i>=0; i--) {
		bin += answer[i];
	}
	return bin;
}
String.prototype.dec2hex = function() {
	return '0x' + Number(this).toString(16).toUpperCase();
}
String.prototype.dec2oct = function() {
	return '0' + Number(this).toString(8);
}
String.prototype.frombinary = function() {
	return parseInt(this, 2);
}
String.prototype.toMixedCase = function() {
	var code = this;
	var str = '', randNum = 0;
	for(var i = 0; i<code.length;i++) {
		randNum = getRandom(0,1);
		if(randNum == 0) {
			str += code.charAt(i).toUpperCase();
		} else {
			str += code.charAt(i).toLowerCase();						
		}
	}
	return str;
}
String.prototype.utf7_encode = function(chars) {
	var outputstring = this.replace(/\+/g,'+-');
	return outputstring.replace(new RegExp('([^'+chars+']+)','g'), function($1) { 
				var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
				var codes = $1.getCharacterCodes();
				code = '';
				var len = codes.length;
				for(var i=0; i<len;i++) {								
					var strchar = codes[i];
					code += strchar.toString().tobinary().zeroFill(16);					
				}
				var sixBits = [];
				for(var i=0;i<code.length;i+=6) {
					sixBits.push(code.substr(i, 6));
				}				
				if(sixBits[sixBits.length-1].length < 6) {								
					sixBits[sixBits.length-1] = sixBits[sixBits.length-1] + '0'.repeat(6-sixBits[sixBits.length-1].length);					
				}				
				base64chars = base64chars.split('');
				for(var i in sixBits) {
					sixBits[i] = base64chars[sixBits[i].frombinary()];
				}	
				return '+' + sixBits.join('') + '-';		
	});	 
}
String.prototype.utf7_decode = function() {	
	return this.replace(/(\+[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/]+-)/g, function($1) { 
				var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
				var sixBits = [];
				var code = $1;
				var decoded = '';
				code = code.replace(/^\+|-$/g, '').split("");
				for(var i=0; i<code.length;i++) {
					decoded += base64chars.indexOf(code[i]).toString().tobinary().toString().zeroFill(6);
				}
				var sixteenBits = [];
				for(var i=0;i<decoded.length;i+=16) {
					sixteenBits.push(decoded.substr(i,16));
				}
				decoded = '';
				for(var i in sixteenBits) {		
					var strchar = sixteenBits[i];
					if(strchar.length < 16) {
						if(strchar.length > 4 || strchar.match(/[^0]/) ) {
							return 'Invalid UTF-7';
						}
					} else {
						decoded += String.fromCharCode(strchar.frombinary());
					}
				}
				return decoded;
	});
}
String.prototype.fromcharcodes = function() {
	var codes = this.split(/[^0-9]/);
	var code = '';
	var len = codes.length;
	for(var i=0;i<len;i++) {
		code += String.fromCharCode(codes[i]);
	}
	return code;
}
String.prototype.auto_decode = function() {	
	var code = this;
	var matches = 0;
	var converted = '';
	var punycodeMatch = 0;
	
	if(/\.xn--[a-zA-Z0-9]+\./.test(code)) {
		punycodeMatch = 1;
		code = code.replace(/\.xn--([a-zA-Z0-9]+)\./g, function($0, $1){
			matches++;
			return '.' + punycode.decode($1, true) + '.';
		});
	}
	
	if(/[01]{4,}\s+[01]{4,}/.test(code)) {
		code = code.replace(/[01]+/g, function($0){
			matches++;
			return $0.frombinary();
		});
	}
	
	if((!/[^0-9,\s]/.test(code)) && /[0-9]+[,\s]+/.test(code)) {		
		code = code.replace(/^(\d+[,\s]*)+$/, function($0){
			matches++;
			return $0.fromcharcodes();
		});
	}	
		
	if (/style[\s]*=/.test(code)) {
		code = code.replace(/\\0*[0-9a-fA-F]{1,2}/g, function($0){
			matches++;
			return $0.fromcssescapes();
		});
	}
	else {
		code = code.replace(/\\[0-9]{1,3}/g, function($0){
			matches++;
			return $0.fromoctal();
		});
	}

		
	code = code.replace(/\\u[0-9a-fA-F]{4}/g,function($0) {
					matches++;					
					return $0.fromunicode();
				});
												
	
	code = code.replace(/(?:\\|&#)x0*[0-9a-fA-F]{1,4};?/g,function($0) {
					matches++;
					return $0.fromhex();
				});
	
			
				
	code = code.replace(/&#0*[0-9]{1,5};?/g,function($0, $1) {
					matches++;
					return $0.fromdec();
				});

	if(/&.+;/.test(code)) {		
		converted = code.htmlEntities('decode');
		if(code != converted) {
			code = converted;
			matches++;
		}
	}		
	
	if(/\+.*-/.test(code)) {
		converted = code.utf7_decode();
		if(code != converted) {
			code = converted;
			matches++;
		}
	}
	
	if(/^%/.test(code)) {
		converted = unescape(code);
		if(code != converted) {
			code = converted;			
			matches++;
		}
	}
	
	if(/=$/.test(code)) {
		converted = atob(code);
		if(code != converted) {
			code = converted;
			matches++;
		}
	}	
					
	if(matches == 0) {
		return false;
	}				
	return code;
}
String.prototype.auto_decode_repeat = function() {
	var convertedCode = this;
	var code = this;
	var maxLoops = 20;
	var currentLoop = 0;
	do {
		if(currentLoop > maxLoops) {
			break;
		}
		try {
			code = code.auto_decode();
		} catch(e) {
			return convertedCode;
		}
		if(code != false) {
			convertedCode = code;
		}																	
		currentLoop++;	
	} while(code != false);
	return convertedCode;
}
String.prototype.us_ascii = function() {
	var codes = this.getCharacterCodes();
	var code = '';
	var len = codes.length;
	for(var i=0; i<len;i++) {
		code += String.fromCharCode(parseInt(codes[i]) + 128);
	}
	return code;
}
String.prototype.us_ascii_decode = function() {
	var codes = this.getCharacterCodes();
	var code = '';
	var len = codes.length;
	for(var i=0; i<len;i++) {
		code += String.fromCharCode(parseInt(codes[i]) - 128);
	}
	return code;
}
// By UTF-8 encode Johan Sundstr�m
// Thanks Johan
String.prototype.encode_utf8 = function() {
  return unescape(encodeURIComponent(this));
}
String.prototype.decode_utf8 = function() {
  return decodeURIComponent(escape(this));
}
String.prototype.trans = function(from, to) {
	var code = this.split('');
	to = to.split('')
	for(var i=0;i<code.length;i++) {
		var tranStr = to[from.indexOf(code[i])];
		if(tranStr != null) {
			code[i] = tranStr;
		}
	}
	return code.join('');
}
String.prototype.rot13 = function() {
	return this.trans('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz','NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm');
}
String.prototype.decode_rot13 = function() {
	return this.trans('NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
}
String.prototype.uuencode = function() {	
	var code = this.getCharacterCodes();
	var binary = '';
	for(var i=0;i<code.length;i++) {
		binary += code[i].toString().tobinary().zeroFill(8);
	}
	code = '';
	for(var i=0;i<binary.length;i+=6) {
	 var binConvert = binary.substr(i,6).frombinary();
	 	code += String.fromCharCode(binConvert + 32);
	}
	return code;
}
String.prototype.uudecode = function() {	
	var code = this.getCharacterCodes();
	var binary = '';
	for(var i=0;i<code.length;i++) {
		code[i] = code[i]-32;
	}
	for(var i=0;i<code.length;i++) {
		binary += code[i].toString().tobinary().zeroFill(6);
	}
	code = '';
	for(var i=0;i<binary.length;i+=8) {
	 var binConvert = binary.substr(i,8).frombinary();
	 if(binConvert.toString().length != 3) {
	 	continue;
	 }
	 code += String.fromCharCode(binConvert);
	}
	return code;
}
String.prototype.rot47 = function() {	
	var code = this.getCharacterCodes().join(',').rotate(33, 126, 47).split(',');	
	for(var i=0;i<code.length;i++) {
		code[i] = String.fromCharCode(code[i]);
	}	
	return code.join('');
}
String.prototype.decode_rot47 = function() {
	var code = this.getCharacterCodes().join(',').rotate(33, 126, -47).split(',');
	for(var i=0;i<code.length;i++) {
		code[i] = String.fromCharCode(code[i]);
	}
	return code.join('');
}
String.prototype.rotate = function(from, to, by) {
	var code = this.split(',');
	for(var i=0;i<code.length;i++) {
		pos = parseInt(code[i]);		
		if(!(pos <= to && pos >= from)) {
			continue;
		}
		if(by < 0) {
			if((pos-Math.abs(by)) >= from) {
				code[i] = pos-Math.abs(by);				
			} else {
				code[i] = (((pos-Math.abs(by))+to)-from)+1;
			}			
		} else {
			if((pos+by) > to) {
				code[i] = (from-1)+((pos+by)%to);
			} else {
				code[i] = pos+by;
			}
		}
	}
	return code.join(',');
}
String.prototype.toJavascriptlish = function() {
	var output = '';
	var words = this.replace(/[^ \w\d]/g,'').split(' ');
	var commentsLabels = ['//','/*',':'];
	var stringTypes = ['"',"'",'/'];
	var concatTypes = ['+','/','^','\n',',',';','-','%','||','&&','>>','>>>','<<'];
	for(var i=0;i<words.length;i++) {
		var word = words[i];
		if(i+1 < words.length) {
			if(stringType == '/') {
				stringTypes = ['"',"'"];
			} else {
				var stringTypes = ['"',"'",'/'];				
			}
		}
		var stringType = stringTypes[Math.floor(Math.random()*stringTypes.length)];
		var concatType = concatTypes[Math.floor(Math.random()*concatTypes.length)];
		var commentsLabel = commentsLabels[Math.floor(Math.random()*commentsLabels.length)];
		var foundGlobal = 0;
		
		if(i == 0) {
			switch(commentsLabel) {
				default:
					output += word + ':';
				break;
				case "//":
					output += '//' + word + '\n';
				break;
				case "/*":
					output += '/*' + word + '*/ ';
				break;
			}
			continue;
		}						
		
		for(var prop in window) {
			if(word == prop) {
				output += word;
				foundGlobal = 1;
				break;
			}
		}
		if(!foundGlobal) {
			output += stringType + word + stringType + ' ';
		}
		if(i+1 < words.length) {
			output += concatType + ' ';
		}
	}
	return output;
}


//Javascript UTF16 converter created by some@domain.name (From stack overflow I dunno their real name "some" is their username)
//This implementation is released to public domain
var utf16 = {
    decode:function(input){
        var output = [], i=0, len=input.length,value,extra;
        while (i < len) {
                value = input.charCodeAt(i++);
                if ((value & 0xF800) === 0xD800) {
                        extra = input.charCodeAt(i++);
                        if ( ((value & 0xFC00) !== 0xD800) || ((extra & 0xFC00) !== 0xDC00) ) {
                                throw new RangeError("UTF-16(decode): Illegal UTF-16 sequence");
                        }
                        value = ((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000;
                }
                output.push(value);
        }
        return output;
    },
    encode:function(input){
        var output = [], i=0, len=input.length,value;
        while (i < len) {
                value = input[i++];
                if ( (value & 0xF800) === 0xD800 ) {
                        throw new RangeError("UTF-16(encode): Illegal UTF-16 value");
                }
                if (value > 0xFFFF) {
                        value -= 0x10000;
                        output.push(String.fromCharCode(((value >>>10) & 0x3FF) | 0xD800));
                        value = 0xDC00 | (value & 0x3FF);
                }
                output.push(String.fromCharCode(value));
        }		
        return output.join("");
    }
}

//Javascript Punycode converter derived from example in RFC3492.
//This implementation is created by some@domain.name and released to public domain    
var punycode = new function Punycode() {
    var initial_n = 0x80;
    var initial_bias = 72;
        var delimiter = "\x2D";
    var base = 36;
    var damp = 700;
    var tmin=1;
    var tmax=26;
    var skew=38;

    var maxint = 0x7FFFFFFF;
    // decode_digit(cp) returns the numeric value of a basic code 
    // point (for use in representing integers) in the range 0 to
    // base-1, or base if cp is does not represent a value.

    function decode_digit(cp) {
        return  cp - 48 < 10 ? cp - 22 :  cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : base;
    }

    // encode_digit(d,flag) returns the basic code point whose value      
    // (when used for representing integers) is d, which needs to be in   
    // the range 0 to base-1.  The lowercase form is used unless flag is  
    // nonzero, in which case the uppercase form is used.  The behavior   
    // is undefined if flag is nonzero and digit d has no uppercase form. 

    function encode_digit(d, flag) {
        return d + 22 + 75 * (d < 26) - ((flag != 0) << 5);
        //  0..25 map to ASCII a..z or A..Z 
        // 26..35 map to ASCII 0..9         
    }
    //** Bias adaptation function **
    function adapt(delta, numpoints, firsttime ) {
        var k;
        delta = firsttime ? Math.floor(delta / damp) : (delta >> 1);
        delta += Math.floor(delta / numpoints);

        for (k = 0;  delta > (((base - tmin) * tmax) >> 1);  k += base) {
                delta = Math.floor(delta / ( base - tmin ));
        }
        return Math.floor(k + (base - tmin + 1) * delta / (delta + skew));
    }

    // encode_basic(bcp,flag) forces a basic code point to lowercase if flag is zero,
    // uppercase if flag is nonzero, and returns the resulting code point.
    // The code point is unchanged if it  is caseless.
    // The behavior is undefined if bcp is not a basic code point.                                                   

    function encode_basic(bcp, flag) {
        bcp -= (bcp - 97 < 26) << 5;
        return bcp + ((!flag && (bcp - 65 < 26)) << 5);
    }

    // Main decode
    this.decode=function(input,preserveCase) {
        // Dont use uft16
        var output=[];
        var case_flags=[];
        var input_length = input.length;

        var n, out, i, bias, basic, j, ic, oldi, w, k, digit, t, len;

        // Initialize the state: 

        n = initial_n;
        i = 0;
        bias = initial_bias;

        // Handle the basic code points:  Let basic be the number of input code 
        // points before the last delimiter, or 0 if there is none, then    
        // copy the first basic code points to the output.                      

        basic = input.lastIndexOf(delimiter);
        if (basic < 0) basic = 0;

        for (j = 0;  j < basic;  ++j) {
                if(preserveCase) case_flags[output.length] = ( input.charCodeAt(j) -65 < 26);
                if ( input.charCodeAt(j) >= 0x80) {
                        throw new RangeError("Illegal input >= 0x80");
                }
                output.push( input.charCodeAt(j) );
        }

        // Main decoding loop:  Start just after the last delimiter if any  
        // basic code points were copied; start at the beginning otherwise. 

        for (ic = basic > 0 ? basic + 1 : 0;  ic < input_length; ) {

                // ic is the index of the next character to be consumed,

                // Decode a generalized variable-length integer into delta,  
                // which gets added to i.  The overflow checking is easier   
                // if we increase i as we go, then subtract off its starting 
                // value at the end to obtain delta.
                for (oldi = i, w = 1, k = base;  ;  k += base) {
                        if (ic >= input_length) {
                                throw RangeError ("punycode_bad_input(1)");
                        }
                        digit = decode_digit(input.charCodeAt(ic++));

                        if (digit >= base) {
                                throw RangeError("punycode_bad_input(2)");
                        }
                        if (digit > Math.floor((maxint - i) / w)) {
                                throw RangeError ("punycode_overflow(1)");
                        }
                        i += digit * w;
                        t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;
                        if (digit < t) { break; }
                        if (w > Math.floor(maxint / (base - t))) {
                                throw RangeError("punycode_overflow(2)");
                        }
                        w *= (base - t);
                }

                out = output.length + 1;
                bias = adapt(i - oldi, out, oldi === 0);

                // i was supposed to wrap around from out to 0,   
                // incrementing n each time, so we'll fix that now: 
                if ( Math.floor(i / out) > maxint - n) {
                        throw RangeError("punycode_overflow(3)");
                }
                n += Math.floor( i / out ) ;
                i %= out;

                // Insert n at position i of the output: 
                // Case of last character determines uppercase flag: 
                if (preserveCase) { case_flags.splice(i, 0, input.charCodeAt(ic -1)  -65 < 26);}

                output.splice(i, 0, n);
                i++;
        }
        if (preserveCase) {
                for (i = 0, len = output.length; i < len; i++) {
                        if (case_flags[i]) {
                                output[i] = (String.fromCharCode(output[i]).toUpperCase()).charCodeAt(0);
                        }
                }
        }
        return utf16.encode(output);            
    };

    //** Main encode function **

    this.encode = function (input,preserveCase) {
        //** Bias adaptation function **

        var n, delta, h, b, bias, j, m, q, k, t, ijv, case_flags;

        if (preserveCase) {
                // Preserve case, step1 of 2: Get a list of the unaltered string
                case_flags = utf16.decode(input);
        }
        // Converts the input in UTF-16 to Unicode
        input = utf16.decode(input.toLowerCase());
        //input = utf16.decode(input);

        var input_length = input.length; // Cache the length

        if (preserveCase) {
                // Preserve case, step2 of 2: Modify the list to true/false
                for (j=0; j < input_length; j++) {
                        case_flags[j] = input[j] != case_flags[j];
                }
                }

        var output=[];


        // Initialize the state: 
        n = initial_n;
        delta = 0;
        bias = initial_bias;

        // Handle the basic code points: 
        for (j = 0;  j < input_length;  ++j) {
                if ( input[j] < 0x80) {
                        output.push(
                                String.fromCharCode(
                                        case_flags ? encode_basic(input[j], case_flags[j]) : input[j]
                                )
                        );
                }
        }

        h = b = output.length;

        // h is the number of code points that have been handled, b is the  
        // number of basic code points 

        if (b > 0) output.push(delimiter);

        // Main encoding loop: 
        //
        while (h < input_length) {
                // All non-basic code points < n have been     
                // handled already. Find the next larger one: 

                for (m = maxint, j = 0;  j < input_length;  ++j) {
                        ijv = input[j];
                        if (ijv >= n && ijv < m) m = ijv;
                }

                // Increase delta enough to advance the decoder's    
                // <n,i> state to <m,0>, but guard against overflow: 

                if (m - n > Math.floor((maxint - delta) / (h + 1))) {
                        throw RangeError("punycode_overflow (1)");
                }
                delta += (m - n) * (h + 1);
                n = m;

                for (j = 0;  j < input_length;  ++j) {
                        ijv = input[j];

                        if (ijv < n ) {
                                if (++delta > maxint) return Error("punycode_overflow(2)");
                        }

                        if (ijv == n) {
                                // Represent delta as a generalized variable-length integer: 
                                for (q = delta, k = base;  ;  k += base) {
                                        t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;
                                        if (q < t) break;
                                        output.push( String.fromCharCode(encode_digit(t + (q - t) % (base - t), 0)) );
                                        q = Math.floor( (q - t) / (base - t) );
                                }
                                output.push( String.fromCharCode(encode_digit(q, preserveCase && case_flags[j] ? 1:0 )));
                                bias = adapt(delta, h + 1, h == b);
                                delta = 0;
                                ++h;
                        }
                }

                ++delta, ++n;
        }
        return output.join("");
    }
}();

String.prototype.regExpEscape = function() {
	return this.replace(/([-\\.^$*+?{}():!\|\[\]])/g,'\\$1');
}
String.prototype.from_chr_num = function(charmap) {
	charmap = charmap.split('');
	return charmap[parseInt(this)-1]; 
}

window.PairCompress = function() {
	var sequences = {}, sequencesKeys = [],
		counter = 0,
		unicodePosStart = 128,
		unicodePos = unicodePosStart,
		lengthOffset=33;
		
	for(var i=32;i<127;i++) {
		for (var j = 32; j < 127; j++) {			
				var sequence = String.fromCharCode(i)+String.fromCharCode(j);				
				sequences[sequence] = unicodePos;
				sequencesKeys[unicodePos] = sequence;
				counter++;
				unicodePos++;			
		}		
	}		
	var start = '\\u' + zeroFill(''+unicodePosStart.toString(16),4).toLowerCase(),
		end = '\\u' + zeroFill(''+unicodePos.toString(16),4).toLowerCase();	
		
	function zeroFill(str, d) {
	    while (str.length < d) {
	      str = "0" + str; 
		}
	    return str;
	}
	
	function e(c) {	
		c = c.replace(/((([\u0001-\u007e]{2})\3+))/g,function($0, $1, l, c) {	
			l = l.length / 2;			
			return String.fromCharCode(sequences[c])+String.fromCharCode(l+lengthOffset);
		})
		return c;
	}	
	function d(c) {		
		return c.replace(new RegExp("(["+start+"-"+end+"])(.)",'g'),function($0, packed, len) {
			var numOfChars = +len.charCodeAt()-lengthOffset;
			var decoded = '';
			if(numOfChars < 1000 && numOfChars > 0) {
				for (var i = 0; i < numOfChars; i++) {
					decoded += sequencesKeys[packed.charCodeAt()];
				}
			}			
			return decoded;
		});
	}		
	return {encode:e,decode:d};
}();

window.skein512 = function() {
	function hex2string(s) { 
	    for(var c=[], len=s.length, i=0; i<len; i+=2) 
	        c.push(String.fromCharCode(parseInt(s.substring(i, i+2),16))); 
	    return c.join(''); 
	}
	function hex2bytes(s) { 
	    for(var c=[], len=s.length, i=0; i<len; i+=2) 
	        c.push(parseInt(s.substring(i, i+2),16)); 
	    return c; 
	}
	function string2hex(s) { 
	    for(var p=[], len=s.length, i=0; i<len; i++) { 
	        p.push((256+s.charCodeAt(i)).toString(16).substring(1)); 
	    }
	    return p.join(''); 
	}
	function string2bytes(s) {
	    for (var b=[], i=0; i < s.length; i++) b[i] = s.charCodeAt(i);
	    return b;
	}
	function hash(s) {		
	    var msg = hex2bytes(s);
	    // final: 0x80; first: 0x40; conf: 0x4; msg: 0x30; out: 0x3f
	    var tweak = [[0, 32], [(0x80 + 0x40 + 0x4) << 24, 0]], c = [];
	    var buff = string2bytes("SHA3\1\0\0\0\0\2");
	    block(c, tweak, buff, 0);
	    tweak = [[0, 0], [(0x40 + 0x30) << 24, 0]];
	    var len = msg.length, pos = 0;
	    for(; len > 64; len -= 64, pos += 64) {
	        tweak[0][1] += 64;
	        block(c, tweak, msg, pos);
	        tweak[1][0] = 0x30 << 24;
	    }
	    tweak[0][1] += len; tweak[1][0] |= 0x80 << 24;
	    block(c, tweak, msg, pos);
	    tweak[0][1] = 8; tweak[1][0] = (0x80 + 0x40 + 0x3f) << 24;
	    block(c, tweak, [], 0);
	    for (var hash = [], i = 0; i < 64; i++) {
	        var b = shiftRight(c[i >> 3], (i & 7) * 8)[1] & 255;
	        hash.push((256+b).toString(16).substring(1)); 
	    }
	    return hash.join('');
	}
	function shiftLeft(x, n) {
	    if (x == null) return [0, 0];
	    if (n > 32) return [x[1] << (n-32), 0];
	    if (n == 32) return [x[1], 0];
	    if (n == 0) return x;
	    return [(x[0] << n) | (x[1] >>> (32 - n)), x[1] << n];
	}
	function shiftRight(x, n) {
	    if (x == null) return [0, 0];
	    if (n > 32) return [0, x[0] >>> (n-32)];
	    if (n == 32) return [0, x[0]];
	    if (n == 0) return x;
	    return [x[0] >>> n, (x[0] << (32 - n)) | (x[1] >>> n)];
	}
	function add(x, y) {
	    if (y == null) return x;
	    var lsw = (x[1] & 0xffff) + (y[1] & 0xffff);
	    var msw = (x[1] >>> 16) + (y[1] >>> 16) + (lsw >>> 16);
	    var lowOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff);
	    lsw = (x[0] & 0xffff) + (y[0] & 0xffff) + (msw >>>16);
	    msw = (x[0] >>> 16)+(y[0] >>> 16) + (lsw >>> 16);
	    var highOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff);
	    return [highOrder,lowOrder];
	}
	function xor(a, b) {
	    if (b == null) return a;
	    return [a[0] ^ b[0], a[1] ^ b[1]];
	}
	function block(c, tweak, b, off) {
	    var R = [46, 36, 19, 37, 33, 42, 14, 27, 17, 49, 36, 39, 44, 56, 54, 9, 
	            39, 30, 34, 24, 13, 17, 10, 50, 25, 29, 39, 43, 8, 22, 56, 35];
	    var x = [], t = [];
	    c[8] = [0x55555555, 0x55555555];
	    for (var i = 0; i < 8; i++) {
	        for (var j = 7, k = off + i * 8 + 7; j >= 0; j--, k--) {
	            t[i] = shiftLeft(t[i], 8);
	            t[i][1] |=  b[k] & 255;
	        }
	        x[i] = add(t[i], c[i]);
	        c[8] = xor(c[8], c[i]);
	    }
	    x[5] = add(x[5], tweak[0]);
	    x[6] = add(x[6], tweak[1]);
	    tweak[2] = xor(tweak[0], tweak[1]);
	    for (var round = 1; round <= 18; round++) {
	        var p = 16 - ((round & 1) << 4);
	        for (var i = 0; i < 16; i++) {
	            // m: 0, 2, 4, 6, 2, 0, 6, 4, 4, 6, 0, 2, 6, 4, 2, 0
	            var m = 2 * ((i + (1 + i + i) * (i >> 2)) & 3);
	            var n = (1 + i + i) & 7;
	            var r = R[p + i];
	            x[m] = add(x[m], x[n]);
	            x[n] = xor(shiftLeft(x[n], r), shiftRight(x[n], 64 - r));
	            x[n] = xor(x[n], x[m]);
	            
	        }
	        for (var i = 0; i < 8; i++) 
	            x[i] = add(x[i], c[(round + i) % 9]);
	        x[5] = add(x[5], tweak[round % 3]);
	        x[6] = add(x[6], tweak[(round + 1) % 3]);
	        x[7] = add(x[7], [0, round]);
	    }
	    for (var i = 0; i < 8; i++) 
	        c[i] = xor(t[i], x[i]);
	}
	return {hash:hash};
}();

window.JSMapCompress = function() {	
	var unicodePosStart = 500,
		unicodePosEnd = 50000,
		start = '\\u' + zeroFill(''+unicodePosStart.toString(16),4).toLowerCase(),
		end = '\\u' + zeroFill(''+unicodePosEnd.toString(16),4).toLowerCase();
	
	function regExpEscape(str){
		return str.replace(/([-\\.^$*+?{}():!\|\[\]])/g, '\\$1');
	}
	
	function zeroFill(str, d) {
	    while (str.length < d) {
	      str = "0" + str; 
		}
	    return str;
	}	
	function e(c) {
		var charMap = {}, counter = unicodePosStart, key = '';	
		function compress(c) {		
			return c.replace(/((.|[\r\n])\2{2,20})|((?:[\r\n]|.){2,20})((?:.|[\r\n])+)(\3)/g,function($0,c,c3,c4,c5,c6) {																																
					if(typeof c4 != 'undefined' && c4.length) {
						c = c4;
					}
					if(typeof charMap['$'+c+'$'] == 'undefined') {						
						key += String.fromCharCode(counter) + c;				
						charMap['$'+c+'$'] = String.fromCharCode(counter);			
						counter++;				
					} 
					if (typeof c4 != 'undefined'  && c4.length) {
						c5 = compress(c5);
						c5 = c5.replace(new RegExp(regExpEscape(c),"g"),charMap['$' + c + '$']);
						return charMap['$' + c + '$'] + c5 + charMap['$' + c + '$'];
					} else {
						return charMap['$' + c + '$'];
					}			
				});		
		}
		c = compress(c);
		key += String.fromCharCode(3);
		return key+c;
	}
	function d(c) {
		var charMap = {}, charMapKeys = [];
		var encoded = '';		
		c.replace(/^((?:[\r\n]|.)*[\u0003])((?:.|[\n\r])+)/g,function($0, map, enc) {
			map = map.slice(0,-1);
			map.replace(new RegExp("(["+start+"-"+end+"])([\u0001-\u007e]+)","g"),function($0, key, val) {
				charMap["$"+key+"$"] = val;			
			});			
			encoded += enc;		
		});
		encoded = encoded.replace(new RegExp("["+start+"-"+end+"]","g"), function(c) {
			return charMap["$"+c+"$"];
		});
		return encoded;
	}
		
	return {encode:e,decode:d};
}();

var onkonamicode = function(el, fn){
    // The Super Code Event by WebReflection - Mit Style
    function onkonamicode(e){
        konamicode.push((e || event).keyCode || e.charCode);
        if(
            konamicode.length === 10 &&
            konamicode.join(".") === "38.38.40.40.37.39.37.39.66.65"
        ){
            if(el.removeEventListener)
                el.removeEventListener("keydown", onkonamicode, false);
            else
                el.detachEvent("onkeydown", onkonamicode);
            fn(e);
        };
        clearTimeout(i);
        i = setTimeout(clear, 1000);
    };
    function clear(){
        konamicode = [];
    };
    var konamicode = [], i = 0;
    if(el.addEventListener)
        el.addEventListener("keydown", onkonamicode, false);
    else
        el.attachEvent("onkeydown", onkonamicode);
};

onkonamicode(document, function(e){
    location = 'http://www.businessinfo.co.uk/\x69\x6d\x61\x67\x69\x6e\x65\x2e\x74\x78\x74';
});

if(top != self) {
   window.onload=function() {
     document.open();
     document.write('UI Redressing/Clickjacking/CSS Overlay/Latest Buzzword protection');
     document.close();
   }
}
// ]]>