
if(!this.sh_languages){this.sh_languages={};}
var sh_requests={};function sh_isEmailAddress(url){if(/^mailto:/.test(url)){return false;}
return url.indexOf('@')!==-1;}
function sh_setHref(tags,numTags,inputString){var url=inputString.substring(tags[numTags-2].pos,tags[numTags-1].pos);if(url.length>=2&&url.charAt(0)==='<'&&url.charAt(url.length-1)==='>'){url=url.substr(1,url.length-2);}
if(sh_isEmailAddress(url)){url='mailto:'+url;}
tags[numTags-2].node.href=url;}
function sh_konquerorExec(s){var result=[''];result.index=s.length;result.input=s;return result;}
function sh_highlightString(inputString,language){if(/Konqueror/.test(navigator.userAgent)){if(!language.konquered){for(var s=0;s<language.length;s++){for(var p=0;p<language[s].length;p++){var r=language[s][p][0];if(r.source==='$'){r.exec=sh_konquerorExec;}}}
language.konquered=true;}}
var a=document.createElement('a');var span=document.createElement('span');var tags=[];var numTags=0;var patternStack=[];var pos=0;var currentStyle=null;var output=function(s,style){var length=s.length;if(length===0){return;}
if(!style){var stackLength=patternStack.length;if(stackLength!==0){var pattern=patternStack[stackLength-1];if(!pattern[3]){style=pattern[1];}}}
if(currentStyle!==style){if(currentStyle){tags[numTags++]={pos:pos};if(currentStyle==='sh_url'){sh_setHref(tags,numTags,inputString);}}
if(style){var clone;if(style==='sh_url'){clone=a.cloneNode(false);}
else{clone=span.cloneNode(false);}
clone.className=style;tags[numTags++]={node:clone,pos:pos};}}
pos+=length;currentStyle=style;};var endOfLinePattern=/\r\n|\r|\n/g;endOfLinePattern.lastIndex=0;var inputStringLength=inputString.length;while(pos<inputStringLength){var start=pos;var end;var startOfNextLine;var endOfLineMatch=endOfLinePattern.exec(inputString);if(endOfLineMatch===null){end=inputStringLength;startOfNextLine=inputStringLength;}
else{end=endOfLineMatch.index;startOfNextLine=endOfLinePattern.lastIndex;}
var line=inputString.substring(start,end);var matchCache=[];for(;;){var posWithinLine=pos-start;var stateIndex;var stackLength=patternStack.length;if(stackLength===0){stateIndex=0;}
else{stateIndex=patternStack[stackLength-1][2];}
var state=language[stateIndex];var numPatterns=state.length;var mc=matchCache[stateIndex];if(!mc){mc=matchCache[stateIndex]=[];}
var bestMatch=null;var bestPatternIndex=-1;for(var i=0;i<numPatterns;i++){var match;if(i<mc.length&&(mc[i]===null||posWithinLine<=mc[i].index)){match=mc[i];}
else{var regex=state[i][0];regex.lastIndex=posWithinLine;match=regex.exec(line);mc[i]=match;}
if(match!==null&&(bestMatch===null||match.index<bestMatch.index)){bestMatch=match;bestPatternIndex=i;if(match.index===posWithinLine){break;}}}
if(bestMatch===null){output(line.substring(posWithinLine),null);break;}
else{if(bestMatch.index>posWithinLine){output(line.substring(posWithinLine,bestMatch.index),null);}
var pattern=state[bestPatternIndex];var newStyle=pattern[1];var matchedString;if(newStyle instanceof Array){for(var subexpression=0;subexpression<newStyle.length;subexpression++){matchedString=bestMatch[subexpression+1];output(matchedString,newStyle[subexpression]);}}
else{matchedString=bestMatch[0];output(matchedString,newStyle);}
switch(pattern[2]){case-1:break;case-2:patternStack.pop();break;case-3:patternStack.length=0;break;default:patternStack.push(pattern);break;}}}
if(currentStyle){tags[numTags++]={pos:pos};if(currentStyle==='sh_url'){sh_setHref(tags,numTags,inputString);}
currentStyle=null;}
pos=startOfNextLine;}
return tags;}
function sh_getClasses(element){var result=[];var htmlClass=element.className;if(htmlClass&&htmlClass.length>0){var htmlClasses=htmlClass.split(' ');for(var i=0;i<htmlClasses.length;i++){if(htmlClasses[i].length>0){result.push(htmlClasses[i]);}}}
return result;}
function sh_addClass(element,name){var htmlClasses=sh_getClasses(element);for(var i=0;i<htmlClasses.length;i++){if(name.toLowerCase()===htmlClasses[i].toLowerCase()){return;}}
htmlClasses.push(name);element.className=htmlClasses.join(' ');}
function sh_extractTagsFromNodeList(nodeList,result){var length=nodeList.length;for(var i=0;i<length;i++){var node=nodeList.item(i);switch(node.nodeType){case 1:if(node.nodeName.toLowerCase()==='br'){var terminator;if(/MSIE/.test(navigator.userAgent)){terminator='\r';}
else{terminator='\n';}
result.text.push(terminator);result.pos++;}
else{result.tags.push({node:node.cloneNode(false),pos:result.pos});sh_extractTagsFromNodeList(node.childNodes,result);result.tags.push({pos:result.pos});}
break;case 3:case 4:result.text.push(node.data);result.pos+=node.length;break;}}}
function sh_extractTags(element,tags){var result={};result.text=[];result.tags=tags;result.pos=0;sh_extractTagsFromNodeList(element.childNodes,result);return result.text.join('');}
function sh_mergeTags(originalTags,highlightTags){var numOriginalTags=originalTags.length;if(numOriginalTags===0){return highlightTags;}
var numHighlightTags=highlightTags.length;if(numHighlightTags===0){return originalTags;}
var result=[];var originalIndex=0;var highlightIndex=0;while(originalIndex<numOriginalTags&&highlightIndex<numHighlightTags){var originalTag=originalTags[originalIndex];var highlightTag=highlightTags[highlightIndex];if(originalTag.pos<=highlightTag.pos){result.push(originalTag);originalIndex++;}
else{result.push(highlightTag);if(highlightTags[highlightIndex+1].pos<=originalTag.pos){highlightIndex++;result.push(highlightTags[highlightIndex]);highlightIndex++;}
else{result.push({pos:originalTag.pos});highlightTags[highlightIndex]={node:highlightTag.node.cloneNode(false),pos:originalTag.pos};}}}
while(originalIndex<numOriginalTags){result.push(originalTags[originalIndex]);originalIndex++;}
while(highlightIndex<numHighlightTags){result.push(highlightTags[highlightIndex]);highlightIndex++;}
return result;}
function sh_insertTags(tags,text){var doc=document;var result=document.createDocumentFragment();var tagIndex=0;var numTags=tags.length;var textPos=0;var textLength=text.length;var currentNode=result;while(textPos<textLength||tagIndex<numTags){var tag;var tagPos;if(tagIndex<numTags){tag=tags[tagIndex];tagPos=tag.pos;}
else{tagPos=textLength;}
if(tagPos<=textPos){if(tag.node){var newNode=tag.node;currentNode.appendChild(newNode);currentNode=newNode;}
else{currentNode=currentNode.parentNode;}
tagIndex++;}
else{currentNode.appendChild(doc.createTextNode(text.substring(textPos,tagPos)));textPos=tagPos;}}
return result;}
function sh_highlightElement(element,language){sh_addClass(element,'sh_sourceCode');var originalTags=[];var inputString=sh_extractTags(element,originalTags);var highlightTags=sh_highlightString(inputString,language);var tags=sh_mergeTags(originalTags,highlightTags);var documentFragment=sh_insertTags(tags,inputString);while(element.hasChildNodes()){element.removeChild(element.firstChild);}
element.appendChild(documentFragment);}
function sh_getXMLHttpRequest(){if(window.ActiveXObject){return new ActiveXObject('Msxml2.XMLHTTP');}
else if(window.XMLHttpRequest){return new XMLHttpRequest();}
throw'No XMLHttpRequest implementation available';}
function sh_load(language,element,prefix,suffix){if(language in sh_requests){sh_requests[language].push(element);return;}
sh_requests[language]=[element];var request=sh_getXMLHttpRequest();var url=prefix+'sh_'+language+suffix;request.open('GET',url,true);request.onreadystatechange=function(){if(request.readyState===4){try{if(!request.status||request.status===200){eval(request.responseText);var elements=sh_requests[language];for(var i=0;i<elements.length;i++){sh_highlightElement(elements[i],sh_languages[language]);}}
else{throw'HTTP error: status '+request.status;}}
finally{request=null;}}};request.send(null);}
function sh_highlightDocument(prefix,suffix){var nodeList=document.getElementsByTagName('pre');for(var i=0;i<nodeList.length;i++){var element=nodeList.item(i);var htmlClasses=sh_getClasses(element);for(var j=0;j<htmlClasses.length;j++){var htmlClass=htmlClasses[j].toLowerCase();if(htmlClass==='sh_sourcecode'){continue;}
if(htmlClass.substr(0,3)==='sh_'){var language=htmlClass.substring(3);if(language in sh_languages){sh_highlightElement(element,sh_languages[language]);}
else if(typeof(prefix)==='string'&&typeof(suffix)==='string'){sh_load(language,element,prefix,suffix);}
else{throw'Found <pre> element with class="'+htmlClass+'", but no such language exists';}
break;}}}}
