
// API v2 adaptation in progress

var gLineColor	="#ff0000";
var gLineWeight	=3;
var gLineOpacity=0.5;
var minIEzoom	=13;
var maxIEpoints	=400;
var maxAutoZoom	=14;



function googleMap(id,markers,zoom)
{
	if (!GBrowserIsCompatible())
	{
		alert("Google says that your browser isn't compatible with Google Maps.");
		return null;
	}

//	alert(navigator.userAgent);

	var clientPC	=navigator.userAgent.toLowerCase(); // Get client info
//	var clientVer	=parseInt(navigator.appVersion); // Get browser version

	var is_ie		=((clientPC.indexOf("msie")!=-1) && (clientPC.indexOf("opera")==-1));

//	alert(clientPC+"\nis_ie="+(is_ie ? "true" : "false"));
/*
	var is_nav		=((clientPC.indexOf('mozilla')!=-1) && (clientPC.indexOf('spoofer')==-1)
					&& (clientPC.indexOf('compatible') == -1) && (clientPC.indexOf('opera')==-1)
					&& (clientPC.indexOf('webtv')==-1) && (clientPC.indexOf('hotjava')==-1));

	var is_win		=((clientPC.indexOf("win")!=-1) || (clientPC.indexOf("16bit") != -1));
*/
	var is_mac		=(clientPC.indexOf("mac")!=-1);

	var dumbItDown=is_ie || is_mac;

//	alert('line 13');

	var map=new GMap2(document.getElementById(id));

//	alert('line 17');
/*
	var mapSpecs=[];
//	createMapSpecs();
//	_TERRA_TOPO_MAP_TYPE=new _TerraMapSpec(_TOPO,'http://terraserver-usa.com/tile.ashx?t=2','Topo');
//	_TERRA_SAT_MAP_TYPE =new _TerraMapSpec(_TOPO,'http://terraserver-usa.com/tile.ashx?t=1','USGS Aerial');

	mapSpecs.push(G_SATELLITE_MAP);
	mapSpecs.push(G_NORMAL_MAP);
	mapSpecs.push(G_HYBRID_MAP);
//	mapSpecs.push(_TERRA_TOPO_MAP_TYPE);
//	mapSpecs.push(_TERRA_SAT_MAP_TYPE);

	var map=new GMap2(document.getElementById(id),mapSpecs);
*/

	// Map type: map, satellite, hybrid
	// map.setMapType(map.getMapTypes()[0]);
/*
	map.setMapType(G_SATELLITE_MAP);				// G_NORMAL_MAP G_SATELLITE_MAP G_HYBRID_MAP
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());

	alert('line 40');
*/

	map.addControl(new GLargeMapControl());
//	map.addControl(new GSmallMapControl());
//	map.addControl(new GSmallZoomControl());
	map.addControl(new GScaleControl());
	map.addControl(new GMapTypeControl());
	map.addControl(new GOverviewMapControl());

	// Version 2.0 does not allow setMapType to be called before the map location is initialized. If you are upgrading to GMap2, we recommend you use the new setCenter method in GMap2 to initialize the center, zoom level, and map type in a single method call.

	map.setCenter(new GLatLng(49.933026,-97.08115),3,G_SATELLITE_MAP);
//	map.setMapType(G_SATELLITE_MAP);
	map.enableContinuousZoom();

//	var mgr=new GMarkerManager(map);

/*
	GMarkerManagerOptions

	maxZoom: specifies the maximum zoom level monitored by this marker manager. The default value is the highest zoom level supported by Google maps.

	borderPadding: specifies the extra padding, in pixels, monitored by the manager outside the current viewport. This allows for markers just out of sight to be displayed on the map, improving panning over small ranges. The default value is 100.

	trackMarkers: specifies whether movement of movements of markers should be tracked by the marker manager. If you wish to have managed markers that change their positions through the setPoint() method, set this value to true. By default, this flag is set to false. Note that if you move markers with this value set to false, they will appear in both the original location and the new location(s).

	var mgrOptions={ borderPadding:50, maxZoom:15, trackMarkers:true };
	var mgr=new GMarkerManager(map,mgrOptions);
*/

/*
	//  click map => create a new marker at that point,  click marker => remove it from the map
	GEvent.addListener(	map,
						'click',
						function(overlay,point)
						{
							if (overlay)
								map.removeOverlay(overlay);
							else
							if (point)
								map.addOverlay(new GMarker(point));
						});

	GEvent.addListener(	map,
						'zoom',
						function(oldZoomLevel,newZoomLevel)
						{
							document.getElementById("zoom").value=newZoomLevel;	// Display current zoom level
						});
*/

/*
	GEvent.clearListeners(map,'click');
	GEvent.clearListeners(map,'dblclick');

	GEvent.addListener(	map,
						'click',
						function(overlay,point)
						{
							if (!overlay)
							{
								//alert("click location: "+(point.x)+" , "+point.y);

								map.centerAtLatLng(point);

								var loc=document.getElementById("location");

								if (loc)
									if (loc.innerHTML)
										loc.innerHTML=point.y+", "+point.x;
									else
										loc.value=point.y+", "+point.x;
							}
						});

	GEvent.addListener(	map,
						'moveend',
						function()
						{
							if (loc=document.getElementById("location"))
							{
								var center=map.getCenterLatLng();

								if (loc.innerHTML)
									loc.innerHTML=center.y+", "+center.x;
								else if (loc.value)
									loc.value=center.y+", "+center.x;

								//document.getElementById("centerlatitude").value=map.getCenterLatLng().y;
								//document.getElementById("centerlongitude").value=map.getCenterLatLng().x;
							}
						}
					);
*/
//	alert('line 106');

	var minLat=parseFloat("999.9"),
		minLon=minLat,
		maxLat=parseFloat("-999.9"),
		maxLon=maxLat,
		totalPoints=0;

//	if (is_ie)
//		alert(clientPC+"\nis_ie="+(is_ie ? "true" : "false"));

	for (var i=0, points=[]; i<markers.length; ++i)
	{
		if (markers[i].length==3 && !isNumeric(markers[i][0]))	// ["name",["color",width,opacity],[[lat,lon],...]]
		{
			var originalPoints=(markers[i][2].length);

			if (dumbItDown)
			{
				var fewer=[	parseFloat(markers[i][2][0][0]),
							parseFloat(markers[i][2][0][1]) ];

				for (var j=1,
						 step=Math.max(1,Math.ceil(markers[i][2].length/maxIEpoints));
					 j<markers[i][2].length-1;
					 j+=step)
				{
					for (var k=j, num=0, sumLat=0, sumLon=0; k<j+step; ++k)
						if (k<markers[i][2].length-1)
						{
							++num;
							sumLat+=parseFloat(markers[i][2][k][0]);
							sumLon+=parseFloat(markers[i][2][k][1]);
						}

					if (num)
						fewer[fewer.length]=[sumLat/num,sumLon/num];
				}

				fewer[fewer.length]=[parseFloat(markers[i][2][markers[i][2].length-1][0]),
									 parseFloat(markers[i][2][markers[i][2].length-1][1]) ];

				markers[i][2]=fewer;
			}

			for (var j=0,
					 pointList=[];
				 j<markers[i][2].length;
				 ++j)
			{
				var lat=parseFloat(markers[i][2][j][0]);
				var lon=parseFloat(markers[i][2][j][1]);

				if (lat<minLat) minLat=lat;
				if (lon<minLon) minLon=lon;
				if (lat>maxLat) maxLat=lat;
				if (lon>maxLon) maxLon=lon;
				++totalPoints;

				pointList[j]=new GLatLng(lat,lon);
			}

			if (dumbItDown && totalPoints!=originalPoints)
			{
				if (is_ie)
					msg="Since you've chosen to let MicroSlop make you its bitch and force you to use Internet Explorer, this track has been optimized to "+totalPoints+" points (1/"+step+") from the original "+originalPoints+" so that IE's pathetic Javascript implementation can handle it.  Use Firefox, damnit!!  <a href=\"http://mozilla.com/\" target=\"_new\">http://mozilla.com/</a>";
				else
				if (is_mac)
					msg="This track has been optimized to "+totalPoints+" points (1/"+step+") from the original "+originalPoints+" so that your Mac can handle it";
				else
					msg="This track has been optimized to "+totalPoints+" points (1/"+step+") from the original "+originalPoints;

				var update=document.createElement("div");
				update.innerHTML=msg;
				document.getElementById(id).parentNode.insertBefore(update,document.getElementById(id).parentNode.firstChild);
			}

//			pointList[markers[i][2].length  ]=new GPoint(minLon,maxLat);
//			pointList[markers[i][2].length+1]=new GPoint(minLon,minLat);
//			pointList[markers[i][2].length+2]=new GPoint(maxLon,minLat);
//			pointList[markers[i][2].length+3]=new GPoint(maxLon,maxLat);

//			alert("line of "+totalPoints+" points");

			var color	=markers[i][1].length>=1 ? markers[i][1][0] : "#ff0000ff";
			var weight	=markers[i][1].length>=2 ? markers[i][1][1] : 3;
			var opacity	=markers[i][1].length>=3 ? markers[i][1][2] : 1;

			var ol=new GPolyline(pointList,color,weight,opacity);
//			alert("GPolyline created");
//			var ol=new GPolyline(pointList);
			map.addOverlay(ol);
//			alert("overlay added");

//			map.addOverlay(new GMarkerBubble(pointList[0],"first",""));
//			map.addOverlay(new GMarkerBubble(pointList[totalPoints-1],"last",""));
		}
		else
		if (markers[i].length<4 || (markers[i].length==4 && !isNumeric(markers[i][2])))
		{
//			if (is_ie)
//				alert("point");

			var lat=parseFloat(markers[i][0]);
			var lon=parseFloat(markers[i][1]);

			if (lat<minLat) minLat=lat;
			if (lon<minLon) minLon=lon;
			if (lat>maxLat) maxLat=lat;
			if (lon>maxLon) maxLon=lon;

			++totalPoints;

			var name=(markers[i].length>=3 ? markers[i][2] : "");
			var desc=(markers[i].length>=4 ? markers[i][3] : "");

			var point=new GLatLng(lat,lon);

			var marker=(name=="" && desc=="")
						? new GMarker(point)
						: GMarkerBubble(point,name,desc);

//			map.addOverlay(marker);
			points[points.length]=marker;
//			mgr.addMarker(marker,0);
		}
		else
		{
//			if (is_ie)
//				alert("Polyline with "+(markers[i].length/2)+" points");

			var originalPoints=(markers[i].length/2);

			if (dumbItDown)
			{
				var fewer=[];

				fewer[fewer.length]=parseFloat(markers[i][j]);
				fewer[fewer.length]=parseFloat(markers[i][j+1]);

				for (var j=1,
						 step=(dumbItDown
							   ? Math.max(1,Math.ceil(markers[i].length/2/maxIEpoints))
							   : 1)*2;
					 j<markers[i].length-1;
					 j+=step)
				{
					for (var k=i, num=0, sumLat=0, sumLon; k<i+step; ++k)
						if (k+1<markers[i].length-2)
						{
							++num;
							sumLat+=parseFloat(markers[i][k]);
							sumLon+=parseFloat(markers[i][k+1]);
						}

					if (num)
					{
						fewer[fewer.length]=sumLat/num;
						fewer[fewer.length]=sumLon/num;
					}
				}

				fewer[fewer.length]=parseFloat(markers[i][markers[i].length-2]);
				fewer[fewer.length]=parseFloat(markers[i][markers[i].length-1]);

				markers[i]=fewer;
			}

			for (var j=0,
					 pointList=[];
				 j<markers[i].length;
				 j+=2)
			{
				var lat=parseFloat(markers[i][j]);
				var lon=parseFloat(markers[i][j+1]);

				if (lat<minLat) minLat=lat;
				if (lon<minLon) minLon=lon;
				if (lat>maxLat) maxLat=lat;
				if (lon>maxLon) maxLon=lon;
				++totalPoints;

				pointList[j/2]=new GLatLng(lat,lon);
			}

			if (dumbItDown && totalPoints!=originalPoints)
			{
				if (is_ie)
					msg="Since you've chosen to let MicroSlop make you its bitch and force you to use Internet Explorer, this polyline has been optimized to "+totalPoints+" points (1/"+step+") from the original "+originalPoints+" so that IE's pathetic Javascript implementation can handle it.  Use Firefox, damnit!!  <a href=\"http://mozilla.com/\" target=\"_new\">http://mozilla.com/</a>";
				else
				if (is_mac)
					msg="This polyline has been optimized to "+totalPoints+" points (1/"+step+") from the original "+originalPoints+" so that your Mac can handle it";
				else
					msg="This polyline has been optimized to "+totalPoints+" points (1/"+step+") from the original "+originalPoints;

				var update=document.createElement("div");
				update.innerHTML=msg;
				document.getElementById(id).parentNode.insertBefore(update,document.getElementById(id).parentNode.firstChild);
			}

			map.addOverlay(new GPolyline(pointList,gLineColor,gLineWeight,gLineOpacity));
		}
	}

//	alert("all items processed");

	if (totalPoints>0 && maxLat>-999 && minLat<999 && maxLon>-999 && minLon<999)
	{
//		alert("calculating center and zoom");

		var cLat	=(minLat+maxLat)/2;
		var cLon	=(minLon+maxLon)/2;
		var center	=new GLatLng(cLat,cLon);

//		alert("center = "+cLat+", "+cLon);
		map.setCenter(center);

		var sw		=new GLatLng(minLat,minLon);
		var ne		=new GLatLng(maxLat,maxLon);
//		var zoom	=Math.max(13,map.getBoundsZoomLevel(new GLatLngBounds(sw,ne)));
		var zoom	=map.getBoundsZoomLevel(new GLatLngBounds(sw,ne));

//		alert("You are "+(is_ie ? "" : "not ")+"using Internet Explorer.");

/*
		if (is_ie)
		{
			if (zoom<minIEzoom)
			{
				alert("You're using Internet Explorer, so you'll have to zoom out "+(minIEzoom-zoom)+" steps manually, to see the whole thing.  Use Firefox!");
				zoom=minIEzoom;
			}
		}
		else
*/
			zoom=Math.min(maxAutoZoom,zoom);

//		var zoom	=13;	// 12=no, 13=yes

//		alert("zoom = "+zoom);

//		map.setCenter(center,zoom);				// takes forever in IE7

//		alert("zoom = "+zoom);
		map.setZoom(zoom);

//		alert("map set to: center = "+cLat+", "+cLon+"; zoom = "+zoom);
	}

//	alert(points.length+" points");

//	alert("starting GMarkerManager");

	var mgr=new GMarkerManager(map);

	if (points.length>0)
		mgr.addMarkers(points,0);

	mgr.refresh();

//	alert("map finished");

	return map;
}



