diff options
author | Charles Krinke | 2009-02-22 20:52:55 +0000 |
---|---|---|
committer | Charles Krinke | 2009-02-22 20:52:55 +0000 |
commit | 8f55b9d735fbc975ce7a4b54e972c17ffbfb1f49 (patch) | |
tree | 96a24a49de82056060dd9b7bab0cb209d5f1a129 /OpenSim/Region/Communications/Hypergrid/HGGridServices.cs | |
parent | Allow delivery of object messages gridwide (diff) | |
download | opensim-SC-8f55b9d735fbc975ce7a4b54e972c17ffbfb1f49.zip opensim-SC-8f55b9d735fbc975ce7a4b54e972c17ffbfb1f49.tar.gz opensim-SC-8f55b9d735fbc975ce7a4b54e972c17ffbfb1f49.tar.bz2 opensim-SC-8f55b9d735fbc975ce7a4b54e972c17ffbfb1f49.tar.xz |
Mantis#3218. Thank you kindly, TLaukkan (Tommil) for a patch that:
* Added log4net dependency to physxplugin in prebuild.xml.
* Added missing m_log fields to classes.
* Replaced Console.WriteLine with appropriate m_log.Xxxx
* Tested that nant test target runs succesfully.
* Tested that local opensim sandbox starts up without errors.
Diffstat (limited to 'OpenSim/Region/Communications/Hypergrid/HGGridServices.cs')
-rw-r--r-- | OpenSim/Region/Communications/Hypergrid/HGGridServices.cs | 98 |
1 files changed, 49 insertions, 49 deletions
diff --git a/OpenSim/Region/Communications/Hypergrid/HGGridServices.cs b/OpenSim/Region/Communications/Hypergrid/HGGridServices.cs index 08d74f3..4493591 100644 --- a/OpenSim/Region/Communications/Hypergrid/HGGridServices.cs +++ b/OpenSim/Region/Communications/Hypergrid/HGGridServices.cs | |||
@@ -193,7 +193,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
193 | { | 193 | { |
194 | if (reg.RegionLocX != x || reg.RegionLocY != y) | 194 | if (reg.RegionLocX != x || reg.RegionLocY != y) |
195 | { | 195 | { |
196 | //Console.WriteLine("CommsManager- RequestNeighbours() - found a different region in list, checking location"); | 196 | //m_log.Debug("CommsManager- RequestNeighbours() - found a different region in list, checking location"); |
197 | if ((reg.RegionLocX > (x - 2)) && (reg.RegionLocX < (x + 2))) | 197 | if ((reg.RegionLocX > (x - 2)) && (reg.RegionLocX < (x + 2))) |
198 | { | 198 | { |
199 | if ((reg.RegionLocY > (y - 2)) && (reg.RegionLocY < (y + 2))) | 199 | if ((reg.RegionLocY > (y - 2)) && (reg.RegionLocY < (y + 2))) |
@@ -239,10 +239,10 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
239 | /// <returns></returns> | 239 | /// <returns></returns> |
240 | public virtual RegionInfo RequestNeighbourInfo(ulong regionHandle) | 240 | public virtual RegionInfo RequestNeighbourInfo(ulong regionHandle) |
241 | { | 241 | { |
242 | //Console.WriteLine(" >> RequestNeighbourInfo for " + regionHandle); | 242 | //m_log.Debug(" >> RequestNeighbourInfo for " + regionHandle); |
243 | foreach (RegionInfo info in m_hyperlinkRegions) | 243 | foreach (RegionInfo info in m_hyperlinkRegions) |
244 | { | 244 | { |
245 | //Console.WriteLine(" .. " + info.RegionHandle); | 245 | //m_log.Debug(" .. " + info.RegionHandle); |
246 | if (info.RegionHandle == regionHandle) return info; | 246 | if (info.RegionHandle == regionHandle) return info; |
247 | } | 247 | } |
248 | 248 | ||
@@ -250,7 +250,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
250 | { | 250 | { |
251 | if (info.RegionHandle == regionHandle) | 251 | if (info.RegionHandle == regionHandle) |
252 | { | 252 | { |
253 | //Console.WriteLine("XXX------ known region " + info.RegionHandle); | 253 | //m_log.Debug("XXX------ known region " + info.RegionHandle); |
254 | return info; | 254 | return info; |
255 | } | 255 | } |
256 | } | 256 | } |
@@ -291,7 +291,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
291 | map.Y = (ushort)regInfo.RegionLocY; | 291 | map.Y = (ushort)regInfo.RegionLocY; |
292 | map.WaterHeight = (byte)regInfo.RegionSettings.WaterHeight; | 292 | map.WaterHeight = (byte)regInfo.RegionSettings.WaterHeight; |
293 | map.MapImageId = regInfo.RegionSettings.TerrainImageID; | 293 | map.MapImageId = regInfo.RegionSettings.TerrainImageID; |
294 | // Console.WriteLine("ImgID: " + map.MapImageId); | 294 | // m_log.Debug("ImgID: " + map.MapImageId); |
295 | map.Agents = 1; | 295 | map.Agents = 1; |
296 | map.RegionFlags = 72458694; | 296 | map.RegionFlags = 72458694; |
297 | map.Access = 13; | 297 | map.Access = 13; |
@@ -312,10 +312,10 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
312 | 312 | ||
313 | WebClient c = new WebClient(); | 313 | WebClient c = new WebClient(); |
314 | string uri = "http://" + info.ExternalHostName + ":" + info.HttpPort + "/index.php?method=" + regionimage; | 314 | string uri = "http://" + info.ExternalHostName + ":" + info.HttpPort + "/index.php?method=" + regionimage; |
315 | //Console.WriteLine("JPEG: " + uri); | 315 | //m_log.Debug("JPEG: " + uri); |
316 | c.DownloadFile(uri, info.RegionID.ToString() + ".jpg"); | 316 | c.DownloadFile(uri, info.RegionID.ToString() + ".jpg"); |
317 | Bitmap m = new Bitmap(info.RegionID.ToString() + ".jpg"); | 317 | Bitmap m = new Bitmap(info.RegionID.ToString() + ".jpg"); |
318 | //Console.WriteLine("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width); | 318 | //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width); |
319 | byte[] imageData = OpenJPEG.EncodeFromImage(m, true); | 319 | byte[] imageData = OpenJPEG.EncodeFromImage(m, true); |
320 | AssetBase ass = new AssetBase(UUID.Random(), "region " + info.RegionID.ToString()); | 320 | AssetBase ass = new AssetBase(UUID.Random(), "region " + info.RegionID.ToString()); |
321 | info.RegionSettings.TerrainImageID = ass.FullID; | 321 | info.RegionSettings.TerrainImageID = ass.FullID; |
@@ -327,7 +327,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
327 | } | 327 | } |
328 | catch // LEGIT: Catching problems caused by OpenJPEG p/invoke | 328 | catch // LEGIT: Catching problems caused by OpenJPEG p/invoke |
329 | { | 329 | { |
330 | Console.WriteLine("[HGrid]: Failed getting/storing map image, because it is probably already in the cache"); | 330 | m_log.Warn("[HGrid]: Failed getting/storing map image, because it is probably already in the cache"); |
331 | } | 331 | } |
332 | } | 332 | } |
333 | 333 | ||
@@ -435,7 +435,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
435 | { | 435 | { |
436 | hash = (Hashtable)response.Value; | 436 | hash = (Hashtable)response.Value; |
437 | //foreach (Object o in hash) | 437 | //foreach (Object o in hash) |
438 | // Console.WriteLine(">> " + ((DictionaryEntry)o).Key + ":" + ((DictionaryEntry)o).Value); | 438 | // m_log.Debug(">> " + ((DictionaryEntry)o).Key + ":" + ((DictionaryEntry)o).Value); |
439 | try | 439 | try |
440 | { | 440 | { |
441 | UUID.TryParse((string)hash["uuid"], out uuid); | 441 | UUID.TryParse((string)hash["uuid"], out uuid); |
@@ -443,7 +443,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
443 | if ((string)hash["handle"] != null) | 443 | if ((string)hash["handle"] != null) |
444 | { | 444 | { |
445 | info.regionSecret = (string)hash["handle"]; | 445 | info.regionSecret = (string)hash["handle"]; |
446 | //Console.WriteLine(">> HERE: " + info.regionSecret); | 446 | //m_log.Debug(">> HERE: " + info.regionSecret); |
447 | } | 447 | } |
448 | if (hash["region_image"] != null) | 448 | if (hash["region_image"] != null) |
449 | { | 449 | { |
@@ -454,18 +454,18 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
454 | if (hash["region_name"] != null) | 454 | if (hash["region_name"] != null) |
455 | { | 455 | { |
456 | info.RegionName = (string)hash["region_name"]; | 456 | info.RegionName = (string)hash["region_name"]; |
457 | //Console.WriteLine(">> " + info.RegionName); | 457 | //m_log.Debug(">> " + info.RegionName); |
458 | } | 458 | } |
459 | if (hash["internal_port"] != null) | 459 | if (hash["internal_port"] != null) |
460 | { | 460 | { |
461 | int port = Convert.ToInt32((string)hash["internal_port"]); | 461 | int port = Convert.ToInt32((string)hash["internal_port"]); |
462 | info.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), port); | 462 | info.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), port); |
463 | //Console.WriteLine(">> " + info.InternalEndPoint.ToString()); | 463 | //m_log.Debug(">> " + info.InternalEndPoint.ToString()); |
464 | } | 464 | } |
465 | if (hash["remoting_port"] != null) | 465 | if (hash["remoting_port"] != null) |
466 | { | 466 | { |
467 | info.RemotingPort = Convert.ToUInt32(hash["remoting_port"]); | 467 | info.RemotingPort = Convert.ToUInt32(hash["remoting_port"]); |
468 | //Console.WriteLine(">> " + info.RemotingPort); | 468 | //m_log.Debug(">> " + info.RemotingPort); |
469 | } | 469 | } |
470 | 470 | ||
471 | } | 471 | } |
@@ -508,12 +508,12 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
508 | Hashtable hash = new Hashtable(); | 508 | Hashtable hash = new Hashtable(); |
509 | hash["uuid"] = regInfo.RegionID.ToString(); | 509 | hash["uuid"] = regInfo.RegionID.ToString(); |
510 | hash["handle"] = regInfo.RegionHandle.ToString(); | 510 | hash["handle"] = regInfo.RegionHandle.ToString(); |
511 | //Console.WriteLine(">> Here " + regInfo.RegionHandle); | 511 | //m_log.Debug(">> Here " + regInfo.RegionHandle); |
512 | hash["region_image"] = regInfo.RegionSettings.TerrainImageID.ToString(); | 512 | hash["region_image"] = regInfo.RegionSettings.TerrainImageID.ToString(); |
513 | hash["region_name"] = regInfo.RegionName; | 513 | hash["region_name"] = regInfo.RegionName; |
514 | hash["internal_port"] = regInfo.InternalEndPoint.Port.ToString(); | 514 | hash["internal_port"] = regInfo.InternalEndPoint.Port.ToString(); |
515 | hash["remoting_port"] = NetworkServersInfo.RemotingListenerPort.ToString(); | 515 | hash["remoting_port"] = NetworkServersInfo.RemotingListenerPort.ToString(); |
516 | //Console.WriteLine(">> Here: " + regInfo.InternalEndPoint.Port); | 516 | //m_log.Debug(">> Here: " + regInfo.InternalEndPoint.Port); |
517 | 517 | ||
518 | 518 | ||
519 | XmlRpcResponse response = new XmlRpcResponse(); | 519 | XmlRpcResponse response = new XmlRpcResponse(); |
@@ -553,9 +553,9 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
553 | if (u != null && u.UserProfile != null) | 553 | if (u != null && u.UserProfile != null) |
554 | { | 554 | { |
555 | loginParams["region_uuid"] = u.UserProfile.HomeRegionID.ToString(); // This seems to be always Zero | 555 | loginParams["region_uuid"] = u.UserProfile.HomeRegionID.ToString(); // This seems to be always Zero |
556 | //Console.WriteLine(" --------- Home Region UUID -------"); | 556 | //m_log.Debug(" --------- Home Region UUID -------"); |
557 | //Console.WriteLine(" >> " + loginParams["region_uuid"] + " <<"); | 557 | //m_log.Debug(" >> " + loginParams["region_uuid"] + " <<"); |
558 | //Console.WriteLine(" --------- ---------------- -------"); | 558 | //m_log.Debug(" --------- ---------------- -------"); |
559 | 559 | ||
560 | string serverURI = ""; | 560 | string serverURI = ""; |
561 | if (u.UserProfile is ForeignUserProfileData) | 561 | if (u.UserProfile is ForeignUserProfileData) |
@@ -577,7 +577,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
577 | if (!IsLocalUser(u)) | 577 | if (!IsLocalUser(u)) |
578 | { | 578 | { |
579 | loginParams["regionhandle"] = rinfo.regionSecret; // user.CurrentAgent.Handle.ToString(); | 579 | loginParams["regionhandle"] = rinfo.regionSecret; // user.CurrentAgent.Handle.ToString(); |
580 | //Console.WriteLine("XXX--- informregionofuser (foreign user) here handle: " + rinfo.regionSecret); | 580 | //m_log.Debug("XXX--- informregionofuser (foreign user) here handle: " + rinfo.regionSecret); |
581 | 581 | ||
582 | loginParams["home_address"] = ((ForeignUserProfileData)(u.UserProfile)).UserHomeAddress; | 582 | loginParams["home_address"] = ((ForeignUserProfileData)(u.UserProfile)).UserHomeAddress; |
583 | loginParams["home_port"] = ((ForeignUserProfileData)(u.UserProfile)).UserHomePort; | 583 | loginParams["home_port"] = ((ForeignUserProfileData)(u.UserProfile)).UserHomePort; |
@@ -585,7 +585,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
585 | } | 585 | } |
586 | else | 586 | else |
587 | { | 587 | { |
588 | //Console.WriteLine("XXX--- informregionofuser (local user) here handle: " + rinfo.regionSecret); | 588 | //m_log.Debug("XXX--- informregionofuser (local user) here handle: " + rinfo.regionSecret); |
589 | 589 | ||
590 | //// local user about to jump out, let's process the name | 590 | //// local user about to jump out, let's process the name |
591 | // On second thoughts, let's not do this for the *user*; let's only do it for the *agent* | 591 | // On second thoughts, let's not do this for the *user*; let's only do it for the *agent* |
@@ -596,9 +596,9 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
596 | loginParams["regionhandle"] = u.UserProfile.HomeRegion.ToString(); // user.CurrentAgent.Handle.ToString(); | 596 | loginParams["regionhandle"] = u.UserProfile.HomeRegion.ToString(); // user.CurrentAgent.Handle.ToString(); |
597 | 597 | ||
598 | loginParams["home_address"] = rinfo.ExternalHostName; | 598 | loginParams["home_address"] = rinfo.ExternalHostName; |
599 | Console.WriteLine(" --------- Home Address -------"); | 599 | m_log.Debug(" --------- Home Address -------"); |
600 | Console.WriteLine(" >> " + loginParams["home_address"] + " <<"); | 600 | m_log.Debug(" >> " + loginParams["home_address"] + " <<"); |
601 | Console.WriteLine(" --------- ------------ -------"); | 601 | m_log.Debug(" --------- ------------ -------"); |
602 | loginParams["home_port"] = rinfo.HttpPort.ToString(); | 602 | loginParams["home_port"] = rinfo.HttpPort.ToString(); |
603 | loginParams["home_remoting"] = NetworkServersInfo.RemotingListenerPort.ToString(); ; | 603 | loginParams["home_remoting"] = NetworkServersInfo.RemotingListenerPort.ToString(); ; |
604 | } | 604 | } |
@@ -614,7 +614,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
614 | 614 | ||
615 | // Send | 615 | // Send |
616 | string uri = "http://" + regInfo.ExternalHostName + ":" + regInfo.HttpPort + "/"; | 616 | string uri = "http://" + regInfo.ExternalHostName + ":" + regInfo.HttpPort + "/"; |
617 | //Console.WriteLine("XXX uri: " + uri); | 617 | //m_log.Debug("XXX uri: " + uri); |
618 | XmlRpcRequest request = new XmlRpcRequest("expect_hg_user", SendParams); | 618 | XmlRpcRequest request = new XmlRpcRequest("expect_hg_user", SendParams); |
619 | XmlRpcResponse reply; | 619 | XmlRpcResponse reply; |
620 | try | 620 | try |
@@ -722,7 +722,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
722 | else | 722 | else |
723 | { | 723 | { |
724 | // Finally, everything looks ok | 724 | // Finally, everything looks ok |
725 | //Console.WriteLine("XXX---- EVERYTHING OK ---XXX"); | 725 | //m_log.Debug("XXX---- EVERYTHING OK ---XXX"); |
726 | 726 | ||
727 | // 1 - Preload the user data | 727 | // 1 - Preload the user data |
728 | m_userProfileCache.PreloadUserCache(userData.ID, userData); | 728 | m_userProfileCache.PreloadUserCache(userData.ID, userData); |
@@ -744,7 +744,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
744 | rinfo.RegionLocX = 0; | 744 | rinfo.RegionLocX = 0; |
745 | rinfo.RegionLocY = (uint)(random.Next(0, Int32.MaxValue)); //(uint)m_knownRegions.Count; | 745 | rinfo.RegionLocY = (uint)(random.Next(0, Int32.MaxValue)); //(uint)m_knownRegions.Count; |
746 | rinfo.regionSecret = userRegionHandle.ToString(); | 746 | rinfo.regionSecret = userRegionHandle.ToString(); |
747 | //Console.WriteLine("XXX--- Here: handle = " + rinfo.regionSecret); | 747 | //m_log.Debug("XXX--- Here: handle = " + rinfo.regionSecret); |
748 | try | 748 | try |
749 | { | 749 | { |
750 | rinfo.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), (int)userhomeinternalport); | 750 | rinfo.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), (int)userhomeinternalport); |
@@ -828,7 +828,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
828 | if ((uinfo != null) && (uinfo.UserProfile != null) && | 828 | if ((uinfo != null) && (uinfo.UserProfile != null) && |
829 | (IsLocalUser(uinfo) || !(uinfo.UserProfile is ForeignUserProfileData))) | 829 | (IsLocalUser(uinfo) || !(uinfo.UserProfile is ForeignUserProfileData))) |
830 | { | 830 | { |
831 | //Console.WriteLine("---------------> Local User!"); | 831 | //m_log.Debug("---------------> Local User!"); |
832 | string[] parts = agentData.firstname.Split(new char[] { '.' }); | 832 | string[] parts = agentData.firstname.Split(new char[] { '.' }); |
833 | if (parts.Length == 2) | 833 | if (parts.Length == 2) |
834 | { | 834 | { |
@@ -837,7 +837,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
837 | } | 837 | } |
838 | } | 838 | } |
839 | //else | 839 | //else |
840 | // Console.WriteLine("---------------> Foreign User!"); | 840 | // m_log.Debug("---------------> Foreign User!"); |
841 | } | 841 | } |
842 | #endregion | 842 | #endregion |
843 | 843 | ||
@@ -938,31 +938,31 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
938 | 938 | ||
939 | private void DumpUserData(ForeignUserProfileData userData) | 939 | private void DumpUserData(ForeignUserProfileData userData) |
940 | { | 940 | { |
941 | Console.WriteLine(" ------------ User Data Dump ----------"); | 941 | m_log.Info(" ------------ User Data Dump ----------"); |
942 | Console.WriteLine(" >> Name: " + userData.FirstName + " " + userData.SurName); | 942 | m_log.Info(" >> Name: " + userData.FirstName + " " + userData.SurName); |
943 | Console.WriteLine(" >> HomeID: " + userData.HomeRegionID); | 943 | m_log.Info(" >> HomeID: " + userData.HomeRegionID); |
944 | Console.WriteLine(" >> HomeHandle: " + userData.HomeRegion); | 944 | m_log.Info(" >> HomeHandle: " + userData.HomeRegion); |
945 | Console.WriteLine(" >> HomeX: " + userData.HomeRegionX); | 945 | m_log.Info(" >> HomeX: " + userData.HomeRegionX); |
946 | Console.WriteLine(" >> HomeY: " + userData.HomeRegionY); | 946 | m_log.Info(" >> HomeY: " + userData.HomeRegionY); |
947 | Console.WriteLine(" >> UserServer: " + userData.UserServerURI); | 947 | m_log.Info(" >> UserServer: " + userData.UserServerURI); |
948 | Console.WriteLine(" >> InvServer: " + userData.UserInventoryURI); | 948 | m_log.Info(" >> InvServer: " + userData.UserInventoryURI); |
949 | Console.WriteLine(" >> AssetServer: " + userData.UserAssetURI); | 949 | m_log.Info(" >> AssetServer: " + userData.UserAssetURI); |
950 | Console.WriteLine(" ------------ -------------- ----------"); | 950 | m_log.Info(" ------------ -------------- ----------"); |
951 | } | 951 | } |
952 | 952 | ||
953 | private void DumpRegionData(RegionInfo rinfo) | 953 | private void DumpRegionData(RegionInfo rinfo) |
954 | { | 954 | { |
955 | Console.WriteLine(" ------------ Region Data Dump ----------"); | 955 | m_log.Info(" ------------ Region Data Dump ----------"); |
956 | Console.WriteLine(" >> handle: " + rinfo.RegionHandle); | 956 | m_log.Info(" >> handle: " + rinfo.RegionHandle); |
957 | Console.WriteLine(" >> coords: " + rinfo.RegionLocX + ", " + rinfo.RegionLocY); | 957 | m_log.Info(" >> coords: " + rinfo.RegionLocX + ", " + rinfo.RegionLocY); |
958 | Console.WriteLine(" >> secret: " + rinfo.regionSecret); | 958 | m_log.Info(" >> secret: " + rinfo.regionSecret); |
959 | Console.WriteLine(" >> remoting address: " + rinfo.RemotingAddress); | 959 | m_log.Info(" >> remoting address: " + rinfo.RemotingAddress); |
960 | Console.WriteLine(" >> remoting port: " + rinfo.RemotingPort); | 960 | m_log.Info(" >> remoting port: " + rinfo.RemotingPort); |
961 | Console.WriteLine(" >> external host name: " + rinfo.ExternalHostName); | 961 | m_log.Info(" >> external host name: " + rinfo.ExternalHostName); |
962 | Console.WriteLine(" >> http port: " + rinfo.HttpPort); | 962 | m_log.Info(" >> http port: " + rinfo.HttpPort); |
963 | Console.WriteLine(" >> external EP address: " + rinfo.ExternalEndPoint.Address); | 963 | m_log.Info(" >> external EP address: " + rinfo.ExternalEndPoint.Address); |
964 | Console.WriteLine(" >> external EP port: " + rinfo.ExternalEndPoint.Port); | 964 | m_log.Info(" >> external EP port: " + rinfo.ExternalEndPoint.Port); |
965 | Console.WriteLine(" ------------ -------------- ----------"); | 965 | m_log.Info(" ------------ -------------- ----------"); |
966 | } | 966 | } |
967 | 967 | ||
968 | 968 | ||