Sfoglia il codice sorgente

更改https接口443

chengjie 1 settimana fa
parent
commit
fdbba80476

+ 7 - 4
README.md

@@ -60,7 +60,10 @@ mysql -u root -p kylx365_db < doc/system_error_logs.sql
60 60
 可以通过环境变量自定义配置:
61 61
 
62 62
 - `NODE_ENV`: 设置环境 (`development` 或 `production`)
63
-- `PORT`: 服务器端口
63
+- `HTTP_PORT` 或 `PORT`: HTTP 端口,生产环境默认 `80`
64
+- `HTTPS_PORT`: HTTPS 端口,生产环境默认 `443`
65
+- `SSL_KEY_PATH`: HTTPS 私钥路径,默认 `src/ssl/kylx365.com.key`
66
+- `SSL_CERT_PATH`: HTTPS 证书链路径,默认 `src/ssl/kylx365.com_bundle.crt`
64 67
 - `DB_HOST`: 数据库主机
65 68
 - `DB_USER`: 数据库用户名
66 69
 - `DB_PASSWORD`: 数据库密码
@@ -91,8 +94,8 @@ ERROR_LOG_API_URL=https://your-domain/internal/error-logs ERROR_LOG_API_TOKEN=yo
91 94
 内部错误日志接口:
92 95
 
93 96
 ```bash
94
-curl -H "x-internal-token: your-token" "http://localhost:3050/internal/error-logs?since_id=0&status=all"
95
-curl -H "x-internal-token: your-token" -X POST "http://localhost:3050/internal/error-logs/1/mark-fixed"
97
+curl -H "x-internal-token: your-token" "http://localhost/internal/error-logs?since_id=0&status=all"
98
+curl -H "x-internal-token: your-token" -X POST "http://localhost/internal/error-logs/1/mark-fixed"
96 99
 ```
97 100
 
98 101
 完整错误日志采集和本机检查配置见:
@@ -109,5 +112,5 @@ doc/server_error_log_monitor.md
109 112
 ### 查看API是否能运行
110 113
 
111 114
 ```bash
112
-curl http://localhost:3000/api/Ping
115
+curl http://localhost:3010/api/Ping
113 116
 ```

+ 9 - 9
doc/server_error_log_monitor.md

@@ -16,7 +16,7 @@ PM2 error log
16 16
         -> SystemErrorLogs
17 17
 本机 VS Code / Codex
18 18
         -> SSH 到服务器
19
-        -> curl http://127.0.0.1:3050/internal/error-logs
19
+        -> curl http://127.0.0.1/internal/error-logs
20 20
 ```
21 21
 
22 22
 ## 相关文件
@@ -143,7 +143,7 @@ pm2 save
143 143
 
144 144
 ```bash
145 145
 curl -H "x-internal-token: 你的token" \
146
-  "http://127.0.0.1:3050/internal/error-logs/latest?status=all"
146
+  "http://127.0.0.1/internal/error-logs/latest?status=all"
147 147
 ```
148 148
 
149 149
 正常返回:
@@ -155,7 +155,7 @@ curl -H "x-internal-token: 你的token" \
155 155
 无 token 应返回 401:
156 156
 
157 157
 ```bash
158
-curl "http://127.0.0.1:3050/internal/error-logs/latest?status=all"
158
+curl "http://127.0.0.1/internal/error-logs/latest?status=all"
159 159
 ```
160 160
 
161 161
 正常返回:
@@ -190,7 +190,7 @@ cp local-error-monitor/.env.example local-error-monitor/.env
190 190
 
191 191
 ```bash
192 192
 ERROR_LOG_SSH_HOST=root@81.68.248.121
193
-ERROR_LOG_REMOTE_API_URL=http://127.0.0.1:3050/internal/error-logs
193
+ERROR_LOG_REMOTE_API_URL=http://127.0.0.1/internal/error-logs
194 194
 ERROR_LOG_API_TOKEN=你的token
195 195
 ERROR_LOG_CHECK_LIMIT=20
196 196
 ERROR_LOG_CHECK_STATUS=open,reopened
@@ -198,8 +198,8 @@ ERROR_LOG_CHECK_STATUS=open,reopened
198 198
 
199 199
 说明:
200 200
 
201
-- 本机不会直接访问公网 `3050`
202
-- 脚本会 SSH 到服务器,然后在服务器上访问 `127.0.0.1:3050`。
201
+- 本机不会直接访问公网内部接口
202
+- 脚本会 SSH 到服务器,然后在服务器上访问 `127.0.0.1:80`。
203 203
 - `.env` 已被 `local-error-monitor/.gitignore` 忽略,不应提交。
204 204
 
205 205
 ### 2. 配置 SSH 免密
@@ -311,12 +311,12 @@ ID: miaoguo
311 311
 
312 312
 ```bash
313 313
 curl -H "x-internal-token: 你的token" \
314
-  "http://127.0.0.1:3050/internal/error-logs/latest?status=all"
314
+  "http://127.0.0.1/internal/error-logs/latest?status=all"
315 315
 ```
316 316
 
317 317
 ### fetch failed
318 318
 
319
-通常是本机直接访问公网 `3050` 失败,或者 SSH 隧道方式未启动。
319
+通常是本机直接访问公网内部接口失败,或者 SSH 方式未启动。
320 320
 
321 321
 现在推荐使用 `local-error-monitor/check-once.js` 的 SSH 远程 curl 模式,不需要本机直接访问公网端口。
322 322
 
@@ -368,4 +368,4 @@ PM2 启动脚本时使用:
368 368
 
369 369
 - `INTERNAL_API_TOKEN` 和 `ERROR_LOG_API_TOKEN` 不要提交到 git。
370 370
 - token 泄露后应重新生成并重启 `app-24`、`error-log-pm2`。
371
-- 本机检查建议走 SSH,不建议开放公网 `3050`
371
+- 本机检查建议走 SSH,不建议向公网开放内部错误日志接口

+ 1 - 1
local-error-monitor/.env.example

@@ -1,5 +1,5 @@
1 1
 ERROR_LOG_SSH_HOST=root@81.68.248.121
2
-ERROR_LOG_REMOTE_API_URL=http://127.0.0.1:3050/internal/error-logs
2
+ERROR_LOG_REMOTE_API_URL=http://127.0.0.1/internal/error-logs
3 3
 ERROR_LOG_API_TOKEN=replace-with-your-new-token
