From 4ab51a7b915eb2018f176c0f3dd8a41ba44e9855 Mon Sep 17 00:00:00 2001 From: UserIsMH Date: Fri, 27 Jun 2025 20:37:15 +0200 Subject: [PATCH] Hetzner Deploy Version (hoffentlich) --- .claude/settings.local.json | 5 +- PRODUCTION_DEPLOYMENT.md | 121 +++++++++ SSL/.claude/settings.local.json | 14 + SSL/SSL_Wichtig.md | 130 +++++++++ SSL/cert.pem | 23 ++ SSL/chain.pem | 26 ++ SSL/fullchain.pem | 49 ++++ SSL/privkey.pem | 5 + ...ocker_20250623_030000_encrypted.sql.gz.enc | 1 + cloud-init.yaml | 255 ++++++++++++++++++ generate-secrets.py | 35 +++ v2/.env | 4 +- v2/.env.production.template | 56 ++++ v2_adminpanel/config.py | 2 +- v2_lizenzserver/.env.production.template | 8 + v2_nginx/nginx.conf | 8 +- v2_nginx/ssl/.gitignore | 10 + v2_nginx/ssl/README.md | 29 ++ verify-deployment.sh | 123 +++++++++ 19 files changed, 896 insertions(+), 8 deletions(-) create mode 100644 PRODUCTION_DEPLOYMENT.md create mode 100644 SSL/.claude/settings.local.json create mode 100644 SSL/SSL_Wichtig.md create mode 100644 SSL/cert.pem create mode 100644 SSL/chain.pem create mode 100644 SSL/fullchain.pem create mode 100644 SSL/privkey.pem create mode 100644 backups/backup_v2docker_20250623_030000_encrypted.sql.gz.enc create mode 100644 cloud-init.yaml create mode 100644 generate-secrets.py create mode 100644 v2/.env.production.template create mode 100644 v2_lizenzserver/.env.production.template create mode 100644 v2_nginx/ssl/.gitignore create mode 100644 v2_nginx/ssl/README.md create mode 100644 verify-deployment.sh diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 26be2e5..5fe3bfb 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -76,7 +76,10 @@ "Bash(touch:*)", "Bash(wget:*)", "Bash(docker inspect:*)", - "Bash(docker run:*)" + "Bash(docker run:*)", + "Bash(ping:*)", + "Bash(timeout:*)", + "Bash(nc:*)" ], "deny": [] } diff --git a/PRODUCTION_DEPLOYMENT.md b/PRODUCTION_DEPLOYMENT.md new file mode 100644 index 0000000..00eeb15 --- /dev/null +++ b/PRODUCTION_DEPLOYMENT.md @@ -0,0 +1,121 @@ +# Production Deployment Guide for intelsight.de + +## Pre-Deployment Checklist + +### 1. Generate Secure Secrets +```bash +python3 generate-secrets.py +``` +Save the output securely - you'll need these passwords! + +**Note**: The admin panel users (rac00n and w@rh@mm3r) keep their existing passwords as configured in the .env file. + +### 2. Configure Environment Files + +#### v2/.env +1. Copy the template: + ```bash + cp v2/.env.production.template v2/.env + ``` +2. Replace all `CHANGE_THIS_` placeholders with generated secrets +3. Ensure `PRODUCTION=true` is set + +#### v2_lizenzserver/.env +1. Copy the template: + ```bash + cp v2_lizenzserver/.env.production.template v2_lizenzserver/.env + ``` +2. Use the same database password as in v2/.env +3. Set a unique SECRET_KEY from generate-secrets.py + +### 3. SSL Certificates +```bash +# Copy your SSL certificates +cp /SSL/fullchain.pem v2_nginx/ssl/ +cp /SSL/privkey.pem v2_nginx/ssl/ +chmod 644 v2_nginx/ssl/fullchain.pem +chmod 600 v2_nginx/ssl/privkey.pem + +# Generate dhparam.pem (this takes a few minutes) +openssl dhparam -out v2_nginx/ssl/dhparam.pem 2048 +``` + +### 4. Verify Configuration +```bash +./verify-deployment.sh +``` + +## Deployment on Hetzner Server + +### 1. Update Deploy Script +On your Hetzner server: +```bash +nano /root/deploy.sh +``` +Replace `YOUR_GITHUB_TOKEN` with your actual GitHub token. + +### 2. Run Deployment +```bash +cd /root +./deploy.sh +``` + +### 3. Start Services +```bash +cd /opt/v2-Docker/v2 +docker compose up -d +``` + +### 4. Check Status +```bash +docker compose ps +docker compose logs -f +``` + +## Post-Deployment + +### 1. Create Admin Panel API Key +1. Access https://admin-panel-undso.intelsight.de +2. Login with your admin credentials +3. Go to "Lizenzserver Administration" +4. Generate a new API key for production use + +### 2. Test Endpoints +- Admin Panel: https://admin-panel-undso.intelsight.de +- API Server: https://api-software-undso.intelsight.de + +### 3. Monitor Logs +```bash +docker compose logs -f admin-panel +docker compose logs -f license-server +``` + +## Security Notes + +1. **Never commit .env files** with real passwords to git +2. **Backup your passwords** securely +3. **Rotate API keys** regularly +4. **Monitor access logs** for suspicious activity +5. **Keep SSL certificates** up to date (expires every 90 days) + +## Troubleshooting + +### Services won't start +```bash +docker compose down +docker compose up -d +docker compose logs +``` + +### Database connection issues +- Verify POSTGRES_PASSWORD matches in both .env files +- Check if postgres container is running: `docker compose ps db` + +### SSL issues +- Ensure certificates are in v2_nginx/ssl/ +- Check nginx logs: `docker compose logs nginx-proxy` + +### Cannot access website +- Verify DNS points to your server IP +- Check if ports 80/443 are open: `ss -tlnp | grep -E '(:80|:443)'` +- Check nginx is running: `docker compose ps nginx-proxy` \ No newline at end of file diff --git a/SSL/.claude/settings.local.json b/SSL/.claude/settings.local.json new file mode 100644 index 0000000..5affa95 --- /dev/null +++ b/SSL/.claude/settings.local.json @@ -0,0 +1,14 @@ +{ + "permissions": { + "allow": [ + "Bash(sudo apt:*)", + "Bash(sudo apt install:*)", + "Bash(apt list:*)", + "Bash(pip install:*)", + "Bash(pip3 install:*)", + "Bash(chmod:*)", + "Bash(sudo cp:*)" + ], + "deny": [] + } +} \ No newline at end of file diff --git a/SSL/SSL_Wichtig.md b/SSL/SSL_Wichtig.md new file mode 100644 index 0000000..4b13fe5 --- /dev/null +++ b/SSL/SSL_Wichtig.md @@ -0,0 +1,130 @@ +# SSL Zertifikat für intelsight.de - Wichtige Informationen + +## Erfolgreich erstelltes Zertifikat + +**Erstellungsdatum**: 26. Juni 2025 +**Ablaufdatum**: 24. September 2025 (90 Tage) +**E-Mail für Benachrichtigungen**: momohomma@googlemail.com + +**Abgedeckte Domains**: +- intelsight.de +- www.intelsight.de +- admin-panel-undso.intelsight.de +- api-software-undso.intelsight.de + +## Zertifikatsdateien (in WSL) + +- **Zertifikat (Full Chain)**: `/etc/letsencrypt/live/intelsight.de/fullchain.pem` +- **Privater Schlüssel**: `/etc/letsencrypt/live/intelsight.de/privkey.pem` +- **Nur Zertifikat**: `/etc/letsencrypt/live/intelsight.de/cert.pem` +- **Zwischenzertifikat**: `/etc/letsencrypt/live/intelsight.de/chain.pem` + +## Komplette Anleitung - So wurde es gemacht + +### 1. WSL Installation und Setup +```bash +# In Windows PowerShell WSL starten +wsl + +# System aktualisieren +sudo apt update + +# Certbot installieren +sudo apt install certbot + +# Version prüfen +certbot --version +# Ausgabe: certbot 2.9.0 +``` + +### 2. Certbot DNS Challenge starten +```bash +sudo certbot certonly --manual --preferred-challenges dns --email momohomma@googlemail.com --agree-tos --no-eff-email -d intelsight.de -d www.intelsight.de -d admin-panel-undso.intelsight.de -d api-software-undso.intelsight.de +``` + +### 3. DNS Challenge Werte sammeln +Certbot zeigt nacheinander 4 DNS Challenges an. **Nach jedem Wert Enter drücken** um den nächsten zu sehen: + +1. Enter → Erster Wert erscheint +2. Enter → Zweiter Wert erscheint +3. Enter → Dritter Wert erscheint +4. Enter → Vierter Wert erscheint +5. **STOPP! Noch nicht Enter drücken!** + +### 4. DNS Einträge bei IONOS hinzufügen + +Bei IONOS anmelden und unter DNS-Einstellungen diese TXT-Einträge hinzufügen: + +| Typ | Hostname | Wert | TTL | +|-----|----------|------|-----| +| TXT | `_acme-challenge.admin-panel-undso` | [Wert von Certbot] | 5 Min | +| TXT | `_acme-challenge.api-software-undso` | [Wert von Certbot] | 5 Min | +| TXT | `_acme-challenge` | [Wert von Certbot] | 5 Min | +| TXT | `_acme-challenge.www` | [Wert von Certbot] | 5 Min | + +### 5. DNS Einträge verifizieren + +**In einem neuen WSL Terminal** prüfen ob die Einträge aktiv sind: + +```bash +nslookup -type=TXT _acme-challenge.admin-panel-undso.intelsight.de +nslookup -type=TXT _acme-challenge.api-software-undso.intelsight.de +nslookup -type=TXT _acme-challenge.intelsight.de +nslookup -type=TXT _acme-challenge.www.intelsight.de +``` + +Wenn alle 4 Einträge die richtigen Werte zeigen, fortfahren. + +### 6. Zertifikat generieren +Im Certbot Terminal (wo es wartet) **Enter drücken** zur Verifizierung. + +Erfolgreiche Ausgabe: +``` +Successfully received certificate. +Certificate is saved at: /etc/letsencrypt/live/intelsight.de/fullchain.pem +Key is saved at: /etc/letsencrypt/live/intelsight.de/privkey.pem +This certificate expires on 2025-09-24. +``` + +## Zertifikate für späteren Server-Upload kopieren + +```bash +# Zertifikate ins Home-Verzeichnis kopieren +sudo cp /etc/letsencrypt/live/intelsight.de/fullchain.pem ~/ +sudo cp /etc/letsencrypt/live/intelsight.de/privkey.pem ~/ + +# Berechtigungen setzen +sudo chmod 644 ~/*.pem + +# Dateien anzeigen +ls -la ~/*.pem +``` + +Die Dateien sind dann unter: +- Windows Pfad: `\\wsl$\Ubuntu\home\[dein-username]\fullchain.pem` +- Windows Pfad: `\\wsl$\Ubuntu\home\[dein-username]\privkey.pem` + +## Wichtige Hinweise + +1. **Erneuerung**: Das Zertifikat muss alle 90 Tage erneuert werden +2. **Manuelle Erneuerung**: Gleicher Prozess mit DNS Challenge wiederholen +3. **Automatische Erneuerung**: Erst möglich wenn Server läuft +4. **DNS Einträge**: Nach erfolgreicher Zertifikatserstellung können die `_acme-challenge` TXT-Einträge bei IONOS gelöscht werden + +## Für den zukünftigen Server + +Wenn der Server bereit ist, diese Dateien verwenden: +- `fullchain.pem` - Komplette Zertifikatskette +- `privkey.pem` - Privater Schlüssel (GEHEIM HALTEN!) + +### Beispiel Nginx Konfiguration: +```nginx +ssl_certificate /etc/ssl/certs/fullchain.pem; +ssl_certificate_key /etc/ssl/private/privkey.pem; +``` + +### Beispiel Apache Konfiguration: +```apache +SSLCertificateFile /etc/ssl/certs/fullchain.pem +SSLCertificateKeyFile /etc/ssl/private/privkey.pem +``` \ No newline at end of file diff --git a/SSL/cert.pem b/SSL/cert.pem new file mode 100644 index 0000000..bfb08d2 --- /dev/null +++ b/SSL/cert.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID3TCCA2OgAwIBAgISBimcX2wwj3Z1U/Qlfu5y5keoMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NjAeFw0yNTA2MjYxNjAwMjBaFw0yNTA5MjQxNjAwMTlaMBgxFjAUBgNVBAMTDWlu +dGVsc2lnaHQuZGUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATEQD6vfDoXM7Yz +iT75OmB/kvxoEebMFRBCzpTOdUZpThlFmLijjCsYnxc8DeWDn8/eLltrBWhuM4Yx +gX8tseO0o4ICcTCCAm0wDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSM5CYyn//CSmLp +JADwjccRtsnZFDAfBgNVHSMEGDAWgBSTJ0aYA6lRaI6Y1sRCSNsjv1iU0jAyBggr +BgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lNi5pLmxlbmNyLm9yZy8w +bgYDVR0RBGcwZYIfYWRtaW4tcGFuZWwtdW5kc28uaW50ZWxzaWdodC5kZYIgYXBp +LXNvZnR3YXJlLXVuZHNvLmludGVsc2lnaHQuZGWCDWludGVsc2lnaHQuZGWCEXd3 +dy5pbnRlbHNpZ2h0LmRlMBMGA1UdIAQMMAowCAYGZ4EMAQIBMC0GA1UdHwQmMCQw +IqAgoB6GHGh0dHA6Ly9lNi5jLmxlbmNyLm9yZy80MS5jcmwwggEEBgorBgEEAdZ5 +AgQCBIH1BIHyAPAAdgDM+w9qhXEJZf6Vm1PO6bJ8IumFXA2XjbapflTA/kwNsAAA +AZetLYOmAAAEAwBHMEUCIB8bQYn7h64sSmHZavNbIM6ScHDBxmMWN6WqjyaTz75I +AiEArz5mC+TaVMsofIIFkEj+dOMD1/oj6w10zgVunTPb01wAdgCkQsUGSWBhVI8P +1Oqc+3otJkVNh6l/L99FWfYnTzqEVAAAAZetLYRWAAAEAwBHMEUCIFVulS2bEmSQ +HYcE2UbsHhn7WJl8MeWZJSKGG1LbtnvyAiEAsLHL/VyIfXVhOmcMf1gmPL/eu7xj +W/2JuPHVWgjUDhQwCgYIKoZIzj0EAwMDaAAwZQIxANaSy/SOYXq9+oQJNhpXIlMJ +i0HBvwebvhNVkNGJN2QodV5gE2yi4s4q19XkpFO+fQIwCCqLSQvaC+AcOTFT9XL5 +6hk8bFapLf/b2EFv3DE06qKIrDVPWhtYwyEYBRT4Ii4p +-----END CERTIFICATE----- diff --git a/SSL/chain.pem b/SSL/chain.pem new file mode 100644 index 0000000..65797c8 --- /dev/null +++ b/SSL/chain.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEVzCCAj+gAwIBAgIRALBXPpFzlydw27SHyzpFKzgwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw +WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCRTYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATZ8Z5G +h/ghcWCoJuuj+rnq2h25EqfUJtlRFLFhfHWWvyILOR/VvtEKRqotPEoJhC6+QJVV +6RlAN2Z17TJOdwRJ+HB7wxjnzvdxEP6sdNgA1O1tHHMWMxCcOrLqbGL0vbijgfgw +gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSTJ0aYA6lRaI6Y1sRCSNsj +v1iU0jAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g +BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAfYt7SiA1sgWGCIpunk46r4AExIRc +MxkKgUhNlrrv1B21hOaXN/5miE+LOTbrcmU/M9yvC6MVY730GNFoL8IhJ8j8vrOL +pMY22OP6baS1k9YMrtDTlwJHoGby04ThTUeBDksS9RiuHvicZqBedQdIF65pZuhp +eDcGBcLiYasQr/EO5gxxtLyTmgsHSOVSBcFOn9lgv7LECPq9i7mfH3mpxgrRKSxH +pOoZ0KXMcB+hHuvlklHntvcI0mMMQ0mhYj6qtMFStkF1RpCG3IPdIwpVCQqu8GV7 +s8ubknRzs+3C/Bm19RFOoiPpDkwvyNfvmQ14XkyqqKK5oZ8zhD32kFRQkxa8uZSu +h4aTImFxknu39waBxIRXE4jKxlAmQc4QjFZoq1KmQqQg0J/1JF8RlFvJas1VcjLv +YlvUB2t6npO6oQjB3l+PNf0DpQH7iUx3Wz5AjQCi6L25FjyE06q6BZ/QlmtYdl/8 +ZYao4SRqPEs/6cAiF+Qf5zg2UkaWtDphl1LKMuTNLotvsX99HP69V2faNyegodQ0 +LyTApr/vT01YPE46vNsDLgK+4cL6TrzC/a4WcmF5SRJ938zrv/duJHLXQIku5v0+ +EwOy59Hdm0PT/Er/84dDV0CSjdR/2XuZM3kpysSKLgD1cKiDA+IRguODCxfO9cyY +Ig46v9mFmBvyH04= +-----END CERTIFICATE----- diff --git a/SSL/fullchain.pem b/SSL/fullchain.pem new file mode 100644 index 0000000..0317cae --- /dev/null +++ b/SSL/fullchain.pem @@ -0,0 +1,49 @@ +-----BEGIN CERTIFICATE----- +MIID3TCCA2OgAwIBAgISBimcX2wwj3Z1U/Qlfu5y5keoMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NjAeFw0yNTA2MjYxNjAwMjBaFw0yNTA5MjQxNjAwMTlaMBgxFjAUBgNVBAMTDWlu +dGVsc2lnaHQuZGUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATEQD6vfDoXM7Yz +iT75OmB/kvxoEebMFRBCzpTOdUZpThlFmLijjCsYnxc8DeWDn8/eLltrBWhuM4Yx +gX8tseO0o4ICcTCCAm0wDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSM5CYyn//CSmLp +JADwjccRtsnZFDAfBgNVHSMEGDAWgBSTJ0aYA6lRaI6Y1sRCSNsjv1iU0jAyBggr +BgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lNi5pLmxlbmNyLm9yZy8w +bgYDVR0RBGcwZYIfYWRtaW4tcGFuZWwtdW5kc28uaW50ZWxzaWdodC5kZYIgYXBp +LXNvZnR3YXJlLXVuZHNvLmludGVsc2lnaHQuZGWCDWludGVsc2lnaHQuZGWCEXd3 +dy5pbnRlbHNpZ2h0LmRlMBMGA1UdIAQMMAowCAYGZ4EMAQIBMC0GA1UdHwQmMCQw +IqAgoB6GHGh0dHA6Ly9lNi5jLmxlbmNyLm9yZy80MS5jcmwwggEEBgorBgEEAdZ5 +AgQCBIH1BIHyAPAAdgDM+w9qhXEJZf6Vm1PO6bJ8IumFXA2XjbapflTA/kwNsAAA +AZetLYOmAAAEAwBHMEUCIB8bQYn7h64sSmHZavNbIM6ScHDBxmMWN6WqjyaTz75I +AiEArz5mC+TaVMsofIIFkEj+dOMD1/oj6w10zgVunTPb01wAdgCkQsUGSWBhVI8P +1Oqc+3otJkVNh6l/L99FWfYnTzqEVAAAAZetLYRWAAAEAwBHMEUCIFVulS2bEmSQ +HYcE2UbsHhn7WJl8MeWZJSKGG1LbtnvyAiEAsLHL/VyIfXVhOmcMf1gmPL/eu7xj +W/2JuPHVWgjUDhQwCgYIKoZIzj0EAwMDaAAwZQIxANaSy/SOYXq9+oQJNhpXIlMJ +i0HBvwebvhNVkNGJN2QodV5gE2yi4s4q19XkpFO+fQIwCCqLSQvaC+AcOTFT9XL5 +6hk8bFapLf/b2EFv3DE06qKIrDVPWhtYwyEYBRT4Ii4p +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEVzCCAj+gAwIBAgIRALBXPpFzlydw27SHyzpFKzgwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw +WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCRTYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATZ8Z5G +h/ghcWCoJuuj+rnq2h25EqfUJtlRFLFhfHWWvyILOR/VvtEKRqotPEoJhC6+QJVV +6RlAN2Z17TJOdwRJ+HB7wxjnzvdxEP6sdNgA1O1tHHMWMxCcOrLqbGL0vbijgfgw +gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSTJ0aYA6lRaI6Y1sRCSNsj +v1iU0jAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g +BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAfYt7SiA1sgWGCIpunk46r4AExIRc +MxkKgUhNlrrv1B21hOaXN/5miE+LOTbrcmU/M9yvC6MVY730GNFoL8IhJ8j8vrOL +pMY22OP6baS1k9YMrtDTlwJHoGby04ThTUeBDksS9RiuHvicZqBedQdIF65pZuhp +eDcGBcLiYasQr/EO5gxxtLyTmgsHSOVSBcFOn9lgv7LECPq9i7mfH3mpxgrRKSxH +pOoZ0KXMcB+hHuvlklHntvcI0mMMQ0mhYj6qtMFStkF1RpCG3IPdIwpVCQqu8GV7 +s8ubknRzs+3C/Bm19RFOoiPpDkwvyNfvmQ14XkyqqKK5oZ8zhD32kFRQkxa8uZSu +h4aTImFxknu39waBxIRXE4jKxlAmQc4QjFZoq1KmQqQg0J/1JF8RlFvJas1VcjLv +YlvUB2t6npO6oQjB3l+PNf0DpQH7iUx3Wz5AjQCi6L25FjyE06q6BZ/QlmtYdl/8 +ZYao4SRqPEs/6cAiF+Qf5zg2UkaWtDphl1LKMuTNLotvsX99HP69V2faNyegodQ0 +LyTApr/vT01YPE46vNsDLgK+4cL6TrzC/a4WcmF5SRJ938zrv/duJHLXQIku5v0+ +EwOy59Hdm0PT/Er/84dDV0CSjdR/2XuZM3kpysSKLgD1cKiDA+IRguODCxfO9cyY +Ig46v9mFmBvyH04= +-----END CERTIFICATE----- diff --git a/SSL/privkey.pem b/SSL/privkey.pem new file mode 100644 index 0000000..a31c25b --- /dev/null +++ b/SSL/privkey.pem @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgi8/a6iwFCHSbBe/I +2Zo6exFpcLL4icRgotOF605ZrY6hRANCAATEQD6vfDoXM7YziT75OmB/kvxoEebM +FRBCzpTOdUZpThlFmLijjCsYnxc8DeWDn8/eLltrBWhuM4YxgX8tseO0 +-----END PRIVATE KEY----- diff --git a/backups/backup_v2docker_20250623_030000_encrypted.sql.gz.enc b/backups/backup_v2docker_20250623_030000_encrypted.sql.gz.enc new file mode 100644 index 0000000..1a277f3 --- /dev/null +++ b/backups/backup_v2docker_20250623_030000_encrypted.sql.gz.enc @@ -0,0 +1 @@ +gAAAAABoWKcQ82d-qjTk_MY0WHwXmauC7exaAA5d7AiWFzZ8P1C_o12Tm0d-yLRa9mcuNucuzzyarL41sFaBxRbKWdYfVkY9jqo3Dl1Jn4qA3Y1ftp61xnSWmYlSMVFKWS3N5K9AO0-yD_XBQNHG8s1DEOtKfNpEncRndJ24fUdBEBLvQ65ip1EqlGIvfKLEktSRspv6THImTUZJvhuvLY7k9b-y4aQVLxgqmgZ-8o4JVefzEDbjZ-37hvl6yzdYD3Kc0RfOAo-fQuPq4EZ0EaZuCQW_PA3v8m3dHrg2ehur-qDKyaiGhIFIvBkKqAogSQUbQAJH-fEFgUeMfnRHe4zcAFUUTnvCaZy_VgrddHOjqjFnBQIIS-g7BjkOhy_P-SE2y-pvJht9TWX921uXWOiw2Lp8f4U8k-NFggPIijmLZc79tTaH0IJE_Eacj4qxwNtBmi-SDApuYjKkUrfAwjiN3BukZ0Aa15cHNiUab8eq1jq0ecBN0X5xZaH6K7gNDVS1nmtLYwjGbBTEi8SUdw1KXmGOAX10VPtzZu0DuT--rTLX40wKAWFlMfaov_BI24lV5kYdlf4xwiLNs6MKLIqUN9o4cBYfv2zMM76_sy3v44F2oWQPNj1-YqGg5X8BxqGvt8si0q8Odg3x0M8ZJDx12Nxywhher4hC-Zc1t13e3ORs63IdscMMHFRGpeXMJ5weEFr9ftQKO6j5xnk5Af3P7ZyHLitNMhZYLGvP_px_bnvn2CmDWYU4-WgMgyqhG1gL8IWUbQO0u6eBe0RbT_jtncJuJMmisstaCGBsvWpzSYCkShcMPtibI-xFge0mb8fWplaxwOtQDtKDbAttgJQHh3rXT-Nu6yBg2oCKLap-xnlKWphlUDyFs5VUV67pP8CDLjtpQeLzDhYbDTq6edcEWAqgX4OFuslCs7QtPRJo_Ya_TK0Ar4-Z66I47fLks1IVSEL82zlb2rIYkCZ3AiGdXv3wBtISCej5wu8tcayTLpHrx3VPLu1XP_Rqc3I4CP9-TJhIR7tE0ZBFxKhVMWrinrb6QvOiXEU3x3XTq6fE0nfI6TADAMTiEUNWva18ohtsMl7Yz41O3e-wf-07at7zaZqYYqPx7fS-3Pc1QojW_HVDV0wYfffEjzQlHxpjYdCTyLLOfE5wP9mxRX4c7EDYpJzE8gBEzv76xtM8o2c5HYo4Q_Q5Jdxo7DpF-c8MSDE1w4ZM_IaRSkito1KqWa-8m47nVcx5yk6jVQx3hvEk9G7Dvzp9IMO6P9PuzocAuO842Xd6cx6F7DVDxv2TR-0Os9xo3uRXpBklRrJQjTnDZ_6aw2iPyYwOZQI15KzWGKPSYWodEbWyOYfww30Iz1RfCRgJ7RRx5IL13E_Db47ce8ntjxjtaHF4O7vZPqedP6wIXFP7rWNqvTMwpyJFxQIPb33dfGa4oByW6uPBmI7KmANNaODXhsM0rjPQIBg34pfb7v5Z4FVVDuobZZmPYGeVl7QNU08ndrgDxIBme4D9DAd3IpT1nKdf96UZQo4HaPcNXNxVdaCU29DmJRz7OsiPA0FQpxRtLELNwuxPEpII7AKlzcROI-G3hVYkfvhxZ9sqscYAMgWIeWEIjXDJQcbfrXxz_iYmLRFYy5GSgE7L6E6PyAm6WeJSkRmprp8ySM44nlSBpzFUizXlpFlr_XL_VQAG24TTCdEtfm1D4ktOZvnOAuwqUXT2yl53BXSi2oNvfzFrohGzd1BW5QmGneTTya3Sh85W14MLw3JaxvwVbZ2HD2Z1g11naOJZjeVqT4GbjFX3I1kQwzSlJ9Gc3oC4U_L3Yy6p5cELdcwA3jPgXoBBHZsBx0BtBK0dPvajuVZ5blLvEmx6b8L6fqz3J7rQ-b8JNgcPncMJAE-TNcEo54Hpj-fb_gzszvag3Ti7u0-9pO0EbAHT1Dlp9MS0lctw3qvP96Y77FM-6oNgnOPY_AvT0ecxiUPCrjLBh0xx41uX_NgTAyQ3Qlpv8VqnYFqrX_yWNGLv1KxGQ1RALobpQKrq0HET26VrqvWd1HKoMSPw3wG-HFtPgzIVsbYRemaACgOVBFfcEpwiI6sNUPS4fNeSLIqwNQ-tzc-fr0w8N9OsNSiEFZZfrJwIvzrUftii-pto_311lriQXJo16qFqFbXbBKroFqWX2y61_sNT8qs0_hU3iWfDcwywkXsBh1q5jOkqECphCUZEXFP1Qqy-ed8LGtB0Vjnjtb6Dj5B6ieP3_2nzw9RZm9ug1XEyk0x14AbNIc6Xnjfda5s4zJIeFeX8gljFlxr5PzFvLlzu7lFkpyqCcMMUPe_4SOQ6Cqh-d_ERutViJsxsr3yCvrLh_LNR6x3C2eF8t9D3mv69xAWruKDMOgk2JrZOTDenATIPD8YO-Bh7tpqi2a5BXm0u5jOEFlMRQ3D_yLfTwwjtLNvOZidlkE0ryygS9CcglXtUrnP8tGD2viUl4006NuoSWzsFHjttyB2sJO6wcvMNov7ON6o-s60Dzk0VC2smaeB0Mi_cYNpENJBSDLBcUSCYh4RhBGuzZ96cgBwU3w_Ab7aBhiHw2e5eZkcBG1hvJJhxmyEbGQ5qROk-4VmWAwn52oedKBEv3IgFGcba-uyT75muI_0KUWuDniz8ktR9WNhUWbxCzlpS_hO235-7m81grW8U8FpZb3ZAM1WLwjqvu0jRGj-iN6AT2MXman_8WQXvs9T3Z4qVzseqPf5x864p8H3hYaPGbQLbhRTjSJOMOALSojNCawo_ClygOK_HhSH5WJVpHA3CECs4j645qknpEXvd1AxQAIaPROa4CNWVogqLmQ8CsyfLEmhyYg7aWjFO0Yn54wlO7Zcv-7EeS6C6JFB6djh3_dOc-cXuRS-ktIrY2zQUfPCSjIl86pecbHc0v752wfmx5T0VvYNdmVEuwpnjWYZfDiB1Rs7XtwvqS3PooUn0MTzHfrSlSk7cauzxqSAiNDRdexftmlbFUcmRf4m6BLfsI-eGxtJgtS7Es6Of9UIv1EhXFH1BgJVyiUIRU8QkgWFQOEdakSDeJa1nR9BUl4xF1eyO2xstNqrnAi94Rt-fT8RkiRJ2Bb439jQ9pA4QgrScSGxayYFjTW7LDmKhBFZVtBNT7tq5hXaMnVNIXHQXVhsK82kJfI392Di-wmPslgQVf8ttuYOGYWoh4KxSnVdOX6nNoLUVIHMWthHGT3cSucaLtHh0O8VZMNtEwrn13dX29KuzCfzlPxLX5bdP1Tmanozp9Y4w4bDRS9JpAL95n4RmtMzzHt63JJNIlaYDY4wThsfqHmPPvzuw8pKiC3WxigCzIWr2yqa9ZgvGWjxTaDFsSTBBXDUidN6hJuEVRda7jSZNCOgCjakKq9uS9IZFbIeAWymyODLSN0WIgyuqzE2tO4kIBbJ1s0mMJt687JNp-OIilz5PSOPbph03Sqd4FGXre3qYntepGT1zQlo7FiADmpqWeULj7HVYnK_HDG6X6vHqYn5ZmeJMql1pceXRvviFXuJlMUJSr8o1N48rdg3OX9WOku_X8vuFqpoElQg7EdWRwnuWrJNW5j-y0aZ_NbuZu7NNkG9PpwnwQM1Gz2jmixSwZlVIWwYuIm7jo18oZY20ONROSO5xzRH-OhMUDBbawFb70NUM98v9Oip0LBoKvs9Uugc4o91SRAcdf6Cxs6Ig4uZAQx8z7r9h4Wsukz-GF9YNVGM3V3Hisj73CyL2ahk7eije9PjjBzFxUM0WOA4dnXgdfKXa64PNqHzcdf8GXEX4142-FKJ7TLNk3mM7JP4wbkvF0tXqLch2DOuIkrcx25bu-bRuHiVOhynxdKi52H7RewNthO9euDDgrZf5Pmn-YOwT5BXNs7azz7bOVmKJ0qtOrelCagijK2v2VQIXNbkAXUnW6lewNQLEAt4y0p5xXXnn3IhkWHOK7QbdDdJqHcKC3cdrqa3pxyguODNc6Lfg0FB1MgrX-BNCZVzSZDlTfWe8fRcNUfh5lUZb3VZuf_lzVVetXVhd3EyyMGgVEoVQo4OFzyIJf6RPXZjIRPkgg0yB2_Ud6YoBXJglhHExNbIgtD5teccqOs8ay_I-WZ6PWQ4YlUCxZTuNIIWNTQzCVOqj9Rnyq2rsz3Hfm0chLMFrxiruvComt6PCU6_yit1y2XtkCj_9VNn4FaitdNYPHl50hsgZu6hE6wLXqns7L9U0tfNrg-PqswSSdjmxi14KHZFiG-CbaBaej-hbDeThcHmC7o82Br8SGbznJv88w44AI7Mx1e9p8QAFPShzSbVkacA8XH-VZzfzXex5oXlDtW7ZyUOYWTgpZ4bq9mhSlU30vmpITv9GBNBOUc7BVNu3D1O1usYHJtR_X2a5XH0kXUwgkyRawiwmtcxFwiTVI2YDIoXX7fJPjoF8RwzJG2BVk_CsE2DyhqUc--XhQRRoby-rQu90L8LiQuiFkbIb4cGapSzEeQ-c63xWuLghK7e6SpzntxD_GVYs1E0JUT0oduRMY8rC2n92tfCuSj48PB7EtDF7X2rsdO3V-RHru7famlZMgMPeTbscHWAa0kBHQ8relqQDzp4XT8PVDE8KR9P5fgqo36b27_1PNLL2Ped3Eb6CLApKmNV4tbEp1ZRciNVHzCkQbxZcO9wiRnx9orV32X31TqWnz7O98OWNIaZLT5Oq8x21Nw1wqlLotgNfywGzIRiHmW7zaP1XyKeIsb4MS3usQ1YWXKOWHaGV_WVzE2gpdk6wOD1gUqnBuooTy1u-us1u49hv7iaDmWEqjRsNePLIlVf2bqA7wm3mDAKWBWuejip-hb8iQEGV3nkqyUTs8nSZvGGzQtIFoyJHQ9wQRzgTAjl-RZl3_qc9RvYjVwDG1nSzcpB6MnaOzMef_dupwsOCjHW1NuoPkHHa1NqRbfFkBGgKN33EhrMfb6RJP5QOsrHHQcG7yePgNoYiOm4XSAvIISiDwyRPm62LejhC3Lns1EEaIfru9F7QEd-RXEXguWQiMu0mHSdc5L1MTIcUjRbw4ZnrrzQhkEGSMRc3lxPMftCfwYdZSB33mo9krhcDyCV5ORK9EUDxBzvmv-PY0pM9Pe3DY06JSPhqJ-2UpzLOymAQjyaLyGl725Ij3308TA-QBmyBxtVEkpHEL_3iek7PcFAps3QlCNPgQBjnOwYIy2BXeJe27rdlXVVDx7DnobNz2SyZq0wRHKNKPqzjw2bKjsWsHO_UQG-0vVgd7TnFmA9VUZz4rKF6x-iJsmjLbZb_cPz_oImaTomK3Eq38UF0GruEutUQ6LixZJIj0Nl8KKDQegNAXsCPfjwYVbsbHfaoSSSBQVkXjdbgBDOWLAplnHy3QxC1QXY33zJ54Bs4YFZGFVMj9Dm25Z1PCvBHO8ql8dimO6ndwDiDaSIQdOD68JRyNMLWLN_qGg2gXK7bS9xYY0OfbvN12lCIMXUrNSEMLEiYPxrVBWZn9Q3Hcfn2A4d9BevWClnjYF2eb1dDRmcc5itPH0QuAbx8aUS2QusK4Kd-x962WaLqxSa4qsouFFFN_anNe-rSbjtwZj9tieO_esURDXLgf00u87Zkfc-BvgHlOc1548qyWHuafhiLcoeGjiQrk46GrVYFovp1nZZPE9N4mdmwxNWHtzTggXKSxQDO3JvGQm_e5EO_VF0cBMMsEWa_2y5XwKKogISnS3RWf7eapvqS-dvXB6ZikZOTR092RU1Ic5BjBnrfqQZ3-Qy2jJHJbSnTkM0feM1Kq3CBt1DKMt7Kp1IWXJvqMRqhyCAbRenDTbVi4suNJHWQQ-vnnKqAsth23AsESPIdytbtRsSN6UnaNOJfwhTXW3anVO2oCzkw5K1X8hSRd5PdPwuJDaZWvpkvnJ9xqjzyJQJXxhU-kESA_-MrGmk9fhZCbmewwTl1GtAD4s_r5Oy1aeNPlWcr-uRSgeq9-XnOxUcXTgmqlj5CJ-IDt2yh1EYqvswX65x-z0lKYgP6Nf62w-CS1bTQuP1Q6i9AMPf-Ta3EgcoIAlsRmjIDbJb5RTkEtsBu8SNtKedZO0kjiFOkDeTKWKsUGxcLSNWkkELUCK-tEJPOpBnQ-cIN8ilYHWl5NYgdiwwOl1J84VsfIUq074RvMsS7AxFJ76ymUOZSwpOJueXT2VsGfTYdKJ9xUE0cGs4VHLJLG7VXSs1iluehivRJgwfl9gjkOCC3lrJZODzPt_EMbYy66FlqiLuY9Dia1Nph51KTsW2gZ04AjASjhO9gkx6nop9Uie3GPH7Zr5QC3n2LORsMtIXfJCArckzQjTAqa-GPzlwHOn5B2nH06l4WuJM8X3Vb8G0kcAKqeBeH34mfloAtZvhi4VgjkC-_GaC2P5aJPAzYRXLM4RtU6NF2T_sb0evBybsp4DpavNKEc5k4wHCfP_HoGCk5Bt-PsSlWaj1fntIBek0m6T6gweoZwzrC1_UN3xhom0dLgTgx5x53PeKt5ESdX8Vbx0cgNZJPeOayqQw1PpH1Wg6VanCypAQyKFqPy515tHgRmV1CzU9VOa30SdkBwEyfoIDxuZA-285A9zF8U90NPhPHjeOG2EZr1Cbs1cjZME3ES3i3VQl2k4vqLF-9AZe2sveo5bpsuXFUq9v_L_dM3PMNVQLrda1m7mX8Elp9Rlh3fFWZqiqH1nc-9FJk6Hwtl8uZKg_2_p0cVis5pVUGUKtXt_5_Jn1KiLZMtqKJDVd_n_kw91vYb_oVVMqARAWF2zT1YG1u7yOMds_Fhz9AQQ4cr1zliY6PrcBzTcncVUskmWFpv6LPVHNRj8yCj7JTM_7umPJaO26nXq_GWeSH2qZd5HgI4U5kUX0XhKmgXp_D61js_ZSKMCGlj8wTkB3b7E0tF1IVjYP8l-pttoVPbteMZAx4owFiut-GefJ_oymmrx7J57q7m2hXMidDxxBWxqcrY42aUq5E2hJ7OwKExvFriTyjKrQbRO0FKiJaN1s6PVu7hIYH_rPI2z_ERBxTycWMw1mZ-l_rnWROeuBV7b27J8h5txiZ8q_qhtxAvUmPfSyxZ_1xyDZCJYNikWb_j_AJaYUJXNG0te68vMujhHXnFpVKHq2fL4nt8kc5567abCmqElEJNFdm8Aoi6mHW0kqsnlDFEQEfI1wHwwsoaDABUQTe8rqqzIDXua0xfB2CVYIC7l4N5CHOtusPgkYsrtSA4p2jywJ2LdzQqSuNeEyKIyIRpkvRz2g29GtBs5Sg6mJBuG7NID6jAK7jbkJtkT5rzdnryNQgkft0EhlIv_tKKf3wVfnIyDfnUpI_xJ4WiHfbOLWyoa4cOHBFn61c6nKSjSkZFZjYg0B0ajf7bvPh6qX2G21OSQFnS8BHplY5-L9ohy6UfV7Efefcu_6iDj634dpAaiZjg_HC8ndPIP7sFv-UBEdqNyXt-4kKSUMv6bGD7QDpcpuU1FkVy7DXzlKCD3yIVMmtcdrfLMiEsqiwbSLXiGp3dCgP_dNNUzkFP3QWg6ng2J37yI-Axs38KUmSi2Rsp6aT0RzAToFuAs-memKrdTXrxklWn51k0ds3MGUQbg7lHwu5SiLWupZjE7E02eiU8u3XKhVQdrSfShOZOGavhyvdKXUxEBtQja4X9YLtgWYv2B4NJOkVDshfXKw4I99QluY0vg_mgOEMl4rOAIFowJvpaEqegBUKlwyD8659wZFIe-l_gxYpVb3KMZU1tNveA9W_zSuaMih8S102BAzUiAZKtulEt6fhtwTxr0NnF2sH2ucQgXhrpJjBWWQeOnOD9ehy4QakHi66eYsUeBvY7E48798FQ0rQDQ_2cc2NEQlhiDTU9w7mbkmI8PBM4Qf8gSTxk1CSKIElJqsw9XxPdNnxHwVDakVy7aQZc-pop_II0nhgUEGUWp06N5t_qzeR26V4sAeO5znkMSo8ot0CNpDjSykQuLPOALRcIRWBdvq5TtBL30phoTsI526kVCicBAyhMvj0W6cMYqSNcdyCv7aEBKoL_eMLloImIll3YCHZHdyB4Xb0025BEt7SYu1ypvhEri6fz79mhM_2mmAk0UhLm-iBvuoFxikwAY7Q986vws0QkDawO2XUt7ZKTa1pkLrVVQEvCqIdWxn2FKDDUaMK5i-kEfHBy9CsTzYOpKgGFZtzZTouZ508KO5H9jOryb8FWjxV0Z2lGvDUmmzFW4armLTuwnDegMUP_G_igRfp-j2sL21D4yJvaVM_JkHbp8ei3La_Bi2VwLEOIUvM2Knp_wc_c81K43g4EXA8UDSJ92guVFoCYNpVYcip8X2BAqd78yhtLJNpY-SXl0L4hKv7LxGbANLZFPFE6OcDlw8bWXWFqk3nJY0DUvv1lDPKNKunVLO0KHtNIuBaS07gXNxHDG836kB8nS3s4bHUL3sEOkDICvXILdK1Khmvyg8UYp5tlry72O0aq1IOe1_2kxfK4ocgdRDM0UhE_MXyJUWKhr2ZOkfxzR4300_5ltP-yPiLVG2dsnMRsUBrGMkr-gNS5s5x4OiqLLfRm8nGOge70wmIWvFc96c1igpP5ImOT6AOhdscBM60Dv5evZXRipIKJfafWxUyUN96B2bWWm5lUWo2QZeraqeFPA1hZTT8CKk8u5iST6hljTXB2GdT12g32OJpsQqPmS4A4RNh6ABYVNlEd3L4AHf3UKYQ2AJTiNbB1Owr2nEJIm1RR3KJxYFU2Y8iiSXRwJO1aQETZJmSM4qDHl-AgXvEDuvSzg0-U7yiP4S50DlZPvOlaVUC0scKe8y74Oe5_iOddLjAFHhUIaouCmzwEDUm49iVEDqRjGfkcPpv83RSaUY40Y79bULyOUPVQXT_2EbmRMlDsyY4HwiKzDcc0FhR-aV1MuX6KH5hdVIX_k38lQLMRe7w_YSQOIsNEu8c0er3Rqk7HVx3Z9ThNcILH8JiRK8kOrvRQVe-GXNv1Raq0zQmUJeuBLl8rOs4ilDI1Fa_P8iuzIuyXCQ9RLRLbHmBPMC2WOnBJ7FL2yX_Gw4mx6clAd8s7y6U4AOPBjMN509R4FBSfJ-Ar6dEWDz754ndt7kv5cnXs5CyjCr0g2x9rII75Q-BLBwpgHxSpL5VV3Hqpl4pqVUzJEXp5kaYp8Nfy-GaVomDp8V2QhItoOokx9OVIzQJ4jsjKBu2tYPOg7CX_9o9AZSRAWiwK_TTmpeduTHJZoJDx7rqQkl_BDMmiMrDjRn-QsweTq0XJgUEVngyxEAsiW-yif1pVyFGMjTwhlhJ0iVBR-qSZTKUJFrQJFyekRJjrHh9J9MJRQh9bh6suWSh91CuMB9_lZuAvHv1cWfB5_lFOxZEm9zgB3xtOD-Z9OfmyHfIwUBnAt6Xg45CJHfsMW4GQn6keom5xhddNmIy_Kbwi_zIxx_8ZnRkJ7mOr1QSPL8F93zVIdPtuh6V-mhS1hQk3MFgOnNhjONOqbCcEgXZLckgpJdAcOnXkYuhmAWsULrEcRkcdQiHeVgF7YMrYRylZvsRusvx79kenFiSPqVZvbOtJLaXxfPC7aWGLAYY_q7fUiqPm6ybIcFWiLPrCGGmh9bywl2e8R0rzoNx9KkEPmJsloVfowZn7H4vFrcqu1qWq676E1nZnwn7pt1GVMr953mLCm7xz6w_Ad6Gfva_WBgtQw5BkM40I8Gt4nffC12McDpBZwF0Uu9SEN8FtA6oNOkwN5eh3XCmUlzOumvS4L2_KuLtMu588BqqlYvZr1DjCzwIQwGMaTbnbfrnGx7Wj9Iv4iFXadOGX_NPTo_FWH7kowQ0x77bEOKtPcohz5OU7XSsrNhfVdF3Q1Fz1Ob0leki6kOmldfaluwMewfu7pbMBj1YIIvna-JSHHEtbdb_Z2_CXN1cepsFxVn2aPEEQKvJuxF_hOKuEfip1Aucl8iSGsRXfL2DIcuc-g2QyFYID38PimY2PHLV8SMg8viC3oaZX4Ez5T81SR64Od0NWEy3KcYf98rFfhbej80qo1UxAancoyIPPG-h1T1OTD0gm2CDlYHCxVN6z_jRW4FgOVE_qeFsXoFYV3AMxVxsOMHC4cnGxqCZI7MDN0feCwdwzRPw9kVTfDvMcloZ72GiO5Pz6fAfqW031_XwnbP9PVXGkC117TlkjZ9R2OyfJMVMXeUMsxvF07uiKewCIBxjWPPKxA6Gt5P0Icb0C00GT-3NJqWFeMn0ecPQjNa7QtAjHllA2FZ7srYyMrsLy-15LxPZle0QBh2QRRhcLkMVwr7zDJvtiIivAoDIjRJBWDEhfuv_sLiY-ySgq4X4hLGFnNqMUGMBCGgYlKiKb0PeiHZ2rzpcZq5Q2mhRKhxubsi4Vg8jhrm18A-hqYzi_HZ9R9Yq2W9q3yAKRLm7zQtCVuTSR2e7uM0QoQ01c4iS0jUhReABxJ3Y20lhU6WOjn8Z16zdFj0G4paGngHYdHkJn60Sx5hw_HTXUP-e2m-Ua4xMb9Bh4UiEsmQ-1yxFLHVA4Oxh5LAXgJkFsPNr82uc_cEv-ihk5Cq2jEoqAXx_ZYFZA_CDLnp1a1FfhcvF9NBn_j4ZkFTwGX4axpm6GbMd-J5b0D0Wq8PJ5h0uM-w1JA4_YQAs_J8H5ASfqSGqQjvGavGGBdmBmELNIsD8D7mx99Ylc8klZhlWD2iwqviqBwxgi3QdgYYj4ERAcoIoDvfzYLMvTUVCnRqzafMjqn2kUfRkqpE4D1gXO44dsQCJKvj5EnHDGyLYPXe-Q79So1xWqGMvo5t5X8O4jsHHFQR-3-X4OJK5kqvi5GZhOPp8wMstFZyHw_p9wcKWAKBQhkxhRNzdVFMj4tSGmaHh59T-DmrDIpMVuR8UMG0dJugbiVvcllJHFaKq1waBqTT9AXOB0qWfqA8avupt2uvkYoZQURH1PBSOtx0xvJsdRNHud3T1ZlkZTVat7Q_l-LWtuKFXGAi6PonOpCX0TfjpBl33jp5kNwGozvcGUmBwAyI2NY0aYxOkhKswvTh0HsIJ0m6irldLLKi9EJnKsqf3PykbS4W1t-OR3Q4Sw_e4G8k2e5b5b-uolvMO_f-FYirx9uXXlJVOXdpzkDNy8GZM04kNtLr53VdMkTJH7kTPGhVmPyHrqA_gH1tWqmB5mp2ZN9Tv4gg0bYQ1O2etoUZLKsJ6XaFeFcGWzfzKyc4RFMfd1J8gN1nLbt0dh1Q7KaNB0A006_MKASoCjrDIMUqJcq58MjzfhQaIEdwBli70eNP7WbGJ-Q-hoq4CF7pxe-9_pRvrc3qtJf4kvOLo7N9J-obT3kVQXJhdZoNd0rHFYQT8MEIzF1QGqpanflmjwTIais0CHHRVx9RGg88RKZ5n07dvmqRC0NZK1_tCQwyf--Emscq4TqE65cw8ZBEmmSExxn2thhdmzLGdRNh_4uiBdtD6fsnq9YM23VzepRsQ5GYHtPCP3Dj05FvovPMFr0A8GcSiAtAxLWa_n--niH5oLfgPwsq-n_OFLbl-2Ac2SD0lTIItj3-VSFO31WZX__xtIzhU0HjnTrRSyBGXEBSoj-_ddDmO-_17sRx8ZZZ0fUpBVjbJexMNa2kpXLblJziOFMl3kMuW3vdcn7xT7yrugM6ar5-6ZNIly0GD6AUsshG60XVYT5xxyFr9GfO-BPWS-AZXgzXB3dC3E2uYbOle2wxUuVUlBJjbF5n4BwcGVsFsvNf5jJo2FKxyADbOvbZwTiZgiY2biBjavlmM4PwoFLiCz6UrBI7p62DeAZBSaz7vXJQ2GAyShyVwLeu_AIjaQRVZq45yCxR0iUFDz5XU35MhC9yYirC1oncDBYJqiSecA4xEWuG8MoeJ8TttpRz1DDF9psw2crhux3YS3RpVBP-3SN1iSQdmQCkUzwZe7sI8fnlwQAH0xrnB-Gy6msdJvzd8vfV6wpX1aDP0yzNPKAenyM33NMzBeGzZuFZz3An8_UBlVsa68H7lzikR5_MNPfzEFFLR-4O8wz_8qYfhvngzCHm4jPaaaco8d-bcgEernN6FdmX9yrAaYbi1dRLQx6iBCezYmoKNVQgXQss_tSuZt1nasOW3DkL8TA6_g72R9-RqHRI3I---cwBFUX2FslySkt7VwiOAOxvgRbpfoFL1ZLXzTc-SFmCLGvG64IvPUotOmjyOysS9ujxfd-FXodoRwGz3rGTtBePZUKO1oJ9cEb-l_8P6SHofTHXY-457OcHIg7OzlNVZ06TioK4UVA8WfU_QJycHKlcYipTxdI41qI3WEWMTItxwlnvMBsYm9wv1xq8hrclhMjT53wg62bTNjvK4qmfnU6d1nUP7NiknupfaR1GEfsE1rqZOfS6JnFLozewbFqePikXutTX44eXI4uX1hRtI2T-3srjvtnn8a3iVEefdZrMYTHSVUJcd1_HeJHHC6yxACO50zxGDnva0Bf96VbCs0JC_OyxIxGZ2boRJK9ur1FBpEZ0WIHbNISlnT32RjuOsPLpyzvY7H_XSzxoZf0_9JroDtp7ygu1u_Gw1L_ZZKEgy2qem1giL8wpOHaqggEv5vj5DyiBS8oAceTXAVk2XoH_6zZy0useuK3qqTk6B2GAoTn2kVejM1QwABdBPbfLChubbhlrM8_L8Rh-6ugIdq82MA1gv8q03_yoB9SaAyObQdWuo93T4OdHZAnR_AvEsshf89gNSt3onO6XQHnbm6Yd-Jy2f4LQLgF5X7klUh_qMW4HVjmu7Sw-C4BcmEC4VeswTB4EAel0mTF0avnpRLZSJi2p79rfMmlIXyy_lAaEiZF7ZyXbTUWPQdzZfCO4mR-PDIP8yosJL3V6TUGvhHFvY_bMtrcJ2gO-kGkfYTvXqcRDiIQS7LXYHNdgqGpqszpIpI2VvZR02veEXgQzPVjXsQ35-jBBIwrDcWQsgi_IpmLyS17AIKyOVLVp_VvdW76vdPNxOOkANX7Gsc5-PbXPa1ZjfBpKnfmJXjpiVt4U8FeuUeIjg8bLerbe6L6RLlsyVUldaQje3I-atjRyGZjMDBdd61HrLjw59ByEseVCR2vg4JiCoIIyWcO5qVoqAn5fW0Gwb17fl6vhg19JHrCavM6t1ZvymoTQmbGgPPVa2H_fI6AWUGHZEKdnj_N1Ii79pFxeCR9l4vgvWxjyvR5z7yvnHIBItZitgodGb2ShGbF3JPuXCLwbBOFGEUj4uctMBWRlb9wMmaWIAP6Q6kQomjykgU2PsTb2eq9ZVK-Zo_RVC6UjSqApicdeqnj3-hPqGNyV_yvnFw_R39_kZWbGSescph6Pv8fKHnBgEDLl5kUuYw5gAMFbdczh08iRLM4faj6pGMD_NwCVLlYg_8RYljLmQS8ZRkQEvlh8p3OPmN8kWZNYhBVTCi2ChtONgK9kbY2h8SGcOYkh7ikspCkWtF55NCUQJpNauZPl6cIEIx5_Wp7L1OLCSp3JJP-jE1_ZZnvEMIEcgPJbdOXTkUjIRLNixbUFugfnuWeOnVh4KWfhcr_1J42FNLZD-WaSmyFABPp8BkpB1JyvyhUCkRaFUyCy29_FdlCyKP7aoAXTVnPzReoaZT5eyefzGohM96E_KHYiN-0tyydXFRjJ9tUA1MVGp_d8nXJUAlb1BVSOUebqirSWk7h4mXV3e-Cc1tffVUIXpwgNjvm2YANta2EV4UFnMZtatIwbAQGsNkoAn2UXg1FiTA1RDHzbM185CdTgco0p0prj4QViXcIxRvKMfyllYmXuXNww2cgh--iL_EA_fCw4Du9qvSBW9f2mg_UamQvs_MYTfuub0SzGGhdC1_VTstKzs-RVHO5Nw0U6AEGE2Z2ITA51deplms3nZxSpRk0XxxNveyRfj9yGDJiZA1AcQ1lTL9TTrc8Xnp87VJF1whS-XO_HlQL8Ex1C3okzmfpswhOb4VH1sxlUjuucQptnuu0fjNgl90hkV5eOZ4QPxN9y3XyhL-POGtMgyjp_csfxdn3-WAr_bEDmwo8QdCUrAenCxsLGvYPTkDEhUHkPM0CrCOHkmOTmEowQah4V8n6Cc2GzGAlV1fHDjCYlz9WmViIWLXspc0hCq7Ugt96CMWzqR4H-ZUnfGQfGf4u0SiBthqT4oT0gLdYq6Qh6lYildLlx3ReNmPtGgBta22MXyGtinlqFXl4EIDb1hPWRcq1owleGjaNHZLGssNQZyoNnJRAnTNMVKA7GeBuQ4uL0_xJ485ix0KXT-Sizjn0Y8HJTRRtWlKuLUxbRW6-2bgjIWXjzQshfgoQgSzMGxgyqj3Pfl8OKm63n6vclO8S_-qWzoPGAJaBLG7qnHJ6W5uxKYJAal0wyIAC-u06A8qJgObJGOeepqDGJ1rb7jmqtu5bab2pqHc4Be42NsZa2nVWhrMYSRzABgUvTiPQNRQopLrNAZpWx2nqKS30PNF58nXldzJTf-sEz2f2FygjOiInVKNuWfm4aSVRMVM0_mUOZVaDJMwZzJ-9A39fuLkJNAlnISLXKchUS41VLSfyFc6pwqET5qzUpBJzzdPZtI1oIqPfi6PcbeDugoTAtCYdYzqFp-V_RvzZZC17K9Jt-Tedh9_wrpt7Ul3f4KzKwZ_8Mg8uo9yUyRBp5Qd7ZFa_E10diFWOvMk4a7e_DrhEj_grwB4AC-OJ0cKrJCgKW1FZtspPnSK42zh7cpTGFryCD4y3f7NzMS5eV_HlqOmex8NAu3Fbkelz6zpef6eUlzrchWUo6Il9wkg4kmeKi-jbXAI1tUtqwigE6ojiul0iEgU3Vq9YmxlaYBBKCs4niv2nHbZthbymoT_gMK13LxncOWAIK-iruBpk-e2jYuufETmvq7MA0ZouWIQTb2we1W6hlkYcRM_HTtCxdBXIvsfkrhyO-c2dT2Hy9nyAgayZQxUy7jolWyGVxiyS3u6wkXStgWy0X-RV472lNVCVyZ5H8xLr3SF5XqjRXsHWneqf4QnpH5_uvWBLbqMUEnJ8gZyc9fYQXchXY3HH11cEJCYkTQK5WXitADXXjnBD8_HkSbV0HPXa3UYzAb23TMguz9mi8QGC_045XjTfJMNg9rH_IGxIT0sFKalghTRn-DGK-bvcxgdYLGAwsB49_balID9riKCR2--bvvcuSwzqU1nOa6Yb6vdcxSGMmHuLhiH_G_3Zj64uC4Sj8MYTZnpLa7tz7nqr9cSm5qk8a8jIsAuxy3J2oYYZHtEd6d8WMXx6dPggFpEOZuhgkZOwHq3G3D-0Jrc7LZC7ehGM3uNJPiBy4KQhy2tw7Nkbho2ckg2k12uNGMHPx_VYf5fa53tqL8tNu5MYpl2g4nBPGSIlpM-kOM7m570MLpaM9-QFhogqREftlDBvCA7TTTzD8N-Yl3VRi-nlqzgt-IghU5B6_LiuwrfYuTU7SKG_HEPQYKhFxGP5A1i29H9uqCm07njkWD22NtY_xqxBDDt2oy0EXGUApSSokGyibLF28oMX_4x0WQaH3x5IH5_Z8l_zlKH-Slm_HopxZ1fc2LdfjEPLOdcuJ6-5aB5k46oG85N5NKLA7ZFLT_qdLmKNB3drmAoDOoWezMwT5iSqk3CHWlUheIgX1bGsSdoBzHHhnEfZTsICCWDR7gk0nfQD8oCC95H7I4AqCIS4eGXwdKVYETPIQCPPgFnacItHBRHywCV8PKdujh38rxnS351ZiRSJCkDKoPaTanuv3fRn1c4PuyoZjujvwQJor4PHJREKNAcmpGDaE9hC0FNfQNEl8g3KN2TnurPN7dTmuND_FVEMMBZZXvtxtc-t0CFUVspMSMSbR7py2-h2d5MlDc7oENT8NtJ9yS8Q681W2FKoEeXlB71sNtWSQ9REqpay8vziVQB9bB1nqchXeUYoR8cfI1X0EZ9HRyOkomENxoVjn6DNPWdIzn4WVGWthuSFvtMt5IP4mojIfzZvfGqddEGCON8kMPb3F8iw0FMEJ7lzRz24fxD7TgVOMvEnrqawkzxs5Xau0UwKIxkbBPVP0q5q7W3I5y5PHiDLcKGWLtVridDfd_qG3iBQL6zxx1RJkSBvbB2PA6BQwo7gdLV9srarA0AHlW0DlYJZGKSIjCzb7_4pX808zlOKYqJ7WLwE7JKtADFPoKw1_Yw9aal12f1SRreaIReTtTuo1JxOOvD0QWpoj4xVupXCPoUJYdNTeqdI3O8qGVhumsbMoakM7M8EQVzjZIPVw6BKfMcFQWEI-mohTjYkoytiJ7pTHlba_QKPXZeN6klY_vvriw_CqjedtUiDdZ5LKU_WSdB2_O53txZO2FETNobuMp-a87IKr8qWHvNKJXj2HBz5vnrS6wutAry3ONAspEbm78Z7C1Cydh6DYj3pVDBVYToAC484S64ezWQ3KxxA_kVDgI5RRVUFTnfhDAo59M1rMyvfxTWq4mP36vhZdMGz_7ZCV_Yhpu6tkswlCx0qcarZJHNtR9laUYIPTitS162q5csvFUtucYIqxYs3mDw5igt_vLgDPeAcaW1IRGAL4WVgHM15fBkNcVk1Ob-iBRUldp9VRLMbJgrsE_0ukXlYIkuwD1dA-KSQGC_ou-jyQr_8ltcMR9jOhRWW-bmdLTwbZU4LowBbNCybQ6YuueOrb7-XwHCBZWytKIluR7nSd7-UugDL2AUVo13X4HImMJCS5mOkyVBHbuI-XpeLAsyQytCWNvz6hOta7P8a5J81a2_E-fd1gzUqQYQjnnGutDGSeeoeufBFnEWn5x4tk0bOKyHeEYH39S_IsL23Dw2seK8UHWxlSi4-aPQZX47vvazZA-68uebWLvKVRqFwZLDdABDOi2RcGCwMQK-F9W4BFaPccdgxxsrqWT29ud51tntbq8z_ikQv1WVWi22dYIrCzrq0OxTXpAqshwMv4q9u8lInuMD2VowLARcL7EP-0FjRAr3aQ6zYYnDGiLpliFSa42QN89iXVSpDo-FQzxTHnLdENwYCIZffsMwxHbOVeC9pGhG4M3eiI8NHtYf464kLhTlLvZK7UchPlU_lWZ4dnNZKnVAotpv3sF0YJgaclkOk9I9I0BIeMs2dYVmO5l348dm5izua1aeglN8T7JPCK_kodUc1ulnPGf639YJzb0eSDtCCj_BhPDTgpMpvbanrxNTRdW_7_MX-agEFpGS8DF-Aku5875Z1yBfhX_6Ye5GnOFvezHeasGrmP4wGFf0iRcbgm69DgysSWFf9gbSdGmTT6tVnHfr_7b_b7ed3LuJQPmvWje16vyo4K6igUflZ7CYtlcp9su9V1gQCDSfjo7M9GeRnqYMu99XTShiy_18VEGODzo0vg1UWWISVVDvGp4a_yGyWRdu1dJqUG7iOLLIfOMZYaNUD92xnroxIvRAvDUi8wrZQpJ1z2qmaxXHoCjQRgSrJhbjs2aEdCWjLMJNI-oQL008Oe8AGJ_JX0ZeJYc28CSdXiRKNXyeyIrYQlv1_EN1xNUxDr-NkZVbm8WAQES8YBCMwVXBmnBwBE9iUwLAaZuD0UQy8p7pSR_tZfdexJwNK9BRPgn06Qo5v-BClZbbr1aD_Q8PR8Ez_8EDMX3DDEcKu2OkDzrIVVUXNI7CBQdh6IYloUUVC0f42vVOnv1RAqE03fPp2oSnor7IeW3fA_LQDR09mV0kfbH1NPcKRf3iIOxHtOuZ7ZjCQk76MXWoFZ_An6AkwEukUDtlr5c8eTTk1x5yCUwZJw3NG3vmpqcYTeHwoJkMTgmhgWxQJWR1JZSVrBCk4CVyz3wZqe6xODJqDOj-ws8OQI1WVhG5NnvJI6unwGofxZ0Gn5r2kh7TnhzKxM3ajOPBMsO2M5S9Mudfx2QnlbD4yzp4E8aleN791fskMZrj3Iu7QeQ5XMb5SdzWuGvGg0GY0ow-YCa-bydBfXttYXwMOi1v6ybIYx9pxwQ13whnN79AAqpAcxHQ3xMtkhEKsRNoNX3W8Xtd3pgXIkfGSqGoowwrZVolGy5PG31Op4ljLJZqVopXZoq5rObZMcQgMQTWJKEN4K_muEWELmKpnWNpZg0AnZlLlx6RE6voSCUB8jOr07bwjvJ8lPhYxU4pRdhpPWY4UpiU0kvJrwhrbPzlMhUs1O8T-NPbfmFCaSn6aSh6bD0JSGO10sqay2K9mFY2wHcCBrvD-ge1J2rgE0Ea3oa4Rc4JSqTxvlWwtp3GyHGdzdif8MnpFD0nNrlPPmF55pGLuh8C7MTllAJcFdu1xzFXR8W1AK0RRV9_rf6kTg94dglz8jVC5yNbwu8XvNjsgRrogGByhxwWD1daqIh9XpEva_foxGHsWRESIxUO-Hf-XPdy9tsdslfKPcEMWJ1VpPG6YviG0GDwLeelcmJ6hcwRrKsAoIRmWqIOv4bWK6zOV-1hP53wemToP4gr8lDrGAVy40Vk7GJ7EB2APxljfQIf3f9-XFZg3UIfZ6MF9BEBtabU02Fvn0B3gh3E7NM6gri7_1yiMFmVlIySkGm3VHa7FX6SU-TtCw4MrxyRwWa5XpQ2uufaHQe9UJazH5pRSt4Lk00hpG95V9mNQgjAvI7Y_hD85cSXIdJQR2Oy09eexbZa-j7lLV-J3_bCFTEzNzkYR7np_JhG15InAWTZSYKMYUbsb5Xu4qaSNZBOLGb9_oZNrdnlCCAeEYxzhkmrPP8JB-64V2JFg-l2ZfaA5iW9FHjrgWCvF6vNjCfATUa6RJq7-p1nhXERqH9k3dVysioVOOwtfa2aMlkFq4DfWXPdOWqC6dBK2KOn9ZwiL8aIMWw3JKFxGO715f9IlFUoHAYs8ndHjZ3jcCXnTewuixdMqHEwMqWNtFilPpcLqW6fxZn9LCgrVAnM_SRZVfUeIhyHB3_XsaGPw-eMlfhYAgO94UCO-K6hjdLGOufjTlBpZ5bTVOiD7fLyb0_KjHmZhYYztewXJRozsk40fQ-SIdcKzfnvaliVjhZgLdxHJ8OMAlPPhDuusNj3szUopO-0Z5krOm1QihFjWpHUvdRJ1CbtAwrfsvqVEE1mnerrygiaxN22QQE8-T86QnSHNIlBitZIUsXSkdG7j1Yw7bNBxxiMCxYA1ZsDrS93pEnIdQCHuJ9re6rNr2A9ua-8aq7Ul_A2EanRWgWoFsQGK0YxcQ863wVcKLE008t7pcxURsmIYSvGaW4DJjL0T_x56g3sqJ7zEPhYLLXsOVlRCuECofR_f8OiWrCRJ9zNiktjv7_WAThMzllPeIE148aTPlCVTEdkAAvn0XlR2mRv0ceWyqcm0CrdVUSz7h5b3SPi9xid-le6XJSns7bPylDqWEwLpyq9dnoFFyI_562fLtrtsI5WRu8FeybbVKPKKK9NsF_2Z-ovALo7B2eHDevVX7uuGj9rHoYy97grHeqeO4hF9zJiuwZ5TxgyJtEp1eDJPWSF9w2eGg8gYO0HYQMJMyKk-I45sM4_UtZMZOWlS6FgZh9JO8A6ulNpV7BYGJiR7nGkyuRjvUd3MCC6l5wSZRmoAIx1ozERwiAVCqeyRPcnjur4QyKXOdERz7yiz86R9XShPnkgjMfTrOX-dB2zadxohbNzH3ARqP5SASxkcdSHvO1-zlE4ak--gofuGTyCVMeMoz7lPlhJTSu9fPUEGrK7JaaRIunueNPjG1hUk3OJBDXq2ut7XDHx3Rl9ZMgxdNPMPUdi5oi8mHzJytxq9UXnd4BUlASsLTLFoIrQ9KySXC0ynIykFFgR_1dgB4nTUmJpkF6cvI_4zqRmBWc4LkAbU6FYwuPvgtF5MuSc7uejjG5yQWSLXhmdcp4opNQmCFSVyRv5NRoClOcvJTqkI69zrgoGiNOLKLpQIVZyqBc6jsd1w0ToKiPXpj5ovIDh9EnrF9GfmQbvraElZGVkPmV8uueEEZRjrMUObOK7eBvtlKUqASnlRNto8dRJ0FI6VuuAxyqK0NcRXjalPVysHSpCbJbDZFU-D4YTqLT5Et7tmy1BAe415BNgL2m7EhSit8hGOWZFFxDKC7tek2ESSYZuWOvyVCEuqdBztq0lkODYl5zNAMBOy_uiNZinciI8w_Pxk2q2DMFciAAjk_MVhQnPO_vMD8hjm2ylFTkS8YJ_m2SYfB5qSgBbYp7SHeCQEpmfFkN6fDb94efX2OR9XzY1M_-8y8Zz07kkbmF3MHV8kViOuWMFuwkH2iGeBpE3B-TvxhJJYN900LnABRbpAEyIZZK1EbNVpIBvFl-vpLpOtNj5pmZevf_Jm_eCg7Rc5dejlYRHsKGCk0efnnEblU4RDucdNSCrzMbA7Ql72syK50a86s-0ljfpcqM9opE-2pVBYtg2p6jd0NCZtpp7PcImLD74hKJEZxF2DYpdORdyx9_lLAUykwimFHKGfCCrx4Egv8aRHGUNvvx2Ud9K7tGGikmc1dZ599FYoDIUXuzV0VCnrPBlCzC9Qp-Q2AgQ1vr-66il2zRq22qpd7w1K8sfypUk6ZCMHltUOMLRaA6gOXSnwwO7qR8utfGze8hreMGHCSxPkg_NukUUPgNhXTRQwKyAFnYYnQQLIq1K8_XPRB7T3GEO5rnJqTLjsFZYEPC-kD_n7oFqjXNmF3eXtCncsWP8gZn3Gyur-XVp7fLb_KKQiZI5WVdZW1x3E7oFAuIDikaO_XvnXJpapARmV6JGN8sj9inlPa23DgjHcXu6QMBUdkBkN0-P7RBLPsc3WhhydWsE0VLFGY1YPxVkllYKkrBdj-uvbQUKxTn8-14nXXW0c-PiVL62XlK5hVZZyS1k_B_HB6w0nakW3vR-WyK2Vb3CXq8cN2Y6ZyPmlVjZWB5u3O9f6Jz7SXVnL7xboOd6LWL85kljtlo5FZdysd6OSPFpmL8rF_v6TngsG5H_w3MjmFfXnZQQ-u8LGsOhCxTZ5qlqqeWsLw73nudStw5o3yfBTfyRZppb74SuaCiZc4lokLqfSQtptMbP2kULmR4jaDb0fZOUaEM75QQVXhgK8DoeLrsnq9Pw6yfgrRV7Lhqw3-tRmjyluElGV2qXJNzuhhW6sNYPfbc_SJzseXjA5cX_01yT2wkMiBxWfTVg43hMbUVu26qeRETuthIepOMRDkt_JRaLM3fJUEVMto_S9D8u-XRLtTu2_5_PhWlyZgKLhbMrH4vnecqJLsr5PCVyT0orc6D_BtnmGm91f_ZsWsqo4iQOvSt5I5QdbXLluT9x9owaow-M0YAV392XrKInOn059uh8bw3H4g-QCqqkn88fQ6Qn1An4zgqISiH99KjKVWwjPQEUU4UDCFobK19UHXexyYaS_aaKkj36d0oCzBIRmNxOPSJVp31r_gJxbxNtXZGcY9OZjrXeYMXCq9_TJhuD0ZtRkRrlDI0T5dI0BSPof7jdE1yefkMK1FLgOxkyDxKvi_6eNa1_lM4nUj1_X2k5mFwEJKTjkem7BLSNRSAf4LRkV26bN8C4Jne7g1xBAPULGR324EqZ7tQUpthp0EDaD26yFbkTUTY_F-gKVjcc8bIvr9n_WRqyv8xsxvHAAjC2zwdKfzlc0BVQ7FOOnO4HO04-J9J5-YPsCoqyl_71-TEkvSrk_DB2uso8Xx5itSsB-zruKfvRnOT0aTwwjRCY6KfDRBXfEP9lIiQOf5OcTdmKQN53G8UJz308LZaSrIay5ycwZPGhHnsYP3dsBToWkkFu7SAeH-SzAWMDFqaUhFlnr-3H-MbTu2YH0SXXE6pM6m2NUZ8sdBFnSJhC4XJjQviICoApc7h3di9d6oKrd85ucQ1I1Jzkfno23UN-ku1oX125KVW_IFdOWaI1VkTZLtBUBKz4dGHZDh3cUM5fg5k2ucxW9Ymf5b4mkeS-nEdQrCotAgMxPDFP9dDpTSWlQF3dwzf7t8HzMkRIdFYgOEwqY6Hepvg4brlZN1Jvg7--_Y-tGvF29HU4REpySxNUmxSwSKrlcInqhoiVWO1o6HcCIW6eUjRXEUCpfvGW2Ts8ILH3YiZpiy1fgltyi1ucLcHSi_YMC_RTETeo4FbwDQ9TE7jswWf3mq9e_s1lhQZ_5ARewkFV-QP-h-D4yr7DH9hIa_PqZDK8E_tGFBgrI9fZzet_PCeyL89mPcTJGraWucwFGJPP8knQ7GG3T6LysXlHthUO3xviL-kAQovV8QVlUszH2BW6kUz104B-297HY_QxucvCUFxqMpv8GpKIefX6elRKnk2UaQf9OJkL2ijb-FIyPXBvrVMNLOTy_ZTO41K1L_xdVyvK6yjLhYlpZqC5OPuCIbT6h2-RwuKxlRcRnnSzEkPtJLsHCUB7z3y6ZAW4Zj4z085d6X4sC7W_qkl-1_vf_fmnd_yB1gqStLi2D9RPT72U-GgsO_-11Vqai99WXELKEyMjBzSqkN_1KaINll9-bcbRdX-6QmeBICaKVbEgFEhUwL7zA6e_Xioyd9Ynq4hZ12szsinlA6QOXAWCFW4CufZFq6WUZexe_SqjEHQ61cO9Jk2JWYyu_at-xXMTKvB2vXTYa1xWtC3fvObHDLqT-F5uE_ETzPxRvVHY830ZxdpZQifm0R0MHgoTduTsPVWCDVFcox_Ewj1yGPGBA9hU4hO-pB_2OQc1kIQUGR_X3gEVAoiPKi2aOaBbWlPZJtg-5gcAemq5OImS82KaLCYBDleZnR1cTzq9DpR7yyIvHwwDoOvqMjQSXGUDxbVMl3BdkNp5wm_ruFjwmQWxJ_S8gsYljtHSR7hHRqhFd9NhMTry-xTdSo0oZs9BM5ds4u3do__gw6veWNreQP9CyUrc9qmm_ptRfxZZdTP62l1pbJE2r62KZYCo85GCaR3raroene4hM8P-ObK1dTNDndsFgFNRe4RVLR7TLpbaRCrngSzlopMTH8le7hZ2-b358cpRLZqqqpLbwKpKngMd2VwPo18mROGTysfsf3K7rQpmXHhPzTwzKIif1d3Wxjzbd3EoAiC0S9frbVQWzQrCnp9opWcqzGhhpk-BSUAQdUtLPpeIcSLJLELOZEu3byVz_fG6j1cBgcjcLyuL4siT6IwnxDGdMbopRhbDyDsNS9dP-tygL6uzBOB2zif6IgIrkKLotJQv1szRUOfp2x62rl_OWzKIWxeDAMOdrlavescCGvVhPcD6Z7xqAvG45tztjwzgZRrp0hkj_9ZGJkP4MvZRRcJf_XnriJcNlAhsPi_2h6mArnVWUSS2hgNeOHdlft8JNeKE6x_s2IApXh9KeBkV6msoDMedaQKuz2Hep0XwKVyQIB0HWmF1sKUV_8hvypZMa9UvoqSoB20F727zJ3L7emeRn-WS0KiJeQcWhSc2-eXCes71Wz4jbVDKnPMvQMexEyBjW5pTvF2J-GATFxOXCwPJo5nW_9yNcWiK8RNA7_RJT9-xOyRgYKUZ9NvN0G1Yi794cQ3Zh6eUyeZKqYy5cXtUwuCOaJP8EAIU0Zbg_uQH5y65-Uj9F7auIQWCre-JUV40VyV98ymoUnjSSEZLm_K30RvZwGjJhmGgMlrW5gqcxpf4Dd0qBgSQQMQTTXDae_Op_-QtVIIXjx3m12Fst1q0Bc5uo7egT4tP5E_yykcdxuvGK9MecGwreV2Q_fe0V27qPCEzhtPGH2q5yeElmpsk01NwRv8VfbMYz5VdUdfBuxO31jeADcbSTcM2Zm7SlSLEzdf6lC4KfYM29PJxiYrYr9uVx9ERhjcrZxl7elWmv3vAF-OktSTdhXHvWpBXBVwyY8_vkjR-I_ZE6DndCFzVSNvKoDW3Vr82k0l0pyL471cm3Bb638XkiLMrJ1Msj0A6Fu31FwAG9VCXSnng7FHS2LU8yrhXQ7gCzYCIiTqFmSyJ-xsQjwSabseJ26fFf58QFXWbUs8AZvLkfgXeceDnbrJhQkl5PtOCQy1fvHLkld9p6D02GecUWUofJ7ruVJh4ICg-In4_vXPmqtgBrWxA9X49-K5Z3BCW5PlodSpQRoSdd4eV9ER6gkZofOpgqHQlQvIXt6J5Ew6SHJnz9c6euR6meOyaHQ3Raz-mDuG6F2_EjrCE3UMVirs9ouk_K0jZOAbIdv1Dca59KzNa-IylWpxXitUInz0Hc54FeRD60iygjvOMrlkIQVpMH38HjoeAnRqQFBYP6L1nBE0RaENmYSUrSJ6pCUOayhz_rTT-_UGB9-aFoBG12NrcGRAYs5xo1vc_rNoLyAy0jUSWSzFwbtky9IfCq68ZS1q8HgIISJxfk3QJUAphpztud4RKK5Satd2oIksghmQei7Jhy1N3qoihh7URq5ovSN0cBCUbfDxNMfN7sYyQuubE0xliSOQT6aQ_QAbarVawlVGOtmpJwMwO6d2O0ec6P91d7f1M6Gt56YRZ8fzLDvZ_qyAc9RmN0UYqS609gE9Svsi0QicSTCKaxbF2duv8LdghNIaIZfiBEPVW3EvyGm7Xubuy7RNT8hmFROilgcLaocWkgrO0eY76P6-9K4WdzkIU8sEDOQe4nkQGnHPZHQwqDPcqSN8fOeHK4tGFh73iNNtXGbcQbDPW36l-6U-TEXtSmKMnfhDGAuL-0rr6LWYOCpjTPPgEMKgizsR67sPASPkWIPZ5ZDtZLdzeAsZ0uJfJ_I-TmUma9wVxi8IBS8WOjaAy77AiuwN1ZEQ5exAW_uVuFwnpwl4WGNzBNUU6AYa68Tlh4GWpSaHlH3sNQk7dQLBLJAoZXGw5R_mQ_J7bJer8f6wkaHkQmSO-vvdZbeKHol4oiYEd3MXlrpTElbtLJMihUA8Xteib3MewetskkbbGC6zZvn20MumvamhVaBGQyvKGur9L-tG-XYs7MjBDbMgB3M0yTYOI_-jdw9qUi_eGwdrV4JaqU93yEi2s9G5k5N-CYtTgtzRYhsTiRd3O4hN3KEKqJSG-YYeQONa7HSKdMUHotif5OEpcjggV14bvz3CPdeSh3TOtyp7wWLoG0lNY5U8lhuh_TK6YtwUdcvacAgHTAIsbpL9ZPQi65FQkE_7eQU8-dGjP0OsPV_I56VG0vfyK0nsCq-wm0YSoW24kaBumwAv1Q5amImfS4KgN8RW5d2ZqQ8wVq8KElMjsu6auoWHh05AY-X5UAKtf3EBkJ5KEpwdKP8M2f72zjGLV6LGowXfpTwEvQwNKFek01dJyyv5H8zH5CNCtMcejJue_oWznyD-PHQUqVgoluRzLmbxABT8OyM27wY-PnNl4GZxCQFgti7bxPD4299msf3jAY9TthJ1IrQRmsmphDPrgyHjn_50Bg9en7wN9_eRk5e346jpd4LUAxc-iKS7Izrj3m_bxcIvjtzlzcxP2xyTSTUcB8WCJXngVQTHL3wyy9rN-iw_PFk1MXvZja2c6yP7NhjetENXucowKuVYj0J34ojvZ941ZqrcGc6EIKPquawMrUPLLfEf7slow0I4lWN9V3Ku4VsY9hQtESyfN10eUsJGt_7-6GTLOjLDGiO2yr4SHsQ8qOqrbQFAHDXRtusXwC1ogImb8F6QkhER-_09sGMgcTwFlyjf0OZc4e7fIsp4UgVeGBHiYiC3tW0t_qFRPDkSZBg-xT7f3gclWX9bzq-DkJcQQOxnOeBHMEQnMl7K_Z7m2LLpoNpQOgCbOEH_b9E1npLnLyH_Y_3uSRvVanTIjDk3BdXsMtfmntI_hRoG0Q9xPI_ESyhSlw_aaLGCIi1orFMSe3lUGBFFuaQndczku9vatn1HiyRxq6c_wd3Ke8E08b7Udg_gtgoveV3hzl-W97Ydv1_guVq5xQwR8o6gwK1qCQ7Pynw_aLzQCGUGUChjconJm6HurjG2osToHtEd0bFVkEASNNMGALCzKLrYPp4HF8FELCAjoB1BJsU8-qc8QzeeyG8YFMHD_SYDvuVoiGNcupbuTfaBmoIOfP44Wirlm2e7aYogsKO9kcyvsQ1f3mplixBOjx5LINQYxP4YNE27pyracg6vY6Wpysqu2L0mV6Z9Focf_1swk5g7yKX1WWHYC_uCI3Z0AjgPDorinS3Xu6VO7tfEtwQB1PCYtslAjQBFs95yzhizehrLM0RDOyaq_oLd3NjaYneNHJXObQk9JS5mAeOOnrtQFZfP_aopL_eWNxPha70i5ywlmOeSHQNWBWTbQjPE-hBEAl9ImHOyyetcvuq_VAV9m0fSifMHLPGqn1bKwPDCI7ZfIMGjoIYrZAOlXf8Uc_kBrBTqCy_2SIg8des9xB-41gjEqSMbMZ6xdEerP2M1YSm18Xc5yO8jr7ZrFrrK1Vd1S6ZzBd4dFCncDuFdkYgJPvpnyPWroOKcnLTuqOWhLNKweUKNHsle9vz6StnexU_a-dFQfT6KZ37sd8YVF94P1lchoOvRNFjKm_QzQFD0rKPNTLPajLkGkRk-5lD3iyStLWYTfpKp5iK8jnlmuDtyc65Rw526oqcCumdKpFPVEzH1bwQgSHvVkXKoi1F-8Qn0wqg_quy8xaPIcrb3PDPMJWLsO0B6PjxDuZrMr92a5qnbnlKscGd83857kuXuPcslp5RB3PKAKXY3U6xvI1wvW3Ez-EhbvlDf5nVRM9L46GyQfgC49eClyOcrY5V90P6SFU4_vkna0Om4qhOoQGEnxPShQfFC1kKpHQgbsqIq1Yn796k9jpLmbqHska3rjQ-pkINAObiMMwxEABWOVj_7naV_2A0ogUYKwe4nNYPRg-CgUc81V4xxhKswVNFiCG6ilS1hVX_rUr5vqxMZaN672cv_bHbTLp0nadZ_0B4sgFShnTJp7w0zMDSLQ4UhtxzU8gOnN5cMRw7t91GNtJhKYxxK8f6FAaBRsyWVcRBc6apUV8drzQn56rFyzfIWrtfct8YaC8Gu4KXpRZjA_q-cFuqEgN2dXUbzhtIESjO-1f9mFSj7iQrc5gSMdmqK1h_vho0LujkeK_bjwABo6DyDfridR1XYpLte7MRzdq17J7ikiizIBxl3wnhFNj0i5vtR5S6D9w047wkSHIH_4yYYznZJzsemXb_m4hPDuhGVEjzkf3iLLUlKCEz0msUMQY1kdyN1dHlBF6K0AjJra6cC9OvyqfXyPVtkM3w7RG_SJ3Glh_IKw1GrUFJeLnSLspjFUNF5RijUQkgs9y3pUJ5L56imKAQSZ3AYxCEd2muMVP4eRzYxzxDugFnM1NgIJqp8ydUOwezpiJepuc7StiCxA7F6D5B_g_cBjJGWT-kMy6fdvI4jtTAofSnR_wrX16iG4crV-CUf_Odo7e3ZWqEeVu6QnKCw8hS94kZE81gpl2UfTB_hBmJZj1Wq32-tAM53T4bzFOvw8uyq2IdAkR0_CleIoAMkSW2nFXKkAJgu-zrdui-MZCldVBFr37ca7yKoG51EcCrOo8_1gRn2Jiae9WF0SkTIjDPejGJFF-CI-CmU-uDya8v8jgR_0CfRtDUX-PWBpuAJ1izXUuptoC4ypjfTNLtkdwiKZm5vU65y8BhettH0jhx-nSTnB0R5FsDHDXmDPoqj4NS7FqbJLENcqmUaZHtPezZvX84qMJfCRexP3ga56lelng4SzYKXF44Str4toe0Z0ou9gbr-0KpTHUuzklBiN_dWcQayobeH8wYhv9MrdZVdz18Zms5eh63-yYUQmgLAKwPNqC3fhg3bcJ2VFMfKhbl1gKBR9_tLKzHQkkkwd8FG_b7pUiGiCu35Z5ewuLkqkmIB_H9z47cUwJpGtN54_2uWm2Hg1voh-WKglyprRNYu5vaBBp_Pj_v260GchLcm-ZK0ht0phPTuhIo6o0u_NCRg7202Tq-ianH25HVcg22ne7tM816eJ0Nmi4AWKLzQtPRr5fOdWX5B3BPno9HcHYcMx_5MlfRkErpKdfEl2miVyVDTMCiLxoLVObjCto80-B_83ZroG5wcm_Dh7LPpQngLWN2feEdglUjRm_7EkvXEQX4yXgnoaVHzFjB7GSmJEztPxoU6eC1AvtW6Y9HvNIQsYvmBlP97GWNdinf-iwHZmIpMr-lAQDVidLovvMUMuPiti_nzxYzya2OhW1Y6hjn3wslCKUFbuNJfRLQp8y7wU5JIxZHI2FxPWY4LjyKF9XySfP2-NrOIyPdySYgSTehQs7LMrnhyNZIx3r5S7vwZblwSlHJg_ePyfsm2Abjd0RxyyX823LEwY34ZXLO3DMtItytgdS6QVsVuObqrYmA2igKVLirK4QN7tM7ujlHavMeQ-a6QQ-Edxh5psDim0sVC_EaDRroS8MHya7V1LBgMcPSo16vOYKIcAvr9SOcHQ95g_fXsVeMjnBswCaL7VIOG-WZe2HePIq7imLF8BFmhF2hYmtiguFOQKKguz5U4qENlb_yPCwk78DVu_7zzPUDqpbyyAbRPRMx2HW6BqJ45TvABxXyKCl-JgYLlUaM-eNcdLuY74dkI_fNO0-GhMEmLemAZXNkj0k6908GwWZ8mhVhqbdbG5tQdXcgwcjQ4WmlT_1jrgTFxXIy09YwwPrpi8M6vWWDE-o6q3JhbuGQPkmEue-R1T2Kyh2pBpn8EHbatF45nWr0EGb5l9o-_WbSZD0fIaOM4aOMvj3Dv4bR-00bjF0--CqpXqiUQ3ZL7Ea73YubeGgy1R6I9iWMN_0L2pCmlssjH3NYP6JUvekH5yNYfaB9o3XEZbwBWODh--MwR3D3zqao8nvJNi9dRyRU0YTNINlQso2ZjgTEJoRHTn7joQjvhpZjKq5TQ5r4hqckUZFhVoweW9KqFctRiz4MO6_Y5AQxmmp1V1mcJ6ezW83iSrHVbA0Hk7auXXtrg95Vp7F425-4UD5YUdUXP4LCevCjKrnz_vKCFxUAZ5-AqKNtUfNIJvOrMPSuOjeGFRTBpO3rLO1R_KW64NGpojRkWc2M1YrFd4OBgT9qRyXXuqIvFVJDPr0aVlhNGXdEHOpPWBe6TMmv9fmtW8WWE3IA8df27jEAxh-w9Xh_LSoWC81KOZ99T1eWrcxBi5FEFBUtLu5T-jcEMSmmfMuLpI28r2uZzT29FfqXGGXb3IKehA-APd4wPDMACeQfZcwVh0rNoVGOXkB0KZudwLQsNjp7rpAQxHPyKW2rqF7tK9LB5BNp8lNrIYs1qjAakgS1dMa-NZtnjLpjkz2MTeQ0FNAb_gBtM3gg_wJL6rOnvIXpYEWGzj1hxQ2C-tWPq0Cq80iEJTM1bYA-B8U8lCvGZVIkkOTIWM8zXByrzmRbqiI9EFiDclUNNpbgmvDliJ5TzevU6lAttMejJZQUNaWcCzpnrfn5fmv-BjJGGJgdw4wchCR-u2_k_y8lORDnw_e0fmsjUx-JJMzF2Wz7ylIyUPs9FLJ5HSxrZjVcxSJ9bzDtV__e6RyamJDeaYsp6vHCAfCXOqrdVSNtSwKJ6zsCupdSCIkrxinBdtkcalUj92uvwlayvERPpPWKmNgioQTupgu7x1nJyagKLKigPpENyqhqHtlFhR8nkOd1tAj_ecp9nWjWnwX_IV4oELBTZ810Q4ScBOZjIlp_t3qZDN5h_8kXXSYX4G8YGblGFG9DwSBwcKSwHi9RySNMbT4Ox4K5E8Meh6xR8yyLp653EhPfnDjVHE01CzWpSCvzCWhtuCh6zOSjgTJsN72blLeIYM--FOh2_8aJD7hEDt-vBTE0S_J_7a0sa8Wd1hxkbYv1PYPj7qzMwyTN32pacINzVBuHDQ5PZS6BcNiIAIPDRA9H6ApWTj6eMP5ScH9f1WBiRW6HMcCkzh_hr_h_LT7UI3FO7U0F4ynEvdyF76mQiYgp35E9Y0UQa2uGYDJYZJRLVP7da4oZ75BFK2SpEWJYcHsxt8FeluoxKRy0Vz3ahUKuMXhXhetsmZn_NqMpmp3BOG5szjb4MUxDUZIbJ_112teBddpNkMNcnZJLLrEXMUs2Z0bsNeR2yhWrYu0lCEaJOeZbPXejFuFbrtTMEa5qRH3u7Bl3CoFauYK7P3vdMiH1USeVg1GOynhV9L69KqJw1MkQS910B2c6tutcSILe44wZtfSebzADPRiCrFZPcrXF_V3eb-zupMlDQtdCsyfSY1c58bxFqwveYNImpX0WX-HIsEJzg8JOuZkGlCBzdn57LzPCWmU6JfnbCpGxhmRsCvc_WFGy1F1_1C4E7QRwohOmvc-BR257bX5ovqgv8ozXVmUMbKT2hEfjWzPOhF70ewo3JBP_F4urpJot1TLsPAp19iJxsRn0W7LixFCEQrFGznEJXW50YZZCEn-rF3oSZZ-i5sCSUr50kpi1mtujb2Czf-0bY56D9wxOWK4dUG3JfSb3G3sfO9jEANtaQFs1Pyfo6T0aCZ3Sd2ByQ6S1pmlu6PHpwvgIhXzbeNx14Sgk3gdMWOA6c4WLhZl2WZfiscnIEAzlIdff0vgFK3_2mXorXpyclnpi0tCncB0ksvPBiVocF9Fdzpwqw0Q40_5YSEgycXGpBKxHiaLt_lFQNKkir-yzQNStYHWDU--6YaZQ_dfBY80n21I7HbwwU9L0-ad_W4yrSgVTnTXxsX9Zye3UOnLl2gyLMlxAHCQCCYClnyjSRhd3i_Uj3nW9LeAsQ75FE2RzgwQRqhBpjCPKxk5Ynmvgt1iCzMdODvmja4nREtStlr1H2fSR5gkZbw5qyuXiP_IXEuexLB1EAcYvHnwjjzjDI4JUQBdw_TxeNuTGmWg5YVeAFmTZikf7uaP5eFVnSFD_HDCIQRLr3mN0ZRkmn9BxfLB6DxMKQq0Aoas0_Cnc6kPRgP0dNvwvYFc4vmJV5MA287qtwqVqTZh4Jy6Vy2bQZhke3tA12B4LCAk6aR2h-HbnRDSgGEy5uMl0_ZaZiYf_W_eJCdnklhpCE8tBEDLoAam_26e5TIH3KU99yudukTRZWHEBQlzPUuEOjNuthcpOTroH7SMP20e772R00zRI-VooqZYjoppUOj1LhRkmxvoSosJ1kU7X8qVcMu8pE48o1XD8Lx5iKLqul8LudLo8RO9xgKiyKT1cp3_3jFmjLXdMNDZSwZVn2busEydc8PWmUkNOQT6gJOvgAHOQ0_iccDCXfSDLPc8upf_9wy5xSl4bf8xDh-xCd_-mpPMl-GT22G9zUWsGoelwa26stcsFLc2TbSNftN8K5scLaGxigQteHH6RaAEe9u575lAZ9XBBnNX46aX4nAZzKxrW8CBSfsViDdkiRV6ZgubikST0GkeyGExcibqeiE6wdGhNRDhG-aA8Z5RDcue7BrXY2VaDhrgOcU1CRvhZ11CuczsZUJ_xxrFYWWFCeR8LHaa1hO_ukePLJnBP2PmSGAxcEEnPW1v_emQd-CuGCFP8tFmjk4GwW3G3PyB752ocbtXfGRVS_QEIE5y-0G9_L4g_Xiwgnzl3QLmItN4-X_JtU2-Dx7m_aRdgbAazynI5YM0YMPJPJRpnhltGWs_o5a-jKtCBOmbA628xne22CL-8wBbJ1x8lEF9DQ18owBlyrx_CCFhNac1ZmmUxdbjLRFn-Ee1OW8d6Yz3aAtKC9u74D_08XxBpAUWD2_nOPEYQxfbpeUT9W6yNG5wqZ9_rNe1CquJgl7KdHcqz32d9fQxp67drN29U5KoesXyuQt7vZ7b-kq96kEZ8P6VorA5ouBsAsAsXP0pALoiiTbInOyKxxF_FoLnOZLpy0_bO2dyki67q0aX_mO964PYdz4-LIF6XNKZ0HI-Z9YJxPgxmhWvpsR_FpWc1pKoCuANEiTABHSd1tH7Gx7THrmWASIRvcVpW74vPdGKRk5U1blOaRVSIXWouNlfgixWyqknc3YuyxCVVeiquwrCC-tuwz4JWuZjh1z8hhR_K1F26JrLbwfUUAMXeojPQKMEVlAHZ6v9RnbwSOg0agU3KJSoaT8kugjIk6J_fQchZGOBj6o4ZVnpLvHAxr5ufz4U-FNxTmi0waC42VHwc77tr9-LG5Ph4AKIptnYeQUn_9caiSW-kBDdlkQE8jEoEHQCMU-MR3vXEqtHLM0vtLuumy485u62-ku68lLC2BdRmH2WFHxoibl85OxIcWiJMgP4jf2yZG70AbrZQPrYsvPwZmQVgIGm3tj_zyEUbZaK6mZPRo9kd5IjY19n7pzwF4dKcz-n55vVAnuTCzVDsZdZER9f9OBw88JJGQSy4JtICFUefS2qyd7vy0eo0P2UxGvwrC-aX0UtLpmAPMPerRt09fEKsGvpCk0AJAwKy__0-_uxDrZB04c3VwrPYZl2MMKLV0BaaHyiUtXsZ7UvIM3kW5PPWQmAkU8vJc6lGvpSY8NXhYy9lCtSNIh3aoFvAOUaNx_ZKGA10faGJhRtCCGaiQkr7gVppoXv8yzAQbaf71E98Qzl_B2NZFznJtH2PXcAtT3geUDzFE-4wutpIYseqGC4iF7fsLwzZ3OmiqElIyDwinwmQ1kZiJ2L2y8GRo2FrvsXAmCiMid1YpmDtMjW8EksTlxJn1nRAqk-thIrQwWw99qTz7LT_2EGzH6LeUkRci8COVDqtn_sKVI86f-KxCTsFukAK1WxHefASppGRYIR-EKUceoyiWdLHjmOPOc9B5ZlD5YTsiCEt0bEq6E-ORNzvmED5LQB5gT1mYwZcKK7I9fxEzu-ro-j6AWxEDxDnCPBGv6BQNXIqAYommTxraKaiVuaulaMpdmTuHxhk2RCbL2Si3IKWvW1vj27oXyJ6cA8je6AktWhIA9-0WzLSjvwvr7Ga3345fG0R7KUoVCwm8syVZt1K9nEIzKMn9FNaZjTApmjXANjcgY_XSS2mw_-e5HAmQGIJKr48a6km6hDwtKvMhx2DDO1zhMEylMpbKS4J-ZiOdX121Vu_Slx6bTbCJsWTGpsVH3o4udVRgebfEm3bWPfRyFQf6knmpHojzphY4u2bLHnNN4A9Zd14bNXZgcZuWFIhTm3FL5hiWkEZcxgvSOdn765-rv7xKCNlfgD5xQwbGuJfH0KQcYSHDn28aXKEvnnlQLfBPoRRVJT0Sas7Yw-JnYHI71MykGVdQNNs09mh7x7U5gbA2QWgYViQWEkq7avZRod2zR2OZZmIOLowSQX9Gjz5P3Fba2eWy3men729oB05hxwnCSS6i0glDntOzhn5D3q2krhv-f1ImRfpt0c20pCddP-Pfu8Bfd_vPHueXqvAReNeS4gzlahDwZLNYCuzTRsvxomaeqJ79Vpj6e7lFV7DhW7-AFY3m4rWoTnjm_9fU67jF0Qv5qKcivjvHrfNMeU-jyOQakRTfT1zNAQuBt_eMCQJMTnAFGXVTJxtW1ZZE4xw5I-WGtjXYuHUSBuXHhoJZ8Ps4m2EmTVdBJEVZ7vT4-YwIzaZRNqukA859Zec_zrJ-HV-mMhw1qz_FAHaPNYkZMd7bwxyUQKEZAzMTP7h6dRPV8HkHTIZTZZGu7XyiN19ESQky0TmRudGA9MB-LFe0m1XN__FeZjGDChSzU6JqVbbBoXDkNDa98wtTz5pIrWNTojfLdwMgCXh4Cqz8NWre9hM6yYRmXLY95Y3KIDd79oybgUgG7xfrJvuEDVwTL_G8lBlmWhXJT_FkJOHhqH_kUGUG0RY8oUTGc58Xg_369ZvNiMKoPvlphC5dN8kKH7KDzNRY6Zt75CdGL_VIpc10aUSbXG62EStdIM7gk8qa23pFG_UGjMLjrETHXpjKR6AMNLQfbyNDQGOucsaILD99I-1qWOwa86CMtm7Q1o4NxDZJrmQeXfEjlxrO8r_YD_B71tWKuAIfAnvfDBapuR13BUUsRBIs7l6c5Bn2nuRNs2hh3IzU1NSTA_lZrWSCEVKEjV5R7dAzEvpLrCGFSxnnqGDB_zoZaRZgNzJ2NH6RJfXE2Da9rkqoGPzXtdR5u5ht_FlIdrdMSbavmpzec55PYyZB8L_spENyFb759pqgUjLB-gDjlAgXAnwMxU9aD7pVJ1SxIW1bJ7clobCTzy1gn_Bf2j8zelKNyNSIy5XATch4XaETnJtZyGFLVlkorKngvKTg1Xs5O-4BtaNTXw9tpo5tfRw8UokqXG9XNzCOoQ64ORK7IkEV7jQGeTxxEQI8ty-MvNmOhiUqCdD5A0_SKWUunjvbTXEVdYu41on8dG_hHZzSO6W4QDwVFc6HZZCjRflJe6u109TlhHbLQrTT_M4o7Yl_7Gg5MkUZxJR7jRVFUKwqyOBDuXNEC4rHTQDs6n5yFtd_vXrRJhcNE4kKUb4VFe-WHudrwJa-9zYaiMIKvTi271x7G1U3dd6g-rjsL642enbK68fK6sqhLSHyYj2khkBLorRhFb0dl-sZidq9NKEJe7d1Ib0eI6DZhx7wKqaiB9ScpHXAXxqDoK7Rge4_Ia-1wPYqG4VjYMOlzo7GM3BnpZuxgQ4v9W5EVA6GymLhsptC-9QfR5IiGsP5_cGxxYVXSBWlPRo8i7Wqoas73txmcdjZCnjILehjWNlbvhuflM31IoQn_6PEp1DX7FTg7QF3RKLVXITQ1DCBcswJCo8yB9jdMjv4DBGuhgUNlHy5JCGWhnMvTpQOpYqSl7lOTWOpIw0xHf2fMbeCnOPIPbAJ-mwFxtp-SnGnhka4n73ZNBKuglUoKQ3hIyhHiCMWhNa-ChqDOOFRLwSvW0tHVksOubpZ33oEv64OEMhFUrcTPrMgxIGMOBh5YkWRyFW_Butgvwiitaq8_Vij1S4YTOADcZwKkiizv2ubcM1Co3EfYIY25PUMpzKWdMHcAc798c5v9MODdUbRYGOmyGSZRYannYYmAXKeseN4dgHnOfG7iQkNc2Gz88xJSH8W3sxrNMDveSLu1YX1GIiHHu9jiKsw2znN8D1KDR7QfmCHD798QMljbLMVyhGZo_jmkDylSCWciz_sJtl0Gp44bmgvxHuPqGncCnWI7QyzP9JyLvky08z2iu-FW56O_3cMqX9K96CBWtIXYFe8FI9gr4p4EOLBlwwG8TI_kAGIfoFpUhU8J30UDtgkVVR8rk70ONMcKc_Hab7M8C0nINRaS_VVSGYIq59DIj__AAV0Y_5f1u6vVnLeAwt754VQaYzokMRmDuhE60QvQzn-zglJg1iCk-HhoffiAWHH7PuAQiFGgvK6dVo9wE7CTnZLjED3zqnutnLrp_BIUYe89ZFTknTXWu3pezQhmvZRiqk8bVXvQ0ruCWafLzT1YV7uzn7FPGE8KKT9iot2kpxKQvgJa559F4RADSkoM2OsES7vXbhCkXP6tSCbCAzyVhFriD9yYU6cm-CZbY1HGAUhKFPq9zK4Dc5Edl3tRU8SlJMnS1m7Qsk9gO_bCT2CcYw8Zp-gbWQITjzQuh-mciP49m2YHMQbVpGdKJZ1MW8jdrwFZwvEIcfgdaZ-KDbe9vre7VRo8DQolzS1hcaK-_kbW94UFEm0j4i4urOWQI6bjBiOdz_ukpAuY3unfFmj0qNEH-bxPB7vjJSjUfmwF5MChsl7iDkZbvuEX2a9dacEtxfQSjKQk8yjIehRZtmYo_gy8cDKGQ1z1kHj7GX9-pSB1VEk6H_PuY2ikMxJ1x-WhNIgUeeSh7kw9Im-NSvDzKi7RT9bcK40JskQ86Sr2i0tS3A0BUTOZVbCl6DkZLunN8NwtkLfw8bJKI0tQ2UNB_VSkDe0_v-1S_q4Ava1W4ER-PbCgcrq0G-b8cjzT-BCmyhDgmwT8E5KE5-eiNozae5tmRn1Lxx6F6VT3H85Sd1oVleX6sVYmsiS_HMFzF8NSJgGymvXhb441GkFLQTBZBoGfH5pA5TA5iMkq4dFXuUM4rUIP6qkNxeljgg_dIQiLylRvTsYNKeoklrptHaywY7C6LVWRBMZ3OhJctmGzrQjD9UX6bwAl5h4M7zw2cToCg_fjGyj0rvQ1pvRrs5vo7ymik4f4YyLojnO8BF8FrBu-hKaIFyl9FMbPDqTJiBwBB8HuHxU8BHXkLds5dAsk4SDjwsgj_kR5ya_0as0sF7qdOXRg09CDuuBKn6XPVHwU6tp-pssxjCAQ5bO69rCtCp4mxphN5Hf5AGSqoYEeYLuxbElUBnPvHJyqDWgKJs6Y9eOtAQuMcQuT1vhSXHYBo6xYLwTYOOk_Ja2Ezl2MUDx-EKxZ5r3PSulicS1PUJl29-xBooeCShFmQ6QwFXhKggjQtz18bONNrIn77yFSEV1dHsp29xsLmx4VsZpBL5qC6Il8RrUPHbkTs6_9ghYVtHH9KRW2j0OFfPkXDtRJ82hPHSLsRPmWwamgAoiXfjPwuT7YKNgzuVIOwTR_g_4jpwlDd5Ga3Jzrm1nosXnfY0Bsc6k6x4gYhKKBgypDifmeThexUJkoqhyTRJnGlCJrrQUR0vWqcRsLclFVGhrTujy1D62tSZsQhRA8DTHf7Yl2c4_d0AhYVOtUN5kzw37zppu3uVETJT4hHqJSuUl_VrfMNWm6kZtkZp7EFQIGkyD8NYXAMWm0WbNpbL9hJ9wkaV5yLNFFagqjLvzdo99i3-2VKAQdDGTE8yxhZCl3zbCAvnxxZOU5KgDQde6_WbuRUGP0OW-Gap_D9nFLUgIW1GPzVTVhvcX107FPSclnRNMh8AXXzjVYTMDRdxNhmhB6_-VMTyQZsrl5tX2BBq8yDSJpMAIH2u7abAyWR_DWbcsR_F25xzAfP7MgKw1Hv9Php5yQzErM-jsLEwyXvKRePbrYPbfUW8IztQQwq6JEeJwlZs52rhu-slSW50vN205xJuOW3veRAvS7XUM_PEY00Xc8c9zuxm9Scnk7NiYd4ETSdE_LPZt-kRW7Fc0FcgIe6zy_jzzEquQN_3EA-vZO1ljqKg6x61Zs3XgzACNLDiCixv8oArLKariANkMXp_wcPYtDQcKGLHRpXwKpFZ2bbq_-mvo3vQF1MyD2DSi0T5Olw9FCIBrHoa8-kitXB2IVzIxingcIKYFM1-67GlfVNl19q4lFCz-0_7Hhg-9d6iwtEsrHq8aZKvZNUtWnIQxQKefjiXjoukIBtHcnAL-ptUXLHUNHEL7IdCJNZw7Nw3DMZwOeGoXP_knwW4kbUkcojmuowvg9EJNVwxoIuOgZpctRHq4y9WizizrouRP6QDQCIxDm3BATQY2ZuQP3Azgn36tGox82LKvZFQutVoyx1fDgYWorIOlyRq-WOkPn-gOFCCDLaimUt3hgRNwJ3nvQmdpBAyRXmNTlR_Dt_Ptghw7kGm_Jl3YWCdvq_2WYmFFlVCgDOZMeS-LCBSVA3mVqIYJTE90oWa1lYNc9NHKDaPkmjBxSHhyYXme76SuXtNlaI6AHdKCtOcJ6Gy6jsZEhGxDuUD1-dlVJB3eEx7Ze-7TZqa5s7UWOrH12fA2sYwLFMB22EX30s-CmKnVpIb_56W6NAeyvIWwHtKqh_8MMlAyCIZzaAj923zc_jQjchVnsBi6P6JH0UbkC8AIp7QTlg9zUALktrrrWMC7fgmJPb2CxgpGkYel_Tk5D9RVxsdOa8YiaDD2rOhPSKl9YGVSlUeCkF0mdxfHZOyeUtN7tYVyYv589G8k5SM5O47VyZ77hz49L4nu2DfAwNW40kOzv9fuWWU5AojnTD2T-1THzKJ5FowoRPxvrA8NppBrqUb0_gKxXwa6fJK3dhdFr8_pKfBpWCeRh6I2xuv2rqPuI98eXLOYMPGt3HNT8VPYzN3rm2it3XB7J-pKDXfu-wG7_uqTjNtcF5-7_04mRpXQSsnFd7wuEPnP_3VGW2ERoqxhy6QxBBGNVOdgJYyTw_Z-Rsnwi044C4ZiUjNkzarapu3F3DJdn_h7-3SYnlvHN9ThKU5nmZORsJucesg6PQEO7kRA6yRiv-G5zhZKXHQxvhMujkVniNJln9PJ36AKhru5uHOuH1tEdf--LjdVOKwjbZjE9vyZqdezv3UW5ZbuG6c82r5V3nsx5Ibtt-SikC8MxnIgugyYVb4kt-7grtHeL-WpSUSm2sM9crtpdPs96z8hfaU4R7vXUFWU2mG2BySIzjaephWosxzl04X4vQcv-NHZZVs6vT_sd-Uc97BH9jolni57c5qG1sBLfqUDj2GNTAWZqn9KkEbS5x25NS5CgyOMwY24DnFPHh7l-uDZZoK_GJ9d3Js9dvkhX8wJwBRsq8ZhIPkyH29g3p5xQy9UJP_G19LJq5uToD3PZ2aTUaKi-KF9ueZvYQl0A4hJMjU41ovSpC4QXBogcRITPWnM71AJpWKCdDEF4USHznkyEnwVBIadVTueT4OI_BkslbblZK165xm51Vvl6zCnt40lmXC92aLIa1nE4jGZffZDwAgST-ufHVOEHBm8hgHnzoFMuw6fuf1yCoOP3PvXXnPnw2izXw-CLaTQdCotz0kFC86SMd4JuIfq2ORiQ4kgh7r46XaCBz_IOtvHUu7hYPHDjNLAd999XM0G89L5Vo0hBx5rT8o1UUbTFojisFp7W_GzZHnmgLltvWZW_j1PzbcNKfQhbgwx4otzH_5Rr3ko8YXTSuzfasprnf37a2FPGG5sGn-VTe3PCiOZT7jYIDGASWYGYHzyUspWE7ggS3YQPyCIllZQm6xggsXFF-C5N58B-Pz6IkU61fcZi6TK9tgNazUZ_mG0DlRzv47xwum2Vm7afqLR9UNQ_HpV7YxGbPTLjL0oK2DL6h2Mcwozac8572PkVZJGhFlSCfK46yI5iPafH1hftF-6kR7ItttAtoi2xM6K7BlTQSqjuSb65SGM1_nj1KGzatkUPGJItvuDPuCiOmRDO338Egn7dl6oPg2weB3MQVCz2vuaL-0lLxAT5mwz_6xNrsIlPVdvm1L9EzDTzeiCC1cUZYHtBVYX6uF1DIMZPbWZ4FoRrZGx_eaXFSXprDFOqQhvcEldqEwsaGzDsBSMSmdJzvLRJUE8AHly-Ll5DTK8OyFrhEIQtBXTI8nEL5iGZ6yaIYvFihjrH4hxhUrvTqk2BSUC8TfsEfjzv_BM56E1HLE3KpgTDNFPYHSD2Zt2qZaBRztcHC3x5L5eX-wO-AOh6aT9SQp6g0r2P8fVtQu8BgWCIPLRVlOAY-BNawi6-8zMgxF6huK8CF1rnoSXqhz8gUlH5KNsGFltJ0A-6xYHOyEgraOjVnweLqUo4R1rg9w4Lp2EtmncINhZackfZAR2qUJx9j5qtmNRFvbcJ-VcGKAI7tERZpl8b81uhHPy-t5iAO4CkV9bb57eYF84gHYVmCddqVhnxZKx2IX3Sx0DoXS7zxGyw4NIqG2VZqQYLVZHXsdSbJFmfUPfMCA4KkO0rOaknmckaat3eF2mMDpD5wX7855ssQgmEoKZMATUsRN795sJKweJ5h-YeaWlG0AAG30eDAam9dLe8TQXgFbi9GJ2sje08PmUNkCk1gglmEHiuUo4MX1w3ZT681cdQWHT70m3Fii-Tebohy7c-1uroVy_2FvUqrRE36_k8QvlMU3pJxAd5bhlUmyqC2n96OojslJ-mUgCvFlaBzC5nLyqVoETQt-0GE-zwYyokJS547LJ0TAHSJhE6-n9LJKHBuFwvAGp5SlrSWq9tGFiQvLDIuVhYvSdr_firAP7yoqwspv38qm4T6f9UQ0m-hagKpj2OvwtGoChMlFjECqlL54eElGJkzcwRdTepf6QctOpEkrW1g-cVMeYcKjq9eNHU0_Afe5U5MAVioFMKuGm6p2MeeII3nWm_8EI3kNY7KaNs133JjJZaFa80rk4ZDjizYJjEby9-zWMRZbx-DjRh1HQ91NBCrGvwQAmgmZTCmleajTni65hKQK7_HS4pJHcHNigzXCQ2lLY0ltMAHapl7BqbSenrzcLSr3LVc5mBZo7GkqhRZ_STzx0nA_k_8pTIzMXibmk8_Jt_RpLkP2lOSijW2MZgdwie7ltal4sQiqFsMP_ZUALq9ZzdVgLXOFc0-v4KJNBUghHtfTk1h0hXRDt8lb1M9OOKiRhXRFYYq12X3uRRrC0yJL3rMwYwduV5EEpc_8XHSRHQw0v4cS0hkCeTq25abLp20fU6fEwGkATtfh6bMf_SoQE3RE9O7us5jK4EnJKU7SJNVLlMxag643_rCH1OB6bhxJSu1OYku15MAZ7jkqEwrRt--eVMVRLxjiYVAGi8rV9Mtkk-kHorkPzgyLnD9MS-qQbPXrR0_Ch3SKpBCFfiyUcwz-qsBfSFNUZq-ECjfLFnBMqOCIiGRtCHd9qURIiQy8O0484Kn6hqPKbE_TYFs8qrrZooP0fB7J1CmrU-OCknqw5ZzKFTmB-vC1oZp_jCa125o2bq8oacnq0QpUdbMUScFvhjhTFgG2gPzLCZbnCM7pvDe7Y4cnBAsvaEBBZBiMBwCLh9pjybvFwTQAqGalwggxJ536gU1QP81IybKSW4GXVWs6lVg7Uv_zpveQW0HSHHmWpMP5u_khlMnrSzt6cwbRIRdXRRnhZSCZiVTMdRyI0PNYpLdAxbdE_z27y0B_oOsSHXrW5hBJFQMqXLUOWPPZOw5jUm_4A_peWwV9pSHJA_KbGs2os18MbScX3Vm2E1VgbHxK4FvIBA_ynX9DDcqyGCaljld7zPyn-9qOQWVCBdkmwEJvc093u1jf-60HCS-OXLPVf3qgrc8K4gYcKJBoEF1xkUfOkC2ES341mnaLDwc7VzeF2FJG7IqeKy6Js6gluAPxwGQX0f7E_yg57Hi8aODhseyONQlrh7W4Es39UNfzAl8STMnvVf2h9PJIcLRO5qbHgoa4HBYKDXzCb79uMzC5EaQqMNNyPviCtJphY8C4UUPYuKfpd16kmE0ZXh64PUMFmy_wPL5ITMpxSTbxw4frThOHfWbER1KrilCDOFV5bUk_4xnXoA5XqnU-AtvQoD5zBxDnDWIjAf_6uQ4BgG7XmFb4Sm89CpZTxwE-NbUepPzf67VKgBSavVmZpA7H3P5zBGgH5syVNyZkn44_RNWPKCsyijnPlo5ixo5w3RvDw_LZEiWTa0cdC-Ejmflur5z9w0BiFS8Z3ov54n-Hfb33wNIV5K4VXMup97Lf6FXHFX4GyOEIuT4asXQo3OLOavJYKn88aMxmKgf2f2Ck1a8qKhEORy5u-eqD2O29pdzZBtIrwISF2lh48_maB3cA9CD3_ydOZEHbaMsTTtIgFMVpIZ3orNxHpdPVGptTCe21PhbWYj6akBeEPWvmyd2iszR-0wDadJvVv4rwvobjrxaEYGcNrGuT9ZyJ-61HHBbmfWj9inakFmHT_ZKVxB-N9JxlUkeCeEMyziv8IIL-oCV6z9uPKL-iRjDAEBTYYGdFFWDQHOxDi_HDPC2DHGbchzciFn7QZuxkfnwqT4iExGybHl_58thXPhMogA6V580ZGDBe7mJ45CDjJjXidbee7ZpgpmeUoIN2KHqkyFvoGLQ5cVKiDCNcegCthElCfdwW7rlDsn4KmJZH427AFU9MSdMf5H9A1XBiaJvEF_EZmi27E1yhZtcqOkYaZhWkEFYu_k1-BLBZzVY0nF7W9oFW8l9x6blixW9xRYSTpKtO8jgR3-QuP-7SZg0oj_aVURwNtvMaVulGa7jmOQYmCANy1-mj4XT3Glggb4Tum9Hy-dJhnyt5Go7jl8VvOIa-EkO_pJBHI5gR7ncsnz-OOToVzgnEqWWAI_PbF4sSLOBPpPj43mDRELhl3lr14PY850jdBiN-8rYjLAGVabLFE709z3l_fNOqzwRndxR9dZ6gicVFgmnJpfIf6Et4W4lwPJv_hdNoyWG0007F8nr8DJc3ZGGQ_FJ_gesyy06i-Ta6yQcvpMy1t3DXHLcguoz3TfjchX6wtcE91Wdl5emk1xivG9vCKG8cXA9QMkfXmQbiPiLUzQWXaA9-J4kXyj3arTvSLxrH3vHzxX6nV_ieW4EqqM_0_0pBtbrNxkbXk2B5j8McPq25aZASVo7miyKLlMOY6xH2N4xqV--hhbv2gveJNlSqHVnyBJbcywkfslOVyt39DVIc6zyYt6t9IZKxi8KmPGHD8ZfXM0LNgl53VOotsVdVlVMvMp7CAgfjjHwoq5g2_jLIFzcHUZo5b8tSU6KPRC1nMTyvhUH5dRqHIl09Smjd28H2eoF7iny05De9URl7Gb0LR3hF4SG-oCkmjFAE8AqgLcUnTjkGrsbY157gMeJY-mpGHpHqBLu371v3W9ZOrCIBvgOLXWCEMXy7B0mg_sra8EBP3_Z84OPD2EDPw7Ic5kCIM8mD3vxo7NNz-lfj6VmYVBxNAC90_hR3ZYDIBNhw13yMdcXLfKegF43lf1ZtTUDLm09WL1rniBeHoMd6Z95uTeKkW42z-hPzEsQTLlea3I8feyN2w2RPpVYQjVGmmvRZuJPdI3DE2xk9uRVaAQeFIoGzQhVpCGYtp_afs45orTzV3McqIOUOS73Nr8QfW7LxEJJVDXtQnJzKXLzpGDnJYabkTu3Bu1h4SBb8Ng2ht30tq2YsRgS7EPj_AIThgloW0N3wQTKX4pXaTbHNoZLaITAAa715MQ48d96_qvrsEjyaj-1oXmnVzX7NpxyZdHw7ftMaYGQn2lQBmBWozWDP7er1UmubSRDjl36C8R3dBvwJcAIQYKJXv5HEm1ojYiIf5O15-12B09_-SmUK4zH-tmvzfRgQQbazi5wKQczabT4ln0Udey3wVAiR5t4fgqAEPymWasja-qjtoy8Lfc4B3Sl8wEXWZD7piq61RMc6pvQNH2ZhqsVcMchcCoPENzKLOYA18ZyQFPMjQFeJGrTIPRTk9mRp6P7PI3_ChdGwx_3fbD2I6MzWoo0ih6IAVktRV4R6m0JpRIXg7aGcBG8m173rqKaD1yc3CUpOnzijX_6tDxgTpqBPb3HFr5Y7b6fXrICH4A59Ws3tnJfu-3rh7kKErq27Cr2k4M6P5ESNJdc6K25W6gdIbyle39bmaceGydvx7jD2VtHhS2ZI58zwGMCa-XzmWcOpF5KO3N2H41Z2-nYkP5gjstvzxublx0h6Zc_EWoCfuRA1It-fmvmO29INQUylDfJDOcB55JfDdR0OE9alxFXf8rv24_ods2aJLjuH_7dfNgfbxPp-yYz2Oj6RaV8Md9Dl-ha4yT4rmompMT6EeKWvPq4YmQLOzkVzvbdxbTUs8et8V9m01wwMYZLR0jD2Jx_O_xUhJZoBfRi5RH7BQV1oDDv2quBaAiJ4T-7Bz92UI7WaYbHKnR72sK9a4wJp-41u3jE2UGVT3zHobLQO_aicoeeuF24_WuuYgaj1jxJVSgszTIU7C5ddldZmsbL8jUEknHUV_MRAKqdsyUUBsiwxjQSvqGt4wC879ORNgDP9KZ0CSG3JV9uYlgSJWNbqbWJKgSx5R1ogSAII5QphtuxDMR9ulV02nL_Y54m-EmpEglEcC9m9LnYk9ttsMo3MDMQPUrLyXMi1MBWyLjMxHY5tXL4PqzeRbBuVGqgGYvrP5urfI0xyHUOFwIX3v1vI5oA0vFyzC8G1CGH1Hg2EaL82-p4RmXnaaJKUAjK3gCTNhCq5xGC54Rxr1jsMnV6idASPA4BgT8Mp0OV0CqlCyD5evCQ8q_T-hz0NudtsMg34Pjvo1bR63bDBiinBd4fHWyDXMWblRw0rT4036hmyUkoaSx3pwjaduhCzv88Kt5KjU8g6MgzIAUEmXr_uRv_TywEtNJNvEpgz_KJuB2BIWbwdwij3fqMrB3Rvl_HlC9_ZNiHR98WPxG8sdTEh7NCL-tdTcMEY2E79HL5vArxBvga_PBHPrzcCkl3YrdfX8jZuWlANU7_xOEzzxgkF_0T52E60_-BfDRx5dYtKkjHwE9Yxn1kvk_b0N8A9O6lbRO-qvNSd6FR719YZoMN83dLxe-9AVJ4FnJSd3_R7KhVNXlE4zJfsJkRb7hU1pHGA8Vbpcov6dMv0E8ecBGPwfNxUbKZlPn5GYgsHDgXT5cctBkAT7c0FH3HyEKvu9EfU6Mhn-fIQZatnYyK-eN3yq10EcOBKMJqEM3qFiSyzwJLz__H0PUPW-lD9BtIkqk5ZIaa-dQNasKg2ij9_uSM0gELP4ailyA061HmUyTdfVeVqysWcCfJ0PQ-N8wq1hfrYV4wXfMaZl0cDUU6iVpHbydWXNFtUrezN-aeV5r7kyWPDmjHhKMLNlPbE0jZw5OdVWIyr96cBAQpKD4e1sdGhVTfeRVKAUidOhW3N2hePGTiHd9XjAm5QJ-DPbxYhRN4huqU7DHjaxuNhITjG0fgcIcjRZhAmenHQ9crYzh8VZp-reFX6A3q85BhZGWa7GnRq-L1ShDKwbbwEsm_X7-BTvEYm2uWPWR04SYS76s2WN3NZ0uQTUicv9TLnfrBEdwEN8MteawcoGLAIjbeH3a7f62OrXNA9nu4r2VAz9v-xFZ0vqBJnb-iVsmAZLpAceqDK6AxrzDXUXRCiUpVYYhaYtE4SegRhj4D-rX_zHN6xHhbmt5HGxJp34QarLQXgteYODV9lppQkwlxeyxURs55-yG5qHwl1CCyDKD9QA5iSDi_gUHRF_0tNcTHZGMv7a0386bHTxpxQ6RiNfokw1-kqppu3w1WoaBwbf-VH-b2CNG-Qu5ozLbwzOgnMWB0dby_UmFNqzYYZ-HIczNGQi0FKh4DYM008_qCQ9kBMKikhJMSl5WuTPZpHeOSRxEzUjF6TOuEdSKvYryjdH3WZxEjQIPVZo_-03mMk12UdYFVfn9g5PeNvbzYZ0bRRqUSO7Fx9wGTVnxZbcwRjQhLeyph13zl4fyxXYyekZNWXbV-NcxLzDE88CncQvp7hZy8r5-gU0vFQAZwFGAVe_PO6-nHVr16KhdV9sIr0A7A0t-edb8hN6-ItxaSpV3DX-ZC5xoNmisUF9Zortibwj7KTlJzqN1UjqJFpKVQm1zZwmGBnzH5vLuU12eMoaCpSL635eitiyqXxEztr9yS_QC8cqzKbAZbrGDiQDI_aCagV7hzHe7eYIfEloqxd5ey9IZkwalodA-W5e8Rxd9F8-E0Y5gc57GibWJdxdMcLBuZcmyix7gGFxXwym8UhKKSbTzB2Ai5AKi3WdlGmqUkJbvKbi0eQAuiZO9Skx5td34904buMRWqOhv47Zp-FtYpPEoZzPkVbsuvIEGzytkxF5wKEpi8iZEoVsR-iq2z7aq2LiO9kkHUSo4o-L_BkgAUQRy_KTcUN1CkmVRY36N1QbW9CD1FWrZP09BKS54nPCBB2w8yj_x_BnqFINXGB-YSXZlPKM4V60mRnBZzV3fFIUBmb2r4uaQUB_0WZpZzrirxOpU41iFYuASjoWqYb-sQBNLjgHO4xWAnt4eVoyCHpdW4PdYvdJDYoAJ5VvE50TTs4Mhhm3uWy-pfzQizmhSO-JlKcypgYpqYkovuTWYqBOybbeebPZMhcSLXNPWEfSshNSym4X0wKUIJDiS9iUrZ4384mS9zbSPQk8n40FvSeVKRKs_uLBJrXtBFR-E6sjKDcrTmxp-HIQSIS9CX11VADuXVWbLUYDeLcKBfX_snE7Ng1lpFxP_c1oJqptTez83cgFUcExneUZ4vVWiIynJnUNFdcOG2CWajV21DlZWxdI0w-jF8Y-WrCPIm3VuhbRvPEpo7r_0EkSa9dZytUYzlFjyUb9sWA4FIf27NDkh5wjsBKC4_3_M1X5U2D5yGxdnMcMtr7jPsHr8hF2ShkcnZYMjnkzWDI_PuJl9Uh1EThetss43bnO69MpeAQXCe0ajNzEKttSts3Iv4NCFWTl3DN6Ks5Dv5vYDrbXYwDDEqR1U6PnnwePujth9RFx_Oj0g6df2FMpfibUm8Nl05YKkoNKQPs73j3w7E8BLAFRMQnqZYmPll8b-F9S2NeFJgn-xkLPEA8eDnMwh-9OOY9nV_cyYF4ou2_Bs2O59bYhCnhzhijz5cDe8F4HN4TWSYqWoZC5Kr1LHZLDQhVXlox47Tbg2MIw4BGD8lb-gLDxTEyqAC003n6A6WMQgQVKBD8AV6Ebl-u-IVkdifA9WXRrZxUbWnGMzHYhiMc6Llt_0gI4mNmdFMV1gM2sdSaTMzSp8KDTTNtKjjFHkZ6LbSQoEQ7L9UeEN3E2TTxgFrMIUc6LNFWq98EC-Xv1GHRLr4eSzyCBHePzJYJVkauBdY22LDWpH9dkA2AlA6QlZw8i93yrZ3jNtMttya29FgZW3uZlD8dlJVPKxQ4P4emXHJXvK-11EEB3pXyeM6wQbLt5iXKSslIe7DDsIbHTtP4ksjlHg0u0fn3tSlvN9r8MQSxLH4WNxdJ3jWAl9aA0KxrQjaGvUdQ1ESZ1X4JT342bApwcj_kARzROQfC5Rv4RqeS08jSVR2qILRJdSxma7UZ0xaI0s9Nwfz8WjbKAvurTcvU6TieLpYGxEgF_LNiuRVsCFwJpBxYM1Duxvs7o-9X5xBQHlozfWvnzuY50yHriAWMSdHZyb0tkeRlCIFoO1vjBSMeQTbv2OBga5HyUtsEK47yi3uC7J6tin3xhmrhSt7UJoESKJ9tWS4g70W33_tX4iHeAxVs7E2t50CFA8mWL1Z1OEAC8lUlPuzRg9C2U_Fuw7TiyfWmZ16uUfUVYePorN3PAJOR93x6Lk-qpelygW4gQwtlJa0p8jEiKck4I-DLK_uaoI-gP3M2-MX4o7LsxhBx0KBxUzMmtyd4zkpqatT0PfzroJALCfsHHkTzwX5IwO4YXwWSHpO-zGtSlkFw5xzk3jMHZgypRtDI-xAN1kyRmnQ8QZPz35EiJiU_aU1JeBWiFHhn06JMfTb5qMWr-6jsr0Of0JtSXIwdOVkM1z6EUgmT9g7c2uU4B0A31X2sqlSKOkmup8TNz8CXfWSi8IfKq4hT3nUD9qWkprqfhjPauTOMWa9DEqB_yfNT8AlTvV1hkpuOxur_f1oWwR3OWToiGcdsJ5hLoxZEADL9blyQOGxe1UI7Oz8gRhuaqXlMrXDsOseGciYQ1VeFUOyDACqY2yrdGmPTDFkC5IV63lmYa-N2AOGRz7USTUsJygyQq7PC4qKKeeCHLGFqhhiUlFbG_kpplcv3KjU8wmcKhsIa4v-10vwTbwfkblRIkhgS4wdWpoICzUZ8Q90kRTQUlOqOu6cdwanqyh6YmuCCjZIMQKNTT-uLIBPV9hDkWsPcbPQQF13zaEVIIe-38AlF4cVXNpzjDUC3JwWjGA4YHHZ3RLsVYAZauj3gSNnY4BuGd_7hRqwZhLnuunAUlgxbhPOhFxuYibDFUgREusClAWsizMhogImFfqTGQ6CCJgL1ZfAG6K4QU2WOnYeLffRQ6s9h4dWR0yV2iLatzznOEmWQmtw66CQq_ptu4Xd35reskb4wZjiIQPO-zVjajta82I6WQMouFPyakttUNDIeZnVeqYW9v1LMEPas9KRpIbBrk1mJYVHUcEmHJZKuMTPPgFuHmsWkaBjRwH90gwYkfp-hrrjHZjfHsQ3JkexKAQ8DdZHc_74bw3kzLcfHLLyNM8ozFmwmPzY_3WZiSzRQ1mdG20JtUW0dVMA4ffnn5QqYIFtwMzuzeoA1tSaoKoYRt3dj0Vhd4CSUNbNM2MGh4DTkRa5aavJt_2gxDDnq6r5YHHvklmIgcza5i1rPfsIdtreiik1DQBQmZWvzVaVvIxpoLmdjyP8EOJuzKPL3oCZbfY-XPuzS0IqmvHuXkr2IVU13TY9ZzEW1sykSSt5PrFy_r3e7cPx3HnwC5DFhEst6RAxcicBKoqYnid8PgNd43-g8WTzqZjpLVNnMRbfv_XO4yjgQwIkWzR6iTaAYQQJW9pvZ8eOrrDpREWwu5MPKutpO6yboZ3ClF9GgJLmhTHYhC987Ffvztr18E5yPrwo2fn9QhRkJEntGrYuXzRr8K6a_dMMqUK_EEqRB3ZwBuQ-mRw1XTkbHqdDGGt-0E4dyEdAcYp5NZj5-xGKp4Xul7IaMgMUh5sH8nBTG4_xhVxdBRt-tjh3LvfMcLIWJBnXit0Z3iovvFiH4U8b0UoAqJW0GFb2DG7ljKft0rDjDZzlWNc3hUCn8Px2zrjILTzAGLfm30yvGvN95QrsXuGLI7yVmQYkKkJoMUuU8LaBRG5yVtuW-0q9NiRr4TdmsU_sf2031ZIxoS2etqwZIpPSycfP6jXxieOQ5d-reG-gia0dE74wn57NjEmzjlNtSmPgiuJDJYU1EM6ldvvFJBu6Nef_Nbbj8uEfD5vh0zvQ7KUstuz2AvGpOUXsOtkff3ksRjhWJv3dkHAmpRrprbWUaJaVEJnqCr3ns2uOmR36JM8iHfmQ7b9g8a0sdmyNjW7aVsemvARzOPWRdaOvkywaj2NDE6vvpg1DmnfBfhaHFP5ABsSt6p3JiaPsOAiZwqEkSxmDnfXTZen5fUJab8-35NRaMm6vSbPbwMVRjn_a3JShT54ebgcF-eGZYI56T4XQb8mt-7vxF0A-xWtl8MLEPBx_EUa59rema_m98afzoqbw2w7fK3pma2DOOcTRsxv5umbNumGah4K6gusatcyoOoSOGnHhfW3zwF0bNnYCcEWxk-H6iEOgytw7l1Y1bhHKCBG7cY9XloFUh7WlOUZyyy0iqgFcfnnpnTHB0Dt7k2dJvFmVPyAS2epUMOXuOttcMwPM04Xl7EVsW1Dbcn2QE3CcRHpeAJ0I0rGsa38WwuC8ZTypBE8X6wKz1ih4fPmi3qMJQ6W_YzFnlYPcB2wWgkR13iPR3hf1hg7qaaQW-JcJiY6byAqJ1mV6GG6fud1-bNfLsV5psF7ayodtUUqZ63PWlz1uMH7ggu8hkX7EV6UX0b0Uj4t_HP2Js5NGuTfhDbKJBmU3k7jZcu2QwIpHhkT4_pW2VTCnllyXOhxHpMdSOqwVuM1hcv3PjRU7IzSDs2y9afzR9JC5WHu6VQmQrJG6rppQjYXk2AYBQ9lwN_0n9utrMA7KQj_K2XPL3IcmSCEO8nLwPvqlmzUB3_Km287orExxjb5tLIOkxXd6qNSdMKmlSRUWpgM60QwETq9B2FDV6DZBsVWql-MehCk2FDKRJIbK5HKsDbEiH-nCYcfLCNZTKpC8yvCKRiTmQ-rXQlDZUcAzpUORkgs7mhHEtir8_T2MSGJ9W-4cYLDu4Ipsnv7uWNcBzRdCHWjxoiLhVwMhSwtw3xkSURf3jtWj0FtxYW78zp0DIObVAhEIGu590LL8UASSREnJVfSMgDUC9yzxUtMC7TYAzSkiPx-kaRJ_rM-GjupeXvJmTzRlR_hfwt7xYJNGhdGSGtvzOIQCeqEPupP3aR-ahk3NoFml3SZ9BYCe_y1BUy71A88A-R78QsphflOGMe8BlFG7a0d8iIMl-8uBK2dJuZIqgLtUwY0TG-RZBhb832HNqA2mlmQFqz2joYA98DB6-GuO8CfF-1tc7_CpUBuuiq0xonWSyR7w9OuDn0RWcaXQNPoU9NYo_QN63TU5aTXZdjA2P8OrzqKc2R0Ov-eSjSw4SWaMDs2-Qi2in29g9iuN4FmHYz_yRiB5HplH2yr7246NgQbYicsuD8dvRG-okKC4soYW9lcB8gDswtc0NFGWSFR-twgqXt5__H6fYujhAFJ2T3FAIJzhaZJAYrDdnhKd9SNRwbgReiKpRJ2O0qWVj59K-ckhfog-nkdSexvAQz4msY_oLK6P2vTFbuvz_RspblO2h0cJXRlCDcjGG2PGsWKW-MSwP5IPdQcSaB3MK4sW_P4ulOEqafoiYiaXmaQQCConDpGHKZr67RPO7LQM7pbhBLjt0DL56Ih7_P5WjqBOpDbcdih0BLJTTCXoQI3omh4PFgu1-5ocZhqAIeOOip5_jWrPoOcajgaSBT8iP2rJ96je7_8w79N-Jf_I2RmdWL6rclJA8C9sLj93gN4Y_MLu6mVa1JlXWatgrWYAIx_FjwRjJa6LT5N5Tyy9tbtcCOBRIUrNY6gnWSuFyMX6Q6xL-8e8N3qYgby3zplwhgGKOvnz1UGEqRL7NIpKbZqjOlMo9vjTj9_yLXCWP5tPc9Ah5WujtwRgAmh3pG85KZrX1TSfK4KIjmkn2HC55AEdy0S_WF5iSjZHy9K7GPnZOcRx8G42Ob6jzdClYvV7YJgc1zg-rb3jjIwckC5-miFegh0g== \ No newline at end of file diff --git a/cloud-init.yaml b/cloud-init.yaml new file mode 100644 index 0000000..f9d3385 --- /dev/null +++ b/cloud-init.yaml @@ -0,0 +1,255 @@ +#cloud-config +package_update: true +package_upgrade: true +packages: + - apt-transport-https + - ca-certificates + - curl + - gnupg + - lsb-release + - ufw + - fail2ban + - git + +write_files: + - path: /root/install-docker.sh + permissions: '0755' + content: | + #!/bin/bash + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list + apt-get update + apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin + systemctl enable docker + systemctl start docker + + - path: /etc/ssl/certs/fullchain.pem + permissions: '0644' + content: | + -----BEGIN CERTIFICATE----- + MIIFKDCCBBCgAwIBAgISA3yPyKBqrYewZDI8pFbjQgs5MA0GCSqGSIb3DQEBCwUA + MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD + EwJSMzAeFw0yNTA2MjYyMjQ5MDJaFw0yNTA5MjQyMjQ5MDFaMBkxFzAVBgNVBAMT + DmludGVsc2lnaHQuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC + 1HLwsBdUBayNJaJ7Wy1n8AeM6F7K0JAw6UQdW0sI8TNtOyZKaOrfTmKBgdxpBnFx + nj7QiIVu8bUczZGcQcKoOLH6X5cJtOvUQRBGzYHlWhCGi7M3JAKjQoKyGiT2uRiZ + P4JsJaVVOJyq1eO5c77TJa9jvAA0qfuWVTzLUDWM1oIJr8zyDHNTM7gK17c1p3XB + F3gGDGCdIj5o1oXJxdNzDgLTqJeqSGKLfLwOTsFiCCjntyVjcQCHaceCdGx4tC+F + Kcx/d5p+Jc6xj7pVvQoqP0Kg1YA6VkX9hLKUCiNlSHhQJbnj8rhfLPtMfHRoZjQT + oazP3Sq6DLGdKJ7TdL2nAgMBAAGjggJNMIICSTAOBgNVHQ8BAf8EBAMCBaAwHQYD + VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0O + BBYEFHl38d4egKf7gkUvW3XKKNOmhQtzMB8GA1UdIwQYMBaAFBQusxe3WFbLrlAJ + QOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL3Iz + Lm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMuaS5sZW5jci5vcmcv + MIGFBgNVHREEfjB8gg5pbnRlbHNpZ2h0LmRlgidhZG1pbi1wYW5lbC11bmRzby5p + bnRlbHNpZ2h0LmRlgidwa2ktc29mdHdhcmUtdW5kc28uaW50ZWxzaWdodC5kZYIS + d3d3LmludGVsc2lnaHQuZGWCHmNkOS03YTMyMS5pbnRlbHNpZ2h0LmRlMBMGA1Ud + IAQMMAowCAYGZ4EMAQIBMIIBBAYKKwYBBAHWeQIEAgSB9QSB8gDwAHcAzxFPn/xF + z4pBaLc8BWh7G7KQJ7WUYYJapBgTyBmOSwAAAZA2NCNCAAAEAwBIMEYCIQCb4Rfu + RJTLkAqV8aG6HqQBFJBGqsLOd5a4cQQE8aAM0QIhAKRY5M8/HuDz8oSI3w0SyAKB + IPZ1cOyEaR2BcLc8JqsEAHUA8aLLMkJi8F4QbRcE7GL7GQZQ7ypXK5Wtj5jqF1FC + H0MAAAGQNjQjQwAABAMARjBEAiAdqzfZkNGBGWGQ8kfKQtE7iiAa6FNHnEhjW1Nu + GlYAFgIgCjRD9awGfJ4lMM8e2TBaA5dKkSsEgWKtGKTjvxkz2VEwDQYJKoZIhvcN + AQELBQADggEBAJX3KxSxdOBOiqW3pJTSEsABKh0h8B8kP5vUAXRzxVcGJY3aJb5Y + DqcTI9ykBQyJM1mB1/VFWZKkINB4p5KqLoY2EBxRj2qXnAhHzNrEptYFk16VQJcc + Xfhv6XKD9yPQTMsHBnfWGQxMYOZbLa5lZM0QLo7T+f8fBOl7u8CwRJZa7wA3Z3F3 + Kw0+0FHjBZOu9wt2U0B0BmUIe8GGNacTbP3JCUOQpMQJbhWnGJtVpEL8HT01qWcl + oZA3nSQm9yD1G6l5aJyIDGdQ4C3/VJ0T3ZlQGXECnQWxCuU6v2lOQXvnQGcSvN+v + kNiRMCT3tXgLhCcr/6daDKYNOJ3EAVIvNx0= + -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- + MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw + TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh + cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw + WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg + RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK + AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP + R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx + sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm + NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg + Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG + /kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC + AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB + Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA + FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw + AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw + Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB + gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W + PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl + ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz + CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm + lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 + avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 + yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O + yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids + hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ + HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv + MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX + nLRbwHOoq7hHwg== + -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- + MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/ + MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT + DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow + TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh + cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB + AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC + ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshwLLezUmgD5HwmJAp32sIGkeG + VPMDCa/Lr+TyTjnhOWgjf7lJJhiaYFBSqygRz0t0IQ1GRomrn1Ktu3R7DJK0bhrP + 4x6+wLpTABEZaHQKxZNljWhJXgxvTNKK6NXBmfAhYZ4+l4W0aMa8kU2Cz8lhCM6i + JnyYcPc9w9YaYJ2Gy1t3wgezPpNTItzPRMpT7p/NnDhqI9/gJvdFfZxgdmdPnTBw + Q5XgZbBB9X3YD8LhI8NsHL1A7a0u8UdL6fkv8R9p7RfC8IA3llXevPS11wUAZcBF + QYJxk4qN9bDYcBdQ0OZ2dOVFBLdCFPuS+iqQBFH2N5fjb9LKgIFrdWJaXEGz70kD + Dq6gIx1SBLyooZKwYvG3Di2E7GvcbnyLqHtCPF/Ky1r3eMZTLZ8PAJhyvggYgOn8 + aNT1+Fo/7+yzFKP8HUlTBRBqKu+8dacN2tGHKjWuiLkahY/xGpPwlKz1wP+4lBEB + VHM9I1cLH+2d7fkBATMqQQMmIaulslYkCBVHeZCDleVQpkq7T2RgwADVb8J3stW3 + e0MZF9HckdZXQPKPYK29oJi7xr5nTMPQDz3FuNhqNYY7JLdWkoLuuONFDgrHLRmd + TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw + SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1 + c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx + +tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB + ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu + b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E + U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu + MA0GCSqGSIb3DQEBCwUAA4IBAQBg4WZmUUxiK3EiwSr1mSWPpnDHVD1GVVxbOyZC + S8+Pf6vDf6tSgqYJ/mLDNtjfLwKy8RBcKwMxkBq5c1FqcTB4tL7IzCOLMCDH4XYP + K0LQ1d5sQNaKZBiJOUPb7oqfwJQVjDuTXl3hcqBhyz2HDvAPkCIPfcIwyhVhucHH + yN9mqPNgYWVGKF3cWQqEQ9ombqCr5ASCvSoEZL/YQM1Zv0j/RdZ5qf+ZwJttL3dP + +t4cpNAl0z7ly6XF/FMwkRFanNg56TjB8aXq0mEJPGBWQgOw7hCYPKNaBaHRPQUH + Lb6XBWI3p2gqQjFJ5KhSMN8mPgqhm8RlJmWWJUMlGsiVr3WE + -----END CERTIFICATE----- + + - path: /etc/ssl/private/privkey.pem + permissions: '0600' + content: | + -----BEGIN PRIVATE KEY----- + MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDC1HLwsBdUBayN + JaJ7Wy1n8AeM6F7K0JAw6UQdW0sI8TNtOyZKaOrfTmKBgdxpBnFxnj7QiIVu8bUc + zZGcQcKoOLH6X5cJtOvUQRBGzYHlWhCGi7M3JAKjQoKyGiT2uRiZP4JsJaVVOJyq + 1eO5c77TJa9jvAA0qfuWVTzLUDWM1oIJr8zyDHNTM7gK17c1p3XBF3gGDGCdIj5o + 1oXJxdNzDgLTqJeqSGKLfLwOTsFiCCjntyVjcQCHaceCdGx4tC+FKcx/d5p+Jc6x + j7pVvQoqP0Kg1YA6VkX9hLKUCiNlSHhQJbnj8rhfLPtMfHRoZjQToazP3Sq6DLGd + KJ7TdL2nAgMBAAECggEAAKJosDxdA6AQ1CvwQp8N1JL9ZAVqYf4Y9c9n6s+HFOBX + wPEsABHNdNAYQJnX5X8rcdXfQhwFKRBqR/0OKtaBEJ2yh9IzO6DKHsKcAsX2aEo8 + 2b+DFCJz7Ty2R7LJBt2oKJxLaVCJlH7nP2VglLK3oAMv9R0+9y1u7bxp4B5Xqkzm + LXnqkiN4MrnLJWLh2eIYcf0fJvL0xUmTQNXZa6PHzv8hfRcOkdJZGLFGRgABBXzi + Ek9/fTNwH0Rg8e6eTZdPzXOgkyQdRsHLQQa3j6DHKJKzP8kI1MKJ2yQELm15LT+E + 0U3QIDgxcKHBzOoKJFE/MzL+NXQ9s+vdT3f1mzLJiQKBgQDgfwOQLm2lUaNcDNgf + A+WLaL1a6ysEG2cDUiwsBSRRUH/5llMEbyFxdPw2sqdVsRkBBaHdJCINkDJGm/kI + /xvJxD3KcBVLSdmHq/qO4pbGxBDRNvzrRO5Yoaiv5xDk2rQF3lm1m3vWdI6YFhq3 + j8qxE4/YjHNQOqfr7a0j+3j9dQKBgQDeBcQD2y7k7KAyRAv5Sh8AjbDSNjvFz3hE + TnJcjeeuTfmKdOBCm5mDCH+vGhBczRoHO9vVnqxLO3dJOWHqf8z7BPTBU4Bpm6zt + 5CJWP5jCbQU8+S0g1vgdUBzRrXFE4I9ZxCvJ5k6mfzVOvPcb0OV2gJGcxPbg2xT5 + uTn7VRTq6wKBgQCGF5yE6DVdMoqh5kjQBjjIObKtXRtJpGxuJ2VDfNYP8Klu6zAZ + zP3hKrUQO0IKJBxOwT/D8VZ4IKLK7y0q3Fb8+rsCxJzPM7J5UtKbQPPOdAbRFPCA + J4fE/YJu4g/sUpTdxq3lVqJ9P4rJyg3JJfn8aRAMOuhhNu6VJ9BlBTe3rQKBgQCv + OHXzS9VV9WMfhpN/UR4Q+LAqwQUKW0HFCkkYiDK/jJ2YNMU+m9e8JUrZOxZ9N1gF + IHJyGppZTxI5y1swCRqfGf+JuR7TKzHD7RK0L7F1q8hJwFjJA4xflg0RRvk5hfQa + WX3rA7SnC2T7b7DlxnVu+j2KNz0BnmKlhEFVOx7CnQKBgCdHRsDGXJGmGqhG1sH8 + PHdT1vA0iKLiouI+/WxtJwA2Y3FKcHjzJz+lX6ucsW5V+dKZuIWKDvuJQsJb1qJb + yiuEZdWy5iLOON0m10AX3WyfxT8A5NWkCBVH6K6IYOiJcBFGVfGXpP3kc1g8NqKd + K1DU5qILAZENMZLGKJfrwyxm + -----END PRIVATE KEY----- + + - path: /root/deploy.sh + permissions: '0755' + content: | + #!/bin/bash + set -e + + # Clone repository + cd /opt + # IMPORTANT: Replace YOUR_GITHUB_TOKEN with a valid GitHub Personal Access Token with 'repo' permissions + GITHUB_TOKEN="YOUR_GITHUB_TOKEN" + git clone https://${GITHUB_TOKEN}@github.com/UserIsMH/v2-Docker.git + cd v2-Docker + + # Remove token from git config + git remote set-url origin https://github.com/UserIsMH/v2-Docker.git + + # Update nginx.conf with correct domains + sed -i 's/admin-panel-undso\.z5m7q9dk3ah2v1plx6ju\.com/admin-panel-undso.intelsight.de/g' v2_nginx/nginx.conf + sed -i 's/api-software-undso\.z5m7q9dk3ah2v1plx6ju\.com/api-software-undso.intelsight.de/g' v2_nginx/nginx.conf + + # Update .env file + sed -i 's/API_DOMAIN=.*/API_DOMAIN=api-software-undso.intelsight.de/' v2/.env + sed -i 's/ADMIN_PANEL_DOMAIN=.*/ADMIN_PANEL_DOMAIN=admin-panel-undso.intelsight.de/' v2/.env + + # Copy SSL certificates + mkdir -p v2_nginx/ssl + cp /etc/ssl/certs/fullchain.pem v2_nginx/ssl/ + cp /etc/ssl/private/privkey.pem v2_nginx/ssl/ + chmod 644 v2_nginx/ssl/fullchain.pem + chmod 600 v2_nginx/ssl/privkey.pem + + # Generate DH parameters if not exist + if [ ! -f v2_nginx/ssl/dhparam.pem ]; then + openssl dhparam -out v2_nginx/ssl/dhparam.pem 2048 + fi + + # Start Docker services + cd v2 + docker compose pull + docker compose up -d + + # Wait for services to be ready + sleep 30 + + # Check if services are running + docker compose ps + + # Enable auto-start + cat > /etc/systemd/system/docker-compose-app.service < /root/deployment.log + - reboot + +final_message: "The system is finally up, after $UPTIME seconds" \ No newline at end of file diff --git a/generate-secrets.py b/generate-secrets.py new file mode 100644 index 0000000..5259dc8 --- /dev/null +++ b/generate-secrets.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +import secrets +import string + +def generate_password(length=16): + """Generate a secure random password""" + alphabet = string.ascii_letters + string.digits + "!@#$%^&*" + return ''.join(secrets.choice(alphabet) for _ in range(length)) + +def generate_jwt_secret(length=64): + """Generate a secure JWT secret""" + return secrets.token_urlsafe(length) + +print("=== Generated Secure Secrets for Production ===") +print() +print("# PostgreSQL Database") +print(f"POSTGRES_PASSWORD={generate_password(20)}") +print() +print("# Admin Panel Users (save these securely!)") +print(f"ADMIN1_PASSWORD={generate_password(16)}") +print(f"ADMIN2_PASSWORD={generate_password(16)}") +print() +print("# JWT Secret") +print(f"JWT_SECRET={generate_jwt_secret()}") +print() +print("# Grafana") +print(f"GRAFANA_PASSWORD={generate_password(16)}") +print() +print("# For v2_lizenzserver/.env") +print(f"SECRET_KEY={secrets.token_hex(32)}") +print() +print("=== IMPORTANT ===") +print("1. Save these passwords securely") +print("2. Update both .env files with these values") +print("3. Never commit these to git") \ No newline at end of file diff --git a/v2/.env b/v2/.env index 1c4f628..616e37c 100644 --- a/v2/.env +++ b/v2/.env @@ -13,8 +13,8 @@ ADMIN2_PASSWORD=Warhammer123! # Domains (können von der App ausgewertet werden, z. B. für Links oder CORS) -API_DOMAIN=api-software-undso.z5m7q9dk3ah2v1plx6ju.com -ADMIN_PANEL_DOMAIN=admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com +API_DOMAIN=api-software-undso.intelsight.de +ADMIN_PANEL_DOMAIN=admin-panel-undso.intelsight.de # ===================== OPTIONALE VARIABLEN ===================== diff --git a/v2/.env.production.template b/v2/.env.production.template new file mode 100644 index 0000000..d8f0056 --- /dev/null +++ b/v2/.env.production.template @@ -0,0 +1,56 @@ +# PostgreSQL-Datenbank +POSTGRES_DB=meinedatenbank +POSTGRES_USER=adminuser +# IMPORTANT: Generate a strong password using generate-secrets.py +POSTGRES_PASSWORD=CHANGE_THIS_STRONG_PASSWORD + +# Admin-Panel Zugangsdaten +ADMIN1_USERNAME=rac00n +ADMIN1_PASSWORD=1248163264 +ADMIN2_USERNAME=w@rh@mm3r +ADMIN2_PASSWORD=Warhammer123! + +# Domains +API_DOMAIN=api-software-undso.intelsight.de +ADMIN_PANEL_DOMAIN=admin-panel-undso.intelsight.de + +# JWT für API-Auth (WICHTIG: Für sichere Token-Verschlüsselung!) +# IMPORTANT: Generate using generate-secrets.py +JWT_SECRET=CHANGE_THIS_GENERATE_SECURE_SECRET + +# E-Mail Konfiguration (optional) +# MAIL_SERVER=smtp.meinedomain.de +# MAIL_PORT=587 +# MAIL_USERNAME=deinemail +# MAIL_PASSWORD=geheim +# MAIL_FROM=no-reply@intelsight.de + +# Logging +LOG_LEVEL=info + +# Erlaubte CORS-Domains (für Web-Frontend) +ALLOWED_ORIGINS=https://admin-panel-undso.intelsight.de + +# VERSION +LATEST_CLIENT_VERSION=1.0.0 + +# BACKUP KONFIGURATION +EMAIL_ENABLED=false + +# CAPTCHA KONFIGURATION (optional für PoC) +# RECAPTCHA_SITE_KEY=your-site-key-here +# RECAPTCHA_SECRET_KEY=your-secret-key-here + +# MONITORING KONFIGURATION +GRAFANA_USER=admin +# IMPORTANT: Generate a strong password using generate-secrets.py +GRAFANA_PASSWORD=CHANGE_THIS_STRONG_PASSWORD + +# SMTP Settings for Alertmanager (optional) +# SMTP_USERNAME=your-email@gmail.com +# SMTP_PASSWORD=your-app-password + +# Webhook URLs for critical alerts (optional) +# WEBHOOK_CRITICAL=https://your-webhook-url/critical +# WEBHOOK_SECURITY=https://your-webhook-url/security + diff --git a/v2_adminpanel/config.py b/v2_adminpanel/config.py index a9a79fa..de4c1df 100644 --- a/v2_adminpanel/config.py +++ b/v2_adminpanel/config.py @@ -12,7 +12,7 @@ JSON_AS_ASCII = False JSONIFY_MIMETYPE = 'application/json; charset=utf-8' PERMANENT_SESSION_LIFETIME = timedelta(minutes=5) SESSION_COOKIE_HTTPONLY = True -SESSION_COOKIE_SECURE = False # Set to True when HTTPS (internal runs HTTP) +SESSION_COOKIE_SECURE = os.getenv("SESSION_COOKIE_SECURE", "true").lower() == "true" # Default True for HTTPS SESSION_COOKIE_SAMESITE = 'Lax' SESSION_COOKIE_NAME = 'admin_session' SESSION_REFRESH_EACH_REQUEST = False diff --git a/v2_lizenzserver/.env.production.template b/v2_lizenzserver/.env.production.template new file mode 100644 index 0000000..68a8d4d --- /dev/null +++ b/v2_lizenzserver/.env.production.template @@ -0,0 +1,8 @@ +# IMPORTANT: Generate a secure secret key using generate-secrets.py +SECRET_KEY=CHANGE_THIS_GENERATE_SECURE_SECRET + +# Database connection (password should match v2/.env) +DATABASE_URL=postgresql://adminuser:CHANGE_THIS_STRONG_PASSWORD@db:5432/meinedatenbank + +# Production mode +DEBUG=False \ No newline at end of file diff --git a/v2_nginx/nginx.conf b/v2_nginx/nginx.conf index 9dabf10..32731e6 100644 --- a/v2_nginx/nginx.conf +++ b/v2_nginx/nginx.conf @@ -38,7 +38,7 @@ http { # Admin Panel server { listen 80; - server_name admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com; + server_name admin-panel-undso.intelsight.de; # Redirect HTTP to HTTPS return 301 https://$server_name$request_uri; @@ -46,7 +46,7 @@ http { server { listen 443 ssl; - server_name admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com; + server_name admin-panel-undso.intelsight.de; # SSL-Zertifikate (echte Zertifikate) ssl_certificate /etc/nginx/ssl/fullchain.pem; @@ -87,14 +87,14 @@ http { # API Server (für später) server { listen 80; - server_name api-software-undso.z5m7q9dk3ah2v1plx6ju.com; + server_name api-software-undso.intelsight.de; return 301 https://$server_name$request_uri; } server { listen 443 ssl; - server_name api-software-undso.z5m7q9dk3ah2v1plx6ju.com; + server_name api-software-undso.intelsight.de; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; diff --git a/v2_nginx/ssl/.gitignore b/v2_nginx/ssl/.gitignore new file mode 100644 index 0000000..b1500ef --- /dev/null +++ b/v2_nginx/ssl/.gitignore @@ -0,0 +1,10 @@ +# Ignore all SSL certificates +*.pem +*.crt +*.key +*.p12 +*.pfx + +# But keep the README +!README.md +!.gitignore \ No newline at end of file diff --git a/v2_nginx/ssl/README.md b/v2_nginx/ssl/README.md new file mode 100644 index 0000000..17823ee --- /dev/null +++ b/v2_nginx/ssl/README.md @@ -0,0 +1,29 @@ +# SSL Certificate Directory + +This directory should contain the following files for SSL to work: + +1. **fullchain.pem** - The full certificate chain +2. **privkey.pem** - The private key (keep this secure!) +3. **dhparam.pem** - Diffie-Hellman parameters for enhanced security + +## For intelsight.de deployment: + +Copy your SSL certificates here: +```bash +cp /path/to/fullchain.pem ./ +cp /path/to/privkey.pem ./ +``` + +Generate dhparam.pem if not exists: +```bash +openssl dhparam -out dhparam.pem 2048 +``` + +## File Permissions: +```bash +chmod 644 fullchain.pem +chmod 600 privkey.pem +chmod 644 dhparam.pem +``` + +**IMPORTANT**: Never commit actual SSL certificates to the repository! \ No newline at end of file diff --git a/verify-deployment.sh b/verify-deployment.sh new file mode 100644 index 0000000..5a9c1e3 --- /dev/null +++ b/verify-deployment.sh @@ -0,0 +1,123 @@ +#!/bin/bash + +echo "=== V2-Docker Deployment Verification Script ===" +echo + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Check function +check() { + if [ $1 -eq 0 ]; then + echo -e "${GREEN}✓${NC} $2" + else + echo -e "${RED}✗${NC} $2" + return 1 + fi +} + +# Warning function +warn() { + echo -e "${YELLOW}⚠${NC} $1" +} + +echo "1. Checking Docker installation..." +docker --version > /dev/null 2>&1 +check $? "Docker installed" + +docker compose version > /dev/null 2>&1 +check $? "Docker Compose installed" + +echo +echo "2. Checking SSL certificates..." +if [ -f "v2_nginx/ssl/fullchain.pem" ]; then + check 0 "fullchain.pem exists" +else + check 1 "fullchain.pem missing - copy from /SSL/ or your certificate location" +fi + +if [ -f "v2_nginx/ssl/privkey.pem" ]; then + check 0 "privkey.pem exists" +else + check 1 "privkey.pem missing - copy from /SSL/ or your certificate location" +fi + +if [ -f "v2_nginx/ssl/dhparam.pem" ]; then + check 0 "dhparam.pem exists" +else + warn "dhparam.pem missing - will be generated (this takes a few minutes)" +fi + +echo +echo "3. Checking configuration files..." +if grep -q "intelsight.de" v2_nginx/nginx.conf; then + check 0 "nginx.conf has correct domain (intelsight.de)" +else + check 1 "nginx.conf still has test domain" +fi + +if grep -q "intelsight.de" v2/.env; then + check 0 ".env has correct domain (intelsight.de)" +else + check 1 ".env still has test domain" +fi + +echo +echo "4. Checking Docker services..." +cd v2 2>/dev/null +if [ $? -eq 0 ]; then + if docker compose ps 2>/dev/null | grep -q "running"; then + check 0 "Docker services are running" + docker compose ps + else + warn "Docker services not running yet" + fi + cd .. +else + warn "v2 directory not found" +fi + +echo +echo "5. Checking network connectivity..." +if command -v ss &> /dev/null; then + if ss -tlnp 2>/dev/null | grep -q ":80"; then + check 0 "Port 80 is listening" + else + warn "Port 80 not listening yet" + fi + + if ss -tlnp 2>/dev/null | grep -q ":443"; then + check 0 "Port 443 is listening" + else + warn "Port 443 not listening yet" + fi +else + warn "ss command not found, skipping port check" +fi + +echo +echo "=== Quick Start Commands ===" +echo +echo "1. If SSL certificates are missing:" +echo " cp /SSL/fullchain.pem v2_nginx/ssl/" +echo " cp /SSL/privkey.pem v2_nginx/ssl/" +echo " chmod 644 v2_nginx/ssl/fullchain.pem" +echo " chmod 600 v2_nginx/ssl/privkey.pem" +echo +echo "2. Generate dhparam.pem if missing:" +echo " openssl dhparam -out v2_nginx/ssl/dhparam.pem 2048" +echo +echo "3. Start Docker services:" +echo " cd v2" +echo " docker compose up -d" +echo +echo "4. Check logs:" +echo " docker compose logs -f" +echo +echo "=== URLs after deployment ===" +echo "Admin Panel: https://admin-panel-undso.intelsight.de" +echo "API Server: https://api-software-undso.intelsight.de" +echo \ No newline at end of file