|
1 /* |
|
2 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. |
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
4 * |
|
5 * This code is free software; you can redistribute it and/or modify it |
|
6 * under the terms of the GNU General Public License version 2 only, as |
|
7 * published by the Free Software Foundation. |
|
8 * |
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
|
13 * accompanied this code). |
|
14 * |
|
15 * You should have received a copy of the GNU General Public License version |
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
18 * |
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
20 * or visit www.oracle.com if you need additional information or have any |
|
21 * questions. |
|
22 */ |
|
23 import com.sun.net.httpserver.HttpServer; |
|
24 import com.sun.net.httpserver.HttpsConfigurator; |
|
25 import com.sun.net.httpserver.HttpsServer; |
|
26 |
|
27 import javax.net.ssl.KeyManagerFactory; |
|
28 import javax.net.ssl.SSLContext; |
|
29 import javax.net.ssl.TrustManagerFactory; |
|
30 import java.io.ByteArrayInputStream; |
|
31 import java.io.FileInputStream; |
|
32 import java.io.IOException; |
|
33 import java.io.InputStream; |
|
34 import java.io.OutputStream; |
|
35 import java.io.UncheckedIOException; |
|
36 import java.net.InetAddress; |
|
37 import java.net.InetSocketAddress; |
|
38 import java.net.Proxy; |
|
39 import java.net.ProxySelector; |
|
40 import java.net.SocketAddress; |
|
41 import java.net.URI; |
|
42 import java.net.http.HttpClient; |
|
43 import java.net.http.HttpRequest; |
|
44 import java.net.http.HttpResponse; |
|
45 import java.security.KeyManagementException; |
|
46 import java.security.KeyStore; |
|
47 import java.security.KeyStoreException; |
|
48 import java.security.NoSuchAlgorithmException; |
|
49 import java.security.UnrecoverableKeyException; |
|
50 import java.security.cert.CertificateException; |
|
51 import java.time.Duration; |
|
52 import java.util.Base64; |
|
53 import java.util.List; |
|
54 import java.util.Set; |
|
55 import java.util.concurrent.CompletableFuture; |
|
56 import java.util.concurrent.CopyOnWriteArrayList; |
|
57 import java.util.concurrent.CopyOnWriteArraySet; |
|
58 import java.util.concurrent.ExecutorService; |
|
59 import java.util.concurrent.LinkedBlockingQueue; |
|
60 import java.util.concurrent.ThreadPoolExecutor; |
|
61 import java.util.concurrent.TimeUnit; |
|
62 import java.util.concurrent.atomic.AtomicLong; |
|
63 |
|
64 /** |
|
65 * @test |
|
66 * @bug 8231449 |
|
67 * @summary This test verifies that the HttpClient works correctly when the server |
|
68 * sends a large certificate. This test will not pass without |
|
69 * the fix for JDK-8231449. To regenerate the certificate, modify the |
|
70 * COMMAND constant as you need, possibly changing the start date |
|
71 * and validity of the certificate in the command, then run the test. |
|
72 * The test will run with the old certificate, but will print the new command. |
|
73 * Copy paste the new command printed by this test into a terminal. |
|
74 * Then modify the at run line to pass the file generated by that command |
|
75 * as first argument, and copy paste the new values of the COMMAND and |
|
76 * BASE64_CERT constant printed by the test into the test. |
|
77 * Then restore the original at run line and test again. |
|
78 * @library /test/lib http2/server |
|
79 * @build jdk.test.lib.net.SimpleSSLContext HttpServerAdapters DigestEchoServer LargeHandshakeTest |
|
80 * @modules java.net.http/jdk.internal.net.http.common |
|
81 * java.net.http/jdk.internal.net.http.frame |
|
82 * java.net.http/jdk.internal.net.http.hpack |
|
83 * java.logging |
|
84 * java.base/sun.net.www.http |
|
85 * java.base/sun.net.www |
|
86 * java.base/sun.net |
|
87 * @run main/othervm -Dtest.requiresHost=true |
|
88 * -Djdk.httpclient.HttpClient.log=headers |
|
89 * -Djdk.internal.httpclient.debug=true |
|
90 * LargeHandshakeTest |
|
91 * |
|
92 */ |
|
93 public class LargeHandshakeTest implements HttpServerAdapters { |
|
94 |
|
95 // Use this command to regenerate the keystore file whose content is |
|
96 // base 64 encoded into this file (close your eyes): |
|
97 private static final String COMMAND = |
|
98 "keytool -genkeypair -keyalg RSA -startdate 2019/09/30 -valid" + |
|
99 "ity 13000 -keysize 1024 -dname \"C=Duke, ST=CA-State, L=CA-Ci" + |
|
100 "ty, O=CA-Org\" -deststoretype PKCS12 -alias server -keystore " + |
|
101 "temp0.jks -storepass passphrase -ext san:critical=dns:localh" + |
|
102 "ost,ip:127.0.0.1,ip:0:0:0:0:0:0:0:1,uri:http://www.example.c" + |
|
103 "om/1.2.3.6.1.4.1.11129.666.666.666.999/041287234567896776987" + |
|
104 "654327821000412872345678967769876543278210004128723456789677" + |
|
105 "698765432782100041287234567896776987654327821000412872345678" + |
|
106 "967769876543278210004128723456789677698765432782100041287234" + |
|
107 "567896776987654327821000412872345678967769876543278210004128" + |
|
108 "723456789677698765432782100041287234567896776987654327821000" + |
|
109 "412872345678967769876543278210004128723456789677698765432782" + |
|
110 "100041287234567896776987654327821000412872345678967769876543" + |
|
111 "278210004128723456789677698765432782100041287234567896776987" + |
|
112 "654327821000412872345678967769876543278210004128723456789677" + |
|
113 "698765432782100041287234567896776987654327821000412872345678" + |
|
114 "967769876543278210004128723456789677698765432782100041287234" + |
|
115 "567896776987654327821000412872345678967769876543278210004128" + |
|
116 "723456789677698765432782100041287234567896776987654327821000" + |
|
117 "412872345678967769876543278210004128723456789677698765432782" + |
|
118 "100041287234567896776987654327821000412872345678967769876543" + |
|
119 "278210004128723456789677698765432782100041287234567896776987" + |
|
120 "654327821000412872345678967769876543278210004128723456789677" + |
|
121 "698765432782100041287234567896776987654327821000412872345678" + |
|
122 "967769876543278210004128723456789677698765432782100041287234" + |
|
123 "567896776987654327821000412872345678967769876543278210004128" + |
|
124 "723456789677698765432782100041287234567896776987654327821000" + |
|
125 "412872345678967769876543278210004128723456789677698765432782" + |
|
126 "100041287234567896776987654327821000412872345678967769876543" + |
|
127 "278210004128723456789677698765432782100041287234567896776987" + |
|
128 "654327821000412872345678967769876543278210004128723456789677" + |
|
129 "698765432782100,uri:http://www.example.com/1.2.3.6.1.4.1.111" + |
|
130 "29.666.666.666.999.2/041287234567896776987654327821000412872" + |
|
131 "345678967769876543278210004128723456789677698765432782100041" + |
|
132 "287234567896776987654327821000412872345678967769876543278210" + |
|
133 "004128723456789677698765432782100041287234567896776987654327" + |
|
134 "821000412872345678967769876543278210004128723456789677698765" + |
|
135 "432782100041287234567896776987654327821000412872345678967769" + |
|
136 "876543278210004128723456789677698765432782100041287234567896" + |
|
137 "776987654327821000412872345678967769876543278210004128723456" + |
|
138 "789677698765432782100041287234567896776987654327821000412872" + |
|
139 "345678967769876543278210004128723456789677698765432782100041" + |
|
140 "287234567896776987654327821000412872345678967769876543278210" + |
|
141 "004128723456789677698765432782100041287234567896776987654327" + |
|
142 "821000412872345678967769876543278210004128723456789677698765" + |
|
143 "432782100041287234567896776987654327821000412872345678967769" + |
|
144 "876543278210004128723456789677698765432782100041287234567896" + |
|
145 "776987654327821000412872345678967769876543278210004128723456" + |
|
146 "789677698765432782100041287234567896776987654327821000412872" + |
|
147 "345678967769876543278210004128723456789677698765432782100041" + |
|
148 "287234567896776987654327821000412872345678967769876543278210" + |
|
149 "004128723456789677698765432782100041287234567896776987654327" + |
|
150 "821000412872345678967769876543278210004128723456789677698765" + |
|
151 "432782100041287234567896776987654327821000412872345678967769" + |
|
152 "876543278210004128723456789677698765432782100041287234567896" + |
|
153 "776987654327821000412872345678967769876543278210004128723456" + |
|
154 "789677698765432782100041287234567896776987654327821000412872" + |
|
155 "345678967769876543278210004128723456789677698765432782100,ur" + |
|
156 "i:http://www.example.com/1.2.3.6.1.4.1.11129.666.666.666.999" + |
|
157 ".2/041287234567896776987654327821000412872345678967769876543" + |
|
158 "278210004128723456789677698765432782100041287234567896776987" + |
|
159 "654327821000412872345678967769876543278210004128723456789677" + |
|
160 "698765432782100041287234567896776987654327821000412872345678" + |
|
161 "967769876543278210004128723456789677698765432782100041287234" + |
|
162 "567896776987654327821000412872345678967769876543278210004128" + |
|
163 "723456789677698765432782100041287234567896776987654327821000" + |
|
164 "412872345678967769876543278210004128723456789677698765432782" + |
|
165 "100041287234567896776987654327821000412872345678967769876543" + |
|
166 "278210004128723456789677698765432782100041287234567896776987" + |
|
167 "654327821000412872345678967769876543278210004128723456789677" + |
|
168 "698765432782100041287234567896776987654327821000412872345678" + |
|
169 "967769876543278210004128723456789677698765432782100041287234" + |
|
170 "567896776987654327821000412872345678967769876543278210004128" + |
|
171 "723456789677698765432782100041287234567896776987654327821000" + |
|
172 "412872345678967769876543278210004128723456789677698765432782" + |
|
173 "100041287234567896776987654327821000412872345678967769876543" + |
|
174 "278210004128723456789677698765432782100041287234567896776987" + |
|
175 "654327821000412872345678967769876543278210004128723456789677" + |
|
176 "698765432782100041287234567896776987654327821000412872345678" + |
|
177 "967769876543278210004128723456789677698765432782100041287234" + |
|
178 "567896776987654327821000412872345678967769876543278210004128" + |
|
179 "723456789677698765432782100041287234567896776987654327821000" + |
|
180 "412872345678967769876543278210004128723456789677698765432782" + |
|
181 "100041287234567896776987654327821000412872345678967769876543" + |
|
182 "27821000412872345678967769876543278210001,uri:http://www.exa" + |
|
183 "mple.com/1.2.3.6.1.4.1.11129.666.666.666.999.2/0412872345678" + |
|
184 "967769876543278210004128723456789677698765432782100041287234" + |
|
185 "567896776987654327821000412872345678967769876543278210004128" + |
|
186 "723456789677698765432782100041287234567896776987654327821000" + |
|
187 "412872345678967769876543278210004128723456789677698765432782" + |
|
188 "100041287234567896776987654327821000412872345678967769876543" + |
|
189 "278210004128723456789677698765432782100041287234567896776987" + |
|
190 "654327821000412872345678967769876543278210004128723456789677" + |
|
191 "698765432782100041287234567896776987654327821000412872345678" + |
|
192 "967769876543278210004128723456789677698765432782100041287234" + |
|
193 "567896776987654327821000412872345678967769876543278210004128" + |
|
194 "723456789677698765432782100041287234567896776987654327821000" + |
|
195 "412872345678967769876543278210004128723456789677698765432782" + |
|
196 "100041287234567896776987654327821000412872345678967769876543" + |
|
197 "278210004128723456789677698765432782100041287234567896776987" + |
|
198 "654327821000412872345678967769876543278210004128723456789677" + |
|
199 "698765432782100041287234567896776987654327821000412872345678" + |
|
200 "967769876543278210004128723456789677698765432782100041287234" + |
|
201 "567896776987654327821000412872345678967769876543278210004128" + |
|
202 "723456789677698765432782100041287234567896776987654327821000" + |
|
203 "412872345678967769876543278210004128723456789677698765432782" + |
|
204 "100041287234567896776987654327821000412872345678967769876543" + |
|
205 "278210004128723456789677698765432782100041287234567896776987" + |
|
206 "654327821000412872345678967769876543278210004128723456789677" + |
|
207 "698765432782100041287234567896776987654327821000412872345678" + |
|
208 "967769876543278210004128723456789677698765432782100041287234" + |
|
209 "5678967769876543278210002,uri:http://www.example.com/1.2.3.6" + |
|
210 ".1.4.1.11129.666.666.666.999.2/04128723456789677698765432782" + |
|
211 "100041287234567896776987654327821000412872345678967769876543" + |
|
212 "278210004128723456789677698765432782100041287234567896776987" + |
|
213 "654327821000412872345678967769876543278210004128723456789677" + |
|
214 "698765432782100041287234567896776987654327821000412872345678" + |
|
215 "967769876543278210004128723456789677698765432782100041287234" + |
|
216 "567896776987654327821000412872345678967769876543278210004128" + |
|
217 "723456789677698765432782100041287234567896776987654327821000" + |
|
218 "412872345678967769876543278210004128723456789677698765432782" + |
|
219 "100041287234567896776987654327821000412872345678967769876543" + |
|
220 "278210004128723456789677698765432782100041287234567896776987" + |
|
221 "654327821000412872345678967769876543278210004128723456789677" + |
|
222 "698765432782100041287234567896776987654327821000412872345678" + |
|
223 "967769876543278210004128723456789677698765432782100041287234" + |
|
224 "567896776987654327821000412872345678967769876543278210004128" + |
|
225 "723456789677698765432782100041287234567896776987654327821000" + |
|
226 "412872345678967769876543278210004128723456789677698765432782" + |
|
227 "100041287234567896776987654327821000412872345678967769876543" + |
|
228 "278210004128723456789677698765432782100041287234567896776987" + |
|
229 "654327821000412872345678967769876543278210004128723456789677" + |
|
230 "698765432782100041287234567896776987654327821000412872345678" + |
|
231 "967769876543278210004128723456789677698765432782100041287234" + |
|
232 "567896776987654327821000412872345678967769876543278210004128" + |
|
233 "723456789677698765432782100041287234567896776987654327821000" + |
|
234 "412872345678967769876543278210004128723456789677698765432782" + |
|
235 "100041287234567896776987654327821000412872345678967769876543" + |
|
236 "278210003,uri:http://www.example.com/1.2.3.6.1.4.1.11129.666" + |
|
237 ".666.666.999.2/041287234567896776987654327821000412872345678" + |
|
238 "967769876543278210004128723456789677698765432782100041287234" + |
|
239 "567896776987654327821000412872345678967769876543278210004128" + |
|
240 "723456789677698765432782100041287234567896776987654327821000" + |
|
241 "412872345678967769876543278210004128723456789677698765432782" + |
|
242 "100041287234567896776987654327821000412872345678967769876543" + |
|
243 "278210004128723456789677698765432782100041287234567896776987" + |
|
244 "654327821000412872345678967769876543278210004128723456789677" + |
|
245 "698765432782100041287234567896776987654327821000412872345678" + |
|
246 "967769876543278210004128723456789677698765432782100041287234" + |
|
247 "567896776987654327821000412872345678967769876543278210004128" + |
|
248 "723456789677698765432782100041287234567896776987654327821000" + |
|
249 "412872345678967769876543278210004128723456789677698765432782" + |
|
250 "100041287234567896776987654327821000412872345678967769876543" + |
|
251 "278210004128723456789677698765432782100041287234567896776987" + |
|
252 "654327821000412872345678967769876543278210004128723456789677" + |
|
253 "698765432782100041287234567896776987654327821000412872345678" + |
|
254 "967769876543278210004128723456789677698765432782100041287234" + |
|
255 "567896776987654327821000412872345678967769876543278210004128" + |
|
256 "723456789677698765432782100041287234567896776987654327821000" + |
|
257 "412872345678967769876543278210004128723456789677698765432782" + |
|
258 "100041287234567896776987654327821000412872345678967769876543" + |
|
259 "278210004128723456789677698765432782100041287234567896776987" + |
|
260 "654327821000412872345678967769876543278210004128723456789677" + |
|
261 "698765432782100041287234567896776987654327821000412872345678" + |
|
262 "96776987654327821000412872345678967769876543278210004,uri:ht" + |
|
263 "tp://www.example.com/1.2.3.6.1.4.1.11129.666.666.666.999.2/0" + |
|
264 "412872345678967769876543278210004128723456789677698765432782" + |
|
265 "100041287234567896776987654327821000412872345678967769876543" + |
|
266 "278210004128723456789677698765432782100041287234567896776987" + |
|
267 "654327821000412872345678967769876543278210004128723456789677" + |
|
268 "698765432782100041287234567896776987654327821000412872345678" + |
|
269 "967769876543278210004128723456789677698765432782100041287234" + |
|
270 "567896776987654327821000412872345678967769876543278210004128" + |
|
271 "723456789677698765432782100041287234567896776987654327821000" + |
|
272 "412872345678967769876543278210004128723456789677698765432782" + |
|
273 "100041287234567896776987654327821000412872345678967769876543" + |
|
274 "278210004128723456789677698765432782100041287234567896776987" + |
|
275 "654327821000412872345678967769876543278210004128723456789677" + |
|
276 "698765432782100041287234567896776987654327821000412872345678" + |
|
277 "967769876543278210004128723456789677698765432782100041287234" + |
|
278 "567896776987654327821000412872345678967769876543278210004128" + |
|
279 "723456789677698765432782100041287234567896776987654327821000" + |
|
280 "412872345678967769876543278210004128723456789677698765432782" + |
|
281 "100041287234567896776987654327821000412872345678967769876543" + |
|
282 "278210004128723456789677698765432782100041287234567896776987" + |
|
283 "654327821000412872345678967769876543278210004128723456789677" + |
|
284 "698765432782100041287234567896776987654327821000412872345678" + |
|
285 "967769876543278210004128723456789677698765432782100041287234" + |
|
286 "567896776987654327821000412872345678967769876543278210004128" + |
|
287 "723456789677698765432782100041287234567896776987654327821000" + |
|
288 "412872345678967769876543278210004128723456789677698765432782" + |
|
289 "1000412872345678967769876543278210005,uri:http://www.example" + |
|
290 ".com/1.2.3.6.1.4.1.11129.666.666.666.999.2/04128723456789677" + |
|
291 "698765432782100041287234567896776987654327821000412872345678" + |
|
292 "967769876543278210004128723456789677698765432782100041287234" + |
|
293 "567896776987654327821000412872345678967769876543278210004128" + |
|
294 "723456789677698765432782100041287234567896776987654327821000" + |
|
295 "412872345678967769876543278210004128723456789677698765432782" + |
|
296 "100041287234567896776987654327821000412872345678967769876543" + |
|
297 "278210004128723456789677698765432782100041287234567896776987" + |
|
298 "654327821000412872345678967769876543278210004128723456789677" + |
|
299 "698765432782100041287234567896776987654327821000412872345678" + |
|
300 "967769876543278210004128723456789677698765432782100041287234" + |
|
301 "567896776987654327821000412872345678967769876543278210004128" + |
|
302 "723456789677698765432782100041287234567896776987654327821000" + |
|
303 "412872345678967769876543278210004128723456789677698765432782" + |
|
304 "100041287234567896776987654327821000412872345678967769876543" + |
|
305 "278210004128723456789677698765432782100041287234567896776987" + |
|
306 "654327821000412872345678967769876543278210004128723456789677" + |
|
307 "698765432782100041287234567896776987654327821000412872345678" + |
|
308 "967769876543278210004128723456789677698765432782100041287234" + |
|
309 "567896776987654327821000412872345678967769876543278210004128" + |
|
310 "723456789677698765432782100041287234567896776987654327821000" + |
|
311 "412872345678967769876543278210004128723456789677698765432782" + |
|
312 "100041287234567896776987654327821000412872345678967769876543" + |
|
313 "278210004128723456789677698765432782100041287234567896776987" + |
|
314 "654327821000412872345678967769876543278210004128723456789677" + |
|
315 "698765432782100041287234567896776987654327821000412872345678" + |
|
316 "967769876543278210006,uri:http://www.example.com/1.2.3.6.1.4" + |
|
317 ".1.11129.666.666.666.999.2/041287234567896776987654327821000" + |
|
318 "412872345678967769876543278210004128723456789677698765432782" + |
|
319 "100041287234567896776987654327821000412872345678967769876543" + |
|
320 "278210004128723456789677698765432782100041287234567896776987" + |
|
321 "654327821000412872345678967769876543278210004128723456789677" + |
|
322 "698765432782100041287234567896776987654327821000412872345678" + |
|
323 "967769876543278210004128723456789677698765432782100041287234" + |
|
324 "567896776987654327821000412872345678967769876543278210004128" + |
|
325 "723456789677698765432782100041287234567896776987654327821000" + |
|
326 "412872345678967769876543278210004128723456789677698765432782" + |
|
327 "100041287234567896776987654327821000412872345678967769876543" + |
|
328 "278210004128723456789677698765432782100041287234567896776987" + |
|
329 "654327821000412872345678967769876543278210004128723456789677" + |
|
330 "698765432782100041287234567896776987654327821000412872345678" + |
|
331 "967769876543278210004128723456789677698765432782100041287234" + |
|
332 "567896776987654327821000412872345678967769876543278210004128" + |
|
333 "723456789677698765432782100041287234567896776987654327821000" + |
|
334 "412872345678967769876543278210004128723456789677698765432782" + |
|
335 "100041287234567896776987654327821000412872345678967769876543" + |
|
336 "278210004128723456789677698765432782100041287234567896776987" + |
|
337 "654327821000412872345678967769876543278210004128723456789677" + |
|
338 "698765432782100041287234567896776987654327821000412872345678" + |
|
339 "967769876543278210004128723456789677698765432782100041287234" + |
|
340 "567896776987654327821000412872345678967769876543278210004128" + |
|
341 "723456789677698765432782100041287234567896776987654327821000" + |
|
342 "412872345678967769876543278210004128723456789677698765432782" + |
|
343 "10007,uri:http://www.example.com/1.2.3.6.1.4.1.11129.666.666" + |
|
344 ".666.999.2/0412872345678967769876543278210004128723456789677" + |
|
345 "698765432782100041287234567896776987654327821000412872345678" + |
|
346 "967769876543278210004128723456789677698765432782100041287234" + |
|
347 "567896776987654327821000412872345678967769876543278210004128" + |
|
348 "723456789677698765432782100041287234567896776987654327821000" + |
|
349 "412872345678967769876543278210004128723456789677698765432782" + |
|
350 "100041287234567896776987654327821000412872345678967769876543" + |
|
351 "278210004128723456789677698765432782100041287234567896776987" + |
|
352 "654327821000412872345678967769876543278210004128723456789677" + |
|
353 "698765432782100041287234567896776987654327821000412872345678" + |
|
354 "967769876543278210004128723456789677698765432782100041287234" + |
|
355 "567896776987654327821000412872345678967769876543278210004128" + |
|
356 "723456789677698765432782100041287234567896776987654327821000" + |
|
357 "412872345678967769876543278210004128723456789677698765432782" + |
|
358 "100041287234567896776987654327821000412872345678967769876543" + |
|
359 "278210004128723456789677698765432782100041287234567896776987" + |
|
360 "654327821000412872345678967769876543278210004128723456789677" + |
|
361 "698765432782100041287234567896776987654327821000412872345678" + |
|
362 "967769876543278210004128723456789677698765432782100041287234" + |
|
363 "567896776987654327821000412872345678967769876543278210004128" + |
|
364 "723456789677698765432782100041287234567896776987654327821000" + |
|
365 "412872345678967769876543278210004128723456789677698765432782" + |
|
366 "100041287234567896776987654327821000412872345678967769876543" + |
|
367 "278210004128723456789677698765432782100041287234567896776987" + |
|
368 "654327821000412872345678967769876543278210004128723456789677" + |
|
369 "6987654327821000412872345678967769876543278210008,uri:http:/" + |
|
370 "/www.example.com/1.2.3.6.1.4.1.11129.666.666.666.999.2/04128" + |
|
371 "723456789677698765432782100041287234567896776987654327821000" + |
|
372 "412872345678967769876543278210004128723456789677698765432782" + |
|
373 "100041287234567896776987654327821000412872345678967769876543" + |
|
374 "278210004128723456789677698765432782100041287234567896776987" + |
|
375 "654327821000412872345678967769876543278210004128723456789677" + |
|
376 "698765432782100041287234567896776987654327821000412872345678" + |
|
377 "967769876543278210004128723456789677698765432782100041287234" + |
|
378 "567896776987654327821000412872345678967769876543278210004128" + |
|
379 "723456789677698765432782100041287234567896776987654327821000" + |
|
380 "412872345678967769876543278210004128723456789677698765432782" + |
|
381 "100041287234567896776987654327821000412872345678967769876543" + |
|
382 "278210004128723456789677698765432782100041287234567896776987" + |
|
383 "654327821000412872345678967769876543278210004128723456789677" + |
|
384 "698765432782100041287234567896776987654327821000412872345678" + |
|
385 "967769876543278210004128723456789677698765432782100041287234" + |
|
386 "567896776987654327821000412872345678967769876543278210004128" + |
|
387 "723456789677698765432782100041287234567896776987654327821000" + |
|
388 "412872345678967769876543278210004128723456789677698765432782" + |
|
389 "100041287234567896776987654327821000412872345678967769876543" + |
|
390 "278210004128723456789677698765432782100041287234567896776987" + |
|
391 "654327821000412872345678967769876543278210004128723456789677" + |
|
392 "698765432782100041287234567896776987654327821000412872345678" + |
|
393 "967769876543278210004128723456789677698765432782100041287234" + |
|
394 "567896776987654327821000412872345678967769876543278210004128" + |
|
395 "723456789677698765432782100041287234567896776987654327821000" + |
|
396 "412872345678967769876543278210009,uri:http://www.example.com" + |
|
397 "/1.2.3.6.1.4.1.11129.666.666.666.999.2/041287234567896776987" + |
|
398 "654327821000412872345678967769876543278210004128723456789677" + |
|
399 "698765432782100041287234567896776987654327821000412872345678" + |
|
400 "967769876543278210004128723456789677698765432782100041287234" + |
|
401 "567896776987654327821000412872345678967769876543278210004128" + |
|
402 "723456789677698765432782100041287234567896776987654327821000" + |
|
403 "412872345678967769876543278210004128723456789677698765432782" + |
|
404 "100041287234567896776987654327821000412872345678967769876543" + |
|
405 "278210004128723456789677698765432782100041287234567896776987" + |
|
406 "654327821000412872345678967769876543278210004128723456789677" + |
|
407 "698765432782100041287234567896776987654327821000412872345678" + |
|
408 "967769876543278210004128723456789677698765432782100041287234" + |
|
409 "567896776987654327821000412872345678967769876543278210004128" + |
|
410 "723456789677698765432782100041287234567896776987654327821000" + |
|
411 "412872345678967769876543278210004128723456789677698765432782" + |
|
412 "100041287234567896776987654327821000412872345678967769876543" + |
|
413 "278210004128723456789677698765432782100041287234567896776987" + |
|
414 "654327821000412872345678967769876543278210004128723456789677" + |
|
415 "698765432782100041287234567896776987654327821000412872345678" + |
|
416 "967769876543278210004128723456789677698765432782100041287234" + |
|
417 "567896776987654327821000412872345678967769876543278210004128" + |
|
418 "723456789677698765432782100041287234567896776987654327821000" + |
|
419 "412872345678967769876543278210004128723456789677698765432782" + |
|
420 "100041287234567896776987654327821000412872345678967769876543" + |
|
421 "278210004128723456789677698765432782100041287234567896776987" + |
|
422 "654327821000412872345678967769876543278210004128723456789677" + |
|
423 "6987654327821000A"; |
|
424 |
|
425 // This is a Base64 encoded keystore containing our certificate. |
|
426 // The keystore itself was produced with the command above, then its content |
|
427 // base 64 encoded into the string below. The helper function to produce |
|
428 // and format the string below are included in this file. |
|
429 private static final String BASE64_CERT = |
|
430 "MIJR0AIBAzCCUYoGCSqGSIb3DQEHAaCCUXsEglF3MIJRczCCAyAGCSqGSIb3" + |
|
431 "DQEHAaCCAxEEggMNMIIDCTCCAwUGCyqGSIb3DQEMCgECoIICsjCCAq4wKAYK" + |
|
432 "KoZIhvcNAQwBAzAaBBSx1wdTxGqb9z4exOHVZNswvFL+oQICBAAEggKA7JdM" + |
|
433 "91kkP9QkG/igw2p+prxeEOQSmyScKMLtln81eKvT9zpvNjtT+hjABcH2QY8u" + |
|
434 "1Z3Ji48Umoaxi38Fk58/VazFM6wpL47VVNJ2EeTdj8sFoo8ExCH8EHJNNaVK" + |
|
435 "VNTG0YWOMa/HOPttl5wtD6pReGNOrVYVOnI2aY6zTqwI0sZS4uPczfb21vyI" + |
|
436 "NyF4B0Z9WGl77PRoGwrSeoLspISBTq6/JE8UhMWtuz7xnXw04DGp4DeIOO9n" + |
|
437 "E8+VBRKOELPqNaQ+VEgnwPNtPzjohi4Cwaf84c6vokAl1S/V6GzS0Al1mSGH" + |
|
438 "syAaszDYWcXXp2JpSXVAztySWZErwHE49/P42taXdhJvOSfqYb6FHpdrCXST" + |
|
439 "TPo+ULCGxQ83EGfnb/qaqAYZrS//+lzzqw18OY0JcF1i+cGHY8ofJK+bYr7x" + |
|
440 "ZyC8pLut84pEWNTp1V7SQcMif2Gd2SO2Y+ua4isjfMLNeNE/4puCV1vYsyiz" + |
|
441 "C9Gnp0Jywv13ioaC24Qy68uVQ81TvwizN3j7FxPCQOEEjXpfJ+5x2q0pUfqp" + |
|
442 "Roy7ow3Z+d+/fpMIcgyMqWidzLBChRkx4Ugnh7rYBfY1ghchlu8WIIhiR/8p" + |
|
443 "EBX5WQHyEtwrXOFiWxT+QwXWjbs9dQSUoCU1i2zwCFW9R8FkY2yb98QxF74z" + |
|
444 "0TpyW+w6cGPUNUd2T143PL4eGt4rGUBUMewe2ENSgZCDstvtiNPfccW8f9tq" + |
|
445 "G49pHBZt1ZIadM/DbCk1cqDD3u2/e7c57mInFkBBJKjl2K7GK9EYsiey+3Fk" + |
|
446 "NvkxbaF+89OTqEDPP4E97EeHkk/MFe0bQ/a/aXZrTPSN7mNgusWBQyztnYex" + |
|
447 "BRr8sPRhNDFAMBsGCSqGSIb3DQEJFDEOHgwAcwBlAHIAdgBlAHIwIQYJKoZI" + |
|
448 "hvcNAQkVMRQEElRpbWUgMTU2OTk1MzczODEyNzCCTksGCSqGSIb3DQEHBqCC" + |
|
449 "Tjwwgk44AgEAMIJOMQYJKoZIhvcNAQcBMCgGCiqGSIb3DQEMAQYwGgQUBIoZ" + |
|
450 "0r5Kc2cs6fHseA1vKWpQi30CAgQAgIJN+Lch8gN0kyMcpdNDM2iAfBHd/kXZ" + |
|
451 "4ye8lmGvvV0Yy9dd4Q6zmOmkPjWcusyh/vJdya8OG8Fxc/nQmyhB441qtJR5" + |
|
452 "dwIQe/7lft2gDg2sBD0osPvEHesvFVr0+2cy22sdBXS4ihdtVTciPV+4v0EU" + |
|
453 "AK6Lcib57Ml7MI6VhBGpWLkaZXv/25CqXGaiY85dSXPHMugvfJn8JoNxe+tN" + |
|
454 "PDEAy5ar5bnSD9Xl8GyQwHFwQ1P+gEjwg0+hC6OQA6Eg0jBFhIL+dCf6FJwz" + |
|
455 "J2HekpKXcyCTNTx0HB8AW3u4gVjao0B7oNr0GZprpPgYp4dl04Tar6fmb9MN" + |
|
456 "w4MWkcySjX0wCNjpvE0bWlUx55jlN+25SWNEafmbzRNECW1hT6Xl3HLLNQQv" + |
|
457 "8fIgkd2200+Ppwk+cG2dYMrl0MpHPxOo2l+nLNDI+a84v6R2Mqf3qVNfcRxZ" + |
|
458 "Xmw0kJ1JNUKhd0Dy6FKB7tY1Gwc4rfQQgdUXTlnB96rUrSK2o91QZZ9rN3PD" + |
|
459 "SbbQRzSBSPMDen+W5878kwd1BkDH1ao7qOHoGYYiYxczkMVncOtOIdg8VScU" + |
|
460 "t/N1NS9Yrzlj0aAYwX5EYmYzFMiyXr+El/7VnrLHBiaYwJaYVw7a1HgkSXxb" + |
|
461 "er/vgM639AIhT5ab9NFF+ib+7qwbWPzggIBtfm1bXiRPE6Ue0+aQ9g4vYSR7" + |
|
462 "QNusu/2Kwyrd6cwqJnQnG53wiSXh3hs7dvNRYpM16iF1dTeud0FSpQx1tMFi" + |
|
463 "Wp9cGwtUSzvLw1+5Mvz7igLTNAPyTMFNAYFR7JZgRjg1035Y7Xo4aXNMVtGp" + |
|
464 "BCa+/eJzE33CHH2+kuSa13N6qHA2Ek33aR4Vi7P/QOI1aghsR6tL62ctoq4c" + |
|
465 "FmRwvReYGdFK08+B2auPHOEPdGaPefydmPNnFLDguH6d2NYIH8cgzpjz48Gf" + |
|
466 "i5UQfh/UJAxricLjuV2eor7gZCCaC9MfnLlHnDH5MYUQgDsGBTRxh6rpZxVo" + |
|
467 "PFUm1DQCFdDHgmvVz+GAuiVzUu0TrUAxBeycl9lrDshgZj2jd9FU7XcMFwzC" + |
|
468 "dMsWJaA8EC8u31vnpWWqK8C03pdXTbWOEJdIDMXKOzd2ZxjGPnBSNXNRsGzi" + |
|
469 "RdEspHElrfGwHA5Vpsj4Q6tMZ8tZ+gSSmBrKP6xNUDNwi1bPayJw/dAKaC+D" + |
|
470 "vp5sx/+nZcxSF/ig8ZM6aA3escS1GBNBWFrx2vEASHNpHZsTIOTuOM4e584/" + |
|
471 "NJpNlRfaTzJ3i9/XoufnHbT5pmpZgxlZckYto3h6lL8R0bXthICRrI37Oh6s" + |
|
472 "yfO7zhMiGoNdaFAnXTsMzA+Uwr1gesHWE9Rbd+jrkcGgL4Zst/A/c64F58qt" + |
|
473 "J2RzA3xJCGQ6AXB3SlDHLObuYZ48TH4v2nJ4S8RTs/ant/T9DTRJyhQMa9+P" + |
|
474 "QC8Ny1ejFOK71Oqjz7J2jGpoBm3gDRZDYeBa6ZiMeJf8Q+bkpbEgUQbdiXhn" + |
|
475 "dpN7acdJTSHnO5/3Y4G1T6kLNzKc1+NYiYwH9Y6KIMa9IaocOA4wCHEFog7Z" + |
|
476 "Ac6vFv6r9/cnXEIe9/t5gYLL7X/gU6HMqZFjM0QjRru/Sy9vYfpytqrnOf/q" + |
|
477 "eOTJ9gRdIn7jNVTrgrE3ZgNvxYapaDMyFG/ixZV0cblsVJ6JO4MArOQq6q9/" + |
|
478 "LWGtYYEDclyLNxUTYf0gHmVRhYV8rlyMKXtDu0aBOOn13dRxKKVN5pG+LrKe" + |
|
479 "V+FZ3tDhYiFBxI/gkAiegSQlvknJlbEuanCWFq7sHOZ3C76L5G4qtRv7tHAs" + |
|
480 "8rtqzhYnddxIkTcj4tkVYsFxkj1afSuLSSoYqc0jYZUXHkL+5U0ZRxhJbo6b" + |
|
481 "/QVtiGXbS9i1em3+Yr47jHRH7f5Crlc2EdEzZaIm8tCw5G3CddXhhCpQTT3r" + |
|
482 "Mjwep5/w2ai8qbGC1xo6AV7ZyQS535UbIhOYMPO7vd3oUBmQXyutSxx8Wedx" + |
|
483 "HbIlBdZ44JlRWELdL6Ejo7PwhG0F3Zd3+FtasM13teYlbDWdFeoTF+inrXCG" + |
|
484 "BCSqoUDYLAAxRK7oYKSDqfrcRioHO4AkeaF8x5YZpRSM73yawZaWeLVq1NKb" + |
|
485 "DdeSJEjqDs5Ve6cA/jSLDtlJqudspFamzkdUWa4L1Tc15JY2YD8urNz/qXUK" + |
|
486 "E74H2MtQWjrQ8Yjz7y+3yUTYd8Clp1dBKV2haIr+sCTnFtUXaQ9LZF5S+enU" + |
|
487 "mOf7OmdFObwvV1f43HDuDSiFZpE+w57YmAgSIfWelKnGvvn1lBBWBomyVBKo" + |
|
488 "69seibaSyUXyuq8q3525ZKpHIcic7doYOYgqU94HBQOwkwTtoiX3tKX4EgDa" + |
|
489 "9AjYD4LHITkwgKzsQAe+3ASKq3SPFXi/UbYuZNXdkXgh7kqL6PZPD6ayIxOW" + |
|
490 "f8E95fZRXPyNbKf5U9pp9hVKeuOPKbEYKsQNG0ZiephMmV3S6JjSqLo+qTU+" + |
|
491 "QyGH3vhwlhda9cmxrpKCy0KM8AHyWoS4L5TAiJXp6moCttP0v8P/RRFtBePl" + |
|
492 "53nyLwZ5SyXv4ifVayJyyeDXn08In9MINLRyjvNF2gHbHI7XbeQKqB3yIBC9" + |
|
493 "sKpyShX6UKb1Dnd3Z19rT4a7QUkqfcodX9cU7tV6ncRuP5ZJRLHQQi9w/2DI" + |
|
494 "Leu8Y43jJ/CWYo8Fb8IXHrWA/hwNT28Yr3OcZUIDFdbdxenTKyhMlDOQ87aU" + |
|
495 "VXBCnq96jEAzY0NY3PZj+CBvts2wlCJJDhBCVTXM9OusZjH2/B6phWO7ybMq" + |
|
496 "15QqYyypNM62oBlu82psklHRREO1D23MaOyoXSHYVFxvLMKxhstK3wd59cst" + |
|
497 "8V/uvzzrURJu85X1X0cQJaKB+OjvBT8n8e9jzjATOTiGH2ULLSro2wc7Ne1r" + |
|
498 "bEK4qHeuSwlvulvcqB7wK84PItmVOW+g9VuXA9QGGHxzybbs+/QaMqJzdN6C" + |
|
499 "oS1Az5UmvZbdnSAuXtW8xiKJ+ELAGCjOcdkzQaAbd8Tq5hUXAgYeNQnoDjJz" + |
|
500 "+a8CTk1IaGkeHlg7MrV98AuIQjUB16IU6gE4MH6ueOIZhF3PB2Fp0dGPXL6O" + |
|
501 "KzIiC3jM7rIuTmOstI/t+XB3+BYxKvLuQhbV5n8sUBsGFFGBKoxIZawKG1Pk" + |
|
502 "3Dny2rzcB2JkcOO8r6f0dA5V4PKIrhmVeQJyHgY+/fF+JMZxfjYmaSrwu/1R" + |
|
503 "JnlDfDCIwNon7smi8QwXbEvRehI5a883yI07COM1paHBKNddlw4sfkfbIrNx" + |
|
504 "LQJLb0mHgqvHAblivBmMuaiZaK0MVOgZTe4bYuYdRSN8/ueZDHOo7lyfXGzc" + |
|
505 "8FEThaiGp5m/uWYJgG2FIRxM6by9PhusaTZgJ8DmjRLF5yDuR14gau6zj7GZ" + |
|
506 "TMXGDIDTRWTKTP0/DYF+EEnuWJb2JrrxMnWH8X7xXhrRA6Ku3nqVEwy8eUnR" + |
|
507 "WtLAQkApLOEhsp3wQyLRbaydcD1Si9s5JICy/m5Sv2NXseKbmAHDphTYuSGr" + |
|
508 "Gjk5ryTEaaiULVvi7mv1HqDq3fli/PAzMIcsK0yaF9rQv7JjtsOtZtr77+zs" + |
|
509 "vM8CSY835WpqTtjGDC+HWHulEADgS4ShpIrn3zgyEd1jrRY6rR5ZDuioc7sE" + |
|
510 "2A/8w6I5KkmcXMu/jKoLjotdUvvGMMAIhqCZD8sD+F2jpNcCV3/7NpwaJSk+" + |
|
511 "61rfPxzQRKu1jn/9TV7e5PyWQMkPOMbTMlA9jJPi5WEXNanIFTJBYgI6vmYc" + |
|
512 "156uLrlXh4F5gpLN42JyhddSbV4dXXLt8an9X4dMAJmdgBmzFldFPU7I88Xm" + |
|
513 "nuy3Rkqs2p4eb44b4oe9xdIyUw3fkfdoYzRx96X2Tvlx67BvbprglcdoiBce" + |
|
514 "UitoMsN5tI9+o4/wp6SCU1nv97Yl/kGR6xyY/5irK3wVr2DsrRSF/WuycPFV" + |
|
515 "3EOZLCoh/Y+9yH2dLlslarL2ZVIe701NTp/fN1GCQoCI2elSwXZAiJ446Fyv" + |
|
516 "F5x8UTIbAZKiJfL8F09XVnNSRIp78rcNUUeFKehewGJ/I6WtD/SyGc7uTCKi" + |
|
517 "EqXAwoQN+4GcncLQ2eqFFqR1aZLEcJKU79EpKu08rFTl0X9NaA7Qd0nXAiNF" + |
|
518 "EUz1Xo33ReE9l67+QLXYK17UIqxkFQnawydZKt1T7HeRpTKEQzo9/wLk+IYD" + |
|
519 "m5y8DXHK/d/kPySyLW4+srw3HRIe2Cuz9nNhPTUKtVC9CPt9NT9guhOhDGRA" + |
|
520 "XBkF08Snjpn7wG6G1cE2gwU3W4oQIvCAwpdsJ8leg0fbosc1UD1QHR+3CxIU" + |
|
521 "0yoPm19LygYjIyTg55bGBID0GV+DAHKUVHIUkBpaPM0PcSxsJgFv1seuQSJy" + |
|
522 "dRUcKGzPg+xJhVvHuuAnnlBibjzrl/DBLCPgOl2kybpsv1sLJdTLEkwkv/yf" + |
|
523 "83PdSz+uPha5hv7AGfxEaaUwbnktHultVbjO+IKBNqgjz763XgUAKbtfxW4u" + |
|
524 "VLBESpZiVe/gzgNV7j+6+vHWsOC8GBMjJwHGAFfTyjYv9BmrxkQyabZ8wCb/" + |
|
525 "5NPvaHBH+qkWVVWBaLZuOkgG9dmQI/oEcO2H9IDtve3OEXGuP2zG3xkk7h8W" + |
|
526 "RwcHoz/anAbEHA1wmPYn/NFn2FZW3KxdyD0/URj4DaZqMYCJMCN8TkbLBxQk" + |
|
527 "ZS+8VCcXMALybXUD9OLX/jUHaPqO70e9+o4cD+O/JfxKkTj5A2WD2345b8nK" + |
|
528 "Lill7lJ5JlYekkGG4LQf92FbH0ytLSVB+A4oc7/nxI5ciWy5vDmaG+3HS5W2" + |
|
529 "mGxnpLApVJZhhiJRB5fjfgRiuVbcGNWFQtgH2imMorrE0FzONSQfepLtBSQM" + |
|
530 "Ec8NWgmEa5O0RIYLMblXisxt7jB0k8NqgiSm3dmNmR7GhbBt+mg95uCXWmB7" + |
|
531 "nbcUaTWUw4Lb1EwVB/MmUEBjer/JYDADWz+NS/0VcAgBbjk7vrjAdgXkgiRB" + |
|
532 "l9qBDioO73qjmjeTiCjoLsuEreXPu9WTaZDuyKO1uxHoesZE0AcWjcZgKVY+" + |
|
533 "1Eqz3awCUxQTH+/1HsVxONmbYzJgMZ3f9Kuk7dxwFc0jgIw0LfFNnBDW3wY6" + |
|
534 "nrdtm7vEuR0gfYU83oqXQqAMQGwMZXKXtibS7yPL+rinLwcoWYkZaIaI6LTb" + |
|
535 "3DthepCtsYfIpaErOHMVOqxDUb4n5e0EUJiy7gw9JQjDX+VzpxAnt2Kc6/fl" + |
|
536 "kon4xadP5oyNx3YU+jIywk8p/NMhDfia0fFvl2BHRcgFXHyOa8IPNmRb0CgO" + |
|
537 "78Zbt3NG2+cFUx1WwOuCohfoYt/STUnxDXpOCrxYk2CD09Vm+2xC+7+VLfex" + |
|
538 "UnKzKH0tWLNyzA5XKSHyLe6lJCO+mvgdp2vrO7i053YVfqfqWSL9rhR0tH5w" + |
|
539 "NO8uUd1/ozkIjb74PSft0txTP25/c4/MEWy2JIg+HMM+2fmanJi4xJsuxBfq" + |
|
540 "2p/7AYfmsp05TfoSLieWDBNx3lrADGUnuPf/o8Zo2tgn8ek4ig706kqzZy9W" + |
|
541 "p1PaYNK6p/MLI86Sv6OLHf6fR0u6IsGPqMcYx9J7U5SCemntLvucfWRAqRn4" + |
|
542 "5htDzdTFrtO2nXLNDxk20DQtol7yyBg3ngVX8XDhKReGdV/Z9kEeJhgzbxLT" + |
|
543 "fbjoGQD5twirxYyV+eRqQZM7fu71Srg6lz7najEyH9pbQjpEPForDy5Briry" + |
|
544 "nplWImdWd+KwG0N35+H48kpxAU09sOUGURzsUPdwTANQUnrWWMo5+UIjxXtR" + |
|
545 "cDMuQmj8vlYH8iH0bKgexZMb7cRciRUF3az3lo24FA6l7e4SkyFErGJITGFN" + |
|
546 "IHO7wDz9h4rLikjGkz4G1d04XQCxrpHSrW9fj808up1LSoaye5ijutJihEHu" + |
|
547 "hkiFLi1nwuhd4ZrAZD+0VkTde9GAi9xPa8Cx+lh4JMB5mghk8uTjv7G4KqzE" + |
|
548 "Wlpos30CMyCc5cBGqkCVLKt64+KgUyt0FnU6tbZve7i1/oYyUaWx7BCk6o9f" + |
|
549 "9PuQM2bOwqhjRtpBR7q9Zb9H+qytAM8psLV6Sh9K0cK5Ug4BBEAtCK+JHBHG" + |
|
550 "U3zkhu2FXlm0Mnp5xiaTvPwPWe0P/mrD4Fhgn2pbPvyJXTPgWV107zafKuLW" + |
|
551 "34/+ML8oog69/oUOSAw4vaJx8PWguMRoQIsS6ATT2RhUVn/t21fJK9j6eF/B" + |
|
552 "YG5IIEavyybQMILx86+SI5sLi9j+Xqd5bPLWnZTataP+voMTzyyYqAi6ybEl" + |
|
553 "4QkWM0c8t141t7FULXHMTrKhdZDocb9plz3sfYk6cEqlOphvmhbZbT88iWJe" + |
|
554 "ndBHJxY0SL0NQ7Yl6fg/DHt4goXSIWGL5IamBM8CZnVwyCHz7laP15Zsc92H" + |
|
555 "DqWgbojeMxiPSVnFqxFzL/6TBBTQYuNl6+CgCOPIe88FwhZvfwzXVnQHb91i" + |
|
556 "58t7pwXCURscYFK7iyxi7QTrofT0QM4upsI3zBqOO0X2SOW5H6Dx3uukNP2r" + |
|
557 "Ud0AbXWHglnooaMNl/XRfYyb6VYg28r7qcfsSKlWuRenNf/ejaLl6GeO/ef9" + |
|
558 "VI+ia0qv7S2Hi6xgdw3/NTqltehTyZylC7LtKr/TVRFdGLsFKtGvT/KGMYt4" + |
|
559 "eUYR1zz61CVxAjjGAg+NlpTG8P50xralMthUppA7P6X4j4cDrD3E74HYg9Zv" + |
|
560 "4PLAh6MOymj0YbW+/QjbO13DeSXxYX5/EGk78+sBOVSzvigI9NLvWHZMFylp" + |
|
561 "mi5m3Wh7cQojpkeKXSw0XRd8lSeMN6lrzkMknniWfZZhK3idGCH3kHd7IGzC" + |
|
562 "X67K3gf+8syXOIpoDfUJHVpfvKZCw5XN2huYNGKP8KqELMoDatmEoB4hoVq/" + |
|
563 "VIssuwanWj3vDOxp7bYRUXID9dfTrgq5A5+1RuzrJVpmK+maTGypBDvemJhw" + |
|
564 "OSP62Oa+1ryH3+e1yqWDbWJrDts1S1wqMRRG5LKP16e3ZUYo33Gir/qott4b" + |
|
565 "J3PSvZn50KLnkyt1apUGE3pIyytvencsCca26qm+EGLYJXu+njUHIU+s4z5Y" + |
|
566 "xxrR4xcqc4CKXKK5+z34YCkdGM8JME8fCinDgrsixnYCjyv367LrQ+/YRvtF" + |
|
567 "6gF2XrCyPNTtRisqHg8Ug3CSKMPYJBXO2uu8/9dxF+r8LGv0pbVoPUBJpPiL" + |
|
568 "+tnxY0ggyOiU2zsUfb3QcuHONXU/2qv9FxUzBZDUDVuhXeCgNDtfv5QN7R2S" + |
|
569 "VoWWQDcQP5Vop61TXUhLnNaU6LwaXsVIIi9hbv4k7LV3tOxgjtyddymxch0x" + |
|
570 "4mR6XCXVwPx3yVIEwju7ANKsDxR+yT7crRYpPstka9lY8Y73w5MIgz2LVk65" + |
|
571 "xJ13puMbAGnCuSEuQgRdPHyt9JDp8KfvQ0/FegDE1axheKVAfCKgCuAudIxZ" + |
|
572 "UGXjPXLh4hMp+o87hw0Mkr0tfmKBd3KzRkjZm854ksnURKPODIjEqhHcW4t3" + |
|
573 "gRQ3cYiMqcv0cDd7cDw/4dFsfJs11aXSF674f1lhOjYqB2Xa7EMDQxJC2zw9" + |
|
574 "6HPVKHmGGSNAv/UiJHjcQuJslGVq1SisnSWgpMND5+QnxHDBww1p7DqXpDQJ" + |
|
575 "boHjZKPM/gi9N4GD6iHGbF4l8Mx1YzuzoAbqqg/6v+fmYQRUgzGnNRHW781F" + |
|
576 "R6J6R6JwNOVTaSvlDFzQukHdwpyqcR4OM6XkaxNK3SMRWye4O1/U+12FhPYx" + |
|
577 "5pPHMId8d8voJIIMPYRjFIkZAWpYbavjtV5x4xUWu/Ch6SeZ6uQu5h3WbFVe" + |
|
578 "buXjnOQbVIixTh8qo1WXXKiG9DUYHowgz2XWC45izfOnt1xwWj1He0IQoYWg" + |
|
579 "WkePdJPKfS5igRdzjwEp29RlLoqXj9TsICzYhWY626A3UjnTSOAg8Av2iWxx" + |
|
580 "j+3I3zA5I34udiSf/4iyrWZHeaLP3S4wIDrTTNzOh18NvspyLJrjoRokXwoJ" + |
|
581 "g5BnQan1rHl4p2e7oNLPhc9ewKF0QWdi2rJZDY6qO7sa6jt2C57g8jAYhAFS" + |
|
582 "2cXjJNQAPCgoodeKTnJ/1R6Ykk+byXzeDc1NuHPHiNbtGu54Hz5Xd3P8hYJ3" + |
|
583 "VBYvhkF90Rq7LvBBXyVTy8tL0I0N9BdCQrnd94HPm+fMj/nwc0pqCi9b68ex" + |
|
584 "Gcr8YM3vSg9xRHEBXsWjL16oKchvwavauC2Uap/OEizdkQUKBZlzDazbXTN6" + |
|
585 "dZpCyFcB+Ox/zgltv3jxum19WdgjyIddqBIyiKxFtC3XunK5yvmr/fFZV8X3" + |
|
586 "vxbxV6y0QPqJDM2ctb/ndiYaGn60EJQjxETGIanp5szgKFBYs1p1mjyov5p6" + |
|
587 "p76yEvTm+Ba+LX4ngM1AddqyfbPYscxtIyhUsqDqQ7vSNHQezTBcz63OclbJ" + |
|
588 "G2SyQFZfZKIgUXiZt+ZC3BwKRBGQZUE+UIV9WjrIvhtZN7A1qdo42c0S/skz" + |
|
589 "lHMKR75/PxVVXRaArCRytERwdLOvlyBE1xl3rxnxErTQHViP0xEzOfOpQ2M2" + |
|
590 "Ds9TcXkm66ZRnJBuk+fp4m8iiz7IfRlrI8y4AUuI9LEaFOKkh0HH7sjSWzs5" + |
|
591 "7uGe0eBZsLpzWoDd2Uacht9+xLcnn8tQQ32H0KHkZjm1UGtbSyUSvvoC8SQk" + |
|
592 "U8QstWumKzrzf3/GYuW43N4TIBUvl7GWcpmpevuAicl6SVeDjyaSGp1n/OUM" + |
|
593 "FH6e6kSgyDvrs/V/pQran+Dymby9DPV7fUWNo51rFdqvLhktICGGWRuUXjvA" + |
|
594 "eOOk4JhsD4MSlKysuGfbcUhFnkhjFkctA63HEAPAKNLoQze2tRwG+tZhJuAp" + |
|
595 "Q+3YEHce9DEVo/13eYVKRu4yFqD0G+KAkwcXHcFwH4b8ByTJ6K4BboRIpGAI" + |
|
596 "sCWN2r4Yx6sH7hDgDH/ywTs3xTI+JBDGk4+15EXUSVA41bCKEsT3BiksVE7b" + |
|
597 "Uo2eXPFkG7ikOuyMr5xfWtIN5v3tg/lE8K45LtWgOT2mZeEZVEVmgozGwR55" + |
|
598 "OqZvFeqdZbV1l57N2vSf3YkJFU8CRwd6uDZ96C/Fax7aL4biwSragaXrYu04" + |
|
599 "XqqWIJVYOZQnHHHTGSH+C8+NEZJiAEH2ILRlqa8VCTGPTVd96+tVriytRGFE" + |
|
600 "wG2xl4jYviismG73MqzuCq6iwx+HaWTiGSlXzMfhKL0DE3rhPmWrKIjdR+Ub" + |
|
601 "Lp1C/L2mM/y+DEMoj59/l+SwMaijQY6oUpOtVGS+Pm2C03JFNSFZyYo+HHAC" + |
|
602 "OkBnWMUKCGWMWOejGaC4vtBxZsHn7Q5ij+9diNfxyLEWc08L/muJG46bzlHY" + |
|
603 "+t6W/j4UdYuizHNm1og+DD17Kbxk7fjRsQr1ARKeDkw0RgVZrnMzfsVeNfP/" + |
|
604 "tQVCeOlsgTa8x3j5eQsR7aJi1taen0BQATTprJmN0428+g3Sgh+4eLslkGfi" + |
|
605 "9c5Ftpq6vM9bxE5w8PxjPdQdGQZdcNkDHEreAmGf8Tb/r0ODx9wMdYNRqbq0" + |
|
606 "Uo2Y09Q9zm91bPC75IGGrLvzc1X0MXqQmQ0YsRFq7T8j9wZqS6+bveA/Svd8" + |
|
607 "pwfzfR7GWDCd1lwzuP9QezVrYYcozCquJNMFgCu5hcCJUb0RdC8EBsxArcP4" + |
|
608 "iEM5+R62j5eOOBMikMgLpRsTQCFxBgFLiqv1sLBe1xxPIjQhtx2FJvuxd6PS" + |
|
609 "zOVdplRe8WbbN1XZUW5UQJH3fnD8OLpAlWS6xas3Qk0ZCl0jNqUYANUmnuJx" + |
|
610 "SysQeI4HRF0pvthikuZBzpS6gkxDf+CyNbJa8DZrwc+cZje11KWkthn+DMdG" + |
|
611 "sODZI4Z/wUGBRB9S4QQSaHUajYbJ/wfiYopt884ophtyjW14oBs67hmX/nZy" + |
|
612 "cYxmJnEaqcoJvSDzVDnK7YVwV6dV5pmvFe20fWuk9nAdtWbUyk1dXwZrtx7y" + |
|
613 "Yw6N93sAtlA+a0xwKDWK30PUU0DXuVnaw5pejrHznj1gM+zCycZ0jAQkq5Nv" + |
|
614 "I3VkSo6+mDhD7VfR16p5+cPgjabFb1yJYjit44H+852Tr1bzekpO8qdDw0un" + |
|
615 "AOjou03PaJURRqI7E4oHPA9kRIPEHzqJyIxVJrly8hSMbbVaviZOLSzbxrvI" + |
|
616 "J8qWlIenjvtD2m86tDZ/0V7QEek5bjlpr9wY8sEGtBhuWdRukWhHLm2RlmPY" + |
|
617 "2pqodKPSiDxAy1mDQiOEMAhHOfrABDKroLsVOBa+zZyR+MzUcBZk4mhXZUmo" + |
|
618 "dTaMjxYykxeOqnnlapKaz7qwFswwRrXP7n/Pa9XTxKpJms2s2pJZdKhZlAvp" + |
|
619 "E7KNlmCV8ag2hhDF300Wu+J7syVrNffpqnn4jT8bdgL8orfAXT3dgTzwplni" + |
|
620 "Fa2C5FQlaeGSG/7yM7qUXChppyAOA0aa3Ujbet9tf2PiS4+dsLjV1ynanz72" + |
|
621 "zC0bbfzdhZBMY/mYEq6GBAH8lHpAWaoVda66iIoBjNk6+qtv/ShnEFmRawLy" + |
|
622 "3KWyNeVw4gJjvejp+4Ch2I0zNssPrqcF6ne3k/FxB67eng7kqkFZRfC5xbLq" + |
|
623 "NVG28rtlDCVVWkcbyPgo3cMaym5ZEj6Hf8E+Z84PuFhQBw7gJao781M0ddV2" + |
|
624 "RIypj36LsxzzhpSPfmM+GHBtLzvryNqxlzViaHcsPBoh75XL9tQSPVzT6436" + |
|
625 "5c6dzaW7lkak2TiPoWucxZvjh1PVqoijWvHv/YGav9ffjJef9TfREsBQG+ym" + |
|
626 "Sw7Z4l7RZaWjfr76sO/K5FKlUmw91k8LyFeRtZ8gBIrGdV1j1DsHktHuH8/K" + |
|
627 "v/lHolVp0QPI7vyrXRcZd7ccJv05dm5mj+CNw7JHvAHeIps1goDamOCROexB" + |
|
628 "ksW7YqAuzex8xajTKtaESP3D1kZYz9BZ16sM5LWNjPNdcLygVHMBV7oAVepj" + |
|
629 "tOd6BYY4xfFDSWT6UFcz0v1GgdsQaszcQdCoRL1XrCatRKjSvQDN6QGXUc22" + |
|
630 "Cy/JqD3HHc7cqL8y2WELIPZcLNyDFe3P5Psvkcs/hysQPs3XGhfbWrvSarmF" + |
|
631 "AlwFT5hJEy+pXeb7x+jNjOxaj0vq/k1gyXm1y/pWPZvB//MjLA8tU6mQCyUC" + |
|
632 "U9wjAtrieJRAdZc4pqqO7Ha1Iq50vtdLu0I2mNn6M9/b2IUfwqziE+rBdXH5" + |
|
633 "Wj2n3+TQed5xzpJIqG7iJQbOEY4byZgVmSQCJHjWBU1yaK+gkTGunPbv56+P" + |
|
634 "PNYZ5uUJPWCrWSkmRow4Z8B/Gi1IMKkAsEsv6i6HwomZZoj9tZGpXL27ZKxC" + |
|
635 "fZMnyIN3QMXrtCb+RHcRSTWlgraLfVMZvjtYh2Kxwb1wB/Lv6ClHT/A69uYZ" + |
|
636 "QNSDQCCxSOaAOQoACjh2bj38g08nA/rGXUYft9LTEKIkqUSf4fMTc3WzTaqN" + |
|
637 "MzZ+iXnNMPDYWSWnVOZ21HpkOoOID0zRbk2jBy1B0xW9kcS86ekhkBXhKYxw" + |
|
638 "x+J1k3WqsMVnsVqPWWTRU/G5OCfgsVXfYElFlrmM3f3jiMADkdBsfEqrpPt3" + |
|
639 "0QsVHp4T8Q6WzkOV8D5lIGdLKsF++8LSjwLjhERWXdwooq+6KoLPm3cm9Tiu" + |
|
640 "LMjtfIfVYfaw09zXmKqOkVONEsZDLHTztqmNWNJJB1Ay5iL7QPvSjKQS9WIQ" + |
|
641 "TJOARZD0k+qUW/9a3QHaeg3O9aqYFMxf7QO4FCHf1TIMNnr5LGoUIxC3n7Ki" + |
|
642 "cB9MlAunuFud8DiiB8/+3QgslIVknChjQiCeZPFsJIszUvPooQJsRDcGXADH" + |
|
643 "kXInEcaqT9EsHYnWwDtmZ7gQd+NgT3IqvlRJRZ6KXmyuphamZKieRkOIplHV" + |
|
644 "muUq1T60+6tBHld2033XYtS0qY81/fOY8WbvjCxUjF5xu/So1tmW0tqr0l3y" + |
|
645 "GGp8jyNE6vL8/gJgobfXTVgnZhPB86D17FNWwEWHG/dBis7gmo0mkZRh9+gk" + |
|
646 "PLAl8E3UFqWmTLknSqqcI6ajgkyI3nmphyLc5H2l2mUYRI+bCiOunlWGGzMq" + |
|
647 "Qj2oSuGdOYX/hNn7MfAYmb1WNwpopBJYHA3VKIKCH4YDLz8h5LF9v1iHpZT3" + |
|
648 "IiHf1WEwC7JpI3Q1S09sJMjSih5dctNkmoCG56gJ0ZjmJvYhWy+A9/Nyd9qp" + |
|
649 "oj0E6j0hf6p8dovu1eE2BqKRydCa0T2i+bPnNnB21KU2MLgV5NGw4tyIfUoR" + |
|
650 "Ui8QSHDynL1Ob1BUbKuqT5p0Ybqths/oWeBN032wA8DOblale/gyz0fXWWTh" + |
|
651 "VqD5ktw5SGRJTmA/tJfhK7kFfMdk+9Fsvw/yV735NAcTorVbOPJoEWSsq7k5" + |
|
652 "vY1qreQO6tRd6Gx8aeHW0st8w0Cyf3UpLi8x+NcX53WJaYBhXXJtYZlEnZ3W" + |
|
653 "do1Ekrs6TWrnRzSUk1uD3Ku47Gpd02hOTfN0T5lUUjaoqRLuvwyYmQiU47Ww" + |
|
654 "Wnb5ftTAoljtH2P4LXQZyqYWca+BgHdSjlaadtJ7hG88zgSHomwu/QVSVRSJ" + |
|
655 "zqW+0ekjRr45/9gKNmaDdFwZ41HBgly98x4Z1LzcimtylmgTpAmowJRCBSV5" + |
|
656 "uad7WgR5Pw2LKWx8YnPAD9aJ78DfSA4LqkULHOfVfqM1CIDO92Makz1gL6bM" + |
|
657 "6jEpuNkQHE1FifU31Dof4JeoGC+w6V6UjtmUrilKgq98UPAHHU8Bs3ADfXIH" + |
|
658 "w5Gz/LEjwmUL5pEeFft2PMzf9HkgKcuCFrg8by4PgIv4wMiE6gXZCMfE+Mzd" + |
|
659 "fulMuy1opZB6LdObgrv8uzhfsplRaVl4utuTGqg3ZE7PyZ+a2nVTBDj3Blx9" + |
|
660 "88gBN6wjC7MnTRR7C3PlVfX0ApBjmX84Eu9AF7R0zc+XlqsguJK7KKWq9BFL" + |
|
661 "xXETLlygW2oux+30km40WiZC70wZJuG/Y8NzPwZd3JiJ5/cVWySyppfBD5cY" + |
|
662 "k6as7/9oXDj5OfXilXXJNnzMSp9Q9h0P0do3qteAp3um6ixvnE/unKtCDua1" + |
|
663 "KuYbV9ThI+RedYYkYdyKSgBiFxfUtMmYw1E3tqjxm4vNlGJijmBM4HbEmR3S" + |
|
664 "okiE+52LKS4SiNRNfp6Hbnghld56n/Bpjv3jsMlwES7415uKmAfm7pRQrB6I" + |
|
665 "6MhGGYhpATf+q3iImH5nSkYt6OCyBjjII17Dkrs+Au/wOk9xhY81j2lua4hC" + |
|
666 "VAWiv8lXTznHxcHl0e9w7lr2rqdl74byKD0ey+GT15C/oRYGM2LNTwNK/K4I" + |
|
667 "hh629dJF+od59sUGg3fJ4qPM4cK0M81VxE86TvZP6Nmbah9L+uqVrnA4IT6O" + |
|
668 "BmiJub1LG0awl59Khw/Nvc1wxje0dr6cuHQuXM2CIYKfaIyjs1snuCpO0KgQ" + |
|
669 "Tkz7DpQSe9RUo6aC2870GuvKlTLWkI0WI/oRLU0sjgssUXraZQ/8XeC9pS2X" + |
|
670 "d5FlZX+gA1OM2x6v/DQLzDeN18R6i6UeQZSgDMv5PeCM+1amS+wVznR+2pzx" + |
|
671 "KNlyPta/4XYWhX/2GB5lwHtYlKDOnI8+0gWU4Lp+mrfKSYdpvnAg4SKRwL8V" + |
|
672 "h344eiwCCpdDDOuqN02dJs4H552sy1SFwMvBnsJCRtQUCq6SPiJ+lrVTPsQZ" + |
|
673 "snJcwOKQHNGHkWs2rTPU7nrhbXaRUCcTcPKknAg3wdORtT54ASE73dkufPUS" + |
|
674 "8hgbDJB8EwD+nKy0Y2y1KdsCCHjoHqtXOwaCoPHecBud71ontPj0XCZ54drN" + |
|
675 "U4coNXGJjUtKhRPMC45US6AJRYu37P4crc043eO8D+E9MgE9cm8zCF1aRJe5" + |
|
676 "lP2uQLvGXvg2qdbrQP/ebQNZ3QJ2LUT1km3ApZXRi0ht0a9SzWsRo5CSQY2k" + |
|
677 "g8K6YbslkxCT/AvYEGWjEHx2kBj96lSTYYz7nXkJHzLX5kbgXWAHavzWN04L" + |
|
678 "Hqf6pbzbbiNpJ7SpG1SUxZE9xU34BP2msOD4aOUPBJCfd3pE+5Nrnwudk3r1" + |
|
679 "Lwp9YBlbbI2md/A6z0H5qKrWYyViiFbfmUKZ/BrSt8+g8Z0MY26V+7wQCmZu" + |
|
680 "JbyOQkLbPG3YghMUK/T//1NbEsgVK43Bh5mvMZgLOWFOHf360y1RBNtJgcpF" + |
|
681 "/Ckig/TSA25XC4l3MQ0bSEdszSjUkRlKk6WARrZ62EpCV5mNP6XMJOPRpNRl" + |
|
682 "DHvumo89/PKxn9/0GqLSGqkC+yHxOhxqF/3pe9wduSuEamM2FFySftqO0BKU" + |
|
683 "uvYDGs2USoeZCO4xXELDn93caAYRCUIEzFYU6dT9JGEEgapq6UrmiS2Hi6/X" + |
|
684 "zYcs41tJtI143kOJ6NKq/YzvZTNnyOiTmXuKJwE5R4VdtkZ2PBD8MZvqMpk9" + |
|
685 "reFXpubJBL9z7ZqvvchZ2AHsnKWCOQ/rG+rRXTuWMDF5hHIhr8NOy6Sp8X1k" + |
|
686 "DC49CFKkSv23OxhLQLfRBQHcKQ5IH0sJTtbHviBq+vB9OV8dz3qpLvAbTB89" + |
|
687 "tPrKfy7jsfPaFEJUy9bjJsk8gg70WLR32OucUO5AStWk39b2C6PEGewzp+Pe" + |
|
688 "uy/SWBly28gN3Em4RsHUptWkyiOrw7sQhwalJV60rwqROCfSb01jLfAcBgDl" + |
|
689 "1yZ08YSKsMvRGUCRID22eDBxl8fFeNHyfPWZrsGegLiWpG4SEhdz9MuayNCW" + |
|
690 "+K/rq5wXnvgmVeDx9rgeCSuEc2+iGgyirvVcwINSPoJIejyfLP8A+dNQrS8b" + |
|
691 "6n6ZWKEpiK+4K6gQJArgbdU/2QdzHmDH+b4ITnrhqA2SVH5kjdglYMWBZ45/" + |
|
692 "/Q5LwMEdqv/P48eWWxN8XMoIkVf+FtqeHwfr48AZhINxbQROlqBS7hCNYj44" + |
|
693 "BLipDiGmeGI3pYeWsoZqu7hCRMPb42ziwSGFdvv4Q2HFWdgDYvirxqh2SbgF" + |
|
694 "aznvDQxq4Zzk+TiJbHgphDZJR+DEHYX5n9HbgLWOp2kYWKWT0BPwzS1w++vK" + |
|
695 "+pMEmbn3C5d7OEBIJ9TTD/jZXB3KP9tUICFFaFXUrk2752fBfO9kA5xxbxDk" + |
|
696 "ISUvhwBgiNGxet1T5SoRKPb61Zz3NY0SLr+GD5KfH4mJSF6tOUZ2iAP81uUs" + |
|
697 "fwPIxqHh83mMS5PW/DAEeJT2FFcBMVaXdj6Xc1hvIGGXYjc3NQLxII5vbQVR" + |
|
698 "3UGhRFSJEi0urSXTFUDMan2AO24mM+jnNRCOxOIAx98qj6DKTfkcBZidH9tG" + |
|
699 "nJAOlISyY49hJvSk57tjc0oiSq8ojE9bxQQ007mc+XnKP9/5dXrTa/zUhCZi" + |
|
700 "DIeqvdOZ1ugRt1garJv+BS0kRrMpahYxkqUJijkSE6U+4+5V3ssWhWu+3VM/" + |
|
701 "LpKK/sKXImOzcBbcdvzPd1/2yUp+ZCzDRB9qeOmdhZtEgKHp3b2Xw7211jfP" + |
|
702 "ZWG3ydrVCduI2m2Vo4Lb+4NddZj3yN6xeurZw/JZIuzBcmOg6viEu+Be38GP" + |
|
703 "VWz4DV3lAK/2eVPGUMVIVXthJCFLKaT10psSNqFYWi92OxhOIu0End71Gb1H" + |
|
704 "tupvmdPZWCQbhaW8l2RvYMZuJFKpH+reSP6FrgqmrxXGf+2EXzz6PdbeLmnB" + |
|
705 "UB9QcTdu8tsIuUvzh2Axvrxmqi5rigefuQqwvSgl4KPC2mFI3cKrVJ3kB4Nz" + |
|
706 "gMIpgW1FzVkiVQSHMTno/bm1LxzGv5Bcjx48NbL183kkAb3kYGNfZHEE7EIN" + |
|
707 "/3EgK1RUUF0YC9EAYt5U/hnNOofK5rNTjYPepexhY5/4Ve5msVrtn3C2Nlp7" + |
|
708 "gpnGtHvcm2yoPuWo5ASHh+wGZWwkUMz19x7176l2GczPSajuK6CT2i3xnZ8Q" + |
|
709 "VGQALJ3Tg83Lqg7LfUhQIFYr6yPttZAjuETlWXxIa2IDsxj6Jz9WBzQHr8TE" + |
|
710 "1NY9XmTY2eenwpmNOVHrwn3ADzW6OyDHfjv6IY+INC9CAnGSf1EMiwUPNOpr" + |
|
711 "oYhGfRzTgLLJQTPTWwkn4rmds8eLVdp1gF4uK9fEdY17nJFe39I2Tui4yhwD" + |
|
712 "Ue39/dGYG16nNTqYj/yt07oilo8PKAKczLLN20Le0aYmOBMGWx+5gWGiPQGk" + |
|
713 "Jmq0LCHO5rHf7L1j53+efwedTj1Z+qv20IQINJcUvgUX4XfJewiUoLU9Nf8P" + |
|
714 "jOTIzyR7lNWV75kK0JZJz1jww94GjuCq6F/qXwAM3P+X1VThbLKd+drT3YmP" + |
|
715 "WVOeOYWPOXUrU3OowSzMGIE5sq7rQY5WwZWpE8O5lUJ6fZwx+MjKVnAYdzAJ" + |
|
716 "rRxH7eBJOFwn/IGlgJDUdvOHy2bXX9kcVP/ShWuflU1e0y158UTGQNiIRjN2" + |
|
717 "E19RBBgTru0eB0DZ/yke4BhkeIo5u0Rg91asZHp2RHONDyTppR8wSO7aMKRZ" + |
|
718 "BQYEv87BIO+B06YsohMfWa7GwD4jFd3XAm12aXIukDo8sMJ6f/C70NwyNsNB" + |
|
719 "wvjMvl+8E4jK1s5qgagPwECIdl6RBtf0m/CDm3FS1jD8ghJnvbHG7aZnafm3" + |
|
720 "jTPJcAUDP0+GGtK4aFvqC6yvbUPotlWYyPDhMaOOFSwuFUqn9tzlY3NPlo4x" + |
|
721 "28rietj+sZjSd+fdUiPP5q7T/VR/SsnzIWTgWOUyEGVeJczUpSdqNO3MJoY+" + |
|
722 "5MV6+KRkRAbULuVC+N6whOfPW4aihfNVLEBkUfkpo9f0by7fpVU6eJTaqv4T" + |
|
723 "Z3qW1t80ZVUXN6qRnjG2t7UmTqP2rTXurYseWBYZceo59zfQQSMo5cirpLbh" + |
|
724 "SlCrVXP/CbUM+OMoiudWha/RZw4fdximFlo6R+TxMoWdWOAMc1kfyL5q7tZk" + |
|
725 "kJfAj7r3Y4XBcNeQ9bqKKdBzJxUNRvU2Be47fEfbVpKqDWFlxeOrj6tRqjKK" + |
|
726 "YUt7zjZpYGFqG3YzTfXZVSQ6Qwmxu/QM6vFVjbOpsScYal7Io1qLnDBSUmRb" + |
|
727 "v/gong0EpsUNvjQ40B8jmNUNsTnRF8memZC7k2cKLnah5RXyuLFvN4cZFSar" + |
|
728 "LPhBgDBWRgtEzeShPtQiYzJCelbelDoFBz/KfavE4MLRYgXf6/AE3U7CAwDq" + |
|
729 "splXWaEuCGw7Snwpchk4gCXSiFjVDj2ao2WMA6y/zot6a27ppekkvQRFCtkL" + |
|
730 "SXNkgJ/F0mvgp3mQBOvo7Yd4NPJV++tRFf4tHWbb8VIopwGynZlnlxXyil0c" + |
|
731 "P1tRMXjBWDHFY5GYv48XTon13fw/GORM7XMTbv30KXQvTGpLk24IEjIG5iD1" + |
|
732 "MrqQaAgkWkzBFPwnZpKIenpGmO0G06uW0+c3eJRbfkUaVlsDCnB+3+qZNYSw" + |
|
733 "ugJsWuMUo/brItbV3Yrt2012ocymZSqOGtUewz+VSOopAHG+uIZi2L9h3/kj" + |
|
734 "cJr4b5QSsmFoRCAR5j7TSkVpsfTK6YH43FbXxOHamseOOE18TY5BLb/tIlU+" + |
|
735 "i8p59WnYo5sDy20o/sDM9N8L0Ks4Vma6DIdwYm0YGRzLBR9N5i+HjcprWz4x" + |
|
736 "FxBHMVMalm7metqsOihfb7aj/iu36uZ9eAEJNZra2vUz3F2oFwlK0aJwznMT" + |
|
737 "+k06Rqd2xZOKZxWqbVeWMb8EPiAvjwtAbmoXzTf7AZPChwAtb/fkd8QhKAHt" + |
|
738 "Ge1akmgoY/puFLMJnFECvmy8dlzVfsAX7JhBlVRkeEDofUDCnkh7brT9qqrR" + |
|
739 "gj92kv+jO5PS2svsFJa+3bB6tuKLe+AHnuvaB1aAdf4aPxFGwHAS2a5ANqJ4" + |
|
740 "CskScf9J9kCm6KwO+CmhdcjlZFMs8S8CV7XVpNrlwWDV0CdwEmZMvIuIvUB8" + |
|
741 "Ic58/kCZ8A7OwUVzMEtmJPuLBDVNrS2jLTb3CKjWw5EO9H15J5FseeTz4jWj" + |
|
742 "7PfjV95NT/n0IqhN/1CsozW6Ko2LDrzH9AjD267p/cF62Hc0a7XI+FMF+d0v" + |
|
743 "myz/L8RjdZzwiq/Xg+gYWLT8uAv48yazhy+3h95Ttf8IP8E1pSAEvyiuKUcA" + |
|
744 "liw8aOjVpYaBJU3SZEy/T4QAyY1wmiyaReHXZ+ayWHB+HIiCNdNXj5koUOUc" + |
|
745 "LVKQBdvgjvMMLIUlUCJB+armPQ63GNp5bBfI1lhvjrs/He1HfgKYf8H6kWwf" + |
|
746 "BrBSYVno6HkRNKutUpc2nrXCHRqmJtuzB7uabtGFQEZbxP6OHY01k+tLPHUz" + |
|
747 "EJ/tUGZ7mUfZp1m+PwbXlSjRMYJhLJPsNbczNkuFdfIAfAN8YlUjaeHQWAuJ" + |
|
748 "KaA5iwxIqENVCZR48WUI4s/1uXO3VNa+UoSGI5N9FLgfsf/m/3Er8djDf/VH" + |
|
749 "kW6nG3u8maC6xuTmHh2w0QSsLhjqkjuIBoY7T2Ye+phZYhcjLTuRkoJxNGXv" + |
|
750 "foVPuNghwAHm2Jw1QN0LjWQp0aggReKLBIAb5sTLYLQltGHDNj6ime+gQmk2" + |
|
751 "2kb2QlCP2sOP2zs2/D7CuUWHVeeA5hcJc2eWEWv/I5s6cYysTM13dleBwIu0" + |
|
752 "+0Lyz34cvXrC+9agwHa+uAdO9KYfuk8PjRmVPY5rgL5ux7QbhgA5Ou/1GFm7" + |
|
753 "66fbdqYHNN48Dof8WeNQTZE1qlHl2ftAKyFk9vH+2T/1knJVHpEo2Dh5KywQ" + |
|
754 "M41C0Gla+cIj+Wpit9hVYyF+VMC4MYbJDDQ/f5VCuSMXJIFZ7wwV5EkCLZV4" + |
|
755 "qlDC37hMec645uyutF+SAFAyyiOufGnyR/spllpPXf8pF/HXvtwkPCyN/IKE" + |
|
756 "vp9YOKtXdGfQ0NksPRP6f/nfy8X49Nmr7N4oexlVB/2hfym9ApWw3zVMhWpr" + |
|
757 "sk9EWMkVzNccL084P0UBYDRwVmaU0OJHU1zDs5MS/joegbwjO1gA2FJcFdoE" + |
|
758 "vbbLWCDJGVkZWvfgPr28xxSZAhYuFO5zJ+Sn+36NXPsAwQlbyMWp7y5R/JBH" + |
|
759 "zHrQmpEp6uyyyYqOFA4QIWW4RhBW30gABmq+Dc9qqEUyVjRd+8RXf1Qvin7F" + |
|
760 "tD0cTAOl2UISjI7Z7JexkSFBcS1uEEgG2SkGYycFa3TapP2PXEdL77pN+FJ3" + |
|
761 "tuefmxbW4UaQq5xDr59BmhJ6bZ887I6vwi1t5Q2rqTNRxZjePkCqhtZSV0E7" + |
|
762 "JfWxMEPxxzJz5e4/PMMdMUeN2lG45WAbdJuWYsuC7gb3gVmtCkSyTJcF0Xos" + |
|
763 "Uh/jsWbVPsDWOle55iWepn7i0HBUQONI0iv/BLFTbU1+19frmpB6MEmV+t+P" + |
|
764 "cUeiVWy2uoRXXJiZgZ6uWAPtSedlFNO3DGCl6a/POkU0OBvW5UpVlpVAJ2qt" + |
|
765 "qXbBz3OYJ5eOS9xqRpdvqtkzIB7eXO+2Icxq281+M6Ug5PFRgyLpk20RXkyR" + |
|
766 "PEqmjBnTkR8Ku2B2F4SvQJsKK3dxjGdxwYr9+3ReS69grg4/4WtbD4iVf/lE" + |
|
767 "G/UrIyW4nCL3/k0y2LL/pdbCPsoT3kSLvtNxKF7sFnLxvxvPxGMvYpnGyE9s" + |
|
768 "UeOtPY5LsIjRX3eMuT+msI8fPrlOcZ2ejz5FRYvvChBxB6o9w9ybZlxx0SUh" + |
|
769 "1yqqW+hjCY0bfzaOxEVs8ZfGKgfS16AVN0sArOBdS+FhK3zKSAubqx4IfZ0y" + |
|
770 "luFVMPAGUUo558vyGZNhmW6U1FJczZWz+yFOZMcH9Y21GRkE+JKnBIEY+cuM" + |
|
771 "RolrU0Tzj3USUC8xazB6ipNZNKepCCzcRy+B8ulGVeaZHFzVLe+yt1zPvFOJ" + |
|
772 "BQOoGDe9ZDsqo1QJHxTh7eaEWr8hMfLs5bDanrN8mBjhom+1Ni7RQEg7qtbf" + |
|
773 "kWd6RdB5gDEZDeFNP/16n1dFf1M/lLYfKWUuYLXueOX4s3dFFAxyKqy9NXVk" + |
|
774 "X7/s+d9XTQfIax6Zh3SH5YF47yddlysYZu/HjhaO31yq1+hBLQgeBEl91vnT" + |
|
775 "Qg6DlMnh36Vpsfc36UqKo/97LMioJq+4vViL2CqMlTboeepvgOMjdm0VfPn1" + |
|
776 "cN0ithvdPi0pOPjArFjhcsdF2I9qQpQCPfC9n4xpaz1E1PQpek5x/LqueH8F" + |
|
777 "UgiOGoUZWSdRaFjXu9KPP77mayqTT8SnCx0flb0E92mEpI4P4zq58/nOnVWN" + |
|
778 "uGcOZ7AqZRwIfIHJSMlXgaHQGg8YDoDXJKgp28fZZzESjzEzKlE4zwQyyAFe" + |
|
779 "jQSXjRexLS9YqWpWaIFaVaNy6b3zIohOjLMWATB+OeuR48JfUKIsaBUz+HdA" + |
|
780 "Y33pgtJsb4tmC99SeS1sBfZAw3hUYWUE3y24+u6lRdw6AX3SvfhC5Vc8qVt7" + |
|
781 "+GFWGlOH9MdHYcoNxPpB3N0HqQYZk5uGgcTgHneJ3oq9QLRzURvzjEupTzI/" + |
|
782 "z36YZRA9vm+TgWoCrhUH2/52vJhKgjOY4usDvJFfEUWHv61fOAxzy8wLgu5v" + |
|
783 "NXBX8ABR1txwpN08BCs1I3aoODlTz/T/WwPNfGptkP1sQ4PgHxJdCQsvi5WM" + |
|
784 "L2sBq/ZmIf2SVNQaRI7MkeS0z3NdnqxzY+8wTVjQVZG0zbpNpg1G9fEk6Rkk" + |
|
785 "wV0vHEGXnZJ3DXTzMexg6NSyE3GXMJHa9J2fP4lMuKc89XtGaA+CU28RgbkE" + |
|
786 "Zs+Mlbu0YNvk7JABJ/UHxf8UNJY9YG5BdUvJbElrbajWnllEaRauDzjnvjkZ" + |
|
787 "U4Uw4fdHmzpu0PUuM9Wm5UusD5lZfj0Xng+XO4Kea9RheukO7CCf01jZuFlu" + |
|
788 "Xgbi1tbOkkVA0AvWbnp2Dv59O75kaaVq4kBJB1SxUFb2DTvHTA2b8NYEfeis" + |
|
789 "eVIiKNW9fDMJbbmwySQftx0SRcrKbCloN8q7RAzmewiyVBtCI8a5CNw3qtEO" + |
|
790 "RjZYDPmLXaFU+uc83/dIMh3jnJcbZyUvt/X1NMsrF+sSonKepfVhq4mtO5XM" + |
|
791 "lQGTY5Wyl6ytdlMbK/vwp4MsZXFsAzP85AOpEI9cHUnlYM/Q8YTMeLZt60hD" + |
|
792 "Mqq9SU0USmvqbhteriLTuTczrsaebhXHsPbdcq1zopsOtA03q2hyQPebYWP5" + |
|
793 "x79K6lUVxOar3JvnguVfyOrDBPRXDphI1Ew5g8dlGP5OoOhGWT4/S4OEIa0K" + |
|
794 "32dRruB7A/F31osJeK8J2pvoosZzLpxh7nyU3Jyc0c8uuQqj+1NiGvERfV9W" + |
|
795 "a2UkCOHaLwmNRb43ifkYIW9R66mL3Mu+hWo3aXfDriYxZHG61blhFYNDxkUf" + |
|
796 "qx3BlDmcjbWae8v6G/JI7mEK0XKRI5Z4NgheSSY7VBnj4nQRRht5efUq1TWt" + |
|
797 "OpK4Ws29BRhSfgd7DtpVS9zSW48JCfxGTuNHHbXzSWrLSAU0OX42ycv74gm0" + |
|
798 "Nv7XeLzs5Bp79Vkc/YZRxGa65h5AfQzKf001czPofnw58fHa6WUqD5m2pEBC" + |
|
799 "0fC/YSIpV7wJfUBuj/JlWGiwAkWpkQihq7mW8GcxUTk2nLLrBbWr4X8QBdXZ" + |
|
800 "s9dA11UTul6nVzGnFDrWRbHgcAmU4bxSEsMYL31tGg/jMKPx6blN/M3I+KKN" + |
|
801 "U+9y1Arn/36z471rKz6Xgo5bP4qbRxLArWnmV4BpB14hL0JeQJaqJtFuNIxw" + |
|
802 "+y04cXQjdHxmjluTC5F4hViPS5rY5+AM4C7IqR8fjmC/pLNhWQsnz3/rH2Ax" + |
|
803 "3zPs0E3vdeZl3JRMUeWqRYLQuF/Q38u08/8PthUhYyT978xWJ6+t9rrC2iS0" + |
|
804 "QbRNvmqE1TuROy3JcLz8ig4Ryo6thY7tKnKuRFmbBQHWk+43yU5hUqw2H3hX" + |
|
805 "roIYd9NqTeImqfesegSnRpSBnOnFQLRkI8KZOIQeyYzKOWVJQw16xwSX+PdU" + |
|
806 "4hc6pA6+pIm5k5KO/UzJGmWpzpH1HyHuSIjhLi/zRGBHOXPZHLtTHjQO0fZs" + |
|
807 "WH1QcmVrrrRvHhTXzKqKsQRfKtkgjQRCJtNIB5tQjWfwNgW4Lu0psB3x0sSL" + |
|
808 "GnKm+BKjgE7HMApctusBLXNwplxsp8PYyZOiQeL+6v+iUCDLDLI5Tv6XIONW" + |
|
809 "GzxU6SAAcVhJ14gy+95ptYSdc9YioUHvAgcletAy7oWdnpIliUfmlOELyvZF" + |
|
810 "kpixQDAyNSVUUWxGsad4dwYRv+Q57WMWkDQB/WfkBfqK6EO0DQg0FvJSQ2Ij" + |
|
811 "Fj7O4vOPDyXt/ir1QUxfELactILEpBTf0UUgIJAjcnAI0waPu9fN/619eo7V" + |
|
812 "VH8Wpk3HUU9LjOIIDC7BAPPTE2xDa3kAG9VGweIXpL6YyW4JnAVSkou1pZWt" + |
|
813 "CW05eMRe0HkDpEJb4iz/UHn2KII4ZjJaFUgSWgNDRiHRvMoW4tIImHuI4+Y7" + |
|
814 "rokPlAlmO8yEnsLyBVgiPr51Sq9RWPCL1y3bryOfUoGFc/cozQ1csN02Mncz" + |
|
815 "YeSbbwt0toufO1ex/gfsiteqRgZvSIn91yMsFl7lzEi3kyJIhW7hBrPDfAHm" + |
|
816 "TZ5Czrcs1z0+JKfU1PXcuaRm/Bw+OY/1v8Z+YYKIynupdgnLCY8LfruNzk5S" + |
|
817 "e/mT0UwgtoJE+TvceiYGTw+Rkf0a4jZiTEcs3lF/IRvIOnd/+5m1eeWtGJp+" + |
|
818 "z6rlPrlRWjrhl4Ufqxob6U5jjY1/7zAMV6Ge7RgkNJiRy0Brb5+phAHpkajC" + |
|
819 "I/q4m/qBBm+gqRrfmFvPfo1CeijfMelIXMh3+p628kWGpIAypU3ocEcVcXXG" + |
|
820 "B+K/n2zyfbBQtMQ+MEUurRbn4G90gyRaHKgf3SuQSM53c+OVfJGXhR4Gtki9" + |
|
821 "NF3kCMt3wiGXi+c25NEs07LZ+xWfLeK0/0IrAHCmG8IcoO6T8pujgZUEyIHv" + |
|
822 "9Za/9vrvP72UlQ4+z6yUg0RNwlHgWN2nF0xnTQZXySXaoAaqwGA8HetCbx7s" + |
|
823 "ePd+VFl1/gApyxeGhWFTf0d3YiBLRCqvdFCsKrC/ni7aIGgbpuvjxmHiTAKa" + |
|
824 "Jaick9xE7a13b2pY557OVq6ExqRiC3c28z4YuKXfJf6IIeBug1HY9yEnjU37" + |
|
825 "eqNJL/XbyImo55ARAH61MwL1RSqu7uWJDui4GKCOKC+piqOwLDjSx8AyRVN8" + |
|
826 "zbsTxKtN0N0AUBqstlxgrfbV3/BCqKSQHCaqlg0Nrzk0T53RZEHyNv16qtr2" + |
|
827 "iF45GMDj3k/lP/NLU4DQX3R0zx1dQirSfUr0PJGxZdwnfHFzSZ7o5YaAnqdW" + |
|
828 "j8t4DGsu5wdktDOfqRsXrX3eKmeps5ycRBKTUgPhoccH+PFtMXYjkTH49aW4" + |
|
829 "hKgnJd5I49A5o/Vdd5Z3zNFF7eSUsMFA6pYxXOy4/wQYpu8vqmYBs5p/WBM3" + |
|
830 "wJkp0iLaEsEvJGSRNjbyuhV+N16GamJVIQVk0X2HvzKVtL1cHHN2f9BkFbFC" + |
|
831 "R2iW/I0ZFz/OECDOnlS1Ea/jGXuEIOB2+4O/Fki7kQ1opkc5pB5ehMMCetXP" + |
|
832 "cPJrEyyQJXsG0ZiCmr9RtGoEKG6lfvNxFWBtXHjXrFXjZ/KRZi7BS6ZPIRb+" + |
|
833 "YER6V8tyLNkL86xTjkm1oq9+opihDSf2+dve/u3YFooowsleeNynMVEyEPo2" + |
|
834 "yOLB8FO/l60qpSOSrepG6kS37ifjrv1piMyqLxz9EWP33jG0ajCEj1hAoke2" + |
|
835 "5uLFL0xaYT5Hbb3SPD6E5Kwm3GrP53VMGpzxFb3WirP2iW1pSLH5ZwBSiiJa" + |
|
836 "awGW/1JAZ/AemOroG1jpFXYG30euz9cj1ha97GagqGgaklIQGbGejqj1lu7/" + |
|
837 "H8Uu47sdFxrQTbs0enJEr7iZdOWHb/Gk1u6X2+1d1+2ifn5k4dd2QrKi4lKZ" + |
|
838 "TnzU6InfbE6wl7kblSGnvxG5CdMs6vfcs1VQHbahPxyZ1ci7h3Yda6MV1xNv" + |
|
839 "8gru+cCbr/x6v0L0L0rjSg2ZwFq+UCexc8t7ONv6y6KhjbUgGmy15GthHqYQ" + |
|
840 "/wFMIeobeq7yd04vUMhsvSxfXL54RECwu0Wz9OXfPU8yGdLiUqGDlVM/lrCF" + |
|
841 "H7zdSU+XKqOoxA/Wb8zayXZehYRQqnDVlJzA39Sp4KtPQdIapZ42ViJ8SWXI" + |
|
842 "sgtztW588KRMxjtMxpIj5eKucFr9bqfYsaYU74t3JQUIeWrKMEGlftBrT5Tn" + |
|
843 "BIPhOlTSMWe3pWOkJP76uUm/mqrz/LirLgzKrMpsw32eUSQsizWwXnC2a9pf" + |
|
844 "VQcqDIQBgIRxI6bp4U4IQIhCezOhZe+02pt/R6el4fvDyhGh2sjcUyt50XHa" + |
|
845 "tobMMkNVoQTWm1UUJpRB5n0CbtXDRkB54kL7IYlhsZVBYQqDMihNbTvcGfUE" + |
|
846 "tz+Yw405OdLawX5VpV4azSeXxncq4LlHgE23JKIpZjnQ/ueb8c/6EUyfn1u7" + |
|
847 "4+lGsqIK87fwPrGP6tgozyo8e+uzYl2wIKjL3p1ypi9IJodtMtQJT4Aw/Nyk" + |
|
848 "d+fB2zS7h54vyh9XJBqXBlyBJTDoevGxACfCZMOagdR4kmysiWUEqcaPSslx" + |
|
849 "9is9VTALHRpN7LeKyTnPnMzFb1otJ+tYncqtvaP0I8hRgtWHsbiBqpjDUZxF" + |
|
850 "nOXaXzbuYdEV2rzcQ9msOCqejRctklNVGwrFdqEKUeOV4QwwGJv6wb6rRYaB" + |
|
851 "qXB0/8CEkoNYOC/VU668RDOkwTFd12w/9TOgr88DHX0dN0OHLKa7/xzNji1k" + |
|
852 "OVkQcT+Bcrqr2pUWkic30U+YU7mJSC49tssKTROJ6SM6m25jou/0YuuYTge0" + |
|
853 "S/bn+Th6Y7YJ79eqvmG2OneqcCwE+SzpehGo/LeROeBH5w3rGTcl2qcxvRf1" + |
|
854 "SyyJ5aGlh6fseWgcO1NW2oLr+ih6JCpDf4vRcYjdaZysmzB9y5kLOY3rPQbI" + |
|
855 "OxqaO1KshMb3fGJIcK53lZBqHQfqQ7CgeYotq2OGUmKzr2BVmkah+YIMUrRE" + |
|
856 "xVGSlMzJyDABEE5cTBvcmq8MJvTdFeQrOHkAHJ4Y10v0rb01hGkvJbSUq5a9" + |
|
857 "B7f7ulZPnYpWmJZ8iDPs2eETUH/fm/a+B1i2kb7QCs50zGfp6grwmwMb7fd2" + |
|
858 "DEOkjXS6VEOfnzS4jlNhBfGRD0GORIjRCI2arB1hjQvthLU14Q03ZetymTXE" + |
|
859 "dMml0i+t7wNhESkAMwvfqkPrG72sg32w8yCKh9zE7YATcElTAobdxR9aU8ei" + |
|
860 "ulXgMb/PnC15/SZTvGzK4E5FGjRbRYx0ZJsQYpdzx4D0L/Yx0BEODfIdbXDV" + |
|
861 "kSRMtltmWx+88xlqzN28I43ezoe/8rU7WzQvJLs/9N7Ud9JS6H2pHJxqGYQs" + |
|
862 "3Sk32tnWjIk57PXk/++6IwsGonmalUSP53cILKDerkkj8LkOtbCSdmQu5uTb" + |
|
863 "dXdxM6Yo6nHStyJyHZUz52qDbZruVnBLS2HXjG0LOBNSU80jbkNzJ9+uSr81" + |
|
864 "bsHaUlIsq7Wksrv1pfNIz8ieisEJnk3FE6nitwh6w5RYF7Kl21a1vEPQUipZ" + |
|
865 "hfPBLGel0lBmBb36va4ge0nketjV01j4lBStIg5c6c+V00gwsu3/Aj+EaMy8" + |
|
866 "jDW1nle5f1wG6KQxAqLo78BIOojlyQjR1rAbPS+rvxTjirQ60LEPeyEnljmG" + |
|
867 "xVnGGliSrnlRuI5KAkQxLCUEQTTFy3Dj+1NAUkx4Xoi7ARsfvj0L7T36wq0Y" + |
|
868 "+aFViAoYfBXqNqf5vLbXo8hcKIkfvUf5b90ivNPnQx/nUH6LsSaDAUEpR3CR" + |
|
869 "8c3iNn7BURwoIjtAz3NfEgsQRYbyQIb4hgCODp2tnhl+GK1bKvkgnbRoxyCJ" + |
|
870 "XsK6Ka9lLK6TGP2AG7zdJIBBvWF4yCsNdF06qYuN32L0t4OOP6cRMowDchoY" + |
|
871 "vwXr9KWAvAc4Kq3KnwwUDPTISLp33n9LFItdgZNZeMjZ3hi7mSisMB4lK0lX" + |
|
872 "L4T3G/GNH+sYKgS17BRU1Dw/Bmt9LGOmQIFLsKErqIV+cXsBLlNiuC5lzl5Q" + |
|
873 "W3DTNJhErd3vaecEAJJlTfSjSQ9PLy7nDLv/RjzVKNgXSerqfuiM05McEm40" + |
|
874 "g6jQDRalN1alU8Cz3GLRjsfNGdYTsh/jPD4+ZiEqnCJo7VMxs+kb38etoTlz" + |
|
875 "Zs3hoJKH3euds2uSSGn1yPYb7J4QkG0toLIydkwAvMMdIhwQ1VN6bU8cYGax" + |
|
876 "FtmaugxN+n+00lb2Rbpdp+yVchdeNx1Yal30XPugP7x1OrVAZw5InTNCU9zQ" + |
|
877 "Fx8ria6g4+t1GgwBqmPi1noSHHG3bThI74oBTsg3L4esRW27OMrTTzYVNemt" + |
|
878 "dvJXN8yedTY2rVqwbKJO7bGR2VcDDn8ZgoaPBIvQuLSRBIdbUSIeKuLiuHbK" + |
|
879 "IbkwtZTyz7LvrE1SZ0oDpMf19pb9fZPi3v7yQpFLx0oqqSYdhrJyOfhNVZXU" + |
|
880 "dc4vbE0qez8MX9PNmyMtt4yktA+FC+2FM4P9jjdvaIfdm2Q7NhxjffvuwBJW" + |
|
881 "SIoHBSEmxfxZgGCo29pOy2TZt/VpU8zpGpRBaqx0F9L2YzRJgwgOTYbkhF4w" + |
|
882 "w1w03jCk3UWEg1Eq6kr6ZOEY3Us8DLTnx1RGKeGEpJ/vqtKzX1+KJS1t4E5G" + |
|
883 "3eqa7WUqcyNqII/9ShMZqdfmXj1llgfuD+31HjDXXVO8RFY2zG/OneMkJJP2" + |
|
884 "WfCs+IyN0I1+u/UJVMVW1d9y09nbrjruXSjvI2NwALB8NgtTHYbu3aLi0c02" + |
|
885 "ijIB19xcNdSjwsmpR87lp9VFqIGEPVcYb+E11OODliUPNRPig6kPcbzGGq4b" + |
|
886 "2CmbVVjPURU0U5cXJv0jqxGl8C7AsDIaJkXwGvQlp0t2wL/Wl66mAqBCQmJO" + |
|
887 "Uw3A7/NbqGbhky8r4XMBBk0bOBn2jUIXyfJG696QPR27NrMshZRFG8fKmRfm" + |
|
888 "4inNQQtcu6uUOKcoppeghWHBkK134LCFJakVrgmo0QeUXvdlR79imF9iyFDc" + |
|
889 "Z6Fayr5Mh0RiDS0DtI4E4k17OVTjPYenflXCSk5VDCN8kM8d34wQEX2lahR2" + |
|
890 "oWTBvJAFrvMqBL3zjnzjnNavoVaMlJy/Ezjrr+vNraCbNSY69Icflfb0xUEa" + |
|
891 "RsdADuCKDVXoAavcUKw9aXBTolmHvquBBnUsyi630i2mONUg7ylqJCvCTCGk" + |
|
892 "EDq48TofcRnuafZt38iwv5PRmRkhnMSGLR3L5AxjCAnSAUvqKPytH4QQ7+PJ" + |
|
893 "NHc5qetzZdz+jRkCdCnC5YonOWyzi5I20U3Cdl7pL7Ev5INyk8knQLY2a88f" + |
|
894 "9cUiV5kwPTAhMAkGBSsOAwIaBQAEFM74e0Rbt2IGCAn48XjvdAcaIl6cBBSY" + |
|
895 "pFDCs7BGKfo6O4hW9fB0/2HXqwICBAA="; |
|
896 |
|
897 // You can use this method to print the java code for the BASE64_CERT |
|
898 // constant. It will open the keystore file provided as argument and |
|
899 // it will Base64 encode its content - then print the code that you can |
|
900 // cut and paste back in this test. |
|
901 private static final String encodeKeyStoreToBase64(String keystorePath) throws IOException { |
|
902 // e.g.: keystorePath="temp0.jks" |
|
903 try (FileInputStream fis = new FileInputStream(keystorePath)) { |
|
904 byte[] bytes = fis.readAllBytes(); |
|
905 String encoded = Base64.getEncoder().encodeToString(bytes); |
|
906 format("BASE64_CERT", encoded); |
|
907 return encoded; |
|
908 } |
|
909 } |
|
910 |
|
911 private static void format(String name, String value) { |
|
912 System.out.println("private static final String " + name + " ="); |
|
913 int start = 0, end = 60; |
|
914 while (start < value.length() - 1 && end < value.length()) { |
|
915 System.out.print(" \""); |
|
916 System.out.print(value.substring(start, end) |
|
917 .replace("\"", "\\\"")); |
|
918 System.out.println("\" +"); |
|
919 start = end; |
|
920 end += 60; |
|
921 } |
|
922 if (end > value.length()) end = value.length(); |
|
923 System.out.print(" \""); |
|
924 System.out.print(value.substring(start, end)); |
|
925 System.out.println("\";"); |
|
926 } |
|
927 |
|
928 private static SSLContext createSSLContext(InputStream i) { |
|
929 try { |
|
930 char[] passphrase = "passphrase".toCharArray(); |
|
931 KeyStore ks = KeyStore.getInstance("PKCS12"); |
|
932 ks.load(i, passphrase); |
|
933 |
|
934 KeyManagerFactory kmf = KeyManagerFactory.getInstance("PKIX"); |
|
935 kmf.init(ks, passphrase); |
|
936 |
|
937 TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX"); |
|
938 tmf.init(ks); |
|
939 |
|
940 SSLContext ssl = SSLContext.getInstance("TLS"); |
|
941 ssl.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); |
|
942 return ssl; |
|
943 } catch (KeyManagementException | KeyStoreException | |
|
944 UnrecoverableKeyException | CertificateException | |
|
945 NoSuchAlgorithmException e) { |
|
946 throw new RuntimeException(e.getMessage()); |
|
947 } catch (IOException io) { |
|
948 throw new UncheckedIOException(io); |
|
949 } |
|
950 } |
|
951 |
|
952 static final byte[] DATA; |
|
953 |
|
954 static { |
|
955 DATA = new byte[1024]; |
|
956 int len = 'z' - 'a'; |
|
957 for (int i = 0; i < DATA.length; i++) { |
|
958 DATA[i] = (byte) ('a' + (i % len)); |
|
959 } |
|
960 } |
|
961 |
|
962 final SSLContext context; |
|
963 final AtomicLong requestCounter = new AtomicLong(); |
|
964 final AtomicLong responseCounter = new AtomicLong(); |
|
965 HttpTestServer http1Server; |
|
966 HttpTestServer http2Server; |
|
967 HttpTestServer https1Server; |
|
968 HttpTestServer https2Server; |
|
969 DigestEchoServer.TunnelingProxy proxy; |
|
970 |
|
971 URI http1URI; |
|
972 URI https1URI; |
|
973 URI http2URI; |
|
974 URI https2URI; |
|
975 InetSocketAddress proxyAddress; |
|
976 ProxySelector proxySelector; |
|
977 HttpClient client; |
|
978 List<CompletableFuture<?>> futures = new CopyOnWriteArrayList<>(); |
|
979 Set<URI> pending = new CopyOnWriteArraySet<>(); |
|
980 |
|
981 final ExecutorService executor = new ThreadPoolExecutor(12, 60, 10, |
|
982 TimeUnit.SECONDS, new LinkedBlockingQueue<>()); |
|
983 final ExecutorService clientexec = new ThreadPoolExecutor(6, 12, 1, |
|
984 TimeUnit.SECONDS, new LinkedBlockingQueue<>()); |
|
985 |
|
986 LargeHandshakeTest(String cert) { |
|
987 byte[] decoded = Base64.getDecoder().decode(BASE64_CERT); |
|
988 context = createSSLContext(new ByteArrayInputStream(decoded)); |
|
989 SSLContext.setDefault(context); |
|
990 } |
|
991 |
|
992 public HttpClient newHttpClient(ProxySelector ps) { |
|
993 HttpClient.Builder builder = HttpClient |
|
994 .newBuilder() |
|
995 .sslContext(context) |
|
996 .executor(clientexec) |
|
997 .proxy(ps); |
|
998 return builder.build(); |
|
999 } |
|
1000 |
|
1001 public void setUp() throws Exception { |
|
1002 try { |
|
1003 InetSocketAddress sa = new InetSocketAddress(InetAddress.getLoopbackAddress(), 0); |
|
1004 |
|
1005 // HTTP/1.1 |
|
1006 HttpServer server1 = HttpServer.create(sa, 0); |
|
1007 server1.setExecutor(executor); |
|
1008 http1Server = HttpTestServer.of(server1); |
|
1009 http1Server.addHandler(new HttpTestLargeHandler(), "/LargeHandshakeTest/http1/"); |
|
1010 http1Server.start(); |
|
1011 http1URI = new URI("http://" + http1Server.serverAuthority() + "/LargeHandshakeTest/http1/"); |
|
1012 |
|
1013 |
|
1014 // HTTPS/1.1 |
|
1015 HttpsServer sserver1 = HttpsServer.create(sa, 100); |
|
1016 sserver1.setExecutor(executor); |
|
1017 sserver1.setHttpsConfigurator(new HttpsConfigurator(context)); |
|
1018 https1Server = HttpTestServer.of(sserver1); |
|
1019 https1Server.addHandler(new HttpTestLargeHandler(), "/LargeHandshakeTest/https1/"); |
|
1020 https1Server.start(); |
|
1021 https1URI = new URI("https://" + https1Server.serverAuthority() + "/LargeHandshakeTest/https1/"); |
|
1022 |
|
1023 // HTTP/2.0 |
|
1024 http2Server = HttpTestServer.of( |
|
1025 new Http2TestServer("localhost", false, 0)); |
|
1026 http2Server.addHandler(new HttpTestLargeHandler(), "/LargeHandshakeTest/http2/"); |
|
1027 http2Server.start(); |
|
1028 http2URI = new URI("http://" + http2Server.serverAuthority() + "/LargeHandshakeTest/http2/"); |
|
1029 |
|
1030 // HTTPS/2.0 |
|
1031 https2Server = HttpTestServer.of( |
|
1032 new Http2TestServer("localhost", true, 0)); |
|
1033 https2Server.addHandler(new HttpTestLargeHandler(), "/LargeHandshakeTest/https2/"); |
|
1034 https2Server.start(); |
|
1035 https2URI = new URI("https://" + https2Server.serverAuthority() + "/LargeHandshakeTest/https2/"); |
|
1036 |
|
1037 proxy = DigestEchoServer.createHttpsProxyTunnel( |
|
1038 DigestEchoServer.HttpAuthSchemeType.NONE); |
|
1039 proxyAddress = proxy.getProxyAddress(); |
|
1040 proxySelector = new HttpProxySelector(proxyAddress); |
|
1041 client = newHttpClient(proxySelector); |
|
1042 System.out.println("Setup: done"); |
|
1043 } catch (Exception x) { |
|
1044 tearDown(); |
|
1045 throw x; |
|
1046 } catch (Error e) { |
|
1047 tearDown(); |
|
1048 throw e; |
|
1049 } |
|
1050 } |
|
1051 |
|
1052 public static void main(String[] args) throws Exception { |
|
1053 System.out.print("The certificate used in this test was generated " + |
|
1054 "with the following command:\n\t"); |
|
1055 System.out.println(COMMAND); |
|
1056 String cert; |
|
1057 if (args.length == 1) { |
|
1058 String storeFile = args[0]; |
|
1059 System.out.println("Parsing jks file: " + storeFile); |
|
1060 format("COMMAND", COMMAND); |
|
1061 cert = encodeKeyStoreToBase64(storeFile); |
|
1062 } else { |
|
1063 cert = BASE64_CERT; |
|
1064 } |
|
1065 LargeHandshakeTest test = new LargeHandshakeTest(cert); |
|
1066 |
|
1067 test.setUp(); |
|
1068 long start = System.nanoTime(); |
|
1069 try { |
|
1070 test.run(args); |
|
1071 } finally { |
|
1072 try { |
|
1073 long elapsed = System.nanoTime() - start; |
|
1074 System.out.println("*** Elapsed: " + Duration.ofNanos(elapsed)); |
|
1075 } finally { |
|
1076 test.tearDown(); |
|
1077 } |
|
1078 } |
|
1079 } |
|
1080 |
|
1081 public void run(String... args) throws Exception { |
|
1082 List<URI> serverURIs = List.of(http1URI, http2URI, https1URI, https2URI); |
|
1083 for (int i = 0; i < 5; i++) { |
|
1084 for (URI base : serverURIs) { |
|
1085 if (base.getScheme().equalsIgnoreCase("https")) { |
|
1086 URI proxy = i % 1 == 0 ? base.resolve(URI.create("proxy/foo?n=" + requestCounter.incrementAndGet())) |
|
1087 : base.resolve(URI.create("direct/foo?n=" + requestCounter.incrementAndGet())); |
|
1088 test(proxy); |
|
1089 } |
|
1090 } |
|
1091 for (URI base : serverURIs) { |
|
1092 URI direct = base.resolve(URI.create("direct/foo?n=" + requestCounter.incrementAndGet())); |
|
1093 test(direct); |
|
1094 } |
|
1095 } |
|
1096 CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); |
|
1097 } |
|
1098 |
|
1099 public void test(URI uri) throws Exception { |
|
1100 System.out.println("Testing with " + uri); |
|
1101 pending.add(uri); |
|
1102 HttpRequest request = HttpRequest.newBuilder(uri).build(); |
|
1103 CompletableFuture<HttpResponse<String>> resp = |
|
1104 client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) |
|
1105 .whenComplete((r, t) -> this.requestCompleted(request, r, t)); |
|
1106 futures.add(resp); |
|
1107 } |
|
1108 |
|
1109 private void requestCompleted(HttpRequest request, HttpResponse<?> r, Throwable t) { |
|
1110 responseCounter.incrementAndGet(); |
|
1111 pending.remove(request.uri()); |
|
1112 System.out.println(request + " -> " + (t == null ? r : t) |
|
1113 + " [still pending: " + (requestCounter.get() - responseCounter.get()) + "]"); |
|
1114 if (pending.size() < 10 && requestCounter.get() > 10) { |
|
1115 pending.forEach(u -> System.out.println("\tpending: " + u)); |
|
1116 } |
|
1117 } |
|
1118 |
|
1119 public void tearDown() { |
|
1120 proxy = stop(proxy, DigestEchoServer.TunnelingProxy::stop); |
|
1121 http1Server = stop(http1Server, HttpTestServer::stop); |
|
1122 https1Server = stop(https1Server, HttpTestServer::stop); |
|
1123 http2Server = stop(http2Server, HttpTestServer::stop); |
|
1124 https2Server = stop(https2Server, HttpTestServer::stop); |
|
1125 client = null; |
|
1126 try { |
|
1127 executor.awaitTermination(2000, TimeUnit.MILLISECONDS); |
|
1128 } catch (Throwable x) { |
|
1129 } finally { |
|
1130 executor.shutdownNow(); |
|
1131 } |
|
1132 try { |
|
1133 clientexec.awaitTermination(2000, TimeUnit.MILLISECONDS); |
|
1134 } catch (Throwable x) { |
|
1135 } finally { |
|
1136 clientexec.shutdownNow(); |
|
1137 } |
|
1138 System.out.println("Teardown: done"); |
|
1139 } |
|
1140 |
|
1141 private interface Stoppable<T> { |
|
1142 public void stop(T service) throws Exception; |
|
1143 } |
|
1144 |
|
1145 static <T> T stop(T service, Stoppable<T> stop) { |
|
1146 try { |
|
1147 if (service != null) stop.stop(service); |
|
1148 } catch (Throwable x) { |
|
1149 } |
|
1150 ; |
|
1151 return null; |
|
1152 } |
|
1153 |
|
1154 static class HttpProxySelector extends ProxySelector { |
|
1155 private static final List<Proxy> NO_PROXY = List.of(Proxy.NO_PROXY); |
|
1156 private final List<Proxy> proxyList; |
|
1157 |
|
1158 HttpProxySelector(InetSocketAddress proxyAddress) { |
|
1159 proxyList = List.of(new Proxy(Proxy.Type.HTTP, proxyAddress)); |
|
1160 } |
|
1161 |
|
1162 @Override |
|
1163 public List<Proxy> select(URI uri) { |
|
1164 // our proxy only supports tunneling |
|
1165 if (uri.getScheme().equalsIgnoreCase("https")) { |
|
1166 if (uri.getPath().contains("/proxy/")) { |
|
1167 return proxyList; |
|
1168 } |
|
1169 } |
|
1170 return NO_PROXY; |
|
1171 } |
|
1172 |
|
1173 @Override |
|
1174 public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { |
|
1175 System.err.println("Connection to proxy failed: " + ioe); |
|
1176 System.err.println("Proxy: " + sa); |
|
1177 System.err.println("\tURI: " + uri); |
|
1178 ioe.printStackTrace(); |
|
1179 } |
|
1180 } |
|
1181 |
|
1182 public static class HttpTestLargeHandler implements HttpTestHandler { |
|
1183 @Override |
|
1184 public void handle(HttpTestExchange t) throws IOException { |
|
1185 try (InputStream is = t.getRequestBody(); |
|
1186 OutputStream os = t.getResponseBody()) { |
|
1187 byte[] bytes = is.readAllBytes(); |
|
1188 assert bytes.length == 0; |
|
1189 URI u = t.getRequestURI(); |
|
1190 long responseID = Long.parseLong(u.getQuery().substring(2)); |
|
1191 System.out.println("Server " + t.getRequestURI() + " sending response " + responseID); |
|
1192 t.sendResponseHeaders(200, DATA.length * 3); |
|
1193 for (int i = 0; i < 3; i++) { |
|
1194 os.write(DATA); |
|
1195 } |
|
1196 System.out.println("\tresp:" + responseID + ": done"); |
|
1197 } |
|
1198 } |
|
1199 } |
|
1200 } |