4 4
 ERROR_LOG_CHECK_LIMIT=20
5 5
 ERROR_LOG_CHECK_STATUS=open,reopened

+ 1 - 1
local-error-monitor/README.md

@@ -20,7 +20,7 @@ cp local-error-monitor/.env.example local-error-monitor/.env
20 20
 
21 21
 ```bash
22 22
 ERROR_LOG_SSH_HOST=root@服务器IP
23
-ERROR_LOG_REMOTE_API_URL=http://127.0.0.1:3050/internal/error-logs
23
+ERROR_LOG_REMOTE_API_URL=http://127.0.0.1/internal/error-logs
24 24
 ERROR_LOG_API_TOKEN=你的新token
25 25
 ```
26 26
 

+ 1 - 1
local-error-monitor/check-once.js

@@ -129,7 +129,7 @@ async function main() {
129 129
   const outputFile = env.ERROR_LOG_CHECK_OUTPUT_FILE || path.join(dataDir, 'recent-error-check.txt');
130 130
   const state = await readJson(stateFile, { sinceId: Number(env.ERROR_LOG_SINCE_ID || 0) });
131 131
   const limit = Math.min(Math.max(Number(env.ERROR_LOG_CHECK_LIMIT || 20), 1), 100);
132
-  const apiBaseUrl = env.ERROR_LOG_REMOTE_API_URL || 'http://127.0.0.1:3050/internal/error-logs';
132
+  const apiBaseUrl = env.ERROR_LOG_REMOTE_API_URL || 'http://127.0.0.1/internal/error-logs';
133 133
 
134 134
   const url = makeUrl(apiBaseUrl, {
135 135
     since_id: state.sinceId || 0,

+ 1 - 1
scripts/poll-error-logs.js

@@ -3,7 +3,7 @@ import fsp from 'node:fs/promises';
3 3
 import path from 'node:path';
4 4
 import { execFile } from 'node:child_process';
5 5
 
6
-const apiUrl = process.env.ERROR_LOG_API_URL || 'http://127.0.0.1:3050/internal/error-logs';
6
+const apiUrl = process.env.ERROR_LOG_API_URL || 'http://127.0.0.1/internal/error-logs';
7 7
 const token = process.env.ERROR_LOG_API_TOKEN || process.env.INTERNAL_API_TOKEN || '';
8 8
 const stateFile = process.env.ERROR_LOG_POLL_STATE_FILE || path.join(process.cwd(), '.error-log-poll-state.json');
9 9
 const pollIntervalMs = Number(process.env.ERROR_LOG_POLL_INTERVAL_MS || 60000);

+ 25 - 3
src/app.js

@@ -2,6 +2,9 @@ import Koa from 'koa';
2 2
 import bodyParser from 'koa-bodyparser';
3 3
 import serve from 'koa-static';
4 4
 import session from 'koa-session';
5
+import fs from 'node:fs';
6
+import http from 'node:http';
7
+import https from 'node:https';
5 8
 import path from 'path';
6 9
 import { fileURLToPath } from 'url';
7 10
 import config from './config/index.js';
@@ -160,8 +163,27 @@ app.use(spatialIntelligenceRouter.allowedMethods());
160 163
 app.use(schulteRouter.routes());
161 164
 app.use(schulteRouter.allowedMethods());
162 165
 
163
-// 启动服务器
164
-app.listen(config.port, () => {
166
+const requestHandler = app.callback();
167
+const httpServer = http.createServer(requestHandler);
168
+
169
+httpServer.listen(config.port, () => {
165 170
     console.log('Server IP:', stringUtils.GetServerIP());
166
-    console.log(`Server running on port ${config.port}`);
171
+    console.log(`HTTP server running on port ${config.port}`);
167 172
 });
173
+
174
+if (config.httpsPort) {
175
+    const sslKeyPath = path.resolve(
176
+        process.env.SSL_KEY_PATH || path.join(__dirname, 'ssl', 'kylx365.com.key')
177
+    );
178
+    const sslCertPath = path.resolve(
179
+        process.env.SSL_CERT_PATH || path.join(__dirname, 'ssl', 'kylx365.com_bundle.crt')
180
+    );
181
+    const sslOptions = {
182
+        key: fs.readFileSync(sslKeyPath),
183
+        cert: fs.readFileSync(sslCertPath)
184
+    };
185
+
186
+    https.createServer(sslOptions, requestHandler).listen(config.httpsPort, () => {
187
+        console.log(`HTTPS server running on port ${config.httpsPort}`);
188
+    });
189
+}

+ 2 - 2
src/config/dev.js

@@ -19,5 +19,5 @@ export default {
19 19
     fontsPathKaiti:"/Library/Fonts/Kaiti.ttc",
20 20
     fontsPathSFUIDisplayBlack:"/System/Library/Fonts/SF-UI-Display-Black.otf",
21 21
 
22
-    port: 3000
23
-}
22
+    port: Number(process.env.HTTP_PORT || process.env.PORT || 3010)
23
+}

+ 3 - 2
src/config/prod.js

@@ -15,5 +15,6 @@ export default {
15 15
     fontsPathPingFang:"/usr/share/fonts/chinese/PingFang.ttc",
16 16
     fontsPathKaiti:"/usr/share/fonts/chinese/Kaiti.ttc",
17 17
     fontsPathSFUIDisplayBlack:"/usr/share/fonts/chinese/SF-UI-Display-Black.otf",
18
-    port: 3050
19
-}
18
+    port: Number(process.env.HTTP_PORT || process.env.PORT || 80),
19
+    httpsPort: Number(process.env.HTTPS_PORT || 443)
20
+}

+ 18 - 0
src/ssl/kylx365.com.csr

@@ -0,0 +1,18 @@
1
+-----BEGIN CERTIFICATE REQUEST-----
2
+MIIC9jCCAd4CAQAwgYcxCzAJBgNVBAYTAkNOMRAwDgYDVQQIEwdCZWlqaW5nMRAw
3
+DgYDVQQHEwdCZWlqaW5nMQ8wDQYDVQQKEwZxY2xvdWQxDzANBgNVBAsTBnFjbG91
4
+ZDEUMBIGA1UEAxMLa3lseDM2NS5jb20xHDAaBgNVBAUTEzM2ODMyOTA3OTU2MTY3
5
+ODM0NTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYp7KSu5CtmgLu
6
+vn4kAlredCg9bSy6zAFHHk/Y5u/MKoelFq0t0S8kAxbMLDn7aDAoiomd7Ob4ZcHe
7
+9J4sL+ZA9EgvhTa4BCz1rJoRPiP1iOIQFbJ5Ro5/Uawsbrg/uu5w6/I5rlw+YfVT
8
+kZ7SCcdkXSzwhWD1Wpan6eGlpP6lVFcPA+t3aFBDxjMQfRZAWPUFBirHfrpuJsP8
9
+zkYqhKmQ6q9FggQxGDTJJTtYw7AxHHwGLbFj3elSbgnVBfD9P+2KQbm6RTK7ITpE
10
+S8ZZt3WAgXNu0GXKqEe/xJBh/1WUXy8z5qP6jePH8s8A8PZzBigiLuyb44PrQsEE
11
+NIVQKzLpAgMBAAGgKTAnBgkqhkiG9w0BCQ4xGjAYMBYGA1UdEQQPMA2CC2t5bHgz
12
+NjUuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQDGCMyfjsDmq0nmyRhB5TWGD07fsf40
13
+0+4W7GfpjymCSHYNU4ijaAhncvRLvytxx7k4tGDJITwJtj0Lv3hfUUTQmBHiPDrA
14
+shcPRrtTavo5H7zL2ueAsn6ca4KHlVl2rU6URJ421WgtmK0Hu0ePKOG5LaVYHVXs
15
+i4Sk+fzOLsY88xSEuSi6Of4Jf3NT9rS4YvlMEurBhxKDc0e9zF3v9sievDfBCsGk
16
+QICHXUfNjlYc9U84BP/m0pQJ8ikfqdvEv1rRDrvHtRbAnPZEFmnHJ5gkMECZxgJt
17
+ABShZ7pqjx+98QKUj7cK2PYaEx3dTU4vTPIbJHN6CP0HPYo7Pbaat4hw
18
+-----END CERTIFICATE REQUEST-----

+ 27 - 0
src/ssl/kylx365.com.key

@@ -0,0 +1,27 @@
1
+-----BEGIN RSA PRIVATE KEY-----
2
+MIIEowIBAAKCAQEA2KeykruQrZoC7r5+JAJa3nQoPW0suswBRx5P2ObvzCqHpRat
3
+LdEvJAMWzCw5+2gwKIqJnezm+GXB3vSeLC/mQPRIL4U2uAQs9ayaET4j9YjiEBWy
4
+eUaOf1GsLG64P7rucOvyOa5cPmH1U5Ge0gnHZF0s8IVg9VqWp+nhpaT+pVRXDwPr
5
+d2hQQ8YzEH0WQFj1BQYqx366bibD/M5GKoSpkOqvRYIEMRg0ySU7WMOwMRx8Bi2x
6
+Y93pUm4J1QXw/T/tikG5ukUyuyE6REvGWbd1gIFzbtBlyqhHv8SQYf9VlF8vM+aj
7
++o3jx/LPAPD2cwYoIi7sm+OD60LBBDSFUCsy6QIDAQABAoIBAB+d+XVoYeizvRHS
8
+Qt5GabRlBypPsGNiOh2C0uw4Z25IFpuE/6jcCiEbQkxxd9S0k7KW5RZi6CH/15cN
9
+47dXFicMfyxQKHgaQ+VmVuWFSAIhA7yNLgp8vXbfGF0zmzfRs9JO3H6Gb3e7G+4i
10
+JidIvgxrfI9tJ4Umvy2p+AAQYAkITQ8Dn13jzhhmeholgVIPXqN88wH4aON2JflY
11
+qtEiVKWv+jc/tDwbAI7sMZfPU08nQUVumEQPOIpXACP3V+F3HQ4OPHB9Z5P2TxYl
12
+Xt2fR5hoaBIZRu7H6bkL/48SKg/9U8PmgKXWqSJofm9Eg9AmbCQP7BhtzBiD/AKV
13
+yTn6i8ECgYEA4ZPnBN/IZuXs1R5Eo2wjTLZYF6/CB4ycP0qRSbg1N2Nx+jNmJN1E
14
+hv+Ur6mFtmam3c7SYp4RLgbMUuTw2IKrS3efVTSzZTbU41dQCC1KszSY9M4GQB41
15
+C/58sCCRTydw+QzIz01RqkCT8ztsJZtzd8SDmiCvxkDx6u3ZXAEjdf0CgYEA9d+9
16
+HjotIokW3TvJbuEKD99yelXaLEy9+s5TkrjWaUpc+q+OBVd81CxeUR4/SL2mUpuT
17
+eRnBQl+qbYRHUI+XxxZLLCGEvRlJXfrj1u7pCFPUyAKBvdDiW1B97eDO5DaOZF+W
18
+e19qSqGPBD/tBInIG7BS/JpqVOQF+0c8+SJjjl0CgYAMkRPGprzgVqDKAqSqQgT5
19
+ahMgRq9VglTWBc5wP+3fBxA7cw+WsCj4KFbdLmF/ltpm8vWvfsTQPpq1Z4GvXiAy
20
+1RgwQ/5WfiZ//8Y6nmNR9nUq9itM+SHVaDkECtxtf3IAveCWA+WvyWc0nrPYqH9X
21
+RcBbHsUME2QmxVddk8ao9QKBgQCR2563Nc/csvKrX3JJoppzfBzPUerRaN0y0f9m
22
+BNy9LW4nEMnxhUr6GzAAcy8bmdX3H2/G4W5yT4os2dHsiqKBakpB7chu3XdWlyVe
23
+NfBsDj8mP8Zzslz1yrRJz5ksbOjfxozgt2O4zkqnPL0AejQJqPox+/CkV3js7f/P
24
+04S3yQKBgB8LjOGhWLX/eS7UUndIFfC9JUw9wlzzhkCWBJVRt/Gfl/Kj7n8bjG+o
25
+mDeFluce3IISUoaPQojX0Q0SHAXOzVuPvIJHAdiyehbN6GlZrh20HH/PBUScRbK6
26
+xB0/VvU9cpQzhIp8oOvB+y5wlw3Bm0mwOrC5tf0JCoCLBlsGpzLN
27
+-----END RSA PRIVATE KEY-----

+ 114 - 0
src/ssl/kylx365.com_bundle.crt

@@ -0,0 +1,114 @@
1
+-----BEGIN CERTIFICATE-----
2
+MIIHGjCCBQKgAwIBAgIUbXX7FPtG7ziSj+j3sB0t3jdreREwDQYJKoZIhvcNAQEL
3
+BQAwWzELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dp
4
+ZXMsIEluYy4xJTAjBgNVBAMTHFRydXN0QXNpYSBEViBUTFMgUlNBIENBIDIwMjQw
5
+HhcNMjYwODA2MjMwMDAwWhcNMjYxMTA0MjI1OTU5WjAWMRQwEgYDVQQDEwtreWx4
6
+MzY1LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANinspK7kK2a
7
+Au6+fiQCWt50KD1tLLrMAUceT9jm78wqh6UWrS3RLyQDFswsOftoMCiKiZ3s5vhl
8
+wd70niwv5kD0SC+FNrgELPWsmhE+I/WI4hAVsnlGjn9RrCxuuD+67nDr8jmuXD5h
9
+9VORntIJx2RdLPCFYPValqfp4aWk/qVUVw8D63doUEPGMxB9FkBY9QUGKsd+um4m
10
+w/zORiqEqZDqr0WCBDEYNMklO1jDsDEcfAYtsWPd6VJuCdUF8P0/7YpBubpFMrsh
11
+OkRLxlm3dYCBc27QZcqoR7/EkGH/VZRfLzPmo/qN48fyzwDw9nMGKCIu7Jvjg+tC
12
+wQQ0hVArMukCAwEAAaOCAxkwggMVMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAU
13
+YXUFThr1D8FgICDCKNmLs+LBfbQwgZcGCCsGAQUFBwEBBIGKMIGHMEMGCCsGAQUF
14
+BzAChjdodHRwOi8vaWNhLnd0LnRydXN0YXNpYS5jb20vVHJ1c3RBc2lhRFZUTFNS
15
+U0FDQTIwMjQuY3J0MEAGCCsGAQUFBzABhjRodHRwOi8vb2NzcC53dC50cnVzdGFz
16
+aWEuY29tL1RydXN0QXNpYURWVExTUlNBQ0EyMDI0MCcGA1UdEQQgMB6CC2t5bHgz
17
+NjUuY29tgg93d3cua3lseDM2NS5jb20wEwYDVR0gBAwwCjAIBgZngQwBAgEwEwYD
18
+VR0lBAwwCgYIKwYBBQUHAwEwSAYDVR0fBEEwPzA9oDugOYY3aHR0cDovL2NybC53
19
+dC50cnVzdGFzaWEuY29tL1RydXN0QXNpYURWVExTUlNBQ0EyMDI0LmNybDAdBgNV
20
+HQ4EFgQULjI5xNGlC4FNpKoPTD8QJVMW0dwwDgYDVR0PAQH/BAQDAgWgMIIBfAYK
21
+KwYBBAHWeQIEAgSCAWwEggFoAWYAdQDYCVU7lE96/8gWGW+UT4WrsPj8XodVJg8V
22
+0S5yu0VLFAAAAZ/ZkvxMAAAEAwBGMEQCIG1n8Dg6AyeB8Sks7W/sopSg33Wvg/+e
23
+J2CJh5QzTiNmAiAtp/XwXvuJi9qba/xosYvRSX3DDM02d0fj1PI0ny97jQB2AHTb
24
+nVj31H6d/Xh6FiqZHBjPaY2nxymRjJoYsEUNukS8AAABn9mS9U0AAAQDAEcwRQIh
25
+AOa3lHiMsSXlggSFmm6mOt/3306YzaS/pVXRngG/p6SIAiANtEHon4KuAfLuJCZ4
26
+b+BE5t0FYBPAnNmVN2Ajg8/gAQB1ANdtfRDRp/V3wsfpX9cAv/mCyTNaZeHQswFz
27
+F8DIxWl3AAABn9mS+IEAAAQDAEYwRAIgTYw8wYgsIlMjzPA1cQOCjgp9olEJ9eEg
28
+gPYXByDXcnACIAhl4fjEFMTCMIUsIo9+N2WkgMB7AICpUCj8iaEz/e2hMA0GCSqG
29
+SIb3DQEBCwUAA4ICAQBo3Fr9jsB88kGFLb9CR+ayqgq2m4WDzZ4ETVs/JfK1pfXb
30
+SWhAOAY87UhLMFGRjIgG2qt60zXWo1nL9R88cdM+dV1ps6wwf51Yhu1Tse7FqHRO
31
+PUa2x13dE75iZjrNsCw4zoP8dSD/Gk7PkF8MuYOJneS6gLLclbJA089MvZOhN2y9
32
+nD69PjpnqDLi/Arct13c78e60ZhuZA5KW2zrWK9AyXou0aQgbyoWdQvsstNs8NEM
33
+llVcLF30SQrFUrYdjCxoVZmOsN/42MVxdIkgQIKBsCh24a2mTV2dVOijAW8ALT1u
34
+OmTDY9wiFs99KyGN8DlZOVGBo3wXsiGRzlBArWi6b/GQcbtYBZf/qjGVaRVxDSkU
35
+P4kwphOb/A2ZZPfKTMpZn4LrQRd4S2T0QHr1CKDoYUhyOdNUhEGFZv+xMLm/8WS3
36
+LzLssAhfWqccvWVa2Bg5X9ExpR9fpbL5iWjl3uK9EYm6pPf9LEzVHPaJmgZUtff8
37
+ThxjNsafWOW8+g6q+dugQLBTkYP+lszpvQ9i29A6E4Fa4fMgbOE5sJrgbKAAZseo
38
+7So6aOnCs28TkrUcp+Np/N5qTvfPlFcO5UufW3jShTj0qTsuyH/rU8EstNR8wu2L
39
+P68Bcu5VlB+3YyVUJ/OqgzalK8RDD8C1wMkCrZ1QRMppV83qPzL2CLma6HBh0g==
40
+-----END CERTIFICATE-----
41
+-----BEGIN CERTIFICATE-----
42
+MIIGvTCCBKWgAwIBAgIUHJ5rQS3rCoVGHeA9vjCYTQVziIswDQYJKoZIhvcNAQEM
43
+BQAwWDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dp
44
+ZXMsIEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcN
45
+MjQwNTE1MDYxOTE1WhcNMzQwNTE1MDYxOTE0WjBbMQswCQYDVQQGEwJDTjElMCMG
46
+A1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjElMCMGA1UEAxMcVHJ1
47
+c3RBc2lhIERWIFRMUyBSU0EgQ0EgMjAyNDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
48
+ADCCAgoCggIBAK2GCKULRuSjgEhVn7j0cnfuSmrxS5/5H77qmOJwWJkMVE+SgBQn
49
+4mkoxVwF03E517T5YZZumwy5iCxktdnKp5Uq0C7td8yYnZgLb18pUeuzfkJBNWvI
50
+MccfeGCI6qdnl1nGv15loYjP0TEt7C9VyVrK+zmeTxdkBb5xP/hQPFVRWQROnruX
51
+gs7G1jbEX3Hhih+OR1dxcQkk7yVM493zuDVBBlNqH4KA/FawaGNcA/KRKHI0cqyT
52
+Q/GjthO3yyivTlu07/QGV5VTl2oor9ntyXdCmEktu0aKH3kOLRjBE5CiT55Gts7d
53
+1MBRwI3pAjLtDia4+Sz0XmPB/mH1/KO7EKtg+5XVZe3amDpboawWAS2oaKuDKWx/
54
+fh5AA0ViSS+8nDAbrxE4b/gPno28GZSG41VELtSxZvgA0T8lc1oBBywQc0BWfCC9
55
+PoSl2xSxhjKjJfY+od+EALfmEnEH3A53iK4z4gqpBo8O29omZ8HYxO9Tb5aemgla
56
+gP+8oWmxv6aZwYOpWHb3AqOxEoTMV0VwzfEqLsMGcP6koLCB51uPGu8kDF8PIpbu
57
+jallH/6K9QySf3S2H4SCme94tAjznz58En48PGoQPCSTDM6CyeEZqR3tEAnUF1gS
58
+4T+hkEiskHWLQ6QosxoFX2+qMMeQNHictf5O/ZPXvIv34yxE5kiiBWN3AgMBAAGj
59
+ggF6MIIBdjASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFLgHkXlcBvRG
60
+/XtZylomkadFK/hTMIGTBggrBgEFBQcBAQSBhjCBgzBBBggrBgEFBQcwAoY1aHR0
61
+cDovL2ljYS53dC50cnVzdGFzaWEuY29tL1RydXN0QXNpYVRMU1JTQVJvb3RDQS5j
62
+cnQwPgYIKwYBBQUHMAGGMmh0dHA6Ly9vY3NwLnd0LnRydXN0YXNpYS5jb20vVHJ1
63
+c3RBc2lhVExTUlNBUm9vdENBMBMGA1UdIAQMMAowCAYGZ4EMAQIBMB0GA1UdJQQW
64
+MBQGCCsGAQUFBwMBBggrBgEFBQcDAjBGBgNVHR8EPzA9MDugOaA3hjVodHRwOi8v
65
+Y3JsLnd0LnRydXN0YXNpYS5jb20vVHJ1c3RBc2lhVExTUlNBUm9vdENBLmNybDAd
66
+BgNVHQ4EFgQUYXUFThr1D8FgICDCKNmLs+LBfbQwDgYDVR0PAQH/BAQDAgGGMA0G
67
+CSqGSIb3DQEBDAUAA4ICAQCpIjcVXxHv5IjZr2h2+PLiKzm8CW0EoSftEvjLDMec
68
+Roc7okR/tz3WZ/NWS6YxURaE0Qbt0ZHLOtPisaACcpOCVeoLhHLfF54U2RQposA/
69
+NK8Gdu1vNHWHDpF9H2MiY+VBPKr+lctYcvV/MipWa7SsBkZEu/Srd5Gp5tU4G7L0
70
+a/X7xcv/lwjbdvARe0Rz5tp1BEn0P/7exFqN3gkqujo5RvMoegi0EgsuM+ya5bCu
71
+vyfbp9Qzah+atfvzN+sYVaJjxnjogil7RRPNq+eR3nGocA+U0ypKl4ifpr+droZ9
72
+Fk7axJ7Fs3kkIxomcSINLFv0+m2IFOQvUWn5OBXkeP+NcEaVySJx/TTpHJ7U+Ill
73
+DzZZhAoqdxGb0Ac0SLmtGHnQVCs93aWIMcTNYqJtagE39kN+EcPAVb1znp8a7tw6
74
+D6kI1cKTLBHMyDBtUAZVmboDacJmQodTQ+tFbIMCRzrP2M51CiXDK4L6W27C8b9V
75
+Upq9WlIFeTfIqtkAq1iHyjv0YdoReprIHD2r/9g5X4mbMmsOFyaMT+lwnT5S0StD
76
++eiMQauCYnfqf88qJwbT5xCgRbd01yVm/V448GS/5XCZNSer4dToOzGcRvjBJTft
77
+XbdVkfXe0MAP3xhbpoihEKPyorWPLWr/iWcVDq4o25yFTSe/WFa30ZwieLhMDign
78
+Gg==
79
+-----END CERTIFICATE-----
80
+-----BEGIN CERTIFICATE-----
81
+MIIF/TCCBOWgAwIBAgIRALLcTDSTLXCc1L8LCZQBaVwwDQYJKoZIhvcNAQEMBQAw
82
+fjELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
83
+QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEiMCAG
84
+A1UEAxMZQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQTAeFw0yNTEwMDcwNjU3MDha
85
+Fw0yOTAxMTQwNjU3MDhaMFgxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFz
86
+aWEgVGVjaG5vbG9naWVzLCBJbmMuMSIwIAYDVQQDExlUcnVzdEFzaWEgVExTIFJT
87
+QSBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwxa4G2qk
88
+RHPl1k70uc9bC8HRmoH1Y7CPQ8G7CFoaeuEHdiYfj2lWvv42YNAMg82U6ufFLVwv
89
+BRYCngqoL+VgJlSW+JhAHayunXRnL1T7lGOY4yZKg8aVtglDUM0Nfd5EDmAST1s1
90
+vb+ZOG19bNriaHMf+TGlGRBzBSrDMhmF6jSq3UIeMI0/nrUeYdVvvQBycq0SP6qm
91
+SXPyhhWVDBBfUWTO/3e4yW2s5dWY8ZkubOPJRPm1QycITfZ+3kR5u7KMHNrTS2wu
92
+1sN4t0zVpOTa3IqODv8Pw6ZgJijPNr/6VwrsWz/pMBZ7xNvE1GSgMPvl/R1xkt0p
93
+j0FY3gCtOv09fBqosRfwTjR4WCXWhSHreR3Q3KvPYjywx5eL1tCf0/483sXj/DqD
94
+cIQhHQnCofy7KCFlU2B6kG2WOFv/8dd6W23TyXBJSrodOtBQ2jIgGeSLP+vVFiY3
95
+PPt1nrAHcLgUYHfc9g9cUgq8XW2NUQraxRjIm23csIOzf6NOeEyYJavyfi4gXoIV
96
+ptbYj6zlzTKGyPnk2oniOz6TxRNq/8f3GPxnte8YLFSrQNNsTe3FyLc4T2TElExP
97
+oM2upcYnJXUnbcbanI6wBZnVKBHFIdS4/MeWq0pkWWFrE/xLzJKmD6RRvw5YkNmC
98
+gzmmX7P6bpKzzTMOhajxKdOrWa3W297UK4ECAwEAAaOCAZowggGWMHUGCCsGAQUF
99
+BwEBBGkwZzA7BggrBgEFBQcwAoYvaHR0cDovL3RydXN0YXNpYS5yZXBvc2l0b3J5
100
+LmNlcnR1bS5wbC9jdG5jYS5jZXIwKAYIKwYBBQUHMAGGHGh0dHA6Ly9zdWJjYS5v
101
+Y3NwLWNlcnR1bS5jb20wHwYDVR0jBBgwFoAUCHbNywf/JPbFze27kLzihDdGdfcw
102
+EgYDVR0TAQH/BAgwBgEB/wIBAjBtBgNVHR8EZjBkMDKgMKAuhixodHRwOi8vY2Vy
103
+dHVtLWNybC53dC50cnVzdGFzaWEuY29tL2N0bmNhLmNybDAuoCygKoYoaHR0cDov
104
+L3RydXN0YXNpYS5jcmwuY2VydHVtLnBsL2N0bmNhLmNybDATBgNVHSUEDDAKBggr
105
+BgEFBQcDATAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0gBC4wLDAIBgZngQwBAgEwCAYG
106
+Z4EMAQICMAcGBWeBDAEBMA0GCysGAQQBgttOAgEBMB0GA1UdDgQWBBS4B5F5XAb0
107
+Rv17WcpaJpGnRSv4UzANBgkqhkiG9w0BAQwFAAOCAQEAIf2vyzSuFzECCTH3LPB/
108
+bmUH1aXbVm8zVwxof+4tn8EsNYH8CgM2AHxRkXP5jOitqylySAuVIATJLYFmBQJO
109
+XMCgf9NbbuG8P1VgnUQuUhQMChp2zT946Y55xZVANGg4o2+orw4SpclSy/R7eayX
110
+Lccr++uqke9gJlX3FCpi4Sa8sg/kSfSv4p7tuwu4YAk+XPBew3jQc9wueAJwQ/Rz
111
+H4LtICrekL0QuNHb0BhPcn4qELBF6f+IrOBA2MKw1m0C9y6uO8K+xd1JMpG0/RYZ
112
+cGIH+rR5fBymQSNuD+F5I2PeXMPpigPcEdOi/NWZcCLncJLDrEU62T8hkif6MQ4F
113
+Dw==
114
+-----END CERTIFICATE-----

+ 114 - 0
src/ssl/kylx365.com_bundle.pem

@@ -0,0 +1,114 @@
1
+-----BEGIN CERTIFICATE-----
2
+MIIHGjCCBQKgAwIBAgIUbXX7FPtG7ziSj+j3sB0t3jdreREwDQYJKoZIhvcNAQEL
3
+BQAwWzELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dp
4
+ZXMsIEluYy4xJTAjBgNVBAMTHFRydXN0QXNpYSBEViBUTFMgUlNBIENBIDIwMjQw
5
+HhcNMjYwODA2MjMwMDAwWhcNMjYxMTA0MjI1OTU5WjAWMRQwEgYDVQQDEwtreWx4
6
+MzY1LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANinspK7kK2a
7
+Au6+fiQCWt50KD1tLLrMAUceT9jm78wqh6UWrS3RLyQDFswsOftoMCiKiZ3s5vhl
8
+wd70niwv5kD0SC+FNrgELPWsmhE+I/WI4hAVsnlGjn9RrCxuuD+67nDr8jmuXD5h
9
+9VORntIJx2RdLPCFYPValqfp4aWk/qVUVw8D63doUEPGMxB9FkBY9QUGKsd+um4m
10
+w/zORiqEqZDqr0WCBDEYNMklO1jDsDEcfAYtsWPd6VJuCdUF8P0/7YpBubpFMrsh
11
+OkRLxlm3dYCBc27QZcqoR7/EkGH/VZRfLzPmo/qN48fyzwDw9nMGKCIu7Jvjg+tC
12
+wQQ0hVArMukCAwEAAaOCAxkwggMVMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAU
13
+YXUFThr1D8FgICDCKNmLs+LBfbQwgZcGCCsGAQUFBwEBBIGKMIGHMEMGCCsGAQUF
14
+BzAChjdodHRwOi8vaWNhLnd0LnRydXN0YXNpYS5jb20vVHJ1c3RBc2lhRFZUTFNS
15
+U0FDQTIwMjQuY3J0MEAGCCsGAQUFBzABhjRodHRwOi8vb2NzcC53dC50cnVzdGFz
16
+aWEuY29tL1RydXN0QXNpYURWVExTUlNBQ0EyMDI0MCcGA1UdEQQgMB6CC2t5bHgz
17
+NjUuY29tgg93d3cua3lseDM2NS5jb20wEwYDVR0gBAwwCjAIBgZngQwBAgEwEwYD
18
+VR0lBAwwCgYIKwYBBQUHAwEwSAYDVR0fBEEwPzA9oDugOYY3aHR0cDovL2NybC53
19
+dC50cnVzdGFzaWEuY29tL1RydXN0QXNpYURWVExTUlNBQ0EyMDI0LmNybDAdBgNV
20
+HQ4EFgQULjI5xNGlC4FNpKoPTD8QJVMW0dwwDgYDVR0PAQH/BAQDAgWgMIIBfAYK
21
+KwYBBAHWeQIEAgSCAWwEggFoAWYAdQDYCVU7lE96/8gWGW+UT4WrsPj8XodVJg8V
22
+0S5yu0VLFAAAAZ/ZkvxMAAAEAwBGMEQCIG1n8Dg6AyeB8Sks7W/sopSg33Wvg/+e
23
+J2CJh5QzTiNmAiAtp/XwXvuJi9qba/xosYvRSX3DDM02d0fj1PI0ny97jQB2AHTb
24
+nVj31H6d/Xh6FiqZHBjPaY2nxymRjJoYsEUNukS8AAABn9mS9U0AAAQDAEcwRQIh
25
+AOa3lHiMsSXlggSFmm6mOt/3306YzaS/pVXRngG/p6SIAiANtEHon4KuAfLuJCZ4
26
+b+BE5t0FYBPAnNmVN2Ajg8/gAQB1ANdtfRDRp/V3wsfpX9cAv/mCyTNaZeHQswFz
27
+F8DIxWl3AAABn9mS+IEAAAQDAEYwRAIgTYw8wYgsIlMjzPA1cQOCjgp9olEJ9eEg
28
+gPYXByDXcnACIAhl4fjEFMTCMIUsIo9+N2WkgMB7AICpUCj8iaEz/e2hMA0GCSqG
29
+SIb3DQEBCwUAA4ICAQBo3Fr9jsB88kGFLb9CR+ayqgq2m4WDzZ4ETVs/JfK1pfXb
30
+SWhAOAY87UhLMFGRjIgG2qt60zXWo1nL9R88cdM+dV1ps6wwf51Yhu1Tse7FqHRO
31
+PUa2x13dE75iZjrNsCw4zoP8dSD/Gk7PkF8MuYOJneS6gLLclbJA089MvZOhN2y9
32
+nD69PjpnqDLi/Arct13c78e60ZhuZA5KW2zrWK9AyXou0aQgbyoWdQvsstNs8NEM
33
+llVcLF30SQrFUrYdjCxoVZmOsN/42MVxdIkgQIKBsCh24a2mTV2dVOijAW8ALT1u
34
+OmTDY9wiFs99KyGN8DlZOVGBo3wXsiGRzlBArWi6b/GQcbtYBZf/qjGVaRVxDSkU
35
+P4kwphOb/A2ZZPfKTMpZn4LrQRd4S2T0QHr1CKDoYUhyOdNUhEGFZv+xMLm/8WS3
36
+LzLssAhfWqccvWVa2Bg5X9ExpR9fpbL5iWjl3uK9EYm6pPf9LEzVHPaJmgZUtff8
37
+ThxjNsafWOW8+g6q+dugQLBTkYP+lszpvQ9i29A6E4Fa4fMgbOE5sJrgbKAAZseo
38
+7So6aOnCs28TkrUcp+Np/N5qTvfPlFcO5UufW3jShTj0qTsuyH/rU8EstNR8wu2L
39
+P68Bcu5VlB+3YyVUJ/OqgzalK8RDD8C1wMkCrZ1QRMppV83qPzL2CLma6HBh0g==
40
+-----END CERTIFICATE-----
41
+-----BEGIN CERTIFICATE-----
42
+MIIGvTCCBKWgAwIBAgIUHJ5rQS3rCoVGHeA9vjCYTQVziIswDQYJKoZIhvcNAQEM
43
+BQAwWDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dp
44
+ZXMsIEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcN
45
+MjQwNTE1MDYxOTE1WhcNMzQwNTE1MDYxOTE0WjBbMQswCQYDVQQGEwJDTjElMCMG
46
+A1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjElMCMGA1UEAxMcVHJ1
47
+c3RBc2lhIERWIFRMUyBSU0EgQ0EgMjAyNDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
48
+ADCCAgoCggIBAK2GCKULRuSjgEhVn7j0cnfuSmrxS5/5H77qmOJwWJkMVE+SgBQn
49
+4mkoxVwF03E517T5YZZumwy5iCxktdnKp5Uq0C7td8yYnZgLb18pUeuzfkJBNWvI
50
+MccfeGCI6qdnl1nGv15loYjP0TEt7C9VyVrK+zmeTxdkBb5xP/hQPFVRWQROnruX
51
+gs7G1jbEX3Hhih+OR1dxcQkk7yVM493zuDVBBlNqH4KA/FawaGNcA/KRKHI0cqyT
52
+Q/GjthO3yyivTlu07/QGV5VTl2oor9ntyXdCmEktu0aKH3kOLRjBE5CiT55Gts7d
53
+1MBRwI3pAjLtDia4+Sz0XmPB/mH1/KO7EKtg+5XVZe3amDpboawWAS2oaKuDKWx/
54
+fh5AA0ViSS+8nDAbrxE4b/gPno28GZSG41VELtSxZvgA0T8lc1oBBywQc0BWfCC9
55
+PoSl2xSxhjKjJfY+od+EALfmEnEH3A53iK4z4gqpBo8O29omZ8HYxO9Tb5aemgla
56
+gP+8oWmxv6aZwYOpWHb3AqOxEoTMV0VwzfEqLsMGcP6koLCB51uPGu8kDF8PIpbu
57
+jallH/6K9QySf3S2H4SCme94tAjznz58En48PGoQPCSTDM6CyeEZqR3tEAnUF1gS
58
+4T+hkEiskHWLQ6QosxoFX2+qMMeQNHictf5O/ZPXvIv34yxE5kiiBWN3AgMBAAGj
59
+ggF6MIIBdjASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFLgHkXlcBvRG
60
+/XtZylomkadFK/hTMIGTBggrBgEFBQcBAQSBhjCBgzBBBggrBgEFBQcwAoY1aHR0
61
+cDovL2ljYS53dC50cnVzdGFzaWEuY29tL1RydXN0QXNpYVRMU1JTQVJvb3RDQS5j
62
+cnQwPgYIKwYBBQUHMAGGMmh0dHA6Ly9vY3NwLnd0LnRydXN0YXNpYS5jb20vVHJ1
63
+c3RBc2lhVExTUlNBUm9vdENBMBMGA1UdIAQMMAowCAYGZ4EMAQIBMB0GA1UdJQQW
64
+MBQGCCsGAQUFBwMBBggrBgEFBQcDAjBGBgNVHR8EPzA9MDugOaA3hjVodHRwOi8v
65
+Y3JsLnd0LnRydXN0YXNpYS5jb20vVHJ1c3RBc2lhVExTUlNBUm9vdENBLmNybDAd
66
+BgNVHQ4EFgQUYXUFThr1D8FgICDCKNmLs+LBfbQwDgYDVR0PAQH/BAQDAgGGMA0G
67
+CSqGSIb3DQEBDAUAA4ICAQCpIjcVXxHv5IjZr2h2+PLiKzm8CW0EoSftEvjLDMec
68
+Roc7okR/tz3WZ/NWS6YxURaE0Qbt0ZHLOtPisaACcpOCVeoLhHLfF54U2RQposA/
69
+NK8Gdu1vNHWHDpF9H2MiY+VBPKr+lctYcvV/MipWa7SsBkZEu/Srd5Gp5tU4G7L0
70
+a/X7xcv/lwjbdvARe0Rz5tp1BEn0P/7exFqN3gkqujo5RvMoegi0EgsuM+ya5bCu
71
+vyfbp9Qzah+atfvzN+sYVaJjxnjogil7RRPNq+eR3nGocA+U0ypKl4ifpr+droZ9
72
+Fk7axJ7Fs3kkIxomcSINLFv0+m2IFOQvUWn5OBXkeP+NcEaVySJx/TTpHJ7U+Ill
73
+DzZZhAoqdxGb0Ac0SLmtGHnQVCs93aWIMcTNYqJtagE39kN+EcPAVb1znp8a7tw6
74
+D6kI1cKTLBHMyDBtUAZVmboDacJmQodTQ+tFbIMCRzrP2M51CiXDK4L6W27C8b9V
75
+Upq9WlIFeTfIqtkAq1iHyjv0YdoReprIHD2r/9g5X4mbMmsOFyaMT+lwnT5S0StD
76
++eiMQauCYnfqf88qJwbT5xCgRbd01yVm/V448GS/5XCZNSer4dToOzGcRvjBJTft
77
+XbdVkfXe0MAP3xhbpoihEKPyorWPLWr/iWcVDq4o25yFTSe/WFa30ZwieLhMDign
78
+Gg==
79
+-----END CERTIFICATE-----
80
+-----BEGIN CERTIFICATE-----
81
+MIIF/TCCBOWgAwIBAgIRALLcTDSTLXCc1L8LCZQBaVwwDQYJKoZIhvcNAQEMBQAw
82
+fjELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
83
+QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEiMCAG
84
+A1UEAxMZQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQTAeFw0yNTEwMDcwNjU3MDha
85
+Fw0yOTAxMTQwNjU3MDhaMFgxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFz
86
+aWEgVGVjaG5vbG9naWVzLCBJbmMuMSIwIAYDVQQDExlUcnVzdEFzaWEgVExTIFJT
87
+QSBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwxa4G2qk
88
+RHPl1k70uc9bC8HRmoH1Y7CPQ8G7CFoaeuEHdiYfj2lWvv42YNAMg82U6ufFLVwv
89
+BRYCngqoL+VgJlSW+JhAHayunXRnL1T7lGOY4yZKg8aVtglDUM0Nfd5EDmAST1s1
90
+vb+ZOG19bNriaHMf+TGlGRBzBSrDMhmF6jSq3UIeMI0/nrUeYdVvvQBycq0SP6qm
91
+SXPyhhWVDBBfUWTO/3e4yW2s5dWY8ZkubOPJRPm1QycITfZ+3kR5u7KMHNrTS2wu
92
+1sN4t0zVpOTa3IqODv8Pw6ZgJijPNr/6VwrsWz/pMBZ7xNvE1GSgMPvl/R1xkt0p
93
+j0FY3gCtOv09fBqosRfwTjR4WCXWhSHreR3Q3KvPYjywx5eL1tCf0/483sXj/DqD
94
+cIQhHQnCofy7KCFlU2B6kG2WOFv/8dd6W23TyXBJSrodOtBQ2jIgGeSLP+vVFiY3
95
+PPt1nrAHcLgUYHfc9g9cUgq8XW2NUQraxRjIm23csIOzf6NOeEyYJavyfi4gXoIV
96
+ptbYj6zlzTKGyPnk2oniOz6TxRNq/8f3GPxnte8YLFSrQNNsTe3FyLc4T2TElExP
97
+oM2upcYnJXUnbcbanI6wBZnVKBHFIdS4/MeWq0pkWWFrE/xLzJKmD6RRvw5YkNmC
98
+gzmmX7P6bpKzzTMOhajxKdOrWa3W297UK4ECAwEAAaOCAZowggGWMHUGCCsGAQUF
99
+BwEBBGkwZzA7BggrBgEFBQcwAoYvaHR0cDovL3RydXN0YXNpYS5yZXBvc2l0b3J5
100
+LmNlcnR1bS5wbC9jdG5jYS5jZXIwKAYIKwYBBQUHMAGGHGh0dHA6Ly9zdWJjYS5v
101
+Y3NwLWNlcnR1bS5jb20wHwYDVR0jBBgwFoAUCHbNywf/JPbFze27kLzihDdGdfcw
102
+EgYDVR0TAQH/BAgwBgEB/wIBAjBtBgNVHR8EZjBkMDKgMKAuhixodHRwOi8vY2Vy
103
+dHVtLWNybC53dC50cnVzdGFzaWEuY29tL2N0bmNhLmNybDAuoCygKoYoaHR0cDov
104
+L3RydXN0YXNpYS5jcmwuY2VydHVtLnBsL2N0bmNhLmNybDATBgNVHSUEDDAKBggr
105
+BgEFBQcDATAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0gBC4wLDAIBgZngQwBAgEwCAYG
106
+Z4EMAQICMAcGBWeBDAEBMA0GCysGAQQBgttOAgEBMB0GA1UdDgQWBBS4B5F5XAb0
107
+Rv17WcpaJpGnRSv4UzANBgkqhkiG9w0BAQwFAAOCAQEAIf2vyzSuFzECCTH3LPB/
108
+bmUH1aXbVm8zVwxof+4tn8EsNYH8CgM2AHxRkXP5jOitqylySAuVIATJLYFmBQJO
109
+XMCgf9NbbuG8P1VgnUQuUhQMChp2zT946Y55xZVANGg4o2+orw4SpclSy/R7eayX
110
+Lccr++uqke9gJlX3FCpi4Sa8sg/kSfSv4p7tuwu4YAk+XPBew3jQc9wueAJwQ/Rz
111
+H4LtICrekL0QuNHb0BhPcn4qELBF6f+IrOBA2MKw1m0C9y6uO8K+xd1JMpG0/RYZ
112
+cGIH+rR5fBymQSNuD+F5I2PeXMPpigPcEdOi/NWZcCLncJLDrEU62T8hkif6MQ4F
113
+Dw==
114
+-----END CERTIFICATE-----