function googleMapCenter(map,point,zoom)
{
	if (CenterMarker!=null)
		map.removeOverlay(CenterMarker);

	var p=new GLatLng(point.y,point.x);
	map.addOverlay(CenterMarker=new GMarker(p,cIcon));
/*
	if (zoom==0)
		map.centerAtLatLng(p);
	else
		map.centerAndZoom(p,Math.max(0,map.getZoomLevel()+zoom));
//		map.zoomTo(Math.max(1,map.getZoomLevel()+zoom));
*/
	map.setCenter(p);

//	map.getZoomAsync( function(zoom) { map.setZoom(zoom+1); } );
	map.setZoom(zoom<=0 ? map.getZoom()+1 : zoom);

	var loc=document.getElementById("location");

	if (loc)
		if (loc.innerHTML)
			loc.innerHTML=point.y+", "+point.x;
		else
			loc.value=point.y+", "+point.x;
}

/* events:
	"blur",
	"click",
	"dblclick",
	"drag",
	"dragend",
	"dragstart",
	"mousedown",
	"mouseout",
	"mouseup",
	"moveend",
*/

function googleMapTrackCenter(map)
{
	CenterMarker=null;

	cIcon					=new GIcon();
	cIcon.image				="http://OzReport.com/images/marker-yellow.png";
	cIcon.shadow			="http://www.google.com/mapfiles/shadow50.png";
	cIcon.iconSize			=new GSize(20,34);
	cIcon.shadowSize		=new GSize(37,34);
	cIcon.iconAnchor		=new GLatLng(34,9);
	cIcon.infoWindowAnchor	=new GLatLng(2,9);
	cIcon.infoShadowAnchor	=new GLatLng(25,18);

	GEvent.clearListeners(map,'click');
	GEvent.clearListeners(map,'dblclick');
	GEvent.clearListeners(map,'moveend');

	GEvent.addListener(	map,
						'click',
						function(overlay,point)
						{
							if (!overlay)
								googleMapCenter(map,point,-2);
						});
/*
	GEvent.addListener(	map,
						'dblclick',
						function(overlay,point)
						{
							if (!overlay)
								googleMapCenter(map,point,-2);
						});
*/
}



