steep-balloon-41261
12/16/2025, 7:03 AMtall-airline-16756
12/16/2025, 7:03 AMtall-airline-16756
12/16/2025, 7:03 AMtall-airline-16756
12/16/2025, 7:09 AMfreezing-receptionist-32972
12/16/2025, 7:11 AMtall-airline-16756
12/16/2025, 7:11 AMrtc.port_range_start: 50000
◦ rtc.port_range_end: 60000
• Ensure turn.enabled: true and set turn.udp_port (e.g., 3478) and turn.tls_port (e.g., 5349) as needed.
2) Choose target type
• Use instance targets (target type = Instance). This allows NLB to forward traffic to the same destination port on the instance.
3) NLB listeners & target groups
• Create listeners only for the protocols/ports you explicitly need:
◦ TCP 7880 → target group (TCP) → instance target (use instance port)
◦ TCP 7881 → target group (TCP) → instance target
◦ UDP 3478 → target group (UDP) → instance target
◦ TCP 5349 → target group (TCP) → instance target
• For the UDP media range (50000–60000) do NOT create thousands of listeners. Instead:
◦ Create a single UDP listener on the NLB that will accept the media traffic. For NLB, you can create a UDP listener on one port and rely on “preserve client port” behavior when forwarding to instance targets. Practically, the usual approach is to create a UDP listener on the same ports clients will use; to cover a range, rely on VPN/VPC routing so clients send directly to NLB and the NLB preserves source/destination ports when forwarding to the instance.
◦ Ensure the NLB target group protocol is UDP and the target group forwards to the instance port (leave target port set to the instance port, not a fixed port mapping).
• Key point: Use instance targets and UDP target groups so the packet’s destination port on the instance is the original client port (NLB preserves client source/destination port for UDP when using instance targets).
4) Security groups and routing
• NLB is internal (private). Security group / NACL rules:
◦ NLB inbound (from client VPN/VPC CIDR):
▪︎ TCP 7880
▪︎ TCP 7881
▪︎ UDP 3478
▪︎ TCP 5349
▪︎ UDP 50000–60000
◦ EC2 instance inbound (only allow from NLB SG):
▪︎ TCP 7880 (source = NLB SG)
▪︎ TCP 7881 (source = NLB SG)
▪︎ UDP 3478 (source = NLB SG)
▪︎ TCP 5349 (source = NLB SG)
▪︎ UDP 50000–60000 (source = NLB SG)
• Do not open these to 0.0.0.0/0; restrict to your VPN/VPC CIDRs and NLB SG.
• Allow SSH (TCP 22) only from admin CIDR.
5) Preservation of client port / IP
• Use instance target type and UDP target groups so NLB preserves client ports; verify NLB target group settings forward to the instance port rather than remapping.
• Verify LiveKit sees the client IPs if needed (NLB preserves source IP for TCP/UDP when configured with instance targets).
6) Verification steps
• From a client inside your VPN, attempt a call and verify LiveKit logs show RTP/ICE candidates arriving on the UDP ports in the configured range.
• Use tcpdump/ss on the EC2 instance to confirm UDP packets arrive on ports within 50000–60000.
• Confirm TURN behavior by testing TURN allocation and relayed media.
7) Practical notes / alternatives
• If preserving exact port mapping proves unreliable for your setup, reduce the port range (e.g., 50000–51000) to limit NLB complexity.
• For TURN/TLS you can choose to have NLB handle TLS on 443 and forward to instance TLS port, or pass through TLS to LiveKit.
• Keep NLB and EC2 in same AZs/subnets for best performance and enable cross-zone if you run multiple instances.
If you want, I can now provide the exact sequence in the AWS console UI (which fields to choose when creating each UDP target group and listener) or a short checklist to follow in the console—which would you prefer?freezing-receptionist-32972
12/16/2025, 7:17 AMtall-airline-16756
12/16/2025, 7:18 AMrtc.port_range_start: 50000
◦ rtc.port_range_end: 60000
◦ turn.enabled: true and set turn.udp_port if used (e.g., 3478)
• EC2 security group allows UDP 50000–60000 (source: NLB SG or VPC CIDR)
• Instances launched in the same subnets/AZs as the NLB
Step 1 — create the NLB
1. EC2 Console → Load Balancers → Create Load Balancer → Network Load Balancer.
2. Name: e.g., livekit-nlb-media. Scheme: Internal. IP type: IPv4.
3. Select the subnets/AZs where your LiveKit instances reside.
4. Create.
Step 2 — create a UDP target group (instance targets)
1. EC2 Console → Target Groups → Create target group.
2. Target type: Instance.
3. Protocol: UDP.
4. Port: choose any valid port (e.g., 7882) — this is used for target-group definition/health-checks only.
5. VPC: choose your VPC.
6. Health check: Protocol TCP, Port 7880 (LiveKit signal port) so instances get verified via TCP.
7. Create the target group.
8. Register your LiveKit EC2 instances as targets (use the instance IDs). Save.
Why instance targets: using instance targets ensures the NLB forwards UDP packets to the instance using the original destination port (port preservation). This is the key to avoid per-port listeners.
Step 3 — add a UDP listener (one required by the console)
1. NLB → Listeners tab → Add listener:
◦ Protocol: UDP
◦ Port: pick an arbitrary port (e.g., 7882) — set Default action: Forward to the UDP target group you created.
1. Save.
Note: The AWS console requires at least one listener. This listener satisfies that requirement. The critical behavior is that NLB will also accept and forward other UDP packets sent to the NLB IP on other ports (e.g., 50000–60000) to the instance targets with destination port preserved.
Step 4 — security groups & routing
1. NLB is internal — ensure routing from your VPN/client CIDR to NLB IPs is in place.
2. NLB inbound (allow from client VPN/VPC CIDR):
◦ UDP 3478 (TURN/UDP)
◦ TCP 5349 (TURN/TLS) if used
◦ TCP 7880 (signal)
◦ TCP 7881 (ice/tcp) if used
◦ UDP 50000–60000 (media)
1. EC2 instance SG (allow only from NLB SG or VPC CIDR):
◦ UDP 50000–60000 — source = NLB SG (or VPC CIDR)
◦ UDP 3478 — source = NLB SG
◦ TCP 5349 — source = NLB SG
◦ TCP 7880, TCP 7881 — source = NLB SG
◦ TCP 22 — source = admin CIDR only
Step 5 — ensure NLB preserves ports and forwards to instance port
• Using instance targets + UDP target group means NLB will forward incoming UDP packets to the instance using the same destination port the client used (preserved). No per-port listener is required for each ephemeral port.
• Verify the target group uses protocol UDP and target type Instance.
Step 6 — LiveKit external IP / ICE candidate settings
• Ensure LiveKit advertises the NLB IP/DNS for ICE candidates (via STUN or explicit external IP setting). This ensures clients get candidate addresses in the 50000–60000 range that map to the NLB IP.
Step 7 — test & verify
1. From a client inside your VPN, start a WebRTC session and confirm media flows.
2. On the instance, run tcpdump/ss to confirm UDP packets arriving on ports in 50000–60000.
3. Check target group health (TCP 7880) and that instances are healthy.
4. If UDP packets do not appear, check VPC Flow Logs and SG/NACL rules.
Troubleshooting notes
• If your environment blocks arbitrary UDP ports between client and NLB (corporate VPN rules), reduce LiveKit’s port range (e.g., 50000–51000) to simplify debugging.
• Ensure instance SG source equals the NLB SG (or VPC CIDR) so the NLB can forward packets.
• If you need the NLB to terminate TLS for TURN/TLS, create separate TCP listeners for that (e.g., 443 → TCP 5349 target).
If you want, I can now:
• Walk you through the exact console clicks for creating the target group and listener with screenshots-style steps, or
• Provide the exact health-check values and an example LiveKit config snippet to match these settings.
Which follow-up would you prefer?
Sources: Ports and firewall | LiveKit docs | Deploy to Kubernetes | LiveKit docs | Running LiveKit on AWS | Deploying LiveKit | LiveKit docs | Firewall Tipstall-airline-16756
12/16/2025, 7:54 AMfreezing-receptionist-32972
12/16/2025, 8:04 AMtall-airline-16756
12/16/2025, 8:05 AMfreezing-receptionist-32972
12/16/2025, 8:27 AMtall-airline-16756
12/16/2025, 8:28 AMfreezing-receptionist-32972
12/16/2025, 8:31 AMtall-airline-16756
12/16/2025, 8:31 AMfreezing-receptionist-32972
12/16/2025, 8:47 AMtall-airline-16756
12/16/2025, 8:47 AMfreezing-receptionist-32972
12/16/2025, 9:00 AMtall-airline-16756
12/16/2025, 9:01 AMfreezing-receptionist-32972
12/16/2025, 9:15 AMtall-airline-16756
12/16/2025, 9:15 AMfreezing-receptionist-32972
12/16/2025, 10:36 AMtall-airline-16756
12/16/2025, 10:36 AMfreezing-receptionist-32972
12/16/2025, 10:58 AMtall-airline-16756
12/16/2025, 10:59 AMfreezing-receptionist-32972
12/16/2025, 11:04 AMtall-airline-16756
12/16/2025, 11:05 AMfreezing-receptionist-32972
12/16/2025, 11:06 AMtall-airline-16756
12/16/2025, 11:06 AMlogging:
logs:
default:
level: INFO
storage:
module: file_system
root: /data
apps:
tls:
certificates:
automate:
- <http://livekitstaging.825382393.cloud.com|livekitstaging.825382393.cloud.com>
- <http://livekitstaging-turn.825382393.cloud.com|livekitstaging-turn.825382393.cloud.com>
layer4:
servers:
https_frontend:
listen: [":443"]
routes:
# Route for TURN/TLS (SNI-based routing to TURN server on 5349)
- match:
- tls:
sni:
- <http://livekitstaging-turn.825382393.cloud.com|livekitstaging-turn.825382393.cloud.com>
handle:
- handler: tls
- handler: proxy
upstreams:
- dial: ["10.148.214.166:5349"]
# Route for LiveKit WSS (SNI-based routing to livekit on 7880)
- match:
- tls:
sni:
- <http://livekitstaging.825382393.cloud.com|livekitstaging.825382393.cloud.com>
handle:
- handler: tls
- handler: proxy
upstreams:
- dial: ["localhost:7880"]
http:
servers:
acme_solver:
listen: [":80"]
routes:
- match:
- path: "/.well-known/acme-challenge/*"
handle:
- handler: file_server
root: /data/acme-challenges
After replacing your current caddy.yaml with this file:
1. Create the ACME directory and set permissions:
◦ sudo mkdir -p /data/acme-challenges
◦ sudo chown -R 1000:1000 /data
1. Restart Caddy:
◦ docker-compose restart caddy
1. Verify:
◦ sudo ss -tunlp | grep -E '80|443' (Caddy should bind both)
◦ docker-compose logs -f caddy (watch for "certificate obtained successfully")
If you want, paste the last 50 lines of the Caddy logs if certificates still don’t appear and I’ll help debug.freezing-receptionist-32972
12/16/2025, 11:11 AMtall-airline-16756
12/16/2025, 11:12 AMpath matcher because I used a string instead of an array. Replace the HTTP section with this corrected snippet and restart Caddy.
Use this exact HTTP block (paste into your caddy.yaml under apps):
http:
servers:
acme_solver:
listen: [":80"]
routes:
- match:
- path:
- "/.well-known/acme-challenge/*"
handle:
- handler: file_server
root: /data/acme-challenges
Steps to apply and verify
1. Update /etc/caddy.yaml with the corrected block.
2. Ensure ACME directory exists and permissions:
sudo mkdir -p /data/acme-challenges sudo chown -R 1000:1000 /data
1. Restart Caddy:
docker-compose restart caddy
1. Watch logs:
docker-compose logs -f caddy
Expected outcome
• Caddy should start without the JSON unmarshal error.
• You should see logs attempting ACME challenge and then "certificate obtained successfully" once HTTP 80 is reachable via the NLB/DNS.
If it still restarts, paste the last 30 lines of the caddy logs and I’ll pinpoint the next issue.freezing-receptionist-32972
12/16/2025, 11:14 AMtall-airline-16756
12/16/2025, 11:15 AMhttp:
servers:
acme_solver:
listen: [":80"]
routes:
- match:
- path:
- "/.well-known/acme-challenge/*"
handle:
- handler: file_server
root: /data/acme-challenges
Then run these commands and paste the outputs if it still fails:
1) Ensure ACME dir & permissions sudo mkdir -p /data/acme-challenges sudo chown -R 1000:1000 /data
2) Restart caddy docker-compose restart caddy
3) Show caddy status/logs (paste last 40 lines) docker-compose logs --tail=40 caddy
4) Confirm listeners sudo ss -tunlp | grep -E '80|443' || true
If the container still restarts, paste the logs from step 3 and the exact caddy.yaml file (full) so I can spot any remaining syntax issues.freezing-receptionist-32972
12/16/2025, 11:22 AMtall-airline-16756
12/16/2025, 11:22 AMuse_external_ip: true but set nat_1to1: ["<NLB_IP>"] or rtc.nat1to1_ips (if your version supports it) to enforce the IP used for candidates.
3) Ensure Caddy / TLS flow matches NLB listeners
• NLB should forward:
◦ TCP 80 → instance 80 (for ACME)
◦ TCP 443 → instance 443 (Caddy TLS terminate)
◦ UDP 3478 → instance 3478
◦ UDP 50000–60000 → instance (port-preserve via UDP TG instance targets) or UDP 7882 if using UDP mux
• Confirm target groups for 80 and 443 use Instance targets and port = 80 / 443 respectively.
4) Verify flow after config change
• Restart LiveKit and Caddy:
docker-compose restart livekit caddy
• From a VPN client:
◦ curl -vk https://livekitstaging.825382393.cloud.com/ (should TLS handshake)
◦ wscat -c wss://livekitstaging.825382393.cloud.com/rtc (should connect)
• On server:
◦ docker-compose logs livekit | tail -n 50 — verify LiveKit logs external IP = the NLB address you set
◦ sudo tcpdump -n -i any udp portrange 50000-60000 — confirm UDP media arrives
5) If agent still times out, capture and share
• Last 50 lines of livekit logs around join attempt
• A short tcpdump of signaling attempt (tcp port 443) and media attempt (udp portrange)
• The client-side error message / stack trace of the timeout
If you want, tell me the NLB IP/DNS you saw from dig and I’ll give the exact livekit.yaml snippet to paste (with proper key indentation). Which NLB IP/DNS did dig return?freezing-receptionist-32972
12/16/2025, 11:28 AMtall-airline-16756
12/16/2025, 11:28 AMlivekit.yaml. It disables STUN autodiscovery and sets the external IP(s) that clients reach (your NLB IPs), so LiveKit will advertise correct ICE candidates.
Replace your file with this (preserve indentation):
port: 7880
bind_addresses:
- ""
rtc:
tcp_port: 7881
port_range_start: 50000
port_range_end: 60000
use_external_ip: false
external_ips:
- "63.180.107.5"
- "63.178.59.195"
enable_loopback_candidate: false
redis:
address: localhost:6379
username: ""
password: ""
db: 0
use_tls: false
sentinel_master_name: ""
sentinel_username: ""
sentinel_password: ""
sentinel_addresses: []
cluster_addresses: []
max_redirects: null
turn:
enabled: true
domain: <http://livekitstaging-turn.825382393.cloud.com|livekitstaging-turn.825382393.cloud.com>
tls_port: 5349
udp_port: 3478
external_tls: true
keys:
PIf5XLjbhFGNy: uKPUeKsjcJwVYfSgLdabAydh69JlM2HDbh1WU2JWC
Steps after replacing the file:
1. Restart services:
◦ docker-compose restart livekit caddy
1. Verify LiveKit advertises the configured external IPs:
◦ docker-compose logs livekit --tail=200 | grep -E "external IP|nat1to1"
◦ LiveKit startup logs should show the external IPs you set.
1. Test from a VPN client:
◦ wss connect: wscat -c wss://livekitstaging.825382393.cloud.com/rtc
◦ Start a call and confirm media flows; on the server run: sudo tcpdump -n -i any udp portrange 50000-60000
1. If join still times out, collect and share:
◦ Last 100 lines of livekit logs around the join attempt
◦ tcpdump capture showing signaling (tcp port 443) and media (udp portrange) during the attempt
If you prefer, I can also provide a variant that uses nat_1to1_ips instead of external_ips depending on your LiveKit version — tell me which LiveKit version you run if you want that.freezing-receptionist-32972
12/16/2025, 11:31 AMtall-airline-16756
12/16/2025, 11:32 AMexternal_ips. Use the supported field nat_1to1_ips (or set use_external_ip: false and external_ip if supported). Let’s fix the file to use nat_1to1_ips, which works on current LiveKit releases.
Replace your rtc section with this exact block:
rtc:
tcp_port: 7881
port_range_start: 50000
port_range_end: 60000
use_external_ip: false
nat_1to1_ips:
- "63.180.107.5"
- "63.178.59.195"
enable_loopback_candidate: false
Full file for copy/paste (replace your current livekit.yaml):
port: 7880
bind_addresses:
- ""
rtc:
tcp_port: 7881
port_range_start: 50000
port_range_end: 60000
use_external_ip: false
nat_1to1_ips:
- "63.180.107.5"
- "63.178.59.195"
enable_loopback_candidate: false
redis:
address: localhost:6379
username: ""
password: ""
db: 0
use_tls: false
sentinel_master_name: ""
sentinel_username: ""
sentinel_password: ""
sentinel_addresses: []
cluster_addresses: []
max_redirects: null
turn:
enabled: true
domain: <http://livekitstaging-turn.825382393.cloud.com|livekitstaging-turn.825382393.cloud.com>
tls_port: 5349
udp_port: 3478
external_tls: true
keys:
PIf5XLjbhFGNy: uKPUeKsjcJwVYfSgLdabAydh69JlM2HDbh1WU2JWC
After updating:
1. Save file.
2. Restart LiveKit: docker-compose restart livekit
3. Check logs: docker logs -f <livekit_container_id> and confirm startup shows NAT 1:1 IPs or external IPs matching the two addresses.
4. Test from VPN client: attempt join; on EC2 run tcpdump for UDP portrange and tcp port 443 while reproducing.
If you still see a parsing error, paste the LiveKit container startup log lines (first ~30) and the exact LiveKit image version (docker image tag shown by docker-compose). I’ll adjust the config to the exact version fields.freezing-receptionist-32972
12/16/2025, 11:34 AMtall-airline-16756
12/16/2025, 11:35 AMuse_external_ip: true) that will not cause parsing errors, plus the exact commands to apply and verify. Sources: Deploying LiveKit | LiveKit docs | Ports and firewall | LiveKit docsfreezing-receptionist-32972
12/16/2025, 11:36 AMtall-airline-16756
12/16/2025, 11:37 AMlatest image and several attempted fields are unsupported by that runtime, revert to a minimal, supported RTC config so the server starts, then we’ll apply the proper external-IP approach that works for your version.
1) Replace your livekit.yaml with this safe, supported config (copy-paste exactly):
port: 7880
bind_addresses:
- ""
rtc:
tcp_port: 7881
port_range_start: 50000
port_range_end: 60000
use_external_ip: true
enable_loopback_candidate: false
redis:
address: localhost:6379
username: ""
password: ""
db: 0
use_tls: false
turn:
enabled: true
domain: <http://livekitstaging-turn.825382393.cloud.com|livekitstaging-turn.825382393.cloud.com>
tls_port: 5349
udp_port: 3478
external_tls: true
keys:
PIf5XLjbhFGNy: uKPUeKsjcJwVYfSgLdabAydh69JlM2HDbh1WU2JWC
Why: use_external_ip: true is supported and avoids YAML parse errors from unsupported fields like external_ips or nat_1to1_ips. This lets LiveKit use STUN to discover an external IP while avoiding crashes.
2) Restart and verify startup
• Run:
docker-compose restart livekit docker logs -f <livekit_container_id>
• Expected: LiveKit should start without "could not parse config" errors and log STUN/external IP discovery messages (no crash loop).
3) If LiveKit starts but clients still can’t join, we have two follow-ups depending on what you want:
A — Prefer STUN autodiscovery (current): keep use_external_ip: true
• Verify the external IP LiveKit reports matches an IP reachable by your clients (the two IPs you saw from dig).
• If STUN returns a public IP not reachable via your VPN, we’ll instead configure NAT mapping—see B.
B — Prefer fixed advertised addresses (when STUN autodiscovery is unsuitable)
• We need the exact LiveKit server version (image digest/tag) to pick the correct supported field. You can get it with:
docker inspect --format='{{.Config.Image}}' <livekit_container_id>
• If your image supports setting a static advertised IP, I’ll provide the exact config syntax for that version.
4) Quick tests to run after the server is up
• From an inside-VPN client:
◦ dig livekitstaging.825382393.cloud.com +short
◦ curl -vk https://livekitstaging.825382393.cloud.com/
◦ wscat -c wss://livekitstaging.825382393.cloud.com/rtc
• On server:
◦ docker-compose logs livekit --tail=200
◦ sudo tcpdump -n -i any udp portrange 50000-60000 (during a call attempt)
◦ sudo tcpdump -n -i any tcp port 443 (during a join attempt)
5) If you still hit join timeouts, paste:
• The livekit startup logs (first ~50 lines after restart)
• A short snippet of livekit logs during the join attempt
• Results of the tcpdump commands above
I’ll then identify whether the failure is: signaling (WSS/TLS), ICE candidate mismatch (external IP), TURN allocation issue, or UDP reachability. Which do you want to do next — restart with the config above and share the livekit startup logs, or have me provide the static-IP config after you confirm the exact image tag?
Sources: Deploying LiveKit | LiveKit docs | Deploy to a VM | LiveKit docsfreezing-receptionist-32972
12/16/2025, 11:43 AMtall-airline-16756
12/16/2025, 11:43 AMfreezing-receptionist-32972
12/16/2025, 11:48 AMGET / HTTP/1.1
Host: livekitstaging.825382393065.cloud.bayer.com
User-Agent: curl/8.7.1
Accept: /* Request completely sent off < HTTP/1.1 502 cannotconnect < Connection: Keep-Alive < Content-Type: text/html < Cache-Control: no-cache < Content-Length: 5433 < X-Frame-Options: deny < <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- FileName: index.html Language: [en] --> <html> <style type=text/css> <!-- a.tooltip, a.tooltip:link, a.tooltip:visited, a.tooltip:active { position: absolut; text-decoration: none; font-style: italic; color: #0000FF; } a.tooltip1, a.tooltip1:link, a.tooltip1:visited, a.tooltip1:active { position: absolut; text-decoration: none; font-style: italic; color: #0000FF; } a.tooltip:hover { color: #0000FF; background: transparent; } a.tooltip span { display: none; text-decoration: none; } a.tooltip:hover span { display: block; position: absolute; top: 180px; left: 150px; width: 900px; z-index: 100; color: #000000; border:1px solid #000000; background: #FFFFCC; font: 12px Verdana, sans-serif; text-align: left; } a.tooltip1 span b { display: block; margin: 0; padding: 0; font-size: 16px; font-weigth: bold; color: yellow; background-color: gray; border: 0px; border-bottom: 1px solid black; } a.tooltip1 span { display: none; text-decoration: none; } a.tooltip1:hover span { display: block; position: absolute; top: 0px; left: 0px; width: 900px; z-index: 100; color: #000000; border:1px solid #000000; background: #FFFFCC; font: 12px Verdana, sans-serif; text-align: left; } a.tooltip1 span b { display: block; margin: 0; padding: 0; font-size: 16px; font-weigth: bold; color: yellow; background-color: gray; border: 0px; border-bottom: 1px solid black; }
tall-airline-16756
12/16/2025, 11:49 AMfreezing-receptionist-32972
12/16/2025, 11:50 AMtall-airline-16756
12/16/2025, 11:51 AMfreezing-receptionist-32972
12/16/2025, 11:56 AMtall-airline-16756
12/16/2025, 11:56 AMfreezing-receptionist-32972
12/16/2025, 12:01 PMtall-airline-16756
12/16/2025, 12:01 PMfreezing-receptionist-32972
12/16/2025, 12:10 PMGET / HTTP/1.1
Host: 63.178.59.195
User-Agent: curl/8.7.1
Accept: /* Request completely sent off 0 0 0 0 0 0 0 0 -- -- 00048 -- -- 0< HTTP/1.1 502 cannotconnect < content-type: text/html < cache-control: no-cache < content-length: 5262 < x-frame-options: deny < proxy-connection: Keep-Alive < strict-transport-security: max-age=31536000 < { [5262 bytes data] 100 5262 100 5262 0 0 108 0 00048 00048 -- -- 1214 * Connection #0 to host 63.178.59.195 left intact <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- FileName: index.html Language: [en]
tall-airline-16756
12/16/2025, 12:11 PMfreezing-receptionist-32972
12/16/2025, 12:14 PMtall-airline-16756
12/16/2025, 12:14 PM