[chore] update README

This commit is contained in:
dijunkun committed 2025-12-09 00:41:58 +08:00
1 parent 44b469ece3
commit aaa4bd5d8b
4 files changed
+115 -146

No files matched your search

+53 -20
View File
@@ -1,11 +1,18 @@
# CrossDesk Server # CrossDesk Server
[English](README.md) / [中文](README_CN.md) [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-brightgreen.svg)]()
[![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0)
[![GitHub last commit](https://img.shields.io/github/last-commit/kunkundi/crossdesk-server)](https://github.com/kunkundi/crossdesk-server/commits/web-client)
[![Build Status](https://github.com/kunkundi/crossdesk-server/actions/workflows/build.yml/badge.svg)](https://github.com/kunkundi/crossdesk/actions)
[![Docker Pulls](https://img.shields.io/docker/pulls/crossdesk/crossdesk-server)](https://hub.docker.com/r/crossdesk/crossdesk-server/tags)
[![GitHub issues](https://img.shields.io/github/issues/kunkundi/crossdesk-server.svg)]()
[![GitHub stars](https://img.shields.io/github/stars/kunkundi/crossdesk-server.svg?style=social)]()
[![GitHub forks](https://img.shields.io/github/forks/kunkundi/crossdesk-server.svg?style=social)]()
[ [English](README_EN.md) / 中文 ]
为 [CrossDesk](https://github.com/kunkundi/crossdesk) 设计的服务端,支持WSS加密连接,使用SQLite3存储用户信息。 为 [CrossDesk](https://github.com/kunkundi/crossdesk) 设计的服务端,支持WSS加密连接,使用SQLite3存储用户信息。
[License: LGPL-3.0](LICENSE) | [Platform: Windows | Linux | macOS]
--- ---
## 如何编译 ## 如何编译
@@ -47,11 +54,9 @@ sudo docker build -t image-name .
## 运行容器 ## 运行容器
### 基础启动(数据存储在容器内) ### 启动命令
启动命令示例:
```bash ```bash
docker run -d \ sudo docker run -d \
--name crossdesk_server \ --name crossdesk_server \
--network host \ --network host \
-e EXTERNAL_IP=xxx.xxx.xxx.xxx \ -e EXTERNAL_IP=xxx.xxx.xxx.xxx \
@@ -65,22 +70,50 @@ docker run -d \
crossdesk/crossdesk-server:v1.1.2 crossdesk/crossdesk-server:v1.1.2
``` ```
**说明**: 上述命令中,用户需注意的参数如下:
- 证书文件会在首次启动时自动生成在容器内的 `/var/lib/crossdesk/certs`
- 数据库文件会自动创建在容器内的 `/var/lib/crossdesk/db/crossdesk-server.db` **参数**
- 日志文件会自动创建在容器内的 `/var/log/crossdesk/` - EXTERNAL_IP:服务器公网 IP , 对应 CrossDesk 客户端**自托管服务器配置**中填写的**服务器地址**
- **注意**:如果不挂载 volume,容器删除后数据会丢失 - INTERNAL_IP:服务器内网 IP
- CROSSDESK_SERVER_PORT:自托管服务使用的端口,对应 CrossDesk 客户端**自托管服务器配置**中填写的**服务器端口**
- COTURN_PORT: COTURN 服务使用的端口, 对应 CrossDesk 客户端**自托管服务器配置**中填写的**中继服务端口**
- MIN_PORT/MAX_PORT:COTURN 服务使用的端口范围,例如:MIN_PORT=50000, MAX_PORT=60000,范围可根据客户端数量调整。
- `-v /var/lib/crossdesk:/var/lib/crossdesk`:持久化数据库和证书文件到宿主机 - `-v /var/lib/crossdesk:/var/lib/crossdesk`:持久化数据库和证书文件到宿主机
- `-v /var/log/crossdesk:/var/log/crossdesk`:持久化日志文件到宿主机 - `-v /var/log/crossdesk:/var/log/crossdesk`:持久化日志文件到宿主机
- 容器删除后,数据仍保留在宿主机上
- **目录自动创建**:如果宿主机没有这些目录,Docker 会自动创建,容器内的代码也会自动创建子目录 **示例**:
- **权限注意(重要)**:如果 Docker 自动创建的目录权限不足(属于 root),容器内用户无法写入,会导致: ```bash
sudo docker run -d \
--name crossdesk_server \
--network host \
-e EXTERNAL_IP=114.114.114.114 \
-e INTERNAL_IP=10.0.0.1 \
-e CROSSDESK_SERVER_PORT=9099 \
-e COTURN_PORT=3478 \
-e MIN_PORT=50000 \
-e MAX_PORT=60000 \
-v /var/lib/crossdesk:/var/lib/crossdesk \
-v /var/log/crossdesk:/var/log/crossdesk \
crossdesk/crossdesk-server:v1.1.2
```
**注意**:
- **服务器需开放端口:COTURN_PORT/udp,COTURN_PORT/tcp,MIN_PORT-MAX_PORT/udp,CROSSDESK_SERVER_PORT/tcp。**
- 如果不挂载 volume,容器删除后数据会丢失
- 证书文件会在首次启动时自动生成并持久化到宿主机的 `/var/lib/crossdesk/certs` 路径下
- 数据库文件会自动创建并持久化到宿主机的 `/var/lib/crossdesk/db/crossdesk-server.db` 路径下
- 日志文件会自动创建并持久化到宿主机的 `/var/log/crossdesk/` 路径下
**权限注意**:如果 Docker 自动创建的目录权限不足(属于 root),容器内用户无法写入,会导致:
- 证书生成失败,容器启动脚本会报错退出 - 证书生成失败,容器启动脚本会报错退出
- 数据库目录创建失败,程序会抛出异常并崩溃 - 数据库目录创建失败,程序会抛出异常并崩溃
- 日志目录创建失败,日志文件无法写入(但程序可能继续运行) - 日志目录创建失败,日志文件无法写入(但程序可能继续运行)
解决方案:在启动容器前手动设置权限: **解决方案**:在启动容器前手动设置权限:
```bash ```bash
sudo mkdir -p /var/lib/crossdesk /var/log/crossdesk sudo mkdir -p /var/lib/crossdesk /var/log/crossdesk
sudo chown -R $(id -u):$(id -g) /var/lib/crossdesk /var/log/crossdesk sudo chown -R $(id -u):$(id -g) /var/lib/crossdesk /var/log/crossdesk
``` ```
## 证书文件
在宿主机的 `/var/lib/crossdesk/certs` 路径下可找到证书文件 `crossdesk.cn_root.crt`,下载到你的客户端主机,并在客户端的**自托管服务器设置**中选择相应的**证书文件路径**。
+62 -27
View File
@@ -1,11 +1,18 @@
# CrossDesk Server # CrossDesk Server
[中文](README_CN.md) / [English](README.md) [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-brightgreen.svg)]()
[![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0)
[![GitHub last commit](https://img.shields.io/github/last-commit/kunkundi/crossdesk-server)](https://github.com/kunkundi/crossdesk-server/commits/web-client)
[![Build Status](https://github.com/kunkundi/crossdesk-server/actions/workflows/build.yml/badge.svg)](https://github.com/kunkundi/crossdesk/actions)
[![Docker Pulls](https://img.shields.io/docker/pulls/crossdesk/crossdesk-server)](https://hub.docker.com/r/crossdesk/crossdesk-server/tags)
[![GitHub issues](https://img.shields.io/github/issues/kunkundi/crossdesk-server.svg)]()
[![GitHub stars](https://img.shields.io/github/stars/kunkundi/crossdesk-server.svg?style=social)]()
[![GitHub forks](https://img.shields.io/github/forks/kunkundi/crossdesk-server.svg?style=social)]()
[ [中文](README.md) / English ]
Server designed for [CrossDesk](https://github.com/kunkundi/crossdesk) , supporting WSS-encrypted connections and using SQLite3 to store user information. Server designed for [CrossDesk](https://github.com/kunkundi/crossdesk) , supporting WSS-encrypted connections and using SQLite3 to store user information.
[License: LGPL-3.0](LICENSE) | [Platform: Windows | Linux | macOS]
--- ---
Requirements: Requirements:
@@ -45,11 +52,9 @@ sudo docker build -t image-name .
## Run Container ## Run Container
### Basic Startup (Data stored in container) ### Startup Command
```
Example startup command: sudo docker run -d \
```bash
docker run -d \
--name crossdesk_server \ --name crossdesk_server \
--network host \ --network host \
-e EXTERNAL_IP=xxx.xxx.xxx.xxx \ -e EXTERNAL_IP=xxx.xxx.xxx.xxx \
@@ -63,22 +68,52 @@ docker run -d \
crossdesk/crossdesk-server:v1.1.2 crossdesk/crossdesk-server:v1.1.2
``` ```
**Notes**: The parameters you need to pay attention to are as follows:
- Certificate files will be automatically generated on first startup in `/var/lib/crossdesk/certs` (inside container)
- Database file will be automatically created at `/var/lib/crossdesk/db/crossdesk-server.db` (inside container) **Parameters**
- Log files will be automatically created in `/var/log/crossdesk/` (inside container) - **EXTERNAL_IP**: The server’s public IP. This corresponds to **Server Address** in the CrossDesk client’s **Self-Hosted Server Configuration**.
- **Note**: Data will be lost if container is removed without volume mounts - **INTERNAL_IP**: The server’s internal IP.
- `-v /var/lib/crossdesk:/var/lib/crossdesk`: Persist database and certificate files to host - **CROSSDESK_SERVER_PORT**: The port used by the self-hosted service. This corresponds to **Server Port** in the CrossDesk client’s **Self-Hosted Server Configuration**.
- `-v /var/log/crossdesk:/var/log/crossdesk`: Persist log files to host - **COTURN_PORT**: The port used by the COTURN service. This corresponds to **Relay Service Port** in the CrossDesk client’s **Self-Hosted Server Configuration**.
- Data will remain on host even if container is removed - **MIN_PORT / MAX_PORT**: The port range used by the COTURN service. Example: `MIN_PORT=50000`, `MAX_PORT=60000`. Adjust the range depending on the number of clients.
- **Auto directory creation**: If these directories don't exist on host, Docker will create them automatically, and the container code will also create subdirectories - `-v /var/lib/crossdesk:/var/lib/crossdesk`: Persists database and certificate files on the host machine.
- **Permission note (Important)**: If Docker auto-created directories have insufficient permissions (owned by root), the container user cannot write, which will cause: - `-v /var/log/crossdesk:/var/log/crossdesk`: Persists log files on the host machine.
- Certificate generation failure, container startup script will exit with error
- Database directory creation failure, program will throw exception and crash **Example**:
- Log directory creation failure, log files cannot be written (but program may continue running) ```bash
sudo docker run -d \
Solution: Set permissions manually before starting container: --name crossdesk_server \
```bash --network host \
sudo mkdir -p /var/lib/crossdesk /var/log/crossdesk -e EXTERNAL_IP=114.114.114.114 \
sudo chown -R $(id -u):$(id -g) /var/lib/crossdesk /var/log/crossdesk -e INTERNAL_IP=10.0.0.1 \
``` -e CROSSDESK_SERVER_PORT=9099 \
-e COTURN_PORT=3478 \
-e MIN_PORT=50000 \
-e MAX_PORT=60000 \
-v /var/lib/crossdesk:/var/lib/crossdesk \
-v /var/log/crossdesk:/var/log/crossdesk \
crossdesk/crossdesk-server:v1.1.2
```
**Notes**
- **The server must open the following ports: COTURN_PORT/udp, COTURN_PORT/tcp, MIN_PORT–MAX_PORT/udp, and CROSSDESK_SERVER_PORT/tcp.**
- If you don’t mount volumes, all data will be lost when the container is removed.
- Certificate files will be automatically generated on first startup and persisted to the host at `/var/lib/crossdesk/certs`.
- The database file will be automatically created and stored at `/var/lib/crossdesk/db/crossdesk-server.db`.
- Log files will be created and stored at `/var/log/crossdesk/`.
**Permission Notice**
If the directories automatically created by Docker belong to root and have insufficient write permissions, the container user may not be able to write to them. This can cause:
- Certificate generation failure, leading to startup script errors and container exit.
- Database directory creation failure, causing the program to throw exceptions and crash.
- Log directory creation failure, preventing logs from being written (though the program may continue running).
**Solution:** Manually set permissions before starting the container:
```bash
sudo mkdir -p /var/lib/crossdesk /var/log/crossdesk
sudo chown -R $(id -u):$(id -g) /var/lib/crossdesk /var/log/crossdesk
```
### Certificate Files
You can find the certificate file `crossdesk.cn_root.crt` at `/var/lib/crossdesk/certs` on the host machine.
Download it to your client device and select it in the **Certificate File Path** field under the CrossDesk client’s **Self-Hosted Server Settings**.
-27
View File
@@ -1,27 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAzUxxh/mrb2eNgadso3w0Goq5yUHrP0V+yToZrWPvbaoZ8Rnn
rxiTlqOxqol/Uryj5Vxe5MG+t/VfLntsp0h6hMawEGz+v+UMNnLCRGjoCmxkuhRD
MEQkuCEzt9dsqKwdpLir5w3XVTmusqWMiVEg6j6Pg5R6y+6UcbEhOMJXnscKvpsj
jXYZk/7ZcXjfFW3d0N2fC/No3XJwde/KkvM6xWPkin3F4cpWNueYYAh+27KGmZ0W
aDrupO+glxcztYFhQoigdcSC67nz5QqCMerOvGQe8hlPed+q73zguXA8g0CJAAzN
PdFMQnyalJ5Pqj7yYA8YvwwbmUcpUofU+qT6TQIDAQABAoIBAQCqc7ara/sPsw2F
QYnsrvnfs6CPXeDBFqUu08Nv99JZ3epOCPEYqrIXV2/ypNiGzELT8v6Cte3wdJSD
VkyfE4lN5l1WNfjJQJYEOwHapLNLvDVhXeNvFpTaIA79q6n23Xh7RCzN2OsZQpwu
jU8Cz84hTrH/UG8oFL1BLAzmQE1ZcHGTwjuakZ7yu7dUOevW0D1IOcuSp3eoseEs
0Q3SI/5YvSbEc1t7Pi1lE4VC3TDQr0wvYALe9sv8UUkt2zW2t5I5H1OTwIBBri5u
jJzueQQfY78NGDFsSc9gz4N+ERsLKFQo5vPVUIa0lRc97dlovY7cTj0P6rmdH5WI
VxeZTMFNAoGBAPTZqCMWcbezpMMCxKnIUZkZrkK6au9Y0VbKjT/wnr/98jZ3UqzG
g0nuXmYqtOEgd/I9GA202al1Fhg59NCxysM+fcf1+bNd6sobZhKvWWZo3/RFEtZe
FNjDX0KtZhaV2FsPg+PJRxbcKc4adIdGp9My/U3I6A67j2wBbTpvwpZbAoGBANal
tqXA3xEDl5VOULFfI4D+1VmieTwH5OuDNIkRBkBVR+A17TBASp2rKE84gnaCJT1H
IreuIFXelBaOFxe5f8iYZRk2d9xy5pGh4dgzLOpxnjD8V3aKzf0luiXgGCnBfH0H
uo7LFQvArxj2XRr6cGrowFGcZggwtW+Q+3CM+yJ3AoGAKC13G5rZOi2uQZm4r6uB
SEAgii6Q0YmfgEBogS94vURsdGeMF3HTpVQKBXXIjJCJXiSMR+N/PAFMiNkpxP0H
qpYcia1hNf+ZQWTRkQtY/icDaM/U0XxKq28TuJs/f0FDaV3YZI5oreWeroVEzdXY
QB3D1vm6qoA4fp6VT9t68LUCgYBJvBlXLT8ziAldZ86+b5Exsdi2duKwpYGVCbhV
UXzVQrZzJfM5vQwkx3QMarweW6zRNQuPD4jaFqDGcr8qDjYAQaGRHK3mE65y3qpH
a6UFUExoRXcCKMKEMJ6WfjmutmG+TZZfkRHEvMcpixAGwXs2rofKQTCnpZveHG7T
hgqLFwKBgCsRDf/5JZ8yCYh85vTHQX0n5xW3wKve2riTBtmHBeGcTOQ7z+8X5Pa6
GEjnd2GbkDKaSHocy2ot1uQTFMYm4XnRuZ2LIUA/oHvQg3liJxogtLhT9neouOJG
SVAUmQdHv6sNOXsHfpaYQ4Yh9WnkFsfQXkZPezKxnfjDC0P32dOR
-----END RSA PRIVATE KEY-----
-72
View File
@@ -1,72 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIG6TCCBNGgAwIBAgIQDZm+gzszyTuYChEbhggd6TANBgkqhkiG9w0BAQsFADBb
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjElMCMGA1UEAxMcVHJ1c3RBc2lhIERWIFRMUyBSU0EgQ0EgMjAyNTAeFw0y
NTA2MjUwMDAwMDBaFw0yNTA5MjIyMzU5NTlaMBcxFTATBgNVBAMTDGNyb3NzZGVz
ay5jbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM1McYf5q29njYGn
bKN8NBqKuclB6z9Ffsk6Ga1j722qGfEZ568Yk5ajsaqJf1K8o+VcXuTBvrf1Xy57
bKdIeoTGsBBs/r/lDDZywkRo6ApsZLoUQzBEJLghM7fXbKisHaS4q+cN11U5rrKl
jIlRIOo+j4OUesvulHGxITjCV57HCr6bI412GZP+2XF43xVt3dDdnwvzaN1ycHXv
ypLzOsVj5Ip9xeHKVjbnmGAIftuyhpmdFmg67qTvoJcXM7WBYUKIoHXEguu58+UK
gjHqzrxkHvIZT3nfqu984LlwPINAiQAMzT3RTEJ8mpSeT6o+8mAPGL8MG5lHKVKH
1Pqk+k0CAwEAAaOCAuswggLnMB8GA1UdIwQYMBaAFLQSKKW0wB2fKXFpPNkRlkp1
aVDAMB0GA1UdDgQWBBT8NCVx9oSYA++8lE/j3r/Bsff42zApBgNVHREEIjAgggxj
cm9zc2Rlc2suY26CEHd3dy5jcm9zc2Rlc2suY24wPgYDVR0gBDcwNTAzBgZngQwB
AgEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4G
A1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIweQYI
KwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j
b20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9UcnVz
dEFzaWFEVlRMU1JTQUNBMjAyNS5jcnQwDAYDVR0TAQH/BAIwADCCAYAGCisGAQQB
1nkCBAIEggFwBIIBbAFqAHcA3dzKNJXX4RYF55Uy+sef+D0cUN/bADoUEnYKLKy7
yCoAAAGXpRLksAAABAMASDBGAiEAqG3yUcSmVpRitnMX3kN6P9PmTtcpdG/yVXKz
db0Ycb0CIQDQ9gxdkKsrHyeA8p07RKGHuf/A3hgu6EROcwR1ZJJPBQB3AO08S9bo
BsKkogBX28sk4jgB31Ev7cSGxXAPIN23Pj/gAAABl6US5LUAAAQDAEgwRgIhAK2+
C7tpf+Q28e34GG4lRjrRL/FRUq3C+r4kEepRajtCAiEAzFCM23xDdS4ndtGa2xdI
eP5oEjV3WJ+D402ws4W+y3gAdgCkQsUGSWBhVI8P1Oqc+3otJkVNh6l/L99FWfYn
TzqEVAAAAZelEuTFAAAEAwBHMEUCIQC77g5B+dpccZlLu7RHbO1n0C5PkfFfmTYZ
rqSSm8BvMgIgZsyw/WWW8LXJU7T1naVkC3ES8PuNTt+M9paTVzlpcBUwDQYJKoZI
hvcNAQELBQADggIBAGAVWbdXOk1FzP47+KPdJsFmS/Jtz0y6Jg79JRj5VKODAk2g
hRDXT/PtPyj3D2od0yiOR8ShKEiVScBlJ0A7xgjW3kvLHhGvgRffdLRz5AStYE1/
ntz8kT38Ad1S/lB9Ct1lvASszZ7ab9C22X461RM0rHT0gviwovIkqG4qTs7EFIDp
FmP9OnQEQPtEO3qg670f0+RLcwHjht47m68ilFDNcVcw10JmawbPORpR6D2npqhL
9HukhSdBryxhNBsjcwtp3gNXwMo7ffc1ZyvCQk9xbfzELIhcyAiA/OKcrQpx77AN
DltHVSQRcNc8XFfHaZCPBXWtJ6G1GdjX2uWvXfxfioaej0sL6v7SRl1QRwDB6JiX
NXdx/6o94iSLImOktoywds5g9/qpQS+0YWXIhziTJQtqaF0hFbSn55Pc95tbNnqA
M9ZHS3SmoB0155ueGsYBJBc4R01E6tgE/xYYPpD7MrjJCYIymeLP0DbYWii+BBlb
4ICeVJ7g4i9Un8vU6khx9B3x3JqO7NPjhY/18iejoOGddOing4Vn2FyHhc/fI5X6
ct+sLDOOTEf3BnkTEarhwzFQMTiYP3k4lD0KVvMMvvOzMVagQvGKog1jsEuCnuoe
9OJrxpY8kQVGSZqKaeEHwJZw9+KTXTa+y+GBp2Pxq3oybGuV1fRuJ3Hogq6S
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFnjCCBIagAwIBAgIQCSYyO0lk42hGFRLe8aXVLDANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
MjAeFw0yNTAxMDgwMDAwMDBaFw0zNTAxMDcyMzU5NTlaMFsxCzAJBgNVBAYTAkNO
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSUwIwYDVQQD
ExxUcnVzdEFzaWEgRFYgVExTIFJTQSBDQSAyMDI1MIICIjANBgkqhkiG9w0BAQEF
AAOCAg8AMIICCgKCAgEA0fuEmuBIsN6ZZVq+gRobMorOGIilTCIfQrxNpR8FUZ9R
/GfbiekbiIKphQXEZ7N1uBnn6tXUuZ32zl6jPkZpHzN/Bmgk1BWSIzVc0npMzrWq
/hrbk5+KddXJdsNpeG1+Q8lc8uVMBrztnxaPb7Rh7yQCsMrcO4hgVaqLJWkVvEfW
ULtoCHQnNaj4IroG6VxQf1oArQ8bPbwpI02lieSahRa78FQuXdoGVeQcrkhtVjZs
ON98vq5fPWZX2LFv7e5J6P9IHbzvOl8yyQjv+2/IOwhNSkaXX3bI+//bqF9XW/p7
+gsUmHiK5YsvLjmXcvDmoDEGrXMzgX31Zl2nJ+umpRbLjwP8rxYIUsKoEwEdFoto
Aid59UEBJyw/GibwXQ5xTyKD/N6C8SFkr1+myOo4oe1UB+YgvRu6qSxIABo5kYdX
FodLP4IgoVJdeUFs1Usa6bxYEO6EgMf5lCWt9hGZszvXYZwvyZGq3ogNXM7eKyi2
20WzJXYMmi9TYFq2Fa95aZe4wki6YhDhhOO1g0sjITGVaB73G+JOCI9yJhv6+REN
D40ZpboUHE8JNgMVWbG1isAMVCXqiADgXtuC+tmJWPEH9cR6OuJLEpwOzPfgAbnn
2MRu7Tsdr8jPjTPbD0FxblX1ydW3RG30vwLF5lkTTRkHG9epMgpPMdYP7nY/08MC
AwEAAaOCAVYwggFSMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLQSKKW0
wB2fKXFpPNkRlkp1aVDAMB8GA1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485
MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
dgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
dC5jb20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E
aWdpQ2VydEdsb2JhbFJvb3RHMi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov
L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDARBgNV
HSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQELBQADggEBAJ4a3svh316GY2+Z7EYx
mBIsOwjJSnyoEfzx2T699ctLLrvuzS79Mg3pPjxSLlUgyM8UzrFc5tgVU3dZ1sFQ
I4RM+ysJdvIAX/7Yx1QbooVdKhkdi9X7QN7yVkjqwM3fY3WfQkRTzhIkM7mYIQbR
r+y2Vkju61BLqh7OCRpPMiudjEpP1kEtRyGs2g0aQpEIqKBzxgitCXSayO1hoO6/
71ts801OzYlqYW9OQQQ2GCJyFbD6XHDjdpn+bWUxTKWaMY0qedSCbHE3Kl2QEF0C
ynZ7SbC03yR+gKZQDeTXrNP1kk5Qhe7jSXgw+nhbspe0q/M1ZcNCz+sPxeOwdCcC
gJE=
-----END CERTIFICATE-----