function GMarkerBubble(point,name,desc)
{
	var marker=new GMarker(point);
	return markerAddPopup(marker,name,desc);
}



function GMarkerNumberedBubble(point,number,name,desc)
{
	var	icon				=new GIcon();

	icon.image				="http://OzReport.com/images/marker-yellow"
							+((number>=0 && number<=9) ? -number : "")+".png";
	icon.shadow				="http://www.google.com/mapfiles/shadow50.png";
	icon.iconSize			=new GSize(20,34);
	icon.shadowSize			=new GSize(37,34);
	icon.iconAnchor			=new GLatLng(34,9);
	icon.infoWindowAnchor	=new GLatLng(2,9);
	icon.infoShadowAnchor	=new GLatLng(25,18);

	var marker=new GMarker(point,icon);
	return markerAddPopup(marker,name,desc);
}



function markerAddPopup(marker,name,desc)
{
	if (name!="" || desc!="")
	{
		var html="";

		if (name!="")
			html+='<b class="name">'+name+"</b>";

		if (desc!="")
		{
			if (html!="")
				html+="<br />";

			html+='<span class="desc">'+desc+'</span>';
		}

		GEvent.addListener(	marker,
							"click",
							function()
							{
								marker.openInfoWindowHtml('<div class="info">'+html+'</div>');	// ,{maxWidth:px}
							}
						);
	}

	return marker;
}



