import sys, json
from urllib.parse import quote

data = json.load(sys.stdin)
if isinstance(data, dict):
    data = [data]

seen = set()
out = []

for cfg in data:
    for ob in cfg.get("outbounds", []):
        if ob.get("protocol") != "vless":
            continue
        try:
            vn = ob["settings"]["vnext"][0]
            user = vn["users"][0]
            ss = ob.get("streamSettings", {})
        except (KeyError, IndexError):
            continue

        addr, port, uid = vn["address"], vn["port"], user["id"]
        net = ss.get("network", "tcp")
        sec = ss.get("security", "none")
        if net == "raw":
            net = "tcp"

        p = {"encryption": "none", "type": net, "security": sec}
        if user.get("flow"):
            p["flow"] = user["flow"]

        if sec == "reality":
            r = ss.get("realitySettings", {})
            p["sni"] = r.get("serverName", "")
            p["fp"] = r.get("fingerprint", "chrome")
            p["pbk"] = r.get("publicKey", "")
            p["sid"] = r.get("shortId", "")
            if r.get("spiderX"):
                p["spx"] = r["spiderX"]
        elif sec == "tls":
            t = ss.get("tlsSettings", {})
            if t.get("serverName"):
                p["sni"] = t["serverName"]
            if t.get("fingerprint"):
                p["fp"] = t["fingerprint"]
            if t.get("alpn"):
                p["alpn"] = ",".join(t["alpn"])

        if net == "tcp":
            h = ss.get("tcpSettings", {}).get("header", {}).get("type", "none")
            if h != "none":
                p["headerType"] = h
        elif net == "grpc":
            g = ss.get("grpcSettings", {})
            p["serviceName"] = g.get("serviceName", "")
            if g.get("multiMode"):
                p["mode"] = "multi"
        elif net in ("ws", "httpupgrade"):
            w = ss.get("wsSettings", {}) or ss.get("httpupgradeSettings", {})
            p["path"] = w.get("path", "/")
            host = w.get("host") or w.get("headers", {}).get("Host")
            if host:
                p["host"] = host
        elif net == "xhttp":
            x = ss.get("xhttpSettings", {})
            p["path"] = x.get("path", "/")
            if x.get("host"):
                p["host"] = x["host"]
            if x.get("mode"):
                p["mode"] = x["mode"]

        q = "&".join(f"{k}={quote(str(v), safe='')}" for k, v in p.items() if v != "")
        link = f"vless://{uid}@{addr}:{port}?{q}#{quote(addr)}"
        key = f"{addr}:{port}:{net}:{sec}"
        if key not in seen:
            seen.add(key)
            out.append(link)

print("\n".join(out))
