@subconverter/core 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/dist/index.cjs +882 -505
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +94 -22
- package/dist/index.d.ts +94 -22
- package/dist/index.js +882 -505
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/proxy-group.ts","../src/types/proxy.ts","../src/types/ruleset.ts","../src/types/settings.ts","../src/types/tribool.ts","../src/utils/base64.ts","../src/utils/ini.ts","../src/utils/string.ts","../src/utils/url.ts","../src/utils/hash.ts","../src/utils/template.ts","../src/settings/config.ts","../src/settings/request-params.ts","../src/userinfo.ts","../src/parser/ciphers.ts","../src/parser/construct.ts","../src/parser/netch.ts","../src/parser/conf.ts","../src/parser/uri.ts","../src/parser/subscription.ts","../src/generator/clash.ts","../src/utils/country.ts","../src/generator/nodes.ts","../src/generator/default-profile.ts","../src/generator/links.ts","../src/generator/surge.ts","../src/generator/loon.ts","../src/generator/ruleset.ts","../src/generator/mellow.ts","../src/generator/quan.ts","../src/generator/quanx.ts","../src/generator/singbox.ts","../src/generator/surfboard.ts","../src/engine.ts"],"sourcesContent":["/** Proxy group kinds, mirroring subconverter's `ProxyGroupType`. */\nexport enum ProxyGroupType {\n Select = \"select\",\n URLTest = \"url-test\",\n Fallback = \"fallback\",\n LoadBalance = \"load-balance\",\n Relay = \"relay\",\n SSID = \"ssid\",\n Smart = \"smart\",\n}\n\n/** Load-balance strategy, mirroring `BalanceStrategy`. */\nexport enum BalanceStrategy {\n ConsistentHashing = \"consistent-hashing\",\n RoundRobin = \"round-robin\",\n}\n\n/** A configured proxy group (`[Proxy Group]` entries). */\nexport interface ProxyGroupConfig {\n name: string;\n type: ProxyGroupType;\n proxies: string[];\n usingProvider: string[];\n url: string;\n interval: number;\n timeout: number;\n tolerance: number;\n strategy: BalanceStrategy;\n lazy: boolean | undefined;\n disableUdp: boolean | undefined;\n persistent: boolean | undefined;\n evaluateBeforeUse: boolean | undefined;\n}\n\n/** Create a proxy group with subconverter's default field values. */\nexport function createProxyGroupConfig(): ProxyGroupConfig {\n return {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name: \"\",\n persistent: undefined,\n proxies: [],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 0,\n tolerance: 0,\n type: ProxyGroupType.Select,\n url: \"\",\n usingProvider: [],\n };\n}\n\n/**\n * Create one select group that fans out to every proxy type, mirroring the\n * CLI `--group` flag and the server `group` param. Shared so both\n * entrypoints build byte-identical groups.\n */\nexport function createSelectGroup(name: string): ProxyGroupConfig {\n return {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name,\n persistent: undefined,\n proxies: [\"[]DIRECT\", \"!!TYPE=SS\", \"!!TYPE=SSR\", \"!!TYPE=VMESS\", \"!!TYPE=TROJAN\"],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 0,\n tolerance: 0,\n type: ProxyGroupType.Select,\n url: \"\",\n usingProvider: [],\n };\n}\n\n/** Resolve a textual group type (as found in config files). */\nexport function parseProxyGroupType(value: string): ProxyGroupType | undefined {\n const normalized = value.trim().toLowerCase();\n switch (normalized) {\n case \"select\":\n return ProxyGroupType.Select;\n case \"url-test\":\n return ProxyGroupType.URLTest;\n case \"fallback\":\n return ProxyGroupType.Fallback;\n case \"load-balance\":\n return ProxyGroupType.LoadBalance;\n case \"relay\":\n return ProxyGroupType.Relay;\n case \"ssid\":\n return ProxyGroupType.SSID;\n case \"smart\":\n return ProxyGroupType.Smart;\n default:\n return undefined;\n }\n}\n","import type { TriBool } from \"./tribool\";\n\n/** Proxy protocol kinds supported by the converter. */\nexport enum ProxyType {\n Unknown = \"unknown\",\n Shadowsocks = \"ss\",\n ShadowsocksR = \"ssr\",\n VMess = \"vmess\",\n VLESS = \"vless\",\n Trojan = \"trojan\",\n Snell = \"snell\",\n HTTP = \"http\",\n HTTPS = \"https\",\n SOCKS5 = \"socks5\",\n WireGuard = \"wireguard\",\n Hysteria = \"hysteria\",\n Hysteria2 = \"hysteria2\",\n TUIC = \"tuic\",\n AnyTLS = \"anytls\",\n}\n\n/** Human-readable name used by generators that prefix the remark. */\nexport function proxyTypeName(type: ProxyType): string {\n switch (type) {\n case ProxyType.Shadowsocks:\n return \"SS\";\n case ProxyType.ShadowsocksR:\n return \"SSR\";\n case ProxyType.VMess:\n return \"VMess\";\n case ProxyType.VLESS:\n return \"VLESS\";\n case ProxyType.Trojan:\n return \"Trojan\";\n case ProxyType.Snell:\n return \"Snell\";\n case ProxyType.HTTP:\n return \"HTTP\";\n case ProxyType.HTTPS:\n return \"HTTPS\";\n case ProxyType.SOCKS5:\n return \"SOCKS5\";\n case ProxyType.WireGuard:\n return \"WireGuard\";\n case ProxyType.Hysteria:\n return \"Hysteria\";\n case ProxyType.Hysteria2:\n return \"Hysteria2\";\n case ProxyType.TUIC:\n return \"TUIC\";\n case ProxyType.AnyTLS:\n return \"AnyTLS\";\n default:\n return \"Unknown\";\n }\n}\n\n/** Default provider group names, mirrored from the C++ `*_DEFAULT_GROUP`. */\nexport const DEFAULT_GROUPS = {\n anytls: \"AnyTLSProvider\",\n http: \"HTTPProvider\",\n hysteria: \"HysteriaProvider\",\n hysteria2: \"Hysteria2Provider\",\n snell: \"SnellProvider\",\n socks: \"SocksProvider\",\n ss: \"SSProvider\",\n ssr: \"SSRProvider\",\n trojan: \"TrojanProvider\",\n tuic: \"TUICProvider\",\n v2ray: \"V2RayProvider\",\n wireguard: \"WireGuardProvider\",\n} as const;\n\n/**\n * A single proxy node.\n *\n * The field set intentionally mirrors subconverter's `Proxy` struct so ports of\n * the C++ parsers/generators stay one-to-one and easy to audit.\n */\nexport interface Proxy {\n type: ProxyType;\n id: number;\n groupId: number;\n group: string;\n remark: string;\n hostname: string;\n port: number;\n\n username: string;\n password: string;\n encryptMethod: string;\n plugin: string;\n pluginOption: string;\n protocol: string;\n protocolParam: string;\n obfs: string;\n obfsParam: string;\n userId: string;\n alterId: number;\n transferProtocol: string;\n fakeType: string;\n tlsSecure: boolean;\n\n host: string;\n path: string;\n edge: string;\n\n /** VLESS `flow` control (e.g. `xtls-rprx-vision`). */\n flow: string;\n /** TUIC congestion control algorithm. */\n congestionControl: string;\n\n quicSecure: string;\n quicSecret: string;\n\n udp: TriBool;\n tcpFastOpen: TriBool;\n allowInsecure: TriBool;\n tls13: TriBool;\n\n underlyingProxy: string;\n\n snellVersion: number;\n serverName: string;\n\n selfIp: string;\n selfIpv6: string;\n publicKey: string;\n privateKey: string;\n preSharedKey: string;\n dnsServers: string[];\n mtu: number;\n allowedIps: string;\n keepAlive: number;\n testUrl: string;\n clientId: string;\n\n ports: string;\n up: string;\n upSpeed: number;\n down: string;\n downSpeed: number;\n authStr: string;\n sni: string;\n fingerprint: string;\n shortId: string;\n ca: string;\n caStr: string;\n recvWindowConn: number;\n recvWindow: number;\n disableMtuDiscovery: TriBool;\n hopInterval: number;\n alpn: string[];\n\n cwnd: number;\n}\n\n/** Create a proxy with subconverter's default field values. */\nexport function createProxy(): Proxy {\n return {\n allowedIps: \"0.0.0.0/0, ::/0\",\n allowInsecure: undefined,\n alpn: [],\n alterId: 0,\n authStr: \"\",\n ca: \"\",\n caStr: \"\",\n clientId: \"\",\n congestionControl: \"\",\n cwnd: 0,\n disableMtuDiscovery: undefined,\n dnsServers: [],\n down: \"\",\n downSpeed: 0,\n edge: \"\",\n encryptMethod: \"\",\n fakeType: \"\",\n fingerprint: \"\",\n flow: \"\",\n group: \"\",\n groupId: 0,\n hopInterval: 0,\n host: \"\",\n hostname: \"\",\n id: 0,\n keepAlive: 0,\n mtu: 0,\n obfs: \"\",\n obfsParam: \"\",\n password: \"\",\n path: \"\",\n plugin: \"\",\n pluginOption: \"\",\n port: 0,\n ports: \"\",\n preSharedKey: \"\",\n privateKey: \"\",\n protocol: \"\",\n protocolParam: \"\",\n publicKey: \"\",\n quicSecret: \"\",\n quicSecure: \"\",\n recvWindow: 0,\n recvWindowConn: 0,\n remark: \"\",\n selfIp: \"\",\n selfIpv6: \"\",\n serverName: \"\",\n shortId: \"\",\n snellVersion: 0,\n sni: \"\",\n tcpFastOpen: undefined,\n testUrl: \"\",\n tls13: undefined,\n tlsSecure: false,\n transferProtocol: \"\",\n type: ProxyType.Unknown,\n udp: undefined,\n underlyingProxy: \"\",\n up: \"\",\n upSpeed: 0,\n userId: \"\",\n username: \"\",\n };\n}\n","/** Ruleset source dialects, mirroring `ruleset_type` in ruleconvert.h. */\nexport enum RulesetType {\n Surge = \"surge\",\n QuantumultX = \"quanx\",\n ClashDomain = \"clash-domain\",\n ClashIpCidr = \"clash-ipcidr\",\n ClashClassical = \"clash-classical\",\n}\n\n/** One `ruleset=` entry resolved into a group + remote/local source. */\nexport interface RulesetConfig {\n group: string;\n url: string;\n interval: number;\n}\n\n/** A ruleset with its fetched content and resolved type. */\nexport interface RulesetContent {\n ruleGroup: string;\n rulePath: string;\n rulePathTyped: string;\n ruleType: RulesetType;\n content: string;\n updateInterval: number;\n}\n\n/** Create a ruleset config with subconverter's defaults. */\nexport function createRulesetConfig(): RulesetConfig {\n return { group: \"\", interval: 86400, url: \"\" };\n}\n","import type { Proxy } from \"./proxy\";\nimport type { ProxyGroupConfig } from \"./proxy-group\";\nimport type { RulesetConfig } from \"./ruleset\";\nimport type { TriBool } from \"./tribool\";\n\n/** A regex/script rewrite rule, mirroring `RegexMatchConfig`. */\nexport interface RegexMatchConfig {\n match: string;\n replace: string;\n script: string;\n}\n\n/** Target output formats. */\nexport enum TargetFormat {\n Clash = \"clash\",\n ClashR = \"clashr\",\n Surge = \"surge\",\n Surfboard = \"surfboard\",\n QuantumultX = \"quanx\",\n Quantumult = \"quan\",\n Loon = \"loon\",\n Mellow = \"mellow\",\n V2Ray = \"v2ray\",\n Trojan = \"trojan\",\n SSD = \"ssd\",\n SSC = \"ss\",\n SSSub = \"sssub\",\n SSR = \"ssr\",\n SingBox = \"singbox\",\n Mixed = \"mixed\",\n NodeList = \"nodelist\",\n Auto = \"auto\",\n}\n\n/** Per-run conversion settings, mirroring `extra_settings`. */\nexport interface ExtraSettings {\n enableRuleGenerator: boolean;\n overwriteOriginalRules: boolean;\n renameArray: RegexMatchConfig[];\n emojiArray: RegexMatchConfig[];\n /** Regex rewrites applied to node names before every other naming rule. */\n nameRegexArray: RegexMatchConfig[];\n /** Literal fragments stripped from node names before every other naming rule. */\n nameRemove: string[];\n addEmoji: boolean;\n removeEmoji: boolean;\n /** Prefix node names with the server's country/region when the name lacks one. */\n autoCountry: boolean;\n /** Locale used for `Intl.DisplayNames` country names (default `zh-CN`). */\n countryLocale: string;\n /**\n * Resolve a node's ISO 3166-1 alpha-2 country code. Platform-free: the Node\n * adapter supplies a GeoIP-backed lookup; browsers may supply their own.\n */\n countryResolver?: (node: Proxy) => string | undefined;\n appendProxyType: boolean;\n nodeList: boolean;\n sortFlag: boolean;\n filterDeprecated: boolean;\n clashNewFieldName: boolean;\n clashScript: boolean;\n clashClassicalRuleset: boolean;\n dedupe: boolean;\n surgeSsrPath: string;\n managedConfigPrefix: string;\n quanxDevId: string;\n udp: TriBool;\n tfo: TriBool;\n skipCertVerify: TriBool;\n tls13: TriBool;\n sortScript: string;\n clashProxiesStyle: string;\n clashProxyGroupsStyle: string;\n authorized: boolean;\n}\n\n/** Create `ExtraSettings` with subconverter's defaults. */\nexport function createExtraSettings(): ExtraSettings {\n return {\n addEmoji: false,\n appendProxyType: false,\n authorized: false,\n autoCountry: false,\n clashClassicalRuleset: false,\n clashNewFieldName: true,\n clashProxiesStyle: \"flow\",\n clashProxyGroupsStyle: \"flow\",\n clashScript: false,\n countryLocale: \"zh-CN\",\n countryResolver: undefined,\n dedupe: false,\n emojiArray: [],\n enableRuleGenerator: true,\n filterDeprecated: false,\n managedConfigPrefix: \"\",\n nameRegexArray: [],\n nameRemove: [],\n nodeList: false,\n overwriteOriginalRules: true,\n quanxDevId: \"\",\n removeEmoji: false,\n renameArray: [],\n skipCertVerify: undefined,\n sortFlag: false,\n sortScript: \"\",\n surgeSsrPath: \"\",\n tfo: undefined,\n tls13: undefined,\n udp: undefined,\n };\n}\n\n/** Structured request/config parameters used by the engine. */\nexport interface RequestSettings {\n target: TargetFormat;\n url: string;\n group: ProxyGroupConfig[];\n ruleset: RulesetConfig[];\n rename: RegexMatchConfig[];\n emoji: RegexMatchConfig[];\n /** Regex replacements applied to node names before renaming. */\n nameRegex: RegexMatchConfig[];\n /** Literal fragments removed from node names before renaming. */\n nameRemove: string[];\n includeRemarks: string[];\n excludeRemarks: string[];\n addEmoji: boolean;\n removeEmoji: boolean;\n autoCountry: boolean;\n appendType: boolean;\n nodeList: boolean;\n dedupe: boolean;\n sort: boolean;\n filterDeprecated: boolean;\n list: boolean;\n tfo: TriBool;\n udp: TriBool;\n scv: TriBool;\n tls13: TriBool;\n newFieldName: boolean;\n classicalRuleset: boolean;\n insert: boolean;\n mixin: string;\n interval: number;\n script: string;\n clashScript: boolean;\n proxiesStyle: string;\n proxyGroupsStyle: string;\n autoExtract: boolean;\n uploadPath: string;\n /** Extra quota endpoint fetched server-side (`userinfo_url` / `userinfo-url`). */\n userinfoUrl: string;\n /** Converter for the quota endpoint (`jms` for Just-My-Socks, `subscription`, `auto`). */\n userinfoProvider: string;\n}\n","/**\n * A three-valued boolean mirroring subconverter's `tribool`.\n *\n * `undefined` means \"unspecified\" and callers decide whether to apply a\n * default; `true`/`false` are explicit overrides (e.g. from URL parameters).\n */\nexport type TriBool = boolean | undefined;\n\n/** Treat `undefined` as `false`. */\nexport function triBoolOr(value: TriBool, fallback: boolean): boolean {\n return value === undefined ? fallback : value;\n}\n\n/** Parse a loose string (e.g. `\"1\"`, `\"true\"`, `\"0\"`) into a {@link TriBool}. */\nexport function parseTriBool(value: string | undefined | null): TriBool {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n return undefined;\n}\n","const B64_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst B64_URLSAFE_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\nconst B64_LOOKUP: Record<string, number> = {};\nfor (let i = 0; i < B64_ALPHABET.length; i += 1) {\n B64_LOOKUP[B64_ALPHABET[i] as string] = i;\n}\nB64_LOOKUP[\"-\"] = 62;\nB64_LOOKUP[\"_\"] = 63;\n\n/** UTF-8 encode a string to bytes (browser + Node safe). */\nexport function utf8Encode(input: string): Uint8Array {\n return new TextEncoder().encode(input);\n}\n\n/** Decode UTF-8 bytes back to a string. */\nexport function utf8Decode(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes);\n}\n\nfunction encodeWithAlphabet(input: string, alphabet: string): string {\n const bytes = utf8Encode(input);\n let output = \"\";\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i] as number;\n const b1 = i + 1 < bytes.length ? (bytes[i + 1] as number) : 0;\n const b2 = i + 2 < bytes.length ? (bytes[i + 2] as number) : 0;\n const triple = (b0 << 16) | (b1 << 8) | b2;\n output += alphabet[(triple >> 18) & 0x3f];\n output += alphabet[(triple >> 12) & 0x3f];\n output += i + 1 < bytes.length ? alphabet[(triple >> 6) & 0x3f] : \"=\";\n output += i + 2 < bytes.length ? alphabet[triple & 0x3f] : \"=\";\n }\n return output;\n}\n\nfunction decodeBytes(input: string): Uint8Array {\n const normalized = input.replace(/\\s+/g, \"\");\n const clean = normalized.replace(/=+$/, \"\");\n const out: number[] = [];\n let buffer = 0;\n let bits = 0;\n for (const char of clean) {\n const value = B64_LOOKUP[char];\n if (value === undefined) {\n continue;\n }\n buffer = (buffer << 6) | value;\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n out.push((buffer >> bits) & 0xff);\n }\n }\n return Uint8Array.from(out);\n}\n\n/** Standard base64 encode (with padding). */\nexport function base64Encode(input: string): string {\n return encodeWithAlphabet(input, B64_ALPHABET);\n}\n\n/** URL-safe base64 encode without padding. */\nexport function urlSafeBase64Encode(input: string): string {\n return encodeWithAlphabet(input, B64_URLSAFE_ALPHABET).replace(/=+$/, \"\");\n}\n\n/** Standard base64 decode; tolerant of URL-safe input and missing padding. */\nexport function base64Decode(input: string): string {\n return utf8Decode(decodeBytes(input));\n}\n\n/** URL-safe base64 decode; alias of {@link base64Decode} (same tolerance). */\nexport function urlSafeBase64Decode(input: string): string {\n return base64Decode(input);\n}\n\n/**\n * Best-effort base64 decode used for subscription bodies: subconverter expects\n * a base64 blob but real-world providers sometimes serve plain text.\n */\nexport function tryBase64Decode(input: string): string {\n const trimmed = input.trim();\n if (trimmed === \"\") {\n return \"\";\n }\n if (!/^[A-Za-z0-9+/\\-_=\\s]+$/.test(trimmed)) {\n return input;\n }\n try {\n const decoded = base64Decode(trimmed);\n return decoded.includes(\"\\uFFFD\") ? input : decoded;\n } catch {\n return input;\n }\n}\n","export interface IniSection {\n name: string;\n items: Array<[string, string]>;\n}\n\nexport interface IniDocument {\n sections: IniSection[];\n /** Items appearing before the first section header. */\n isolated: Array<[string, string]>;\n}\n\nexport interface ParseIniOptions {\n /** Section name used to hold items that appear before the first header. */\n isolatedSection?: string;\n /** When false, empty-valued items are dropped. */\n keepEmptyValues?: boolean;\n /** Strip surrounding whitespace from keys and values. */\n trim?: boolean;\n}\n\n/**\n * Minimal INI reader mirroring the subset of `ini_reader` subconverter relies\n * on: case-preserving keys, duplicate sections, and isolated leading items.\n */\nexport function parseIni(content: string, options: ParseIniOptions = {}): IniDocument {\n const isolatedSection = options.isolatedSection ?? \"\";\n const keepEmptyValues = options.keepEmptyValues ?? false;\n const doTrim = options.trim ?? true;\n\n const sections: IniSection[] = [];\n const isolated: Array<[string, string]> = [];\n let current: IniSection | undefined;\n\n const lines = content.split(/\\r?\\n/);\n for (const rawLine of lines) {\n let line = rawLine;\n if (doTrim) {\n line = line.trim();\n }\n if (line === \"\") {\n continue;\n }\n if (line.startsWith(\"[\") && line.endsWith(\"]\")) {\n const name = line.slice(1, -1).trim();\n current = { items: [], name };\n sections.push(current);\n continue;\n }\n const eq = line.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n const key = doTrim ? line.slice(0, eq).trim() : line.slice(0, eq);\n const value = doTrim ? line.slice(eq + 1).trim() : line.slice(eq + 1);\n if (value === \"\" && !keepEmptyValues) {\n continue;\n }\n const pair: [string, string] = [key, value];\n if (current) {\n current.items.push(pair);\n } else {\n isolated.push(pair);\n }\n }\n\n if (isolated.length > 0 && isolatedSection !== \"\") {\n sections.unshift({ items: isolated, name: isolatedSection });\n }\n\n return { isolated, sections };\n}\n\n/** Return the first section with `name`, if any. */\nexport function findSection(doc: IniDocument, name: string): IniSection | undefined {\n return doc.sections.find((section) => section.name === name);\n}\n\n/** Return every item of every section named `name`, in document order. */\nexport function getSectionItems(doc: IniDocument, name: string): Array<[string, string]> {\n const items: Array<[string, string]> = [];\n for (const section of doc.sections) {\n if (section.name === name) {\n items.push(...section.items);\n }\n }\n return items;\n}\n\n/** A raw INI section: a header name and its untouched lines. */\nexport interface RawIniSection {\n name: string;\n lines: string[];\n}\n\n/** Split text into ordered raw sections, preserving line content. */\nexport function parseRawIni(content: string): RawIniSection[] {\n const sections: RawIniSection[] = [];\n let current: RawIniSection | undefined;\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.replace(/\\s+$/, \"\");\n const header = /^\\[(.*)\\]$/.exec(line.trim());\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line.trim() === \"\") {\n continue;\n }\n if (current) {\n current.lines.push(line);\n }\n }\n return sections;\n}\n\n/** Render raw sections back into INI text with blank lines between sections. */\nexport function renderRawIni(sections: RawIniSection[]): string {\n const out: string[] = [];\n for (const section of sections) {\n out.push(`[${section.name}]`);\n out.push(...section.lines);\n out.push(\"\");\n }\n return `${out.join(\"\\n\").trimEnd()}\\n`;\n}\n\n/** Insert or replace a named raw section, keeping its position when present. */\nexport function setRawSection(sections: RawIniSection[], name: string, lines: string[]): void {\n const existing = sections.find((section) => section.name === name);\n if (existing) {\n existing.lines = lines;\n return;\n }\n sections.push({ lines, name });\n}\n","/** Trim ASCII whitespace from both ends. */\nexport function trim(input: string): string {\n return input.replace(/^\\s+|\\s+$/g, \"\");\n}\n\n/** Trim and lowercase. */\nexport function trimLowerCase(input: string): string {\n return trim(input).toLowerCase();\n}\n\n/** Parse the leading integer of a string; `0` when none is present. */\nexport function toInt(value: string | number | undefined | null): number {\n if (value === undefined || value === null) {\n return 0;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? Math.trunc(value) : 0;\n }\n const match = /[+-]?\\d+/.exec(value);\n if (!match) {\n return 0;\n }\n const parsed = Number.parseInt(match[0], 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n\n/** Parse a boolean-ish value (\"true\"/\"false\"/\"1\"/\"0\"). */\nexport function toBool(value: string | undefined | null): boolean {\n if (value === undefined || value === null) {\n return false;\n }\n const normalized = value.trim().toLowerCase();\n return normalized === \"true\" || normalized === \"1\";\n}\n\n/** `true` when `needle` occurs in `haystack`. */\nexport function strFind(haystack: string, needle: string): boolean {\n return haystack.includes(needle);\n}\n\n/** `true` when `input` starts with `prefix`. */\nexport function startsWith(input: string, prefix: string): boolean {\n return input.startsWith(prefix);\n}\n\n/** Count non-overlapping occurrences of `needle` in `haystack`. */\nexport function countOccurrences(haystack: string, needle: string): number {\n if (needle === \"\") {\n return 0;\n }\n let count = 0;\n let index = haystack.indexOf(needle);\n while (index !== -1) {\n count += 1;\n index = haystack.indexOf(needle, index + needle.length);\n }\n return count;\n}\n\n/** Split a string on a literal delimiter, dropping trailing empties when asked. */\nexport function split(input: string, delimiter: string, removeEmpty = false): string[] {\n const parts = input.split(delimiter);\n return removeEmpty ? parts.filter((part) => part !== \"\") : parts;\n}\n\n/**\n * Replace every regex match, mirroring subconverter's `regReplace`.\n * An empty `replacement` removes the matches.\n */\nexport function regReplace(input: string, pattern: string, replacement = \"\"): string {\n return input.replace(new RegExp(pattern, \"g\"), replacement);\n}\n\n/** `true` when `pattern` (a JS regex source) matches anywhere in `input`. */\nexport function regMatch(input: string, pattern: string): boolean {\n return new RegExp(pattern).test(input);\n}\n\n/**\n * Replace distinct consecutive occurrences of `from` with `to`.\n * Kept for API parity; equivalent to a global literal replace.\n */\nexport function replaceAllDistinct(input: string, from: string, to: string): string {\n if (from === \"\") {\n return input;\n }\n return input.split(from).join(to);\n}\n\n/** `true` when the string is a dotted-quad IPv4 literal. */\nexport function isIpv4(input: string): boolean {\n const parts = input.split(\".\");\n if (parts.length !== 4) {\n return false;\n }\n return parts.every((part) => /^\\d{1,3}$/.test(part) && Number(part) <= 255);\n}\n\n/** `true` when the string is a bracketed/unbracketed IPv6 literal. */\nexport function isIpv6(input: string): boolean {\n return /^\\[?[0-9A-Fa-f:]{2,}\\]?$/.test(input) && input.includes(\":\");\n}\n\n/** `true` when the host is an IP literal (v4 or v6). */\nexport function isIp(input: string): boolean {\n return isIpv4(input) || isIpv6(input);\n}\n\n/** Pad a value to two digits. */\nexport function pad2(value: number): string {\n return value < 10 ? `0${value}` : String(value);\n}\n\n/** `true` when the string is empty or only whitespace. */\nexport function isBlank(input: string | undefined | null): boolean {\n return input === undefined || input === null || trim(input) === \"\";\n}\n","/** Percent-decode a URL component, tolerating malformed sequences. */\nexport function urlDecode(input: string): string {\n try {\n return decodeURIComponent(input);\n } catch {\n return input.replace(/%([0-9A-Fa-f]{2})/g, (_, hex: string) =>\n String.fromCharCode(Number.parseInt(hex, 16)),\n );\n }\n}\n\n/** Percent-encode a URL component (RFC 3986 unreserved kept intact). */\nexport function urlEncode(input: string): string {\n return encodeURIComponent(input).replace(\n /[!'()*]/g,\n (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n}\n\n/** Normalize a query key: case-insensitive with `_`/`-` equivalent. */\nexport function normalizeQueryKey(key: string): string {\n return key.toLowerCase().replace(/_/g, \"-\");\n}\n\n/**\n * Read every occurrence of a parameter from a query string in document\n * order (case-insensitive key with `_`/`-` equivalent, each value\n * percent-decoded, `+` preserved).\n * Shared by `getUrlArg` and server-side repeatable params (`url`, `group`,\n * `ruleset`) so both entrypoints decode identically.\n */\nexport function getAllUrlArgs(query: string, key: string): string[] {\n if (query === \"\") {\n return [];\n }\n // Tolerate full links (`tg://socks?server=...`, `vless://...?type=...`):\n // strip any fragment and everything up to the first `?` so the first\n // parameter is not swallowed by the scheme prefix.\n const hashCut = query.split(\"#\", 1)[0] as string;\n const qIndex = hashCut.indexOf(\"?\");\n const rawQuery = qIndex >= 0 ? hashCut.slice(qIndex + 1) : hashCut;\n const normalized = rawQuery.startsWith(\"?\") ? rawQuery.slice(1) : rawQuery;\n const values: string[] = [];\n const target = normalizeQueryKey(key);\n for (const part of normalized.split(\"&\")) {\n if (part === \"\") {\n continue;\n }\n const eq = part.indexOf(\"=\");\n const rawKey = eq >= 0 ? part.slice(0, eq) : part;\n // Keys are rarely encoded, but decode before normalizing so\n // `add%5Femoji` matches `add_emoji` like values already do.\n if (normalizeQueryKey(urlDecode(rawKey)) !== target) {\n continue;\n }\n values.push(urlDecode(eq >= 0 ? part.slice(eq + 1) : \"\"));\n }\n return values;\n}\n\n/**\n * Read a parameter from a query string, mirroring subconverter's\n * `getUrlArg` (last occurrence wins, value percent-decoded).\n */\nexport function getUrlArg(query: string, key: string): string {\n const values = getAllUrlArgs(query, key);\n return values.length > 0 ? (values[values.length - 1] as string).trim() : \"\";\n}\n\n/** Split a URL into its scheme/authority-specific parts without a URL parser. */\nexport function splitUrl(raw: string): { base: string; query: string } {\n const hashIndex = raw.indexOf(\"#\");\n const withoutHash = hashIndex >= 0 ? raw.slice(0, hashIndex) : raw;\n const queryIndex = withoutHash.indexOf(\"?\");\n if (queryIndex < 0) {\n return { base: withoutHash, query: \"\" };\n }\n return { base: withoutHash.slice(0, queryIndex), query: withoutHash.slice(queryIndex + 1) };\n}\n\n/** Strip a scheme prefix (e.g. `ss://`) from a link. */\nexport function stripScheme(link: string): string {\n const index = link.indexOf(\"://\");\n return index >= 0 ? link.slice(index + 3) : link;\n}\n","/**\n * FNV-1a 64-bit hash, matching subconverter's `hash_` (used for WireGuard\n * section names and other deterministic identifiers).\n */\nexport function fnv1a64(input: string): bigint {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n for (const char of input) {\n hash ^= BigInt(char.codePointAt(0) as number);\n hash = BigInt.asUintN(64, hash * prime);\n }\n return hash;\n}\n\n/** Lowercase hex representation of {@link fnv1a64}. */\nexport function fnv1a64Hex(input: string): string {\n return fnv1a64(input).toString(16);\n}\n","/** A flat map of template variables (dotted keys are allowed, e.g. `clash.dns.port`). */\nexport type TemplateVars = Record<string, string>;\n\nconst INTERPOLATION = /\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g;\n\n/**\n * Interpolate `{{ name }}` placeholders in a template body.\n *\n * This is a pragmatic subset of subconverter's template engine: variables come\n * from the `[template]` section of an external config (or the `template` config\n * block). Unknown variables resolve to an empty string, matching the engine's\n * \"undefined variable\" behavior.\n */\nexport function renderTemplate(content: string, vars: TemplateVars): string {\n return content.replace(INTERPOLATION, (_match, name: string) => vars[name] ?? \"\");\n}\n\n/** `true` when the content contains any `{{ ... }}` placeholder. */\nexport function hasTemplatePlaceholders(content: string): boolean {\n INTERPOLATION.lastIndex = 0;\n return INTERPOLATION.test(content);\n}\n\n/** Collect the variable names referenced by a template body. */\nexport function templateVariableNames(content: string): string[] {\n const names = new Set<string>();\n for (const match of content.matchAll(INTERPOLATION)) {\n names.add(match[1] as string);\n }\n return [...names];\n}\n","import type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport { BalanceStrategy, ProxyGroupType } from \"../types/proxy-group\";\nimport type { RulesetConfig } from \"../types/ruleset\";\nimport type { RegexMatchConfig } from \"../types/settings\";\nimport { parseIni } from \"../utils/ini\";\nimport { startsWith, toInt } from \"../utils/string\";\n\n/** A parsed subconverter external configuration file. */\nexport interface ExternalConfig {\n groups: ProxyGroupConfig[];\n rulesets: RulesetConfig[];\n rename: RegexMatchConfig[];\n emoji: RegexMatchConfig[];\n nameRegex: RegexMatchConfig[];\n nameRemove: string[];\n includeRemarks: string[];\n excludeRemarks: string[];\n addEmoji: boolean;\n removeEmoji: boolean;\n autoCountry: boolean;\n enableRuleGenerator: boolean;\n overwriteOriginalRules: boolean;\n baseFiles: Record<string, string>;\n templatePath: string;\n templateVars: Record<string, string>;\n}\n\nconst GROUP_TYPE_MAP: Record<string, ProxyGroupType> = {\n fallback: ProxyGroupType.Fallback,\n \"load-balance\": ProxyGroupType.LoadBalance,\n relay: ProxyGroupType.Relay,\n select: ProxyGroupType.Select,\n smart: ProxyGroupType.Smart,\n ssid: ProxyGroupType.SSID,\n \"url-test\": ProxyGroupType.URLTest,\n};\n\n/** Parse `interval[,timeout[,tolerance]]`, mirroring `parseGroupTimes`. */\nexport function parseGroupTimes(src: string): {\n interval: number;\n timeout: number;\n tolerance: number;\n} {\n const [interval = \"\", timeout = \"\", tolerance = \"\"] = src.split(\",\");\n return {\n interval: toInt(interval),\n timeout: toInt(timeout),\n tolerance: toInt(tolerance),\n };\n}\n\n/** Parse a `name`type`rule...` INI proxy-group definition. */\nexport function parseCustomProxyGroup(value: string): ProxyGroupConfig | undefined {\n const parts = value.split(\"`\");\n if (parts.length < 3) {\n return undefined;\n }\n const name = parts[0] as string;\n const typeName = parts[1] as string;\n const type = GROUP_TYPE_MAP[typeName];\n if (type === undefined) {\n return undefined;\n }\n const group: ProxyGroupConfig = {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name,\n persistent: undefined,\n proxies: [],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 5,\n tolerance: 0,\n type,\n url: \"\",\n usingProvider: [],\n };\n let upperBound = parts.length;\n if (\n type === ProxyGroupType.URLTest ||\n type === ProxyGroupType.LoadBalance ||\n type === ProxyGroupType.Fallback\n ) {\n if (upperBound < 5) {\n return undefined;\n }\n upperBound -= 2;\n group.url = parts[upperBound] as string;\n const times = parseGroupTimes(parts[upperBound + 1] as string);\n group.interval = times.interval;\n group.timeout = times.timeout;\n group.tolerance = times.tolerance;\n }\n for (let i = 2; i < upperBound; i += 1) {\n const rule = parts[i] as string;\n if (startsWith(rule, \"!!PROVIDER=\")) {\n group.usingProvider.push(...rule.slice(11).split(\",\"));\n } else {\n group.proxies.push(rule);\n }\n }\n return group;\n}\n\n/** Parse a `group,url[,interval]` or `group,[]RULE` INI ruleset definition. */\nexport function parseRulesetConfig(value: string): RulesetConfig | undefined {\n const pos = value.indexOf(\",\");\n if (pos === -1) {\n return undefined;\n }\n const group = value.slice(0, pos);\n const config: RulesetConfig = { group, interval: 86400, url: \"\" };\n if (value.slice(pos + 1, pos + 3) === \"[]\") {\n config.url = value.slice(pos + 1);\n return config;\n }\n const endPos = value.lastIndexOf(\",\");\n if (endPos !== pos) {\n config.interval = toInt(value.slice(endPos + 1));\n config.url = value.slice(pos + 1, endPos);\n } else {\n config.url = value.slice(pos + 1);\n }\n return config;\n}\n\n/** Parse a rename/emoji rule using a delimiter (mirrors `from_ini`). */\nexport function parseRegexMatch(value: string, delimiter: string): RegexMatchConfig {\n if (startsWith(value, \"script:\")) {\n return { match: \"\", replace: \"\", script: value.slice(7) };\n }\n const pos = value.lastIndexOf(delimiter);\n const match = pos === -1 ? value : value.slice(0, pos);\n const replace = pos !== -1 && pos < value.length - 1 ? value.slice(pos + 1) : \"\";\n return { match, replace, script: \"\" };\n}\n\n/** Parse a subconverter external configuration file. */\nexport function parseExternalConfig(content: string): ExternalConfig {\n const result: ExternalConfig = {\n addEmoji: false,\n autoCountry: false,\n baseFiles: {},\n emoji: [],\n enableRuleGenerator: true,\n excludeRemarks: [],\n groups: [],\n includeRemarks: [],\n nameRegex: [],\n nameRemove: [],\n overwriteOriginalRules: true,\n removeEmoji: false,\n rename: [],\n rulesets: [],\n templatePath: \"\",\n templateVars: {},\n };\n\n const doc = parseIni(content, { keepEmptyValues: true });\n for (const section of doc.sections) {\n if (section.name.toLowerCase() !== \"template\") {\n continue;\n }\n for (const [key, value] of section.items) {\n if (key.toLowerCase() === \"template_path\") {\n result.templatePath = value;\n } else {\n result.templateVars[key] = value;\n }\n }\n }\n const relevant = doc.sections.filter((section) => section.name.toLowerCase() === \"custom\");\n const sections = relevant.length > 0 ? relevant : [{ items: [...doc.isolated], name: \"custom\" }];\n\n for (const section of sections) {\n for (const [keyRaw, value] of section.items) {\n const key = keyRaw.toLowerCase();\n switch (key) {\n case \"ruleset\": {\n const parsed = parseRulesetConfig(value);\n if (parsed) {\n result.rulesets.push(parsed);\n }\n break;\n }\n case \"custom_proxy_group\": {\n const parsed = parseCustomProxyGroup(value);\n if (parsed) {\n result.groups.push(parsed);\n }\n break;\n }\n case \"rename\":\n case \"rename_node\":\n result.rename.push(parseRegexMatch(value, \"@\"));\n break;\n case \"name_regex\":\n result.nameRegex.push(parseRegexMatch(value, \"@\"));\n break;\n case \"name_remove\":\n for (const fragment of value.split(\",\")) {\n const trimmed = fragment.trim();\n if (trimmed !== \"\") {\n result.nameRemove.push(trimmed);\n }\n }\n break;\n case \"emoji\":\n case \"emojis\":\n result.emoji.push(parseRegexMatch(value, \",\"));\n break;\n case \"include_remarks\":\n case \"include\":\n if (value !== \"\") {\n result.includeRemarks.push(value);\n }\n break;\n case \"exclude_remarks\":\n case \"exclude\":\n if (value !== \"\") {\n result.excludeRemarks.push(value);\n }\n break;\n case \"add_emoji\":\n result.addEmoji = value.toLowerCase() === \"true\";\n break;\n case \"auto_country\":\n case \"country\":\n result.autoCountry = value.toLowerCase() === \"true\";\n break;\n case \"remove_old_emoji\":\n case \"remove_emoji\":\n result.removeEmoji = value.toLowerCase() === \"true\";\n break;\n case \"enable_rule_generator\":\n result.enableRuleGenerator = value.toLowerCase() !== \"false\";\n break;\n case \"overwrite_original_rules\":\n result.overwriteOriginalRules = value.toLowerCase() !== \"false\";\n break;\n default:\n if (key.endsWith(\"_rule_base\")) {\n result.baseFiles[key] = value;\n }\n break;\n }\n }\n }\n return result;\n}\n","import { parseRegexMatch } from \"./config\";\nimport type { RequestSettings } from \"../types/settings\";\nimport { TargetFormat } from \"../types/settings\";\nimport { parseTriBool, type TriBool } from \"../types/tribool\";\nimport { toInt } from \"../utils/string\";\nimport { getAllUrlArgs, getUrlArg } from \"../utils/url\";\n\nconst TARGETS = new Set<string>(Object.values(TargetFormat));\n\n/**\n * `true` when `key` appears anywhere in the query string (`_`/`-`\n * equivalent). Delegates to `getAllUrlArgs` so presence checks share the\n * exact same decoding/precedence as value reads.\n */\nfunction hasArg(query: string, key: string): boolean {\n return getAllUrlArgs(query, key).length > 0;\n}\n\nfunction boolArg(query: string, key: string): boolean {\n // A missing key means `false`; a bare `?flag` (no value) means `true`.\n if (!hasArg(query, key)) {\n return false;\n }\n const value = getUrlArg(query, key).toLowerCase();\n return value === \"true\" || value === \"1\" || value === \"\";\n}\n\nfunction triArg(query: string, key: string): TriBool {\n const value = getUrlArg(query, key);\n return value === \"\" ? undefined : parseTriBool(value);\n}\n\nfunction listArg(query: string, key: string): string[] {\n const value = getUrlArg(query, key);\n return value === \"\" ? [] : value.split(\",\");\n}\n\n/**\n * Resolve the Clash field-name style. Defaults to the new `proxies` /\n * `proxy-groups` / `rules` keys; `legacy=true` (or an explicit\n * `new_name=false` / `new_field_name=false`) opts back into the legacy\n * `Proxy` / `Proxy Group` / `Rule` keys.\n *\n * Exported so the CLI reuses the exact same semantics instead of\n * maintaining a divergent copy.\n */\nexport function resolveNewFieldName(query: string): boolean {\n if (\n boolArg(query, \"legacy\") ||\n boolArg(query, \"legacy_field_name\") ||\n boolArg(query, \"legacy-field-name\")\n ) {\n return false;\n }\n if (\n hasArg(query, \"new_name\") ||\n hasArg(query, \"new_field_name\") ||\n hasArg(query, \"new-name\") ||\n hasArg(query, \"new-field-name\")\n ) {\n return (\n boolArg(query, \"new_name\") ||\n boolArg(query, \"new_field_name\") ||\n boolArg(query, \"new-name\") ||\n boolArg(query, \"new-field-name\")\n );\n }\n return true;\n}\n\n/** Read the first non-empty value across underscore/hyphen aliases. */\nfunction firstArg(query: string, ...keys: string[]): string {\n for (const key of keys) {\n const value = getUrlArg(query, key);\n if (value !== \"\") {\n return value;\n }\n }\n return \"\";\n}\n\n/**\n * Read a boolean flag across aliases. Returns `undefined` when no alias is\n * present; otherwise `true` when any occurrence is `true`/`1`/bare.\n * Shared by server-side flags (`dedupe`, `sort`, `no_rules`, …) so they\n * share one presence/OR semantic instead of per-callsite copies.\n */\nexport function queryBoolFlag(query: string, ...keys: string[]): boolean | undefined {\n let found = false;\n let result = false;\n for (const key of keys) {\n for (const raw of getAllUrlArgs(query, key)) {\n found = true;\n const normalized = raw.trim().toLowerCase();\n if (normalized === \"\" || normalized === \"true\" || normalized === \"1\") {\n result = true;\n }\n }\n }\n return found ? result : undefined;\n}\n\n/** Base {@link RequestSettings} with subconverter's defaults. */\nexport function createRequestSettings(): RequestSettings {\n return {\n addEmoji: false,\n appendType: false,\n autoCountry: false,\n autoExtract: false,\n clashScript: false,\n classicalRuleset: false,\n dedupe: false,\n emoji: [],\n excludeRemarks: [],\n filterDeprecated: false,\n group: [],\n includeRemarks: [],\n insert: false,\n interval: 0,\n list: false,\n mixin: \"\",\n nameRegex: [],\n nameRemove: [],\n newFieldName: true,\n nodeList: false,\n proxiesStyle: \"flow\",\n proxyGroupsStyle: \"flow\",\n removeEmoji: false,\n rename: [],\n ruleset: [],\n script: \"\",\n scv: undefined,\n sort: false,\n target: TargetFormat.Auto,\n tfo: undefined,\n tls13: undefined,\n udp: undefined,\n uploadPath: \"\",\n url: \"\",\n userinfoProvider: \"\",\n userinfoUrl: \"\",\n };\n}\n\n/** Parse a request query string into {@link RequestSettings}. */\nexport function parseRequestSettings(query: string): RequestSettings {\n const settings = createRequestSettings();\n const target = getUrlArg(query, \"target\");\n if (TARGETS.has(target)) {\n settings.target = target as TargetFormat;\n }\n settings.url = getUrlArg(query, \"url\");\n settings.list = boolArg(query, \"list\");\n settings.nodeList = settings.list;\n // `sort_flag`/`sort-flag` are accepted alongside `sort` to match the\n // server-side `toExtraSettings` aliases (normalization alone cannot map\n // `sort` <-> `sort_flag` since they differ beyond `_`/`-`).\n settings.sort = queryBoolFlag(query, \"sort\", \"sort_flag\", \"sort-flag\") ?? false;\n settings.dedupe = queryBoolFlag(query, \"dedupe\", \"deduplicate\") ?? false;\n settings.addEmoji = boolArg(query, \"add_emoji\");\n settings.removeEmoji = boolArg(query, \"remove_emoji\");\n settings.autoCountry = boolArg(query, \"auto_country\");\n settings.appendType = boolArg(query, \"append_type\");\n settings.filterDeprecated = boolArg(query, \"filter_deprecated\");\n settings.newFieldName = resolveNewFieldName(query);\n settings.classicalRuleset = boolArg(query, \"classical\");\n settings.insert = getUrlArg(query, \"insert\") !== \"\";\n settings.clashScript = boolArg(query, \"clash_script\");\n settings.autoExtract = boolArg(query, \"auto_extract\");\n settings.tfo = triArg(query, \"tfo\");\n settings.udp = triArg(query, \"udp\");\n settings.scv = triArg(query, \"scv\");\n settings.tls13 = triArg(query, \"tls13\");\n settings.interval = toInt(getUrlArg(query, \"interval\"));\n settings.script = getUrlArg(query, \"script\");\n settings.mixin = getUrlArg(query, \"mixin\");\n settings.uploadPath = getUrlArg(query, \"upload_path\");\n settings.proxiesStyle = getUrlArg(query, \"proxies_style\") || \"flow\";\n settings.proxyGroupsStyle = getUrlArg(query, \"proxy_groups_style\") || \"flow\";\n settings.includeRemarks = listArg(query, \"include\");\n settings.excludeRemarks = listArg(query, \"exclude\");\n settings.userinfoUrl = firstArg(query, \"userinfo_url\", \"userinfo-url\", \"userinfo\");\n settings.userinfoProvider = firstArg(\n query,\n \"userinfo_provider\",\n \"userinfo-provider\",\n \"userinfo_type\",\n \"userinfo-type\",\n );\n const renameRaw = getUrlArg(query, \"rename\");\n if (renameRaw !== \"\") {\n settings.rename = [parseRegexMatch(renameRaw, \"@\")];\n }\n // `name_regex` accepts the same `match@replacement` form as `rename` and may\n // be repeated; `name_remove` takes a comma-separated list of literals.\n settings.nameRegex = getAllUrlArgs(query, \"name_regex\")\n .flatMap((raw) => raw.split(\"\\n\"))\n .map((raw) => raw.trim())\n .filter((raw) => raw !== \"\")\n .map((raw) => parseRegexMatch(raw, \"@\"));\n settings.nameRemove = getAllUrlArgs(query, \"name_remove\")\n .flatMap((raw) => raw.split(\",\"))\n .map((raw) => raw.trim())\n .filter((raw) => raw !== \"\");\n const emojiRaw = getUrlArg(query, \"emoji\");\n if (emojiRaw !== \"\") {\n settings.emoji = [parseRegexMatch(emojiRaw, \",\")];\n }\n return settings;\n}\n","import { toInt } from \"./utils/string\";\n\n/** Normalized traffic counters for a `subscription-userinfo` header. */\nexport interface UserinfoData {\n /** Downloaded bytes. */\n download: number;\n /** Expiration as a unix timestamp in seconds (`0` when unknown). */\n expire: number;\n /** Total monthly bytes (`0` when unknown/unlimited). */\n total: number;\n /** Uploaded bytes. */\n upload: number;\n}\n\n/** Raw Just-My-Socks API payload (`bw_counter_b`, `monthly_bw_limit_b`, ...). */\nexport interface JmsUserinfoPayload {\n bwCounterB?: number | string;\n bwResetDayOfMonth?: number | string;\n monthlyBwLimitB?: number | string;\n}\n\n/** Supported `userinfo_provider` values for `/sub?userinfo_url=...`. */\nexport type UserinfoProvider = \"auto\" | \"jms\" | \"subscription\";\n\nconst PROVIDER_ALIASES: Record<string, UserinfoProvider> = {\n auto: \"auto\",\n clash: \"subscription\",\n jms: \"jms\",\n \"just-my-socks\": \"jms\",\n justmysocks: \"jms\",\n raw: \"subscription\",\n sub: \"subscription\",\n subscription: \"subscription\",\n \"subscription-userinfo\": \"subscription\",\n};\n\n/** Normalize a provider name (`JMS`, `justMySocks`, ...); unknown falls back to `auto`. */\nexport function normalizeUserinfoProvider(provider: string | undefined | null): UserinfoProvider {\n if (!provider) {\n return \"auto\";\n }\n const key = provider.trim().toLowerCase().replace(/_/g, \"-\");\n return PROVIDER_ALIASES[key] ?? \"auto\";\n}\n\n/**\n * Guess the quota provider from a `userinfo_url` when the caller did not pass\n * one explicitly. Just-My-Socks quota endpoints (`justmysocks*`,\n * `jmssub*`, `getbwcounter*`) use the JMS JSON shape; anything else yields\n * `undefined` (no suitable provider — the caller must skip conversion\n * instead of guessing).\n */\nexport function inferUserinfoProviderFromUrl(url: string): UserinfoProvider | undefined {\n const squished = url.trim().toLowerCase().replace(/[-_]/g, \"\");\n if (\n squished.includes(\"justmysocks\") ||\n squished.includes(\"jmssub\") ||\n squished.includes(\"getbwcounter\")\n ) {\n return \"jms\";\n }\n return undefined;\n}\n\n/** Clamp a value to a non-negative safe integer. */\nfunction toNonNegativeNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return Number.isFinite(value) && value > 0 ? Math.trunc(value) : 0;\n }\n if (typeof value === \"string\") {\n const parsed = toInt(value);\n return parsed > 0 ? parsed : 0;\n }\n return 0;\n}\n\n/** Days in a UTC month (`month` is 0-based). */\nfunction daysInUtcMonth(year: number, month: number): number {\n return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n}\n\n/**\n * JMS bills quota in decimal GB (1 GB = 1000^3 bytes) while Clash clients\n * render `subscription-userinfo` with 1024^3, which would show 500 GB as\n * ~466 GiB. Scale decimal bytes to binary bytes so clients display the\n * advertised GB. `expire` (a timestamp) is never scaled.\n */\nconst DECIMAL_TO_BINARY = 1024 ** 3 / 1000 ** 3;\n\nfunction scaleDecimalBytes(value: number): number {\n return Math.round(value * DECIMAL_TO_BINARY);\n}\n\n/** Scale every byte counter of normalized quota data (decimal -> binary). */\nfunction scaleUserinfoDecimal(data: UserinfoData): UserinfoData {\n return {\n download: scaleDecimalBytes(data.download),\n expire: data.expire,\n total: scaleDecimalBytes(data.total),\n upload: scaleDecimalBytes(data.upload),\n };\n}\n\n/**\n * Compute the next reset timestamp (unix seconds, UTC midnight) for a\n * monthly reset day, mirroring how providers reset quotas on a fixed\n * day-of-month. Returns `0` when the reset day is invalid.\n */\nexport function nextMonthlyResetTimestamp(resetDay: number, nowSec?: number): number {\n const day = Math.trunc(resetDay);\n if (!Number.isFinite(day) || day < 1 || day > 31) {\n return 0;\n }\n const now = nowSec && nowSec > 0 ? Math.trunc(nowSec) : Math.trunc(Date.now() / 1000);\n const current = new Date(now * 1000);\n const year = current.getUTCFullYear();\n const month = current.getUTCMonth();\n const today = current.getUTCDate();\n const useCurrentMonth = today < day;\n const targetYear = useCurrentMonth ? year : month === 11 ? year + 1 : year;\n const targetMonth = useCurrentMonth ? month : (month + 1) % 12;\n const clampedDay = Math.min(day, daysInUtcMonth(targetYear, targetMonth));\n return Math.trunc(Date.UTC(targetYear, targetMonth, clampedDay) / 1000);\n}\n\n/** Parse a Just-My-Socks JSON payload into normalized counters. */\nexport function parseJmsUserinfo(raw: string, nowSec?: number): UserinfoData | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return undefined;\n }\n const record = parsed as Record<string, unknown>;\n // Only claim payloads with provider-specific keys; generic\n // `upload`/`download`/`total` JSON is handled by the generic parser so\n // `auto` detection preserves all fields.\n const hasJmsKeys =\n record[\"monthly_bw_limit_b\"] !== undefined ||\n record[\"monthlyBwLimitB\"] !== undefined ||\n record[\"bw_counter_b\"] !== undefined ||\n record[\"bwCounterB\"] !== undefined ||\n record[\"bw_reset_day_of_month\"] !== undefined ||\n record[\"bwResetDayOfMonth\"] !== undefined;\n if (!hasJmsKeys) {\n return undefined;\n }\n // Tolerate both snake_case API keys and camelCase aliases.\n const limitRaw = record[\"monthly_bw_limit_b\"] ?? record[\"monthlyBwLimitB\"];\n const usedRaw = record[\"bw_counter_b\"] ?? record[\"bwCounterB\"];\n const resetRaw =\n record[\"bw_reset_day_of_month\"] ??\n record[\"bwResetDayOfMonth\"] ??\n record[\"reset_day\"] ??\n record[\"resetDay\"];\n const payload: JmsUserinfoPayload = {\n bwCounterB: usedRaw as number | string | undefined,\n bwResetDayOfMonth: resetRaw as number | string | undefined,\n monthlyBwLimitB: limitRaw as number | string | undefined,\n };\n // JMS bills decimal GB: scale to binary bytes so clients dividing by\n // 1024^3 display the advertised quota (500 GB -> 536870912000 bytes).\n const total = scaleDecimalBytes(toNonNegativeNumber(payload.monthlyBwLimitB));\n const download = scaleDecimalBytes(toNonNegativeNumber(payload.bwCounterB));\n const resetDay = toInt(\n typeof payload.bwResetDayOfMonth === \"number\"\n ? String(payload.bwResetDayOfMonth)\n : ((payload.bwResetDayOfMonth ?? \"\") as string),\n );\n return {\n download,\n expire: resetDay > 0 ? nextMonthlyResetTimestamp(resetDay, nowSec) : 0,\n total,\n upload: 0,\n };\n}\n\n/** Parse a `subscription-userinfo` header value into normalized counters. */\nexport function parseSubscriptionUserinfo(header: string): UserinfoData | undefined {\n if (!header || header.trim() === \"\") {\n return undefined;\n }\n const data: UserinfoData = { download: 0, expire: 0, total: 0, upload: 0 };\n let found = false;\n for (const part of header.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n const key = part.slice(0, eq).trim().toLowerCase();\n const value = part.slice(eq + 1).trim();\n if (value === \"\") {\n continue;\n }\n switch (key) {\n case \"download\":\n case \"down\":\n data.download = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n case \"expire\":\n case \"expires\":\n data.expire = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n case \"total\":\n case \"limit\":\n data.total = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n case \"upload\":\n case \"up\":\n data.upload = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n default:\n break;\n }\n }\n return found ? data : undefined;\n}\n\n/** Render normalized counters as a `subscription-userinfo` header value. */\nexport function formatSubscriptionUserinfo(data: UserinfoData): string {\n const upload = toNonNegativeNumber(data.upload);\n const download = toNonNegativeNumber(data.download);\n const total = toNonNegativeNumber(data.total);\n const expire = toNonNegativeNumber(data.expire);\n return `upload=${upload}; download=${download}; total=${total}; expire=${expire}`;\n}\n\n/** Parse a generic JSON quota payload (`upload`/`download`/`total`/`expire` aliases). */\nfunction parseGenericJsonUserinfo(raw: string): UserinfoData | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return undefined;\n }\n const record = parsed as Record<string, unknown>;\n const pick = (...keys: string[]): unknown => {\n for (const key of keys) {\n if (record[key] !== undefined) {\n return record[key];\n }\n }\n return undefined;\n };\n const uploadRaw = pick(\"upload\", \"upload_b\", \"up\", \"u\");\n const downloadRaw = pick(\n \"download\",\n \"download_b\",\n \"down\",\n \"d\",\n \"used\",\n \"bw_counter_b\",\n \"bwCounterB\",\n );\n const totalRaw = pick(\n \"total\",\n \"total_b\",\n \"limit\",\n \"bandwidth\",\n \"monthly_bw_limit_b\",\n \"monthlyBwLimitB\",\n );\n const expireRaw = pick(\"expire\", \"expires\", \"expire_at\", \"expireAt\", \"reset\");\n if (uploadRaw === undefined && downloadRaw === undefined && totalRaw === undefined) {\n return undefined;\n }\n return {\n download: toNonNegativeNumber(downloadRaw),\n expire: toNonNegativeNumber(expireRaw),\n total: toNonNegativeNumber(totalRaw),\n upload: toNonNegativeNumber(uploadRaw),\n };\n}\n\n/**\n * Convert a raw `userinfo_url` response body into a `subscription-userinfo`\n * header value using the given provider (`jms` for Just-My-Socks).\n * Returns `undefined` when the payload cannot be understood.\n */\nexport function convertUserinfo(\n raw: string,\n provider?: string,\n nowSec?: number,\n): string | undefined {\n if (!raw || raw.trim() === \"\") {\n return undefined;\n }\n const normalized = normalizeUserinfoProvider(provider);\n if (normalized === \"jms\") {\n const jms = parseJmsUserinfo(raw, nowSec);\n if (jms) {\n return formatSubscriptionUserinfo(jms);\n }\n // Explicit `jms` provider with a generic JSON shape: still decimal.\n const generic = parseGenericJsonUserinfo(raw);\n return generic ? formatSubscriptionUserinfo(scaleUserinfoDecimal(generic)) : undefined;\n }\n if (normalized === \"subscription\") {\n const parsed = parseSubscriptionUserinfo(raw) ?? parseGenericJsonUserinfo(raw);\n return parsed ? formatSubscriptionUserinfo(parsed) : undefined;\n }\n // `auto`: JMS shape first, then generic JSON, then header string.\n const jms = parseJmsUserinfo(raw, nowSec);\n if (jms) {\n return formatSubscriptionUserinfo(jms);\n }\n const generic = parseGenericJsonUserinfo(raw);\n if (generic) {\n return formatSubscriptionUserinfo(generic);\n }\n const header = parseSubscriptionUserinfo(raw);\n return header ? formatSubscriptionUserinfo(header) : undefined;\n}\n","/** Shadowsocks AEAD/stream ciphers recognized by the parser. */\nexport const SS_CIPHERS = [\n \"2022-blake3-aes-128-gcm\",\n \"2022-blake3-aes-256-gcm\",\n \"2022-blake3-chacha20-poly1305\",\n \"2022-blake3-chacha12-poly1305\",\n \"2022-blake3-chacha8-poly1305\",\n \"aes-128-cfb\",\n \"aes-128-ctr\",\n \"aes-128-gcm\",\n \"aes-192-cfb\",\n \"aes-192-ctr\",\n \"aes-192-gcm\",\n \"aes-256-cfb\",\n \"aes-256-ctr\",\n \"aes-256-gcm\",\n \"bf-cfb\",\n \"camellia-128-cfb\",\n \"camellia-192-cfb\",\n \"camellia-256-cfb\",\n \"chacha20\",\n \"chacha20-ietf\",\n \"chacha20-ietf-poly1305\",\n \"rc4-md5\",\n \"salsa20\",\n \"xchacha20-ietf-poly1305\",\n];\n\n/** ShadowsocksR stream ciphers recognized by the parser. */\nexport const SSR_CIPHERS = [\n \"aes-128-cfb\",\n \"aes-128-ctr\",\n \"aes-192-cfb\",\n \"aes-192-ctr\",\n \"aes-256-cfb\",\n \"aes-256-ctr\",\n \"bf-cfb\",\n \"camellia-128-cfb\",\n \"camellia-192-cfb\",\n \"camellia-256-cfb\",\n \"cast5-cfb\",\n \"chacha20\",\n \"chacha20-ietf\",\n \"des-cfb\",\n \"idea-cfb\",\n \"none\",\n \"rc2-cfb\",\n \"rc4\",\n \"rc4-md5\",\n \"salsa20\",\n \"seed-cfb\",\n \"table\",\n];\n\n/** `true` when `cipher` is a Shadowsocks cipher. */\nexport function isSsCipher(cipher: string): boolean {\n return SS_CIPHERS.includes(cipher.toLowerCase());\n}\n\n/**\n * True when an SSR node can be flattened to plain Shadowsocks: a known SS\n * cipher with no meaningful obfs/protocol. Mirrors subparser.cpp:713.\n */\nexport function isFlattenableSsr(method: string, obfs: string, protocol: string): boolean {\n return (\n isSsCipher(method) &&\n (obfs === \"\" || obfs === \"plain\") &&\n (protocol === \"\" || protocol === \"origin\")\n );\n}\n","import type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { base64Decode } from \"../utils/base64\";\nimport { isIpv4, isIpv6, toInt, trim } from \"../utils/string\";\n\nfunction commonConstruct(\n node: Proxy,\n type: ProxyType,\n group: string,\n remark: string,\n server: string,\n port: string | number,\n udp: TriBool,\n tfo: TriBool,\n scv: TriBool,\n tls13: TriBool,\n underlyingProxy: string,\n): void {\n node.type = type;\n node.group = group;\n node.remark = remark;\n node.hostname = server;\n node.underlyingProxy = underlyingProxy;\n node.port = toInt(port);\n node.udp = udp;\n node.tcpFastOpen = tfo;\n node.allowInsecure = scv;\n node.tls13 = tls13;\n}\n\nexport interface VmessOptions {\n group: string;\n remark: string;\n add: string;\n port: string | number;\n type?: string;\n id?: string;\n aid?: string | number;\n net?: string;\n cipher?: string;\n path?: string;\n host?: string;\n edge?: string;\n tls?: string;\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a VMess node. Mirrors subparser.cpp `vmessConstruct`. */\nexport function vmessConstruct(node: Proxy, options: VmessOptions): void {\n const {\n add,\n aid = 0,\n cipher = \"\",\n edge = \"\",\n group,\n host = \"\",\n id = \"\",\n net = \"\",\n path = \"\",\n port,\n remark,\n scv,\n sni = \"\",\n tfo,\n tls = \"\",\n tls13,\n type = \"\",\n udp,\n underlyingProxy = \"\",\n } = options;\n\n commonConstruct(\n node,\n ProxyType.VMess,\n group,\n remark,\n add,\n port,\n udp,\n tfo,\n scv,\n tls13,\n underlyingProxy,\n );\n node.userId = id === \"\" ? \"00000000-0000-0000-0000-000000000000\" : id;\n node.alterId = toInt(aid);\n node.encryptMethod = cipher;\n node.transferProtocol = net === \"\" ? \"tcp\" : net;\n node.edge = edge;\n node.serverName = sni;\n\n if (net === \"quic\") {\n node.quicSecure = host;\n node.quicSecret = path;\n } else {\n node.host = host === \"\" && !isIpv4(add) && !isIpv6(add) ? add : trim(host);\n node.path = path === \"\" ? \"/\" : trim(path);\n }\n node.fakeType = type;\n node.tlsSecure = tls === \"tls\";\n}\n\nexport interface SsrOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n protocol: string;\n method: string;\n obfs: string;\n password: string;\n obfsParam?: string;\n protocolParam?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a ShadowsocksR node. Mirrors `ssrConstruct`. */\nexport function ssrConstruct(node: Proxy, options: SsrOptions): void {\n commonConstruct(\n node,\n ProxyType.ShadowsocksR,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.encryptMethod = options.method;\n node.protocol = options.protocol;\n node.protocolParam = options.protocolParam ?? \"\";\n node.obfs = options.obfs;\n node.obfsParam = options.obfsParam ?? \"\";\n}\n\nexport interface SsOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n method: string;\n plugin?: string;\n pluginOption?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Shadowsocks node. Mirrors `ssConstruct`. */\nexport function ssConstruct(node: Proxy, options: SsOptions): void {\n commonConstruct(\n node,\n ProxyType.Shadowsocks,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.encryptMethod = options.method;\n node.plugin = options.plugin ?? \"\";\n node.pluginOption = options.pluginOption ?? \"\";\n}\n\nexport interface SocksOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n username?: string;\n password?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a SOCKS5 node. Mirrors `socksConstruct`. */\nexport function socksConstruct(node: Proxy, options: SocksOptions): void {\n commonConstruct(\n node,\n ProxyType.SOCKS5,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.username = options.username ?? \"\";\n node.password = options.password ?? \"\";\n}\n\nexport interface HttpOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n username?: string;\n password?: string;\n tls: boolean;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build an HTTP/HTTPS node. Mirrors `httpConstruct`. */\nexport function httpConstruct(node: Proxy, options: HttpOptions): void {\n commonConstruct(\n node,\n options.tls ? ProxyType.HTTPS : ProxyType.HTTP,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.username = options.username ?? \"\";\n node.password = options.password ?? \"\";\n node.tlsSecure = options.tls;\n}\n\nexport interface TrojanOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n network?: string;\n host?: string;\n path?: string;\n tlsSecure?: boolean;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n sni?: string;\n underlyingProxy?: string;\n}\n\n/** Build a Trojan node. Mirrors `trojanConstruct`. */\nexport function trojanConstruct(node: Proxy, options: TrojanOptions): void {\n commonConstruct(\n node,\n ProxyType.Trojan,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.host = options.host ?? \"\";\n node.tlsSecure = options.tlsSecure ?? true;\n node.transferProtocol =\n options.network === undefined || options.network === \"\" ? \"tcp\" : options.network;\n node.path = options.path ?? \"\";\n node.serverName = options.sni ?? \"\";\n}\n\nexport interface SnellOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n obfs?: string;\n host?: string;\n version?: number;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Snell node. Mirrors `snellConstruct`. */\nexport function snellConstruct(node: Proxy, options: SnellOptions): void {\n commonConstruct(\n node,\n ProxyType.Snell,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.obfs = options.obfs ?? \"\";\n node.host = options.host ?? \"\";\n node.snellVersion = options.version ?? 0;\n}\n\nexport interface AnyTlsOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build an AnyTLS node. Mirrors `anyTLSConstruct`. */\nexport function anyTlsConstruct(node: Proxy, options: AnyTlsOptions): void {\n commonConstruct(\n node,\n ProxyType.AnyTLS,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.password = options.password;\n node.sni = options.sni ?? \"\";\n}\n\nexport interface WireGuardOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n selfIp?: string;\n selfIpv6?: string;\n privateKey?: string;\n publicKey?: string;\n preSharedKey?: string;\n dnsServers?: string[];\n mtu?: string | number;\n keepAlive?: string | number;\n testUrl?: string;\n clientId?: string;\n udp?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a WireGuard node. Mirrors `wireguardConstruct`. */\nexport function wireGuardConstruct(node: Proxy, options: WireGuardOptions): void {\n commonConstruct(\n node,\n ProxyType.WireGuard,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n undefined,\n undefined,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.selfIp = options.selfIp ?? \"\";\n node.selfIpv6 = options.selfIpv6 ?? \"\";\n node.privateKey = options.privateKey ?? \"\";\n node.publicKey = options.publicKey ?? \"\";\n node.preSharedKey = options.preSharedKey ?? \"\";\n node.dnsServers = options.dnsServers ?? [];\n node.mtu = toInt(options.mtu);\n node.keepAlive = toInt(options.keepAlive);\n node.testUrl = options.testUrl ?? \"\";\n node.clientId = options.clientId ?? \"\";\n}\n\nexport interface HysteriaOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n ports?: string;\n protocol?: string;\n obfsProtocol?: string;\n up?: string;\n upSpeed?: string;\n down?: string;\n downSpeed?: string;\n auth?: string;\n authStr?: string;\n obfs?: string;\n sni?: string;\n fingerprint?: string;\n ca?: string;\n caStr?: string;\n recvWindowConn?: string | number;\n recvWindow?: string | number;\n disableMtuDiscovery?: string;\n hopInterval?: string | number;\n alpn?: string;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Hysteria (v1) node. Mirrors `hysteriaConstruct`. */\nexport function hysteriaConstruct(node: Proxy, options: HysteriaOptions): void {\n commonConstruct(\n node,\n ProxyType.Hysteria,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.ports = options.ports ?? \"\";\n node.protocol = options.protocol ?? \"\";\n node.obfsParam = options.obfsProtocol ?? \"\";\n\n const up = options.up ?? \"\";\n if (up !== \"\") {\n if (up.length > 4 && up.endsWith(\"bps\")) {\n node.up = up;\n } else if (toInt(up)) {\n node.upSpeed = toInt(up);\n node.up = `${up} Mbps`;\n }\n }\n if (options.upSpeed) {\n node.upSpeed = toInt(options.upSpeed);\n }\n const down = options.down ?? \"\";\n if (down !== \"\") {\n if (down.length > 4 && down.endsWith(\"bps\")) {\n node.down = down;\n } else if (toInt(down)) {\n node.downSpeed = toInt(down);\n node.down = `${down} Mbps`;\n }\n }\n if (options.downSpeed) {\n node.downSpeed = toInt(options.downSpeed);\n }\n\n node.authStr = options.authStr ?? \"\";\n if (options.auth) {\n node.authStr = base64Decode(options.auth);\n }\n node.tlsSecure = true;\n node.obfs = options.obfs ?? \"\";\n node.sni = options.sni ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n node.ca = options.ca ?? \"\";\n node.caStr = options.caStr ?? \"\";\n node.recvWindowConn = toInt(options.recvWindowConn);\n node.recvWindow = toInt(options.recvWindow);\n node.disableMtuDiscovery = options.disableMtuDiscovery\n ? options.disableMtuDiscovery === \"true\"\n : undefined;\n node.hopInterval = toInt(options.hopInterval);\n if (options.alpn) {\n node.alpn = [options.alpn];\n }\n}\n\nexport interface Hysteria2Options {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n ports?: string;\n up?: string;\n down?: string;\n password?: string;\n obfs?: string;\n obfsPassword?: string;\n sni?: string;\n fingerprint?: string;\n alpn?: string;\n ca?: string;\n caStr?: string;\n cwnd?: string | number;\n hopInterval?: string | number;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Hysteria2 node. Mirrors `hysteria2Construct`. */\nexport function hysteria2Construct(node: Proxy, options: Hysteria2Options): void {\n commonConstruct(\n node,\n ProxyType.Hysteria2,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.upSpeed = toInt(options.up);\n node.downSpeed = toInt(options.down);\n node.ports = options.ports ?? \"\";\n node.password = options.password ?? \"\";\n node.obfs = options.obfs ?? \"\";\n node.obfsParam = options.obfsPassword ?? \"\";\n node.sni = options.sni ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n if (options.alpn) {\n node.alpn = [options.alpn];\n }\n node.ca = options.ca ?? \"\";\n node.caStr = options.caStr ?? \"\";\n node.cwnd = toInt(options.cwnd);\n node.hopInterval = toInt(options.hopInterval);\n}\n\nexport interface VlessOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n userId: string;\n flow?: string;\n encryption?: string;\n network?: string;\n tls?: string;\n sni?: string;\n host?: string;\n path?: string;\n fingerprint?: string;\n publicKey?: string;\n shortId?: string;\n alpn?: string[];\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a VLESS node. */\nexport function vlessConstruct(node: Proxy, options: VlessOptions): void {\n commonConstruct(\n node,\n ProxyType.VLESS,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.userId = options.userId;\n node.flow = options.flow ?? \"\";\n node.encryptMethod = options.encryption ?? \"none\";\n node.transferProtocol =\n options.network === undefined || options.network === \"\" ? \"tcp\" : options.network;\n node.tlsSecure = options.tls === \"tls\" || options.tls === \"reality\";\n node.serverName = options.sni ?? \"\";\n node.host = options.host ?? \"\";\n node.path = options.path ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n node.publicKey = options.publicKey ?? \"\";\n node.shortId = options.shortId ?? \"\";\n if (options.alpn) {\n node.alpn = options.alpn;\n }\n}\n\nexport interface TuicOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n userId: string;\n password: string;\n congestionControl?: string;\n alpn?: string[];\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a TUIC node. */\nexport function tuicConstruct(node: Proxy, options: TuicOptions): void {\n commonConstruct(\n node,\n ProxyType.TUIC,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.userId = options.userId;\n node.password = options.password;\n node.congestionControl = options.congestionControl ?? \"\";\n node.serverName = options.sni ?? \"\";\n if (options.alpn) {\n node.alpn = options.alpn;\n }\n}\n","import { isFlattenableSsr } from \"./ciphers\";\nimport {\n httpConstruct,\n snellConstruct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n vmessConstruct,\n} from \"./construct\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS } from \"../types/proxy\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { toInt } from \"../utils/string\";\n\nfunction tri(value: unknown): boolean | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n return String(value).toLowerCase() === \"true\";\n}\n\nfunction str(value: unknown): string {\n return value === undefined || value === null ? \"\" : String(value);\n}\n\n/** Parse a `Netch://<base64 json>` link into `node`. */\nexport function explodeNetch(netch: string, node: Proxy): void {\n let data: any;\n try {\n data = JSON.parse(urlSafeBase64Decode(netch.slice(8)));\n } catch {\n return;\n }\n if (data === null || typeof data !== \"object\") {\n return;\n }\n const type = str(data.Type);\n const group = str(data.Group);\n let remark = str(data.Remark);\n const address = str(data.Hostname);\n const udp = tri(data.EnableUDP);\n const tfo = tri(data.EnableTFO);\n const scv = tri(data.AllowInsecure);\n const port = str(data.Port);\n if (port === \"0\" || port === \"\") {\n return;\n }\n const method = str(data.EncryptMethod);\n const password = str(data.Password);\n if (remark === \"\") {\n remark = `${address}:${port}`;\n }\n\n switch (type) {\n case \"SS\":\n ssConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ss : group,\n method,\n password,\n plugin: str(data.Plugin),\n pluginOption: str(data.PluginOption),\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n break;\n case \"SSR\": {\n const protocol = str(data.Protocol);\n const obfs = str(data.OBFS);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ss : group,\n method,\n password,\n plugin: str(data.Plugin),\n pluginOption: str(data.PluginOption),\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n } else {\n ssrConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ssr : group,\n method,\n obfs,\n obfsParam: str(data.OBFSParam),\n password,\n port,\n protocol,\n protocolParam: str(data.ProtocolParam),\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n }\n break;\n }\n case \"VMess\":\n vmessConstruct(node, {\n add: address,\n aid: str(data.AlterID),\n cipher: method,\n edge: str(data.Edge),\n group: group === \"\" ? DEFAULT_GROUPS.v2ray : group,\n host: str(data.Host),\n id: str(data.UserID),\n net: str(data.TransferProtocol),\n path: str(data.Path),\n port,\n remark,\n scv,\n sni: str(data.ServerName),\n tfo,\n tls: str(data.TLSSecure),\n type: str(data.FakeType),\n udp,\n });\n break;\n case \"Socks5\":\n socksConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.socks : group,\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n username: str(data.Username),\n });\n break;\n case \"HTTP\":\n case \"HTTPS\":\n httpConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.http : group,\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n tls: type === \"HTTPS\",\n });\n break;\n case \"Trojan\":\n trojanConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.trojan : group,\n host: str(data.Host),\n network: str(data.TransferProtocol),\n password,\n path: str(data.Path),\n port,\n remark,\n scv,\n server: address,\n tfo,\n tlsSecure: str(data.TLSSecure) === \"true\",\n udp,\n });\n break;\n case \"Snell\":\n snellConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.snell : group,\n host: str(data.Host),\n obfs: str(data.OBFS),\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n version: toInt(str(data.SnellVersion)),\n });\n break;\n default:\n break;\n }\n}\n","import { parse as parseYaml } from \"yaml\";\n\nimport { isFlattenableSsr } from \"./ciphers\";\nimport {\n anyTlsConstruct,\n httpConstruct,\n hysteria2Construct,\n hysteriaConstruct,\n snellConstruct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n tuicConstruct,\n vlessConstruct,\n vmessConstruct,\n wireGuardConstruct,\n} from \"./construct\";\nimport { explodeNetch } from \"./netch\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS, createProxy } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { base64Encode } from \"../utils/base64\";\nimport { split, toInt, trim } from \"../utils/string\";\n\nfunction asString(value: unknown): string {\n if (value === undefined || value === null) {\n return \"\";\n }\n return String(value);\n}\n\nfunction asBool(value: unknown): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n return asString(value).toLowerCase() === \"true\";\n}\n\nfunction asTri(value: unknown): TriBool {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n return asBool(value);\n}\n\nfunction get(obj: any, key: string | number): unknown {\n return obj !== null && typeof obj === \"object\" ? obj[key] : undefined;\n}\n\n/** Parse a Clash `proxies:` list into normalized nodes. */\nexport function explodeClash(root: any, nodes: Proxy[]): void {\n const section = get(root, \"proxies\") !== undefined ? \"proxies\" : \"Proxy\";\n const list = get(root, section) as any[] | undefined;\n if (!Array.isArray(list)) {\n return;\n }\n let index = nodes.length;\n\n for (const single of list) {\n const proxyType = asString(get(single, \"type\")).toLowerCase();\n const ps = asString(get(single, \"name\"));\n const server = asString(get(single, \"server\"));\n const port = asString(get(single, \"port\"));\n let underlyingProxy = asString(get(single, \"underlying-proxy\"));\n if (underlyingProxy === \"\") {\n underlyingProxy = asString(get(single, \"dialer-proxy\"));\n }\n if (port === \"\" || port === \"0\") {\n continue;\n }\n const udp = asTri(get(single, \"udp\"));\n const tfo = asTri(get(single, \"fast-open\"));\n const scv = asTri(get(single, \"skip-cert-verify\"));\n const node = createProxy();\n let group = \"\";\n\n switch (proxyType) {\n case \"vmess\": {\n group = DEFAULT_GROUPS.v2ray;\n const id = asString(get(single, \"uuid\"));\n const aid = asString(get(single, \"alterId\"));\n const cipher = asString(get(single, \"cipher\"));\n const net = get(single, \"network\") !== undefined ? asString(get(single, \"network\")) : \"tcp\";\n const sni = asString(get(single, \"servername\"));\n let path = \"\";\n let host = \"\";\n let edge = \"\";\n switch (net) {\n case \"http\":\n path = asString(get(get(get(single, \"http-opts\"), \"path\"), 0));\n host = asString(get(get(get(get(single, \"http-opts\"), \"headers\"), \"Host\"), 0));\n edge = \"\";\n break;\n case \"ws\":\n if (get(single, \"ws-opts\") !== undefined) {\n const wsOpts = get(single, \"ws-opts\");\n path = get(wsOpts, \"path\") !== undefined ? asString(get(wsOpts, \"path\")) : \"/\";\n host = asString(get(get(wsOpts, \"headers\"), \"Host\"));\n edge = asString(get(get(wsOpts, \"headers\"), \"Edge\"));\n } else {\n path = get(single, \"ws-path\") !== undefined ? asString(get(single, \"ws-path\")) : \"/\";\n host = asString(get(get(single, \"ws-headers\"), \"Host\"));\n edge = asString(get(get(single, \"ws-headers\"), \"Edge\"));\n }\n break;\n case \"h2\":\n path = asString(get(get(single, \"h2-opts\"), \"path\"));\n host = asString(get(get(get(single, \"h2-opts\"), \"host\"), 0));\n edge = \"\";\n break;\n case \"grpc\":\n host = asString(get(single, \"servername\"));\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n edge = \"\";\n break;\n default:\n break;\n }\n const tls = asBool(get(single, \"tls\")) ? \"tls\" : \"\";\n vmessConstruct(node, {\n add: server,\n aid,\n cipher,\n edge,\n group,\n host,\n id,\n net,\n path,\n port,\n remark: ps,\n scv,\n sni,\n tfo,\n tls,\n type: \"\",\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"ss\": {\n group = DEFAULT_GROUPS.ss;\n let cipher = asString(get(single, \"cipher\"));\n const password = asString(get(single, \"password\"));\n let plugin = \"\";\n let pluginOption = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let pluginMux = \"\";\n let pluginTls = \"\";\n let path = \"\";\n if (get(single, \"plugin\") !== undefined) {\n const pluginName = asString(get(single, \"plugin\")).toLowerCase();\n const pluginOpts = get(single, \"plugin-opts\");\n if (pluginName === \"obfs\") {\n plugin = \"obfs-local\";\n pluginMode = asString(get(pluginOpts, \"mode\"));\n pluginHost = asString(get(pluginOpts, \"host\"));\n } else if (pluginName === \"v2ray-plugin\") {\n plugin = \"v2ray-plugin\";\n pluginMode = asString(get(pluginOpts, \"mode\"));\n pluginHost = asString(get(pluginOpts, \"host\"));\n pluginTls = asBool(get(pluginOpts, \"tls\")) ? \"tls;\" : \"\";\n path = asString(get(pluginOpts, \"path\"));\n pluginMux = asBool(get(pluginOpts, \"mux\")) ? \"mux=4;\" : \"\";\n }\n } else if (get(single, \"obfs\") !== undefined) {\n plugin = \"obfs-local\";\n pluginMode = asString(get(single, \"obfs\"));\n pluginHost = asString(get(single, \"obfs-host\"));\n }\n if (plugin === \"simple-obfs\" || plugin === \"obfs-local\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n } else if (plugin === \"v2ray-plugin\") {\n pluginOption = `mode=${pluginMode};${pluginTls}${pluginMux}`;\n if (pluginHost !== \"\") {\n pluginOption += `host=${pluginHost};`;\n }\n if (path !== \"\") {\n pluginOption += `path=${path};`;\n }\n if (pluginMux !== \"\") {\n pluginOption += `mux=${pluginMux};`;\n }\n }\n if (cipher === \"AEAD_CHACHA20_POLY1305\") {\n cipher = \"chacha20-ietf-poly1305\";\n } else if (cipher.includes(\"AEAD\")) {\n cipher = cipher.replace(/AEAD_/g, \"\").replace(/_/g, \"-\").toLowerCase();\n }\n ssConstruct(node, {\n group,\n method: cipher,\n password,\n plugin,\n pluginOption,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"socks5\": {\n group = DEFAULT_GROUPS.socks;\n const user = asString(get(single, \"username\"));\n const password = asString(get(single, \"password\"));\n socksConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n server,\n underlyingProxy,\n username: user,\n });\n break;\n }\n case \"ssr\": {\n group = DEFAULT_GROUPS.ssr;\n let cipher = asString(get(single, \"cipher\"));\n if (cipher === \"dummy\") {\n cipher = \"none\";\n }\n const password = asString(get(single, \"password\"));\n const protocol = asString(get(single, \"protocol\"));\n const obfs = asString(get(single, \"obfs\"));\n const protocolParam =\n get(single, \"protocol-param\") !== undefined\n ? asString(get(single, \"protocol-param\"))\n : asString(get(single, \"protocolparam\"));\n const obfsParam =\n get(single, \"obfs-param\") !== undefined\n ? asString(get(single, \"obfs-param\"))\n : asString(get(single, \"obfsparam\"));\n ssrConstruct(node, {\n group,\n method: cipher,\n obfs,\n obfsParam,\n password,\n port,\n protocol,\n protocolParam,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"http\": {\n group = DEFAULT_GROUPS.http;\n const user = asString(get(single, \"username\"));\n const password = asString(get(single, \"password\"));\n const tls = asString(get(single, \"tls\"));\n httpConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n tls: tls === \"true\",\n underlyingProxy,\n username: user,\n });\n break;\n }\n case \"trojan\": {\n group = DEFAULT_GROUPS.trojan;\n const password = asString(get(single, \"password\"));\n const host = asString(get(single, \"sni\"));\n let net = asString(get(single, \"network\"));\n let path = \"\";\n switch (net) {\n case \"grpc\":\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n break;\n case \"ws\":\n path = asString(get(get(single, \"ws-opts\"), \"path\"));\n break;\n default:\n net = \"tcp\";\n path = \"\";\n break;\n }\n trojanConstruct(node, {\n group,\n host,\n network: net,\n password,\n path,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n tlsSecure: true,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"snell\": {\n group = DEFAULT_GROUPS.snell;\n const password = asString(get(single, \"psk\"));\n const obfs = asString(get(get(single, \"obfs-opts\"), \"mode\"));\n const host = asString(get(get(single, \"obfs-opts\"), \"host\"));\n const version = asString(get(single, \"version\"));\n snellConstruct(node, {\n group,\n host,\n obfs,\n password,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n version: toInt(version),\n });\n break;\n }\n case \"wireguard\": {\n group = DEFAULT_GROUPS.wireguard;\n const publicKey = asString(get(single, \"public-key\"));\n const privateKey = asString(get(single, \"private-key\"));\n const dns = get(single, \"dns\");\n const dnsServers = Array.isArray(dns)\n ? dns.map((d) => String(d))\n : dns\n ? [String(dns)]\n : [];\n const mtu = asString(get(single, \"mtu\"));\n const psk = asString(get(single, \"preshared-key\"));\n const ip = asString(get(single, \"ip\"));\n const ipv6 = asString(get(single, \"ipv6\"));\n wireGuardConstruct(node, {\n dnsServers,\n group,\n keepAlive: \"0\",\n mtu,\n port,\n preSharedKey: psk,\n privateKey,\n publicKey,\n remark: ps,\n selfIp: ip,\n selfIpv6: ipv6,\n server,\n testUrl: \"\",\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"hysteria\": {\n group = DEFAULT_GROUPS.hysteria;\n const ports = asString(get(single, \"ports\"));\n const protocol = asString(get(single, \"protocol\"));\n const obfsProtocol = asString(get(single, \"obfs-protocol\"));\n const up = asString(get(single, \"up\"));\n const upSpeed = asString(get(single, \"up-speed\"));\n const down = asString(get(single, \"down\"));\n const downSpeed = asString(get(single, \"down-speed\"));\n const auth = asString(get(single, \"auth\"));\n let authStr = asString(get(single, \"auth-str\"));\n if (authStr === \"\") {\n authStr = asString(get(single, \"auth_str\"));\n }\n const obfs = asString(get(single, \"obfs\"));\n const sni = asString(get(single, \"sni\"));\n const fingerprint = asString(get(single, \"fingerprint\"));\n const alpnValue = get(single, \"alpn\");\n const alpn = Array.isArray(alpnValue) ? asString(alpnValue[0]) : asString(alpnValue);\n const ca = asString(get(single, \"ca\"));\n const caStr = asString(get(single, \"ca-str\"));\n const recvWindowConn = asString(get(single, \"recv-window-conn\"));\n const recvWindow = asString(get(single, \"recv-window\"));\n let disableMtuDiscovery = asString(get(single, \"disable-mtu-discovery\"));\n if (disableMtuDiscovery === \"\") {\n disableMtuDiscovery = asString(get(single, \"disable_mtu_discovery\"));\n }\n const hopInterval = asString(get(single, \"hop-interval\"));\n hysteriaConstruct(node, {\n alpn,\n auth,\n authStr,\n ca,\n caStr,\n disableMtuDiscovery,\n down,\n downSpeed,\n fingerprint,\n group,\n hopInterval,\n obfs,\n obfsProtocol,\n port,\n ports,\n protocol,\n recvWindow,\n recvWindowConn,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n underlyingProxy,\n up,\n upSpeed,\n });\n break;\n }\n case \"hysteria2\": {\n group = DEFAULT_GROUPS.hysteria2;\n const ports = asString(get(single, \"ports\"));\n const up = asString(get(single, \"up\"));\n const down = asString(get(single, \"down\"));\n let password = asString(get(single, \"password\"));\n if (password === \"\") {\n password = asString(get(single, \"auth\"));\n }\n const obfs = asString(get(single, \"obfs\"));\n const obfsPassword = asString(get(single, \"obfs-password\"));\n const sni = asString(get(single, \"sni\"));\n const fingerprint = asString(get(single, \"fingerprint\"));\n const alpnValue = get(single, \"alpn\");\n const alpn = Array.isArray(alpnValue) ? asString(alpnValue[0]) : asString(alpnValue);\n const ca = asString(get(single, \"ca\"));\n const caStr = asString(get(single, \"ca-str\"));\n const cwnd = asString(get(single, \"cwnd\"));\n const hopInterval = asString(get(single, \"hop-interval\"));\n hysteria2Construct(node, {\n alpn,\n ca,\n caStr,\n cwnd,\n down,\n fingerprint,\n group,\n hopInterval,\n obfs,\n obfsPassword,\n password,\n port,\n ports,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n underlyingProxy,\n up,\n });\n break;\n }\n case \"anytls\": {\n group = DEFAULT_GROUPS.anytls;\n const password = asString(get(single, \"password\"));\n const sni = asString(get(single, \"sni\"));\n anyTlsConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"vless\": {\n group = DEFAULT_GROUPS.v2ray;\n const userId = asString(get(single, \"uuid\"));\n const net = asString(get(single, \"network\"));\n const tls = asString(get(single, \"tls\"));\n let path = \"\";\n let host = \"\";\n if (net === \"ws\") {\n path = asString(get(get(single, \"ws-opts\"), \"path\"));\n host = asString(get(get(get(single, \"ws-opts\"), \"headers\"), \"Host\"));\n } else if (net === \"grpc\") {\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n }\n const alpnValue = get(single, \"alpn\");\n vlessConstruct(node, {\n alpn: Array.isArray(alpnValue) ? alpnValue.map((a) => String(a)) : undefined,\n encryption: asString(get(single, \"encryption\")),\n fingerprint: asString(get(single, \"client-fingerprint\")),\n flow: asString(get(single, \"flow\")),\n group,\n host,\n network: net,\n path,\n port,\n remark: ps,\n scv,\n server,\n sni: asString(get(single, \"servername\")),\n tfo,\n tls: tls === \"true\" ? \"tls\" : \"\",\n udp,\n underlyingProxy,\n userId,\n });\n break;\n }\n case \"tuic\": {\n group = DEFAULT_GROUPS.v2ray;\n const alpnValue = get(single, \"alpn\");\n tuicConstruct(node, {\n alpn: Array.isArray(alpnValue) ? alpnValue.map((a) => String(a)) : undefined,\n congestionControl: asString(get(single, \"congestion-controller\")),\n group,\n password: asString(get(single, \"password\")),\n port,\n remark: ps,\n scv,\n server,\n sni: asString(get(single, \"sni\")),\n tfo,\n udp,\n underlyingProxy,\n userId: asString(get(single, \"uuid\")),\n });\n break;\n }\n default:\n continue;\n }\n\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Split INI-style text into ordered sections with their raw lines. */\nfunction parseRawSections(text: string): Array<{ name: string; lines: string[] }> {\n const sections: Array<{ name: string; lines: string[] }> = [];\n const isolated: string[] = [];\n let current: { name: string; lines: string[] } | undefined;\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n const header = /^\\[(.*)\\]$/.exec(line);\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line === \"\" || line.startsWith(\"#\") || line.startsWith(\";\")) {\n continue;\n }\n if (current) {\n current.lines.push(line);\n } else {\n isolated.push(line);\n }\n }\n if (isolated.length > 0) {\n sections.unshift({ lines: isolated, name: \"Proxy\" });\n }\n return sections;\n}\n\nfunction getRawSection(sections: Array<{ name: string; lines: string[] }>, name: string): string[] {\n const lines: string[] = [];\n for (const section of sections) {\n if (section.name === name) {\n lines.push(...section.lines);\n }\n }\n return lines;\n}\n\nfunction collectKeyValues(\n lines: string[],\n startIndex: number,\n sink: { [key: string]: string },\n): void {\n for (let i = startIndex; i < lines.length; i += 1) {\n const line = trim(lines[i] as string);\n const eq = line.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n sink[trim(line.slice(0, eq))] = trim(line.slice(eq + 1));\n }\n}\n\n/** Parse a Surge/Loon `[Proxy]` configuration into nodes. */\nexport function explodeSurge(surge: string, nodes: Proxy[]): boolean {\n let text = surge;\n if (text.includes(\"[Proxy]\")) {\n text = text.replace(/^[\\s\\S]*?\\[/, \"[\");\n }\n const sections = parseRawSections(text);\n const proxyLines = getRawSection(sections, \"Proxy\");\n if (proxyLines.length === 0) {\n return false;\n }\n const startCount = nodes.length;\n let index = nodes.length;\n\n for (const line of proxyLines) {\n const match = /^(.*?)\\s*=\\s*(.*)$/.exec(line);\n if (!match) {\n continue;\n }\n const remark = match[1] as string;\n const config = match[2] as string;\n const configs = split(config, \",\");\n if (configs.length < 3) {\n continue;\n }\n const node = createProxy();\n let server = \"\";\n let port = \"\";\n let method = \"\";\n let username = \"\";\n let password = \"\";\n let plugin = \"\";\n let pluginOption = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let id = \"\";\n let net = \"tcp\";\n let tls = \"\";\n let host = \"\";\n let edge = \"\";\n let path = \"\";\n let version = \"\";\n let aead = \"1\";\n let udp: TriBool;\n let tfo: TriBool;\n let scv: TriBool;\n let tls13: TriBool;\n\n switch ((configs[0] as string).toLowerCase()) {\n case \"direct\":\n case \"reject\":\n case \"reject-tinygif\":\n continue;\n case \"custom\": {\n if (configs.length < 5) {\n continue;\n }\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n method = trim(configs[3] as string);\n password = trim(configs[4] as string);\n for (let i = 6; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"obfs\") {\n plugin = \"simple-obfs\";\n pluginMode = itemVal;\n } else if (itemName === \"obfs-host\") {\n pluginHost = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n }\n }\n if (plugin !== \"\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n }\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n });\n break;\n }\n case \"ss\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"encrypt-method\") {\n method = itemVal;\n } else if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"obfs\") {\n plugin = \"simple-obfs\";\n pluginMode = itemVal;\n } else if (itemName === \"obfs-host\") {\n pluginHost = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n }\n }\n if (plugin !== \"\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n }\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n });\n break;\n }\n case \"socks5\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n if (configs.length >= 5) {\n username = trim(configs[3] as string);\n password = trim(configs[4] as string);\n }\n for (let i = 5; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n socksConstruct(node, {\n group: DEFAULT_GROUPS.socks,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n username,\n });\n break;\n }\n case \"vmess\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n net = \"tcp\";\n method = \"auto\";\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n switch (itemName) {\n case \"username\":\n id = itemVal;\n break;\n case \"ws\":\n net = itemVal === \"true\" ? \"ws\" : \"tcp\";\n break;\n case \"tls\":\n tls = itemVal === \"true\" ? \"tls\" : \"\";\n break;\n case \"ws-path\":\n path = itemVal;\n break;\n case \"obfs-host\":\n host = itemVal;\n break;\n case \"ws-headers\": {\n const headers = split(itemVal, \"|\");\n for (const header of headers) {\n const kv = split(trim(header), \":\");\n if (kv.length !== 2) {\n continue;\n }\n if (/host/i.test(kv[0] as string)) {\n host = trimQuote(kv[1] as string);\n } else if (/edge/i.test(kv[0] as string)) {\n edge = trimQuote(kv[1] as string);\n }\n }\n break;\n }\n case \"udp-relay\":\n udp = asTri(itemVal);\n break;\n case \"tfo\":\n tfo = asTri(itemVal);\n break;\n case \"skip-cert-verify\":\n scv = asTri(itemVal);\n break;\n case \"tls13\":\n tls13 = asTri(itemVal);\n break;\n case \"vmess-aead\":\n aead = itemVal === \"true\" ? \"0\" : \"1\";\n break;\n default:\n break;\n }\n }\n vmessConstruct(node, {\n add: server,\n aid: aead,\n cipher: method,\n edge,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n scv,\n tfo,\n tls,\n tls13,\n udp,\n });\n break;\n }\n case \"http\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"username\") {\n username = itemVal;\n } else if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n httpConstruct(node, {\n group: DEFAULT_GROUPS.http,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n tls: false,\n username,\n });\n break;\n }\n case \"trojan\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"sni\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n trojanConstruct(node, {\n group: DEFAULT_GROUPS.trojan,\n host,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n tlsSecure: true,\n udp,\n });\n break;\n }\n case \"snell\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"psk\") {\n password = itemVal;\n } else if (itemName === \"obfs\") {\n plugin = itemVal;\n } else if (itemName === \"obfs-host\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n } else if (itemName === \"version\") {\n version = itemVal;\n }\n }\n snellConstruct(node, {\n group: DEFAULT_GROUPS.snell,\n host,\n obfs: plugin,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n version: toInt(version),\n });\n break;\n }\n case \"wireguard\": {\n let section = \"\";\n let testUrl = \"\";\n for (let i = 1; i < configs.length; i += 1) {\n const vArray = split(trim(configs[i] as string), \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"section-name\") {\n section = itemVal;\n } else if (itemName === \"test-url\") {\n testUrl = itemVal;\n }\n }\n if (section === \"\") {\n continue;\n }\n const wgLines = getRawSection(sections, `WireGuard ${section}`);\n if (wgLines.length === 0) {\n continue;\n }\n const wg: { [key: string]: string } = {};\n collectKeyValues(wgLines, 0, wg);\n const dnsServers: string[] = [];\n if (wg[\"dns-server\"]) {\n for (const dns of split(wg[\"dns-server\"], \",\")) {\n dnsServers.push(trim(dns));\n }\n }\n wireGuardConstruct(node, {\n dnsServers,\n group: DEFAULT_GROUPS.wireguard,\n keepAlive: wg[\"keepalive\"] ?? \"\",\n mtu: wg[\"mtu\"] ?? \"\",\n port: \"0\",\n privateKey: wg[\"private-key\"] ?? \"\",\n remark,\n selfIp: wg[\"self-ip\"] ?? \"\",\n selfIpv6: wg[\"self-ip-v6\"] ?? \"\",\n server: \"\",\n testUrl,\n udp,\n });\n parsePeers(node, wg[\"peer\"] ?? \"\");\n break;\n }\n case \"anytls\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"sni\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark,\n scv,\n server,\n sni: host,\n tfo,\n udp,\n });\n break;\n }\n default: {\n const handled = parseQuanxStyle(remark, configs, node, { scv, tfo, tls13, udp });\n if (!handled) {\n continue;\n }\n break;\n }\n }\n\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n return nodes.length > startCount;\n}\n\ninterface QuanxFlags {\n udp: TriBool;\n tfo: TriBool;\n scv: TriBool;\n tls13: TriBool;\n}\n\nfunction parseQuanxStyle(\n remark: string,\n configs: string[],\n node: Proxy,\n flags: QuanxFlags,\n): boolean {\n const kind = remark.toLowerCase();\n const first = configs[0] as string;\n const lastColon = first.lastIndexOf(\":\");\n const server = trim(first.slice(0, lastColon));\n const port = trim(first.slice(lastColon + 1));\n if (port === \"0\") {\n return false;\n }\n let method = \"\";\n let password = \"\";\n let username = \"\";\n let host = \"\";\n let path = \"\";\n let plugin = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let protocol = \"\";\n let protocolParam = \"\";\n let tls = \"\";\n let net = \"tcp\";\n let id = \"\";\n let aead = \"1\";\n let newRemark = remark;\n const udp = flags.udp;\n const tfo = flags.tfo;\n let scv = flags.scv;\n const tls13 = flags.tls13;\n\n const kv: { [key: string]: string } = {};\n for (let i = 1; i < configs.length; i += 1) {\n const vArray = split(trim(configs[i] as string), \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n kv[trim(vArray[0] as string)] = trim(vArray[1] as string);\n }\n\n if (kind === \"shadowsocks\") {\n method = kv[\"method\"] ?? \"\";\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n protocol = kv[\"ssr-protocol\"] ?? \"\";\n protocolParam = kv[\"ssr-protocol-param\"] ?? \"\";\n if (kv[\"obfs\"]) {\n const obfsVal = kv[\"obfs\"] as string;\n if (obfsVal === \"http\" || obfsVal === \"tls\") {\n plugin = \"simple-obfs\";\n pluginMode = obfsVal;\n } else if (obfsVal === \"wss\" || obfsVal === \"ws\") {\n if (obfsVal === \"wss\") {\n tls = \"tls\";\n }\n pluginMode = \"websocket\";\n plugin = \"v2ray-plugin\";\n } else {\n pluginMode = obfsVal;\n }\n }\n pluginHost = kv[\"obfs-host\"] ?? \"\";\n path = kv[\"obfs-uri\"] ?? \"\";\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n let pluginOption = \"\";\n if (plugin === \"simple-obfs\") {\n pluginOption = `obfs=${pluginMode}`;\n if (pluginHost !== \"\") {\n pluginOption += `;obfs-host=${pluginHost}`;\n }\n } else if (plugin === \"v2ray-plugin\") {\n if (pluginHost === \"\" && !/^\\d+(\\.\\d+){3}$/.test(server) && !server.includes(\":\")) {\n pluginHost = server;\n }\n pluginOption = `mode=${pluginMode}`;\n if (pluginHost !== \"\") {\n pluginOption += `;host=${pluginHost}`;\n }\n if (path !== \"\") {\n pluginOption += `;path=${path}`;\n }\n pluginOption += `;${tls}`;\n }\n if (protocol !== \"\") {\n ssrConstruct(node, {\n group: DEFAULT_GROUPS.ssr,\n method,\n obfs: pluginMode,\n obfsParam: pluginHost,\n password,\n port,\n protocol,\n protocolParam,\n remark: newRemark,\n scv,\n server,\n tfo,\n udp,\n });\n } else {\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls13,\n udp,\n });\n }\n return true;\n }\n\n if (kind === \"vmess\") {\n net = \"tcp\";\n method = kv[\"method\"] ?? \"\";\n id = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"obfs\"]) {\n const obfsVal = kv[\"obfs\"] as string;\n if (obfsVal === \"ws\") {\n net = \"ws\";\n } else if (obfsVal === \"over-tls\") {\n tls = \"tls\";\n } else if (obfsVal === \"wss\") {\n net = \"ws\";\n tls = \"tls\";\n }\n }\n host = kv[\"obfs-host\"] ?? \"\";\n path = kv[\"obfs-uri\"] ?? \"\";\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] === \"true\" ? \"tls\" : \"\";\n }\n if (kv[\"aead\"]) {\n aead = kv[\"aead\"] === \"true\" ? \"0\" : \"1\";\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n vmessConstruct(node, {\n add: server,\n aid: aead,\n cipher: method,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: newRemark,\n scv,\n tfo,\n tls,\n tls13,\n udp,\n });\n return true;\n }\n\n if (kind === \"trojan\") {\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] as string;\n }\n host = kv[\"tls-host\"] ?? \"\";\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n trojanConstruct(node, {\n group: DEFAULT_GROUPS.trojan,\n host,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls13,\n tlsSecure: tls === \"true\",\n udp,\n });\n return true;\n }\n\n if (kind === \"http\") {\n username = kv[\"username\"] ?? \"\";\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] as string;\n }\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n if (username === \"none\") {\n username = \"\";\n }\n if (password === \"none\") {\n password = \"\";\n }\n httpConstruct(node, {\n group: DEFAULT_GROUPS.http,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls: tls === \"true\",\n tls13,\n username,\n });\n return true;\n }\n\n if (kind === \"anytls\") {\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n host = kv[\"sni\"] ?? \"\";\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n sni: host,\n tfo,\n udp,\n });\n return true;\n }\n\n return false;\n}\n\nfunction trimQuote(input: string): string {\n let value = trim(input);\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n return value;\n}\n\n/** Parse a WireGuard `peer = (...)` blob into `node`. */\nexport function parsePeers(node: Proxy, data: string): void {\n const peers = [...data.matchAll(/\\((.*?)\\)/g)].map((m) => m[1] as string);\n if (peers.length === 0) {\n return;\n }\n const peer = peers[0] as string;\n const pairs = [...peer.matchAll(/([a-z-]+)\\s?=\\s?([^\" ),]+|\".*?\"),?\\s?/g)];\n for (const pair of pairs) {\n const key = pair[1] as string;\n const val = pair[2] as string;\n switch (key) {\n case \"public-key\":\n node.publicKey = val;\n break;\n case \"endpoint\": {\n const colon = val.lastIndexOf(\":\");\n node.hostname = val.slice(0, colon);\n node.port = toInt(val.slice(colon + 1));\n break;\n }\n case \"client-id\":\n node.clientId = val;\n break;\n case \"allowed-ips\":\n node.allowedIps = trimQuote(val);\n break;\n default:\n break;\n }\n }\n}\n\n/** Parse a Clash/plain YAML string into nodes (returns count). */\nexport function parseClashText(content: string, nodes: Proxy[]): boolean {\n try {\n const root = parseYaml(content);\n if (\n root &&\n typeof root === \"object\" &&\n (get(root, \"Proxy\") !== undefined || get(root, \"proxies\") !== undefined)\n ) {\n explodeClash(root, nodes);\n return true;\n }\n } catch {\n return false;\n }\n return false;\n}\n\n/** Parse an ss/ssr/v2ray configuration JSON blob (single or list). */\nexport function parseConfContent(content: string, nodes: Proxy[]): boolean {\n if (content.includes('\"version\"')) {\n explodeSsConf(content, nodes);\n } else if (content.includes('\"serverSubscribes\"')) {\n explodeSsrConf(content, nodes);\n } else if (content.includes('\"uiItem\"') || content.includes(\"vnext\")) {\n explodeVmessConf(content, nodes);\n } else if (content.includes('\"proxy_apps\"')) {\n explodeSsAndroid(content, nodes);\n } else if (content.includes('\"idInUse\"')) {\n explodeSstap(content, nodes);\n } else if (content.includes('\"local_address\"') && content.includes('\"local_port\"')) {\n explodeSsrConf(content, nodes);\n } else if (content.includes('\"ModeFileNameType\"')) {\n explodeNetchConf(content, nodes);\n } else {\n return false;\n }\n return nodes.length > 0;\n}\n\n/** Parse a Shadowsocks Android (`ssconf`) JSON config. */\nexport function explodeSsConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n const section = \"version\" in json && \"servers\" in json ? \"servers\" : \"configs\";\n if (!(section in json)) {\n return;\n }\n const group = asString(json.remarks);\n const list: any[] = json[section];\n if (!Array.isArray(list)) {\n return;\n }\n let index = nodes.length;\n for (const entry of list) {\n const remark = asString(entry.remarks);\n const port = asString(entry.server_port);\n if (port === \"0\") {\n continue;\n }\n const server = asString(entry.server);\n const node = createProxy();\n ssConstruct(node, {\n group,\n method: asString(entry.method),\n password: asString(entry.password),\n plugin: asString(entry.plugin),\n pluginOption: asString(entry.plugin_opts),\n port,\n remark: remark === \"\" ? `${server}:${port}` : remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a Shadowsocks Android (`com.github.shadowsocks`) node array. */\nexport function explodeSsAndroid(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(`{\"nodes\":${content}}`);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.nodes)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.nodes) {\n const server = asString(entry.server);\n if (server === \"\") {\n continue;\n }\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks);\n const node = createProxy();\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method: asString(entry.method),\n password: asString(entry.password),\n plugin: asString(entry.plugin),\n pluginOption: asString(entry.plugin_opts),\n port,\n remark: remark === \"\" ? `${server}:${port}` : remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a ShadowsocksR config JSON. */\nexport function explodeSsrConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n let index = nodes.length;\n if (\"local_port\" in json && \"local_address\" in json) {\n const node = createProxy();\n const server = asString(json.server);\n const port = asString(json.server_port);\n const remark = `${server}:${port}`;\n const method = asString(json.method);\n const obfs = asString(json.obfs);\n const protocol = asString(json.protocol);\n const password = asString(json.password);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin: asString(json.plugin),\n pluginOption: asString(json.plugin_opts),\n port,\n remark,\n server,\n });\n } else {\n ssrConstruct(node, {\n group: DEFAULT_GROUPS.ssr,\n method,\n obfs,\n obfsParam: asString(json.obfs_param),\n password,\n port,\n protocol,\n protocolParam: asString(json.protocol_param),\n remark,\n server,\n });\n }\n node.id = index;\n nodes.push(node);\n return;\n }\n\n const list: any[] = json.configs ?? [];\n if (!Array.isArray(list)) {\n return;\n }\n for (const entry of list) {\n const group = asString(entry.group) === \"\" ? DEFAULT_GROUPS.ssr : asString(entry.group);\n const server = asString(entry.server);\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks) === \"\" ? `${server}:${port}` : asString(entry.remarks);\n const node = createProxy();\n ssrConstruct(node, {\n group,\n method: asString(entry.method),\n obfs: asString(entry.obfs),\n obfsParam: asString(entry.obfsparam),\n password: asString(entry.password),\n port,\n protocol: asString(entry.protocol),\n protocolParam: asString(entry.protocolparam),\n remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a v2rayN config JSON. */\nexport function explodeVmessConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n let index = nodes.length;\n\n if (\"outbounds\" in json) {\n const outbounds = json.outbounds;\n if (\n Array.isArray(outbounds) &&\n outbounds.length > 0 &&\n outbounds[0]?.settings?.vnext?.length > 0\n ) {\n const vnext = outbounds[0].settings.vnext[0];\n const add = asString(vnext.address);\n const port = asString(vnext.port);\n if (port === \"0\") {\n return;\n }\n const users = vnext.users;\n const id = Array.isArray(users) && users.length ? asString(users[0].id) : \"\";\n const aid = Array.isArray(users) && users.length ? asString(users[0].alterId) : \"\";\n const cipher = Array.isArray(users) && users.length ? asString(users[0].security) : \"\";\n const stream = outbounds[0].streamSettings ?? {};\n const net = asString(stream.network);\n const tls = asString(stream.security);\n let path = \"\";\n let host = \"\";\n let edge = \"\";\n let type = \"\";\n if (net === \"ws\") {\n const ws = stream.wsSettings ?? {};\n path = asString(ws.path);\n if (ws.headers) {\n host = asString(ws.headers.Host);\n edge = asString(ws.headers.Edge);\n }\n }\n const tcp = stream.tcpSettings;\n if (tcp && tcp.header) {\n type = asString(tcp.header.type);\n if (type === \"http\" && tcp.header.request) {\n if (Array.isArray(tcp.header.request.path) && tcp.header.request.path.length) {\n path = asString(tcp.header.request.path[0]);\n }\n if (tcp.header.request.headers) {\n host = asString(tcp.header.request.headers.Host);\n edge = asString(tcp.header.request.headers.Edge);\n }\n }\n }\n const node = createProxy();\n vmessConstruct(node, {\n add,\n aid,\n cipher,\n edge,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: `${add}:${port}`,\n tls,\n type,\n });\n nodes.push(node);\n }\n return;\n }\n\n const subdata = new Map<string, string>();\n const subItems: any[] = json.subItem ?? [];\n for (const item of subItems) {\n subdata.set(asString(item.id), asString(item.remarks));\n }\n\n const list: any[] = json.vmess ?? [];\n for (const entry of list) {\n if (\n entry.address === null ||\n entry.address === undefined ||\n entry.port === null ||\n entry.id === null\n ) {\n continue;\n }\n let ps = asString(entry.remarks);\n const add = asString(entry.address);\n const port = asString(entry.port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const subid = asString(entry.subid);\n let group = \"\";\n if (subid !== \"\") {\n group = subdata.get(subid) ?? \"\";\n }\n if (ps === \"\") {\n ps = `${add}:${port}`;\n }\n const scv = asTri(entry.allowInsecure);\n const configType = toInt(entry.configType);\n const node = createProxy();\n if (configType === 1) {\n vmessConstruct(node, {\n add,\n aid: asString(entry.alterId),\n cipher: asString(entry.security),\n group: group || DEFAULT_GROUPS.v2ray,\n host: asString(entry.requestHost),\n id: asString(entry.id),\n net: asString(entry.network),\n path: asString(entry.path),\n port,\n remark: ps,\n scv,\n sni: asString(entry.sni),\n tls: asString(entry.streamSecurity),\n type: asString(entry.headerType),\n });\n } else if (configType === 3) {\n ssConstruct(node, {\n group: group || DEFAULT_GROUPS.ss,\n method: asString(entry.security),\n password: asString(entry.id),\n port,\n remark: ps,\n scv,\n server: add,\n });\n } else if (configType === 4) {\n socksConstruct(node, {\n group: group || DEFAULT_GROUPS.socks,\n port,\n remark: ps,\n scv,\n server: add,\n });\n } else {\n continue;\n }\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse an SSTap config JSON. */\nexport function explodeSstap(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.configs)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.configs) {\n const group = asString(entry.group);\n const server = asString(entry.server);\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks) === \"\" ? `${server}:${port}` : asString(entry.remarks);\n const password = asString(entry.password);\n const node = createProxy();\n const configType = toInt(entry.type);\n if (configType === 5) {\n socksConstruct(node, {\n group,\n password,\n port,\n remark,\n server,\n username: asString(entry.username),\n });\n } else if (configType === 6) {\n const protocol = asString(entry.protocol);\n const obfs = asString(entry.obfs);\n const method = asString(entry.method);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, { group, method, password, port, remark, server });\n } else {\n ssrConstruct(node, {\n group,\n method,\n obfs,\n obfsParam: asString(entry.obfsparam),\n password,\n port,\n protocol,\n protocolParam: asString(entry.protocolparam),\n remark,\n server,\n });\n }\n } else {\n continue;\n }\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a Netch config JSON. */\nexport function explodeNetchConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.Server)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.Server) {\n const node = createProxy();\n explodeNetch(`Netch://${base64Encode(JSON.stringify(entry))}`, node);\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n","import { isFlattenableSsr } from \"./ciphers\";\nimport {\n anyTlsConstruct,\n httpConstruct,\n hysteria2Construct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n tuicConstruct,\n vlessConstruct,\n vmessConstruct,\n} from \"./construct\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS, createProxy } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { split, toInt, trim } from \"../utils/string\";\nimport { getUrlArg, urlDecode } from \"../utils/url\";\n\n/** `true` when the link is a plain HTTP(S) subscription URL. */\nexport function isLink(link: string): boolean {\n return link.startsWith(\"http://\") || link.startsWith(\"https://\");\n}\n\nfunction firstMatch(input: string, pattern: string): string[] | null {\n const match = new RegExp(pattern).exec(input);\n return match ? match.slice() : null;\n}\n\n/** Parse `vmess://<base64 json>` or a variant link into `node`. */\nexport function explodeVmess(vmess: string, node: Proxy): void {\n if (/^vmess:\\/\\/[A-Za-z0-9-_]+\\?.*/.test(vmess)) {\n explodeShadowrocket(vmess, node);\n return;\n }\n if (/^vmess:\\/\\/.*?@.*/.test(vmess)) {\n explodeStdVmess(vmess, node);\n return;\n }\n if (/^vmess1:\\/\\/.*?\\?.*/.test(vmess)) {\n explodeKitsunebi(vmess, node);\n return;\n }\n\n const decoded = urlSafeBase64Decode(vmess.replace(/(vmess|vmess1):\\/\\//, \"\"));\n if (/.*?\\s=\\s.*/.test(decoded)) {\n explodeQuan(decoded, node);\n return;\n }\n\n let data: Record<string, unknown>;\n try {\n const parsed: unknown = JSON.parse(decoded);\n if (parsed === null || typeof parsed !== \"object\") {\n return;\n }\n data = parsed as Record<string, unknown>;\n } catch {\n return;\n }\n\n let version = \"1\";\n if (data[\"v\"] !== undefined) {\n version = String(data[\"v\"]);\n }\n const ps = String(data[\"ps\"] ?? \"\");\n let add = String(data[\"add\"] ?? \"\");\n const port = String(data[\"port\"] ?? \"\");\n if (port === \"0\" || port === \"\") {\n return;\n }\n const type = String(data[\"type\"] ?? \"\");\n const id = String(data[\"id\"] ?? \"\");\n const aid = String(data[\"aid\"] ?? \"\");\n const net = String(data[\"net\"] ?? \"\");\n const tls = String(data[\"tls\"] ?? \"\");\n let host = String(data[\"host\"] ?? \"\");\n const sni = String(data[\"sni\"] ?? \"\");\n let path = \"\";\n\n switch (toInt(version)) {\n case 1: {\n if (host !== \"\") {\n const parts = split(host, \";\");\n if (parts.length === 2) {\n host = parts[0] as string;\n path = parts[1] as string;\n }\n }\n break;\n }\n case 2: {\n path = String(data[\"path\"] ?? \"\");\n break;\n }\n default:\n break;\n }\n add = trim(add);\n\n vmessConstruct(node, {\n add,\n aid,\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: ps,\n sni,\n tls,\n type,\n });\n}\n\n/** Parse the `net:uuid-aid@host:port` VMess variant. */\nexport function explodeStdVmess(vmess: string, node: Proxy): void {\n let body = vmess.slice(8);\n let remark = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const matcher =\n /^([a-z]+)(?:\\+([a-z]+))?:([\\da-f]{4}(?:[\\da-f]{4}-){4}[\\da-f]{12})-(\\d+)@(.+):(\\d+)(?:\\/?\\?(.*))?$/;\n const match = matcher.exec(body);\n if (!match) {\n return;\n }\n const net = match[1] as string;\n const tls = match[2] ?? \"\";\n const id = match[3] as string;\n const aid = match[4] as string;\n const add = match[5] as string;\n const port = match[6] as string;\n const addition = match[7] ?? \"\";\n\n let type = \"\";\n let host = \"\";\n let path = \"\";\n switch (net) {\n case \"tcp\":\n case \"kcp\":\n type = getUrlArg(addition, \"type\");\n break;\n case \"http\":\n case \"ws\":\n host = getUrlArg(addition, \"host\");\n path = getUrlArg(addition, \"path\");\n break;\n case \"quic\":\n type = getUrlArg(addition, \"security\");\n host = getUrlArg(addition, \"type\");\n path = getUrlArg(addition, \"key\");\n break;\n default:\n return;\n }\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid,\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type,\n });\n}\n\n/** Parse a Shadowrocket-style VMess link. */\nexport function explodeShadowrocket(rocket: string, node: Proxy): void {\n let body = rocket.slice(8);\n let net = \"tcp\";\n const qpos = body.indexOf(\"?\");\n const addition = qpos >= 0 ? body.slice(qpos + 1) : \"\";\n body = qpos >= 0 ? body.slice(0, qpos) : body;\n\n const match = firstMatch(urlSafeBase64Decode(body), \"(.*?):(.*)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const cipher = match[1] as string;\n const id = match[2] as string;\n const add = match[3] as string;\n const port = match[4] as string;\n if (port === \"0\") {\n return;\n }\n let remark = urlDecode(getUrlArg(addition, \"remarks\"));\n const obfs = getUrlArg(addition, \"obfs\");\n let host = \"\";\n let path = \"\";\n const type = \"\";\n if (obfs !== \"\") {\n if (obfs === \"websocket\") {\n net = \"ws\";\n host = getUrlArg(addition, \"obfsParam\");\n path = getUrlArg(addition, \"path\");\n }\n } else {\n net = getUrlArg(addition, \"network\");\n host = getUrlArg(addition, \"wsHost\");\n path = getUrlArg(addition, \"wspath\");\n }\n const tls = getUrlArg(addition, \"tls\") === \"1\" ? \"tls\" : \"\";\n let aid = getUrlArg(addition, \"aid\");\n if (aid === \"\") {\n aid = \"0\";\n }\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid,\n cipher,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type,\n });\n}\n\n/** Parse a Kitsunebi-style `vmess1://` link. */\nexport function explodeKitsunebi(kit: string, node: Proxy): void {\n let body = kit.slice(9);\n let remark = \"\";\n let path = \"\";\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = body.slice(hashPos + 1);\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n const addition = qpos >= 0 ? body.slice(qpos + 1) : \"\";\n body = qpos >= 0 ? body.slice(0, qpos) : body;\n\n const match = firstMatch(body, \"(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const id = match[1] as string;\n const add = match[2] as string;\n let port = match[3] as string;\n const slash = port.indexOf(\"/\");\n if (slash !== -1) {\n path = port.slice(slash);\n port = port.slice(0, slash);\n }\n if (port === \"0\") {\n return;\n }\n const net = getUrlArg(addition, \"network\");\n const tls = getUrlArg(addition, \"tls\") === \"true\" ? \"tls\" : \"\";\n const host = getUrlArg(addition, \"ws.host\");\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid: \"0\",\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type: \"\",\n });\n}\n\n/** Parse a Quantumult `remarks = vmess, ...` definition. */\nexport function explodeQuan(quan: string, node: Proxy): void {\n const normalized = quan.replace(/(.*?)\\s=\\s(.*)/, \"$1,$2\");\n const configs = split(normalized, \",\");\n if (configs.length < 6 || configs[1] !== \"vmess\") {\n return;\n }\n const remark = trim(configs[0] as string);\n const add = trim(configs[2] as string);\n const port = trim(configs[3] as string);\n if (port === \"0\") {\n return;\n }\n const cipher = trim(configs[4] as string);\n const id = trim((configs[5] as string).replace(/\"/g, \"\"));\n\n let group: string = DEFAULT_GROUPS.v2ray;\n let tls = \"\";\n let host = \"\";\n let path = \"\";\n let net = \"tcp\";\n let edge = \"\";\n\n for (let i = 6; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray.slice(1).join(\"=\"));\n switch (itemName) {\n case \"group\":\n group = itemVal;\n break;\n case \"over-tls\":\n tls = itemVal === \"true\" ? \"tls\" : \"\";\n break;\n case \"tls-host\":\n host = itemVal;\n break;\n case \"obfs-path\":\n path = itemVal.replace(/\"/g, \"\");\n break;\n case \"obfs-header\": {\n const headers = split(itemVal.replace(/\"/g, \"\").replace(/\\[Rr\\]\\[Nn\\]/g, \"|\"), \"|\");\n for (const header of headers) {\n if (/Host: /i.test(header)) {\n host = header.slice(6);\n } else if (/Edge: /i.test(header)) {\n edge = header.slice(6);\n }\n }\n break;\n }\n case \"obfs\":\n if (itemVal === \"ws\") {\n net = \"ws\";\n }\n break;\n default:\n break;\n }\n }\n if (path === \"\") {\n path = \"/\";\n }\n vmessConstruct(node, {\n add,\n aid: \"0\",\n cipher,\n edge,\n group,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type: \"none\",\n });\n}\n\n/** Parse a `ss://` link into `node`. */\nexport function explodeSs(ss: string, node: Proxy): void {\n let body = ss.slice(5).replace(/\\/\\?/g, \"?\");\n const group: string = DEFAULT_GROUPS.ss;\n let remark = \"\";\n let addition = \"\";\n let plugin = \"\";\n let pluginOption = \"\";\n let resolvedGroup: string = group;\n\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n const plugins = urlDecode(getUrlArg(addition, \"plugin\"));\n const pluginPos = plugins.indexOf(\";\");\n plugin = pluginPos === -1 ? plugins : plugins.slice(0, pluginPos);\n pluginOption = pluginPos === -1 ? \"\" : plugins.slice(pluginPos + 1);\n const rawGroup = getUrlArg(addition, \"group\");\n if (rawGroup !== \"\") {\n resolvedGroup = urlSafeBase64Decode(rawGroup);\n }\n body = body.slice(0, qpos);\n }\n\n let method = \"\";\n let password = \"\";\n let server = \"\";\n let port = \"\";\n\n if (body.includes(\"@\")) {\n const match = firstMatch(body, \"(\\\\S+?)@(\\\\S+):(\\\\d+)\");\n if (!match) {\n return;\n }\n const secret = match[1] as string;\n server = match[2] as string;\n port = match[3] as string;\n const secretMatch = firstMatch(urlSafeBase64Decode(secret), \"(\\\\S+?):(\\\\S+)\");\n if (!secretMatch) {\n return;\n }\n method = secretMatch[1] as string;\n password = secretMatch[2] as string;\n } else {\n const match = firstMatch(urlSafeBase64Decode(body), \"(\\\\S+?):(\\\\S+)@(\\\\S+):(\\\\d+)\");\n if (!match) {\n return;\n }\n method = match[1] as string;\n password = match[2] as string;\n server = match[3] as string;\n port = match[4] as string;\n }\n\n if (port === \"0\") {\n return;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n ssConstruct(node, {\n group: resolvedGroup,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n server,\n });\n}\n\n/** Parse a `ssr://` link into `node`. */\nexport function explodeSsr(ssr: string, node: Proxy): void {\n let body = ssr.slice(6).replace(/\\r/g, \"\");\n body = urlSafeBase64Decode(body);\n\n let group = \"\";\n let remark = \"\";\n let obfsParam = \"\";\n let protocolParam = \"\";\n\n const obfsPos = body.indexOf(\"/?\");\n if (obfsPos !== -1) {\n const strobfs = body.slice(obfsPos + 2);\n body = body.slice(0, obfsPos);\n group = urlSafeBase64Decode(getUrlArg(strobfs, \"group\"));\n remark = urlSafeBase64Decode(getUrlArg(strobfs, \"remarks\"));\n obfsParam = urlSafeBase64Decode(getUrlArg(strobfs, \"obfsparam\")).replace(/\\s/g, \"\");\n protocolParam = urlSafeBase64Decode(getUrlArg(strobfs, \"protoparam\")).replace(/\\s/g, \"\");\n }\n\n const match = firstMatch(body, \"(\\\\S+):(\\\\d+?):(\\\\S+?):(\\\\S+?):(\\\\S+?):(\\\\S+)\");\n if (!match) {\n return;\n }\n const server = match[1] as string;\n const port = match[2] as string;\n const protocol = match[3] as string;\n const method = match[4] as string;\n const obfs = match[5] as string;\n const password = urlSafeBase64Decode(match[6] as string);\n if (port === \"0\") {\n return;\n }\n\n const resolvedGroup = group === \"\" ? DEFAULT_GROUPS.ssr : group;\n const resolvedRemark = remark === \"\" ? `${server}:${port}` : remark;\n\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: resolvedGroup,\n method,\n password,\n port,\n remark: resolvedRemark,\n server,\n });\n } else {\n ssrConstruct(node, {\n group: resolvedGroup,\n method,\n obfs,\n obfsParam,\n password,\n port,\n protocol,\n protocolParam,\n remark: resolvedRemark,\n server,\n });\n }\n}\n\n/** Parse an `ssd://` (ShadowsocksD) subscription. */\nexport function explodeSsd(link: string, nodes: Proxy[]): void {\n let index = nodes.length;\n const decoded = urlSafeBase64Decode(link.slice(6));\n let data: any;\n try {\n data = JSON.parse(decoded);\n } catch {\n return;\n }\n if (data === null || typeof data !== \"object\" || !(\"servers\" in data)) {\n return;\n }\n const group = String(data.airport ?? \"\");\n const servers = data.servers;\n\n let entries: any[];\n if (Array.isArray(servers)) {\n entries = servers;\n } else if (servers !== null && typeof servers === \"object\") {\n entries = Object.keys(servers).map((key) => servers[key]);\n } else {\n return;\n }\n\n for (const entry of entries) {\n if (entry === null || typeof entry !== \"object\") {\n continue;\n }\n const server = String(entry.server ?? \"\");\n const port = String(entry.port ?? data.port ?? \"\");\n if (server === \"\" || port === \"\" || port === \"0\") {\n continue;\n }\n const remark = String(entry.remarks ?? \"\");\n const method = String(entry.encryption ?? data.encryption ?? \"\");\n const password = String(entry.password ?? data.password ?? \"\");\n const plugin = String(entry.plugin ?? data.plugin ?? \"\");\n const pluginOption = String(entry.plugin_options ?? data.plugin_options ?? \"\");\n const node = createProxy();\n ssConstruct(node, {\n group,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse `socks://`, `tg://socks`, or `https://t.me/socks` links. */\nexport function explodeSocks(link: string, node: Proxy): void {\n let group = \"\";\n let remark = \"\";\n let server = \"\";\n let port = \"\";\n let username = \"\";\n let password = \"\";\n\n if (link.includes(\"socks://\")) {\n let body = link;\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n body = urlSafeBase64Decode(body.slice(8));\n if (body.includes(\"@\")) {\n const userinfo = split(body, \"@\");\n if (userinfo.length < 2) {\n return;\n }\n body = userinfo[1] as string;\n const creds = split(userinfo[0] as string, \":\");\n if (creds.length < 2) {\n return;\n }\n username = creds[0] as string;\n password = creds[1] as string;\n }\n const args = split(body, \":\");\n if (args.length < 2) {\n return;\n }\n server = args[0] as string;\n port = args[1] as string;\n } else if (link.includes(\"https://t.me/socks\") || link.includes(\"tg://socks\")) {\n server = getUrlArg(link, \"server\");\n port = getUrlArg(link, \"port\");\n username = urlDecode(getUrlArg(link, \"user\"));\n password = urlDecode(getUrlArg(link, \"pass\"));\n remark = urlDecode(getUrlArg(link, \"remarks\"));\n group = urlDecode(getUrlArg(link, \"group\"));\n }\n\n if (group === \"\") {\n group = DEFAULT_GROUPS.socks;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n if (port === \"0\" || port === \"\") {\n return;\n }\n socksConstruct(node, { group, password, port, remark, server, username });\n}\n\n/** Parse a telegram-style HTTP proxy link. */\nexport function explodeHttp(link: string, node: Proxy): void {\n const server = getUrlArg(link, \"server\");\n const port = getUrlArg(link, \"port\");\n const username = urlDecode(getUrlArg(link, \"user\"));\n const password = urlDecode(getUrlArg(link, \"pass\"));\n let remark = urlDecode(getUrlArg(link, \"remarks\"));\n let group = urlDecode(getUrlArg(link, \"group\"));\n if (group === \"\") {\n group = DEFAULT_GROUPS.http;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n if (port === \"0\" || port === \"\") {\n return;\n }\n httpConstruct(node, {\n group,\n password,\n port,\n remark,\n server,\n tls: link.includes(\"/https\"),\n username,\n });\n}\n\n/** Parse an HTTP(S) link with base64-encoded credentials. */\nexport function explodeHttpSub(link: string, node: Proxy): void {\n let body = link;\n let remarks = \"\";\n let group = \"\";\n const tls = body.includes(\"https://\");\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n const addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n remarks = urlDecode(getUrlArg(addition, \"remarks\"));\n group = urlDecode(getUrlArg(addition, \"group\"));\n }\n body = body.slice(body.indexOf(\"://\") + 3);\n body = urlSafeBase64Decode(body);\n\n let server = \"\";\n let port = \"\";\n let username = \"\";\n let password = \"\";\n if (body.includes(\"@\")) {\n const match = firstMatch(body, \"(.*?):(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n username = match[1] as string;\n password = match[2] as string;\n server = match[3] as string;\n port = match[4] as string;\n } else {\n const match = firstMatch(body, \"(.*):(.*)\");\n if (!match) {\n return;\n }\n server = match[1] as string;\n port = match[2] as string;\n }\n if (group === \"\") {\n group = DEFAULT_GROUPS.http;\n }\n if (remarks === \"\") {\n remarks = `${server}:${port}`;\n }\n if (port === \"0\") {\n return;\n }\n httpConstruct(node, {\n group,\n password,\n port,\n remark: remarks,\n server,\n tls,\n username,\n });\n}\n\n/** Parse a `trojan://` link. */\nexport function explodeTrojan(trojan: string, node: Proxy): void {\n let body = trojan.slice(9);\n let remark = \"\";\n let addition = \"\";\n let host = \"\";\n let path = \"\";\n let network = \"\";\n\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n\n const match = firstMatch(body, \"(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const password = match[1] as string;\n const server = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n\n host = getUrlArg(addition, \"sni\");\n if (host === \"\") {\n host = getUrlArg(addition, \"peer\");\n }\n const tfo = getUrlArg(addition, \"tfo\");\n const group = urlDecode(getUrlArg(addition, \"group\"));\n\n if (getUrlArg(addition, \"ws\") === \"1\") {\n path = getUrlArg(addition, \"wspath\");\n network = \"ws\";\n } else if (getUrlArg(addition, \"type\") === \"ws\") {\n path = getUrlArg(addition, \"path\");\n if (path.startsWith(\"%2F\")) {\n path = urlDecode(path);\n }\n network = \"ws\";\n }\n\n const type = getUrlArg(addition, \"type\");\n const sni = getUrlArg(addition, \"sni\");\n const insecure = getUrlArg(addition, \"allowInsecure\");\n\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n trojanConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.trojan : group,\n host,\n network,\n password,\n path,\n port,\n remark,\n scv: insecure === \"\" ? undefined : parseTri(insecure),\n server,\n sni,\n tfo: tfo === \"\" ? undefined : parseTri(tfo),\n tlsSecure: type !== \"\" || true,\n });\n}\n\nfunction parseTri(value: string): TriBool {\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n return undefined;\n}\n\n/** Parse a `hysteria2://` / `hy2://` link. */\nexport function explodeHysteria2(link: string, node: Proxy): void {\n const body = link.replace(/(hysteria2|hy2):\\/\\//, \"hysteria2://\").replace(/\\/\\?/g, \"?\");\n if (/hysteria2:\\/\\/.*?[:].*/.test(body)) {\n explodeStdHysteria2(body, node);\n }\n}\n\nfunction explodeStdHysteria2(link: string, node: Proxy): void {\n let body = link.slice(12);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.lastIndexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n\n let password = \"\";\n let add = \"\";\n let port = \"\";\n if (body.includes(\"@\")) {\n const match = /^(.*?)@(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n password = match[1] as string;\n add = match[2] as string;\n port = match[3] as string;\n } else {\n password = getUrlArg(addition, \"password\");\n if (password === \"\") {\n return;\n }\n if (!body.includes(\":\")) {\n return;\n }\n const match = /^(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n add = match[1] as string;\n port = match[2] as string;\n }\n\n const scv = getUrlArg(addition, \"insecure\");\n const up = getUrlArg(addition, \"up\");\n const down = getUrlArg(addition, \"down\");\n const alpn = getUrlArg(addition, \"alpn\");\n const obfs = getUrlArg(addition, \"obfs\");\n const obfsPassword = getUrlArg(addition, \"obfs-password\");\n const sni = getUrlArg(addition, \"sni\");\n const fingerprint = getUrlArg(addition, \"pinSHA256\");\n const mport = getUrlArg(addition, \"mport\");\n const portsArg = getUrlArg(addition, \"ports\");\n const ports = portsArg !== \"\" ? portsArg : mport !== \"\" ? mport : port;\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n hysteria2Construct(node, {\n alpn,\n down,\n fingerprint,\n group: DEFAULT_GROUPS.hysteria2,\n obfs,\n obfsPassword,\n password,\n port,\n ports,\n remark,\n scv: scv === \"\" ? undefined : parseTri(scv),\n server: add,\n sni,\n up,\n });\n}\n\n/** Parse an `anytls://` link. */\nexport function explodeAnyTls(link: string, node: Proxy): void {\n let body = link.slice(9);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.lastIndexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?)@(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const password = match[1] as string;\n const add = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n const sni = getUrlArg(addition, \"sni\");\n const udp = getUrlArg(addition, \"udp\");\n const scv = getUrlArg(addition, \"insecure\");\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark,\n scv: scv === \"\" ? undefined : parseTri(scv),\n server: add,\n sni,\n udp: udp === \"\" ? undefined : parseTri(udp),\n });\n}\n\n/** Parse a `vless://` link. */\nexport function explodeVless(link: string, node: Proxy): void {\n let body = link.slice(8);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?)@\\[?(.*?)\\]?:(\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const userId = match[1] as string;\n const server = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n const network = getUrlArg(addition, \"type\");\n const security = getUrlArg(addition, \"security\");\n const host = getUrlArg(addition, \"host\");\n const rawPath = urlDecode(getUrlArg(addition, \"path\"));\n const serviceName = urlDecode(getUrlArg(addition, \"serviceName\"));\n const path = rawPath !== \"\" ? rawPath : serviceName;\n const sni = getUrlArg(addition, \"sni\");\n const flow = getUrlArg(addition, \"flow\");\n const fingerprint = getUrlArg(addition, \"fp\");\n const publicKey = getUrlArg(addition, \"pbk\");\n const shortId = getUrlArg(addition, \"sid\");\n const alpn = getUrlArg(addition, \"alpn\");\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n vlessConstruct(node, {\n alpn: alpn === \"\" ? undefined : alpn.split(\",\"),\n fingerprint,\n flow,\n group: DEFAULT_GROUPS.v2ray,\n host,\n network,\n path,\n port,\n publicKey,\n remark,\n scv:\n getUrlArg(addition, \"allowInsecure\") === \"\"\n ? undefined\n : parseTri(getUrlArg(addition, \"allowInsecure\")),\n server,\n shortId,\n sni,\n tls: security,\n userId,\n });\n}\n\n/** Parse a `tuic://` link. */\nexport function explodeTuic(link: string, node: Proxy): void {\n let body = link.slice(7);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?):(.*?)@\\[?(.*?)\\]?:(\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const userId = match[1] as string;\n const password = match[2] as string;\n const server = match[3] as string;\n const port = match[4] as string;\n if (port === \"0\") {\n return;\n }\n const congestionControl =\n getUrlArg(addition, \"congestion_control\") || getUrlArg(addition, \"congestion-controller\");\n const alpn = getUrlArg(addition, \"alpn\");\n const sni = getUrlArg(addition, \"sni\");\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n tuicConstruct(node, {\n alpn: alpn === \"\" ? undefined : alpn.split(\",\"),\n congestionControl,\n group: DEFAULT_GROUPS.v2ray,\n password,\n port,\n remark,\n scv:\n getUrlArg(addition, \"allow_insecure\") === \"\"\n ? undefined\n : parseTri(getUrlArg(addition, \"allow_insecure\")),\n server,\n sni,\n userId,\n });\n}\n","import { explodeSurge, parseClashText, parseConfContent } from \"./conf\";\nimport { explodeNetch } from \"./netch\";\nimport {\n explodeAnyTls,\n explodeHttp,\n explodeHttpSub,\n explodeHysteria2,\n explodeSs,\n explodeSsr,\n explodeSocks,\n explodeSsd,\n explodeTrojan,\n explodeTuic,\n explodeVless,\n explodeVmess,\n isLink,\n} from \"./uri\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, createProxy } from \"../types/proxy\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { countOccurrences, startsWith } from \"../utils/string\";\n\n/** Parse a single proxy link into `node`. */\nexport function explode(link: string, node: Proxy): void {\n if (startsWith(link, \"ssr://\")) {\n explodeSsr(link, node);\n } else if (startsWith(link, \"vmess://\") || startsWith(link, \"vmess1://\")) {\n explodeVmess(link, node);\n } else if (startsWith(link, \"ss://\")) {\n explodeSs(link, node);\n } else if (\n startsWith(link, \"socks://\") ||\n startsWith(link, \"https://t.me/socks\") ||\n startsWith(link, \"tg://socks\")\n ) {\n explodeSocks(link, node);\n } else if (startsWith(link, \"https://t.me/http\") || startsWith(link, \"tg://http\")) {\n explodeHttp(link, node);\n } else if (startsWith(link, \"Netch://\")) {\n explodeNetch(link, node);\n } else if (startsWith(link, \"trojan://\")) {\n explodeTrojan(link, node);\n } else if (startsWith(link, \"vless://\")) {\n explodeVless(link, node);\n } else if (startsWith(link, \"tuic://\")) {\n explodeTuic(link, node);\n } else if (link.includes(\"hysteria2://\") || link.includes(\"hy2://\")) {\n explodeHysteria2(link, node);\n } else if (startsWith(link, \"anytls://\")) {\n explodeAnyTls(link, node);\n } else if (isLink(link)) {\n explodeHttpSub(link, node);\n }\n}\n\n/** Parse a link string, returning a node when recognized. */\nexport function parseLink(link: string): Proxy | undefined {\n const node = createProxy();\n explode(link, node);\n return node.type === ProxyType.Unknown ? undefined : node;\n}\n\n/**\n * Parse a subscription body: SSD, Clash YAML, Surge INI, or a newline/space\n * delimited base64 list of links. Mirrors `explodeSub`.\n */\nexport function explodeSub(sub: string, nodes: Proxy[]): void {\n let processed = false;\n\n if (startsWith(sub, \"ssd://\")) {\n explodeSsd(sub, nodes);\n processed = true;\n }\n\n if (!processed && /\"?(Proxy|proxies)\"?:/.test(sub)) {\n if (parseClashText(sub, nodes)) {\n processed = true;\n }\n }\n\n if (!processed && explodeSurge(sub, nodes)) {\n processed = true;\n }\n\n if (processed) {\n return;\n }\n\n const body = urlSafeBase64Decode(sub);\n if (/(vmess|shadowsocks|http|trojan)\\s*?=/.test(body)) {\n if (explodeSurge(body, nodes)) {\n return;\n }\n }\n const before = nodes.length;\n splitLinks(body, nodes);\n if (nodes.length === before && body !== sub) {\n // Not a base64 body after all (e.g. a plain-text provider list).\n splitLinks(sub, nodes);\n }\n}\n\nfunction splitLinks(body: string, nodes: Proxy[]): void {\n const normalized = body.replace(/\\r\\n/g, \"\\n\");\n const delimiter =\n countOccurrences(normalized, \"\\n\") < 1\n ? countOccurrences(normalized, \"\\r\") < 1\n ? \" \"\n : \"\\r\"\n : \"\\n\";\n for (const rawLink of normalized.split(delimiter)) {\n const link = rawLink.replace(/\\r/g, \"\");\n if (link === \"\") {\n continue;\n }\n const node = createProxy();\n explode(link, node);\n if (node.type === ProxyType.Unknown) {\n continue;\n }\n nodes.push(node);\n }\n}\n\n/** Parse a config blob (Clash/SS/SSR/V2Ray/SSTap/Netch) or a subscription. */\nexport function parseSubscription(content: string): Proxy[] {\n const nodes: Proxy[] = [];\n if (parseConfContent(content, nodes)) {\n return nodes;\n }\n explodeSub(content, nodes);\n return nodes;\n}\n","import { stringify as yamlStringify } from \"yaml\";\n\nimport { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode } from \"../utils/base64\";\nimport { getUrlArg, urlDecode } from \"../utils/url\";\n\nconst CLASHR_PROTOCOLS = [\n \"origin\",\n \"auth_sha1_v4\",\n \"auth_aes128_md5\",\n \"auth_aes128_sha1\",\n \"auth_chain_a\",\n \"auth_chain_b\",\n];\nconst CLASHR_OBFS = [\n \"plain\",\n \"http_simple\",\n \"http_post\",\n \"random_head\",\n \"tls1.2_ticket_auth\",\n \"tls1.2_ticket_fastauth\",\n];\nconst CLASH_SSR_CIPHERS = [\n \"rc4-md5\",\n \"aes-128-ctr\",\n \"aes-192-ctr\",\n \"aes-256-ctr\",\n \"aes-128-cfb\",\n \"aes-192-cfb\",\n \"aes-256-cfb\",\n \"chacha20-ietf\",\n \"xchacha20\",\n \"none\",\n];\n\ntype ClashProxy = Record<string, unknown>;\n\nfunction stripBrackets(value: string): string {\n return value.replace(/^\\[+/, \"\").replace(/\\]+$/, \"\");\n}\n\nfunction toTri(value: boolean | undefined): boolean | undefined {\n return value;\n}\n\nfunction buildClashProxy(\n x: Proxy,\n settings: ExtraSettings,\n clashR: boolean,\n remark: string,\n skipCertVerify: boolean | undefined,\n tfo: boolean | undefined,\n): ClashProxy | undefined {\n const proxy: ClashProxy = {\n name: remark,\n port: x.port,\n server: stripBrackets(x.hostname),\n };\n\n switch (x.type) {\n case ProxyType.Shadowsocks: {\n if (settings.filterDeprecated && x.encryptMethod === \"chacha20\") {\n return undefined;\n }\n proxy.type = \"ss\";\n proxy.cipher = x.encryptMethod;\n proxy.password = x.password;\n const pluginOpts = x.pluginOption.replace(/;/g, \"&\");\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n proxy.plugin = \"obfs\";\n proxy[\"plugin-opts\"] = {\n host: urlDecode(getUrlArg(pluginOpts, \"obfs-host\")),\n mode: urlDecode(getUrlArg(pluginOpts, \"obfs\")),\n };\n } else if (x.plugin === \"v2ray-plugin\") {\n proxy.plugin = \"v2ray-plugin\";\n const opts: Record<string, unknown> = {\n host: getUrlArg(pluginOpts, \"host\"),\n mode: getUrlArg(pluginOpts, \"mode\"),\n mux: pluginOpts.includes(\"mux\"),\n path: getUrlArg(pluginOpts, \"path\"),\n tls: pluginOpts.includes(\"tls\"),\n };\n if (skipCertVerify !== undefined) {\n opts[\"skip-cert-verify\"] = skipCertVerify;\n }\n proxy[\"plugin-opts\"] = opts;\n }\n break;\n }\n case ProxyType.VMess: {\n proxy.type = \"vmess\";\n proxy.uuid = x.userId;\n proxy.alterId = x.alterId;\n proxy.cipher = x.encryptMethod;\n proxy.tls = x.tlsSecure;\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.serverName !== \"\") {\n proxy.servername = x.serverName;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n if (settings.clashNewFieldName) {\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" || x.edge !== \"\"\n ? {\n headers: {\n ...(x.edge !== \"\" ? { Edge: x.edge } : {}),\n ...(x.host !== \"\" ? { Host: x.host } : {}),\n },\n }\n : {}),\n path: x.path,\n };\n } else {\n proxy[\"ws-path\"] = x.path;\n if (x.host !== \"\" || x.edge !== \"\") {\n proxy[\"ws-headers\"] = {\n ...(x.edge !== \"\" ? { Edge: x.edge } : {}),\n ...(x.host !== \"\" ? { Host: x.host } : {}),\n };\n }\n }\n break;\n case \"http\":\n proxy.network = x.transferProtocol;\n proxy[\"http-opts\"] = {\n ...(x.host !== \"\" || x.edge !== \"\"\n ? {\n headers: {\n ...(x.edge !== \"\" ? { Edge: [x.edge] } : {}),\n ...(x.host !== \"\" ? { Host: [x.host] } : {}),\n },\n }\n : {}),\n method: \"GET\",\n path: [x.path],\n };\n break;\n case \"h2\":\n proxy.network = x.transferProtocol;\n proxy[\"h2-opts\"] = {\n ...(x.host !== \"\" ? { host: [x.host] } : {}),\n path: x.path,\n };\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n proxy.servername = x.host;\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n break;\n default:\n return undefined;\n }\n break;\n }\n case ProxyType.ShadowsocksR: {\n if (settings.filterDeprecated) {\n if (!clashR && !CLASH_SSR_CIPHERS.includes(x.encryptMethod)) {\n return undefined;\n }\n if (!CLASHR_PROTOCOLS.includes(x.protocol)) {\n return undefined;\n }\n if (!CLASHR_OBFS.includes(x.obfs)) {\n return undefined;\n }\n }\n proxy.type = \"ssr\";\n proxy.cipher = x.encryptMethod === \"none\" ? \"dummy\" : x.encryptMethod;\n proxy.password = x.password;\n proxy.protocol = x.protocol;\n proxy.obfs = x.obfs;\n if (clashR) {\n proxy.protocolparam = x.protocolParam;\n proxy.obfsparam = x.obfsParam;\n } else {\n proxy[\"protocol-param\"] = x.protocolParam;\n proxy[\"obfs-param\"] = x.obfsParam;\n }\n break;\n }\n case ProxyType.SOCKS5:\n proxy.type = \"socks5\";\n if (x.username !== \"\") {\n proxy.username = x.username;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxy.type = \"http\";\n if (x.username !== \"\") {\n proxy.username = x.username;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n proxy.tls = x.tlsSecure;\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.Trojan:\n proxy.type = \"trojan\";\n proxy.password = x.password;\n if (x.host !== \"\") {\n proxy.sni = x.host;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n if (x.path !== \"\") {\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n }\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" ? { headers: { Host: x.host } } : {}),\n path: x.path,\n };\n break;\n default:\n break;\n }\n break;\n case ProxyType.Snell:\n if (x.snellVersion >= 4) {\n return undefined;\n }\n proxy.type = \"snell\";\n proxy.psk = x.password;\n if (x.snellVersion !== 0) {\n proxy.version = x.snellVersion;\n }\n if (x.obfs !== \"\") {\n proxy[\"obfs-opts\"] = {\n ...(x.host !== \"\" ? { host: x.host } : {}),\n mode: x.obfs,\n };\n }\n break;\n case ProxyType.WireGuard:\n proxy.type = \"wireguard\";\n proxy[\"public-key\"] = x.publicKey;\n proxy[\"private-key\"] = x.privateKey;\n proxy.ip = x.selfIp;\n if (x.selfIpv6 !== \"\") {\n proxy.ipv6 = x.selfIpv6;\n }\n if (x.preSharedKey !== \"\") {\n proxy[\"preshared-key\"] = x.preSharedKey;\n }\n if (x.dnsServers.length > 0) {\n proxy.dns = x.dnsServers;\n }\n if (x.mtu > 0) {\n proxy.mtu = x.mtu;\n }\n break;\n case ProxyType.Hysteria: {\n proxy.type = \"hysteria\";\n if (x.ports !== \"\") {\n proxy.ports = x.ports;\n }\n if (x.protocol !== \"\") {\n proxy.protocol = x.protocol;\n }\n if (x.obfsParam !== \"\") {\n proxy[\"obfs-protocol\"] = x.obfsParam;\n }\n if (x.up !== \"\") {\n proxy.up = x.up;\n }\n if (x.upSpeed) {\n proxy[\"up-speed\"] = x.upSpeed;\n }\n if (x.down !== \"\") {\n proxy.down = x.down;\n }\n if (x.downSpeed) {\n proxy[\"down-speed\"] = x.downSpeed;\n }\n if (x.authStr !== \"\") {\n proxy[\"auth-str\"] = x.authStr;\n proxy.auth = base64Encode(x.authStr);\n }\n if (x.obfs !== \"\") {\n proxy.obfs = x.obfs;\n }\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.fingerprint !== \"\") {\n proxy.fingerprint = x.fingerprint;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n proxy.ca = x.ca;\n }\n if (x.caStr !== \"\") {\n proxy[\"ca-str\"] = x.caStr;\n }\n if (x.recvWindowConn) {\n proxy[\"recv-window-conn\"] = x.recvWindowConn;\n }\n if (x.recvWindow) {\n proxy[\"recv-window\"] = x.recvWindow;\n }\n if (x.disableMtuDiscovery !== undefined) {\n proxy[\"disable-mtu-discovery\"] = x.disableMtuDiscovery;\n }\n if (x.tcpFastOpen !== undefined) {\n proxy[\"fast-open\"] = x.tcpFastOpen;\n }\n if (x.hopInterval) {\n proxy[\"hop-interval\"] = x.hopInterval;\n }\n break;\n }\n case ProxyType.Hysteria2:\n proxy.type = \"hysteria2\";\n if (x.ports !== \"\") {\n proxy.ports = x.ports;\n }\n if (x.upSpeed) {\n proxy.up = x.upSpeed;\n }\n if (x.downSpeed) {\n proxy.down = x.downSpeed;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n if (x.obfs !== \"\") {\n proxy.obfs = x.obfs;\n }\n if (x.obfsParam !== \"\") {\n proxy[\"obfs-password\"] = x.obfsParam;\n }\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.fingerprint !== \"\") {\n proxy.fingerprint = x.fingerprint;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n proxy.ca = x.ca;\n }\n if (x.caStr !== \"\") {\n proxy[\"ca-str\"] = x.caStr;\n }\n if (x.cwnd) {\n proxy.cwnd = x.cwnd;\n }\n if (x.hopInterval) {\n proxy[\"hop-interval\"] = x.hopInterval;\n }\n break;\n case ProxyType.AnyTLS:\n proxy.type = \"anytls\";\n proxy.password = x.password;\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.VLESS:\n proxy.type = \"vless\";\n proxy.uuid = x.userId;\n if (x.flow !== \"\") {\n proxy.flow = x.flow;\n }\n proxy.tls = x.tlsSecure;\n if (x.serverName !== \"\") {\n proxy.servername = x.serverName;\n }\n if (x.fingerprint !== \"\") {\n proxy[\"client-fingerprint\"] = x.fingerprint;\n }\n if (x.publicKey !== \"\" || x.shortId !== \"\") {\n const realityOpts: Record<string, unknown> = {};\n if (x.publicKey !== \"\") {\n realityOpts[\"public-key\"] = x.publicKey;\n }\n realityOpts[\"short-id\"] = x.shortId;\n proxy[\"reality-opts\"] = realityOpts;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" ? { headers: { Host: x.host } } : {}),\n path: x.path,\n };\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n break;\n default:\n break;\n }\n break;\n case ProxyType.TUIC:\n proxy.type = \"tuic\";\n proxy.uuid = x.userId;\n proxy.password = x.password;\n if (x.congestionControl !== \"\") {\n proxy[\"congestion-controller\"] = x.congestionControl;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.serverName !== \"\") {\n proxy.sni = x.serverName;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n default:\n return undefined;\n }\n\n if (udpEnabled(x, settings) && x.type !== ProxyType.Snell) {\n proxy.udp = true;\n }\n if (tfo !== undefined) {\n proxy.tfo = tfo;\n }\n if (settings.clashNewFieldName && x.underlyingProxy !== \"\") {\n proxy[\"dialer-proxy\"] = x.underlyingProxy;\n }\n return proxy;\n}\n\nfunction udpEnabled(x: Proxy, settings: ExtraSettings): boolean {\n return x.udp !== undefined ? x.udp : settings.udp === true;\n}\n\nexport interface ClashBuildResult {\n doc: Record<string, unknown>;\n nodeList: Proxy[];\n}\n\n/** Build the Clash document object (without serialization). */\nexport function buildClash(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n clashR = false,\n): ClashBuildResult {\n const proxies: ClashProxy[] = [];\n const nodeList: Proxy[] = [];\n const remarksList: string[] = [];\n\n for (const x of nodes) {\n const type = proxyTypeName(x.type);\n if (settings.appendProxyType) {\n x.remark = `[${type}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList, false);\n x.remark = remark;\n\n const skipCertVerify =\n x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const built = buildClashProxy(x, settings, clashR, remark, toTri(skipCertVerify), toTri(tfo));\n if (!built) {\n continue;\n }\n proxies.push(built);\n remarksList.push(remark);\n nodeList.push(x);\n }\n\n if (settings.nodeList) {\n return { doc: { proxies }, nodeList };\n }\n\n const groups: unknown[] = [];\n for (const group of extraProxyGroup) {\n const singlegroup: Record<string, unknown> = {\n name: group.name,\n type: group.type === \"smart\" ? \"url-test\" : group.type,\n };\n switch (group.type) {\n case \"select\":\n case \"relay\":\n break;\n case \"load-balance\":\n singlegroup.strategy = group.strategy;\n singlegroup.lazy = group.lazy;\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n case \"smart\":\n case \"url-test\":\n if (group.lazy !== undefined) {\n singlegroup.lazy = group.lazy;\n }\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n case \"fallback\":\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n default:\n continue;\n }\n if (group.disableUdp !== undefined) {\n singlegroup[\"disable-udp\"] = group.disableUdp;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodeList, filtered, true);\n }\n if (group.usingProvider.length > 0) {\n singlegroup.use = group.usingProvider;\n } else {\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n singlegroup.proxies = filtered;\n }\n groups.push(singlegroup);\n }\n\n const doc: Record<string, unknown> = {};\n if (settings.clashNewFieldName) {\n doc.proxies = proxies;\n if (groups.length > 0) {\n doc[\"proxy-groups\"] = groups;\n }\n } else {\n doc.Proxy = proxies;\n if (groups.length > 0) {\n doc[\"Proxy Group\"] = groups;\n }\n }\n return { doc, nodeList };\n}\n\n/** Serialize a Clash document built by {@link buildClash}. */\nexport function stringifyClash(doc: Record<string, unknown>): string {\n return yamlStringify(doc, {\n aliasDuplicateObjects: false,\n lineWidth: 0,\n });\n}\n\n/** Convert nodes into a Clash YAML configuration string. */\nexport function toClash(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n clashR = false,\n): string {\n const { doc } = buildClash(nodes, extraProxyGroup, settings, clashR);\n return stringifyClash(doc);\n}\n","/**\n * ISO 3166-1 alpha-2 region helpers used when a proxy name has no country.\n *\n * The display names come from `Intl.DisplayNames` (no bundled database), with\n * small overrides where the CLDR Chinese name is too verbose for a node name\n * (e.g. `中国香港特别行政区` -> `香港`). Flag emoji are derived from the code.\n */\n\n/** All ISO 3166-1 alpha-2 codes, sorted, used for alias detection. */\nconst REGION_CODES = [\n \"AD\",\n \"AE\",\n \"AF\",\n \"AG\",\n \"AI\",\n \"AL\",\n \"AM\",\n \"AO\",\n \"AQ\",\n \"AR\",\n \"AS\",\n \"AT\",\n \"AU\",\n \"AW\",\n \"AX\",\n \"AZ\",\n \"BA\",\n \"BB\",\n \"BD\",\n \"BE\",\n \"BF\",\n \"BG\",\n \"BH\",\n \"BI\",\n \"BJ\",\n \"BL\",\n \"BM\",\n \"BN\",\n \"BO\",\n \"BQ\",\n \"BR\",\n \"BS\",\n \"BT\",\n \"BV\",\n \"BW\",\n \"BY\",\n \"BZ\",\n \"CA\",\n \"CC\",\n \"CD\",\n \"CF\",\n \"CG\",\n \"CH\",\n \"CI\",\n \"CK\",\n \"CL\",\n \"CM\",\n \"CN\",\n \"CO\",\n \"CR\",\n \"CU\",\n \"CV\",\n \"CW\",\n \"CX\",\n \"CY\",\n \"CZ\",\n \"DE\",\n \"DJ\",\n \"DK\",\n \"DM\",\n \"DO\",\n \"DZ\",\n \"EC\",\n \"EE\",\n \"EG\",\n \"EH\",\n \"ER\",\n \"ES\",\n \"ET\",\n \"FI\",\n \"FJ\",\n \"FK\",\n \"FM\",\n \"FO\",\n \"FR\",\n \"GA\",\n \"GB\",\n \"GD\",\n \"GE\",\n \"GF\",\n \"GG\",\n \"GH\",\n \"GI\",\n \"GL\",\n \"GM\",\n \"GN\",\n \"GP\",\n \"GQ\",\n \"GR\",\n \"GS\",\n \"GT\",\n \"GU\",\n \"GW\",\n \"GY\",\n \"HK\",\n \"HM\",\n \"HN\",\n \"HR\",\n \"HT\",\n \"HU\",\n \"ID\",\n \"IE\",\n \"IL\",\n \"IM\",\n \"IN\",\n \"IO\",\n \"IQ\",\n \"IR\",\n \"IS\",\n \"IT\",\n \"JE\",\n \"JM\",\n \"JO\",\n \"JP\",\n \"KE\",\n \"KG\",\n \"KH\",\n \"KI\",\n \"KM\",\n \"KN\",\n \"KP\",\n \"KR\",\n \"KW\",\n \"KY\",\n \"KZ\",\n \"LA\",\n \"LB\",\n \"LC\",\n \"LI\",\n \"LK\",\n \"LR\",\n \"LS\",\n \"LT\",\n \"LU\",\n \"LV\",\n \"LY\",\n \"MA\",\n \"MC\",\n \"MD\",\n \"ME\",\n \"MF\",\n \"MG\",\n \"MH\",\n \"MK\",\n \"ML\",\n \"MM\",\n \"MN\",\n \"MO\",\n \"MP\",\n \"MQ\",\n \"MR\",\n \"MS\",\n \"MT\",\n \"MU\",\n \"MV\",\n \"MW\",\n \"MX\",\n \"MY\",\n \"MZ\",\n \"NA\",\n \"NC\",\n \"NE\",\n \"NF\",\n \"NG\",\n \"NI\",\n \"NL\",\n \"NO\",\n \"NP\",\n \"NR\",\n \"NU\",\n \"NZ\",\n \"OM\",\n \"PA\",\n \"PE\",\n \"PF\",\n \"PG\",\n \"PH\",\n \"PK\",\n \"PL\",\n \"PM\",\n \"PN\",\n \"PR\",\n \"PS\",\n \"PT\",\n \"PW\",\n \"PY\",\n \"QA\",\n \"RE\",\n \"RO\",\n \"RS\",\n \"RU\",\n \"RW\",\n \"SA\",\n \"SB\",\n \"SC\",\n \"SD\",\n \"SE\",\n \"SG\",\n \"SH\",\n \"SI\",\n \"SJ\",\n \"SK\",\n \"SL\",\n \"SM\",\n \"SN\",\n \"SO\",\n \"SR\",\n \"SS\",\n \"ST\",\n \"SV\",\n \"SX\",\n \"SY\",\n \"SZ\",\n \"TC\",\n \"TD\",\n \"TF\",\n \"TG\",\n \"TH\",\n \"TJ\",\n \"TK\",\n \"TL\",\n \"TM\",\n \"TN\",\n \"TO\",\n \"TR\",\n \"TT\",\n \"TV\",\n \"TW\",\n \"TZ\",\n \"UA\",\n \"UG\",\n \"UM\",\n \"US\",\n \"UY\",\n \"UZ\",\n \"VA\",\n \"VC\",\n \"VE\",\n \"VG\",\n \"VI\",\n \"VN\",\n \"VU\",\n \"WF\",\n \"WS\",\n \"YE\",\n \"YT\",\n \"ZA\",\n \"ZM\",\n \"ZW\",\n] as const;\n\nconst REGION_CODE_SET = new Set<string>(REGION_CODES);\n\n/** Compact Chinese names for regions whose CLDR name is too long for a node. */\nconst ZH_OVERRIDES: Record<string, string> = {\n AE: \"阿联酋\",\n BN: \"文莱\",\n BO: \"玻利维亚\",\n CD: \"刚果(金)\",\n CG: \"刚果(布)\",\n CV: \"佛得角\",\n CZ: \"捷克\",\n DO: \"多米尼加\",\n HK: \"香港\",\n KH: \"柬埔寨\",\n KP: \"朝鲜\",\n KR: \"韩国\",\n LA: \"老挝\",\n MD: \"摩尔多瓦\",\n MK: \"北马其顿\",\n MM: \"缅甸\",\n MO: \"澳门\",\n NL: \"荷兰\",\n PS: \"巴勒斯坦\",\n RU: \"俄罗斯\",\n SY: \"叙利亚\",\n SZ: \"斯威士兰\",\n TL: \"东帝汶\",\n TW: \"台湾\",\n TZ: \"坦桑尼亚\",\n VA: \"梵蒂冈\",\n VE: \"委内瑞拉\",\n};\n\n/** Compact names for regions whose CLDR name is too long for a node. */\nconst EN_OVERRIDES: Record<string, string> = {\n HK: \"Hong Kong\",\n MO: \"Macau\",\n PS: \"Palestine\",\n TW: \"Taiwan\",\n};\n\n/** Extra spellings seen in subscription node names. */\nconst EXTRA_ALIASES = [\n \"Burma\",\n \"Cape Verde\",\n \"Czechia\",\n \"East Timor\",\n \"Holland\",\n \"Hong Kong\",\n \"Macao\",\n \"Macau\",\n \"North Korea\",\n \"South Korea\",\n \"UAE\",\n \"UK\",\n \"USA\",\n \"United Kingdom\",\n \"United States\",\n];\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst displayNameCache = new Map<string, Intl.DisplayNames>();\n\nfunction displayNames(locale: string): Intl.DisplayNames | undefined {\n const cached = displayNameCache.get(locale);\n if (cached) {\n return cached;\n }\n try {\n const created = new Intl.DisplayNames([locale], { fallback: \"code\", type: \"region\" });\n displayNameCache.set(locale, created);\n return created;\n } catch {\n return undefined;\n }\n}\n\n/** Normalize a region code, returning `\"\"` when it is not two ASCII letters. */\nfunction normalizeRegionCode(code: string): string {\n const upper = code.trim().toUpperCase();\n return /^[A-Z]{2}$/.test(upper) ? upper : \"\";\n}\n\n/** Localized country/region name (e.g. `美国`), falling back to the code. */\nexport function regionDisplayName(code: string, locale = \"zh-CN\"): string {\n const upper = normalizeRegionCode(code);\n if (upper === \"\") {\n return code.trim();\n }\n if (locale.toLowerCase().startsWith(\"zh\") && ZH_OVERRIDES[upper] !== undefined) {\n return ZH_OVERRIDES[upper] as string;\n }\n if (locale.toLowerCase().startsWith(\"en\") && EN_OVERRIDES[upper] !== undefined) {\n return EN_OVERRIDES[upper] as string;\n }\n const names = displayNames(locale);\n return names?.of(upper) ?? upper;\n}\n\n/** Flag emoji for a region code, or `\"\"` when the code is invalid. */\nexport function regionFlag(code: string): string {\n const upper = normalizeRegionCode(code);\n if (upper === \"\") {\n return \"\";\n }\n const base = 0x1f1e6;\n return String.fromCodePoint(base + upper.charCodeAt(0) - 65, base + upper.charCodeAt(1) - 65);\n}\n\n/** `true` when the code is a known ISO 3166-1 alpha-2 region. */\nexport function isRegionCode(code: string): boolean {\n return REGION_CODE_SET.has(normalizeRegionCode(code));\n}\n\nlet aliasRegex: RegExp | undefined;\n\nfunction buildAliasRegex(): RegExp {\n const ascii: string[] = [];\n const other: string[] = [];\n const seen = new Set<string>();\n const add = (alias: string): void => {\n const trimmed = alias.trim();\n if (trimmed.length < 2 || seen.has(trimmed)) {\n return;\n }\n seen.add(trimmed);\n if (/^[\\x20-\\x7e]+$/.test(trimmed)) {\n ascii.push(escapeRegExp(trimmed));\n } else {\n other.push(escapeRegExp(trimmed));\n }\n };\n for (const code of REGION_CODES) {\n add(regionDisplayName(code, \"zh-CN\"));\n add(regionDisplayName(code, \"en\"));\n add(regionFlag(code));\n }\n for (const alias of EXTRA_ALIASES) {\n add(alias);\n }\n const parts: string[] = [];\n if (ascii.length > 0) {\n parts.push(`(?<![A-Za-z])(?:${ascii.join(\"|\")})(?![A-Za-z])`);\n }\n if (other.length > 0) {\n parts.push(`(?:${other.join(\"|\")})`);\n }\n return new RegExp(parts.join(\"|\"), \"iu\");\n}\n\nfunction getAliasRegex(): RegExp {\n aliasRegex ??= buildAliasRegex();\n return aliasRegex;\n}\n\n/**\n * `true` when a node name already mentions a country/region — a localized\n * name, a common English spelling, a flag emoji, or an ISO code token such as\n * `US` in `US-01` / `US01`.\n */\nexport function hasRegionName(remark: string): boolean {\n const text = remark.trim();\n if (text === \"\") {\n return false;\n }\n if (getAliasRegex().test(text)) {\n return true;\n }\n for (const token of text.split(/[^\\p{L}\\p{N}]+/u)) {\n if (token === \"\") {\n continue;\n }\n if (/^\\p{Lu}{2}$/u.test(token) && isRegionCode(token)) {\n return true;\n }\n // `US01` / `us01`: an uppercase code prefix, or a lowercase one followed\n // by at least two digits (so `no1`, `in1` are not read as Norway/India).\n if (/^[A-Za-z]{2}\\d{2}/.test(token) && isRegionCode(token.slice(0, 2))) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Prepend `name-` to a node remark (e.g. `server1` -> `美国-server1`).\n * An empty remark becomes just the country name.\n */\nexport function formatCountryRemark(remark: string, code: string, locale = \"zh-CN\"): string {\n const name = regionDisplayName(code, locale);\n const trimmed = remark.trim();\n if (name === \"\") {\n return trimmed;\n }\n return trimmed === \"\" ? name : `${name}-${trimmed}`;\n}\n","import type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { RegexMatchConfig } from \"../types/settings\";\nimport { formatCountryRemark, hasRegionName } from \"../utils/country\";\n\nfunction toRegex(pattern: string): RegExp {\n try {\n return new RegExp(pattern);\n } catch {\n return /$^/;\n }\n}\n\nfunction regFind(value: string, pattern: string): boolean {\n return toRegex(pattern).test(value);\n}\n\nfunction regMatch(value: string, pattern: string): boolean {\n const match = toRegex(pattern).exec(value);\n return match !== null && match[0] === value;\n}\n\nfunction regReplace(value: string, pattern: string, replacement: string): string {\n return value.replace(new RegExp(pattern, \"g\"), replacement);\n}\n\nconst TYPE_MATCH_NAMES: Partial<Record<ProxyType, string>> = {\n [ProxyType.AnyTLS]: \"ANYTLS\",\n [ProxyType.HTTP]: \"HTTP\",\n [ProxyType.HTTPS]: \"HTTPS\",\n [ProxyType.Hysteria]: \"HYSTERIA\",\n [ProxyType.Hysteria2]: \"HYSTERIA2\",\n [ProxyType.Shadowsocks]: \"SS\",\n [ProxyType.ShadowsocksR]: \"SSR\",\n [ProxyType.Snell]: \"SNELL\",\n [ProxyType.SOCKS5]: \"SOCKS5\",\n [ProxyType.Trojan]: \"TROJAN\",\n [ProxyType.TUIC]: \"TUIC\",\n [ProxyType.VLESS]: \"VLESS\",\n [ProxyType.VMess]: \"VMESS\",\n [ProxyType.WireGuard]: \"WIREGUARD\",\n};\n\n/** Does `target` fall within a subconverter range expression like `1-5,8,!3`? */\nexport function matchRange(range: string, target: number): boolean {\n const items = range.split(\",\");\n let match = false;\n for (const item of items) {\n if (/^-?\\d+$/.test(item)) {\n if (Number.parseInt(item, 10) === target) {\n match = true;\n }\n } else if (/^(\\d+)-(\\d+)$/.test(item)) {\n const m = /^(\\d+)-(\\d+)$/.exec(item) as RegExpExecArray;\n const begin = Number.parseInt(m[1] as string, 10);\n const end = Number.parseInt(m[2] as string, 10);\n if (target >= begin && target <= end) {\n match = true;\n }\n } else if (/^!-?(\\d+)$/.test(item)) {\n match = true;\n const m = /^!-?(\\d+)$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) === target) {\n match = false;\n }\n } else if (/^!(\\d+)-(\\d+)$/.test(item)) {\n match = true;\n const m = /^!(\\d+)-(\\d+)$/.exec(item) as RegExpExecArray;\n const begin = Number.parseInt(m[1] as string, 10);\n const end = Number.parseInt(m[2] as string, 10);\n if (target >= begin && target <= end) {\n match = false;\n }\n } else if (/^(\\d+)-$/.test(item)) {\n const m = /^(\\d+)-$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) >= target) {\n match = true;\n }\n } else if (/^(\\d+)\\+$/.test(item)) {\n const m = /^(\\d+)\\+$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) <= target) {\n match = true;\n }\n }\n }\n return match;\n}\n\n/**\n * Resolve a matcher rule against a node.\n *\n * Returns whether the rule's primary predicate matched; `realRule` receives the\n * remaining remark regex (empty means \"match all\").\n */\nexport function applyMatcher(rule: string, node: Proxy): { matched: boolean; realRule: string } {\n if (rule.startsWith(\"!!GROUP=\")) {\n const m = /^!!(?:GROUP)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: regFind(node.group, target), realRule };\n }\n if (rule.startsWith(\"!!GROUPID=\") || rule.startsWith(\"!!INSERT=\")) {\n const m = /^!!(?:GROUPID|INSERT)=([\\d\\-+!,]+)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n const dir = rule.startsWith(\"!!INSERT=\") ? -1 : 1;\n return { matched: matchRange(target, dir * node.groupId), realRule };\n }\n if (rule.startsWith(\"!!TYPE=\")) {\n const m = /^!!(?:TYPE)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n if (node.type === ProxyType.Unknown) {\n return { matched: false, realRule };\n }\n const name = TYPE_MATCH_NAMES[node.type] ?? \"\";\n return { matched: regMatch(name, target), realRule };\n }\n if (rule.startsWith(\"!!PORT=\")) {\n const m = /^!!(?:PORT)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: matchRange(target, node.port), realRule };\n }\n if (rule.startsWith(\"!!SERVER=\")) {\n const m = /^!!(?:SERVER)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: regFind(node.hostname, target), realRule };\n }\n return { matched: true, realRule: rule };\n}\n\n/** `true` when a node should be filtered out by the include/exclude remarks. */\nexport function checkIgnore(\n node: Proxy,\n excludeRemarks: string[],\n includeRemarks: string[],\n): boolean {\n const excluded = excludeRemarks.some((rule) => {\n const { matched, realRule } = applyMatcher(rule, node);\n if (!matched) {\n return false;\n }\n if (realRule === \"\") {\n return true;\n }\n return regFind(node.remark, realRule);\n });\n let included: boolean;\n if (includeRemarks.length > 0) {\n included = includeRemarks.some((rule) => {\n const { matched, realRule } = applyMatcher(rule, node);\n if (!matched) {\n return false;\n }\n if (realRule === \"\") {\n return true;\n }\n return regFind(node.remark, realRule);\n });\n } else {\n included = true;\n }\n return excluded || !included;\n}\n\n/** Remove excluded nodes and renumber the remaining ones in place. */\nexport function filterNodes(\n nodes: Proxy[],\n excludeRemarks: string[],\n includeRemarks: string[],\n groupId: number,\n): void {\n let nodeIndex = 0;\n const kept: Proxy[] = [];\n for (const node of nodes) {\n if (checkIgnore(node, excludeRemarks, includeRemarks)) {\n continue;\n }\n node.id = nodeIndex;\n node.groupId = groupId;\n nodeIndex += 1;\n kept.push(node);\n }\n nodes.length = 0;\n nodes.push(...kept);\n}\n\n/** Normalize a remark for output: `=`→`-`, optional CSV quoting, de-duplication. */\nexport function processRemark(remark: string, remarksList: string[], procComma = true): string {\n let result = remark.replace(/=/g, \"-\");\n if (procComma && result.includes(\",\")) {\n result = `\"${result}\"`;\n }\n let tempRemark = result;\n let count = 2;\n while (remarksList.includes(tempRemark)) {\n tempRemark = `${result} ${count}`;\n count += 1;\n }\n return tempRemark;\n}\n\n/** Expand a proxy-group `proxies` rule into concrete node remarks. */\nexport function groupGenerate(\n rule: string,\n nodeList: Proxy[],\n filteredNodeList: string[],\n addDirect: boolean,\n): void {\n if (rule.startsWith(\"[]\") && addDirect) {\n filteredNodeList.push(rule.slice(2));\n return;\n }\n for (const node of nodeList) {\n const { matched, realRule } = applyMatcher(rule, node);\n if (\n matched &&\n (realRule === \"\" || regFind(node.remark, realRule)) &&\n !filteredNodeList.includes(node.remark)\n ) {\n filteredNodeList.push(node.remark);\n }\n }\n}\n\n/** Strip leading astral emoji from a remark (mirrors subconverter's byte check). */\nexport function removeEmoji(originalRemark: string): string {\n let index = 0;\n while (index < originalRemark.length) {\n const code = originalRemark.codePointAt(index) as number;\n if (code >= 0x1f000 && code <= 0x1ffff) {\n index += code > 0xffff ? 2 : 1;\n } else {\n break;\n }\n }\n const remark = originalRemark.slice(index).trim();\n return remark === \"\" ? originalRemark : remark;\n}\n\n/** Prefix an emoji chosen by the emoji rules. */\nexport function addEmoji(node: Proxy, emojiArray: RegexMatchConfig[]): string {\n for (const rule of emojiArray) {\n if (rule.replace === \"\") {\n continue;\n }\n const { matched, realRule } = applyMatcher(rule.match, node);\n if (matched && realRule !== \"\" && regFind(node.remark, realRule)) {\n return `${rule.replace} ${node.remark}`;\n }\n }\n return node.remark;\n}\n\n/** Replace every match of the user-supplied regex rules in a node's remark. */\nexport function nodeNameRegex(node: Proxy, rules: RegexMatchConfig[]): void {\n const original = node.remark;\n for (const rule of rules) {\n if (rule.script !== \"\" || rule.match === \"\") {\n continue;\n }\n try {\n node.remark = node.remark.replace(new RegExp(rule.match, \"g\"), rule.replace);\n } catch {\n // Ignore malformed patterns instead of failing the whole conversion.\n }\n }\n if (node.remark === \"\") {\n node.remark = original;\n }\n}\n\nconst NAME_SEPARATOR_EDGES = /^[-_.\\s]+|[-_.\\s]+$/g;\nconst NAME_SEPARATOR_RUN = /([-_.\\s])[-_.\\s]+/g;\n\n/**\n * Remove literal fragments from a node's remark (e.g. `foo.server1.bar` with\n * `[\"foo\", \"bar\"]` -> `server1`). Separators left at the edges or doubled by\n * the removal are collapsed.\n */\nexport function nodeNameRemove(node: Proxy, removeList: string[]): void {\n const original = node.remark;\n let remark = node.remark;\n let removed = false;\n for (const fragment of removeList) {\n if (fragment === \"\" || !remark.includes(fragment)) {\n continue;\n }\n remark = remark.split(fragment).join(\"\");\n removed = true;\n }\n if (removed) {\n remark = remark.replace(NAME_SEPARATOR_EDGES, \"\").replace(NAME_SEPARATOR_RUN, \"$1\");\n }\n node.remark = remark === \"\" ? original : remark;\n}\n\n/** Apply rename rules to a node's remark (script rules are ignored). */\nexport function nodeRename(node: Proxy, renameArray: RegexMatchConfig[]): void {\n const original = node.remark;\n for (const rule of renameArray) {\n if (rule.script !== \"\") {\n continue;\n }\n const { matched, realRule } = applyMatcher(rule.match, node);\n if (matched && realRule !== \"\") {\n node.remark = regReplace(node.remark, realRule, rule.replace);\n }\n }\n if (node.remark === \"\") {\n node.remark = original;\n }\n}\n\n/**\n * Prefix a node's remark with its server country/region when the remark does\n * not already mention one (e.g. `server1` -> `美国-server1`).\n *\n * `resolve` returns an ISO 3166-1 alpha-2 code; a missing/unknown code leaves\n * the remark untouched. Mirrors the request `auto_country` switch.\n */\nexport function addCountryPrefix(\n node: Proxy,\n resolve: (node: Proxy) => string | undefined,\n locale = \"zh-CN\",\n): string {\n const remark = node.remark.trim();\n if (hasRegionName(remark)) {\n return node.remark;\n }\n const code = resolve(node);\n if (code === undefined || code === \"\") {\n return node.remark;\n }\n return formatCountryRemark(remark, code, locale);\n}\n\nexport interface PreprocessOptions {\n removeEmoji: boolean;\n addEmoji: boolean;\n sortFlag: boolean;\n renameArray: RegexMatchConfig[];\n emojiArray: RegexMatchConfig[];\n /** User regex rewrites applied before every other naming rule. */\n nameRegexArray?: RegexMatchConfig[];\n /** Literal fragments stripped from names before every other naming rule. */\n nameRemove?: string[];\n autoCountry?: boolean;\n countryLocale?: string;\n countryResolver?: (node: Proxy) => string | undefined;\n}\n\n/** Apply name cleanup, emoji removal, renaming, emoji insertion, and optional sorting. */\nexport function preprocessNodes(nodes: Proxy[], options: PreprocessOptions): void {\n for (const node of nodes) {\n if (options.removeEmoji) {\n node.remark = removeEmoji(node.remark).trim();\n }\n if (options.nameRegexArray && options.nameRegexArray.length > 0) {\n nodeNameRegex(node, options.nameRegexArray);\n }\n if (options.nameRemove && options.nameRemove.length > 0) {\n nodeNameRemove(node, options.nameRemove);\n }\n nodeRename(node, options.renameArray);\n if (options.addEmoji) {\n node.remark = addEmoji(node, options.emojiArray);\n }\n if (options.autoCountry && options.countryResolver) {\n node.remark = addCountryPrefix(\n node,\n options.countryResolver,\n options.countryLocale ?? \"zh-CN\",\n );\n }\n }\n if (options.sortFlag) {\n nodes.sort((a, b) => (a.remark < b.remark ? -1 : a.remark > b.remark ? 1 : 0));\n }\n}\n\n/** Remove nodes that share a type, server, port, and remark. Returns the count removed. */\nexport function dedupeNodes(nodes: Proxy[]): number {\n const seen = new Set<string>();\n const kept: Proxy[] = [];\n for (const node of nodes) {\n const key = `${node.type}\\u0000${node.hostname}\\u0000${node.port}\\u0000${node.remark}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n kept.push(node);\n }\n const removed = nodes.length - kept.length;\n nodes.length = 0;\n nodes.push(...kept);\n return removed;\n}\n","import type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport { BalanceStrategy, ProxyGroupType } from \"../types/proxy-group\";\nimport type { RulesetConfig, RulesetContent } from \"../types/ruleset\";\nimport { RulesetType } from \"../types/ruleset\";\n\nconst TEST_URL = \"http://www.gstatic.com/generate_204\";\n\nfunction group(\n name: string,\n type: ProxyGroupType,\n proxies: string[],\n extra: Partial<ProxyGroupConfig> = {},\n): ProxyGroupConfig {\n return {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name,\n persistent: undefined,\n proxies: [...proxies],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 5,\n tolerance: 0,\n type,\n url: \"\",\n usingProvider: [],\n ...extra,\n };\n}\n\n/**\n * Bundled default proxy groups, mirroring upstream `ACL4SSR.ini`\n * (`tindy2013/subconverter/base/config/ACL4SSR.ini`).\n *\n * Used only when `generate(..., { includeRules: true })` is set and the caller\n * did not provide explicit groups. Kept offline so the core engine stays\n * platform-free (no fetch required).\n */\nexport function getDefaultProxyGroups(): ProxyGroupConfig[] {\n return [\n group(\"🚀 节点选择\", ProxyGroupType.Select, [\"[]♻️ 自动选择\", \"[]DIRECT\", \".*\"]),\n group(\"♻️ 自动选择\", ProxyGroupType.URLTest, [\".*\"], {\n interval: 300,\n tolerance: 50,\n url: TEST_URL,\n }),\n group(\"🌍 国外媒体\", ProxyGroupType.Select, [\n \"[]🚀 节点选择\",\n \"[]♻️ 自动选择\",\n \"[]🎯 全球直连\",\n \".*\",\n ]),\n group(\"📲 电报信息\", ProxyGroupType.Select, [\"[]🚀 节点选择\", \"[]🎯 全球直连\", \".*\"]),\n group(\"Ⓜ️ 微软服务\", ProxyGroupType.Select, [\"[]🎯 全球直连\", \"[]🚀 节点选择\", \".*\"]),\n group(\"🍎 苹果服务\", ProxyGroupType.Select, [\"[]🚀 节点选择\", \"[]🎯 全球直连\", \".*\"]),\n group(\"🎯 全球直连\", ProxyGroupType.Select, [\"[]DIRECT\", \"[]🚀 节点选择\", \"[]♻️ 自动选择\"]),\n group(\"🛑 全球拦截\", ProxyGroupType.Select, [\"[]REJECT\", \"[]DIRECT\"]),\n group(\"🍃 应用净化\", ProxyGroupType.Select, [\"[]REJECT\", \"[]DIRECT\"]),\n group(\"🐟 漏网之鱼\", ProxyGroupType.Select, [\n \"[]🚀 节点选择\",\n \"[]🎯 全球直连\",\n \"[]♻️ 自动选择\",\n \".*\",\n ]),\n ];\n}\n\n/** Inline `[]RULE` content helper (no remote fetch needed). */\nfunction inline(group: string, rule: string): RulesetContent {\n return {\n content: `[]${rule}`,\n ruleGroup: group,\n rulePath: \"\",\n rulePathTyped: \"\",\n ruleType: RulesetType.Surge,\n updateInterval: 86400,\n };\n}\n\nfunction surge(group: string, lines: string[]): RulesetContent {\n return {\n content: lines.join(\"\\n\"),\n ruleGroup: group,\n rulePath: \"\",\n rulePathTyped: \"\",\n ruleType: RulesetType.Surge,\n updateInterval: 86400,\n };\n}\n\n/**\n * Bundled offline default rules, mirroring the structure of upstream\n * `ACL4SSR.ini` + its `rules/ACL4SSR` lists (LAN/China direct, ad reject,\n * messenger/media proxy, final catch-all).\n *\n * These are intentionally compact (≈60 rules) so `includeRules: true` works\n * without network access. Callers needing the full upstream lists should pass\n * explicit {@link RulesetContent} (or {@link getDefaultRulesetConfigs} via the\n * Node adapter, which fetches the remote lists).\n */\nexport function getDefaultRulesets(): RulesetContent[] {\n return [\n surge(\"🎯 全球直连\", [\n \"DOMAIN-SUFFIX,localhost\",\n \"DOMAIN,localhost\",\n \"IP-CIDR,127.0.0.0/8\",\n \"IP-CIDR,10.0.0.0/8\",\n \"IP-CIDR,172.16.0.0/12\",\n \"IP-CIDR,192.168.0.0/16\",\n \"IP-CIDR,224.0.0.0/4\",\n \"DOMAIN-SUFFIX,cn\",\n \"DOMAIN-SUFFIX,126.com\",\n \"DOMAIN-SUFFIX,163.com\",\n \"DOMAIN-SUFFIX,qq.com\",\n \"DOMAIN-SUFFIX,baidu.com\",\n \"DOMAIN-SUFFIX,alibaba.com\",\n \"DOMAIN-SUFFIX,taobao.com\",\n ]),\n surge(\"🛑 全球拦截\", [\n \"DOMAIN-SUFFIX,doubleclick.net\",\n \"DOMAIN-SUFFIX,googlesyndication.com\",\n \"DOMAIN-SUFFIX,googleadservices.com\",\n \"DOMAIN-SUFFIX,ads.yahoo.com\",\n \"DOMAIN-KEYWORD,adservice\",\n \"DOMAIN-KEYWORD,advertising\",\n ]),\n surge(\"🍃 应用净化\", [\n \"DOMAIN-SUFFIX,app-measurement.com\",\n \"DOMAIN-SUFFIX,crashlytics.com\",\n \"DOMAIN-KEYWORD,analytics\",\n \"DOMAIN-KEYWORD,tracking\",\n ]),\n surge(\"🌍 国外媒体\", [\n \"DOMAIN-SUFFIX,netflix.com\",\n \"DOMAIN-SUFFIX,nflxvideo.net\",\n \"DOMAIN-SUFFIX,youtube.com\",\n \"DOMAIN-SUFFIX,googlevideo.com\",\n \"DOMAIN-SUFFIX,disneyplus.com\",\n \"DOMAIN-SUFFIX,spotify.com\",\n \"DOMAIN-SUFFIX,tiktok.com\",\n ]),\n surge(\"📲 电报信息\", [\n \"DOMAIN-SUFFIX,telegram.org\",\n \"DOMAIN-SUFFIX,t.me\",\n \"DOMAIN-SUFFIX,telegram.me\",\n \"IP-CIDR,149.154.160.0/20\",\n \"IP-CIDR,91.108.4.0/22\",\n ]),\n surge(\"Ⓜ️ 微软服务\", [\n \"DOMAIN-SUFFIX,microsoft.com\",\n \"DOMAIN-SUFFIX,windows.com\",\n \"DOMAIN-SUFFIX,office.com\",\n \"DOMAIN-SUFFIX,live.com\",\n ]),\n surge(\"🍎 苹果服务\", [\n \"DOMAIN-SUFFIX,apple.com\",\n \"DOMAIN-SUFFIX,icloud.com\",\n \"DOMAIN-SUFFIX,apple-cloudkit.com\",\n ]),\n surge(\"🚀 节点选择\", [\"DOMAIN-SUFFIX,google.com\", \"DOMAIN-SUFFIX,github.com\"]),\n inline(\"🎯 全球直连\", \"GEOIP,CN\"),\n inline(\"🐟 漏网之鱼\", \"FINAL\"),\n ];\n}\n\n/**\n * Remote ruleset configs matching upstream `ACL4SSR.ini` for callers that can\n * fetch (Node adapter / CLI `--config`). Paths follow the public ACL4SSR\n * mirror; `collectRulesets` in `@subconverter/node` resolves them.\n */\nexport function getDefaultRulesetConfigs(): RulesetConfig[] {\n const base = \"https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash\";\n const list = (group: string, file: string): RulesetConfig => ({\n group,\n interval: 86400,\n url: `${base}/${file}`,\n });\n return [\n list(\"🎯 全球直连\", \"LocalAreaNetwork.list\"),\n list(\"🛑 全球拦截\", \"BanAD.list\"),\n list(\"🍃 应用净化\", \"BanProgramAD.list\"),\n list(\"🎯 全球直连\", \"GoogleCN.list\"),\n list(\"Ⓜ️ 微软服务\", \"Microsoft.list\"),\n list(\"🍎 苹果服务\", \"Apple.list\"),\n list(\"🌍 国外媒体\", \"ProxyMedia.list\"),\n list(\"📲 电报信息\", \"Telegram.list\"),\n list(\"🚀 节点选择\", \"ProxyLite.list\"),\n list(\"🎯 全球直连\", \"ChinaDomain.list\"),\n list(\"🎯 全球直连\", \"ChinaCompanyIp.list\"),\n { group: \"🎯 全球直连\", interval: 86400, url: \"[]GEOIP,CN\" },\n { group: \"🐟 漏网之鱼\", interval: 86400, url: \"[]FINAL\" },\n ];\n}\n","import { isSsCipher, SSR_CIPHERS } from \"../parser/ciphers\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode, urlSafeBase64Encode } from \"../utils/base64\";\nimport { toInt } from \"../utils/string\";\nimport { getUrlArg, urlEncode } from \"../utils/url\";\n\n/** Build the JSON payload of a `vmess://` link. */\nexport function vmessLinkConstruct(\n remarks: string,\n add: string,\n port: string,\n type: string,\n id: string,\n aid: string,\n net: string,\n path: string,\n host: string,\n tls: string,\n): string {\n return JSON.stringify({\n add,\n aid,\n host,\n id,\n net: net === \"\" ? \"tcp\" : net,\n path,\n port,\n ps: remarks,\n tls,\n type: type === \"\" ? \"none\" : type,\n v: \"2\",\n });\n}\n\n/** Build an `ss://` link. */\nexport function ssLinkConstruct(proxy: Proxy): string {\n const port = String(proxy.port);\n let link = `ss://${urlSafeBase64Encode(`${proxy.encryptMethod}:${proxy.password}`)}@${proxy.hostname}:${port}`;\n if (proxy.plugin !== \"\" && proxy.pluginOption !== \"\") {\n link += `/?plugin=${urlEncode(`${proxy.plugin};${proxy.pluginOption}`)}`;\n }\n link += `#${urlEncode(proxy.remark)}`;\n return link;\n}\n\n/** Build an `ssr://` link. */\nexport function ssrLinkConstruct(\n hostname: string,\n port: number,\n protocol: string,\n method: string,\n obfs: string,\n password: string,\n group: string,\n remark: string,\n obfsParam = \"\",\n protocolParam = \"\",\n): string {\n const payload =\n `${hostname}:${port}:${protocol}:${method}:${obfs}:${urlSafeBase64Encode(password)}` +\n `/?group=${urlSafeBase64Encode(group)}&remarks=${urlSafeBase64Encode(remark)}` +\n `&obfsparam=${urlSafeBase64Encode(obfsParam)}&protoparam=${urlSafeBase64Encode(protocolParam)}`;\n return `ssr://${urlSafeBase64Encode(payload)}`;\n}\n\n/** Build a `trojan://` link. */\nexport function trojanLinkConstruct(proxy: Proxy): string {\n const port = String(proxy.port);\n let link = `trojan://${proxy.password}@${proxy.hostname}:${port}?allowInsecure=${proxy.allowInsecure === true ? \"1\" : \"0\"}`;\n if (proxy.host !== \"\") {\n link += `&sni=${proxy.host}`;\n }\n if (proxy.transferProtocol === \"ws\") {\n link += \"&ws=1\";\n if (proxy.path !== \"\") {\n link += `&wspath=${urlEncode(proxy.path)}`;\n }\n }\n link += `#${urlEncode(proxy.remark)}`;\n return link;\n}\n\nfunction getBit(types: number, position: number): boolean {\n return (types & (1 << (position - 1))) !== 0;\n}\n\n/**\n * Export nodes as a plaintext or base64 list of share links.\n * `types` bitmask: SS=1, SSR=2, VMess=4, Trojan=8.\n */\nexport function proxyToSingle(nodes: Proxy[], types: number, settings: ExtraSettings): string {\n const ss = getBit(types, 1);\n const ssr = getBit(types, 2);\n const vmess = getBit(types, 3);\n const trojan = getBit(types, 4);\n let allLinks = \"\";\n\n for (const x of nodes) {\n let proxyStr = \"\";\n const port = String(x.port);\n const aid = String(x.alterId);\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (ss) {\n proxyStr = ssLinkConstruct(x);\n } else if (ssr) {\n if (SSR_CIPHERS.includes(x.encryptMethod) && x.plugin === \"\") {\n proxyStr = ssrLinkConstruct(\n x.hostname,\n x.port,\n \"origin\",\n x.encryptMethod,\n \"plain\",\n x.password,\n x.group,\n x.remark,\n );\n }\n } else {\n continue;\n }\n break;\n case ProxyType.ShadowsocksR:\n if (ssr) {\n proxyStr = ssrLinkConstruct(\n x.hostname,\n x.port,\n x.protocol,\n x.encryptMethod,\n x.obfs,\n x.password,\n x.group,\n x.remark,\n x.obfsParam,\n x.protocolParam,\n );\n } else if (ss) {\n if (isSsCipher(x.encryptMethod) && x.protocol === \"origin\" && x.obfs === \"plain\") {\n proxyStr = `ss://${urlSafeBase64Encode(`${x.encryptMethod}:${x.password}`)}@${x.hostname}:${port}#${urlEncode(x.remark)}`;\n }\n } else {\n continue;\n }\n break;\n case ProxyType.VMess:\n if (!vmess) {\n continue;\n }\n proxyStr = `vmess://${base64Encode(\n vmessLinkConstruct(\n x.remark,\n x.hostname,\n port,\n x.fakeType,\n x.userId,\n aid,\n x.transferProtocol,\n x.path,\n x.host,\n x.tlsSecure ? \"tls\" : \"\",\n ),\n )}`;\n break;\n case ProxyType.Trojan:\n if (!trojan) {\n continue;\n }\n proxyStr = trojanLinkConstruct(x);\n break;\n default:\n continue;\n }\n if (proxyStr !== \"\") {\n allLinks += `${proxyStr}\\n`;\n }\n }\n\n return settings.nodeList ? allLinks : base64Encode(allLinks);\n}\n\n/** Export Shadowsocks nodes as a SIP008 (`ssconf`) document. */\nexport function proxyToSsSub(nodes: Proxy[], baseConf: string): string {\n let base: Record<string, unknown>;\n try {\n const trimmed = baseConf.trim() === \"\" ? \"{}\" : baseConf;\n base = JSON.parse(trimmed) as Record<string, unknown>;\n } catch {\n base = {};\n }\n const proxies: unknown[] = [];\n for (const x of nodes) {\n let plugin = x.plugin;\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (plugin === \"simple-obfs\") {\n plugin = \"obfs-local\";\n }\n break;\n case ProxyType.ShadowsocksR:\n if (!isSsCipher(x.encryptMethod) || x.protocol !== \"origin\" || x.obfs !== \"plain\") {\n continue;\n }\n break;\n default:\n continue;\n }\n proxies.push({\n ...base,\n method: x.encryptMethod,\n password: x.password,\n plugin,\n plugin_opts: x.pluginOption,\n remarks: x.remark,\n server: x.hostname,\n server_port: x.port,\n });\n }\n return JSON.stringify(proxies);\n}\n\n/** Export Shadowsocks nodes as an `ssd://` document. */\nexport function proxyToSsd(nodes: Proxy[], group: string, userinfo: string): string {\n const resolvedGroup = group === \"\" ? \"SSD\" : group;\n const doc: Record<string, unknown> = {\n airport: resolvedGroup,\n encryption: \"aes-128-gcm\",\n password: \"password\",\n port: 1,\n };\n if (userinfo !== \"\") {\n const data = userinfo.replace(/; /g, \"&\");\n const upload = getUrlArg(data, \"upload\");\n const download = getUrlArg(data, \"download\");\n const total = getUrlArg(data, \"total\");\n const expiry = getUrlArg(data, \"expire\");\n // SSD reports traffic in decimal GB (1 GB = 1000^3 bytes) per spec,\n // distinct from Clash `subscription-userinfo` clients that divide by\n // 1024^3 (see `scaleDecimalBytes` in userinfo.ts).\n const gb = 1000 ** 3;\n doc.traffic_used = (Number(upload || 0) + Number(download || 0)) / gb;\n doc.traffic_total = Number(total || 0) / gb;\n if (expiry !== \"\") {\n const date = new Date(toInt(expiry) * 1000);\n doc.expiry = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}-${String(date.getDate()).padStart(2, \"0\")} ${String(date.getHours()).padStart(2, \"0\")}:${String(date.getMinutes()).padStart(2, \"0\")}`;\n }\n }\n const servers: unknown[] = [];\n let index = 0;\n for (const x of nodes) {\n if (x.type === ProxyType.Shadowsocks) {\n const plugin = x.plugin === \"obfs-local\" ? \"simple-obfs\" : x.plugin;\n servers.push({\n encryption: x.encryptMethod,\n id: index,\n password: x.password,\n plugin,\n plugin_options: x.pluginOption,\n port: x.port,\n remarks: x.remark,\n server: x.hostname,\n });\n index += 1;\n } else if (x.type === ProxyType.ShadowsocksR) {\n if (isSsCipher(x.encryptMethod) && x.protocol === \"origin\" && x.obfs === \"plain\") {\n servers.push({\n encryption: x.encryptMethod,\n id: index,\n password: x.password,\n port: x.port,\n remarks: x.remark,\n server: x.hostname,\n });\n index += 1;\n }\n }\n }\n doc.servers = servers;\n return `ssd://${base64Encode(JSON.stringify(doc))}`;\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { fnv1a64Hex } from \"../utils/hash\";\nimport { isIpv4, isIpv6 } from \"../utils/string\";\n\ninterface RawSection {\n name: string;\n lines: string[];\n}\n\nfunction parseRawSections(text: string): RawSection[] {\n const sections: RawSection[] = [];\n let current: RawSection | undefined;\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine;\n const header = /^\\[(.*)\\]$/.exec(line.trim());\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line.trim() === \"\") {\n continue;\n }\n if (current) {\n current.lines.push(line);\n }\n }\n return sections;\n}\n\nfunction triStr(value: boolean | undefined): string {\n return value ? \"true\" : \"false\";\n}\n\nfunction httpProxyLine(x: Proxy, scv: boolean | undefined): string {\n let proxy = `http, ${x.hostname}, ${x.port}`;\n if (x.username !== \"\") {\n proxy += `, username=${x.username}`;\n }\n if (x.password !== \"\") {\n proxy += `, password=${x.password}`;\n }\n proxy += `, tls=${triStr(x.tlsSecure)}`;\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n return proxy;\n}\n\n/** Build a WireGuard `peer=(...)` clause. */\nexport function generatePeer(node: Proxy, clientIdAsReserved = false): string {\n let result = `public-key = ${node.publicKey}`;\n result += `, endpoint = ${node.hostname}:${node.port}`;\n if (node.preSharedKey !== \"\") {\n result += `, preshared-key = ${node.preSharedKey}`;\n }\n if (node.allowedIps !== \"\") {\n result += `, allowed-ips = \"${node.allowedIps}\"`;\n }\n if (node.keepAlive > 0) {\n result += `, keepalive = ${node.keepAlive}`;\n }\n if (node.clientId !== \"\") {\n result += clientIdAsReserved\n ? `, reserved = [${node.clientId}]`\n : `, client-id = ${node.clientId}`;\n }\n return result;\n}\n\nexport interface SurgeOptions {\n version: number;\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\ninterface SurgeBuildResult {\n proxies: string[];\n groups: string[];\n extraSections: Map<string, string[]>;\n sectionOrder: string[];\n}\n\nfunction buildSurge(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SurgeOptions,\n): SurgeBuildResult {\n const surgeVer = options.version;\n const remarksList: string[] = [];\n const proxies: string[] = [];\n const nodelist: Proxy[] = [];\n const extraSections = new Map<string, string[]>();\n const sectionOrder: string[] = [];\n let localPort = 1080;\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tls13 = x.tls13 !== undefined ? x.tls13 : settings.tls13;\n\n let proxy = \"\";\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (surgeVer >= 3 || surgeVer === -3) {\n proxy = `ss, ${x.hostname}, ${x.port}, encrypt-method=${x.encryptMethod}, password=${x.password}`;\n } else {\n proxy = `custom, ${x.hostname}, ${x.port}, ${x.encryptMethod}, ${x.password}, https://github.com/pobizhe/SSEncrypt/raw/master/SSEncrypt.module`;\n }\n if (x.plugin !== \"\") {\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n if (x.pluginOption !== \"\") {\n proxy += `,${x.pluginOption.replace(/;/g, \",\")}`;\n }\n } else {\n continue;\n }\n }\n break;\n case ProxyType.VMess: {\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `vmess, ${x.hostname}, ${x.port}, username=${x.userId}, tls=${triStr(x.tlsSecure)}, vmess-aead=${x.alterId === 0 ? \"true\" : \"false\"}`;\n if (x.tlsSecure && tls13 !== undefined) {\n proxy += `, tls13=${triStr(tls13)}`;\n }\n const headers: string[] = [];\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\": {\n if (x.host === \"\") {\n proxy += `, ws=true, ws-path=${x.path}, sni=${x.hostname}`;\n } else {\n proxy += `, ws=true, ws-path=${x.path}, sni=${x.host}`;\n }\n if (x.host !== \"\") {\n headers.push(`Host:${x.host}`);\n }\n if (x.edge !== \"\") {\n headers.push(`Edge:${x.edge}`);\n }\n if (headers.length > 0) {\n proxy += `, ws-headers=${headers.join(\"|\")}`;\n }\n break;\n }\n default:\n continue;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n }\n case ProxyType.ShadowsocksR: {\n if (settings.surgeSsrPath === \"\" || surgeVer < 2) {\n continue;\n }\n const args = [\n \"-l\",\n String(localPort),\n \"-s\",\n x.hostname,\n \"-p\",\n String(x.port),\n \"-m\",\n x.encryptMethod,\n \"-k\",\n x.password,\n \"-o\",\n x.obfs,\n \"-O\",\n x.protocol,\n ];\n if (x.obfsParam !== \"\") {\n args.push(\"-g\", x.obfsParam);\n }\n if (x.protocolParam !== \"\") {\n args.push(\"-G\", x.protocolParam);\n }\n proxy = `external, exec=\"${settings.surgeSsrPath}\", args=\"${args.join('\", args=\"')}\", local-port=${localPort}`;\n if (isIpv4(x.hostname) || isIpv6(x.hostname)) {\n proxy += `, addresses=${x.hostname}`;\n }\n localPort += 1;\n break;\n }\n case ProxyType.SOCKS5:\n proxy = `socks5, ${x.hostname}, ${x.port}`;\n if (x.username !== \"\") {\n proxy += `, username=${x.username}`;\n }\n if (x.password !== \"\") {\n proxy += `, password=${x.password}`;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n case ProxyType.HTTPS:\n if (surgeVer === -3) {\n proxy = `https, ${x.hostname}, ${x.port}, ${x.username}, ${x.password}`;\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n }\n proxy = httpProxyLine(x, scv);\n break;\n case ProxyType.HTTP:\n proxy = httpProxyLine(x, scv);\n break;\n case ProxyType.Trojan:\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `trojan, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.snellVersion !== 0) {\n proxy += `, version=${x.snellVersion}`;\n }\n if (x.host !== \"\") {\n proxy += `, sni=${x.host}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxy += \", ws=true\";\n if (x.path !== \"\") {\n proxy += `, ws-path=${x.path}`;\n }\n const wsHost = x.host !== \"\" ? x.host : x.hostname;\n proxy += `, ws-headers=Host:\"${wsHost}\"`;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n case ProxyType.Snell:\n proxy = `snell, ${x.hostname}, ${x.port}, psk=${x.password}`;\n if (x.obfs !== \"\") {\n proxy += `, obfs=${x.obfs}`;\n if (x.host !== \"\") {\n proxy += `, obfs-host=${x.host}`;\n }\n }\n if (x.snellVersion !== 0) {\n proxy += `, version=${x.snellVersion}`;\n }\n break;\n case ProxyType.WireGuard: {\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n const section = fnv1a64Hex(x.remark).slice(0, 5);\n proxy = `wireguard, section-name=${section}`;\n if (x.testUrl !== \"\") {\n proxy += `, test-url=${x.testUrl}`;\n }\n const wgLines: string[] = [`private-key = ${x.privateKey}`, `self-ip = ${x.selfIp}`];\n if (x.selfIpv6 !== \"\") {\n wgLines.push(`self-ip-v6 = ${x.selfIpv6}`);\n }\n if (x.dnsServers.length > 0) {\n wgLines.push(`dns-server = ${x.dnsServers.join(\",\")}`);\n }\n if (x.mtu > 0) {\n wgLines.push(`mtu = ${x.mtu}`);\n }\n wgLines.push(`peer = (${generatePeer(x)})`);\n const sectionName = `WireGuard ${section}`;\n extraSections.set(sectionName, wgLines);\n sectionOrder.push(sectionName);\n break;\n }\n case ProxyType.Hysteria2:\n if (surgeVer < 4) {\n continue;\n }\n proxy = `hysteria2, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.downSpeed) {\n proxy += `, download-bandwidth=${x.downSpeed}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${triStr(scv)}`;\n }\n if (x.fingerprint !== \"\") {\n proxy += `,server-cert-fingerprint-sha256=${x.fingerprint}`;\n }\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n break;\n case ProxyType.AnyTLS:\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `anytls, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n break;\n default:\n continue;\n }\n\n if (tfo !== undefined) {\n proxy += `, tfo=${triStr(tfo)}`;\n }\n if (udp !== undefined) {\n proxy += `, udp-relay=${triStr(udp)}`;\n }\n if (x.underlyingProxy !== \"\") {\n proxy += `, underlying-proxy=${x.underlyingProxy}`;\n }\n\n proxies.push(`${remark} = ${proxy}`);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return { extraSections, groups: [], proxies, sectionOrder };\n }\n\n const groups: string[] = [];\n for (const group of extraProxyGroup) {\n const filtered: string[] = [];\n let groupLine = \"\";\n switch (group.type) {\n case \"select\":\n case \"smart\":\n case \"url-test\":\n case \"fallback\":\n break;\n case \"load-balance\":\n if (surgeVer < 1 && surgeVer !== -3) {\n continue;\n }\n break;\n case \"ssid\": {\n const rest = group.proxies.slice(1).join(\",\");\n const line = `${group.type},default=${group.proxies[0] ?? \"\"},${rest}`;\n groups.push(`${group.name} = ${line}`);\n continue;\n }\n default:\n continue;\n }\n\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n if (filtered.length === 1) {\n const single = (filtered[0] as string).toLowerCase();\n if (single === \"direct\" || single === \"reject\" || single === \"reject-tinygif\") {\n proxies.push(`${group.name} = ${single}`);\n continue;\n }\n }\n groupLine = `${group.type},${filtered.join(\",\")}`;\n if (group.type === \"url-test\" || group.type === \"fallback\" || group.type === \"load-balance\") {\n groupLine += `,url=${group.url},interval=${group.interval}`;\n if (group.tolerance > 0) {\n groupLine += `,tolerance=${group.tolerance}`;\n }\n if (group.timeout > 0) {\n groupLine += `,timeout=${group.timeout}`;\n }\n if (group.persistent !== undefined) {\n groupLine += `,persistent=${triStr(group.persistent)}`;\n }\n if (group.evaluateBeforeUse !== undefined) {\n groupLine += `,evaluate-before-use=${triStr(group.evaluateBeforeUse)}`;\n }\n }\n groups.push(`${group.name} = ${groupLine}`);\n }\n\n return { extraSections, groups, proxies, sectionOrder };\n}\n\n/** Convert nodes into a Surge configuration string. */\nexport function toSurge(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SurgeOptions,\n): string {\n const result = buildSurge(nodes, extraProxyGroup, settings, options);\n if (options.nodeList) {\n return result.proxies.join(\"\\n\");\n }\n\n const baseSections = options.baseConf === \"\" ? [] : parseRawSections(options.baseConf);\n const byName = new Map<string, RawSection>();\n const order: string[] = [];\n for (const section of baseSections) {\n byName.set(section.name, section);\n order.push(section.name);\n }\n const setSection = (name: string, lines: string[]): void => {\n if (!byName.has(name)) {\n order.push(name);\n }\n byName.set(name, { lines, name });\n };\n setSection(\"Proxy\", [\"DIRECT = direct\", ...result.proxies]);\n if (result.groups.length > 0) {\n setSection(\"Proxy Group\", result.groups);\n }\n for (const name of result.sectionOrder) {\n setSection(name, result.extraSections.get(name) as string[]);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setSection(options.rules.section, options.rules.lines);\n }\n\n const out: string[] = [];\n for (const name of order) {\n const section = byName.get(name);\n if (!section) {\n continue;\n }\n out.push(`[${name}]`);\n out.push(...section.lines);\n out.push(\"\");\n }\n return out.join(\"\\n\").trimEnd() + \"\\n\";\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { generatePeer } from \"./surge\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { isIpv4, isIpv6 } from \"../utils/string\";\n\nfunction buildLoonNode(x: Proxy, settings: ExtraSettings, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n let method = x.encryptMethod;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxy: string;\n switch (x.type) {\n case ProxyType.Shadowsocks:\n proxy = `Shadowsocks,${hostname},${port},${method},\"${x.password}\"`;\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n if (x.pluginOption !== \"\") {\n proxy += `,${x.pluginOption.replace(/;obfs-host=/g, \",\").replace(/obfs=/g, \"\")}`;\n }\n } else if (x.plugin !== \"\") {\n return undefined;\n }\n break;\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxy = `vmess,${hostname},${port},${method},\"${x.userId}\",over-tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure) {\n proxy += `,tls-name=${x.host}`;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n proxy += \",transport=tcp\";\n break;\n case \"ws\":\n proxy += `,transport=ws,path=${x.path},host=${x.host}`;\n break;\n default:\n return undefined;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.ShadowsocksR:\n proxy = `ShadowsocksR,${hostname},${port},${method},\"${x.password}\",protocol=${x.protocol},protocol-param=${x.protocolParam},obfs=${x.obfs},obfs-param=${x.obfsParam}`;\n break;\n case ProxyType.HTTP:\n proxy = `http,${hostname},${port},${x.username},\"${x.password}\"`;\n break;\n case ProxyType.HTTPS:\n proxy = `https,${hostname},${port},${x.username},\"${x.password}\"`;\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.VLESS:\n if (\n x.transferProtocol !== \"\" &&\n x.transferProtocol !== \"tcp\" &&\n x.transferProtocol !== \"ws\"\n ) {\n return undefined;\n }\n proxy = `VLESS,${hostname},${port},\"${x.userId}\"`;\n if (x.flow !== \"\") {\n proxy += `,flow=${x.flow}`;\n }\n if (x.publicKey !== \"\") {\n proxy += `,public-key=\"${x.publicKey}\"`;\n }\n if (x.shortId !== \"\") {\n proxy += `,short-id=${x.shortId}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxy += `,path=${x.path},host=${x.host}`;\n }\n proxy += `,transport=${x.transferProtocol === \"ws\" ? \"ws\" : \"tcp\"}`;\n if (x.udp !== undefined) {\n proxy += `,udp=${x.udp ? \"true\" : \"false\"}`;\n } else {\n proxy += \",udp=false\";\n }\n proxy += `,over-tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure && x.serverName !== \"\") {\n proxy += `,sni=${x.serverName}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.Trojan:\n proxy = `trojan,${hostname},${port},\"${x.password}\"`;\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxy += `,transport=ws,path=${x.path},host=${x.host}`;\n } else {\n proxy += \",transport=tcp\";\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.SOCKS5:\n proxy = `socks5,${hostname},${port}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxy += `,${x.username},\"${x.password}\"`;\n }\n proxy += `,over-tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure) {\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n }\n break;\n case ProxyType.WireGuard:\n proxy = `wireguard, interface-ip=${x.selfIp}`;\n if (x.selfIpv6 !== \"\") {\n proxy += `, interface-ipv6=${x.selfIpv6}`;\n }\n proxy += `, private-key=${x.privateKey}`;\n for (const dns of x.dnsServers) {\n if (isIpv4(dns)) {\n proxy += `, dns=${dns}`;\n } else if (isIpv6(dns)) {\n proxy += `, dnsv6=${dns}`;\n }\n }\n if (x.mtu > 0) {\n proxy += `, mtu=${x.mtu}`;\n }\n if (x.keepAlive > 0) {\n proxy += `, keepalive=${x.keepAlive}`;\n }\n proxy += `, peers=[{${generatePeer(x, true)}}]`;\n break;\n case ProxyType.Hysteria2:\n proxy = `Hysteria2,${hostname},${port},\"${x.password}\"`;\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n // NOTE: some converters emit `download-bandwidth` from the *up*\n // value (and a default 100 when unset), which contradicts the\n // Hysteria2 spec. Emit the actual `down` speed instead; omit when unset.\n if (x.downSpeed > 0) {\n proxy += `,download-bandwidth=${x.downSpeed}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n if (x.fingerprint !== \"\") {\n proxy += `,tls-cert-sha256=${x.fingerprint}`;\n }\n break;\n // Loon has no AnyTLS/TUIC mapping — keep the drop instead of\n // emitting non-standard lines.\n default:\n return undefined;\n }\n if (settings.tfo) {\n proxy += \",fast-open=true\";\n }\n if (settings.udp) {\n proxy += \",udp=true\";\n }\n void remark;\n return proxy;\n}\n\nfunction buildLoonGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n const filtered: string[] = [];\n switch (group.type) {\n case \"select\":\n case \"load-balance\":\n case \"url-test\":\n case \"fallback\":\n break;\n case \"ssid\":\n if (group.proxies.length < 2) {\n continue;\n }\n lines.push(\n `${group.name} = ssid,default=${group.proxies[0]},${group.proxies.slice(1).join(\",\")}`,\n );\n continue;\n default:\n continue;\n }\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n let groupLine = `${group.type},${filtered.join(\",\")}`;\n if (group.type !== \"select\") {\n groupLine += `,url=${group.url},interval=${group.interval}`;\n if (group.type === \"load-balance\") {\n groupLine += `,algorithm=${group.strategy === \"round-robin\" ? \"round-robin\" : \"pcc\"}`;\n if (group.timeout > 0) {\n groupLine += `,max-timeout=${group.timeout}`;\n }\n }\n if (group.type === \"url-test\" && group.tolerance > 0) {\n groupLine += `,tolerance=${group.tolerance}`;\n }\n if (group.type === \"fallback\") {\n groupLine += `,max-timeout=${group.timeout}`;\n }\n }\n lines.push(`${group.name} = ${groupLine}`);\n }\n return lines;\n}\n\nexport interface LoonOptions {\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\n/** Convert nodes into a Loon configuration string. */\nexport function toLoon(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: LoonOptions,\n): string {\n const remarksList: string[] = [];\n const proxyLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildLoonNode(x, settings, remark);\n if (line === undefined) {\n continue;\n }\n proxyLines.push(`${remark} = ${line}`);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return proxyLines.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"Proxy\", proxyLines);\n const groupLines = buildLoonGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"Proxy Group\", groupLines);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setRawSection(sections, options.rules.section, options.rules.lines);\n }\n return renderRawIni(sections);\n}\n","import type { RulesetContent, RulesetType } from \"../types/ruleset\";\nimport { RulesetType as RulesetTypeEnum } from \"../types/ruleset\";\n\nconst BASIC_TYPES = [\n \"DOMAIN\",\n \"DOMAIN-SUFFIX\",\n \"DOMAIN-KEYWORD\",\n \"IP-CIDR\",\n \"SRC-IP-CIDR\",\n \"GEOIP\",\n \"MATCH\",\n \"FINAL\",\n];\n\nexport const CLASH_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"SRC-PORT\",\n \"DST-PORT\",\n \"PROCESS-NAME\",\n];\n\nexport const SURGE2_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"USER-AGENT\",\n \"URL-REGEX\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nexport const SURGE_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"USER-AGENT\",\n \"URL-REGEX\",\n \"AND\",\n \"OR\",\n \"NOT\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nexport const QUANX_RULE_TYPES = [\n ...BASIC_TYPES,\n \"USER-AGENT\",\n \"HOST\",\n \"HOST-SUFFIX\",\n \"HOST-KEYWORD\",\n];\n\nexport const SURF_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nfunction isIpv4(value: string): boolean {\n const parts = value.split(\".\");\n return parts.length === 4 && parts.every((p) => /^\\d{1,3}$/.test(p) && Number(p) <= 255);\n}\n\nfunction stripComment(line: string): string {\n const idx = line.indexOf(\"//\");\n return (idx >= 0 ? line.slice(0, idx) : line).trim();\n}\n\nfunction isRuleLine(line: string): boolean {\n return line.length > 0 && line[0] !== \";\" && line[0] !== \"#\" && !line.startsWith(\"//\");\n}\n\n/**\n * Convert a ruleset body into the common `TYPE,VALUE[,flag]` Surge dialect.\n * Mirrors ruleconvert.cpp `convertRuleset`.\n */\nexport function convertRuleset(content: string, type: RulesetType): string {\n if (type === RulesetTypeEnum.Surge) {\n return content;\n }\n\n if (/^payload:\\r?\\n/.test(content)) {\n let output = content.replace(/payload:\\r?\\n/, \"\");\n output = output.replace(/^\\s*-\\s+(['\"]?)(.*?)\\1\\s*$/gm, \"$2\");\n if (type === RulesetTypeEnum.ClashClassical) {\n return output;\n }\n const lines: string[] = [];\n for (let raw of output.split(/\\r?\\n/)) {\n raw = raw.trim();\n if (raw.includes(\"//\")) {\n raw = stripComment(raw);\n }\n if (!isRuleLine(raw)) {\n continue;\n }\n let prefix: string;\n if (raw.includes(\"/\")) {\n prefix = isIpv4(raw.slice(0, raw.indexOf(\"/\"))) ? \"IP-CIDR,\" : \"IP-CIDR6,\";\n } else if (raw.startsWith(\".\") || raw.startsWith(\"+.\")) {\n let keyword = false;\n let value = raw;\n while (value.endsWith(\".*\")) {\n keyword = true;\n value = value.slice(0, -2);\n }\n prefix = keyword ? \"DOMAIN-KEYWORD,\" : \"DOMAIN-SUFFIX,\";\n value = value.slice(value.startsWith(\"+.\") ? 2 : value.startsWith(\".\") ? 1 : 0);\n lines.push(prefix + value);\n continue;\n } else {\n prefix = \"DOMAIN,\";\n }\n lines.push(prefix + raw);\n }\n return lines.join(\"\\n\");\n }\n\n // QuanX dialect.\n const lines: string[] = [];\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (line === \"\" || line.startsWith(\"#\") || line.startsWith(\";\")) {\n continue;\n }\n const normalized = line.replace(/^host/i, \"DOMAIN\").replace(/^ip6-cidr/i, \"IP-CIDR6\");\n const match =\n /^(DOMAIN(?:-(?:SUFFIX|KEYWORD))?|IP-CIDR6?|USER-AGENT),\\s*?(\\S*?)(?:,(?!no-resolve).*?)(,no-resolve)?$/i.exec(\n normalized,\n );\n if (match) {\n const ruleType = (match[1] as string).toUpperCase();\n const value = match[2] as string;\n lines.push(`${ruleType},${value}${match[3] ?? \"\"}`);\n } else {\n lines.push(normalized);\n }\n }\n return lines.join(\"\\n\");\n}\n\n/** Rewrite `TYPE,VALUE[,flag]` into `TYPE,VALUE,GROUP[,flag]`. */\nexport function transformRuleToCommon(input: string, group: string, noResolveOnly = false): string {\n const parts = input.split(\",\");\n if (parts.length < 2) {\n return `${parts[0] ?? \"\"},${group}`;\n }\n let line = `${parts[0]},${parts[1]},${group}`;\n if (parts.length > 2 && (!noResolveOnly || parts[2] === \"no-resolve\")) {\n line += `,${parts[2]}`;\n }\n return line;\n}\n\nfunction startsWithAny(line: string, types: string[]): boolean {\n return types.some((type) => line.startsWith(type));\n}\n\nfunction collectRuleLines(content: string, group: string, noResolveOnly: boolean): string[] {\n const converted = convertRuleset(content, RulesetTypeEnum.Surge);\n const out: string[] = [];\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n if (line === \"\") {\n continue;\n }\n out.push(transformRuleToCommon(line, group, noResolveOnly));\n }\n return out;\n}\n\n/** Convert rulesets into an ordered list of Clash rule strings. */\nexport function rulesetToClashRules(rulesets: RulesetContent[]): string[] {\n const rules: string[] = [];\n for (const ruleset of rulesets) {\n const content = ruleset.content;\n if (content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (content.startsWith(\"[]\")) {\n let line = content.slice(2);\n if (line.startsWith(\"FINAL\")) {\n line = `MATCH${line.slice(5)}`;\n }\n rules.push(transformRuleToCommon(line, group));\n continue;\n }\n const converted = convertRuleset(content, ruleset.ruleType);\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (!startsWithAny(line, CLASH_RULE_TYPES)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n rules.push(transformRuleToCommon(line, group));\n }\n }\n return rules;\n}\n\nexport interface SurgeRulesetResult {\n section: string;\n lines: string[];\n}\n\n/** Convert rulesets into Surge/QuanX/Quan/Loon rule lines. */\nexport function rulesetToSurgeRules(\n rulesets: RulesetContent[],\n surgeVersion: number,\n): SurgeRulesetResult {\n let section: string;\n let allowed: string[];\n let noResolveOnly = false;\n switch (surgeVersion) {\n case 0:\n section = \"RoutingRule\";\n allowed = SURGE_RULE_TYPES;\n break;\n case -1:\n section = \"filter_local\";\n allowed = QUANX_RULE_TYPES;\n noResolveOnly = true;\n break;\n case -2:\n section = \"TCP\";\n allowed = QUANX_RULE_TYPES;\n noResolveOnly = true;\n break;\n case -3:\n section = \"Rule\";\n allowed = SURF_RULE_TYPES;\n break;\n case -4:\n section = \"Rule\";\n allowed = SURGE_RULE_TYPES;\n break;\n default:\n section = \"Rule\";\n allowed = surgeVersion > 2 ? SURGE_RULE_TYPES : SURGE2_RULE_TYPES;\n break;\n }\n const lines: string[] = [];\n for (const ruleset of rulesets) {\n if (ruleset.content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (ruleset.content.startsWith(\"[]\")) {\n let line = ruleset.content.slice(2);\n if (line === \"MATCH\") {\n line = \"FINAL\";\n }\n if (surgeVersion === -1 || surgeVersion === -2) {\n line = transformRuleToCommon(line, group, true);\n } else if (!line.startsWith(\"AND\") && !line.startsWith(\"OR\") && !line.startsWith(\"NOT\")) {\n line = transformRuleToCommon(line, group);\n }\n lines.push(line.replace(/,,/g, \",\"));\n continue;\n }\n for (const rawLine of collectRuleLines(ruleset.content, group, noResolveOnly)) {\n if (surgeVersion === -2 && rawLine.startsWith(\"IP-CIDR6\")) {\n continue;\n }\n if (!startsWithAny(rawLine, allowed)) {\n continue;\n }\n const line =\n surgeVersion === -1 || surgeVersion === -2\n ? rawLine.replace(/^IP-CIDR6/, \"IP6-CIDR\")\n : rawLine;\n lines.push(line);\n }\n }\n return { lines, section };\n}\n\nexport const SING_BOX_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-VERSION\",\n \"INBOUND\",\n \"PROTOCOL\",\n \"NETWORK\",\n \"GEOSITE\",\n \"SRC-GEOIP\",\n \"DOMAIN-REGEX\",\n \"PROCESS-NAME\",\n \"PROCESS-PATH\",\n \"PACKAGE-NAME\",\n \"PORT\",\n \"PORT-RANGE\",\n \"SRC-PORT\",\n \"SRC-PORT-RANGE\",\n \"USER\",\n \"USER-ID\",\n];\n\n/** A sing-box `route` fragment produced from rulesets. */\nexport interface SingBoxRoute {\n rules: Record<string, unknown>[];\n final: string;\n}\n\nfunction toSingBoxKey(type: string): string {\n return type\n .toLowerCase()\n .replace(/-/g, \"_\")\n .replace(/ip_cidr6/g, \"ip_cidr\")\n .replace(/src_/g, \"source_\");\n}\n\n/**\n * Convert rulesets into a sing-box `route` fragment.\n * Mirrors ruleconvert.cpp `rulesetToSingBox`.\n */\nexport function rulesetToSingBoxRules(rulesets: RulesetContent[]): SingBoxRoute {\n const rules: Record<string, unknown>[] = [{ outbound: \"dns-out\", protocol: \"dns\" }];\n let final = \"\";\n\n for (const ruleset of rulesets) {\n const content = ruleset.content;\n if (content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (content.startsWith(\"[]\")) {\n const line = content.slice(2);\n if (line.startsWith(\"FINAL\") || line.startsWith(\"MATCH\")) {\n final = group;\n continue;\n }\n const parts = line.split(\",\");\n if (parts.length < 2) {\n continue;\n }\n const type = toSingBoxKey(parts[0] as string);\n const value = (parts[1] as string).toLowerCase();\n if (type === \"match\" || type === \"final\") {\n rules.push({ outbound: value });\n } else {\n rules.push({ outbound: group, [type]: value });\n }\n continue;\n }\n\n const converted = convertRuleset(content, ruleset.ruleType);\n const rule: Record<string, unknown> = {};\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n const args = line.split(\",\");\n if (args.length < 2) {\n continue;\n }\n const rawType = args[0] as string;\n if (!SING_BOX_RULE_TYPES.includes(rawType)) {\n continue;\n }\n const key = toSingBoxKey(rawType);\n const value = (args[1] as string).toLowerCase();\n const bucket = (rule[key] as string[] | undefined) ?? [];\n bucket.push(value);\n rule[key] = bucket;\n }\n if (Object.keys(rule).length === 0) {\n continue;\n }\n rule.outbound = group;\n rules.push(rule);\n }\n\n return { final, rules };\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { rulesetToSurgeRules } from \"./ruleset\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { RulesetContent } from \"../types/ruleset\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { urlSafeBase64Encode } from \"../utils/base64\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { urlEncode } from \"../utils/url\";\n\nfunction buildMellowEndpoint(x: Proxy, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (x.plugin !== \"\") {\n return undefined;\n }\n return `${remark}, ss, ss://${urlSafeBase64Encode(`${x.encryptMethod}:${x.password}`)}@${hostname}:${port}`;\n case ProxyType.VMess: {\n let proxy = `${remark}, vmess1, vmess1://${x.userId}@${hostname}:${port}`;\n if (x.path !== \"\") {\n proxy += x.path;\n }\n proxy += `?network=${x.transferProtocol}`;\n switch (x.transferProtocol) {\n case \"ws\":\n proxy += `&ws.host=${urlEncode(x.host)}`;\n break;\n case \"http\":\n if (x.host !== \"\") {\n proxy += `&http.host=${urlEncode(x.host)}`;\n }\n break;\n case \"quic\":\n if (x.quicSecure !== \"\" || x.quicSecret !== \"\") {\n proxy += `&quic.security=${x.quicSecure}&quic.key=${x.quicSecret}`;\n }\n break;\n default:\n break;\n }\n proxy += `&tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure && x.host !== \"\") {\n proxy += `&tls.servername=${urlEncode(x.host)}`;\n }\n if (x.allowInsecure !== undefined) {\n proxy += `&tls.allowinsecure=${x.allowInsecure ? \"true\" : \"false\"}`;\n }\n if (x.tcpFastOpen !== undefined) {\n proxy += `&sockopt.tcpfastopen=${x.tcpFastOpen ? \"true\" : \"false\"}`;\n }\n return proxy;\n }\n case ProxyType.SOCKS5:\n return `${remark}, builtin, socks, address=${hostname}, port=${port}, user=${x.username}, pass=${x.password}`;\n case ProxyType.HTTP:\n return `${remark}, builtin, http, address=${hostname}, port=${port}, user=${x.username}, pass=${x.password}`;\n default:\n return undefined;\n }\n}\n\nfunction buildMellowGroups(\n extraProxyGroup: ProxyGroupConfig[],\n nodelist: Proxy[],\n remarks: string[],\n): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n switch (group.type) {\n case \"select\":\n case \"url-test\":\n case \"fallback\":\n case \"load-balance\":\n break;\n default:\n continue;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, false);\n }\n if (filtered.length === 0) {\n if (remarks.length === 0) {\n filtered.push(\"DIRECT\");\n } else {\n filtered.push(...remarks);\n }\n }\n lines.push(`${group.name}, ${filtered.join(\":\")}, latency, interval=300, timeout=6`);\n }\n return lines;\n}\n\nexport interface MellowOptions {\n baseConf: string;\n nodeList: boolean;\n rulesets?: RulesetContent[];\n overwriteOriginalRules?: boolean;\n}\n\n/** Convert nodes into a Mellow (`mellow.conf`) configuration string. */\nexport function toMellow(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: MellowOptions,\n): string {\n const remarksList: string[] = [];\n const endpoints: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildMellowEndpoint(x, remark);\n if (line === undefined) {\n continue;\n }\n endpoints.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return endpoints.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n const append = (name: string, lines: string[]): void => {\n if (lines.length === 0) {\n return;\n }\n const existing = sections.find((section) => section.name === name);\n if (existing && !(options.overwriteOriginalRules ?? true)) {\n existing.lines.push(...lines);\n } else {\n setRawSection(sections, name, lines);\n }\n };\n append(\"Endpoint\", endpoints);\n append(\"EndpointGroup\", buildMellowGroups(extraProxyGroup, nodelist, remarksList));\n if (options.rulesets && options.rulesets.length > 0) {\n const rules = rulesetToSurgeRules(options.rulesets, 0);\n append(rules.section, rules.lines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode, urlSafeBase64Encode } from \"../utils/base64\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { urlEncode } from \"../utils/url\";\n\nfunction buildQuanNode(\n x: Proxy,\n settings: ExtraSettings,\n remark: string,\n nodeList: boolean,\n): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n const group = x.group;\n let method = x.encryptMethod;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxyStr: string;\n switch (x.type) {\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxyStr = `${remark} = vmess, ${hostname}, ${port}, ${method}, \"${x.userId}\", group=${group}`;\n if (x.tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (x.transferProtocol === \"ws\") {\n proxyStr += `, obfs=ws, obfs-path=\"${x.path}\", obfs-header=\"Host: ${x.host}`;\n if (x.edge !== \"\") {\n proxyStr += `[Rr][Nn]Edge: ${x.edge}`;\n }\n proxyStr += '\"';\n }\n if (nodeList) {\n proxyStr = `vmess://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n case ProxyType.ShadowsocksR:\n if (nodeList) {\n proxyStr = `ssr://${urlSafeBase64Encode(\n `${hostname}:${port}:${x.protocol}:${method}:${x.obfs}:${urlSafeBase64Encode(x.password)}` +\n `/?group=${urlSafeBase64Encode(group)}&remarks=${urlSafeBase64Encode(remark)}` +\n `&obfsparam=${urlSafeBase64Encode(x.obfsParam)}&protoparam=${urlSafeBase64Encode(x.protocolParam)}`,\n )}`;\n } else {\n proxyStr = `${remark} = shadowsocksr, ${hostname}, ${port}, ${method}, \"${x.password}\", group=${group}, protocol=${x.protocol}, obfs=${x.obfs}`;\n if (x.protocolParam !== \"\") {\n proxyStr += `, protocol_param=${x.protocolParam}`;\n }\n if (x.obfsParam !== \"\") {\n proxyStr += `, obfs_param=${x.obfsParam}`;\n }\n }\n break;\n case ProxyType.Shadowsocks:\n if (nodeList) {\n proxyStr = `ss://${urlSafeBase64Encode(`${method}:${x.password}`)}@${hostname}:${port}`;\n if (x.plugin !== \"\" && x.pluginOption !== \"\") {\n proxyStr += `/?plugin=${urlEncode(`${x.plugin};${x.pluginOption}`)}`;\n }\n proxyStr += `&group=${urlSafeBase64Encode(group)}#${urlEncode(remark)}`;\n } else {\n proxyStr = `${remark} = shadowsocks, ${hostname}, ${port}, ${method}, \"${x.password}\", group=${group}`;\n if (x.plugin === \"obfs-local\" && x.pluginOption !== \"\") {\n proxyStr += `, ${x.pluginOption.replace(/;/g, \", \")}`;\n }\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxyStr = `${remark} = http, upstream-proxy-address=${hostname}, upstream-proxy-port=${port}, group=${group}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, upstream-proxy-auth=true, upstream-proxy-username=${x.username}, upstream-proxy-password=${x.password}`;\n } else {\n proxyStr += \", upstream-proxy-auth=false\";\n }\n if (x.tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (x.host !== \"\") {\n proxyStr += `, tls-host=${x.host}`;\n }\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (nodeList) {\n proxyStr = `http://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n case ProxyType.SOCKS5:\n proxyStr = `${remark} = socks, upstream-proxy-address=${hostname}, upstream-proxy-port=${port}, group=${group}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, upstream-proxy-auth=true, upstream-proxy-username=${x.username}, upstream-proxy-password=${x.password}`;\n } else {\n proxyStr += \", upstream-proxy-auth=false\";\n }\n if (x.tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (x.host !== \"\") {\n proxyStr += `, tls-host=${x.host}`;\n }\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (nodeList) {\n proxyStr = `socks://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n default:\n return undefined;\n }\n return proxyStr;\n}\n\nfunction buildQuanGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n let type: string;\n switch (group.type) {\n case \"select\":\n case \"fallback\":\n type = \"static\";\n break;\n case \"url-test\":\n type = \"auto\";\n break;\n case \"load-balance\":\n type = \"balance, round-robin\";\n break;\n case \"ssid\": {\n let singlegroup = `${group.name} : wifi = ${group.proxies[0] ?? \"\"}`;\n let content = \"\";\n let celluar = \"\";\n for (const proxy of group.proxies.slice(1)) {\n const m = /^(.*?),?celluar\\s?=\\s?(.*?)(,.*)$/.exec(proxy);\n if (!m) {\n content += `${proxy}\\n`;\n continue;\n }\n celluar = m[2] as string;\n content += `${m[1] as string}${m[3] as string}\\n`;\n }\n if (celluar !== \"\") {\n singlegroup += `, celluar = ${celluar}`;\n }\n singlegroup += `\\n${content.trim().replace(/^,|,$/g, \"\").replace(/,/g, \"\\n\")}`;\n lines.push(base64Encode(singlegroup));\n continue;\n }\n default:\n continue;\n }\n\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"direct\");\n }\n if (filtered.length < 2) {\n type = \"static\";\n }\n const proxies = filtered.join(\"\\n\");\n let singlegroup = `${group.name} : ${type}`;\n if (type === \"static\") {\n singlegroup += `, ${filtered[0] as string}`;\n }\n singlegroup += `\\n${proxies}\\n`;\n lines.push(base64Encode(singlegroup));\n }\n return lines;\n}\n\nexport interface QuanOptions {\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\n/** Convert nodes into a Quantumult configuration string. */\nexport function toQuan(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: QuanOptions,\n): string {\n const remarksList: string[] = [];\n const serverLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildQuanNode(x, settings, remark, options.nodeList);\n if (line === undefined) {\n continue;\n }\n serverLines.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return base64Encode(serverLines.join(\"\\n\"));\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"SERVER\", serverLines);\n const groupLines = buildQuanGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"POLICY\", groupLines);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setRawSection(sections, options.rules.section, options.rules.lines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { getUrlArg } from \"../utils/url\";\n\nfunction triStr(value: boolean | undefined): string {\n return value ? \"true\" : \"false\";\n}\n\nfunction buildQuanxNode(x: Proxy, settings: ExtraSettings, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n let method = x.encryptMethod;\n let plugin = x.plugin;\n let pluginOption = x.pluginOption;\n let host = x.host;\n let path = x.path;\n let tlsSecure = x.tlsSecure;\n\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tls13 = x.tls13 !== undefined ? x.tls13 : settings.tls13;\n\n let proxyStr: string;\n switch (x.type) {\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxyStr = `vmess = ${hostname}:${port}, method=${method}, password=${x.userId}`;\n if (x.alterId !== 0) {\n proxyStr += \", aead=false\";\n }\n if (tlsSecure && tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxyStr += tlsSecure ? \", obfs=wss\" : \", obfs=ws\";\n proxyStr += `, obfs-host=${host}, obfs-uri=${path}`;\n } else if (tlsSecure) {\n proxyStr += `, obfs=over-tls, obfs-host=${host}`;\n }\n break;\n case ProxyType.Shadowsocks:\n proxyStr = `shadowsocks = ${hostname}:${port}, method=${method}, password=${x.password}`;\n if (plugin !== \"\") {\n if (plugin === \"simple-obfs\" || plugin === \"obfs-local\") {\n if (pluginOption !== \"\") {\n proxyStr += `, ${pluginOption.replace(/;/g, \", \")}`;\n }\n } else if (plugin === \"v2ray-plugin\") {\n pluginOption = pluginOption.replace(/;/g, \"&\");\n plugin = getUrlArg(pluginOption, \"mode\") === \"websocket\" ? \"ws\" : \"\";\n host = getUrlArg(pluginOption, \"host\");\n path = getUrlArg(pluginOption, \"path\");\n tlsSecure = pluginOption.includes(\"tls\");\n if (tlsSecure && plugin === \"ws\") {\n plugin += \"s\";\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n }\n proxyStr += `, obfs=${plugin}`;\n if (host !== \"\") {\n proxyStr += `, obfs-host=${host}`;\n }\n if (path !== \"\") {\n proxyStr += `, obfs-uri=${path}`;\n }\n } else {\n return undefined;\n }\n }\n break;\n case ProxyType.ShadowsocksR:\n proxyStr = `shadowsocks = ${hostname}:${port}, method=${method}, password=${x.password}, ssr-protocol=${x.protocol}`;\n if (x.protocolParam !== \"\") {\n proxyStr += `, ssr-protocol-param=${x.protocolParam}`;\n }\n proxyStr += `, obfs=${x.obfs}`;\n if (x.obfsParam !== \"\") {\n proxyStr += `, obfs-host=${x.obfsParam}`;\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxyStr = `http = ${hostname}:${port}, username=${x.username === \"\" ? \"none\" : x.username}, password=${x.password === \"\" ? \"none\" : x.password}`;\n if (tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n break;\n case ProxyType.Trojan:\n proxyStr = `trojan = ${hostname}:${port}, password=${x.password}`;\n if (tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n break;\n case ProxyType.SOCKS5:\n proxyStr = `socks5 = ${hostname}:${port}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, username=${x.username}, password=${x.password}`;\n if (tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n }\n break;\n case ProxyType.VLESS: {\n const vmethod = method === \"\" ? \"none\" : method;\n proxyStr = `vless = ${hostname}:${port}, method=${vmethod}, password=${x.userId}`;\n if (tlsSecure && tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n const obfsHost = host !== \"\" ? host : x.serverName !== \"\" ? x.serverName : x.sni;\n if (x.transferProtocol === \"ws\") {\n proxyStr += tlsSecure ? \", obfs=wss\" : \", obfs=ws\";\n proxyStr += `, obfs-host=${obfsHost}, obfs-uri=${path}`;\n } else if (tlsSecure) {\n proxyStr += `, obfs=over-tls, obfs-host=${obfsHost}`;\n }\n if (x.publicKey !== \"\") {\n proxyStr += `, reality-base64-pubkey=${x.publicKey}`;\n }\n if (x.shortId !== \"\") {\n proxyStr += `, reality-hex-shortid=${x.shortId}`;\n }\n if (x.flow !== \"\") {\n proxyStr += `, vless-flow=${x.flow}`;\n }\n break;\n }\n // Quantumult X has no AnyTLS/Hysteria2/TUIC mapping — drop them instead\n // of emitting non-standard lines.\n default:\n return undefined;\n }\n if (tfo !== undefined) {\n proxyStr += `, fast-open=${triStr(tfo)}`;\n }\n if (udp !== undefined) {\n proxyStr += `, udp-relay=${triStr(udp)}`;\n }\n if (\n tlsSecure &&\n scv !== undefined &&\n x.type !== ProxyType.Shadowsocks &&\n x.type !== ProxyType.ShadowsocksR\n ) {\n proxyStr += `, tls-verification=${scv ? \"false\" : \"true\"}`;\n }\n proxyStr += `, tag=${remark}`;\n return proxyStr;\n}\n\nfunction buildQuanxGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n let type: string;\n const filtered: string[] = [];\n switch (group.type) {\n case \"select\":\n type = \"static\";\n break;\n case \"url-test\":\n type = \"url-latency-benchmark\";\n break;\n case \"fallback\":\n type = \"available\";\n break;\n case \"load-balance\":\n type = \"round-robin\";\n break;\n case \"ssid\":\n type = \"ssid\";\n for (const proxy of group.proxies) {\n filtered.push(proxy.replace(/=/g, \":\"));\n }\n break;\n default:\n continue;\n }\n if (group.type !== \"ssid\") {\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"direct\");\n }\n if (filtered.length < 2) {\n type = \"static\";\n }\n }\n const proxies = filtered.join(\", \");\n let line = `${type}=${group.name}, ${proxies}`;\n if (group.type !== \"select\" && group.type !== \"ssid\") {\n line += `, check-interval=${group.interval}`;\n if (group.tolerance > 0) {\n line += `, tolerance=${group.tolerance}`;\n }\n }\n lines.push(line);\n }\n return lines;\n}\n\nexport interface QuanxOptions {\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\n/** Convert nodes into a Quantumult X configuration string. */\nexport function toQuanX(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: QuanxOptions,\n): string {\n const remarksList: string[] = [];\n const serverLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildQuanxNode(x, settings, remark);\n if (line === undefined) {\n continue;\n }\n serverLines.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return serverLines.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"server_local\", serverLines);\n const groupLines = buildQuanxGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"policy\", groupLines);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setRawSection(sections, options.rules.section, options.rules.lines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { rulesetToSingBoxRules } from \"./ruleset\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { RulesetContent } from \"../types/ruleset\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode } from \"../utils/base64\";\n\n/** Format a sing-box duration string from seconds (e.g. 3660 → `1h1m`). */\nexport function formatSingBoxInterval(interval: number): string {\n let remaining = interval;\n let result = \"\";\n if (remaining >= 3600) {\n result += `${Math.floor(remaining / 3600)}h`;\n remaining %= 3600;\n }\n if (remaining >= 60) {\n result += `${Math.floor(remaining / 60)}m`;\n remaining %= 60;\n }\n if (remaining > 0) {\n result += `${remaining}s`;\n }\n return result;\n}\n\nfunction buildTransport(proxy: Proxy): Record<string, unknown> | undefined {\n switch (proxy.transferProtocol) {\n case \"http\":\n return undefined;\n case \"ws\": {\n const headers: Record<string, string> = {};\n if (proxy.host !== \"\") {\n headers.Host = proxy.host;\n }\n if (proxy.edge !== \"\") {\n headers.Edge = proxy.edge;\n }\n return {\n headers,\n path: proxy.path === \"\" ? \"/\" : proxy.path,\n type: \"ws\",\n };\n }\n case \"grpc\":\n return {\n ...(proxy.path !== \"\" ? { service_name: proxy.path } : {}),\n type: \"grpc\",\n };\n default:\n return undefined;\n }\n}\n\nfunction buildTls(x: Proxy, scv: boolean | undefined): Record<string, unknown> | undefined {\n if (!x.tlsSecure) {\n return undefined;\n }\n const tls: Record<string, unknown> = { enabled: true, insecure: scv === true };\n if (x.serverName !== \"\") {\n tls.server_name = x.serverName;\n } else if (x.host !== \"\") {\n tls.server_name = x.host;\n } else if (x.sni !== \"\") {\n tls.server_name = x.sni;\n }\n if (x.alpn.length > 0) {\n tls.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n tls.certificate = x.ca;\n }\n if (x.caStr !== \"\") {\n tls.certificate = x.caStr;\n }\n return tls;\n}\n\nfunction buildOutbound(\n x: Proxy,\n settings: ExtraSettings,\n remark: string,\n): Record<string, unknown> | undefined {\n const common = {\n server: x.hostname,\n server_port: x.port,\n tag: remark,\n };\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxy: Record<string, unknown>;\n switch (x.type) {\n case ProxyType.Shadowsocks: {\n const out: Record<string, unknown> = {\n ...common,\n method: x.encryptMethod,\n password: x.password,\n type: \"shadowsocks\",\n };\n if (x.plugin !== \"\" && x.pluginOption !== \"\") {\n out.plugin = x.plugin === \"simple-obfs\" ? \"obfs-local\" : x.plugin;\n out.plugin_opts = x.pluginOption;\n }\n proxy = out;\n break;\n }\n // sing-box has no SSR support — drop such nodes.\n case ProxyType.ShadowsocksR:\n return undefined;\n case ProxyType.VMess: {\n const out: Record<string, unknown> = {\n ...common,\n alter_id: x.alterId,\n security: x.encryptMethod,\n type: \"vmess\",\n uuid: x.userId,\n };\n const transport = buildTransport(x);\n if (transport) {\n out.transport = transport;\n }\n proxy = out;\n break;\n }\n case ProxyType.VLESS: {\n const out: Record<string, unknown> = { ...common, type: \"vless\", uuid: x.userId };\n if (x.flow !== \"\") {\n out.flow = x.flow;\n }\n const transport = buildTransport(x);\n if (transport) {\n out.transport = transport;\n }\n proxy = out;\n break;\n }\n case ProxyType.Trojan: {\n const out: Record<string, unknown> = { ...common, password: x.password, type: \"trojan\" };\n const transport = buildTransport(x);\n if (transport) {\n out.transport = transport;\n }\n proxy = out;\n break;\n }\n case ProxyType.TUIC: {\n const out: Record<string, unknown> = {\n ...common,\n password: x.password,\n type: \"tuic\",\n udp_relay_mode: \"native\",\n uuid: x.userId,\n };\n if (x.congestionControl !== \"\") {\n out.congestion_control = x.congestionControl;\n }\n proxy = out;\n break;\n }\n case ProxyType.WireGuard: {\n const addresses = [x.selfIp];\n if (x.selfIpv6 !== \"\") {\n addresses.push(x.selfIpv6);\n }\n const peer: Record<string, unknown> = {\n public_key: x.publicKey,\n server: x.hostname,\n server_port: x.port,\n };\n if (x.preSharedKey !== \"\") {\n peer.pre_shared_key = x.preSharedKey;\n }\n if (x.allowedIps !== \"\") {\n peer.allowed_ips = x.allowedIps.split(\",\").map((s) => s.trim());\n }\n if (x.clientId !== \"\") {\n peer.reserved = x.clientId.split(\",\").map((s) => Number(s.trim()));\n }\n proxy = {\n local_address: addresses,\n mtu: x.mtu,\n peers: [peer],\n private_key: x.privateKey,\n tag: remark,\n type: \"wireguard\",\n };\n break;\n }\n case ProxyType.Hysteria: {\n const out: Record<string, unknown> = { ...common, type: \"hysteria\" };\n if (x.up !== \"\") {\n out.up_mbps = x.upSpeed;\n }\n if (x.down !== \"\") {\n out.down_mbps = x.downSpeed;\n }\n if (x.obfs !== \"\") {\n out.obfs = x.obfs;\n }\n if (x.authStr !== \"\") {\n out.auth_str = x.authStr;\n out.auth = base64Encode(x.authStr);\n }\n if (x.recvWindowConn) {\n out.recv_window_conn = x.recvWindowConn;\n }\n if (x.recvWindow) {\n out.recv_window = x.recvWindow;\n }\n if (x.disableMtuDiscovery !== undefined) {\n out.disable_mtu_discovery = x.disableMtuDiscovery;\n }\n proxy = out;\n break;\n }\n case ProxyType.Hysteria2: {\n const out: Record<string, unknown> = { ...common, type: \"hysteria2\" };\n if (x.ports !== \"\") {\n out.server_ports = x.ports\n .split(\",\")\n .map((p) => p.trim())\n .filter((p) => p !== \"\")\n .map((p) => (/^\\d+$/.test(p) ? `${p}:${p}` : p));\n }\n if (x.upSpeed) {\n out.up_mbps = x.upSpeed;\n }\n if (x.downSpeed) {\n out.down_mbps = x.downSpeed;\n }\n if (x.obfs !== \"\") {\n out.obfs = {\n ...(x.obfsParam !== \"\" ? { password: x.obfsParam } : {}),\n type: x.obfs,\n };\n }\n if (x.password !== \"\") {\n out.password = x.password;\n }\n if (x.hopInterval) {\n out.hop_interval = formatSingBoxInterval(x.hopInterval);\n }\n proxy = out;\n break;\n }\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxy = {\n ...common,\n password: x.password,\n type: \"http\",\n username: x.username,\n };\n break;\n case ProxyType.SOCKS5:\n proxy = {\n ...common,\n password: x.password,\n type: \"socks\",\n username: x.username,\n version: \"5\",\n };\n break;\n case ProxyType.AnyTLS:\n proxy = {\n ...common,\n type: \"anytls\",\n users: [{ password: x.password, username: \"sekai\" }],\n };\n break;\n default:\n return undefined;\n }\n\n const tls = buildTls(x, scv);\n if (tls) {\n if (x.type === ProxyType.VLESS && (x.publicKey !== \"\" || x.shortId !== \"\")) {\n const tlsRec = tls as Record<string, unknown>;\n if (x.fingerprint !== \"\") {\n tlsRec.utls = { enabled: true, fingerprint: x.fingerprint };\n }\n tlsRec.reality = {\n enabled: true,\n public_key: x.publicKey,\n short_id: x.shortId,\n };\n }\n proxy.tls = tls;\n }\n if (udp !== undefined && !udp) {\n proxy.network = \"tcp\";\n }\n if (tfo !== undefined) {\n proxy.tcp_fast_open = tfo;\n }\n return proxy;\n}\n\nexport interface SingBoxOptions {\n baseConf: string;\n nodeList: boolean;\n rulesets?: RulesetContent[];\n overwriteOriginalRules?: boolean;\n}\n\n/** Convert nodes into a sing-box configuration JSON string. */\nexport function toSingBox(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SingBoxOptions,\n): string {\n let doc: Record<string, unknown>;\n if (options.nodeList) {\n doc = {};\n } else {\n try {\n doc = (options.baseConf.trim() === \"\" ? {} : JSON.parse(options.baseConf)) as Record<\n string,\n unknown\n >;\n } catch {\n throw new Error(\"sing-box base config is not valid JSON\");\n }\n }\n\n const outbounds: Record<string, unknown>[] = [];\n if (!options.nodeList) {\n outbounds.push({ tag: \"DIRECT\", type: \"direct\" });\n outbounds.push({ tag: \"REJECT\", type: \"block\" });\n outbounds.push({ tag: \"dns-out\", type: \"dns\" });\n }\n\n const remarksList: string[] = [];\n const nodelist: Proxy[] = [];\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList, false);\n x.remark = remark;\n const outbound = buildOutbound(x, settings, remark);\n if (!outbound) {\n continue;\n }\n outbounds.push(outbound);\n nodelist.push(x);\n remarksList.push(remark);\n }\n\n if (!options.nodeList) {\n for (const group of extraProxyGroup) {\n let type: string;\n switch (group.type) {\n case \"select\":\n type = \"selector\";\n break;\n case \"url-test\":\n case \"fallback\":\n case \"load-balance\":\n type = \"urltest\";\n break;\n default:\n continue;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n const entry: Record<string, unknown> = { outbounds: filtered, tag: group.name, type };\n if (group.type === \"url-test\") {\n entry.url = group.url;\n entry.interval = formatSingBoxInterval(group.interval);\n if (group.tolerance > 0) {\n entry.tolerance = group.tolerance;\n }\n }\n outbounds.push(entry);\n }\n }\n\n doc.outbounds = outbounds;\n\n if (\n !options.nodeList &&\n options.rulesets &&\n options.rulesets.length > 0 &&\n settings.enableRuleGenerator\n ) {\n const route = rulesetToSingBoxRules(options.rulesets);\n const existingRoute = doc.route as Record<string, unknown> | undefined;\n const existingRules =\n !(options.overwriteOriginalRules ?? true) &&\n existingRoute &&\n Array.isArray(existingRoute.rules)\n ? (existingRoute.rules as Record<string, unknown>[])\n : [];\n doc.route = {\n ...(existingRoute ?? {}),\n final: route.final,\n rules: [...existingRules, ...route.rules],\n };\n }\n\n return JSON.stringify(doc, null, 2);\n}\n","import { toSurge } from \"./surge\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\n\nexport interface SurfboardOptions {\n baseConf: string;\n nodeList: boolean;\n rules?: { section: string; lines: string[] };\n}\n\n/**\n * Convert nodes into a Surfboard configuration.\n *\n * Surfboard is Surge-compatible but drops Hysteria2/AnyTLS nodes while keeping the same\n * latest-Surge proxy-line format for the rest (SS/SSR-less VMess/Trojan/\n * SOCKS/HTTP subset). Reuse the Surge generator on the filtered node list\n * so proxy-line fixes stay in one place.\n */\nexport function toSurfboard(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SurfboardOptions,\n): string {\n const filtered = nodes.filter(\n (n) => n.type !== ProxyType.Hysteria2 && n.type !== ProxyType.AnyTLS,\n );\n return toSurge(filtered, extraProxyGroup, settings, {\n baseConf: options.baseConf,\n nodeList: options.nodeList,\n rules: options.rules,\n version: 5,\n });\n}\n","import { buildClash, stringifyClash } from \"./generator/clash\";\nimport { getDefaultProxyGroups, getDefaultRulesets } from \"./generator/default-profile\";\nimport { proxyToSingle, proxyToSsd, proxyToSsSub } from \"./generator/links\";\nimport { toLoon } from \"./generator/loon\";\nimport { toMellow } from \"./generator/mellow\";\nimport { dedupeNodes, preprocessNodes } from \"./generator/nodes\";\nimport { toQuan } from \"./generator/quan\";\nimport { toQuanX } from \"./generator/quanx\";\nimport { rulesetToClashRules, rulesetToSurgeRules } from \"./generator/ruleset\";\nimport { toSingBox } from \"./generator/singbox\";\nimport { toSurfboard } from \"./generator/surfboard\";\nimport { toSurge } from \"./generator/surge\";\nimport type { Proxy } from \"./types/proxy\";\nimport type { ProxyGroupConfig } from \"./types/proxy-group\";\nimport type { RulesetContent } from \"./types/ruleset\";\nimport type { ExtraSettings } from \"./types/settings\";\nimport { TargetFormat, createExtraSettings } from \"./types/settings\";\n\n/** Options controlling a single conversion. */\nexport interface GenerateOptions {\n target: TargetFormat;\n groups?: ProxyGroupConfig[];\n settings?: Partial<ExtraSettings>;\n baseConf?: string;\n surgeVersion?: number;\n rulesets?: RulesetContent[];\n /**\n * Whether to attach rules (and default proxy groups) like upstream\n * `tindy2013/subconverter` does with e.g. `config=ACL4SSR.ini`.\n *\n * - `true`/`undefined` (default): emit rules; when `rulesets` is empty,\n * fall back to the bundled offline defaults. When `groups` is empty,\n * fall back to the bundled default proxy groups so rule references\n * resolve. Pass `no_rules`/`--no-rules` (`false`) to strip rules.\n * - `false`: never emit rules, even if `rulesets` are provided.\n */\n includeRules?: boolean;\n}\n\nconst V2RAY_TYPE_MASK = 1 | 2 | 4 | 8;\n\n/** Apply rename/emoji/sort preprocessing from settings to nodes. */\nexport function runPreprocess(nodes: Proxy[], settings: ExtraSettings): void {\n preprocessNodes(nodes, {\n addEmoji: settings.addEmoji,\n autoCountry: settings.autoCountry,\n countryLocale: settings.countryLocale,\n countryResolver: settings.countryResolver,\n emojiArray: settings.emojiArray,\n nameRegexArray: settings.nameRegexArray,\n nameRemove: settings.nameRemove,\n removeEmoji: settings.removeEmoji,\n renameArray: settings.renameArray,\n sortFlag: settings.sortFlag,\n });\n if (settings.dedupe) {\n dedupeNodes(nodes);\n }\n}\n\n/**\n * Convert nodes into the requested output format.\n *\n * This is the isomorphic generation entry point used by the CLI, the Node\n * adapter, and the browser build.\n */\nexport function generate(nodes: Proxy[], options: GenerateOptions): string {\n const settings: ExtraSettings = { ...createExtraSettings(), ...options.settings };\n runPreprocess(nodes, settings);\n const groups = resolveGroups(options);\n const rulesets = resolveRulesets(options, settings);\n\n switch (options.target) {\n case TargetFormat.Clash:\n case TargetFormat.ClashR: {\n const { doc } = buildClash(nodes, groups, settings, options.target === TargetFormat.ClashR);\n attachClashRules(doc, settings, rulesets);\n return stringifyClash(doc);\n }\n case TargetFormat.Surge: {\n const surgeVersion = options.surgeVersion ?? 5;\n const rules = rulesets ? rulesetToSurgeRules(rulesets, surgeVersion) : undefined;\n return toSurge(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n rules,\n version: surgeVersion,\n });\n }\n case TargetFormat.QuantumultX: {\n const rules = rulesets ? rulesetToSurgeRules(rulesets, -1) : undefined;\n return toQuanX(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.Quantumult: {\n const rules = rulesets ? rulesetToSurgeRules(rulesets, -2) : undefined;\n return toQuan(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.Loon: {\n const rules = rulesets ? rulesetToSurgeRules(rulesets, -4) : undefined;\n return toLoon(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.SingBox:\n return toSingBox(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n overwriteOriginalRules: settings.overwriteOriginalRules,\n rulesets,\n });\n case TargetFormat.Mellow:\n return toMellow(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n overwriteOriginalRules: settings.overwriteOriginalRules,\n rulesets,\n });\n case TargetFormat.V2Ray:\n return proxyToSingle(nodes, 4, settings);\n case TargetFormat.Trojan:\n return proxyToSingle(nodes, 8, settings);\n case TargetFormat.Mixed:\n return proxyToSingle(nodes, V2RAY_TYPE_MASK, settings);\n case TargetFormat.SSC:\n return proxyToSingle(nodes, 1, settings);\n case TargetFormat.SSR:\n return proxyToSingle(nodes, 2, settings);\n case TargetFormat.SSD:\n return proxyToSsd(nodes, \"\", \"\");\n case TargetFormat.SSSub:\n return proxyToSsSub(nodes, options.baseConf ?? \"\");\n case TargetFormat.Surfboard: {\n const rules = rulesets ? rulesetToSurgeRules(rulesets, options.surgeVersion ?? 5) : undefined;\n return toSurfboard(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.NodeList: {\n settings.nodeList = true;\n return proxyToSingle(nodes, V2RAY_TYPE_MASK, settings);\n }\n default:\n throw new Error(`Unsupported target format: ${options.target}`);\n }\n}\n\n/** Export Shadowsocks nodes as a SIP008 document (`ssconf`). */\nexport function toSip008(nodes: Proxy[], baseConf = \"\"): string {\n return proxyToSsSub(nodes, baseConf);\n}\n\n/** Resolve effective proxy groups, injecting bundled defaults unless opted out. */\nfunction resolveGroups(options: GenerateOptions): ProxyGroupConfig[] {\n if (options.includeRules !== false && (!options.groups || options.groups.length === 0)) {\n return getDefaultProxyGroups();\n }\n return options.groups ?? [];\n}\n\n/**\n * Resolve effective rulesets.\n *\n * - `includeRules: false` always strips rules (`no_rules` / `--no-rules`).\n * - `includeRules: true`/`undefined` (default) falls back to bundled offline\n * defaults when no explicit rulesets are given (mirrors upstream\n * `config=ACL4SSR.ini`).\n * `enableRuleGenerator: false` or `nodeList: true` always strips rules,\n * mirroring upstream `enable_rule_generator` / bare-list semantics.\n */\nfunction resolveRulesets(\n options: GenerateOptions,\n settings: ExtraSettings,\n): RulesetContent[] | undefined {\n if (options.includeRules === false) {\n return undefined;\n }\n if (!settings.enableRuleGenerator || settings.nodeList) {\n return undefined;\n }\n if (options.rulesets && options.rulesets.length > 0) {\n return options.rulesets;\n }\n return getDefaultRulesets();\n}\n\nfunction attachClashRules(\n doc: Record<string, unknown>,\n settings: ExtraSettings,\n rulesets: RulesetContent[] | undefined,\n): void {\n if (!settings.enableRuleGenerator || settings.nodeList) {\n return;\n }\n if (!rulesets || rulesets.length === 0) {\n return;\n }\n const field = settings.clashNewFieldName ? \"rules\" : \"Rule\";\n const generated = rulesetToClashRules(rulesets);\n if (generated.length === 0) {\n return;\n }\n const existing = doc[field];\n if (settings.overwriteOriginalRules || !Array.isArray(existing)) {\n doc[field] = generated;\n } else {\n doc[field] = [...(existing as string[]), ...generated];\n }\n}\n"],"mappings":"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EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,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","names":["ProxyGroupType","BalanceStrategy","ProxyType","RulesetType","TargetFormat","group","jms","generic","group","group","group","surge","group","regMatch","regReplace","group","group","group","parseRawSections","group","group","isIpv4","lines","group","group","group","singlegroup","triStr","group","group"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/proxy-group.ts","../src/types/proxy.ts","../src/types/ruleset.ts","../src/types/settings.ts","../src/types/tribool.ts","../src/utils/base64.ts","../src/utils/ini.ts","../src/utils/string.ts","../src/utils/url.ts","../src/utils/hash.ts","../src/utils/template.ts","../src/settings/config.ts","../src/settings/request-params.ts","../src/userinfo.ts","../src/parser/ciphers.ts","../src/parser/construct.ts","../src/parser/netch.ts","../src/parser/conf.ts","../src/parser/uri.ts","../src/parser/subscription.ts","../src/generator/clash.ts","../src/utils/country.ts","../src/generator/nodes.ts","../src/generator/default-profile.ts","../src/generator/links.ts","../src/generator/surge.ts","../src/generator/loon.ts","../src/generator/ruleset.ts","../src/generator/mellow.ts","../src/generator/quan.ts","../src/generator/quanx.ts","../src/generator/singbox.ts","../src/generator/surfboard.ts","../src/engine.ts"],"sourcesContent":["/** Proxy group kinds, mirroring subconverter's `ProxyGroupType`. */\nexport enum ProxyGroupType {\n Select = \"select\",\n URLTest = \"url-test\",\n Fallback = \"fallback\",\n LoadBalance = \"load-balance\",\n Relay = \"relay\",\n SSID = \"ssid\",\n Smart = \"smart\",\n}\n\n/** Load-balance strategy, mirroring `BalanceStrategy`. */\nexport enum BalanceStrategy {\n ConsistentHashing = \"consistent-hashing\",\n RoundRobin = \"round-robin\",\n}\n\n/** A configured proxy group (`[Proxy Group]` entries). */\nexport interface ProxyGroupConfig {\n name: string;\n type: ProxyGroupType;\n proxies: string[];\n usingProvider: string[];\n url: string;\n interval: number;\n timeout: number;\n tolerance: number;\n strategy: BalanceStrategy;\n lazy: boolean | undefined;\n disableUdp: boolean | undefined;\n persistent: boolean | undefined;\n evaluateBeforeUse: boolean | undefined;\n}\n\n/** Create a proxy group with subconverter's default field values. */\nexport function createProxyGroupConfig(): ProxyGroupConfig {\n return {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name: \"\",\n persistent: undefined,\n proxies: [],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 0,\n tolerance: 0,\n type: ProxyGroupType.Select,\n url: \"\",\n usingProvider: [],\n };\n}\n\n/**\n * Create one select group that fans out to every proxy type, mirroring the\n * CLI `--group` flag and the server `group` param. Shared so both\n * entrypoints build byte-identical groups.\n */\nexport function createSelectGroup(name: string): ProxyGroupConfig {\n return {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name,\n persistent: undefined,\n proxies: [\"[]DIRECT\", \"!!TYPE=SS\", \"!!TYPE=SSR\", \"!!TYPE=VMESS\", \"!!TYPE=TROJAN\"],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 0,\n tolerance: 0,\n type: ProxyGroupType.Select,\n url: \"\",\n usingProvider: [],\n };\n}\n\n/** Resolve a textual group type (as found in config files). */\nexport function parseProxyGroupType(value: string): ProxyGroupType | undefined {\n const normalized = value.trim().toLowerCase();\n switch (normalized) {\n case \"select\":\n return ProxyGroupType.Select;\n case \"url-test\":\n return ProxyGroupType.URLTest;\n case \"fallback\":\n return ProxyGroupType.Fallback;\n case \"load-balance\":\n return ProxyGroupType.LoadBalance;\n case \"relay\":\n return ProxyGroupType.Relay;\n case \"ssid\":\n return ProxyGroupType.SSID;\n case \"smart\":\n return ProxyGroupType.Smart;\n default:\n return undefined;\n }\n}\n","import type { TriBool } from \"./tribool\";\n\n/** Proxy protocol kinds supported by the converter. */\nexport enum ProxyType {\n Unknown = \"unknown\",\n Shadowsocks = \"ss\",\n ShadowsocksR = \"ssr\",\n VMess = \"vmess\",\n VLESS = \"vless\",\n Trojan = \"trojan\",\n Snell = \"snell\",\n HTTP = \"http\",\n HTTPS = \"https\",\n SOCKS5 = \"socks5\",\n WireGuard = \"wireguard\",\n Hysteria = \"hysteria\",\n Hysteria2 = \"hysteria2\",\n TUIC = \"tuic\",\n AnyTLS = \"anytls\",\n}\n\n/** Human-readable name used by generators that prefix the remark. */\nexport function proxyTypeName(type: ProxyType): string {\n switch (type) {\n case ProxyType.Shadowsocks:\n return \"SS\";\n case ProxyType.ShadowsocksR:\n return \"SSR\";\n case ProxyType.VMess:\n return \"VMess\";\n case ProxyType.VLESS:\n return \"VLESS\";\n case ProxyType.Trojan:\n return \"Trojan\";\n case ProxyType.Snell:\n return \"Snell\";\n case ProxyType.HTTP:\n return \"HTTP\";\n case ProxyType.HTTPS:\n return \"HTTPS\";\n case ProxyType.SOCKS5:\n return \"SOCKS5\";\n case ProxyType.WireGuard:\n return \"WireGuard\";\n case ProxyType.Hysteria:\n return \"Hysteria\";\n case ProxyType.Hysteria2:\n return \"Hysteria2\";\n case ProxyType.TUIC:\n return \"TUIC\";\n case ProxyType.AnyTLS:\n return \"AnyTLS\";\n default:\n return \"Unknown\";\n }\n}\n\n/** Default provider group names, mirrored from the C++ `*_DEFAULT_GROUP`. */\nexport const DEFAULT_GROUPS = {\n anytls: \"AnyTLSProvider\",\n http: \"HTTPProvider\",\n hysteria: \"HysteriaProvider\",\n hysteria2: \"Hysteria2Provider\",\n snell: \"SnellProvider\",\n socks: \"SocksProvider\",\n ss: \"SSProvider\",\n ssr: \"SSRProvider\",\n trojan: \"TrojanProvider\",\n tuic: \"TUICProvider\",\n v2ray: \"V2RayProvider\",\n wireguard: \"WireGuardProvider\",\n} as const;\n\n/**\n * A single proxy node.\n *\n * The field set intentionally mirrors subconverter's `Proxy` struct so ports of\n * the C++ parsers/generators stay one-to-one and easy to audit.\n */\nexport interface Proxy {\n type: ProxyType;\n id: number;\n groupId: number;\n group: string;\n remark: string;\n hostname: string;\n port: number;\n\n username: string;\n password: string;\n encryptMethod: string;\n plugin: string;\n pluginOption: string;\n protocol: string;\n protocolParam: string;\n obfs: string;\n obfsParam: string;\n userId: string;\n alterId: number;\n transferProtocol: string;\n fakeType: string;\n tlsSecure: boolean;\n\n host: string;\n path: string;\n edge: string;\n\n /** VLESS `flow` control (e.g. `xtls-rprx-vision`). */\n flow: string;\n /** TUIC congestion control algorithm. */\n congestionControl: string;\n\n quicSecure: string;\n quicSecret: string;\n\n udp: TriBool;\n tcpFastOpen: TriBool;\n allowInsecure: TriBool;\n tls13: TriBool;\n\n underlyingProxy: string;\n\n snellVersion: number;\n serverName: string;\n\n selfIp: string;\n selfIpv6: string;\n publicKey: string;\n privateKey: string;\n preSharedKey: string;\n dnsServers: string[];\n mtu: number;\n allowedIps: string;\n keepAlive: number;\n testUrl: string;\n clientId: string;\n\n ports: string;\n up: string;\n upSpeed: number;\n down: string;\n downSpeed: number;\n authStr: string;\n sni: string;\n fingerprint: string;\n shortId: string;\n ca: string;\n caStr: string;\n recvWindowConn: number;\n recvWindow: number;\n disableMtuDiscovery: TriBool;\n hopInterval: number;\n alpn: string[];\n\n cwnd: number;\n}\n\n/** Create a proxy with subconverter's default field values. */\nexport function createProxy(): Proxy {\n return {\n allowedIps: \"0.0.0.0/0, ::/0\",\n allowInsecure: undefined,\n alpn: [],\n alterId: 0,\n authStr: \"\",\n ca: \"\",\n caStr: \"\",\n clientId: \"\",\n congestionControl: \"\",\n cwnd: 0,\n disableMtuDiscovery: undefined,\n dnsServers: [],\n down: \"\",\n downSpeed: 0,\n edge: \"\",\n encryptMethod: \"\",\n fakeType: \"\",\n fingerprint: \"\",\n flow: \"\",\n group: \"\",\n groupId: 0,\n hopInterval: 0,\n host: \"\",\n hostname: \"\",\n id: 0,\n keepAlive: 0,\n mtu: 0,\n obfs: \"\",\n obfsParam: \"\",\n password: \"\",\n path: \"\",\n plugin: \"\",\n pluginOption: \"\",\n port: 0,\n ports: \"\",\n preSharedKey: \"\",\n privateKey: \"\",\n protocol: \"\",\n protocolParam: \"\",\n publicKey: \"\",\n quicSecret: \"\",\n quicSecure: \"\",\n recvWindow: 0,\n recvWindowConn: 0,\n remark: \"\",\n selfIp: \"\",\n selfIpv6: \"\",\n serverName: \"\",\n shortId: \"\",\n snellVersion: 0,\n sni: \"\",\n tcpFastOpen: undefined,\n testUrl: \"\",\n tls13: undefined,\n tlsSecure: false,\n transferProtocol: \"\",\n type: ProxyType.Unknown,\n udp: undefined,\n underlyingProxy: \"\",\n up: \"\",\n upSpeed: 0,\n userId: \"\",\n username: \"\",\n };\n}\n","/** Ruleset source dialects, mirroring `ruleset_type` in ruleconvert.h. */\nexport enum RulesetType {\n Surge = \"surge\",\n QuantumultX = \"quanx\",\n ClashDomain = \"clash-domain\",\n ClashIpCidr = \"clash-ipcidr\",\n ClashClassical = \"clash-classical\",\n}\n\n/** One `ruleset=` entry resolved into a group + remote/local source. */\nexport interface RulesetConfig {\n group: string;\n url: string;\n interval: number;\n}\n\n/** A ruleset with its fetched content and resolved type. */\nexport interface RulesetContent {\n ruleGroup: string;\n rulePath: string;\n rulePathTyped: string;\n ruleType: RulesetType;\n content: string;\n updateInterval: number;\n}\n\n/** Create a ruleset config with subconverter's defaults. */\nexport function createRulesetConfig(): RulesetConfig {\n return { group: \"\", interval: 86400, url: \"\" };\n}\n","import type { Proxy } from \"./proxy\";\nimport type { ProxyGroupConfig } from \"./proxy-group\";\nimport type { RulesetConfig } from \"./ruleset\";\nimport type { TriBool } from \"./tribool\";\n\n/** Clash kernel flavor targeted by Clash output (`flavor=`). */\nexport type ClashFlavor = \"mihomo\" | \"premium\" | \"stash\";\n\n/**\n * Parse a `flavor=` value (case-insensitive); unknown values fall back to\n * `mihomo`, mirroring subconverter-rs `ClashFlavor::from_str`.\n */\nexport function parseClashFlavor(value: string | undefined | null): ClashFlavor {\n const normalized = (value ?? \"\").trim().toLowerCase();\n if (\n normalized === \"premium\" ||\n normalized === \"original\" ||\n normalized === \"classic\" ||\n normalized === \"clash\"\n ) {\n return \"premium\";\n }\n if (normalized === \"stash\") {\n return \"stash\";\n }\n return \"mihomo\";\n}\n\n/** A regex/script rewrite rule, mirroring `RegexMatchConfig`. */\nexport interface RegexMatchConfig {\n match: string;\n replace: string;\n script: string;\n}\n\n/** Target output formats. */\nexport enum TargetFormat {\n Clash = \"clash\",\n ClashR = \"clashr\",\n Surge = \"surge\",\n Surfboard = \"surfboard\",\n QuantumultX = \"quanx\",\n Quantumult = \"quan\",\n Loon = \"loon\",\n Mellow = \"mellow\",\n V2Ray = \"v2ray\",\n Trojan = \"trojan\",\n SSD = \"ssd\",\n SSC = \"ss\",\n SSSub = \"sssub\",\n SSR = \"ssr\",\n SingBox = \"singbox\",\n Mixed = \"mixed\",\n NodeList = \"nodelist\",\n Auto = \"auto\",\n}\n\n/** Per-run conversion settings, mirroring `extra_settings`. */\nexport interface ExtraSettings {\n enableRuleGenerator: boolean;\n overwriteOriginalRules: boolean;\n renameArray: RegexMatchConfig[];\n emojiArray: RegexMatchConfig[];\n /** Regex rewrites applied to node names before every other naming rule. */\n nameRegexArray: RegexMatchConfig[];\n /** Literal fragments stripped from node names before every other naming rule. */\n nameRemove: string[];\n addEmoji: boolean;\n removeEmoji: boolean;\n /** Prefix node names with the server's ISO country code when the name lacks one. */\n autoCountry: boolean;\n /**\n * Resolve a node's ISO 3166-1 alpha-2 country code. Platform-free: the Node\n * adapter supplies a GeoIP-backed lookup; browsers may supply their own.\n * Required by `autoCountry` and the country filters below.\n */\n countryResolver?: (node: Proxy) => string | undefined;\n /** Keep only nodes whose GeoIP country is in this ISO code list. */\n includeCountries: string[];\n /** Drop nodes whose GeoIP country is in this ISO code list. */\n excludeCountries: string[];\n /** Keep only nodes matching one of these remark rules (empty keeps all). */\n includeRemarks: string[];\n /** Drop nodes matching one of these remark rules. */\n excludeRemarks: string[];\n /** `false` keeps remote rulesets as `RULE-SET` references (Surge-family). */\n expandRulesets: boolean;\n appendProxyType: boolean;\n nodeList: boolean;\n sortFlag: boolean;\n filterDeprecated: boolean;\n clashNewFieldName: boolean;\n clashScript: boolean;\n clashClassicalRuleset: boolean;\n /** Target Clash kernel: dropped protocols/fields follow its capabilities. */\n clashFlavor: ClashFlavor;\n /** Template variables applied to `{{ var }}` placeholders in base configs. */\n templateVars: Record<string, string>;\n dedupe: boolean;\n surgeSsrPath: string;\n managedConfigPrefix: string;\n quanxDevId: string;\n udp: TriBool;\n tfo: TriBool;\n skipCertVerify: TriBool;\n tls13: TriBool;\n sortScript: string;\n clashProxiesStyle: string;\n clashProxyGroupsStyle: string;\n authorized: boolean;\n}\n\n/** Create `ExtraSettings` with subconverter's defaults. */\nexport function createExtraSettings(): ExtraSettings {\n return {\n addEmoji: false,\n appendProxyType: false,\n authorized: false,\n autoCountry: false,\n clashClassicalRuleset: false,\n clashFlavor: \"mihomo\",\n clashNewFieldName: true,\n clashProxiesStyle: \"flow\",\n clashProxyGroupsStyle: \"flow\",\n clashScript: false,\n countryResolver: undefined,\n dedupe: false,\n emojiArray: [],\n enableRuleGenerator: true,\n excludeCountries: [],\n excludeRemarks: [],\n expandRulesets: true,\n filterDeprecated: false,\n includeCountries: [],\n includeRemarks: [],\n managedConfigPrefix: \"\",\n nameRegexArray: [],\n nameRemove: [],\n nodeList: false,\n overwriteOriginalRules: true,\n quanxDevId: \"\",\n removeEmoji: false,\n renameArray: [],\n skipCertVerify: undefined,\n sortFlag: false,\n sortScript: \"\",\n surgeSsrPath: \"\",\n templateVars: {},\n tfo: undefined,\n tls13: undefined,\n udp: undefined,\n };\n}\n\n/** Structured request/config parameters used by the engine. */\nexport interface RequestSettings {\n target: TargetFormat;\n url: string;\n group: ProxyGroupConfig[];\n ruleset: RulesetConfig[];\n rename: RegexMatchConfig[];\n emoji: RegexMatchConfig[];\n /** Regex replacements applied to node names before renaming. */\n nameRegex: RegexMatchConfig[];\n /** Literal fragments removed from node names before renaming. */\n nameRemove: string[];\n includeRemarks: string[];\n excludeRemarks: string[];\n /** Keep only nodes whose GeoIP country is in this ISO code list. */\n includeCountries: string[];\n /** Drop nodes whose GeoIP country is in this ISO code list. */\n excludeCountries: string[];\n addEmoji: boolean;\n removeEmoji: boolean;\n autoCountry: boolean;\n appendType: boolean;\n nodeList: boolean;\n dedupe: boolean;\n sort: boolean;\n filterDeprecated: boolean;\n list: boolean;\n tfo: TriBool;\n udp: TriBool;\n scv: TriBool;\n tls13: TriBool;\n newFieldName: boolean;\n classicalRuleset: boolean;\n /** Target Clash kernel (`flavor=`): mihomo (default), premium, or stash. */\n clashFlavor: ClashFlavor;\n /** `false` keeps remote rulesets as `RULE-SET` references (Surge-family). */\n expand: boolean;\n /** Managed-config `strict=` flag for Surge-family `#!MANAGED-CONFIG`. */\n strict: boolean;\n /** Download filename override (`filename=`). */\n filename: string;\n /** Quantumult X device ID for remote-script signatures (`dev_id=`). */\n devId: string;\n insert: boolean;\n mixin: string;\n interval: number;\n script: string;\n clashScript: boolean;\n proxiesStyle: string;\n proxyGroupsStyle: string;\n autoExtract: boolean;\n uploadPath: string;\n /** Extra quota endpoint fetched server-side (`userinfo_url` / `userinfo-url`). */\n userinfoUrl: string;\n /** Converter for the quota endpoint (`jms` for Just-My-Socks, `subscription`, `auto`). */\n userinfoProvider: string;\n}\n","/**\n * A three-valued boolean mirroring subconverter's `tribool`.\n *\n * `undefined` means \"unspecified\" and callers decide whether to apply a\n * default; `true`/`false` are explicit overrides (e.g. from URL parameters).\n */\nexport type TriBool = boolean | undefined;\n\n/** Treat `undefined` as `false`. */\nexport function triBoolOr(value: TriBool, fallback: boolean): boolean {\n return value === undefined ? fallback : value;\n}\n\n/** Parse a loose string (e.g. `\"1\"`, `\"true\"`, `\"0\"`) into a {@link TriBool}. */\nexport function parseTriBool(value: string | undefined | null): TriBool {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n return undefined;\n}\n","const B64_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst B64_URLSAFE_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\nconst B64_LOOKUP: Record<string, number> = {};\nfor (let i = 0; i < B64_ALPHABET.length; i += 1) {\n B64_LOOKUP[B64_ALPHABET[i] as string] = i;\n}\nB64_LOOKUP[\"-\"] = 62;\nB64_LOOKUP[\"_\"] = 63;\n\n/** UTF-8 encode a string to bytes (browser + Node safe). */\nexport function utf8Encode(input: string): Uint8Array {\n return new TextEncoder().encode(input);\n}\n\n/** Decode UTF-8 bytes back to a string. */\nexport function utf8Decode(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes);\n}\n\nfunction encodeWithAlphabet(input: string, alphabet: string): string {\n const bytes = utf8Encode(input);\n let output = \"\";\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i] as number;\n const b1 = i + 1 < bytes.length ? (bytes[i + 1] as number) : 0;\n const b2 = i + 2 < bytes.length ? (bytes[i + 2] as number) : 0;\n const triple = (b0 << 16) | (b1 << 8) | b2;\n output += alphabet[(triple >> 18) & 0x3f];\n output += alphabet[(triple >> 12) & 0x3f];\n output += i + 1 < bytes.length ? alphabet[(triple >> 6) & 0x3f] : \"=\";\n output += i + 2 < bytes.length ? alphabet[triple & 0x3f] : \"=\";\n }\n return output;\n}\n\nfunction decodeBytes(input: string): Uint8Array {\n const normalized = input.replace(/\\s+/g, \"\");\n const clean = normalized.replace(/=+$/, \"\");\n const out: number[] = [];\n let buffer = 0;\n let bits = 0;\n for (const char of clean) {\n const value = B64_LOOKUP[char];\n if (value === undefined) {\n continue;\n }\n buffer = (buffer << 6) | value;\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n out.push((buffer >> bits) & 0xff);\n }\n }\n return Uint8Array.from(out);\n}\n\n/** Standard base64 encode (with padding). */\nexport function base64Encode(input: string): string {\n return encodeWithAlphabet(input, B64_ALPHABET);\n}\n\n/** URL-safe base64 encode without padding. */\nexport function urlSafeBase64Encode(input: string): string {\n return encodeWithAlphabet(input, B64_URLSAFE_ALPHABET).replace(/=+$/, \"\");\n}\n\n/** Standard base64 decode; tolerant of URL-safe input and missing padding. */\nexport function base64Decode(input: string): string {\n return utf8Decode(decodeBytes(input));\n}\n\n/** URL-safe base64 decode; alias of {@link base64Decode} (same tolerance). */\nexport function urlSafeBase64Decode(input: string): string {\n return base64Decode(input);\n}\n\n/**\n * Best-effort base64 decode used for subscription bodies: subconverter expects\n * a base64 blob but real-world providers sometimes serve plain text.\n */\nexport function tryBase64Decode(input: string): string {\n const trimmed = input.trim();\n if (trimmed === \"\") {\n return \"\";\n }\n if (!/^[A-Za-z0-9+/\\-_=\\s]+$/.test(trimmed)) {\n return input;\n }\n try {\n const decoded = base64Decode(trimmed);\n return decoded.includes(\"\\uFFFD\") ? input : decoded;\n } catch {\n return input;\n }\n}\n","export interface IniSection {\n name: string;\n items: Array<[string, string]>;\n}\n\nexport interface IniDocument {\n sections: IniSection[];\n /** Items appearing before the first section header. */\n isolated: Array<[string, string]>;\n}\n\nexport interface ParseIniOptions {\n /** Section name used to hold items that appear before the first header. */\n isolatedSection?: string;\n /** When false, empty-valued items are dropped. */\n keepEmptyValues?: boolean;\n /** Strip surrounding whitespace from keys and values. */\n trim?: boolean;\n}\n\n/**\n * Minimal INI reader mirroring the subset of `ini_reader` subconverter relies\n * on: case-preserving keys, duplicate sections, and isolated leading items.\n */\nexport function parseIni(content: string, options: ParseIniOptions = {}): IniDocument {\n const isolatedSection = options.isolatedSection ?? \"\";\n const keepEmptyValues = options.keepEmptyValues ?? false;\n const doTrim = options.trim ?? true;\n\n const sections: IniSection[] = [];\n const isolated: Array<[string, string]> = [];\n let current: IniSection | undefined;\n\n const lines = content.split(/\\r?\\n/);\n for (const rawLine of lines) {\n let line = rawLine;\n if (doTrim) {\n line = line.trim();\n }\n if (line === \"\") {\n continue;\n }\n if (line.startsWith(\"[\") && line.endsWith(\"]\")) {\n const name = line.slice(1, -1).trim();\n current = { items: [], name };\n sections.push(current);\n continue;\n }\n const eq = line.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n const key = doTrim ? line.slice(0, eq).trim() : line.slice(0, eq);\n const value = doTrim ? line.slice(eq + 1).trim() : line.slice(eq + 1);\n if (value === \"\" && !keepEmptyValues) {\n continue;\n }\n const pair: [string, string] = [key, value];\n if (current) {\n current.items.push(pair);\n } else {\n isolated.push(pair);\n }\n }\n\n if (isolated.length > 0 && isolatedSection !== \"\") {\n sections.unshift({ items: isolated, name: isolatedSection });\n }\n\n return { isolated, sections };\n}\n\n/** Return the first section with `name`, if any. */\nexport function findSection(doc: IniDocument, name: string): IniSection | undefined {\n return doc.sections.find((section) => section.name === name);\n}\n\n/** Return every item of every section named `name`, in document order. */\nexport function getSectionItems(doc: IniDocument, name: string): Array<[string, string]> {\n const items: Array<[string, string]> = [];\n for (const section of doc.sections) {\n if (section.name === name) {\n items.push(...section.items);\n }\n }\n return items;\n}\n\n/** A raw INI section: a header name and its untouched lines. */\nexport interface RawIniSection {\n name: string;\n lines: string[];\n}\n\n/** Split text into ordered raw sections, preserving line content. */\nexport function parseRawIni(content: string): RawIniSection[] {\n const sections: RawIniSection[] = [];\n let current: RawIniSection | undefined;\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.replace(/\\s+$/, \"\");\n const header = /^\\[(.*)\\]$/.exec(line.trim());\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line.trim() === \"\") {\n continue;\n }\n if (current) {\n current.lines.push(line);\n }\n }\n return sections;\n}\n\n/** Render raw sections back into INI text with blank lines between sections. */\nexport function renderRawIni(sections: RawIniSection[]): string {\n const out: string[] = [];\n for (const section of sections) {\n out.push(`[${section.name}]`);\n out.push(...section.lines);\n out.push(\"\");\n }\n return `${out.join(\"\\n\").trimEnd()}\\n`;\n}\n\n/** Insert or replace a named raw section, keeping its position when present. */\nexport function setRawSection(sections: RawIniSection[], name: string, lines: string[]): void {\n const existing = sections.find((section) => section.name === name);\n if (existing) {\n existing.lines = lines;\n return;\n }\n sections.push({ lines, name });\n}\n","/** Trim ASCII whitespace from both ends. */\nexport function trim(input: string): string {\n return input.replace(/^\\s+|\\s+$/g, \"\");\n}\n\n/** Trim and lowercase. */\nexport function trimLowerCase(input: string): string {\n return trim(input).toLowerCase();\n}\n\n/** Parse the leading integer of a string; `0` when none is present. */\nexport function toInt(value: string | number | undefined | null): number {\n if (value === undefined || value === null) {\n return 0;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? Math.trunc(value) : 0;\n }\n const match = /[+-]?\\d+/.exec(value);\n if (!match) {\n return 0;\n }\n const parsed = Number.parseInt(match[0], 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n\n/** Parse a boolean-ish value (\"true\"/\"yes\"/\"1\"/\"on\" and the matching negatives). */\nexport function toBool(value: string | undefined | null): boolean {\n if (value === undefined || value === null) {\n return false;\n }\n const normalized = value.trim().toLowerCase();\n return normalized === \"true\" || normalized === \"1\" || normalized === \"yes\" || normalized === \"on\";\n}\n\n/** `true` when `needle` occurs in `haystack`. */\nexport function strFind(haystack: string, needle: string): boolean {\n return haystack.includes(needle);\n}\n\n/** `true` when `input` starts with `prefix`. */\nexport function startsWith(input: string, prefix: string): boolean {\n return input.startsWith(prefix);\n}\n\n/** Count non-overlapping occurrences of `needle` in `haystack`. */\nexport function countOccurrences(haystack: string, needle: string): number {\n if (needle === \"\") {\n return 0;\n }\n let count = 0;\n let index = haystack.indexOf(needle);\n while (index !== -1) {\n count += 1;\n index = haystack.indexOf(needle, index + needle.length);\n }\n return count;\n}\n\n/** Split a string on a literal delimiter, dropping trailing empties when asked. */\nexport function split(input: string, delimiter: string, removeEmpty = false): string[] {\n const parts = input.split(delimiter);\n return removeEmpty ? parts.filter((part) => part !== \"\") : parts;\n}\n\n/**\n * Replace every regex match, mirroring subconverter's `regReplace`.\n * An empty `replacement` removes the matches.\n */\nexport function regReplace(input: string, pattern: string, replacement = \"\"): string {\n return input.replace(new RegExp(pattern, \"g\"), replacement);\n}\n\n/** `true` when `pattern` (a JS regex source) matches anywhere in `input`. */\nexport function regMatch(input: string, pattern: string): boolean {\n return new RegExp(pattern).test(input);\n}\n\n/**\n * Replace distinct consecutive occurrences of `from` with `to`.\n * Kept for API parity; equivalent to a global literal replace.\n */\nexport function replaceAllDistinct(input: string, from: string, to: string): string {\n if (from === \"\") {\n return input;\n }\n return input.split(from).join(to);\n}\n\n/** `true` when the string is a dotted-quad IPv4 literal. */\nexport function isIpv4(input: string): boolean {\n const parts = input.split(\".\");\n if (parts.length !== 4) {\n return false;\n }\n return parts.every((part) => /^\\d{1,3}$/.test(part) && Number(part) <= 255);\n}\n\n/** `true` when the string is a bracketed/unbracketed IPv6 literal. */\nexport function isIpv6(input: string): boolean {\n return /^\\[?[0-9A-Fa-f:]{2,}\\]?$/.test(input) && input.includes(\":\");\n}\n\n/** `true` when the host is an IP literal (v4 or v6). */\nexport function isIp(input: string): boolean {\n return isIpv4(input) || isIpv6(input);\n}\n\n/** Pad a value to two digits. */\nexport function pad2(value: number): string {\n return value < 10 ? `0${value}` : String(value);\n}\n\n/** `true` when the string is empty or only whitespace. */\nexport function isBlank(input: string | undefined | null): boolean {\n return input === undefined || input === null || trim(input) === \"\";\n}\n","/** Percent-decode a URL component, tolerating malformed sequences. */\nexport function urlDecode(input: string): string {\n try {\n return decodeURIComponent(input);\n } catch {\n return input.replace(/%([0-9A-Fa-f]{2})/g, (_, hex: string) =>\n String.fromCharCode(Number.parseInt(hex, 16)),\n );\n }\n}\n\n/** Percent-encode a URL component (RFC 3986 unreserved kept intact). */\nexport function urlEncode(input: string): string {\n return encodeURIComponent(input).replace(\n /[!'()*]/g,\n (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n}\n\n/** Normalize a query key: case-insensitive with `_`/`-` equivalent. */\nexport function normalizeQueryKey(key: string): string {\n return key.toLowerCase().replace(/_/g, \"-\");\n}\n\n/**\n * Read every occurrence of a parameter from a query string in document\n * order (case-insensitive key with `_`/`-` equivalent, each value\n * percent-decoded, `+` preserved).\n * Shared by `getUrlArg` and server-side repeatable params (`url`, `group`,\n * `ruleset`) so both entrypoints decode identically.\n */\nexport function getAllUrlArgs(query: string, key: string): string[] {\n if (query === \"\") {\n return [];\n }\n // Tolerate full links (`tg://socks?server=...`, `vless://...?type=...`):\n // strip any fragment and everything up to the first `?` so the first\n // parameter is not swallowed by the scheme prefix.\n const hashCut = query.split(\"#\", 1)[0] as string;\n const qIndex = hashCut.indexOf(\"?\");\n const rawQuery = qIndex >= 0 ? hashCut.slice(qIndex + 1) : hashCut;\n const normalized = rawQuery.startsWith(\"?\") ? rawQuery.slice(1) : rawQuery;\n const values: string[] = [];\n const target = normalizeQueryKey(key);\n for (const part of normalized.split(\"&\")) {\n if (part === \"\") {\n continue;\n }\n const eq = part.indexOf(\"=\");\n const rawKey = eq >= 0 ? part.slice(0, eq) : part;\n // Keys are rarely encoded, but decode before normalizing so\n // `add%5Femoji` matches `add_emoji` like values already do.\n if (normalizeQueryKey(urlDecode(rawKey)) !== target) {\n continue;\n }\n values.push(urlDecode(eq >= 0 ? part.slice(eq + 1) : \"\"));\n }\n return values;\n}\n\n/**\n * Read a parameter from a query string, mirroring subconverter's\n * `getUrlArg` (last occurrence wins, value percent-decoded).\n */\nexport function getUrlArg(query: string, key: string): string {\n const values = getAllUrlArgs(query, key);\n return values.length > 0 ? (values[values.length - 1] as string).trim() : \"\";\n}\n\n/** Split a URL into its scheme/authority-specific parts without a URL parser. */\nexport function splitUrl(raw: string): { base: string; query: string } {\n const hashIndex = raw.indexOf(\"#\");\n const withoutHash = hashIndex >= 0 ? raw.slice(0, hashIndex) : raw;\n const queryIndex = withoutHash.indexOf(\"?\");\n if (queryIndex < 0) {\n return { base: withoutHash, query: \"\" };\n }\n return { base: withoutHash.slice(0, queryIndex), query: withoutHash.slice(queryIndex + 1) };\n}\n\n/** Strip a scheme prefix (e.g. `ss://`) from a link. */\nexport function stripScheme(link: string): string {\n const index = link.indexOf(\"://\");\n return index >= 0 ? link.slice(index + 3) : link;\n}\n","/**\n * FNV-1a 64-bit hash, matching subconverter's `hash_` (used for WireGuard\n * section names and other deterministic identifiers).\n */\nexport function fnv1a64(input: string): bigint {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n for (const char of input) {\n hash ^= BigInt(char.codePointAt(0) as number);\n hash = BigInt.asUintN(64, hash * prime);\n }\n return hash;\n}\n\n/** Lowercase hex representation of {@link fnv1a64}. */\nexport function fnv1a64Hex(input: string): string {\n return fnv1a64(input).toString(16);\n}\n","/** A flat map of template variables (dotted keys are allowed, e.g. `clash.dns.port`). */\nexport type TemplateVars = Record<string, string>;\n\nconst INTERPOLATION = /\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g;\n\n/**\n * Interpolate `{{ name }}` placeholders in a template body.\n *\n * This is a pragmatic subset of subconverter's template engine: variables come\n * from the `[template]` section of an external config (or the `template` config\n * block). Unknown variables resolve to an empty string, matching the engine's\n * \"undefined variable\" behavior.\n */\nexport function renderTemplate(content: string, vars: TemplateVars): string {\n return content.replace(INTERPOLATION, (_match, name: string) => vars[name] ?? \"\");\n}\n\n/** `true` when the content contains any `{{ ... }}` placeholder. */\nexport function hasTemplatePlaceholders(content: string): boolean {\n INTERPOLATION.lastIndex = 0;\n return INTERPOLATION.test(content);\n}\n\n/** Collect the variable names referenced by a template body. */\nexport function templateVariableNames(content: string): string[] {\n const names = new Set<string>();\n for (const match of content.matchAll(INTERPOLATION)) {\n names.add(match[1] as string);\n }\n return [...names];\n}\n","import type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport { BalanceStrategy, ProxyGroupType } from \"../types/proxy-group\";\nimport type { RulesetConfig } from \"../types/ruleset\";\nimport { RulesetType } from \"../types/ruleset\";\nimport type { RegexMatchConfig } from \"../types/settings\";\nimport { parseIni } from \"../utils/ini\";\nimport { startsWith, toInt } from \"../utils/string\";\n\n/** `ruleset=` dialect prefixes (`surge:`, `quanx:`, `clash-domain:`, …). */\nexport const RULESET_TYPE_PREFIXES: ReadonlyArray<readonly [string, RulesetType]> = [\n [\"surge:\", RulesetType.Surge],\n [\"quanx:\", RulesetType.QuantumultX],\n [\"quantumultx:\", RulesetType.QuantumultX],\n [\"clash-domain:\", RulesetType.ClashDomain],\n [\"clash-ipcidr:\", RulesetType.ClashIpCidr],\n [\"clash-classic:\", RulesetType.ClashClassical],\n [\"clash:\", RulesetType.ClashClassical],\n];\n\n/** Split a ruleset source into its dialect prefix plus the bare URL/content. */\nexport function parseRulesetSource(source: string): { url: string; type?: RulesetType } {\n for (const [prefix, type] of RULESET_TYPE_PREFIXES) {\n if (source.toLowerCase().startsWith(prefix)) {\n return { type, url: source.slice(prefix.length) };\n }\n }\n return { url: source };\n}\n\n/** A parsed subconverter external configuration file. */\nexport interface ExternalConfig {\n groups: ProxyGroupConfig[];\n rulesets: RulesetConfig[];\n rename: RegexMatchConfig[];\n emoji: RegexMatchConfig[];\n nameRegex: RegexMatchConfig[];\n nameRemove: string[];\n includeRemarks: string[];\n excludeRemarks: string[];\n includeCountries: string[];\n excludeCountries: string[];\n addEmoji: boolean;\n removeEmoji: boolean;\n autoCountry: boolean;\n enableRuleGenerator: boolean;\n overwriteOriginalRules: boolean;\n baseFiles: Record<string, string>;\n templatePath: string;\n templateVars: Record<string, string>;\n}\n\nconst GROUP_TYPE_MAP: Record<string, ProxyGroupType> = {\n fallback: ProxyGroupType.Fallback,\n \"load-balance\": ProxyGroupType.LoadBalance,\n relay: ProxyGroupType.Relay,\n select: ProxyGroupType.Select,\n smart: ProxyGroupType.Smart,\n ssid: ProxyGroupType.SSID,\n \"url-test\": ProxyGroupType.URLTest,\n};\n\n/** Parse `interval[,timeout[,tolerance]]`, mirroring `parseGroupTimes`. */\nexport function parseGroupTimes(src: string): {\n interval: number;\n timeout: number;\n tolerance: number;\n} {\n const [interval = \"\", timeout = \"\", tolerance = \"\"] = src.split(\",\");\n return {\n interval: toInt(interval),\n timeout: toInt(timeout),\n tolerance: toInt(tolerance),\n };\n}\n\n/** Parse a `name`type`rule...` INI proxy-group definition. */\nexport function parseCustomProxyGroup(value: string): ProxyGroupConfig | undefined {\n const parts = value.split(\"`\");\n if (parts.length < 3) {\n return undefined;\n }\n const name = parts[0] as string;\n const typeName = parts[1] as string;\n const type = GROUP_TYPE_MAP[typeName];\n if (type === undefined) {\n return undefined;\n }\n const group: ProxyGroupConfig = {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name,\n persistent: undefined,\n proxies: [],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 5,\n tolerance: 0,\n type,\n url: \"\",\n usingProvider: [],\n };\n let upperBound = parts.length;\n if (\n type === ProxyGroupType.URLTest ||\n type === ProxyGroupType.LoadBalance ||\n type === ProxyGroupType.Fallback\n ) {\n if (upperBound < 5) {\n return undefined;\n }\n upperBound -= 2;\n group.url = parts[upperBound] as string;\n const times = parseGroupTimes(parts[upperBound + 1] as string);\n group.interval = times.interval;\n group.timeout = times.timeout;\n group.tolerance = times.tolerance;\n }\n for (let i = 2; i < upperBound; i += 1) {\n const rule = parts[i] as string;\n if (startsWith(rule, \"!!PROVIDER=\")) {\n group.usingProvider.push(...rule.slice(11).split(\",\"));\n } else {\n group.proxies.push(rule);\n }\n }\n return group;\n}\n\n/** Parse a `group,url[,interval]` or `group,[]RULE` INI ruleset definition. */\nexport function parseRulesetConfig(value: string): RulesetConfig | undefined {\n const pos = value.indexOf(\",\");\n if (pos === -1) {\n return undefined;\n }\n const group = value.slice(0, pos);\n const config: RulesetConfig = { group, interval: 86400, url: \"\" };\n if (value.slice(pos + 1, pos + 3) === \"[]\") {\n config.url = value.slice(pos + 1);\n return config;\n }\n const endPos = value.lastIndexOf(\",\");\n if (endPos !== pos) {\n config.interval = toInt(value.slice(endPos + 1));\n config.url = value.slice(pos + 1, endPos);\n } else {\n config.url = value.slice(pos + 1);\n }\n return config;\n}\n\n/** Parse a rename/emoji rule using a delimiter (mirrors `from_ini`). */\nexport function parseRegexMatch(value: string, delimiter: string): RegexMatchConfig {\n if (startsWith(value, \"script:\")) {\n return { match: \"\", replace: \"\", script: value.slice(7) };\n }\n const pos = value.lastIndexOf(delimiter);\n const match = pos === -1 ? value : value.slice(0, pos);\n const replace = pos !== -1 && pos < value.length - 1 ? value.slice(pos + 1) : \"\";\n return { match, replace, script: \"\" };\n}\n\n/** Parse a subconverter external configuration file. */\nexport function parseExternalConfig(content: string): ExternalConfig {\n const result: ExternalConfig = {\n addEmoji: false,\n autoCountry: false,\n baseFiles: {},\n emoji: [],\n enableRuleGenerator: true,\n excludeCountries: [],\n excludeRemarks: [],\n groups: [],\n includeCountries: [],\n includeRemarks: [],\n nameRegex: [],\n nameRemove: [],\n overwriteOriginalRules: true,\n removeEmoji: false,\n rename: [],\n rulesets: [],\n templatePath: \"\",\n templateVars: {},\n };\n\n const doc = parseIni(content, { keepEmptyValues: true });\n for (const section of doc.sections) {\n if (section.name.toLowerCase() !== \"template\") {\n continue;\n }\n for (const [key, value] of section.items) {\n if (key.toLowerCase() === \"template_path\") {\n result.templatePath = value;\n } else {\n result.templateVars[key] = value;\n }\n }\n }\n const relevant = doc.sections.filter((section) => section.name.toLowerCase() === \"custom\");\n const sections = relevant.length > 0 ? relevant : [{ items: [...doc.isolated], name: \"custom\" }];\n\n for (const section of sections) {\n for (const [keyRaw, value] of section.items) {\n const key = keyRaw.toLowerCase();\n switch (key) {\n case \"ruleset\": {\n const parsed = parseRulesetConfig(value);\n if (parsed) {\n result.rulesets.push(parsed);\n }\n break;\n }\n case \"custom_proxy_group\": {\n const parsed = parseCustomProxyGroup(value);\n if (parsed) {\n result.groups.push(parsed);\n }\n break;\n }\n case \"rename\":\n case \"rename_node\":\n result.rename.push(parseRegexMatch(value, \"@\"));\n break;\n case \"name_regex\":\n result.nameRegex.push(parseRegexMatch(value, \"@\"));\n break;\n case \"name_remove\":\n for (const fragment of value.split(\",\")) {\n const trimmed = fragment.trim();\n if (trimmed !== \"\") {\n result.nameRemove.push(trimmed);\n }\n }\n break;\n case \"emoji\":\n case \"emojis\":\n result.emoji.push(parseRegexMatch(value, \",\"));\n break;\n case \"include_remarks\":\n case \"include\":\n if (value !== \"\") {\n result.includeRemarks.push(value);\n }\n break;\n case \"include_country\":\n for (const fragment of value.split(\",\")) {\n const trimmed = fragment.trim().toUpperCase();\n if (trimmed !== \"\") {\n result.includeCountries.push(trimmed);\n }\n }\n break;\n case \"exclude_country\":\n for (const fragment of value.split(\",\")) {\n const trimmed = fragment.trim().toUpperCase();\n if (trimmed !== \"\") {\n result.excludeCountries.push(trimmed);\n }\n }\n break;\n case \"exclude_remarks\":\n case \"exclude\":\n if (value !== \"\") {\n result.excludeRemarks.push(value);\n }\n break;\n case \"add_emoji\":\n result.addEmoji = value.toLowerCase() === \"true\";\n break;\n case \"auto_country\":\n case \"country\":\n result.autoCountry = value.toLowerCase() === \"true\";\n break;\n case \"remove_old_emoji\":\n case \"remove_emoji\":\n result.removeEmoji = value.toLowerCase() === \"true\";\n break;\n case \"enable_rule_generator\":\n result.enableRuleGenerator = value.toLowerCase() !== \"false\";\n break;\n case \"overwrite_original_rules\":\n result.overwriteOriginalRules = value.toLowerCase() !== \"false\";\n break;\n default:\n if (key.endsWith(\"_rule_base\")) {\n result.baseFiles[key] = value;\n }\n break;\n }\n }\n }\n return result;\n}\n","import { parseRegexMatch } from \"./config\";\nimport type { RequestSettings } from \"../types/settings\";\nimport { parseClashFlavor } from \"../types/settings\";\nimport { TargetFormat } from \"../types/settings\";\nimport { parseTriBool, type TriBool } from \"../types/tribool\";\nimport { toInt } from \"../utils/string\";\nimport { getAllUrlArgs, getUrlArg } from \"../utils/url\";\n\nconst TARGETS = new Set<string>(Object.values(TargetFormat));\n\n/**\n * `true` when `key` appears anywhere in the query string (`_`/`-`\n * equivalent). Delegates to `getAllUrlArgs` so presence checks share the\n * exact same decoding/precedence as value reads.\n */\nfunction hasArg(query: string, key: string): boolean {\n return getAllUrlArgs(query, key).length > 0;\n}\n\nfunction boolArg(query: string, key: string): boolean {\n // A missing key means `false`; a bare `?flag` (no value) means `true`.\n if (!hasArg(query, key)) {\n return false;\n }\n const value = getUrlArg(query, key).toLowerCase();\n return value === \"true\" || value === \"1\" || value === \"\";\n}\n\nfunction triArg(query: string, key: string): TriBool {\n const value = getUrlArg(query, key);\n return value === \"\" ? undefined : parseTriBool(value);\n}\n\nfunction listArg(query: string, key: string): string[] {\n const value = getUrlArg(query, key);\n return value === \"\" ? [] : value.split(\",\");\n}\n\n/** Repeatable comma-separated ISO country codes, normalized to uppercase. */\nfunction countryListArg(query: string, key: string): string[] {\n return getAllUrlArgs(query, key)\n .flatMap((raw) => raw.split(\",\"))\n .map((raw) => raw.trim().toUpperCase())\n .filter((raw) => raw !== \"\");\n}\n\n/**\n * Resolve the Clash field-name style. Defaults to the new `proxies` /\n * `proxy-groups` / `rules` keys; `legacy=true` (or an explicit\n * `new_name=false` / `new_field_name=false`) opts back into the legacy\n * `Proxy` / `Proxy Group` / `Rule` keys.\n *\n * Exported so the CLI reuses the exact same semantics instead of\n * maintaining a divergent copy.\n */\nexport function resolveNewFieldName(query: string): boolean {\n if (\n boolArg(query, \"legacy\") ||\n boolArg(query, \"legacy_field_name\") ||\n boolArg(query, \"legacy-field-name\")\n ) {\n return false;\n }\n if (\n hasArg(query, \"new_name\") ||\n hasArg(query, \"new_field_name\") ||\n hasArg(query, \"new-name\") ||\n hasArg(query, \"new-field-name\")\n ) {\n return (\n boolArg(query, \"new_name\") ||\n boolArg(query, \"new_field_name\") ||\n boolArg(query, \"new-name\") ||\n boolArg(query, \"new-field-name\")\n );\n }\n return true;\n}\n\n/** Read the first non-empty value across underscore/hyphen aliases. */\nfunction firstArg(query: string, ...keys: string[]): string {\n for (const key of keys) {\n const value = getUrlArg(query, key);\n if (value !== \"\") {\n return value;\n }\n }\n return \"\";\n}\n\n/**\n * Read a boolean flag across aliases. Returns `undefined` when no alias is\n * present; otherwise `true` when any occurrence is `true`/`1`/bare.\n * Shared by server-side flags (`dedupe`, `sort`, `no_rules`, …) so they\n * share one presence/OR semantic instead of per-callsite copies.\n */\nexport function queryBoolFlag(query: string, ...keys: string[]): boolean | undefined {\n let found = false;\n let result = false;\n for (const key of keys) {\n for (const raw of getAllUrlArgs(query, key)) {\n found = true;\n const normalized = raw.trim().toLowerCase();\n if (normalized === \"\" || normalized === \"true\" || normalized === \"1\") {\n result = true;\n }\n }\n }\n return found ? result : undefined;\n}\n\n/** Base {@link RequestSettings} with subconverter's defaults. */\nexport function createRequestSettings(): RequestSettings {\n return {\n addEmoji: false,\n appendType: false,\n autoCountry: false,\n autoExtract: false,\n clashFlavor: \"mihomo\",\n clashScript: false,\n classicalRuleset: false,\n dedupe: false,\n devId: \"\",\n emoji: [],\n excludeCountries: [],\n excludeRemarks: [],\n expand: true,\n filename: \"\",\n filterDeprecated: false,\n group: [],\n includeCountries: [],\n includeRemarks: [],\n insert: false,\n interval: 0,\n list: false,\n mixin: \"\",\n nameRegex: [],\n nameRemove: [],\n newFieldName: true,\n nodeList: false,\n proxiesStyle: \"flow\",\n proxyGroupsStyle: \"flow\",\n removeEmoji: false,\n rename: [],\n ruleset: [],\n script: \"\",\n scv: undefined,\n sort: false,\n strict: false,\n target: TargetFormat.Auto,\n tfo: undefined,\n tls13: undefined,\n udp: undefined,\n uploadPath: \"\",\n url: \"\",\n userinfoProvider: \"\",\n userinfoUrl: \"\",\n };\n}\n\n/** Parse a request query string into {@link RequestSettings}. */\nexport function parseRequestSettings(query: string): RequestSettings {\n const settings = createRequestSettings();\n const target = getUrlArg(query, \"target\");\n if (TARGETS.has(target)) {\n settings.target = target as TargetFormat;\n }\n settings.url = getUrlArg(query, \"url\");\n settings.list = boolArg(query, \"list\");\n settings.nodeList = settings.list;\n // `sort_flag`/`sort-flag` are accepted alongside `sort` to match the\n // server-side `toExtraSettings` aliases (normalization alone cannot map\n // `sort` <-> `sort_flag` since they differ beyond `_`/`-`).\n settings.sort = queryBoolFlag(query, \"sort\", \"sort_flag\", \"sort-flag\") ?? false;\n settings.dedupe = queryBoolFlag(query, \"dedupe\", \"deduplicate\") ?? false;\n settings.addEmoji = boolArg(query, \"add_emoji\");\n settings.removeEmoji = boolArg(query, \"remove_emoji\");\n settings.autoCountry = boolArg(query, \"auto_country\");\n settings.appendType = boolArg(query, \"append_type\");\n settings.filterDeprecated = boolArg(query, \"filter_deprecated\");\n settings.newFieldName = resolveNewFieldName(query);\n settings.classicalRuleset = boolArg(query, \"classical\");\n settings.clashFlavor = parseClashFlavor(firstArg(query, \"flavor\"));\n settings.expand = queryBoolFlag(query, \"expand\") ?? true;\n settings.strict = boolArg(query, \"strict\");\n settings.filename = firstArg(query, \"filename\");\n settings.devId = firstArg(query, \"dev_id\", \"dev-id\", \"device_id\", \"device-id\");\n settings.insert = getUrlArg(query, \"insert\") !== \"\";\n settings.clashScript = boolArg(query, \"clash_script\");\n settings.autoExtract = boolArg(query, \"auto_extract\");\n settings.tfo = triArg(query, \"tfo\");\n settings.udp = triArg(query, \"udp\");\n settings.scv = triArg(query, \"scv\");\n settings.tls13 = triArg(query, \"tls13\");\n settings.interval = toInt(getUrlArg(query, \"interval\"));\n settings.script = getUrlArg(query, \"script\");\n settings.mixin = getUrlArg(query, \"mixin\");\n settings.uploadPath = getUrlArg(query, \"upload_path\");\n settings.proxiesStyle = getUrlArg(query, \"proxies_style\") || \"flow\";\n settings.proxyGroupsStyle = getUrlArg(query, \"proxy_groups_style\") || \"flow\";\n settings.includeRemarks = listArg(query, \"include\");\n settings.excludeRemarks = listArg(query, \"exclude\");\n settings.includeCountries = countryListArg(query, \"include_country\");\n settings.excludeCountries = countryListArg(query, \"exclude_country\");\n settings.userinfoUrl = firstArg(query, \"userinfo_url\", \"userinfo-url\", \"userinfo\");\n settings.userinfoProvider = firstArg(\n query,\n \"userinfo_provider\",\n \"userinfo-provider\",\n \"userinfo_type\",\n \"userinfo-type\",\n );\n const renameRaw = getUrlArg(query, \"rename\");\n if (renameRaw !== \"\") {\n settings.rename = [parseRegexMatch(renameRaw, \"@\")];\n }\n // `name_regex` accepts the same `match@replacement` form as `rename` and may\n // be repeated; `name_remove` takes a comma-separated list of literals.\n settings.nameRegex = getAllUrlArgs(query, \"name_regex\")\n .flatMap((raw) => raw.split(\"\\n\"))\n .map((raw) => raw.trim())\n .filter((raw) => raw !== \"\")\n .map((raw) => parseRegexMatch(raw, \"@\"));\n settings.nameRemove = getAllUrlArgs(query, \"name_remove\")\n .flatMap((raw) => raw.split(\",\"))\n .map((raw) => raw.trim())\n .filter((raw) => raw !== \"\");\n const emojiRaw = getUrlArg(query, \"emoji\");\n if (emojiRaw !== \"\") {\n settings.emoji = [parseRegexMatch(emojiRaw, \",\")];\n }\n return settings;\n}\n","import { toInt } from \"./utils/string\";\n\n/** Normalized traffic counters for a `subscription-userinfo` header. */\nexport interface UserinfoData {\n /** Downloaded bytes. */\n download: number;\n /** Expiration as a unix timestamp in seconds (`0` when unknown). */\n expire: number;\n /** Total monthly bytes (`0` when unknown/unlimited). */\n total: number;\n /** Uploaded bytes. */\n upload: number;\n}\n\n/** Raw Just-My-Socks API payload (`bw_counter_b`, `monthly_bw_limit_b`, ...). */\nexport interface JmsUserinfoPayload {\n bwCounterB?: number | string;\n bwResetDayOfMonth?: number | string;\n monthlyBwLimitB?: number | string;\n}\n\n/** Supported `userinfo_provider` values for `/sub?userinfo_url=...`. */\nexport type UserinfoProvider = \"auto\" | \"jms\" | \"subscription\";\n\nconst PROVIDER_ALIASES: Record<string, UserinfoProvider> = {\n auto: \"auto\",\n clash: \"subscription\",\n jms: \"jms\",\n \"just-my-socks\": \"jms\",\n justmysocks: \"jms\",\n raw: \"subscription\",\n sub: \"subscription\",\n subscription: \"subscription\",\n \"subscription-userinfo\": \"subscription\",\n};\n\n/** Normalize a provider name (`JMS`, `justMySocks`, ...); unknown falls back to `auto`. */\nexport function normalizeUserinfoProvider(provider: string | undefined | null): UserinfoProvider {\n if (!provider) {\n return \"auto\";\n }\n const key = provider.trim().toLowerCase().replace(/_/g, \"-\");\n return PROVIDER_ALIASES[key] ?? \"auto\";\n}\n\n/**\n * Guess the quota provider from a `userinfo_url` when the caller did not pass\n * one explicitly. Just-My-Socks quota endpoints (`justmysocks*`,\n * `jmssub*`, `getbwcounter*`) use the JMS JSON shape; anything else yields\n * `undefined` (no suitable provider — the caller must skip conversion\n * instead of guessing).\n */\nexport function inferUserinfoProviderFromUrl(url: string): UserinfoProvider | undefined {\n const squished = url.trim().toLowerCase().replace(/[-_]/g, \"\");\n if (\n squished.includes(\"justmysocks\") ||\n squished.includes(\"jmssub\") ||\n squished.includes(\"getbwcounter\")\n ) {\n return \"jms\";\n }\n return undefined;\n}\n\n/** Clamp a value to a non-negative safe integer. */\nfunction toNonNegativeNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return Number.isFinite(value) && value > 0 ? Math.trunc(value) : 0;\n }\n if (typeof value === \"string\") {\n const parsed = toInt(value);\n return parsed > 0 ? parsed : 0;\n }\n return 0;\n}\n\n/** Days in a UTC month (`month` is 0-based). */\nfunction daysInUtcMonth(year: number, month: number): number {\n return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n}\n\n/**\n * JMS bills quota in decimal GB (1 GB = 1000^3 bytes) while Clash clients\n * render `subscription-userinfo` with 1024^3, which would show 500 GB as\n * ~466 GiB. Scale decimal bytes to binary bytes so clients display the\n * advertised GB. `expire` (a timestamp) is never scaled.\n */\nconst DECIMAL_TO_BINARY = 1024 ** 3 / 1000 ** 3;\n\nfunction scaleDecimalBytes(value: number): number {\n return Math.round(value * DECIMAL_TO_BINARY);\n}\n\n/** Scale every byte counter of normalized quota data (decimal -> binary). */\nfunction scaleUserinfoDecimal(data: UserinfoData): UserinfoData {\n return {\n download: scaleDecimalBytes(data.download),\n expire: data.expire,\n total: scaleDecimalBytes(data.total),\n upload: scaleDecimalBytes(data.upload),\n };\n}\n\n/**\n * Compute the next reset timestamp (unix seconds, UTC midnight) for a\n * monthly reset day, mirroring how providers reset quotas on a fixed\n * day-of-month. Returns `0` when the reset day is invalid.\n */\nexport function nextMonthlyResetTimestamp(resetDay: number, nowSec?: number): number {\n const day = Math.trunc(resetDay);\n if (!Number.isFinite(day) || day < 1 || day > 31) {\n return 0;\n }\n const now = nowSec && nowSec > 0 ? Math.trunc(nowSec) : Math.trunc(Date.now() / 1000);\n const current = new Date(now * 1000);\n const year = current.getUTCFullYear();\n const month = current.getUTCMonth();\n const today = current.getUTCDate();\n const useCurrentMonth = today < day;\n const targetYear = useCurrentMonth ? year : month === 11 ? year + 1 : year;\n const targetMonth = useCurrentMonth ? month : (month + 1) % 12;\n const clampedDay = Math.min(day, daysInUtcMonth(targetYear, targetMonth));\n return Math.trunc(Date.UTC(targetYear, targetMonth, clampedDay) / 1000);\n}\n\n/** Parse a Just-My-Socks JSON payload into normalized counters. */\nexport function parseJmsUserinfo(raw: string, nowSec?: number): UserinfoData | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return undefined;\n }\n const record = parsed as Record<string, unknown>;\n // Only claim payloads with provider-specific keys; generic\n // `upload`/`download`/`total` JSON is handled by the generic parser so\n // `auto` detection preserves all fields.\n const hasJmsKeys =\n record[\"monthly_bw_limit_b\"] !== undefined ||\n record[\"monthlyBwLimitB\"] !== undefined ||\n record[\"bw_counter_b\"] !== undefined ||\n record[\"bwCounterB\"] !== undefined ||\n record[\"bw_reset_day_of_month\"] !== undefined ||\n record[\"bwResetDayOfMonth\"] !== undefined;\n if (!hasJmsKeys) {\n return undefined;\n }\n // Tolerate both snake_case API keys and camelCase aliases.\n const limitRaw = record[\"monthly_bw_limit_b\"] ?? record[\"monthlyBwLimitB\"];\n const usedRaw = record[\"bw_counter_b\"] ?? record[\"bwCounterB\"];\n const resetRaw =\n record[\"bw_reset_day_of_month\"] ??\n record[\"bwResetDayOfMonth\"] ??\n record[\"reset_day\"] ??\n record[\"resetDay\"];\n const payload: JmsUserinfoPayload = {\n bwCounterB: usedRaw as number | string | undefined,\n bwResetDayOfMonth: resetRaw as number | string | undefined,\n monthlyBwLimitB: limitRaw as number | string | undefined,\n };\n // JMS bills decimal GB: scale to binary bytes so clients dividing by\n // 1024^3 display the advertised quota (500 GB -> 536870912000 bytes).\n const total = scaleDecimalBytes(toNonNegativeNumber(payload.monthlyBwLimitB));\n const download = scaleDecimalBytes(toNonNegativeNumber(payload.bwCounterB));\n const resetDay = toInt(\n typeof payload.bwResetDayOfMonth === \"number\"\n ? String(payload.bwResetDayOfMonth)\n : ((payload.bwResetDayOfMonth ?? \"\") as string),\n );\n return {\n download,\n expire: resetDay > 0 ? nextMonthlyResetTimestamp(resetDay, nowSec) : 0,\n total,\n upload: 0,\n };\n}\n\n/** Parse a `subscription-userinfo` header value into normalized counters. */\nexport function parseSubscriptionUserinfo(header: string): UserinfoData | undefined {\n if (!header || header.trim() === \"\") {\n return undefined;\n }\n const data: UserinfoData = { download: 0, expire: 0, total: 0, upload: 0 };\n let found = false;\n for (const part of header.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n const key = part.slice(0, eq).trim().toLowerCase();\n const value = part.slice(eq + 1).trim();\n if (value === \"\") {\n continue;\n }\n switch (key) {\n case \"download\":\n case \"down\":\n data.download = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n case \"expire\":\n case \"expires\":\n data.expire = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n case \"total\":\n case \"limit\":\n data.total = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n case \"upload\":\n case \"up\":\n data.upload = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n default:\n break;\n }\n }\n return found ? data : undefined;\n}\n\n/** Render normalized counters as a `subscription-userinfo` header value. */\nexport function formatSubscriptionUserinfo(data: UserinfoData): string {\n const upload = toNonNegativeNumber(data.upload);\n const download = toNonNegativeNumber(data.download);\n const total = toNonNegativeNumber(data.total);\n const expire = toNonNegativeNumber(data.expire);\n return `upload=${upload}; download=${download}; total=${total}; expire=${expire}`;\n}\n\n/** Parse a generic JSON quota payload (`upload`/`download`/`total`/`expire` aliases). */\nfunction parseGenericJsonUserinfo(raw: string): UserinfoData | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return undefined;\n }\n const record = parsed as Record<string, unknown>;\n const pick = (...keys: string[]): unknown => {\n for (const key of keys) {\n if (record[key] !== undefined) {\n return record[key];\n }\n }\n return undefined;\n };\n const uploadRaw = pick(\"upload\", \"upload_b\", \"up\", \"u\");\n const downloadRaw = pick(\n \"download\",\n \"download_b\",\n \"down\",\n \"d\",\n \"used\",\n \"bw_counter_b\",\n \"bwCounterB\",\n );\n const totalRaw = pick(\n \"total\",\n \"total_b\",\n \"limit\",\n \"bandwidth\",\n \"monthly_bw_limit_b\",\n \"monthlyBwLimitB\",\n );\n const expireRaw = pick(\"expire\", \"expires\", \"expire_at\", \"expireAt\", \"reset\");\n if (uploadRaw === undefined && downloadRaw === undefined && totalRaw === undefined) {\n return undefined;\n }\n return {\n download: toNonNegativeNumber(downloadRaw),\n expire: toNonNegativeNumber(expireRaw),\n total: toNonNegativeNumber(totalRaw),\n upload: toNonNegativeNumber(uploadRaw),\n };\n}\n\n/**\n * Convert a raw `userinfo_url` response body into a `subscription-userinfo`\n * header value using the given provider (`jms` for Just-My-Socks).\n * Returns `undefined` when the payload cannot be understood.\n */\nexport function convertUserinfo(\n raw: string,\n provider?: string,\n nowSec?: number,\n): string | undefined {\n if (!raw || raw.trim() === \"\") {\n return undefined;\n }\n const normalized = normalizeUserinfoProvider(provider);\n if (normalized === \"jms\") {\n const jms = parseJmsUserinfo(raw, nowSec);\n if (jms) {\n return formatSubscriptionUserinfo(jms);\n }\n // Explicit `jms` provider with a generic JSON shape: still decimal.\n const generic = parseGenericJsonUserinfo(raw);\n return generic ? formatSubscriptionUserinfo(scaleUserinfoDecimal(generic)) : undefined;\n }\n if (normalized === \"subscription\") {\n const parsed = parseSubscriptionUserinfo(raw) ?? parseGenericJsonUserinfo(raw);\n return parsed ? formatSubscriptionUserinfo(parsed) : undefined;\n }\n // `auto`: JMS shape first, then generic JSON, then header string.\n const jms = parseJmsUserinfo(raw, nowSec);\n if (jms) {\n return formatSubscriptionUserinfo(jms);\n }\n const generic = parseGenericJsonUserinfo(raw);\n if (generic) {\n return formatSubscriptionUserinfo(generic);\n }\n const header = parseSubscriptionUserinfo(raw);\n return header ? formatSubscriptionUserinfo(header) : undefined;\n}\n","/** Shadowsocks AEAD/stream ciphers recognized by the parser. */\nexport const SS_CIPHERS = [\n \"2022-blake3-aes-128-gcm\",\n \"2022-blake3-aes-256-gcm\",\n \"2022-blake3-chacha20-poly1305\",\n \"2022-blake3-chacha12-poly1305\",\n \"2022-blake3-chacha8-poly1305\",\n \"aes-128-cfb\",\n \"aes-128-ctr\",\n \"aes-128-gcm\",\n \"aes-192-cfb\",\n \"aes-192-ctr\",\n \"aes-192-gcm\",\n \"aes-256-cfb\",\n \"aes-256-ctr\",\n \"aes-256-gcm\",\n \"bf-cfb\",\n \"camellia-128-cfb\",\n \"camellia-192-cfb\",\n \"camellia-256-cfb\",\n \"chacha20\",\n \"chacha20-ietf\",\n \"chacha20-ietf-poly1305\",\n \"rc4-md5\",\n \"salsa20\",\n \"xchacha20-ietf-poly1305\",\n];\n\n/** ShadowsocksR stream ciphers recognized by the parser. */\nexport const SSR_CIPHERS = [\n \"aes-128-cfb\",\n \"aes-128-ctr\",\n \"aes-192-cfb\",\n \"aes-192-ctr\",\n \"aes-256-cfb\",\n \"aes-256-ctr\",\n \"bf-cfb\",\n \"camellia-128-cfb\",\n \"camellia-192-cfb\",\n \"camellia-256-cfb\",\n \"cast5-cfb\",\n \"chacha20\",\n \"chacha20-ietf\",\n \"des-cfb\",\n \"idea-cfb\",\n \"none\",\n \"rc2-cfb\",\n \"rc4\",\n \"rc4-md5\",\n \"salsa20\",\n \"seed-cfb\",\n \"table\",\n];\n\n/** `true` when `cipher` is a Shadowsocks cipher. */\nexport function isSsCipher(cipher: string): boolean {\n return SS_CIPHERS.includes(cipher.toLowerCase());\n}\n\n/**\n * True when an SSR node can be flattened to plain Shadowsocks: a known SS\n * cipher with no meaningful obfs/protocol. Mirrors subparser.cpp:713.\n */\nexport function isFlattenableSsr(method: string, obfs: string, protocol: string): boolean {\n return (\n isSsCipher(method) &&\n (obfs === \"\" || obfs === \"plain\") &&\n (protocol === \"\" || protocol === \"origin\")\n );\n}\n","import type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { base64Decode } from \"../utils/base64\";\nimport { isIpv4, isIpv6, toInt, trim } from \"../utils/string\";\n\nfunction commonConstruct(\n node: Proxy,\n type: ProxyType,\n group: string,\n remark: string,\n server: string,\n port: string | number,\n udp: TriBool,\n tfo: TriBool,\n scv: TriBool,\n tls13: TriBool,\n underlyingProxy: string,\n): void {\n node.type = type;\n node.group = group;\n node.remark = remark;\n node.hostname = server;\n node.underlyingProxy = underlyingProxy;\n node.port = toInt(port);\n node.udp = udp;\n node.tcpFastOpen = tfo;\n node.allowInsecure = scv;\n node.tls13 = tls13;\n}\n\nexport interface VmessOptions {\n group: string;\n remark: string;\n add: string;\n port: string | number;\n type?: string;\n id?: string;\n aid?: string | number;\n net?: string;\n cipher?: string;\n path?: string;\n host?: string;\n edge?: string;\n tls?: string;\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a VMess node. Mirrors subparser.cpp `vmessConstruct`. */\nexport function vmessConstruct(node: Proxy, options: VmessOptions): void {\n const {\n add,\n aid = 0,\n cipher = \"\",\n edge = \"\",\n group,\n host = \"\",\n id = \"\",\n net = \"\",\n path = \"\",\n port,\n remark,\n scv,\n sni = \"\",\n tfo,\n tls = \"\",\n tls13,\n type = \"\",\n udp,\n underlyingProxy = \"\",\n } = options;\n\n commonConstruct(\n node,\n ProxyType.VMess,\n group,\n remark,\n add,\n port,\n udp,\n tfo,\n scv,\n tls13,\n underlyingProxy,\n );\n node.userId = id === \"\" ? \"00000000-0000-0000-0000-000000000000\" : id;\n node.alterId = toInt(aid);\n node.encryptMethod = cipher;\n node.transferProtocol = net === \"\" ? \"tcp\" : net;\n node.edge = edge;\n node.serverName = sni;\n\n if (net === \"quic\") {\n node.quicSecure = host;\n node.quicSecret = path;\n } else {\n node.host = host === \"\" && !isIpv4(add) && !isIpv6(add) ? add : trim(host);\n node.path = path === \"\" ? \"/\" : trim(path);\n }\n node.fakeType = type;\n node.tlsSecure = tls === \"tls\";\n}\n\nexport interface SsrOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n protocol: string;\n method: string;\n obfs: string;\n password: string;\n obfsParam?: string;\n protocolParam?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a ShadowsocksR node. Mirrors `ssrConstruct`. */\nexport function ssrConstruct(node: Proxy, options: SsrOptions): void {\n commonConstruct(\n node,\n ProxyType.ShadowsocksR,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.encryptMethod = options.method;\n node.protocol = options.protocol;\n node.protocolParam = options.protocolParam ?? \"\";\n node.obfs = options.obfs;\n node.obfsParam = options.obfsParam ?? \"\";\n}\n\nexport interface SsOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n method: string;\n plugin?: string;\n pluginOption?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Shadowsocks node. Mirrors `ssConstruct`. */\nexport function ssConstruct(node: Proxy, options: SsOptions): void {\n commonConstruct(\n node,\n ProxyType.Shadowsocks,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.encryptMethod = options.method;\n node.plugin = options.plugin ?? \"\";\n node.pluginOption = options.pluginOption ?? \"\";\n}\n\nexport interface SocksOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n username?: string;\n password?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a SOCKS5 node. Mirrors `socksConstruct`. */\nexport function socksConstruct(node: Proxy, options: SocksOptions): void {\n commonConstruct(\n node,\n ProxyType.SOCKS5,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.username = options.username ?? \"\";\n node.password = options.password ?? \"\";\n}\n\nexport interface HttpOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n username?: string;\n password?: string;\n tls: boolean;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build an HTTP/HTTPS node. Mirrors `httpConstruct`. */\nexport function httpConstruct(node: Proxy, options: HttpOptions): void {\n commonConstruct(\n node,\n options.tls ? ProxyType.HTTPS : ProxyType.HTTP,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.username = options.username ?? \"\";\n node.password = options.password ?? \"\";\n node.tlsSecure = options.tls;\n}\n\nexport interface TrojanOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n network?: string;\n host?: string;\n path?: string;\n tlsSecure?: boolean;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n sni?: string;\n underlyingProxy?: string;\n}\n\n/** Build a Trojan node. Mirrors `trojanConstruct`. */\nexport function trojanConstruct(node: Proxy, options: TrojanOptions): void {\n commonConstruct(\n node,\n ProxyType.Trojan,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.host = options.host ?? \"\";\n node.tlsSecure = options.tlsSecure ?? true;\n node.transferProtocol =\n options.network === undefined || options.network === \"\" ? \"tcp\" : options.network;\n node.path = options.path ?? \"\";\n node.serverName = options.sni ?? \"\";\n}\n\nexport interface SnellOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n obfs?: string;\n host?: string;\n version?: number;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Snell node. Mirrors `snellConstruct`. */\nexport function snellConstruct(node: Proxy, options: SnellOptions): void {\n commonConstruct(\n node,\n ProxyType.Snell,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.obfs = options.obfs ?? \"\";\n node.host = options.host ?? \"\";\n node.snellVersion = options.version ?? 0;\n}\n\nexport interface AnyTlsOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build an AnyTLS node. Mirrors `anyTLSConstruct`. */\nexport function anyTlsConstruct(node: Proxy, options: AnyTlsOptions): void {\n commonConstruct(\n node,\n ProxyType.AnyTLS,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.password = options.password;\n node.sni = options.sni ?? \"\";\n}\n\nexport interface WireGuardOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n selfIp?: string;\n selfIpv6?: string;\n privateKey?: string;\n publicKey?: string;\n preSharedKey?: string;\n dnsServers?: string[];\n mtu?: string | number;\n keepAlive?: string | number;\n testUrl?: string;\n clientId?: string;\n udp?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a WireGuard node. Mirrors `wireguardConstruct`. */\nexport function wireGuardConstruct(node: Proxy, options: WireGuardOptions): void {\n commonConstruct(\n node,\n ProxyType.WireGuard,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n undefined,\n undefined,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.selfIp = options.selfIp ?? \"\";\n node.selfIpv6 = options.selfIpv6 ?? \"\";\n node.privateKey = options.privateKey ?? \"\";\n node.publicKey = options.publicKey ?? \"\";\n node.preSharedKey = options.preSharedKey ?? \"\";\n node.dnsServers = options.dnsServers ?? [];\n node.mtu = toInt(options.mtu);\n node.keepAlive = toInt(options.keepAlive);\n node.testUrl = options.testUrl ?? \"\";\n node.clientId = options.clientId ?? \"\";\n}\n\nexport interface HysteriaOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n ports?: string;\n protocol?: string;\n obfsProtocol?: string;\n up?: string;\n upSpeed?: string;\n down?: string;\n downSpeed?: string;\n auth?: string;\n authStr?: string;\n obfs?: string;\n sni?: string;\n fingerprint?: string;\n ca?: string;\n caStr?: string;\n recvWindowConn?: string | number;\n recvWindow?: string | number;\n disableMtuDiscovery?: string;\n hopInterval?: string | number;\n alpn?: string;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Hysteria (v1) node. Mirrors `hysteriaConstruct`. */\nexport function hysteriaConstruct(node: Proxy, options: HysteriaOptions): void {\n commonConstruct(\n node,\n ProxyType.Hysteria,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.ports = options.ports ?? \"\";\n node.protocol = options.protocol ?? \"\";\n node.obfsParam = options.obfsProtocol ?? \"\";\n\n const up = options.up ?? \"\";\n if (up !== \"\") {\n if (up.length > 4 && up.endsWith(\"bps\")) {\n node.up = up;\n } else if (toInt(up)) {\n node.upSpeed = toInt(up);\n node.up = `${up} Mbps`;\n }\n }\n if (options.upSpeed) {\n node.upSpeed = toInt(options.upSpeed);\n }\n const down = options.down ?? \"\";\n if (down !== \"\") {\n if (down.length > 4 && down.endsWith(\"bps\")) {\n node.down = down;\n } else if (toInt(down)) {\n node.downSpeed = toInt(down);\n node.down = `${down} Mbps`;\n }\n }\n if (options.downSpeed) {\n node.downSpeed = toInt(options.downSpeed);\n }\n\n node.authStr = options.authStr ?? \"\";\n if (options.auth) {\n node.authStr = base64Decode(options.auth);\n }\n node.tlsSecure = true;\n node.obfs = options.obfs ?? \"\";\n node.sni = options.sni ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n node.ca = options.ca ?? \"\";\n node.caStr = options.caStr ?? \"\";\n node.recvWindowConn = toInt(options.recvWindowConn);\n node.recvWindow = toInt(options.recvWindow);\n node.disableMtuDiscovery = options.disableMtuDiscovery\n ? options.disableMtuDiscovery === \"true\"\n : undefined;\n node.hopInterval = toInt(options.hopInterval);\n if (options.alpn) {\n node.alpn = [options.alpn];\n }\n}\n\nexport interface Hysteria2Options {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n ports?: string;\n up?: string;\n down?: string;\n password?: string;\n obfs?: string;\n obfsPassword?: string;\n sni?: string;\n fingerprint?: string;\n alpn?: string;\n ca?: string;\n caStr?: string;\n cwnd?: string | number;\n hopInterval?: string | number;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Hysteria2 node. Mirrors `hysteria2Construct`. */\nexport function hysteria2Construct(node: Proxy, options: Hysteria2Options): void {\n commonConstruct(\n node,\n ProxyType.Hysteria2,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.upSpeed = toInt(options.up);\n node.downSpeed = toInt(options.down);\n node.ports = options.ports ?? \"\";\n node.password = options.password ?? \"\";\n node.obfs = options.obfs ?? \"\";\n node.obfsParam = options.obfsPassword ?? \"\";\n node.sni = options.sni ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n if (options.alpn) {\n node.alpn = [options.alpn];\n }\n node.ca = options.ca ?? \"\";\n node.caStr = options.caStr ?? \"\";\n node.cwnd = toInt(options.cwnd);\n node.hopInterval = toInt(options.hopInterval);\n}\n\nexport interface VlessOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n userId: string;\n flow?: string;\n encryption?: string;\n network?: string;\n tls?: string;\n sni?: string;\n host?: string;\n path?: string;\n fingerprint?: string;\n publicKey?: string;\n shortId?: string;\n alpn?: string[];\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a VLESS node. */\nexport function vlessConstruct(node: Proxy, options: VlessOptions): void {\n commonConstruct(\n node,\n ProxyType.VLESS,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.userId = options.userId;\n node.flow = options.flow ?? \"\";\n node.encryptMethod = options.encryption ?? \"none\";\n node.transferProtocol =\n options.network === undefined || options.network === \"\" ? \"tcp\" : options.network;\n node.tlsSecure = options.tls === \"tls\" || options.tls === \"reality\";\n node.serverName = options.sni ?? \"\";\n node.host = options.host ?? \"\";\n node.path = options.path ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n node.publicKey = options.publicKey ?? \"\";\n node.shortId = options.shortId ?? \"\";\n if (options.alpn) {\n node.alpn = options.alpn;\n }\n}\n\nexport interface TuicOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n userId: string;\n password: string;\n congestionControl?: string;\n alpn?: string[];\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a TUIC node. */\nexport function tuicConstruct(node: Proxy, options: TuicOptions): void {\n commonConstruct(\n node,\n ProxyType.TUIC,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.userId = options.userId;\n node.password = options.password;\n node.congestionControl = options.congestionControl ?? \"\";\n node.serverName = options.sni ?? \"\";\n if (options.alpn) {\n node.alpn = options.alpn;\n }\n}\n","import { isFlattenableSsr } from \"./ciphers\";\nimport {\n httpConstruct,\n snellConstruct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n vmessConstruct,\n} from \"./construct\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS } from \"../types/proxy\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { toInt } from \"../utils/string\";\n\nfunction tri(value: unknown): boolean | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n return String(value).toLowerCase() === \"true\";\n}\n\nfunction str(value: unknown): string {\n return value === undefined || value === null ? \"\" : String(value);\n}\n\n/** Parse a `Netch://<base64 json>` link into `node`. */\nexport function explodeNetch(netch: string, node: Proxy): void {\n let data: any;\n try {\n data = JSON.parse(urlSafeBase64Decode(netch.slice(8)));\n } catch {\n return;\n }\n if (data === null || typeof data !== \"object\") {\n return;\n }\n const type = str(data.Type);\n const group = str(data.Group);\n let remark = str(data.Remark);\n const address = str(data.Hostname);\n const udp = tri(data.EnableUDP);\n const tfo = tri(data.EnableTFO);\n const scv = tri(data.AllowInsecure);\n const port = str(data.Port);\n if (port === \"0\" || port === \"\") {\n return;\n }\n const method = str(data.EncryptMethod);\n const password = str(data.Password);\n if (remark === \"\") {\n remark = `${address}:${port}`;\n }\n\n switch (type) {\n case \"SS\":\n ssConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ss : group,\n method,\n password,\n plugin: str(data.Plugin),\n pluginOption: str(data.PluginOption),\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n break;\n case \"SSR\": {\n const protocol = str(data.Protocol);\n const obfs = str(data.OBFS);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ss : group,\n method,\n password,\n plugin: str(data.Plugin),\n pluginOption: str(data.PluginOption),\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n } else {\n ssrConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ssr : group,\n method,\n obfs,\n obfsParam: str(data.OBFSParam),\n password,\n port,\n protocol,\n protocolParam: str(data.ProtocolParam),\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n }\n break;\n }\n case \"VMess\":\n vmessConstruct(node, {\n add: address,\n aid: str(data.AlterID),\n cipher: method,\n edge: str(data.Edge),\n group: group === \"\" ? DEFAULT_GROUPS.v2ray : group,\n host: str(data.Host),\n id: str(data.UserID),\n net: str(data.TransferProtocol),\n path: str(data.Path),\n port,\n remark,\n scv,\n sni: str(data.ServerName),\n tfo,\n tls: str(data.TLSSecure),\n type: str(data.FakeType),\n udp,\n });\n break;\n case \"Socks5\":\n socksConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.socks : group,\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n username: str(data.Username),\n });\n break;\n case \"HTTP\":\n case \"HTTPS\":\n httpConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.http : group,\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n tls: type === \"HTTPS\",\n });\n break;\n case \"Trojan\":\n trojanConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.trojan : group,\n host: str(data.Host),\n network: str(data.TransferProtocol),\n password,\n path: str(data.Path),\n port,\n remark,\n scv,\n server: address,\n tfo,\n tlsSecure: str(data.TLSSecure) === \"true\",\n udp,\n });\n break;\n case \"Snell\":\n snellConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.snell : group,\n host: str(data.Host),\n obfs: str(data.OBFS),\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n version: toInt(str(data.SnellVersion)),\n });\n break;\n default:\n break;\n }\n}\n","import { parse as parseYaml } from \"yaml\";\n\nimport { isFlattenableSsr } from \"./ciphers\";\nimport {\n anyTlsConstruct,\n httpConstruct,\n hysteria2Construct,\n hysteriaConstruct,\n snellConstruct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n tuicConstruct,\n vlessConstruct,\n vmessConstruct,\n wireGuardConstruct,\n} from \"./construct\";\nimport { explodeNetch } from \"./netch\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS, createProxy } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { base64Encode } from \"../utils/base64\";\nimport { split, toInt, trim } from \"../utils/string\";\n\nfunction asString(value: unknown): string {\n if (value === undefined || value === null) {\n return \"\";\n }\n return String(value);\n}\n\nfunction asBool(value: unknown): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n return asString(value).toLowerCase() === \"true\";\n}\n\nfunction asTri(value: unknown): TriBool {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n return asBool(value);\n}\n\nfunction get(obj: any, key: string | number): unknown {\n return obj !== null && typeof obj === \"object\" ? obj[key] : undefined;\n}\n\n/** Parse a Clash `proxies:` list into normalized nodes. */\nexport function explodeClash(root: any, nodes: Proxy[]): void {\n const section = get(root, \"proxies\") !== undefined ? \"proxies\" : \"Proxy\";\n const list = get(root, section) as any[] | undefined;\n if (!Array.isArray(list)) {\n return;\n }\n let index = nodes.length;\n\n for (const single of list) {\n // One malformed entry must not fail the whole subscription.\n try {\n if (parseClashNode(single, nodes, index)) {\n index += 1;\n }\n } catch {\n // Skip the broken node, keep the rest.\n }\n }\n}\n\n/** Parse one Clash proxy entry; `true` when a node was appended. */\nfunction parseClashNode(single: unknown, nodes: Proxy[], index: number): boolean {\n const proxyType = asString(get(single, \"type\")).toLowerCase();\n const ps = asString(get(single, \"name\"));\n const server = asString(get(single, \"server\"));\n const port = asString(get(single, \"port\"));\n let underlyingProxy = asString(get(single, \"underlying-proxy\"));\n if (underlyingProxy === \"\") {\n underlyingProxy = asString(get(single, \"dialer-proxy\"));\n }\n if (port === \"\" || port === \"0\") {\n return false;\n }\n const udp = asTri(get(single, \"udp\"));\n const tfo = asTri(get(single, \"fast-open\"));\n const scv = asTri(get(single, \"skip-cert-verify\"));\n const node = createProxy();\n let group = \"\";\n\n switch (proxyType) {\n case \"vmess\": {\n group = DEFAULT_GROUPS.v2ray;\n const id = asString(get(single, \"uuid\"));\n const aid = asString(get(single, \"alterId\"));\n const cipher = asString(get(single, \"cipher\"));\n const net = get(single, \"network\") !== undefined ? asString(get(single, \"network\")) : \"tcp\";\n const sni = asString(get(single, \"servername\"));\n let path = \"\";\n let host = \"\";\n let edge = \"\";\n switch (net) {\n case \"http\":\n path = asString(get(get(get(single, \"http-opts\"), \"path\"), 0));\n host = asString(get(get(get(get(single, \"http-opts\"), \"headers\"), \"Host\"), 0));\n edge = \"\";\n break;\n case \"ws\":\n if (get(single, \"ws-opts\") !== undefined) {\n const wsOpts = get(single, \"ws-opts\");\n path = get(wsOpts, \"path\") !== undefined ? asString(get(wsOpts, \"path\")) : \"/\";\n host = asString(get(get(wsOpts, \"headers\"), \"Host\"));\n edge = asString(get(get(wsOpts, \"headers\"), \"Edge\"));\n } else {\n path = get(single, \"ws-path\") !== undefined ? asString(get(single, \"ws-path\")) : \"/\";\n host = asString(get(get(single, \"ws-headers\"), \"Host\"));\n edge = asString(get(get(single, \"ws-headers\"), \"Edge\"));\n }\n break;\n case \"h2\":\n path = asString(get(get(single, \"h2-opts\"), \"path\"));\n host = asString(get(get(get(single, \"h2-opts\"), \"host\"), 0));\n edge = \"\";\n break;\n case \"grpc\":\n host = asString(get(single, \"servername\"));\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n edge = \"\";\n break;\n default:\n break;\n }\n const tls = asBool(get(single, \"tls\")) ? \"tls\" : \"\";\n vmessConstruct(node, {\n add: server,\n aid,\n cipher,\n edge,\n group,\n host,\n id,\n net,\n path,\n port,\n remark: ps,\n scv,\n sni,\n tfo,\n tls,\n type: \"\",\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"ss\": {\n group = DEFAULT_GROUPS.ss;\n let cipher = asString(get(single, \"cipher\"));\n const password = asString(get(single, \"password\"));\n let plugin = \"\";\n let pluginOption = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let pluginMux = \"\";\n let pluginTls = \"\";\n let path = \"\";\n if (get(single, \"plugin\") !== undefined) {\n const pluginName = asString(get(single, \"plugin\")).toLowerCase();\n const pluginOpts = get(single, \"plugin-opts\");\n if (pluginName === \"obfs\") {\n plugin = \"obfs-local\";\n pluginMode = asString(get(pluginOpts, \"mode\"));\n pluginHost = asString(get(pluginOpts, \"host\"));\n } else if (pluginName === \"v2ray-plugin\") {\n plugin = \"v2ray-plugin\";\n pluginMode = asString(get(pluginOpts, \"mode\"));\n pluginHost = asString(get(pluginOpts, \"host\"));\n pluginTls = asBool(get(pluginOpts, \"tls\")) ? \"tls;\" : \"\";\n path = asString(get(pluginOpts, \"path\"));\n pluginMux = asBool(get(pluginOpts, \"mux\")) ? \"mux=4;\" : \"\";\n }\n } else if (get(single, \"obfs\") !== undefined) {\n plugin = \"obfs-local\";\n pluginMode = asString(get(single, \"obfs\"));\n pluginHost = asString(get(single, \"obfs-host\"));\n }\n if (plugin === \"simple-obfs\" || plugin === \"obfs-local\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n } else if (plugin === \"v2ray-plugin\") {\n pluginOption = `mode=${pluginMode};${pluginTls}${pluginMux}`;\n if (pluginHost !== \"\") {\n pluginOption += `host=${pluginHost};`;\n }\n if (path !== \"\") {\n pluginOption += `path=${path};`;\n }\n if (pluginMux !== \"\") {\n pluginOption += `mux=${pluginMux};`;\n }\n }\n if (cipher === \"AEAD_CHACHA20_POLY1305\") {\n cipher = \"chacha20-ietf-poly1305\";\n } else if (cipher.includes(\"AEAD\")) {\n cipher = cipher.replace(/AEAD_/g, \"\").replace(/_/g, \"-\").toLowerCase();\n }\n ssConstruct(node, {\n group,\n method: cipher,\n password,\n plugin,\n pluginOption,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"socks5\": {\n group = DEFAULT_GROUPS.socks;\n const user = asString(get(single, \"username\"));\n const password = asString(get(single, \"password\"));\n socksConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n server,\n underlyingProxy,\n username: user,\n });\n break;\n }\n case \"ssr\": {\n group = DEFAULT_GROUPS.ssr;\n let cipher = asString(get(single, \"cipher\"));\n if (cipher === \"dummy\") {\n cipher = \"none\";\n }\n const password = asString(get(single, \"password\"));\n const protocol = asString(get(single, \"protocol\"));\n const obfs = asString(get(single, \"obfs\"));\n const protocolParam =\n get(single, \"protocol-param\") !== undefined\n ? asString(get(single, \"protocol-param\"))\n : asString(get(single, \"protocolparam\"));\n const obfsParam =\n get(single, \"obfs-param\") !== undefined\n ? asString(get(single, \"obfs-param\"))\n : asString(get(single, \"obfsparam\"));\n ssrConstruct(node, {\n group,\n method: cipher,\n obfs,\n obfsParam,\n password,\n port,\n protocol,\n protocolParam,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"http\": {\n group = DEFAULT_GROUPS.http;\n const user = asString(get(single, \"username\"));\n const password = asString(get(single, \"password\"));\n const tls = asString(get(single, \"tls\"));\n httpConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n tls: tls === \"true\",\n underlyingProxy,\n username: user,\n });\n break;\n }\n case \"trojan\": {\n group = DEFAULT_GROUPS.trojan;\n const password = asString(get(single, \"password\"));\n const host = asString(get(single, \"sni\"));\n let net = asString(get(single, \"network\"));\n let path = \"\";\n switch (net) {\n case \"grpc\":\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n break;\n case \"ws\":\n path = asString(get(get(single, \"ws-opts\"), \"path\"));\n break;\n default:\n net = \"tcp\";\n path = \"\";\n break;\n }\n trojanConstruct(node, {\n group,\n host,\n network: net,\n password,\n path,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n tlsSecure: true,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"snell\": {\n group = DEFAULT_GROUPS.snell;\n const password = asString(get(single, \"psk\"));\n const obfs = asString(get(get(single, \"obfs-opts\"), \"mode\"));\n const host = asString(get(get(single, \"obfs-opts\"), \"host\"));\n const version = asString(get(single, \"version\"));\n snellConstruct(node, {\n group,\n host,\n obfs,\n password,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n version: toInt(version),\n });\n break;\n }\n case \"wireguard\": {\n group = DEFAULT_GROUPS.wireguard;\n const publicKey = asString(get(single, \"public-key\"));\n const privateKey = asString(get(single, \"private-key\"));\n const dns = get(single, \"dns\");\n const dnsServers = Array.isArray(dns) ? dns.map((d) => String(d)) : dns ? [String(dns)] : [];\n const mtu = asString(get(single, \"mtu\"));\n const psk = asString(get(single, \"preshared-key\"));\n const ip = asString(get(single, \"ip\"));\n const ipv6 = asString(get(single, \"ipv6\"));\n wireGuardConstruct(node, {\n dnsServers,\n group,\n keepAlive: \"0\",\n mtu,\n port,\n preSharedKey: psk,\n privateKey,\n publicKey,\n remark: ps,\n selfIp: ip,\n selfIpv6: ipv6,\n server,\n testUrl: \"\",\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"hysteria\": {\n group = DEFAULT_GROUPS.hysteria;\n const ports = asString(get(single, \"ports\"));\n const protocol = asString(get(single, \"protocol\"));\n const obfsProtocol = asString(get(single, \"obfs-protocol\"));\n const up = asString(get(single, \"up\"));\n const upSpeed = asString(get(single, \"up-speed\"));\n const down = asString(get(single, \"down\"));\n const downSpeed = asString(get(single, \"down-speed\"));\n const auth = asString(get(single, \"auth\"));\n let authStr = asString(get(single, \"auth-str\"));\n if (authStr === \"\") {\n authStr = asString(get(single, \"auth_str\"));\n }\n const obfs = asString(get(single, \"obfs\"));\n const sni = asString(get(single, \"sni\"));\n const fingerprint = asString(get(single, \"fingerprint\"));\n const alpnValue = get(single, \"alpn\");\n const alpn = Array.isArray(alpnValue) ? asString(alpnValue[0]) : asString(alpnValue);\n const ca = asString(get(single, \"ca\"));\n const caStr = asString(get(single, \"ca-str\"));\n const recvWindowConn = asString(get(single, \"recv-window-conn\"));\n const recvWindow = asString(get(single, \"recv-window\"));\n let disableMtuDiscovery = asString(get(single, \"disable-mtu-discovery\"));\n if (disableMtuDiscovery === \"\") {\n disableMtuDiscovery = asString(get(single, \"disable_mtu_discovery\"));\n }\n const hopInterval = asString(get(single, \"hop-interval\"));\n hysteriaConstruct(node, {\n alpn,\n auth,\n authStr,\n ca,\n caStr,\n disableMtuDiscovery,\n down,\n downSpeed,\n fingerprint,\n group,\n hopInterval,\n obfs,\n obfsProtocol,\n port,\n ports,\n protocol,\n recvWindow,\n recvWindowConn,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n underlyingProxy,\n up,\n upSpeed,\n });\n break;\n }\n case \"hysteria2\": {\n group = DEFAULT_GROUPS.hysteria2;\n const ports = asString(get(single, \"ports\"));\n const up = asString(get(single, \"up\"));\n const down = asString(get(single, \"down\"));\n let password = asString(get(single, \"password\"));\n if (password === \"\") {\n password = asString(get(single, \"auth\"));\n }\n const obfs = asString(get(single, \"obfs\"));\n const obfsPassword = asString(get(single, \"obfs-password\"));\n const sni = asString(get(single, \"sni\"));\n const fingerprint = asString(get(single, \"fingerprint\"));\n const alpnValue = get(single, \"alpn\");\n const alpn = Array.isArray(alpnValue) ? asString(alpnValue[0]) : asString(alpnValue);\n const ca = asString(get(single, \"ca\"));\n const caStr = asString(get(single, \"ca-str\"));\n const cwnd = asString(get(single, \"cwnd\"));\n const hopInterval = asString(get(single, \"hop-interval\"));\n hysteria2Construct(node, {\n alpn,\n ca,\n caStr,\n cwnd,\n down,\n fingerprint,\n group,\n hopInterval,\n obfs,\n obfsPassword,\n password,\n port,\n ports,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n underlyingProxy,\n up,\n });\n break;\n }\n case \"anytls\": {\n group = DEFAULT_GROUPS.anytls;\n const password = asString(get(single, \"password\"));\n const sni = asString(get(single, \"sni\"));\n anyTlsConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"vless\": {\n group = DEFAULT_GROUPS.v2ray;\n const userId = asString(get(single, \"uuid\"));\n const net = asString(get(single, \"network\"));\n const tls = asString(get(single, \"tls\"));\n let path = \"\";\n let host = \"\";\n if (net === \"ws\") {\n path = asString(get(get(single, \"ws-opts\"), \"path\"));\n host = asString(get(get(get(single, \"ws-opts\"), \"headers\"), \"Host\"));\n } else if (net === \"grpc\") {\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n }\n const alpnValue = get(single, \"alpn\");\n vlessConstruct(node, {\n alpn: Array.isArray(alpnValue) ? alpnValue.map((a) => String(a)) : undefined,\n encryption: asString(get(single, \"encryption\")),\n fingerprint: asString(get(single, \"client-fingerprint\")),\n flow: asString(get(single, \"flow\")),\n group,\n host,\n network: net,\n path,\n port,\n remark: ps,\n scv,\n server,\n sni: asString(get(single, \"servername\")),\n tfo,\n tls: tls === \"true\" ? \"tls\" : \"\",\n udp,\n underlyingProxy,\n userId,\n });\n break;\n }\n case \"tuic\": {\n group = DEFAULT_GROUPS.v2ray;\n const alpnValue = get(single, \"alpn\");\n tuicConstruct(node, {\n alpn: Array.isArray(alpnValue) ? alpnValue.map((a) => String(a)) : undefined,\n congestionControl: asString(get(single, \"congestion-controller\")),\n group,\n password: asString(get(single, \"password\")),\n port,\n remark: ps,\n scv,\n server,\n sni: asString(get(single, \"sni\")),\n tfo,\n udp,\n underlyingProxy,\n userId: asString(get(single, \"uuid\")),\n });\n break;\n }\n default:\n return false;\n }\n\n node.id = index;\n nodes.push(node);\n return true;\n}\n\n/** Split INI-style text into ordered sections with their raw lines. */\nfunction parseRawSections(text: string): Array<{ name: string; lines: string[] }> {\n const sections: Array<{ name: string; lines: string[] }> = [];\n const isolated: string[] = [];\n let current: { name: string; lines: string[] } | undefined;\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n const header = /^\\[(.*)\\]$/.exec(line);\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line === \"\" || line.startsWith(\"#\") || line.startsWith(\";\")) {\n continue;\n }\n if (current) {\n current.lines.push(line);\n } else {\n isolated.push(line);\n }\n }\n if (isolated.length > 0) {\n sections.unshift({ lines: isolated, name: \"Proxy\" });\n }\n return sections;\n}\n\nfunction getRawSection(sections: Array<{ name: string; lines: string[] }>, name: string): string[] {\n const lines: string[] = [];\n for (const section of sections) {\n if (section.name === name) {\n lines.push(...section.lines);\n }\n }\n return lines;\n}\n\nfunction collectKeyValues(\n lines: string[],\n startIndex: number,\n sink: { [key: string]: string },\n): void {\n for (let i = startIndex; i < lines.length; i += 1) {\n const line = trim(lines[i] as string);\n const eq = line.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n sink[trim(line.slice(0, eq))] = trim(line.slice(eq + 1));\n }\n}\n\n/** Parse a Surge/Loon `[Proxy]` configuration into nodes. */\nexport function explodeSurge(surge: string, nodes: Proxy[]): boolean {\n let text = surge;\n if (text.includes(\"[Proxy]\")) {\n text = text.replace(/^[\\s\\S]*?\\[/, \"[\");\n }\n const sections = parseRawSections(text);\n const proxyLines = getRawSection(sections, \"Proxy\");\n if (proxyLines.length === 0) {\n return false;\n }\n const startCount = nodes.length;\n let index = nodes.length;\n\n for (const line of proxyLines) {\n const match = /^(.*?)\\s*=\\s*(.*)$/.exec(line);\n if (!match) {\n continue;\n }\n const remark = match[1] as string;\n const config = match[2] as string;\n const configs = split(config, \",\");\n if (configs.length < 3) {\n continue;\n }\n const node = createProxy();\n let server = \"\";\n let port = \"\";\n let method = \"\";\n let username = \"\";\n let password = \"\";\n let plugin = \"\";\n let pluginOption = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let id = \"\";\n let net = \"tcp\";\n let tls = \"\";\n let host = \"\";\n let edge = \"\";\n let path = \"\";\n let version = \"\";\n let aead = \"1\";\n let udp: TriBool;\n let tfo: TriBool;\n let scv: TriBool;\n let tls13: TriBool;\n\n switch ((configs[0] as string).toLowerCase()) {\n case \"direct\":\n case \"reject\":\n case \"reject-tinygif\":\n continue;\n case \"custom\": {\n if (configs.length < 5) {\n continue;\n }\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n method = trim(configs[3] as string);\n password = trim(configs[4] as string);\n for (let i = 6; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"obfs\") {\n plugin = \"simple-obfs\";\n pluginMode = itemVal;\n } else if (itemName === \"obfs-host\") {\n pluginHost = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n }\n }\n if (plugin !== \"\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n }\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n });\n break;\n }\n case \"ss\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"encrypt-method\") {\n method = itemVal;\n } else if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"obfs\") {\n plugin = \"simple-obfs\";\n pluginMode = itemVal;\n } else if (itemName === \"obfs-host\") {\n pluginHost = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n }\n }\n if (plugin !== \"\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n }\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n });\n break;\n }\n case \"socks5\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n if (configs.length >= 5) {\n username = trim(configs[3] as string);\n password = trim(configs[4] as string);\n }\n for (let i = 5; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n socksConstruct(node, {\n group: DEFAULT_GROUPS.socks,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n username,\n });\n break;\n }\n case \"vmess\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n net = \"tcp\";\n method = \"auto\";\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n switch (itemName) {\n case \"username\":\n id = itemVal;\n break;\n case \"ws\":\n net = itemVal === \"true\" ? \"ws\" : \"tcp\";\n break;\n case \"tls\":\n tls = itemVal === \"true\" ? \"tls\" : \"\";\n break;\n case \"ws-path\":\n path = itemVal;\n break;\n case \"obfs-host\":\n host = itemVal;\n break;\n case \"ws-headers\": {\n const headers = split(itemVal, \"|\");\n for (const header of headers) {\n const kv = split(trim(header), \":\");\n if (kv.length !== 2) {\n continue;\n }\n if (/host/i.test(kv[0] as string)) {\n host = trimQuote(kv[1] as string);\n } else if (/edge/i.test(kv[0] as string)) {\n edge = trimQuote(kv[1] as string);\n }\n }\n break;\n }\n case \"udp-relay\":\n udp = asTri(itemVal);\n break;\n case \"tfo\":\n tfo = asTri(itemVal);\n break;\n case \"skip-cert-verify\":\n scv = asTri(itemVal);\n break;\n case \"tls13\":\n tls13 = asTri(itemVal);\n break;\n case \"vmess-aead\":\n aead = itemVal === \"true\" ? \"0\" : \"1\";\n break;\n default:\n break;\n }\n }\n vmessConstruct(node, {\n add: server,\n aid: aead,\n cipher: method,\n edge,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n scv,\n tfo,\n tls,\n tls13,\n udp,\n });\n break;\n }\n case \"http\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"username\") {\n username = itemVal;\n } else if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n httpConstruct(node, {\n group: DEFAULT_GROUPS.http,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n tls: false,\n username,\n });\n break;\n }\n case \"trojan\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"sni\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n trojanConstruct(node, {\n group: DEFAULT_GROUPS.trojan,\n host,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n tlsSecure: true,\n udp,\n });\n break;\n }\n case \"snell\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"psk\") {\n password = itemVal;\n } else if (itemName === \"obfs\") {\n plugin = itemVal;\n } else if (itemName === \"obfs-host\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n } else if (itemName === \"version\") {\n version = itemVal;\n }\n }\n snellConstruct(node, {\n group: DEFAULT_GROUPS.snell,\n host,\n obfs: plugin,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n version: toInt(version),\n });\n break;\n }\n case \"wireguard\": {\n let section = \"\";\n let testUrl = \"\";\n for (let i = 1; i < configs.length; i += 1) {\n const vArray = split(trim(configs[i] as string), \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"section-name\") {\n section = itemVal;\n } else if (itemName === \"test-url\") {\n testUrl = itemVal;\n }\n }\n if (section === \"\") {\n continue;\n }\n const wgLines = getRawSection(sections, `WireGuard ${section}`);\n if (wgLines.length === 0) {\n continue;\n }\n const wg: { [key: string]: string } = {};\n collectKeyValues(wgLines, 0, wg);\n const dnsServers: string[] = [];\n if (wg[\"dns-server\"]) {\n for (const dns of split(wg[\"dns-server\"], \",\")) {\n dnsServers.push(trim(dns));\n }\n }\n wireGuardConstruct(node, {\n dnsServers,\n group: DEFAULT_GROUPS.wireguard,\n keepAlive: wg[\"keepalive\"] ?? \"\",\n mtu: wg[\"mtu\"] ?? \"\",\n port: \"0\",\n privateKey: wg[\"private-key\"] ?? \"\",\n remark,\n selfIp: wg[\"self-ip\"] ?? \"\",\n selfIpv6: wg[\"self-ip-v6\"] ?? \"\",\n server: \"\",\n testUrl,\n udp,\n });\n parsePeers(node, wg[\"peer\"] ?? \"\");\n break;\n }\n case \"anytls\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"sni\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark,\n scv,\n server,\n sni: host,\n tfo,\n udp,\n });\n break;\n }\n default: {\n const handled = parseQuanxStyle(remark, configs, node, { scv, tfo, tls13, udp });\n if (!handled) {\n continue;\n }\n break;\n }\n }\n\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n return nodes.length > startCount;\n}\n\ninterface QuanxFlags {\n udp: TriBool;\n tfo: TriBool;\n scv: TriBool;\n tls13: TriBool;\n}\n\nfunction parseQuanxStyle(\n remark: string,\n configs: string[],\n node: Proxy,\n flags: QuanxFlags,\n): boolean {\n const kind = remark.toLowerCase();\n const first = configs[0] as string;\n const lastColon = first.lastIndexOf(\":\");\n const server = trim(first.slice(0, lastColon));\n const port = trim(first.slice(lastColon + 1));\n if (port === \"0\") {\n return false;\n }\n let method = \"\";\n let password = \"\";\n let username = \"\";\n let host = \"\";\n let path = \"\";\n let plugin = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let protocol = \"\";\n let protocolParam = \"\";\n let tls = \"\";\n let net = \"tcp\";\n let id = \"\";\n let aead = \"1\";\n let newRemark = remark;\n const udp = flags.udp;\n const tfo = flags.tfo;\n let scv = flags.scv;\n const tls13 = flags.tls13;\n\n const kv: { [key: string]: string } = {};\n for (let i = 1; i < configs.length; i += 1) {\n const vArray = split(trim(configs[i] as string), \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n kv[trim(vArray[0] as string)] = trim(vArray[1] as string);\n }\n\n if (kind === \"shadowsocks\") {\n method = kv[\"method\"] ?? \"\";\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n protocol = kv[\"ssr-protocol\"] ?? \"\";\n protocolParam = kv[\"ssr-protocol-param\"] ?? \"\";\n if (kv[\"obfs\"]) {\n const obfsVal = kv[\"obfs\"] as string;\n if (obfsVal === \"http\" || obfsVal === \"tls\") {\n plugin = \"simple-obfs\";\n pluginMode = obfsVal;\n } else if (obfsVal === \"wss\" || obfsVal === \"ws\") {\n if (obfsVal === \"wss\") {\n tls = \"tls\";\n }\n pluginMode = \"websocket\";\n plugin = \"v2ray-plugin\";\n } else {\n pluginMode = obfsVal;\n }\n }\n pluginHost = kv[\"obfs-host\"] ?? \"\";\n path = kv[\"obfs-uri\"] ?? \"\";\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n let pluginOption = \"\";\n if (plugin === \"simple-obfs\") {\n pluginOption = `obfs=${pluginMode}`;\n if (pluginHost !== \"\") {\n pluginOption += `;obfs-host=${pluginHost}`;\n }\n } else if (plugin === \"v2ray-plugin\") {\n if (pluginHost === \"\" && !/^\\d+(\\.\\d+){3}$/.test(server) && !server.includes(\":\")) {\n pluginHost = server;\n }\n pluginOption = `mode=${pluginMode}`;\n if (pluginHost !== \"\") {\n pluginOption += `;host=${pluginHost}`;\n }\n if (path !== \"\") {\n pluginOption += `;path=${path}`;\n }\n pluginOption += `;${tls}`;\n }\n if (protocol !== \"\") {\n ssrConstruct(node, {\n group: DEFAULT_GROUPS.ssr,\n method,\n obfs: pluginMode,\n obfsParam: pluginHost,\n password,\n port,\n protocol,\n protocolParam,\n remark: newRemark,\n scv,\n server,\n tfo,\n udp,\n });\n } else {\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls13,\n udp,\n });\n }\n return true;\n }\n\n if (kind === \"vmess\") {\n net = \"tcp\";\n method = kv[\"method\"] ?? \"\";\n id = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"obfs\"]) {\n const obfsVal = kv[\"obfs\"] as string;\n if (obfsVal === \"ws\") {\n net = \"ws\";\n } else if (obfsVal === \"over-tls\") {\n tls = \"tls\";\n } else if (obfsVal === \"wss\") {\n net = \"ws\";\n tls = \"tls\";\n }\n }\n host = kv[\"obfs-host\"] ?? \"\";\n path = kv[\"obfs-uri\"] ?? \"\";\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] === \"true\" ? \"tls\" : \"\";\n }\n if (kv[\"aead\"]) {\n aead = kv[\"aead\"] === \"true\" ? \"0\" : \"1\";\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n vmessConstruct(node, {\n add: server,\n aid: aead,\n cipher: method,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: newRemark,\n scv,\n tfo,\n tls,\n tls13,\n udp,\n });\n return true;\n }\n\n if (kind === \"trojan\") {\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] as string;\n }\n host = kv[\"tls-host\"] ?? \"\";\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n trojanConstruct(node, {\n group: DEFAULT_GROUPS.trojan,\n host,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls13,\n tlsSecure: tls === \"true\",\n udp,\n });\n return true;\n }\n\n if (kind === \"http\") {\n username = kv[\"username\"] ?? \"\";\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] as string;\n }\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n if (username === \"none\") {\n username = \"\";\n }\n if (password === \"none\") {\n password = \"\";\n }\n httpConstruct(node, {\n group: DEFAULT_GROUPS.http,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls: tls === \"true\",\n tls13,\n username,\n });\n return true;\n }\n\n if (kind === \"anytls\") {\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n host = kv[\"sni\"] ?? \"\";\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n sni: host,\n tfo,\n udp,\n });\n return true;\n }\n\n return false;\n}\n\nfunction trimQuote(input: string): string {\n let value = trim(input);\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n return value;\n}\n\n/** Parse a WireGuard `peer = (...)` blob into `node`. */\nexport function parsePeers(node: Proxy, data: string): void {\n const peers = [...data.matchAll(/\\((.*?)\\)/g)].map((m) => m[1] as string);\n if (peers.length === 0) {\n return;\n }\n const peer = peers[0] as string;\n const pairs = [...peer.matchAll(/([a-z-]+)\\s?=\\s?([^\" ),]+|\".*?\"),?\\s?/g)];\n for (const pair of pairs) {\n const key = pair[1] as string;\n const val = pair[2] as string;\n switch (key) {\n case \"public-key\":\n node.publicKey = val;\n break;\n case \"endpoint\": {\n const colon = val.lastIndexOf(\":\");\n node.hostname = val.slice(0, colon);\n node.port = toInt(val.slice(colon + 1));\n break;\n }\n case \"client-id\":\n node.clientId = val;\n break;\n case \"allowed-ips\":\n node.allowedIps = trimQuote(val);\n break;\n default:\n break;\n }\n }\n}\n\n/** Parse a Clash/plain YAML string into nodes (returns count). */\nexport function parseClashText(content: string, nodes: Proxy[]): boolean {\n try {\n const root = parseYaml(content);\n if (\n root &&\n typeof root === \"object\" &&\n (get(root, \"Proxy\") !== undefined || get(root, \"proxies\") !== undefined)\n ) {\n explodeClash(root, nodes);\n return true;\n }\n } catch {\n return false;\n }\n return false;\n}\n\n/** Parse an ss/ssr/v2ray configuration JSON blob (single or list). */\nexport function parseConfContent(content: string, nodes: Proxy[]): boolean {\n if (content.includes('\"version\"')) {\n explodeSsConf(content, nodes);\n } else if (content.includes('\"serverSubscribes\"')) {\n explodeSsrConf(content, nodes);\n } else if (content.includes('\"uiItem\"') || content.includes(\"vnext\")) {\n explodeVmessConf(content, nodes);\n } else if (content.includes('\"proxy_apps\"')) {\n explodeSsAndroid(content, nodes);\n } else if (content.includes('\"idInUse\"')) {\n explodeSstap(content, nodes);\n } else if (content.includes('\"local_address\"') && content.includes('\"local_port\"')) {\n explodeSsrConf(content, nodes);\n } else if (content.includes('\"ModeFileNameType\"')) {\n explodeNetchConf(content, nodes);\n } else {\n return false;\n }\n return nodes.length > 0;\n}\n\n/** Parse a Shadowsocks Android (`ssconf`) JSON config. */\nexport function explodeSsConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n const section = \"version\" in json && \"servers\" in json ? \"servers\" : \"configs\";\n if (!(section in json)) {\n return;\n }\n const group = asString(json.remarks);\n const list: any[] = json[section];\n if (!Array.isArray(list)) {\n return;\n }\n let index = nodes.length;\n for (const entry of list) {\n const remark = asString(entry.remarks);\n const port = asString(entry.server_port);\n if (port === \"0\") {\n continue;\n }\n const server = asString(entry.server);\n const node = createProxy();\n ssConstruct(node, {\n group,\n method: asString(entry.method),\n password: asString(entry.password),\n plugin: asString(entry.plugin),\n pluginOption: asString(entry.plugin_opts),\n port,\n remark: remark === \"\" ? `${server}:${port}` : remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a Shadowsocks Android (`com.github.shadowsocks`) node array. */\nexport function explodeSsAndroid(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(`{\"nodes\":${content}}`);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.nodes)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.nodes) {\n const server = asString(entry.server);\n if (server === \"\") {\n continue;\n }\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks);\n const node = createProxy();\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method: asString(entry.method),\n password: asString(entry.password),\n plugin: asString(entry.plugin),\n pluginOption: asString(entry.plugin_opts),\n port,\n remark: remark === \"\" ? `${server}:${port}` : remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a ShadowsocksR config JSON. */\nexport function explodeSsrConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n let index = nodes.length;\n if (\"local_port\" in json && \"local_address\" in json) {\n const node = createProxy();\n const server = asString(json.server);\n const port = asString(json.server_port);\n const remark = `${server}:${port}`;\n const method = asString(json.method);\n const obfs = asString(json.obfs);\n const protocol = asString(json.protocol);\n const password = asString(json.password);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin: asString(json.plugin),\n pluginOption: asString(json.plugin_opts),\n port,\n remark,\n server,\n });\n } else {\n ssrConstruct(node, {\n group: DEFAULT_GROUPS.ssr,\n method,\n obfs,\n obfsParam: asString(json.obfs_param),\n password,\n port,\n protocol,\n protocolParam: asString(json.protocol_param),\n remark,\n server,\n });\n }\n node.id = index;\n nodes.push(node);\n return;\n }\n\n const list: any[] = json.configs ?? [];\n if (!Array.isArray(list)) {\n return;\n }\n for (const entry of list) {\n const group = asString(entry.group) === \"\" ? DEFAULT_GROUPS.ssr : asString(entry.group);\n const server = asString(entry.server);\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks) === \"\" ? `${server}:${port}` : asString(entry.remarks);\n const node = createProxy();\n ssrConstruct(node, {\n group,\n method: asString(entry.method),\n obfs: asString(entry.obfs),\n obfsParam: asString(entry.obfsparam),\n password: asString(entry.password),\n port,\n protocol: asString(entry.protocol),\n protocolParam: asString(entry.protocolparam),\n remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a v2rayN config JSON. */\nexport function explodeVmessConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n let index = nodes.length;\n\n if (\"outbounds\" in json) {\n const outbounds = json.outbounds;\n if (\n Array.isArray(outbounds) &&\n outbounds.length > 0 &&\n outbounds[0]?.settings?.vnext?.length > 0\n ) {\n const vnext = outbounds[0].settings.vnext[0];\n const add = asString(vnext.address);\n const port = asString(vnext.port);\n if (port === \"0\") {\n return;\n }\n const users = vnext.users;\n const id = Array.isArray(users) && users.length ? asString(users[0].id) : \"\";\n const aid = Array.isArray(users) && users.length ? asString(users[0].alterId) : \"\";\n const cipher = Array.isArray(users) && users.length ? asString(users[0].security) : \"\";\n const stream = outbounds[0].streamSettings ?? {};\n const net = asString(stream.network);\n const tls = asString(stream.security);\n let path = \"\";\n let host = \"\";\n let edge = \"\";\n let type = \"\";\n if (net === \"ws\") {\n const ws = stream.wsSettings ?? {};\n path = asString(ws.path);\n if (ws.headers) {\n host = asString(ws.headers.Host);\n edge = asString(ws.headers.Edge);\n }\n }\n const tcp = stream.tcpSettings;\n if (tcp && tcp.header) {\n type = asString(tcp.header.type);\n if (type === \"http\" && tcp.header.request) {\n if (Array.isArray(tcp.header.request.path) && tcp.header.request.path.length) {\n path = asString(tcp.header.request.path[0]);\n }\n if (tcp.header.request.headers) {\n host = asString(tcp.header.request.headers.Host);\n edge = asString(tcp.header.request.headers.Edge);\n }\n }\n }\n const node = createProxy();\n vmessConstruct(node, {\n add,\n aid,\n cipher,\n edge,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: `${add}:${port}`,\n tls,\n type,\n });\n nodes.push(node);\n }\n return;\n }\n\n const subdata = new Map<string, string>();\n const subItems: any[] = json.subItem ?? [];\n for (const item of subItems) {\n subdata.set(asString(item.id), asString(item.remarks));\n }\n\n const list: any[] = json.vmess ?? [];\n for (const entry of list) {\n if (\n entry.address === null ||\n entry.address === undefined ||\n entry.port === null ||\n entry.id === null\n ) {\n continue;\n }\n let ps = asString(entry.remarks);\n const add = asString(entry.address);\n const port = asString(entry.port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const subid = asString(entry.subid);\n let group = \"\";\n if (subid !== \"\") {\n group = subdata.get(subid) ?? \"\";\n }\n if (ps === \"\") {\n ps = `${add}:${port}`;\n }\n const scv = asTri(entry.allowInsecure);\n const configType = toInt(entry.configType);\n const node = createProxy();\n if (configType === 1) {\n vmessConstruct(node, {\n add,\n aid: asString(entry.alterId),\n cipher: asString(entry.security),\n group: group || DEFAULT_GROUPS.v2ray,\n host: asString(entry.requestHost),\n id: asString(entry.id),\n net: asString(entry.network),\n path: asString(entry.path),\n port,\n remark: ps,\n scv,\n sni: asString(entry.sni),\n tls: asString(entry.streamSecurity),\n type: asString(entry.headerType),\n });\n } else if (configType === 3) {\n ssConstruct(node, {\n group: group || DEFAULT_GROUPS.ss,\n method: asString(entry.security),\n password: asString(entry.id),\n port,\n remark: ps,\n scv,\n server: add,\n });\n } else if (configType === 4) {\n socksConstruct(node, {\n group: group || DEFAULT_GROUPS.socks,\n port,\n remark: ps,\n scv,\n server: add,\n });\n } else {\n continue;\n }\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse an SSTap config JSON. */\nexport function explodeSstap(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.configs)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.configs) {\n const group = asString(entry.group);\n const server = asString(entry.server);\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks) === \"\" ? `${server}:${port}` : asString(entry.remarks);\n const password = asString(entry.password);\n const node = createProxy();\n const configType = toInt(entry.type);\n if (configType === 5) {\n socksConstruct(node, {\n group,\n password,\n port,\n remark,\n server,\n username: asString(entry.username),\n });\n } else if (configType === 6) {\n const protocol = asString(entry.protocol);\n const obfs = asString(entry.obfs);\n const method = asString(entry.method);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, { group, method, password, port, remark, server });\n } else {\n ssrConstruct(node, {\n group,\n method,\n obfs,\n obfsParam: asString(entry.obfsparam),\n password,\n port,\n protocol,\n protocolParam: asString(entry.protocolparam),\n remark,\n server,\n });\n }\n } else {\n continue;\n }\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a Netch config JSON. */\nexport function explodeNetchConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.Server)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.Server) {\n const node = createProxy();\n explodeNetch(`Netch://${base64Encode(JSON.stringify(entry))}`, node);\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n","import { isFlattenableSsr, isSsCipher } from \"./ciphers\";\nimport {\n anyTlsConstruct,\n httpConstruct,\n hysteria2Construct,\n hysteriaConstruct,\n snellConstruct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n tuicConstruct,\n vlessConstruct,\n vmessConstruct,\n wireGuardConstruct,\n} from \"./construct\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS, createProxy } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { split, toInt, trim } from \"../utils/string\";\nimport { getUrlArg, urlDecode } from \"../utils/url\";\n\n/** `true` when the link is a plain HTTP(S) subscription URL. */\nexport function isLink(link: string): boolean {\n return link.startsWith(\"http://\") || link.startsWith(\"https://\");\n}\n\nfunction firstMatch(input: string, pattern: string): string[] | null {\n const match = new RegExp(pattern).exec(input);\n return match ? match.slice() : null;\n}\n\n/** Parse `vmess://<base64 json>` or a variant link into `node`. */\nexport function explodeVmess(vmess: string, node: Proxy): void {\n if (/^vmess:\\/\\/[A-Za-z0-9-_]+\\?.*/.test(vmess)) {\n explodeShadowrocket(vmess, node);\n return;\n }\n if (/^vmess:\\/\\/.*?@.*/.test(vmess)) {\n explodeStdVmess(vmess, node);\n return;\n }\n if (/^vmess1:\\/\\/.*?\\?.*/.test(vmess)) {\n explodeKitsunebi(vmess, node);\n return;\n }\n\n const decoded = urlSafeBase64Decode(vmess.replace(/(vmess|vmess1):\\/\\//, \"\"));\n if (/.*?\\s=\\s.*/.test(decoded)) {\n explodeQuan(decoded, node);\n return;\n }\n\n let data: Record<string, unknown>;\n try {\n const parsed: unknown = JSON.parse(decoded);\n if (parsed === null || typeof parsed !== \"object\") {\n return;\n }\n data = parsed as Record<string, unknown>;\n } catch {\n return;\n }\n\n let version = \"1\";\n if (data[\"v\"] !== undefined) {\n version = String(data[\"v\"]);\n }\n const ps = String(data[\"ps\"] ?? \"\");\n let add = String(data[\"add\"] ?? \"\");\n const port = String(data[\"port\"] ?? \"\");\n if (port === \"0\" || port === \"\") {\n return;\n }\n const type = String(data[\"type\"] ?? \"\");\n const id = String(data[\"id\"] ?? \"\");\n const aid = String(data[\"aid\"] ?? \"\");\n const net = String(data[\"net\"] ?? \"\");\n const tls = String(data[\"tls\"] ?? \"\");\n let host = String(data[\"host\"] ?? \"\");\n const sni = String(data[\"sni\"] ?? \"\");\n let path = \"\";\n\n switch (toInt(version)) {\n case 1: {\n if (host !== \"\") {\n const parts = split(host, \";\");\n if (parts.length === 2) {\n host = parts[0] as string;\n path = parts[1] as string;\n }\n }\n break;\n }\n case 2: {\n path = String(data[\"path\"] ?? \"\");\n break;\n }\n default:\n break;\n }\n add = trim(add);\n\n vmessConstruct(node, {\n add,\n aid,\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: ps,\n sni,\n tls,\n type,\n });\n}\n\n/** Parse the `net:uuid-aid@host:port` VMess variant. */\nexport function explodeStdVmess(vmess: string, node: Proxy): void {\n let body = vmess.slice(8);\n let remark = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const matcher =\n /^([a-z]+)(?:\\+([a-z]+))?:([\\da-f]{4}(?:[\\da-f]{4}-){4}[\\da-f]{12})-(\\d+)@(.+):(\\d+)(?:\\/?\\?(.*))?$/;\n const match = matcher.exec(body);\n if (!match) {\n return;\n }\n const net = match[1] as string;\n const tls = match[2] ?? \"\";\n const id = match[3] as string;\n const aid = match[4] as string;\n const add = match[5] as string;\n const port = match[6] as string;\n const addition = match[7] ?? \"\";\n\n let type = \"\";\n let host = \"\";\n let path = \"\";\n switch (net) {\n case \"tcp\":\n case \"kcp\":\n type = getUrlArg(addition, \"type\");\n break;\n case \"http\":\n case \"ws\":\n host = getUrlArg(addition, \"host\");\n path = getUrlArg(addition, \"path\");\n break;\n case \"quic\":\n type = getUrlArg(addition, \"security\");\n host = getUrlArg(addition, \"type\");\n path = getUrlArg(addition, \"key\");\n break;\n default:\n return;\n }\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid,\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type,\n });\n}\n\n/** Parse a Shadowrocket-style VMess link. */\nexport function explodeShadowrocket(rocket: string, node: Proxy): void {\n let body = rocket.slice(8);\n let net = \"tcp\";\n const qpos = body.indexOf(\"?\");\n const addition = qpos >= 0 ? body.slice(qpos + 1) : \"\";\n body = qpos >= 0 ? body.slice(0, qpos) : body;\n\n const match = firstMatch(urlSafeBase64Decode(body), \"(.*?):(.*)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const cipher = match[1] as string;\n const id = match[2] as string;\n const add = match[3] as string;\n const port = match[4] as string;\n if (port === \"0\") {\n return;\n }\n let remark = urlDecode(getUrlArg(addition, \"remarks\"));\n const obfs = getUrlArg(addition, \"obfs\");\n let host = \"\";\n let path = \"\";\n const type = \"\";\n if (obfs !== \"\") {\n if (obfs === \"websocket\") {\n net = \"ws\";\n host = getUrlArg(addition, \"obfsParam\");\n path = getUrlArg(addition, \"path\");\n }\n } else {\n net = getUrlArg(addition, \"network\");\n host = getUrlArg(addition, \"wsHost\");\n path = getUrlArg(addition, \"wspath\");\n }\n const tls = getUrlArg(addition, \"tls\") === \"1\" ? \"tls\" : \"\";\n let aid = getUrlArg(addition, \"aid\");\n if (aid === \"\") {\n aid = \"0\";\n }\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid,\n cipher,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type,\n });\n}\n\n/** Parse a Kitsunebi-style `vmess1://` link. */\nexport function explodeKitsunebi(kit: string, node: Proxy): void {\n let body = kit.slice(9);\n let remark = \"\";\n let path = \"\";\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = body.slice(hashPos + 1);\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n const addition = qpos >= 0 ? body.slice(qpos + 1) : \"\";\n body = qpos >= 0 ? body.slice(0, qpos) : body;\n\n const match = firstMatch(body, \"(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const id = match[1] as string;\n const add = match[2] as string;\n let port = match[3] as string;\n const slash = port.indexOf(\"/\");\n if (slash !== -1) {\n path = port.slice(slash);\n port = port.slice(0, slash);\n }\n if (port === \"0\") {\n return;\n }\n const net = getUrlArg(addition, \"network\");\n const tls = getUrlArg(addition, \"tls\") === \"true\" ? \"tls\" : \"\";\n const host = getUrlArg(addition, \"ws.host\");\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid: \"0\",\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type: \"\",\n });\n}\n\n/** Parse a Quantumult `remarks = vmess, ...` definition. */\nexport function explodeQuan(quan: string, node: Proxy): void {\n const normalized = quan.replace(/(.*?)\\s=\\s(.*)/, \"$1,$2\");\n const configs = split(normalized, \",\");\n if (configs.length < 6 || configs[1] !== \"vmess\") {\n return;\n }\n const remark = trim(configs[0] as string);\n const add = trim(configs[2] as string);\n const port = trim(configs[3] as string);\n if (port === \"0\") {\n return;\n }\n const cipher = trim(configs[4] as string);\n const id = trim((configs[5] as string).replace(/\"/g, \"\"));\n\n let group: string = DEFAULT_GROUPS.v2ray;\n let tls = \"\";\n let host = \"\";\n let path = \"\";\n let net = \"tcp\";\n let edge = \"\";\n\n for (let i = 6; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray.slice(1).join(\"=\"));\n switch (itemName) {\n case \"group\":\n group = itemVal;\n break;\n case \"over-tls\":\n tls = itemVal === \"true\" ? \"tls\" : \"\";\n break;\n case \"tls-host\":\n host = itemVal;\n break;\n case \"obfs-path\":\n path = itemVal.replace(/\"/g, \"\");\n break;\n case \"obfs-header\": {\n const headers = split(itemVal.replace(/\"/g, \"\").replace(/\\[Rr\\]\\[Nn\\]/g, \"|\"), \"|\");\n for (const header of headers) {\n if (/Host: /i.test(header)) {\n host = header.slice(6);\n } else if (/Edge: /i.test(header)) {\n edge = header.slice(6);\n }\n }\n break;\n }\n case \"obfs\":\n if (itemVal === \"ws\") {\n net = \"ws\";\n }\n break;\n default:\n break;\n }\n }\n if (path === \"\") {\n path = \"/\";\n }\n vmessConstruct(node, {\n add,\n aid: \"0\",\n cipher,\n edge,\n group,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type: \"none\",\n });\n}\n\n/** Parse a `ss://` link into `node`. */\nexport function explodeSs(ss: string, node: Proxy): void {\n let body = ss.slice(5).replace(/\\/\\?/g, \"?\");\n const group: string = DEFAULT_GROUPS.ss;\n let remark = \"\";\n let addition = \"\";\n let plugin = \"\";\n let pluginOption = \"\";\n let resolvedGroup: string = group;\n\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n const plugins = urlDecode(getUrlArg(addition, \"plugin\"));\n const pluginPos = plugins.indexOf(\";\");\n plugin = pluginPos === -1 ? plugins : plugins.slice(0, pluginPos);\n pluginOption = pluginPos === -1 ? \"\" : plugins.slice(pluginPos + 1);\n const rawGroup = getUrlArg(addition, \"group\");\n if (rawGroup !== \"\") {\n resolvedGroup = urlSafeBase64Decode(rawGroup);\n }\n body = body.slice(0, qpos);\n }\n\n let method = \"\";\n let password = \"\";\n let server = \"\";\n let port = \"\";\n\n if (body.includes(\"@\")) {\n const match = firstMatch(body, \"(\\\\S+?)@(\\\\S+):(\\\\d+)\");\n if (!match) {\n return;\n }\n const secret = match[1] as string;\n server = match[2] as string;\n port = match[3] as string;\n // SIP002 userinfo has two forms: base64(\"method:password\") for classic\n // ciphers, and percent-encoded plaintext `method:password` for AEAD-2022.\n // Our base64 decoder is lossy, so disambiguate via the known ciphers.\n const raw = urlDecode(secret);\n const decoded = firstMatch(urlSafeBase64Decode(raw), \"(\\\\S+?):(\\\\S+)\");\n const plaintext = firstMatch(raw, \"(\\\\S+?):(\\\\S+)\");\n const secretMatch =\n decoded && isSsCipher(decoded[1] as string) ? decoded : (plaintext ?? decoded);\n if (!secretMatch) {\n return;\n }\n method = secretMatch[1] as string;\n password = secretMatch[2] as string;\n } else {\n const match = firstMatch(urlSafeBase64Decode(body), \"(\\\\S+?):(\\\\S+)@(\\\\S+):(\\\\d+)\");\n if (!match) {\n return;\n }\n method = match[1] as string;\n password = match[2] as string;\n server = match[3] as string;\n port = match[4] as string;\n }\n\n if (port === \"0\") {\n return;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n ssConstruct(node, {\n group: resolvedGroup,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n server,\n });\n}\n\n/** Parse a `ssr://` link into `node`. */\nexport function explodeSsr(ssr: string, node: Proxy): void {\n let body = ssr.slice(6).replace(/\\r/g, \"\");\n body = urlSafeBase64Decode(body);\n\n let group = \"\";\n let remark = \"\";\n let obfsParam = \"\";\n let protocolParam = \"\";\n\n const obfsPos = body.indexOf(\"/?\");\n if (obfsPos !== -1) {\n const strobfs = body.slice(obfsPos + 2);\n body = body.slice(0, obfsPos);\n group = urlSafeBase64Decode(getUrlArg(strobfs, \"group\"));\n remark = urlSafeBase64Decode(getUrlArg(strobfs, \"remarks\"));\n obfsParam = urlSafeBase64Decode(getUrlArg(strobfs, \"obfsparam\")).replace(/\\s/g, \"\");\n protocolParam = urlSafeBase64Decode(getUrlArg(strobfs, \"protoparam\")).replace(/\\s/g, \"\");\n }\n\n const match = firstMatch(body, \"(\\\\S+):(\\\\d+?):(\\\\S+?):(\\\\S+?):(\\\\S+?):(\\\\S+)\");\n if (!match) {\n return;\n }\n const server = match[1] as string;\n const port = match[2] as string;\n const protocol = match[3] as string;\n const method = match[4] as string;\n const obfs = match[5] as string;\n const password = urlSafeBase64Decode(match[6] as string);\n if (port === \"0\") {\n return;\n }\n\n const resolvedGroup = group === \"\" ? DEFAULT_GROUPS.ssr : group;\n const resolvedRemark = remark === \"\" ? `${server}:${port}` : remark;\n\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: resolvedGroup,\n method,\n password,\n port,\n remark: resolvedRemark,\n server,\n });\n } else {\n ssrConstruct(node, {\n group: resolvedGroup,\n method,\n obfs,\n obfsParam,\n password,\n port,\n protocol,\n protocolParam,\n remark: resolvedRemark,\n server,\n });\n }\n}\n\n/** Parse an `ssd://` (ShadowsocksD) subscription. */\nexport function explodeSsd(link: string, nodes: Proxy[]): void {\n let index = nodes.length;\n const decoded = urlSafeBase64Decode(link.slice(6));\n let data: any;\n try {\n data = JSON.parse(decoded);\n } catch {\n return;\n }\n if (data === null || typeof data !== \"object\" || !(\"servers\" in data)) {\n return;\n }\n const group = String(data.airport ?? \"\");\n const servers = data.servers;\n\n let entries: any[];\n if (Array.isArray(servers)) {\n entries = servers;\n } else if (servers !== null && typeof servers === \"object\") {\n entries = Object.keys(servers).map((key) => servers[key]);\n } else {\n return;\n }\n\n for (const entry of entries) {\n if (entry === null || typeof entry !== \"object\") {\n continue;\n }\n const server = String(entry.server ?? \"\");\n const port = String(entry.port ?? data.port ?? \"\");\n if (server === \"\" || port === \"\" || port === \"0\") {\n continue;\n }\n const remark = String(entry.remarks ?? \"\");\n const method = String(entry.encryption ?? data.encryption ?? \"\");\n const password = String(entry.password ?? data.password ?? \"\");\n const plugin = String(entry.plugin ?? data.plugin ?? \"\");\n const pluginOption = String(entry.plugin_options ?? data.plugin_options ?? \"\");\n const node = createProxy();\n ssConstruct(node, {\n group,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse `socks://`, `tg://socks`, or `https://t.me/socks` links. */\nexport function explodeSocks(link: string, node: Proxy): void {\n let group = \"\";\n let remark = \"\";\n let server = \"\";\n let port = \"\";\n let username = \"\";\n let password = \"\";\n\n if (link.includes(\"socks://\")) {\n let body = link;\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n body = urlSafeBase64Decode(body.slice(8));\n if (body.includes(\"@\")) {\n const userinfo = split(body, \"@\");\n if (userinfo.length < 2) {\n return;\n }\n body = userinfo[1] as string;\n const creds = split(userinfo[0] as string, \":\");\n if (creds.length < 2) {\n return;\n }\n username = creds[0] as string;\n password = creds[1] as string;\n }\n const args = split(body, \":\");\n if (args.length < 2) {\n return;\n }\n server = args[0] as string;\n port = args[1] as string;\n } else if (link.includes(\"https://t.me/socks\") || link.includes(\"tg://socks\")) {\n server = getUrlArg(link, \"server\");\n port = getUrlArg(link, \"port\");\n username = urlDecode(getUrlArg(link, \"user\"));\n password = urlDecode(getUrlArg(link, \"pass\"));\n remark = urlDecode(getUrlArg(link, \"remarks\"));\n group = urlDecode(getUrlArg(link, \"group\"));\n }\n\n if (group === \"\") {\n group = DEFAULT_GROUPS.socks;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n if (port === \"0\" || port === \"\") {\n return;\n }\n socksConstruct(node, { group, password, port, remark, server, username });\n}\n\n/** Parse a telegram-style HTTP proxy link. */\nexport function explodeHttp(link: string, node: Proxy): void {\n const server = getUrlArg(link, \"server\");\n const port = getUrlArg(link, \"port\");\n const username = urlDecode(getUrlArg(link, \"user\"));\n const password = urlDecode(getUrlArg(link, \"pass\"));\n let remark = urlDecode(getUrlArg(link, \"remarks\"));\n let group = urlDecode(getUrlArg(link, \"group\"));\n if (group === \"\") {\n group = DEFAULT_GROUPS.http;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n if (port === \"0\" || port === \"\") {\n return;\n }\n httpConstruct(node, {\n group,\n password,\n port,\n remark,\n server,\n tls: link.includes(\"/https\"),\n username,\n });\n}\n\n/** Parse an HTTP(S) link with base64-encoded credentials. */\nexport function explodeHttpSub(link: string, node: Proxy): void {\n let body = link;\n let remarks = \"\";\n let group = \"\";\n const tls = body.includes(\"https://\");\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n const addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n remarks = urlDecode(getUrlArg(addition, \"remarks\"));\n group = urlDecode(getUrlArg(addition, \"group\"));\n }\n body = body.slice(body.indexOf(\"://\") + 3);\n body = urlSafeBase64Decode(body);\n\n let server = \"\";\n let port = \"\";\n let username = \"\";\n let password = \"\";\n if (body.includes(\"@\")) {\n const match = firstMatch(body, \"(.*?):(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n username = match[1] as string;\n password = match[2] as string;\n server = match[3] as string;\n port = match[4] as string;\n } else {\n const match = firstMatch(body, \"(.*):(.*)\");\n if (!match) {\n return;\n }\n server = match[1] as string;\n port = match[2] as string;\n }\n if (group === \"\") {\n group = DEFAULT_GROUPS.http;\n }\n if (remarks === \"\") {\n remarks = `${server}:${port}`;\n }\n if (port === \"0\") {\n return;\n }\n httpConstruct(node, {\n group,\n password,\n port,\n remark: remarks,\n server,\n tls,\n username,\n });\n}\n\n/** Parse a `trojan://` link. */\nexport function explodeTrojan(trojan: string, node: Proxy): void {\n let body = trojan.slice(9);\n let remark = \"\";\n let addition = \"\";\n let host = \"\";\n let path = \"\";\n let network = \"\";\n\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n\n const match = firstMatch(body, \"(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const password = match[1] as string;\n const server = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n\n host = getUrlArg(addition, \"sni\");\n if (host === \"\") {\n host = getUrlArg(addition, \"peer\");\n }\n const tfo = getUrlArg(addition, \"tfo\");\n const group = urlDecode(getUrlArg(addition, \"group\"));\n\n if (getUrlArg(addition, \"ws\") === \"1\") {\n path = getUrlArg(addition, \"wspath\");\n network = \"ws\";\n } else if (getUrlArg(addition, \"type\") === \"ws\") {\n path = getUrlArg(addition, \"path\");\n if (path.startsWith(\"%2F\")) {\n path = urlDecode(path);\n }\n network = \"ws\";\n }\n\n const type = getUrlArg(addition, \"type\");\n const sni = getUrlArg(addition, \"sni\");\n const insecure = getUrlArg(addition, \"allowInsecure\");\n\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n trojanConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.trojan : group,\n host,\n network,\n password,\n path,\n port,\n remark,\n scv: insecure === \"\" ? undefined : parseTri(insecure),\n server,\n sni,\n tfo: tfo === \"\" ? undefined : parseTri(tfo),\n tlsSecure: type !== \"\" || true,\n });\n}\n\nfunction parseTri(value: string): TriBool {\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n return undefined;\n}\n\n/** Parse a `hysteria2://` / `hy2://` link. */\nexport function explodeHysteria2(link: string, node: Proxy): void {\n const body = link.replace(/(hysteria2|hy2):\\/\\//, \"hysteria2://\").replace(/\\/\\?/g, \"?\");\n if (/hysteria2:\\/\\/.*?[:].*/.test(body)) {\n explodeStdHysteria2(body, node);\n }\n}\n\nfunction explodeStdHysteria2(link: string, node: Proxy): void {\n let body = link.slice(12);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.lastIndexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n\n let password = \"\";\n let add = \"\";\n let port = \"\";\n if (body.includes(\"@\")) {\n const match = /^(.*?)@(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n password = match[1] as string;\n add = match[2] as string;\n port = match[3] as string;\n } else {\n password = getUrlArg(addition, \"password\");\n if (password === \"\") {\n return;\n }\n if (!body.includes(\":\")) {\n return;\n }\n const match = /^(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n add = match[1] as string;\n port = match[2] as string;\n }\n\n const scv = getUrlArg(addition, \"insecure\");\n const up = getUrlArg(addition, \"up\");\n const down = getUrlArg(addition, \"down\");\n const alpn = getUrlArg(addition, \"alpn\");\n const obfs = getUrlArg(addition, \"obfs\");\n const obfsPassword = getUrlArg(addition, \"obfs-password\");\n const sni = getUrlArg(addition, \"sni\");\n const fingerprint = getUrlArg(addition, \"pinSHA256\");\n const mport = getUrlArg(addition, \"mport\");\n const portsArg = getUrlArg(addition, \"ports\");\n const ports = portsArg !== \"\" ? portsArg : mport !== \"\" ? mport : port;\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n hysteria2Construct(node, {\n alpn,\n down,\n fingerprint,\n group: DEFAULT_GROUPS.hysteria2,\n obfs,\n obfsPassword,\n password,\n port,\n ports,\n remark,\n scv: scv === \"\" ? undefined : parseTri(scv),\n server: add,\n sni,\n up,\n });\n}\n\n/** Parse an `anytls://` link. */\nexport function explodeAnyTls(link: string, node: Proxy): void {\n let body = link.slice(9);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.lastIndexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?)@(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const password = match[1] as string;\n const add = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n const sni = getUrlArg(addition, \"sni\");\n const udp = getUrlArg(addition, \"udp\");\n const scv = getUrlArg(addition, \"insecure\");\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark,\n scv: scv === \"\" ? undefined : parseTri(scv),\n server: add,\n sni,\n udp: udp === \"\" ? undefined : parseTri(udp),\n });\n}\n\n/** Parse a `snell://psk@host:port?...` link. */\nexport function explodeSnell(link: string, node: Proxy): void {\n let body = link.slice(8);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.lastIndexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?)@(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const password = match[1] as string;\n const server = match[2] as string;\n const port = match[3] as string;\n if (password === \"\" || port === \"\" || port === \"0\") {\n return;\n }\n const obfs = getUrlArg(addition, \"obfs\");\n const host = getUrlArg(addition, \"host\");\n const version = getUrlArg(addition, \"version\");\n const udp = getUrlArg(addition, \"udp\");\n const tfo = getUrlArg(addition, \"tfo\");\n const scv = getUrlArg(addition, \"skip-cert-verify\");\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n snellConstruct(node, {\n group: DEFAULT_GROUPS.snell,\n host,\n obfs: obfs === \"\" ? \"none\" : obfs,\n password,\n port,\n remark,\n scv: scv === \"\" ? undefined : parseTri(scv),\n server,\n tfo: tfo === \"\" ? undefined : parseTri(tfo),\n udp: udp === \"\" ? undefined : parseTri(udp),\n version: version === \"\" ? 1 : toInt(version),\n });\n}\n\n/** Parse a `hysteria://host:port?...` (v1) link. */\nexport function explodeHysteria(link: string, node: Proxy): void {\n let body = link.slice(11);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.lastIndexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const server = match[1] as string;\n const port = match[2] as string;\n if (server === \"\" || port === \"0\") {\n return;\n }\n const auth = getUrlArg(addition, \"auth\");\n const protocol = getUrlArg(addition, \"protocol\");\n const upSpeed = getUrlArg(addition, \"upmbps\");\n const downSpeed = getUrlArg(addition, \"downmbps\");\n const alpn = getUrlArg(addition, \"alpn\");\n const obfs = getUrlArg(addition, \"obfs\");\n const obfsProtocol = getUrlArg(addition, \"obfsParam\");\n const sni = getUrlArg(addition, \"peer\");\n const insecure = getUrlArg(addition, \"insecure\");\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n hysteriaConstruct(node, {\n alpn,\n authStr: auth,\n downSpeed,\n group: DEFAULT_GROUPS.hysteria,\n obfs,\n obfsProtocol,\n port,\n protocol: protocol === \"\" ? \"udp\" : protocol,\n remark,\n scv: insecure === \"\" ? undefined : parseTri(insecure),\n server,\n sni: sni === \"\" ? server : sni,\n upSpeed,\n });\n}\n\n/** Parse a `wg://` / `wireguard://host:port?...` link. */\nexport function explodeWireguard(link: string, node: Proxy): void {\n const normalized = link.replace(/^(wg|wireguard):\\/\\//, \"wireguard://\");\n let body = normalized.slice(13);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.lastIndexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(?:(.*)@)?\\[?(.*?)]?:(\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const server = match[2] as string;\n const port = match[3] as string;\n if (server === \"\" || port === \"0\") {\n return;\n }\n const privateKey = getUrlArg(addition, \"privateKey\") || getUrlArg(addition, \"privatekey\");\n const publicKey = getUrlArg(addition, \"publicKey\") || getUrlArg(addition, \"publickey\");\n if (privateKey === \"\" || publicKey === \"\") {\n return;\n }\n const presharedKey = getUrlArg(addition, \"presharedKey\");\n const selfIp = getUrlArg(addition, \"selfIP\");\n const selfIpv6 = getUrlArg(addition, \"selfIPv6\");\n const mtu = getUrlArg(addition, \"mtu\");\n const keepAlive = getUrlArg(addition, \"keepAlive\");\n const dns = getUrlArg(addition, \"dns\");\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n wireGuardConstruct(node, {\n dnsServers: dns === \"\" ? [\"1.1.1.1\"] : dns.split(\",\").map((s) => s.trim()),\n group: DEFAULT_GROUPS.wireguard,\n keepAlive: keepAlive === \"\" ? 25 : toInt(keepAlive),\n mtu: mtu === \"\" ? 1420 : toInt(mtu),\n port,\n preSharedKey: presharedKey,\n privateKey,\n publicKey,\n remark,\n selfIp: selfIp === \"\" ? \"10.0.0.2\" : selfIp,\n selfIpv6,\n server,\n });\n}\n\n/** Parse a `vless://` link. */\nexport function explodeVless(link: string, node: Proxy): void {\n let body = link.slice(8);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?)@\\[?(.*?)\\]?:(\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const userId = match[1] as string;\n const server = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n const network = getUrlArg(addition, \"type\");\n const security = getUrlArg(addition, \"security\");\n const host = getUrlArg(addition, \"host\");\n const rawPath = urlDecode(getUrlArg(addition, \"path\"));\n const serviceName = urlDecode(getUrlArg(addition, \"serviceName\"));\n const path = rawPath !== \"\" ? rawPath : serviceName;\n const sni = getUrlArg(addition, \"sni\");\n const flow = getUrlArg(addition, \"flow\");\n const fingerprint = getUrlArg(addition, \"fp\");\n const publicKey = getUrlArg(addition, \"pbk\");\n const shortId = getUrlArg(addition, \"sid\");\n const alpn = getUrlArg(addition, \"alpn\");\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n vlessConstruct(node, {\n alpn: alpn === \"\" ? undefined : alpn.split(\",\"),\n fingerprint,\n flow,\n group: DEFAULT_GROUPS.v2ray,\n host,\n network,\n path,\n port,\n publicKey,\n remark,\n scv:\n getUrlArg(addition, \"allowInsecure\") === \"\"\n ? undefined\n : parseTri(getUrlArg(addition, \"allowInsecure\")),\n server,\n shortId,\n sni,\n tls: security,\n userId,\n });\n}\n\n/** Parse a `tuic://` link. */\nexport function explodeTuic(link: string, node: Proxy): void {\n let body = link.slice(7);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?):(.*?)@\\[?(.*?)\\]?:(\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const userId = match[1] as string;\n const password = match[2] as string;\n const server = match[3] as string;\n const port = match[4] as string;\n if (port === \"0\") {\n return;\n }\n const congestionControl =\n getUrlArg(addition, \"congestion_control\") || getUrlArg(addition, \"congestion-controller\");\n const alpn = getUrlArg(addition, \"alpn\");\n const sni = getUrlArg(addition, \"sni\");\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n tuicConstruct(node, {\n alpn: alpn === \"\" ? undefined : alpn.split(\",\"),\n congestionControl,\n group: DEFAULT_GROUPS.v2ray,\n password,\n port,\n remark,\n scv:\n getUrlArg(addition, \"allow_insecure\") === \"\"\n ? undefined\n : parseTri(getUrlArg(addition, \"allow_insecure\")),\n server,\n sni,\n userId,\n });\n}\n","import { explodeSurge, parseClashText, parseConfContent } from \"./conf\";\nimport { explodeNetch } from \"./netch\";\nimport {\n explodeAnyTls,\n explodeHttp,\n explodeHttpSub,\n explodeHysteria,\n explodeHysteria2,\n explodeSnell,\n explodeSs,\n explodeSsr,\n explodeSocks,\n explodeSsd,\n explodeTrojan,\n explodeTuic,\n explodeVless,\n explodeVmess,\n explodeWireguard,\n isLink,\n} from \"./uri\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, createProxy } from \"../types/proxy\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { countOccurrences, startsWith } from \"../utils/string\";\n\n/** Parse a single proxy link into `node`. */\nexport function explode(link: string, node: Proxy): void {\n if (startsWith(link, \"ssr://\")) {\n explodeSsr(link, node);\n } else if (startsWith(link, \"vmess://\") || startsWith(link, \"vmess1://\")) {\n explodeVmess(link, node);\n } else if (startsWith(link, \"ss://\")) {\n explodeSs(link, node);\n } else if (\n startsWith(link, \"socks://\") ||\n startsWith(link, \"https://t.me/socks\") ||\n startsWith(link, \"tg://socks\")\n ) {\n explodeSocks(link, node);\n } else if (startsWith(link, \"https://t.me/http\") || startsWith(link, \"tg://http\")) {\n explodeHttp(link, node);\n } else if (startsWith(link, \"Netch://\")) {\n explodeNetch(link, node);\n } else if (startsWith(link, \"trojan://\")) {\n explodeTrojan(link, node);\n } else if (startsWith(link, \"vless://\")) {\n explodeVless(link, node);\n } else if (startsWith(link, \"tuic://\")) {\n explodeTuic(link, node);\n } else if (startsWith(link, \"snell://\")) {\n explodeSnell(link, node);\n } else if (startsWith(link, \"hysteria://\")) {\n explodeHysteria(link, node);\n } else if (startsWith(link, \"wg://\") || startsWith(link, \"wireguard://\")) {\n explodeWireguard(link, node);\n } else if (link.includes(\"hysteria2://\") || link.includes(\"hy2://\")) {\n explodeHysteria2(link, node);\n } else if (startsWith(link, \"anytls://\")) {\n explodeAnyTls(link, node);\n } else if (isLink(link)) {\n explodeHttpSub(link, node);\n }\n}\n\n/** Parse a link string, returning a node when recognized. */\nexport function parseLink(link: string): Proxy | undefined {\n const node = createProxy();\n explode(link, node);\n return node.type === ProxyType.Unknown ? undefined : node;\n}\n\n/**\n * Parse a subscription body: SSD, Clash YAML, Surge INI, or a newline/space\n * delimited base64 list of links. Mirrors `explodeSub`.\n */\nexport function explodeSub(sub: string, nodes: Proxy[]): void {\n let processed = false;\n\n if (startsWith(sub, \"ssd://\")) {\n explodeSsd(sub, nodes);\n processed = true;\n }\n\n if (!processed && /\"?(Proxy|proxies)\"?:/.test(sub)) {\n if (parseClashText(sub, nodes)) {\n processed = true;\n }\n }\n\n if (!processed && explodeSurge(sub, nodes)) {\n processed = true;\n }\n\n if (processed) {\n return;\n }\n\n const body = urlSafeBase64Decode(sub);\n if (/(vmess|shadowsocks|http|trojan)\\s*?=/.test(body)) {\n if (explodeSurge(body, nodes)) {\n return;\n }\n }\n const before = nodes.length;\n splitLinks(body, nodes);\n if (nodes.length === before && body !== sub) {\n // Not a base64 body after all (e.g. a plain-text provider list).\n splitLinks(sub, nodes);\n }\n}\n\nfunction splitLinks(body: string, nodes: Proxy[]): void {\n const normalized = body.replace(/\\r\\n/g, \"\\n\");\n const delimiter =\n countOccurrences(normalized, \"\\n\") < 1\n ? countOccurrences(normalized, \"\\r\") < 1\n ? \" \"\n : \"\\r\"\n : \"\\n\";\n for (const rawLink of normalized.split(delimiter)) {\n const link = rawLink.replace(/\\r/g, \"\");\n if (link === \"\") {\n continue;\n }\n const node = createProxy();\n explode(link, node);\n if (node.type === ProxyType.Unknown) {\n continue;\n }\n nodes.push(node);\n }\n}\n\n/** Parse a config blob (Clash/SS/SSR/V2Ray/SSTap/Netch) or a subscription. */\nexport function parseSubscription(content: string): Proxy[] {\n const nodes: Proxy[] = [];\n if (parseConfContent(content, nodes)) {\n return nodes;\n }\n explodeSub(content, nodes);\n return nodes;\n}\n","import { stringify as yamlStringify } from \"yaml\";\n\nimport { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ClashFlavor, ExtraSettings } from \"../types/settings\";\nimport { base64Encode } from \"../utils/base64\";\nimport { getUrlArg, urlDecode } from \"../utils/url\";\n\nconst CLASHR_PROTOCOLS = [\n \"origin\",\n \"auth_sha1_v4\",\n \"auth_aes128_md5\",\n \"auth_aes128_sha1\",\n \"auth_chain_a\",\n \"auth_chain_b\",\n];\nconst CLASHR_OBFS = [\n \"plain\",\n \"http_simple\",\n \"http_post\",\n \"random_head\",\n \"tls1.2_ticket_auth\",\n \"tls1.2_ticket_fastauth\",\n];\nconst CLASH_SSR_CIPHERS = [\n \"rc4-md5\",\n \"aes-128-ctr\",\n \"aes-192-ctr\",\n \"aes-256-ctr\",\n \"aes-128-cfb\",\n \"aes-192-cfb\",\n \"aes-256-cfb\",\n \"chacha20-ietf\",\n \"xchacha20\",\n \"none\",\n];\n\ntype ClashProxy = Record<string, unknown>;\n\nfunction stripBrackets(value: string): string {\n return value.replace(/^\\[+/, \"\").replace(/\\]+$/, \"\");\n}\n\nfunction toTri(value: boolean | undefined): boolean | undefined {\n return value;\n}\n\n/** What a Clash-family kernel accepts; node/field drops follow this matrix. */\ninterface ClashCapabilities {\n /** Protocols the kernel can load; other nodes are dropped entirely. */\n protocols: ReadonlySet<ProxyType>;\n /** Whether uTLS `fingerprint` / `client-fingerprint` is understood. */\n clientFingerprint: boolean;\n /** Whether `reality-opts` is understood (reality nodes are dropped without it). */\n reality: boolean;\n}\n\nconst MIHOMO_PROTOCOLS: ReadonlySet<ProxyType> = new Set([\n ProxyType.Shadowsocks,\n ProxyType.ShadowsocksR,\n ProxyType.VMess,\n ProxyType.Trojan,\n ProxyType.Snell,\n ProxyType.HTTP,\n ProxyType.HTTPS,\n ProxyType.SOCKS5,\n ProxyType.WireGuard,\n ProxyType.Hysteria,\n ProxyType.Hysteria2,\n ProxyType.VLESS,\n ProxyType.AnyTLS,\n ProxyType.TUIC,\n]);\n\nconst PREMIUM_PROTOCOLS: ReadonlySet<ProxyType> = new Set([\n ProxyType.Shadowsocks,\n ProxyType.ShadowsocksR,\n ProxyType.VMess,\n ProxyType.Trojan,\n ProxyType.Snell,\n ProxyType.HTTP,\n ProxyType.HTTPS,\n ProxyType.SOCKS5,\n ProxyType.WireGuard,\n]);\n\nconst STASH_PROTOCOLS: ReadonlySet<ProxyType> = new Set([\n ...PREMIUM_PROTOCOLS,\n ProxyType.Hysteria,\n ProxyType.Hysteria2,\n ProxyType.VLESS,\n ProxyType.TUIC,\n]);\n\n/** Capability matrix per Clash kernel flavor (mirrors subconverter-rs). */\nfunction clashCapabilities(flavor: ClashFlavor): ClashCapabilities {\n if (flavor === \"premium\") {\n return { clientFingerprint: false, protocols: PREMIUM_PROTOCOLS, reality: false };\n }\n if (flavor === \"stash\") {\n return { clientFingerprint: false, protocols: STASH_PROTOCOLS, reality: true };\n }\n return { clientFingerprint: true, protocols: MIHOMO_PROTOCOLS, reality: true };\n}\n\nfunction buildClashProxy(\n x: Proxy,\n settings: ExtraSettings,\n clashR: boolean,\n remark: string,\n skipCertVerify: boolean | undefined,\n tfo: boolean | undefined,\n): ClashProxy | undefined {\n const proxy: ClashProxy = {\n name: remark,\n port: x.port,\n server: stripBrackets(x.hostname),\n };\n const caps = clashCapabilities(settings.clashFlavor);\n if (!caps.protocols.has(x.type)) {\n return undefined;\n }\n\n switch (x.type) {\n case ProxyType.Shadowsocks: {\n if (settings.filterDeprecated && x.encryptMethod === \"chacha20\") {\n return undefined;\n }\n proxy.type = \"ss\";\n proxy.cipher = x.encryptMethod;\n proxy.password = x.password;\n const pluginOpts = x.pluginOption.replace(/;/g, \"&\");\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n proxy.plugin = \"obfs\";\n proxy[\"plugin-opts\"] = {\n host: urlDecode(getUrlArg(pluginOpts, \"obfs-host\")),\n mode: urlDecode(getUrlArg(pluginOpts, \"obfs\")),\n };\n } else if (x.plugin === \"v2ray-plugin\") {\n proxy.plugin = \"v2ray-plugin\";\n const opts: Record<string, unknown> = {\n host: getUrlArg(pluginOpts, \"host\"),\n mode: getUrlArg(pluginOpts, \"mode\"),\n mux: pluginOpts.includes(\"mux\"),\n path: getUrlArg(pluginOpts, \"path\"),\n tls: pluginOpts.includes(\"tls\"),\n };\n if (skipCertVerify !== undefined) {\n opts[\"skip-cert-verify\"] = skipCertVerify;\n }\n proxy[\"plugin-opts\"] = opts;\n }\n break;\n }\n case ProxyType.VMess: {\n proxy.type = \"vmess\";\n proxy.uuid = x.userId;\n proxy.alterId = x.alterId;\n proxy.cipher = x.encryptMethod;\n proxy.tls = x.tlsSecure;\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.serverName !== \"\") {\n proxy.servername = x.serverName;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n if (settings.clashNewFieldName) {\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" || x.edge !== \"\"\n ? {\n headers: {\n ...(x.edge !== \"\" ? { Edge: x.edge } : {}),\n ...(x.host !== \"\" ? { Host: x.host } : {}),\n },\n }\n : {}),\n path: x.path,\n };\n } else {\n proxy[\"ws-path\"] = x.path;\n if (x.host !== \"\" || x.edge !== \"\") {\n proxy[\"ws-headers\"] = {\n ...(x.edge !== \"\" ? { Edge: x.edge } : {}),\n ...(x.host !== \"\" ? { Host: x.host } : {}),\n };\n }\n }\n break;\n case \"http\":\n proxy.network = x.transferProtocol;\n proxy[\"http-opts\"] = {\n ...(x.host !== \"\" || x.edge !== \"\"\n ? {\n headers: {\n ...(x.edge !== \"\" ? { Edge: [x.edge] } : {}),\n ...(x.host !== \"\" ? { Host: [x.host] } : {}),\n },\n }\n : {}),\n method: \"GET\",\n path: [x.path],\n };\n break;\n case \"h2\":\n proxy.network = x.transferProtocol;\n proxy[\"h2-opts\"] = {\n ...(x.host !== \"\" ? { host: [x.host] } : {}),\n path: x.path,\n };\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n proxy.servername = x.host;\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n break;\n default:\n return undefined;\n }\n break;\n }\n case ProxyType.ShadowsocksR: {\n if (settings.filterDeprecated) {\n if (!clashR && !CLASH_SSR_CIPHERS.includes(x.encryptMethod)) {\n return undefined;\n }\n if (!CLASHR_PROTOCOLS.includes(x.protocol)) {\n return undefined;\n }\n if (!CLASHR_OBFS.includes(x.obfs)) {\n return undefined;\n }\n }\n proxy.type = \"ssr\";\n proxy.cipher = x.encryptMethod === \"none\" ? \"dummy\" : x.encryptMethod;\n proxy.password = x.password;\n proxy.protocol = x.protocol;\n proxy.obfs = x.obfs;\n if (clashR) {\n proxy.protocolparam = x.protocolParam;\n proxy.obfsparam = x.obfsParam;\n } else {\n proxy[\"protocol-param\"] = x.protocolParam;\n proxy[\"obfs-param\"] = x.obfsParam;\n }\n break;\n }\n case ProxyType.SOCKS5:\n proxy.type = \"socks5\";\n if (x.username !== \"\") {\n proxy.username = x.username;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxy.type = \"http\";\n if (x.username !== \"\") {\n proxy.username = x.username;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n proxy.tls = x.tlsSecure;\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.Trojan:\n proxy.type = \"trojan\";\n proxy.password = x.password;\n if (x.host !== \"\") {\n proxy.sni = x.host;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n if (x.path !== \"\") {\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n }\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" ? { headers: { Host: x.host } } : {}),\n path: x.path,\n };\n break;\n default:\n break;\n }\n break;\n case ProxyType.Snell:\n if (x.snellVersion >= 4) {\n return undefined;\n }\n proxy.type = \"snell\";\n proxy.psk = x.password;\n if (x.snellVersion !== 0) {\n proxy.version = x.snellVersion;\n }\n if (x.obfs !== \"\") {\n proxy[\"obfs-opts\"] = {\n ...(x.host !== \"\" ? { host: x.host } : {}),\n mode: x.obfs,\n };\n }\n break;\n case ProxyType.WireGuard:\n proxy.type = \"wireguard\";\n proxy[\"public-key\"] = x.publicKey;\n proxy[\"private-key\"] = x.privateKey;\n proxy.ip = x.selfIp;\n if (x.selfIpv6 !== \"\") {\n proxy.ipv6 = x.selfIpv6;\n }\n if (x.preSharedKey !== \"\") {\n proxy[\"preshared-key\"] = x.preSharedKey;\n }\n if (x.dnsServers.length > 0) {\n proxy.dns = x.dnsServers;\n }\n if (x.mtu > 0) {\n proxy.mtu = x.mtu;\n }\n break;\n case ProxyType.Hysteria: {\n proxy.type = \"hysteria\";\n if (x.ports !== \"\") {\n proxy.ports = x.ports;\n }\n if (x.protocol !== \"\") {\n proxy.protocol = x.protocol;\n }\n if (x.obfsParam !== \"\") {\n proxy[\"obfs-protocol\"] = x.obfsParam;\n }\n if (x.up !== \"\") {\n proxy.up = x.up;\n }\n if (x.upSpeed) {\n proxy[\"up-speed\"] = x.upSpeed;\n }\n if (x.down !== \"\") {\n proxy.down = x.down;\n }\n if (x.downSpeed) {\n proxy[\"down-speed\"] = x.downSpeed;\n }\n if (x.authStr !== \"\") {\n proxy[\"auth-str\"] = x.authStr;\n proxy.auth = base64Encode(x.authStr);\n }\n if (x.obfs !== \"\") {\n proxy.obfs = x.obfs;\n }\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.fingerprint !== \"\" && caps.clientFingerprint) {\n proxy.fingerprint = x.fingerprint;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n proxy.ca = x.ca;\n }\n if (x.caStr !== \"\") {\n proxy[\"ca-str\"] = x.caStr;\n }\n if (x.recvWindowConn) {\n proxy[\"recv-window-conn\"] = x.recvWindowConn;\n }\n if (x.recvWindow) {\n proxy[\"recv-window\"] = x.recvWindow;\n }\n if (x.disableMtuDiscovery !== undefined) {\n proxy[\"disable-mtu-discovery\"] = x.disableMtuDiscovery;\n }\n if (x.tcpFastOpen !== undefined) {\n proxy[\"fast-open\"] = x.tcpFastOpen;\n }\n if (x.hopInterval) {\n proxy[\"hop-interval\"] = x.hopInterval;\n }\n break;\n }\n case ProxyType.Hysteria2:\n proxy.type = \"hysteria2\";\n if (x.ports !== \"\") {\n proxy.ports = x.ports;\n }\n if (x.upSpeed) {\n proxy.up = x.upSpeed;\n }\n if (x.downSpeed) {\n proxy.down = x.downSpeed;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n if (x.obfs !== \"\") {\n proxy.obfs = x.obfs;\n }\n if (x.obfsParam !== \"\") {\n proxy[\"obfs-password\"] = x.obfsParam;\n }\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.fingerprint !== \"\" && caps.clientFingerprint) {\n proxy.fingerprint = x.fingerprint;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n proxy.ca = x.ca;\n }\n if (x.caStr !== \"\") {\n proxy[\"ca-str\"] = x.caStr;\n }\n if (x.cwnd) {\n proxy.cwnd = x.cwnd;\n }\n if (x.hopInterval) {\n proxy[\"hop-interval\"] = x.hopInterval;\n }\n break;\n case ProxyType.AnyTLS:\n proxy.type = \"anytls\";\n proxy.password = x.password;\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.VLESS:\n proxy.type = \"vless\";\n proxy.uuid = x.userId;\n if (x.flow !== \"\") {\n proxy.flow = x.flow;\n }\n proxy.tls = x.tlsSecure;\n if (x.serverName !== \"\") {\n proxy.servername = x.serverName;\n }\n if (x.fingerprint !== \"\" && caps.clientFingerprint) {\n proxy[\"client-fingerprint\"] = x.fingerprint;\n }\n if (x.publicKey !== \"\" || x.shortId !== \"\") {\n // Kernels without reality-opts cannot use reality nodes at all.\n if (!caps.reality) {\n return undefined;\n }\n const realityOpts: Record<string, unknown> = {};\n if (x.publicKey !== \"\") {\n realityOpts[\"public-key\"] = x.publicKey;\n }\n realityOpts[\"short-id\"] = x.shortId;\n proxy[\"reality-opts\"] = realityOpts;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" ? { headers: { Host: x.host } } : {}),\n path: x.path,\n };\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n break;\n default:\n break;\n }\n break;\n case ProxyType.TUIC:\n proxy.type = \"tuic\";\n proxy.uuid = x.userId;\n proxy.password = x.password;\n if (x.congestionControl !== \"\") {\n proxy[\"congestion-controller\"] = x.congestionControl;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.serverName !== \"\") {\n proxy.sni = x.serverName;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n default:\n return undefined;\n }\n\n if (udpEnabled(x, settings) && x.type !== ProxyType.Snell) {\n proxy.udp = true;\n }\n if (tfo !== undefined) {\n proxy.tfo = tfo;\n }\n if (settings.clashNewFieldName && x.underlyingProxy !== \"\") {\n proxy[\"dialer-proxy\"] = x.underlyingProxy;\n }\n return proxy;\n}\n\nfunction udpEnabled(x: Proxy, settings: ExtraSettings): boolean {\n return x.udp !== undefined ? x.udp : settings.udp === true;\n}\n\nexport interface ClashBuildResult {\n doc: Record<string, unknown>;\n nodeList: Proxy[];\n}\n\n/** Build the Clash document object (without serialization). */\nexport function buildClash(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n clashR = false,\n): ClashBuildResult {\n const proxies: ClashProxy[] = [];\n const nodeList: Proxy[] = [];\n const remarksList: string[] = [];\n\n for (const x of nodes) {\n const type = proxyTypeName(x.type);\n if (settings.appendProxyType) {\n x.remark = `[${type}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList, false);\n x.remark = remark;\n\n const skipCertVerify =\n x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const built = buildClashProxy(x, settings, clashR, remark, toTri(skipCertVerify), toTri(tfo));\n if (!built) {\n continue;\n }\n proxies.push(built);\n remarksList.push(remark);\n nodeList.push(x);\n }\n\n if (settings.nodeList) {\n return { doc: { proxies }, nodeList };\n }\n\n const groups: unknown[] = [];\n for (const group of extraProxyGroup) {\n const singlegroup: Record<string, unknown> = {\n name: group.name,\n type: group.type === \"smart\" ? \"url-test\" : group.type,\n };\n switch (group.type) {\n case \"select\":\n case \"relay\":\n break;\n case \"load-balance\":\n singlegroup.strategy = group.strategy;\n singlegroup.lazy = group.lazy;\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n case \"smart\":\n case \"url-test\":\n if (group.lazy !== undefined) {\n singlegroup.lazy = group.lazy;\n }\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n case \"fallback\":\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n default:\n continue;\n }\n if (group.disableUdp !== undefined) {\n singlegroup[\"disable-udp\"] = group.disableUdp;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodeList, filtered, true);\n }\n if (group.usingProvider.length > 0) {\n singlegroup.use = group.usingProvider;\n } else {\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n singlegroup.proxies = filtered;\n }\n groups.push(singlegroup);\n }\n\n const doc: Record<string, unknown> = {};\n if (settings.clashNewFieldName) {\n doc.proxies = proxies;\n if (groups.length > 0) {\n doc[\"proxy-groups\"] = groups;\n }\n } else {\n doc.Proxy = proxies;\n if (groups.length > 0) {\n doc[\"Proxy Group\"] = groups;\n }\n }\n return { doc, nodeList };\n}\n\n/** Serialize a Clash document built by {@link buildClash}. */\nexport function stringifyClash(doc: Record<string, unknown>): string {\n return yamlStringify(doc, {\n aliasDuplicateObjects: false,\n lineWidth: 0,\n });\n}\n\n/** Convert nodes into a Clash YAML configuration string. */\nexport function toClash(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n clashR = false,\n): string {\n const { doc } = buildClash(nodes, extraProxyGroup, settings, clashR);\n return stringifyClash(doc);\n}\n","/**\n * ISO 3166-1 alpha-2 region helpers.\n *\n * Emitted prefixes are always the uppercase ISO code (`US-server1`) so node\n * names stay stable across locales. Multilingual names (Chinese/English\n * spellings, flag emoji) are only recognized by `hasRegionName` so existing\n * names are never double-prefixed.\n */\n\n/** All ISO 3166-1 alpha-2 codes, sorted, used for alias detection. */\nconst REGION_CODES = [\n \"AD\",\n \"AE\",\n \"AF\",\n \"AG\",\n \"AI\",\n \"AL\",\n \"AM\",\n \"AO\",\n \"AQ\",\n \"AR\",\n \"AS\",\n \"AT\",\n \"AU\",\n \"AW\",\n \"AX\",\n \"AZ\",\n \"BA\",\n \"BB\",\n \"BD\",\n \"BE\",\n \"BF\",\n \"BG\",\n \"BH\",\n \"BI\",\n \"BJ\",\n \"BL\",\n \"BM\",\n \"BN\",\n \"BO\",\n \"BQ\",\n \"BR\",\n \"BS\",\n \"BT\",\n \"BV\",\n \"BW\",\n \"BY\",\n \"BZ\",\n \"CA\",\n \"CC\",\n \"CD\",\n \"CF\",\n \"CG\",\n \"CH\",\n \"CI\",\n \"CK\",\n \"CL\",\n \"CM\",\n \"CN\",\n \"CO\",\n \"CR\",\n \"CU\",\n \"CV\",\n \"CW\",\n \"CX\",\n \"CY\",\n \"CZ\",\n \"DE\",\n \"DJ\",\n \"DK\",\n \"DM\",\n \"DO\",\n \"DZ\",\n \"EC\",\n \"EE\",\n \"EG\",\n \"EH\",\n \"ER\",\n \"ES\",\n \"ET\",\n \"FI\",\n \"FJ\",\n \"FK\",\n \"FM\",\n \"FO\",\n \"FR\",\n \"GA\",\n \"GB\",\n \"GD\",\n \"GE\",\n \"GF\",\n \"GG\",\n \"GH\",\n \"GI\",\n \"GL\",\n \"GM\",\n \"GN\",\n \"GP\",\n \"GQ\",\n \"GR\",\n \"GS\",\n \"GT\",\n \"GU\",\n \"GW\",\n \"GY\",\n \"HK\",\n \"HM\",\n \"HN\",\n \"HR\",\n \"HT\",\n \"HU\",\n \"ID\",\n \"IE\",\n \"IL\",\n \"IM\",\n \"IN\",\n \"IO\",\n \"IQ\",\n \"IR\",\n \"IS\",\n \"IT\",\n \"JE\",\n \"JM\",\n \"JO\",\n \"JP\",\n \"KE\",\n \"KG\",\n \"KH\",\n \"KI\",\n \"KM\",\n \"KN\",\n \"KP\",\n \"KR\",\n \"KW\",\n \"KY\",\n \"KZ\",\n \"LA\",\n \"LB\",\n \"LC\",\n \"LI\",\n \"LK\",\n \"LR\",\n \"LS\",\n \"LT\",\n \"LU\",\n \"LV\",\n \"LY\",\n \"MA\",\n \"MC\",\n \"MD\",\n \"ME\",\n \"MF\",\n \"MG\",\n \"MH\",\n \"MK\",\n \"ML\",\n \"MM\",\n \"MN\",\n \"MO\",\n \"MP\",\n \"MQ\",\n \"MR\",\n \"MS\",\n \"MT\",\n \"MU\",\n \"MV\",\n \"MW\",\n \"MX\",\n \"MY\",\n \"MZ\",\n \"NA\",\n \"NC\",\n \"NE\",\n \"NF\",\n \"NG\",\n \"NI\",\n \"NL\",\n \"NO\",\n \"NP\",\n \"NR\",\n \"NU\",\n \"NZ\",\n \"OM\",\n \"PA\",\n \"PE\",\n \"PF\",\n \"PG\",\n \"PH\",\n \"PK\",\n \"PL\",\n \"PM\",\n \"PN\",\n \"PR\",\n \"PS\",\n \"PT\",\n \"PW\",\n \"PY\",\n \"QA\",\n \"RE\",\n \"RO\",\n \"RS\",\n \"RU\",\n \"RW\",\n \"SA\",\n \"SB\",\n \"SC\",\n \"SD\",\n \"SE\",\n \"SG\",\n \"SH\",\n \"SI\",\n \"SJ\",\n \"SK\",\n \"SL\",\n \"SM\",\n \"SN\",\n \"SO\",\n \"SR\",\n \"SS\",\n \"ST\",\n \"SV\",\n \"SX\",\n \"SY\",\n \"SZ\",\n \"TC\",\n \"TD\",\n \"TF\",\n \"TG\",\n \"TH\",\n \"TJ\",\n \"TK\",\n \"TL\",\n \"TM\",\n \"TN\",\n \"TO\",\n \"TR\",\n \"TT\",\n \"TV\",\n \"TW\",\n \"TZ\",\n \"UA\",\n \"UG\",\n \"UM\",\n \"US\",\n \"UY\",\n \"UZ\",\n \"VA\",\n \"VC\",\n \"VE\",\n \"VG\",\n \"VI\",\n \"VN\",\n \"VU\",\n \"WF\",\n \"WS\",\n \"YE\",\n \"YT\",\n \"ZA\",\n \"ZM\",\n \"ZW\",\n] as const;\n\nconst REGION_CODE_SET = new Set<string>(REGION_CODES);\n\n/** Compact Chinese names for regions whose CLDR name is too long for a node. */\nconst ZH_OVERRIDES: Record<string, string> = {\n AE: \"阿联酋\",\n BN: \"文莱\",\n BO: \"玻利维亚\",\n CD: \"刚果(金)\",\n CG: \"刚果(布)\",\n CV: \"佛得角\",\n CZ: \"捷克\",\n DO: \"多米尼加\",\n HK: \"香港\",\n KH: \"柬埔寨\",\n KP: \"朝鲜\",\n KR: \"韩国\",\n LA: \"老挝\",\n MD: \"摩尔多瓦\",\n MK: \"北马其顿\",\n MM: \"缅甸\",\n MO: \"澳门\",\n NL: \"荷兰\",\n PS: \"巴勒斯坦\",\n RU: \"俄罗斯\",\n SY: \"叙利亚\",\n SZ: \"斯威士兰\",\n TL: \"东帝汶\",\n TW: \"台湾\",\n TZ: \"坦桑尼亚\",\n VA: \"梵蒂冈\",\n VE: \"委内瑞拉\",\n};\n\n/** Compact names for regions whose CLDR name is too long for a node. */\nconst EN_OVERRIDES: Record<string, string> = {\n HK: \"Hong Kong\",\n MO: \"Macau\",\n PS: \"Palestine\",\n TW: \"Taiwan\",\n};\n\n/** Extra spellings seen in subscription node names. */\nconst EXTRA_ALIASES = [\n \"Burma\",\n \"Cape Verde\",\n \"Czechia\",\n \"East Timor\",\n \"Holland\",\n \"Hong Kong\",\n \"Macao\",\n \"Macau\",\n \"North Korea\",\n \"South Korea\",\n \"UAE\",\n \"UK\",\n \"USA\",\n \"United Kingdom\",\n \"United States\",\n];\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst displayNameCache = new Map<string, Intl.DisplayNames>();\n\nfunction displayNames(locale: string): Intl.DisplayNames | undefined {\n const cached = displayNameCache.get(locale);\n if (cached) {\n return cached;\n }\n try {\n const created = new Intl.DisplayNames([locale], { fallback: \"code\", type: \"region\" });\n displayNameCache.set(locale, created);\n return created;\n } catch {\n return undefined;\n }\n}\n\n/** Normalize a region code, returning `\"\"` when it is not two ASCII letters. */\nfunction normalizeRegionCode(code: string): string {\n const upper = code.trim().toUpperCase();\n return /^[A-Z]{2}$/.test(upper) ? upper : \"\";\n}\n\n/**\n * Normalize user input to an ISO 3166-1 alpha-2 code (`\"us\"` -> `\"US\"`),\n * or `undefined` when it is not a known region. Used for country filters.\n */\nexport function normalizeCountryCode(code: string): string | undefined {\n const upper = normalizeRegionCode(code);\n return upper !== \"\" && isRegionCode(upper) ? upper : undefined;\n}\n\n/** Localized country/region name for alias detection only (never emitted). */\nfunction displayName(code: string, locale: string): string {\n const upper = normalizeRegionCode(code);\n if (upper === \"\") {\n return code.trim();\n }\n if (locale.toLowerCase().startsWith(\"zh\") && ZH_OVERRIDES[upper] !== undefined) {\n return ZH_OVERRIDES[upper] as string;\n }\n if (locale.toLowerCase().startsWith(\"en\") && EN_OVERRIDES[upper] !== undefined) {\n return EN_OVERRIDES[upper] as string;\n }\n const names = displayNames(locale);\n return names?.of(upper) ?? upper;\n}\n\n/** Flag emoji for a region code, or `\"\"` when the code is invalid. */\nfunction regionFlag(code: string): string {\n const upper = normalizeRegionCode(code);\n if (upper === \"\") {\n return \"\";\n }\n const base = 0x1f1e6;\n return String.fromCodePoint(base + upper.charCodeAt(0) - 65, base + upper.charCodeAt(1) - 65);\n}\n\n/** `true` when the code is a known ISO 3166-1 alpha-2 region. */\nexport function isRegionCode(code: string): boolean {\n return REGION_CODE_SET.has(normalizeRegionCode(code));\n}\n\nlet aliasRegex: RegExp | undefined;\n\nfunction buildAliasRegex(): RegExp {\n const ascii: string[] = [];\n const other: string[] = [];\n const seen = new Set<string>();\n const add = (alias: string): void => {\n const trimmed = alias.trim();\n if (trimmed.length < 2 || seen.has(trimmed)) {\n return;\n }\n seen.add(trimmed);\n if (/^[\\x20-\\x7e]+$/.test(trimmed)) {\n ascii.push(escapeRegExp(trimmed));\n } else {\n other.push(escapeRegExp(trimmed));\n }\n };\n for (const code of REGION_CODES) {\n add(displayName(code, \"zh-CN\"));\n add(displayName(code, \"en\"));\n add(regionFlag(code));\n }\n for (const alias of EXTRA_ALIASES) {\n add(alias);\n }\n const parts: string[] = [];\n if (ascii.length > 0) {\n parts.push(`(?<![A-Za-z])(?:${ascii.join(\"|\")})(?![A-Za-z])`);\n }\n if (other.length > 0) {\n parts.push(`(?:${other.join(\"|\")})`);\n }\n return new RegExp(parts.join(\"|\"), \"iu\");\n}\n\nfunction getAliasRegex(): RegExp {\n aliasRegex ??= buildAliasRegex();\n return aliasRegex;\n}\n\n/**\n * `true` when a node name already mentions a country/region — a localized\n * name, a common English spelling, a flag emoji, or an ISO code token such as\n * `US` in `US-01` / `US01`.\n */\nexport function hasRegionName(remark: string): boolean {\n const text = remark.trim();\n if (text === \"\") {\n return false;\n }\n if (getAliasRegex().test(text)) {\n return true;\n }\n for (const token of text.split(/[^\\p{L}\\p{N}]+/u)) {\n if (token === \"\") {\n continue;\n }\n if (/^\\p{Lu}{2}$/u.test(token) && isRegionCode(token)) {\n return true;\n }\n // `US01` / `us01`: an uppercase code prefix, or a lowercase one followed\n // by at least two digits (so `no1`, `in1` are not read as Norway/India).\n if (/^[A-Za-z]{2}\\d{2}/.test(token) && isRegionCode(token.slice(0, 2))) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Prefix a remark with the ISO country code (e.g. `server1` -> `US-server1`).\n * An empty remark becomes just the code. Invalid codes leave the remark\n * unchanged.\n */\nexport function formatCountryRemark(remark: string, code: string): string {\n const normalized = normalizeCountryCode(code);\n const trimmed = remark.trim();\n if (normalized === undefined) {\n return trimmed;\n }\n return trimmed === \"\" ? normalized : `${normalized}-${trimmed}`;\n}\n","import type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { RegexMatchConfig } from \"../types/settings\";\nimport { formatCountryRemark, hasRegionName, normalizeCountryCode } from \"../utils/country\";\n\nfunction toRegex(pattern: string): RegExp {\n try {\n return new RegExp(pattern);\n } catch {\n return /$^/;\n }\n}\n\nfunction regFind(value: string, pattern: string): boolean {\n return toRegex(pattern).test(value);\n}\n\n/**\n * Patterns known to blow up the regex engine (mirrors subconverter-rs\n * `REGEX_BLACK_LIST`); requests carrying them are rejected outright.\n */\nexport const REGEX_BLACKLIST: readonly string[] = [\"(.*)*\"];\n\n/** `true` when `pattern` exactly matches a blacklisted catastrophic pattern. */\nexport function isBlacklistedPattern(pattern: string): boolean {\n return REGEX_BLACKLIST.includes(pattern);\n}\n\nfunction regMatch(value: string, pattern: string): boolean {\n const match = toRegex(pattern).exec(value);\n return match !== null && match[0] === value;\n}\n\nfunction regReplace(value: string, pattern: string, replacement: string): string {\n return value.replace(new RegExp(pattern, \"g\"), replacement);\n}\n\nconst TYPE_MATCH_NAMES: Partial<Record<ProxyType, string>> = {\n [ProxyType.AnyTLS]: \"ANYTLS\",\n [ProxyType.HTTP]: \"HTTP\",\n [ProxyType.HTTPS]: \"HTTPS\",\n [ProxyType.Hysteria]: \"HYSTERIA\",\n [ProxyType.Hysteria2]: \"HYSTERIA2\",\n [ProxyType.Shadowsocks]: \"SS\",\n [ProxyType.ShadowsocksR]: \"SSR\",\n [ProxyType.Snell]: \"SNELL\",\n [ProxyType.SOCKS5]: \"SOCKS5\",\n [ProxyType.Trojan]: \"TROJAN\",\n [ProxyType.TUIC]: \"TUIC\",\n [ProxyType.VLESS]: \"VLESS\",\n [ProxyType.VMess]: \"VMESS\",\n [ProxyType.WireGuard]: \"WIREGUARD\",\n};\n\n/** Does `target` fall within a subconverter range expression like `1-5,8,!3`? */\nexport function matchRange(range: string, target: number): boolean {\n const items = range.split(\",\");\n let match = false;\n for (const item of items) {\n if (/^-?\\d+$/.test(item)) {\n if (Number.parseInt(item, 10) === target) {\n match = true;\n }\n } else if (/^(\\d+)-(\\d+)$/.test(item)) {\n const m = /^(\\d+)-(\\d+)$/.exec(item) as RegExpExecArray;\n const begin = Number.parseInt(m[1] as string, 10);\n const end = Number.parseInt(m[2] as string, 10);\n if (target >= begin && target <= end) {\n match = true;\n }\n } else if (/^!-?(\\d+)$/.test(item)) {\n match = true;\n const m = /^!-?(\\d+)$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) === target) {\n match = false;\n }\n } else if (/^!(\\d+)-(\\d+)$/.test(item)) {\n match = true;\n const m = /^!(\\d+)-(\\d+)$/.exec(item) as RegExpExecArray;\n const begin = Number.parseInt(m[1] as string, 10);\n const end = Number.parseInt(m[2] as string, 10);\n if (target >= begin && target <= end) {\n match = false;\n }\n } else if (/^(\\d+)-$/.test(item)) {\n const m = /^(\\d+)-$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) >= target) {\n match = true;\n }\n } else if (/^(\\d+)\\+$/.test(item)) {\n const m = /^(\\d+)\\+$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) <= target) {\n match = true;\n }\n }\n }\n return match;\n}\n\n/**\n * Resolve a matcher rule against a node.\n *\n * Returns whether the rule's primary predicate matched; `realRule` receives the\n * remaining remark regex (empty means \"match all\").\n */\nexport function applyMatcher(rule: string, node: Proxy): { matched: boolean; realRule: string } {\n if (rule.startsWith(\"!!GROUP=\")) {\n const m = /^!!(?:GROUP)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: regFind(node.group, target), realRule };\n }\n if (rule.startsWith(\"!!GROUPID=\") || rule.startsWith(\"!!INSERT=\")) {\n const m = /^!!(?:GROUPID|INSERT)=([\\d\\-+!,]+)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n const dir = rule.startsWith(\"!!INSERT=\") ? -1 : 1;\n return { matched: matchRange(target, dir * node.groupId), realRule };\n }\n if (rule.startsWith(\"!!TYPE=\")) {\n const m = /^!!(?:TYPE)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n if (node.type === ProxyType.Unknown) {\n return { matched: false, realRule };\n }\n const name = TYPE_MATCH_NAMES[node.type] ?? \"\";\n return { matched: regMatch(name, target), realRule };\n }\n if (rule.startsWith(\"!!PORT=\")) {\n const m = /^!!(?:PORT)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: matchRange(target, node.port), realRule };\n }\n if (rule.startsWith(\"!!SERVER=\")) {\n const m = /^!!(?:SERVER)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: regFind(node.hostname, target), realRule };\n }\n return { matched: true, realRule: rule };\n}\n\n/** `true` when a node should be filtered out by the include/exclude remarks. */\nexport function checkIgnore(\n node: Proxy,\n excludeRemarks: string[],\n includeRemarks: string[],\n): boolean {\n const excluded = excludeRemarks.some((rule) => {\n const { matched, realRule } = applyMatcher(rule, node);\n if (!matched) {\n return false;\n }\n if (realRule === \"\") {\n return true;\n }\n return regFind(node.remark, realRule);\n });\n let included: boolean;\n if (includeRemarks.length > 0) {\n included = includeRemarks.some((rule) => {\n const { matched, realRule } = applyMatcher(rule, node);\n if (!matched) {\n return false;\n }\n if (realRule === \"\") {\n return true;\n }\n return regFind(node.remark, realRule);\n });\n } else {\n included = true;\n }\n return excluded || !included;\n}\n\n/** Remove excluded nodes and renumber the remaining ones in place. */\nexport function filterNodes(\n nodes: Proxy[],\n excludeRemarks: string[],\n includeRemarks: string[],\n groupId: number,\n): void {\n let nodeIndex = 0;\n const kept: Proxy[] = [];\n for (const node of nodes) {\n if (checkIgnore(node, excludeRemarks, includeRemarks)) {\n continue;\n }\n node.id = nodeIndex;\n node.groupId = groupId;\n nodeIndex += 1;\n kept.push(node);\n }\n nodes.length = 0;\n nodes.push(...kept);\n}\n\n/** Normalize a remark for output: `=`→`-`, optional CSV quoting, de-duplication. */\nexport function processRemark(remark: string, remarksList: string[], procComma = true): string {\n let result = remark.replace(/=/g, \"-\");\n if (procComma && result.includes(\",\")) {\n result = `\"${result}\"`;\n }\n let tempRemark = result;\n let count = 2;\n while (remarksList.includes(tempRemark)) {\n tempRemark = `${result} ${count}`;\n count += 1;\n }\n return tempRemark;\n}\n\n/** Expand a proxy-group `proxies` rule into concrete node remarks. */\nexport function groupGenerate(\n rule: string,\n nodeList: Proxy[],\n filteredNodeList: string[],\n addDirect: boolean,\n): void {\n if (rule.startsWith(\"[]\") && addDirect) {\n filteredNodeList.push(rule.slice(2));\n return;\n }\n for (const node of nodeList) {\n const { matched, realRule } = applyMatcher(rule, node);\n if (\n matched &&\n (realRule === \"\" || regFind(node.remark, realRule)) &&\n !filteredNodeList.includes(node.remark)\n ) {\n filteredNodeList.push(node.remark);\n }\n }\n}\n\n/** Strip leading astral emoji from a remark (mirrors subconverter's byte check). */\nexport function removeEmoji(originalRemark: string): string {\n let index = 0;\n while (index < originalRemark.length) {\n const code = originalRemark.codePointAt(index) as number;\n if (code >= 0x1f000 && code <= 0x1ffff) {\n index += code > 0xffff ? 2 : 1;\n } else {\n break;\n }\n }\n const remark = originalRemark.slice(index).trim();\n return remark === \"\" ? originalRemark : remark;\n}\n\n/** Prefix an emoji chosen by the emoji rules. */\nexport function addEmoji(node: Proxy, emojiArray: RegexMatchConfig[]): string {\n for (const rule of emojiArray) {\n if (rule.replace === \"\") {\n continue;\n }\n const { matched, realRule } = applyMatcher(rule.match, node);\n if (matched && realRule !== \"\" && regFind(node.remark, realRule)) {\n return `${rule.replace} ${node.remark}`;\n }\n }\n return node.remark;\n}\n\n/** Replace every match of the user-supplied regex rules in a node's remark. */\nexport function nodeNameRegex(node: Proxy, rules: RegexMatchConfig[]): void {\n const original = node.remark;\n for (const rule of rules) {\n if (rule.script !== \"\" || rule.match === \"\") {\n continue;\n }\n try {\n node.remark = node.remark.replace(new RegExp(rule.match, \"g\"), rule.replace);\n } catch {\n // Ignore malformed patterns instead of failing the whole conversion.\n }\n }\n if (node.remark === \"\") {\n node.remark = original;\n }\n}\n\nconst NAME_SEPARATOR_EDGES = /^[-_.\\s]+|[-_.\\s]+$/g;\nconst NAME_SEPARATOR_RUN = /([-_.\\s])[-_.\\s]+/g;\n\n/**\n * Remove literal fragments from a node's remark (e.g. `foo.server1.bar` with\n * `[\"foo\", \"bar\"]` -> `server1`). Separators left at the edges or doubled by\n * the removal are collapsed.\n */\nexport function nodeNameRemove(node: Proxy, removeList: string[]): void {\n const original = node.remark;\n let remark = node.remark;\n let removed = false;\n for (const fragment of removeList) {\n if (fragment === \"\" || !remark.includes(fragment)) {\n continue;\n }\n remark = remark.split(fragment).join(\"\");\n removed = true;\n }\n if (removed) {\n remark = remark.replace(NAME_SEPARATOR_EDGES, \"\").replace(NAME_SEPARATOR_RUN, \"$1\");\n }\n node.remark = remark === \"\" ? original : remark;\n}\n\n/** Apply rename rules to a node's remark (script rules are ignored). */\nexport function nodeRename(node: Proxy, renameArray: RegexMatchConfig[]): void {\n const original = node.remark;\n for (const rule of renameArray) {\n if (rule.script !== \"\") {\n continue;\n }\n const { matched, realRule } = applyMatcher(rule.match, node);\n if (matched && realRule !== \"\") {\n node.remark = regReplace(node.remark, realRule, rule.replace);\n }\n }\n if (node.remark === \"\") {\n node.remark = original;\n }\n}\n\n/**\n * Prefix a node's remark with its ISO server country when the remark does\n * not already mention one (e.g. `server1` -> `US-server1`).\n *\n * `resolve` returns an ISO 3166-1 alpha-2 code; a missing/unknown code leaves\n * the remark untouched. Mirrors the request `auto_country` switch.\n */\nexport function addCountryPrefix(\n node: Proxy,\n resolve: (node: Proxy) => string | undefined,\n): string {\n const remark = node.remark.trim();\n if (hasRegionName(remark)) {\n return node.remark;\n }\n const code = resolve(node);\n if (code === undefined || code === \"\") {\n return node.remark;\n }\n return formatCountryRemark(remark, code);\n}\n\n/**\n * Drop nodes by GeoIP country: keep only `include` codes (unknown countries\n * never match, so they are dropped), then drop `exclude` codes (unknown\n * countries are kept). Invalid codes are ignored.\n */\nexport function filterNodesByCountry(\n nodes: Proxy[],\n resolve: ((node: Proxy) => string | undefined) | undefined,\n include: string[],\n exclude: string[],\n): void {\n const includeSet = new Set(\n include.map((code) => normalizeCountryCode(code)).filter((code) => code !== undefined),\n );\n const excludeSet = new Set(\n exclude.map((code) => normalizeCountryCode(code)).filter((code) => code !== undefined),\n );\n if (includeSet.size === 0 && excludeSet.size === 0) {\n return;\n }\n const kept: Proxy[] = [];\n for (const node of nodes) {\n const code = resolve ? normalizeCountryCode(resolve(node) ?? \"\") : undefined;\n if (includeSet.size > 0 && (code === undefined || !includeSet.has(code))) {\n continue;\n }\n if (code !== undefined && excludeSet.has(code)) {\n continue;\n }\n kept.push(node);\n }\n nodes.length = 0;\n nodes.push(...kept);\n}\n\nexport interface PreprocessOptions {\n removeEmoji: boolean;\n addEmoji: boolean;\n sortFlag: boolean;\n renameArray: RegexMatchConfig[];\n emojiArray: RegexMatchConfig[];\n /** User regex rewrites applied before every other naming rule. */\n nameRegexArray?: RegexMatchConfig[];\n /** Literal fragments stripped from names before every other naming rule. */\n nameRemove?: string[];\n autoCountry?: boolean;\n countryResolver?: (node: Proxy) => string | undefined;\n /** Keep only nodes whose GeoIP country is in this ISO code list. */\n includeCountries?: string[];\n /** Drop nodes whose GeoIP country is in this ISO code list. */\n excludeCountries?: string[];\n /** Keep only nodes matching one of these remark rules (empty keeps all). */\n includeRemarks?: string[];\n /** Drop nodes matching one of these remark rules. */\n excludeRemarks?: string[];\n}\n\n/** Apply name cleanup, emoji removal, renaming, emoji insertion, and optional sorting. */\nexport function preprocessNodes(nodes: Proxy[], options: PreprocessOptions): void {\n for (const node of nodes) {\n if (options.removeEmoji) {\n node.remark = removeEmoji(node.remark).trim();\n }\n if (options.nameRegexArray && options.nameRegexArray.length > 0) {\n nodeNameRegex(node, options.nameRegexArray);\n }\n if (options.nameRemove && options.nameRemove.length > 0) {\n nodeNameRemove(node, options.nameRemove);\n }\n nodeRename(node, options.renameArray);\n if (options.addEmoji) {\n node.remark = addEmoji(node, options.emojiArray);\n }\n if (options.autoCountry && options.countryResolver) {\n node.remark = addCountryPrefix(node, options.countryResolver);\n }\n }\n filterNodesByCountry(\n nodes,\n options.countryResolver,\n options.includeCountries ?? [],\n options.excludeCountries ?? [],\n );\n const includeRemarks = options.includeRemarks ?? [];\n const excludeRemarks = options.excludeRemarks ?? [];\n if (includeRemarks.length > 0 || excludeRemarks.length > 0) {\n const kept = nodes.filter((node) => !checkIgnore(node, excludeRemarks, includeRemarks));\n // Renumber without touching groupId (unlike `filterNodes`, which\n // reassigns a single group).\n kept.forEach((node, index) => {\n node.id = index;\n });\n nodes.length = 0;\n nodes.push(...kept);\n }\n if (options.sortFlag) {\n nodes.sort((a, b) => (a.remark < b.remark ? -1 : a.remark > b.remark ? 1 : 0));\n }\n}\n\n/** Remove nodes that share a type, server, port, and remark. Returns the count removed. */\nexport function dedupeNodes(nodes: Proxy[]): number {\n const seen = new Set<string>();\n const kept: Proxy[] = [];\n for (const node of nodes) {\n const key = `${node.type}\\u0000${node.hostname}\\u0000${node.port}\\u0000${node.remark}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n kept.push(node);\n }\n const removed = nodes.length - kept.length;\n nodes.length = 0;\n nodes.push(...kept);\n return removed;\n}\n","import type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport { BalanceStrategy, ProxyGroupType } from \"../types/proxy-group\";\nimport type { RulesetConfig, RulesetContent } from \"../types/ruleset\";\nimport { RulesetType } from \"../types/ruleset\";\n\nconst TEST_URL = \"http://www.gstatic.com/generate_204\";\n\nfunction group(\n name: string,\n type: ProxyGroupType,\n proxies: string[],\n extra: Partial<ProxyGroupConfig> = {},\n): ProxyGroupConfig {\n return {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name,\n persistent: undefined,\n proxies: [...proxies],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 5,\n tolerance: 0,\n type,\n url: \"\",\n usingProvider: [],\n ...extra,\n };\n}\n\n/**\n * Bundled default proxy groups, mirroring upstream `ACL4SSR.ini`\n * (`tindy2013/subconverter/base/config/ACL4SSR.ini`).\n *\n * Used only when `generate(..., { includeRules: true })` is set and the caller\n * did not provide explicit groups. Kept offline so the core engine stays\n * platform-free (no fetch required).\n */\nexport function getDefaultProxyGroups(): ProxyGroupConfig[] {\n return [\n group(\"🚀 节点选择\", ProxyGroupType.Select, [\"[]♻️ 自动选择\", \"[]DIRECT\", \".*\"]),\n group(\"♻️ 自动选择\", ProxyGroupType.URLTest, [\".*\"], {\n interval: 300,\n tolerance: 50,\n url: TEST_URL,\n }),\n group(\"🌍 国外媒体\", ProxyGroupType.Select, [\n \"[]🚀 节点选择\",\n \"[]♻️ 自动选择\",\n \"[]🎯 全球直连\",\n \".*\",\n ]),\n group(\"📲 电报信息\", ProxyGroupType.Select, [\"[]🚀 节点选择\", \"[]🎯 全球直连\", \".*\"]),\n group(\"Ⓜ️ 微软服务\", ProxyGroupType.Select, [\"[]🎯 全球直连\", \"[]🚀 节点选择\", \".*\"]),\n group(\"🍎 苹果服务\", ProxyGroupType.Select, [\"[]🚀 节点选择\", \"[]🎯 全球直连\", \".*\"]),\n group(\"🎯 全球直连\", ProxyGroupType.Select, [\"[]DIRECT\", \"[]🚀 节点选择\", \"[]♻️ 自动选择\"]),\n group(\"🛑 全球拦截\", ProxyGroupType.Select, [\"[]REJECT\", \"[]DIRECT\"]),\n group(\"🍃 应用净化\", ProxyGroupType.Select, [\"[]REJECT\", \"[]DIRECT\"]),\n group(\"🐟 漏网之鱼\", ProxyGroupType.Select, [\n \"[]🚀 节点选择\",\n \"[]🎯 全球直连\",\n \"[]♻️ 自动选择\",\n \".*\",\n ]),\n ];\n}\n\n/** Inline `[]RULE` content helper (no remote fetch needed). */\nfunction inline(group: string, rule: string): RulesetContent {\n return {\n content: `[]${rule}`,\n ruleGroup: group,\n rulePath: \"\",\n rulePathTyped: \"\",\n ruleType: RulesetType.Surge,\n updateInterval: 86400,\n };\n}\n\nfunction surge(group: string, lines: string[]): RulesetContent {\n return {\n content: lines.join(\"\\n\"),\n ruleGroup: group,\n rulePath: \"\",\n rulePathTyped: \"\",\n ruleType: RulesetType.Surge,\n updateInterval: 86400,\n };\n}\n\n/**\n * Bundled offline default rules, mirroring the structure of upstream\n * `ACL4SSR.ini` + its `rules/ACL4SSR` lists (LAN/China direct, ad reject,\n * messenger/media proxy, final catch-all).\n *\n * These are intentionally compact (≈60 rules) so `includeRules: true` works\n * without network access. Callers needing the full upstream lists should pass\n * explicit {@link RulesetContent} (or {@link getDefaultRulesetConfigs} via the\n * Node adapter, which fetches the remote lists).\n */\nexport function getDefaultRulesets(): RulesetContent[] {\n return [\n surge(\"🎯 全球直连\", [\n \"DOMAIN-SUFFIX,localhost\",\n \"DOMAIN,localhost\",\n \"IP-CIDR,127.0.0.0/8\",\n \"IP-CIDR,10.0.0.0/8\",\n \"IP-CIDR,172.16.0.0/12\",\n \"IP-CIDR,192.168.0.0/16\",\n \"IP-CIDR,224.0.0.0/4\",\n \"DOMAIN-SUFFIX,cn\",\n \"DOMAIN-SUFFIX,126.com\",\n \"DOMAIN-SUFFIX,163.com\",\n \"DOMAIN-SUFFIX,qq.com\",\n \"DOMAIN-SUFFIX,baidu.com\",\n \"DOMAIN-SUFFIX,alibaba.com\",\n \"DOMAIN-SUFFIX,taobao.com\",\n ]),\n surge(\"🛑 全球拦截\", [\n \"DOMAIN-SUFFIX,doubleclick.net\",\n \"DOMAIN-SUFFIX,googlesyndication.com\",\n \"DOMAIN-SUFFIX,googleadservices.com\",\n \"DOMAIN-SUFFIX,ads.yahoo.com\",\n \"DOMAIN-KEYWORD,adservice\",\n \"DOMAIN-KEYWORD,advertising\",\n ]),\n surge(\"🍃 应用净化\", [\n \"DOMAIN-SUFFIX,app-measurement.com\",\n \"DOMAIN-SUFFIX,crashlytics.com\",\n \"DOMAIN-KEYWORD,analytics\",\n \"DOMAIN-KEYWORD,tracking\",\n ]),\n surge(\"🌍 国外媒体\", [\n \"DOMAIN-SUFFIX,netflix.com\",\n \"DOMAIN-SUFFIX,nflxvideo.net\",\n \"DOMAIN-SUFFIX,youtube.com\",\n \"DOMAIN-SUFFIX,googlevideo.com\",\n \"DOMAIN-SUFFIX,disneyplus.com\",\n \"DOMAIN-SUFFIX,spotify.com\",\n \"DOMAIN-SUFFIX,tiktok.com\",\n ]),\n surge(\"📲 电报信息\", [\n \"DOMAIN-SUFFIX,telegram.org\",\n \"DOMAIN-SUFFIX,t.me\",\n \"DOMAIN-SUFFIX,telegram.me\",\n \"IP-CIDR,149.154.160.0/20\",\n \"IP-CIDR,91.108.4.0/22\",\n ]),\n surge(\"Ⓜ️ 微软服务\", [\n \"DOMAIN-SUFFIX,microsoft.com\",\n \"DOMAIN-SUFFIX,windows.com\",\n \"DOMAIN-SUFFIX,office.com\",\n \"DOMAIN-SUFFIX,live.com\",\n ]),\n surge(\"🍎 苹果服务\", [\n \"DOMAIN-SUFFIX,apple.com\",\n \"DOMAIN-SUFFIX,icloud.com\",\n \"DOMAIN-SUFFIX,apple-cloudkit.com\",\n ]),\n surge(\"🚀 节点选择\", [\"DOMAIN-SUFFIX,google.com\", \"DOMAIN-SUFFIX,github.com\"]),\n inline(\"🎯 全球直连\", \"GEOIP,CN\"),\n inline(\"🐟 漏网之鱼\", \"FINAL\"),\n ];\n}\n\n/**\n * Remote ruleset configs matching upstream `ACL4SSR.ini` for callers that can\n * fetch (Node adapter / CLI `--config`). Paths follow the public ACL4SSR\n * mirror; `collectRulesets` in `@subconverter/node` resolves them.\n */\nexport function getDefaultRulesetConfigs(): RulesetConfig[] {\n const base = \"https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash\";\n const list = (group: string, file: string): RulesetConfig => ({\n group,\n interval: 86400,\n url: `${base}/${file}`,\n });\n return [\n list(\"🎯 全球直连\", \"LocalAreaNetwork.list\"),\n list(\"🛑 全球拦截\", \"BanAD.list\"),\n list(\"🍃 应用净化\", \"BanProgramAD.list\"),\n list(\"🎯 全球直连\", \"GoogleCN.list\"),\n list(\"Ⓜ️ 微软服务\", \"Microsoft.list\"),\n list(\"🍎 苹果服务\", \"Apple.list\"),\n list(\"🌍 国外媒体\", \"ProxyMedia.list\"),\n list(\"📲 电报信息\", \"Telegram.list\"),\n list(\"🚀 节点选择\", \"ProxyLite.list\"),\n list(\"🎯 全球直连\", \"ChinaDomain.list\"),\n list(\"🎯 全球直连\", \"ChinaCompanyIp.list\"),\n { group: \"🎯 全球直连\", interval: 86400, url: \"[]GEOIP,CN\" },\n { group: \"🐟 漏网之鱼\", interval: 86400, url: \"[]FINAL\" },\n ];\n}\n","import { isSsCipher, SSR_CIPHERS } from \"../parser/ciphers\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode, urlSafeBase64Encode } from \"../utils/base64\";\nimport { toInt } from \"../utils/string\";\nimport { getUrlArg, urlEncode } from \"../utils/url\";\n\n/** Build the JSON payload of a `vmess://` link. */\nexport function vmessLinkConstruct(\n remarks: string,\n add: string,\n port: string,\n type: string,\n id: string,\n aid: string,\n net: string,\n path: string,\n host: string,\n tls: string,\n): string {\n return JSON.stringify({\n add,\n aid,\n host,\n id,\n net: net === \"\" ? \"tcp\" : net,\n path,\n port,\n ps: remarks,\n tls,\n type: type === \"\" ? \"none\" : type,\n v: \"2\",\n });\n}\n\n/** Build an `ss://` link. */\nexport function ssLinkConstruct(proxy: Proxy): string {\n const port = String(proxy.port);\n let link = `ss://${urlSafeBase64Encode(`${proxy.encryptMethod}:${proxy.password}`)}@${proxy.hostname}:${port}`;\n if (proxy.plugin !== \"\" && proxy.pluginOption !== \"\") {\n link += `/?plugin=${urlEncode(`${proxy.plugin};${proxy.pluginOption}`)}`;\n }\n link += `#${urlEncode(proxy.remark)}`;\n return link;\n}\n\n/** Build an `ssr://` link. */\nexport function ssrLinkConstruct(\n hostname: string,\n port: number,\n protocol: string,\n method: string,\n obfs: string,\n password: string,\n group: string,\n remark: string,\n obfsParam = \"\",\n protocolParam = \"\",\n): string {\n const payload =\n `${hostname}:${port}:${protocol}:${method}:${obfs}:${urlSafeBase64Encode(password)}` +\n `/?group=${urlSafeBase64Encode(group)}&remarks=${urlSafeBase64Encode(remark)}` +\n `&obfsparam=${urlSafeBase64Encode(obfsParam)}&protoparam=${urlSafeBase64Encode(protocolParam)}`;\n return `ssr://${urlSafeBase64Encode(payload)}`;\n}\n\n/** Build a `trojan://` link. */\nexport function trojanLinkConstruct(proxy: Proxy): string {\n const port = String(proxy.port);\n let link = `trojan://${proxy.password}@${proxy.hostname}:${port}?allowInsecure=${proxy.allowInsecure === true ? \"1\" : \"0\"}`;\n if (proxy.host !== \"\") {\n link += `&sni=${proxy.host}`;\n }\n if (proxy.transferProtocol === \"ws\") {\n link += \"&ws=1\";\n if (proxy.path !== \"\") {\n link += `&wspath=${urlEncode(proxy.path)}`;\n }\n }\n link += `#${urlEncode(proxy.remark)}`;\n return link;\n}\n\nfunction getBit(types: number, position: number): boolean {\n return (types & (1 << (position - 1))) !== 0;\n}\n\n/**\n * Export nodes as a plaintext or base64 list of share links.\n * `types` bitmask: SS=1, SSR=2, VMess=4, Trojan=8.\n */\nexport function proxyToSingle(nodes: Proxy[], types: number, settings: ExtraSettings): string {\n const ss = getBit(types, 1);\n const ssr = getBit(types, 2);\n const vmess = getBit(types, 3);\n const trojan = getBit(types, 4);\n let allLinks = \"\";\n\n for (const x of nodes) {\n let proxyStr = \"\";\n const port = String(x.port);\n const aid = String(x.alterId);\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (ss) {\n proxyStr = ssLinkConstruct(x);\n } else if (ssr) {\n if (SSR_CIPHERS.includes(x.encryptMethod) && x.plugin === \"\") {\n proxyStr = ssrLinkConstruct(\n x.hostname,\n x.port,\n \"origin\",\n x.encryptMethod,\n \"plain\",\n x.password,\n x.group,\n x.remark,\n );\n }\n } else {\n continue;\n }\n break;\n case ProxyType.ShadowsocksR:\n if (ssr) {\n proxyStr = ssrLinkConstruct(\n x.hostname,\n x.port,\n x.protocol,\n x.encryptMethod,\n x.obfs,\n x.password,\n x.group,\n x.remark,\n x.obfsParam,\n x.protocolParam,\n );\n } else if (ss) {\n if (isSsCipher(x.encryptMethod) && x.protocol === \"origin\" && x.obfs === \"plain\") {\n proxyStr = `ss://${urlSafeBase64Encode(`${x.encryptMethod}:${x.password}`)}@${x.hostname}:${port}#${urlEncode(x.remark)}`;\n }\n } else {\n continue;\n }\n break;\n case ProxyType.VMess:\n if (!vmess) {\n continue;\n }\n proxyStr = `vmess://${base64Encode(\n vmessLinkConstruct(\n x.remark,\n x.hostname,\n port,\n x.fakeType,\n x.userId,\n aid,\n x.transferProtocol,\n x.path,\n x.host,\n x.tlsSecure ? \"tls\" : \"\",\n ),\n )}`;\n break;\n case ProxyType.Trojan:\n if (!trojan) {\n continue;\n }\n proxyStr = trojanLinkConstruct(x);\n break;\n default:\n continue;\n }\n if (proxyStr !== \"\") {\n allLinks += `${proxyStr}\\n`;\n }\n }\n\n return settings.nodeList ? allLinks : base64Encode(allLinks);\n}\n\n/** Export Shadowsocks nodes as a SIP008 (`ssconf`) document. */\nexport function proxyToSsSub(nodes: Proxy[], baseConf: string): string {\n let base: Record<string, unknown>;\n try {\n const trimmed = baseConf.trim() === \"\" ? \"{}\" : baseConf;\n base = JSON.parse(trimmed) as Record<string, unknown>;\n } catch {\n base = {};\n }\n const proxies: unknown[] = [];\n for (const x of nodes) {\n let plugin = x.plugin;\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (plugin === \"simple-obfs\") {\n plugin = \"obfs-local\";\n }\n break;\n case ProxyType.ShadowsocksR:\n if (!isSsCipher(x.encryptMethod) || x.protocol !== \"origin\" || x.obfs !== \"plain\") {\n continue;\n }\n break;\n default:\n continue;\n }\n proxies.push({\n ...base,\n method: x.encryptMethod,\n password: x.password,\n plugin,\n plugin_opts: x.pluginOption,\n remarks: x.remark,\n server: x.hostname,\n server_port: x.port,\n });\n }\n return JSON.stringify(proxies);\n}\n\n/** Export Shadowsocks nodes as an `ssd://` document. */\nexport function proxyToSsd(nodes: Proxy[], group: string, userinfo: string): string {\n const resolvedGroup = group === \"\" ? \"SSD\" : group;\n const doc: Record<string, unknown> = {\n airport: resolvedGroup,\n encryption: \"aes-128-gcm\",\n password: \"password\",\n port: 1,\n };\n if (userinfo !== \"\") {\n const data = userinfo.replace(/; /g, \"&\");\n const upload = getUrlArg(data, \"upload\");\n const download = getUrlArg(data, \"download\");\n const total = getUrlArg(data, \"total\");\n const expiry = getUrlArg(data, \"expire\");\n // SSD reports traffic in decimal GB (1 GB = 1000^3 bytes) per spec,\n // distinct from Clash `subscription-userinfo` clients that divide by\n // 1024^3 (see `scaleDecimalBytes` in userinfo.ts).\n const gb = 1000 ** 3;\n doc.traffic_used = (Number(upload || 0) + Number(download || 0)) / gb;\n doc.traffic_total = Number(total || 0) / gb;\n if (expiry !== \"\") {\n const date = new Date(toInt(expiry) * 1000);\n doc.expiry = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}-${String(date.getDate()).padStart(2, \"0\")} ${String(date.getHours()).padStart(2, \"0\")}:${String(date.getMinutes()).padStart(2, \"0\")}`;\n }\n }\n const servers: unknown[] = [];\n let index = 0;\n for (const x of nodes) {\n if (x.type === ProxyType.Shadowsocks) {\n const plugin = x.plugin === \"obfs-local\" ? \"simple-obfs\" : x.plugin;\n servers.push({\n encryption: x.encryptMethod,\n id: index,\n password: x.password,\n plugin,\n plugin_options: x.pluginOption,\n port: x.port,\n remarks: x.remark,\n server: x.hostname,\n });\n index += 1;\n } else if (x.type === ProxyType.ShadowsocksR) {\n if (isSsCipher(x.encryptMethod) && x.protocol === \"origin\" && x.obfs === \"plain\") {\n servers.push({\n encryption: x.encryptMethod,\n id: index,\n password: x.password,\n port: x.port,\n remarks: x.remark,\n server: x.hostname,\n });\n index += 1;\n }\n }\n }\n doc.servers = servers;\n return `ssd://${base64Encode(JSON.stringify(doc))}`;\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { fnv1a64Hex } from \"../utils/hash\";\nimport { isIpv4, isIpv6 } from \"../utils/string\";\n\ninterface RawSection {\n name: string;\n lines: string[];\n}\n\nfunction parseRawSections(text: string): RawSection[] {\n const sections: RawSection[] = [];\n let current: RawSection | undefined;\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine;\n const header = /^\\[(.*)\\]$/.exec(line.trim());\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line.trim() === \"\") {\n continue;\n }\n if (current) {\n current.lines.push(line);\n }\n }\n return sections;\n}\n\nfunction triStr(value: boolean | undefined): string {\n return value ? \"true\" : \"false\";\n}\n\nfunction httpProxyLine(x: Proxy, scv: boolean | undefined): string {\n let proxy = `http, ${x.hostname}, ${x.port}`;\n if (x.username !== \"\") {\n proxy += `, username=${x.username}`;\n }\n if (x.password !== \"\") {\n proxy += `, password=${x.password}`;\n }\n proxy += `, tls=${triStr(x.tlsSecure)}`;\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n return proxy;\n}\n\n/** Build a WireGuard `peer=(...)` clause. */\nexport function generatePeer(node: Proxy, clientIdAsReserved = false): string {\n let result = `public-key = ${node.publicKey}`;\n result += `, endpoint = ${node.hostname}:${node.port}`;\n if (node.preSharedKey !== \"\") {\n result += `, preshared-key = ${node.preSharedKey}`;\n }\n if (node.allowedIps !== \"\") {\n result += `, allowed-ips = \"${node.allowedIps}\"`;\n }\n if (node.keepAlive > 0) {\n result += `, keepalive = ${node.keepAlive}`;\n }\n if (node.clientId !== \"\") {\n result += clientIdAsReserved\n ? `, reserved = [${node.clientId}]`\n : `, client-id = ${node.clientId}`;\n }\n return result;\n}\n\nexport interface SurgeOptions {\n version: number;\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\ninterface SurgeBuildResult {\n proxies: string[];\n groups: string[];\n extraSections: Map<string, string[]>;\n sectionOrder: string[];\n}\n\nfunction buildSurge(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SurgeOptions,\n): SurgeBuildResult {\n const surgeVer = options.version;\n const remarksList: string[] = [];\n const proxies: string[] = [];\n const nodelist: Proxy[] = [];\n const extraSections = new Map<string, string[]>();\n const sectionOrder: string[] = [];\n let localPort = 1080;\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tls13 = x.tls13 !== undefined ? x.tls13 : settings.tls13;\n\n let proxy = \"\";\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (surgeVer >= 3 || surgeVer === -3) {\n proxy = `ss, ${x.hostname}, ${x.port}, encrypt-method=${x.encryptMethod}, password=${x.password}`;\n } else {\n proxy = `custom, ${x.hostname}, ${x.port}, ${x.encryptMethod}, ${x.password}, https://github.com/pobizhe/SSEncrypt/raw/master/SSEncrypt.module`;\n }\n if (x.plugin !== \"\") {\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n if (x.pluginOption !== \"\") {\n proxy += `,${x.pluginOption.replace(/;/g, \",\")}`;\n }\n } else {\n continue;\n }\n }\n break;\n case ProxyType.VMess: {\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `vmess, ${x.hostname}, ${x.port}, username=${x.userId}, tls=${triStr(x.tlsSecure)}, vmess-aead=${x.alterId === 0 ? \"true\" : \"false\"}`;\n if (x.tlsSecure && tls13 !== undefined) {\n proxy += `, tls13=${triStr(tls13)}`;\n }\n const headers: string[] = [];\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\": {\n if (x.host === \"\") {\n proxy += `, ws=true, ws-path=${x.path}, sni=${x.hostname}`;\n } else {\n proxy += `, ws=true, ws-path=${x.path}, sni=${x.host}`;\n }\n if (x.host !== \"\") {\n headers.push(`Host:${x.host}`);\n }\n if (x.edge !== \"\") {\n headers.push(`Edge:${x.edge}`);\n }\n if (headers.length > 0) {\n proxy += `, ws-headers=${headers.join(\"|\")}`;\n }\n break;\n }\n default:\n continue;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n }\n case ProxyType.ShadowsocksR: {\n if (settings.surgeSsrPath === \"\" || surgeVer < 2) {\n continue;\n }\n const args = [\n \"-l\",\n String(localPort),\n \"-s\",\n x.hostname,\n \"-p\",\n String(x.port),\n \"-m\",\n x.encryptMethod,\n \"-k\",\n x.password,\n \"-o\",\n x.obfs,\n \"-O\",\n x.protocol,\n ];\n if (x.obfsParam !== \"\") {\n args.push(\"-g\", x.obfsParam);\n }\n if (x.protocolParam !== \"\") {\n args.push(\"-G\", x.protocolParam);\n }\n proxy = `external, exec=\"${settings.surgeSsrPath}\", args=\"${args.join('\", args=\"')}\", local-port=${localPort}`;\n if (isIpv4(x.hostname) || isIpv6(x.hostname)) {\n proxy += `, addresses=${x.hostname}`;\n }\n localPort += 1;\n break;\n }\n case ProxyType.SOCKS5:\n proxy = `socks5, ${x.hostname}, ${x.port}`;\n if (x.username !== \"\") {\n proxy += `, username=${x.username}`;\n }\n if (x.password !== \"\") {\n proxy += `, password=${x.password}`;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n case ProxyType.HTTPS:\n if (surgeVer === -3) {\n proxy = `https, ${x.hostname}, ${x.port}, ${x.username}, ${x.password}`;\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n }\n proxy = httpProxyLine(x, scv);\n break;\n case ProxyType.HTTP:\n proxy = httpProxyLine(x, scv);\n break;\n case ProxyType.Trojan:\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `trojan, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.snellVersion !== 0) {\n proxy += `, version=${x.snellVersion}`;\n }\n if (x.host !== \"\") {\n proxy += `, sni=${x.host}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxy += \", ws=true\";\n if (x.path !== \"\") {\n proxy += `, ws-path=${x.path}`;\n }\n const wsHost = x.host !== \"\" ? x.host : x.hostname;\n proxy += `, ws-headers=Host:\"${wsHost}\"`;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n case ProxyType.Snell:\n proxy = `snell, ${x.hostname}, ${x.port}, psk=${x.password}`;\n if (x.obfs !== \"\") {\n proxy += `, obfs=${x.obfs}`;\n if (x.host !== \"\") {\n proxy += `, obfs-host=${x.host}`;\n }\n }\n if (x.snellVersion !== 0) {\n proxy += `, version=${x.snellVersion}`;\n }\n break;\n case ProxyType.WireGuard: {\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n const section = fnv1a64Hex(x.remark).slice(0, 5);\n proxy = `wireguard, section-name=${section}`;\n if (x.testUrl !== \"\") {\n proxy += `, test-url=${x.testUrl}`;\n }\n const wgLines: string[] = [`private-key = ${x.privateKey}`, `self-ip = ${x.selfIp}`];\n if (x.selfIpv6 !== \"\") {\n wgLines.push(`self-ip-v6 = ${x.selfIpv6}`);\n }\n if (x.dnsServers.length > 0) {\n wgLines.push(`dns-server = ${x.dnsServers.join(\",\")}`);\n }\n if (x.mtu > 0) {\n wgLines.push(`mtu = ${x.mtu}`);\n }\n wgLines.push(`peer = (${generatePeer(x)})`);\n const sectionName = `WireGuard ${section}`;\n extraSections.set(sectionName, wgLines);\n sectionOrder.push(sectionName);\n break;\n }\n case ProxyType.Hysteria2:\n if (surgeVer < 4) {\n continue;\n }\n proxy = `hysteria2, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.downSpeed) {\n proxy += `, download-bandwidth=${x.downSpeed}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${triStr(scv)}`;\n }\n if (x.fingerprint !== \"\") {\n proxy += `,server-cert-fingerprint-sha256=${x.fingerprint}`;\n }\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n break;\n case ProxyType.AnyTLS:\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `anytls, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n break;\n default:\n continue;\n }\n\n if (tfo !== undefined) {\n proxy += `, tfo=${triStr(tfo)}`;\n }\n if (udp !== undefined) {\n proxy += `, udp-relay=${triStr(udp)}`;\n }\n if (x.underlyingProxy !== \"\") {\n proxy += `, underlying-proxy=${x.underlyingProxy}`;\n }\n\n proxies.push(`${remark} = ${proxy}`);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return { extraSections, groups: [], proxies, sectionOrder };\n }\n\n const groups: string[] = [];\n for (const group of extraProxyGroup) {\n const filtered: string[] = [];\n let groupLine = \"\";\n switch (group.type) {\n case \"select\":\n case \"smart\":\n case \"url-test\":\n case \"fallback\":\n break;\n case \"load-balance\":\n if (surgeVer < 1 && surgeVer !== -3) {\n continue;\n }\n break;\n case \"ssid\": {\n const rest = group.proxies.slice(1).join(\",\");\n const line = `${group.type},default=${group.proxies[0] ?? \"\"},${rest}`;\n groups.push(`${group.name} = ${line}`);\n continue;\n }\n default:\n continue;\n }\n\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n if (filtered.length === 1) {\n const single = (filtered[0] as string).toLowerCase();\n if (single === \"direct\" || single === \"reject\" || single === \"reject-tinygif\") {\n proxies.push(`${group.name} = ${single}`);\n continue;\n }\n }\n groupLine = `${group.type},${filtered.join(\",\")}`;\n if (group.type === \"url-test\" || group.type === \"fallback\" || group.type === \"load-balance\") {\n groupLine += `,url=${group.url},interval=${group.interval}`;\n if (group.tolerance > 0) {\n groupLine += `,tolerance=${group.tolerance}`;\n }\n if (group.timeout > 0) {\n groupLine += `,timeout=${group.timeout}`;\n }\n if (group.persistent !== undefined) {\n groupLine += `,persistent=${triStr(group.persistent)}`;\n }\n if (group.evaluateBeforeUse !== undefined) {\n groupLine += `,evaluate-before-use=${triStr(group.evaluateBeforeUse)}`;\n }\n }\n groups.push(`${group.name} = ${groupLine}`);\n }\n\n return { extraSections, groups, proxies, sectionOrder };\n}\n\n/** Convert nodes into a Surge configuration string. */\nexport function toSurge(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SurgeOptions,\n): string {\n const result = buildSurge(nodes, extraProxyGroup, settings, options);\n if (options.nodeList) {\n return result.proxies.join(\"\\n\");\n }\n\n const baseSections = options.baseConf === \"\" ? [] : parseRawSections(options.baseConf);\n const byName = new Map<string, RawSection>();\n const order: string[] = [];\n for (const section of baseSections) {\n byName.set(section.name, section);\n order.push(section.name);\n }\n const setSection = (name: string, lines: string[]): void => {\n if (!byName.has(name)) {\n order.push(name);\n }\n byName.set(name, { lines, name });\n };\n setSection(\"Proxy\", [\"DIRECT = direct\", ...result.proxies]);\n if (result.groups.length > 0) {\n setSection(\"Proxy Group\", result.groups);\n }\n for (const name of result.sectionOrder) {\n setSection(name, result.extraSections.get(name) as string[]);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setSection(options.rules.section, options.rules.lines);\n }\n\n const out: string[] = [];\n for (const name of order) {\n const section = byName.get(name);\n if (!section) {\n continue;\n }\n out.push(`[${name}]`);\n out.push(...section.lines);\n out.push(\"\");\n }\n return out.join(\"\\n\").trimEnd() + \"\\n\";\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { generatePeer } from \"./surge\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { isIpv4, isIpv6 } from \"../utils/string\";\n\nfunction buildLoonNode(x: Proxy, settings: ExtraSettings, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n let method = x.encryptMethod;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxy: string;\n switch (x.type) {\n case ProxyType.Shadowsocks:\n proxy = `Shadowsocks,${hostname},${port},${method},\"${x.password}\"`;\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n if (x.pluginOption !== \"\") {\n proxy += `,${x.pluginOption.replace(/;obfs-host=/g, \",\").replace(/obfs=/g, \"\")}`;\n }\n } else if (x.plugin !== \"\") {\n return undefined;\n }\n break;\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxy = `vmess,${hostname},${port},${method},\"${x.userId}\",over-tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure) {\n proxy += `,tls-name=${x.host}`;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n proxy += \",transport=tcp\";\n break;\n case \"ws\":\n proxy += `,transport=ws,path=${x.path},host=${x.host}`;\n break;\n default:\n return undefined;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.ShadowsocksR:\n proxy = `ShadowsocksR,${hostname},${port},${method},\"${x.password}\",protocol=${x.protocol},protocol-param=${x.protocolParam},obfs=${x.obfs},obfs-param=${x.obfsParam}`;\n break;\n case ProxyType.HTTP:\n proxy = `http,${hostname},${port},${x.username},\"${x.password}\"`;\n break;\n case ProxyType.HTTPS:\n proxy = `https,${hostname},${port},${x.username},\"${x.password}\"`;\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.VLESS:\n if (\n x.transferProtocol !== \"\" &&\n x.transferProtocol !== \"tcp\" &&\n x.transferProtocol !== \"ws\"\n ) {\n return undefined;\n }\n proxy = `VLESS,${hostname},${port},\"${x.userId}\"`;\n if (x.flow !== \"\") {\n proxy += `,flow=${x.flow}`;\n }\n if (x.publicKey !== \"\") {\n proxy += `,public-key=\"${x.publicKey}\"`;\n }\n if (x.shortId !== \"\") {\n proxy += `,short-id=${x.shortId}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxy += `,path=${x.path},host=${x.host}`;\n }\n proxy += `,transport=${x.transferProtocol === \"ws\" ? \"ws\" : \"tcp\"}`;\n if (x.udp !== undefined) {\n proxy += `,udp=${x.udp ? \"true\" : \"false\"}`;\n } else {\n proxy += \",udp=false\";\n }\n proxy += `,over-tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure && x.serverName !== \"\") {\n proxy += `,sni=${x.serverName}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.Trojan:\n proxy = `trojan,${hostname},${port},\"${x.password}\"`;\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxy += `,transport=ws,path=${x.path},host=${x.host}`;\n } else {\n proxy += \",transport=tcp\";\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.SOCKS5:\n proxy = `socks5,${hostname},${port}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxy += `,${x.username},\"${x.password}\"`;\n }\n proxy += `,over-tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure) {\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n }\n break;\n case ProxyType.WireGuard:\n proxy = `wireguard, interface-ip=${x.selfIp}`;\n if (x.selfIpv6 !== \"\") {\n proxy += `, interface-ipv6=${x.selfIpv6}`;\n }\n proxy += `, private-key=${x.privateKey}`;\n for (const dns of x.dnsServers) {\n if (isIpv4(dns)) {\n proxy += `, dns=${dns}`;\n } else if (isIpv6(dns)) {\n proxy += `, dnsv6=${dns}`;\n }\n }\n if (x.mtu > 0) {\n proxy += `, mtu=${x.mtu}`;\n }\n if (x.keepAlive > 0) {\n proxy += `, keepalive=${x.keepAlive}`;\n }\n proxy += `, peers=[{${generatePeer(x, true)}}]`;\n break;\n case ProxyType.Hysteria2:\n proxy = `Hysteria2,${hostname},${port},\"${x.password}\"`;\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n // NOTE: some converters emit `download-bandwidth` from the *up*\n // value (and a default 100 when unset), which contradicts the\n // Hysteria2 spec. Emit the actual `down` speed instead; omit when unset.\n if (x.downSpeed > 0) {\n proxy += `,download-bandwidth=${x.downSpeed}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n if (x.fingerprint !== \"\") {\n proxy += `,tls-cert-sha256=${x.fingerprint}`;\n }\n break;\n // Loon has no AnyTLS/TUIC mapping — keep the drop instead of\n // emitting non-standard lines.\n default:\n return undefined;\n }\n if (settings.tfo) {\n proxy += \",fast-open=true\";\n }\n if (settings.udp) {\n proxy += \",udp=true\";\n }\n void remark;\n return proxy;\n}\n\nfunction buildLoonGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n const filtered: string[] = [];\n switch (group.type) {\n case \"select\":\n case \"load-balance\":\n case \"url-test\":\n case \"fallback\":\n break;\n case \"ssid\":\n if (group.proxies.length < 2) {\n continue;\n }\n lines.push(\n `${group.name} = ssid,default=${group.proxies[0]},${group.proxies.slice(1).join(\",\")}`,\n );\n continue;\n default:\n continue;\n }\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n let groupLine = `${group.type},${filtered.join(\",\")}`;\n if (group.type !== \"select\") {\n groupLine += `,url=${group.url},interval=${group.interval}`;\n if (group.type === \"load-balance\") {\n groupLine += `,algorithm=${group.strategy === \"round-robin\" ? \"round-robin\" : \"pcc\"}`;\n if (group.timeout > 0) {\n groupLine += `,max-timeout=${group.timeout}`;\n }\n }\n if (group.type === \"url-test\" && group.tolerance > 0) {\n groupLine += `,tolerance=${group.tolerance}`;\n }\n if (group.type === \"fallback\") {\n groupLine += `,max-timeout=${group.timeout}`;\n }\n }\n lines.push(`${group.name} = ${groupLine}`);\n }\n return lines;\n}\n\nexport interface LoonOptions {\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\n/** Convert nodes into a Loon configuration string. */\nexport function toLoon(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: LoonOptions,\n): string {\n const remarksList: string[] = [];\n const proxyLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildLoonNode(x, settings, remark);\n if (line === undefined) {\n continue;\n }\n proxyLines.push(`${remark} = ${line}`);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return proxyLines.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"Proxy\", proxyLines);\n const groupLines = buildLoonGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"Proxy Group\", groupLines);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setRawSection(sections, options.rules.section, options.rules.lines);\n }\n return renderRawIni(sections);\n}\n","import { parseRulesetSource } from \"../settings/config\";\nimport type { RulesetContent, RulesetType } from \"../types/ruleset\";\nimport { RulesetType as RulesetTypeEnum } from \"../types/ruleset\";\n\nconst BASIC_TYPES = [\n \"DOMAIN\",\n \"DOMAIN-SUFFIX\",\n \"DOMAIN-KEYWORD\",\n \"IP-CIDR\",\n \"SRC-IP-CIDR\",\n \"GEOIP\",\n \"MATCH\",\n \"FINAL\",\n];\n\nexport const CLASH_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"SRC-PORT\",\n \"DST-PORT\",\n \"PROCESS-NAME\",\n];\n\nexport const SURGE2_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"USER-AGENT\",\n \"URL-REGEX\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nexport const SURGE_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"USER-AGENT\",\n \"URL-REGEX\",\n \"AND\",\n \"OR\",\n \"NOT\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nexport const QUANX_RULE_TYPES = [\n ...BASIC_TYPES,\n \"USER-AGENT\",\n \"HOST\",\n \"HOST-SUFFIX\",\n \"HOST-KEYWORD\",\n];\n\nexport const SURF_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nfunction isIpv4(value: string): boolean {\n const parts = value.split(\".\");\n return parts.length === 4 && parts.every((p) => /^\\d{1,3}$/.test(p) && Number(p) <= 255);\n}\n\nfunction stripComment(line: string): string {\n const idx = line.indexOf(\"//\");\n return (idx >= 0 ? line.slice(0, idx) : line).trim();\n}\n\nfunction isRuleLine(line: string): boolean {\n return line.length > 0 && line[0] !== \";\" && line[0] !== \"#\" && !line.startsWith(\"//\");\n}\n\n/**\n * Convert a ruleset body into the common `TYPE,VALUE[,flag]` Surge dialect.\n * Mirrors ruleconvert.cpp `convertRuleset`.\n */\nexport function convertRuleset(content: string, type: RulesetType): string {\n if (type === RulesetTypeEnum.Surge) {\n return content;\n }\n\n if (/^payload:\\r?\\n/.test(content)) {\n let output = content.replace(/payload:\\r?\\n/, \"\");\n output = output.replace(/^\\s*-\\s+(['\"]?)(.*?)\\1\\s*$/gm, \"$2\");\n if (type === RulesetTypeEnum.ClashClassical) {\n return output;\n }\n const lines: string[] = [];\n for (let raw of output.split(/\\r?\\n/)) {\n raw = raw.trim();\n if (raw.includes(\"//\")) {\n raw = stripComment(raw);\n }\n if (!isRuleLine(raw)) {\n continue;\n }\n let prefix: string;\n if (raw.includes(\"/\")) {\n prefix = isIpv4(raw.slice(0, raw.indexOf(\"/\"))) ? \"IP-CIDR,\" : \"IP-CIDR6,\";\n } else if (raw.startsWith(\".\") || raw.startsWith(\"+.\")) {\n let keyword = false;\n let value = raw;\n while (value.endsWith(\".*\")) {\n keyword = true;\n value = value.slice(0, -2);\n }\n prefix = keyword ? \"DOMAIN-KEYWORD,\" : \"DOMAIN-SUFFIX,\";\n value = value.slice(value.startsWith(\"+.\") ? 2 : value.startsWith(\".\") ? 1 : 0);\n lines.push(prefix + value);\n continue;\n } else {\n prefix = \"DOMAIN,\";\n }\n lines.push(prefix + raw);\n }\n return lines.join(\"\\n\");\n }\n\n // QuanX dialect.\n const lines: string[] = [];\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (line === \"\" || line.startsWith(\"#\") || line.startsWith(\";\")) {\n continue;\n }\n const normalized = line.replace(/^host/i, \"DOMAIN\").replace(/^ip6-cidr/i, \"IP-CIDR6\");\n const match =\n /^(DOMAIN(?:-(?:SUFFIX|KEYWORD))?|IP-CIDR6?|USER-AGENT),\\s*?(\\S*?)(?:,(?!no-resolve).*?)(,no-resolve)?$/i.exec(\n normalized,\n );\n if (match) {\n const ruleType = (match[1] as string).toUpperCase();\n const value = match[2] as string;\n lines.push(`${ruleType},${value}${match[3] ?? \"\"}`);\n } else {\n lines.push(normalized);\n }\n }\n return lines.join(\"\\n\");\n}\n\n/** Rewrite `TYPE,VALUE[,flag]` into `TYPE,VALUE,GROUP[,flag]`. */\nexport function transformRuleToCommon(input: string, group: string, noResolveOnly = false): string {\n const parts = input.split(\",\");\n if (parts.length < 2) {\n return `${parts[0] ?? \"\"},${group}`;\n }\n let line = `${parts[0]},${parts[1]},${group}`;\n if (parts.length > 2 && (!noResolveOnly || parts[2] === \"no-resolve\")) {\n line += `,${parts[2]}`;\n }\n return line;\n}\n\nfunction startsWithAny(line: string, types: string[]): boolean {\n return types.some((type) => line.startsWith(type));\n}\n\nfunction collectRuleLines(content: string, group: string, noResolveOnly: boolean): string[] {\n const converted = convertRuleset(content, RulesetTypeEnum.Surge);\n const out: string[] = [];\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n if (line === \"\") {\n continue;\n }\n out.push(transformRuleToCommon(line, group, noResolveOnly));\n }\n return out;\n}\n\n/** Convert rulesets into an ordered list of Clash rule strings. */\nexport function rulesetToClashRules(rulesets: RulesetContent[], classical = false): string[] {\n const rules: string[] = [];\n for (const ruleset of rulesets) {\n const content = ruleset.content;\n if (content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (content.startsWith(\"[]\")) {\n let line = content.slice(2);\n if (line.startsWith(\"FINAL\")) {\n line = `MATCH${line.slice(5)}`;\n }\n rules.push(transformRuleToCommon(line, group));\n continue;\n }\n const converted = convertRuleset(\n content,\n classical && /^payload:\\r?\\n/.test(content)\n ? RulesetTypeEnum.ClashClassical\n : ruleset.ruleType,\n );\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (!startsWithAny(line, CLASH_RULE_TYPES)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n rules.push(transformRuleToCommon(line, group));\n }\n }\n return rules;\n}\n\nexport interface SurgeRulesetResult {\n section: string;\n lines: string[];\n}\n\n/** Convert rulesets into Surge/QuanX/Quan/Loon rule lines. */\nexport function rulesetToSurgeRules(\n rulesets: RulesetContent[],\n surgeVersion: number,\n expand = true,\n): SurgeRulesetResult {\n let section: string;\n let allowed: string[];\n let noResolveOnly = false;\n switch (surgeVersion) {\n case 0:\n section = \"RoutingRule\";\n allowed = SURGE_RULE_TYPES;\n break;\n case -1:\n section = \"filter_local\";\n allowed = QUANX_RULE_TYPES;\n noResolveOnly = true;\n break;\n case -2:\n section = \"TCP\";\n allowed = QUANX_RULE_TYPES;\n noResolveOnly = true;\n break;\n case -3:\n section = \"Rule\";\n allowed = SURF_RULE_TYPES;\n break;\n case -4:\n section = \"Rule\";\n allowed = SURGE_RULE_TYPES;\n break;\n default:\n section = \"Rule\";\n allowed = surgeVersion > 2 ? SURGE_RULE_TYPES : SURGE2_RULE_TYPES;\n break;\n }\n const lines: string[] = [];\n for (const ruleset of rulesets) {\n if (ruleset.content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (!expand && (surgeVersion > 2 || surgeVersion === -3)) {\n // Keep the remote reference so the client fetches the list itself.\n const { url } = parseRulesetSource(ruleset.rulePath);\n if (/^https?:\\/\\//i.test(url.trim()) && !ruleset.content.startsWith(\"[]\")) {\n let line = `RULE-SET,${url.trim()},${group}`;\n if (ruleset.updateInterval > 0) {\n line += `,update-interval=${ruleset.updateInterval}`;\n }\n lines.push(line);\n continue;\n }\n }\n if (ruleset.content.startsWith(\"[]\")) {\n let line = ruleset.content.slice(2);\n if (line === \"MATCH\") {\n line = \"FINAL\";\n }\n if (surgeVersion === -1 || surgeVersion === -2) {\n line = transformRuleToCommon(line, group, true);\n } else if (!line.startsWith(\"AND\") && !line.startsWith(\"OR\") && !line.startsWith(\"NOT\")) {\n line = transformRuleToCommon(line, group);\n }\n lines.push(line.replace(/,,/g, \",\"));\n continue;\n }\n for (const rawLine of collectRuleLines(ruleset.content, group, noResolveOnly)) {\n if (surgeVersion === -2 && rawLine.startsWith(\"IP-CIDR6\")) {\n continue;\n }\n if (!startsWithAny(rawLine, allowed)) {\n continue;\n }\n const line =\n surgeVersion === -1 || surgeVersion === -2\n ? rawLine.replace(/^IP-CIDR6/, \"IP6-CIDR\")\n : rawLine;\n lines.push(line);\n }\n }\n return { lines, section };\n}\n\nexport const SING_BOX_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-VERSION\",\n \"INBOUND\",\n \"PROTOCOL\",\n \"NETWORK\",\n \"GEOSITE\",\n \"SRC-GEOIP\",\n \"DOMAIN-REGEX\",\n \"PROCESS-NAME\",\n \"PROCESS-PATH\",\n \"PACKAGE-NAME\",\n \"PORT\",\n \"PORT-RANGE\",\n \"SRC-PORT\",\n \"SRC-PORT-RANGE\",\n \"USER\",\n \"USER-ID\",\n];\n\n/** A sing-box `route` fragment produced from rulesets. */\nexport interface SingBoxRoute {\n rules: Record<string, unknown>[];\n final: string;\n}\n\nfunction toSingBoxKey(type: string): string {\n return type\n .toLowerCase()\n .replace(/-/g, \"_\")\n .replace(/ip_cidr6/g, \"ip_cidr\")\n .replace(/src_/g, \"source_\");\n}\n\n/**\n * Convert rulesets into a sing-box `route` fragment.\n * Mirrors ruleconvert.cpp `rulesetToSingBox`.\n */\nexport function rulesetToSingBoxRules(rulesets: RulesetContent[]): SingBoxRoute {\n const rules: Record<string, unknown>[] = [{ outbound: \"dns-out\", protocol: \"dns\" }];\n let final = \"\";\n\n for (const ruleset of rulesets) {\n const content = ruleset.content;\n if (content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (content.startsWith(\"[]\")) {\n const line = content.slice(2);\n if (line.startsWith(\"FINAL\") || line.startsWith(\"MATCH\")) {\n final = group;\n continue;\n }\n const parts = line.split(\",\");\n if (parts.length < 2) {\n continue;\n }\n const type = toSingBoxKey(parts[0] as string);\n const value = (parts[1] as string).toLowerCase();\n if (type === \"match\" || type === \"final\") {\n rules.push({ outbound: value });\n } else {\n rules.push({ outbound: group, [type]: value });\n }\n continue;\n }\n\n const converted = convertRuleset(content, ruleset.ruleType);\n const rule: Record<string, unknown> = {};\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n const args = line.split(\",\");\n if (args.length < 2) {\n continue;\n }\n const rawType = args[0] as string;\n if (!SING_BOX_RULE_TYPES.includes(rawType)) {\n continue;\n }\n const key = toSingBoxKey(rawType);\n const value = (args[1] as string).toLowerCase();\n const bucket = (rule[key] as string[] | undefined) ?? [];\n bucket.push(value);\n rule[key] = bucket;\n }\n if (Object.keys(rule).length === 0) {\n continue;\n }\n rule.outbound = group;\n rules.push(rule);\n }\n\n return { final, rules };\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { rulesetToSurgeRules } from \"./ruleset\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { RulesetContent } from \"../types/ruleset\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { urlSafeBase64Encode } from \"../utils/base64\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { urlEncode } from \"../utils/url\";\n\nfunction buildMellowEndpoint(x: Proxy, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (x.plugin !== \"\") {\n return undefined;\n }\n return `${remark}, ss, ss://${urlSafeBase64Encode(`${x.encryptMethod}:${x.password}`)}@${hostname}:${port}`;\n case ProxyType.VMess: {\n let proxy = `${remark}, vmess1, vmess1://${x.userId}@${hostname}:${port}`;\n if (x.path !== \"\") {\n proxy += x.path;\n }\n proxy += `?network=${x.transferProtocol}`;\n switch (x.transferProtocol) {\n case \"ws\":\n proxy += `&ws.host=${urlEncode(x.host)}`;\n break;\n case \"http\":\n if (x.host !== \"\") {\n proxy += `&http.host=${urlEncode(x.host)}`;\n }\n break;\n case \"quic\":\n if (x.quicSecure !== \"\" || x.quicSecret !== \"\") {\n proxy += `&quic.security=${x.quicSecure}&quic.key=${x.quicSecret}`;\n }\n break;\n default:\n break;\n }\n proxy += `&tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure && x.host !== \"\") {\n proxy += `&tls.servername=${urlEncode(x.host)}`;\n }\n if (x.allowInsecure !== undefined) {\n proxy += `&tls.allowinsecure=${x.allowInsecure ? \"true\" : \"false\"}`;\n }\n if (x.tcpFastOpen !== undefined) {\n proxy += `&sockopt.tcpfastopen=${x.tcpFastOpen ? \"true\" : \"false\"}`;\n }\n return proxy;\n }\n case ProxyType.SOCKS5:\n return `${remark}, builtin, socks, address=${hostname}, port=${port}, user=${x.username}, pass=${x.password}`;\n case ProxyType.HTTP:\n return `${remark}, builtin, http, address=${hostname}, port=${port}, user=${x.username}, pass=${x.password}`;\n default:\n return undefined;\n }\n}\n\nfunction buildMellowGroups(\n extraProxyGroup: ProxyGroupConfig[],\n nodelist: Proxy[],\n remarks: string[],\n): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n switch (group.type) {\n case \"select\":\n case \"url-test\":\n case \"fallback\":\n case \"load-balance\":\n break;\n default:\n continue;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, false);\n }\n if (filtered.length === 0) {\n if (remarks.length === 0) {\n filtered.push(\"DIRECT\");\n } else {\n filtered.push(...remarks);\n }\n }\n lines.push(`${group.name}, ${filtered.join(\":\")}, latency, interval=300, timeout=6`);\n }\n return lines;\n}\n\nexport interface MellowOptions {\n baseConf: string;\n nodeList: boolean;\n rulesets?: RulesetContent[];\n overwriteOriginalRules?: boolean;\n}\n\n/** Convert nodes into a Mellow (`mellow.conf`) configuration string. */\nexport function toMellow(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: MellowOptions,\n): string {\n const remarksList: string[] = [];\n const endpoints: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildMellowEndpoint(x, remark);\n if (line === undefined) {\n continue;\n }\n endpoints.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return endpoints.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n const append = (name: string, lines: string[]): void => {\n if (lines.length === 0) {\n return;\n }\n const existing = sections.find((section) => section.name === name);\n if (existing && !(options.overwriteOriginalRules ?? true)) {\n existing.lines.push(...lines);\n } else {\n setRawSection(sections, name, lines);\n }\n };\n append(\"Endpoint\", endpoints);\n append(\"EndpointGroup\", buildMellowGroups(extraProxyGroup, nodelist, remarksList));\n if (options.rulesets && options.rulesets.length > 0) {\n const rules = rulesetToSurgeRules(options.rulesets, 0);\n append(rules.section, rules.lines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode, urlSafeBase64Encode } from \"../utils/base64\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { urlEncode } from \"../utils/url\";\n\nfunction buildQuanNode(\n x: Proxy,\n settings: ExtraSettings,\n remark: string,\n nodeList: boolean,\n): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n const group = x.group;\n let method = x.encryptMethod;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxyStr: string;\n switch (x.type) {\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxyStr = `${remark} = vmess, ${hostname}, ${port}, ${method}, \"${x.userId}\", group=${group}`;\n if (x.tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (x.transferProtocol === \"ws\") {\n proxyStr += `, obfs=ws, obfs-path=\"${x.path}\", obfs-header=\"Host: ${x.host}`;\n if (x.edge !== \"\") {\n proxyStr += `[Rr][Nn]Edge: ${x.edge}`;\n }\n proxyStr += '\"';\n }\n if (nodeList) {\n proxyStr = `vmess://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n case ProxyType.ShadowsocksR:\n if (nodeList) {\n proxyStr = `ssr://${urlSafeBase64Encode(\n `${hostname}:${port}:${x.protocol}:${method}:${x.obfs}:${urlSafeBase64Encode(x.password)}` +\n `/?group=${urlSafeBase64Encode(group)}&remarks=${urlSafeBase64Encode(remark)}` +\n `&obfsparam=${urlSafeBase64Encode(x.obfsParam)}&protoparam=${urlSafeBase64Encode(x.protocolParam)}`,\n )}`;\n } else {\n proxyStr = `${remark} = shadowsocksr, ${hostname}, ${port}, ${method}, \"${x.password}\", group=${group}, protocol=${x.protocol}, obfs=${x.obfs}`;\n if (x.protocolParam !== \"\") {\n proxyStr += `, protocol_param=${x.protocolParam}`;\n }\n if (x.obfsParam !== \"\") {\n proxyStr += `, obfs_param=${x.obfsParam}`;\n }\n }\n break;\n case ProxyType.Shadowsocks:\n if (nodeList) {\n proxyStr = `ss://${urlSafeBase64Encode(`${method}:${x.password}`)}@${hostname}:${port}`;\n if (x.plugin !== \"\" && x.pluginOption !== \"\") {\n proxyStr += `/?plugin=${urlEncode(`${x.plugin};${x.pluginOption}`)}`;\n }\n proxyStr += `&group=${urlSafeBase64Encode(group)}#${urlEncode(remark)}`;\n } else {\n proxyStr = `${remark} = shadowsocks, ${hostname}, ${port}, ${method}, \"${x.password}\", group=${group}`;\n if (x.plugin === \"obfs-local\" && x.pluginOption !== \"\") {\n proxyStr += `, ${x.pluginOption.replace(/;/g, \", \")}`;\n }\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxyStr = `${remark} = http, upstream-proxy-address=${hostname}, upstream-proxy-port=${port}, group=${group}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, upstream-proxy-auth=true, upstream-proxy-username=${x.username}, upstream-proxy-password=${x.password}`;\n } else {\n proxyStr += \", upstream-proxy-auth=false\";\n }\n if (x.tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (x.host !== \"\") {\n proxyStr += `, tls-host=${x.host}`;\n }\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (nodeList) {\n proxyStr = `http://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n case ProxyType.SOCKS5:\n proxyStr = `${remark} = socks, upstream-proxy-address=${hostname}, upstream-proxy-port=${port}, group=${group}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, upstream-proxy-auth=true, upstream-proxy-username=${x.username}, upstream-proxy-password=${x.password}`;\n } else {\n proxyStr += \", upstream-proxy-auth=false\";\n }\n if (x.tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (x.host !== \"\") {\n proxyStr += `, tls-host=${x.host}`;\n }\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (nodeList) {\n proxyStr = `socks://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n default:\n return undefined;\n }\n return proxyStr;\n}\n\nfunction buildQuanGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n let type: string;\n switch (group.type) {\n case \"select\":\n case \"fallback\":\n type = \"static\";\n break;\n case \"url-test\":\n type = \"auto\";\n break;\n case \"load-balance\":\n type = \"balance, round-robin\";\n break;\n case \"ssid\": {\n let singlegroup = `${group.name} : wifi = ${group.proxies[0] ?? \"\"}`;\n let content = \"\";\n let celluar = \"\";\n for (const proxy of group.proxies.slice(1)) {\n const m = /^(.*?),?celluar\\s?=\\s?(.*?)(,.*)$/.exec(proxy);\n if (!m) {\n content += `${proxy}\\n`;\n continue;\n }\n celluar = m[2] as string;\n content += `${m[1] as string}${m[3] as string}\\n`;\n }\n if (celluar !== \"\") {\n singlegroup += `, celluar = ${celluar}`;\n }\n singlegroup += `\\n${content.trim().replace(/^,|,$/g, \"\").replace(/,/g, \"\\n\")}`;\n lines.push(base64Encode(singlegroup));\n continue;\n }\n default:\n continue;\n }\n\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"direct\");\n }\n if (filtered.length < 2) {\n type = \"static\";\n }\n const proxies = filtered.join(\"\\n\");\n let singlegroup = `${group.name} : ${type}`;\n if (type === \"static\") {\n singlegroup += `, ${filtered[0] as string}`;\n }\n singlegroup += `\\n${proxies}\\n`;\n lines.push(base64Encode(singlegroup));\n }\n return lines;\n}\n\nexport interface QuanOptions {\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\n/** Convert nodes into a Quantumult configuration string. */\nexport function toQuan(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: QuanOptions,\n): string {\n const remarksList: string[] = [];\n const serverLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildQuanNode(x, settings, remark, options.nodeList);\n if (line === undefined) {\n continue;\n }\n serverLines.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return base64Encode(serverLines.join(\"\\n\"));\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"SERVER\", serverLines);\n const groupLines = buildQuanGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"POLICY\", groupLines);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setRawSection(sections, options.rules.section, options.rules.lines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { getUrlArg } from \"../utils/url\";\n\nfunction triStr(value: boolean | undefined): string {\n return value ? \"true\" : \"false\";\n}\n\nfunction buildQuanxNode(x: Proxy, settings: ExtraSettings, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n let method = x.encryptMethod;\n let plugin = x.plugin;\n let pluginOption = x.pluginOption;\n let host = x.host;\n let path = x.path;\n let tlsSecure = x.tlsSecure;\n\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tls13 = x.tls13 !== undefined ? x.tls13 : settings.tls13;\n\n let proxyStr: string;\n switch (x.type) {\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxyStr = `vmess = ${hostname}:${port}, method=${method}, password=${x.userId}`;\n if (x.alterId !== 0) {\n proxyStr += \", aead=false\";\n }\n if (tlsSecure && tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxyStr += tlsSecure ? \", obfs=wss\" : \", obfs=ws\";\n proxyStr += `, obfs-host=${host}, obfs-uri=${path}`;\n } else if (tlsSecure) {\n proxyStr += `, obfs=over-tls, obfs-host=${host}`;\n }\n break;\n case ProxyType.Shadowsocks:\n proxyStr = `shadowsocks = ${hostname}:${port}, method=${method}, password=${x.password}`;\n if (plugin !== \"\") {\n if (plugin === \"simple-obfs\" || plugin === \"obfs-local\") {\n if (pluginOption !== \"\") {\n proxyStr += `, ${pluginOption.replace(/;/g, \", \")}`;\n }\n } else if (plugin === \"v2ray-plugin\") {\n pluginOption = pluginOption.replace(/;/g, \"&\");\n plugin = getUrlArg(pluginOption, \"mode\") === \"websocket\" ? \"ws\" : \"\";\n host = getUrlArg(pluginOption, \"host\");\n path = getUrlArg(pluginOption, \"path\");\n tlsSecure = pluginOption.includes(\"tls\");\n if (tlsSecure && plugin === \"ws\") {\n plugin += \"s\";\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n }\n proxyStr += `, obfs=${plugin}`;\n if (host !== \"\") {\n proxyStr += `, obfs-host=${host}`;\n }\n if (path !== \"\") {\n proxyStr += `, obfs-uri=${path}`;\n }\n } else {\n return undefined;\n }\n }\n break;\n case ProxyType.ShadowsocksR:\n proxyStr = `shadowsocks = ${hostname}:${port}, method=${method}, password=${x.password}, ssr-protocol=${x.protocol}`;\n if (x.protocolParam !== \"\") {\n proxyStr += `, ssr-protocol-param=${x.protocolParam}`;\n }\n proxyStr += `, obfs=${x.obfs}`;\n if (x.obfsParam !== \"\") {\n proxyStr += `, obfs-host=${x.obfsParam}`;\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxyStr = `http = ${hostname}:${port}, username=${x.username === \"\" ? \"none\" : x.username}, password=${x.password === \"\" ? \"none\" : x.password}`;\n if (tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n break;\n case ProxyType.Trojan:\n proxyStr = `trojan = ${hostname}:${port}, password=${x.password}`;\n if (tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n break;\n case ProxyType.SOCKS5:\n proxyStr = `socks5 = ${hostname}:${port}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, username=${x.username}, password=${x.password}`;\n if (tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n }\n break;\n case ProxyType.VLESS: {\n const vmethod = method === \"\" ? \"none\" : method;\n proxyStr = `vless = ${hostname}:${port}, method=${vmethod}, password=${x.userId}`;\n if (tlsSecure && tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n const obfsHost = host !== \"\" ? host : x.serverName !== \"\" ? x.serverName : x.sni;\n if (x.transferProtocol === \"ws\") {\n proxyStr += tlsSecure ? \", obfs=wss\" : \", obfs=ws\";\n proxyStr += `, obfs-host=${obfsHost}, obfs-uri=${path}`;\n } else if (tlsSecure) {\n proxyStr += `, obfs=over-tls, obfs-host=${obfsHost}`;\n }\n if (x.publicKey !== \"\") {\n proxyStr += `, reality-base64-pubkey=${x.publicKey}`;\n }\n if (x.shortId !== \"\") {\n proxyStr += `, reality-hex-shortid=${x.shortId}`;\n }\n if (x.flow !== \"\") {\n proxyStr += `, vless-flow=${x.flow}`;\n }\n break;\n }\n // Quantumult X has no AnyTLS/Hysteria2/TUIC mapping — drop them instead\n // of emitting non-standard lines.\n default:\n return undefined;\n }\n if (tfo !== undefined) {\n proxyStr += `, fast-open=${triStr(tfo)}`;\n }\n if (udp !== undefined) {\n proxyStr += `, udp-relay=${triStr(udp)}`;\n }\n if (\n tlsSecure &&\n scv !== undefined &&\n x.type !== ProxyType.Shadowsocks &&\n x.type !== ProxyType.ShadowsocksR\n ) {\n proxyStr += `, tls-verification=${scv ? \"false\" : \"true\"}`;\n }\n proxyStr += `, tag=${remark}`;\n return proxyStr;\n}\n\nfunction buildQuanxGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n let type: string;\n const filtered: string[] = [];\n switch (group.type) {\n case \"select\":\n type = \"static\";\n break;\n case \"url-test\":\n type = \"url-latency-benchmark\";\n break;\n case \"fallback\":\n type = \"available\";\n break;\n case \"load-balance\":\n type = \"round-robin\";\n break;\n case \"ssid\":\n type = \"ssid\";\n for (const proxy of group.proxies) {\n filtered.push(proxy.replace(/=/g, \":\"));\n }\n break;\n default:\n continue;\n }\n if (group.type !== \"ssid\") {\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"direct\");\n }\n if (filtered.length < 2) {\n type = \"static\";\n }\n }\n const proxies = filtered.join(\", \");\n let line = `${type}=${group.name}, ${proxies}`;\n if (group.type !== \"select\" && group.type !== \"ssid\") {\n line += `, check-interval=${group.interval}`;\n if (group.tolerance > 0) {\n line += `, tolerance=${group.tolerance}`;\n }\n }\n lines.push(line);\n }\n return lines;\n}\n\nexport interface QuanxOptions {\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\n/** Convert nodes into a Quantumult X configuration string. */\nexport function toQuanX(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: QuanxOptions,\n): string {\n const remarksList: string[] = [];\n const serverLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildQuanxNode(x, settings, remark);\n if (line === undefined) {\n continue;\n }\n serverLines.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return serverLines.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"server_local\", serverLines);\n const groupLines = buildQuanxGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"policy\", groupLines);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setRawSection(sections, options.rules.section, options.rules.lines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { rulesetToSingBoxRules } from \"./ruleset\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { RulesetContent } from \"../types/ruleset\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode } from \"../utils/base64\";\n\n/** Format a sing-box duration string from seconds (e.g. 3660 → `1h1m`). */\nexport function formatSingBoxInterval(interval: number): string {\n let remaining = interval;\n let result = \"\";\n if (remaining >= 3600) {\n result += `${Math.floor(remaining / 3600)}h`;\n remaining %= 3600;\n }\n if (remaining >= 60) {\n result += `${Math.floor(remaining / 60)}m`;\n remaining %= 60;\n }\n if (remaining > 0) {\n result += `${remaining}s`;\n }\n return result;\n}\n\nfunction buildTransport(proxy: Proxy): Record<string, unknown> | undefined {\n switch (proxy.transferProtocol) {\n case \"http\":\n return undefined;\n case \"ws\": {\n const headers: Record<string, string> = {};\n if (proxy.host !== \"\") {\n headers.Host = proxy.host;\n }\n if (proxy.edge !== \"\") {\n headers.Edge = proxy.edge;\n }\n return {\n headers,\n path: proxy.path === \"\" ? \"/\" : proxy.path,\n type: \"ws\",\n };\n }\n case \"grpc\":\n return {\n ...(proxy.path !== \"\" ? { service_name: proxy.path } : {}),\n type: \"grpc\",\n };\n default:\n return undefined;\n }\n}\n\nfunction buildTls(x: Proxy, scv: boolean | undefined): Record<string, unknown> | undefined {\n if (!x.tlsSecure) {\n return undefined;\n }\n const tls: Record<string, unknown> = { enabled: true, insecure: scv === true };\n if (x.serverName !== \"\") {\n tls.server_name = x.serverName;\n } else if (x.host !== \"\") {\n tls.server_name = x.host;\n } else if (x.sni !== \"\") {\n tls.server_name = x.sni;\n }\n if (x.alpn.length > 0) {\n tls.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n tls.certificate = x.ca;\n }\n if (x.caStr !== \"\") {\n tls.certificate = x.caStr;\n }\n return tls;\n}\n\nfunction buildOutbound(\n x: Proxy,\n settings: ExtraSettings,\n remark: string,\n): Record<string, unknown> | undefined {\n const common = {\n server: x.hostname,\n server_port: x.port,\n tag: remark,\n };\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxy: Record<string, unknown>;\n switch (x.type) {\n case ProxyType.Shadowsocks: {\n const out: Record<string, unknown> = {\n ...common,\n method: x.encryptMethod,\n password: x.password,\n type: \"shadowsocks\",\n };\n if (x.plugin !== \"\" && x.pluginOption !== \"\") {\n out.plugin = x.plugin === \"simple-obfs\" ? \"obfs-local\" : x.plugin;\n out.plugin_opts = x.pluginOption;\n }\n proxy = out;\n break;\n }\n // sing-box has no ShadowsocksR implementation (configs using it fail\n // at startup), so such nodes are dropped.\n case ProxyType.ShadowsocksR:\n return undefined;\n case ProxyType.Snell: {\n const out: Record<string, unknown> = { ...common, psk: x.password, type: \"snell\" };\n if (x.snellVersion) {\n out.version = x.snellVersion;\n }\n if (x.obfs !== \"\" && x.obfs !== \"none\") {\n out.obfs_mode = x.obfs;\n }\n if (x.host !== \"\") {\n out.obfs_host = x.host;\n }\n proxy = out;\n break;\n }\n case ProxyType.VMess: {\n const out: Record<string, unknown> = {\n ...common,\n alter_id: x.alterId,\n security: x.encryptMethod,\n type: \"vmess\",\n uuid: x.userId,\n };\n const transport = buildTransport(x);\n if (transport) {\n out.transport = transport;\n }\n proxy = out;\n break;\n }\n case ProxyType.VLESS: {\n const out: Record<string, unknown> = { ...common, type: \"vless\", uuid: x.userId };\n if (x.flow !== \"\") {\n out.flow = x.flow;\n }\n const transport = buildTransport(x);\n if (transport) {\n out.transport = transport;\n }\n proxy = out;\n break;\n }\n case ProxyType.Trojan: {\n const out: Record<string, unknown> = { ...common, password: x.password, type: \"trojan\" };\n const transport = buildTransport(x);\n if (transport) {\n out.transport = transport;\n }\n proxy = out;\n break;\n }\n case ProxyType.TUIC: {\n const out: Record<string, unknown> = {\n ...common,\n password: x.password,\n type: \"tuic\",\n udp_relay_mode: \"native\",\n uuid: x.userId,\n };\n if (x.congestionControl !== \"\") {\n out.congestion_control = x.congestionControl;\n }\n proxy = out;\n break;\n }\n case ProxyType.WireGuard: {\n const addresses = [x.selfIp];\n if (x.selfIpv6 !== \"\") {\n addresses.push(x.selfIpv6);\n }\n const peer: Record<string, unknown> = {\n public_key: x.publicKey,\n server: x.hostname,\n server_port: x.port,\n };\n if (x.preSharedKey !== \"\") {\n peer.pre_shared_key = x.preSharedKey;\n }\n if (x.allowedIps !== \"\") {\n peer.allowed_ips = x.allowedIps.split(\",\").map((s) => s.trim());\n }\n if (x.clientId !== \"\") {\n peer.reserved = x.clientId.split(\",\").map((s) => Number(s.trim()));\n }\n proxy = {\n local_address: addresses,\n mtu: x.mtu,\n peers: [peer],\n private_key: x.privateKey,\n tag: remark,\n type: \"wireguard\",\n };\n break;\n }\n case ProxyType.Hysteria: {\n const out: Record<string, unknown> = { ...common, type: \"hysteria\" };\n if (x.up !== \"\") {\n out.up_mbps = x.upSpeed;\n }\n if (x.down !== \"\") {\n out.down_mbps = x.downSpeed;\n }\n if (x.obfs !== \"\") {\n out.obfs = x.obfs;\n }\n if (x.authStr !== \"\") {\n out.auth_str = x.authStr;\n out.auth = base64Encode(x.authStr);\n }\n if (x.recvWindowConn) {\n out.recv_window_conn = x.recvWindowConn;\n }\n if (x.recvWindow) {\n out.recv_window = x.recvWindow;\n }\n if (x.disableMtuDiscovery !== undefined) {\n out.disable_mtu_discovery = x.disableMtuDiscovery;\n }\n proxy = out;\n break;\n }\n case ProxyType.Hysteria2: {\n const out: Record<string, unknown> = { ...common, type: \"hysteria2\" };\n if (x.ports !== \"\") {\n out.server_ports = x.ports\n .split(\",\")\n .map((p) => p.trim())\n .filter((p) => p !== \"\")\n .map((p) => (/^\\d+$/.test(p) ? `${p}:${p}` : p));\n }\n if (x.upSpeed) {\n out.up_mbps = x.upSpeed;\n }\n if (x.downSpeed) {\n out.down_mbps = x.downSpeed;\n }\n if (x.obfs !== \"\") {\n out.obfs = {\n ...(x.obfsParam !== \"\" ? { password: x.obfsParam } : {}),\n type: x.obfs,\n };\n }\n if (x.password !== \"\") {\n out.password = x.password;\n }\n if (x.hopInterval) {\n out.hop_interval = formatSingBoxInterval(x.hopInterval);\n }\n proxy = out;\n break;\n }\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxy = {\n ...common,\n password: x.password,\n type: \"http\",\n username: x.username,\n };\n break;\n case ProxyType.SOCKS5:\n proxy = {\n ...common,\n password: x.password,\n type: \"socks\",\n username: x.username,\n version: \"5\",\n };\n break;\n case ProxyType.AnyTLS:\n proxy = {\n ...common,\n type: \"anytls\",\n users: [{ password: x.password, username: \"sekai\" }],\n };\n break;\n default:\n return undefined;\n }\n\n const tls = buildTls(x, scv);\n if (tls) {\n if (x.type === ProxyType.VLESS && (x.publicKey !== \"\" || x.shortId !== \"\")) {\n const tlsRec = tls as Record<string, unknown>;\n if (x.fingerprint !== \"\") {\n tlsRec.utls = { enabled: true, fingerprint: x.fingerprint };\n }\n tlsRec.reality = {\n enabled: true,\n public_key: x.publicKey,\n short_id: x.shortId,\n };\n }\n proxy.tls = tls;\n }\n if (udp !== undefined && !udp) {\n proxy.network = \"tcp\";\n }\n if (tfo !== undefined) {\n proxy.tcp_fast_open = tfo;\n }\n return proxy;\n}\n\nexport interface SingBoxOptions {\n baseConf: string;\n nodeList: boolean;\n rulesets?: RulesetContent[];\n overwriteOriginalRules?: boolean;\n}\n\n/** Convert nodes into a sing-box configuration JSON string. */\nexport function toSingBox(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SingBoxOptions,\n): string {\n let doc: Record<string, unknown>;\n if (options.nodeList) {\n doc = {};\n } else {\n try {\n doc = (options.baseConf.trim() === \"\" ? {} : JSON.parse(options.baseConf)) as Record<\n string,\n unknown\n >;\n } catch {\n throw new Error(\"sing-box base config is not valid JSON\");\n }\n }\n\n const outbounds: Record<string, unknown>[] = [];\n if (!options.nodeList) {\n outbounds.push({ tag: \"DIRECT\", type: \"direct\" });\n outbounds.push({ tag: \"REJECT\", type: \"block\" });\n outbounds.push({ tag: \"dns-out\", type: \"dns\" });\n }\n\n const remarksList: string[] = [];\n const nodelist: Proxy[] = [];\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList, false);\n x.remark = remark;\n const outbound = buildOutbound(x, settings, remark);\n if (!outbound) {\n continue;\n }\n outbounds.push(outbound);\n nodelist.push(x);\n remarksList.push(remark);\n }\n\n if (!options.nodeList) {\n for (const group of extraProxyGroup) {\n let type: string;\n switch (group.type) {\n case \"select\":\n type = \"selector\";\n break;\n case \"url-test\":\n case \"fallback\":\n case \"load-balance\":\n type = \"urltest\";\n break;\n default:\n continue;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n const entry: Record<string, unknown> = { outbounds: filtered, tag: group.name, type };\n if (group.type === \"url-test\") {\n entry.url = group.url;\n entry.interval = formatSingBoxInterval(group.interval);\n if (group.tolerance > 0) {\n entry.tolerance = group.tolerance;\n }\n }\n outbounds.push(entry);\n }\n }\n\n doc.outbounds = outbounds;\n\n if (\n !options.nodeList &&\n options.rulesets &&\n options.rulesets.length > 0 &&\n settings.enableRuleGenerator\n ) {\n const route = rulesetToSingBoxRules(options.rulesets);\n const existingRoute = doc.route as Record<string, unknown> | undefined;\n const existingRules =\n !(options.overwriteOriginalRules ?? true) &&\n existingRoute &&\n Array.isArray(existingRoute.rules)\n ? (existingRoute.rules as Record<string, unknown>[])\n : [];\n doc.route = {\n ...(existingRoute ?? {}),\n final: route.final,\n rules: [...existingRules, ...route.rules],\n };\n }\n\n return JSON.stringify(doc, null, 2);\n}\n","import { toSurge } from \"./surge\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\n\nexport interface SurfboardOptions {\n baseConf: string;\n nodeList: boolean;\n rules?: { section: string; lines: string[] };\n}\n\n/**\n * Convert nodes into a Surfboard configuration.\n *\n * Surfboard is Surge-compatible but drops Hysteria2/AnyTLS nodes while keeping the same\n * latest-Surge proxy-line format for the rest (SS/SSR-less VMess/Trojan/\n * SOCKS/HTTP subset). Reuse the Surge generator on the filtered node list\n * so proxy-line fixes stay in one place.\n */\nexport function toSurfboard(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SurfboardOptions,\n): string {\n const filtered = nodes.filter(\n (n) => n.type !== ProxyType.Hysteria2 && n.type !== ProxyType.AnyTLS,\n );\n return toSurge(filtered, extraProxyGroup, settings, {\n baseConf: options.baseConf,\n nodeList: options.nodeList,\n rules: options.rules,\n version: 5,\n });\n}\n","import { buildClash, stringifyClash } from \"./generator/clash\";\nimport { getDefaultProxyGroups, getDefaultRulesets } from \"./generator/default-profile\";\nimport { proxyToSingle, proxyToSsd, proxyToSsSub } from \"./generator/links\";\nimport { toLoon } from \"./generator/loon\";\nimport { toMellow } from \"./generator/mellow\";\nimport { dedupeNodes, preprocessNodes } from \"./generator/nodes\";\nimport { toQuan } from \"./generator/quan\";\nimport { toQuanX } from \"./generator/quanx\";\nimport { rulesetToClashRules, rulesetToSurgeRules } from \"./generator/ruleset\";\nimport { toSingBox } from \"./generator/singbox\";\nimport { toSurfboard } from \"./generator/surfboard\";\nimport { toSurge } from \"./generator/surge\";\nimport type { Proxy } from \"./types/proxy\";\nimport type { ProxyGroupConfig } from \"./types/proxy-group\";\nimport type { RulesetContent } from \"./types/ruleset\";\nimport type { ExtraSettings } from \"./types/settings\";\nimport { TargetFormat, createExtraSettings } from \"./types/settings\";\nimport { hasTemplatePlaceholders, renderTemplate } from \"./utils/template\";\n\n/** Options controlling a single conversion. */\nexport interface GenerateOptions {\n target: TargetFormat;\n groups?: ProxyGroupConfig[];\n settings?: Partial<ExtraSettings>;\n baseConf?: string;\n surgeVersion?: number;\n rulesets?: RulesetContent[];\n /**\n * Whether to attach rules (and default proxy groups) like upstream\n * `tindy2013/subconverter` does with e.g. `config=ACL4SSR.ini`.\n *\n * - `true`/`undefined` (default): emit rules; when `rulesets` is empty,\n * fall back to the bundled offline defaults. When `groups` is empty,\n * fall back to the bundled default proxy groups so rule references\n * resolve. Pass `no_rules`/`--no-rules` (`false`) to strip rules.\n * - `false`: never emit rules, even if `rulesets` are provided.\n */\n includeRules?: boolean;\n}\n\nconst V2RAY_TYPE_MASK = 1 | 2 | 4 | 8;\n\n/** Apply rename/emoji/sort preprocessing from settings to nodes. */\nexport function runPreprocess(nodes: Proxy[], settings: ExtraSettings): void {\n preprocessNodes(nodes, {\n addEmoji: settings.addEmoji,\n autoCountry: settings.autoCountry,\n countryResolver: settings.countryResolver,\n emojiArray: settings.emojiArray,\n excludeCountries: settings.excludeCountries,\n excludeRemarks: settings.excludeRemarks,\n includeCountries: settings.includeCountries,\n includeRemarks: settings.includeRemarks,\n nameRegexArray: settings.nameRegexArray,\n nameRemove: settings.nameRemove,\n removeEmoji: settings.removeEmoji,\n renameArray: settings.renameArray,\n sortFlag: settings.sortFlag,\n });\n if (settings.dedupe) {\n dedupeNodes(nodes);\n }\n}\n\n/**\n * Convert nodes into the requested output format.\n *\n * This is the isomorphic generation entry point used by the CLI, the Node\n * adapter, and the browser build.\n */\nexport function generate(nodes: Proxy[], options: GenerateOptions): string {\n const settings: ExtraSettings = { ...createExtraSettings(), ...options.settings };\n runPreprocess(nodes, settings);\n const groups = resolveGroups(options);\n const rulesets = resolveRulesets(options, settings);\n const baseConf = applyBaseTemplate(options.baseConf ?? \"\", settings);\n\n switch (options.target) {\n case TargetFormat.Clash:\n case TargetFormat.ClashR: {\n const { doc } = buildClash(nodes, groups, settings, options.target === TargetFormat.ClashR);\n attachClashRules(doc, settings, rulesets);\n return stringifyClash(doc);\n }\n case TargetFormat.Surge: {\n const surgeVersion = options.surgeVersion ?? 5;\n const rules = rulesets\n ? rulesetToSurgeRules(rulesets, surgeVersion, settings.expandRulesets)\n : undefined;\n return toSurge(nodes, groups, settings, {\n baseConf,\n nodeList: settings.nodeList,\n rules,\n version: surgeVersion,\n });\n }\n case TargetFormat.QuantumultX: {\n const rules = rulesets ? rulesetToSurgeRules(rulesets, -1) : undefined;\n return toQuanX(nodes, groups, settings, {\n baseConf,\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.Quantumult: {\n const rules = rulesets ? rulesetToSurgeRules(rulesets, -2) : undefined;\n return toQuan(nodes, groups, settings, {\n baseConf,\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.Loon: {\n const rules = rulesets ? rulesetToSurgeRules(rulesets, -4) : undefined;\n return toLoon(nodes, groups, settings, {\n baseConf,\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.SingBox:\n return toSingBox(nodes, groups, settings, {\n baseConf,\n nodeList: settings.nodeList,\n overwriteOriginalRules: settings.overwriteOriginalRules,\n rulesets,\n });\n case TargetFormat.Mellow:\n return toMellow(nodes, groups, settings, {\n baseConf,\n nodeList: settings.nodeList,\n overwriteOriginalRules: settings.overwriteOriginalRules,\n rulesets,\n });\n case TargetFormat.V2Ray:\n return proxyToSingle(nodes, 4, settings);\n case TargetFormat.Trojan:\n return proxyToSingle(nodes, 8, settings);\n case TargetFormat.Mixed:\n return proxyToSingle(nodes, V2RAY_TYPE_MASK, settings);\n case TargetFormat.SSC:\n return proxyToSingle(nodes, 1, settings);\n case TargetFormat.SSR:\n return proxyToSingle(nodes, 2, settings);\n case TargetFormat.SSD:\n return proxyToSsd(nodes, \"\", \"\");\n case TargetFormat.SSSub:\n return proxyToSsSub(nodes, baseConf);\n case TargetFormat.Surfboard: {\n const rules = rulesets\n ? rulesetToSurgeRules(rulesets, options.surgeVersion ?? 5, settings.expandRulesets)\n : undefined;\n return toSurfboard(nodes, groups, settings, {\n baseConf,\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.NodeList: {\n settings.nodeList = true;\n return proxyToSingle(nodes, V2RAY_TYPE_MASK, settings);\n }\n default:\n throw new Error(`Unsupported target format: ${options.target}`);\n }\n}\n\n/** Apply `[template]` variables to `{{ var }}` placeholders in a base config. */\nfunction applyBaseTemplate(baseConf: string, settings: ExtraSettings): string {\n if (baseConf === \"\" || !hasTemplatePlaceholders(baseConf)) {\n return baseConf;\n }\n return renderTemplate(baseConf, settings.templateVars);\n}\n\n/** Export Shadowsocks nodes as a SIP008 document (`ssconf`). */\nexport function toSip008(nodes: Proxy[], baseConf = \"\"): string {\n return proxyToSsSub(nodes, baseConf);\n}\n\n/** Resolve effective proxy groups, injecting bundled defaults unless opted out. */\nfunction resolveGroups(options: GenerateOptions): ProxyGroupConfig[] {\n if (options.includeRules !== false && (!options.groups || options.groups.length === 0)) {\n return getDefaultProxyGroups();\n }\n return options.groups ?? [];\n}\n\n/**\n * Resolve effective rulesets.\n *\n * - `includeRules: false` always strips rules (`no_rules` / `--no-rules`).\n * - `includeRules: true`/`undefined` (default) falls back to bundled offline\n * defaults when no explicit rulesets are given (mirrors upstream\n * `config=ACL4SSR.ini`).\n * `enableRuleGenerator: false` or `nodeList: true` always strips rules,\n * mirroring upstream `enable_rule_generator` / bare-list semantics.\n */\nfunction resolveRulesets(\n options: GenerateOptions,\n settings: ExtraSettings,\n): RulesetContent[] | undefined {\n if (options.includeRules === false) {\n return undefined;\n }\n if (!settings.enableRuleGenerator || settings.nodeList) {\n return undefined;\n }\n if (options.rulesets && options.rulesets.length > 0) {\n return options.rulesets;\n }\n return getDefaultRulesets();\n}\n\nfunction attachClashRules(\n doc: Record<string, unknown>,\n settings: ExtraSettings,\n rulesets: RulesetContent[] | undefined,\n): void {\n if (!settings.enableRuleGenerator || settings.nodeList) {\n return;\n }\n if (!rulesets || rulesets.length === 0) {\n return;\n }\n const field = settings.clashNewFieldName ? \"rules\" : \"Rule\";\n const generated = rulesetToClashRules(rulesets, settings.clashClassicalRuleset);\n if (generated.length === 0) {\n return;\n }\n const existing = doc[field];\n if (settings.overwriteOriginalRules || !Array.isArray(existing)) {\n doc[field] = generated;\n } else {\n doc[field] = [...(existing as string[]), ...generated];\n }\n}\n"],"mappings":"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SAAS,KAAK,GAAG;AACpC,WAAO;AAAA,EACT;AACA,aAAW,SAAS,KAAK;AACzB,SAAO;AACT;;;AC7IA,SAAS,aAAa,qBAAqB;;;ACU3C,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA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","names":["ProxyGroupType","BalanceStrategy","ProxyType","RulesetType","TargetFormat","group","jms","generic","group","group","group","surge","group","regMatch","regReplace","group","group","group","parseRawSections","group","group","isIpv4","lines","group","group","group","singlegroup","triStr","group","group"]}
|