function isNumeric(s)
{
//	var c=s.toString().substr(0,1);
//	return c=='-' || c=='+' || (c>='0' && c<='9') || c=='.';

	for (var i=0, ss=s.toString(); i<ss.length; ++i)
	{
		var c=ss.substr(i,1);

		if (!(c=='-' || c=='+' || (c>='0' && c<='9') || c=='.'))
			return false;
	}

	return true;
}



// see: http://www.google.com/apis/maps/documentation/#Using_XML_and_Asynchronous_RPC_A
// Download the data in data.xml and load it on the map. The format we expect is:
// <markers>
//   <marker lat="37.441" lng="-122.141"/>
//   <marker lat="37.322" lng="-121.213"/>
// </markers>

function googleMapXML(id,file,zoom)
{
	if (!GBrowserIsCompatible())
	{
		alert("Google says that your browser isn't compatible with Google Maps.");
		return;
	}

	var map=new GMap2(document.getElementById(id));
	map.setMapType(G_SATELLITE_TYPE);				//(G_HYBRID_TYPE);
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());

	var request=GXmlHttp.create();
	request.open("GET",file,true);

	request.onreadystatechange=function()
	{
		if (request.readyState==4)
		{
			var minLat=parseFloat("999.9");
			var minLon=minLat;
			var maxLat=parseFloat("-999.9");
			var maxLon=maxLat;

			var xmlDoc=request.responseXML;
			var markers=xmlDoc.documentElement.getElementsByTagName("marker");

			for (var i=0; i<markers.length; i++)
			{
				var lat=parseFloat(markers[i].getAttribute("lat"));
				var lng=parseFloat(markers[i].getAttribute("lng"));

				if (lat<minLat) minLat=lat;
				if (lon<minLon) minLon=lon;
				if (lat>maxLat) maxLat=lat;
				if (lon>maxLon) maxLon=lon;

				var point=new GLatLng(lat,lng);

				var marker=new GMarker(point);
				map.addOverlay(marker);
			}

			map.centerAndZoom(new GLatLng((maxLat+minLat)/2.0,(maxLon+minLon)/2.0),zoom);
		}
	}

	request.send(null);
}



