if(!this.JSON){
JSON=function(){
function f(n){
return n<10?'0'+n:n;}
Date.prototype.toJSON=function(key){
return this.getUTCFullYear()+'-'+
f(this.getUTCMonth()+1)+'-'+
f(this.getUTCDate())+'T'+
f(this.getUTCHours())+':'+
f(this.getUTCMinutes())+':'+
f(this.getUTCSeconds())+'Z';};
var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
escapeable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
gap,
indent,
meta={
'\b':'\\b',
'\t':'\\t',
'\n':'\\n',
'\f':'\\f',
'\r':'\\r',
'"':'\\"',
'\\':'\\\\'},
rep;
function quote(string){
escapeable.lastIndex=0;
return escapeable.test(string)?
'"'+string.replace(escapeable,function(a){
var c=meta[a];
if(typeof c==='string'){
return c;}
return '\\u'+('0000'+(+(a.charCodeAt(0))).toString(16)).slice(-4);})+'"':
'"'+string+'"';}
function str(key,holder){
var i,
k,
v,
length,
mind=gap,
partial,
value=holder[key];
if(value&&typeof value==='object'&&
typeof value.toJSON==='function'){
value=value.toJSON(key);}
if(typeof rep==='function'){
value=rep.call(holder,key,value);}
switch(typeof value){
case 'string':
return quote(value);
case 'number':
return isFinite(value)?String(value):'null';
case 'boolean':
case 'null':
return String(value);
case 'object':
if(!value){
return 'null';}
gap+=indent;
partial=[];
if(typeof value.length==='number'&&!(value.propertyIsEnumerable('length'))){
length=value.length;
for(i=0;i<length;i+=1){
partial[i]=str(i,value)||'null';}
v=partial.length===0?'[]':
gap?'[\n'+gap+
partial.join(',\n'+gap)+'\n'+
mind+']':
'['+partial.join(',')+']';
gap=mind;
return v;}
if(rep&&typeof rep==='object'){
length=rep.length;
for(i=0;i<length;i+=1){
k=rep[i];
if(typeof k==='string'){
v=str(k,value,rep);
if(v){
partial.push(quote(k)+(gap?': ':':')+v);}}}}else{
for(k in value){
if(Object.hasOwnProperty.call(value,k)){
v=str(k,value,rep);
if(v){
partial.push(quote(k)+(gap?': ':':')+v);}}}}
v=partial.length===0?'{}':
gap?'{\n'+gap+
partial.join(',\n'+gap)+'\n'+
mind+'}':
'{'+partial.join(',')+'}';
gap=mind;
return v;}}
return{
stringify:function(value,replacer,space){
var i;
gap='';
indent='';
if(space){
if(typeof space==='number'){
for(i=0;i<space;i+=1){
indent+=' ';}}else if(typeof space==='string'){
indent=space;}}
rep=replacer;
if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||
typeof replacer.length!=='number')){
throw new Error('JSON.stringify');}
return str('',{'':value});},
parse:function(text,reviver){
var j;
function walk(holder,key){
var k,v,value=holder[key];
if(value&&typeof value==='object'){
for(k in value){
if(Object.hasOwnProperty.call(value,k)){
v=walk(value,k);
if(v!==undefined){
value[k]=v;}else{
delete value[k];}}}}
return reviver.call(holder,key,value);}
cx.lastIndex=0;
if(cx.test(text)){
text=text.replace(cx,function(a){
return '\\u'+('0000'+(+(a.charCodeAt(0))).toString(16)).slice(-4);});}
if(/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/bfnrtu]/g,'@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').
replace(/(?:^|:|,)(?:\s*\[)+/g,''))){
j=eval('('+text+')');
return typeof reviver==='function'?
walk({'':j},''):j;}
throw new SyntaxError('JSON.parse');}};}();}

