function toJSON(d){var b="";if(d instanceof Array){b+="[";for(var a=0;a<d.length;a++){b+=toJSON(d[a])+(a+1<d.length?",":"")}b+="]"}else{if(d instanceof String){b+='"'+d.toString().replace(/\"/g,'\\"')+'"'}else{if(d instanceof Number){b+=""+d.valueOf()}else{if(d instanceof Date){b+=gjsf.defaultDateSerializer(d)}else{if(d instanceof Object){b+="{";var e=0;for(var a in d){b+=(e++?",":"")+'"'+a+'":'+toJSON(d[a])}b+="}"}else{if(typeof(d)=="string"){b+='"'+d.replace(/\"/g,'\\"')+'"'}else{b+=d}}}}}}return b}function pad(a,d,b){return(a.toString().length<d)?pad((b||"0")+a,d,b):a.toString()}function javaScriptDate(a){return"new Date("+a.getTime()+")"}function jsonDate(a){return'"'+a.getUTCFullYear()+"-"+pad(a.getUTCMonth()+1,2)+"-"+pad(a.getUTCDate(),2)+"T"+pad(a.getUTCHours(),2)+":"+pad(a.getUTCMinutes(),2)+":"+pad(a.getUTCSeconds(),2)+'Z"'}function typeOf(a){var b=a&&a.__class__;if(!b){if(typeof(a)=="object"){return a.constructor.name}else{return typeof(a)}}else{return b.className}}function instanceOf(a,b){if(typeof(a)=="undefined"){return false}if(typeof(b)=="string"){if(a===null){return b.toLowerCase()=="string"}return typeof(a)==b.toLowerCase()}else{if(a===null||b==Object){return true}if(!a.__class__){return a.constructor==b}else{return inheritsFrom(a.__class__,b)}}}function inheritsFrom(a,b){if(!b){return false}return(a.__inheritance__.indexOf(b.className+"|")!=-1)}function clone(e,b){if(typeof(e)=="object"&&(typeof(b)=="undefined"||b-->0)){var f={};for(var a in e){f[a]=clone(e[a],b)}return f}return e}function compare(e,d){if(e&&d&&e!=d&&typeof(e)=="object"&&typeof(d)=="object"){var a=false;for(var b in e){if(!compare(e[b],d[b])){return false}var a=true}for(var b in d){return a}return true}return(e==d)}function equals(e,d){if(e&&d){if(e.equals){return e.equals(d)}if(e!=d&&typeof(e)=="object"&&typeof(d)=="object"){var a=false;for(var b in e){if(!equals(e[b],d[b])){return false}var a=true}for(var b in d){return a}return true}}return(e==d)}function stringValue(a,b){if(typeof(b)=="undefined"){var b=null}return typeof(a)=="undefined"?b:(typeof(a)=="string"?a:""+a||b)}function intValue(a,b){if(typeof(b)=="undefined"){var b=null}return typeof(a)=="number"?parseInt(a):a?parseInt(a):b}function floatValue(a,b){if(typeof(b)=="undefined"){var b=null}return typeof(a)=="number"?parseFloat(a):a?parseFloat(a):b}function boolValue(a,b){if(typeof(b)=="undefined"){var b=null}return typeof(a)=="undefined"?b:a?true:false}function create(type,args){str="new "+(type.className||type)+"(";if(!args){return eval(str+")")}else{if(args.constructor==Array){for(var i=0;i<args.length;i++){str+="args["+i+"],"}}else{if(typeof(type)=="string"){c=window[type]}else{c=type}var p=parameters(c);for(var i=0;i<p.length;i++){str+="args."+p[i]+","}}}return eval(str.replace(/,?$/,")"))}function parameters(b){var a=b.toString().match(/\((.+?)\)/);if(a&&a.length>1){return a[1].split(", ")}else{return[]}}function arrayCompare(b,a){if(b.length!=a.length){return false}for(var d=0;d<b.length;d++){if(b[d]!=a[d]){return false}}return true}function printf(d){var a=new String(d);for(var b=1;b<arguments.length;b++){a=a.replace("%"+b,arguments[b],"g")}return a}function fuseOnce(g,d,a,b){var h=function(){b.apply(a,arguments);defuse(g,d,a,h)};fuse(g,d,a,h)}function fuse(h,g,a,d){var b="__fuse__"+g;if(!h[g]||!h[g].__fuse__){if(!h[b]){if(typeof(h[g])=="function"){h[b]=new Array({o:h,f:h[g]})}else{h[b]=new Array()}}h[g]=function(){var e=h[b];for(var f=0;f<e.length;f++){e[f].f.apply(e[f].o,arguments)}};h[g].__fuse__=true}h[b].push({o:a,f:d})}function defuse(l,k,d,j){var g="__fuse__"+k;if(l[g]){var b=l[g];for(var h=0;h<b.length;h++){if(b[h].f==j&&b[h].o==d){b.splice(h,1)}}}}function syncronize(d,b,a,g){if(g){a()}else{hookOnce(d,b,a)}}function hookOnce(g,d,a){var b=function(){a.apply(g,arguments);unhook(g,d,b)};hook(g,d,b)}function hook(g,d,b){var a="__hook__"+d;if(!g[a]){if(typeof(g[d])=="function"){g[a]=new Array(g[d])}else{g[a]=new Array()}g[d]=function(){var e=g[a];for(var f=0;f<e.length;f++){e[f].apply(g,arguments)}}}g[a].push(b)}function unhook(k,j,h){var g="__hook__"+j;if(k[g]){var b=k[g];for(var d=0;d<b.length;d++){if(b[d]==h){b.splice(d,1)}}}}function staticConstructor(a,b){gjsf.myStaticConstructors.push(function(){b.call(a)})}function declareClass(b,a){if(!window[b]||typeof(window[b])!="function"){if(a){window[b]=function(){this.construct.apply(this,arguments)}}else{window[b]=function(){}}}if(gjsf.myDebug){window[b]=gjsf.getDebugFunction(window[b],b)}window[b].prototype.toString=function(){return b};window[b].prototype.__class__=window[b];window[b].className=b;window[b].property=gjsf.property;if(a){window[b].__inheritance__=b+"|";if(a.className){a=a.className}gjsf.xtend(window[b],a)}else{window[b].__inheritance__="Object||"+b+"|"}gjsf.classLoaded(b)}function declareStaticClass(a){if(typeof(window[a])=="function"){gjsf.myStaticConstructors.push(window[a])}window[a]={};window[a].className=a;gjsf.classLoaded(a)}function declareAbstractClass(d,b){if(typeof(window[d])=="function"){var a=window[d];window[d]=function(){if(this.__class__.className==d){throw (d+" is abstract.")}a.apply(this,arguments)}}else{window[d]=function(){if(this.__class__.className==d){throw (d+" is abstract.")}if(this.construct){this.construct.apply(this,arguments)}}}declareClass(d,b)}function declareFinalClass(b,a){declareClass(b,a);window[b].__final__=true}function declareContract(a){declareClass(a);gjsf.myContracts[a]=true}function finalize(a){a.__final__=true;return a}function strapCss(e){var d=document.createElement("link");d.type="text/css";d.rel="stylesheet";var a="";for(var b in gjsf.myClassPaths){if(e.indexOf(b.replace(/\./g,"/")+"/")==0){a=gjsf.myClassPaths[b]+e;break}}if(!a){a=e}d.href=a;gjsf.getHeadElement().appendChild(d)}function strap(e){if(/\.js$/.test(e)&&e.indexOf("/")!=-1){var a="";for(var b in gjsf.myClassPaths){if(e.indexOf(b.replace(/\./g,"/")+"/")==0){a=gjsf.myClassPaths[b]+e;break}}if(!a){a=e}gjsf.openScript(a)}else{var a="";for(var b in gjsf.myClassPaths){if(e.indexOf(b+".")==0){a=gjsf.myClassPaths[b]+e.replace(/\./g,"/");break}}if(!a){for(var b in gjsf.myClassPaths){a=gjsf.myClassPaths[b]+(b+"."+e).replace(/\./g,"/");break}}var d=a.substring(a.lastIndexOf("/")+1,a.length);a+=".js";if(!window[d]){window[d]={className:d};gjsf.myPendingClasses[d]=true;if(gjsf.openScript(a)){gjsf.myLoadCount++}}}}function contract(a){var b=a.substring(a.lastIndexOf("/")+1,a.length);var d=b.indexOf(".");b=b.substring(0,(d!=-1?d:b.length));if(!window[b]){window[b]=b;gjsf.myPendingClasses[b]=true;if(gjsf.openScript(a)){gjsf.myLoadCount++}}}function isClassLoaded(a){return(gjsf.myPendingClasses[a]===false||typeof(window[a])=="function")}function isClassStrapped(a){return(typeof(gjsf.myPendingClasses[a])!="undefined")}function addClassPath(a,b){if(b){gjsf.myClassPaths[a]=b.replace(new RegExp("/*$"),"/")}}function getDefaultCharset(){if(typeof(document.characterSet)=="string"){return document.characterSet}var d=null;var b=document.getElementsByTagName("meta");for(var a=0;a<b.length;a++){d=b[a].content.match(/^.*charset=([\w\d\-]+);?.*$/i);if(d&&d.length>1){return d[1]}}return""}var gjsf={};gjsf.defaultDateSerializer=javaScriptDate;gjsf.myScripts={};gjsf.myPendingClasses={};gjsf.myLoadCount=0;gjsf.myLoadTimer=null;gjsf.myScriptsToStrap=new Array();gjsf.myIsStrapInitiated=false;gjsf.myHeadElement=null;gjsf.myStackTrace=new Array();gjsf.myXtends=new Array();gjsf.myIsXtendInitiated=false;gjsf.myStaticConstructors=new Array();gjsf.myContracts={};gjsf.myClassPaths={};gjsf.xtend=function(a,b){gjsf.myXtends.push({student:a,teacher:b})};gjsf.buildTree=function(a,b){if(!b.__final__){a.__teacher__=b;if(!b.__tree__){b.__tree__=new Array()}b.__tree__.push(a)}else{throw new Exception(b+" is declared as final.")}};gjsf.buildClass=function(f){var g=f.__teacher__;if(g&&!f.__built__){for(var d in g.prototype){var e=f.prototype[d];var b=g.prototype[d];if(b&&b.__final__&&e){throw new Exception(g.className+"."+d+" is declared as final.")}if(typeof(e)=="undefined"){f.prototype[d]=b}else{if(typeof(e)=="function"&&typeof(b)=="function"){e.__base__=g}}}try{if(g.prototype.toString()!=g.className&&f.prototype.toString()==f.className){f.prototype.toString=g.prototype.toString}}catch(a){}f.__inheritance__=g.__inheritance__+"|"+f.__inheritance__;f.prototype.base=gjsf.base;f.prototype.construct=gjsf.construct;f.prototype.getConstruct=gjsf.getConstruct;f.prototype.getClass=gjsf.getClass}if(f.__tree__){for(var d=0;d<f.__tree__.length;d++){gjsf.buildClass(f.__tree__[d])}delete (f.__tree__)}f.__built__=true};gjsf.initXtend=function(){for(var i=0;i<gjsf.myXtends.length;i++){gjsf.myXtends[i].student=eval(gjsf.myXtends[i].student);gjsf.myXtends[i].teacher=eval(gjsf.myXtends[i].teacher);gjsf.buildTree(gjsf.myXtends[i].student,gjsf.myXtends[i].teacher)}for(var i=0;i<gjsf.myXtends.length;i++){var teacher=gjsf.myXtends[i].teacher;if((teacher.__tree__&&teacher.__built__)||!teacher.__teacher__){gjsf.buildClass(teacher)}}gjsf.myXtends=new Array();gjsf.myIsXtendInitiated=true};gjsf.base=function(d,a){var b=this;if(!b.__stack__){b.__stack__={}}if(b.__stack__[d]){var e=b.__stack__[d];b.__stack__[d]=e.prototype[d].__base__}else{var e=null;if(a){b.__stack__[d]=a}else{b.__stack__[d]=b.__class__.prototype[d].__base__}}return function(){try{return b.__stack__[d].prototype[d].apply(b,arguments)}finally{b.__stack__[d]=e}}};gjsf.construct=function(){if(!this.__construct__){this.__construct__=this.__class__.__teacher__}else{this.__construct__=this.__construct__.__teacher__}this.__construct__.apply(this,arguments);delete (this.__construct__)};gjsf.getConstruct=function(b){var a=this;a.__construct__=b;return function(){a.__construct__.apply(a,arguments);delete (a.__construct__)}};gjsf.property=function property(b,f,d){if(f==Boolean||(typeof(f)=="string"&&f.toLowerCase()=="boolean")){var g="is"+b}else{var g="get"+b}if(!this[b]){this[b]=null}var i,e,a,h;if(d){if(d.set){a=d.set}if(d.get){h=d.get}}if(!a){i=function i(j){if(typeof(j)=="undefined"){throw"UndefinedValueException: "+this.__class__.className+".property."+b+" takes a '"+(f.className||f.name)+"' value but got a '"+typeOf(j)+"'."}if(instanceOf(j,f)){this[b]=j}else{if(j.constructor==Array&&typeof(f)!="string"){this[b]=create(f,j)}else{throw"TypeMismatchException: "+this.__class__.className+".property."+b+" takes a '"+(f.className||f.name)+"' value but got a '"+typeOf(j)+"'."}}}}else{i=function i(j){if(typeof(j)=="undefined"){throw"UndefinedValueException: "+this.__class__.className+".property."+b+" takes a '"+(f.className||f.name)+"' value but got a '"+typeOf(j)+"'."}if(instanceOf(j,f)){var k=a.call(this,j);if(typeof(k)!="undefined"){this[b]=k}}else{if(j.constructor==Array&&typeof(f)!="string"){var k=a.call(this,create(f,j));if(typeof(k)!="undefined"){this[b]=k}}else{throw"TypeMismatchException: "+this.__class__.className+".property."+b+" takes a '"+(f.className||f.name)+"' value but got a '"+typeOf(k)+"'."}}}}if(!h){e=function e(){return this[b]}}else{e=function e(){var j=h.call(this);if(instanceOf(j,f)){return j}else{throw"TypeMismatchException: "+this.__class__.className+".property."+b+" should return a '"+(f.className||f.name)+"' value but returned a '"+typeOf(j)+"'."}}}this.prototype["set"+b]=i;this.prototype[g]=e};gjsf.getClass=finalize(function(){return this.__class__});gjsf.setDebug=function(a){gjsf.myDebug=a};gjsf.isDebug=function(a){return gjsf.myDebug};gjsf.getHeadElement=function(){if(!gjsf.myHeadElement){gjsf.myHeadElement=document.getElementsByTagName("head")[0]}return gjsf.myHeadElement};gjsf.getPendingClasses=function(){return gjsf.myPendingClasses};gjsf.getStackTrace=function(){return gjsf.myStackTrace.concat().reverse()};gjsf.isInitiated=function(){return gjsf.myIsXtendInitiated};gjsf.initStrap=function(){gjsf.myIsStrapInitiated=true;if(gjsf.myScriptsToStrap.length>0){for(var a=0;a<gjsf.myScriptsToStrap.length;a++){gjsf.openScript(gjsf.myScriptsToStrap[a])}}else{clearTimeout(gjsf.myLoadTimer);gjsf.myLoadTimer=setTimeout(function(){gjsf.loaded()},1)}};gjsf.openScript=function(b){if(!gjsf.myScripts[b]){if(gjsf.myIsStrapInitiated){gjsf.myScripts[b]=true;var a=document.createElement("script");a.type="text/javascript";a.onerror=gjsf.onerror;a.src=b;gjsf.getHeadElement().appendChild(a)}else{gjsf.myScriptsToStrap.push(b)}return true}return false};gjsf.classLoaded=function(a){if(gjsf.myPendingClasses[a]){gjsf.myPendingClasses[a]=false;gjsf.myLoadCount--;setTimeout(function(){gjsf.onclassload(a)},0);clearTimeout(gjsf.myLoadTimer);gjsf.myLoadTimer=setTimeout(function(){if(gjsf.myLoadCount==0){gjsf.loaded()}},1)}};gjsf.execStaticConstructors=function(){for(var a=0;a<gjsf.myStaticConstructors.length;a++){gjsf.myStaticConstructors[a]()}gjsf.myStaticConstructors=new Array()};gjsf.loaded=function(){var a=gjsf.myIsXtendInitiated;if(gjsf.myDebug){gjsf.initDebug()}gjsf.initXtend();gjsf.execStaticConstructors();if(!a){gjsf.triggerOnLoad()}else{clearTimeout(gjsf.myLoadTimer);gjsf.myLoadTimer=setTimeout(gjsf.onlateload,1)}};gjsf.initDebug=function(){for(var b in gjsf.myPendingClasses){var d=window[b];for(var a in d.prototype){if(typeof(d.prototype[a])=="function"&&a!="__class__"&&a!="__original__"){d.prototype[a]=gjsf.getDebugFunction(d.prototype[a],b+".prototype."+a+"()")}}for(var a in d){if(typeof(d[a])=="function"&&a!="__class__"&&a!="__original__"){d[a]=gjsf.getDebugFunction(d[a],b+"."+a+"()")}}}};gjsf.getDebugFunction=function(d,b){var a=function(){gjsf.myStackTrace.push(arguments.callee.functionName);try{var f=arguments.callee.__original__.apply(this,arguments)}catch(e){if(typeof(e)=="string"){e=new Exception(e)}throw e}finally{gjsf.myStackTrace.pop()}return f};a.functionName=b;a.__original__=d;return a};gjsf.triggerOnLoad=function(){if(typeof(gjsf.onload)=="function"){gjsf.onload()}else{if(typeof(gjsf.kojaMain)=="function"){kojaMain()}else{setTimeout(function(){gjsf.triggerOnLoad()},100)}}};gjsf.onlateload=function(){};gjsf.onclassload=function(a){};gjsf.onerror=function(a){throw (a+" - "+this.src)};try{if(window.attachEvent){window.attachEvent("onload",gjsf.initStrap)}else{window.addEventListener("load",gjsf.initStrap,false)}}catch(ex){if(typeof(window.onload)!="undefined"){var tmpOnLoad=window.onload;window.onload=function(){gjsf.initStrap();window.onload=tmpOnLoad;tmpOnLoad=null;try{window.onload()}catch(a){}}}else{window.onload=function(){gjsf.initStrap()}}};