function googleMapKML(id,file,zoom)
{
	if (!GBrowserIsCompatible())
	{
		alert("Google says that your browser isn't compatible with Google Maps.");
		return;
	}

	var map=new GMap2(document.getElementById(id));
	map.setMapType(G_SATELLITE_TYPE);				//(G_HYBRID_TYPE);
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());

	var request=GXmlHttp.create();
	request.open("GET",file,true);

	request.onreadystatechange=function()
	{
		if (request.readyState==4)
		{
			var minLat=parseFloat("999.9");
			var minLon=minLat;
			var maxLat=parseFloat("-999.9");
			var maxLon=maxLat;

			var xmlDoc=request.responseXML;
			var placemarks=xmlDoc.documentElement.getElementsByTagName("Placemark");

			for (var mx=0; mx<placemarks.length; ++mx)
			{
				var placemark=placemarks[mx];
				var name='';
				var desc='';

				var z=placemark.getElementsByTagName("name");
				if (z.length>0)
					name=z[0].textContent;

				z=placemark.getElementsByTagName("description");
				if (z.length>0)
					desc=z[0].textContent;

				var points=placemark.getElementsByTagName("Point");

				for (var px=0; px<points.length; ++px)
				{
					var point=points[px];
					var coordinates=point.getElementsByTagName("coordinates");

					for (var cx=0; cx<coordinates.length; ++cx)
					{
						var coords=coordinates[cx].textContent.split("\n");

						for (var ax=0; ax<coords.length; ++ax)
						{
							var coord=coords[ax].split(",");

							if (coord.length>=2)
							{
								var lat=parseFloat(coord[1]);
								var lon=parseFloat(coord[0]);

								if (lat<minLat) minLat=lat;
								if (lon<minLon) minLon=lon;
								if (lat>maxLat) maxLat=lat;
								if (lon>maxLon) maxLon=lon;

								var p=new GLatLng(lat,lon);
								var marker=GMarkerBubble(p,name,desc)

								map.addOverlay(marker);
							}
						}
					}
				}


				var linestrings=placemark.getElementsByTagName("LineString");

				for (var px=0; px<linestrings.length; px++)
				{
					var linestring=linestrings[px];
					var coordinates=linestring.getElementsByTagName("coordinates");

					for (var cx=0; cx<coordinates.length; cx++)
					{
						var coords=coordinates[cx].textContent.split("\n");
						var points=[];
						var pn=0;

						for (var ax=0; ax<coords.length; ax++)
						{
							var coord=coords[ax].split(",");

							if (coord.length>=2)
							{
								var lat=parseFloat(coord[1]);
								var lon=parseFloat(coord[0]);

								if (lat<minLat) minLat=lat;
								if (lon<minLon) minLon=lon;
								if (lat>maxLat) maxLat=lat;
								if (lon>maxLon) maxLon=lon;

								points[pn++]=new GLatLng(lat,lon);
							}
						}

						var line=new GPolyline(points,gLineColor,gLineWeight,gLineOpacity);
						map.addOverlay(line);
					}
				}
			}

			map.centerAndZoom(new GLatLng((maxLat+minLat)/2.0,(maxLon+minLon)/2.0),zoom);
		}
	}

	request.send(null);
}



