diff options
author | Justin Clark-Casey (justincc) | 2009-09-07 18:26:53 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2009-09-07 18:26:53 +0100 |
commit | 116933bee5adfa4a3c1815fb7f3866bdaa584c41 (patch) | |
tree | b1aaf689ad7c9ef07e495e94d64f5978a1d5c9c3 | |
parent | T012_EstateSettingsRandomStorage() which wasn't being run because the method ... (diff) | |
parent | Merge branch 'master' of ssh://MyConnection/var/git/opensim (diff) | |
download | opensim-SC_OLD-116933bee5adfa4a3c1815fb7f3866bdaa584c41.zip opensim-SC_OLD-116933bee5adfa4a3c1815fb7f3866bdaa584c41.tar.gz opensim-SC_OLD-116933bee5adfa4a3c1815fb7f3866bdaa584c41.tar.bz2 opensim-SC_OLD-116933bee5adfa4a3c1815fb7f3866bdaa584c41.tar.xz |
Merge branch 'master' of ssh://justincc@opensimulator.org/var/git/opensim
104 files changed, 1603 insertions, 1052 deletions
diff --git a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs index dff4d48..6fd3d30 100644 --- a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs +++ b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs | |||
@@ -94,14 +94,24 @@ namespace OpenSim.ApplicationPlugins.LoadRegions | |||
94 | regionLoader = new RegionLoaderWebServer(); | 94 | regionLoader = new RegionLoaderWebServer(); |
95 | } | 95 | } |
96 | 96 | ||
97 | m_log.Info("[LOADREGIONSPLUGIN]: Loading region configurations..."); | ||
98 | |||
97 | regionLoader.SetIniConfigSource(m_openSim.ConfigSource.Source); | 99 | regionLoader.SetIniConfigSource(m_openSim.ConfigSource.Source); |
98 | RegionInfo[] regionsToLoad = regionLoader.LoadRegions(); | 100 | RegionInfo[] regionsToLoad = regionLoader.LoadRegions(); |
99 | 101 | ||
102 | m_log.Info("[LOADREGIONSPLUGIN]: Loading specific shared modules..."); | ||
103 | m_log.Info("[LOADREGIONSPLUGIN]: DynamicTextureModule..."); | ||
100 | m_openSim.ModuleLoader.LoadDefaultSharedModule(new DynamicTextureModule()); | 104 | m_openSim.ModuleLoader.LoadDefaultSharedModule(new DynamicTextureModule()); |
105 | m_log.Info("[LOADREGIONSPLUGIN]: InstantMessageModule..."); | ||
101 | m_openSim.ModuleLoader.LoadDefaultSharedModule(new InstantMessageModule()); | 106 | m_openSim.ModuleLoader.LoadDefaultSharedModule(new InstantMessageModule()); |
107 | m_log.Info("[LOADREGIONSPLUGIN]: LoadImageURLModule..."); | ||
102 | m_openSim.ModuleLoader.LoadDefaultSharedModule(new LoadImageURLModule()); | 108 | m_openSim.ModuleLoader.LoadDefaultSharedModule(new LoadImageURLModule()); |
109 | m_log.Info("[LOADREGIONSPLUGIN]: XMLRPCModule..."); | ||
103 | m_openSim.ModuleLoader.LoadDefaultSharedModule(new XMLRPCModule()); | 110 | m_openSim.ModuleLoader.LoadDefaultSharedModule(new XMLRPCModule()); |
111 | m_log.Info("[LOADREGIONSPLUGIN]: AssetTransactionModule..."); | ||
104 | m_openSim.ModuleLoader.LoadDefaultSharedModule(new AssetTransactionModule()); | 112 | m_openSim.ModuleLoader.LoadDefaultSharedModule(new AssetTransactionModule()); |
113 | m_log.Info("[LOADREGIONSPLUGIN]: Done."); | ||
114 | |||
105 | if (!CheckRegionsForSanity(regionsToLoad)) | 115 | if (!CheckRegionsForSanity(regionsToLoad)) |
106 | { | 116 | { |
107 | m_log.Error("[LOADREGIONS]: Halting startup due to conflicts in region configurations"); | 117 | m_log.Error("[LOADREGIONS]: Halting startup due to conflicts in region configurations"); |
diff --git a/OpenSim/Data/IUserAccountData.cs b/OpenSim/Data/IUserAccountData.cs new file mode 100644 index 0000000..6bec188 --- /dev/null +++ b/OpenSim/Data/IUserAccountData.cs | |||
@@ -0,0 +1,55 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using OpenMetaverse; | ||
31 | using OpenSim.Framework; | ||
32 | |||
33 | namespace OpenSim.Data | ||
34 | { | ||
35 | public class UserAccountData | ||
36 | { | ||
37 | public UUID PrincipalID; | ||
38 | public UUID ScopeID; | ||
39 | public Dictionary<string, object> Data; | ||
40 | } | ||
41 | |||
42 | /// <summary> | ||
43 | /// An interface for connecting to the authentication datastore | ||
44 | /// </summary> | ||
45 | public interface IUserAccountData | ||
46 | { | ||
47 | UserAccountData Get(UUID principalID, UUID ScopeID); | ||
48 | |||
49 | List<UserAccountData> Query(UUID principalID, UUID ScopeID, string query); | ||
50 | |||
51 | bool Store(UserAccountData data); | ||
52 | |||
53 | bool SetDataItem(UUID principalID, string item, string value); | ||
54 | } | ||
55 | } | ||
diff --git a/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs b/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs new file mode 100644 index 0000000..78fc22c --- /dev/null +++ b/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs | |||
@@ -0,0 +1,222 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ''AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Data; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Framework; | ||
34 | using System.Data.SqlClient; | ||
35 | using System.Reflection; | ||
36 | using System.Text; | ||
37 | |||
38 | namespace OpenSim.Data.MSSQL | ||
39 | { | ||
40 | public class MSSQLAuthenticationData : IAuthenticationData | ||
41 | { | ||
42 | private string m_Realm; | ||
43 | private List<string> m_ColumnNames = null; | ||
44 | private int m_LastExpire = 0; | ||
45 | private string m_ConnectionString; | ||
46 | |||
47 | public MSSQLAuthenticationData(string connectionString, string realm) | ||
48 | { | ||
49 | m_Realm = realm; | ||
50 | m_ConnectionString = connectionString; | ||
51 | using (SqlConnection conn = new SqlConnection(m_ConnectionString)) | ||
52 | { | ||
53 | conn.Open(); | ||
54 | Migration m = new Migration(conn, GetType().Assembly, "AuthStore"); | ||
55 | m.Update(); | ||
56 | } | ||
57 | } | ||
58 | |||
59 | public AuthenticationData Get(UUID principalID) | ||
60 | { | ||
61 | AuthenticationData ret = new AuthenticationData(); | ||
62 | ret.Data = new Dictionary<string, object>(); | ||
63 | |||
64 | string sql = string.Format("select * from '{0}' where UUID = @principalID", m_Realm); | ||
65 | |||
66 | using (SqlConnection conn = new SqlConnection(m_ConnectionString)) | ||
67 | using (SqlCommand cmd = new SqlCommand(sql, conn)) | ||
68 | { | ||
69 | cmd.Parameters.AddWithValue("@principalID", principalID.ToString()); | ||
70 | conn.Open(); | ||
71 | using (SqlDataReader result = cmd.ExecuteReader()) | ||
72 | { | ||
73 | if (result.Read()) | ||
74 | { | ||
75 | ret.PrincipalID = principalID; | ||
76 | |||
77 | if (m_ColumnNames == null) | ||
78 | { | ||
79 | m_ColumnNames = new List<string>(); | ||
80 | |||
81 | DataTable schemaTable = result.GetSchemaTable(); | ||
82 | foreach (DataRow row in schemaTable.Rows) | ||
83 | m_ColumnNames.Add(row["ColumnName"].ToString()); | ||
84 | } | ||
85 | |||
86 | foreach (string s in m_ColumnNames) | ||
87 | { | ||
88 | if (s == "UUID") | ||
89 | continue; | ||
90 | |||
91 | ret.Data[s] = result[s].ToString(); | ||
92 | } | ||
93 | return ret; | ||
94 | } | ||
95 | } | ||
96 | } | ||
97 | return null; | ||
98 | } | ||
99 | |||
100 | public bool Store(AuthenticationData data) | ||
101 | { | ||
102 | if (data.Data.ContainsKey("UUID")) | ||
103 | data.Data.Remove("UUID"); | ||
104 | |||
105 | string[] fields = new List<string>(data.Data.Keys).ToArray(); | ||
106 | StringBuilder updateBuilder = new StringBuilder(); | ||
107 | |||
108 | using (SqlConnection conn = new SqlConnection(m_ConnectionString)) | ||
109 | using (SqlCommand cmd = new SqlCommand()) | ||
110 | { | ||
111 | updateBuilder.AppendFormat("update '{0}' set ", m_Realm); | ||
112 | |||
113 | bool first = true; | ||
114 | foreach (string field in fields) | ||
115 | { | ||
116 | if (!first) | ||
117 | updateBuilder.Append(", "); | ||
118 | updateBuilder.AppendFormat("'{0}' = @{0}",field); | ||
119 | |||
120 | first = false; | ||
121 | |||
122 | cmd.Parameters.AddWithValue("@" + field, data.Data[field]); | ||
123 | } | ||
124 | |||
125 | updateBuilder.Append(" where UUID = @principalID"); | ||
126 | |||
127 | cmd.CommandText = updateBuilder.ToString(); | ||
128 | cmd.Connection = conn; | ||
129 | |||
130 | cmd.Parameters.AddWithValue("@principalID", data.PrincipalID.ToString()); | ||
131 | conn.Open(); | ||
132 | if (cmd.ExecuteNonQuery() < 1) | ||
133 | { | ||
134 | StringBuilder insertBuilder = new StringBuilder(); | ||
135 | |||
136 | insertBuilder.AppendFormat("insert into '{0}' ('UUID', '", m_Realm); | ||
137 | insertBuilder.Append(String.Join("', '", fields)); | ||
138 | insertBuilder.Append("') values ( @principalID, @"); | ||
139 | insertBuilder.Append(String.Join(", @", fields)); | ||
140 | insertBuilder.Append(")"); | ||
141 | |||
142 | cmd.CommandText = insertBuilder.ToString(); | ||
143 | |||
144 | if (cmd.ExecuteNonQuery() < 1) | ||
145 | { | ||
146 | return false; | ||
147 | } | ||
148 | } | ||
149 | } | ||
150 | return true; | ||
151 | } | ||
152 | |||
153 | public bool SetDataItem(UUID principalID, string item, string value) | ||
154 | { | ||
155 | string sql = string.Format("update '{0}' set '{1}' = @{1} where UUID = @UUID", m_Realm, item); | ||
156 | using (SqlConnection conn = new SqlConnection(m_ConnectionString)) | ||
157 | using (SqlCommand cmd = new SqlCommand(sql, conn)) | ||
158 | { | ||
159 | cmd.Parameters.AddWithValue("@" + item, value); | ||
160 | cmd.Parameters.AddWithValue("@UUID", principalID.ToString()); | ||
161 | conn.Open(); | ||
162 | if (cmd.ExecuteNonQuery() > 0) | ||
163 | return true; | ||
164 | } | ||
165 | return false; | ||
166 | } | ||
167 | |||
168 | public bool SetToken(UUID principalID, string token, int lifetime) | ||
169 | { | ||
170 | if (System.Environment.TickCount - m_LastExpire > 30000) | ||
171 | DoExpire(); | ||
172 | string sql = "insert into tokens (UUID, token, validity) values (@principalID, @token, date_add(now(), interval @lifetime minute))"; | ||
173 | using (SqlConnection conn = new SqlConnection(m_ConnectionString)) | ||
174 | using (SqlCommand cmd = new SqlCommand(sql, conn)) | ||
175 | { | ||
176 | cmd.Parameters.AddWithValue("@principalID", principalID.ToString()); | ||
177 | cmd.Parameters.AddWithValue("@token", token); | ||
178 | cmd.Parameters.AddWithValue("@lifetime", lifetime.ToString()); | ||
179 | conn.Open(); | ||
180 | |||
181 | if (cmd.ExecuteNonQuery() > 0) | ||
182 | { | ||
183 | return true; | ||
184 | } | ||
185 | } | ||
186 | return false; | ||
187 | } | ||
188 | |||
189 | public bool CheckToken(UUID principalID, string token, int lifetime) | ||
190 | { | ||
191 | if (System.Environment.TickCount - m_LastExpire > 30000) | ||
192 | DoExpire(); | ||
193 | string sql = "update tokens set validity = date_add(now(), interval @lifetime minute) where UUID = @principalID and token = @token and validity > now()"; | ||
194 | using (SqlConnection conn = new SqlConnection(m_ConnectionString)) | ||
195 | using (SqlCommand cmd = new SqlCommand(sql, conn)) | ||
196 | { | ||
197 | cmd.Parameters.AddWithValue("@principalID", principalID.ToString()); | ||
198 | cmd.Parameters.AddWithValue("@token", token); | ||
199 | cmd.Parameters.AddWithValue("@lifetime", lifetime.ToString()); | ||
200 | conn.Open(); | ||
201 | |||
202 | if (cmd.ExecuteNonQuery() > 0) | ||
203 | { | ||
204 | return true; | ||
205 | } | ||
206 | } | ||
207 | return false; | ||
208 | } | ||
209 | |||
210 | private void DoExpire() | ||
211 | { | ||
212 | string sql = "delete from tokens where validity < now()"; | ||
213 | using (SqlConnection conn = new SqlConnection(m_ConnectionString)) | ||
214 | using (SqlCommand cmd = new SqlCommand(sql, conn)) | ||
215 | { | ||
216 | conn.Open(); | ||
217 | cmd.ExecuteNonQuery(); | ||
218 | } | ||
219 | m_LastExpire = System.Environment.TickCount; | ||
220 | } | ||
221 | } | ||
222 | } | ||
diff --git a/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs b/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs new file mode 100644 index 0000000..1520888 --- /dev/null +++ b/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs | |||
@@ -0,0 +1,186 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ''AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Data; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Framework; | ||
34 | using System.Data.SqlClient; | ||
35 | using System.Text; | ||
36 | |||
37 | namespace OpenSim.Data.MSSQL | ||
38 | { | ||
39 | public class MSSQLUserAccountData : IUserAccountData | ||
40 | { | ||
41 | private string m_Realm; | ||
42 | private List<string> m_ColumnNames = null; | ||
43 | private int m_LastExpire = 0; | ||
44 | private string m_ConnectionString; | ||
45 | |||
46 | public MSSQLUserAccountData(string connectionString, string realm) | ||
47 | { | ||
48 | m_Realm = realm; | ||
49 | m_ConnectionString = connectionString; | ||
50 | using (SqlConnection conn = new SqlConnection(m_ConnectionString)) | ||
51 | { | ||
52 | conn.Open(); | ||
53 | Migration m = new Migration(conn, GetType().Assembly, "UserStore"); | ||
54 | m.Update(); | ||
55 | } | ||
56 | } | ||
57 | |||
58 | public List<UserAccountData> Query(UUID principalID, UUID scopeID, string query) | ||
59 | { | ||
60 | return null; | ||
61 | } | ||
62 | |||
63 | public UserAccountData Get(UUID principalID, UUID scopeID) | ||
64 | { | ||
65 | UserAccountData ret = new UserAccountData(); | ||
66 | ret.Data = new Dictionary<string, object>(); | ||
67 | |||
68 | string sql = string.Format("select * from '{0}' where UUID = @principalID", m_Realm); | ||
69 | if (scopeID != UUID.Zero) | ||
70 | sql += " and ScopeID = @scopeID"; | ||
71 | |||
72 | using (SqlConnection conn = new SqlConnection(m_ConnectionString)) | ||
73 | using (SqlCommand cmd = new SqlCommand(sql, conn)) | ||
74 | { | ||
75 | |||
76 | cmd.Parameters.AddWithValue("@principalID", principalID); | ||
77 | cmd.Parameters.AddWithValue("@scopeID", scopeID); | ||
78 | conn.Open(); | ||
79 | using (SqlDataReader result = cmd.ExecuteReader()) | ||
80 | { | ||
81 | if (result.Read()) | ||
82 | { | ||
83 | ret.PrincipalID = principalID; | ||
84 | UUID scope; | ||
85 | UUID.TryParse(result["ScopeID"].ToString(), out scope); | ||
86 | ret.ScopeID = scope; | ||
87 | |||
88 | if (m_ColumnNames == null) | ||
89 | { | ||
90 | m_ColumnNames = new List<string>(); | ||
91 | |||
92 | DataTable schemaTable = result.GetSchemaTable(); | ||
93 | foreach (DataRow row in schemaTable.Rows) | ||
94 | m_ColumnNames.Add(row["ColumnName"].ToString()); | ||
95 | } | ||
96 | |||
97 | foreach (string s in m_ColumnNames) | ||
98 | { | ||
99 | if (s == "UUID") | ||
100 | continue; | ||
101 | if (s == "ScopeID") | ||
102 | continue; | ||
103 | |||
104 | ret.Data[s] = result[s].ToString(); | ||
105 | } | ||
106 | return ret; | ||
107 | } | ||
108 | } | ||
109 | } | ||
110 | return null; | ||
111 | } | ||
112 | |||
113 | public bool Store(UserAccountData data) | ||
114 | { | ||
115 | if (data.Data.ContainsKey("UUID")) | ||
116 | data.Data.Remove("UUID"); | ||
117 | if (data.Data.ContainsKey("ScopeID")) | ||
118 | data.Data.Remove("ScopeID"); | ||
119 | |||
120 | string[] fields = new List<string>(data.Data.Keys).ToArray(); | ||
121 | |||
122 | using (SqlConnection conn = new SqlConnection(m_ConnectionString)) | ||
123 | using (SqlCommand cmd = new SqlCommand()) | ||
124 | { | ||
125 | StringBuilder updateBuilder = new StringBuilder(); | ||
126 | updateBuilder.AppendFormat("update '{0}' set ", m_Realm); | ||
127 | bool first = true; | ||
128 | foreach (string field in fields) | ||
129 | { | ||
130 | if (!first) | ||
131 | updateBuilder.Append(", "); | ||
132 | updateBuilder.AppendFormat("'{0}' = @{0}", field); | ||
133 | |||
134 | first = false; | ||
135 | |||
136 | cmd.Parameters.AddWithValue("@" + field, data.Data[field]); | ||
137 | } | ||
138 | |||
139 | updateBuilder.Append(" where UUID = @principalID"); | ||
140 | |||
141 | if (data.ScopeID != UUID.Zero) | ||
142 | updateBuilder.Append(" and ScopeID = @scopeID"); | ||
143 | |||
144 | cmd.CommandText = updateBuilder.ToString(); | ||
145 | cmd.Connection = conn; | ||
146 | cmd.Parameters.AddWithValue("@principalID", data.PrincipalID); | ||
147 | cmd.Parameters.AddWithValue("@scopeID", data.ScopeID); | ||
148 | conn.Open(); | ||
149 | |||
150 | if (cmd.ExecuteNonQuery() < 1) | ||
151 | { | ||
152 | StringBuilder insertBuilder = new StringBuilder(); | ||
153 | insertBuilder.AppendFormat("insert into '{0}' ('UUID', 'ScopeID', '", m_Realm); | ||
154 | insertBuilder.Append(String.Join("', '", fields)); | ||
155 | insertBuilder.Append("') values ( @principalID, @scopeID, @"); | ||
156 | insertBuilder.Append(String.Join(", @", fields)); | ||
157 | insertBuilder.Append(")"); | ||
158 | |||
159 | cmd.CommandText = insertBuilder.ToString(); | ||
160 | |||
161 | if (cmd.ExecuteNonQuery() < 1) | ||
162 | { | ||
163 | return false; | ||
164 | } | ||
165 | } | ||
166 | } | ||
167 | return true; | ||
168 | } | ||
169 | |||
170 | public bool SetDataItem(UUID principalID, string item, string value) | ||
171 | { | ||
172 | string sql = string.Format("update '{0}' set '{1}' = @{1} where UUID = @UUID", m_Realm, item); | ||
173 | using (SqlConnection conn = new SqlConnection(m_ConnectionString)) | ||
174 | using (SqlCommand cmd = new SqlCommand(sql, conn)) | ||
175 | { | ||
176 | cmd.Parameters.AddWithValue("@" + item, value); | ||
177 | cmd.Parameters.AddWithValue("@UUID", principalID); | ||
178 | conn.Open(); | ||
179 | |||
180 | if (cmd.ExecuteNonQuery() > 0) | ||
181 | return true; | ||
182 | } | ||
183 | return false; | ||
184 | } | ||
185 | } | ||
186 | } | ||
diff --git a/OpenSim/Data/MSSQL/Resources/011_UserStore.sql b/OpenSim/Data/MSSQL/Resources/011_UserStore.sql new file mode 100644 index 0000000..5aa064f --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/011_UserStore.sql | |||
@@ -0,0 +1,5 @@ | |||
1 | BEGIN TRANSACTION | ||
2 | |||
3 | ALTER TABLE users ADD scopeID uniqueidentifier not null default '00000000-0000-0000-0000-000000000000' | ||
4 | |||
5 | COMMIT | ||
diff --git a/OpenSim/Data/MySQL/MySQLUserAccountData.cs b/OpenSim/Data/MySQL/MySQLUserAccountData.cs new file mode 100644 index 0000000..39d60ca --- /dev/null +++ b/OpenSim/Data/MySQL/MySQLUserAccountData.cs | |||
@@ -0,0 +1,180 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Data; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Framework; | ||
34 | using MySql.Data.MySqlClient; | ||
35 | |||
36 | namespace OpenSim.Data.MySQL | ||
37 | { | ||
38 | public class MySqlUserAccountData : MySqlFramework, IUserAccountData | ||
39 | { | ||
40 | private string m_Realm; | ||
41 | private List<string> m_ColumnNames = null; | ||
42 | private int m_LastExpire = 0; | ||
43 | |||
44 | public MySqlUserAccountData(string connectionString, string realm) | ||
45 | : base(connectionString) | ||
46 | { | ||
47 | m_Realm = realm; | ||
48 | |||
49 | Migration m = new Migration(m_Connection, GetType().Assembly, "UserStore"); | ||
50 | m.Update(); | ||
51 | } | ||
52 | |||
53 | public List<UserAccountData> Query(UUID principalID, UUID scopeID, string query) | ||
54 | { | ||
55 | return null; | ||
56 | } | ||
57 | |||
58 | public UserAccountData Get(UUID principalID, UUID scopeID) | ||
59 | { | ||
60 | UserAccountData ret = new UserAccountData(); | ||
61 | ret.Data = new Dictionary<string, object>(); | ||
62 | |||
63 | string command = "select * from `"+m_Realm+"` where UUID = ?principalID"; | ||
64 | if (scopeID != UUID.Zero) | ||
65 | command += " and ScopeID = ?scopeID"; | ||
66 | |||
67 | MySqlCommand cmd = new MySqlCommand(command); | ||
68 | |||
69 | cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); | ||
70 | cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); | ||
71 | |||
72 | IDataReader result = ExecuteReader(cmd); | ||
73 | |||
74 | if (result.Read()) | ||
75 | { | ||
76 | ret.PrincipalID = principalID; | ||
77 | UUID scope; | ||
78 | UUID.TryParse(result["ScopeID"].ToString(), out scope); | ||
79 | ret.ScopeID = scope; | ||
80 | |||
81 | if (m_ColumnNames == null) | ||
82 | { | ||
83 | m_ColumnNames = new List<string>(); | ||
84 | |||
85 | DataTable schemaTable = result.GetSchemaTable(); | ||
86 | foreach (DataRow row in schemaTable.Rows) | ||
87 | m_ColumnNames.Add(row["ColumnName"].ToString()); | ||
88 | } | ||
89 | |||
90 | foreach (string s in m_ColumnNames) | ||
91 | { | ||
92 | if (s == "UUID") | ||
93 | continue; | ||
94 | if (s == "ScopeID") | ||
95 | continue; | ||
96 | |||
97 | ret.Data[s] = result[s].ToString(); | ||
98 | } | ||
99 | |||
100 | result.Close(); | ||
101 | CloseReaderCommand(cmd); | ||
102 | |||
103 | return ret; | ||
104 | } | ||
105 | |||
106 | result.Close(); | ||
107 | CloseReaderCommand(cmd); | ||
108 | |||
109 | return null; | ||
110 | } | ||
111 | |||
112 | public bool Store(UserAccountData data) | ||
113 | { | ||
114 | if (data.Data.ContainsKey("UUID")) | ||
115 | data.Data.Remove("UUID"); | ||
116 | if (data.Data.ContainsKey("ScopeID")) | ||
117 | data.Data.Remove("ScopeID"); | ||
118 | |||
119 | string[] fields = new List<string>(data.Data.Keys).ToArray(); | ||
120 | |||
121 | MySqlCommand cmd = new MySqlCommand(); | ||
122 | |||
123 | string update = "update `"+m_Realm+"` set "; | ||
124 | bool first = true; | ||
125 | foreach (string field in fields) | ||
126 | { | ||
127 | if (!first) | ||
128 | update += ", "; | ||
129 | update += "`" + field + "` = ?"+field; | ||
130 | |||
131 | first = false; | ||
132 | |||
133 | cmd.Parameters.AddWithValue("?"+field, data.Data[field]); | ||
134 | } | ||
135 | |||
136 | update += " where UUID = ?principalID"; | ||
137 | |||
138 | if (data.ScopeID != UUID.Zero) | ||
139 | update += " and ScopeID = ?scopeID"; | ||
140 | |||
141 | cmd.CommandText = update; | ||
142 | cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString()); | ||
143 | cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString()); | ||
144 | |||
145 | if (ExecuteNonQuery(cmd) < 1) | ||
146 | { | ||
147 | string insert = "insert into `" + m_Realm + "` (`UUID`, `ScopeID`, `" + | ||
148 | String.Join("`, `", fields) + | ||
149 | "`) values ( ?principalID, ?scopeID, ?" + String.Join(", ?", fields) + ")"; | ||
150 | |||
151 | cmd.CommandText = insert; | ||
152 | |||
153 | if (ExecuteNonQuery(cmd) < 1) | ||
154 | { | ||
155 | cmd.Dispose(); | ||
156 | return false; | ||
157 | } | ||
158 | } | ||
159 | |||
160 | cmd.Dispose(); | ||
161 | |||
162 | return true; | ||
163 | } | ||
164 | |||
165 | public bool SetDataItem(UUID principalID, string item, string value) | ||
166 | { | ||
167 | MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + | ||
168 | "` set `" + item + "` = ?" + item + " where UUID = ?UUID"); | ||
169 | |||
170 | |||
171 | cmd.Parameters.AddWithValue("?"+item, value); | ||
172 | cmd.Parameters.AddWithValue("?UUID", principalID.ToString()); | ||
173 | |||
174 | if (ExecuteNonQuery(cmd) > 0) | ||
175 | return true; | ||
176 | |||
177 | return false; | ||
178 | } | ||
179 | } | ||
180 | } | ||
diff --git a/OpenSim/Data/MySQL/Resources/008_UserStore.sql b/OpenSim/Data/MySQL/Resources/008_UserStore.sql new file mode 100644 index 0000000..4500bd5 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/008_UserStore.sql | |||
@@ -0,0 +1,5 @@ | |||
1 | BEGIN; | ||
2 | |||
3 | ALTER TABLE users add scopeID char(36) not null default '00000000-0000-0000-0000-000000000000'; | ||
4 | |||
5 | COMMIT; | ||
diff --git a/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs b/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs index 44f44fe..63e09ae 100644 --- a/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs +++ b/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs | |||
@@ -78,6 +78,7 @@ namespace OpenSim.Framework.RegionLoader.Filesystem | |||
78 | 78 | ||
79 | foreach (IConfig config in source.Configs) | 79 | foreach (IConfig config in source.Configs) |
80 | { | 80 | { |
81 | //m_log.Info("[REGIONLOADERFILESYSTEM]: Creating RegionInfo for " + config.Name); | ||
81 | RegionInfo regionInfo = new RegionInfo("REGION CONFIG #" + (i + 1), file, false, m_configSource, config.Name); | 82 | RegionInfo regionInfo = new RegionInfo("REGION CONFIG #" + (i + 1), file, false, m_configSource, config.Name); |
82 | regionInfos.Add(regionInfo); | 83 | regionInfos.Add(regionInfo); |
83 | i++; | 84 | i++; |
diff --git a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs index 381070e..80f2e79 100644 --- a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs +++ b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs | |||
@@ -59,7 +59,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
59 | HGUserServices userServices = new HGUserServices(this); | 59 | HGUserServices userServices = new HGUserServices(this); |
60 | // This plugin arrangement could eventually be configurable rather than hardcoded here. | 60 | // This plugin arrangement could eventually be configurable rather than hardcoded here. |
61 | userServices.AddPlugin(new TemporaryUserProfilePlugin()); | 61 | userServices.AddPlugin(new TemporaryUserProfilePlugin()); |
62 | userServices.AddPlugin(new OGS1UserDataPlugin(this)); | 62 | userServices.AddPlugin(new HGUserDataPlugin(this, userServices)); |
63 | 63 | ||
64 | m_userService = userServices; | 64 | m_userService = userServices; |
65 | m_messageService = userServices; | 65 | m_messageService = userServices; |
diff --git a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs index 568437d..e4e12d4 100644 --- a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs +++ b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs | |||
@@ -57,7 +57,7 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
57 | HGUserServices hgUserService = new HGUserServices(this, localUserService); | 57 | HGUserServices hgUserService = new HGUserServices(this, localUserService); |
58 | // This plugin arrangement could eventually be configurable rather than hardcoded here. | 58 | // This plugin arrangement could eventually be configurable rather than hardcoded here. |
59 | hgUserService.AddPlugin(new TemporaryUserProfilePlugin()); | 59 | hgUserService.AddPlugin(new TemporaryUserProfilePlugin()); |
60 | hgUserService.AddPlugin(new OGS1UserDataPlugin(this)); | 60 | hgUserService.AddPlugin(new HGUserDataPlugin(this, hgUserService)); |
61 | 61 | ||
62 | m_userService = hgUserService; | 62 | m_userService = hgUserService; |
63 | m_userAdminService = hgUserService; | 63 | m_userAdminService = hgUserService; |
diff --git a/OpenSim/Region/Communications/Hypergrid/HGUserDataPlugin.cs b/OpenSim/Region/Communications/Hypergrid/HGUserDataPlugin.cs new file mode 100644 index 0000000..4b8fc26 --- /dev/null +++ b/OpenSim/Region/Communications/Hypergrid/HGUserDataPlugin.cs | |||
@@ -0,0 +1,72 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Text.RegularExpressions; | ||
34 | using System.Xml.Serialization; | ||
35 | using log4net; | ||
36 | using Nwc.XmlRpc; | ||
37 | using OpenMetaverse; | ||
38 | using OpenSim.Data; | ||
39 | using OpenSim.Framework; | ||
40 | using OpenSim.Framework.Communications; | ||
41 | using OpenSim.Framework.Communications.Clients; | ||
42 | using OpenSim.Region.Communications.OGS1; | ||
43 | |||
44 | namespace OpenSim.Region.Communications.Hypergrid | ||
45 | { | ||
46 | public class HGUserDataPlugin : OGS1UserDataPlugin | ||
47 | { | ||
48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
49 | |||
50 | HGUserServices m_UserServices; | ||
51 | |||
52 | public HGUserDataPlugin() | ||
53 | { | ||
54 | } | ||
55 | |||
56 | public HGUserDataPlugin(CommunicationsManager commsManager, HGUserServices userServices) | ||
57 | { | ||
58 | m_log.DebugFormat("[HG USER SERVICES]: {0} initialized", Name); | ||
59 | m_commsManager = commsManager; | ||
60 | m_UserServices = userServices; | ||
61 | } | ||
62 | |||
63 | protected override string GetUserServerURL(UUID userID) | ||
64 | { | ||
65 | string url = string.Empty; | ||
66 | if (m_UserServices.IsForeignUser(userID, out url)) | ||
67 | return url; | ||
68 | return m_commsManager.NetworkServersInfo.UserURL; | ||
69 | } | ||
70 | |||
71 | } | ||
72 | } | ||
diff --git a/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs b/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs index 68a9076..f1a56ef 100644 --- a/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs +++ b/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs | |||
@@ -311,9 +311,9 @@ namespace OpenSim.Region.Communications.Hypergrid | |||
311 | return m_commsManager.NetworkServersInfo.UserURL; | 311 | return m_commsManager.NetworkServersInfo.UserURL; |
312 | } | 312 | } |
313 | 313 | ||
314 | private bool IsForeignUser(UUID userID, out string userServerURL) | 314 | public bool IsForeignUser(UUID userID, out string userServerURL) |
315 | { | 315 | { |
316 | userServerURL = string.Empty; | 316 | userServerURL = m_commsManager.NetworkServersInfo.UserURL; |
317 | CachedUserInfo uinfo = m_commsManager.UserProfileCacheService.GetUserDetails(userID); | 317 | CachedUserInfo uinfo = m_commsManager.UserProfileCacheService.GetUserDetails(userID); |
318 | if (uinfo != null) | 318 | if (uinfo != null) |
319 | { | 319 | { |
diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs b/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs index 9f234be..ec8512a 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs | |||
@@ -48,6 +48,10 @@ namespace OpenSim.Region.Communications.OGS1 | |||
48 | 48 | ||
49 | protected CommunicationsManager m_commsManager; | 49 | protected CommunicationsManager m_commsManager; |
50 | 50 | ||
51 | public OGS1UserDataPlugin() | ||
52 | { | ||
53 | } | ||
54 | |||
51 | public OGS1UserDataPlugin(CommunicationsManager commsManager) | 55 | public OGS1UserDataPlugin(CommunicationsManager commsManager) |
52 | { | 56 | { |
53 | m_log.DebugFormat("[OGS1 USER SERVICES]: {0} initialized", Name); | 57 | m_log.DebugFormat("[OGS1 USER SERVICES]: {0} initialized", Name); |
@@ -108,7 +112,7 @@ namespace OpenSim.Region.Communications.OGS1 | |||
108 | parameters.Add(param); | 112 | parameters.Add(param); |
109 | XmlRpcRequest req = new XmlRpcRequest("get_agent_by_uuid", parameters); | 113 | XmlRpcRequest req = new XmlRpcRequest("get_agent_by_uuid", parameters); |
110 | 114 | ||
111 | XmlRpcResponse resp = req.Send(GetUserServerURL(userId), 6000); | 115 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 6000); |
112 | Hashtable respData = (Hashtable)resp.Value; | 116 | Hashtable respData = (Hashtable)resp.Value; |
113 | if (respData.Contains("error_type")) | 117 | if (respData.Contains("error_type")) |
114 | { | 118 | { |
@@ -603,7 +607,7 @@ namespace OpenSim.Region.Communications.OGS1 | |||
603 | { | 607 | { |
604 | if ((string)respData["returnString"] == "TRUE") | 608 | if ((string)respData["returnString"] == "TRUE") |
605 | { | 609 | { |
606 | 610 | m_log.DebugFormat("[OGS1 USER SERVICES]: Updated user appearance in {0}", GetUserServerURL(user)); | |
607 | } | 611 | } |
608 | else | 612 | else |
609 | { | 613 | { |
@@ -622,8 +626,8 @@ namespace OpenSim.Region.Communications.OGS1 | |||
622 | } | 626 | } |
623 | catch (WebException e) | 627 | catch (WebException e) |
624 | { | 628 | { |
625 | m_log.Warn("[OGS1 USER SERVICES]: Error when trying to update Avatar's appearance: " + | 629 | m_log.WarnFormat("[OGS1 USER SERVICES]: Error when trying to update Avatar's appearance in {0}: {1}", |
626 | e.Message); | 630 | GetUserServerURL(user), e.Message); |
627 | // Return Empty list (no friends) | 631 | // Return Empty list (no friends) |
628 | } | 632 | } |
629 | } | 633 | } |
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs index a5894c6..613dbe9 100644 --- a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs +++ b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs | |||
@@ -34,6 +34,7 @@ using System.Text.RegularExpressions; | |||
34 | using log4net; | 34 | using log4net; |
35 | using Nini.Config; | 35 | using Nini.Config; |
36 | using OpenMetaverse; | 36 | using OpenMetaverse; |
37 | using Nwc.XmlRpc; | ||
37 | using OpenSim.Framework; | 38 | using OpenSim.Framework; |
38 | using OpenSim.Framework.Communications; | 39 | using OpenSim.Framework.Communications; |
39 | using OpenSim.Framework.Communications.Services; | 40 | using OpenSim.Framework.Communications.Services; |
@@ -115,6 +116,8 @@ namespace OpenSim.Region.CoreModules.Hypergrid | |||
115 | 116 | ||
116 | httpServer.AddXmlRPCHandler("hg_login", m_loginService.XmlRpcLoginMethod); | 117 | httpServer.AddXmlRPCHandler("hg_login", m_loginService.XmlRpcLoginMethod); |
117 | httpServer.AddXmlRPCHandler("check_auth_session", m_loginService.XmlRPCCheckAuthSession, false); | 118 | httpServer.AddXmlRPCHandler("check_auth_session", m_loginService.XmlRPCCheckAuthSession, false); |
119 | httpServer.AddXmlRPCHandler("get_avatar_appearance", XmlRPCGetAvatarAppearance); | ||
120 | httpServer.AddXmlRPCHandler("update_avatar_appearance", XmlRPCUpdateAvatarAppearance); | ||
118 | 121 | ||
119 | } | 122 | } |
120 | } | 123 | } |
@@ -256,5 +259,64 @@ namespace OpenSim.Region.CoreModules.Hypergrid | |||
256 | scene = null; | 259 | scene = null; |
257 | return false; | 260 | return false; |
258 | } | 261 | } |
262 | |||
263 | public XmlRpcResponse XmlRPCGetAvatarAppearance(XmlRpcRequest request, IPEndPoint remoteClient) | ||
264 | { | ||
265 | XmlRpcResponse response = new XmlRpcResponse(); | ||
266 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
267 | AvatarAppearance appearance; | ||
268 | Hashtable responseData; | ||
269 | if (requestData.Contains("owner")) | ||
270 | { | ||
271 | appearance = m_firstScene.CommsManager.AvatarService.GetUserAppearance(new UUID((string)requestData["owner"])); | ||
272 | if (appearance == null) | ||
273 | { | ||
274 | responseData = new Hashtable(); | ||
275 | responseData["error_type"] = "no appearance"; | ||
276 | responseData["error_desc"] = "There was no appearance found for this avatar"; | ||
277 | } | ||
278 | else | ||
279 | { | ||
280 | responseData = appearance.ToHashTable(); | ||
281 | } | ||
282 | } | ||
283 | else | ||
284 | { | ||
285 | responseData = new Hashtable(); | ||
286 | responseData["error_type"] = "unknown_avatar"; | ||
287 | responseData["error_desc"] = "The avatar appearance requested is not in the database"; | ||
288 | } | ||
289 | |||
290 | response.Value = responseData; | ||
291 | return response; | ||
292 | } | ||
293 | |||
294 | public XmlRpcResponse XmlRPCUpdateAvatarAppearance(XmlRpcRequest request, IPEndPoint remoteClient) | ||
295 | { | ||
296 | XmlRpcResponse response = new XmlRpcResponse(); | ||
297 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
298 | Hashtable responseData; | ||
299 | if (requestData.Contains("owner")) | ||
300 | { | ||
301 | AvatarAppearance appearance = new AvatarAppearance(requestData); | ||
302 | |||
303 | // TODO: Sometime in the future we may have a database layer that is capable of updating appearance when | ||
304 | // the TextureEntry is null. When that happens, this check can be removed | ||
305 | if (appearance.Texture != null) | ||
306 | m_firstScene.CommsManager.AvatarService.UpdateUserAppearance(new UUID((string)requestData["owner"]), appearance); | ||
307 | |||
308 | responseData = new Hashtable(); | ||
309 | responseData["returnString"] = "TRUE"; | ||
310 | } | ||
311 | else | ||
312 | { | ||
313 | responseData = new Hashtable(); | ||
314 | responseData["error_type"] = "unknown_avatar"; | ||
315 | responseData["error_desc"] = "The avatar appearance requested is not in the database"; | ||
316 | } | ||
317 | response.Value = responseData; | ||
318 | return response; | ||
319 | } | ||
259 | } | 320 | } |
321 | |||
260 | } | 322 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs index fcd0304..cca5bb4 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs | |||
@@ -42,7 +42,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | |||
42 | LogManager.GetLogger( | 42 | LogManager.GetLogger( |
43 | MethodBase.GetCurrentMethod().DeclaringType); | 43 | MethodBase.GetCurrentMethod().DeclaringType); |
44 | 44 | ||
45 | private IUserAccountDataService m_UserService; | 45 | private IUserAccountService m_UserService; |
46 | 46 | ||
47 | private bool m_Enabled = false; | 47 | private bool m_Enabled = false; |
48 | 48 | ||
@@ -82,7 +82,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | |||
82 | 82 | ||
83 | Object[] args = new Object[] { source }; | 83 | Object[] args = new Object[] { source }; |
84 | m_UserService = | 84 | m_UserService = |
85 | ServerUtils.LoadPlugin<IUserAccountDataService>(serviceDll, | 85 | ServerUtils.LoadPlugin<IUserAccountService>(serviceDll, |
86 | args); | 86 | args); |
87 | 87 | ||
88 | if (m_UserService == null) | 88 | if (m_UserService == null) |
@@ -113,7 +113,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | |||
113 | if (!m_Enabled) | 113 | if (!m_Enabled) |
114 | return; | 114 | return; |
115 | 115 | ||
116 | scene.RegisterModuleInterface<IUserAccountDataService>(m_UserService); | 116 | scene.RegisterModuleInterface<IUserAccountService>(m_UserService); |
117 | } | 117 | } |
118 | 118 | ||
119 | public void RemoveRegion(Scene scene) | 119 | public void RemoveRegion(Scene scene) |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs index a2b854b..cef9129 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs | |||
@@ -37,7 +37,7 @@ using OpenSim.Services.Connectors; | |||
37 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | 37 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User |
38 | { | 38 | { |
39 | public class RemoteUserServicesConnector : UserServicesConnector, | 39 | public class RemoteUserServicesConnector : UserServicesConnector, |
40 | ISharedRegionModule, IUserAccountDataService | 40 | ISharedRegionModule, IUserAccountService |
41 | { | 41 | { |
42 | private static readonly ILog m_log = | 42 | private static readonly ILog m_log = |
43 | LogManager.GetLogger( | 43 | LogManager.GetLogger( |
@@ -96,7 +96,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | |||
96 | if (!m_Enabled) | 96 | if (!m_Enabled) |
97 | return; | 97 | return; |
98 | 98 | ||
99 | scene.RegisterModuleInterface<IUserAccountDataService>(this); | 99 | scene.RegisterModuleInterface<IUserAccountService>(this); |
100 | } | 100 | } |
101 | 101 | ||
102 | public void RemoveRegion(Scene scene) | 102 | public void RemoveRegion(Scene scene) |
diff --git a/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs b/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs index 5c5f164..9da869c 100644 --- a/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs | |||
@@ -32,6 +32,7 @@ using log4net; | |||
32 | using Nini.Config; | 32 | using Nini.Config; |
33 | using OpenMetaverse; | 33 | using OpenMetaverse; |
34 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Framework.Client; | ||
35 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
36 | using OpenSim.Region.Framework.Scenes; | 37 | using OpenSim.Region.Framework.Scenes; |
37 | 38 | ||
@@ -71,6 +72,18 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
71 | public void AddRegion(Scene scene) | 72 | public void AddRegion(Scene scene) |
72 | { | 73 | { |
73 | 74 | ||
75 | |||
76 | |||
77 | } | ||
78 | |||
79 | public void RemoveRegion(Scene scene) | ||
80 | { | ||
81 | |||
82 | |||
83 | } | ||
84 | |||
85 | public void RegionLoaded(Scene scene) | ||
86 | { | ||
74 | if (!enabledYN) | 87 | if (!enabledYN) |
75 | return; | 88 | return; |
76 | 89 | ||
@@ -295,8 +308,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
295 | m_log.DebugFormat("Scene: {0} to the west of Scene{1} Offset: {2}. Extents:{3}", | 308 | m_log.DebugFormat("Scene: {0} to the west of Scene{1} Offset: {2}. Extents:{3}", |
296 | conn.RegionScene.RegionInfo.RegionName, | 309 | conn.RegionScene.RegionInfo.RegionName, |
297 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); | 310 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); |
298 | 311 | ||
299 | 312 | ||
300 | scene.BordersLocked = true; | 313 | scene.BordersLocked = true; |
301 | conn.RegionScene.BordersLocked = true; | 314 | conn.RegionScene.BordersLocked = true; |
302 | 315 | ||
@@ -325,9 +338,11 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
325 | // | 338 | // |
326 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); | 339 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); |
327 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); | 340 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); |
328 | 341 | ||
329 | conn.RegionScene.BordersLocked = false; | 342 | conn.RegionScene.BordersLocked = false; |
330 | scene.BordersLocked = false; | 343 | scene.BordersLocked = false; |
344 | if (conn.ClientEventForwarder != null) | ||
345 | conn.ClientEventForwarder.AddSceneToEventForwarding(scene); | ||
331 | connectedYN = true; | 346 | connectedYN = true; |
332 | break; | 347 | break; |
333 | } | 348 | } |
@@ -367,7 +382,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
367 | m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", | 382 | m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", |
368 | conn.RegionScene.RegionInfo.RegionName, | 383 | conn.RegionScene.RegionInfo.RegionName, |
369 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); | 384 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); |
370 | conn.RegionScene.PhysicsScene.Combine(null,Vector3.Zero,extents); | 385 | conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); |
371 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); | 386 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); |
372 | 387 | ||
373 | lock (conn.RegionScene.NorthBorders) | 388 | lock (conn.RegionScene.NorthBorders) |
@@ -386,7 +401,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
386 | 401 | ||
387 | scene.BordersLocked = false; | 402 | scene.BordersLocked = false; |
388 | conn.RegionScene.BordersLocked = false; | 403 | conn.RegionScene.BordersLocked = false; |
389 | 404 | if (conn.ClientEventForwarder != null) | |
405 | conn.ClientEventForwarder.AddSceneToEventForwarding(scene); | ||
390 | connectedYN = true; | 406 | connectedYN = true; |
391 | break; | 407 | break; |
392 | } | 408 | } |
@@ -424,52 +440,52 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
424 | m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}", | 440 | m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}", |
425 | conn.RegionScene.RegionInfo.RegionName, | 441 | conn.RegionScene.RegionInfo.RegionName, |
426 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); | 442 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); |
427 | 443 | ||
428 | conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); | 444 | conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); |
429 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); | 445 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); |
430 | lock (conn.RegionScene.NorthBorders) | 446 | lock (conn.RegionScene.NorthBorders) |
431 | if (conn.RegionScene.NorthBorders.Count == 1)// && 2) | 447 | if (conn.RegionScene.NorthBorders.Count == 1)// && 2) |
432 | { | 448 | { |
433 | //compound border | 449 | //compound border |
434 | // already locked above | 450 | // already locked above |
435 | conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; | 451 | conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; |
436 | 452 | ||
437 | lock (conn.RegionScene.EastBorders) | 453 | lock (conn.RegionScene.EastBorders) |
438 | conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 454 | conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
439 | lock (conn.RegionScene.WestBorders) | 455 | lock (conn.RegionScene.WestBorders) |
440 | conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 456 | conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
441 | 457 | ||
442 | |||
443 | 458 | ||
444 | } | 459 | |
460 | } | ||
445 | lock (scene.SouthBorders) | 461 | lock (scene.SouthBorders) |
446 | scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south | 462 | scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south |
447 | 463 | ||
448 | lock (conn.RegionScene.EastBorders) | 464 | lock (conn.RegionScene.EastBorders) |
449 | if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) | 465 | if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) |
450 | { | 466 | { |
451 | 467 | ||
452 | conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; | 468 | conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; |
453 | lock (conn.RegionScene.NorthBorders) | 469 | lock (conn.RegionScene.NorthBorders) |
454 | conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 470 | conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
455 | lock (conn.RegionScene.SouthBorders) | 471 | lock (conn.RegionScene.SouthBorders) |
456 | conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 472 | conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
457 | 473 | ||
458 | 474 | ||
459 | } | 475 | } |
460 | 476 | ||
461 | lock (scene.WestBorders) | 477 | lock (scene.WestBorders) |
462 | scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West | 478 | scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West |
463 | /* | 479 | /* |
464 | else | 480 | else |
465 | { | 481 | { |
466 | conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; | 482 | conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; |
467 | conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 483 | conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
468 | conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 484 | conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
469 | scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south | 485 | scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south |
470 | } | 486 | } |
471 | */ | 487 | */ |
472 | 488 | ||
473 | 489 | ||
474 | // Reset Terrain.. since terrain normally loads first. | 490 | // Reset Terrain.. since terrain normally loads first. |
475 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); | 491 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); |
@@ -478,6 +494,9 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
478 | scene.BordersLocked = false; | 494 | scene.BordersLocked = false; |
479 | conn.RegionScene.BordersLocked = false; | 495 | conn.RegionScene.BordersLocked = false; |
480 | 496 | ||
497 | if (conn.ClientEventForwarder != null) | ||
498 | conn.ClientEventForwarder.AddSceneToEventForwarding(scene); | ||
499 | |||
481 | connectedYN = true; | 500 | connectedYN = true; |
482 | 501 | ||
483 | //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); | 502 | //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); |
@@ -495,7 +514,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
495 | rdata.RegionScene = scene; | 514 | rdata.RegionScene = scene; |
496 | regionConnections.RegionLandChannel = scene.LandChannel; | 515 | regionConnections.RegionLandChannel = scene.LandChannel; |
497 | 516 | ||
498 | RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata,scene.LandChannel,regionConnections.ConnectedRegions); | 517 | RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel, |
518 | regionConnections.ConnectedRegions); | ||
499 | scene.LandChannel = lnd; | 519 | scene.LandChannel = lnd; |
500 | lock (m_regions) | 520 | lock (m_regions) |
501 | { | 521 | { |
@@ -504,24 +524,157 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
504 | ForwardPermissionRequests(regionConnections, r.RegionScene); | 524 | ForwardPermissionRequests(regionConnections, r.RegionScene); |
505 | } | 525 | } |
506 | } | 526 | } |
507 | 527 | ||
508 | m_regions.Add(scene.RegionInfo.originRegionID,regionConnections); | 528 | regionConnections.ClientEventForwarder = new RegionCombinerClientEventForwarder(regionConnections); |
529 | scene.EventManager.OnNewPresence += SetCourseLocationDelegate; | ||
530 | m_regions.Add(scene.RegionInfo.originRegionID, regionConnections); | ||
531 | |||
509 | } | 532 | } |
510 | 533 | ||
511 | } | 534 | } |
512 | AdjustLargeRegionBounds(); | 535 | AdjustLargeRegionBounds(); |
513 | |||
514 | } | 536 | } |
515 | 537 | ||
516 | public void RemoveRegion(Scene scene) | 538 | private void SetCourseLocationDelegate(ScenePresence presence) |
517 | { | 539 | { |
518 | 540 | presence.SetSendCourseLocationMethod(SendCourseLocationUpdates); | |
519 | |||
520 | } | 541 | } |
521 | 542 | ||
522 | public void RegionLoaded(Scene scene) | 543 | private void SendCourseLocationUpdates(UUID sceneId, ScenePresence presence) |
523 | { | 544 | { |
545 | RegionConnections connectiondata = null; | ||
546 | lock (m_regions) | ||
547 | { | ||
548 | if (m_regions.ContainsKey(sceneId)) | ||
549 | connectiondata = m_regions[sceneId]; | ||
550 | else | ||
551 | return; | ||
552 | } | ||
553 | |||
554 | List<ScenePresence> avatars = connectiondata.RegionScene.GetAvatars(); | ||
555 | List<Vector3> CoarseLocations = new List<Vector3>(); | ||
556 | List<UUID> AvatarUUIDs = new List<UUID>(); | ||
557 | for (int i = 0; i < avatars.Count; i++) | ||
558 | { | ||
559 | if (avatars[i].UUID != presence.UUID) | ||
560 | { | ||
561 | if (avatars[i].ParentID != 0) | ||
562 | { | ||
563 | // sitting avatar | ||
564 | SceneObjectPart sop = connectiondata.RegionScene.GetSceneObjectPart(avatars[i].ParentID); | ||
565 | if (sop != null) | ||
566 | { | ||
567 | CoarseLocations.Add(sop.AbsolutePosition + avatars[i].AbsolutePosition); | ||
568 | AvatarUUIDs.Add(avatars[i].UUID); | ||
569 | } | ||
570 | else | ||
571 | { | ||
572 | // we can't find the parent.. ! arg! | ||
573 | CoarseLocations.Add(avatars[i].AbsolutePosition); | ||
574 | AvatarUUIDs.Add(avatars[i].UUID); | ||
575 | } | ||
576 | } | ||
577 | else | ||
578 | { | ||
579 | CoarseLocations.Add(avatars[i].AbsolutePosition); | ||
580 | AvatarUUIDs.Add(avatars[i].UUID); | ||
581 | } | ||
582 | } | ||
583 | } | ||
584 | DistributeCourseLocationUpdates(CoarseLocations, AvatarUUIDs, connectiondata, presence); | ||
585 | } | ||
586 | |||
587 | private void DistributeCourseLocationUpdates(List<Vector3> locations, List<UUID> uuids, | ||
588 | RegionConnections connectiondata, ScenePresence rootPresence) | ||
589 | { | ||
590 | RegionData[] rdata = connectiondata.ConnectedRegions.ToArray(); | ||
591 | List<IClientAPI> clients = new List<IClientAPI>(); | ||
592 | Dictionary<Vector2, RegionCourseLocationStruct> updates = new Dictionary<Vector2, RegionCourseLocationStruct>(); | ||
524 | 593 | ||
594 | |||
595 | // Root Region entry | ||
596 | RegionCourseLocationStruct rootupdatedata = new RegionCourseLocationStruct(); | ||
597 | rootupdatedata.Locations = new List<Vector3>(); | ||
598 | rootupdatedata.Uuids = new List<UUID>(); | ||
599 | rootupdatedata.Offset = Vector2.Zero; | ||
600 | |||
601 | rootupdatedata.UserAPI = rootPresence.ControllingClient; | ||
602 | |||
603 | if (rootupdatedata.UserAPI != null) | ||
604 | updates.Add(Vector2.Zero, rootupdatedata); | ||
605 | |||
606 | //Each Region needs an entry or we will end up with dead minimap dots | ||
607 | foreach (RegionData regiondata in rdata) | ||
608 | { | ||
609 | Vector2 offset = new Vector2(regiondata.Offset.X, regiondata.Offset.Y); | ||
610 | RegionCourseLocationStruct updatedata = new RegionCourseLocationStruct(); | ||
611 | updatedata.Locations = new List<Vector3>(); | ||
612 | updatedata.Uuids = new List<UUID>(); | ||
613 | updatedata.Offset = offset; | ||
614 | |||
615 | if (offset == Vector2.Zero) | ||
616 | updatedata.UserAPI = rootPresence.ControllingClient; | ||
617 | else | ||
618 | updatedata.UserAPI = LocateUsersChildAgentIClientAPI(offset, rootPresence.UUID, rdata); | ||
619 | |||
620 | if (updatedata.UserAPI != null) | ||
621 | updates.Add(offset, updatedata); | ||
622 | } | ||
623 | |||
624 | // go over the locations and assign them to an IClientAPI | ||
625 | for (int i = 0; i < locations.Count;i++ ) | ||
626 | //{locations[i]/(int) Constants.RegionSize; | ||
627 | { | ||
628 | Vector3 pPosition = new Vector3((int)locations[i].X / (int)Constants.RegionSize, | ||
629 | (int)locations[i].Y / (int)Constants.RegionSize, locations[i].Z); | ||
630 | Vector2 offset = new Vector2(pPosition.X*(int) Constants.RegionSize, | ||
631 | pPosition.Y*(int) Constants.RegionSize); | ||
632 | |||
633 | if (!updates.ContainsKey(offset)) | ||
634 | { | ||
635 | // This shouldn't happen | ||
636 | RegionCourseLocationStruct updatedata = new RegionCourseLocationStruct(); | ||
637 | updatedata.Locations = new List<Vector3>(); | ||
638 | updatedata.Uuids = new List<UUID>(); | ||
639 | updatedata.Offset = offset; | ||
640 | |||
641 | if (offset == Vector2.Zero) | ||
642 | updatedata.UserAPI = rootPresence.ControllingClient; | ||
643 | else | ||
644 | updatedata.UserAPI = LocateUsersChildAgentIClientAPI(offset, rootPresence.UUID, rdata); | ||
645 | |||
646 | updates.Add(offset,updatedata); | ||
647 | |||
648 | } | ||
649 | |||
650 | updates[offset].Locations.Add(locations[i]); | ||
651 | updates[offset].Uuids.Add(uuids[i]); | ||
652 | |||
653 | } | ||
654 | |||
655 | // Send out the CoarseLocationupdates from their respective client connection based on where the avatar is | ||
656 | foreach (Vector2 offset in updates.Keys) | ||
657 | { | ||
658 | if (updates[offset].UserAPI != null) | ||
659 | { | ||
660 | updates[offset].UserAPI.SendCoarseLocationUpdate(updates[offset].Uuids,updates[offset].Locations); | ||
661 | } | ||
662 | } | ||
663 | |||
664 | } | ||
665 | |||
666 | private IClientAPI LocateUsersChildAgentIClientAPI(Vector2 offset, UUID uUID, RegionData[] rdata) | ||
667 | { | ||
668 | IClientAPI returnclient = null; | ||
669 | foreach (RegionData r in rdata) | ||
670 | { | ||
671 | if (r.Offset.X == offset.X && r.Offset.Y == offset.Y) | ||
672 | { | ||
673 | return r.RegionScene.SceneGraph.GetControllingClient(uUID); | ||
674 | } | ||
675 | } | ||
676 | |||
677 | return returnclient; | ||
525 | } | 678 | } |
526 | 679 | ||
527 | public void PostInitialise() | 680 | public void PostInitialise() |
@@ -529,6 +682,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
529 | 682 | ||
530 | } | 683 | } |
531 | 684 | ||
685 | |||
686 | |||
532 | public void UnCombineRegion(RegionData rdata) | 687 | public void UnCombineRegion(RegionData rdata) |
533 | { | 688 | { |
534 | lock (m_regions) | 689 | lock (m_regions) |
@@ -733,6 +888,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
733 | public int YEnd; | 888 | public int YEnd; |
734 | public List<RegionData> ConnectedRegions; | 889 | public List<RegionData> ConnectedRegions; |
735 | public RegionCombinerPermissionModule PermissionModule; | 890 | public RegionCombinerPermissionModule PermissionModule; |
891 | public RegionCombinerClientEventForwarder ClientEventForwarder; | ||
736 | public void UpdateExtents(Vector3 extents) | 892 | public void UpdateExtents(Vector3 extents) |
737 | { | 893 | { |
738 | XEnd = (int)extents.X; | 894 | XEnd = (int)extents.X; |
@@ -748,6 +904,13 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
748 | public Vector3 Offset; | 904 | public Vector3 Offset; |
749 | 905 | ||
750 | } | 906 | } |
907 | struct RegionCourseLocationStruct | ||
908 | { | ||
909 | public List<Vector3> Locations; | ||
910 | public List<UUID> Uuids; | ||
911 | public IClientAPI UserAPI; | ||
912 | public Vector2 Offset; | ||
913 | } | ||
751 | 914 | ||
752 | public class RegionCombinerLargeLandChannel : ILandChannel | 915 | public class RegionCombinerLargeLandChannel : ILandChannel |
753 | { | 916 | { |
@@ -759,7 +922,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
759 | 922 | ||
760 | #region ILandChannel Members | 923 | #region ILandChannel Members |
761 | 924 | ||
762 | public RegionCombinerLargeLandChannel(RegionData regData, ILandChannel rootRegionLandChannel,List<RegionData> regionConnections) | 925 | public RegionCombinerLargeLandChannel(RegionData regData, ILandChannel rootRegionLandChannel, |
926 | List<RegionData> regionConnections) | ||
763 | { | 927 | { |
764 | RegData = regData; | 928 | RegData = regData; |
765 | RootRegionLandChannel = rootRegionLandChannel; | 929 | RootRegionLandChannel = rootRegionLandChannel; |
@@ -790,7 +954,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
790 | else | 954 | else |
791 | { | 955 | { |
792 | int offsetX = (x / (int)Constants.RegionSize); | 956 | int offsetX = (x / (int)Constants.RegionSize); |
793 | int offsetY = (x / (int)Constants.RegionSize); | 957 | int offsetY = (y / (int)Constants.RegionSize); |
794 | offsetX *= (int)Constants.RegionSize; | 958 | offsetX *= (int)Constants.RegionSize; |
795 | offsetY *= (int)Constants.RegionSize; | 959 | offsetY *= (int)Constants.RegionSize; |
796 | 960 | ||
@@ -823,7 +987,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
823 | else | 987 | else |
824 | { | 988 | { |
825 | int offsetX = (int)(x/(int) Constants.RegionSize); | 989 | int offsetX = (int)(x/(int) Constants.RegionSize); |
826 | int offsetY = (int)(x/(int) Constants.RegionSize); | 990 | int offsetY = (int)(y/(int) Constants.RegionSize); |
827 | offsetX *= (int) Constants.RegionSize; | 991 | offsetX *= (int) Constants.RegionSize; |
828 | offsetY *= (int) Constants.RegionSize; | 992 | offsetY *= (int) Constants.RegionSize; |
829 | 993 | ||
@@ -886,6 +1050,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
886 | m_rootScene = RootScene; | 1050 | m_rootScene = RootScene; |
887 | } | 1051 | } |
888 | 1052 | ||
1053 | #region Permission Override | ||
889 | public bool BypassPermissions() | 1054 | public bool BypassPermissions() |
890 | { | 1055 | { |
891 | return m_rootScene.Permissions.BypassPermissions(); | 1056 | return m_rootScene.Permissions.BypassPermissions(); |
@@ -1110,5 +1275,137 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1110 | { | 1275 | { |
1111 | return m_rootScene.Permissions.CanUseObjectReturn(landdata, type, client, retlist); | 1276 | return m_rootScene.Permissions.CanUseObjectReturn(landdata, type, client, retlist); |
1112 | } | 1277 | } |
1278 | #endregion | ||
1279 | } | ||
1280 | |||
1281 | public class RegionCombinerClientEventForwarder | ||
1282 | { | ||
1283 | private Scene m_rootScene; | ||
1284 | private Dictionary<UUID, Scene> m_virtScene = new Dictionary<UUID, Scene>(); | ||
1285 | private Dictionary<UUID,RegionCombinerModuleIndividualForwarder> m_forwarders = new Dictionary<UUID, | ||
1286 | RegionCombinerModuleIndividualForwarder>(); | ||
1287 | public RegionCombinerClientEventForwarder(RegionConnections rootScene) | ||
1288 | { | ||
1289 | m_rootScene = rootScene.RegionScene; | ||
1290 | |||
1291 | |||
1292 | } | ||
1293 | |||
1294 | public void AddSceneToEventForwarding( Scene virtualScene ) | ||
1295 | { | ||
1296 | lock (m_virtScene) | ||
1297 | { | ||
1298 | if (m_virtScene.ContainsKey(virtualScene.RegionInfo.originRegionID)) | ||
1299 | { | ||
1300 | m_virtScene[virtualScene.RegionInfo.originRegionID] = virtualScene; | ||
1301 | } | ||
1302 | else | ||
1303 | { | ||
1304 | m_virtScene.Add(virtualScene.RegionInfo.originRegionID, virtualScene); | ||
1305 | } | ||
1306 | } | ||
1307 | |||
1308 | lock (m_forwarders) | ||
1309 | { | ||
1310 | // TODO: Fix this to unregister if this happens | ||
1311 | if (m_forwarders.ContainsKey(virtualScene.RegionInfo.originRegionID)) | ||
1312 | m_forwarders.Remove(virtualScene.RegionInfo.originRegionID); | ||
1313 | |||
1314 | RegionCombinerModuleIndividualForwarder forwarder = | ||
1315 | new RegionCombinerModuleIndividualForwarder(m_rootScene, virtualScene); | ||
1316 | m_forwarders.Add(virtualScene.RegionInfo.originRegionID, forwarder); | ||
1317 | |||
1318 | virtualScene.EventManager.OnNewClient += forwarder.ClientConnect; | ||
1319 | virtualScene.EventManager.OnClientClosed += forwarder.ClientClosed; | ||
1320 | } | ||
1321 | } | ||
1322 | |||
1323 | public void RemoveSceneFromEventForwarding (Scene virtualScene) | ||
1324 | { | ||
1325 | lock (m_forwarders) | ||
1326 | { | ||
1327 | RegionCombinerModuleIndividualForwarder forwarder = m_forwarders[virtualScene.RegionInfo.originRegionID]; | ||
1328 | virtualScene.EventManager.OnNewClient -= forwarder.ClientConnect; | ||
1329 | virtualScene.EventManager.OnClientClosed -= forwarder.ClientClosed; | ||
1330 | m_forwarders.Remove(virtualScene.RegionInfo.originRegionID); | ||
1331 | } | ||
1332 | lock (m_virtScene) | ||
1333 | { | ||
1334 | if (m_virtScene.ContainsKey(virtualScene.RegionInfo.originRegionID)) | ||
1335 | { | ||
1336 | m_virtScene.Remove(virtualScene.RegionInfo.originRegionID); | ||
1337 | } | ||
1338 | } | ||
1339 | } | ||
1340 | } | ||
1341 | |||
1342 | public class RegionCombinerModuleIndividualForwarder | ||
1343 | { | ||
1344 | private Scene m_rootScene; | ||
1345 | private Scene m_virtScene; | ||
1346 | public RegionCombinerModuleIndividualForwarder(Scene rootScene, Scene virtScene) | ||
1347 | { | ||
1348 | m_rootScene = rootScene; | ||
1349 | m_virtScene = virtScene; | ||
1350 | } | ||
1351 | |||
1352 | public void ClientConnect(IClientAPI client) | ||
1353 | { | ||
1354 | |||
1355 | m_virtScene.UnSubscribeToClientPrimEvents(client); | ||
1356 | m_virtScene.UnSubscribeToClientPrimRezEvents(client); | ||
1357 | m_virtScene.UnSubscribeToClientInventoryEvents(client); | ||
1358 | m_virtScene.UnSubscribeToClientAttachmentEvents(client); | ||
1359 | m_virtScene.UnSubscribeToClientTeleportEvents(client); | ||
1360 | m_virtScene.UnSubscribeToClientScriptEvents(client); | ||
1361 | m_virtScene.UnSubscribeToClientGodEvents(client); | ||
1362 | m_virtScene.UnSubscribeToClientNetworkEvents(client); | ||
1363 | |||
1364 | m_rootScene.SubscribeToClientPrimEvents(client); | ||
1365 | client.OnAddPrim += LocalAddNewPrim; | ||
1366 | client.OnRezObject += LocalRezObject; | ||
1367 | m_rootScene.SubscribeToClientInventoryEvents(client); | ||
1368 | m_rootScene.SubscribeToClientAttachmentEvents(client); | ||
1369 | m_rootScene.SubscribeToClientTeleportEvents(client); | ||
1370 | m_rootScene.SubscribeToClientScriptEvents(client); | ||
1371 | m_rootScene.SubscribeToClientGodEvents(client); | ||
1372 | m_rootScene.SubscribeToClientNetworkEvents(client); | ||
1373 | } | ||
1374 | public void ClientClosed(UUID clientid, Scene scene) | ||
1375 | { | ||
1376 | |||
1377 | } | ||
1378 | |||
1379 | |||
1380 | private void LocalRezObject(IClientAPI remoteclient, UUID itemid, Vector3 rayend, Vector3 raystart, | ||
1381 | UUID raytargetid, byte bypassraycast, bool rayendisintersection, bool rezselected, bool removeitem, | ||
1382 | UUID fromtaskid) | ||
1383 | { | ||
1384 | int differenceX = (int)m_virtScene.RegionInfo.RegionLocX - (int)m_rootScene.RegionInfo.RegionLocX; | ||
1385 | int differenceY = (int)m_virtScene.RegionInfo.RegionLocY - (int)m_rootScene.RegionInfo.RegionLocY; | ||
1386 | rayend.X += differenceX * (int)Constants.RegionSize; | ||
1387 | rayend.Y += differenceY * (int)Constants.RegionSize; | ||
1388 | raystart.X += differenceX * (int)Constants.RegionSize; | ||
1389 | raystart.Y += differenceY * (int)Constants.RegionSize; | ||
1390 | |||
1391 | m_rootScene.RezObject(remoteclient, itemid, rayend, raystart, raytargetid, bypassraycast, | ||
1392 | rayendisintersection, rezselected, removeitem, fromtaskid); | ||
1393 | |||
1394 | } | ||
1395 | |||
1396 | private void LocalAddNewPrim(UUID ownerid, UUID groupid, Vector3 rayend, Quaternion rot, | ||
1397 | PrimitiveBaseShape shape, byte bypassraycast, Vector3 raystart, UUID raytargetid, | ||
1398 | byte rayendisintersection) | ||
1399 | { | ||
1400 | int differenceX = (int)m_virtScene.RegionInfo.RegionLocX - (int)m_rootScene.RegionInfo.RegionLocX; | ||
1401 | int differenceY = (int)m_virtScene.RegionInfo.RegionLocY - (int)m_rootScene.RegionInfo.RegionLocY; | ||
1402 | rayend.X += differenceX * (int)Constants.RegionSize; | ||
1403 | rayend.Y += differenceY * (int)Constants.RegionSize; | ||
1404 | raystart.X += differenceX * (int)Constants.RegionSize; | ||
1405 | raystart.Y += differenceY * (int)Constants.RegionSize; | ||
1406 | m_rootScene.AddNewPrim(ownerid, groupid, rayend, rot, shape, bypassraycast, raystart, raytargetid, | ||
1407 | rayendisintersection); | ||
1408 | |||
1409 | } | ||
1113 | } | 1410 | } |
1114 | } | 1411 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs index dd6928f..8fe3565 100644 --- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs | |||
@@ -113,26 +113,26 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid | |||
113 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | 113 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, |
114 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) | 114 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) |
115 | { | 115 | { |
116 | //m_log.DebugFormat("[HGScene] RezObject itemID={0} fromTaskID={1}", itemID, fromTaskID); | 116 | m_log.DebugFormat("[HGScene] RezObject itemID={0} fromTaskID={1}", itemID, fromTaskID); |
117 | 117 | ||
118 | if (fromTaskID.Equals(UUID.Zero)) | 118 | //if (fromTaskID.Equals(UUID.Zero)) |
119 | //{ | ||
120 | InventoryItemBase item = new InventoryItemBase(itemID); | ||
121 | item.Owner = remoteClient.AgentId; | ||
122 | item = InventoryService.GetItem(item); | ||
123 | //if (item == null) | ||
124 | //{ // Fetch the item | ||
125 | // item = new InventoryItemBase(); | ||
126 | // item.Owner = remoteClient.AgentId; | ||
127 | // item.ID = itemID; | ||
128 | // item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo); | ||
129 | //} | ||
130 | if (item != null) | ||
119 | { | 131 | { |
120 | InventoryItemBase item = new InventoryItemBase(itemID); | 132 | m_assMapper.Get(item.AssetID, remoteClient.AgentId); |
121 | item.Owner = remoteClient.AgentId; | 133 | |
122 | item = InventoryService.GetItem(item); | ||
123 | //if (item == null) | ||
124 | //{ // Fetch the item | ||
125 | // item = new InventoryItemBase(); | ||
126 | // item.Owner = remoteClient.AgentId; | ||
127 | // item.ID = itemID; | ||
128 | // item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo); | ||
129 | //} | ||
130 | if (item != null) | ||
131 | { | ||
132 | m_assMapper.Get(item.AssetID, remoteClient.AgentId); | ||
133 | |||
134 | } | ||
135 | } | 134 | } |
135 | //} | ||
136 | 136 | ||
137 | // OK, we're done fetching. Pass it up to the default RezObject | 137 | // OK, we're done fetching. Pass it up to the default RezObject |
138 | return base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, | 138 | return base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 1d0da4c..3b91dd0 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -220,11 +220,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
220 | private bool m_scripts_enabled = true; | 220 | private bool m_scripts_enabled = true; |
221 | private string m_defaultScriptEngine; | 221 | private string m_defaultScriptEngine; |
222 | private int m_LastLogin = 0; | 222 | private int m_LastLogin = 0; |
223 | private Thread HeartbeatThread; | 223 | private Thread HeartbeatThread = null; |
224 | private volatile bool shuttingdown = false; | 224 | private volatile bool shuttingdown = false; |
225 | 225 | ||
226 | private int m_lastUpdate = Environment.TickCount; | 226 | private int m_lastUpdate = Environment.TickCount; |
227 | private int m_maxPrimsPerFrame = 200; | 227 | private int m_maxPrimsPerFrame = 200; |
228 | private bool m_firstHeartbeat = true; | ||
228 | 229 | ||
229 | private object m_deleting_scene_object = new object(); | 230 | private object m_deleting_scene_object = new object(); |
230 | 231 | ||
@@ -876,6 +877,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
876 | //m_heartbeatTimer.Enabled = true; | 877 | //m_heartbeatTimer.Enabled = true; |
877 | //m_heartbeatTimer.Interval = (int)(m_timespan * 1000); | 878 | //m_heartbeatTimer.Interval = (int)(m_timespan * 1000); |
878 | //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat); | 879 | //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat); |
880 | if (HeartbeatThread != null) | ||
881 | { | ||
882 | ThreadTracker.Remove(HeartbeatThread); | ||
883 | HeartbeatThread.Abort(); | ||
884 | HeartbeatThread = null; | ||
885 | } | ||
886 | m_lastUpdate = Environment.TickCount; | ||
879 | HeartbeatThread = new Thread(new ParameterizedThreadStart(Heartbeat)); | 887 | HeartbeatThread = new Thread(new ParameterizedThreadStart(Heartbeat)); |
880 | HeartbeatThread.SetApartmentState(ApartmentState.MTA); | 888 | HeartbeatThread.SetApartmentState(ApartmentState.MTA); |
881 | HeartbeatThread.Name = string.Format("Heartbeat for region {0}", RegionInfo.RegionName); | 889 | HeartbeatThread.Name = string.Format("Heartbeat for region {0}", RegionInfo.RegionName); |
@@ -912,9 +920,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
912 | /// <param name="e"></param> | 920 | /// <param name="e"></param> |
913 | private void Heartbeat(object sender) | 921 | private void Heartbeat(object sender) |
914 | { | 922 | { |
915 | Update(); | 923 | try |
924 | { | ||
925 | Update(); | ||
916 | 926 | ||
917 | m_lastUpdate = Environment.TickCount; | 927 | m_lastUpdate = Environment.TickCount; |
928 | m_firstHeartbeat = false; | ||
929 | } | ||
930 | catch (ThreadAbortException) | ||
931 | { | ||
932 | } | ||
918 | } | 933 | } |
919 | 934 | ||
920 | /// <summary> | 935 | /// <summary> |
@@ -2307,6 +2322,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2307 | /// <param name="client"></param> | 2322 | /// <param name="client"></param> |
2308 | public override void AddNewClient(IClientAPI client) | 2323 | public override void AddNewClient(IClientAPI client) |
2309 | { | 2324 | { |
2325 | CheckHeartbeat(); | ||
2310 | SubscribeToClientEvents(client); | 2326 | SubscribeToClientEvents(client); |
2311 | ScenePresence presence; | 2327 | ScenePresence presence; |
2312 | 2328 | ||
@@ -2365,14 +2381,40 @@ namespace OpenSim.Region.Framework.Scenes | |||
2365 | EventManager.TriggerOnNewClient(client); | 2381 | EventManager.TriggerOnNewClient(client); |
2366 | } | 2382 | } |
2367 | 2383 | ||
2384 | |||
2385 | |||
2368 | /// <summary> | 2386 | /// <summary> |
2369 | /// Register for events from the client | 2387 | /// Register for events from the client |
2370 | /// </summary> | 2388 | /// </summary> |
2371 | /// <param name="client">The IClientAPI of the connected client</param> | 2389 | /// <param name="client">The IClientAPI of the connected client</param> |
2372 | protected virtual void SubscribeToClientEvents(IClientAPI client) | 2390 | public virtual void SubscribeToClientEvents(IClientAPI client) |
2391 | { | ||
2392 | SubscribeToClientTerrainEvents(client); | ||
2393 | SubscribeToClientPrimEvents(client); | ||
2394 | SubscribeToClientPrimRezEvents(client); | ||
2395 | SubscribeToClientInventoryEvents(client); | ||
2396 | SubscribeToClientAttachmentEvents(client); | ||
2397 | SubscribeToClientTeleportEvents(client); | ||
2398 | SubscribeToClientScriptEvents(client); | ||
2399 | SubscribeToClientParcelEvents(client); | ||
2400 | SubscribeToClientGridEvents(client); | ||
2401 | SubscribeToClientGodEvents(client); | ||
2402 | |||
2403 | SubscribeToClientNetworkEvents(client); | ||
2404 | |||
2405 | |||
2406 | // EventManager.TriggerOnNewClient(client); | ||
2407 | } | ||
2408 | |||
2409 | public virtual void SubscribeToClientTerrainEvents(IClientAPI client) | ||
2373 | { | 2410 | { |
2374 | client.OnRegionHandShakeReply += SendLayerData; | 2411 | client.OnRegionHandShakeReply += SendLayerData; |
2375 | client.OnAddPrim += AddNewPrim; | 2412 | client.OnUnackedTerrain += TerrainUnAcked; |
2413 | } | ||
2414 | |||
2415 | public virtual void SubscribeToClientPrimEvents(IClientAPI client) | ||
2416 | { | ||
2417 | |||
2376 | client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimPosition; | 2418 | client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimPosition; |
2377 | client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition; | 2419 | client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition; |
2378 | client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimRotation; | 2420 | client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimRotation; |
@@ -2384,8 +2426,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2384 | client.OnUpdateExtraParams += m_sceneGraph.UpdateExtraParam; | 2426 | client.OnUpdateExtraParams += m_sceneGraph.UpdateExtraParam; |
2385 | client.OnUpdatePrimShape += m_sceneGraph.UpdatePrimShape; | 2427 | client.OnUpdatePrimShape += m_sceneGraph.UpdatePrimShape; |
2386 | client.OnUpdatePrimTexture += m_sceneGraph.UpdatePrimTexture; | 2428 | client.OnUpdatePrimTexture += m_sceneGraph.UpdatePrimTexture; |
2387 | client.OnTeleportLocationRequest += RequestTeleportLocation; | ||
2388 | client.OnTeleportLandmarkRequest += RequestTeleportLandmark; | ||
2389 | client.OnObjectRequest += RequestPrim; | 2429 | client.OnObjectRequest += RequestPrim; |
2390 | client.OnObjectSelect += SelectPrim; | 2430 | client.OnObjectSelect += SelectPrim; |
2391 | client.OnObjectDeselect += DeselectPrim; | 2431 | client.OnObjectDeselect += DeselectPrim; |
@@ -2393,15 +2433,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2393 | client.OnSpinStart += m_sceneGraph.SpinStart; | 2433 | client.OnSpinStart += m_sceneGraph.SpinStart; |
2394 | client.OnSpinUpdate += m_sceneGraph.SpinObject; | 2434 | client.OnSpinUpdate += m_sceneGraph.SpinObject; |
2395 | client.OnDeRezObject += DeRezObject; | 2435 | client.OnDeRezObject += DeRezObject; |
2396 | client.OnRezObject += RezObject; | 2436 | |
2397 | client.OnRezSingleAttachmentFromInv += RezSingleAttachment; | ||
2398 | client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments; | ||
2399 | client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv; | ||
2400 | client.OnObjectAttach += m_sceneGraph.AttachObject; | ||
2401 | client.OnObjectDetach += m_sceneGraph.DetachObject; | ||
2402 | client.OnObjectDrop += m_sceneGraph.DropObject; | ||
2403 | client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest; | ||
2404 | client.OnObjectDescription += m_sceneGraph.PrimDescription; | ||
2405 | client.OnObjectName += m_sceneGraph.PrimName; | 2437 | client.OnObjectName += m_sceneGraph.PrimName; |
2406 | client.OnObjectClickAction += m_sceneGraph.PrimClickAction; | 2438 | client.OnObjectClickAction += m_sceneGraph.PrimClickAction; |
2407 | client.OnObjectMaterial += m_sceneGraph.PrimMaterial; | 2439 | client.OnObjectMaterial += m_sceneGraph.PrimMaterial; |
@@ -2412,7 +2444,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
2412 | client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags; | 2444 | client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags; |
2413 | client.OnRequestObjectPropertiesFamily += m_sceneGraph.RequestObjectPropertiesFamily; | 2445 | client.OnRequestObjectPropertiesFamily += m_sceneGraph.RequestObjectPropertiesFamily; |
2414 | client.OnObjectPermissions += HandleObjectPermissionsUpdate; | 2446 | client.OnObjectPermissions += HandleObjectPermissionsUpdate; |
2447 | client.OnGrabObject += ProcessObjectGrab; | ||
2448 | client.OnDeGrabObject += ProcessObjectDeGrab; | ||
2449 | client.OnUndo += m_sceneGraph.HandleUndo; | ||
2450 | client.OnObjectDescription += m_sceneGraph.PrimDescription; | ||
2451 | client.OnObjectDrop += m_sceneGraph.DropObject; | ||
2452 | client.OnObjectSaleInfo += ObjectSaleInfo; | ||
2453 | client.OnObjectIncludeInSearch += m_sceneGraph.MakeObjectSearchable; | ||
2454 | client.OnObjectOwner += ObjectOwner; | ||
2455 | } | ||
2456 | |||
2457 | public virtual void SubscribeToClientPrimRezEvents(IClientAPI client) | ||
2458 | { | ||
2459 | client.OnAddPrim += AddNewPrim; | ||
2460 | client.OnRezObject += RezObject; | ||
2461 | } | ||
2415 | 2462 | ||
2463 | public virtual void SubscribeToClientInventoryEvents(IClientAPI client) | ||
2464 | { | ||
2416 | client.OnCreateNewInventoryItem += CreateNewInventoryItem; | 2465 | client.OnCreateNewInventoryItem += CreateNewInventoryItem; |
2417 | client.OnCreateNewInventoryFolder += HandleCreateInventoryFolder; | 2466 | client.OnCreateNewInventoryFolder += HandleCreateInventoryFolder; |
2418 | client.OnUpdateInventoryFolder += HandleUpdateInventoryFolder; | 2467 | client.OnUpdateInventoryFolder += HandleUpdateInventoryFolder; |
@@ -2430,36 +2479,217 @@ namespace OpenSim.Region.Framework.Scenes | |||
2430 | client.OnRemoveTaskItem += RemoveTaskInventory; | 2479 | client.OnRemoveTaskItem += RemoveTaskInventory; |
2431 | client.OnUpdateTaskInventory += UpdateTaskInventory; | 2480 | client.OnUpdateTaskInventory += UpdateTaskInventory; |
2432 | client.OnMoveTaskItem += ClientMoveTaskInventoryItem; | 2481 | client.OnMoveTaskItem += ClientMoveTaskInventoryItem; |
2482 | } | ||
2433 | 2483 | ||
2434 | client.OnGrabObject += ProcessObjectGrab; | 2484 | public virtual void SubscribeToClientAttachmentEvents(IClientAPI client) |
2435 | client.OnDeGrabObject += ProcessObjectDeGrab; | 2485 | { |
2436 | client.OnMoneyTransferRequest += ProcessMoneyTransferRequest; | 2486 | client.OnRezSingleAttachmentFromInv += RezSingleAttachment; |
2437 | client.OnParcelBuy += ProcessParcelBuy; | 2487 | client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments; |
2438 | client.OnAvatarPickerRequest += ProcessAvatarPickerRequest; | 2488 | client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv; |
2439 | client.OnObjectIncludeInSearch += m_sceneGraph.MakeObjectSearchable; | 2489 | client.OnObjectAttach += m_sceneGraph.AttachObject; |
2490 | client.OnObjectDetach += m_sceneGraph.DetachObject; | ||
2491 | } | ||
2492 | |||
2493 | public virtual void SubscribeToClientTeleportEvents(IClientAPI client) | ||
2494 | { | ||
2495 | client.OnTeleportLocationRequest += RequestTeleportLocation; | ||
2496 | client.OnTeleportLandmarkRequest += RequestTeleportLandmark; | ||
2440 | client.OnTeleportHomeRequest += TeleportClientHome; | 2497 | client.OnTeleportHomeRequest += TeleportClientHome; |
2441 | client.OnSetStartLocationRequest += SetHomeRezPoint; | 2498 | } |
2442 | client.OnUndo += m_sceneGraph.HandleUndo; | 2499 | |
2443 | client.OnObjectGroupRequest += m_sceneGraph.HandleObjectGroupUpdate; | 2500 | public virtual void SubscribeToClientScriptEvents(IClientAPI client) |
2444 | client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel; | 2501 | { |
2445 | client.OnParcelSetOtherCleanTime += LandChannel.SetParcelOtherCleanTime; | ||
2446 | client.OnObjectSaleInfo += ObjectSaleInfo; | ||
2447 | client.OnScriptReset += ProcessScriptReset; | 2502 | client.OnScriptReset += ProcessScriptReset; |
2448 | client.OnGetScriptRunning += GetScriptRunning; | 2503 | client.OnGetScriptRunning += GetScriptRunning; |
2449 | client.OnSetScriptRunning += SetScriptRunning; | 2504 | client.OnSetScriptRunning += SetScriptRunning; |
2505 | } | ||
2506 | |||
2507 | public virtual void SubscribeToClientParcelEvents(IClientAPI client) | ||
2508 | { | ||
2509 | client.OnObjectGroupRequest += m_sceneGraph.HandleObjectGroupUpdate; | ||
2510 | client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel; | ||
2511 | client.OnParcelSetOtherCleanTime += LandChannel.SetParcelOtherCleanTime; | ||
2512 | client.OnParcelBuy += ProcessParcelBuy; | ||
2513 | } | ||
2514 | |||
2515 | public virtual void SubscribeToClientGridEvents(IClientAPI client) | ||
2516 | { | ||
2517 | client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest; | ||
2518 | client.OnMoneyTransferRequest += ProcessMoneyTransferRequest; | ||
2519 | client.OnAvatarPickerRequest += ProcessAvatarPickerRequest; | ||
2520 | client.OnSetStartLocationRequest += SetHomeRezPoint; | ||
2450 | client.OnRegionHandleRequest += RegionHandleRequest; | 2521 | client.OnRegionHandleRequest += RegionHandleRequest; |
2451 | client.OnUnackedTerrain += TerrainUnAcked; | 2522 | } |
2452 | client.OnObjectOwner += ObjectOwner; | ||
2453 | 2523 | ||
2524 | public virtual void SubscribeToClientGodEvents(IClientAPI client) | ||
2525 | { | ||
2454 | IGodsModule godsModule = RequestModuleInterface<IGodsModule>(); | 2526 | IGodsModule godsModule = RequestModuleInterface<IGodsModule>(); |
2455 | client.OnGodKickUser += godsModule.KickUser; | 2527 | client.OnGodKickUser += godsModule.KickUser; |
2456 | client.OnRequestGodlikePowers += godsModule.RequestGodlikePowers; | 2528 | client.OnRequestGodlikePowers += godsModule.RequestGodlikePowers; |
2529 | } | ||
2457 | 2530 | ||
2531 | public virtual void SubscribeToClientNetworkEvents(IClientAPI client) | ||
2532 | { | ||
2458 | client.OnNetworkStatsUpdate += StatsReporter.AddPacketsStats; | 2533 | client.OnNetworkStatsUpdate += StatsReporter.AddPacketsStats; |
2534 | } | ||
2535 | |||
2536 | protected virtual void UnsubscribeToClientEvents(IClientAPI client) | ||
2537 | { | ||
2538 | |||
2539 | } | ||
2540 | |||
2541 | /// <summary> | ||
2542 | /// Register for events from the client | ||
2543 | /// </summary> | ||
2544 | /// <param name="client">The IClientAPI of the connected client</param> | ||
2545 | public virtual void UnSubscribeToClientEvents(IClientAPI client) | ||
2546 | { | ||
2547 | UnSubscribeToClientTerrainEvents(client); | ||
2548 | UnSubscribeToClientPrimEvents(client); | ||
2549 | UnSubscribeToClientPrimRezEvents(client); | ||
2550 | UnSubscribeToClientInventoryEvents(client); | ||
2551 | UnSubscribeToClientAttachmentEvents(client); | ||
2552 | UnSubscribeToClientTeleportEvents(client); | ||
2553 | UnSubscribeToClientScriptEvents(client); | ||
2554 | UnSubscribeToClientParcelEvents(client); | ||
2555 | UnSubscribeToClientGridEvents(client); | ||
2556 | UnSubscribeToClientGodEvents(client); | ||
2557 | |||
2558 | UnSubscribeToClientNetworkEvents(client); | ||
2559 | |||
2459 | 2560 | ||
2460 | // EventManager.TriggerOnNewClient(client); | 2561 | // EventManager.TriggerOnNewClient(client); |
2461 | } | 2562 | } |
2462 | 2563 | ||
2564 | public virtual void UnSubscribeToClientTerrainEvents(IClientAPI client) | ||
2565 | { | ||
2566 | client.OnRegionHandShakeReply -= SendLayerData; | ||
2567 | client.OnUnackedTerrain -= TerrainUnAcked; | ||
2568 | } | ||
2569 | |||
2570 | public virtual void UnSubscribeToClientPrimEvents(IClientAPI client) | ||
2571 | { | ||
2572 | client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimPosition; | ||
2573 | client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition; | ||
2574 | client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimRotation; | ||
2575 | client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimRotation; | ||
2576 | client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation; | ||
2577 | client.OnUpdatePrimSingleRotationPosition -= m_sceneGraph.UpdatePrimSingleRotationPosition; | ||
2578 | client.OnUpdatePrimScale -= m_sceneGraph.UpdatePrimScale; | ||
2579 | client.OnUpdatePrimGroupScale -= m_sceneGraph.UpdatePrimGroupScale; | ||
2580 | client.OnUpdateExtraParams -= m_sceneGraph.UpdateExtraParam; | ||
2581 | client.OnUpdatePrimShape -= m_sceneGraph.UpdatePrimShape; | ||
2582 | client.OnUpdatePrimTexture -= m_sceneGraph.UpdatePrimTexture; | ||
2583 | client.OnObjectRequest -= RequestPrim; | ||
2584 | client.OnObjectSelect -= SelectPrim; | ||
2585 | client.OnObjectDeselect -= DeselectPrim; | ||
2586 | client.OnGrabUpdate -= m_sceneGraph.MoveObject; | ||
2587 | client.OnSpinStart -= m_sceneGraph.SpinStart; | ||
2588 | client.OnSpinUpdate -= m_sceneGraph.SpinObject; | ||
2589 | client.OnDeRezObject -= DeRezObject; | ||
2590 | client.OnObjectName -= m_sceneGraph.PrimName; | ||
2591 | client.OnObjectClickAction -= m_sceneGraph.PrimClickAction; | ||
2592 | client.OnObjectMaterial -= m_sceneGraph.PrimMaterial; | ||
2593 | client.OnLinkObjects -= m_sceneGraph.LinkObjects; | ||
2594 | client.OnDelinkObjects -= m_sceneGraph.DelinkObjects; | ||
2595 | client.OnObjectDuplicate -= m_sceneGraph.DuplicateObject; | ||
2596 | client.OnObjectDuplicateOnRay -= doObjectDuplicateOnRay; | ||
2597 | client.OnUpdatePrimFlags -= m_sceneGraph.UpdatePrimFlags; | ||
2598 | client.OnRequestObjectPropertiesFamily -= m_sceneGraph.RequestObjectPropertiesFamily; | ||
2599 | client.OnObjectPermissions -= HandleObjectPermissionsUpdate; | ||
2600 | client.OnGrabObject -= ProcessObjectGrab; | ||
2601 | client.OnDeGrabObject -= ProcessObjectDeGrab; | ||
2602 | client.OnUndo -= m_sceneGraph.HandleUndo; | ||
2603 | client.OnObjectDescription -= m_sceneGraph.PrimDescription; | ||
2604 | client.OnObjectDrop -= m_sceneGraph.DropObject; | ||
2605 | client.OnObjectSaleInfo -= ObjectSaleInfo; | ||
2606 | client.OnObjectIncludeInSearch -= m_sceneGraph.MakeObjectSearchable; | ||
2607 | client.OnObjectOwner -= ObjectOwner; | ||
2608 | } | ||
2609 | |||
2610 | public virtual void UnSubscribeToClientPrimRezEvents(IClientAPI client) | ||
2611 | { | ||
2612 | client.OnAddPrim -= AddNewPrim; | ||
2613 | client.OnRezObject -= RezObject; | ||
2614 | } | ||
2615 | |||
2616 | |||
2617 | public virtual void UnSubscribeToClientInventoryEvents(IClientAPI client) | ||
2618 | { | ||
2619 | client.OnCreateNewInventoryItem -= CreateNewInventoryItem; | ||
2620 | client.OnCreateNewInventoryFolder -= HandleCreateInventoryFolder; | ||
2621 | client.OnUpdateInventoryFolder -= HandleUpdateInventoryFolder; | ||
2622 | client.OnMoveInventoryFolder -= HandleMoveInventoryFolder; // 2; //!! | ||
2623 | client.OnFetchInventoryDescendents -= HandleFetchInventoryDescendents; | ||
2624 | client.OnPurgeInventoryDescendents -= HandlePurgeInventoryDescendents; // 2; //!! | ||
2625 | client.OnFetchInventory -= HandleFetchInventory; | ||
2626 | client.OnUpdateInventoryItem -= UpdateInventoryItemAsset; | ||
2627 | client.OnCopyInventoryItem -= CopyInventoryItem; | ||
2628 | client.OnMoveInventoryItem -= MoveInventoryItem; | ||
2629 | client.OnRemoveInventoryItem -= RemoveInventoryItem; | ||
2630 | client.OnRemoveInventoryFolder -= RemoveInventoryFolder; | ||
2631 | client.OnRezScript -= RezScript; | ||
2632 | client.OnRequestTaskInventory -= RequestTaskInventory; | ||
2633 | client.OnRemoveTaskItem -= RemoveTaskInventory; | ||
2634 | client.OnUpdateTaskInventory -= UpdateTaskInventory; | ||
2635 | client.OnMoveTaskItem -= ClientMoveTaskInventoryItem; | ||
2636 | } | ||
2637 | |||
2638 | public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client) | ||
2639 | { | ||
2640 | client.OnRezSingleAttachmentFromInv -= RezSingleAttachment; | ||
2641 | client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments; | ||
2642 | client.OnDetachAttachmentIntoInv -= DetachSingleAttachmentToInv; | ||
2643 | client.OnObjectAttach -= m_sceneGraph.AttachObject; | ||
2644 | client.OnObjectDetach -= m_sceneGraph.DetachObject; | ||
2645 | } | ||
2646 | |||
2647 | public virtual void UnSubscribeToClientTeleportEvents(IClientAPI client) | ||
2648 | { | ||
2649 | client.OnTeleportLocationRequest -= RequestTeleportLocation; | ||
2650 | client.OnTeleportLandmarkRequest -= RequestTeleportLandmark; | ||
2651 | client.OnTeleportHomeRequest -= TeleportClientHome; | ||
2652 | } | ||
2653 | |||
2654 | public virtual void UnSubscribeToClientScriptEvents(IClientAPI client) | ||
2655 | { | ||
2656 | client.OnScriptReset -= ProcessScriptReset; | ||
2657 | client.OnGetScriptRunning -= GetScriptRunning; | ||
2658 | client.OnSetScriptRunning -= SetScriptRunning; | ||
2659 | } | ||
2660 | |||
2661 | public virtual void UnSubscribeToClientParcelEvents(IClientAPI client) | ||
2662 | { | ||
2663 | client.OnObjectGroupRequest -= m_sceneGraph.HandleObjectGroupUpdate; | ||
2664 | client.OnParcelReturnObjectsRequest -= LandChannel.ReturnObjectsInParcel; | ||
2665 | client.OnParcelSetOtherCleanTime -= LandChannel.SetParcelOtherCleanTime; | ||
2666 | client.OnParcelBuy -= ProcessParcelBuy; | ||
2667 | } | ||
2668 | |||
2669 | public virtual void UnSubscribeToClientGridEvents(IClientAPI client) | ||
2670 | { | ||
2671 | client.OnNameFromUUIDRequest -= CommsManager.HandleUUIDNameRequest; | ||
2672 | client.OnMoneyTransferRequest -= ProcessMoneyTransferRequest; | ||
2673 | client.OnAvatarPickerRequest -= ProcessAvatarPickerRequest; | ||
2674 | client.OnSetStartLocationRequest -= SetHomeRezPoint; | ||
2675 | client.OnRegionHandleRequest -= RegionHandleRequest; | ||
2676 | } | ||
2677 | |||
2678 | public virtual void UnSubscribeToClientGodEvents(IClientAPI client) | ||
2679 | { | ||
2680 | IGodsModule godsModule = RequestModuleInterface<IGodsModule>(); | ||
2681 | client.OnGodKickUser -= godsModule.KickUser; | ||
2682 | client.OnRequestGodlikePowers -= godsModule.RequestGodlikePowers; | ||
2683 | } | ||
2684 | |||
2685 | public virtual void UnSubscribeToClientNetworkEvents(IClientAPI client) | ||
2686 | { | ||
2687 | client.OnNetworkStatsUpdate -= StatsReporter.AddPacketsStats; | ||
2688 | } | ||
2689 | |||
2690 | |||
2691 | |||
2692 | |||
2463 | /// <summary> | 2693 | /// <summary> |
2464 | /// Teleport an avatar to their home region | 2694 | /// Teleport an avatar to their home region |
2465 | /// </summary> | 2695 | /// </summary> |
@@ -2617,6 +2847,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2617 | /// <returns></returns> | 2847 | /// <returns></returns> |
2618 | protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client) | 2848 | protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client) |
2619 | { | 2849 | { |
2850 | CheckHeartbeat(); | ||
2620 | AvatarAppearance appearance = null; | 2851 | AvatarAppearance appearance = null; |
2621 | GetAvatarAppearance(client, out appearance); | 2852 | GetAvatarAppearance(client, out appearance); |
2622 | 2853 | ||
@@ -2659,6 +2890,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2659 | /// <param name="agentID"></param> | 2890 | /// <param name="agentID"></param> |
2660 | public override void RemoveClient(UUID agentID) | 2891 | public override void RemoveClient(UUID agentID) |
2661 | { | 2892 | { |
2893 | CheckHeartbeat(); | ||
2662 | bool childagentYN = false; | 2894 | bool childagentYN = false; |
2663 | ScenePresence avatar = GetScenePresence(agentID); | 2895 | ScenePresence avatar = GetScenePresence(agentID); |
2664 | if (avatar != null) | 2896 | if (avatar != null) |
@@ -2926,11 +3158,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
2926 | 3158 | ||
2927 | if (!agent.child) | 3159 | if (!agent.child) |
2928 | { | 3160 | { |
2929 | if (agent.startpos.X > (int)Constants.RegionSize - 1) | 3161 | if (TestBorderCross(agent.startpos,Cardinals.E)) |
2930 | agent.startpos.X = (int)Constants.RegionSize - 1; | 3162 | { |
3163 | Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.E); | ||
3164 | agent.startpos.X = crossedBorder.BorderLine.Z - 1; | ||
3165 | } | ||
2931 | 3166 | ||
2932 | if (agent.startpos.Y > (int)Constants.RegionSize - 1) | 3167 | if (TestBorderCross(agent.startpos, Cardinals.N)) |
2933 | agent.startpos.Y = (int)Constants.RegionSize - 1; | 3168 | { |
3169 | Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.N); | ||
3170 | agent.startpos.Y = crossedBorder.BorderLine.Z - 1; | ||
3171 | } | ||
2934 | 3172 | ||
2935 | // Honor parcel landing type and position. | 3173 | // Honor parcel landing type and position. |
2936 | ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); | 3174 | ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); |
@@ -4160,6 +4398,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
4160 | else | 4398 | else |
4161 | return health; | 4399 | return health; |
4162 | 4400 | ||
4401 | CheckHeartbeat(); | ||
4402 | |||
4163 | return health; | 4403 | return health; |
4164 | } | 4404 | } |
4165 | 4405 | ||
@@ -4345,5 +4585,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
4345 | 4585 | ||
4346 | return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; | 4586 | return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; |
4347 | } | 4587 | } |
4588 | |||
4589 | private void CheckHeartbeat() | ||
4590 | { | ||
4591 | if (m_firstHeartbeat) | ||
4592 | return; | ||
4593 | |||
4594 | if (System.Environment.TickCount - m_lastUpdate > 2000) | ||
4595 | StartTimer(); | ||
4596 | } | ||
4348 | } | 4597 | } |
4349 | } | 4598 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index c6b3f30..0827672 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | |||
@@ -367,6 +367,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
367 | string reason = String.Empty; | 367 | string reason = String.Empty; |
368 | 368 | ||
369 | //bool regionAccepted = m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, a); | 369 | //bool regionAccepted = m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, a); |
370 | |||
370 | bool regionAccepted = m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, out reason); | 371 | bool regionAccepted = m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, out reason); |
371 | 372 | ||
372 | if (regionAccepted && newAgent) | 373 | if (regionAccepted && newAgent) |
@@ -384,7 +385,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
384 | 385 | ||
385 | eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID); | 386 | eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID); |
386 | eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath); | 387 | eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath); |
387 | m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1} in region {2}", | 388 | m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1} in region {2}", |
388 | capsPath, avatar.UUID, avatar.Scene.RegionInfo.RegionName); | 389 | capsPath, avatar.UUID, avatar.Scene.RegionInfo.RegionName); |
389 | } | 390 | } |
390 | else | 391 | else |
@@ -394,7 +395,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
394 | } | 395 | } |
395 | 396 | ||
396 | m_log.Info("[INTERGRID]: Completed inform client about neighbour " + endPoint.ToString()); | 397 | m_log.Info("[INTERGRID]: Completed inform client about neighbour " + endPoint.ToString()); |
398 | |||
397 | } | 399 | } |
400 | |||
398 | } | 401 | } |
399 | 402 | ||
400 | public void RequestNeighbors(RegionInfo region) | 403 | public void RequestNeighbors(RegionInfo region) |
@@ -407,6 +410,65 @@ namespace OpenSim.Region.Framework.Scenes | |||
407 | //blah.Port = region.RemotingPort; | 410 | //blah.Port = region.RemotingPort; |
408 | } | 411 | } |
409 | 412 | ||
413 | public List<SimpleRegionInfo> RequestNeighbors(Scene pScene, uint pRegionLocX, uint pRegionLocY) | ||
414 | { | ||
415 | Border[] northBorders = pScene.NorthBorders.ToArray(); | ||
416 | Border[] southBorders = pScene.SouthBorders.ToArray(); | ||
417 | Border[] eastBorders = pScene.EastBorders.ToArray(); | ||
418 | Border[] westBorders = pScene.WestBorders.ToArray(); | ||
419 | |||
420 | // Legacy one region. Provided for simplicity while testing the all inclusive method in the else statement. | ||
421 | if (northBorders.Length <= 1 && southBorders.Length <= 1 && eastBorders.Length <= 1 && westBorders.Length <= 1) | ||
422 | { | ||
423 | return m_commsProvider.GridService.RequestNeighbours(pRegionLocX, pRegionLocY); | ||
424 | } | ||
425 | else | ||
426 | { | ||
427 | Vector2 extent = Vector2.Zero; | ||
428 | for (int i=0;i<eastBorders.Length;i++) | ||
429 | { | ||
430 | extent.X = (eastBorders[i].BorderLine.Z > extent.X) ? eastBorders[i].BorderLine.Z : extent.X; | ||
431 | } | ||
432 | for (int i=0;i<northBorders.Length;i++) | ||
433 | { | ||
434 | extent.Y = (northBorders[i].BorderLine.Z > extent.Y) ? northBorders[i].BorderLine.Z : extent.Y; | ||
435 | } | ||
436 | |||
437 | List<SimpleRegionInfo> neighbourList = new List<SimpleRegionInfo>(); | ||
438 | |||
439 | // Loss of fraction on purpose | ||
440 | extent.X = ((int)extent.X / (int)Constants.RegionSize) + 1; | ||
441 | extent.Y = ((int)extent.Y / (int)Constants.RegionSize) + 1; | ||
442 | |||
443 | int startX = (int) pRegionLocX - 1; | ||
444 | int startY = (int) pRegionLocY - 1; | ||
445 | |||
446 | int endX = (int) pRegionLocX + (int)extent.X + 1; | ||
447 | int endY = (int) pRegionLocY + (int)extent.Y + 1; | ||
448 | |||
449 | for (int i=startX;i<endX;i++) | ||
450 | { | ||
451 | for (int j=startY;j<endY;j++) | ||
452 | { | ||
453 | // Skip CurrentRegion | ||
454 | if (i == (int)pRegionLocX && j == (int)pRegionLocY) | ||
455 | continue; | ||
456 | |||
457 | ulong regionHandle = Util.UIntsToLong((uint)(i * Constants.RegionSize), | ||
458 | (uint)(j * Constants.RegionSize)); | ||
459 | RegionInfo neighborreg = m_commsProvider.GridService.RequestNeighbourInfo(regionHandle); | ||
460 | if (neighborreg != null) | ||
461 | { | ||
462 | neighbourList.Add(neighborreg); | ||
463 | } | ||
464 | } | ||
465 | } | ||
466 | return neighbourList; | ||
467 | //SimpleRegionInfo regionData = m_commsProvider.GridService.RequestNeighbourInfo() | ||
468 | //return m_commsProvider.GridService.RequestNeighbours(pRegionLocX, pRegionLocY); | ||
469 | } | ||
470 | } | ||
471 | |||
410 | /// <summary> | 472 | /// <summary> |
411 | /// This informs all neighboring regions about agent "avatar". | 473 | /// This informs all neighboring regions about agent "avatar". |
412 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. | 474 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. |
@@ -429,7 +491,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
429 | if (m_regionInfo != null) | 491 | if (m_regionInfo != null) |
430 | { | 492 | { |
431 | neighbours = | 493 | neighbours = |
432 | m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); | 494 | RequestNeighbors(avatar.Scene,m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); |
433 | } | 495 | } |
434 | else | 496 | else |
435 | { | 497 | { |
@@ -536,6 +598,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
536 | InformClientOfNeighbourCompleted, | 598 | InformClientOfNeighbourCompleted, |
537 | d); | 599 | d); |
538 | } | 600 | } |
601 | |||
602 | catch (ArgumentOutOfRangeException) | ||
603 | { | ||
604 | m_log.ErrorFormat( | ||
605 | "[REGIONINFO]: Neighbour Regions response included the current region in the neighbor list. The following region will not display to the client: {0} for region {1} ({2}, {3}).", | ||
606 | neighbour.ExternalHostName, | ||
607 | neighbour.RegionHandle, | ||
608 | neighbour.RegionLocX, | ||
609 | neighbour.RegionLocY); | ||
610 | } | ||
539 | catch (Exception e) | 611 | catch (Exception e) |
540 | { | 612 | { |
541 | m_log.ErrorFormat( | 613 | m_log.ErrorFormat( |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 857dc11..1024857 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -62,6 +62,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
62 | public ScriptControlled eventControls; | 62 | public ScriptControlled eventControls; |
63 | } | 63 | } |
64 | 64 | ||
65 | public delegate void SendCourseLocationsMethod(UUID scene, ScenePresence presence); | ||
66 | |||
65 | public class ScenePresence : EntityBase | 67 | public class ScenePresence : EntityBase |
66 | { | 68 | { |
67 | // ~ScenePresence() | 69 | // ~ScenePresence() |
@@ -87,12 +89,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
87 | public Vector3 lastKnownAllowedPosition; | 89 | public Vector3 lastKnownAllowedPosition; |
88 | public bool sentMessageAboutRestrictedParcelFlyingDown; | 90 | public bool sentMessageAboutRestrictedParcelFlyingDown; |
89 | 91 | ||
92 | |||
93 | |||
90 | private bool m_updateflag; | 94 | private bool m_updateflag; |
91 | private byte m_movementflag; | 95 | private byte m_movementflag; |
92 | private readonly List<NewForce> m_forcesList = new List<NewForce>(); | 96 | private readonly List<NewForce> m_forcesList = new List<NewForce>(); |
93 | private short m_updateCount; | 97 | private short m_updateCount; |
94 | private uint m_requestedSitTargetID; | 98 | private uint m_requestedSitTargetID; |
95 | private UUID m_requestedSitTargetUUID = UUID.Zero; | 99 | private UUID m_requestedSitTargetUUID = UUID.Zero; |
100 | private SendCourseLocationsMethod m_sendCourseLocationsMethod; | ||
96 | 101 | ||
97 | private bool m_startAnimationSet; | 102 | private bool m_startAnimationSet; |
98 | 103 | ||
@@ -616,6 +621,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
616 | 621 | ||
617 | private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) | 622 | private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) |
618 | { | 623 | { |
624 | m_sendCourseLocationsMethod = SendCoarseLocationsDefault; | ||
619 | CreateSceneViewer(); | 625 | CreateSceneViewer(); |
620 | m_regionHandle = reginfo.RegionHandle; | 626 | m_regionHandle = reginfo.RegionHandle; |
621 | m_controllingClient = client; | 627 | m_controllingClient = client; |
@@ -2458,6 +2464,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
2458 | 2464 | ||
2459 | public void SendCoarseLocations() | 2465 | public void SendCoarseLocations() |
2460 | { | 2466 | { |
2467 | SendCourseLocationsMethod d = m_sendCourseLocationsMethod; | ||
2468 | if (d != null) | ||
2469 | { | ||
2470 | d.Invoke(m_scene.RegionInfo.originRegionID, this); | ||
2471 | } | ||
2472 | } | ||
2473 | |||
2474 | public void SetSendCourseLocationMethod(SendCourseLocationsMethod d) | ||
2475 | { | ||
2476 | if (d != null) | ||
2477 | m_sendCourseLocationsMethod = d; | ||
2478 | } | ||
2479 | |||
2480 | public void SendCoarseLocationsDefault(UUID sceneId, ScenePresence p) | ||
2481 | { | ||
2461 | m_perfMonMS = Environment.TickCount; | 2482 | m_perfMonMS = Environment.TickCount; |
2462 | 2483 | ||
2463 | List<Vector3> CoarseLocations = new List<Vector3>(); | 2484 | List<Vector3> CoarseLocations = new List<Vector3>(); |
@@ -3302,6 +3323,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3302 | { | 3323 | { |
3303 | Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture(); | 3324 | Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture(); |
3304 | DefaultTexture = textu.GetBytes(); | 3325 | DefaultTexture = textu.GetBytes(); |
3326 | |||
3305 | } | 3327 | } |
3306 | 3328 | ||
3307 | public class NewForce | 3329 | public class NewForce |
@@ -3431,6 +3453,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3431 | Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture(); | 3453 | Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture(); |
3432 | DefaultTexture = textu.GetBytes(); | 3454 | DefaultTexture = textu.GetBytes(); |
3433 | } | 3455 | } |
3456 | m_sendCourseLocationsMethod = SendCoarseLocationsDefault; | ||
3434 | CreateSceneViewer(); | 3457 | CreateSceneViewer(); |
3435 | } | 3458 | } |
3436 | 3459 | ||
diff --git a/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs b/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs index 2ed177c..8904461 100644 --- a/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs +++ b/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs | |||
@@ -90,31 +90,16 @@ namespace OpenSim.Services.AuthenticationService | |||
90 | throw new Exception("Could not find a storage interface in the given module"); | 90 | throw new Exception("Could not find a storage interface in the given module"); |
91 | } | 91 | } |
92 | 92 | ||
93 | public virtual byte[] GetPublicKey() | ||
94 | { | ||
95 | return new byte[0]; | ||
96 | } | ||
97 | |||
98 | public bool Verify(UUID principalID, string token, int lifetime) | 93 | public bool Verify(UUID principalID, string token, int lifetime) |
99 | { | 94 | { |
100 | return m_Database.CheckToken(principalID, token, lifetime); | 95 | return m_Database.CheckToken(principalID, token, lifetime); |
101 | } | 96 | } |
102 | 97 | ||
103 | public bool VerifyEncrypted(byte[] cyphertext, byte[] key) | ||
104 | { | ||
105 | return false; | ||
106 | } | ||
107 | |||
108 | public virtual bool Release(UUID principalID, string token) | 98 | public virtual bool Release(UUID principalID, string token) |
109 | { | 99 | { |
110 | return m_Database.CheckToken(principalID, token, 0); | 100 | return m_Database.CheckToken(principalID, token, 0); |
111 | } | 101 | } |
112 | 102 | ||
113 | public virtual bool ReleaseEncrypted(byte[] cyphertext, byte[] key) | ||
114 | { | ||
115 | return false; | ||
116 | } | ||
117 | |||
118 | protected string GetToken(UUID principalID, int lifetime) | 103 | protected string GetToken(UUID principalID, int lifetime) |
119 | { | 104 | { |
120 | UUID token = UUID.Random(); | 105 | UUID token = UUID.Random(); |
diff --git a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs index 7fdbbf6..6c99b66 100644 --- a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs +++ b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs | |||
@@ -76,10 +76,5 @@ namespace OpenSim.Services.AuthenticationService | |||
76 | 76 | ||
77 | return String.Empty; | 77 | return String.Empty; |
78 | } | 78 | } |
79 | |||
80 | public byte[] AuthenticateEncrypted(byte[] cyphertext, byte[] key) | ||
81 | { | ||
82 | return new byte[0]; | ||
83 | } | ||
84 | } | 79 | } |
85 | } | 80 | } |
diff --git a/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs b/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs index 0118c91..8831c8a 100644 --- a/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs +++ b/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs | |||
@@ -56,10 +56,5 @@ namespace OpenSim.Services.AuthenticationService | |||
56 | { | 56 | { |
57 | return String.Empty; | 57 | return String.Empty; |
58 | } | 58 | } |
59 | |||
60 | public byte[] AuthenticateEncrypted(byte[] cyphertext, byte[] key) | ||
61 | { | ||
62 | return new byte[0]; | ||
63 | } | ||
64 | } | 59 | } |
65 | } | 60 | } |
diff --git a/OpenSim/Services/Connectors/User/UserServiceConnector.cs b/OpenSim/Services/Connectors/User/UserServiceConnector.cs index fb03844..d418938 100644 --- a/OpenSim/Services/Connectors/User/UserServiceConnector.cs +++ b/OpenSim/Services/Connectors/User/UserServiceConnector.cs | |||
@@ -39,7 +39,7 @@ using OpenMetaverse; | |||
39 | 39 | ||
40 | namespace OpenSim.Services.Connectors | 40 | namespace OpenSim.Services.Connectors |
41 | { | 41 | { |
42 | public class UserServicesConnector : IUserAccountDataService | 42 | public class UserServicesConnector : IUserAccountService |
43 | { | 43 | { |
44 | private static readonly ILog m_log = | 44 | private static readonly ILog m_log = |
45 | LogManager.GetLogger( | 45 | LogManager.GetLogger( |
@@ -81,153 +81,34 @@ namespace OpenSim.Services.Connectors | |||
81 | m_ServerURI = serviceURI; | 81 | m_ServerURI = serviceURI; |
82 | } | 82 | } |
83 | 83 | ||
84 | public UserAccountData GetUserAccountData(UUID scopeID, string firstName, string lastName) | 84 | public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName) |
85 | { | 85 | { |
86 | string uri = m_ServerURI + "/users/"; | 86 | return null; |
87 | UserAccountData data = new UserAccountData(); | ||
88 | data.FirstName = firstName; | ||
89 | data.LastName = lastName; | ||
90 | data.ScopeID = scopeID; | ||
91 | data.UserID = UUID.Zero; | ||
92 | |||
93 | try | ||
94 | { | ||
95 | data = SynchronousRestObjectRequester. | ||
96 | MakeRequest<UserAccountData, UserAccountData>("POST", uri, data); | ||
97 | } | ||
98 | catch (Exception e) | ||
99 | { | ||
100 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
101 | return null; | ||
102 | } | ||
103 | |||
104 | if (data.UserID == UUID.Zero) | ||
105 | return null; | ||
106 | |||
107 | return data; | ||
108 | } | 87 | } |
109 | 88 | ||
110 | public UserAccountData GetUserAccountData(UUID scopeID, UUID userID) | 89 | public UserAccount GetUserAccount(UUID scopeID, UUID userID) |
111 | { | 90 | { |
112 | string uri = m_ServerURI + "/users/"; | 91 | return null; |
113 | UserAccountData data = new UserAccountData(); | ||
114 | data.FirstName = String.Empty; | ||
115 | data.LastName = String.Empty; | ||
116 | data.ScopeID = scopeID; | ||
117 | data.UserID = userID; | ||
118 | |||
119 | try | ||
120 | { | ||
121 | data = SynchronousRestObjectRequester. | ||
122 | MakeRequest<UserAccountData, UserAccountData>("POST", uri, data); | ||
123 | } | ||
124 | catch (Exception e) | ||
125 | { | ||
126 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
127 | return null; | ||
128 | } | ||
129 | |||
130 | if (data.UserID == UUID.Zero) | ||
131 | return null; | ||
132 | |||
133 | return data; | ||
134 | } | 92 | } |
135 | 93 | ||
136 | public bool SetHomePosition(UserAccountData data, UUID regionID, UUID regionSecret) | 94 | public bool SetHomePosition(UserAccount data, UUID regionID, UUID regionSecret) |
137 | { | 95 | { |
138 | string uri = m_ServerURI + "/user/"; | 96 | return false; |
139 | bool result = false; | ||
140 | |||
141 | UserAccountDataMessage msg = new UserAccountDataMessage(); | ||
142 | |||
143 | msg.Data = data; | ||
144 | msg.RegionID = regionID; | ||
145 | msg.RegionSecret = regionSecret; | ||
146 | |||
147 | try | ||
148 | { | ||
149 | result = SynchronousRestObjectRequester. | ||
150 | MakeRequest<UserAccountDataMessage, bool>("POST", uri, msg); | ||
151 | } | ||
152 | catch (Exception e) | ||
153 | { | ||
154 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
155 | return false; | ||
156 | } | ||
157 | |||
158 | return result; | ||
159 | } | 97 | } |
160 | 98 | ||
161 | public bool SetUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) | 99 | public bool SetUserAccount(UserAccount data, UUID principalID, string token) |
162 | { | 100 | { |
163 | string uri = m_ServerURI + "/user/"; | 101 | return false; |
164 | bool result = false; | ||
165 | |||
166 | UserAccountDataMessage msg = new UserAccountDataMessage(); | ||
167 | |||
168 | msg.Data = data; | ||
169 | msg.PrincipalID = principalID; | ||
170 | msg.SessionID = sessionID; | ||
171 | |||
172 | try | ||
173 | { | ||
174 | result = SynchronousRestObjectRequester. | ||
175 | MakeRequest<UserAccountDataMessage, bool>("POST", uri, msg); | ||
176 | } | ||
177 | catch (Exception e) | ||
178 | { | ||
179 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
180 | return false; | ||
181 | } | ||
182 | |||
183 | return result; | ||
184 | } | 102 | } |
185 | 103 | ||
186 | public bool CreateUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) | 104 | public bool CreateUserAccount(UserAccount data, UUID principalID, string token) |
187 | { | 105 | { |
188 | string uri = m_ServerURI + "/newuser/"; | 106 | return false; |
189 | bool result = false; | ||
190 | |||
191 | UserAccountDataMessage msg = new UserAccountDataMessage(); | ||
192 | |||
193 | msg.Data = data; | ||
194 | msg.PrincipalID = principalID; | ||
195 | msg.SessionID = sessionID; | ||
196 | |||
197 | try | ||
198 | { | ||
199 | result = SynchronousRestObjectRequester. | ||
200 | MakeRequest<UserAccountDataMessage, bool>("POST", uri, msg); | ||
201 | } | ||
202 | catch (Exception e) | ||
203 | { | ||
204 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
205 | return false; | ||
206 | } | ||
207 | |||
208 | return result; | ||
209 | } | 107 | } |
210 | 108 | ||
211 | public List<UserAccountData> GetUserAccountData(UUID scopeID, string query) | 109 | public List<UserAccount> GetUserAccount(UUID scopeID, string query) |
212 | { | 110 | { |
213 | string uri = m_ServerURI + "/userlist/"; | 111 | return null; |
214 | UserAccountData data = new UserAccountData(); | ||
215 | data.FirstName = query; | ||
216 | data.ScopeID = scopeID; | ||
217 | List<UserAccountData> result; | ||
218 | |||
219 | try | ||
220 | { | ||
221 | result = SynchronousRestObjectRequester. | ||
222 | MakeRequest<UserAccountData, List<UserAccountData>>("POST", uri, data); | ||
223 | } | ||
224 | catch (Exception e) | ||
225 | { | ||
226 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
227 | return null; | ||
228 | } | ||
229 | |||
230 | return result; | ||
231 | } | 112 | } |
232 | } | 113 | } |
233 | } | 114 | } |
diff --git a/OpenSim/Services/Interfaces/IAuthenticationService.cs b/OpenSim/Services/Interfaces/IAuthenticationService.cs index b448a14..9225773 100644 --- a/OpenSim/Services/Interfaces/IAuthenticationService.cs +++ b/OpenSim/Services/Interfaces/IAuthenticationService.cs | |||
@@ -39,39 +39,12 @@ namespace OpenSim.Services.Interfaces | |||
39 | public interface IAuthenticationService | 39 | public interface IAuthenticationService |
40 | { | 40 | { |
41 | ////////////////////////////////////////////////////// | 41 | ////////////////////////////////////////////////////// |
42 | // PKI Zone! | ||
43 | // | ||
44 | // HG2 authentication works by using a cryptographic | ||
45 | // exchange. | ||
46 | // This method must provide a public key, the other | ||
47 | // crypto methods must understand hoow to deal with | ||
48 | // messages encrypted to it. | ||
49 | // | ||
50 | // If the public key is of zero length, you will | ||
51 | // get NO encryption and NO security. | ||
52 | // | ||
53 | // For non-HG installations, this is not relevant | ||
54 | // | ||
55 | // Implementors who are not using PKI can treat the | ||
56 | // cyphertext as a string and provide a zero-length | ||
57 | // key. Encryptionless implementations will not | ||
58 | // interoperate with implementations using encryption. | ||
59 | // If one side uses encryption, both must do so. | ||
60 | // | ||
61 | byte[] GetPublicKey(); | ||
62 | |||
63 | ////////////////////////////////////////////////////// | ||
64 | // Authentication | 42 | // Authentication |
65 | // | 43 | // |
66 | // These methods will return a token, which can be used to access | 44 | // These methods will return a token, which can be used to access |
67 | // various services. | 45 | // various services. |
68 | // | 46 | // |
69 | // The encrypted versions take the received cyphertext and | ||
70 | // the public key of the peer, which the connector must have | ||
71 | // obtained using a remote GetPublicKey call. | ||
72 | // | ||
73 | string Authenticate(UUID principalID, string password, int lifetime); | 47 | string Authenticate(UUID principalID, string password, int lifetime); |
74 | byte[] AuthenticateEncrypted(byte[] cyphertext, byte[] key); | ||
75 | 48 | ||
76 | ////////////////////////////////////////////////////// | 49 | ////////////////////////////////////////////////////// |
77 | // Verification | 50 | // Verification |
@@ -81,12 +54,7 @@ namespace OpenSim.Services.Interfaces | |||
81 | // Tokens expire after 30 minutes and can be refreshed by | 54 | // Tokens expire after 30 minutes and can be refreshed by |
82 | // re-verifying. | 55 | // re-verifying. |
83 | // | 56 | // |
84 | // If encrypted authentication was used, encrypted verification | ||
85 | // must be used to refresh. Unencrypted verification is still | ||
86 | // performed, but doesn't refresh token lifetime. | ||
87 | // | ||
88 | bool Verify(UUID principalID, string token, int lifetime); | 57 | bool Verify(UUID principalID, string token, int lifetime); |
89 | bool VerifyEncrypted(byte[] cyphertext, byte[] key); | ||
90 | 58 | ||
91 | ////////////////////////////////////////////////////// | 59 | ////////////////////////////////////////////////////// |
92 | // Teardown | 60 | // Teardown |
@@ -95,11 +63,7 @@ namespace OpenSim.Services.Interfaces | |||
95 | // invalidates it and it can not subsequently be used | 63 | // invalidates it and it can not subsequently be used |
96 | // or refreshed. | 64 | // or refreshed. |
97 | // | 65 | // |
98 | // Tokens created by encrypted authentication must | ||
99 | // be returned by encrypted release calls; | ||
100 | // | ||
101 | bool Release(UUID principalID, string token); | 66 | bool Release(UUID principalID, string token); |
102 | bool ReleaseEncrypted(byte[] cyphertext, byte[] key); | ||
103 | 67 | ||
104 | ////////////////////////////////////////////////////// | 68 | ////////////////////////////////////////////////////// |
105 | // Grid | 69 | // Grid |
diff --git a/OpenSim/Services/Interfaces/IUserService.cs b/OpenSim/Services/Interfaces/IUserService.cs index 35254a1..92bd8ef 100644 --- a/OpenSim/Services/Interfaces/IUserService.cs +++ b/OpenSim/Services/Interfaces/IUserService.cs | |||
@@ -30,13 +30,13 @@ using OpenMetaverse; | |||
30 | 30 | ||
31 | namespace OpenSim.Services.Interfaces | 31 | namespace OpenSim.Services.Interfaces |
32 | { | 32 | { |
33 | public class UserAccountData | 33 | public class UserAccount |
34 | { | 34 | { |
35 | public UserAccountData() | 35 | public UserAccount() |
36 | { | 36 | { |
37 | } | 37 | } |
38 | 38 | ||
39 | public UserAccountData(UUID userID, UUID homeRegionID, float homePositionX, | 39 | public UserAccount(UUID userID, UUID homeRegionID, float homePositionX, |
40 | float homePositionY, float homePositionZ, float homeLookAtX, | 40 | float homePositionY, float homePositionZ, float homeLookAtX, |
41 | float homeLookAtY, float homeLookAtZ) | 41 | float homeLookAtY, float homeLookAtZ) |
42 | { | 42 | { |
@@ -78,41 +78,26 @@ namespace OpenSim.Services.Interfaces | |||
78 | 78 | ||
79 | }; | 79 | }; |
80 | 80 | ||
81 | public class UserAccountDataMessage | 81 | public interface IUserAccountService |
82 | { | 82 | { |
83 | public UserAccountData Data; | 83 | UserAccount GetUserAccount(UUID scopeID, UUID userID); |
84 | 84 | UserAccount GetUserAccount(UUID scopeID, string FirstName, string LastName); | |
85 | // Set to the region's ID and secret when updating home location | ||
86 | // | ||
87 | public UUID RegionID; | ||
88 | public UUID RegionSecret; | ||
89 | |||
90 | // Set to the auth info of the user requesting creation/update | ||
91 | // | ||
92 | public UUID PrincipalID; | ||
93 | public UUID SessionID; | ||
94 | }; | ||
95 | |||
96 | public interface IUserAccountDataService | ||
97 | { | ||
98 | UserAccountData GetUserAccountData(UUID scopeID, UUID userID); | ||
99 | UserAccountData GetUserAccountData(UUID scopeID, string FirstName, string LastName); | ||
100 | // Returns the list of avatars that matches both the search | 85 | // Returns the list of avatars that matches both the search |
101 | // criterion and the scope ID passed | 86 | // criterion and the scope ID passed |
102 | // | 87 | // |
103 | List<UserAccountData> GetUserAccountData(UUID scopeID, string query); | 88 | List<UserAccount> GetUserAccount(UUID scopeID, string query); |
104 | 89 | ||
105 | 90 | ||
106 | // This will set only the home region portion of the data! | 91 | // This will set only the home region portion of the data! |
107 | // Can't be used to set god level, flags, type or change the name! | 92 | // Can't be used to set god level, flags, type or change the name! |
108 | // | 93 | // |
109 | bool SetHomePosition(UserAccountData data, UUID RegionID, UUID RegionSecret); | 94 | bool SetHomePosition(UserAccount data, UUID RegionID, UUID RegionSecret); |
110 | 95 | ||
111 | // Update all updatable fields | 96 | // Update all updatable fields |
112 | // | 97 | // |
113 | bool SetUserAccountData(UserAccountData data, UUID PrincipalID, UUID SessionID); | 98 | bool SetUserAccount(UserAccount data, UUID PrincipalID, string token); |
114 | 99 | ||
115 | // Creates a user data record | 100 | // Creates a user data record |
116 | bool CreateUserAccountData(UserAccountData data, UUID PrincipalID, UUID SessionID); | 101 | bool CreateUserAccount(UserAccount data, UUID PrincipalID, string token); |
117 | } | 102 | } |
118 | } | 103 | } |
diff --git a/OpenSim/Services/UserService/UserService.cs b/OpenSim/Services/UserService/UserService.cs index 78793657..e8b9fc3 100644 --- a/OpenSim/Services/UserService/UserService.cs +++ b/OpenSim/Services/UserService/UserService.cs | |||
@@ -35,39 +35,39 @@ using OpenMetaverse; | |||
35 | 35 | ||
36 | namespace OpenSim.Services.UserAccountService | 36 | namespace OpenSim.Services.UserAccountService |
37 | { | 37 | { |
38 | public class UserAccountService : UserAccountServiceBase, IUserAccountDataService | 38 | public class UserAccountService : UserAccountServiceBase, IUserAccountService |
39 | { | 39 | { |
40 | public UserAccountService(IConfigSource config) : base(config) | 40 | public UserAccountService(IConfigSource config) : base(config) |
41 | { | 41 | { |
42 | } | 42 | } |
43 | 43 | ||
44 | public UserAccountData GetUserAccountData(UUID scopeID, string firstName, | 44 | public UserAccount GetUserAccount(UUID scopeID, string firstName, |
45 | string lastName) | 45 | string lastName) |
46 | { | 46 | { |
47 | return null; | 47 | return null; |
48 | } | 48 | } |
49 | 49 | ||
50 | public UserAccountData GetUserAccountData(UUID scopeID, UUID userID) | 50 | public UserAccount GetUserAccount(UUID scopeID, UUID userID) |
51 | { | 51 | { |
52 | return null; | 52 | return null; |
53 | } | 53 | } |
54 | 54 | ||
55 | public bool SetHomePosition(UserAccountData data, UUID regionID, UUID regionSecret) | 55 | public bool SetHomePosition(UserAccount data, UUID regionID, UUID regionSecret) |
56 | { | 56 | { |
57 | return false; | 57 | return false; |
58 | } | 58 | } |
59 | 59 | ||
60 | public bool SetUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) | 60 | public bool SetUserAccount(UserAccount data, UUID principalID, string token) |
61 | { | 61 | { |
62 | return false; | 62 | return false; |
63 | } | 63 | } |
64 | 64 | ||
65 | public bool CreateUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) | 65 | public bool CreateUserAccount(UserAccount data, UUID principalID, string token) |
66 | { | 66 | { |
67 | return false; | 67 | return false; |
68 | } | 68 | } |
69 | 69 | ||
70 | public List<UserAccountData> GetUserAccountData(UUID scopeID, | 70 | public List<UserAccount> GetUserAccount(UUID scopeID, |
71 | string query) | 71 | string query) |
72 | { | 72 | { |
73 | return null; | 73 | return null; |
diff --git a/OpenSim/Services/UserService/UserServiceBase.cs b/OpenSim/Services/UserService/UserServiceBase.cs index c982c1a..fea8b01 100644 --- a/OpenSim/Services/UserService/UserServiceBase.cs +++ b/OpenSim/Services/UserService/UserServiceBase.cs | |||
@@ -36,7 +36,7 @@ namespace OpenSim.Services.UserAccountService | |||
36 | { | 36 | { |
37 | public class UserAccountServiceBase: ServiceBase | 37 | public class UserAccountServiceBase: ServiceBase |
38 | { | 38 | { |
39 | protected IUserDataPlugin m_Database = null; | 39 | protected IUserAccountData m_Database = null; |
40 | 40 | ||
41 | public UserAccountServiceBase(IConfigSource config) : base(config) | 41 | public UserAccountServiceBase(IConfigSource config) : base(config) |
42 | { | 42 | { |
@@ -53,12 +53,12 @@ namespace OpenSim.Services.UserAccountService | |||
53 | string connString = userConfig.GetString("ConnectionString", | 53 | string connString = userConfig.GetString("ConnectionString", |
54 | String.Empty); | 54 | String.Empty); |
55 | 55 | ||
56 | m_Database = LoadPlugin<IUserDataPlugin>(dllName); | 56 | string realm = userConfig.GetString("Realm", "users"); |
57 | |||
58 | m_Database = LoadPlugin<IUserAccountData>(dllName, new Object[] {connString, realm}); | ||
57 | 59 | ||
58 | if (m_Database == null) | 60 | if (m_Database == null) |
59 | throw new Exception("Could not find a storage interface in the given module"); | 61 | throw new Exception("Could not find a storage interface in the given module"); |
60 | |||
61 | m_Database.Initialise(connString); | ||
62 | } | 62 | } |
63 | } | 63 | } |
64 | } | 64 | } |
diff --git a/bin/OpenSim.Server.ini.example b/bin/OpenSim.Server.ini.example index 545d6ce..5696f07 100644 --- a/bin/OpenSim.Server.ini.example +++ b/bin/OpenSim.Server.ini.example | |||
@@ -60,3 +60,13 @@ StorageProvider = "OpenSim.Data.MySQL.dll" | |||
60 | ConnectionString = "Data Source=localhost;Database=grid;User ID=grid;Password=grid;" | 60 | ConnectionString = "Data Source=localhost;Database=grid;User ID=grid;Password=grid;" |
61 | ; Realm = "auth" | 61 | ; Realm = "auth" |
62 | 62 | ||
63 | ; * This is the new style user service. | ||
64 | ; * "Realm" is the table that is used for user lookup. | ||
65 | ; * It defaults to "users", which uses the legacy tables | ||
66 | ; * | ||
67 | [UserAccountService] | ||
68 | AuthenticationServiceModule = "OpenSim.Services.UserService.dll:UserAccountService" | ||
69 | StorageProvider = "OpenSim.Data.MySQL.dll" | ||
70 | ConnectionString = "Data Source=localhost;Database=grid;User ID=grid;Password=grid;" | ||
71 | ; Realm = "users" | ||
72 | |||
diff --git a/bin/assets/AssetSets.xml b/bin/assets/AssetSets.xml index b80aa26..c13ea42 100644 --- a/bin/assets/AssetSets.xml +++ b/bin/assets/AssetSets.xml | |||
@@ -1,12 +1,4 @@ | |||
1 | <Nini> | 1 | <Nini> |
2 | <!-- You probably don't want to remove the OpenSim asset set | ||
3 | since it contains various default assets which are currently hardcoded | ||
4 | However, you can remove the corresponding inventory library in bin/inventory if you wish | ||
5 | --> | ||
6 | |||
7 | <Section Name="OpenSim Asset Set"> | ||
8 | <Key Name="file" Value="OpenSimAssetSet/OpenSimAssetSet.xml"/> | ||
9 | </Section> | ||
10 | 2 | ||
11 | <!-- New asset sets can be added as shown below --> | 3 | <!-- New asset sets can be added as shown below --> |
12 | 4 | ||
diff --git a/bin/assets/OpenSimAssetSet/4-tile2.jp2 b/bin/assets/OpenSimAssetSet/4-tile2.jp2 deleted file mode 100644 index 8c63104..0000000 --- a/bin/assets/OpenSimAssetSet/4-tile2.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/4-tile3.jp2 b/bin/assets/OpenSimAssetSet/4-tile3.jp2 deleted file mode 100644 index 7890364..0000000 --- a/bin/assets/OpenSimAssetSet/4-tile3.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/OpenSimAssetSet.xml b/bin/assets/OpenSimAssetSet/OpenSimAssetSet.xml deleted file mode 100644 index e16f0bd..0000000 --- a/bin/assets/OpenSimAssetSet/OpenSimAssetSet.xml +++ /dev/null | |||
@@ -1,54 +0,0 @@ | |||
1 | <Nini> | ||
2 | <!-- | ||
3 | <Section Name="Skin"> | ||
4 | <Key Name="assetID" Value="77c41e39-38f9-f75a-024e-585989bbabbb"/> | ||
5 | <Key Name="name" Value="Skin"/> | ||
6 | <Key Name="assetType" Value="13" /> | ||
7 | <Key Name="fileName" Value="base_skin.dat"/> | ||
8 | </Section> | ||
9 | <Section Name="Skin"> | ||
10 | <Key Name="assetID" Value="77c41e39-38f9-f75a-024e-585989bbabbc"/> | ||
11 | <Key Name="name" Value="Jim Skin"/> | ||
12 | <Key Name="assetType" Value="13" /> | ||
13 | <Key Name="fileName" Value="jim_skin.dat"/> | ||
14 | </Section> | ||
15 | <Section Name="Skin"> | ||
16 | <Key Name="assetID" Value="77c41e39-38f9-f75a-024e-585989bbabbd"/> | ||
17 | <Key Name="name" Value="Goblin Skin"/> | ||
18 | <Key Name="assetType" Value="13" /> | ||
19 | <Key Name="fileName" Value="goblin_skin.dat"/> | ||
20 | </Section> | ||
21 | <Section Name="Shape"> | ||
22 | <Key Name="assetID" Value="66c41e39-38f9-f75a-024e-585989bfab73"/> | ||
23 | <Key Name="name" Value="Shape"/> | ||
24 | <Key Name="assetType" Value="13" /> | ||
25 | <Key Name="fileName" Value="base_shape.dat"/> | ||
26 | </Section> | ||
27 | <Section Name="Shape"> | ||
28 | <Key Name="assetID" Value="66c41e39-38f9-f75a-024e-585989bfab74"/> | ||
29 | <Key Name="name" Value="Jim Shape"/> | ||
30 | <Key Name="assetType" Value="13" /> | ||
31 | <Key Name="fileName" Value="jim_shape.dat"/> | ||
32 | </Section> | ||
33 | <Section Name="Shape"> | ||
34 | <Key Name="assetID" Value="66c41e39-38f9-f75a-024e-585989bfab75"/> | ||
35 | <Key Name="name" Value="Little Goblin Shape"/> | ||
36 | <Key Name="assetType" Value="13" /> | ||
37 | <Key Name="fileName" Value="little_goblin_shape.dat"/> | ||
38 | </Section> | ||
39 | --> | ||
40 | <!-- | ||
41 | <Section Name="Shirt"> | ||
42 | <Key Name="assetID" Value="00000000-38f9-1111-024e-222222111110"/> | ||
43 | <Key Name="name" Value="Shirt"/> | ||
44 | <Key Name="assetType" Value="5" /> | ||
45 | <Key Name="fileName" Value="newshirt.dat"/> | ||
46 | </Section> | ||
47 | <Section Name="Pants"> | ||
48 | <Key Name="assetID" Value="00000000-38f9-1111-024e-222222111120"/> | ||
49 | <Key Name="name" Value="Pants"/> | ||
50 | <Key Name="assetType" Value="5" /> | ||
51 | <Key Name="fileName" Value="newpants.dat"/> | ||
52 | </Section> | ||
53 | --> | ||
54 | </Nini> | ||
diff --git a/bin/assets/OpenSimAssetSet/base_shape.dat b/bin/assets/OpenSimAssetSet/base_shape.dat deleted file mode 100644 index d9a361f..0000000 --- a/bin/assets/OpenSimAssetSet/base_shape.dat +++ /dev/null | |||
@@ -1,105 +0,0 @@ | |||
1 | LLWearable version 22 | ||
2 | Female Shape and Outfit 3 Shape | ||
3 | Created by system from avatar's appearance. | ||
4 | permissions 0 | ||
5 | { | ||
6 | base_mask 00000000 | ||
7 | owner_mask 00000000 | ||
8 | group_mask 00000000 | ||
9 | everyone_mask 00000000 | ||
10 | next_owner_mask 00000000 | ||
11 | creator_id 11111111-1111-0000-0000-000100bba000 | ||
12 | owner_id 11111111-1111-0000-0000-000100bba000 | ||
13 | last_owner_id 11111111-1111-0000-0000-000100bba000 | ||
14 | group_id 00000000-0000-0000-0000-000000000000 | ||
15 | } | ||
16 | sale_info 0 | ||
17 | { | ||
18 | sale_type not | ||
19 | sale_price 0 | ||
20 | } | ||
21 | type 0 | ||
22 | parameters 82 | ||
23 | 1 .21 | ||
24 | 2 -.5 | ||
25 | 4 -.11 | ||
26 | 5 -.1 | ||
27 | 6 -.3 | ||
28 | 7 -.4 | ||
29 | 8 -.5 | ||
30 | 10 .7 | ||
31 | 11 .34 | ||
32 | 12 -.5 | ||
33 | 13 0 | ||
34 | 14 .04 | ||
35 | 15 .58 | ||
36 | 17 .56 | ||
37 | 18 -.26 | ||
38 | 19 -.73 | ||
39 | 20 -.34 | ||
40 | 21 -.01 | ||
41 | 22 1 | ||
42 | 23 -.5 | ||
43 | 24 -.63 | ||
44 | 25 .44 | ||
45 | 27 .05 | ||
46 | 33 -.24 | ||
47 | 34 -.7 | ||
48 | 35 -.16 | ||
49 | 36 -.2 | ||
50 | 37 -.98 | ||
51 | 38 -.5 | ||
52 | 80 0 | ||
53 | 105 .07 | ||
54 | 155 -.22 | ||
55 | 157 0 | ||
56 | 185 -1 | ||
57 | 193 .86 | ||
58 | 196 -.74 | ||
59 | 505 .65 | ||
60 | 506 .12 | ||
61 | 507 -1.5 | ||
62 | 515 0 | ||
63 | 517 .16 | ||
64 | 518 .8 | ||
65 | 629 0 | ||
66 | 637 0 | ||
67 | 646 .4 | ||
68 | 647 1 | ||
69 | 649 .36 | ||
70 | 650 .85 | ||
71 | 652 .49 | ||
72 | 653 -1 | ||
73 | 656 0 | ||
74 | 659 .65 | ||
75 | 662 .5 | ||
76 | 663 0 | ||
77 | 664 0 | ||
78 | 665 0 | ||
79 | 675 -.15 | ||
80 | 676 .26 | ||
81 | 678 .28 | ||
82 | 682 .27 | ||
83 | 683 -.19 | ||
84 | 684 -.09 | ||
85 | 685 0 | ||
86 | 690 .45 | ||
87 | 692 .4 | ||
88 | 693 -0 | ||
89 | 753 -.5 | ||
90 | 756 -.08 | ||
91 | 758 .24 | ||
92 | 759 .6 | ||
93 | 760 .11 | ||
94 | 764 -.38 | ||
95 | 765 -.3 | ||
96 | 769 .42 | ||
97 | 773 .51 | ||
98 | 795 .16 | ||
99 | 796 .11 | ||
100 | 799 .36 | ||
101 | 841 0 | ||
102 | 842 -.82 | ||
103 | 879 0 | ||
104 | 880 0 | ||
105 | textures 0 | ||
diff --git a/bin/assets/OpenSimAssetSet/base_skin.dat b/bin/assets/OpenSimAssetSet/base_skin.dat deleted file mode 100644 index 854dd00..0000000 --- a/bin/assets/OpenSimAssetSet/base_skin.dat +++ /dev/null | |||
@@ -1,52 +0,0 @@ | |||
1 | LLWearable version 22 | ||
2 | Sexy - Female Skin | ||
3 | |||
4 | permissions 0 | ||
5 | { | ||
6 | base_mask 00000000 | ||
7 | owner_mask 00000000 | ||
8 | group_mask 00000000 | ||
9 | everyone_mask 00000000 | ||
10 | next_owner_mask 00000000 | ||
11 | creator_id 11111111-1111-0000-0000-000100bba000 | ||
12 | owner_id 11111111-1111-0000-0000-000100bba000 | ||
13 | last_owner_id 11111111-1111-0000-0000-000100bba000 | ||
14 | group_id 00000000-0000-0000-0000-000000000000 | ||
15 | } | ||
16 | sale_info 0 | ||
17 | { | ||
18 | sale_type not | ||
19 | sale_price 10 | ||
20 | } | ||
21 | type 1 | ||
22 | parameters 26 | ||
23 | 108 0 | ||
24 | 110 0 | ||
25 | 111 0 | ||
26 | 116 0 | ||
27 | 117 1 | ||
28 | 150 0 | ||
29 | 162 0 | ||
30 | 163 0 | ||
31 | 165 0 | ||
32 | 700 .01 | ||
33 | 701 .5 | ||
34 | 702 .26 | ||
35 | 703 0 | ||
36 | 704 0 | ||
37 | 705 .5 | ||
38 | 706 .6 | ||
39 | 707 0 | ||
40 | 708 0 | ||
41 | 709 0 | ||
42 | 710 0 | ||
43 | 711 .5 | ||
44 | 712 0 | ||
45 | 713 .7 | ||
46 | 714 0 | ||
47 | 715 0 | ||
48 | 775 0 | ||
49 | textures 3 | ||
50 | 0 00000000-0000-1111-9999-000000000012 | ||
51 | 5 00000000-0000-1111-9999-000000000010 | ||
52 | 6 00000000-0000-1111-9999-000000000011 | ||
diff --git a/bin/assets/OpenSimAssetSet/brick1_256.jp2 b/bin/assets/OpenSimAssetSet/brick1_256.jp2 deleted file mode 100644 index a632282..0000000 --- a/bin/assets/OpenSimAssetSet/brick1_256.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/brick2_256.jp2 b/bin/assets/OpenSimAssetSet/brick2_256.jp2 deleted file mode 100644 index efe0a9e..0000000 --- a/bin/assets/OpenSimAssetSet/brick2_256.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/brick_mono.jp2 b/bin/assets/OpenSimAssetSet/brick_mono.jp2 deleted file mode 100644 index b250960..0000000 --- a/bin/assets/OpenSimAssetSet/brick_mono.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/bricks.jp2 b/bin/assets/OpenSimAssetSet/bricks.jp2 deleted file mode 100644 index 6113881..0000000 --- a/bin/assets/OpenSimAssetSet/bricks.jp2 +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | OQ\0/\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0R\0\0\0\0\0\0\\\0#"ww\0w\0vo\0o\0ngLgLgdPPPEWWWad\0\0Kakadu-v4.2.1\0\n\0\0\0;q\0Հ,uP;Od13Q.H"i,g-uŇ߄}5 ~H\\ J%IURZ"#:X&xI\0\\\\DK6{0g|aPY-66H8/j-)M04 m\n=&vxWgvr,l7HmaϏ9cqM>'!noj0oP,H4#?PHÇu ?cl2٤V~NCKRL-fѓNqF!CY$5#[7`DvBMܑݘxu`\0XUv)R6?0GzyodX ԉRb}\\95<.!uUCK]]+=uƔnh)hKe1|3l^:J_hzK>2wxo@#GCN:I+hlmD̹1Bp0K!\nE+Dy+Te\\\0h |GP LF\tq^ g] F=W=*%d8OEujOZw,(z=`Б2K,T۵SNfL4<@\t8fy̥#qW|}3V>Y8E@\0F>\06\0ut")pp+o-t$)7A\0GTY- (Tm*_%aR/Yh#CTsڦNE(Оn:N>0a}|`\nKu0pLdAݩۯa9Q3ѡj1 u*`,+UWkY,6-EI rhhg7w,H!Er'qBP2&VB2I\n,=?sb&[pCγ\0/Dsu#@S.j8nޤw̃!*X4Z՝ʌ̅dDٰEN`x\taGf>P$sϋ,!)yU2x;IJጘ6ʦ]gp~ \02t>("v~3[;i·w8rlზWg6}3Sk9Țw#Væ[?=ԖX" |34/x8s(Xk£s\nPeƭ[FwI֊G\nt.0>x6ObE<ZVR-LmyX%;bPwRcvߕE`{=L:k(,d+3>6Bv8SήǹR;˸0j}'3ޥ)4RlS&SoyV=YxvzVu>tqmy'DUG>wk=\08sǪ/,_`am!\t%'CehFK)qKGj7}4(>2uRץiRd'3e1fE`lp;B{d)d3?½سfHn1cQ_TXf]^]lg9 m\nKAxjL\0\t^N77ge*.ƥ\t!Zf-wsmr9CKNNTPEl|o}*\t$|AE%"q[Q0@WatWbCa6R 80B>jJ~\n~23Bb3.B@24^K (7RX9ݺ'1knj[%1~Fuke 07X`S#w:Q`tF#K+!:CյrII0wS݇oNC50HȎeާ\t+5% xR'q!0?.\n4Cֵ1RX5Z2Ǜhx ޤ"hUJ]}*@X}a~f=zL.\0#4V Kh)Mw_5w\\ReI:D-Phs\\9>ThVk=?kU f藱}Ȇq6@:7Oکzgl\tkPT\tvTy!qLA4 d7)T2_#:\0W%F>"#_O^ʇ!Z-}u\\,,<ZWOI@uk <<㥋0AGuUDU/Tdp8bOiu|[ӔWƙ7(O< ʝS[Dž>UdbcF>>mNX_ThG+0N+<ܱ#8~Юqe$O"M\t˯a6yEz =SotTG\\'|2p*YV)ˑ<egݐPA"TG2MNA`3buq$e[Fj::"\0~3(=4D%*1'}CZتj\n[}Is#ztJ[}IkXĪ橻kĩtחpcm)}ΊȓǍe/'2P2,hJ.7nXC~aʍyPE(F_dNX&1?F6(Lt8Hxl$'zU߇aEP|jLMKE`IeWWjG(gYL#("@ A! 5'Z"ɨ"--oWO#Uߏ~?ی+tíP ⽘GJ(\tDq쬋=jc%)/йL<6$/Y5)Fע`n dũilgbS?\nиW_HHBMk>I:c2<}KBJgh 95{<i3I)DxE:3W_gtl;W\n*kS(n,ـH+'5e6J$!]M\n9CsUB\tu7?Y3jwx=7zk""F[<Z~8F|e!2BcLTLhlRFmp09Šl>a4>5ea{Fkfo^7*8YXl#&'at~voyp_^;S{`(W8DGD?eh@dz 0+>`#WB\n5s[rL<,s^5x<3'vF\nf(\0ށeϝ5ܓf\0C]Pl\t M@vz^wx\0OQCdҨsøP:w[yg8ff"+g=\0x]wfx\0P@s~_D/A]|QB,HTn=L(). Ac-A:3@E^->AV%Tv]S;_(b=$wU"\nkؿs#cCFL"[\tD[ t̽쎬W/B]4Ҹh='~}lrotx08H˒&\0S\\OgM]Fa \0(iM&J\n|^F=)D 8Q`UYC>@y3ʄIfWh,O7 yZ^-{}2Zw ?t=ǀN(%\\_\tZWQQ٪bg9M_/IsRk21Vjm2,H4[t߸LP;aX9Ș|G+lyĮhd~\t ۟}虾W3ÇT=b!j;x\0ҪtwϦ|vGkOin= .\07aeD6,nL^X+~kH*[Ϊ6vE_Kb#4\0쐦4YEWĔmr[PZ{^f:]ON8Q0|V$J&7功d=D.i(5oh+Qа\tk-v20~\nX>\t4b!%rP2vv읔 ۊ>[]O*Sf~'fbl^]|-r/>UHd\04 {$T>_v8Lb\\v%Uq/(xs\tŊ]Hp% ȺUׇyN{4E,|^D'攆Kb:C?2iaVYM2X 0Q90NYq\\B=\0|GD5ǹY_WETe-,J\0jv}j;uΡS5\0ߔ16-R\0ТDtt"\nD#,pκ(oUkV>;5.f߈vN[wȡ\t<e6TTт9ҔW\0 0z8uRFpg:RqvNdgzXZ!sL#'{Ky^'+b@ʓE"s)0D<q~Iʙ<ozaSSe;(e1q7jyny2&w!O;F<m\\t^*BCAͬӠ̞sưqbC}kl'@ܺ.]z̓Y$6%Y;JQX_d61}w2h\t;O:sBuk~gw*;dqaGy0%l}E1=]@[]т 'M1zZ_.^uS<2\\'$I.{x5v#2fgVxbS:R|vAJp>ޡJ+KR9F vmN#W= x~ikkW<G-SJsձ\\PHhKXf>qPA^o5V/-@NT\nk-`]/#!(>Uh,V{6`t`WUf$ķ5Qlqlk}s/4{;}Jm\\)v]Py Y]uƝgXx\0F+P`CNO%Tz)ŀ@fiF;,r"UFւ@4D,S.L{e\\՚8\0P}^_ӃyYq]"'?s=_!"VC8\tƫ89VEr:U tNؼ\t NlphJ"3CMW;36$11]9HgqDR}/Cۡǩrw\t͢iT'! )+W"f|---+\\pۣv2vgT* >zy25\t?`w(FD+~ ޟBBc-}_ގYjKH+t/lYJ3=+vvSGoI/ u^q~X3)pBҠ{z\0iKK\0x\0iם`J,T$qޱv =PZ~gC\0=&Cu-亻(%G>_ڧߏ@|Ef`D: J>';_|.^\nP&%WcvۓR:v?RB4/2C%;i IL~/vR\t%V8U1اpœ9'َKtSS\tm$sS/|$?eC2gIw1Ǫ/RaL~l)HP4_6_SP|f=jwg7LAX\tc\00nt%tzr#4X]h/d8;&ο$2ƩiVQJ0\n{EùAGKl¥תm<!a\\@\0x)P߅ԴJH9&Sq`3oKͷ9\tQEsg XGs&֢HEeT$pP*5h;k~^g5v oGw95SrcfHvQr\\]Z'v81WX4d6EWY4S!xͯK4Ӝ N)'b~\0\\KȩOR-CЙ?er\0^{^L\06w=PQ{9-%L/u>7tVΓ%X&H"ȳòW̚ &Kb 'ml;%aҪ0Lg\\.ܪaw)T-(]$J=ȘL1\n;Y sr!>>dh0!O [%OEGh9\\&EыɆPB\0ktj=38h١@M^. NeWF=wo"5\0dg7ר|'{@reYFp!RnIq1ݜԈ L+NRV$?rZ1%$d(/@4 I|l |-?M{L2!K2|=7+, ބ{ .N{L{.\\,1,'#6XpDr^̜<p(mP$j0b:nmG[q);sj]i̯?ķaTwǭըʣM=M&_GRZP%oRr\00Uوg((U}\0o6z@`J=c`?o8d<V's-lmBBM\n6"%co+}ۣþDؠP8kExdm#|)lڜVGruJ x7\\ZUr~氞:Ք/:A'-?(f;LU^X\tSY2mCHubb;`w\tJEOAe\tE룂\t"HJͅo]xvbaz!P=Ȣ4{v,Nl)G0\t]kQO7/_kBt <8Bxa\tcy'!u&*iS-i"-n.܃;g`Cb`6G{b.Fq߹jf礦qיSt]!Xs"6\0lRUbWyn&z@yh3aGeVE#VۻPP,\tbchWVJ<}E* ԦP_PiF"زp(G\0TvѮJVˀP xI4`FS.bAxnT\\9ukn0Sш\0_%'s̀bD*Uѧ-ťkeە݈t3:A|]ZNq,`S{X~}hwcޅD}dcHjzؒAye\\Lk&J\nɑCfo :DN̤yp+>-\n)جX@8EhDCŗ\\olpǻ/3?Ҙ هcyƋ=EF.yf0mzþM΄T;$ܝrKjZ&Ar?h7_XiWIfem+y=G:Ɋ|Yz᧸5 U:kjB#:PB\0ɅM&iWp:Y`E\\ZQ%(LW?JE\\K 5.Fawa;y2r`1=sET<Ų4yvWv˨QcځzwHA&{BU!͚fOpZJ3(O3Aa9#F;CWA@1ٍ]?F0Ran}L_~\\.OH\nh>$O4$l_\n},]G./pAʲ(vIBb`MM*Mo.(\\D"9-ډ5uتSAydaX= K]G$ޓ@@}}%vYdW>\tƱFڥ?\n^ATE 9kV?,剩&lbÁ!C}rDbY_]L^-Q\\{R_M3S/Cʹxˤyb&I.auC*Jf*$آpqfթ#(N#_:}'mw\tB/&K*P(Em⺀+{vFhQw+UP{|l,߲4'BO!/`Pcl+pk6"{-09ߊB'֩힒ZѤԟTg\\+Cp!_sF<&etÌ8vaS6\nF[JG3.W~_syC<'&O/Ce RtĒ7!FX~\0[/~u-PWENiM$,>kAϔ]UVݣCaAyя-,_S&~\0lO>,@N|t{G\nW^/)`@wTsg(]n?і]6#o R[F3X5{扜W_f Z*Ro>ivt7elt/"W+y-l3|\tPt;@$+tXIOyewe{kʒe7Լ7vb,a8Ό3^| | )Ң)UK8pRpEEÓ|H+Yi廛tnPqқіיՆci#\0ݽDBłzHr-E![})HX)݈x "\0^kƿW%,\tPdC/;klō䚴/aTsC#`і5%pʻ]&v7mRX.|iΚ6\0,mǐ;W.j3[j"C\\(ysaޞK^\n7eP`4zL5N!яi 揑k,ٗ"ZI9lc/,?EmĮųД$q]w'!%Vd3qRYLW!oz"wj1z-'4bgUbYvn\\@\n`9JrҺ:DM0V\0ꪵ--U\0$?ZWI9LǓ:4`ST@ZoڞaK/xsa.k4`7e08]XѷՈ!}8Ψ3ۉ/@AYlŵwHF4-!IC.TDV'tXS7 غNXk_/#O:{d^Hghɿxqt^ޮUރMT=ob[17r"WI?ڲsU6D`"YEJL`ΛeO~~[ܜwbDplηxӌ\tֽ,OYD.z#yzl^(פG2^GG6us1YX`4tfYOT;NC{zP:ydaE~eiCi=y慝)W%MmgYRAr\nE+sE(tZW?\0ZMQc!;#SUaoْ=s-?lr\0n<dͱO-Vf&;8XT WՄ\t|R#O>P«8f0-)ƛi\nsppd\nǔ\0\tYPuKϟyk74?vP#F&?ځ-u1S6NV|昝!?o6`x#}050kf5 HD~;c5:lUB:uO0f5J_ UOEXuVxMIi#6N.g悹E.0M`rx[g?H~ *Sia0ЩUN:o.^EbK:7\\!(Ofl- s_mPhiҵ&]c xu`Cnxz/I7Bi\t9!Ft␕qt)iVw,b1Sl6w!I_Ľ>p? zr^Tb==`2gl4~9N>rs*1hʄK ktߣܝc4ݥ9yr}ܐEMߋ-=R˗OTCCa ]z ִV-Ԏ߂; \\`0;b\tV>Ƃu\toeچ\\-labg:0<mDLkb&H;+L^I)Q|on/VA4bߢ{^Q9"|lQ$T"F{!)_w}XqoR>tdA1ǺWoX<|:?dsvPTi($\\[!QkKճvcY?[I}N|Ω8#Ķf4ѣvTaRȉCwlxWt\\b (-wt힘049VNVR%5xpWX"@Ѓ6Ȯ}D,HH"ijb\tT&˜h;=7,rG1#)e\n1k4)b_\0E,wѸI՛u.>b©|XuZ'mwVs!N*5Or$@Za'L"?hNX+|/`E4wU" [\\ئU'.v4}nL027I2.Wu/[˃ EtAߥ@3C-swkӭrP8ix^i;beBB;}:}\tjq5"G0Mrɹ1Zi|ʁnYpC>$_J3Aj{i$4.x^fJA83㳒qfG#K۾4?w.c4t'Ґ_J\\/̊Χ2dC"7Іzty)`I.TJ̞XBF/QM:i@쬧v-@Rt2p?se]bۄtf)P娅w)?Qa%gJ4$:{;?*ol+O9>5ljꚽAiUh$;*<\tyV&cڑD}V&;DM-pTePFwgYRy5k۹\\Rir۽_IUjZo1`=Zh4\tu0<ޚ\095LwiIj{dB4~"E֜<B\tB sR;DmZkH&M$qEK\t˪SO,(ko9k tfT|f-` i]c;/EF"x]Tss:]i+7V4eBOc.:|khC[ScQF5?}FHp$/&<:MHay##G=V>b+QLBV8dž[dLd\0,ټZ(\0lBM1KSH0/KnIxeK8[<L+Qh/nɀ91Bw)[h9u_Q곖cBYF$)>Q佅!b\0tP.IƉyyV`\tР& CIm[o.)SI`@Dl@M5fcW5!Fdix 6'wefm} MRzYSk~4W_dIµٶ)RǖĢۀBoCf.@jWߌCC6'RvIRX8=YR-'ꇀuXNj&E@Ss$?WPpmHG阜?vnWrv հ(wcTET\t=`aP^ΑW3u\\2h:5#\\H-2-fc;zWGR%!xj˰7Nh\\Dyޔ;S/S V-'MwWQ\\:Fo\\qzC"E2@'<B:s31MԚkZ`/hRrrg?dk"&N\0˻Y4yD0BZTȎ`m:>lpV{xAcG<JޣI&VlQ 0f#8&Io8qT!rDC4<ǖ@T{kCBR)śѾgLp+0V(!]Q>H(7ML'Y&faWEE7"&w{kÅa\n3- ^hwZ.E0jn;'idaZ;jYMf[< !y\0KQG˳}^%̽Y䈗ڤeERE98T?+⺡uv\0CC^lWH0EY%q[~@E1iP\0C-2[Auw!/cBeX\\*5e%7=A7Ic|PN^UlʼnЖj'kt@F0ii80l+,$E?s+8<Pl;=j-\\C\n~x\ncauHwmYe8RT*@~|ɘ>v@ M|?RncZޭu4m5آhI%eƎSԜsf{c*;WR:?L/|^?m>}D5?\\hol<U.:2{`:$&8|RHl2bINVdy[;^|{J*樹?M9Qd\tpQڗ)lQE/=<6{?nv(?o>UcEnURYF6W=WYZ-Rx/ܯZl?@\\~P>*6!xf:~Gb2Ý湶L8۽I w@EP R&9s\\jY!lٖP[e~<5M?ZDT q\nYfj|_̪zEqPMӼZd.'`'?`NUP``\nae˛'XT\nc \0N_G(Tσ)7a2[fR|Y̙^͒~<v-{'}/$DY5"+Vi-Ex\t\0T{NzJAmqL\0ƋD<NjД<i!܁,raN/C"CCbOA\\|1`=\nEt2$qz/jWqظW8t>gp0-F&jPx5?ȸ].xʣ*]G>3EDvxSXR0+"GkxX'!YwAYڵB."`iӁzs%]?#Ea}ŧ52t</<kZZ==*Y6|+k\nUn*nvP!Fo/cB&]urQ@A];h;Vt\t{ˮy#7u2Mѓ CT"H:3Ŵ\\JY*ݾE%!v!(4u@Q?ބY9jQ|H\0DLW\0_Cxq;}'ߙ&Kl59~PɬO~m&+pXQ^^5fT_M/cn|,ʇubrGB6)U[i*]hƐɑ$gkK<sKuYPXZ/.ܮ\nv\\7&40JX8DGM"e'LjVa@H\\k__C30m8"4,UL-/mNo#V3Xh`bQ-4kX_jrB b@QxgǐGLl슾]ߘ"b/P}v_,jYCSv>`$;XJ8A.\th.s?kkָjj83eYlkVYK<oelԻQ(%![YqroR94w^8N)Mj!yVir!**cz|0ڭAgUMqr^Dž4O.hhXZyn8HY^#9ݗ@+TPe߈[=@ƐkP8~eBʼnDdk鶶Q):5T(a]~?JLqh&NLdƒ?a-4fteb!J&|<Gpd ;r=p5y;deFtXa\ta\t\\(Vٍ0\t[jionr=V755c}64V-²犧\t.]p:X/قKc[S\n=^I+U+\tnHC=rH1\tlT\t'=,E`҅\n\\\n!lT*Hyu5Y)eg< 6ڏ=&q[;6>+ǟ}.PݮT^/+VV{cb!T:x|֘4~xk]vEpl*htgq&jtRG6"y~r[rܯGTF7x֘Sч\\o,s]O\\'CZ@ܲ]G\th=Uioс.ab\\e]IX=$3#0;B\\=@ߖpOXt!+k\\gls[W!{C x߈47e~r\0h<n?aAFfhweN`S`:{QJ.C)FۖDeD,&V]3h=[gt 0Y S@!_A=N}#yOjc\0$U^If\0ш\\J@{hW\t.zXf+$C$\\^\t'#+揻T7lO´|j RZzRy<B(@!?X7Dﺸ5@\t쬤 7vg 6#\nohQg[pvNt7G!| k%idȀgl`F=m/Q:.va`@- 7n_DyٺkE{VJ%THAǓiqFr㙥?\to2vN iM>OV>G%]Hx"W\n[ys:cE|莏\0=_;{n2N.JL\\<:Jt<^pO]r5UF\nzmyAN!EfڻTPH*8|X^wb>8aBޡE,bM_cZ^2s1u7`K(OF`J'<qNs<Ψ1/\nt(@V hBN8vT2*gUд"9z5Q\t4\t1slݤ|kOڳf^_Ɋ`uq2+IyMiPwsoa?~|-6EgW]e$V^5ѼY0lJ>ZT\t8KaT)B3~ʓQ<б-1 RFXa0cGz\ta<,[69_: 9^VJ2z͍*s2dQkdZi)\n\n^M[B\n_G%o!nQ?sr?7-MS_5ddq1wDW|\ta\\Up|=I{q\0u7:?d.~jAy`>VUؖF4`H5PԾД*`f dO)fvR1ZݟL9K2jQTH^-jumMga[bTBp 7D]"ɺl'xKC1l[\\#wg-EwN /p2pyO};q!vCBs\nG+|D:i/vPmn"N\\=~\nE}]~۽B,{g-S.Y4OkSwQ&U35<{%,\\Gi@o(\tԓ"ODGnd[Gc3!W!InՆ\04tDtb]Qp+yٍͿ^\n=3?nK9jRCpC{<v.lKCkpRʘ)쐂BYc9N=W>f%.tKLn^E3@,6h` kJ9{4:a>7M.{|*f5T>24+^͒ZO^oMJPaeWvyF*Ɇ< Rt4E6ݯb䩋Yl,) \nfy_"Yg~{<2e?TfbpMNwc ިKYw(ꡉeg6zň+íMyDlcָTZS-PgȄ\\u4ɔD[5zv:[;)__@¡$@|Ώ+4[p@xTkc=3*TC,-*;~bɮx_[TLb;_Ӹ?@zre>6NCRzLϣ̳+|NT,+!?U9r3@X=m`"B-mVۢ .'mϼXí̖7P=/W|M*!\0MB\t&=I#$/ vkŠ߰l49?;/g}--nCt.6iLf!dI3Abi VH!0t,FjD)ЮVK]G{Z0f\0}j2,C'#!/?iҒ믞0Q~pLs+%E?kVvwFL`٦)}UρcdF1u/\t4ص/妧ˑ(Zl?anԂ=&`ٟ_~_f?E`*c;LHQԐ;˵А:L,pXy.-ueK5)'{]GJd8'̦sשaF#E0IqoB\0yv(72@eg< \t\\fYK+\\ܒe{T-h]7^ӫ p2D"1pyG6Vl&EͲ5#_]3\n|\n9B!\t'n:fkũ,Vz@\n|qP~8CAWN9v1/0w NCtMU_*`vr@hW̜p:/.Z@lYTV,Hێ]( F~iԶ{Eaˆ'߅ع|p\\Mǰuer!7$[k=I(RƺVlC<ȗmf$.c_mc\0o^iHZxRXwdW1|c{~,g@~TJY}LqN{VM}Jp뺥=;-C Em;B"Pě5f`tZoFOtI۶^ixk*ruVJ/em\n{=aJgM7\t[,HCLgs'NIl*E˺Ucvz ALS-/H21XSpD-]˛5h6Yah?vڷkmĔcu7xr>!Z#-a^''?6?{&|LCNֲ\0̭x7~ocAFU_`t~5[ϗh5ecl`ޕ\\'&VhzFr.X4x;ZԦJb-e:1n\0Rn!jr&s{54(Kl ~<'ׁҽ=KQ^ZJߵzJ'֍(,d8+LAډg+D$u=-.gmZa!^GXD*&TOM",Ur٥x6PŁbB=š;\n,^][Y+{eV|E+<kΐW]s̨XlSiø_8'yRBBKzWvnf, 0{xb_a*ۈE_YmwRݻA9LL5yh2H5T2U 30.;Inj_V͖4CDVn]#`j=2%154a#'htJӎ\\"Bʿ1m{j~.~*{uׂ;'Dz7U?F\08M<n\\Gh}bƠ}rT^ofsǍ)FoMo=mkZ<_z{,Pr>&7Xkꌡ> rApߘp{ihX G'lX2Rt&?p\tG];OK[{@wP mۗS9,i]9BH)K3 <sqhՅ[u,=Y_14B]C|ߛ^7m9ot'TS»]_V"xCb0eVSʽ3GdrTou:"|c5rO0\0Y'DldZ}5Vʺ1zmSoЎ\0$P"VUvƊ>a/S0̜o+C}[=[/l|\t, g=cz/TBJmdžLn?WdFqi|ZOdxL59'S-\nJs&ben!!-m?>@Q6x֩^@)X91bv9]?\t$儫?#[LVT/x5bR&Ҷޫyg13괝@\\-\\IHhįDJF Jn,9FIJϼf6vZ|#C4l儣`Ń2Wc|/Oc)@{8ysG#:ԣ !yOə܀v٬[UA?{5c\\FA'j.Rf>=D>V=ݥh>?G^y{pȂe3.Xp76*\\iy5.8p3tZC|H8͇ ke.|?$]$Ak֣F߀k"rN&mUji'63WKGZ uB %/= ݦ?ₚώ#=$R.C+GL; \\AƇt0CJwuPP皩ag,#@p0(%O#qG, ,WfPh\nEfDxz5"^ ua{{☹sf[LF:\0,q~5\0ږ`<EtMJ R1l]BK@@9 [Wz,\n1ti[S3e(VRKfsɁm]99HGv\0-tb?d.:W`稲muP4:q394|:8\00xՅ>TZP_\0[{\tZҀ4VPbEʮQOSosmNvpЭv\\\\Ki|=!}Ub_J[\\pbM%o"Fg!^L1r(Mʴ]qHf\n47M9iGVv0TϵU{|XZU\\zHoi`|te<MR|=xG#)?k9P[\tNNY?uN3M(%_^)Y=WzV_}DQmJ?>QhXtVlT\\v{$sKjOR뮴nCd{mU$3i`\\dΧWB9\n@v,Bʼ=::6I(c-\0`ȥ\n[V>6-^o?wi+EYZOs,ZY3<vFP(o6PI?lA6ODdAl <8YfFH0PSMFFDAdG.zWcUC-$-WHɃol?jsa0XjlJt}ra_m@nϬOB|@5ħ9^ݕӾ8!LHS\0bz)F&/ P\\US-YWR%.n{ rglj\n0@F^4-EfIPmXOW1F:}{lљ&sEaxQG[\\vt~2![\no}aGJ4\n0'pCCS3N1&D×Ȅ*ed5ȟQ37*'IFYsEOI"Ӻ@z P*k!H9u3H&.>#?by/8Ic /k/V4]u#:UWC"!"c=?\0ؓ1uK U//b'CCGČĨs`'d ZzN\no7\t<j?F/9ՠ{b\t*@"+θl .&_LT\\38v^}G>tKWz~lu7D-`'{%(T<a`F> sDsܕkJH]K2A(8\n ȲESr;IR!=xMT<CcaqfuSI肃`.7خa$Js6n\0J\n"m_cJܸ 5\\t(Mk/Pul(wCf(\\̵VN# D?*!ޕ4AWtBesBX(Cz)Or鉁SLo4{Z+0mQ2iJ<õg3&^G`OJ8+jy=mSMNgEmlw)(տj 7 \\މfNFN \0GJz'_tZE>9}%)ԯ()(QVI,dޚ) "،~P>fS'ɔw>Ml,DreϓNP\tuksvxF ȣL9\n&-)e6XLWrgURTHDaxul1'-ʵ4i$Mxl/{EXZApHTy<͕k64vE~r9 iٌDLR#⤗6?q͗X'TF>zU_)0t8 V:vhSBϗT)"8a:jS >:T.fH4gS55V7wˣyhCpa.2j\0密@lj?4Mq0-_1}گZ\tAcp´gexP@o$<x_ҞL'>\0S=zwWA_ |Sɳ;0@z_z5'{M<UI>cݸ}ɴAbT9rr[Pi'V9;H!d%SE7NiZP:pNg&/J݄YI+@oX3ITY5X~8}(0&vx?R4JP3ڕh~ͼ(whn w/aHU\\`(T<Wl|D&R@hX?.zm94R$GA3:åj?y%ZWťU7"q2(:Mq7LO;q{L'͙+;AWh2nix~3tt<V_f9G*^j}DsS_5F5Ajv|Ady=\t,2gRȏlnj~Va=8"<UMV;IAe""YRߒ4@S@yDA1qlK|Bð-P8n[:vzki&.s j;T,G0p!22YBQ,serwXE-fr0g)sl"2:*-QP6B腟נpC*84ݜHdO=A$/1Ww8Um@.ǝp]n\n#6sQFb]0j7\\|L=f;)J=R+Ue=pgjI!ڡ[;mqF(ds\n 0@s-4>6>$=Ba=\tvSR@,!m?%Mc@zK^tк{7nk\tp95\0U$i"c.ׂdXns}|}c7{NBmq'Sc [H.B2$7Li'&4Y., l$2^z,\tf IrTw95S(j,!\\S,t.|V=4ˈϪ1̝\0e+.ŀV)\0RR`YiG ,.%~4;U$oQ40e)(`wIJ'L]uiWH4`1g\nO]AS(yk tPEd{Wfv\t,!D^pT~_7 $ zfK3FkAf˳LPOз3L |^IȇT{@ U#^1?HϷ}ڭ%{):A0$@;Bg18\\Zش umw92.n;K4x5RDmRATp@H<S{T3(LůSv]ʈ3b'ղAA7AقC)ֆ2KBCx}EӰI2Dqm\nl7+7N<'tP>S hOL#}OYN:/l3v9[jj>~{ݞUyS5Sm\nIҊ\t١湭\\UU2Q^2Yyp|27Mٌa\tWނa4p@yah\n~Fؾe`85[R:hbEE^`LvcBg~6bf~Iȃ.f݊|z2Q@hh_*\0S(+!\0;z4`gh=\t)S@W),Vm):GZd!qWT+וD/B:W\\|%fx&\t|GV2ӕUKvSȒQaPpYswje*XaANAISAH[F`ɜ\tz$Xp' <R &L5[1mdLďےsQ+A=X~81BY=S~F ͊"Ȋ٢RPܺrSTliOھbֿ9.&BYۊdt]DıNLb!zIx伹sr$DCy|w1\\.xg4iyaQ:I kЊرgBwk{_ډi*AA01Mu]qk '/ɐmjG˳5.Va/YXc!l ˯ȝȎJrzm\0rFa}_I+{(:IRsk J"vhێÐrn\nWlq( NCF$ (8D\n:o5py\t%PYHosML-HY8!^V$A[4RJ6O;jP1u.fՇd5p>FVYVD+|$4k i=8}j%QbZXssƑ伸^LI:'! H,jه[%"ybCE]@bC>3h<+s$-o7]҅f,NJ찏q:oh~Y%\n~$p*)m;$l\\BE->) EMVuk( 6iq)D~*n\0r#o=QdhyVHO̙ROQ^r'\nN >q\ttf!hwβAGjhԡg_zXf]3SF-OVs-%1-c_\nZ-wF(W\n01?DAO_t%~^0"+<|A4L\nŪ:*iʌWto{*0({v*®_01\0.m]Lz(;-S)qМ7·fhyE*^;=OrO-`r뒹h>mKYBtdiG-!,ŲqdHEVb`'g{B@Xgo-Ljnz[oa&/')Ҫg?NxIB<U1iL@'"\\,@9mT/Ԣ-p&dN2`sCzMfKsÕ)Ͷۡ;^W-:r>JE{P\022 6t\twO>9{rv|8RbNnE39l?[l-2vwi^J3r0TX!b@Zt4\\<1wBu=.kYg]\tay0y~qhVƦf8~27'NXkED:1lBs\t&]zdȩr//W> igfk됎%pKrIjpMy0o|])|'9}QwF7,)1m~$rl[pۙar`t>ӹA%UX(+k'cat7vX[M\\@_7$HDi/{Љ`vP1f'`lD\0hCBmb3f#D;a/Oνܺ9y\\(03٘D9rB-5@'c-=ͼ -'Vڂb6qNM\\%Cx/62/y*ˈ<\\ԗWl@ahXKNX}7X'!_z\\wT<jL0Kb:1rIBp D' =$EjeK9g|\\q*%Y(iL^M>a4IFS_\t;Ԡp<D?jK0ddV7Ж{Yْ({GN$QȃY9ܔBzM`Ҟ 6$popӅٿ+ĉbmBT'L\0N-\tcg4HpÑT'n&0AOS(io2&#ۯ^\0.\n0hcp>csZJ.ye$zZ+Z= ۻmO\n3/#0fšM{^Otd؝bE?O?~@z+%jM7\tnIދh{_n<6Cx衦;j|lM0\0\nJ\t4v8H_*bE$xUMAKrR0ꐠ;A!RV?y46FvaEd_Pmjjۢc̸o3c,McnhF1<-F\\nJTNŚs9|#6I:o4++L<*kz+ZpߠOfBHtpsݦK3T|$ܝ*#Ir+nv|JwIbzx3VVfm9-wۺD\n\0:L=*J\0ŧL@.\tna»Pr%%8ͳ!]Lq<L=RIrpdD ~A<8\tӤ, \tsŝ(b\tFg\06y\n]3`/`4ZWBSaA^5FC s2B] RkSҦ}Y3%?F\t-r]&W6.=JX]5"gA>#gne2"5$@WpyJե\\t|{Vh8}(->.&ҋ<rB,zp\0@vFatQF?>Oϰ}kg|5\0.1k _dҥӺe|=`,_J{U9=/|1L##ތ+BΈMu5g5&F.}6a_[!E4Z XfAˡiNQvw\n-eofnXxbSNb]RӬCWg`s^sW+̿+H1D\n%LabiR,f趼1ӺN^Ef$yXx3Fx*}\0\\J[O϶iiD R(0aFիVe<<OQ)'s۬O)#3xїwk!OS&qAт(f<䩺#KRu6)ImLgB"m"e]xJ`HXe)Q,lˢT-56"uadD4:Fʂ'n1ozjAq"%W֤.Y,ԟpOsAZbA@SlLofg{\td\t4>+5\\QH[GPb\0\t8%4Lc&iAiO3YsW<c`9`jjߟug523+˙"2QRچg=w2i:</_bpYQa*G5斳!AUGBo>:E$bsIIZBF,t~cu) TLF+rA\0*bW=fcWLAZ_r pCI\tr=l%h/;A71{ķȏnk?Ga9mnBį~BJAM<7krVLE/7>6<dD)KORjyĜce@b\0Xy+!tl@FVhw FᗟB.Ethʱ~S@p͚Jn]4lk߮2J1ZXrarN\t?d;a\t^1 _D^k;Gj.j<# #r;ꗦ/2X,\\vB">Ҽ\t&Ou,] MUTDR6q5B:u}\\H:>`f3I*E-77[[ "@\\X/@PY2EQ**5X}e'G̓hSn9_\\C٠}k#q}PuB,]])HݗZy_h{>c\\b7ztgý2Crʥ;X̮3%߬mlqH$Lp1<a&K.o6>G~tm;KNN@wgbR"bQ{DV\020bq<:uj.\t Q7we:ÿ)2ңFȝ9JF?"FNPMeqל\\#*\tÑƎ7~N㟀W.QГBF|KS˽.SڵzW%Z* d7(0lb\\jXKs-Ḟ)U' EMVG#q1zOFC5_,V}J/Q1")ќ}$\t%=]̀WfCg2JZp0֨1&@vXp\nH[\npAQ3d3VyNSn_蘢l#8L|0q@\nSqEL\tER`\nFez@ip+z3&T]qHeA%llVT+sK[C9B3{=j&MF}4n: V3P<GچaQp?2yԼщ8jjxT7-.(s5ʼnʎ-t8E\t)J\0X`ȸxՠ=n?Q&gM"gAL'A!,DH%wb4 ÞIRTN))@GWW'10n'-l.q"@qې,:2Ð+yE٦ƪKMmc\nS/ɗM5" wߎPY5ꑥմk^;5R_+\04c\0.+΄.i R&]@t$<#`}}?mT1tWCIm4spfpܹ#֏|~-鋤!-uP1%R(b'4&D8Gcy&&=X`0vP7gi@Xͼahg>H=L8@y=g|>a=d!+,fv aUڠ^R^˱FziƥԉM44}7I={Kk|drw_\\EVNju\t5J8ُjKX=?v4{^4 lu#13l¬!w%D|~x-Dl3pD˂,*#XXuC I)\t^n.eP4KVlq@xӓ ZϛCˀwxE\n^vrf@Z5NZn&tI_GcU[j"ڲ1<~>7%PFUhS5>;1&bϢJRu%4_ug.#?౸U>{];i˴t{J,h:xcޚtwIաL!)Č@iUJIx,ƢdJgd oW E}lW^EP$fvFF3 [X[svP6!k3U.'n9-"Ty`+Hiz@=Ij:D͠*%T3]~8)=YoDbPfu\0jEm1ZТo0)(-ѽH:|id<xKp5-{^Uz"\tO/86SDQӣ\0$+6,^^uP9pZ`:ܹ+:Ow046鼿AyجUfI*F~O)ÁsEi[[sו-&D}y4rIMC&zD,IoS=l&|P6r5bFhz4l.F 4jùKa\tUۺ1"?̨vrmC[AG,16ĝA{:IB."I)*\tZ`?+v+'E_E$оHeÉs͐bm?učoW{Vn$:"+ f;Q1,L_0)BAK\nE<Hh#T(xXK'Ց2v^wA-OGoV*b7c {uGlW[A;-\\7KLZɇ[bt4cf|G_P|Ą"<D_!®\tm!ϰi,TĄBB/X^L\n7`0))p~1V6f)oq)=jApX3ʫ7/݉g4qq־v'RG8گ;BK=I֢p}%WSf%ۍfV#jMoAj4sXgת@$!GcOw7Nz`nO/fmEb\nur֠Hg0)r3rPw!)S\tH}hK^Qpfz}-bָ7ulXj#zCojacʱuJ \\_MO(vHI+ڃo.>l`^:H=rI Q~Α-?^ϖ~{_3ku(l .4`j"B=Y*v-rk#[W:E skn߯cee QJ&\nfg+luC^[\\k!<hg+*w/P{rJ]،S^JG& H~ՌӾLJ/CsNhRQV.G1|q rEB.G\\;2uصy{Q݁Ϗm?Nvan<2Me- st2$A8F7,T/?gUӣ\t\n|8ѢgkG]\t;_+17!P9 h!lg}uCTv匐xVTi\tkHlR$n\njא}`@I?H~ߒRsכ|"\0(Ȭ.~;D$*fw"yI\0>={ٜd4+Mωk\0CpFdtTd Va\t69ʠK(`3ᘪ0 ^lu-ÿG&%4>WK>"όKbΕHZahk}e!f.kta=?]PTAA^)_:lO\nVk=CvF"K90XH`rҚp`)ͨC"Phd'ډI4R<rpބQ.I* Pf*p,>ܦA*_43FTd|N+CDAq}t(kxE-^bګpBvӼ߫I\0\t5]?K6g)17OIuV/zکLugBrYjx"VQ69ZX"1kW@NT1#mr\\ם4ΦqA"I>VZ/3JHͥ'^`Wm4}?llh>!`p6cD;/B)hF@~Y0`T]\\:d=(?-JTo~%t~:='-nTPK9-Su0:Ƽc-FoqM$KFc(9(axr}8+%+Z?[i+5l)#DrxTB ^n삦'UDnhc8@&7tpllSl^O/NF$|%W\\fj1DGCTx'w!DJjPptM:j̅}et`yPC/#E;dp߇>.}.ЧBީZ5 nĂOagC7nKj[v\nQ29tz?}L҃d̐ å\\n\tх__& `pGa+OqAP{8EG2Ъ쪶|\0%+h1vE΅>t.IS#¢\nU;OzrW-\tkz䖒t](ӷ8|3\0U?\n'3|j;} e aYQmᇤ"bXfJk<RhSɍJMC?͝$lz/_|^(6@[N\\\tqcHeQ\\kEmj,Xž-G4sR-+qg&\0c?Lů|^)ӂKѽOzWHw6v\tt^cxmtDO3Ó1P.Eu]wԄ9'ݙ}J%س`J7>0H\t\0iQcO\\qSsa0m ;:aeEm\ta6PZB]K%\0zEcH"'̟^;ذnUUM.p\\;;{HL=}mVt+g5pϡ:\0<ǧ>WWUɥ}˜WTq.8`jb\n=1U\t0hGB(uwv*Mf$rBWf߁\tq\08/ǫE|e#sT9%!\0QďF)г_6>ZG%˗\0{.Aga(0NxgsƆVT=eh$ޫ*5:+eKHךi5U+Ԧ^ϸ),9%+-#rU@G/1,dyq4YFy<⍩WtB\\N0GhP`R*EY/NLj+IDҾgm/;t z ~G$4ˉ<b淭JfG^=8R&!WA$MUG9g>:R+r\t&ÅVaKxn6=$Gڶ|P(}x<CPWƠ>9Z_hEx52ސl\nZ\0}[7S($T{$g'*6=!a^9E%FW;[|ٺ(4X+)=\tn'J'Yr`~Nc\\ylEs')}2Sz\t9֚i30sNwI|%M[wLB.QK2dٕ%JEuK%\0\nh0ӕ8-eWX\\eLO!4ܒXRtw<0 = 23:ȾT)I\0RMEf'Ru$rpP!@<cߦ8?2gU9PɁ&2ﴀ;GҀB.+D>ѳVW.-u{n\n'\0\tCpB "j+Xk:TZT?6JR-\ni3sU\0O+2\\+ƬsZ={v<0݊Iu垅'qLO-1gM̤TȞ^6tp3Ѐm~ɭPYAQpV=Eq DjM"0ᕋg/|Ývȓ\tLGEZLX~A{P鉤!{]v-)[բ@Π\nd& #gq"]`rIN}vg8@#;kOM%7]Ta>rkue)|9ҼK]wɲ-dQ-%O{iRu@!NP%j˄&PfC,XYüUe}@M@/XFí;ڏ;v^zp\tߗ^ZBv_ވuR$@j,J<:+WTC`NeYO#|eG/T}AM}%(Ёeֲ>?\\dpx W.D5#\\r.II)^\\ˊxN5z4s.%U칪G#Ā/!~0M\nR:ds]Oc:bN)XXa\nbے7EXd&/z4!]ϭѬBV zzWFtkyVoo{+xKaLp.:WyaQSoR#x 6Mk@~e`Jō)tuEsezGY`s4NnBf`0?3;2;cq,DoEf']չEE\n}4ZvL:6\0$`F؉TLyPF 0jxu&\n\0@u}5VIG6*-O(زlGaBx7Ɠ(X0Xyo*E&?/ܗ<iWk%6=vu?`]xJ:*#pZ [l~Jd]|÷60I-<c7[j퇄i4xMH+o+[X-̫F]<W?8LԢ`\0c^U|J|{\0[ U*P(\0-Ӓ(1ٙ%蓼ב@#ݔM4a>wtj$7+ц p&ԤhΜ$USO>Ix5R.; $nmAB$#.,CZV0Tć|- AM3 J3h=Q)D6֑z[>{\t}qbWeE?SL\t̩%іY< myq[lB^`PIs䳑%W> 0D32~k=>-cH{moJaÆ)hv#Հ ¤.J&G8\\t:as#%w)lbII|n%P}0<Z%36cnB̓^IscU=_\tnw$jE{vv,&=4q":!~=Rus6.0FOpRw\nj H2"JoŽm[ wڜK{UHeExMDz7gs_\th}W\0\t_\t0JFdXCe'z+ZJ9چ=fP`ACM#|3}ě\0?e~ФAb 'Ro5c30~cdA݆=5A>?giu1캓?JT$\0:}ZSpY6ғ5XgK}noP?{a/,֘ПM,h"ye1qM?v/q[%0ʈMh@[ D4~[%Ў~F'u<R~>+Sq)x=.֤9\t#]\\o7J\\,<gn~JɒmA{y/xZ^h\\3{>^]@Nm 듹cu!z)ĹX@cVC"^์P\tECñ^V":Pa. Ⱥ"ۛܠeϤJoIkOC8IK;+PBg~,.I녣W(e)_x0j\0ڱ~w/n'XBQWNUa8/ݒ2/oV9o|)ӈ,gΫ>2:8>Q'>!6^zRp'Y0g ,<^PG"E?REnjLŸ? ⹈?p0\tkqirXxY+WO^?8+S\\,k"2ވe$0ʧ/ya0Q}</e&YyA.7采[ߑGR{'/Sم\nTxʦǸ!p'ߠC]>9-LbjLy6MпA/ytMGmcmbƜFb\08x"jଫhOn<M{g̫`r\nR\tr-מ(wxrEȽ8:38)4.ӥנ㏅&t=L9<y_#m.s\tp̬+@Q]r:zwؘ\\yN.{FݵXt;>+l/bC XO2BքpccCO\t?zmЂt|Ll{>92j~/CK`8כolVg6G6n|&,^ASx`P(s^hdIBojP!3Z!6B/ުl0E=fWhS$f=%Ÿ32P(pQU5iﺩVʍ8X f,q+2fOPȵ:2du$h?01TUifLMg5|>uI\0#{A'.;^̸m_TھMXB"4|&1Vor<b[Q:/VEV]RT%!*[(%yɱnT'_`\0qAHz 4B0l\0\\a~KuA;F8ݓ)\ts'Ax0m͙I;8'~rnJB ̙/7"jA#vPLv0d`&p^X9nkj`AW+apm7k?f<l.S/l>2ܸb\nύzهbvm1\03uףd}a`>s@Yc#ΡRbF7l) 5'*'8#<{n3oF8aW/ѦH|o# ($'#[\nXO.7!j!g,bӞS@cYK9=*J'{*Nʄ(Yl+ךAlܟXo~{%O($(pjj\0wD/Zn|0o9Q4V2':@ѸyhHf?>*t3{_{$V%$S>sY%v]q5#'CGv8-H\nqymV\\Z> ù?yeYk6)!RihX|!qt#tl^A%|]0^GtP_vZ%)֮N|KH\0D0WESrcMHCU/ݭ |\tL9wV;:;1Пb}4)\nSʱ#lEgxqŞbJ6+31-ͭd|}"CGikw)29Gqe8DT#O7dOO5ioXDexJI9*/gbW+Vx_4~2Z2O΄%@ANAW>V??V5ۣecG(!!!QP\tGǂu5IprIJو#u7@ ,0AĜPz")?܄b5{r-4MmRȧ%'>]4xejhs*oD2©6ޣpl_z=6gbSÉZ"ÇT/Ң/Wla֓HKU2FZ]嶀mE4\\%ulidzM\\.w@L8knלoxi$Y{ݎN+9/Z\n[+FBN1Ω@#~-+*x+8!_xB~$14 ~=/ 8%c[$qIGp#S(ࠖƜ^U!\0'qr#Uܦ.i:D^}8śMYj$;a7 +ͥdtlcSl@F~敪VB졗A\0z<ޏnw*:yc ~qXP#ḏ]}u b%+CKF2sZ~uEd6ZlAOnLWezabbts pؠtA詭d{ΛhAeھ&Z%[qlST&}Z0%?Xu<^݇KǸڷk):H=xgHn?07|'FoiX9,3gKAv/l/8i{s٢' vFkQ"2Xx=R_I)aAaqpQ\nȲl>0]lUf`PV>F|$\n-qIS Sh.{{S9".xLlW8FQ_+y+]hVKXEc&;=4]\0J/v\t>rnSZ9\0\n1`P&2G?cI(&͚e] P\0jUk"He{.nJ.m3?%'}-Lް]"rĉ~5~ِAO+RM]zeL6:=M1M*a褭5z;~&yO[jr}e^p2(rMHA,AirPB9p`t^F>$j{KxHjy1p9\t4Vė*s>2rܠ͐[\n\0\n*B7J\0l2(ƙ((kmg&k9j<s V8+]&?cT*Ԣh~K"&TGOU-d]GEL˶kz&Ckm'/8UhzA* v"[1xDN+lnF"M)^y>N'A%:0~ώEе'|ʕcyU67d&O^f3ȿ:_I[PE3PFO3%Qtf'j6Sp<Ԁpp!Y̼1;;Fdyr_k 8#BЌ߹9V\tR]ȎzefIT(pC wuYHxN)-l_Y}刽a\nJ5&>FDV'g?CgE_>w0#p6V.9$Cjr۰8\0N$u~ɢ.6.R|y1&Juta=fԡʱel`J}UZ2%mF1Cn41r{$\\Y@%3 Au`mnagCO=ז9CBu^8-DV\0 ^xdx3N4> &jyE(-"o"Z.D<m\0ߚ?6Չ v9D*R^Sz9n˵aLښbz%jqvı4a䍁nβ}T*Le-\\6iDu]j]dfI-iԼ1g_r]Uo{LJ+Iuׂx\0Bmֱ[l{C\n}Ђ[*\\$n; TfIޟ lKtfeS##LiyN<c8Evn*$rÔWt'8l$>c|op1n6&[Ty#['{06#LqkNOlRJj8%2憆7#~.>ALχW:\\JD;oyt,Dƙw{p?6uvx+KZᖀAWbYo6`6̠y͖xҖeřڔ>T^;\0i!4T[wCP3J>\nx;"\t`N}HiS'h;R^e2ĎY+7צ h臘߁n-MyO]n2_yBCbi蝂"'kdIOE!K733A@Y,Os$:~0g2HyCjOEg:Q|\\Wr@S;S~4̉ZJ[ԾSf@}\tbg@+GxqQ\\^d\nk3n{&yrtlfYM@,9~E hOQJ^v\n)5Z3o}xXA;0]:6Y\tsCM=c\nE =r&/z_u;ʅԀ\tiGuV1-/IR]pߢvi\09FAґ\0lc"0.Rx4yΩqt4yb&×1ev>4tpM["tL\tT>I'|4%bD\\=t3/!?f=dGҍԲ{s\0G\t}ɇ)=J.(I=;a2_bo@4ʋߏn5Fܬh-L"\t\\r~D?I^u\\>I4ْoErTieO߮SZd9:vNۻS&xh_3rlby8%c@Ev z >0.yەT78B2fמSXĘp eG6u膘656r2 u=>2p@T@$pXEсyL[\0V41lF\n<,2;a̛{ ?#9Jpu+nI~D[D&F2Έ2?sZ,Z<V>rIjwX;UK(՜T%'Sa|\n1RoQYO9\ti 80Ɖ^X&ˢL[L\tB(^\\W=M7*\n*N~2oj+h3tTMze@n4ɑY1X>5ͧ3@`*Ȟ9҇Ђx^reYQ7dq{F h\t4|b\\[UAGtO;\0* hF/6X~'I>b0s\0M9/uhE\nS#f)dn(AhE)g{Z|C<ؙlaEx(ف \\1;YEA`VY$eMCݫݨ}\n8^qŪnO,̽*Dm{CA>.AzHPQwO9L2\0z"Rb\t#2!=]~z"Ity?GX&$9,_2yߒ$@qR43#zyZ#sPKa&7]M8+ǝ@hnwt0Y5@ۼC?@gqk {K3WlvJq&uEo_o\\(t1i,bXi:j{x;l^ OJFq{=!MD{Dr+``q}ngOFƩ-OP\nܗS3B)9"iH/C{4u<v$F;B%U#ՕK,hfѫE\tx.Ʈg\n<Y<Ǣi03A.z̝Uwjg\t$_\\qh*<I\\>#j(:>8#3a`Plyb/BeEgoiQe\twBWKLiHE//\nܳkgOreHcāv)j&\tmWEU }iٱLh#qoV bmN+_~@/Unv<cdy%daewlȅ{^Wst_fWjePEvVebek-8F,斶*\0&M=|dA:bs,~SiYԎI{]=V1XegvXZwmEiC&fJ\\qƮ\t["żǚEx?L 7y©ϼxcQ;K6T}ei}Ȯ+|1˽K0\\n.}"$mρ]x&p4^k ۣ߭"2\n'qo}ҷ:Yzc\0bb\0x~RΆkhC\0dqvn4U>IFXϜ'|n#QŴa\\fUS'IO1gSC#~QXe [wg@f#LwzcEj 5"VYfمMUuv6 ;_(3炼Rp|sSjmvi3`閆b;.āiFϗ7t?M6;0U\t\nYspCt4n/\nl!]h?b0JC7^05n`ɧUV\\(aϠ(ISb'>ؠ;&?PU|Sua[yvztm,82=eK7p6YLrˢ۴aFE052e<bnK*mĖ8n'|7~bf\t"(Ȁ>|oqGb-'x{,+i?҆W1>iJtS/yXcMU'@Пz4pt1-G)Gڏ'<??_\\B24݈s%$2G~w5\0)ZS\0+PX'ܞ}wޕ=!v\0R \t륾1ψe5M\tܷfo\0-n(xLO/)i.UbfYI{z^9k0YSA.xLEJD'IhdEV@\\szOaՇ&Yl$wdžN8Up#ndFe뙎q6u=+4u׀顙Zb`_O:YЏA=%v[߆bgBnѬf:ͮLXƏnR\n^DLfsonAɀVdr%UH1J卙?MqAZHO0N'hOsX\t?" GW_IhѪA>[.u۲j-6=H_48$?"ݵǜλr`nNIJFO)ȧD,-QUYT4&'b|]eND}Wf:iFu'kY$s+KA4ʹxn/g}pHmWFCtyΌ@j6»$u?D![)3a=vk:Yeat` 29\njDLA\tW3-Ym:8b;KiTOۄpkVq1#\t\tGw&rLR3Rc GeDPoR\tk{RqS|'ت=kfqE5[8S\\X9\0$<xuU7\tv?֡Ѧ/Ŏ kPu,ƛ~<~o"D1O=bK輻!IKboV)Ihp.|:`&wA=Ny$^g}2,{! 9XתYTlQZ21+AIHABTUg}*/EiY|a|7sN%lJ^Ie)(嵖0]t2BGF2z1{|ڽ2/%e₫rOM4)FJqkPpŒL;?r]](lj\\ڶPSԆ7QNl㩆4/{-E/8ݨw銉]|"qZf^f_9-F)cMa(@vS>(oWQ⊐[v%$|d+QYaduu"vN\nP{"4/sNyQGKiŞI'\\lh˴#+f"93[m-T?P }U,:-ؚtRpnH}QX_8j/a-qe4;^XT3i,U3Ϸu[T@g\\ؓa@)Hɔ+PՙH2nې\nhO!kS{6WGV2h?T+,ʬ4썳l$=KPߢ|ODo+3cOOK9,}Qׁ#(P?B%a3u3BnB5n\tGwA9mvЉbxe m|a\0Y!({(s7kHQܛu2%1EQcW8WHc*$ j$0/T2(\nATW9i*PajI$bX\\u|Cw:U! R_5\tЯ)q%Cx6%Nߏ˟W7kaZT5l;gRȝǻظAJo|_o>7sC6ڂ[6Y{gO5h /;.V(e#BC4u@Nu߰w-wj*ØT0żuP6_1wA_9(V)UAST]w$`A\0Q-]wdx6ws@qDW^ϐtYn r<0yי|WuhHYۋ h\0sGkcTHP7&ԉrf_;*w9eu܈\0b +EuF$iKS.Ќmgچf$=;MLRV0}F6^fNBK:i5֦Y-(.36e"FrvAGػq%\0SVʖ#xO.Ȯxs7čSyuuw$xm\\5tdbZ_b-]w/]J`.S?9xdiD>GМ-obaCy\0KgIPrrg DzJ@}՜hk"$@i%@w/sL1=H?V-\08%o'zB!?ف{hre3*`HںLfQDQͣX,(^YVoFgo~1GhLeʶc~R'J9էa\t4~PK({"iv?G[lmS7khSP$!YyV2~v[ qh.,ă(4b=8C$@鲍&Xndtl.Yb0QN*U,'=AŰ`USIK-ևCӄAhyk4p\n0 }7'Hbr":RkXBs>0UMl^c}ۤE{G'<hBT`\\ja9cXB\0Rц!X_Ooؓ"]A<whhHq(Cg4"5/eQi_]+zGqqf>/U[XׯA{G47mZ"VG?}'s>\\bE4\0|%?pJ|ǘe#Ї7%cLR`=L-Ml2~Β9]O?8/^S*Ij\teI`:]58"QF9<pTpJyrp\n:ΐG8wol\t¥%XT8`Oq2hb#{Do.wr5rrӴgf$zZH4p=#I܅V=,ha˥RU-6Js$fNd\\$}\044,ar(Lu-\t)! \n/\tM2ͩY-BQPBT4.F6jJ;Ii#<!:.ZݪdPnd+7ɚV.mOy@7i䋇/ 71x_8"Lug ƖDr**$cхԴ&,}ue$z)B}Kܵ|L{39!7lb($mmZx0x)4MP5H>j'&B=Q775e;6sa|>*tAO$Rݖ3>z쟷ۍ=JpuBr)FY<|h)\tůiKjq&l~:D{_ibcцSn9'ZpfB|K:6mhux=\0Ѻ]W_Ԕ)k5G2䓐M`EU;ݫmqs_z)@ˌ|T{<SiӐeIj}&jqZYDŪQj0,]ƒDl(K<iM(q^lZ33M1i'XО!9_\t7kp!5/l'l"O'qp}&Gik}=R|UNnM4 Oa<v8;^5Oۊ5eN9*َ_|.Nƒ1K,mݮ\t\n2|cB N\to%:pUoEǕ3ims'$)G]HYÙjJM-WN(s@湡ywx0bzK+i3,OZKP2M_ӆjp@Zl2ZFS&oeu4s"PAlr{EM#{-Az{-S62Km(1xD0\nN\\8fЎzD"ZrʦqzJr\0!F!l|J!X+S+GYiHPfB9JY:&E?!̥F,&S{ϛD2#dcy+@=Q}<LK0nE_(yط۠}?Б0'Z5X4Ac/t#aOdUS?r\t70oTO,wsETB8=UvZ~%\nSGYm<kϲ$~y|<ܑD\\FZEuQ\tfv: X;<MBG%IW{J:QIpl>I4mjGS_)oxt$"͛l0,qB&p)T B3p\n&Vҏ5l\n.ReRӜ|8[#($^^\0"sK\n=bzT2og8o^8\nή$4WɔS88l4HZ,?vs-܌矺hE2ٚsu,~˼T1YˮnDŽxM RW|+<R}wv.$b8[/NtD\\qͱ['a'0*F91N09\n!mꄆ^av^PKO2X\nFV,e')B8XCI6.1N$˕OƖr1ҁr&Wh$<cE_o/ȕmDM+#+^۵(/cvwTg= gVȨ)ԙc0$\0+[lۦ.*n-Pdula&咲)%tYc}9\0>)PW2=8u%ȏxϛM2V+\01&%22?o'K1/_o~@P7V(Mty:TYfAT%f!B$ѕ=cAi$4nHLG7.T3DL}1NZypXkh%,̕V:_uz~:۰U"-0-*4ݽ12p/|H"ȲD٫ҤE$/\\"y)<~{XD)6\\ \tÐvڕZ&L,4} {D@œѼjA٘=e#]1OӬǠ~ LinZ>~<giN^4fmaQFZC}m)#]Eҿ?2h oCv[?== XsFqKgZmBEߞ(2ks9`~gCBSGմ9:lB4ĻT@GWF26(2ߜC?L\0#1}C2+O\0?rCT0x0ӎ͐3jzlDuEAixo^{w2_\nY!hU8"(t<imz [ϓy *'TE'A|7AZ|\n5 ^XGHK=fJp!͞0qG>3*nΚ!0h8yrLs'X4X['\\u|?'D2ʨh1>i~R4vFMh!5{S'H7F+\t\0韂C5vEUL'h[kΒ\0;̗W w=\0*`u(>@!>٘Wp'{%LYSQPC--YqY g|v%]f^x6˾?[t.9Cq B[X2z&7\n}݇Se QaJNֶY=!6;AU&jAm-XB.2hJS4Ǥbyzl/ׁO\tzӒdwfF{(\nYBo+!C%0垄,XZ\tha:7``9!7XJuKo/&$Ց"⊜`\nHF5X_aA14a⋱Uښ_LX\\bR ,_ؔzP3VQhE^pF\n杶uʱ5!| XWܸNԯ߯#d/ϛ)4L`d2X3LgU+M?SʊoRYޟUХcn!]`TDySI4"f'ؼa\0{RA8 r.B8,_"eٲ@#C˓5'ARPE<))%A͜`\0P,W99i=x͑B۽VKfWpiaZ+Y*wX3 ]15*He?Cm;yPo|epӨnEqA!fd]t\\-ma/ͦ\\ZCT$nبc{݃OqoaDkl<\0DĴ!2p3T~;R4` dt-P-e$^iՌЎI$-'Yˬzn[o\nHy/\nz2aM <7=t>v7@rr(w֔rʬQXB4c2=DmP*^gmAcwPXͭBfr;XI09Zw]XX+")x:0sts<Hϗy(1e/w|>~a?|>f'boֿ#|>>χ{?{O}e>~sqn~A{|;{WzͿ[P=zK~֟ߗחzX\0s#67tw&\twީ<pf홳r=nT\toڦ0]}JDqU/D)eBn\nd:\\WԄ`L<g/q7@93$kõs[T"gr\0/8\\!lcl8 3-l-xN4eӑ1B+a[&>\\kю0wyj齪Qȱ<yBmO%R\09GE CW\to)7n< &w>^!@SMZf"+E6zBH0cW:EƵ"n*5.Sxja/In$XGwa!dD_5qX||+O(L4Qvƍk%n?=5RfKv1LfHkzSHWJO-N&`g|*' [ۑ!Z@xI#m'/SrdQ1?M>5g#V!.*ڀH%^VAJ\04Ĭgy\n}0]σw[/Q0uT-m9%U+aH H27o}3 <\0?(Kr;<%4P"9.ḴӤtfOt|ɠAq,q%<K5Wn7W%4EF\nR+`ˊgkU1i/rM[n/)ڈDvW5[+퍩EEHt_-HRvGߊe(n5z 5a$D/PYBsHRkM97\tApGfWi\0*nDU~@ޕƇZ]# t3!W>}X$\0eV&̘fjMM{\\wζC9@<\\m37K3l<OM']1Z{2?xͼhRMU&;egu+F\tM:Uv1eP kPJwLq~(J8_>g2E|Jj3t;S9儏My|GVkA~;1ml4>{.VbNN2 k_<-T=Kʤ;v?F4qYPj<A}bHD?2W<*i7o(g"Ex\t?R+:]I';RB\n \\C2cZK FP;O(\0Ǫ]_:)m84>em:gmnc%"蟄lf7)YLfQqwC\0PB^0-T8\\\nA=j_%B{0E*`XxmdVGSF!{A. c^c'ߪ]?Xu|$llْӲÿB͎AQ'>ۑ-O\tzk1khAm3o3S'ܗZP]䔾f%<\0ǑsFg?;KS%ؐfSF1,l8; |YfLu~uw:QV̼WXKK2*cvu;[aP:aBm;`Vl\tښyU#y"${8)QI#U!QUjlE\n\\ʄ6Pm[7UO٪Ic[33`9^ד2}2^I9Iܚɶ]q(=5\nٕvGNM^"\0\n7!i\0klOxn;Dx6Q\t^,e#2A0LqFbզ[jR)t~C>MNbnpjuȮ˟[m=e%D!L^/\ty>cYWAi!@-W<NiϰyK*(}pC2]Uץt;"y,")g~{!Ut\\X)UČ#;5/ƒ<͵N\\.hF&Zw|͏ DONtb$pk_7T;PO&K[.-ѱKė4"l΅NlPmQ6D rr[F-J0Nӓ5\0g+:آ\\3mC" \tj]);q۹qE-duݐyb\0)bΦvWB ;IT|MJ:e\0:>-i'53PZ͙,.]Tv!0 ċ7c},!Ph'eUAZ#]X~k):K%0B%& ?AV&!#Y<OZ![@|-O\t`qҞtTw**H.ۧ0u+`]8e:o lT`R=Jed.S.\\AII9AǀtBq[CqRK J*M4rU-}M!d1]k))팚Q?{3WK+{D2-47-pOO]ӂY\06[\0hb\t]2(#KHvN)FP_k0nP2挞qFZZ\n6ߡ)ZKcsJ=z\t1H90:)IQt\nL aVĕUYEB:5'X:Uw}J]ڸ?7q@Zg'F'Ku*Ä⩈dG P`ύ)AOrQzþ@@QUG*!5clȰ7ŌCAU3iy"!W]&$xܮ.J<7s^IIS֛tnط3^#<s}.-adY 9,X&!Au=DQaS\tHq^slDSQ^:j7=^{҉8+tdy4KK*tMo:fR'ĉS8/(GE>̬}2by=5ߔ{e\06o\\rD(M5{}{"ס\tr|'u&n|H쉗}"e~o"g^H͘,\\o\t3H85*z>^2*Ed-Lڑ1JJ +1tɆ;b"=<)Mw=KG4T\0tkWQMpP=aD\\V8Vȱw"}te#^2LHMYr:#%+ L\t!>N98W\\CKV1WEd'~ab_=BZ<R߁֠$rA\\e4hڶFn@5Q/Cn YШԛ^,PL>fzaJfa/XQJ&eGPN}\t].h{+=$t4hϓSs~9V*m59I\0Y²qreF~@C!j|AυWDOz/qbbZnΝ%^l Ԭ[f,4W;a^航-{WB>8qt7a:uXtZon!vJRo.gvoڢmwe~e#8M{y{`G&7|sV,y^pUso}n]cK͕%yO*H@\n>z @\nl)O)"rR^\\JN3u4"mC\\_o$/eu\0]4Uz|h):۱<ޗ\tG1!|2CI/yE>+q"Cҫ< a[~ O,_nPk~@;M1{g!6ZɱTm.^]߬T hG&>Ӷ8\n8:]f\n[+^"&-'s,L*%Ip.NÖ->R }歅FAbҰqY]!Y@%5+qkc4mfʜVɑra0 P(2elK&ße]Ae@i8y>LQic>5SaֽSp'?Yd-U.~\n&7q@2RBsiSɗڽ%rܩW'~s-VJO{>=h%GM!k{%fүpmϫ'eنOp\t٢K\t ȴ`Vv@zNP~oR<)3d^f<jH@k0{G\\t+/!Ckz&yLѦyqi2Up#)L]$aV˪uI|)dID\\zG)(8V` 7|=:H*KA#b\npZ_n:|=U RtLT?F~`A}CN+ExZ'=CÚ<w:q˂ȣIq~ӭ-v&5{Uֶ&5+GiuO!"[пan|#V"/o^T|*&ZtIR>P5Φ,$o@vK9ߨ$U\0_)oޘ0xH0?!2fwS-Vy)v\0-\\e;-gܚe`n z\n江Of@@\t&8,U{pe+L<cW:oH$5^Ka$LG_'X\\'AI@|>~\tfƨYO2m%:$P IDWjH]3reKgG/|t¡,\0z?"͇9/Id@(\nxNHp:/)1I WT2"0&ɷ|fޔx~TVhBX9,kO-2fd{S2ˋRx--̑>j=hZCƬAF8WA;f\0I]<(r.#E2٣zN?U-X"_uwW'`0r_0aSܱ$ƸiQoؚwꤽbS7_y:)iG|V`L+$b\twii9gR%F0R*ROpTRoХĈ\\#_=\\Uo4TyKI;87B0M˂Sr^w=:g?ֆ^A\n"\\hUҏBzF$c~EbbI'{ XBs[42wQ~cwԖkj$^꒡61*ZAn\06?:\\9<got?!5)^\0VJۼ!*8NeDL]+e8$lQq˂42t~±p`oI8~c3<UGжz(!{Bf-yh.HAz@މalVo݂-+KP3B /<Led0{®zb}$wt.\tD4k{&Y)?G~\0b_:-lqkZrSosbMx~7P#ڿG??^-~mP=`QT_wh:ɖ\0+»hGY?@K\\{x-)Y\07gaCyy";2Nze5ZW<O+U6o5\\\t¼=zh }-Ldg]>RBSQ~K%VTl(f5_;!JχM<i|rUa+Ũxa~3*pnZ[=t[d*4o=)Ѫ8s>iv@dYY^o\nfp\tnKTyPWsExu, <`{JE_)3N=/\nhJBkO$g?h6Jk|lըmC33'5u~%.2[^nlG'Y4DQµ|cԙ2S!]E@Fp2gX}[**\tWv3V$w6?PfPFV- K$s_Z2:wV=.|dɭx9\t] >rbW%jo6\\C=":[%Y#F4@swA~=X?{MmHO\n~=DL݄\\fSr\0}1q&#V49٥6Ab:ז5H\nKsc-I\0`~q>`a(bscpH>t:c'G;"H]}(&I:XȡhIƀpz,^b̀1`XS)I`!kEY{hY>W3mЂs)G@)?& ,2%:':țrhԈ汒Gfy25͒H}exLK߷^<*l>?wX,[bLdkEpքX.o\0>`<U\t(iSYWȊ2yHkħrXYD{\\C&u/T$pﺋϗ͞~侵M>{qo8\\)iU_jԻ[ўC6zu,%Gcv~WtdG2usxtqyJ<T瓈c)-X٪|2._uJ4"ǍFŗ!Fo;<[{?{H:9pjH=TyFvEY5G(l[8!0ܴNIj]ͮ-B{E-o"j2|\\GLuA@[fy}?wiN8f-$$0<E\ttD܂jYcB`8zJ4'v1]2k+hzQJiv7yb<F]jȅa)r>+FI81cD|Pnx։y7y/&/4@;7YV<(&\t_a!]ձOVI2Fc\0YhӞ<}鯵J{s>Wei7o-ut`ϷR]@@(azg%{rHdzFܦhښl$F,prwZ)2+v\n.t̴<o.?bSU7]¯`:"!l<c/\nuw_ikt:) -2㈥(_AfE=\\ݬ9)^=>VI.qa"">bZZIkC{YX$M\nH} 4l_yvښ]\tP)֥F O1EhhcRq!A89wQp'M*yQKlE'Fu6_GZ>Z\n=检<#A5rc2=-Un)xxMif[HK=B-'mŏW1IkQ+ze1Wv?>s3vY,rl7W4,Rq.pbO ר2aLڂ-@;@wRs\0D^ΈSVz\t!o<ʜXmqE̘X5cr/FB:~?,KE4Ku-S0F=}e)8`EbT`G cu"2丧o^֢)ro_7`s1zJNWHx5$,L\n=fMd51O_ppᯇx)%u|^s&w1Tw {w8PwY{jἧ&h%ZN~wUz'/glEffIum,W%5*ZgVIZ(2XGp\tnX6;NXR VZP3OBL6w-\t{5_Y8p6\n3zy232[mn0t ,"8E`J..݂W4Teya'<6LΔQ\n[>ݨa\01ngbHxS=Acs{ A\nP0*gwAHHWf<?,A̷L6/SNbqdȪ%vdste~1]x6XN1ٷ)wDK8}+5tӊ#Z1eC-Izl bsdg\0ῒέB~`4URhDY7˽Wy6t9&Dk\n2\n\\D'y{\\¢ } ?XN2%&Bs0ؙO?V#1AJlR8Him] GNpo|28S4+[P-JoҜzunY<;5-8;MJhӢYWCD\0N\\ϏdEJL6R6p~_V(ٞҼ4J9xހZ^*+1韎29x~3O#/"^mkoEӐ]#f/FQȟؘ< )18o_>,wOGUA`s5=1t"iV_2{/÷2p`1δT^id%5\0~1l[^%iNմ9IM3$~ScbZ%Lj~XO]Ac6^p\toBvصJ;\t𮊰FMi<zjuK$Q\t^\0G^̉(N &lb?_܋\t"paD?SZby-I'AT]esgJqhTG&\nݯM>9òuZ^F:эbWc&;ϋ&Xk*UB`vseu Zz>7DF02\0ss4+2UdxHܢŝ@7&\0DرN~AgfվM7)[>\tAq'IrnhR9v\0T/ɪx w"yhk=htrևa!U"M!&LQp&q70K%m,9cxsmga@8̗ȨnXO=Z5nC2)Y%gXalwNK4\0Ę,41 Uʛםǜ?>Rw3mzҽb\0L͢ԷIXW7(\\EB$Qޕ/#FE"`ߕ#({d<Ca1y\t'J<\\M(z(j:{|8AmB~]dVǏX~6ap91fJpa\\ʣ\t=v/$^oq1.d;&&&dv~D42m"oCRP\n2.nXٺAOTu6B9Xz.z7?4L!FMP1ҬXV(\naW60]J ?Tcd|PT2YsW+Gu"Mochȩ@^*\t1@2,˘Χl.'sC\\\nۼQ~/x3{}+66bj4,ZdD3J57drp}0i`@+:ɝMZf0:Zs\\gzԲ8\nlhGx9C&)6YpY}ouHј:5&&.Ց:m|ZrAwne'ኰXsmq^\\:0$R2'ͻ7d7]@flth/r<ڵaB^}oNcLAqS1; @ }r;Q@xV1&0j^C[n\\Kk~:qOf]ࡔzr8.VO/Bٴ_2B)v(RlH#Уdž6/6-r'pKɴ|X䚩G+ׄ'𱖸teq7U9Z煴y<R(b?2̚ݓ-ua$BxxT@=ErSब>٤WIqNNgn|iTǦX{4gbP``nF=2/#GIM4ɤ+!K<h?=;K͖8\0zq?(:dJ&\\2%iJ1`o"^qS -@s&*E@6_p4r\0Z5L͊k7\\ғR9R\tHEǵmU_款$7QC\0~AFvA<U$W:?SOpaS~L߭ƨt7ِRKԄ4G<XoY`]y8,o+ [7Q\tىU.CFUg;jlEPiY8A[\n\n(g/.C0Xޱ\tP`m)5&̻_(%)̕۵˧!C)LO;ash,#S熥!Xm4XWfŬ-uHu:̘d~\0hĸ<t*tFKrԋm^Hi6wھTMLWhCz>^ժWSAdܝ;C\nn#Lt;nZaXD3rUg' /F fm?yv-\\Ed.vbYɆ+ثrУ+`",f]͒Ջav=|o!0.Ʊ6v8`V2LwPa3H}Sk8509y6pJWX_HV6zC2Jf< zGT=}t>D)\t%Hu6tfIH݃")iTJ"\\6ĶǖȅUSWm` Ldr^vL_|Ģ#pS7+26d6Wҡ/Gu7/i|oQwl<vșeGڴmNYRNDmY^S7S5\\ßc"Qga‐n9Ck̀a<NXAGS1-B_/KԆE2~ÌD,-ոJ{87z# E|ʛb5dÆꝡ;kQIOb%r9~0Krߵ<"IS~#)dRTT@+~,i~crݤk<u:6ZͪüJ+&RPF%\0;MvdPӼx憥g6QJIuQLv,_<FK:'5w)&/?P:WwzC5n@WDRb5Mcje_,<7=eAؤERI卽%-q1ZKgC{b(RqӵβȲx37։ z?L# 3\n?&=\\m>0\\wQs?O6߿}B֣(fxx@"[h;ۖ3}W#5'^mߦ-\n+0\n%&W)e/xgbj˂YIǶFlۊÍ)]3Y=a:maghAy;5[{;z+!2*@6s0@u^6OS*s0!3,OI]\0:'WOJ^ټ,/mE c8~g$\0zj(z=[\0":F:5w=J3$$kcP?BVL`lL0N=v㝡^!vߌ>ǫa@|Ak1rklݭ$t +$ǁTb8/$W;`f>Y2c$?kۮgqw. |\n鄖ϰ7{K)t8K=UHt*f|!~lWb$sh#'.. o/wAnW=~oWER|\tBlx;ӺgAitf|5*%Snykc&ŕ12@ɹD?D-@i9BЉ>'s\nֱO5 E)hxc-eߕՅǑ\0sOgy$BfC% aX?L/F)Ȱ*5L En9LB|HNݕzt17h9iD2'øTz20#@S%f Q5ٱs"FĤP51"RDs/^Fb@2v|oIOjB!!0[Y*6k_eժ(HB4Mx!L1Qnl,q!)=(&U"[-Qnt^^8ԵP1ԙ-ܻm+z!$AOr%y_q]sʉݺ:Hk1W1jn\nF抓IN/R\0έQz7(f+}۩"廟B1y\\ʒN1qr1 `|NZ^ޏ:G)ls/K\tFAWq컥@u`0\0;cnd}0<6k_FyI~[Iwc%1hwT3+hβ0:ZҎ"֏"]\nGO]yWpf|ϼ,L'䴳C_E*V,T6dP*/,ރ\\FY3â'0/TX]./V8#A~CwEa7lqAxޣNB-8^.]|G5\nD~(}ww.*fN)XGmھX$b\\?-^Vծ$\n|\t3~{ZL|nB1poxAdE0߾k;Ơ.ct:;VɅ|"e+@;vO+%QjH)0afs-VF"ky{\n#(rRtDgIV";a斩WtM$u'CrF,n;{z7CaOJ#4_,\\W(C⒵;XV;r=׆Fѿ"\nR~\n9Mfl4G(=\t\\kɌz:s2$8|!YG͐Xd1`DZB"QȚˠ?V&gh^,z\tMɟv+|%4nrb\tne\n{P˿Mo/S|̪I+i\tCmro2m 8ՌP^oeS}[Da1e7sS_3keA㕾ZNwwǴ= AaV\nVE&VOֵoQCr);Ѳ/WGef.;zbl!gCϪj<}Z}uh*meU[#̽r\\|73Q$If0\n'XS`<uh _Q6-DF S+<"-!J2J)|Sb:`{?;͖mBScψ*MX? eYkk]8s4E\n(ks֗ΣUv6_&sȏUvNHi>S6\0~Fb*sxt}mQi rPCΜTq94uh+'P4Z//c~@\\%oI\0UC<{nOذH7Qd4Z~ǩzKrL܀cȤܠuEcÇ8YJ\0,A1-PcE=Y(V/~WY?(B*9aYadtUD/6]:HX Z6,5$yR$)YU:ݣnMI4o\0GNP>Q_RaΨdG3ɯPkZ#-1cw\t3=7]\t"Qʯ3;y\0/gk\\6}κvn~zWeSB,'Sg=uO혅O!Z+L^HzϹ^O!Yx7{x^c,8PZc1g nC%y<LNB(XƈX~5c)/Rٹ4nzcc13rcj/h !O4̶s4RN(\na.>_|5F7L zA+tBdhSt"/@9bavҗh_w*r8T(NtI4AfXCBŤI}`W#%\nϟ\\W(:IhX,28ˈ1\0mpŃt0շ@m89^-(UDAmFc)Q/ٚƨڂq]2Q"0iM^.Vϙ4?#1M̆<ȡ0\t*[?뫎Jc@Jl.HAHx,_3/7Az>\0rE?J8,bGcXo-$ϧkRf4Mm_i=u!-+EZp',}x5Noml/SsQ%㜀`$x]TZ><ňUo:V3"}Pn㘏q!Vvvz5^ny*+|%%%4:111]1CӮۅ!k^vp\tAQn"}ztzXI?N|ݤCVh7_`1BTBJ6glg=dCScse [.M-hM7\02n AyyoK1\tT6ny-TIí08@Ȇ ti@"d"6Я)5ԕ@8;+mPR([_OO4:>\tӽ/hM/G<mUp7gy3Sa[K)C$K+'R3j]dk1C|JB[Ҵ٣-L+~R:Ix-rxKKm;-#-$Q -\\ "RFk;"e!K9tӀҼ>ciT<"(+ǃ,KWгh6tlYF{ ٫uG#%*R'3?b܍VSˎ!g5W=XT.qjH=LTF\tY^$7Vf~X~tE`^6 .8ⴐX\0a$?s_xớA˥i'uJgFKia& {,|'g6!\\9̭Qxi|u<`HY]_/W\t6#(F-t}AccI-FTX\0hw@Zc(KrHL,<DA`kK==roњ˳F8<qe3\tbϩr9{>7T$Xbzra=z?|(q*RY=HfTBs' 2φDøZ1PTӈ*f|6;k@ɻD{n^Ez0 EWc]$ݴ[TsRl^oEݱގ?FzՊK\t G{Q&tUܴ%<qtH#3{YD`Ԧ2^vcZp\tpu΅kUŐ1dH/bu4H-BmVX&W<-ByŃQjGn?t&H{?1Y;t~ lCmC?,DQ;P8OpZ6CS>2.\nFָC[]&}XGSq VڦAűQq>EgOKΖA(v_R1AGYm]v!-[EHi41d[aQLzY#el|.@TN YV1KMbaY!SyHgվ?~9\\\nb6sV!3;"\nsӊb1,R%04K Z∗Jz>Z+"dt~D_T_ wzaD#*8d<q}L(%q+gW_ʕcCo$hdV/A?+93*#ˌ~(p,ZXәg)kJQKK7F>Т ȅecխM>aBq:Z]ŐJkh*w1D<D>MsWկ]ױRQMV/(˿@U\nlgRh8*:\\WZ3ЯB`t/87b%NvnʷrJKXzgTgd=Y.YG S]`/iqoMOCy0FJ*/yK\n_X#"]3&ڑ{? _<!CcrzS\n䒮I T:Nv"dQ5ڬ\n$3o2(#e__VJlJǢY*"vȏ1cN|#*2uTRpyț"pW<jhF]GFx?BMxn?`%CH>b%Jk;}N_"6T!2YO K +ug?\t΅3+-eZySTu#fC_(.z!(qD%Ÿ\\y^2̡X NtN^w:3R~|L tg-)PVN\0.qBmŀ̽}tƩ2MOSe iY\0όo7ӟg~`s3ɽÐt\tᢆ=@acÚblVFcj/jϳV ?j(7\n{X]]~\t+NpA)8#&q_-OO\\|p[A:OE>Olˌ};<!/IJ?\\ GNK4d^$݂C" %/)DFu[ϑVAQ5@{OC)8GmQQSg<\tl\nUiNീGNN6=E,6gGQchi1ɾM>Ι)VqX6VޔLsddMN5d\tǘ3>K9y5~b'^70# ̆ݭ[\nP8=X|ga_wVedhSV]@\tS8\tGy,-FfᮘtR.Nci.6εZeYL vZJܺFeL\n^>Y"+s' oMJi愙hp_x$ꅢvZܒJH'R$PARWE'D_+%z̴P$ IJU`ƚ_Su12̸#k#n}n)Z[cy*PTn\0UBS":p#g'3֢@lQwyCCr)5Z"8іP\\Q?o]XK]e53ix(WS;}4N\t\\<4֫leĮϥ[,V.a44y&:v"oG0iʅW\t+6 8ms4G`PE)\\m5Ja[G0 L~ǥǒ(0(Gr?@o#?˄!L?[QI KOiXБeрBŞjCdž12F=\0⦉[*8>zC;;uՔ[1!ujkWSm?ڸ*#i lG-i䴯tSAn-??UQ;3BCrrm&x5QZ?|id9; _ש+.7`I=d>~/\0X:twKSh""7%q.mSMaExyIg~bJXf*fgB4:wqʎώ:,blⓩ\nB@&\0@;C-M9]Հ0s2ןw\0Rht]YÅ2t#pg;\tC)VvG=\nŹҐ2BwuE5f?Jto"OޠN-tdoctNïHҝ2?gF\0nZݽXI&l g(xYl-C&FD{-82=DXsmB.\0'<~0U|JnS`b:jli';:H=Nl\n,Rn%j6Cb)"sp];Xvm 8`64KO\nÃK.^ӤՠTۓ|͊3WSVO#8KE,tausUVݩH<hMa%)8}Btuj ƀK+b.\tQ&Xݥr6(.q$d%Rkygos,<-pAF&@\0TgR\nh5K#FJ6t֔B\\b85l&O$q~;-p<>yb2]YͰm8\t|k'z+>I S|U*\tܑ=sj+*b0Д]g9B&Cya,@ɽm3/\0Osai/>%R)Qe%qr>(Hnb'})d$Q֫]y98Z\0M`+);VP,AET!^vWB\t@lBD`/։MjSO~v$z$ |A(Qj;OVVVmM+C>+f<,hkֹnn@!ߟ@E\\E6QAWi*mzWM6%aS^h9Vfח$G'\\Igk.ޤ9QDuhɇ&\\ebEP)$`]H Vroie*G1)gQx\t4bH'1$`|emCU\nȖDcS&fLh,{F@m#F\0Zj~DN>QKX|Dy#a'Bʇ</gTz^;S4hNJdPm<qD+TP*9>T2<B"xz=;/ؠoħGo>z7V!ShS&/"/)X*\0,yx]hjG|ƪ2h(Pn0A5#AQ#&ZKp 4aJӹg'%fh_X;g_(G`Ff2' \0NؙPwkӆ;:f@5G;v^@%DU*=0\n>cdEVWuXIՉ"ukwX[IL;ZauN,g4$~rw}\\:O_/~CU:ZWFEPhN*wڹkX\nȍ\0B DUՓRG!53_ > _;`\0||*nM0}QA(;'?CllJ,Id78ZS2*10SO^IJ4q|.3ΣshdIw=$"%GһO\tļZ"*9b_(OaCaԐZ-pAIFW*GōfH^xWq"ʍ`^?vR5cs`ڊmRh-X냾Hs"82}us#O1:T9J:<>V$w_uzcȧ^_(^<S*\nV>QaR l4b)$UsiBq.쥉NJ$kPH]\\cu`kqUPaL$縧>F|,U$;KORض=mT@ (ҝ8O{*P~U LfʺsͱyJxao:1"=a{u}h$˩Ei\nk83^l#dz]ûM3Y0UYn83FZ1V|5z:R9\t>88|I8&tXtQX\\8cuc)xEClpa_pJBen!%$[LN\n0!Xݘ[w/Ÿ-ؙ0ǜ^8Zۉ7zWF\t{i[L0LsΉ?3Ƴ4DH%Ē5S>W#w1LxcD\njUro~h\t|naƦqkgL.\\gǾi۫¢uk[I-n<Ct|CH!/xwaTFXA,.f)@soaS.sQbSFjֹLbp7V$ڍ}Ý*Aa{\0o0Xt2\\yX&V^t#;{?B><(TO\0ZܰeKKdl,sJ}E ;Fi\0g8\\ʽ"JϷ(Bg+e$p{\naש=Csע=G0BE\taF=$rmO\\1i\n$!*vSx[`++KX&PYsMsx\n<|[_S(/x|7Na*">*YuΨa'}˙RKKy 73{u$\nrQqT*k\nT++t@W(~1~g]6ޡia\0E׳-zP~*j|p]{]\nY3}32W\n.)*1[䐄⣽PYRb#ld>\04G,7FLt\0avDW.;|`z@23zjQCڕx<)Sq&,4\nQ$ٿ*,ت0y~Ц@,<xyL.y|f:z\0+Ju^e*(,#Tt E,@CU,//vqNyQ#ijc#`ݚSIk u&qJNYgRm^6ztZ| Q5)\\a4p[$̵\\IE%Go7A ƘOe\05*=a ?Cƹy܆\\/o5ed{1~)ӵ8}mbrK>=^B\0WZ\t:arT\t[Ujk+Ovī!#qᩏ`lfaYO~%=ӓetɆ7+Xx sy) UZބ3rkRwE\\슱j7f.|^\tdB6\tGy!ņ=[s"빒ov8^.3Vg9{=4|\n72s^^~*3sg:F7Ӥ=EqyJ\nÈ&\n\0F%e\t>oa+ iXt[N_Fjv2RqW&[#?Kvȫ<j /HͅwJ>\tFjb5pozвG}аY'w)m yzS0J+g\0]JXm@?SCb!rnJ\tY\\0pnӚ"R" Rc0sIDK74"h)WTi,'n_E=#W2QUϭ}Η?~5TNLNG,[Cr;tK_L&}ͱ~1-\0r+͕<L)U*N{6klRHH!>lfULg*O%S+m6q1ЏD(aOqGBvk2f==z$gMBx"3ښ:y{kݮV{ wU-'ǑFE/7?kr-қnVA"Nb5w'bL20FXryZnLHSU8[WU}2UptߓعeLxNu-ULYb7m\tX.HWeX/r,p9u3RslWðYR],F͑mlqۨq:%)HHQE+|zx3d\\C1puZrlO}#-xf((VP$+S9t|R',mfKMEGY9vR8=CSMA!6 \nc`wGՐb-=nZKy3)Y9}OTrm0pÄ8K] Bn6k=Jj@z~^/Kޱ'Lޏ=wf۽^/n*52 <u[]A.WRe?M\0^"b]=i(8YNg9|̜8y檮r(?!M{џU:بG%>ӹ,C<眉\t^ÊDŽJZ!/զ0<a4}Pzw45xChX#OL xdVY:8^c@EauI\\\tDwxmL;X`M?q?)уب"*k]NȘkC@o@HoΜਘFFQl/'HgbU{_xi>A!x-CR.4r<S˭vi, iFog07!'܌lͷc\0mz\t֣XUne#mBkMn+?_*Xf~Q#dyvAb+'Xi֕H݊,Z܅}.9)7UC(螗VLNn]%dx.3sA{Q tKB;9-o~" A|)cj"8y1Ks9W}jˣW}ODksޒq\\'}槅,ހHk<]@=.g^S^JF7۞gN\ne$c|+vhJTz>`\n@~ a_&M,,Y2Cǜ\t\0m\0dONLi8p\n- Q]Uw۲9sh+ԕ(KpH2F]~:\\\\!2yS72sl|8M42/>Z>w;wo\n-V9],!WH=ٕt\0Ҫ͝'P_`:;J㖾Zi/q&5k5r⛭pY{IǍ8^ɇ^Q|?V"{ g d boc{ڌW@`k2~%p #ve*p\nK5Dcys~E'' VY|TQOWJ\0xLnV2Tb:<9gCl`Am@3==UqG"b&-;JhָmP)_}@ {Aip+Wey^{jGbm2C&65+=W\00f3tgCHء^JtexC q}gz'V>LP%ȴVhA{`4ɛpܺpvT]F͌\nzxxfw:y_u&ajVk ]R+4->\tB+uն ^F̎wT ts\nEV9£uEg ӇN?\t/ͯQJdюz)ƭ3Q6rV;dV>сTC1 r~H|\\I<q/F[z\\gBg\n%ǐ[Hn>}bYZcVzXʓh~P\\a*;$[_*h|CFE~k_=_lΈJ/Q>"ٷƵ7¡|7y?A+onoNI<vraL@6+@]։p0}:463 ϬOGьySwY ̋٣kM}bj[Le;]\0J^(U˩q1đj\tTu1ȏWm SwΝQҐ>ŠAa,ViN|U(VK-k(TKylG(1tjƘpN4lZ}a7>¶AA̡PkYqKwngu'333^\nLѢ_C<&ܙkLdiϚYEgXQ\nLA[+O$4K~'86$yܽUTk.'iuWzN;kw~;wWvkއOt7zW5uWQPW\0=n@6.@V\\>1۬mySW7\t}YʎT7Z2),5z$Xfx6$'凝L'Tn*o4:.B.>[f֫0rBy~5a[xz24Z\te_ǒ:-8Ts1E't=G.)q#߯McԲbkk,j^x"pOKMI9wh\tѿX\nWD\tةL4xl(""vۡ,y>up `S+%6%"8%^;NfI2 %%m.lmV'œ_IN4=NuҹCH^[R@f14Iܰ Azu>/Wf)7;96BFuNMNJ戓f%66;f2_ҿYM$Ȳ\0af2nKu\nvVI7)rHwY"5mAKAPjcW[|!+#{b!f*e?Z+rq(p*rv̳Ø_9cx:BVRLcz1i!rjF[&m|a40"Nnd%eQb#X5"fJ\\3ZL~3$V#ֶyu\\4ԸUH لjGBD%ŋn{@'J`Ffv`u*9G?t̂ȕn0GL^|tO\t1f!NnzL\t[2bIE\0/s7OjrK@/gO\n`{L9!/1lKyyAmhw_*B.:=9L8="O7ЭZAOf-ekMb~ih4B[.6#+\nb:Wc%%e<;u'a}{\0 EA4]S^O7Wa'skzǑYqzړֱPLyrz91]s F1eA)L-2Z%գ:GSm;\\'u,0_`+\0g>UWr/2|TYh)QF\tFLj8RZx#A7^}n%if&U|[Be 8T<FNlsR ᑋBDlHq/e*S9no>MAwryI稐 rk<[>Վ#l)jp+R);E_EҌZ+ڭ7@{J`8"Pm+NM!vYhI1ʗ-A8\nUrr6C|,2@j/dڷ(U巋hGW{ԓicyұoRgbfL#W"dI+rRV{f盱 "Rr+,x\ts[26[v:%8$$ԲwnC+;̏zYZClJ>ޟuבDjHO<r_^xq[<}F[w\tL$M PS̽W~TD mfNnH}/k]YUNED\tyTm.\\ޯ],Ol6YcwDV00ȄD>^}KoQѨ._'r\\`\0KvԍUs?jTq!`{0>lKW>;"<ZIla74I,%pJ?|e\tc鸍,ܭNH@y`xեk0"pbJUgZяG6L?gS!\nN\\ANu!]z r:cdHBvTU[,[(Ȣ1>:wO\\E<=v|,2u$f?S{e5E%<Ώ\n-RT{8vԾ~Uķ@\0cm3\nkot"6$|BrG_T%R(v=.b~scZbҋ2nkm>{IKvN8ڥۧE* зP7+O3}^ HKOohz/R1 Q^OםSUGS=SATT<Z* | ||
diff --git a/bin/assets/OpenSimAssetSet/cedar.jp2 b/bin/assets/OpenSimAssetSet/cedar.jp2 deleted file mode 100644 index 2894e3b..0000000 --- a/bin/assets/OpenSimAssetSet/cedar.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/cement_block.jp2 b/bin/assets/OpenSimAssetSet/cement_block.jp2 deleted file mode 100644 index 971daac..0000000 --- a/bin/assets/OpenSimAssetSet/cement_block.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/clear.jp2 b/bin/assets/OpenSimAssetSet/clear.jp2 deleted file mode 100644 index e4a29fc..0000000 --- a/bin/assets/OpenSimAssetSet/clear.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/cloud.jp2 b/bin/assets/OpenSimAssetSet/cloud.jp2 deleted file mode 100644 index aa24cdd..0000000 --- a/bin/assets/OpenSimAssetSet/cloud.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/cobbles.jp2 b/bin/assets/OpenSimAssetSet/cobbles.jp2 deleted file mode 100644 index 0bcc38f..0000000 --- a/bin/assets/OpenSimAssetSet/cobbles.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/coffee.jp2 b/bin/assets/OpenSimAssetSet/coffee.jp2 deleted file mode 100644 index 5761e8e..0000000 --- a/bin/assets/OpenSimAssetSet/coffee.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/creambrick.jp2 b/bin/assets/OpenSimAssetSet/creambrick.jp2 deleted file mode 100644 index a3c22e1..0000000 --- a/bin/assets/OpenSimAssetSet/creambrick.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/femalebody.jp2 b/bin/assets/OpenSimAssetSet/femalebody.jp2 deleted file mode 100644 index a50498f..0000000 --- a/bin/assets/OpenSimAssetSet/femalebody.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/femalebottom.jp2 b/bin/assets/OpenSimAssetSet/femalebottom.jp2 deleted file mode 100644 index 88908c6..0000000 --- a/bin/assets/OpenSimAssetSet/femalebottom.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/femaleface.jp2 b/bin/assets/OpenSimAssetSet/femaleface.jp2 deleted file mode 100644 index 7bd0cb0..0000000 --- a/bin/assets/OpenSimAssetSet/femaleface.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/fgrass.jp2 b/bin/assets/OpenSimAssetSet/fgrass.jp2 deleted file mode 100644 index fb496aa..0000000 --- a/bin/assets/OpenSimAssetSet/fgrass.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/glasstile2.jp2 b/bin/assets/OpenSimAssetSet/glasstile2.jp2 deleted file mode 100644 index 9f62da7..0000000 --- a/bin/assets/OpenSimAssetSet/glasstile2.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/goblin_skin.dat b/bin/assets/OpenSimAssetSet/goblin_skin.dat deleted file mode 100644 index 7a7ad8b..0000000 --- a/bin/assets/OpenSimAssetSet/goblin_skin.dat +++ /dev/null | |||
@@ -1,49 +0,0 @@ | |||
1 | LLWearable version 22 | ||
2 | Goblin Skin | ||
3 | |||
4 | permissions 0 | ||
5 | { | ||
6 | base_mask 00080000 | ||
7 | owner_mask 00080000 | ||
8 | group_mask 00000000 | ||
9 | everyone_mask 00000000 | ||
10 | next_owner_mask 00080000 | ||
11 | creator_id 15787b54-7833-4238-9c18-80ddd7687bfe | ||
12 | owner_id 15787b54-7833-4238-9c18-80ddd7687bfe | ||
13 | last_owner_id 15787b54-7833-4238-9c18-80ddd7687bfe | ||
14 | group_id 00000000-0000-0000-0000-000000000000 | ||
15 | } | ||
16 | sale_info 0 | ||
17 | { | ||
18 | sale_type not | ||
19 | sale_price 10 | ||
20 | } | ||
21 | type 1 | ||
22 | parameters 26 | ||
23 | 108 .6 | ||
24 | 110 .1 | ||
25 | 111 1 | ||
26 | 116 .68 | ||
27 | 117 .28 | ||
28 | 150 0 | ||
29 | 162 1 | ||
30 | 163 .99 | ||
31 | 165 .69 | ||
32 | 700 .51 | ||
33 | 701 .2 | ||
34 | 702 0 | ||
35 | 703 0 | ||
36 | 704 0 | ||
37 | 705 .5 | ||
38 | 706 .6 | ||
39 | 707 0 | ||
40 | 708 0 | ||
41 | 709 0 | ||
42 | 710 0 | ||
43 | 711 .5 | ||
44 | 712 0 | ||
45 | 713 .7 | ||
46 | 714 0 | ||
47 | 715 0 | ||
48 | 775 0 | ||
49 | textures 0 | ||
diff --git a/bin/assets/OpenSimAssetSet/granite.jp2 b/bin/assets/OpenSimAssetSet/granite.jp2 deleted file mode 100644 index 6113881..0000000 --- a/bin/assets/OpenSimAssetSet/granite.jp2 +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | OQ\0/\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0R\0\0\0\0\0\0\\\0#"ww\0w\0vo\0o\0ngLgLgdPPPEWWWad\0\0Kakadu-v4.2.1\0\n\0\0\0;q\0Հ,uP;Od13Q.H"i,g-uŇ߄}5 ~H\\ J%IURZ"#:X&xI\0\\\\DK6{0g|aPY-66H8/j-)M04 m\n=&vxWgvr,l7HmaϏ9cqM>'!noj0oP,H4#?PHÇu ?cl2٤V~NCKRL-fѓNqF!CY$5#[7`DvBMܑݘxu`\0XUv)R6?0GzyodX ԉRb}\\95<.!uUCK]]+=uƔnh)hKe1|3l^:J_hzK>2wxo@#GCN:I+hlmD̹1Bp0K!\nE+Dy+Te\\\0h |GP LF\tq^ g] F=W=*%d8OEujOZw,(z=`Б2K,T۵SNfL4<@\t8fy̥#qW|}3V>Y8E@\0F>\06\0ut")pp+o-t$)7A\0GTY- (Tm*_%aR/Yh#CTsڦNE(Оn:N>0a}|`\nKu0pLdAݩۯa9Q3ѡj1 u*`,+UWkY,6-EI rhhg7w,H!Er'qBP2&VB2I\n,=?sb&[pCγ\0/Dsu#@S.j8nޤw̃!*X4Z՝ʌ̅dDٰEN`x\taGf>P$sϋ,!)yU2x;IJጘ6ʦ]gp~ \02t>("v~3[;i·w8rlზWg6}3Sk9Țw#Væ[?=ԖX" |34/x8s(Xk£s\nPeƭ[FwI֊G\nt.0>x6ObE<ZVR-LmyX%;bPwRcvߕE`{=L:k(,d+3>6Bv8SήǹR;˸0j}'3ޥ)4RlS&SoyV=YxvzVu>tqmy'DUG>wk=\08sǪ/,_`am!\t%'CehFK)qKGj7}4(>2uRץiRd'3e1fE`lp;B{d)d3?½سfHn1cQ_TXf]^]lg9 m\nKAxjL\0\t^N77ge*.ƥ\t!Zf-wsmr9CKNNTPEl|o}*\t$|AE%"q[Q0@WatWbCa6R 80B>jJ~\n~23Bb3.B@24^K (7RX9ݺ'1knj[%1~Fuke 07X`S#w:Q`tF#K+!:CյrII0wS݇oNC50HȎeާ\t+5% xR'q!0?.\n4Cֵ1RX5Z2Ǜhx ޤ"hUJ]}*@X}a~f=zL.\0#4V Kh)Mw_5w\\ReI:D-Phs\\9>ThVk=?kU f藱}Ȇq6@:7Oکzgl\tkPT\tvTy!qLA4 d7)T2_#:\0W%F>"#_O^ʇ!Z-}u\\,,<ZWOI@uk <<㥋0AGuUDU/Tdp8bOiu|[ӔWƙ7(O< ʝS[Dž>UdbcF>>mNX_ThG+0N+<ܱ#8~Юqe$O"M\t˯a6yEz =SotTG\\'|2p*YV)ˑ<egݐPA"TG2MNA`3buq$e[Fj::"\0~3(=4D%*1'}CZتj\n[}Is#ztJ[}IkXĪ橻kĩtחpcm)}ΊȓǍe/'2P2,hJ.7nXC~aʍyPE(F_dNX&1?F6(Lt8Hxl$'zU߇aEP|jLMKE`IeWWjG(gYL#("@ A! 5'Z"ɨ"--oWO#Uߏ~?ی+tíP ⽘GJ(\tDq쬋=jc%)/йL<6$/Y5)Fע`n dũilgbS?\nиW_HHBMk>I:c2<}KBJgh 95{<i3I)DxE:3W_gtl;W\n*kS(n,ـH+'5e6J$!]M\n9CsUB\tu7?Y3jwx=7zk""F[<Z~8F|e!2BcLTLhlRFmp09Šl>a4>5ea{Fkfo^7*8YXl#&'at~voyp_^;S{`(W8DGD?eh@dz 0+>`#WB\n5s[rL<,s^5x<3'vF\nf(\0ށeϝ5ܓf\0C]Pl\t M@vz^wx\0OQCdҨsøP:w[yg8ff"+g=\0x]wfx\0P@s~_D/A]|QB,HTn=L(). Ac-A:3@E^->AV%Tv]S;_(b=$wU"\nkؿs#cCFL"[\tD[ t̽쎬W/B]4Ҹh='~}lrotx08H˒&\0S\\OgM]Fa \0(iM&J\n|^F=)D 8Q`UYC>@y3ʄIfWh,O7 yZ^-{}2Zw ?t=ǀN(%\\_\tZWQQ٪bg9M_/IsRk21Vjm2,H4[t߸LP;aX9Ș|G+lyĮhd~\t ۟}虾W3ÇT=b!j;x\0ҪtwϦ|vGkOin= .\07aeD6,nL^X+~kH*[Ϊ6vE_Kb#4\0쐦4YEWĔmr[PZ{^f:]ON8Q0|V$J&7功d=D.i(5oh+Qа\tk-v20~\nX>\t4b!%rP2vv읔 ۊ>[]O*Sf~'fbl^]|-r/>UHd\04 {$T>_v8Lb\\v%Uq/(xs\tŊ]Hp% ȺUׇyN{4E,|^D'攆Kb:C?2iaVYM2X 0Q90NYq\\B=\0|GD5ǹY_WETe-,J\0jv}j;uΡS5\0ߔ16-R\0ТDtt"\nD#,pκ(oUkV>;5.f߈vN[wȡ\t<e6TTт9ҔW\0 0z8uRFpg:RqvNdgzXZ!sL#'{Ky^'+b@ʓE"s)0D<q~Iʙ<ozaSSe;(e1q7jyny2&w!O;F<m\\t^*BCAͬӠ̞sưqbC}kl'@ܺ.]z̓Y$6%Y;JQX_d61}w2h\t;O:sBuk~gw*;dqaGy0%l}E1=]@[]т 'M1zZ_.^uS<2\\'$I.{x5v#2fgVxbS:R|vAJp>ޡJ+KR9F vmN#W= x~ikkW<G-SJsձ\\PHhKXf>qPA^o5V/-@NT\nk-`]/#!(>Uh,V{6`t`WUf$ķ5Qlqlk}s/4{;}Jm\\)v]Py Y]uƝgXx\0F+P`CNO%Tz)ŀ@fiF;,r"UFւ@4D,S.L{e\\՚8\0P}^_ӃyYq]"'?s=_!"VC8\tƫ89VEr:U tNؼ\t NlphJ"3CMW;36$11]9HgqDR}/Cۡǩrw\t͢iT'! )+W"f|---+\\pۣv2vgT* >zy25\t?`w(FD+~ ޟBBc-}_ގYjKH+t/lYJ3=+vvSGoI/ u^q~X3)pBҠ{z\0iKK\0x\0iם`J,T$qޱv =PZ~gC\0=&Cu-亻(%G>_ڧߏ@|Ef`D: J>';_|.^\nP&%WcvۓR:v?RB4/2C%;i IL~/vR\t%V8U1اpœ9'َKtSS\tm$sS/|$?eC2gIw1Ǫ/RaL~l)HP4_6_SP|f=jwg7LAX\tc\00nt%tzr#4X]h/d8;&ο$2ƩiVQJ0\n{EùAGKl¥תm<!a\\@\0x)P߅ԴJH9&Sq`3oKͷ9\tQEsg XGs&֢HEeT$pP*5h;k~^g5v oGw95SrcfHvQr\\]Z'v81WX4d6EWY4S!xͯK4Ӝ N)'b~\0\\KȩOR-CЙ?er\0^{^L\06w=PQ{9-%L/u>7tVΓ%X&H"ȳòW̚ &Kb 'ml;%aҪ0Lg\\.ܪaw)T-(]$J=ȘL1\n;Y sr!>>dh0!O [%OEGh9\\&EыɆPB\0ktj=38h١@M^. NeWF=wo"5\0dg7ר|'{@reYFp!RnIq1ݜԈ L+NRV$?rZ1%$d(/@4 I|l |-?M{L2!K2|=7+, ބ{ .N{L{.\\,1,'#6XpDr^̜<p(mP$j0b:nmG[q);sj]i̯?ķaTwǭըʣM=M&_GRZP%oRr\00Uوg((U}\0o6z@`J=c`?o8d<V's-lmBBM\n6"%co+}ۣþDؠP8kExdm#|)lڜVGruJ x7\\ZUr~氞:Ք/:A'-?(f;LU^X\tSY2mCHubb;`w\tJEOAe\tE룂\t"HJͅo]xvbaz!P=Ȣ4{v,Nl)G0\t]kQO7/_kBt <8Bxa\tcy'!u&*iS-i"-n.܃;g`Cb`6G{b.Fq߹jf礦qיSt]!Xs"6\0lRUbWyn&z@yh3aGeVE#VۻPP,\tbchWVJ<}E* ԦP_PiF"زp(G\0TvѮJVˀP xI4`FS.bAxnT\\9ukn0Sш\0_%'s̀bD*Uѧ-ťkeە݈t3:A|]ZNq,`S{X~}hwcޅD}dcHjzؒAye\\Lk&J\nɑCfo :DN̤yp+>-\n)جX@8EhDCŗ\\olpǻ/3?Ҙ هcyƋ=EF.yf0mzþM΄T;$ܝrKjZ&Ar?h7_XiWIfem+y=G:Ɋ|Yz᧸5 U:kjB#:PB\0ɅM&iWp:Y`E\\ZQ%(LW?JE\\K 5.Fawa;y2r`1=sET<Ų4yvWv˨QcځzwHA&{BU!͚fOpZJ3(O3Aa9#F;CWA@1ٍ]?F0Ran}L_~\\.OH\nh>$O4$l_\n},]G./pAʲ(vIBb`MM*Mo.(\\D"9-ډ5uتSAydaX= K]G$ޓ@@}}%vYdW>\tƱFڥ?\n^ATE 9kV?,剩&lbÁ!C}rDbY_]L^-Q\\{R_M3S/Cʹxˤyb&I.auC*Jf*$آpqfթ#(N#_:}'mw\tB/&K*P(Em⺀+{vFhQw+UP{|l,߲4'BO!/`Pcl+pk6"{-09ߊB'֩힒ZѤԟTg\\+Cp!_sF<&etÌ8vaS6\nF[JG3.W~_syC<'&O/Ce RtĒ7!FX~\0[/~u-PWENiM$,>kAϔ]UVݣCaAyя-,_S&~\0lO>,@N|t{G\nW^/)`@wTsg(]n?і]6#o R[F3X5{扜W_f Z*Ro>ivt7elt/"W+y-l3|\tPt;@$+tXIOyewe{kʒe7Լ7vb,a8Ό3^| | )Ң)UK8pRpEEÓ|H+Yi廛tnPqқіיՆci#\0ݽDBłzHr-E![})HX)݈x "\0^kƿW%,\tPdC/;klō䚴/aTsC#`і5%pʻ]&v7mRX.|iΚ6\0,mǐ;W.j3[j"C\\(ysaޞK^\n7eP`4zL5N!яi 揑k,ٗ"ZI9lc/,?EmĮųД$q]w'!%Vd3qRYLW!oz"wj1z-'4bgUbYvn\\@\n`9JrҺ:DM0V\0ꪵ--U\0$?ZWI9LǓ:4`ST@ZoڞaK/xsa.k4`7e08]XѷՈ!}8Ψ3ۉ/@AYlŵwHF4-!IC.TDV'tXS7 غNXk_/#O:{d^Hghɿxqt^ޮUރMT=ob[17r"WI?ڲsU6D`"YEJL`ΛeO~~[ܜwbDplηxӌ\tֽ,OYD.z#yzl^(פG2^GG6us1YX`4tfYOT;NC{zP:ydaE~eiCi=y慝)W%MmgYRAr\nE+sE(tZW?\0ZMQc!;#SUaoْ=s-?lr\0n<dͱO-Vf&;8XT WՄ\t|R#O>P«8f0-)ƛi\nsppd\nǔ\0\tYPuKϟyk74?vP#F&?ځ-u1S6NV|昝!?o6`x#}050kf5 HD~;c5:lUB:uO0f5J_ UOEXuVxMIi#6N.g悹E.0M`rx[g?H~ *Sia0ЩUN:o.^EbK:7\\!(Ofl- s_mPhiҵ&]c xu`Cnxz/I7Bi\t9!Ft␕qt)iVw,b1Sl6w!I_Ľ>p? zr^Tb==`2gl4~9N>rs*1hʄK ktߣܝc4ݥ9yr}ܐEMߋ-=R˗OTCCa ]z ִV-Ԏ߂; \\`0;b\tV>Ƃu\toeچ\\-labg:0<mDLkb&H;+L^I)Q|on/VA4bߢ{^Q9"|lQ$T"F{!)_w}XqoR>tdA1ǺWoX<|:?dsvPTi($\\[!QkKճvcY?[I}N|Ω8#Ķf4ѣvTaRȉCwlxWt\\b (-wt힘049VNVR%5xpWX"@Ѓ6Ȯ}D,HH"ijb\tT&˜h;=7,rG1#)e\n1k4)b_\0E,wѸI՛u.>b©|XuZ'mwVs!N*5Or$@Za'L"?hNX+|/`E4wU" [\\ئU'.v4}nL027I2.Wu/[˃ EtAߥ@3C-swkӭrP8ix^i;beBB;}:}\tjq5"G0Mrɹ1Zi|ʁnYpC>$_J3Aj{i$4.x^fJA83㳒qfG#K۾4?w.c4t'Ґ_J\\/̊Χ2dC"7Іzty)`I.TJ̞XBF/QM:i@쬧v-@Rt2p?se]bۄtf)P娅w)?Qa%gJ4$:{;?*ol+O9>5ljꚽAiUh$;*<\tyV&cڑD}V&;DM-pTePFwgYRy5k۹\\Rir۽_IUjZo1`=Zh4\tu0<ޚ\095LwiIj{dB4~"E֜<B\tB sR;DmZkH&M$qEK\t˪SO,(ko9k tfT|f-` i]c;/EF"x]Tss:]i+7V4eBOc.:|khC[ScQF5?}FHp$/&<:MHay##G=V>b+QLBV8dž[dLd\0,ټZ(\0lBM1KSH0/KnIxeK8[<L+Qh/nɀ91Bw)[h9u_Q곖cBYF$)>Q佅!b\0tP.IƉyyV`\tР& CIm[o.)SI`@Dl@M5fcW5!Fdix 6'wefm} MRzYSk~4W_dIµٶ)RǖĢۀBoCf.@jWߌCC6'RvIRX8=YR-'ꇀuXNj&E@Ss$?WPpmHG阜?vnWrv հ(wcTET\t=`aP^ΑW3u\\2h:5#\\H-2-fc;zWGR%!xj˰7Nh\\Dyޔ;S/S V-'MwWQ\\:Fo\\qzC"E2@'<B:s31MԚkZ`/hRrrg?dk"&N\0˻Y4yD0BZTȎ`m:>lpV{xAcG<JޣI&VlQ 0f#8&Io8qT!rDC4<ǖ@T{kCBR)śѾgLp+0V(!]Q>H(7ML'Y&faWEE7"&w{kÅa\n3- ^hwZ.E0jn;'idaZ;jYMf[< !y\0KQG˳}^%̽Y䈗ڤeERE98T?+⺡uv\0CC^lWH0EY%q[~@E1iP\0C-2[Auw!/cBeX\\*5e%7=A7Ic|PN^UlʼnЖj'kt@F0ii80l+,$E?s+8<Pl;=j-\\C\n~x\ncauHwmYe8RT*@~|ɘ>v@ M|?RncZޭu4m5آhI%eƎSԜsf{c*;WR:?L/|^?m>}D5?\\hol<U.:2{`:$&8|RHl2bINVdy[;^|{J*樹?M9Qd\tpQڗ)lQE/=<6{?nv(?o>UcEnURYF6W=WYZ-Rx/ܯZl?@\\~P>*6!xf:~Gb2Ý湶L8۽I w@EP R&9s\\jY!lٖP[e~<5M?ZDT q\nYfj|_̪zEqPMӼZd.'`'?`NUP``\nae˛'XT\nc \0N_G(Tσ)7a2[fR|Y̙^͒~<v-{'}/$DY5"+Vi-Ex\t\0T{NzJAmqL\0ƋD<NjД<i!܁,raN/C"CCbOA\\|1`=\nEt2$qz/jWqظW8t>gp0-F&jPx5?ȸ].xʣ*]G>3EDvxSXR0+"GkxX'!YwAYڵB."`iӁzs%]?#Ea}ŧ52t</<kZZ==*Y6|+k\nUn*nvP!Fo/cB&]urQ@A];h;Vt\t{ˮy#7u2Mѓ CT"H:3Ŵ\\JY*ݾE%!v!(4u@Q?ބY9jQ|H\0DLW\0_Cxq;}'ߙ&Kl59~PɬO~m&+pXQ^^5fT_M/cn|,ʇubrGB6)U[i*]hƐɑ$gkK<sKuYPXZ/.ܮ\nv\\7&40JX8DGM"e'LjVa@H\\k__C30m8"4,UL-/mNo#V3Xh`bQ-4kX_jrB b@QxgǐGLl슾]ߘ"b/P}v_,jYCSv>`$;XJ8A.\th.s?kkָjj83eYlkVYK<oelԻQ(%![YqroR94w^8N)Mj!yVir!**cz|0ڭAgUMqr^Dž4O.hhXZyn8HY^#9ݗ@+TPe߈[=@ƐkP8~eBʼnDdk鶶Q):5T(a]~?JLqh&NLdƒ?a-4fteb!J&|<Gpd ;r=p5y;deFtXa\ta\t\\(Vٍ0\t[jionr=V755c}64V-²犧\t.]p:X/قKc[S\n=^I+U+\tnHC=rH1\tlT\t'=,E`҅\n\\\n!lT*Hyu5Y)eg< 6ڏ=&q[;6>+ǟ}.PݮT^/+VV{cb!T:x|֘4~xk]vEpl*htgq&jtRG6"y~r[rܯGTF7x֘Sч\\o,s]O\\'CZ@ܲ]G\th=Uioс.ab\\e]IX=$3#0;B\\=@ߖpOXt!+k\\gls[W!{C x߈47e~r\0h<n?aAFfhweN`S`:{QJ.C)FۖDeD,&V]3h=[gt 0Y S@!_A=N}#yOjc\0$U^If\0ш\\J@{hW\t.zXf+$C$\\^\t'#+揻T7lO´|j RZzRy<B(@!?X7Dﺸ5@\t쬤 7vg 6#\nohQg[pvNt7G!| k%idȀgl`F=m/Q:.va`@- 7n_DyٺkE{VJ%THAǓiqFr㙥?\to2vN iM>OV>G%]Hx"W\n[ys:cE|莏\0=_;{n2N.JL\\<:Jt<^pO]r5UF\nzmyAN!EfڻTPH*8|X^wb>8aBޡE,bM_cZ^2s1u7`K(OF`J'<qNs<Ψ1/\nt(@V hBN8vT2*gUд"9z5Q\t4\t1slݤ|kOڳf^_Ɋ`uq2+IyMiPwsoa?~|-6EgW]e$V^5ѼY0lJ>ZT\t8KaT)B3~ʓQ<б-1 RFXa0cGz\ta<,[69_: 9^VJ2z͍*s2dQkdZi)\n\n^M[B\n_G%o!nQ?sr?7-MS_5ddq1wDW|\ta\\Up|=I{q\0u7:?d.~jAy`>VUؖF4`H5PԾД*`f dO)fvR1ZݟL9K2jQTH^-jumMga[bTBp 7D]"ɺl'xKC1l[\\#wg-EwN /p2pyO};q!vCBs\nG+|D:i/vPmn"N\\=~\nE}]~۽B,{g-S.Y4OkSwQ&U35<{%,\\Gi@o(\tԓ"ODGnd[Gc3!W!InՆ\04tDtb]Qp+yٍͿ^\n=3?nK9jRCpC{<v.lKCkpRʘ)쐂BYc9N=W>f%.tKLn^E3@,6h` kJ9{4:a>7M.{|*f5T>24+^͒ZO^oMJPaeWvyF*Ɇ< Rt4E6ݯb䩋Yl,) \nfy_"Yg~{<2e?TfbpMNwc ިKYw(ꡉeg6zň+íMyDlcָTZS-PgȄ\\u4ɔD[5zv:[;)__@¡$@|Ώ+4[p@xTkc=3*TC,-*;~bɮx_[TLb;_Ӹ?@zre>6NCRzLϣ̳+|NT,+!?U9r3@X=m`"B-mVۢ .'mϼXí̖7P=/W|M*!\0MB\t&=I#$/ vkŠ߰l49?;/g}--nCt.6iLf!dI3Abi VH!0t,FjD)ЮVK]G{Z0f\0}j2,C'#!/?iҒ믞0Q~pLs+%E?kVvwFL`٦)}UρcdF1u/\t4ص/妧ˑ(Zl?anԂ=&`ٟ_~_f?E`*c;LHQԐ;˵А:L,pXy.-ueK5)'{]GJd8'̦sשaF#E0IqoB\0yv(72@eg< \t\\fYK+\\ܒe{T-h]7^ӫ p2D"1pyG6Vl&EͲ5#_]3\n|\n9B!\t'n:fkũ,Vz@\n|qP~8CAWN9v1/0w NCtMU_*`vr@hW̜p:/.Z@lYTV,Hێ]( F~iԶ{Eaˆ'߅ع|p\\Mǰuer!7$[k=I(RƺVlC<ȗmf$.c_mc\0o^iHZxRXwdW1|c{~,g@~TJY}LqN{VM}Jp뺥=;-C Em;B"Pě5f`tZoFOtI۶^ixk*ruVJ/em\n{=aJgM7\t[,HCLgs'NIl*E˺Ucvz ALS-/H21XSpD-]˛5h6Yah?vڷkmĔcu7xr>!Z#-a^''?6?{&|LCNֲ\0̭x7~ocAFU_`t~5[ϗh5ecl`ޕ\\'&VhzFr.X4x;ZԦJb-e:1n\0Rn!jr&s{54(Kl ~<'ׁҽ=KQ^ZJߵzJ'֍(,d8+LAډg+D$u=-.gmZa!^GXD*&TOM",Ur٥x6PŁbB=š;\n,^][Y+{eV|E+<kΐW]s̨XlSiø_8'yRBBKzWvnf, 0{xb_a*ۈE_YmwRݻA9LL5yh2H5T2U 30.;Inj_V͖4CDVn]#`j=2%154a#'htJӎ\\"Bʿ1m{j~.~*{uׂ;'Dz7U?F\08M<n\\Gh}bƠ}rT^ofsǍ)FoMo=mkZ<_z{,Pr>&7Xkꌡ> rApߘp{ihX G'lX2Rt&?p\tG];OK[{@wP mۗS9,i]9BH)K3 <sqhՅ[u,=Y_14B]C|ߛ^7m9ot'TS»]_V"xCb0eVSʽ3GdrTou:"|c5rO0\0Y'DldZ}5Vʺ1zmSoЎ\0$P"VUvƊ>a/S0̜o+C}[=[/l|\t, g=cz/TBJmdžLn?WdFqi|ZOdxL59'S-\nJs&ben!!-m?>@Q6x֩^@)X91bv9]?\t$儫?#[LVT/x5bR&Ҷޫyg13괝@\\-\\IHhįDJF Jn,9FIJϼf6vZ|#C4l儣`Ń2Wc|/Oc)@{8ysG#:ԣ !yOə܀v٬[UA?{5c\\FA'j.Rf>=D>V=ݥh>?G^y{pȂe3.Xp76*\\iy5.8p3tZC|H8͇ ke.|?$]$Ak֣F߀k"rN&mUji'63WKGZ uB %/= ݦ?ₚώ#=$R.C+GL; \\AƇt0CJwuPP皩ag,#@p0(%O#qG, ,WfPh\nEfDxz5"^ ua{{☹sf[LF:\0,q~5\0ږ`<EtMJ R1l]BK@@9 [Wz,\n1ti[S3e(VRKfsɁm]99HGv\0-tb?d.:W`稲muP4:q394|:8\00xՅ>TZP_\0[{\tZҀ4VPbEʮQOSosmNvpЭv\\\\Ki|=!}Ub_J[\\pbM%o"Fg!^L1r(Mʴ]qHf\n47M9iGVv0TϵU{|XZU\\zHoi`|te<MR|=xG#)?k9P[\tNNY?uN3M(%_^)Y=WzV_}DQmJ?>QhXtVlT\\v{$sKjOR뮴nCd{mU$3i`\\dΧWB9\n@v,Bʼ=::6I(c-\0`ȥ\n[V>6-^o?wi+EYZOs,ZY3<vFP(o6PI?lA6ODdAl <8YfFH0PSMFFDAdG.zWcUC-$-WHɃol?jsa0XjlJt}ra_m@nϬOB|@5ħ9^ݕӾ8!LHS\0bz)F&/ P\\US-YWR%.n{ rglj\n0@F^4-EfIPmXOW1F:}{lљ&sEaxQG[\\vt~2![\no}aGJ4\n0'pCCS3N1&D×Ȅ*ed5ȟQ37*'IFYsEOI"Ӻ@z P*k!H9u3H&.>#?by/8Ic /k/V4]u#:UWC"!"c=?\0ؓ1uK U//b'CCGČĨs`'d ZzN\no7\t<j?F/9ՠ{b\t*@"+θl .&_LT\\38v^}G>tKWz~lu7D-`'{%(T<a`F> sDsܕkJH]K2A(8\n ȲESr;IR!=xMT<CcaqfuSI肃`.7خa$Js6n\0J\n"m_cJܸ 5\\t(Mk/Pul(wCf(\\̵VN# D?*!ޕ4AWtBesBX(Cz)Or鉁SLo4{Z+0mQ2iJ<õg3&^G`OJ8+jy=mSMNgEmlw)(տj 7 \\މfNFN \0GJz'_tZE>9}%)ԯ()(QVI,dޚ) "،~P>fS'ɔw>Ml,DreϓNP\tuksvxF ȣL9\n&-)e6XLWrgURTHDaxul1'-ʵ4i$Mxl/{EXZApHTy<͕k64vE~r9 iٌDLR#⤗6?q͗X'TF>zU_)0t8 V:vhSBϗT)"8a:jS >:T.fH4gS55V7wˣyhCpa.2j\0密@lj?4Mq0-_1}گZ\tAcp´gexP@o$<x_ҞL'>\0S=zwWA_ |Sɳ;0@z_z5'{M<UI>cݸ}ɴAbT9rr[Pi'V9;H!d%SE7NiZP:pNg&/J݄YI+@oX3ITY5X~8}(0&vx?R4JP3ڕh~ͼ(whn w/aHU\\`(T<Wl|D&R@hX?.zm94R$GA3:åj?y%ZWťU7"q2(:Mq7LO;q{L'͙+;AWh2nix~3tt<V_f9G*^j}DsS_5F5Ajv|Ady=\t,2gRȏlnj~Va=8"<UMV;IAe""YRߒ4@S@yDA1qlK|Bð-P8n[:vzki&.s j;T,G0p!22YBQ,serwXE-fr0g)sl"2:*-QP6B腟נpC*84ݜHdO=A$/1Ww8Um@.ǝp]n\n#6sQFb]0j7\\|L=f;)J=R+Ue=pgjI!ڡ[;mqF(ds\n 0@s-4>6>$=Ba=\tvSR@,!m?%Mc@zK^tк{7nk\tp95\0U$i"c.ׂdXns}|}c7{NBmq'Sc [H.B2$7Li'&4Y., l$2^z,\tf IrTw95S(j,!\\S,t.|V=4ˈϪ1̝\0e+.ŀV)\0RR`YiG ,.%~4;U$oQ40e)(`wIJ'L]uiWH4`1g\nO]AS(yk tPEd{Wfv\t,!D^pT~_7 $ zfK3FkAf˳LPOз3L |^IȇT{@ U#^1?HϷ}ڭ%{):A0$@;Bg18\\Zش umw92.n;K4x5RDmRATp@H<S{T3(LůSv]ʈ3b'ղAA7AقC)ֆ2KBCx}EӰI2Dqm\nl7+7N<'tP>S hOL#}OYN:/l3v9[jj>~{ݞUyS5Sm\nIҊ\t١湭\\UU2Q^2Yyp|27Mٌa\tWނa4p@yah\n~Fؾe`85[R:hbEE^`LvcBg~6bf~Iȃ.f݊|z2Q@hh_*\0S(+!\0;z4`gh=\t)S@W),Vm):GZd!qWT+וD/B:W\\|%fx&\t|GV2ӕUKvSȒQaPpYswje*XaANAISAH[F`ɜ\tz$Xp' <R &L5[1mdLďےsQ+A=X~81BY=S~F ͊"Ȋ٢RPܺrSTliOھbֿ9.&BYۊdt]DıNLb!zIx伹sr$DCy|w1\\.xg4iyaQ:I kЊرgBwk{_ډi*AA01Mu]qk '/ɐmjG˳5.Va/YXc!l ˯ȝȎJrzm\0rFa}_I+{(:IRsk J"vhێÐrn\nWlq( NCF$ (8D\n:o5py\t%PYHosML-HY8!^V$A[4RJ6O;jP1u.fՇd5p>FVYVD+|$4k i=8}j%QbZXssƑ伸^LI:'! H,jه[%"ybCE]@bC>3h<+s$-o7]҅f,NJ찏q:oh~Y%\n~$p*)m;$l\\BE->) EMVuk( 6iq)D~*n\0r#o=QdhyVHO̙ROQ^r'\nN >q\ttf!hwβAGjhԡg_zXf]3SF-OVs-%1-c_\nZ-wF(W\n01?DAO_t%~^0"+<|A4L\nŪ:*iʌWto{*0({v*®_01\0.m]Lz(;-S)qМ7·fhyE*^;=OrO-`r뒹h>mKYBtdiG-!,ŲqdHEVb`'g{B@Xgo-Ljnz[oa&/')Ҫg?NxIB<U1iL@'"\\,@9mT/Ԣ-p&dN2`sCzMfKsÕ)Ͷۡ;^W-:r>JE{P\022 6t\twO>9{rv|8RbNnE39l?[l-2vwi^J3r0TX!b@Zt4\\<1wBu=.kYg]\tay0y~qhVƦf8~27'NXkED:1lBs\t&]zdȩr//W> igfk됎%pKrIjpMy0o|])|'9}QwF7,)1m~$rl[pۙar`t>ӹA%UX(+k'cat7vX[M\\@_7$HDi/{Љ`vP1f'`lD\0hCBmb3f#D;a/Oνܺ9y\\(03٘D9rB-5@'c-=ͼ -'Vڂb6qNM\\%Cx/62/y*ˈ<\\ԗWl@ahXKNX}7X'!_z\\wT<jL0Kb:1rIBp D' =$EjeK9g|\\q*%Y(iL^M>a4IFS_\t;Ԡp<D?jK0ddV7Ж{Yْ({GN$QȃY9ܔBzM`Ҟ 6$popӅٿ+ĉbmBT'L\0N-\tcg4HpÑT'n&0AOS(io2&#ۯ^\0.\n0hcp>csZJ.ye$zZ+Z= ۻmO\n3/#0fšM{^Otd؝bE?O?~@z+%jM7\tnIދh{_n<6Cx衦;j|lM0\0\nJ\t4v8H_*bE$xUMAKrR0ꐠ;A!RV?y46FvaEd_Pmjjۢc̸o3c,McnhF1<-F\\nJTNŚs9|#6I:o4++L<*kz+ZpߠOfBHtpsݦK3T|$ܝ*#Ir+nv|JwIbzx3VVfm9-wۺD\n\0:L=*J\0ŧL@.\tna»Pr%%8ͳ!]Lq<L=RIrpdD ~A<8\tӤ, \tsŝ(b\tFg\06y\n]3`/`4ZWBSaA^5FC s2B] RkSҦ}Y3%?F\t-r]&W6.=JX]5"gA>#gne2"5$@WpyJե\\t|{Vh8}(->.&ҋ<rB,zp\0@vFatQF?>Oϰ}kg|5\0.1k _dҥӺe|=`,_J{U9=/|1L##ތ+BΈMu5g5&F.}6a_[!E4Z XfAˡiNQvw\n-eofnXxbSNb]RӬCWg`s^sW+̿+H1D\n%LabiR,f趼1ӺN^Ef$yXx3Fx*}\0\\J[O϶iiD R(0aFիVe<<OQ)'s۬O)#3xїwk!OS&qAт(f<䩺#KRu6)ImLgB"m"e]xJ`HXe)Q,lˢT-56"uadD4:Fʂ'n1ozjAq"%W֤.Y,ԟpOsAZbA@SlLofg{\td\t4>+5\\QH[GPb\0\t8%4Lc&iAiO3YsW<c`9`jjߟug523+˙"2QRچg=w2i:</_bpYQa*G5斳!AUGBo>:E$bsIIZBF,t~cu) TLF+rA\0*bW=fcWLAZ_r pCI\tr=l%h/;A71{ķȏnk?Ga9mnBį~BJAM<7krVLE/7>6<dD)KORjyĜce@b\0Xy+!tl@FVhw FᗟB.Ethʱ~S@p͚Jn]4lk߮2J1ZXrarN\t?d;a\t^1 _D^k;Gj.j<# #r;ꗦ/2X,\\vB">Ҽ\t&Ou,] MUTDR6q5B:u}\\H:>`f3I*E-77[[ "@\\X/@PY2EQ**5X}e'G̓hSn9_\\C٠}k#q}PuB,]])HݗZy_h{>c\\b7ztgý2Crʥ;X̮3%߬mlqH$Lp1<a&K.o6>G~tm;KNN@wgbR"bQ{DV\020bq<:uj.\t Q7we:ÿ)2ңFȝ9JF?"FNPMeqל\\#*\tÑƎ7~N㟀W.QГBF|KS˽.SڵzW%Z* d7(0lb\\jXKs-Ḟ)U' EMVG#q1zOFC5_,V}J/Q1")ќ}$\t%=]̀WfCg2JZp0֨1&@vXp\nH[\npAQ3d3VyNSn_蘢l#8L|0q@\nSqEL\tER`\nFez@ip+z3&T]qHeA%llVT+sK[C9B3{=j&MF}4n: V3P<GچaQp?2yԼщ8jjxT7-.(s5ʼnʎ-t8E\t)J\0X`ȸxՠ=n?Q&gM"gAL'A!,DH%wb4 ÞIRTN))@GWW'10n'-l.q"@qې,:2Ð+yE٦ƪKMmc\nS/ɗM5" wߎPY5ꑥմk^;5R_+\04c\0.+΄.i R&]@t$<#`}}?mT1tWCIm4spfpܹ#֏|~-鋤!-uP1%R(b'4&D8Gcy&&=X`0vP7gi@Xͼahg>H=L8@y=g|>a=d!+,fv aUڠ^R^˱FziƥԉM44}7I={Kk|drw_\\EVNju\t5J8ُjKX=?v4{^4 lu#13l¬!w%D|~x-Dl3pD˂,*#XXuC I)\t^n.eP4KVlq@xӓ ZϛCˀwxE\n^vrf@Z5NZn&tI_GcU[j"ڲ1<~>7%PFUhS5>;1&bϢJRu%4_ug.#?౸U>{];i˴t{J,h:xcޚtwIաL!)Č@iUJIx,ƢdJgd oW E}lW^EP$fvFF3 [X[svP6!k3U.'n9-"Ty`+Hiz@=Ij:D͠*%T3]~8)=YoDbPfu\0jEm1ZТo0)(-ѽH:|id<xKp5-{^Uz"\tO/86SDQӣ\0$+6,^^uP9pZ`:ܹ+:Ow046鼿AyجUfI*F~O)ÁsEi[[sו-&D}y4rIMC&zD,IoS=l&|P6r5bFhz4l.F 4jùKa\tUۺ1"?̨vrmC[AG,16ĝA{:IB."I)*\tZ`?+v+'E_E$оHeÉs͐bm?učoW{Vn$:"+ f;Q1,L_0)BAK\nE<Hh#T(xXK'Ց2v^wA-OGoV*b7c {uGlW[A;-\\7KLZɇ[bt4cf|G_P|Ą"<D_!®\tm!ϰi,TĄBB/X^L\n7`0))p~1V6f)oq)=jApX3ʫ7/݉g4qq־v'RG8گ;BK=I֢p}%WSf%ۍfV#jMoAj4sXgת@$!GcOw7Nz`nO/fmEb\nur֠Hg0)r3rPw!)S\tH}hK^Qpfz}-bָ7ulXj#zCojacʱuJ \\_MO(vHI+ڃo.>l`^:H=rI Q~Α-?^ϖ~{_3ku(l .4`j"B=Y*v-rk#[W:E skn߯cee QJ&\nfg+luC^[\\k!<hg+*w/P{rJ]،S^JG& H~ՌӾLJ/CsNhRQV.G1|q rEB.G\\;2uصy{Q݁Ϗm?Nvan<2Me- st2$A8F7,T/?gUӣ\t\n|8ѢgkG]\t;_+17!P9 h!lg}uCTv匐xVTi\tkHlR$n\njא}`@I?H~ߒRsכ|"\0(Ȭ.~;D$*fw"yI\0>={ٜd4+Mωk\0CpFdtTd Va\t69ʠK(`3ᘪ0 ^lu-ÿG&%4>WK>"όKbΕHZahk}e!f.kta=?]PTAA^)_:lO\nVk=CvF"K90XH`rҚp`)ͨC"Phd'ډI4R<rpބQ.I* Pf*p,>ܦA*_43FTd|N+CDAq}t(kxE-^bګpBvӼ߫I\0\t5]?K6g)17OIuV/zکLugBrYjx"VQ69ZX"1kW@NT1#mr\\ם4ΦqA"I>VZ/3JHͥ'^`Wm4}?llh>!`p6cD;/B)hF@~Y0`T]\\:d=(?-JTo~%t~:='-nTPK9-Su0:Ƽc-FoqM$KFc(9(axr}8+%+Z?[i+5l)#DrxTB ^n삦'UDnhc8@&7tpllSl^O/NF$|%W\\fj1DGCTx'w!DJjPptM:j̅}et`yPC/#E;dp߇>.}.ЧBީZ5 nĂOagC7nKj[v\nQ29tz?}L҃d̐ å\\n\tх__& `pGa+OqAP{8EG2Ъ쪶|\0%+h1vE΅>t.IS#¢\nU;OzrW-\tkz䖒t](ӷ8|3\0U?\n'3|j;} e aYQmᇤ"bXfJk<RhSɍJMC?͝$lz/_|^(6@[N\\\tqcHeQ\\kEmj,Xž-G4sR-+qg&\0c?Lů|^)ӂKѽOzWHw6v\tt^cxmtDO3Ó1P.Eu]wԄ9'ݙ}J%س`J7>0H\t\0iQcO\\qSsa0m ;:aeEm\ta6PZB]K%\0zEcH"'̟^;ذnUUM.p\\;;{HL=}mVt+g5pϡ:\0<ǧ>WWUɥ}˜WTq.8`jb\n=1U\t0hGB(uwv*Mf$rBWf߁\tq\08/ǫE|e#sT9%!\0QďF)г_6>ZG%˗\0{.Aga(0NxgsƆVT=eh$ޫ*5:+eKHךi5U+Ԧ^ϸ),9%+-#rU@G/1,dyq4YFy<⍩WtB\\N0GhP`R*EY/NLj+IDҾgm/;t z ~G$4ˉ<b淭JfG^=8R&!WA$MUG9g>:R+r\t&ÅVaKxn6=$Gڶ|P(}x<CPWƠ>9Z_hEx52ސl\nZ\0}[7S($T{$g'*6=!a^9E%FW;[|ٺ(4X+)=\tn'J'Yr`~Nc\\ylEs')}2Sz\t9֚i30sNwI|%M[wLB.QK2dٕ%JEuK%\0\nh0ӕ8-eWX\\eLO!4ܒXRtw<0 = 23:ȾT)I\0RMEf'Ru$rpP!@<cߦ8?2gU9PɁ&2ﴀ;GҀB.+D>ѳVW.-u{n\n'\0\tCpB "j+Xk:TZT?6JR-\ni3sU\0O+2\\+ƬsZ={v<0݊Iu垅'qLO-1gM̤TȞ^6tp3Ѐm~ɭPYAQpV=Eq DjM"0ᕋg/|Ývȓ\tLGEZLX~A{P鉤!{]v-)[բ@Π\nd& #gq"]`rIN}vg8@#;kOM%7]Ta>rkue)|9ҼK]wɲ-dQ-%O{iRu@!NP%j˄&PfC,XYüUe}@M@/XFí;ڏ;v^zp\tߗ^ZBv_ވuR$@j,J<:+WTC`NeYO#|eG/T}AM}%(Ёeֲ>?\\dpx W.D5#\\r.II)^\\ˊxN5z4s.%U칪G#Ā/!~0M\nR:ds]Oc:bN)XXa\nbے7EXd&/z4!]ϭѬBV zzWFtkyVoo{+xKaLp.:WyaQSoR#x 6Mk@~e`Jō)tuEsezGY`s4NnBf`0?3;2;cq,DoEf']չEE\n}4ZvL:6\0$`F؉TLyPF 0jxu&\n\0@u}5VIG6*-O(زlGaBx7Ɠ(X0Xyo*E&?/ܗ<iWk%6=vu?`]xJ:*#pZ [l~Jd]|÷60I-<c7[j퇄i4xMH+o+[X-̫F]<W?8LԢ`\0c^U|J|{\0[ U*P(\0-Ӓ(1ٙ%蓼ב@#ݔM4a>wtj$7+ц p&ԤhΜ$USO>Ix5R.; $nmAB$#.,CZV0Tć|- AM3 J3h=Q)D6֑z[>{\t}qbWeE?SL\t̩%іY< myq[lB^`PIs䳑%W> 0D32~k=>-cH{moJaÆ)hv#Հ ¤.J&G8\\t:as#%w)lbII|n%P}0<Z%36cnB̓^IscU=_\tnw$jE{vv,&=4q":!~=Rus6.0FOpRw\nj H2"JoŽm[ wڜK{UHeExMDz7gs_\th}W\0\t_\t0JFdXCe'z+ZJ9چ=fP`ACM#|3}ě\0?e~ФAb 'Ro5c30~cdA݆=5A>?giu1캓?JT$\0:}ZSpY6ғ5XgK}noP?{a/,֘ПM,h"ye1qM?v/q[%0ʈMh@[ D4~[%Ў~F'u<R~>+Sq)x=.֤9\t#]\\o7J\\,<gn~JɒmA{y/xZ^h\\3{>^]@Nm 듹cu!z)ĹX@cVC"^์P\tECñ^V":Pa. Ⱥ"ۛܠeϤJoIkOC8IK;+PBg~,.I녣W(e)_x0j\0ڱ~w/n'XBQWNUa8/ݒ2/oV9o|)ӈ,gΫ>2:8>Q'>!6^zRp'Y0g ,<^PG"E?REnjLŸ? ⹈?p0\tkqirXxY+WO^?8+S\\,k"2ވe$0ʧ/ya0Q}</e&YyA.7采[ߑGR{'/Sم\nTxʦǸ!p'ߠC]>9-LbjLy6MпA/ytMGmcmbƜFb\08x"jଫhOn<M{g̫`r\nR\tr-מ(wxrEȽ8:38)4.ӥנ㏅&t=L9<y_#m.s\tp̬+@Q]r:zwؘ\\yN.{FݵXt;>+l/bC XO2BքpccCO\t?zmЂt|Ll{>92j~/CK`8כolVg6G6n|&,^ASx`P(s^hdIBojP!3Z!6B/ުl0E=fWhS$f=%Ÿ32P(pQU5iﺩVʍ8X f,q+2fOPȵ:2du$h?01TUifLMg5|>uI\0#{A'.;^̸m_TھMXB"4|&1Vor<b[Q:/VEV]RT%!*[(%yɱnT'_`\0qAHz 4B0l\0\\a~KuA;F8ݓ)\ts'Ax0m͙I;8'~rnJB ̙/7"jA#vPLv0d`&p^X9nkj`AW+apm7k?f<l.S/l>2ܸb\nύzهbvm1\03uףd}a`>s@Yc#ΡRbF7l) 5'*'8#<{n3oF8aW/ѦH|o# ($'#[\nXO.7!j!g,bӞS@cYK9=*J'{*Nʄ(Yl+ךAlܟXo~{%O($(pjj\0wD/Zn|0o9Q4V2':@ѸyhHf?>*t3{_{$V%$S>sY%v]q5#'CGv8-H\nqymV\\Z> ù?yeYk6)!RihX|!qt#tl^A%|]0^GtP_vZ%)֮N|KH\0D0WESrcMHCU/ݭ |\tL9wV;:;1Пb}4)\nSʱ#lEgxqŞbJ6+31-ͭd|}"CGikw)29Gqe8DT#O7dOO5ioXDexJI9*/gbW+Vx_4~2Z2O΄%@ANAW>V??V5ۣecG(!!!QP\tGǂu5IprIJو#u7@ ,0AĜPz")?܄b5{r-4MmRȧ%'>]4xejhs*oD2©6ޣpl_z=6gbSÉZ"ÇT/Ң/Wla֓HKU2FZ]嶀mE4\\%ulidzM\\.w@L8knלoxi$Y{ݎN+9/Z\n[+FBN1Ω@#~-+*x+8!_xB~$14 ~=/ 8%c[$qIGp#S(ࠖƜ^U!\0'qr#Uܦ.i:D^}8śMYj$;a7 +ͥdtlcSl@F~敪VB졗A\0z<ޏnw*:yc ~qXP#ḏ]}u b%+CKF2sZ~uEd6ZlAOnLWezabbts pؠtA詭d{ΛhAeھ&Z%[qlST&}Z0%?Xu<^݇KǸڷk):H=xgHn?07|'FoiX9,3gKAv/l/8i{s٢' vFkQ"2Xx=R_I)aAaqpQ\nȲl>0]lUf`PV>F|$\n-qIS Sh.{{S9".xLlW8FQ_+y+]hVKXEc&;=4]\0J/v\t>rnSZ9\0\n1`P&2G?cI(&͚e] P\0jUk"He{.nJ.m3?%'}-Lް]"rĉ~5~ِAO+RM]zeL6:=M1M*a褭5z;~&yO[jr}e^p2(rMHA,AirPB9p`t^F>$j{KxHjy1p9\t4Vė*s>2rܠ͐[\n\0\n*B7J\0l2(ƙ((kmg&k9j<s V8+]&?cT*Ԣh~K"&TGOU-d]GEL˶kz&Ckm'/8UhzA* v"[1xDN+lnF"M)^y>N'A%:0~ώEе'|ʕcyU67d&O^f3ȿ:_I[PE3PFO3%Qtf'j6Sp<Ԁpp!Y̼1;;Fdyr_k 8#BЌ߹9V\tR]ȎzefIT(pC wuYHxN)-l_Y}刽a\nJ5&>FDV'g?CgE_>w0#p6V.9$Cjr۰8\0N$u~ɢ.6.R|y1&Juta=fԡʱel`J}UZ2%mF1Cn41r{$\\Y@%3 Au`mnagCO=ז9CBu^8-DV\0 ^xdx3N4> &jyE(-"o"Z.D<m\0ߚ?6Չ v9D*R^Sz9n˵aLښbz%jqvı4a䍁nβ}T*Le-\\6iDu]j]dfI-iԼ1g_r]Uo{LJ+Iuׂx\0Bmֱ[l{C\n}Ђ[*\\$n; TfIޟ lKtfeS##LiyN<c8Evn*$rÔWt'8l$>c|op1n6&[Ty#['{06#LqkNOlRJj8%2憆7#~.>ALχW:\\JD;oyt,Dƙw{p?6uvx+KZᖀAWbYo6`6̠y͖xҖeřڔ>T^;\0i!4T[wCP3J>\nx;"\t`N}HiS'h;R^e2ĎY+7צ h臘߁n-MyO]n2_yBCbi蝂"'kdIOE!K733A@Y,Os$:~0g2HyCjOEg:Q|\\Wr@S;S~4̉ZJ[ԾSf@}\tbg@+GxqQ\\^d\nk3n{&yrtlfYM@,9~E hOQJ^v\n)5Z3o}xXA;0]:6Y\tsCM=c\nE =r&/z_u;ʅԀ\tiGuV1-/IR]pߢvi\09FAґ\0lc"0.Rx4yΩqt4yb&×1ev>4tpM["tL\tT>I'|4%bD\\=t3/!?f=dGҍԲ{s\0G\t}ɇ)=J.(I=;a2_bo@4ʋߏn5Fܬh-L"\t\\r~D?I^u\\>I4ْoErTieO߮SZd9:vNۻS&xh_3rlby8%c@Ev z >0.yەT78B2fמSXĘp eG6u膘656r2 u=>2p@T@$pXEсyL[\0V41lF\n<,2;a̛{ ?#9Jpu+nI~D[D&F2Έ2?sZ,Z<V>rIjwX;UK(՜T%'Sa|\n1RoQYO9\ti 80Ɖ^X&ˢL[L\tB(^\\W=M7*\n*N~2oj+h3tTMze@n4ɑY1X>5ͧ3@`*Ȟ9҇Ђx^reYQ7dq{F h\t4|b\\[UAGtO;\0* hF/6X~'I>b0s\0M9/uhE\nS#f)dn(AhE)g{Z|C<ؙlaEx(ف \\1;YEA`VY$eMCݫݨ}\n8^qŪnO,̽*Dm{CA>.AzHPQwO9L2\0z"Rb\t#2!=]~z"Ity?GX&$9,_2yߒ$@qR43#zyZ#sPKa&7]M8+ǝ@hnwt0Y5@ۼC?@gqk {K3WlvJq&uEo_o\\(t1i,bXi:j{x;l^ OJFq{=!MD{Dr+``q}ngOFƩ-OP\nܗS3B)9"iH/C{4u<v$F;B%U#ՕK,hfѫE\tx.Ʈg\n<Y<Ǣi03A.z̝Uwjg\t$_\\qh*<I\\>#j(:>8#3a`Plyb/BeEgoiQe\twBWKLiHE//\nܳkgOreHcāv)j&\tmWEU }iٱLh#qoV bmN+_~@/Unv<cdy%daewlȅ{^Wst_fWjePEvVebek-8F,斶*\0&M=|dA:bs,~SiYԎI{]=V1XegvXZwmEiC&fJ\\qƮ\t["żǚEx?L 7y©ϼxcQ;K6T}ei}Ȯ+|1˽K0\\n.}"$mρ]x&p4^k ۣ߭"2\n'qo}ҷ:Yzc\0bb\0x~RΆkhC\0dqvn4U>IFXϜ'|n#QŴa\\fUS'IO1gSC#~QXe [wg@f#LwzcEj 5"VYfمMUuv6 ;_(3炼Rp|sSjmvi3`閆b;.āiFϗ7t?M6;0U\t\nYspCt4n/\nl!]h?b0JC7^05n`ɧUV\\(aϠ(ISb'>ؠ;&?PU|Sua[yvztm,82=eK7p6YLrˢ۴aFE052e<bnK*mĖ8n'|7~bf\t"(Ȁ>|oqGb-'x{,+i?҆W1>iJtS/yXcMU'@Пz4pt1-G)Gڏ'<??_\\B24݈s%$2G~w5\0)ZS\0+PX'ܞ}wޕ=!v\0R \t륾1ψe5M\tܷfo\0-n(xLO/)i.UbfYI{z^9k0YSA.xLEJD'IhdEV@\\szOaՇ&Yl$wdžN8Up#ndFe뙎q6u=+4u׀顙Zb`_O:YЏA=%v[߆bgBnѬf:ͮLXƏnR\n^DLfsonAɀVdr%UH1J卙?MqAZHO0N'hOsX\t?" GW_IhѪA>[.u۲j-6=H_48$?"ݵǜλr`nNIJFO)ȧD,-QUYT4&'b|]eND}Wf:iFu'kY$s+KA4ʹxn/g}pHmWFCtyΌ@j6»$u?D![)3a=vk:Yeat` 29\njDLA\tW3-Ym:8b;KiTOۄpkVq1#\t\tGw&rLR3Rc GeDPoR\tk{RqS|'ت=kfqE5[8S\\X9\0$<xuU7\tv?֡Ѧ/Ŏ kPu,ƛ~<~o"D1O=bK輻!IKboV)Ihp.|:`&wA=Ny$^g}2,{! 9XתYTlQZ21+AIHABTUg}*/EiY|a|7sN%lJ^Ie)(嵖0]t2BGF2z1{|ڽ2/%e₫rOM4)FJqkPpŒL;?r]](lj\\ڶPSԆ7QNl㩆4/{-E/8ݨw銉]|"qZf^f_9-F)cMa(@vS>(oWQ⊐[v%$|d+QYaduu"vN\nP{"4/sNyQGKiŞI'\\lh˴#+f"93[m-T?P }U,:-ؚtRpnH}QX_8j/a-qe4;^XT3i,U3Ϸu[T@g\\ؓa@)Hɔ+PՙH2nې\nhO!kS{6WGV2h?T+,ʬ4썳l$=KPߢ|ODo+3cOOK9,}Qׁ#(P?B%a3u3BnB5n\tGwA9mvЉbxe m|a\0Y!({(s7kHQܛu2%1EQcW8WHc*$ j$0/T2(\nATW9i*PajI$bX\\u|Cw:U! R_5\tЯ)q%Cx6%Nߏ˟W7kaZT5l;gRȝǻظAJo|_o>7sC6ڂ[6Y{gO5h /;.V(e#BC4u@Nu߰w-wj*ØT0żuP6_1wA_9(V)UAST]w$`A\0Q-]wdx6ws@qDW^ϐtYn r<0yי|WuhHYۋ h\0sGkcTHP7&ԉrf_;*w9eu܈\0b +EuF$iKS.Ќmgچf$=;MLRV0}F6^fNBK:i5֦Y-(.36e"FrvAGػq%\0SVʖ#xO.Ȯxs7čSyuuw$xm\\5tdbZ_b-]w/]J`.S?9xdiD>GМ-obaCy\0KgIPrrg DzJ@}՜hk"$@i%@w/sL1=H?V-\08%o'zB!?ف{hre3*`HںLfQDQͣX,(^YVoFgo~1GhLeʶc~R'J9էa\t4~PK({"iv?G[lmS7khSP$!YyV2~v[ qh.,ă(4b=8C$@鲍&Xndtl.Yb0QN*U,'=AŰ`USIK-ևCӄAhyk4p\n0 }7'Hbr":RkXBs>0UMl^c}ۤE{G'<hBT`\\ja9cXB\0Rц!X_Ooؓ"]A<whhHq(Cg4"5/eQi_]+zGqqf>/U[XׯA{G47mZ"VG?}'s>\\bE4\0|%?pJ|ǘe#Ї7%cLR`=L-Ml2~Β9]O?8/^S*Ij\teI`:]58"QF9<pTpJyrp\n:ΐG8wol\t¥%XT8`Oq2hb#{Do.wr5rrӴgf$zZH4p=#I܅V=,ha˥RU-6Js$fNd\\$}\044,ar(Lu-\t)! \n/\tM2ͩY-BQPBT4.F6jJ;Ii#<!:.ZݪdPnd+7ɚV.mOy@7i䋇/ 71x_8"Lug ƖDr**$cхԴ&,}ue$z)B}Kܵ|L{39!7lb($mmZx0x)4MP5H>j'&B=Q775e;6sa|>*tAO$Rݖ3>z쟷ۍ=JpuBr)FY<|h)\tůiKjq&l~:D{_ibcцSn9'ZpfB|K:6mhux=\0Ѻ]W_Ԕ)k5G2䓐M`EU;ݫmqs_z)@ˌ|T{<SiӐeIj}&jqZYDŪQj0,]ƒDl(K<iM(q^lZ33M1i'XО!9_\t7kp!5/l'l"O'qp}&Gik}=R|UNnM4 Oa<v8;^5Oۊ5eN9*َ_|.Nƒ1K,mݮ\t\n2|cB N\to%:pUoEǕ3ims'$)G]HYÙjJM-WN(s@湡ywx0bzK+i3,OZKP2M_ӆjp@Zl2ZFS&oeu4s"PAlr{EM#{-Az{-S62Km(1xD0\nN\\8fЎzD"ZrʦqzJr\0!F!l|J!X+S+GYiHPfB9JY:&E?!̥F,&S{ϛD2#dcy+@=Q}<LK0nE_(yط۠}?Б0'Z5X4Ac/t#aOdUS?r\t70oTO,wsETB8=UvZ~%\nSGYm<kϲ$~y|<ܑD\\FZEuQ\tfv: X;<MBG%IW{J:QIpl>I4mjGS_)oxt$"͛l0,qB&p)T B3p\n&Vҏ5l\n.ReRӜ|8[#($^^\0"sK\n=bzT2og8o^8\nή$4WɔS88l4HZ,?vs-܌矺hE2ٚsu,~˼T1YˮnDŽxM RW|+<R}wv.$b8[/NtD\\qͱ['a'0*F91N09\n!mꄆ^av^PKO2X\nFV,e')B8XCI6.1N$˕OƖr1ҁr&Wh$<cE_o/ȕmDM+#+^۵(/cvwTg= gVȨ)ԙc0$\0+[lۦ.*n-Pdula&咲)%tYc}9\0>)PW2=8u%ȏxϛM2V+\01&%22?o'K1/_o~@P7V(Mty:TYfAT%f!B$ѕ=cAi$4nHLG7.T3DL}1NZypXkh%,̕V:_uz~:۰U"-0-*4ݽ12p/|H"ȲD٫ҤE$/\\"y)<~{XD)6\\ \tÐvڕZ&L,4} {D@œѼjA٘=e#]1OӬǠ~ LinZ>~<giN^4fmaQFZC}m)#]Eҿ?2h oCv[?== XsFqKgZmBEߞ(2ks9`~gCBSGմ9:lB4ĻT@GWF26(2ߜC?L\0#1}C2+O\0?rCT0x0ӎ͐3jzlDuEAixo^{w2_\nY!hU8"(t<imz [ϓy *'TE'A|7AZ|\n5 ^XGHK=fJp!͞0qG>3*nΚ!0h8yrLs'X4X['\\u|?'D2ʨh1>i~R4vFMh!5{S'H7F+\t\0韂C5vEUL'h[kΒ\0;̗W w=\0*`u(>@!>٘Wp'{%LYSQPC--YqY g|v%]f^x6˾?[t.9Cq B[X2z&7\n}݇Se QaJNֶY=!6;AU&jAm-XB.2hJS4Ǥbyzl/ׁO\tzӒdwfF{(\nYBo+!C%0垄,XZ\tha:7``9!7XJuKo/&$Ց"⊜`\nHF5X_aA14a⋱Uښ_LX\\bR ,_ؔzP3VQhE^pF\n杶uʱ5!| XWܸNԯ߯#d/ϛ)4L`d2X3LgU+M?SʊoRYޟUХcn!]`TDySI4"f'ؼa\0{RA8 r.B8,_"eٲ@#C˓5'ARPE<))%A͜`\0P,W99i=x͑B۽VKfWpiaZ+Y*wX3 ]15*He?Cm;yPo|epӨnEqA!fd]t\\-ma/ͦ\\ZCT$nبc{݃OqoaDkl<\0DĴ!2p3T~;R4` dt-P-e$^iՌЎI$-'Yˬzn[o\nHy/\nz2aM <7=t>v7@rr(w֔rʬQXB4c2=DmP*^gmAcwPXͭBfr;XI09Zw]XX+")x:0sts<Hϗy(1e/w|>~a?|>f'boֿ#|>>χ{?{O}e>~sqn~A{|;{WzͿ[P=zK~֟ߗחzX\0s#67tw&\twީ<pf홳r=nT\toڦ0]}JDqU/D)eBn\nd:\\WԄ`L<g/q7@93$kõs[T"gr\0/8\\!lcl8 3-l-xN4eӑ1B+a[&>\\kю0wyj齪Qȱ<yBmO%R\09GE CW\to)7n< &w>^!@SMZf"+E6zBH0cW:EƵ"n*5.Sxja/In$XGwa!dD_5qX||+O(L4Qvƍk%n?=5RfKv1LfHkzSHWJO-N&`g|*' [ۑ!Z@xI#m'/SrdQ1?M>5g#V!.*ڀH%^VAJ\04Ĭgy\n}0]σw[/Q0uT-m9%U+aH H27o}3 <\0?(Kr;<%4P"9.ḴӤtfOt|ɠAq,q%<K5Wn7W%4EF\nR+`ˊgkU1i/rM[n/)ڈDvW5[+퍩EEHt_-HRvGߊe(n5z 5a$D/PYBsHRkM97\tApGfWi\0*nDU~@ޕƇZ]# t3!W>}X$\0eV&̘fjMM{\\wζC9@<\\m37K3l<OM']1Z{2?xͼhRMU&;egu+F\tM:Uv1eP kPJwLq~(J8_>g2E|Jj3t;S9儏My|GVkA~;1ml4>{.VbNN2 k_<-T=Kʤ;v?F4qYPj<A}bHD?2W<*i7o(g"Ex\t?R+:]I';RB\n \\C2cZK FP;O(\0Ǫ]_:)m84>em:gmnc%"蟄lf7)YLfQqwC\0PB^0-T8\\\nA=j_%B{0E*`XxmdVGSF!{A. c^c'ߪ]?Xu|$llْӲÿB͎AQ'>ۑ-O\tzk1khAm3o3S'ܗZP]䔾f%<\0ǑsFg?;KS%ؐfSF1,l8; |YfLu~uw:QV̼WXKK2*cvu;[aP:aBm;`Vl\tښyU#y"${8)QI#U!QUjlE\n\\ʄ6Pm[7UO٪Ic[33`9^ד2}2^I9Iܚɶ]q(=5\nٕvGNM^"\0\n7!i\0klOxn;Dx6Q\t^,e#2A0LqFbզ[jR)t~C>MNbnpjuȮ˟[m=e%D!L^/\ty>cYWAi!@-W<NiϰyK*(}pC2]Uץt;"y,")g~{!Ut\\X)UČ#;5/ƒ<͵N\\.hF&Zw|͏ DONtb$pk_7T;PO&K[.-ѱKė4"l΅NlPmQ6D rr[F-J0Nӓ5\0g+:آ\\3mC" \tj]);q۹qE-duݐyb\0)bΦvWB ;IT|MJ:e\0:>-i'53PZ͙,.]Tv!0 ċ7c},!Ph'eUAZ#]X~k):K%0B%& ?AV&!#Y<OZ![@|-O\t`qҞtTw**H.ۧ0u+`]8e:o lT`R=Jed.S.\\AII9AǀtBq[CqRK J*M4rU-}M!d1]k))팚Q?{3WK+{D2-47-pOO]ӂY\06[\0hb\t]2(#KHvN)FP_k0nP2挞qFZZ\n6ߡ)ZKcsJ=z\t1H90:)IQt\nL aVĕUYEB:5'X:Uw}J]ڸ?7q@Zg'F'Ku*Ä⩈dG P`ύ)AOrQzþ@@QUG*!5clȰ7ŌCAU3iy"!W]&$xܮ.J<7s^IIS֛tnط3^#<s}.-adY 9,X&!Au=DQaS\tHq^slDSQ^:j7=^{҉8+tdy4KK*tMo:fR'ĉS8/(GE>̬}2by=5ߔ{e\06o\\rD(M5{}{"ס\tr|'u&n|H쉗}"e~o"g^H͘,\\o\t3H85*z>^2*Ed-Lڑ1JJ +1tɆ;b"=<)Mw=KG4T\0tkWQMpP=aD\\V8Vȱw"}te#^2LHMYr:#%+ L\t!>N98W\\CKV1WEd'~ab_=BZ<R߁֠$rA\\e4hڶFn@5Q/Cn YШԛ^,PL>fzaJfa/XQJ&eGPN}\t].h{+=$t4hϓSs~9V*m59I\0Y²qreF~@C!j|AυWDOz/qbbZnΝ%^l Ԭ[f,4W;a^航-{WB>8qt7a:uXtZon!vJRo.gvoڢmwe~e#8M{y{`G&7|sV,y^pUso}n]cK͕%yO*H@\n>z @\nl)O)"rR^\\JN3u4"mC\\_o$/eu\0]4Uz|h):۱<ޗ\tG1!|2CI/yE>+q"Cҫ< a[~ O,_nPk~@;M1{g!6ZɱTm.^]߬T hG&>Ӷ8\n8:]f\n[+^"&-'s,L*%Ip.NÖ->R }歅FAbҰqY]!Y@%5+qkc4mfʜVɑra0 P(2elK&ße]Ae@i8y>LQic>5SaֽSp'?Yd-U.~\n&7q@2RBsiSɗڽ%rܩW'~s-VJO{>=h%GM!k{%fүpmϫ'eنOp\t٢K\t ȴ`Vv@zNP~oR<)3d^f<jH@k0{G\\t+/!Ckz&yLѦyqi2Up#)L]$aV˪uI|)dID\\zG)(8V` 7|=:H*KA#b\npZ_n:|=U RtLT?F~`A}CN+ExZ'=CÚ<w:q˂ȣIq~ӭ-v&5{Uֶ&5+GiuO!"[пan|#V"/o^T|*&ZtIR>P5Φ,$o@vK9ߨ$U\0_)oޘ0xH0?!2fwS-Vy)v\0-\\e;-gܚe`n z\n江Of@@\t&8,U{pe+L<cW:oH$5^Ka$LG_'X\\'AI@|>~\tfƨYO2m%:$P IDWjH]3reKgG/|t¡,\0z?"͇9/Id@(\nxNHp:/)1I WT2"0&ɷ|fޔx~TVhBX9,kO-2fd{S2ˋRx--̑>j=hZCƬAF8WA;f\0I]<(r.#E2٣zN?U-X"_uwW'`0r_0aSܱ$ƸiQoؚwꤽbS7_y:)iG|V`L+$b\twii9gR%F0R*ROpTRoХĈ\\#_=\\Uo4TyKI;87B0M˂Sr^w=:g?ֆ^A\n"\\hUҏBzF$c~EbbI'{ XBs[42wQ~cwԖkj$^꒡61*ZAn\06?:\\9<got?!5)^\0VJۼ!*8NeDL]+e8$lQq˂42t~±p`oI8~c3<UGжz(!{Bf-yh.HAz@މalVo݂-+KP3B /<Led0{®zb}$wt.\tD4k{&Y)?G~\0b_:-lqkZrSosbMx~7P#ڿG??^-~mP=`QT_wh:ɖ\0+»hGY?@K\\{x-)Y\07gaCyy";2Nze5ZW<O+U6o5\\\t¼=zh }-Ldg]>RBSQ~K%VTl(f5_;!JχM<i|rUa+Ũxa~3*pnZ[=t[d*4o=)Ѫ8s>iv@dYY^o\nfp\tnKTyPWsExu, <`{JE_)3N=/\nhJBkO$g?h6Jk|lըmC33'5u~%.2[^nlG'Y4DQµ|cԙ2S!]E@Fp2gX}[**\tWv3V$w6?PfPFV- K$s_Z2:wV=.|dɭx9\t] >rbW%jo6\\C=":[%Y#F4@swA~=X?{MmHO\n~=DL݄\\fSr\0}1q&#V49٥6Ab:ז5H\nKsc-I\0`~q>`a(bscpH>t:c'G;"H]}(&I:XȡhIƀpz,^b̀1`XS)I`!kEY{hY>W3mЂs)G@)?& ,2%:':țrhԈ汒Gfy25͒H}exLK߷^<*l>?wX,[bLdkEpքX.o\0>`<U\t(iSYWȊ2yHkħrXYD{\\C&u/T$pﺋϗ͞~侵M>{qo8\\)iU_jԻ[ўC6zu,%Gcv~WtdG2usxtqyJ<T瓈c)-X٪|2._uJ4"ǍFŗ!Fo;<[{?{H:9pjH=TyFvEY5G(l[8!0ܴNIj]ͮ-B{E-o"j2|\\GLuA@[fy}?wiN8f-$$0<E\ttD܂jYcB`8zJ4'v1]2k+hzQJiv7yb<F]jȅa)r>+FI81cD|Pnx։y7y/&/4@;7YV<(&\t_a!]ձOVI2Fc\0YhӞ<}鯵J{s>Wei7o-ut`ϷR]@@(azg%{rHdzFܦhښl$F,prwZ)2+v\n.t̴<o.?bSU7]¯`:"!l<c/\nuw_ikt:) -2㈥(_AfE=\\ݬ9)^=>VI.qa"">bZZIkC{YX$M\nH} 4l_yvښ]\tP)֥F O1EhhcRq!A89wQp'M*yQKlE'Fu6_GZ>Z\n=检<#A5rc2=-Un)xxMif[HK=B-'mŏW1IkQ+ze1Wv?>s3vY,rl7W4,Rq.pbO ר2aLڂ-@;@wRs\0D^ΈSVz\t!o<ʜXmqE̘X5cr/FB:~?,KE4Ku-S0F=}e)8`EbT`G cu"2丧o^֢)ro_7`s1zJNWHx5$,L\n=fMd51O_ppᯇx)%u|^s&w1Tw {w8PwY{jἧ&h%ZN~wUz'/glEffIum,W%5*ZgVIZ(2XGp\tnX6;NXR VZP3OBL6w-\t{5_Y8p6\n3zy232[mn0t ,"8E`J..݂W4Teya'<6LΔQ\n[>ݨa\01ngbHxS=Acs{ A\nP0*gwAHHWf<?,A̷L6/SNbqdȪ%vdste~1]x6XN1ٷ)wDK8}+5tӊ#Z1eC-Izl bsdg\0ῒέB~`4URhDY7˽Wy6t9&Dk\n2\n\\D'y{\\¢ } ?XN2%&Bs0ؙO?V#1AJlR8Him] GNpo|28S4+[P-JoҜzunY<;5-8;MJhӢYWCD\0N\\ϏdEJL6R6p~_V(ٞҼ4J9xހZ^*+1韎29x~3O#/"^mkoEӐ]#f/FQȟؘ< )18o_>,wOGUA`s5=1t"iV_2{/÷2p`1δT^id%5\0~1l[^%iNմ9IM3$~ScbZ%Lj~XO]Ac6^p\toBvصJ;\t𮊰FMi<zjuK$Q\t^\0G^̉(N &lb?_܋\t"paD?SZby-I'AT]esgJqhTG&\nݯM>9òuZ^F:эbWc&;ϋ&Xk*UB`vseu Zz>7DF02\0ss4+2UdxHܢŝ@7&\0DرN~AgfվM7)[>\tAq'IrnhR9v\0T/ɪx w"yhk=htrևa!U"M!&LQp&q70K%m,9cxsmga@8̗ȨnXO=Z5nC2)Y%gXalwNK4\0Ę,41 Uʛםǜ?>Rw3mzҽb\0L͢ԷIXW7(\\EB$Qޕ/#FE"`ߕ#({d<Ca1y\t'J<\\M(z(j:{|8AmB~]dVǏX~6ap91fJpa\\ʣ\t=v/$^oq1.d;&&&dv~D42m"oCRP\n2.nXٺAOTu6B9Xz.z7?4L!FMP1ҬXV(\naW60]J ?Tcd|PT2YsW+Gu"Mochȩ@^*\t1@2,˘Χl.'sC\\\nۼQ~/x3{}+66bj4,ZdD3J57drp}0i`@+:ɝMZf0:Zs\\gzԲ8\nlhGx9C&)6YpY}ouHј:5&&.Ց:m|ZrAwne'ኰXsmq^\\:0$R2'ͻ7d7]@flth/r<ڵaB^}oNcLAqS1; @ }r;Q@xV1&0j^C[n\\Kk~:qOf]ࡔzr8.VO/Bٴ_2B)v(RlH#Уdž6/6-r'pKɴ|X䚩G+ׄ'𱖸teq7U9Z煴y<R(b?2̚ݓ-ua$BxxT@=ErSब>٤WIqNNgn|iTǦX{4gbP``nF=2/#GIM4ɤ+!K<h?=;K͖8\0zq?(:dJ&\\2%iJ1`o"^qS -@s&*E@6_p4r\0Z5L͊k7\\ғR9R\tHEǵmU_款$7QC\0~AFvA<U$W:?SOpaS~L߭ƨt7ِRKԄ4G<XoY`]y8,o+ [7Q\tىU.CFUg;jlEPiY8A[\n\n(g/.C0Xޱ\tP`m)5&̻_(%)̕۵˧!C)LO;ash,#S熥!Xm4XWfŬ-uHu:̘d~\0hĸ<t*tFKrԋm^Hi6wھTMLWhCz>^ժWSAdܝ;C\nn#Lt;nZaXD3rUg' /F fm?yv-\\Ed.vbYɆ+ثrУ+`",f]͒Ջav=|o!0.Ʊ6v8`V2LwPa3H}Sk8509y6pJWX_HV6zC2Jf< zGT=}t>D)\t%Hu6tfIH݃")iTJ"\\6ĶǖȅUSWm` Ldr^vL_|Ģ#pS7+26d6Wҡ/Gu7/i|oQwl<vșeGڴmNYRNDmY^S7S5\\ßc"Qga‐n9Ck̀a<NXAGS1-B_/KԆE2~ÌD,-ոJ{87z# E|ʛb5dÆꝡ;kQIOb%r9~0Krߵ<"IS~#)dRTT@+~,i~crݤk<u:6ZͪüJ+&RPF%\0;MvdPӼx憥g6QJIuQLv,_<FK:'5w)&/?P:WwzC5n@WDRb5Mcje_,<7=eAؤERI卽%-q1ZKgC{b(RqӵβȲx37։ z?L# 3\n?&=\\m>0\\wQs?O6߿}B֣(fxx@"[h;ۖ3}W#5'^mߦ-\n+0\n%&W)e/xgbj˂YIǶFlۊÍ)]3Y=a:maghAy;5[{;z+!2*@6s0@u^6OS*s0!3,OI]\0:'WOJ^ټ,/mE c8~g$\0zj(z=[\0":F:5w=J3$$kcP?BVL`lL0N=v㝡^!vߌ>ǫa@|Ak1rklݭ$t +$ǁTb8/$W;`f>Y2c$?kۮgqw. |\n鄖ϰ7{K)t8K=UHt*f|!~lWb$sh#'.. o/wAnW=~oWER|\tBlx;ӺgAitf|5*%Snykc&ŕ12@ɹD?D-@i9BЉ>'s\nֱO5 E)hxc-eߕՅǑ\0sOgy$BfC% aX?L/F)Ȱ*5L En9LB|HNݕzt17h9iD2'øTz20#@S%f Q5ٱs"FĤP51"RDs/^Fb@2v|oIOjB!!0[Y*6k_eժ(HB4Mx!L1Qnl,q!)=(&U"[-Qnt^^8ԵP1ԙ-ܻm+z!$AOr%y_q]sʉݺ:Hk1W1jn\nF抓IN/R\0έQz7(f+}۩"廟B1y\\ʒN1qr1 `|NZ^ޏ:G)ls/K\tFAWq컥@u`0\0;cnd}0<6k_FyI~[Iwc%1hwT3+hβ0:ZҎ"֏"]\nGO]yWpf|ϼ,L'䴳C_E*V,T6dP*/,ރ\\FY3â'0/TX]./V8#A~CwEa7lqAxޣNB-8^.]|G5\nD~(}ww.*fN)XGmھX$b\\?-^Vծ$\n|\t3~{ZL|nB1poxAdE0߾k;Ơ.ct:;VɅ|"e+@;vO+%QjH)0afs-VF"ky{\n#(rRtDgIV";a斩WtM$u'CrF,n;{z7CaOJ#4_,\\W(C⒵;XV;r=׆Fѿ"\nR~\n9Mfl4G(=\t\\kɌz:s2$8|!YG͐Xd1`DZB"QȚˠ?V&gh^,z\tMɟv+|%4nrb\tne\n{P˿Mo/S|̪I+i\tCmro2m 8ՌP^oeS}[Da1e7sS_3keA㕾ZNwwǴ= AaV\nVE&VOֵoQCr);Ѳ/WGef.;zbl!gCϪj<}Z}uh*meU[#̽r\\|73Q$If0\n'XS`<uh _Q6-DF S+<"-!J2J)|Sb:`{?;͖mBScψ*MX? eYkk]8s4E\n(ks֗ΣUv6_&sȏUvNHi>S6\0~Fb*sxt}mQi rPCΜTq94uh+'P4Z//c~@\\%oI\0UC<{nOذH7Qd4Z~ǩzKrL܀cȤܠuEcÇ8YJ\0,A1-PcE=Y(V/~WY?(B*9aYadtUD/6]:HX Z6,5$yR$)YU:ݣnMI4o\0GNP>Q_RaΨdG3ɯPkZ#-1cw\t3=7]\t"Qʯ3;y\0/gk\\6}κvn~zWeSB,'Sg=uO혅O!Z+L^HzϹ^O!Yx7{x^c,8PZc1g nC%y<LNB(XƈX~5c)/Rٹ4nzcc13rcj/h !O4̶s4RN(\na.>_|5F7L zA+tBdhSt"/@9bavҗh_w*r8T(NtI4AfXCBŤI}`W#%\nϟ\\W(:IhX,28ˈ1\0mpŃt0շ@m89^-(UDAmFc)Q/ٚƨڂq]2Q"0iM^.Vϙ4?#1M̆<ȡ0\t*[?뫎Jc@Jl.HAHx,_3/7Az>\0rE?J8,bGcXo-$ϧkRf4Mm_i=u!-+EZp',}x5Noml/SsQ%㜀`$x]TZ><ňUo:V3"}Pn㘏q!Vvvz5^ny*+|%%%4:111]1CӮۅ!k^vp\tAQn"}ztzXI?N|ݤCVh7_`1BTBJ6glg=dCScse [.M-hM7\02n AyyoK1\tT6ny-TIí08@Ȇ ti@"d"6Я)5ԕ@8;+mPR([_OO4:>\tӽ/hM/G<mUp7gy3Sa[K)C$K+'R3j]dk1C|JB[Ҵ٣-L+~R:Ix-rxKKm;-#-$Q -\\ "RFk;"e!K9tӀҼ>ciT<"(+ǃ,KWгh6tlYF{ ٫uG#%*R'3?b܍VSˎ!g5W=XT.qjH=LTF\tY^$7Vf~X~tE`^6 .8ⴐX\0a$?s_xớA˥i'uJgFKia& {,|'g6!\\9̭Qxi|u<`HY]_/W\t6#(F-t}AccI-FTX\0hw@Zc(KrHL,<DA`kK==roњ˳F8<qe3\tbϩr9{>7T$Xbzra=z?|(q*RY=HfTBs' 2φDøZ1PTӈ*f|6;k@ɻD{n^Ez0 EWc]$ݴ[TsRl^oEݱގ?FzՊK\t G{Q&tUܴ%<qtH#3{YD`Ԧ2^vcZp\tpu΅kUŐ1dH/bu4H-BmVX&W<-ByŃQjGn?t&H{?1Y;t~ lCmC?,DQ;P8OpZ6CS>2.\nFָC[]&}XGSq VڦAűQq>EgOKΖA(v_R1AGYm]v!-[EHi41d[aQLzY#el|.@TN YV1KMbaY!SyHgվ?~9\\\nb6sV!3;"\nsӊb1,R%04K Z∗Jz>Z+"dt~D_T_ wzaD#*8d<q}L(%q+gW_ʕcCo$hdV/A?+93*#ˌ~(p,ZXәg)kJQKK7F>Т ȅecխM>aBq:Z]ŐJkh*w1D<D>MsWկ]ױRQMV/(˿@U\nlgRh8*:\\WZ3ЯB`t/87b%NvnʷrJKXzgTgd=Y.YG S]`/iqoMOCy0FJ*/yK\n_X#"]3&ڑ{? _<!CcrzS\n䒮I T:Nv"dQ5ڬ\n$3o2(#e__VJlJǢY*"vȏ1cN|#*2uTRpyț"pW<jhF]GFx?BMxn?`%CH>b%Jk;}N_"6T!2YO K +ug?\t΅3+-eZySTu#fC_(.z!(qD%Ÿ\\y^2̡X NtN^w:3R~|L tg-)PVN\0.qBmŀ̽}tƩ2MOSe iY\0όo7ӟg~`s3ɽÐt\tᢆ=@acÚblVFcj/jϳV ?j(7\n{X]]~\t+NpA)8#&q_-OO\\|p[A:OE>Olˌ};<!/IJ?\\ GNK4d^$݂C" %/)DFu[ϑVAQ5@{OC)8GmQQSg<\tl\nUiNീGNN6=E,6gGQchi1ɾM>Ι)VqX6VޔLsddMN5d\tǘ3>K9y5~b'^70# ̆ݭ[\nP8=X|ga_wVedhSV]@\tS8\tGy,-FfᮘtR.Nci.6εZeYL vZJܺFeL\n^>Y"+s' oMJi愙hp_x$ꅢvZܒJH'R$PARWE'D_+%z̴P$ IJU`ƚ_Su12̸#k#n}n)Z[cy*PTn\0UBS":p#g'3֢@lQwyCCr)5Z"8іP\\Q?o]XK]e53ix(WS;}4N\t\\<4֫leĮϥ[,V.a44y&:v"oG0iʅW\t+6 8ms4G`PE)\\m5Ja[G0 L~ǥǒ(0(Gr?@o#?˄!L?[QI KOiXБeрBŞjCdž12F=\0⦉[*8>zC;;uՔ[1!ujkWSm?ڸ*#i lG-i䴯tSAn-??UQ;3BCrrm&x5QZ?|id9; _ש+.7`I=d>~/\0X:twKSh""7%q.mSMaExyIg~bJXf*fgB4:wqʎώ:,blⓩ\nB@&\0@;C-M9]Հ0s2ןw\0Rht]YÅ2t#pg;\tC)VvG=\nŹҐ2BwuE5f?Jto"OޠN-tdoctNïHҝ2?gF\0nZݽXI&l g(xYl-C&FD{-82=DXsmB.\0'<~0U|JnS`b:jli';:H=Nl\n,Rn%j6Cb)"sp];Xvm 8`64KO\nÃK.^ӤՠTۓ|͊3WSVO#8KE,tausUVݩH<hMa%)8}Btuj ƀK+b.\tQ&Xݥr6(.q$d%Rkygos,<-pAF&@\0TgR\nh5K#FJ6t֔B\\b85l&O$q~;-p<>yb2]YͰm8\t|k'z+>I S|U*\tܑ=sj+*b0Д]g9B&Cya,@ɽm3/\0Osai/>%R)Qe%qr>(Hnb'})d$Q֫]y98Z\0M`+);VP,AET!^vWB\t@lBD`/։MjSO~v$z$ |A(Qj;OVVVmM+C>+f<,hkֹnn@!ߟ@E\\E6QAWi*mzWM6%aS^h9Vfח$G'\\Igk.ޤ9QDuhɇ&\\ebEP)$`]H Vroie*G1)gQx\t4bH'1$`|emCU\nȖDcS&fLh,{F@m#F\0Zj~DN>QKX|Dy#a'Bʇ</gTz^;S4hNJdPm<qD+TP*9>T2<B"xz=;/ؠoħGo>z7V!ShS&/"/)X*\0,yx]hjG|ƪ2h(Pn0A5#AQ#&ZKp 4aJӹg'%fh_X;g_(G`Ff2' \0NؙPwkӆ;:f@5G;v^@%DU*=0\n>cdEVWuXIՉ"ukwX[IL;ZauN,g4$~rw}\\:O_/~CU:ZWFEPhN*wڹkX\nȍ\0B DUՓRG!53_ > _;`\0||*nM0}QA(;'?CllJ,Id78ZS2*10SO^IJ4q|.3ΣshdIw=$"%GһO\tļZ"*9b_(OaCaԐZ-pAIFW*GōfH^xWq"ʍ`^?vR5cs`ڊmRh-X냾Hs"82}us#O1:T9J:<>V$w_uzcȧ^_(^<S*\nV>QaR l4b)$UsiBq.쥉NJ$kPH]\\cu`kqUPaL$縧>F|,U$;KORض=mT@ (ҝ8O{*P~U LfʺsͱyJxao:1"=a{u}h$˩Ei\nk83^l#dz]ûM3Y0UYn83FZ1V|5z:R9\t>88|I8&tXtQX\\8cuc)xEClpa_pJBen!%$[LN\n0!Xݘ[w/Ÿ-ؙ0ǜ^8Zۉ7zWF\t{i[L0LsΉ?3Ƴ4DH%Ē5S>W#w1LxcD\njUro~h\t|naƦqkgL.\\gǾi۫¢uk[I-n<Ct|CH!/xwaTFXA,.f)@soaS.sQbSFjֹLbp7V$ڍ}Ý*Aa{\0o0Xt2\\yX&V^t#;{?B><(TO\0ZܰeKKdl,sJ}E ;Fi\0g8\\ʽ"JϷ(Bg+e$p{\naש=Csע=G0BE\taF=$rmO\\1i\n$!*vSx[`++KX&PYsMsx\n<|[_S(/x|7Na*">*YuΨa'}˙RKKy 73{u$\nrQqT*k\nT++t@W(~1~g]6ޡia\0E׳-zP~*j|p]{]\nY3}32W\n.)*1[䐄⣽PYRb#ld>\04G,7FLt\0avDW.;|`z@23zjQCڕx<)Sq&,4\nQ$ٿ*,ت0y~Ц@,<xyL.y|f:z\0+Ju^e*(,#Tt E,@CU,//vqNyQ#ijc#`ݚSIk u&qJNYgRm^6ztZ| Q5)\\a4p[$̵\\IE%Go7A ƘOe\05*=a ?Cƹy܆\\/o5ed{1~)ӵ8}mbrK>=^B\0WZ\t:arT\t[Ujk+Ovī!#qᩏ`lfaYO~%=ӓetɆ7+Xx sy) UZބ3rkRwE\\슱j7f.|^\tdB6\tGy!ņ=[s"빒ov8^.3Vg9{=4|\n72s^^~*3sg:F7Ӥ=EqyJ\nÈ&\n\0F%e\t>oa+ iXt[N_Fjv2RqW&[#?Kvȫ<j /HͅwJ>\tFjb5pozвG}аY'w)m yzS0J+g\0]JXm@?SCb!rnJ\tY\\0pnӚ"R" Rc0sIDK74"h)WTi,'n_E=#W2QUϭ}Η?~5TNLNG,[Cr;tK_L&}ͱ~1-\0r+͕<L)U*N{6klRHH!>lfULg*O%S+m6q1ЏD(aOqGBvk2f==z$gMBx"3ښ:y{kݮV{ wU-'ǑFE/7?kr-қnVA"Nb5w'bL20FXryZnLHSU8[WU}2UptߓعeLxNu-ULYb7m\tX.HWeX/r,p9u3RslWðYR],F͑mlqۨq:%)HHQE+|zx3d\\C1puZrlO}#-xf((VP$+S9t|R',mfKMEGY9vR8=CSMA!6 \nc`wGՐb-=nZKy3)Y9}OTrm0pÄ8K] Bn6k=Jj@z~^/Kޱ'Lޏ=wf۽^/n*52 <u[]A.WRe?M\0^"b]=i(8YNg9|̜8y檮r(?!M{џU:بG%>ӹ,C<眉\t^ÊDŽJZ!/զ0<a4}Pzw45xChX#OL xdVY:8^c@EauI\\\tDwxmL;X`M?q?)уب"*k]NȘkC@o@HoΜਘFFQl/'HgbU{_xi>A!x-CR.4r<S˭vi, iFog07!'܌lͷc\0mz\t֣XUne#mBkMn+?_*Xf~Q#dyvAb+'Xi֕H݊,Z܅}.9)7UC(螗VLNn]%dx.3sA{Q tKB;9-o~" A|)cj"8y1Ks9W}jˣW}ODksޒq\\'}槅,ހHk<]@=.g^S^JF7۞gN\ne$c|+vhJTz>`\n@~ a_&M,,Y2Cǜ\t\0m\0dONLi8p\n- Q]Uw۲9sh+ԕ(KpH2F]~:\\\\!2yS72sl|8M42/>Z>w;wo\n-V9],!WH=ٕt\0Ҫ͝'P_`:;J㖾Zi/q&5k5r⛭pY{IǍ8^ɇ^Q|?V"{ g d boc{ڌW@`k2~%p #ve*p\nK5Dcys~E'' VY|TQOWJ\0xLnV2Tb:<9gCl`Am@3==UqG"b&-;JhָmP)_}@ {Aip+Wey^{jGbm2C&65+=W\00f3tgCHء^JtexC q}gz'V>LP%ȴVhA{`4ɛpܺpvT]F͌\nzxxfw:y_u&ajVk ]R+4->\tB+uն ^F̎wT ts\nEV9£uEg ӇN?\t/ͯQJdюz)ƭ3Q6rV;dV>сTC1 r~H|\\I<q/F[z\\gBg\n%ǐ[Hn>}bYZcVzXʓh~P\\a*;$[_*h|CFE~k_=_lΈJ/Q>"ٷƵ7¡|7y?A+onoNI<vraL@6+@]։p0}:463 ϬOGьySwY ̋٣kM}bj[Le;]\0J^(U˩q1đj\tTu1ȏWm SwΝQҐ>ŠAa,ViN|U(VK-k(TKylG(1tjƘpN4lZ}a7>¶AA̡PkYqKwngu'333^\nLѢ_C<&ܙkLdiϚYEgXQ\nLA[+O$4K~'86$yܽUTk.'iuWzN;kw~;wWvkއOt7zW5uWQPW\0=n@6.@V\\>1۬mySW7\t}YʎT7Z2),5z$Xfx6$'凝L'Tn*o4:.B.>[f֫0rBy~5a[xz24Z\te_ǒ:-8Ts1E't=G.)q#߯McԲbkk,j^x"pOKMI9wh\tѿX\nWD\tةL4xl(""vۡ,y>up `S+%6%"8%^;NfI2 %%m.lmV'œ_IN4=NuҹCH^[R@f14Iܰ Azu>/Wf)7;96BFuNMNJ戓f%66;f2_ҿYM$Ȳ\0af2nKu\nvVI7)rHwY"5mAKAPjcW[|!+#{b!f*e?Z+rq(p*rv̳Ø_9cx:BVRLcz1i!rjF[&m|a40"Nnd%eQb#X5"fJ\\3ZL~3$V#ֶyu\\4ԸUH لjGBD%ŋn{@'J`Ffv`u*9G?t̂ȕn0GL^|tO\t1f!NnzL\t[2bIE\0/s7OjrK@/gO\n`{L9!/1lKyyAmhw_*B.:=9L8="O7ЭZAOf-ekMb~ih4B[.6#+\nb:Wc%%e<;u'a}{\0 EA4]S^O7Wa'skzǑYqzړֱPLyrz91]s F1eA)L-2Z%գ:GSm;\\'u,0_`+\0g>UWr/2|TYh)QF\tFLj8RZx#A7^}n%if&U|[Be 8T<FNlsR ᑋBDlHq/e*S9no>MAwryI稐 rk<[>Վ#l)jp+R);E_EҌZ+ڭ7@{J`8"Pm+NM!vYhI1ʗ-A8\nUrr6C|,2@j/dڷ(U巋hGW{ԓicyұoRgbfL#W"dI+rRV{f盱 "Rr+,x\ts[26[v:%8$$ԲwnC+;̏zYZClJ>ޟuבDjHO<r_^xq[<}F[w\tL$M PS̽W~TD mfNnH}/k]YUNED\tyTm.\\ޯ],Ol6YcwDV00ȄD>^}KoQѨ._'r\\`\0KvԍUs?jTq!`{0>lKW>;"<ZIla74I,%pJ?|e\tc鸍,ܭNH@y`xեk0"pbJUgZяG6L?gS!\nN\\ANu!]z r:cdHBvTU[,[(Ȣ1>:wO\\E<=v|,2u$f?S{e5E%<Ώ\n-RT{8vԾ~Uķ@\0cm3\nkot"6$|BrG_T%R(v=.b~scZbҋ2nkm>{IKvN8ڥۧE* зP7+O3}^ HKOohz/R1 Q^OםSUGS=SATT<Z* | ||
diff --git a/bin/assets/OpenSimAssetSet/graniteblock.jp2 b/bin/assets/OpenSimAssetSet/graniteblock.jp2 deleted file mode 100644 index c7c03f9..0000000 --- a/bin/assets/OpenSimAssetSet/graniteblock.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/grass.jp2 b/bin/assets/OpenSimAssetSet/grass.jp2 deleted file mode 100644 index 63cdfa3..0000000 --- a/bin/assets/OpenSimAssetSet/grass.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/grass2.jp2 b/bin/assets/OpenSimAssetSet/grass2.jp2 deleted file mode 100644 index 74eb2b4..0000000 --- a/bin/assets/OpenSimAssetSet/grass2.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/gravel.jp2 b/bin/assets/OpenSimAssetSet/gravel.jp2 deleted file mode 100644 index 21ed22e..0000000 --- a/bin/assets/OpenSimAssetSet/gravel.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/greybrick.jp2 b/bin/assets/OpenSimAssetSet/greybrick.jp2 deleted file mode 100644 index 5f45363..0000000 --- a/bin/assets/OpenSimAssetSet/greybrick.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/hardwood.jp2 b/bin/assets/OpenSimAssetSet/hardwood.jp2 deleted file mode 100644 index ff0fcce..0000000 --- a/bin/assets/OpenSimAssetSet/hardwood.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/ivy.jp2 b/bin/assets/OpenSimAssetSet/ivy.jp2 deleted file mode 100644 index d19d18d..0000000 --- a/bin/assets/OpenSimAssetSet/ivy.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/jim_shape.dat b/bin/assets/OpenSimAssetSet/jim_shape.dat deleted file mode 100644 index d7e9d3c..0000000 --- a/bin/assets/OpenSimAssetSet/jim_shape.dat +++ /dev/null | |||
@@ -1,105 +0,0 @@ | |||
1 | LLWearable version 22 | ||
2 | Jim Shape | ||
3 | |||
4 | permissions 0 | ||
5 | { | ||
6 | base_mask 00000000 | ||
7 | owner_mask 00000000 | ||
8 | group_mask 00000000 | ||
9 | everyone_mask 00000000 | ||
10 | next_owner_mask 00000000 | ||
11 | creator_id 11111111-1111-0000-0000-000100bba000 | ||
12 | owner_id 11111111-1111-0000-0000-000100bba000 | ||
13 | last_owner_id 11111111-1111-0000-0000-000100bba000 | ||
14 | group_id 00000000-0000-0000-0000-000000000000 | ||
15 | } | ||
16 | sale_info 0 | ||
17 | { | ||
18 | sale_type not | ||
19 | sale_price 10 | ||
20 | } | ||
21 | type 0 | ||
22 | parameters 82 | ||
23 | 1 0 | ||
24 | 2 0 | ||
25 | 4 0 | ||
26 | 5 0 | ||
27 | 6 0 | ||
28 | 7 0 | ||
29 | 8 0 | ||
30 | 10 0 | ||
31 | 11 0 | ||
32 | 12 0 | ||
33 | 13 0 | ||
34 | 14 0 | ||
35 | 15 0 | ||
36 | 17 0 | ||
37 | 18 0 | ||
38 | 19 0 | ||
39 | 20 0 | ||
40 | 21 0 | ||
41 | 22 0 | ||
42 | 23 0 | ||
43 | 24 0 | ||
44 | 25 0 | ||
45 | 27 0 | ||
46 | 33 -2.3 | ||
47 | 34 0 | ||
48 | 35 0 | ||
49 | 36 -.5 | ||
50 | 37 -1.34 | ||
51 | 38 0 | ||
52 | 80 1 | ||
53 | 105 .5 | ||
54 | 155 0 | ||
55 | 157 0 | ||
56 | 185 0 | ||
57 | 193 .5 | ||
58 | 196 0 | ||
59 | 505 .5 | ||
60 | 506 0 | ||
61 | 507 0 | ||
62 | 515 0 | ||
63 | 517 0 | ||
64 | 518 0 | ||
65 | 629 .5 | ||
66 | 637 0 | ||
67 | 646 0 | ||
68 | 647 0 | ||
69 | 649 .5 | ||
70 | 650 0 | ||
71 | 652 .29 | ||
72 | 653 0 | ||
73 | 656 0 | ||
74 | 659 .5 | ||
75 | 662 .5 | ||
76 | 663 0 | ||
77 | 664 0 | ||
78 | 665 0 | ||
79 | 675 0 | ||
80 | 676 0 | ||
81 | 678 .5 | ||
82 | 682 .5 | ||
83 | 683 -.15 | ||
84 | 684 0 | ||
85 | 685 0 | ||
86 | 690 .5 | ||
87 | 692 1 | ||
88 | 693 .6 | ||
89 | 753 0 | ||
90 | 756 0 | ||
91 | 758 0 | ||
92 | 759 .5 | ||
93 | 760 0 | ||
94 | 764 0 | ||
95 | 765 0 | ||
96 | 769 .5 | ||
97 | 773 .5 | ||
98 | 795 .84 | ||
99 | 796 0 | ||
100 | 799 .5 | ||
101 | 841 0 | ||
102 | 842 0 | ||
103 | 879 0 | ||
104 | 880 0 | ||
105 | textures 0 | ||
diff --git a/bin/assets/OpenSimAssetSet/jim_skin.dat b/bin/assets/OpenSimAssetSet/jim_skin.dat deleted file mode 100644 index 9d03cb2..0000000 --- a/bin/assets/OpenSimAssetSet/jim_skin.dat +++ /dev/null | |||
@@ -1,50 +0,0 @@ | |||
1 | LLWearable version 22 | ||
2 | Jim skin | ||
3 | |||
4 | permissions 0 | ||
5 | { | ||
6 | base_mask 00000000 | ||
7 | owner_mask 00000000 | ||
8 | group_mask 00000000 | ||
9 | everyone_mask 00000000 | ||
10 | next_owner_mask 00000000 | ||
11 | creator_id 11111111-1111-0000-0000-000100bba000 | ||
12 | owner_id 11111111-1111-0000-0000-000100bba000 | ||
13 | last_owner_id 11111111-1111-0000-0000-000100bba000 | ||
14 | group_id 00000000-0000-0000-0000-000000000000 | ||
15 | } | ||
16 | sale_info 0 | ||
17 | { | ||
18 | sale_type not | ||
19 | sale_price 10 | ||
20 | } | ||
21 | type 1 | ||
22 | parameters 26 | ||
23 | 108 0 | ||
24 | 110 0 | ||
25 | 111 .5 | ||
26 | 116 0 | ||
27 | 117 0 | ||
28 | 150 0 | ||
29 | 162 0 | ||
30 | 163 0 | ||
31 | 165 0 | ||
32 | 700 .25 | ||
33 | 701 0 | ||
34 | 702 0 | ||
35 | 703 0 | ||
36 | 704 0 | ||
37 | 705 .5 | ||
38 | 706 .6 | ||
39 | 707 0 | ||
40 | 708 0 | ||
41 | 709 0 | ||
42 | 710 0 | ||
43 | 711 .5 | ||
44 | 712 0 | ||
45 | 713 .7 | ||
46 | 714 0 | ||
47 | 715 0 | ||
48 | 775 0 | ||
49 | textures 0 | ||
50 | |||
diff --git a/bin/assets/OpenSimAssetSet/licenses.txt b/bin/assets/OpenSimAssetSet/licenses.txt deleted file mode 100644 index 5d34424..0000000 --- a/bin/assets/OpenSimAssetSet/licenses.txt +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | These textures have been collected from various sources: | ||
2 | |||
3 | 1. Blender Texture Disk | ||
4 | |||
5 | Notice of rights | ||
6 | |||
7 | This is the collection of textures and materials of the "Blender Texture Disk", a product created by the company "NaN Technologies" in 2001, and later sold in the blender.org e-shop to support Open Source Blender development. | ||
8 | |||
9 | The Blender Foundation has now decided to open up this content entirely as public domain. We wish you a lot of fun with the collection! | ||
10 | Ton Roosendaal | ||
11 | Chairman Blender Foundation | ||
12 | ton(at)blender(dot)org | ||
13 | |||
14 | 2. Hawaiian Plant Textures | ||
15 | |||
16 | http://www.vterrain.org/Hawaii/Flora/textures/index.html | ||
17 | |||
18 | I am placing these texture maps into the public domain; if you want higher resolutions or have any other questions or feedback, please contact me: info@vterrain.org | ||
19 | |||
20 | 3. Golgotha Textures | ||
21 | |||
22 | Golgotha was a game under development by Crack Dot Com. When game development was abandoned, the authors generously donated their work to the public domain. | ||
23 | |||
24 | |||
25 | 4. Some made by me, Babblefrog | ||
26 | |||
27 | A few of the wood textures were created by me using Wood Workshop. These I donate to the public domain. | ||
28 | |||
29 | 5. From the VTerrain project. | ||
30 | |||
31 | The source code and data in this distribution are Copyright (c) 2001-2005 Virtual Terrain Project. | ||
32 | |||
33 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated data and documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: | ||
34 | |||
35 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | ||
36 | |||
37 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
diff --git a/bin/assets/OpenSimAssetSet/little_goblin_shape.dat b/bin/assets/OpenSimAssetSet/little_goblin_shape.dat deleted file mode 100644 index b097d3c..0000000 --- a/bin/assets/OpenSimAssetSet/little_goblin_shape.dat +++ /dev/null | |||
@@ -1,105 +0,0 @@ | |||
1 | LLWearable version 22 | ||
2 | See the little goblin | ||
3 | |||
4 | permissions 0 | ||
5 | { | ||
6 | base_mask 00000000 | ||
7 | owner_mask 00000000 | ||
8 | group_mask 00000000 | ||
9 | everyone_mask 00000000 | ||
10 | next_owner_mask 00000000 | ||
11 | creator_id 11111111-1111-0000-0000-000100bba000 | ||
12 | owner_id 11111111-1111-0000-0000-000100bba000 | ||
13 | last_owner_id 11111111-1111-0000-0000-000100bba000 | ||
14 | group_id 00000000-0000-0000-0000-000000000000 | ||
15 | } | ||
16 | sale_info 0 | ||
17 | { | ||
18 | sale_type not | ||
19 | sale_price 10 | ||
20 | } | ||
21 | type 0 | ||
22 | parameters 82 | ||
23 | 1 0 | ||
24 | 2 0 | ||
25 | 4 0 | ||
26 | 5 0 | ||
27 | 6 0 | ||
28 | 7 0 | ||
29 | 8 0 | ||
30 | 10 0 | ||
31 | 11 0 | ||
32 | 12 0 | ||
33 | 13 0 | ||
34 | 14 0 | ||
35 | 15 1.5 | ||
36 | 17 0 | ||
37 | 18 0 | ||
38 | 19 0 | ||
39 | 20 0 | ||
40 | 21 0 | ||
41 | 22 0 | ||
42 | 23 0 | ||
43 | 24 2 | ||
44 | 25 0 | ||
45 | 27 0 | ||
46 | 33 -2.3 | ||
47 | 34 -.7 | ||
48 | 35 2 | ||
49 | 36 1.4 | ||
50 | 37 .16 | ||
51 | 38 -1 | ||
52 | 80 1 | ||
53 | 105 .5 | ||
54 | 155 0 | ||
55 | 157 .68 | ||
56 | 185 0 | ||
57 | 193 0 | ||
58 | 196 0 | ||
59 | 505 .5 | ||
60 | 506 0 | ||
61 | 507 0 | ||
62 | 515 3 | ||
63 | 517 .52 | ||
64 | 518 0 | ||
65 | 629 .5 | ||
66 | 637 0 | ||
67 | 646 -.4 | ||
68 | 647 -.5 | ||
69 | 649 .5 | ||
70 | 650 0 | ||
71 | 652 1 | ||
72 | 653 0 | ||
73 | 656 0 | ||
74 | 659 .5 | ||
75 | 662 .5 | ||
76 | 663 0 | ||
77 | 664 0 | ||
78 | 665 0 | ||
79 | 675 .3 | ||
80 | 676 .95 | ||
81 | 678 .74 | ||
82 | 682 1 | ||
83 | 683 .12 | ||
84 | 684 0 | ||
85 | 685 -.5 | ||
86 | 690 .75 | ||
87 | 692 -1 | ||
88 | 693 -1 | ||
89 | 753 2.34 | ||
90 | 756 -1 | ||
91 | 758 0 | ||
92 | 759 .5 | ||
93 | 760 0 | ||
94 | 764 0 | ||
95 | 765 0 | ||
96 | 769 .5 | ||
97 | 773 .5 | ||
98 | 795 1 | ||
99 | 796 3 | ||
100 | 799 .5 | ||
101 | 841 .66 | ||
102 | 842 0 | ||
103 | 879 -.5 | ||
104 | 880 0 | ||
105 | textures 0 | ||
diff --git a/bin/assets/OpenSimAssetSet/mahogany.jp2 b/bin/assets/OpenSimAssetSet/mahogany.jp2 deleted file mode 100644 index faca335..0000000 --- a/bin/assets/OpenSimAssetSet/mahogany.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/map1.jp2 b/bin/assets/OpenSimAssetSet/map1.jp2 deleted file mode 100644 index cd2fd94..0000000 --- a/bin/assets/OpenSimAssetSet/map1.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/map_base.jp2 b/bin/assets/OpenSimAssetSet/map_base.jp2 deleted file mode 100644 index 5ad1fd0..0000000 --- a/bin/assets/OpenSimAssetSet/map_base.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/maple.jp2 b/bin/assets/OpenSimAssetSet/maple.jp2 deleted file mode 100644 index 1601336..0000000 --- a/bin/assets/OpenSimAssetSet/maple.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/moon.jp2 b/bin/assets/OpenSimAssetSet/moon.jp2 deleted file mode 100644 index 235ea5f..0000000 --- a/bin/assets/OpenSimAssetSet/moon.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/mosaic02.jp2 b/bin/assets/OpenSimAssetSet/mosaic02.jp2 deleted file mode 100644 index 1f853e9..0000000 --- a/bin/assets/OpenSimAssetSet/mosaic02.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/newhair.dat b/bin/assets/OpenSimAssetSet/newhair.dat deleted file mode 100644 index 3c5a8c9..0000000 --- a/bin/assets/OpenSimAssetSet/newhair.dat +++ /dev/null | |||
@@ -1,63 +0,0 @@ | |||
1 | LLWearable version 22 | ||
2 | New Hair | ||
3 | |||
4 | permissions 0 | ||
5 | { | ||
6 | base_mask 7fffffff | ||
7 | owner_mask 7fffffff | ||
8 | group_mask 00000000 | ||
9 | everyone_mask 00000000 | ||
10 | next_owner_mask 00082000 | ||
11 | creator_id a52db6d0-e96c-4454-85e5-3523722daa25 | ||
12 | owner_id a52db6d0-e96c-4454-85e5-3523722daa25 | ||
13 | last_owner_id 00000000-0000-0000-0000-000000000000 | ||
14 | group_id 00000000-0000-0000-0000-000000000000 | ||
15 | } | ||
16 | sale_info 0 | ||
17 | { | ||
18 | sale_type not | ||
19 | sale_price 10 | ||
20 | } | ||
21 | type 2 | ||
22 | parameters 39 | ||
23 | 16 0 | ||
24 | 31 .5 | ||
25 | 112 0 | ||
26 | 113 0 | ||
27 | 114 .5 | ||
28 | 115 0 | ||
29 | 119 .5 | ||
30 | 130 .45 | ||
31 | 131 .5 | ||
32 | 132 .39 | ||
33 | 133 .25 | ||
34 | 134 .5 | ||
35 | 135 .55 | ||
36 | 136 .5 | ||
37 | 137 .5 | ||
38 | 140 0 | ||
39 | 141 0 | ||
40 | 142 0 | ||
41 | 143 .13 | ||
42 | 166 0 | ||
43 | 167 0 | ||
44 | 168 0 | ||
45 | 169 0 | ||
46 | 177 0 | ||
47 | 181 .14 | ||
48 | 182 .7 | ||
49 | 183 .05 | ||
50 | 184 0 | ||
51 | 192 0 | ||
52 | 674 -.3 | ||
53 | 750 .7 | ||
54 | 752 .5 | ||
55 | 754 0 | ||
56 | 755 .05 | ||
57 | 757 -1 | ||
58 | 762 0 | ||
59 | 763 .55 | ||
60 | 785 0 | ||
61 | 789 0 | ||
62 | textures 1 | ||
63 | 4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b | ||
diff --git a/bin/assets/OpenSimAssetSet/newpants.dat b/bin/assets/OpenSimAssetSet/newpants.dat deleted file mode 100644 index 6587a72..0000000 --- a/bin/assets/OpenSimAssetSet/newpants.dat +++ /dev/null | |||
@@ -1,33 +0,0 @@ | |||
1 | LLWearable version 22 | ||
2 | New Pants | ||
3 | |||
4 | permissions 0 | ||
5 | { | ||
6 | base_mask 00000000 | ||
7 | owner_mask 00000000 | ||
8 | group_mask 00000000 | ||
9 | everyone_mask 00000000 | ||
10 | next_owner_mask 00000000 | ||
11 | creator_id 11111111-1111-0000-0000-000100bba000 | ||
12 | owner_id 11111111-1111-0000-0000-000100bba000 | ||
13 | last_owner_id 00000000-0000-0000-0000-000000000000 | ||
14 | group_id 00000000-0000-0000-0000-000000000000 | ||
15 | } | ||
16 | sale_info 0 | ||
17 | { | ||
18 | sale_type not | ||
19 | sale_price 10 | ||
20 | } | ||
21 | type 5 | ||
22 | parameters 9 | ||
23 | 625 0 | ||
24 | 638 0 | ||
25 | 806 .8 | ||
26 | 807 .2 | ||
27 | 808 .2 | ||
28 | 814 1 | ||
29 | 815 .8 | ||
30 | 816 0 | ||
31 | 869 0 | ||
32 | textures 1 | ||
33 | 2 5748decc-f629-461c-9a36-a35a221fe21f | ||
diff --git a/bin/assets/OpenSimAssetSet/newshirt.dat b/bin/assets/OpenSimAssetSet/newshirt.dat deleted file mode 100644 index 4d6d264..0000000 --- a/bin/assets/OpenSimAssetSet/newshirt.dat +++ /dev/null | |||
@@ -1,34 +0,0 @@ | |||
1 | LLWearable version 22 | ||
2 | New Shirt | ||
3 | |||
4 | permissions 0 | ||
5 | { | ||
6 | base_mask 00000000 | ||
7 | owner_mask 00000000 | ||
8 | group_mask 00000000 | ||
9 | everyone_mask 00000000 | ||
10 | next_owner_mask 00000000 | ||
11 | creator_id 11111111-1111-0000-0000-000100bba000 | ||
12 | owner_id 11111111-1111-0000-0000-000100bba000 | ||
13 | last_owner_id 00000000-0000-0000-0000-000000000000 | ||
14 | group_id 00000000-0000-0000-0000-000000000000 | ||
15 | } | ||
16 | sale_info 0 | ||
17 | { | ||
18 | sale_type not | ||
19 | sale_price 10 | ||
20 | } | ||
21 | type 4 | ||
22 | parameters 10 | ||
23 | 781 .78 | ||
24 | 800 .65 | ||
25 | 801 .82 | ||
26 | 802 .78 | ||
27 | 803 .5 | ||
28 | 804 .5 | ||
29 | 805 .6 | ||
30 | 828 0 | ||
31 | 840 0 | ||
32 | 868 0 | ||
33 | textures 1 | ||
34 | 1 5748decc-f629-461c-9a36-a35a221fe21f | ||
diff --git a/bin/assets/OpenSimAssetSet/palm1.jp2 b/bin/assets/OpenSimAssetSet/palm1.jp2 deleted file mode 100644 index ddc3be4..0000000 --- a/bin/assets/OpenSimAssetSet/palm1.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/papaya.jp2 b/bin/assets/OpenSimAssetSet/papaya.jp2 deleted file mode 100644 index 53d037e..0000000 --- a/bin/assets/OpenSimAssetSet/papaya.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/papaya_bark.jp2 b/bin/assets/OpenSimAssetSet/papaya_bark.jp2 deleted file mode 100644 index 37642ce..0000000 --- a/bin/assets/OpenSimAssetSet/papaya_bark.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/pastelbrick.jp2 b/bin/assets/OpenSimAssetSet/pastelbrick.jp2 deleted file mode 100644 index 5d21456..0000000 --- a/bin/assets/OpenSimAssetSet/pastelbrick.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/peaches.jp2 b/bin/assets/OpenSimAssetSet/peaches.jp2 deleted file mode 100644 index a3ec8f0..0000000 --- a/bin/assets/OpenSimAssetSet/peaches.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/pine1_10m.jp2 b/bin/assets/OpenSimAssetSet/pine1_10m.jp2 deleted file mode 100644 index 376e9ee..0000000 --- a/bin/assets/OpenSimAssetSet/pine1_10m.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/plywood.jp2 b/bin/assets/OpenSimAssetSet/plywood.jp2 deleted file mode 100644 index 2053675..0000000 --- a/bin/assets/OpenSimAssetSet/plywood.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/poplar.jp2 b/bin/assets/OpenSimAssetSet/poplar.jp2 deleted file mode 100644 index f879078..0000000 --- a/bin/assets/OpenSimAssetSet/poplar.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/redtri_tile.jp2 b/bin/assets/OpenSimAssetSet/redtri_tile.jp2 deleted file mode 100644 index 5fca48f..0000000 --- a/bin/assets/OpenSimAssetSet/redtri_tile.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/rockbuilding.jp2 b/bin/assets/OpenSimAssetSet/rockbuilding.jp2 deleted file mode 100644 index 463f7e3..0000000 --- a/bin/assets/OpenSimAssetSet/rockbuilding.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/rocks.jp2 b/bin/assets/OpenSimAssetSet/rocks.jp2 deleted file mode 100644 index 6113881..0000000 --- a/bin/assets/OpenSimAssetSet/rocks.jp2 +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | OQ\0/\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0R\0\0\0\0\0\0\\\0#"ww\0w\0vo\0o\0ngLgLgdPPPEWWWad\0\0Kakadu-v4.2.1\0\n\0\0\0;q\0Հ,uP;Od13Q.H"i,g-uŇ߄}5 ~H\\ J%IURZ"#:X&xI\0\\\\DK6{0g|aPY-66H8/j-)M04 m\n=&vxWgvr,l7HmaϏ9cqM>'!noj0oP,H4#?PHÇu ?cl2٤V~NCKRL-fѓNqF!CY$5#[7`DvBMܑݘxu`\0XUv)R6?0GzyodX ԉRb}\\95<.!uUCK]]+=uƔnh)hKe1|3l^:J_hzK>2wxo@#GCN:I+hlmD̹1Bp0K!\nE+Dy+Te\\\0h |GP LF\tq^ g] F=W=*%d8OEujOZw,(z=`Б2K,T۵SNfL4<@\t8fy̥#qW|}3V>Y8E@\0F>\06\0ut")pp+o-t$)7A\0GTY- (Tm*_%aR/Yh#CTsڦNE(Оn:N>0a}|`\nKu0pLdAݩۯa9Q3ѡj1 u*`,+UWkY,6-EI rhhg7w,H!Er'qBP2&VB2I\n,=?sb&[pCγ\0/Dsu#@S.j8nޤw̃!*X4Z՝ʌ̅dDٰEN`x\taGf>P$sϋ,!)yU2x;IJጘ6ʦ]gp~ \02t>("v~3[;i·w8rlზWg6}3Sk9Țw#Væ[?=ԖX" |34/x8s(Xk£s\nPeƭ[FwI֊G\nt.0>x6ObE<ZVR-LmyX%;bPwRcvߕE`{=L:k(,d+3>6Bv8SήǹR;˸0j}'3ޥ)4RlS&SoyV=YxvzVu>tqmy'DUG>wk=\08sǪ/,_`am!\t%'CehFK)qKGj7}4(>2uRץiRd'3e1fE`lp;B{d)d3?½سfHn1cQ_TXf]^]lg9 m\nKAxjL\0\t^N77ge*.ƥ\t!Zf-wsmr9CKNNTPEl|o}*\t$|AE%"q[Q0@WatWbCa6R 80B>jJ~\n~23Bb3.B@24^K (7RX9ݺ'1knj[%1~Fuke 07X`S#w:Q`tF#K+!:CյrII0wS݇oNC50HȎeާ\t+5% xR'q!0?.\n4Cֵ1RX5Z2Ǜhx ޤ"hUJ]}*@X}a~f=zL.\0#4V Kh)Mw_5w\\ReI:D-Phs\\9>ThVk=?kU f藱}Ȇq6@:7Oکzgl\tkPT\tvTy!qLA4 d7)T2_#:\0W%F>"#_O^ʇ!Z-}u\\,,<ZWOI@uk <<㥋0AGuUDU/Tdp8bOiu|[ӔWƙ7(O< ʝS[Dž>UdbcF>>mNX_ThG+0N+<ܱ#8~Юqe$O"M\t˯a6yEz =SotTG\\'|2p*YV)ˑ<egݐPA"TG2MNA`3buq$e[Fj::"\0~3(=4D%*1'}CZتj\n[}Is#ztJ[}IkXĪ橻kĩtחpcm)}ΊȓǍe/'2P2,hJ.7nXC~aʍyPE(F_dNX&1?F6(Lt8Hxl$'zU߇aEP|jLMKE`IeWWjG(gYL#("@ A! 5'Z"ɨ"--oWO#Uߏ~?ی+tíP ⽘GJ(\tDq쬋=jc%)/йL<6$/Y5)Fע`n dũilgbS?\nиW_HHBMk>I:c2<}KBJgh 95{<i3I)DxE:3W_gtl;W\n*kS(n,ـH+'5e6J$!]M\n9CsUB\tu7?Y3jwx=7zk""F[<Z~8F|e!2BcLTLhlRFmp09Šl>a4>5ea{Fkfo^7*8YXl#&'at~voyp_^;S{`(W8DGD?eh@dz 0+>`#WB\n5s[rL<,s^5x<3'vF\nf(\0ށeϝ5ܓf\0C]Pl\t M@vz^wx\0OQCdҨsøP:w[yg8ff"+g=\0x]wfx\0P@s~_D/A]|QB,HTn=L(). Ac-A:3@E^->AV%Tv]S;_(b=$wU"\nkؿs#cCFL"[\tD[ t̽쎬W/B]4Ҹh='~}lrotx08H˒&\0S\\OgM]Fa \0(iM&J\n|^F=)D 8Q`UYC>@y3ʄIfWh,O7 yZ^-{}2Zw ?t=ǀN(%\\_\tZWQQ٪bg9M_/IsRk21Vjm2,H4[t߸LP;aX9Ș|G+lyĮhd~\t ۟}虾W3ÇT=b!j;x\0ҪtwϦ|vGkOin= .\07aeD6,nL^X+~kH*[Ϊ6vE_Kb#4\0쐦4YEWĔmr[PZ{^f:]ON8Q0|V$J&7功d=D.i(5oh+Qа\tk-v20~\nX>\t4b!%rP2vv읔 ۊ>[]O*Sf~'fbl^]|-r/>UHd\04 {$T>_v8Lb\\v%Uq/(xs\tŊ]Hp% ȺUׇyN{4E,|^D'攆Kb:C?2iaVYM2X 0Q90NYq\\B=\0|GD5ǹY_WETe-,J\0jv}j;uΡS5\0ߔ16-R\0ТDtt"\nD#,pκ(oUkV>;5.f߈vN[wȡ\t<e6TTт9ҔW\0 0z8uRFpg:RqvNdgzXZ!sL#'{Ky^'+b@ʓE"s)0D<q~Iʙ<ozaSSe;(e1q7jyny2&w!O;F<m\\t^*BCAͬӠ̞sưqbC}kl'@ܺ.]z̓Y$6%Y;JQX_d61}w2h\t;O:sBuk~gw*;dqaGy0%l}E1=]@[]т 'M1zZ_.^uS<2\\'$I.{x5v#2fgVxbS:R|vAJp>ޡJ+KR9F vmN#W= x~ikkW<G-SJsձ\\PHhKXf>qPA^o5V/-@NT\nk-`]/#!(>Uh,V{6`t`WUf$ķ5Qlqlk}s/4{;}Jm\\)v]Py Y]uƝgXx\0F+P`CNO%Tz)ŀ@fiF;,r"UFւ@4D,S.L{e\\՚8\0P}^_ӃyYq]"'?s=_!"VC8\tƫ89VEr:U tNؼ\t NlphJ"3CMW;36$11]9HgqDR}/Cۡǩrw\t͢iT'! )+W"f|---+\\pۣv2vgT* >zy25\t?`w(FD+~ ޟBBc-}_ގYjKH+t/lYJ3=+vvSGoI/ u^q~X3)pBҠ{z\0iKK\0x\0iם`J,T$qޱv =PZ~gC\0=&Cu-亻(%G>_ڧߏ@|Ef`D: J>';_|.^\nP&%WcvۓR:v?RB4/2C%;i IL~/vR\t%V8U1اpœ9'َKtSS\tm$sS/|$?eC2gIw1Ǫ/RaL~l)HP4_6_SP|f=jwg7LAX\tc\00nt%tzr#4X]h/d8;&ο$2ƩiVQJ0\n{EùAGKl¥תm<!a\\@\0x)P߅ԴJH9&Sq`3oKͷ9\tQEsg XGs&֢HEeT$pP*5h;k~^g5v oGw95SrcfHvQr\\]Z'v81WX4d6EWY4S!xͯK4Ӝ N)'b~\0\\KȩOR-CЙ?er\0^{^L\06w=PQ{9-%L/u>7tVΓ%X&H"ȳòW̚ &Kb 'ml;%aҪ0Lg\\.ܪaw)T-(]$J=ȘL1\n;Y sr!>>dh0!O [%OEGh9\\&EыɆPB\0ktj=38h١@M^. NeWF=wo"5\0dg7ר|'{@reYFp!RnIq1ݜԈ L+NRV$?rZ1%$d(/@4 I|l |-?M{L2!K2|=7+, ބ{ .N{L{.\\,1,'#6XpDr^̜<p(mP$j0b:nmG[q);sj]i̯?ķaTwǭըʣM=M&_GRZP%oRr\00Uوg((U}\0o6z@`J=c`?o8d<V's-lmBBM\n6"%co+}ۣþDؠP8kExdm#|)lڜVGruJ x7\\ZUr~氞:Ք/:A'-?(f;LU^X\tSY2mCHubb;`w\tJEOAe\tE룂\t"HJͅo]xvbaz!P=Ȣ4{v,Nl)G0\t]kQO7/_kBt <8Bxa\tcy'!u&*iS-i"-n.܃;g`Cb`6G{b.Fq߹jf礦qיSt]!Xs"6\0lRUbWyn&z@yh3aGeVE#VۻPP,\tbchWVJ<}E* ԦP_PiF"زp(G\0TvѮJVˀP xI4`FS.bAxnT\\9ukn0Sш\0_%'s̀bD*Uѧ-ťkeە݈t3:A|]ZNq,`S{X~}hwcޅD}dcHjzؒAye\\Lk&J\nɑCfo :DN̤yp+>-\n)جX@8EhDCŗ\\olpǻ/3?Ҙ هcyƋ=EF.yf0mzþM΄T;$ܝrKjZ&Ar?h7_XiWIfem+y=G:Ɋ|Yz᧸5 U:kjB#:PB\0ɅM&iWp:Y`E\\ZQ%(LW?JE\\K 5.Fawa;y2r`1=sET<Ų4yvWv˨QcځzwHA&{BU!͚fOpZJ3(O3Aa9#F;CWA@1ٍ]?F0Ran}L_~\\.OH\nh>$O4$l_\n},]G./pAʲ(vIBb`MM*Mo.(\\D"9-ډ5uتSAydaX= K]G$ޓ@@}}%vYdW>\tƱFڥ?\n^ATE 9kV?,剩&lbÁ!C}rDbY_]L^-Q\\{R_M3S/Cʹxˤyb&I.auC*Jf*$آpqfթ#(N#_:}'mw\tB/&K*P(Em⺀+{vFhQw+UP{|l,߲4'BO!/`Pcl+pk6"{-09ߊB'֩힒ZѤԟTg\\+Cp!_sF<&etÌ8vaS6\nF[JG3.W~_syC<'&O/Ce RtĒ7!FX~\0[/~u-PWENiM$,>kAϔ]UVݣCaAyя-,_S&~\0lO>,@N|t{G\nW^/)`@wTsg(]n?і]6#o R[F3X5{扜W_f Z*Ro>ivt7elt/"W+y-l3|\tPt;@$+tXIOyewe{kʒe7Լ7vb,a8Ό3^| | )Ң)UK8pRpEEÓ|H+Yi廛tnPqқіיՆci#\0ݽDBłzHr-E![})HX)݈x "\0^kƿW%,\tPdC/;klō䚴/aTsC#`і5%pʻ]&v7mRX.|iΚ6\0,mǐ;W.j3[j"C\\(ysaޞK^\n7eP`4zL5N!яi 揑k,ٗ"ZI9lc/,?EmĮųД$q]w'!%Vd3qRYLW!oz"wj1z-'4bgUbYvn\\@\n`9JrҺ:DM0V\0ꪵ--U\0$?ZWI9LǓ:4`ST@ZoڞaK/xsa.k4`7e08]XѷՈ!}8Ψ3ۉ/@AYlŵwHF4-!IC.TDV'tXS7 غNXk_/#O:{d^Hghɿxqt^ޮUރMT=ob[17r"WI?ڲsU6D`"YEJL`ΛeO~~[ܜwbDplηxӌ\tֽ,OYD.z#yzl^(פG2^GG6us1YX`4tfYOT;NC{zP:ydaE~eiCi=y慝)W%MmgYRAr\nE+sE(tZW?\0ZMQc!;#SUaoْ=s-?lr\0n<dͱO-Vf&;8XT WՄ\t|R#O>P«8f0-)ƛi\nsppd\nǔ\0\tYPuKϟyk74?vP#F&?ځ-u1S6NV|昝!?o6`x#}050kf5 HD~;c5:lUB:uO0f5J_ UOEXuVxMIi#6N.g悹E.0M`rx[g?H~ *Sia0ЩUN:o.^EbK:7\\!(Ofl- s_mPhiҵ&]c xu`Cnxz/I7Bi\t9!Ft␕qt)iVw,b1Sl6w!I_Ľ>p? zr^Tb==`2gl4~9N>rs*1hʄK ktߣܝc4ݥ9yr}ܐEMߋ-=R˗OTCCa ]z ִV-Ԏ߂; \\`0;b\tV>Ƃu\toeچ\\-labg:0<mDLkb&H;+L^I)Q|on/VA4bߢ{^Q9"|lQ$T"F{!)_w}XqoR>tdA1ǺWoX<|:?dsvPTi($\\[!QkKճvcY?[I}N|Ω8#Ķf4ѣvTaRȉCwlxWt\\b (-wt힘049VNVR%5xpWX"@Ѓ6Ȯ}D,HH"ijb\tT&˜h;=7,rG1#)e\n1k4)b_\0E,wѸI՛u.>b©|XuZ'mwVs!N*5Or$@Za'L"?hNX+|/`E4wU" [\\ئU'.v4}nL027I2.Wu/[˃ EtAߥ@3C-swkӭrP8ix^i;beBB;}:}\tjq5"G0Mrɹ1Zi|ʁnYpC>$_J3Aj{i$4.x^fJA83㳒qfG#K۾4?w.c4t'Ґ_J\\/̊Χ2dC"7Іzty)`I.TJ̞XBF/QM:i@쬧v-@Rt2p?se]bۄtf)P娅w)?Qa%gJ4$:{;?*ol+O9>5ljꚽAiUh$;*<\tyV&cڑD}V&;DM-pTePFwgYRy5k۹\\Rir۽_IUjZo1`=Zh4\tu0<ޚ\095LwiIj{dB4~"E֜<B\tB sR;DmZkH&M$qEK\t˪SO,(ko9k tfT|f-` i]c;/EF"x]Tss:]i+7V4eBOc.:|khC[ScQF5?}FHp$/&<:MHay##G=V>b+QLBV8dž[dLd\0,ټZ(\0lBM1KSH0/KnIxeK8[<L+Qh/nɀ91Bw)[h9u_Q곖cBYF$)>Q佅!b\0tP.IƉyyV`\tР& CIm[o.)SI`@Dl@M5fcW5!Fdix 6'wefm} MRzYSk~4W_dIµٶ)RǖĢۀBoCf.@jWߌCC6'RvIRX8=YR-'ꇀuXNj&E@Ss$?WPpmHG阜?vnWrv հ(wcTET\t=`aP^ΑW3u\\2h:5#\\H-2-fc;zWGR%!xj˰7Nh\\Dyޔ;S/S V-'MwWQ\\:Fo\\qzC"E2@'<B:s31MԚkZ`/hRrrg?dk"&N\0˻Y4yD0BZTȎ`m:>lpV{xAcG<JޣI&VlQ 0f#8&Io8qT!rDC4<ǖ@T{kCBR)śѾgLp+0V(!]Q>H(7ML'Y&faWEE7"&w{kÅa\n3- ^hwZ.E0jn;'idaZ;jYMf[< !y\0KQG˳}^%̽Y䈗ڤeERE98T?+⺡uv\0CC^lWH0EY%q[~@E1iP\0C-2[Auw!/cBeX\\*5e%7=A7Ic|PN^UlʼnЖj'kt@F0ii80l+,$E?s+8<Pl;=j-\\C\n~x\ncauHwmYe8RT*@~|ɘ>v@ M|?RncZޭu4m5آhI%eƎSԜsf{c*;WR:?L/|^?m>}D5?\\hol<U.:2{`:$&8|RHl2bINVdy[;^|{J*樹?M9Qd\tpQڗ)lQE/=<6{?nv(?o>UcEnURYF6W=WYZ-Rx/ܯZl?@\\~P>*6!xf:~Gb2Ý湶L8۽I w@EP R&9s\\jY!lٖP[e~<5M?ZDT q\nYfj|_̪zEqPMӼZd.'`'?`NUP``\nae˛'XT\nc \0N_G(Tσ)7a2[fR|Y̙^͒~<v-{'}/$DY5"+Vi-Ex\t\0T{NzJAmqL\0ƋD<NjД<i!܁,raN/C"CCbOA\\|1`=\nEt2$qz/jWqظW8t>gp0-F&jPx5?ȸ].xʣ*]G>3EDvxSXR0+"GkxX'!YwAYڵB."`iӁzs%]?#Ea}ŧ52t</<kZZ==*Y6|+k\nUn*nvP!Fo/cB&]urQ@A];h;Vt\t{ˮy#7u2Mѓ CT"H:3Ŵ\\JY*ݾE%!v!(4u@Q?ބY9jQ|H\0DLW\0_Cxq;}'ߙ&Kl59~PɬO~m&+pXQ^^5fT_M/cn|,ʇubrGB6)U[i*]hƐɑ$gkK<sKuYPXZ/.ܮ\nv\\7&40JX8DGM"e'LjVa@H\\k__C30m8"4,UL-/mNo#V3Xh`bQ-4kX_jrB b@QxgǐGLl슾]ߘ"b/P}v_,jYCSv>`$;XJ8A.\th.s?kkָjj83eYlkVYK<oelԻQ(%![YqroR94w^8N)Mj!yVir!**cz|0ڭAgUMqr^Dž4O.hhXZyn8HY^#9ݗ@+TPe߈[=@ƐkP8~eBʼnDdk鶶Q):5T(a]~?JLqh&NLdƒ?a-4fteb!J&|<Gpd ;r=p5y;deFtXa\ta\t\\(Vٍ0\t[jionr=V755c}64V-²犧\t.]p:X/قKc[S\n=^I+U+\tnHC=rH1\tlT\t'=,E`҅\n\\\n!lT*Hyu5Y)eg< 6ڏ=&q[;6>+ǟ}.PݮT^/+VV{cb!T:x|֘4~xk]vEpl*htgq&jtRG6"y~r[rܯGTF7x֘Sч\\o,s]O\\'CZ@ܲ]G\th=Uioс.ab\\e]IX=$3#0;B\\=@ߖpOXt!+k\\gls[W!{C x߈47e~r\0h<n?aAFfhweN`S`:{QJ.C)FۖDeD,&V]3h=[gt 0Y S@!_A=N}#yOjc\0$U^If\0ш\\J@{hW\t.zXf+$C$\\^\t'#+揻T7lO´|j RZzRy<B(@!?X7Dﺸ5@\t쬤 7vg 6#\nohQg[pvNt7G!| k%idȀgl`F=m/Q:.va`@- 7n_DyٺkE{VJ%THAǓiqFr㙥?\to2vN iM>OV>G%]Hx"W\n[ys:cE|莏\0=_;{n2N.JL\\<:Jt<^pO]r5UF\nzmyAN!EfڻTPH*8|X^wb>8aBޡE,bM_cZ^2s1u7`K(OF`J'<qNs<Ψ1/\nt(@V hBN8vT2*gUд"9z5Q\t4\t1slݤ|kOڳf^_Ɋ`uq2+IyMiPwsoa?~|-6EgW]e$V^5ѼY0lJ>ZT\t8KaT)B3~ʓQ<б-1 RFXa0cGz\ta<,[69_: 9^VJ2z͍*s2dQkdZi)\n\n^M[B\n_G%o!nQ?sr?7-MS_5ddq1wDW|\ta\\Up|=I{q\0u7:?d.~jAy`>VUؖF4`H5PԾД*`f dO)fvR1ZݟL9K2jQTH^-jumMga[bTBp 7D]"ɺl'xKC1l[\\#wg-EwN /p2pyO};q!vCBs\nG+|D:i/vPmn"N\\=~\nE}]~۽B,{g-S.Y4OkSwQ&U35<{%,\\Gi@o(\tԓ"ODGnd[Gc3!W!InՆ\04tDtb]Qp+yٍͿ^\n=3?nK9jRCpC{<v.lKCkpRʘ)쐂BYc9N=W>f%.tKLn^E3@,6h` kJ9{4:a>7M.{|*f5T>24+^͒ZO^oMJPaeWvyF*Ɇ< Rt4E6ݯb䩋Yl,) \nfy_"Yg~{<2e?TfbpMNwc ިKYw(ꡉeg6zň+íMyDlcָTZS-PgȄ\\u4ɔD[5zv:[;)__@¡$@|Ώ+4[p@xTkc=3*TC,-*;~bɮx_[TLb;_Ӹ?@zre>6NCRzLϣ̳+|NT,+!?U9r3@X=m`"B-mVۢ .'mϼXí̖7P=/W|M*!\0MB\t&=I#$/ vkŠ߰l49?;/g}--nCt.6iLf!dI3Abi VH!0t,FjD)ЮVK]G{Z0f\0}j2,C'#!/?iҒ믞0Q~pLs+%E?kVvwFL`٦)}UρcdF1u/\t4ص/妧ˑ(Zl?anԂ=&`ٟ_~_f?E`*c;LHQԐ;˵А:L,pXy.-ueK5)'{]GJd8'̦sשaF#E0IqoB\0yv(72@eg< \t\\fYK+\\ܒe{T-h]7^ӫ p2D"1pyG6Vl&EͲ5#_]3\n|\n9B!\t'n:fkũ,Vz@\n|qP~8CAWN9v1/0w NCtMU_*`vr@hW̜p:/.Z@lYTV,Hێ]( F~iԶ{Eaˆ'߅ع|p\\Mǰuer!7$[k=I(RƺVlC<ȗmf$.c_mc\0o^iHZxRXwdW1|c{~,g@~TJY}LqN{VM}Jp뺥=;-C Em;B"Pě5f`tZoFOtI۶^ixk*ruVJ/em\n{=aJgM7\t[,HCLgs'NIl*E˺Ucvz ALS-/H21XSpD-]˛5h6Yah?vڷkmĔcu7xr>!Z#-a^''?6?{&|LCNֲ\0̭x7~ocAFU_`t~5[ϗh5ecl`ޕ\\'&VhzFr.X4x;ZԦJb-e:1n\0Rn!jr&s{54(Kl ~<'ׁҽ=KQ^ZJߵzJ'֍(,d8+LAډg+D$u=-.gmZa!^GXD*&TOM",Ur٥x6PŁbB=š;\n,^][Y+{eV|E+<kΐW]s̨XlSiø_8'yRBBKzWvnf, 0{xb_a*ۈE_YmwRݻA9LL5yh2H5T2U 30.;Inj_V͖4CDVn]#`j=2%154a#'htJӎ\\"Bʿ1m{j~.~*{uׂ;'Dz7U?F\08M<n\\Gh}bƠ}rT^ofsǍ)FoMo=mkZ<_z{,Pr>&7Xkꌡ> rApߘp{ihX G'lX2Rt&?p\tG];OK[{@wP mۗS9,i]9BH)K3 <sqhՅ[u,=Y_14B]C|ߛ^7m9ot'TS»]_V"xCb0eVSʽ3GdrTou:"|c5rO0\0Y'DldZ}5Vʺ1zmSoЎ\0$P"VUvƊ>a/S0̜o+C}[=[/l|\t, g=cz/TBJmdžLn?WdFqi|ZOdxL59'S-\nJs&ben!!-m?>@Q6x֩^@)X91bv9]?\t$儫?#[LVT/x5bR&Ҷޫyg13괝@\\-\\IHhįDJF Jn,9FIJϼf6vZ|#C4l儣`Ń2Wc|/Oc)@{8ysG#:ԣ !yOə܀v٬[UA?{5c\\FA'j.Rf>=D>V=ݥh>?G^y{pȂe3.Xp76*\\iy5.8p3tZC|H8͇ ke.|?$]$Ak֣F߀k"rN&mUji'63WKGZ uB %/= ݦ?ₚώ#=$R.C+GL; \\AƇt0CJwuPP皩ag,#@p0(%O#qG, ,WfPh\nEfDxz5"^ ua{{☹sf[LF:\0,q~5\0ږ`<EtMJ R1l]BK@@9 [Wz,\n1ti[S3e(VRKfsɁm]99HGv\0-tb?d.:W`稲muP4:q394|:8\00xՅ>TZP_\0[{\tZҀ4VPbEʮQOSosmNvpЭv\\\\Ki|=!}Ub_J[\\pbM%o"Fg!^L1r(Mʴ]qHf\n47M9iGVv0TϵU{|XZU\\zHoi`|te<MR|=xG#)?k9P[\tNNY?uN3M(%_^)Y=WzV_}DQmJ?>QhXtVlT\\v{$sKjOR뮴nCd{mU$3i`\\dΧWB9\n@v,Bʼ=::6I(c-\0`ȥ\n[V>6-^o?wi+EYZOs,ZY3<vFP(o6PI?lA6ODdAl <8YfFH0PSMFFDAdG.zWcUC-$-WHɃol?jsa0XjlJt}ra_m@nϬOB|@5ħ9^ݕӾ8!LHS\0bz)F&/ P\\US-YWR%.n{ rglj\n0@F^4-EfIPmXOW1F:}{lљ&sEaxQG[\\vt~2![\no}aGJ4\n0'pCCS3N1&D×Ȅ*ed5ȟQ37*'IFYsEOI"Ӻ@z P*k!H9u3H&.>#?by/8Ic /k/V4]u#:UWC"!"c=?\0ؓ1uK U//b'CCGČĨs`'d ZzN\no7\t<j?F/9ՠ{b\t*@"+θl .&_LT\\38v^}G>tKWz~lu7D-`'{%(T<a`F> sDsܕkJH]K2A(8\n ȲESr;IR!=xMT<CcaqfuSI肃`.7خa$Js6n\0J\n"m_cJܸ 5\\t(Mk/Pul(wCf(\\̵VN# D?*!ޕ4AWtBesBX(Cz)Or鉁SLo4{Z+0mQ2iJ<õg3&^G`OJ8+jy=mSMNgEmlw)(տj 7 \\މfNFN \0GJz'_tZE>9}%)ԯ()(QVI,dޚ) "،~P>fS'ɔw>Ml,DreϓNP\tuksvxF ȣL9\n&-)e6XLWrgURTHDaxul1'-ʵ4i$Mxl/{EXZApHTy<͕k64vE~r9 iٌDLR#⤗6?q͗X'TF>zU_)0t8 V:vhSBϗT)"8a:jS >:T.fH4gS55V7wˣyhCpa.2j\0密@lj?4Mq0-_1}گZ\tAcp´gexP@o$<x_ҞL'>\0S=zwWA_ |Sɳ;0@z_z5'{M<UI>cݸ}ɴAbT9rr[Pi'V9;H!d%SE7NiZP:pNg&/J݄YI+@oX3ITY5X~8}(0&vx?R4JP3ڕh~ͼ(whn w/aHU\\`(T<Wl|D&R@hX?.zm94R$GA3:åj?y%ZWťU7"q2(:Mq7LO;q{L'͙+;AWh2nix~3tt<V_f9G*^j}DsS_5F5Ajv|Ady=\t,2gRȏlnj~Va=8"<UMV;IAe""YRߒ4@S@yDA1qlK|Bð-P8n[:vzki&.s j;T,G0p!22YBQ,serwXE-fr0g)sl"2:*-QP6B腟נpC*84ݜHdO=A$/1Ww8Um@.ǝp]n\n#6sQFb]0j7\\|L=f;)J=R+Ue=pgjI!ڡ[;mqF(ds\n 0@s-4>6>$=Ba=\tvSR@,!m?%Mc@zK^tк{7nk\tp95\0U$i"c.ׂdXns}|}c7{NBmq'Sc [H.B2$7Li'&4Y., l$2^z,\tf IrTw95S(j,!\\S,t.|V=4ˈϪ1̝\0e+.ŀV)\0RR`YiG ,.%~4;U$oQ40e)(`wIJ'L]uiWH4`1g\nO]AS(yk tPEd{Wfv\t,!D^pT~_7 $ zfK3FkAf˳LPOз3L |^IȇT{@ U#^1?HϷ}ڭ%{):A0$@;Bg18\\Zش umw92.n;K4x5RDmRATp@H<S{T3(LůSv]ʈ3b'ղAA7AقC)ֆ2KBCx}EӰI2Dqm\nl7+7N<'tP>S hOL#}OYN:/l3v9[jj>~{ݞUyS5Sm\nIҊ\t١湭\\UU2Q^2Yyp|27Mٌa\tWނa4p@yah\n~Fؾe`85[R:hbEE^`LvcBg~6bf~Iȃ.f݊|z2Q@hh_*\0S(+!\0;z4`gh=\t)S@W),Vm):GZd!qWT+וD/B:W\\|%fx&\t|GV2ӕUKvSȒQaPpYswje*XaANAISAH[F`ɜ\tz$Xp' <R &L5[1mdLďےsQ+A=X~81BY=S~F ͊"Ȋ٢RPܺrSTliOھbֿ9.&BYۊdt]DıNLb!zIx伹sr$DCy|w1\\.xg4iyaQ:I kЊرgBwk{_ډi*AA01Mu]qk '/ɐmjG˳5.Va/YXc!l ˯ȝȎJrzm\0rFa}_I+{(:IRsk J"vhێÐrn\nWlq( NCF$ (8D\n:o5py\t%PYHosML-HY8!^V$A[4RJ6O;jP1u.fՇd5p>FVYVD+|$4k i=8}j%QbZXssƑ伸^LI:'! H,jه[%"ybCE]@bC>3h<+s$-o7]҅f,NJ찏q:oh~Y%\n~$p*)m;$l\\BE->) EMVuk( 6iq)D~*n\0r#o=QdhyVHO̙ROQ^r'\nN >q\ttf!hwβAGjhԡg_zXf]3SF-OVs-%1-c_\nZ-wF(W\n01?DAO_t%~^0"+<|A4L\nŪ:*iʌWto{*0({v*®_01\0.m]Lz(;-S)qМ7·fhyE*^;=OrO-`r뒹h>mKYBtdiG-!,ŲqdHEVb`'g{B@Xgo-Ljnz[oa&/')Ҫg?NxIB<U1iL@'"\\,@9mT/Ԣ-p&dN2`sCzMfKsÕ)Ͷۡ;^W-:r>JE{P\022 6t\twO>9{rv|8RbNnE39l?[l-2vwi^J3r0TX!b@Zt4\\<1wBu=.kYg]\tay0y~qhVƦf8~27'NXkED:1lBs\t&]zdȩr//W> igfk됎%pKrIjpMy0o|])|'9}QwF7,)1m~$rl[pۙar`t>ӹA%UX(+k'cat7vX[M\\@_7$HDi/{Љ`vP1f'`lD\0hCBmb3f#D;a/Oνܺ9y\\(03٘D9rB-5@'c-=ͼ -'Vڂb6qNM\\%Cx/62/y*ˈ<\\ԗWl@ahXKNX}7X'!_z\\wT<jL0Kb:1rIBp D' =$EjeK9g|\\q*%Y(iL^M>a4IFS_\t;Ԡp<D?jK0ddV7Ж{Yْ({GN$QȃY9ܔBzM`Ҟ 6$popӅٿ+ĉbmBT'L\0N-\tcg4HpÑT'n&0AOS(io2&#ۯ^\0.\n0hcp>csZJ.ye$zZ+Z= ۻmO\n3/#0fšM{^Otd؝bE?O?~@z+%jM7\tnIދh{_n<6Cx衦;j|lM0\0\nJ\t4v8H_*bE$xUMAKrR0ꐠ;A!RV?y46FvaEd_Pmjjۢc̸o3c,McnhF1<-F\\nJTNŚs9|#6I:o4++L<*kz+ZpߠOfBHtpsݦK3T|$ܝ*#Ir+nv|JwIbzx3VVfm9-wۺD\n\0:L=*J\0ŧL@.\tna»Pr%%8ͳ!]Lq<L=RIrpdD ~A<8\tӤ, \tsŝ(b\tFg\06y\n]3`/`4ZWBSaA^5FC s2B] RkSҦ}Y3%?F\t-r]&W6.=JX]5"gA>#gne2"5$@WpyJե\\t|{Vh8}(->.&ҋ<rB,zp\0@vFatQF?>Oϰ}kg|5\0.1k _dҥӺe|=`,_J{U9=/|1L##ތ+BΈMu5g5&F.}6a_[!E4Z XfAˡiNQvw\n-eofnXxbSNb]RӬCWg`s^sW+̿+H1D\n%LabiR,f趼1ӺN^Ef$yXx3Fx*}\0\\J[O϶iiD R(0aFիVe<<OQ)'s۬O)#3xїwk!OS&qAт(f<䩺#KRu6)ImLgB"m"e]xJ`HXe)Q,lˢT-56"uadD4:Fʂ'n1ozjAq"%W֤.Y,ԟpOsAZbA@SlLofg{\td\t4>+5\\QH[GPb\0\t8%4Lc&iAiO3YsW<c`9`jjߟug523+˙"2QRچg=w2i:</_bpYQa*G5斳!AUGBo>:E$bsIIZBF,t~cu) TLF+rA\0*bW=fcWLAZ_r pCI\tr=l%h/;A71{ķȏnk?Ga9mnBį~BJAM<7krVLE/7>6<dD)KORjyĜce@b\0Xy+!tl@FVhw FᗟB.Ethʱ~S@p͚Jn]4lk߮2J1ZXrarN\t?d;a\t^1 _D^k;Gj.j<# #r;ꗦ/2X,\\vB">Ҽ\t&Ou,] MUTDR6q5B:u}\\H:>`f3I*E-77[[ "@\\X/@PY2EQ**5X}e'G̓hSn9_\\C٠}k#q}PuB,]])HݗZy_h{>c\\b7ztgý2Crʥ;X̮3%߬mlqH$Lp1<a&K.o6>G~tm;KNN@wgbR"bQ{DV\020bq<:uj.\t Q7we:ÿ)2ңFȝ9JF?"FNPMeqל\\#*\tÑƎ7~N㟀W.QГBF|KS˽.SڵzW%Z* d7(0lb\\jXKs-Ḟ)U' EMVG#q1zOFC5_,V}J/Q1")ќ}$\t%=]̀WfCg2JZp0֨1&@vXp\nH[\npAQ3d3VyNSn_蘢l#8L|0q@\nSqEL\tER`\nFez@ip+z3&T]qHeA%llVT+sK[C9B3{=j&MF}4n: V3P<GچaQp?2yԼщ8jjxT7-.(s5ʼnʎ-t8E\t)J\0X`ȸxՠ=n?Q&gM"gAL'A!,DH%wb4 ÞIRTN))@GWW'10n'-l.q"@qې,:2Ð+yE٦ƪKMmc\nS/ɗM5" wߎPY5ꑥմk^;5R_+\04c\0.+΄.i R&]@t$<#`}}?mT1tWCIm4spfpܹ#֏|~-鋤!-uP1%R(b'4&D8Gcy&&=X`0vP7gi@Xͼahg>H=L8@y=g|>a=d!+,fv aUڠ^R^˱FziƥԉM44}7I={Kk|drw_\\EVNju\t5J8ُjKX=?v4{^4 lu#13l¬!w%D|~x-Dl3pD˂,*#XXuC I)\t^n.eP4KVlq@xӓ ZϛCˀwxE\n^vrf@Z5NZn&tI_GcU[j"ڲ1<~>7%PFUhS5>;1&bϢJRu%4_ug.#?౸U>{];i˴t{J,h:xcޚtwIաL!)Č@iUJIx,ƢdJgd oW E}lW^EP$fvFF3 [X[svP6!k3U.'n9-"Ty`+Hiz@=Ij:D͠*%T3]~8)=YoDbPfu\0jEm1ZТo0)(-ѽH:|id<xKp5-{^Uz"\tO/86SDQӣ\0$+6,^^uP9pZ`:ܹ+:Ow046鼿AyجUfI*F~O)ÁsEi[[sו-&D}y4rIMC&zD,IoS=l&|P6r5bFhz4l.F 4jùKa\tUۺ1"?̨vrmC[AG,16ĝA{:IB."I)*\tZ`?+v+'E_E$оHeÉs͐bm?učoW{Vn$:"+ f;Q1,L_0)BAK\nE<Hh#T(xXK'Ց2v^wA-OGoV*b7c {uGlW[A;-\\7KLZɇ[bt4cf|G_P|Ą"<D_!®\tm!ϰi,TĄBB/X^L\n7`0))p~1V6f)oq)=jApX3ʫ7/݉g4qq־v'RG8گ;BK=I֢p}%WSf%ۍfV#jMoAj4sXgת@$!GcOw7Nz`nO/fmEb\nur֠Hg0)r3rPw!)S\tH}hK^Qpfz}-bָ7ulXj#zCojacʱuJ \\_MO(vHI+ڃo.>l`^:H=rI Q~Α-?^ϖ~{_3ku(l .4`j"B=Y*v-rk#[W:E skn߯cee QJ&\nfg+luC^[\\k!<hg+*w/P{rJ]،S^JG& H~ՌӾLJ/CsNhRQV.G1|q rEB.G\\;2uصy{Q݁Ϗm?Nvan<2Me- st2$A8F7,T/?gUӣ\t\n|8ѢgkG]\t;_+17!P9 h!lg}uCTv匐xVTi\tkHlR$n\njא}`@I?H~ߒRsכ|"\0(Ȭ.~;D$*fw"yI\0>={ٜd4+Mωk\0CpFdtTd Va\t69ʠK(`3ᘪ0 ^lu-ÿG&%4>WK>"όKbΕHZahk}e!f.kta=?]PTAA^)_:lO\nVk=CvF"K90XH`rҚp`)ͨC"Phd'ډI4R<rpބQ.I* Pf*p,>ܦA*_43FTd|N+CDAq}t(kxE-^bګpBvӼ߫I\0\t5]?K6g)17OIuV/zکLugBrYjx"VQ69ZX"1kW@NT1#mr\\ם4ΦqA"I>VZ/3JHͥ'^`Wm4}?llh>!`p6cD;/B)hF@~Y0`T]\\:d=(?-JTo~%t~:='-nTPK9-Su0:Ƽc-FoqM$KFc(9(axr}8+%+Z?[i+5l)#DrxTB ^n삦'UDnhc8@&7tpllSl^O/NF$|%W\\fj1DGCTx'w!DJjPptM:j̅}et`yPC/#E;dp߇>.}.ЧBީZ5 nĂOagC7nKj[v\nQ29tz?}L҃d̐ å\\n\tх__& `pGa+OqAP{8EG2Ъ쪶|\0%+h1vE΅>t.IS#¢\nU;OzrW-\tkz䖒t](ӷ8|3\0U?\n'3|j;} e aYQmᇤ"bXfJk<RhSɍJMC?͝$lz/_|^(6@[N\\\tqcHeQ\\kEmj,Xž-G4sR-+qg&\0c?Lů|^)ӂKѽOzWHw6v\tt^cxmtDO3Ó1P.Eu]wԄ9'ݙ}J%س`J7>0H\t\0iQcO\\qSsa0m ;:aeEm\ta6PZB]K%\0zEcH"'̟^;ذnUUM.p\\;;{HL=}mVt+g5pϡ:\0<ǧ>WWUɥ}˜WTq.8`jb\n=1U\t0hGB(uwv*Mf$rBWf߁\tq\08/ǫE|e#sT9%!\0QďF)г_6>ZG%˗\0{.Aga(0NxgsƆVT=eh$ޫ*5:+eKHךi5U+Ԧ^ϸ),9%+-#rU@G/1,dyq4YFy<⍩WtB\\N0GhP`R*EY/NLj+IDҾgm/;t z ~G$4ˉ<b淭JfG^=8R&!WA$MUG9g>:R+r\t&ÅVaKxn6=$Gڶ|P(}x<CPWƠ>9Z_hEx52ސl\nZ\0}[7S($T{$g'*6=!a^9E%FW;[|ٺ(4X+)=\tn'J'Yr`~Nc\\ylEs')}2Sz\t9֚i30sNwI|%M[wLB.QK2dٕ%JEuK%\0\nh0ӕ8-eWX\\eLO!4ܒXRtw<0 = 23:ȾT)I\0RMEf'Ru$rpP!@<cߦ8?2gU9PɁ&2ﴀ;GҀB.+D>ѳVW.-u{n\n'\0\tCpB "j+Xk:TZT?6JR-\ni3sU\0O+2\\+ƬsZ={v<0݊Iu垅'qLO-1gM̤TȞ^6tp3Ѐm~ɭPYAQpV=Eq DjM"0ᕋg/|Ývȓ\tLGEZLX~A{P鉤!{]v-)[բ@Π\nd& #gq"]`rIN}vg8@#;kOM%7]Ta>rkue)|9ҼK]wɲ-dQ-%O{iRu@!NP%j˄&PfC,XYüUe}@M@/XFí;ڏ;v^zp\tߗ^ZBv_ވuR$@j,J<:+WTC`NeYO#|eG/T}AM}%(Ёeֲ>?\\dpx W.D5#\\r.II)^\\ˊxN5z4s.%U칪G#Ā/!~0M\nR:ds]Oc:bN)XXa\nbے7EXd&/z4!]ϭѬBV zzWFtkyVoo{+xKaLp.:WyaQSoR#x 6Mk@~e`Jō)tuEsezGY`s4NnBf`0?3;2;cq,DoEf']չEE\n}4ZvL:6\0$`F؉TLyPF 0jxu&\n\0@u}5VIG6*-O(زlGaBx7Ɠ(X0Xyo*E&?/ܗ<iWk%6=vu?`]xJ:*#pZ [l~Jd]|÷60I-<c7[j퇄i4xMH+o+[X-̫F]<W?8LԢ`\0c^U|J|{\0[ U*P(\0-Ӓ(1ٙ%蓼ב@#ݔM4a>wtj$7+ц p&ԤhΜ$USO>Ix5R.; $nmAB$#.,CZV0Tć|- AM3 J3h=Q)D6֑z[>{\t}qbWeE?SL\t̩%іY< myq[lB^`PIs䳑%W> 0D32~k=>-cH{moJaÆ)hv#Հ ¤.J&G8\\t:as#%w)lbII|n%P}0<Z%36cnB̓^IscU=_\tnw$jE{vv,&=4q":!~=Rus6.0FOpRw\nj H2"JoŽm[ wڜK{UHeExMDz7gs_\th}W\0\t_\t0JFdXCe'z+ZJ9چ=fP`ACM#|3}ě\0?e~ФAb 'Ro5c30~cdA݆=5A>?giu1캓?JT$\0:}ZSpY6ғ5XgK}noP?{a/,֘ПM,h"ye1qM?v/q[%0ʈMh@[ D4~[%Ў~F'u<R~>+Sq)x=.֤9\t#]\\o7J\\,<gn~JɒmA{y/xZ^h\\3{>^]@Nm 듹cu!z)ĹX@cVC"^์P\tECñ^V":Pa. Ⱥ"ۛܠeϤJoIkOC8IK;+PBg~,.I녣W(e)_x0j\0ڱ~w/n'XBQWNUa8/ݒ2/oV9o|)ӈ,gΫ>2:8>Q'>!6^zRp'Y0g ,<^PG"E?REnjLŸ? ⹈?p0\tkqirXxY+WO^?8+S\\,k"2ވe$0ʧ/ya0Q}</e&YyA.7采[ߑGR{'/Sم\nTxʦǸ!p'ߠC]>9-LbjLy6MпA/ytMGmcmbƜFb\08x"jଫhOn<M{g̫`r\nR\tr-מ(wxrEȽ8:38)4.ӥנ㏅&t=L9<y_#m.s\tp̬+@Q]r:zwؘ\\yN.{FݵXt;>+l/bC XO2BքpccCO\t?zmЂt|Ll{>92j~/CK`8כolVg6G6n|&,^ASx`P(s^hdIBojP!3Z!6B/ުl0E=fWhS$f=%Ÿ32P(pQU5iﺩVʍ8X f,q+2fOPȵ:2du$h?01TUifLMg5|>uI\0#{A'.;^̸m_TھMXB"4|&1Vor<b[Q:/VEV]RT%!*[(%yɱnT'_`\0qAHz 4B0l\0\\a~KuA;F8ݓ)\ts'Ax0m͙I;8'~rnJB ̙/7"jA#vPLv0d`&p^X9nkj`AW+apm7k?f<l.S/l>2ܸb\nύzهbvm1\03uףd}a`>s@Yc#ΡRbF7l) 5'*'8#<{n3oF8aW/ѦH|o# ($'#[\nXO.7!j!g,bӞS@cYK9=*J'{*Nʄ(Yl+ךAlܟXo~{%O($(pjj\0wD/Zn|0o9Q4V2':@ѸyhHf?>*t3{_{$V%$S>sY%v]q5#'CGv8-H\nqymV\\Z> ù?yeYk6)!RihX|!qt#tl^A%|]0^GtP_vZ%)֮N|KH\0D0WESrcMHCU/ݭ |\tL9wV;:;1Пb}4)\nSʱ#lEgxqŞbJ6+31-ͭd|}"CGikw)29Gqe8DT#O7dOO5ioXDexJI9*/gbW+Vx_4~2Z2O΄%@ANAW>V??V5ۣecG(!!!QP\tGǂu5IprIJو#u7@ ,0AĜPz")?܄b5{r-4MmRȧ%'>]4xejhs*oD2©6ޣpl_z=6gbSÉZ"ÇT/Ң/Wla֓HKU2FZ]嶀mE4\\%ulidzM\\.w@L8knלoxi$Y{ݎN+9/Z\n[+FBN1Ω@#~-+*x+8!_xB~$14 ~=/ 8%c[$qIGp#S(ࠖƜ^U!\0'qr#Uܦ.i:D^}8śMYj$;a7 +ͥdtlcSl@F~敪VB졗A\0z<ޏnw*:yc ~qXP#ḏ]}u b%+CKF2sZ~uEd6ZlAOnLWezabbts pؠtA詭d{ΛhAeھ&Z%[qlST&}Z0%?Xu<^݇KǸڷk):H=xgHn?07|'FoiX9,3gKAv/l/8i{s٢' vFkQ"2Xx=R_I)aAaqpQ\nȲl>0]lUf`PV>F|$\n-qIS Sh.{{S9".xLlW8FQ_+y+]hVKXEc&;=4]\0J/v\t>rnSZ9\0\n1`P&2G?cI(&͚e] P\0jUk"He{.nJ.m3?%'}-Lް]"rĉ~5~ِAO+RM]zeL6:=M1M*a褭5z;~&yO[jr}e^p2(rMHA,AirPB9p`t^F>$j{KxHjy1p9\t4Vė*s>2rܠ͐[\n\0\n*B7J\0l2(ƙ((kmg&k9j<s V8+]&?cT*Ԣh~K"&TGOU-d]GEL˶kz&Ckm'/8UhzA* v"[1xDN+lnF"M)^y>N'A%:0~ώEе'|ʕcyU67d&O^f3ȿ:_I[PE3PFO3%Qtf'j6Sp<Ԁpp!Y̼1;;Fdyr_k 8#BЌ߹9V\tR]ȎzefIT(pC wuYHxN)-l_Y}刽a\nJ5&>FDV'g?CgE_>w0#p6V.9$Cjr۰8\0N$u~ɢ.6.R|y1&Juta=fԡʱel`J}UZ2%mF1Cn41r{$\\Y@%3 Au`mnagCO=ז9CBu^8-DV\0 ^xdx3N4> &jyE(-"o"Z.D<m\0ߚ?6Չ v9D*R^Sz9n˵aLښbz%jqvı4a䍁nβ}T*Le-\\6iDu]j]dfI-iԼ1g_r]Uo{LJ+Iuׂx\0Bmֱ[l{C\n}Ђ[*\\$n; TfIޟ lKtfeS##LiyN<c8Evn*$rÔWt'8l$>c|op1n6&[Ty#['{06#LqkNOlRJj8%2憆7#~.>ALχW:\\JD;oyt,Dƙw{p?6uvx+KZᖀAWbYo6`6̠y͖xҖeřڔ>T^;\0i!4T[wCP3J>\nx;"\t`N}HiS'h;R^e2ĎY+7צ h臘߁n-MyO]n2_yBCbi蝂"'kdIOE!K733A@Y,Os$:~0g2HyCjOEg:Q|\\Wr@S;S~4̉ZJ[ԾSf@}\tbg@+GxqQ\\^d\nk3n{&yrtlfYM@,9~E hOQJ^v\n)5Z3o}xXA;0]:6Y\tsCM=c\nE =r&/z_u;ʅԀ\tiGuV1-/IR]pߢvi\09FAґ\0lc"0.Rx4yΩqt4yb&×1ev>4tpM["tL\tT>I'|4%bD\\=t3/!?f=dGҍԲ{s\0G\t}ɇ)=J.(I=;a2_bo@4ʋߏn5Fܬh-L"\t\\r~D?I^u\\>I4ْoErTieO߮SZd9:vNۻS&xh_3rlby8%c@Ev z >0.yەT78B2fמSXĘp eG6u膘656r2 u=>2p@T@$pXEсyL[\0V41lF\n<,2;a̛{ ?#9Jpu+nI~D[D&F2Έ2?sZ,Z<V>rIjwX;UK(՜T%'Sa|\n1RoQYO9\ti 80Ɖ^X&ˢL[L\tB(^\\W=M7*\n*N~2oj+h3tTMze@n4ɑY1X>5ͧ3@`*Ȟ9҇Ђx^reYQ7dq{F h\t4|b\\[UAGtO;\0* hF/6X~'I>b0s\0M9/uhE\nS#f)dn(AhE)g{Z|C<ؙlaEx(ف \\1;YEA`VY$eMCݫݨ}\n8^qŪnO,̽*Dm{CA>.AzHPQwO9L2\0z"Rb\t#2!=]~z"Ity?GX&$9,_2yߒ$@qR43#zyZ#sPKa&7]M8+ǝ@hnwt0Y5@ۼC?@gqk {K3WlvJq&uEo_o\\(t1i,bXi:j{x;l^ OJFq{=!MD{Dr+``q}ngOFƩ-OP\nܗS3B)9"iH/C{4u<v$F;B%U#ՕK,hfѫE\tx.Ʈg\n<Y<Ǣi03A.z̝Uwjg\t$_\\qh*<I\\>#j(:>8#3a`Plyb/BeEgoiQe\twBWKLiHE//\nܳkgOreHcāv)j&\tmWEU }iٱLh#qoV bmN+_~@/Unv<cdy%daewlȅ{^Wst_fWjePEvVebek-8F,斶*\0&M=|dA:bs,~SiYԎI{]=V1XegvXZwmEiC&fJ\\qƮ\t["żǚEx?L 7y©ϼxcQ;K6T}ei}Ȯ+|1˽K0\\n.}"$mρ]x&p4^k ۣ߭"2\n'qo}ҷ:Yzc\0bb\0x~RΆkhC\0dqvn4U>IFXϜ'|n#QŴa\\fUS'IO1gSC#~QXe [wg@f#LwzcEj 5"VYfمMUuv6 ;_(3炼Rp|sSjmvi3`閆b;.āiFϗ7t?M6;0U\t\nYspCt4n/\nl!]h?b0JC7^05n`ɧUV\\(aϠ(ISb'>ؠ;&?PU|Sua[yvztm,82=eK7p6YLrˢ۴aFE052e<bnK*mĖ8n'|7~bf\t"(Ȁ>|oqGb-'x{,+i?҆W1>iJtS/yXcMU'@Пz4pt1-G)Gڏ'<??_\\B24݈s%$2G~w5\0)ZS\0+PX'ܞ}wޕ=!v\0R \t륾1ψe5M\tܷfo\0-n(xLO/)i.UbfYI{z^9k0YSA.xLEJD'IhdEV@\\szOaՇ&Yl$wdžN8Up#ndFe뙎q6u=+4u׀顙Zb`_O:YЏA=%v[߆bgBnѬf:ͮLXƏnR\n^DLfsonAɀVdr%UH1J卙?MqAZHO0N'hOsX\t?" GW_IhѪA>[.u۲j-6=H_48$?"ݵǜλr`nNIJFO)ȧD,-QUYT4&'b|]eND}Wf:iFu'kY$s+KA4ʹxn/g}pHmWFCtyΌ@j6»$u?D![)3a=vk:Yeat` 29\njDLA\tW3-Ym:8b;KiTOۄpkVq1#\t\tGw&rLR3Rc GeDPoR\tk{RqS|'ت=kfqE5[8S\\X9\0$<xuU7\tv?֡Ѧ/Ŏ kPu,ƛ~<~o"D1O=bK輻!IKboV)Ihp.|:`&wA=Ny$^g}2,{! 9XתYTlQZ21+AIHABTUg}*/EiY|a|7sN%lJ^Ie)(嵖0]t2BGF2z1{|ڽ2/%e₫rOM4)FJqkPpŒL;?r]](lj\\ڶPSԆ7QNl㩆4/{-E/8ݨw銉]|"qZf^f_9-F)cMa(@vS>(oWQ⊐[v%$|d+QYaduu"vN\nP{"4/sNyQGKiŞI'\\lh˴#+f"93[m-T?P }U,:-ؚtRpnH}QX_8j/a-qe4;^XT3i,U3Ϸu[T@g\\ؓa@)Hɔ+PՙH2nې\nhO!kS{6WGV2h?T+,ʬ4썳l$=KPߢ|ODo+3cOOK9,}Qׁ#(P?B%a3u3BnB5n\tGwA9mvЉbxe m|a\0Y!({(s7kHQܛu2%1EQcW8WHc*$ j$0/T2(\nATW9i*PajI$bX\\u|Cw:U! R_5\tЯ)q%Cx6%Nߏ˟W7kaZT5l;gRȝǻظAJo|_o>7sC6ڂ[6Y{gO5h /;.V(e#BC4u@Nu߰w-wj*ØT0żuP6_1wA_9(V)UAST]w$`A\0Q-]wdx6ws@qDW^ϐtYn r<0yי|WuhHYۋ h\0sGkcTHP7&ԉrf_;*w9eu܈\0b +EuF$iKS.Ќmgچf$=;MLRV0}F6^fNBK:i5֦Y-(.36e"FrvAGػq%\0SVʖ#xO.Ȯxs7čSyuuw$xm\\5tdbZ_b-]w/]J`.S?9xdiD>GМ-obaCy\0KgIPrrg DzJ@}՜hk"$@i%@w/sL1=H?V-\08%o'zB!?ف{hre3*`HںLfQDQͣX,(^YVoFgo~1GhLeʶc~R'J9էa\t4~PK({"iv?G[lmS7khSP$!YyV2~v[ qh.,ă(4b=8C$@鲍&Xndtl.Yb0QN*U,'=AŰ`USIK-ևCӄAhyk4p\n0 }7'Hbr":RkXBs>0UMl^c}ۤE{G'<hBT`\\ja9cXB\0Rц!X_Ooؓ"]A<whhHq(Cg4"5/eQi_]+zGqqf>/U[XׯA{G47mZ"VG?}'s>\\bE4\0|%?pJ|ǘe#Ї7%cLR`=L-Ml2~Β9]O?8/^S*Ij\teI`:]58"QF9<pTpJyrp\n:ΐG8wol\t¥%XT8`Oq2hb#{Do.wr5rrӴgf$zZH4p=#I܅V=,ha˥RU-6Js$fNd\\$}\044,ar(Lu-\t)! \n/\tM2ͩY-BQPBT4.F6jJ;Ii#<!:.ZݪdPnd+7ɚV.mOy@7i䋇/ 71x_8"Lug ƖDr**$cхԴ&,}ue$z)B}Kܵ|L{39!7lb($mmZx0x)4MP5H>j'&B=Q775e;6sa|>*tAO$Rݖ3>z쟷ۍ=JpuBr)FY<|h)\tůiKjq&l~:D{_ibcцSn9'ZpfB|K:6mhux=\0Ѻ]W_Ԕ)k5G2䓐M`EU;ݫmqs_z)@ˌ|T{<SiӐeIj}&jqZYDŪQj0,]ƒDl(K<iM(q^lZ33M1i'XО!9_\t7kp!5/l'l"O'qp}&Gik}=R|UNnM4 Oa<v8;^5Oۊ5eN9*َ_|.Nƒ1K,mݮ\t\n2|cB N\to%:pUoEǕ3ims'$)G]HYÙjJM-WN(s@湡ywx0bzK+i3,OZKP2M_ӆjp@Zl2ZFS&oeu4s"PAlr{EM#{-Az{-S62Km(1xD0\nN\\8fЎzD"ZrʦqzJr\0!F!l|J!X+S+GYiHPfB9JY:&E?!̥F,&S{ϛD2#dcy+@=Q}<LK0nE_(yط۠}?Б0'Z5X4Ac/t#aOdUS?r\t70oTO,wsETB8=UvZ~%\nSGYm<kϲ$~y|<ܑD\\FZEuQ\tfv: X;<MBG%IW{J:QIpl>I4mjGS_)oxt$"͛l0,qB&p)T B3p\n&Vҏ5l\n.ReRӜ|8[#($^^\0"sK\n=bzT2og8o^8\nή$4WɔS88l4HZ,?vs-܌矺hE2ٚsu,~˼T1YˮnDŽxM RW|+<R}wv.$b8[/NtD\\qͱ['a'0*F91N09\n!mꄆ^av^PKO2X\nFV,e')B8XCI6.1N$˕OƖr1ҁr&Wh$<cE_o/ȕmDM+#+^۵(/cvwTg= gVȨ)ԙc0$\0+[lۦ.*n-Pdula&咲)%tYc}9\0>)PW2=8u%ȏxϛM2V+\01&%22?o'K1/_o~@P7V(Mty:TYfAT%f!B$ѕ=cAi$4nHLG7.T3DL}1NZypXkh%,̕V:_uz~:۰U"-0-*4ݽ12p/|H"ȲD٫ҤE$/\\"y)<~{XD)6\\ \tÐvڕZ&L,4} {D@œѼjA٘=e#]1OӬǠ~ LinZ>~<giN^4fmaQFZC}m)#]Eҿ?2h oCv[?== XsFqKgZmBEߞ(2ks9`~gCBSGմ9:lB4ĻT@GWF26(2ߜC?L\0#1}C2+O\0?rCT0x0ӎ͐3jzlDuEAixo^{w2_\nY!hU8"(t<imz [ϓy *'TE'A|7AZ|\n5 ^XGHK=fJp!͞0qG>3*nΚ!0h8yrLs'X4X['\\u|?'D2ʨh1>i~R4vFMh!5{S'H7F+\t\0韂C5vEUL'h[kΒ\0;̗W w=\0*`u(>@!>٘Wp'{%LYSQPC--YqY g|v%]f^x6˾?[t.9Cq B[X2z&7\n}݇Se QaJNֶY=!6;AU&jAm-XB.2hJS4Ǥbyzl/ׁO\tzӒdwfF{(\nYBo+!C%0垄,XZ\tha:7``9!7XJuKo/&$Ց"⊜`\nHF5X_aA14a⋱Uښ_LX\\bR ,_ؔzP3VQhE^pF\n杶uʱ5!| XWܸNԯ߯#d/ϛ)4L`d2X3LgU+M?SʊoRYޟUХcn!]`TDySI4"f'ؼa\0{RA8 r.B8,_"eٲ@#C˓5'ARPE<))%A͜`\0P,W99i=x͑B۽VKfWpiaZ+Y*wX3 ]15*He?Cm;yPo|epӨnEqA!fd]t\\-ma/ͦ\\ZCT$nبc{݃OqoaDkl<\0DĴ!2p3T~;R4` dt-P-e$^iՌЎI$-'Yˬzn[o\nHy/\nz2aM <7=t>v7@rr(w֔rʬQXB4c2=DmP*^gmAcwPXͭBfr;XI09Zw]XX+")x:0sts<Hϗy(1e/w|>~a?|>f'boֿ#|>>χ{?{O}e>~sqn~A{|;{WzͿ[P=zK~֟ߗחzX\0s#67tw&\twީ<pf홳r=nT\toڦ0]}JDqU/D)eBn\nd:\\WԄ`L<g/q7@93$kõs[T"gr\0/8\\!lcl8 3-l-xN4eӑ1B+a[&>\\kю0wyj齪Qȱ<yBmO%R\09GE CW\to)7n< &w>^!@SMZf"+E6zBH0cW:EƵ"n*5.Sxja/In$XGwa!dD_5qX||+O(L4Qvƍk%n?=5RfKv1LfHkzSHWJO-N&`g|*' [ۑ!Z@xI#m'/SrdQ1?M>5g#V!.*ڀH%^VAJ\04Ĭgy\n}0]σw[/Q0uT-m9%U+aH H27o}3 <\0?(Kr;<%4P"9.ḴӤtfOt|ɠAq,q%<K5Wn7W%4EF\nR+`ˊgkU1i/rM[n/)ڈDvW5[+퍩EEHt_-HRvGߊe(n5z 5a$D/PYBsHRkM97\tApGfWi\0*nDU~@ޕƇZ]# t3!W>}X$\0eV&̘fjMM{\\wζC9@<\\m37K3l<OM']1Z{2?xͼhRMU&;egu+F\tM:Uv1eP kPJwLq~(J8_>g2E|Jj3t;S9儏My|GVkA~;1ml4>{.VbNN2 k_<-T=Kʤ;v?F4qYPj<A}bHD?2W<*i7o(g"Ex\t?R+:]I';RB\n \\C2cZK FP;O(\0Ǫ]_:)m84>em:gmnc%"蟄lf7)YLfQqwC\0PB^0-T8\\\nA=j_%B{0E*`XxmdVGSF!{A. c^c'ߪ]?Xu|$llْӲÿB͎AQ'>ۑ-O\tzk1khAm3o3S'ܗZP]䔾f%<\0ǑsFg?;KS%ؐfSF1,l8; |YfLu~uw:QV̼WXKK2*cvu;[aP:aBm;`Vl\tښyU#y"${8)QI#U!QUjlE\n\\ʄ6Pm[7UO٪Ic[33`9^ד2}2^I9Iܚɶ]q(=5\nٕvGNM^"\0\n7!i\0klOxn;Dx6Q\t^,e#2A0LqFbզ[jR)t~C>MNbnpjuȮ˟[m=e%D!L^/\ty>cYWAi!@-W<NiϰyK*(}pC2]Uץt;"y,")g~{!Ut\\X)UČ#;5/ƒ<͵N\\.hF&Zw|͏ DONtb$pk_7T;PO&K[.-ѱKė4"l΅NlPmQ6D rr[F-J0Nӓ5\0g+:آ\\3mC" \tj]);q۹qE-duݐyb\0)bΦvWB ;IT|MJ:e\0:>-i'53PZ͙,.]Tv!0 ċ7c},!Ph'eUAZ#]X~k):K%0B%& ?AV&!#Y<OZ![@|-O\t`qҞtTw**H.ۧ0u+`]8e:o lT`R=Jed.S.\\AII9AǀtBq[CqRK J*M4rU-}M!d1]k))팚Q?{3WK+{D2-47-pOO]ӂY\06[\0hb\t]2(#KHvN)FP_k0nP2挞qFZZ\n6ߡ)ZKcsJ=z\t1H90:)IQt\nL aVĕUYEB:5'X:Uw}J]ڸ?7q@Zg'F'Ku*Ä⩈dG P`ύ)AOrQzþ@@QUG*!5clȰ7ŌCAU3iy"!W]&$xܮ.J<7s^IIS֛tnط3^#<s}.-adY 9,X&!Au=DQaS\tHq^slDSQ^:j7=^{҉8+tdy4KK*tMo:fR'ĉS8/(GE>̬}2by=5ߔ{e\06o\\rD(M5{}{"ס\tr|'u&n|H쉗}"e~o"g^H͘,\\o\t3H85*z>^2*Ed-Lڑ1JJ +1tɆ;b"=<)Mw=KG4T\0tkWQMpP=aD\\V8Vȱw"}te#^2LHMYr:#%+ L\t!>N98W\\CKV1WEd'~ab_=BZ<R߁֠$rA\\e4hڶFn@5Q/Cn YШԛ^,PL>fzaJfa/XQJ&eGPN}\t].h{+=$t4hϓSs~9V*m59I\0Y²qreF~@C!j|AυWDOz/qbbZnΝ%^l Ԭ[f,4W;a^航-{WB>8qt7a:uXtZon!vJRo.gvoڢmwe~e#8M{y{`G&7|sV,y^pUso}n]cK͕%yO*H@\n>z @\nl)O)"rR^\\JN3u4"mC\\_o$/eu\0]4Uz|h):۱<ޗ\tG1!|2CI/yE>+q"Cҫ< a[~ O,_nPk~@;M1{g!6ZɱTm.^]߬T hG&>Ӷ8\n8:]f\n[+^"&-'s,L*%Ip.NÖ->R }歅FAbҰqY]!Y@%5+qkc4mfʜVɑra0 P(2elK&ße]Ae@i8y>LQic>5SaֽSp'?Yd-U.~\n&7q@2RBsiSɗڽ%rܩW'~s-VJO{>=h%GM!k{%fүpmϫ'eنOp\t٢K\t ȴ`Vv@zNP~oR<)3d^f<jH@k0{G\\t+/!Ckz&yLѦyqi2Up#)L]$aV˪uI|)dID\\zG)(8V` 7|=:H*KA#b\npZ_n:|=U RtLT?F~`A}CN+ExZ'=CÚ<w:q˂ȣIq~ӭ-v&5{Uֶ&5+GiuO!"[пan|#V"/o^T|*&ZtIR>P5Φ,$o@vK9ߨ$U\0_)oޘ0xH0?!2fwS-Vy)v\0-\\e;-gܚe`n z\n江Of@@\t&8,U{pe+L<cW:oH$5^Ka$LG_'X\\'AI@|>~\tfƨYO2m%:$P IDWjH]3reKgG/|t¡,\0z?"͇9/Id@(\nxNHp:/)1I WT2"0&ɷ|fޔx~TVhBX9,kO-2fd{S2ˋRx--̑>j=hZCƬAF8WA;f\0I]<(r.#E2٣zN?U-X"_uwW'`0r_0aSܱ$ƸiQoؚwꤽbS7_y:)iG|V`L+$b\twii9gR%F0R*ROpTRoХĈ\\#_=\\Uo4TyKI;87B0M˂Sr^w=:g?ֆ^A\n"\\hUҏBzF$c~EbbI'{ XBs[42wQ~cwԖkj$^꒡61*ZAn\06?:\\9<got?!5)^\0VJۼ!*8NeDL]+e8$lQq˂42t~±p`oI8~c3<UGжz(!{Bf-yh.HAz@މalVo݂-+KP3B /<Led0{®zb}$wt.\tD4k{&Y)?G~\0b_:-lqkZrSosbMx~7P#ڿG??^-~mP=`QT_wh:ɖ\0+»hGY?@K\\{x-)Y\07gaCyy";2Nze5ZW<O+U6o5\\\t¼=zh }-Ldg]>RBSQ~K%VTl(f5_;!JχM<i|rUa+Ũxa~3*pnZ[=t[d*4o=)Ѫ8s>iv@dYY^o\nfp\tnKTyPWsExu, <`{JE_)3N=/\nhJBkO$g?h6Jk|lըmC33'5u~%.2[^nlG'Y4DQµ|cԙ2S!]E@Fp2gX}[**\tWv3V$w6?PfPFV- K$s_Z2:wV=.|dɭx9\t] >rbW%jo6\\C=":[%Y#F4@swA~=X?{MmHO\n~=DL݄\\fSr\0}1q&#V49٥6Ab:ז5H\nKsc-I\0`~q>`a(bscpH>t:c'G;"H]}(&I:XȡhIƀpz,^b̀1`XS)I`!kEY{hY>W3mЂs)G@)?& ,2%:':țrhԈ汒Gfy25͒H}exLK߷^<*l>?wX,[bLdkEpքX.o\0>`<U\t(iSYWȊ2yHkħrXYD{\\C&u/T$pﺋϗ͞~侵M>{qo8\\)iU_jԻ[ўC6zu,%Gcv~WtdG2usxtqyJ<T瓈c)-X٪|2._uJ4"ǍFŗ!Fo;<[{?{H:9pjH=TyFvEY5G(l[8!0ܴNIj]ͮ-B{E-o"j2|\\GLuA@[fy}?wiN8f-$$0<E\ttD܂jYcB`8zJ4'v1]2k+hzQJiv7yb<F]jȅa)r>+FI81cD|Pnx։y7y/&/4@;7YV<(&\t_a!]ձOVI2Fc\0YhӞ<}鯵J{s>Wei7o-ut`ϷR]@@(azg%{rHdzFܦhښl$F,prwZ)2+v\n.t̴<o.?bSU7]¯`:"!l<c/\nuw_ikt:) -2㈥(_AfE=\\ݬ9)^=>VI.qa"">bZZIkC{YX$M\nH} 4l_yvښ]\tP)֥F O1EhhcRq!A89wQp'M*yQKlE'Fu6_GZ>Z\n=检<#A5rc2=-Un)xxMif[HK=B-'mŏW1IkQ+ze1Wv?>s3vY,rl7W4,Rq.pbO ר2aLڂ-@;@wRs\0D^ΈSVz\t!o<ʜXmqE̘X5cr/FB:~?,KE4Ku-S0F=}e)8`EbT`G cu"2丧o^֢)ro_7`s1zJNWHx5$,L\n=fMd51O_ppᯇx)%u|^s&w1Tw {w8PwY{jἧ&h%ZN~wUz'/glEffIum,W%5*ZgVIZ(2XGp\tnX6;NXR VZP3OBL6w-\t{5_Y8p6\n3zy232[mn0t ,"8E`J..݂W4Teya'<6LΔQ\n[>ݨa\01ngbHxS=Acs{ A\nP0*gwAHHWf<?,A̷L6/SNbqdȪ%vdste~1]x6XN1ٷ)wDK8}+5tӊ#Z1eC-Izl bsdg\0ῒέB~`4URhDY7˽Wy6t9&Dk\n2\n\\D'y{\\¢ } ?XN2%&Bs0ؙO?V#1AJlR8Him] GNpo|28S4+[P-JoҜzunY<;5-8;MJhӢYWCD\0N\\ϏdEJL6R6p~_V(ٞҼ4J9xހZ^*+1韎29x~3O#/"^mkoEӐ]#f/FQȟؘ< )18o_>,wOGUA`s5=1t"iV_2{/÷2p`1δT^id%5\0~1l[^%iNմ9IM3$~ScbZ%Lj~XO]Ac6^p\toBvصJ;\t𮊰FMi<zjuK$Q\t^\0G^̉(N &lb?_܋\t"paD?SZby-I'AT]esgJqhTG&\nݯM>9òuZ^F:эbWc&;ϋ&Xk*UB`vseu Zz>7DF02\0ss4+2UdxHܢŝ@7&\0DرN~AgfվM7)[>\tAq'IrnhR9v\0T/ɪx w"yhk=htrևa!U"M!&LQp&q70K%m,9cxsmga@8̗ȨnXO=Z5nC2)Y%gXalwNK4\0Ę,41 Uʛםǜ?>Rw3mzҽb\0L͢ԷIXW7(\\EB$Qޕ/#FE"`ߕ#({d<Ca1y\t'J<\\M(z(j:{|8AmB~]dVǏX~6ap91fJpa\\ʣ\t=v/$^oq1.d;&&&dv~D42m"oCRP\n2.nXٺAOTu6B9Xz.z7?4L!FMP1ҬXV(\naW60]J ?Tcd|PT2YsW+Gu"Mochȩ@^*\t1@2,˘Χl.'sC\\\nۼQ~/x3{}+66bj4,ZdD3J57drp}0i`@+:ɝMZf0:Zs\\gzԲ8\nlhGx9C&)6YpY}ouHј:5&&.Ց:m|ZrAwne'ኰXsmq^\\:0$R2'ͻ7d7]@flth/r<ڵaB^}oNcLAqS1; @ }r;Q@xV1&0j^C[n\\Kk~:qOf]ࡔzr8.VO/Bٴ_2B)v(RlH#Уdž6/6-r'pKɴ|X䚩G+ׄ'𱖸teq7U9Z煴y<R(b?2̚ݓ-ua$BxxT@=ErSब>٤WIqNNgn|iTǦX{4gbP``nF=2/#GIM4ɤ+!K<h?=;K͖8\0zq?(:dJ&\\2%iJ1`o"^qS -@s&*E@6_p4r\0Z5L͊k7\\ғR9R\tHEǵmU_款$7QC\0~AFvA<U$W:?SOpaS~L߭ƨt7ِRKԄ4G<XoY`]y8,o+ [7Q\tىU.CFUg;jlEPiY8A[\n\n(g/.C0Xޱ\tP`m)5&̻_(%)̕۵˧!C)LO;ash,#S熥!Xm4XWfŬ-uHu:̘d~\0hĸ<t*tFKrԋm^Hi6wھTMLWhCz>^ժWSAdܝ;C\nn#Lt;nZaXD3rUg' /F fm?yv-\\Ed.vbYɆ+ثrУ+`",f]͒Ջav=|o!0.Ʊ6v8`V2LwPa3H}Sk8509y6pJWX_HV6zC2Jf< zGT=}t>D)\t%Hu6tfIH݃")iTJ"\\6ĶǖȅUSWm` Ldr^vL_|Ģ#pS7+26d6Wҡ/Gu7/i|oQwl<vșeGڴmNYRNDmY^S7S5\\ßc"Qga‐n9Ck̀a<NXAGS1-B_/KԆE2~ÌD,-ոJ{87z# E|ʛb5dÆꝡ;kQIOb%r9~0Krߵ<"IS~#)dRTT@+~,i~crݤk<u:6ZͪüJ+&RPF%\0;MvdPӼx憥g6QJIuQLv,_<FK:'5w)&/?P:WwzC5n@WDRb5Mcje_,<7=eAؤERI卽%-q1ZKgC{b(RqӵβȲx37։ z?L# 3\n?&=\\m>0\\wQs?O6߿}B֣(fxx@"[h;ۖ3}W#5'^mߦ-\n+0\n%&W)e/xgbj˂YIǶFlۊÍ)]3Y=a:maghAy;5[{;z+!2*@6s0@u^6OS*s0!3,OI]\0:'WOJ^ټ,/mE c8~g$\0zj(z=[\0":F:5w=J3$$kcP?BVL`lL0N=v㝡^!vߌ>ǫa@|Ak1rklݭ$t +$ǁTb8/$W;`f>Y2c$?kۮgqw. |\n鄖ϰ7{K)t8K=UHt*f|!~lWb$sh#'.. o/wAnW=~oWER|\tBlx;ӺgAitf|5*%Snykc&ŕ12@ɹD?D-@i9BЉ>'s\nֱO5 E)hxc-eߕՅǑ\0sOgy$BfC% aX?L/F)Ȱ*5L En9LB|HNݕzt17h9iD2'øTz20#@S%f Q5ٱs"FĤP51"RDs/^Fb@2v|oIOjB!!0[Y*6k_eժ(HB4Mx!L1Qnl,q!)=(&U"[-Qnt^^8ԵP1ԙ-ܻm+z!$AOr%y_q]sʉݺ:Hk1W1jn\nF抓IN/R\0έQz7(f+}۩"廟B1y\\ʒN1qr1 `|NZ^ޏ:G)ls/K\tFAWq컥@u`0\0;cnd}0<6k_FyI~[Iwc%1hwT3+hβ0:ZҎ"֏"]\nGO]yWpf|ϼ,L'䴳C_E*V,T6dP*/,ރ\\FY3â'0/TX]./V8#A~CwEa7lqAxޣNB-8^.]|G5\nD~(}ww.*fN)XGmھX$b\\?-^Vծ$\n|\t3~{ZL|nB1poxAdE0߾k;Ơ.ct:;VɅ|"e+@;vO+%QjH)0afs-VF"ky{\n#(rRtDgIV";a斩WtM$u'CrF,n;{z7CaOJ#4_,\\W(C⒵;XV;r=׆Fѿ"\nR~\n9Mfl4G(=\t\\kɌz:s2$8|!YG͐Xd1`DZB"QȚˠ?V&gh^,z\tMɟv+|%4nrb\tne\n{P˿Mo/S|̪I+i\tCmro2m 8ՌP^oeS}[Da1e7sS_3keA㕾ZNwwǴ= AaV\nVE&VOֵoQCr);Ѳ/WGef.;zbl!gCϪj<}Z}uh*meU[#̽r\\|73Q$If0\n'XS`<uh _Q6-DF S+<"-!J2J)|Sb:`{?;͖mBScψ*MX? eYkk]8s4E\n(ks֗ΣUv6_&sȏUvNHi>S6\0~Fb*sxt}mQi rPCΜTq94uh+'P4Z//c~@\\%oI\0UC<{nOذH7Qd4Z~ǩzKrL܀cȤܠuEcÇ8YJ\0,A1-PcE=Y(V/~WY?(B*9aYadtUD/6]:HX Z6,5$yR$)YU:ݣnMI4o\0GNP>Q_RaΨdG3ɯPkZ#-1cw\t3=7]\t"Qʯ3;y\0/gk\\6}κvn~zWeSB,'Sg=uO혅O!Z+L^HzϹ^O!Yx7{x^c,8PZc1g nC%y<LNB(XƈX~5c)/Rٹ4nzcc13rcj/h !O4̶s4RN(\na.>_|5F7L zA+tBdhSt"/@9bavҗh_w*r8T(NtI4AfXCBŤI}`W#%\nϟ\\W(:IhX,28ˈ1\0mpŃt0շ@m89^-(UDAmFc)Q/ٚƨڂq]2Q"0iM^.Vϙ4?#1M̆<ȡ0\t*[?뫎Jc@Jl.HAHx,_3/7Az>\0rE?J8,bGcXo-$ϧkRf4Mm_i=u!-+EZp',}x5Noml/SsQ%㜀`$x]TZ><ňUo:V3"}Pn㘏q!Vvvz5^ny*+|%%%4:111]1CӮۅ!k^vp\tAQn"}ztzXI?N|ݤCVh7_`1BTBJ6glg=dCScse [.M-hM7\02n AyyoK1\tT6ny-TIí08@Ȇ ti@"d"6Я)5ԕ@8;+mPR([_OO4:>\tӽ/hM/G<mUp7gy3Sa[K)C$K+'R3j]dk1C|JB[Ҵ٣-L+~R:Ix-rxKKm;-#-$Q -\\ "RFk;"e!K9tӀҼ>ciT<"(+ǃ,KWгh6tlYF{ ٫uG#%*R'3?b܍VSˎ!g5W=XT.qjH=LTF\tY^$7Vf~X~tE`^6 .8ⴐX\0a$?s_xớA˥i'uJgFKia& {,|'g6!\\9̭Qxi|u<`HY]_/W\t6#(F-t}AccI-FTX\0hw@Zc(KrHL,<DA`kK==roњ˳F8<qe3\tbϩr9{>7T$Xbzra=z?|(q*RY=HfTBs' 2φDøZ1PTӈ*f|6;k@ɻD{n^Ez0 EWc]$ݴ[TsRl^oEݱގ?FzՊK\t G{Q&tUܴ%<qtH#3{YD`Ԧ2^vcZp\tpu΅kUŐ1dH/bu4H-BmVX&W<-ByŃQjGn?t&H{?1Y;t~ lCmC?,DQ;P8OpZ6CS>2.\nFָC[]&}XGSq VڦAűQq>EgOKΖA(v_R1AGYm]v!-[EHi41d[aQLzY#el|.@TN YV1KMbaY!SyHgվ?~9\\\nb6sV!3;"\nsӊb1,R%04K Z∗Jz>Z+"dt~D_T_ wzaD#*8d<q}L(%q+gW_ʕcCo$hdV/A?+93*#ˌ~(p,ZXәg)kJQKK7F>Т ȅecխM>aBq:Z]ŐJkh*w1D<D>MsWկ]ױRQMV/(˿@U\nlgRh8*:\\WZ3ЯB`t/87b%NvnʷrJKXzgTgd=Y.YG S]`/iqoMOCy0FJ*/yK\n_X#"]3&ڑ{? _<!CcrzS\n䒮I T:Nv"dQ5ڬ\n$3o2(#e__VJlJǢY*"vȏ1cN|#*2uTRpyț"pW<jhF]GFx?BMxn?`%CH>b%Jk;}N_"6T!2YO K +ug?\t΅3+-eZySTu#fC_(.z!(qD%Ÿ\\y^2̡X NtN^w:3R~|L tg-)PVN\0.qBmŀ̽}tƩ2MOSe iY\0όo7ӟg~`s3ɽÐt\tᢆ=@acÚblVFcj/jϳV ?j(7\n{X]]~\t+NpA)8#&q_-OO\\|p[A:OE>Olˌ};<!/IJ?\\ GNK4d^$݂C" %/)DFu[ϑVAQ5@{OC)8GmQQSg<\tl\nUiNീGNN6=E,6gGQchi1ɾM>Ι)VqX6VޔLsddMN5d\tǘ3>K9y5~b'^70# ̆ݭ[\nP8=X|ga_wVedhSV]@\tS8\tGy,-FfᮘtR.Nci.6εZeYL vZJܺFeL\n^>Y"+s' oMJi愙hp_x$ꅢvZܒJH'R$PARWE'D_+%z̴P$ IJU`ƚ_Su12̸#k#n}n)Z[cy*PTn\0UBS":p#g'3֢@lQwyCCr)5Z"8іP\\Q?o]XK]e53ix(WS;}4N\t\\<4֫leĮϥ[,V.a44y&:v"oG0iʅW\t+6 8ms4G`PE)\\m5Ja[G0 L~ǥǒ(0(Gr?@o#?˄!L?[QI KOiXБeрBŞjCdž12F=\0⦉[*8>zC;;uՔ[1!ujkWSm?ڸ*#i lG-i䴯tSAn-??UQ;3BCrrm&x5QZ?|id9; _ש+.7`I=d>~/\0X:twKSh""7%q.mSMaExyIg~bJXf*fgB4:wqʎώ:,blⓩ\nB@&\0@;C-M9]Հ0s2ןw\0Rht]YÅ2t#pg;\tC)VvG=\nŹҐ2BwuE5f?Jto"OޠN-tdoctNïHҝ2?gF\0nZݽXI&l g(xYl-C&FD{-82=DXsmB.\0'<~0U|JnS`b:jli';:H=Nl\n,Rn%j6Cb)"sp];Xvm 8`64KO\nÃK.^ӤՠTۓ|͊3WSVO#8KE,tausUVݩH<hMa%)8}Btuj ƀK+b.\tQ&Xݥr6(.q$d%Rkygos,<-pAF&@\0TgR\nh5K#FJ6t֔B\\b85l&O$q~;-p<>yb2]YͰm8\t|k'z+>I S|U*\tܑ=sj+*b0Д]g9B&Cya,@ɽm3/\0Osai/>%R)Qe%qr>(Hnb'})d$Q֫]y98Z\0M`+);VP,AET!^vWB\t@lBD`/։MjSO~v$z$ |A(Qj;OVVVmM+C>+f<,hkֹnn@!ߟ@E\\E6QAWi*mzWM6%aS^h9Vfח$G'\\Igk.ޤ9QDuhɇ&\\ebEP)$`]H Vroie*G1)gQx\t4bH'1$`|emCU\nȖDcS&fLh,{F@m#F\0Zj~DN>QKX|Dy#a'Bʇ</gTz^;S4hNJdPm<qD+TP*9>T2<B"xz=;/ؠoħGo>z7V!ShS&/"/)X*\0,yx]hjG|ƪ2h(Pn0A5#AQ#&ZKp 4aJӹg'%fh_X;g_(G`Ff2' \0NؙPwkӆ;:f@5G;v^@%DU*=0\n>cdEVWuXIՉ"ukwX[IL;ZauN,g4$~rw}\\:O_/~CU:ZWFEPhN*wڹkX\nȍ\0B DUՓRG!53_ > _;`\0||*nM0}QA(;'?CllJ,Id78ZS2*10SO^IJ4q|.3ΣshdIw=$"%GһO\tļZ"*9b_(OaCaԐZ-pAIFW*GōfH^xWq"ʍ`^?vR5cs`ڊmRh-X냾Hs"82}us#O1:T9J:<>V$w_uzcȧ^_(^<S*\nV>QaR l4b)$UsiBq.쥉NJ$kPH]\\cu`kqUPaL$縧>F|,U$;KORض=mT@ (ҝ8O{*P~U LfʺsͱyJxao:1"=a{u}h$˩Ei\nk83^l#dz]ûM3Y0UYn83FZ1V|5z:R9\t>88|I8&tXtQX\\8cuc)xEClpa_pJBen!%$[LN\n0!Xݘ[w/Ÿ-ؙ0ǜ^8Zۉ7zWF\t{i[L0LsΉ?3Ƴ4DH%Ē5S>W#w1LxcD\njUro~h\t|naƦqkgL.\\gǾi۫¢uk[I-n<Ct|CH!/xwaTFXA,.f)@soaS.sQbSFjֹLbp7V$ڍ}Ý*Aa{\0o0Xt2\\yX&V^t#;{?B><(TO\0ZܰeKKdl,sJ}E ;Fi\0g8\\ʽ"JϷ(Bg+e$p{\naש=Csע=G0BE\taF=$rmO\\1i\n$!*vSx[`++KX&PYsMsx\n<|[_S(/x|7Na*">*YuΨa'}˙RKKy 73{u$\nrQqT*k\nT++t@W(~1~g]6ޡia\0E׳-zP~*j|p]{]\nY3}32W\n.)*1[䐄⣽PYRb#ld>\04G,7FLt\0avDW.;|`z@23zjQCڕx<)Sq&,4\nQ$ٿ*,ت0y~Ц@,<xyL.y|f:z\0+Ju^e*(,#Tt E,@CU,//vqNyQ#ijc#`ݚSIk u&qJNYgRm^6ztZ| Q5)\\a4p[$̵\\IE%Go7A ƘOe\05*=a ?Cƹy܆\\/o5ed{1~)ӵ8}mbrK>=^B\0WZ\t:arT\t[Ujk+Ovī!#qᩏ`lfaYO~%=ӓetɆ7+Xx sy) UZބ3rkRwE\\슱j7f.|^\tdB6\tGy!ņ=[s"빒ov8^.3Vg9{=4|\n72s^^~*3sg:F7Ӥ=EqyJ\nÈ&\n\0F%e\t>oa+ iXt[N_Fjv2RqW&[#?Kvȫ<j /HͅwJ>\tFjb5pozвG}аY'w)m yzS0J+g\0]JXm@?SCb!rnJ\tY\\0pnӚ"R" Rc0sIDK74"h)WTi,'n_E=#W2QUϭ}Η?~5TNLNG,[Cr;tK_L&}ͱ~1-\0r+͕<L)U*N{6klRHH!>lfULg*O%S+m6q1ЏD(aOqGBvk2f==z$gMBx"3ښ:y{kݮV{ wU-'ǑFE/7?kr-қnVA"Nb5w'bL20FXryZnLHSU8[WU}2UptߓعeLxNu-ULYb7m\tX.HWeX/r,p9u3RslWðYR],F͑mlqۨq:%)HHQE+|zx3d\\C1puZrlO}#-xf((VP$+S9t|R',mfKMEGY9vR8=CSMA!6 \nc`wGՐb-=nZKy3)Y9}OTrm0pÄ8K] Bn6k=Jj@z~^/Kޱ'Lޏ=wf۽^/n*52 <u[]A.WRe?M\0^"b]=i(8YNg9|̜8y檮r(?!M{џU:بG%>ӹ,C<眉\t^ÊDŽJZ!/զ0<a4}Pzw45xChX#OL xdVY:8^c@EauI\\\tDwxmL;X`M?q?)уب"*k]NȘkC@o@HoΜਘFFQl/'HgbU{_xi>A!x-CR.4r<S˭vi, iFog07!'܌lͷc\0mz\t֣XUne#mBkMn+?_*Xf~Q#dyvAb+'Xi֕H݊,Z܅}.9)7UC(螗VLNn]%dx.3sA{Q tKB;9-o~" A|)cj"8y1Ks9W}jˣW}ODksޒq\\'}槅,ހHk<]@=.g^S^JF7۞gN\ne$c|+vhJTz>`\n@~ a_&M,,Y2Cǜ\t\0m\0dONLi8p\n- Q]Uw۲9sh+ԕ(KpH2F]~:\\\\!2yS72sl|8M42/>Z>w;wo\n-V9],!WH=ٕt\0Ҫ͝'P_`:;J㖾Zi/q&5k5r⛭pY{IǍ8^ɇ^Q|?V"{ g d boc{ڌW@`k2~%p #ve*p\nK5Dcys~E'' VY|TQOWJ\0xLnV2Tb:<9gCl`Am@3==UqG"b&-;JhָmP)_}@ {Aip+Wey^{jGbm2C&65+=W\00f3tgCHء^JtexC q}gz'V>LP%ȴVhA{`4ɛpܺpvT]F͌\nzxxfw:y_u&ajVk ]R+4->\tB+uն ^F̎wT ts\nEV9£uEg ӇN?\t/ͯQJdюz)ƭ3Q6rV;dV>сTC1 r~H|\\I<q/F[z\\gBg\n%ǐ[Hn>}bYZcVzXʓh~P\\a*;$[_*h|CFE~k_=_lΈJ/Q>"ٷƵ7¡|7y?A+onoNI<vraL@6+@]։p0}:463 ϬOGьySwY ̋٣kM}bj[Le;]\0J^(U˩q1đj\tTu1ȏWm SwΝQҐ>ŠAa,ViN|U(VK-k(TKylG(1tjƘpN4lZ}a7>¶AA̡PkYqKwngu'333^\nLѢ_C<&ܙkLdiϚYEgXQ\nLA[+O$4K~'86$yܽUTk.'iuWzN;kw~;wWvkއOt7zW5uWQPW\0=n@6.@V\\>1۬mySW7\t}YʎT7Z2),5z$Xfx6$'凝L'Tn*o4:.B.>[f֫0rBy~5a[xz24Z\te_ǒ:-8Ts1E't=G.)q#߯McԲbkk,j^x"pOKMI9wh\tѿX\nWD\tةL4xl(""vۡ,y>up `S+%6%"8%^;NfI2 %%m.lmV'œ_IN4=NuҹCH^[R@f14Iܰ Azu>/Wf)7;96BFuNMNJ戓f%66;f2_ҿYM$Ȳ\0af2nKu\nvVI7)rHwY"5mAKAPjcW[|!+#{b!f*e?Z+rq(p*rv̳Ø_9cx:BVRLcz1i!rjF[&m|a40"Nnd%eQb#X5"fJ\\3ZL~3$V#ֶyu\\4ԸUH لjGBD%ŋn{@'J`Ffv`u*9G?t̂ȕn0GL^|tO\t1f!NnzL\t[2bIE\0/s7OjrK@/gO\n`{L9!/1lKyyAmhw_*B.:=9L8="O7ЭZAOf-ekMb~ih4B[.6#+\nb:Wc%%e<;u'a}{\0 EA4]S^O7Wa'skzǑYqzړֱPLyrz91]s F1eA)L-2Z%գ:GSm;\\'u,0_`+\0g>UWr/2|TYh)QF\tFLj8RZx#A7^}n%if&U|[Be 8T<FNlsR ᑋBDlHq/e*S9no>MAwryI稐 rk<[>Վ#l)jp+R);E_EҌZ+ڭ7@{J`8"Pm+NM!vYhI1ʗ-A8\nUrr6C|,2@j/dڷ(U巋hGW{ԓicyұoRgbfL#W"dI+rRV{f盱 "Rr+,x\ts[26[v:%8$$ԲwnC+;̏zYZClJ>ޟuבDjHO<r_^xq[<}F[w\tL$M PS̽W~TD mfNnH}/k]YUNED\tyTm.\\ޯ],Ol6YcwDV00ȄD>^}KoQѨ._'r\\`\0KvԍUs?jTq!`{0>lKW>;"<ZIla74I,%pJ?|e\tc鸍,ܭNH@y`xեk0"pbJUgZяG6L?gS!\nN\\ANu!]z r:cdHBvTU[,[(Ȣ1>:wO\\E<=v|,2u$f?S{e5E%<Ώ\n-RT{8vԾ~Uķ@\0cm3\nkot"6$|BrG_T%R(v=.b~scZbҋ2nkm>{IKvN8ڥۧE* зP7+O3}^ HKOohz/R1 Q^OםSUGS=SATT<Z* | ||
diff --git a/bin/assets/OpenSimAssetSet/rockwallbig.jp2 b/bin/assets/OpenSimAssetSet/rockwallbig.jp2 deleted file mode 100644 index b0f1d42..0000000 --- a/bin/assets/OpenSimAssetSet/rockwallbig.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/roof01.jp2 b/bin/assets/OpenSimAssetSet/roof01.jp2 deleted file mode 100644 index c1bbd62..0000000 --- a/bin/assets/OpenSimAssetSet/roof01.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/rooftiles1.jp2 b/bin/assets/OpenSimAssetSet/rooftiles1.jp2 deleted file mode 100644 index 5a1750b..0000000 --- a/bin/assets/OpenSimAssetSet/rooftiles1.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/rooftiles2_peach.jp2 b/bin/assets/OpenSimAssetSet/rooftiles2_peach.jp2 deleted file mode 100644 index aae5daf..0000000 --- a/bin/assets/OpenSimAssetSet/rooftiles2_peach.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/rooftiles2_roy.jp2 b/bin/assets/OpenSimAssetSet/rooftiles2_roy.jp2 deleted file mode 100644 index ea2c840..0000000 --- a/bin/assets/OpenSimAssetSet/rooftiles2_roy.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/saguaro_8m.jp2 b/bin/assets/OpenSimAssetSet/saguaro_8m.jp2 deleted file mode 100644 index 9c577b4..0000000 --- a/bin/assets/OpenSimAssetSet/saguaro_8m.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/seawater.jp2 b/bin/assets/OpenSimAssetSet/seawater.jp2 deleted file mode 100644 index 850371c..0000000 --- a/bin/assets/OpenSimAssetSet/seawater.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/shingle.jp2 b/bin/assets/OpenSimAssetSet/shingle.jp2 deleted file mode 100644 index abbb496..0000000 --- a/bin/assets/OpenSimAssetSet/shingle.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/snow1.jp2 b/bin/assets/OpenSimAssetSet/snow1.jp2 deleted file mode 100644 index a83b349..0000000 --- a/bin/assets/OpenSimAssetSet/snow1.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/steel.jp2 b/bin/assets/OpenSimAssetSet/steel.jp2 deleted file mode 100644 index 4da19a0..0000000 --- a/bin/assets/OpenSimAssetSet/steel.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/stone1wall.jp2 b/bin/assets/OpenSimAssetSet/stone1wall.jp2 deleted file mode 100644 index d4db404..0000000 --- a/bin/assets/OpenSimAssetSet/stone1wall.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/stonetile.jp2 b/bin/assets/OpenSimAssetSet/stonetile.jp2 deleted file mode 100644 index 36d8c71..0000000 --- a/bin/assets/OpenSimAssetSet/stonetile.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/street2.jp2 b/bin/assets/OpenSimAssetSet/street2.jp2 deleted file mode 100644 index fd8ffdf..0000000 --- a/bin/assets/OpenSimAssetSet/street2.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/testpic2.jp2 b/bin/assets/OpenSimAssetSet/testpic2.jp2 deleted file mode 100644 index e6840e2..0000000 --- a/bin/assets/OpenSimAssetSet/testpic2.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/thatch.jp2 b/bin/assets/OpenSimAssetSet/thatch.jp2 deleted file mode 100644 index c6b7e40..0000000 --- a/bin/assets/OpenSimAssetSet/thatch.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/water1.jp2 b/bin/assets/OpenSimAssetSet/water1.jp2 deleted file mode 100644 index e714d4c..0000000 --- a/bin/assets/OpenSimAssetSet/water1.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/water3.jp2 b/bin/assets/OpenSimAssetSet/water3.jp2 deleted file mode 100644 index be2984b..0000000 --- a/bin/assets/OpenSimAssetSet/water3.jp2 +++ /dev/null | |||
Binary files differ | |||
diff --git a/bin/assets/OpenSimAssetSet/welcomeNote.dat b/bin/assets/OpenSimAssetSet/welcomeNote.dat deleted file mode 100644 index c232ce1..0000000 --- a/bin/assets/OpenSimAssetSet/welcomeNote.dat +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | Linden text version 2 | ||
2 | { | ||
3 | LLEmbeddedItems version 1 | ||
4 | { | ||
5 | count 0 | ||
6 | } | ||
7 | Text length 95 | ||
8 | Hello and thank you for using OpenSim. For more infomation visit http://opensimulator.org/wiki/Main_Page} | ||
9 | |||
diff --git a/bin/assets/OpenSimAssetSet/wood1.jp2 b/bin/assets/OpenSimAssetSet/wood1.jp2 deleted file mode 100644 index 3758326..0000000 --- a/bin/assets/OpenSimAssetSet/wood1.jp2 +++ /dev/null | |||
Binary files differ | |||