function googleMapFit(map,minLat,minLon,maxLat,maxLon)
{
	var cLat	=(minLat+maxLat)/2,
		cLon	=(minLon+maxLon)/2,
		center	=new GLatLng(cLat,cLon);

	map.setCenter(center);

	var sw		=new GLatLng(minLat,minLon),
		ne		=new GLatLng(maxLat,maxLon),
		bounds	=new GLatLngBounds(sw,ne),					// GLatLngBounds(sw?:GLatLng,ne?:GLatLng)
		mapSize	=map.getSize(),								// -> GSize
		scale	=1.0,
		fitW	=Math.round(scale*mapSize.width),
		fitH	=Math.round(scale*mapSize.height),
		fitSize	=new GSize(fitW,fitH),						// GSize(width:Number,height:Number)
		zoom	=map.getBoundsZoomLevel(bounds,fitSize),	// getBoundsZoomLevel(bounds:GLatLngBounds,viewSize:GSize)
		zoomTo	=Math.min(maxAutoZoom,zoom-1);

	map.setZoom(zoomTo);

//	alert("("+minLat+","+minLon+")-("+maxLat+","+maxLon+")\ncenter: "+cLat+","+cLon+"\nsw="+sw+", ne="+ne+"\nbounds: "+bounds+"\nmapSize: "+mapSize+"\nfitSize: "+fitSize+"\nzoom: "+zoom+"\nzoomTo: "+zoomTo);
}

