diff --git a/.github/update.log b/.github/update.log index 3e52114316..00ec6b198e 100644 --- a/.github/update.log +++ b/.github/update.log @@ -664,3 +664,4 @@ Update On Tue May 28 20:30:03 CEST 2024 Update On Wed May 29 20:30:48 CEST 2024 Update On Thu May 30 20:33:19 CEST 2024 Update On Fri May 31 20:31:11 CEST 2024 +Update On Fri Jun 7 01:07:11 CEST 2024 diff --git a/clash-meta/component/process/process_linux.go b/clash-meta/component/process/process_linux.go index f817449554..4667104cc2 100644 --- a/clash-meta/component/process/process_linux.go +++ b/clash-meta/component/process/process_linux.go @@ -2,19 +2,23 @@ package process import ( "bytes" + "context" "encoding/binary" "fmt" "net/netip" "os" - "path" "path/filepath" "runtime" "strings" + "sync" "syscall" "unicode" "unsafe" + "github.com/metacubex/mihomo/log" + "github.com/mdlayher/netlink" + tun "github.com/metacubex/sing-tun" "golang.org/x/sys/unix" ) @@ -59,6 +63,19 @@ type inetDiagResponse struct { INode uint32 } +type MyCallback struct{} + +var ( + packageManager tun.PackageManager + once sync.Once +) + +func (cb *MyCallback) OnPackagesUpdated(packageCount int, sharedCount int) {} + +func (cb *MyCallback) NewError(ctx context.Context, err error) { + log.Warnln("%s", err) +} + func findProcessName(network string, ip netip.Addr, srcPort int) (uint32, string, error) { uid, inode, err := resolveSocketByNetlink(network, ip, srcPort) if err != nil { @@ -162,12 +179,7 @@ func resolveProcessNameByProcSearch(inode, uid uint32) (string, error) { } if runtime.GOOS == "android" { if bytes.Equal(buffer[:n], socket) { - cmdline, err := os.ReadFile(path.Join(processPath, "cmdline")) - if err != nil { - return "", err - } - - return splitCmdline(cmdline), nil + return findPackageName(uid), nil } } else { if bytes.Equal(buffer[:n], socket) { @@ -181,17 +193,29 @@ func resolveProcessNameByProcSearch(inode, uid uint32) (string, error) { return "", fmt.Errorf("process of uid(%d),inode(%d) not found", uid, inode) } -func splitCmdline(cmdline []byte) string { - cmdline = bytes.Trim(cmdline, " ") - - idx := bytes.IndexFunc(cmdline, func(r rune) bool { - return unicode.IsControl(r) || unicode.IsSpace(r) || r == ':' +func findPackageName(uid uint32) string { + once.Do(func() { + callback := &MyCallback{} + var err error + packageManager, err = tun.NewPackageManager(callback) + if err != nil { + log.Warnln("%s", err) + } + err = packageManager.Start() + if err != nil { + log.Warnln("%s", err) + return + } }) - if idx == -1 { - return filepath.Base(string(cmdline)) + if sharedPackage, loaded := packageManager.SharedPackageByID(uid % 100000); loaded { + fmt.Println(loaded) + return sharedPackage } - return filepath.Base(string(cmdline[:idx])) + if packageName, loaded := packageManager.PackageByID(uid % 100000); loaded { + return packageName + } + return "" } func isPid(s string) bool { diff --git a/clash-meta/listener/sing_tun/server.go b/clash-meta/listener/sing_tun/server.go index 09bf308c73..a5edb77f63 100644 --- a/clash-meta/listener/sing_tun/server.go +++ b/clash-meta/listener/sing_tun/server.go @@ -24,6 +24,7 @@ import ( E "github.com/sagernet/sing/common/exceptions" F "github.com/sagernet/sing/common/format" "github.com/sagernet/sing/common/ranges" + "golang.org/x/exp/slices" ) var InterfaceName = "Meta" @@ -60,19 +61,21 @@ func CalculateInterfaceName(name string) (tunName string) { return } tunIndex := 0 - indexSet := make(map[int]struct{}) + indexArr := make([]int, 0, len(interfaces)) for _, netInterface := range interfaces { if strings.HasPrefix(netInterface.Name, tunName) { index, parseErr := strconv.ParseInt(netInterface.Name[len(tunName):], 10, 16) if parseErr == nil { - indexSet[int(index)] = struct{}{} + indexArr = append(indexArr, int(index)) } } } - for index := range indexSet { + slices.Sort(indexArr) + indexArr = slices.Compact(indexArr) + for _, index := range indexArr { if index == tunIndex { tunIndex += 1 - } else { // indexSet already sorted and distinct, so this tunIndex nobody used + } else { // indexArr already sorted and distinct, so this tunIndex nobody used break } } diff --git a/clash-meta/transport/tuic/congestion_v2/bbr_sender.go b/clash-meta/transport/tuic/congestion_v2/bbr_sender.go index ed29bd7e95..d8852fbc96 100644 --- a/clash-meta/transport/tuic/congestion_v2/bbr_sender.go +++ b/clash-meta/transport/tuic/congestion_v2/bbr_sender.go @@ -62,7 +62,7 @@ const ( // Flag. defaultStartupFullLossCount = 8 quicBbr2DefaultLossThreshold = 0.02 - maxBbrBurstPackets = 3 + maxBbrBurstPackets = 10 ) type bbrMode int @@ -334,6 +334,8 @@ func (b *bbrSender) OnPacketSent( } b.sampler.OnPacketSent(sentTime, packetNumber, bytes, bytesInFlight, isRetransmittable) + + b.maybeAppLimited(bytesInFlight) } // CanSend implements the SendAlgorithm interface. @@ -413,8 +415,6 @@ func (b *bbrSender) OnCongestionEventEx(priorInFlight congestion.ByteCount, even // packet in lost_packets. var lastPacketSendState sendTimeState - b.maybeApplimited(priorInFlight) - // Update bytesInFlight b.bytesInFlight = priorInFlight for _, p := range ackedPackets { @@ -541,7 +541,7 @@ func (b *bbrSender) setDrainGain(drainGain float64) { b.drainGain = drainGain } -// What's the current estimated bandwidth in bytes per second. +// Get the current bandwidth estimate. Note that Bandwidth is in bits per second. func (b *bbrSender) bandwidthEstimate() Bandwidth { return b.maxBandwidth.GetBest() } @@ -700,14 +700,13 @@ func (b *bbrSender) checkIfFullBandwidthReached(lastPacketSendState *sendTimeSta } } -func (b *bbrSender) maybeApplimited(bytesInFlight congestion.ByteCount) { +func (b *bbrSender) maybeAppLimited(bytesInFlight congestion.ByteCount) { congestionWindow := b.GetCongestionWindow() if bytesInFlight >= congestionWindow { return } availableBytes := congestionWindow - bytesInFlight - drainLimited := b.mode == bbrModeDrain && bytesInFlight > congestionWindow/2 - if !drainLimited || availableBytes > maxBbrBurstPackets*b.maxDatagramSize { + if availableBytes > maxBbrBurstPackets*b.maxDatagramSize { b.sampler.OnAppLimited() } } diff --git a/clash-nyanpasu/backend/Cargo.lock b/clash-nyanpasu/backend/Cargo.lock index 166c527f75..a049097a48 100644 --- a/clash-nyanpasu/backend/Cargo.lock +++ b/clash-nyanpasu/backend/Cargo.lock @@ -537,12 +537,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - [[package]] name = "bit_field" version = "0.10.2" @@ -892,7 +886,7 @@ dependencies = [ "log", "nanoid", "once_cell", - "open 5.1.3", + "open 5.1.4", "parking_lot", "percent-encoding", "port_scanner", @@ -932,7 +926,7 @@ dependencies = [ "windows-sys 0.52.0", "winreg 0.52.0", "wry", - "zip 2.1.1", + "zip 2.1.3", "zip-extensions", ] @@ -1032,12 +1026,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "constant_time_eq" version = "0.3.0" @@ -1129,9 +1117,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ebf8d6963185c7625d2c3c3962d99eb8936637b1427536d21dc36ae402ebad" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -3751,9 +3739,9 @@ dependencies = [ [[package]] name = "open" -version = "5.1.3" +version = "5.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb49fbd5616580e9974662cb96a3463da4476e649a7e4b258df0de065db0657" +checksum = "b5ca541f22b1c46d4bb9801014f234758ab4297e7870b904b6a8415b980a7388" dependencies = [ "is-wsl", "libc", @@ -3923,17 +3911,6 @@ dependencies = [ "windows-targets 0.52.5", ] -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "paste" version = "1.0.15" @@ -3956,18 +3933,6 @@ dependencies = [ "libc", ] -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", - "hmac", - "password-hash", - "sha2 0.10.8", -] - [[package]] name = "pbkdf2" version = "0.12.2" @@ -5761,9 +5726,9 @@ checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "tauri" -version = "1.6.7" +version = "1.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c7177b6be45bbb875aa239578f5adc982a1b3d5ea5b315ccd100aeb0043374" +checksum = "77567d2b3b74de4588d544147142d02297f3eaa171a25a065252141d8597a516" dependencies = [ "anyhow", "base64 0.21.7", @@ -7793,9 +7758,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -7817,30 +7782,21 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" dependencies = [ - "aes", "byteorder", - "bzip2", - "constant_time_eq 0.1.5", "crc32fast", "crossbeam-utils", - "flate2", - "hmac", - "pbkdf2 0.11.0", - "sha1", - "time", - "zstd 0.11.2+zstd.1.5.2", ] [[package]] name = "zip" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd56a4d5921bc2f99947ac5b3abe5f510b1be7376fdc5e9fce4a23c6a93e87c" +checksum = "775a2b471036342aa69bc5a602bc889cb0a06cda00477d0c69566757d5553d39" dependencies = [ "aes", "arbitrary", "bzip2", - "constant_time_eq 0.3.0", + "constant_time_eq", "crc32fast", "crossbeam-utils", "deflate64", @@ -7850,23 +7806,23 @@ dependencies = [ "indexmap 2.2.6", "lzma-rs", "memchr", - "pbkdf2 0.12.2", + "pbkdf2", "rand 0.8.5", "sha1", "thiserror", "time", "zeroize", "zopfli", - "zstd 0.13.1", + "zstd", ] [[package]] name = "zip-extensions" -version = "0.6.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecf62554c4ff96bce01a7ef123d160c3ffe9180638820f8b4d545c65b221b8c" +checksum = "eb0a99499b3497d765525c5d05e3ade9ca4a731c184365c19472c3fd6ba86341" dependencies = [ - "zip 0.6.6", + "zip 2.1.3", ] [[package]] @@ -7883,32 +7839,13 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe 5.0.2+zstd.1.5.2", -] - [[package]] name = "zstd" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" dependencies = [ - "zstd-safe 7.1.0", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", + "zstd-safe", ] [[package]] diff --git a/clash-nyanpasu/backend/tauri/Cargo.toml b/clash-nyanpasu/backend/tauri/Cargo.toml index c536e0a443..344f94e970 100644 --- a/clash-nyanpasu/backend/tauri/Cargo.toml +++ b/clash-nyanpasu/backend/tauri/Cargo.toml @@ -54,7 +54,7 @@ window-shadows = { version = "0.2.2" } wry = { version = "0.24.6" } semver = "1.0" zip = "2.0.0" -zip-extensions = "0.6.2" +zip-extensions = "0.8.0" gunzip = { version = "0.1.0", git = "https://github.com/TechHara/gunzip.git" } tempfile = "3.9.0" glob = "0.3.1" diff --git a/clash-nyanpasu/frontend/interface/ipc/index.ts b/clash-nyanpasu/frontend/interface/ipc/index.ts index 5a104146b9..fdd1b0b6b8 100644 --- a/clash-nyanpasu/frontend/interface/ipc/index.ts +++ b/clash-nyanpasu/frontend/interface/ipc/index.ts @@ -1,3 +1,4 @@ export * from "./useNyanpasu"; export * from "./useClash"; export * from "./useClashCore"; +export * from "./useClashWS"; diff --git a/clash-nyanpasu/frontend/interface/ipc/useClashCore.ts b/clash-nyanpasu/frontend/interface/ipc/useClashCore.ts index 6692963687..ed8f9bf2c4 100644 --- a/clash-nyanpasu/frontend/interface/ipc/useClashCore.ts +++ b/clash-nyanpasu/frontend/interface/ipc/useClashCore.ts @@ -1,9 +1,9 @@ -import { Clash, clash } from "@/service"; +import { Clash, clash as clashApi } from "@/service"; import * as tauri from "@/service/tauri"; import useSWR from "swr"; export const useClashCore = () => { - const { getGroupDelay, getProxiesDelay } = clash(); + const { getGroupDelay, getProxiesDelay, ...clash } = clashApi(); const { data, isLoading, mutate } = useSWR("getProxies", tauri.getProxies); @@ -45,12 +45,15 @@ export const useClashCore = () => { await mutate(); }; + const getRules = useSWR("getRules", clash.getRules); + return { data, isLoading, updateGroupDelay, updateProxiesDelay, setGroupProxy, + getRules, }; }; diff --git a/clash-nyanpasu/frontend/interface/ipc/useClashWS.ts b/clash-nyanpasu/frontend/interface/ipc/useClashWS.ts new file mode 100644 index 0000000000..fddfb59411 --- /dev/null +++ b/clash-nyanpasu/frontend/interface/ipc/useClashWS.ts @@ -0,0 +1,31 @@ +import { useWebSocket } from "ahooks"; +import { useClash } from "./useClash"; +import { useMemo } from "react"; + +export const useClashWS = () => { + const { getClashInfo } = useClash(); + + const getBaseUrl = () => { + return `ws://${getClashInfo.data?.server}`; + }; + + const getTokenUrl = () => { + return `token=${encodeURIComponent(getClashInfo.data?.secret || "")}`; + }; + + const resolveUrl = (path: string) => { + return `${getBaseUrl()}/${path}?${getTokenUrl()}`; + }; + + const connectionsUrl = useMemo(() => { + if (getClashInfo.data) { + return resolveUrl("connections"); + } + }, [getClashInfo.data]); + + const connections = useWebSocket(connectionsUrl ?? ""); + + return { + connections, + }; +}; diff --git a/clash-nyanpasu/frontend/interface/package.json b/clash-nyanpasu/frontend/interface/package.json index 484c4934d9..d51ee50a39 100644 --- a/clash-nyanpasu/frontend/interface/package.json +++ b/clash-nyanpasu/frontend/interface/package.json @@ -5,6 +5,7 @@ "module": "index.ts", "dependencies": { "@tauri-apps/api": "1.5.6", + "ahooks": "3.8.0", "ofetch": "1.3.4", "react": "18.3.1", "swr": "2.2.5" diff --git a/clash-nyanpasu/frontend/interface/service/types.ts b/clash-nyanpasu/frontend/interface/service/types.ts index f4077f44d8..c28fcb04fd 100644 --- a/clash-nyanpasu/frontend/interface/service/types.ts +++ b/clash-nyanpasu/frontend/interface/service/types.ts @@ -122,3 +122,46 @@ export interface Proxies { [key: string]: Clash.Proxy; }; } + +export namespace Connection { + export interface Item { + id: string; + metadata: Metadata; + upload: number; + download: number; + start: string; + chains: string[]; + rule: string; + rulePayload: string; + } + + export interface Metadata { + network: string; + type: string; + host: string; + sourceIP: string; + sourcePort: string; + destinationPort: string; + destinationIP?: string; + destinationIPASN?: string; + process?: string; + processPath?: string; + dnsMode?: string; + dscp?: number; + inboundIP?: string; + inboundName?: string; + inboundPort?: string; + inboundUser?: string; + remoteDestination?: string; + sniffHost?: string; + specialProxy?: string; + specialRules?: string; + } + + export interface Response { + downloadTotal: number; + uploadTotal: number; + memory?: number; + connections?: Item[]; + } +} diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index 8b1118606f..26779e8806 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -19,7 +19,7 @@ "@mui/icons-material": "5.15.19", "@mui/lab": "5.0.0-alpha.170", "@mui/material": "5.15.19", - "@mui/x-data-grid": "7.6.0", + "@mui/x-data-grid": "7.6.2", "@nyanpasu/interface": "workspace:^", "@nyanpasu/ui": "workspace:^", "@tauri-apps/api": "1.5.6", @@ -27,9 +27,9 @@ "allotment": "1.20.2", "axios": "1.7.2", "dayjs": "1.11.11", - "framer-motion": "11.2.9", + "framer-motion": "11.2.10", "i18next": "23.11.5", - "jotai": "2.8.2", + "jotai": "2.8.3", "monaco-editor": "0.49.0", "mui-color-input": "2.0.3", "react": "18.3.1", @@ -53,11 +53,11 @@ "@types/react": "18.3.3", "@types/react-dom": "18.3.0", "@types/react-transition-group": "4.4.10", - "@typescript-eslint/eslint-plugin": "7.11.0", - "@typescript-eslint/parser": "7.11.0", + "@typescript-eslint/eslint-plugin": "7.12.0", + "@typescript-eslint/parser": "7.12.0", "@vitejs/plugin-react": "4.3.0", "sass": "1.77.4", - "shiki": "1.6.1", + "shiki": "1.6.2", "vite": "5.2.12", "vite-plugin-monaco-editor": "1.1.3", "vite-plugin-sass-dts": "1.3.22", diff --git a/clash-nyanpasu/frontend/nyanpasu/src/assets/styles/layout.scss b/clash-nyanpasu/frontend/nyanpasu/src/assets/styles/layout.scss index 832103e950..bfc207f791 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/assets/styles/layout.scss +++ b/clash-nyanpasu/frontend/nyanpasu/src/assets/styles/layout.scss @@ -74,13 +74,9 @@ .the-bar { position: absolute; - top: 2px; - right: 8px; + top: 8px; + right: 28px; z-index: 2; - box-sizing: border-box; - display: flex; - align-items: center; - height: 36px; } .the-content { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/connections/close-connections-button.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/close-connections-button.tsx new file mode 100644 index 0000000000..2d76164c66 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/close-connections-button.tsx @@ -0,0 +1,26 @@ +import { Close } from "@mui/icons-material"; +import { Tooltip } from "@mui/material"; +import { useClash } from "@nyanpasu/interface"; +import { FloatingButton } from "@nyanpasu/ui"; +import { useLockFn } from "ahooks"; +import { useTranslation } from "react-i18next"; + +export const CloseConnectionsButton = () => { + const { t } = useTranslation(); + + const { deleteConnections } = useClash(); + + const onCloseAll = useLockFn(async () => { + await deleteConnections(); + }); + + return ( + + + + + + ); +}; + +export default CloseConnectionsButton; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-table.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-table.tsx new file mode 100644 index 0000000000..0d1a71b448 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-table.tsx @@ -0,0 +1,135 @@ +import parseTraffic from "@/utils/parse-traffic"; +import { GridColDef, DataGrid } from "@mui/x-data-grid"; +import { useClashWS, Connection } from "@nyanpasu/interface"; +import dayjs from "dayjs"; +import { useRef, useMemo, useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import HeaderSearch from "./header-search"; + +export type TableConnection = Connection.Item & + Connection.Metadata & { + downloadSpeed?: number; + uploadSpeed?: number; + }; + +export interface TableMessage extends Omit { + connections: TableConnection[]; +} + +export const ConnectionsTable = () => { + const { t } = useTranslation(); + + const { + connections: { readyState, latestMessage }, + } = useClashWS(); + + const historyMessage = useRef(undefined); + + const connectionsMessage = useMemo(() => { + if (!latestMessage?.data) return; + + const result = JSON.parse(latestMessage.data) as Connection.Response; + + const updatedConnections: TableConnection[] = []; + + result.connections?.forEach((connection) => { + const previousConnection = historyMessage.current?.connections.find( + (history) => history.id === connection.id, + ); + + const downloadSpeed = previousConnection + ? connection.download - previousConnection.download + : 0; + + const uploadSpeed = previousConnection + ? connection.upload - previousConnection.upload + : 0; + + updatedConnections.push({ + ...connection, + ...connection.metadata, + downloadSpeed, + uploadSpeed, + }); + }); + + const data = { ...result, connections: updatedConnections }; + + historyMessage.current = data; + + return data; + }, [latestMessage?.data]); + + const columns: GridColDef[] = [ + { field: "host", headerName: t("Host"), flex: 240, minWidth: 240 }, + { field: "process", headerName: t("Process"), flex: 100, minWidth: 100 }, + { + field: "download", + headerName: t("Download"), + width: 88, + valueFormatter: (value) => parseTraffic(value).join(" "), + }, + { + field: "upload", + headerName: t("Upload"), + width: 88, + valueFormatter: (value) => parseTraffic(value).join(" "), + }, + { + field: "downloadSpeed", + headerName: t("DL Speed"), + width: 88, + valueFormatter: (value) => parseTraffic(value).join(" ") + "/s", + }, + { + field: "uploadSpeed", + headerName: t("UL Speed"), + width: 88, + valueFormatter: (value) => parseTraffic(value).join(" ") + "/s", + }, + { + field: "chains", + headerName: t("Chains"), + flex: 360, + minWidth: 360, + valueFormatter: (value) => [...value].reverse().join(" / "), + }, + { field: "rule", headerName: "Rule", flex: 300, minWidth: 250 }, + { + field: "start", + headerName: t("Time"), + flex: 120, + minWidth: 100, + valueFormatter: (value) => dayjs(value).fromNow(), + }, + { field: "source", headerName: "Source", flex: 200, minWidth: 130 }, + { + field: "destinationIP", + headerName: t("Destination IP"), + flex: 200, + minWidth: 130, + }, + { field: "type", headerName: t("Type"), flex: 160, minWidth: 100 }, + ]; + + return ( + connectionsMessage?.connections && ( + + ) + ); +}; + +export default ConnectionsTable; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/connections/header-search.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/header-search.tsx new file mode 100644 index 0000000000..0c15105181 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/header-search.tsx @@ -0,0 +1,44 @@ +import { FilledInputProps, Portal, alpha, useTheme } from "@mui/material"; +import { GridToolbarQuickFilter } from "@mui/x-data-grid"; +import { Fragment } from "react"; +import { useTranslation } from "react-i18next"; + +export const HeaderSearch = () => { + const { t } = useTranslation(); + + const { palette } = useTheme(); + + const inputProps: Partial = { + sx: { + borderRadius: 7, + backgroundColor: alpha(palette.primary.main, 0.1), + + "&::before": { + display: "none", + }, + + "&::after": { + display: "none", + }, + }, + }; + + return ( + + document.getElementById("filter-panel")}> + + + + ); +}; + +export default HeaderSearch; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx index d9dbf419a8..8db8bed550 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx @@ -1,21 +1,38 @@ import { NotificationType, useNotification } from "@/hooks/use-notification"; import { save_window_size_state } from "@/services/cmds"; +import { classNames } from "@/utils"; import { CloseRounded, CropSquareRounded, FilterNoneRounded, HorizontalRuleRounded, } from "@mui/icons-material"; -import { Button } from "@mui/material"; +import { alpha, Button, ButtonProps, useTheme } from "@mui/material"; import { platform, type Platform } from "@tauri-apps/api/os"; import { appWindow } from "@tauri-apps/api/window"; import { debounce } from "lodash-es"; import { useEffect, useState } from "react"; -export const LayoutControl = () => { - const minWidth = 40; +const CtrlButton = (props: ButtonProps) => { + const { palette } = useTheme(); + + return ( + - + - - + + ); }; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/modules/side-chain.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/modules/side-chain.tsx index e678a687d8..bfaff718da 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/modules/side-chain.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/modules/side-chain.tsx @@ -121,7 +121,7 @@ export const SideChain = ({ global, profile, onChainEdit }: SideChainProps) => { - + ); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/rules/rule-item.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/rules/rule-item.tsx new file mode 100644 index 0000000000..b1cb157b88 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/rules/rule-item.tsx @@ -0,0 +1,65 @@ +import { useTheme } from "@mui/material"; +import { Clash } from "@nyanpasu/interface"; + +interface Props { + index: number; + value: Clash.Rule; +} + +const RuleItem = ({ index, value }: Props) => { + const { palette } = useTheme(); + + const COLOR = [ + palette.primary.main, + palette.secondary.main, + palette.info.main, + palette.warning.main, + palette.success.main, + ]; + + const parseColor = (text: string) => { + const TYPE = { + reject: ["REJECT", "REJECT-DROP"], + direct: ["DIRECT"], + }; + + if (TYPE.reject.includes(text)) return palette.error.main; + + if (TYPE.direct.includes(text)) return palette.text.primary; + + let sum = 0; + + for (let i = 0; i < text.length; i++) { + sum += text.charCodeAt(i); + } + + return COLOR[sum % COLOR.length]; + }; + + return ( +
+
+ {index + 1} +
+ +
+
+ {value.payload || "-"} +
+ +
+
{value.type}
+ +
+ {value.proxy} +
+
+
+
+ ); +}; + +export default RuleItem; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/_app.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/_app.tsx index f6f436ad67..b4e0855af6 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/_app.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/_app.tsx @@ -191,11 +191,7 @@ export default function App() {
- {OS === "windows" && ( -
- -
- )} + {OS === "windows" && }
diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.module.scss b/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.module.scss deleted file mode 100644 index d1e3e060fa..0000000000 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -.TopPanelPaper { - @media screen and (width <= 1000px) { - :global(.label) { - display: none; - } - - :global(.value) { - padding-left: 8px; - } - } -} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.module.scss.d.ts b/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.module.scss.d.ts deleted file mode 100644 index a1442180d3..0000000000 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.module.scss.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare const classNames: { - readonly TopPanelPaper: "TopPanelPaper"; - readonly label: "label"; - readonly value: "value"; -}; -export default classNames; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.tsx index abef1f0ef2..751b597b46 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.tsx @@ -1,275 +1,26 @@ -import { BaseEmpty, BasePage } from "@/components/base"; -import { - ConnectionDetail, - ConnectionDetailRef, -} from "@/components/connection/connection-detail"; -import { ConnectionItem } from "@/components/connection/connection-item"; -import { ConnectionTable } from "@/components/connection/connection-table"; -import { useClashInfo } from "@/hooks/use-clash"; -import { useWebsocket } from "@/hooks/use-websocket"; -import { closeAllConnections } from "@/services/api"; -import { classNames } from "@/utils"; -import parseTraffic from "@/utils/parse-traffic"; -import { - ArrowDownward, - ArrowUpward, - Link, - TableChartRounded, - TableRowsRounded, -} from "@mui/icons-material"; -import { - Box, - Button, - Grid, - IconButton, - MenuItem, - Paper, - Select, - TextField, - Typography, -} from "@mui/material"; -import { useLockFn } from "ahooks"; -import { useEffect, useMemo, useRef, useState } from "react"; +import CloseConnectionsButton from "@/components/connections/close-connections-button"; +import ConnectionsTable from "@/components/connections/connections-table"; +import { BasePage } from "@nyanpasu/ui"; import { useTranslation } from "react-i18next"; -import { Virtuoso } from "react-virtuoso"; -import styles from "./connections.module.scss"; -import { useAtom } from "jotai"; -import { atomConnectionSetting } from "@/store"; -const initConn = { uploadTotal: 0, downloadTotal: 0, connections: [] }; - -type OrderFunc = (list: IConnectionsItem[]) => IConnectionsItem[]; - -export default function ConnectionsPage() { - const { t, i18n } = useTranslation(); - const { clashInfo } = useClashInfo(); - - const [filterText, setFilterText] = useState(""); - const [curOrderOpt, setOrderOpt] = useState("Default"); - const [connData, setConnData] = useState(initConn); - - const [setting, setSetting] = useAtom(atomConnectionSetting); - - const isTableLayout = setting.layout === "table"; - - const orderOpts: Record = { - Default: (list) => list, - "Upload Speed": (list) => list.sort((a, b) => b.curUpload! - a.curUpload!), - "Download Speed": (list) => - list.sort((a, b) => b.curDownload! - a.curDownload!), - }; - - const uploadTotal = connData.uploadTotal; - - const downloadTotal = connData.downloadTotal; - - const filterConn = useMemo(() => { - const orderFunc = orderOpts[curOrderOpt]; - const connections = connData.connections.filter( - (conn) => - (conn.metadata.host || conn.metadata.destinationIP)?.includes( - filterText, - ) || - (conn.metadata.process || conn.metadata.processPath) - ?.toLowerCase() - .includes(filterText.toLowerCase()), - ); - - if (orderFunc) return orderFunc(connections); - return connections; - }, [connData, filterText, curOrderOpt]); - - const { connect, disconnect } = useWebsocket( - (event) => { - // meta v1.15.0 出现data.connections为null的情况 - const data = JSON.parse(event.data) as IConnections; - // 尽量与前一次connections的展示顺序保持一致 - setConnData((old) => { - const oldConn = old.connections; - const maxLen = data.connections?.length; - - const connections: typeof oldConn = []; - - const rest = data.connections?.filter((each) => { - const index = oldConn.findIndex((o) => o.id === each.id); - - if (index >= 0 && index < maxLen) { - const old = oldConn[index]; - each.curUpload = each.upload - old.upload; - each.curDownload = each.download - old.download; - - connections[index] = each; - return false; - } - return true; - }); - - for (let i = 0; i < maxLen; ++i) { - if (!connections[i] && rest.length > 0) { - connections[i] = rest.shift()!; - connections[i].curUpload = 0; - connections[i].curDownload = 0; - } - } - - return { ...data, connections }; - }); - }, - { errorCount: 3, retryInterval: 1000 }, - ); - - useEffect(() => { - if (!clashInfo) return; - - const { server = "", secret = "" } = clashInfo; - connect(`ws://${server}/connections?token=${encodeURIComponent(secret)}`); - - return () => { - disconnect(); - }; - }, [clashInfo]); - - const onCloseAll = useLockFn(closeAllConnections); - - const detailRef = useRef(null!); - - const connectionItems = [ - { - icon: , - label: t("Upload Total"), - value: parseTraffic(uploadTotal).join(" "), - }, - { - icon: , - label: t("Download Total"), - value: parseTraffic(downloadTotal).join(" "), - }, - { - icon: , - label: t("Active Connections"), - value: filterConn.length, - }, - ]; +export const Connections = () => { + const { t } = useTranslation(); return ( - - setSetting((o) => - o.layout === "list" - ? { ...o, layout: "table" } - : { ...o, layout: "list" }, - ) - } - > - {isTableLayout ? ( - - ) : ( - - )} - - - - +
+
+
} > - - - {connectionItems.map((item, index) => ( - - - {item.icon} - - {item.label} - + - {item.value} - - - ))} - - - - - - {!isTableLayout && ( - - )} - - setFilterText(e.target.value)} - sx={{ input: { py: 0.65, px: 1.25 } }} - /> - - - - {filterConn.length === 0 ? ( - - ) : isTableLayout ? ( - detailRef.current?.open(detail)} - /> - ) : ( - ( - detailRef.current?.open(item)} - /> - )} - /> - )} - - - - + ); -} +}; + +export default Connections; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/rules.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/rules.tsx index 462e99e9d7..7f83f6cd3c 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/rules.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/rules.tsx @@ -1,73 +1,68 @@ -import { BaseEmpty, BasePage } from "@/components/base"; -import RuleItem from "@/components/rule/rule-item"; -import { getRules } from "@/services/api"; -import { Box, Paper, TextField } from "@mui/material"; +import { BaseEmpty } from "@/components/base"; +import RuleItem from "@/components/rules/rule-item"; +import { alpha, FilledInputProps, TextField, useTheme } from "@mui/material"; +import { useClashCore } from "@nyanpasu/interface"; +import { BasePage } from "@nyanpasu/ui"; import { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; -import { Virtuoso } from "react-virtuoso"; -import useSWR from "swr"; +import { VList } from "virtua"; export default function RulesPage() { const { t } = useTranslation(); - const { data = [] } = useSWR("getRules", getRules); + + const { palette } = useTheme(); + + const { getRules } = useClashCore(); const [filterText, setFilterText] = useState(""); const rules = useMemo(() => { - return data.filter((each) => each.payload.includes(filterText)); - }, [data, filterText]); + return getRules.data?.rules.filter((each) => + each.payload.includes(filterText), + ); + }, [getRules.data, filterText]); + + const inputProps: Partial = { + sx: { + borderRadius: 7, + backgroundColor: alpha(palette.primary.main, 0.1), + backdropFilter: "blur(8px)", + + fieldset: { + border: "none", + }, + }, + }; return ( - - - setFilterText(e.target.value)} - sx={{ input: { py: 0.65, px: 1.25 } }} - InputProps={{ - sx: { - borderRadius: 4, - }, - }} - /> - - +
+ setFilterText(e.target.value)} + sx={{ input: { py: 1, px: 2 } }} + InputProps={inputProps} + /> +
- - {rules.length > 0 ? ( - ( - - )} - followOutput={"smooth"} - overscan={900} - /> + + {rules ? ( + <> +
+ + {rules.map((item, index) => { + return ; + })} + ) : ( )} - + ); } diff --git a/clash-nyanpasu/frontend/ui/materialYou/components/basePage/style.scss b/clash-nyanpasu/frontend/ui/materialYou/components/basePage/style.scss index d91a387552..b5d0e8fa1a 100644 --- a/clash-nyanpasu/frontend/ui/materialYou/components/basePage/style.scss +++ b/clash-nyanpasu/frontend/ui/materialYou/components/basePage/style.scss @@ -7,10 +7,11 @@ > header { box-sizing: border-box; display: flex; - flex: 0 0 64px; - align-items: center; + align-items: end; justify-content: space-between; width: 100%; + height: 72px; + padding-bottom: 12px; margin: 0 auto; } diff --git a/clash-nyanpasu/frontend/ui/package.json b/clash-nyanpasu/frontend/ui/package.json index b491a1b5e4..9e475c764b 100644 --- a/clash-nyanpasu/frontend/ui/package.json +++ b/clash-nyanpasu/frontend/ui/package.json @@ -10,7 +10,7 @@ "@mui/material": "5.15.19", "@types/react": "18.3.3", "ahooks": "3.8.0", - "framer-motion": "11.2.9", + "framer-motion": "11.2.10", "react": "18.3.1", "react-error-boundary": "4.0.13", "react-i18next": "14.1.2" diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index d5c7c7e344..e187877e73 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,8 +2,8 @@ "manifest_version": 1, "latest": { "mihomo": "v1.18.5", - "mihomo_alpha": "alpha-d3fea90", - "clash_rs": "v0.1.17", + "mihomo_alpha": "alpha-063836f", + "clash_rs": "v0.1.18", "clash_premium": "2023-09-05-gdcc8d87" }, "arch_template": { @@ -36,5 +36,5 @@ "darwin-x64": "clash-darwin-amd64-n{}.gz" } }, - "updated_at": "2024-05-30T22:20:05.828Z" + "updated_at": "2024-06-05T22:20:11.986Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index 64f5368649..6c24c935aa 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -74,7 +74,7 @@ "@tauri-apps/cli": "1.5.14", "@types/fs-extra": "11.0.4", "@types/lodash-es": "4.17.12", - "@types/node": "20.12.13", + "@types/node": "20.14.2", "autoprefixer": "10.4.19", "conventional-changelog-conventionalcommits": "8.0.0", "cross-env": "7.0.3", @@ -95,7 +95,7 @@ "postcss-html": "1.7.0", "postcss-import": "16.1.0", "postcss-scss": "4.0.9", - "prettier": "3.2.5", + "prettier": "3.3.1", "prettier-plugin-toml": "2.0.1", "react-devtools": "5.2.0", "stylelint": "16.6.1", @@ -104,12 +104,12 @@ "stylelint-config-standard": "36.0.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-order": "6.0.4", - "stylelint-scss": "6.3.0", - "tailwindcss": "3.4.3", - "tsx": "4.11.0", + "stylelint-scss": "6.3.1", + "tailwindcss": "3.4.4", + "tsx": "4.12.0", "typescript": "5.4.5" }, - "packageManager": "pnpm@9.1.4", + "packageManager": "pnpm@9.2.0", "engines": { "node": "22.2.0" }, diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index 7a821a65bb..cdd6573ccb 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -24,7 +24,7 @@ importers: devDependencies: '@commitlint/cli': specifier: 19.3.0 - version: 19.3.0(@types/node@20.12.13)(typescript@5.4.5) + version: 19.3.0(@types/node@20.14.2)(typescript@5.4.5) '@commitlint/config-conventional': specifier: 19.2.2 version: 19.2.2 @@ -38,8 +38,8 @@ importers: specifier: 4.17.12 version: 4.17.12 '@types/node': - specifier: 20.12.13 - version: 20.12.13 + specifier: 20.14.2 + version: 20.14.2 autoprefixer: specifier: 10.4.19 version: 10.4.19(postcss@8.4.38) @@ -75,7 +75,7 @@ importers: version: 16.6.2(eslint@8.57.0) eslint-plugin-prettier: specifier: 5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.1) eslint-plugin-promise: specifier: 6.2.0 version: 6.2.0(eslint@8.57.0) @@ -101,11 +101,11 @@ importers: specifier: 4.0.9 version: 4.0.9(postcss@8.4.38) prettier: - specifier: 3.2.5 - version: 3.2.5 + specifier: 3.3.1 + version: 3.3.1 prettier-plugin-toml: specifier: 2.0.1 - version: 2.0.1(prettier@3.2.5) + version: 2.0.1(prettier@3.3.1) react-devtools: specifier: 5.2.0 version: 5.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -128,14 +128,14 @@ importers: specifier: 6.0.4 version: 6.0.4(stylelint@16.6.1(typescript@5.4.5)) stylelint-scss: - specifier: 6.3.0 - version: 6.3.0(stylelint@16.6.1(typescript@5.4.5)) + specifier: 6.3.1 + version: 6.3.1(stylelint@16.6.1(typescript@5.4.5)) tailwindcss: - specifier: 3.4.3 - version: 3.4.3 + specifier: 3.4.4 + version: 3.4.4 tsx: - specifier: 4.11.0 - version: 4.11.0 + specifier: 4.12.0 + version: 4.12.0 typescript: specifier: 5.4.5 version: 5.4.5 @@ -145,6 +145,9 @@ importers: '@tauri-apps/api': specifier: 1.5.6 version: 1.5.6 + ahooks: + specifier: 3.8.0 + version: 3.8.0(react@19.0.0-rc-9d4fba0788-20240530) ofetch: specifier: 1.3.4 version: 1.3.4 @@ -175,7 +178,7 @@ importers: version: 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@generouted/react-router': specifier: 1.19.5 - version: 1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + version: 1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) '@juggle/resize-observer': specifier: 3.4.0 version: 3.4.0 @@ -184,7 +187,7 @@ importers: version: 0.2.7 '@mui/icons-material': specifier: 5.15.19 - version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/lab': specifier: 5.0.0-alpha.170 version: 5.0.0-alpha.170(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) @@ -192,8 +195,8 @@ importers: specifier: 5.15.19 version: 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/x-data-grid': - specifier: 7.6.0 - version: 7.6.0(@babel/core@7.24.5)(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(bufferutil@4.0.8)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)(utf-8-validate@5.0.10) + specifier: 7.6.2 + version: 7.6.2(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@nyanpasu/interface': specifier: workspace:^ version: link:../interface @@ -216,14 +219,14 @@ importers: specifier: 1.11.11 version: 1.11.11 framer-motion: - specifier: 11.2.9 - version: 11.2.9(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) + specifier: 11.2.10 + version: 11.2.10(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) i18next: specifier: 23.11.5 version: 23.11.5 jotai: - specifier: 2.8.2 - version: 2.8.2(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + specifier: 2.8.3 + version: 2.8.3(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) monaco-editor: specifier: 0.49.0 version: 0.49.0 @@ -289,35 +292,35 @@ importers: specifier: 4.4.10 version: 4.4.10 '@typescript-eslint/eslint-plugin': - specifier: 7.11.0 - version: 7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + specifier: 7.12.0 + version: 7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': - specifier: 7.11.0 - version: 7.11.0(eslint@8.57.0)(typescript@5.4.5) + specifier: 7.12.0 + version: 7.12.0(eslint@8.57.0)(typescript@5.4.5) '@vitejs/plugin-react': specifier: 4.3.0 - version: 4.3.0(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + version: 4.3.0(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) sass: specifier: 1.77.4 version: 1.77.4 shiki: - specifier: 1.6.1 - version: 1.6.1 + specifier: 1.6.2 + version: 1.6.2 vite: specifier: 5.2.12 - version: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + version: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) vite-plugin-monaco-editor: specifier: npm:vite-plugin-monaco-editor-new@1.1.3 version: vite-plugin-monaco-editor-new@1.1.3(monaco-editor@0.49.0) vite-plugin-sass-dts: specifier: 1.3.22 - version: 1.3.22(postcss@8.4.38)(prettier@3.2.5)(sass@1.77.4)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + version: 1.3.22(postcss@8.4.38)(prettier@3.3.1)(sass@1.77.4)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) vite-plugin-svgr: specifier: 4.2.0 - version: 4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + version: 4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) vite-tsconfig-paths: specifier: 4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + version: 4.3.2(typescript@5.4.5)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) frontend/ui: dependencies: @@ -326,7 +329,7 @@ importers: version: 0.2.7 '@mui/icons-material': specifier: 5.15.19 - version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/lab': specifier: 5.0.0-alpha.170 version: 5.0.0-alpha.170(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) @@ -340,8 +343,8 @@ importers: specifier: 3.8.0 version: 3.8.0(react@19.0.0-rc-9d4fba0788-20240530) framer-motion: - specifier: 11.2.9 - version: 11.2.9(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) + specifier: 11.2.10 + version: 11.2.10(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) react: specifier: npm:react@rc version: 19.0.0-rc-9d4fba0788-20240530 @@ -375,8 +378,8 @@ importers: specifier: 0.5.5 version: 0.5.5 adm-zip: - specifier: 0.5.12 - version: 0.5.12 + specifier: 0.5.14 + version: 0.5.14 colorize-template: specifier: 1.0.0 version: 1.0.0 @@ -396,8 +399,8 @@ importers: specifier: 1.0.1 version: 1.0.1 telegram: - specifier: 2.21.2 - version: 2.21.2 + specifier: 2.22.2 + version: 2.22.2 packages: @@ -422,10 +425,6 @@ packages: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.24.6': - resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.4': resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} @@ -438,126 +437,56 @@ packages: resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.24.6': - resolution: {integrity: sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.24.6': - resolution: {integrity: sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-environment-visitor@7.22.20': resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - '@babel/helper-environment-visitor@7.24.6': - resolution: {integrity: sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==} - engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.24.6': - resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} - engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.24.6': - resolution: {integrity: sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.6': - resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.24.5': resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.24.6': - resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.24.6': - resolution: {integrity: sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==} - engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.5': resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.6': - resolution: {integrity: sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-replace-supers@7.24.6': - resolution: {integrity: sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.24.5': resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.24.6': - resolution: {integrity: sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-skip-transparent-expression-wrappers@7.24.6': - resolution: {integrity: sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==} - engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.5': resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.6': - resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.6': - resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.6': - resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.6': - resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.5': resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} engines: {node: '>=6.9.0'} @@ -566,38 +495,11 @@ packages: resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.6': - resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} - engines: {node: '>=6.9.0'} - '@babel/parser@7.24.5': resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.24.6': - resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-syntax-jsx@7.24.6': - resolution: {integrity: sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.24.6': - resolution: {integrity: sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.24.6': - resolution: {integrity: sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.24.5': resolution: {integrity: sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==} engines: {node: '>=6.9.0'} @@ -610,24 +512,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.24.6': - resolution: {integrity: sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-typescript@7.24.6': - resolution: {integrity: sha512-U10aHPDnokCFRXgyT/MaIRTivUu2K/mu0vJlwRS9LxJmJet+PFQNKpggPyFCUtC6zWSBPjvxjnpNkAn3Uw2m5w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/register@7.24.6': - resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/runtime@7.24.5': resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} @@ -640,10 +524,6 @@ packages: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.6': - resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.5': resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} engines: {node: '>=6.9.0'} @@ -652,10 +532,6 @@ packages: resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.6': - resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} - engines: {node: '>=6.9.0'} - '@commitlint/cli@19.3.0': resolution: {integrity: sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==} engines: {node: '>=v18'} @@ -1197,13 +1073,6 @@ packages: '@material/material-color-utilities@0.2.7': resolution: {integrity: sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==} - '@mnajdova/enzyme-adapter-react-18@0.2.0': - resolution: {integrity: sha512-BOnjlVa7FHI1YUnYe+FdUtQu6szI1wLJ+C1lHyqmF3T9gu/J/WCYqqcD44dPkrU+8eYvvk/gQducsqna4HFiAg==} - peerDependencies: - enzyme: ^3.0.0 - react: npm:react@rc - react-dom: npm:react-dom@rc - '@mui/base@5.0.0-beta.40': resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} engines: {node: '>=12.0.0'} @@ -1229,12 +1098,6 @@ packages: '@types/react': optional: true - '@mui/internal-test-utils@1.0.0-dev.20240529-082515-213b5e33ab': - resolution: {integrity: sha512-4TEDRwZvsTDRpyBLSubiMh1W+UgK4YZ8kRDEp7zWeEKEugr1lOji/fE8yeaWKtJVMKwEW8cTH0QtSlRn3oDzaw==} - peerDependencies: - react: npm:react@rc - react-dom: npm:react-dom@rc - '@mui/lab@5.0.0-alpha.170': resolution: {integrity: sha512-0bDVECGmrNjd3+bLdcLiwYZ0O4HP5j5WSQm5DV6iA/Z9kr8O6AnvZ1bv9ImQbbX7Gj3pX4o43EKwCutj3EQxQg==} engines: {node: '>=12.0.0'} @@ -1327,8 +1190,8 @@ packages: '@types/react': optional: true - '@mui/x-data-grid@7.6.0': - resolution: {integrity: sha512-sMtnORdTRkLy+oQ3vkWaQ5c7yUdd6ovdgy3UGsn+QNqbA2hgLafFweH53nKMtNS+aULrJ1p5kCwK+DhqIYVrsA==} + '@mui/x-data-grid@7.6.2': + resolution: {integrity: sha512-f3t6TU8+f0VgmL4aJ9N/Wm5IeWfICfVb45S469wzzldUhbb/beIO/T3uMyGP13WFhx5f8N5wRRHSYZRHpfzhZw==} engines: {node: '>=14.0.0'} peerDependencies: '@mui/material': ^5.15.14 @@ -1499,31 +1362,13 @@ packages: cpu: [x64] os: [win32] - '@shikijs/core@1.6.1': - resolution: {integrity: sha512-CqYyepN4SnBopaoXYwng4NO8riB5ask/LTCkhOFq+GNGtr2X+aKeD767eYdqYukeixEUvv4bXdyTYVaogj7KBw==} + '@shikijs/core@1.6.2': + resolution: {integrity: sha512-guW5JeDzZ7uwOjTfCOFZ2VtVXk5tmkMzBYbKGfXsmAH1qYOej49L5jQDcGmwd6/OgvpmWhzO2GNJkQIFnbwLPQ==} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@sinonjs/commons@2.0.0': - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} - - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - - '@sinonjs/fake-timers@11.2.2': - resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} - - '@sinonjs/samsam@8.0.0': - resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} - - '@sinonjs/text-encoding@0.7.2': - resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} - '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -1671,27 +1516,9 @@ packages: engines: {node: '>= 10'} hasBin: true - '@testing-library/dom@10.1.0': - resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} - engines: {node: '>=18'} - - '@testing-library/react@15.0.7': - resolution: {integrity: sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==} - engines: {node: '>=18'} - peerDependencies: - '@types/react': npm:types-react@rc - react: npm:react@rc - react-dom: npm:react-dom@rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/adm-zip@0.5.5': resolution: {integrity: sha512-YCGstVMjc4LTY5uK9/obvxBya93axZOVOyf2GSUulADzmLhYE45u2nAssCs/fWBs1Ifq5Vat75JTPwd5XZoPJw==} - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1761,8 +1588,8 @@ packages: '@types/node@20.12.10': resolution: {integrity: sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==} - '@types/node@20.12.13': - resolution: {integrity: sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==} + '@types/node@20.14.2': + resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1791,8 +1618,8 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@7.11.0': - resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==} + '@typescript-eslint/eslint-plugin@7.12.0': + resolution: {integrity: sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1802,8 +1629,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.11.0': - resolution: {integrity: sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==} + '@typescript-eslint/parser@7.12.0': + resolution: {integrity: sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1812,12 +1639,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.11.0': - resolution: {integrity: sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==} + '@typescript-eslint/scope-manager@7.12.0': + resolution: {integrity: sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.11.0': - resolution: {integrity: sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==} + '@typescript-eslint/type-utils@7.12.0': + resolution: {integrity: sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1826,12 +1653,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.11.0': - resolution: {integrity: sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==} + '@typescript-eslint/types@7.12.0': + resolution: {integrity: sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.11.0': - resolution: {integrity: sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==} + '@typescript-eslint/typescript-estree@7.12.0': + resolution: {integrity: sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1839,14 +1666,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.11.0': - resolution: {integrity: sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==} + '@typescript-eslint/utils@7.12.0': + resolution: {integrity: sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.11.0': - resolution: {integrity: sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==} + '@typescript-eslint/visitor-keys@7.12.0': + resolution: {integrity: sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': @@ -1872,9 +1699,9 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - adm-zip@0.5.12: - resolution: {integrity: sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==} - engines: {node: '>=6.0'} + adm-zip@0.5.14: + resolution: {integrity: sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==} + engines: {node: '>=12.0'} agent-base@7.1.1: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} @@ -1886,12 +1713,6 @@ packages: peerDependencies: react: npm:react@rc - airbnb-prop-types@2.16.0: - resolution: {integrity: sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==} - deprecated: This package has been renamed to 'prop-types-tools' - peerDependencies: - react: npm:react@rc - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1907,10 +1728,6 @@ packages: ansi-align@2.0.0: resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - ansi-escapes@6.2.1: resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} engines: {node: '>=14.16'} @@ -1935,10 +1752,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -1956,9 +1769,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -1974,14 +1784,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.filter@1.0.4: - resolution: {integrity: sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ==} - engines: {node: '>= 0.4'} - - array.prototype.find@2.2.3: - resolution: {integrity: sha512-fO/ORdOELvjbbeIfZfzrXFMhYHGofRGqd+am9zm3tZ4GlJINj/pA2eITyfd65Vg6+ZbHd/Cys7stpoRSWtQFdA==} - engines: {node: '>= 0.4'} - array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} @@ -2008,9 +1810,6 @@ packages: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -2062,9 +1861,6 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} @@ -2086,9 +1882,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -2097,9 +1890,6 @@ packages: buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -2152,16 +1942,6 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai-dom@1.12.0: - resolution: {integrity: sha512-pLP8h6IBR8z1AdeQ+EMcJ7dXPdsax/1Q7gdGZjsnAmSBl3/gItQUYSCo32br1qOy4SlcBjvqId7ilAf3uJ2K1w==} - engines: {node: '>= 0.12.0'} - peerDependencies: - chai: '>= 3' - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2186,20 +1966,6 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - - cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -2225,17 +1991,10 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} @@ -2276,16 +2035,10 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} @@ -2380,26 +2133,15 @@ packages: resolution: {integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==} engines: {node: '>=12 || >=16'} - css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - css-tree@2.3.1: resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -2415,10 +2157,6 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -2459,13 +2197,6 @@ packages: supports-color: optional: true - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} @@ -2481,10 +2212,6 @@ packages: babel-plugin-macros: optional: true - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -2527,21 +2254,10 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - discontinuous-range@1.0.0: - resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} - dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -2553,12 +2269,6 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - - dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} @@ -2637,17 +2347,6 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - enzyme-adapter-utils@1.14.2: - resolution: {integrity: sha512-1ZC++RlsYRaiOWE5NRaF5OgsMt7F5rn/VuaJIgc7eW/fmgg8eS1/Ut7EugSPPi7VMdWMLcymRnMF+mJUJ4B8KA==} - peerDependencies: - react: npm:react@rc - - enzyme-shallow-equal@1.0.7: - resolution: {integrity: sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==} - - enzyme@3.11.0: - resolution: {integrity: sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==} - errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -2659,9 +2358,6 @@ packages: resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} - es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -2947,17 +2643,9 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} - find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2974,10 +2662,6 @@ packages: resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} engines: {node: '>=18'} - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -3001,9 +2685,6 @@ packages: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} - format-util@1.0.5: - resolution: {integrity: sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==} - formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -3011,8 +2692,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@11.2.9: - resolution: {integrity: sha512-gfxNSkp4dC3vpy2hGNQK3K9bNOKwfasqOhrqvmZzYxCPSJ9Tpv/9JlCkeCMgFdKefgPr8+JiouGjVmaDzu750w==} + framer-motion@11.2.10: + resolution: {integrity: sha512-/gr3PLZUVFCc86a9MqCUboVrALscrdluzTb3yew+2/qKBU8CX6nzs918/SRBRCqaPbx0TZP10CB6yFgK2C5cYQ==} peerDependencies: '@emotion/is-prop-valid': '*' react: npm:react@rc @@ -3036,11 +2717,6 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3073,9 +2749,6 @@ packages: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -3124,11 +2797,6 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} @@ -3214,10 +2882,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -3228,20 +2892,9 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - html-element-map@1.3.1: - resolution: {integrity: sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==} - - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} - html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} @@ -3264,10 +2917,6 @@ packages: http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} @@ -3487,25 +3136,14 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-redirect@1.0.0: resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} engines: {node: '>=0.10.0'} @@ -3538,9 +3176,6 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} - is-subset@0.1.1: - resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} - is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} @@ -3556,10 +3191,6 @@ packages: is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -3580,10 +3211,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} @@ -3595,8 +3222,8 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true - jotai@2.8.2: - resolution: {integrity: sha512-AU+EU82YqP94izfbGYQQL3oa/06gmn+Ijf/CKx0QybAURtbqh2e4N6zA2fxeIh0JEUgASF6z5IhagJ8NicR95A==} + jotai@2.8.3: + resolution: {integrity: sha512-pR4plVvdbzB6zyt7VLLHPMAkcRSKhRIvZKd+qkifQLa3CEziEo1uwZjePj4acTmQrboiISBlYSdCz3gWcr1Nkg==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': npm:types-react@rc @@ -3623,15 +3250,6 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsdom@24.1.0: - resolution: {integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true - jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -3682,9 +3300,6 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - just-extend@6.2.0: - resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -3692,9 +3307,6 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - known-css-properties@0.30.0: - resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} - known-css-properties@0.31.0: resolution: {integrity: sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==} @@ -3731,10 +3343,6 @@ packages: resolution: {integrity: sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==} engines: {node: '>=18.0.0'} - locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -3755,15 +3363,6 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.escape@4.0.1: - resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==} - - lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} @@ -3797,10 +3396,6 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - log-update@6.0.0: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} @@ -3812,9 +3407,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -3836,10 +3428,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - make-dir@1.3.0: resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} engines: {node: '>=4'} @@ -4009,10 +3597,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} - minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -4024,17 +3608,9 @@ packages: resolution: {integrity: sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==} engines: {node: '>=16 || 14 >=14.17'} - mocha@10.4.0: - resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} - engines: {node: '>= 14.0.0'} - hasBin: true - monaco-editor@0.49.0: resolution: {integrity: sha512-2I8/T3X/hLxB2oPHgqcNYUVdA/ZEFShT7IAujifIPMfKkNbLOqY8XCoyHCXrsdjb36dW9MwoTwBCFpXKMwNwaQ==} - moo@0.5.2: - resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} - ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -4068,10 +3644,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - nearley@2.20.1: - resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} - hasBin: true - needle@3.3.1: resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} engines: {node: '>= 4.4.x'} @@ -4080,9 +3652,6 @@ packages: next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - nise@5.1.9: - resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} - no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -4137,12 +3706,6 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - nwsapi@2.2.10: - resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -4154,10 +3717,6 @@ packages: object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -4212,10 +3771,6 @@ packages: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -4224,10 +3779,6 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -4236,10 +3787,6 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - package-json@4.0.1: resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} engines: {node: '>=4'} @@ -4262,19 +3809,9 @@ packages: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} - parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} - - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -4309,22 +3846,13 @@ packages: resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} - path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -4353,20 +3881,6 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} - - playwright-core@1.44.1: - resolution: {integrity: sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==} - engines: {node: '>=16'} - hasBin: true - - playwright@1.44.1: - resolution: {integrity: sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==} - engines: {node: '>=16'} - hasBin: true - possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -4503,23 +4017,15 @@ packages: peerDependencies: prettier: ^3.0.3 - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + prettier@3.3.1: + resolution: {integrity: sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==} engines: {node: '>=14'} hasBin: true - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - prop-types-exact@1.2.4: - resolution: {integrity: sha512-vKfETKgBHRCLQwZgpl0pGPvMFxCX/06dAkz5jwNYHfrU0I8bgVhryaHA6O/KlqwtQi0IdnjAhDiZqzD+uJuVjA==} - engines: {node: '>= 0.8'} - prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -4535,9 +4041,6 @@ packages: pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -4545,9 +4048,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4555,19 +4055,6 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - raf@3.4.1: - resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} - - railroad-diagrams@1.0.0: - resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} - - randexp@0.4.6: - resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} - engines: {node: '>=0.12'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -4635,9 +4122,6 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -4647,12 +4131,6 @@ packages: '@types/react': npm:types-react@rc react: npm:react@rc - react-reconciler@0.29.2: - resolution: {integrity: sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: npm:react@rc - react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -4670,16 +4148,6 @@ packages: peerDependencies: react: npm:react@rc - react-shallow-renderer@16.15.0: - resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} - peerDependencies: - react: npm:react@rc - - react-test-renderer@18.3.1: - resolution: {integrity: sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA==} - peerDependencies: - react: npm:react@rc - react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: @@ -4715,9 +4183,6 @@ packages: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} - reflect.ownkeys@1.1.4: - resolution: {integrity: sha512-iUNmtLgzudssL+qnTUosCmnq3eczlrVd1wXrgx/GhiI/8FvwrTYWtCJ9PNvWIRX+4ftupj2WUfB5mu5s9t6LnA==} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -4746,9 +4211,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - reselect@4.1.8: resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} @@ -4787,10 +4249,6 @@ packages: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -4812,15 +4270,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - - rrweb-cssom@0.7.0: - resolution: {integrity: sha512-KlSv0pm9kgQSRxXEMgtivPJ4h826YHsuob8pSHcfSZsSXGtvpEAie8S0AnXuObEJ7nhikOb4ahwxDm0H2yW17g==} - - rst-selector-parser@2.2.3: - resolution: {integrity: sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -4846,13 +4295,6 @@ packages: sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.25.0-rc-9d4fba0788-20240530: resolution: {integrity: sha512-FgnludCfIyBWBUApENx+tMalmqphFZ8MDj74iS7vlj2oaL75R4Ws+XdfSIQ5RFXFTD/zfyXVh5wtKHrs6iBkcQ==} @@ -4884,9 +4326,6 @@ packages: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -4895,10 +4334,6 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -4918,8 +4353,8 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - shiki@1.6.1: - resolution: {integrity: sha512-1Pu/A1rtsG6HZvQm4W0NExQ45e02og+rPog7PDaFDiMumZgOYnZIu4JtGQeAIfMwdbKSjJQoCUr79vDLKUUxWA==} + shiki@1.6.2: + resolution: {integrity: sha512-X3hSm5GzzBd/BmPmGfkueOUADLyBoZo1ojYQXhd+NU2VJn458yt4duaS0rVzC+WtqftSV7mTVvDw+OB9AHi3Eg==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -4932,9 +4367,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sinon@16.1.3: - resolution: {integrity: sha512-mjnWWeyxcAf9nC0bXcPmiDut+oE8HYridTNzBbF98AYVLmWwGRp2ISEpyhYflG1ifILT+eNn3BmKUJPxjXUPlA==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -4969,9 +4401,6 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -5105,8 +4534,8 @@ packages: peerDependencies: stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 - stylelint-scss@6.3.0: - resolution: {integrity: sha512-8OSpiuf1xC7f8kllJsBOFAOYp/mR/C1FXMVeOFjtJPw+AFvEmC93FaklHt7MlOqU4poxuQ1TkYMyfI0V+1SxjA==} + stylelint-scss@6.3.1: + resolution: {integrity: sha512-w/czBoWUZxJNk5fBRPODcXSN4qcPv3WHjTSSpFovVY+TE3MZTMR0yRlbmaDYrm8tTWHvpwQAuEBZ0lk2wwkboQ==} engines: {node: '>=18.12.0'} peerDependencies: stylelint: ^16.0.2 @@ -5140,10 +4569,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - supports-hyperlinks@3.0.0: resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} engines: {node: '>=14.18'} @@ -5163,9 +4588,6 @@ packages: peerDependencies: react: npm:react@rc - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.8.8: resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5174,13 +4596,13 @@ packages: resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} engines: {node: '>=10.0.0'} - tailwindcss@3.4.3: - resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} + tailwindcss@3.4.4: + resolution: {integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==} engines: {node: '>=14.0.0'} hasBin: true - telegram@2.21.2: - resolution: {integrity: sha512-fvLY49uXsL+TyDdGv7K1JOMMdd0AUkBx+kb5NRC3UYB30Y0h4IQPmTyAAQI6i6/6x6Of6ZK0nXezlSXC9es+EA==} + telegram@2.22.2: + resolution: {integrity: sha512-9payizc801Aqqu4eTGPc0huxKnIwFe0hn18mrpbgAKKiMLurX/UIQW/fjPhI5ONzockDFsaXDFqTreXBoG1u3A==} term-size@1.2.0: resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} @@ -5215,14 +4637,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -5262,8 +4676,8 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsx@4.11.0: - resolution: {integrity: sha512-vzGGELOgAupsNVssAmZjbUDfdm/pWP4R+Kg8TVdsonxbXk0bEpE1qh0yV6/QxUVXaVlNemgcPajGdJJ82n3stg==} + tsx@4.12.0: + resolution: {integrity: sha512-642NAWAbDqPZINjmL32Lh/B+pd8vbVj6LHPsWm09IIHqQuWhCrNfcPTjRlHFWvv3FfM4vt9NLReBIjUNj5ZhDg==} engines: {node: '>=18.0.0'} hasBin: true @@ -5275,10 +4689,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -5374,10 +4784,6 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -5403,9 +4809,6 @@ packages: resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} engines: {node: '>=0.10.0'} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - use-resize-observer@9.1.0: resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} peerDependencies: @@ -5509,34 +4912,14 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - websocket@1.0.35: resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} engines: {node: '>=4.0.0'} - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} - which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -5569,9 +4952,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -5609,29 +4989,10 @@ packages: utf-8-validate: optional: true - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - xdg-basedir@3.0.0: resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} engines: {node: '>=4'} - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -5655,22 +5016,10 @@ packages: engines: {node: '>= 14'} hasBin: true - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -5717,11 +5066,6 @@ snapshots: '@babel/highlight': 7.24.5 picocolors: 1.0.1 - '@babel/code-frame@7.24.6': - dependencies: - '@babel/highlight': 7.24.6 - picocolors: 1.0.1 - '@babel/compat-data@7.24.4': {} '@babel/core@7.24.5': @@ -5737,7 +5081,7 @@ snapshots: '@babel/traverse': 7.24.5 '@babel/types': 7.24.5 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5751,10 +5095,6 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/helper-annotate-as-pure@7.24.6': - dependencies: - '@babel/types': 7.24.6 - '@babel/helper-compilation-targets@7.23.6': dependencies: '@babel/compat-data': 7.24.4 @@ -5763,49 +5103,21 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.6(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.24.6 - '@babel/helper-environment-visitor': 7.24.6 - '@babel/helper-function-name': 7.24.6 - '@babel/helper-member-expression-to-functions': 7.24.6 - '@babel/helper-optimise-call-expression': 7.24.6 - '@babel/helper-replace-supers': 7.24.6(@babel/core@7.24.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 - '@babel/helper-split-export-declaration': 7.24.6 - semver: 6.3.1 - '@babel/helper-environment-visitor@7.22.20': {} - '@babel/helper-environment-visitor@7.24.6': {} - '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.24.0 '@babel/types': 7.24.5 - '@babel/helper-function-name@7.24.6': - dependencies: - '@babel/template': 7.24.6 - '@babel/types': 7.24.6 - '@babel/helper-hoist-variables@7.22.5': dependencies: '@babel/types': 7.24.5 - '@babel/helper-member-expression-to-functions@7.24.6': - dependencies: - '@babel/types': 7.24.6 - '@babel/helper-module-imports@7.24.3': dependencies: '@babel/types': 7.24.5 - '@babel/helper-module-imports@7.24.6': - dependencies: - '@babel/types': 7.24.6 - '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -5815,62 +5127,22 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.5 '@babel/helper-validator-identifier': 7.24.5 - '@babel/helper-module-transforms@7.24.6(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.24.6 - '@babel/helper-module-imports': 7.24.6 - '@babel/helper-simple-access': 7.24.6 - '@babel/helper-split-export-declaration': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 - - '@babel/helper-optimise-call-expression@7.24.6': - dependencies: - '@babel/types': 7.24.6 - '@babel/helper-plugin-utils@7.24.5': {} - '@babel/helper-plugin-utils@7.24.6': {} - - '@babel/helper-replace-supers@7.24.6(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.24.6 - '@babel/helper-member-expression-to-functions': 7.24.6 - '@babel/helper-optimise-call-expression': 7.24.6 - '@babel/helper-simple-access@7.24.5': dependencies: '@babel/types': 7.24.5 - '@babel/helper-simple-access@7.24.6': - dependencies: - '@babel/types': 7.24.6 - - '@babel/helper-skip-transparent-expression-wrappers@7.24.6': - dependencies: - '@babel/types': 7.24.6 - '@babel/helper-split-export-declaration@7.24.5': dependencies: '@babel/types': 7.24.5 - '@babel/helper-split-export-declaration@7.24.6': - dependencies: - '@babel/types': 7.24.6 - '@babel/helper-string-parser@7.24.1': {} - '@babel/helper-string-parser@7.24.6': {} - '@babel/helper-validator-identifier@7.24.5': {} - '@babel/helper-validator-identifier@7.24.6': {} - '@babel/helper-validator-option@7.23.5': {} - '@babel/helper-validator-option@7.24.6': {} - '@babel/helpers@7.24.5': dependencies: '@babel/template': 7.24.0 @@ -5886,38 +5158,10 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/highlight@7.24.6': - dependencies: - '@babel/helper-validator-identifier': 7.24.6 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - '@babel/parser@7.24.5': dependencies: '@babel/types': 7.24.5 - '@babel/parser@7.24.6': - dependencies: - '@babel/types': 7.24.6 - - '@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.6 - - '@babel/plugin-syntax-typescript@7.24.6(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.6 - - '@babel/plugin-transform-modules-commonjs@7.24.6(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.6 - '@babel/helper-simple-access': 7.24.6 - '@babel/plugin-transform-react-jsx-self@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -5928,32 +5172,6 @@ snapshots: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-typescript@7.24.6(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.24.6 - '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.5) - - '@babel/preset-typescript@7.24.6(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.6 - '@babel/helper-validator-option': 7.24.6 - '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.5) - '@babel/plugin-transform-typescript': 7.24.6(@babel/core@7.24.5) - - '@babel/register@7.24.6(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.6 - source-map-support: 0.5.21 - '@babel/runtime@7.24.5': dependencies: regenerator-runtime: 0.14.1 @@ -5968,12 +5186,6 @@ snapshots: '@babel/parser': 7.24.5 '@babel/types': 7.24.5 - '@babel/template@7.24.6': - dependencies: - '@babel/code-frame': 7.24.6 - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 - '@babel/traverse@7.24.5': dependencies: '@babel/code-frame': 7.24.2 @@ -5984,7 +5196,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.5 '@babel/parser': 7.24.5 '@babel/types': 7.24.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -5995,17 +5207,11 @@ snapshots: '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 - '@babel/types@7.24.6': - dependencies: - '@babel/helper-string-parser': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 - to-fast-properties: 2.0.0 - - '@commitlint/cli@19.3.0(@types/node@20.12.13)(typescript@5.4.5)': + '@commitlint/cli@19.3.0(@types/node@20.14.2)(typescript@5.4.5)': dependencies: '@commitlint/format': 19.3.0 '@commitlint/lint': 19.2.2 - '@commitlint/load': 19.2.0(@types/node@20.12.13)(typescript@5.4.5) + '@commitlint/load': 19.2.0(@types/node@20.14.2)(typescript@5.4.5) '@commitlint/read': 19.2.1 '@commitlint/types': 19.0.3 execa: 8.0.1 @@ -6052,7 +5258,7 @@ snapshots: '@commitlint/rules': 19.0.3 '@commitlint/types': 19.0.3 - '@commitlint/load@19.2.0(@types/node@20.12.13)(typescript@5.4.5)': + '@commitlint/load@19.2.0(@types/node@20.14.2)(typescript@5.4.5)': dependencies: '@commitlint/config-validator': 19.0.3 '@commitlint/execute-rule': 19.0.0 @@ -6060,7 +5266,7 @@ snapshots: '@commitlint/types': 19.0.3 chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@5.4.5) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.12.13)(cosmiconfig@9.0.0(typescript@5.4.5))(typescript@5.4.5) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.14.2)(cosmiconfig@9.0.0(typescript@5.4.5))(typescript@5.4.5) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -6160,7 +5366,7 @@ snapshots: '@electron/get@2.0.3': dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -6397,7 +5603,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -6429,18 +5635,18 @@ snapshots: '@floating-ui/utils@0.2.2': {} - '@generouted/react-router@1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0))': + '@generouted/react-router@1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0))': dependencies: fast-glob: 3.3.2 - generouted: 1.19.5(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + generouted: 1.19.5(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) react: 19.0.0-rc-9d4fba0788-20240530 react-router-dom: 6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -6479,25 +5685,9 @@ snapshots: '@material/material-color-utilities@0.2.7': {} - '@mnajdova/enzyme-adapter-react-18@0.2.0(enzyme@3.11.0)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)': - dependencies: - enzyme: 3.11.0 - enzyme-adapter-utils: 1.14.2(react@19.0.0-rc-9d4fba0788-20240530) - enzyme-shallow-equal: 1.0.7 - has: 1.0.4 - object.assign: 4.1.5 - object.values: 1.2.0 - prop-types: 15.8.1 - react: 19.0.0-rc-9d4fba0788-20240530 - react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) - react-is: 18.3.1 - react-reconciler: 0.29.2(react@19.0.0-rc-9d4fba0788-20240530) - react-test-renderer: 18.3.1(react@19.0.0-rc-9d4fba0788-20240530) - semver: 5.7.2 - '@mui/base@5.0.0-beta.40(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 '@floating-ui/react-dom': 2.0.9(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) '@mui/types': 7.2.14(types-react@19.0.0-rc.0) '@mui/utils': 5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) @@ -6511,7 +5701,7 @@ snapshots: '@mui/core-downloads-tracker@5.15.19': {} - '@mui/icons-material@5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': + '@mui/icons-material@5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.5 '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) @@ -6519,40 +5709,6 @@ snapshots: optionalDependencies: '@types/react': types-react@19.0.0-rc.0 - '@mui/internal-test-utils@1.0.0-dev.20240529-082515-213b5e33ab(@babel/core@7.24.5)(bufferutil@4.0.8)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)(utf-8-validate@5.0.10)': - dependencies: - '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.5) - '@babel/preset-typescript': 7.24.6(@babel/core@7.24.5) - '@babel/register': 7.24.6(@babel/core@7.24.5) - '@babel/runtime': 7.24.6 - '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) - '@mnajdova/enzyme-adapter-react-18': 0.2.0(enzyme@3.11.0)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) - '@testing-library/dom': 10.1.0 - '@testing-library/react': 15.0.7(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) - chai: 4.4.1 - chai-dom: 1.12.0(chai@4.4.1) - dom-accessibility-api: 0.6.3 - enzyme: 3.11.0 - format-util: 1.0.5 - fs-extra: 11.2.0 - jsdom: 24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - lodash: 4.17.21 - mocha: 10.4.0 - playwright: 1.44.1 - prop-types: 15.8.1 - react: 19.0.0-rc-9d4fba0788-20240530 - react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) - react-test-renderer: 18.3.1(react@19.0.0-rc-9d4fba0788-20240530) - sinon: 16.1.3 - transitivePeerDependencies: - - '@babel/core' - - '@types/react' - - bufferutil - - canvas - - supports-color - - utf-8-validate - '@mui/lab@5.0.0-alpha.170(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.5 @@ -6593,7 +5749,7 @@ snapshots: '@mui/private-theming@5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 '@mui/utils': 5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) prop-types: 15.8.1 react: 19.0.0-rc-9d4fba0788-20240530 @@ -6602,7 +5758,7 @@ snapshots: '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 '@emotion/cache': 11.11.0 csstype: 3.1.3 prop-types: 15.8.1 @@ -6613,7 +5769,7 @@ snapshots: '@mui/system@5.15.15(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 '@mui/private-theming': 5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530) '@mui/types': 7.2.14(types-react@19.0.0-rc.0) @@ -6633,7 +5789,7 @@ snapshots: '@mui/utils@5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 '@types/prop-types': 15.7.12 prop-types: 15.8.1 react: 19.0.0-rc-9d4fba0788-20240530 @@ -6641,10 +5797,9 @@ snapshots: optionalDependencies: '@types/react': types-react@19.0.0-rc.0 - '@mui/x-data-grid@7.6.0(@babel/core@7.24.5)(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(bufferutil@4.0.8)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)(utf-8-validate@5.0.10)': + '@mui/x-data-grid@7.6.2(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.6 - '@mui/internal-test-utils': 1.0.0-dev.20240529-082515-213b5e33ab(@babel/core@7.24.5)(bufferutil@4.0.8)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)(utf-8-validate@5.0.10) '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/system': 5.15.15(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/utils': 5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) @@ -6654,14 +5809,9 @@ snapshots: react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) reselect: 4.1.8 transitivePeerDependencies: - - '@babel/core' - '@emotion/react' - '@emotion/styled' - '@types/react' - - bufferutil - - canvas - - supports-color - - utf-8-validate '@nodelib/fs.scandir@2.1.5': dependencies: @@ -6798,34 +5948,10 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.17.2': optional: true - '@shikijs/core@1.6.1': {} + '@shikijs/core@1.6.2': {} '@sindresorhus/is@4.6.0': {} - '@sinonjs/commons@2.0.0': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/commons@3.0.1': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@10.3.0': - dependencies: - '@sinonjs/commons': 3.0.1 - - '@sinonjs/fake-timers@11.2.2': - dependencies: - '@sinonjs/commons': 3.0.1 - - '@sinonjs/samsam@8.0.0': - dependencies: - '@sinonjs/commons': 2.0.0 - lodash.get: 4.4.2 - type-detect: 4.0.8 - - '@sinonjs/text-encoding@0.7.2': {} - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -6951,33 +6077,10 @@ snapshots: '@tauri-apps/cli-win32-ia32-msvc': 1.5.14 '@tauri-apps/cli-win32-x64-msvc': 1.5.14 - '@testing-library/dom@10.1.0': - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.6 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - - '@testing-library/react@15.0.7(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': - dependencies: - '@babel/runtime': 7.24.6 - '@testing-library/dom': 10.1.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 - react: 19.0.0-rc-9d4fba0788-20240530 - react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) - optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/adm-zip@0.5.5': dependencies: '@types/node': 20.12.10 - '@types/aria-query@5.0.4': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.5 @@ -7003,12 +6106,12 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.12.13 + '@types/node': 20.14.2 '@types/responselike': 1.0.3 '@types/conventional-commits-parser@5.0.0': dependencies: - '@types/node': 20.12.13 + '@types/node': 20.14.2 '@types/debug@4.1.12': dependencies: @@ -7025,7 +6128,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 20.12.13 + '@types/node': 20.14.2 '@types/hast@3.0.4': dependencies: @@ -7039,11 +6142,11 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 20.12.13 + '@types/node': 20.14.2 '@types/keyv@3.1.4': dependencies: - '@types/node': 20.12.13 + '@types/node': 20.14.2 '@types/lodash-es@4.17.12': dependencies: @@ -7063,7 +6166,7 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.12.13': + '@types/node@20.14.2': dependencies: undici-types: 5.26.5 @@ -7085,7 +6188,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 20.12.13 + '@types/node': 20.14.2 '@types/unist@2.0.10': {} @@ -7093,17 +6196,17 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.12.13 + '@types/node': 20.14.2 optional: true - '@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.11.0 - '@typescript-eslint/type-utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.11.0 + '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.12.0 + '@typescript-eslint/type-utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.12.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -7114,29 +6217,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/scope-manager': 7.11.0 - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.11.0 - debug: 4.3.4(supports-color@8.1.1) + '@typescript-eslint/scope-manager': 7.12.0 + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.12.0 + debug: 4.3.4 eslint: 8.57.0 optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.11.0': + '@typescript-eslint/scope-manager@7.12.0': dependencies: - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/visitor-keys': 7.11.0 + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/visitor-keys': 7.12.0 - '@typescript-eslint/type-utils@7.11.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/type-utils@7.12.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@8.1.1) + '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: @@ -7144,13 +6247,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.11.0': {} + '@typescript-eslint/types@7.12.0': {} - '@typescript-eslint/typescript-estree@7.11.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@7.12.0(typescript@5.4.5)': dependencies: - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/visitor-keys': 7.11.0 - debug: 4.3.4(supports-color@8.1.1) + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/visitor-keys': 7.12.0 + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 @@ -7161,32 +6264,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.11.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/utils@7.12.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.11.0 - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.12.0 + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.11.0': + '@typescript-eslint/visitor-keys@7.12.0': dependencies: - '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/types': 7.12.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.0(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0))': + '@vitejs/plugin-react@4.3.0(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0))': dependencies: '@babel/core': 7.24.5 '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) transitivePeerDependencies: - supports-color @@ -7201,17 +6304,17 @@ snapshots: acorn@8.11.3: {} - adm-zip@0.5.12: {} + adm-zip@0.5.14: {} agent-base@7.1.1: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color ahooks@3.8.0(react@19.0.0-rc-9d4fba0788-20240530): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 dayjs: 1.11.11 intersection-observer: 0.12.2 js-cookie: 2.2.1 @@ -7222,19 +6325,6 @@ snapshots: screenfull: 5.2.0 tslib: 2.6.2 - airbnb-prop-types@2.16.0(react@19.0.0-rc-9d4fba0788-20240530): - dependencies: - array.prototype.find: 2.2.3 - function.prototype.name: 1.1.6 - is-regex: 1.1.4 - object-is: 1.1.6 - object.assign: 4.1.5 - object.entries: 1.1.8 - prop-types: 15.8.1 - prop-types-exact: 1.2.4 - react: 19.0.0-rc-9d4fba0788-20240530 - react-is: 16.13.1 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -7264,8 +6354,6 @@ snapshots: dependencies: string-width: 2.1.1 - ansi-colors@4.1.1: {} - ansi-escapes@6.2.1: {} ansi-regex@3.0.1: {} @@ -7282,8 +6370,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} any-promise@1.3.0: {} @@ -7297,10 +6383,6 @@ snapshots: argparse@2.0.1: {} - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -7319,23 +6401,6 @@ snapshots: array-union@2.1.0: {} - array.prototype.filter@1.0.4: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-array-method-boxes-properly: 1.0.0 - es-object-atoms: 1.0.0 - is-string: 1.0.7 - - array.prototype.find@2.2.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 @@ -7394,8 +6459,6 @@ snapshots: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - assertion-error@1.1.0: {} - astral-regex@2.0.0: {} async-mutex@0.3.2: @@ -7428,7 +6491,7 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 cosmiconfig: 7.1.0 resolve: 1.22.8 @@ -7446,8 +6509,6 @@ snapshots: binary-extensions@2.3.0: {} - boolbase@1.0.0: {} - boolean@3.2.0: optional: true @@ -7478,8 +6539,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browser-stdout@1.3.1: {} - browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001616 @@ -7489,8 +6548,6 @@ snapshots: buffer-crc32@0.2.13: {} - buffer-from@1.1.2: {} - buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -7540,20 +6597,6 @@ snapshots: ccount@2.0.1: {} - chai-dom@1.12.0(chai@4.4.1): - dependencies: - chai: 4.4.1 - - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -7575,41 +6618,6 @@ snapshots: character-reference-invalid@2.0.1: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - cheerio-select@2.1.0: - dependencies: - boolbase: 1.0.0 - css-select: 5.1.0 - css-what: 6.1.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - - cheerio@1.0.0-rc.12: - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.1.0 - htmlparser2: 8.0.2 - parse5: 7.1.2 - parse5-htmlparser2-tree-adapter: 7.0.0 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -7639,24 +6647,12 @@ snapshots: client-only@0.0.1: {} - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone-deep@4.0.1: - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - clone-response@1.0.3: dependencies: mimic-response: 1.0.1 @@ -7689,12 +6685,8 @@ snapshots: commander@12.1.0: {} - commander@2.20.3: {} - commander@4.1.1: {} - commondir@1.0.1: {} - compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -7740,9 +6732,9 @@ snapshots: dependencies: is-what: 3.14.1 - cosmiconfig-typescript-loader@5.0.0(@types/node@20.12.13)(cosmiconfig@9.0.0(typescript@5.4.5))(typescript@5.4.5): + cosmiconfig-typescript-loader@5.0.0(@types/node@20.14.2)(cosmiconfig@9.0.0(typescript@5.4.5))(typescript@5.4.5): dependencies: - '@types/node': 20.12.13 + '@types/node': 20.14.2 cosmiconfig: 9.0.0(typescript@5.4.5) jiti: 1.21.0 typescript: 5.4.5 @@ -7797,27 +6789,13 @@ snapshots: css-functions-list@3.2.2: {} - css-select@5.1.0: - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.1.0 - nth-check: 2.1.1 - css-tree@2.3.1: dependencies: mdn-data: 2.0.30 source-map-js: 1.2.0 - css-what@6.1.0: {} - cssesc@3.0.0: {} - cssstyle@4.0.1: - dependencies: - rrweb-cssom: 0.6.0 - csstype@3.1.3: {} d@1.0.2: @@ -7829,11 +6807,6 @@ snapshots: data-uri-to-buffer@4.0.1: {} - data-urls@5.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 @@ -7862,15 +6835,9 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.4(supports-color@8.1.1): + debug@4.3.4: dependencies: ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - decimal.js@10.4.3: {} decode-named-character-reference@1.0.2: dependencies: @@ -7884,10 +6851,6 @@ snapshots: optionalDependencies: babel-plugin-macros: 3.1.0 - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -7923,16 +6886,10 @@ snapshots: didyoumean@1.2.2: {} - diff@5.0.0: {} - - diff@5.2.0: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 - discontinuous-range@1.0.0: {} - dlv@1.1.3: {} doctrine@2.1.0: @@ -7943,13 +6900,9 @@ snapshots: dependencies: esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} - - dom-accessibility-api@0.6.3: {} - dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 csstype: 3.1.3 dom-serializer@1.4.1: @@ -8031,47 +6984,6 @@ snapshots: env-paths@2.2.1: {} - enzyme-adapter-utils@1.14.2(react@19.0.0-rc-9d4fba0788-20240530): - dependencies: - airbnb-prop-types: 2.16.0(react@19.0.0-rc-9d4fba0788-20240530) - function.prototype.name: 1.1.6 - hasown: 2.0.2 - object.assign: 4.1.5 - object.fromentries: 2.0.8 - prop-types: 15.8.1 - react: 19.0.0-rc-9d4fba0788-20240530 - semver: 6.3.1 - - enzyme-shallow-equal@1.0.7: - dependencies: - hasown: 2.0.2 - object-is: 1.1.6 - - enzyme@3.11.0: - dependencies: - array.prototype.flat: 1.3.2 - cheerio: 1.0.0-rc.12 - enzyme-shallow-equal: 1.0.7 - function.prototype.name: 1.1.6 - has: 1.0.4 - html-element-map: 1.3.1 - is-boolean-object: 1.1.2 - is-callable: 1.2.7 - is-number-object: 1.0.7 - is-regex: 1.1.4 - is-string: 1.0.7 - is-subset: 0.1.1 - lodash.escape: 4.0.1 - lodash.isequal: 4.5.0 - object-inspect: 1.13.1 - object-is: 1.1.6 - object.assign: 4.1.5 - object.entries: 1.1.8 - object.values: 1.2.0 - raf: 3.4.1 - rst-selector-parser: 2.2.3 - string.prototype.trim: 1.2.9 - errno@0.1.8: dependencies: prr: 1.0.1 @@ -8130,8 +7042,6 @@ snapshots: unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - es-array-method-boxes-properly@1.0.0: {} - es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 @@ -8342,10 +7252,10 @@ snapshots: resolve: 1.22.8 semver: 7.6.1 - eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.1): dependencies: eslint: 8.57.0 - prettier: 3.2.5 + prettier: 3.3.1 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 optionalDependencies: @@ -8397,7 +7307,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -8493,7 +7403,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -8550,18 +7460,8 @@ snapshots: dependencies: to-regex-range: 5.0.1 - find-cache-dir@2.1.0: - dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 - find-root@1.1.0: {} - find-up@3.0.0: - dependencies: - locate-path: 3.0.0 - find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -8584,8 +7484,6 @@ snapshots: flatted: 3.3.1 keyv: 4.5.4 - flat@5.0.2: {} - flatted@3.3.1: {} follow-redirects@1.15.6: {} @@ -8605,15 +7503,13 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - format-util@1.0.5: {} - formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 fraction.js@4.3.7: {} - framer-motion@11.2.9(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): + framer-motion@11.2.10(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): dependencies: tslib: 2.6.2 optionalDependencies: @@ -8635,9 +7531,6 @@ snapshots: fs.realpath@1.0.0: {} - fsevents@2.3.2: - optional: true - fsevents@2.3.3: optional: true @@ -8652,9 +7545,9 @@ snapshots: functions-have-names@1.2.3: {} - generouted@1.19.5(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): + generouted@1.19.5(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) gensync@1.0.0-beta.2: {} @@ -8662,8 +7555,6 @@ snapshots: get-east-asian-width@1.2.0: {} - get-func-name@2.0.2: {} - get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 @@ -8725,14 +7616,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.0.1 - once: 1.4.0 - global-agent@3.0.0: dependencies: boolean: 3.2.0 @@ -8841,8 +7724,6 @@ snapshots: dependencies: has-symbols: 1.0.3 - has@1.0.4: {} - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -8871,21 +7752,10 @@ snapshots: dependencies: '@types/hast': 3.0.4 - he@1.2.0: {} - hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 - html-element-map@1.3.1: - dependencies: - array.prototype.filter: 1.0.4 - call-bind: 1.0.7 - - html-encoding-sniffer@4.0.0: - dependencies: - whatwg-encoding: 3.1.1 - html-parse-stringify@3.0.1: dependencies: void-elements: 3.1.0 @@ -8917,13 +7787,6 @@ snapshots: http-cache-semantics@4.1.1: {} - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - http2-wrapper@1.0.3: dependencies: quick-lru: 5.1.1 @@ -8932,7 +7795,7 @@ snapshots: https-proxy-agent@7.0.4: dependencies: agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -8947,6 +7810,7 @@ snapshots: iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 + optional: true icss-utils@5.1.0(postcss@8.4.38): dependencies: @@ -9108,18 +7972,10 @@ snapshots: is-path-inside@3.0.3: {} - is-plain-obj@2.1.0: {} - is-plain-obj@4.1.0: {} - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - is-plain-object@5.0.0: {} - is-potential-custom-element-name@1.0.1: {} - is-redirect@1.0.0: {} is-regex@1.1.4: @@ -9143,8 +7999,6 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-subset@0.1.1: {} - is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 @@ -9159,8 +8013,6 @@ snapshots: is-typedarray@1.0.0: {} - is-unicode-supported@0.1.0: {} - is-weakmap@2.0.2: {} is-weakref@1.0.2: @@ -9178,8 +8030,6 @@ snapshots: isexe@2.0.0: {} - isobject@3.0.1: {} - iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 @@ -9196,7 +8046,7 @@ snapshots: jiti@1.21.0: {} - jotai@2.8.2(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0): + jotai@2.8.3(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0): optionalDependencies: '@types/react': types-react@19.0.0-rc.0 react: 19.0.0-rc-9d4fba0788-20240530 @@ -9213,34 +8063,6 @@ snapshots: jsbn@1.1.0: {} - jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - dependencies: - cssstyle: 4.0.1 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.10 - parse5: 7.1.2 - rrweb-cssom: 0.7.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - jsesc@2.5.2: {} json-buffer@3.0.1: {} @@ -9283,16 +8105,12 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 - just-extend@6.2.0: {} - keyv@4.5.4: dependencies: json-buffer: 3.0.1 kind-of@6.0.3: {} - known-css-properties@0.30.0: {} - known-css-properties@0.31.0: {} latest-version@3.1.0: @@ -9328,7 +8146,7 @@ snapshots: dependencies: chalk: 5.3.0 commander: 12.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 execa: 8.0.1 lilconfig: 3.1.1 listr2: 8.2.1 @@ -9348,11 +8166,6 @@ snapshots: rfdc: 1.3.1 wrap-ansi: 9.0.0 - locate-path@3.0.0: - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -9369,12 +8182,6 @@ snapshots: lodash.debounce@4.0.8: {} - lodash.escape@4.0.1: {} - - lodash.flattendeep@4.4.0: {} - - lodash.get@4.4.2: {} - lodash.isequal@4.5.0: {} lodash.isplainobject@4.0.6: {} @@ -9397,11 +8204,6 @@ snapshots: lodash@4.17.21: {} - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - log-update@6.0.0: dependencies: ansi-escapes: 6.2.1 @@ -9416,10 +8218,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - lower-case@2.0.2: dependencies: tslib: 2.6.2 @@ -9439,8 +8237,6 @@ snapshots: dependencies: yallist: 3.1.1 - lz-string@1.5.0: {} - make-dir@1.3.0: dependencies: pify: 3.0.0 @@ -9449,6 +8245,7 @@ snapshots: dependencies: pify: 4.0.1 semver: 5.7.2 + optional: true matcher@3.0.0: dependencies: @@ -9672,7 +8469,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -9724,10 +8521,6 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@5.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 @@ -9736,33 +8529,8 @@ snapshots: minipass@7.1.0: {} - mocha@10.4.0: - dependencies: - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 8.1.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.0.1 - ms: 2.1.3 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - monaco-editor@0.49.0: {} - moo@0.5.2: {} - ms@2.0.0: {} ms@2.1.2: {} @@ -9790,13 +8558,6 @@ snapshots: natural-compare@1.4.0: {} - nearley@2.20.1: - dependencies: - commander: 2.20.3 - moo: 0.5.2 - railroad-diagrams: 1.0.0 - randexp: 0.4.6 - needle@3.3.1: dependencies: iconv-lite: 0.6.3 @@ -9805,14 +8566,6 @@ snapshots: next-tick@1.1.0: {} - nise@5.1.9: - dependencies: - '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 11.2.2 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 6.2.0 - path-to-regexp: 6.2.2 - no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -9862,23 +8615,12 @@ snapshots: dependencies: path-key: 4.0.0 - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - nwsapi@2.2.10: {} - object-assign@4.1.1: {} object-hash@3.0.0: {} object-inspect@1.13.1: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - object-keys@1.1.1: {} object.assign@4.1.5: @@ -9950,10 +8692,6 @@ snapshots: p-finally@1.0.0: {} - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -9962,10 +8700,6 @@ snapshots: dependencies: yocto-queue: 1.0.0 - p-locate@3.0.0: - dependencies: - p-limit: 2.3.0 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 @@ -9974,8 +8708,6 @@ snapshots: dependencies: p-limit: 4.0.0 - p-try@2.2.0: {} - package-json@4.0.1: dependencies: got: 6.7.1 @@ -10009,19 +8741,8 @@ snapshots: parse-node-version@1.0.1: {} - parse5-htmlparser2-tree-adapter@7.0.0: - dependencies: - domhandler: 5.0.3 - parse5: 7.1.2 - - parse5@7.1.2: - dependencies: - entities: 4.5.0 - path-browserify@1.0.1: {} - path-exists@3.0.0: {} - path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -10043,16 +8764,10 @@ snapshots: lru-cache: 10.2.2 minipass: 7.1.0 - path-to-regexp@6.2.2: {} - path-type@4.0.0: {} - pathval@1.1.1: {} - pend@1.2.0: {} - performance-now@2.1.0: {} - picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -10063,22 +8778,11 @@ snapshots: pify@3.0.0: {} - pify@4.0.1: {} + pify@4.0.1: + optional: true pirates@4.0.6: {} - pkg-dir@3.0.0: - dependencies: - find-up: 3.0.0 - - playwright-core@1.44.1: {} - - playwright@1.44.1: - dependencies: - playwright-core: 1.44.1 - optionalDependencies: - fsevents: 2.3.2 - possible-typed-array-names@1.0.0: {} postcss-html@1.7.0: @@ -10188,29 +8892,15 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-toml@2.0.1(prettier@3.2.5): + prettier-plugin-toml@2.0.1(prettier@3.3.1): dependencies: '@taplo/lib': 0.4.0-alpha.2 - prettier: 3.2.5 + prettier: 3.3.1 - prettier@3.2.5: {} - - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 + prettier@3.3.1: {} progress@2.0.3: {} - prop-types-exact@1.2.4: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - isarray: 2.0.5 - object.assign: 4.1.5 - reflect.ownkeys: 1.1.4 - prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -10226,8 +8916,6 @@ snapshots: pseudomap@1.0.2: {} - psl@1.9.0: {} - pump@3.0.0: dependencies: end-of-stream: 1.4.4 @@ -10235,27 +8923,10 @@ snapshots: punycode@2.3.1: {} - querystringify@2.2.0: {} - queue-microtask@1.2.3: {} quick-lru@5.1.1: {} - raf@3.4.1: - dependencies: - performance-now: 2.1.0 - - railroad-diagrams@1.0.0: {} - - randexp@0.4.6: - dependencies: - discontinuous-range: 1.0.0 - ret: 0.1.15 - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -10307,7 +8978,7 @@ snapshots: react: 19.0.0-rc-9d4fba0788-20240530 react-hook-form: 7.51.5(react@19.0.0-rc-9d4fba0788-20240530) optionalDependencies: - '@mui/icons-material': 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@mui/icons-material': 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) react-hook-form@7.51.5(react@19.0.0-rc-9d4fba0788-20240530): dependencies: @@ -10324,8 +8995,6 @@ snapshots: react-is@16.13.1: {} - react-is@17.0.2: {} - react-is@18.3.1: {} react-markdown@9.0.1(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0): @@ -10345,12 +9014,6 @@ snapshots: transitivePeerDependencies: - supports-color - react-reconciler@0.29.2(react@19.0.0-rc-9d4fba0788-20240530): - dependencies: - loose-envify: 1.4.0 - react: 19.0.0-rc-9d4fba0788-20240530 - scheduler: 0.23.2 - react-refresh@0.14.2: {} react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): @@ -10365,19 +9028,6 @@ snapshots: '@remix-run/router': 1.16.1 react: 19.0.0-rc-9d4fba0788-20240530 - react-shallow-renderer@16.15.0(react@19.0.0-rc-9d4fba0788-20240530): - dependencies: - object-assign: 4.1.1 - react: 19.0.0-rc-9d4fba0788-20240530 - react-is: 18.3.1 - - react-test-renderer@18.3.1(react@19.0.0-rc-9d4fba0788-20240530): - dependencies: - react: 19.0.0-rc-9d4fba0788-20240530 - react-is: 18.3.1 - react-shallow-renderer: 16.15.0(react@19.0.0-rc-9d4fba0788-20240530) - scheduler: 0.23.2 - react-transition-group@4.4.5(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): dependencies: '@babel/runtime': 7.24.5 @@ -10419,14 +9069,6 @@ snapshots: globalthis: 1.0.4 which-builtin-type: 1.1.3 - reflect.ownkeys@1.1.4: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-set-tostringtag: 2.0.3 - globalthis: 1.0.4 - regenerator-runtime@0.14.1: {} regexp.prototype.flags@1.5.2: @@ -10466,8 +9108,6 @@ snapshots: require-from-string@2.0.2: {} - requires-port@1.0.0: {} - reselect@4.1.8: {} reserved-words@0.1.2: {} @@ -10503,8 +9143,6 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - ret@0.1.15: {} - reusify@1.0.4: {} rfdc@1.3.1: {} @@ -10545,15 +9183,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.17.2 fsevents: 2.3.3 - rrweb-cssom@0.6.0: {} - - rrweb-cssom@0.7.0: {} - - rst-selector-parser@2.2.3: - dependencies: - lodash.flattendeep: 4.4.0 - nearley: 2.20.1 - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -10573,7 +9202,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 - safer-buffer@2.1.2: {} + safer-buffer@2.1.2: + optional: true sass@1.77.4: dependencies: @@ -10583,14 +9213,6 @@ snapshots: sax@1.3.0: {} - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - scheduler@0.25.0-rc-9d4fba0788-20240530: {} screenfull@5.2.0: {} @@ -10613,10 +9235,6 @@ snapshots: type-fest: 0.13.1 optional: true - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -10633,10 +9251,6 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - shallow-clone@3.0.1: - dependencies: - kind-of: 6.0.3 - shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -10651,9 +9265,9 @@ snapshots: shell-quote@1.8.1: {} - shiki@1.6.1: + shiki@1.6.2: dependencies: - '@shikijs/core': 1.6.1 + '@shikijs/core': 1.6.2 side-channel@1.0.6: dependencies: @@ -10666,15 +9280,6 @@ snapshots: signal-exit@4.1.0: {} - sinon@16.1.3: - dependencies: - '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 10.3.0 - '@sinonjs/samsam': 8.0.0 - diff: 5.2.0 - nise: 5.1.9 - supports-color: 7.2.0 - slash@3.0.0: {} slice-ansi@4.0.0: @@ -10709,14 +9314,10 @@ snapshots: source-map-js@1.2.0: {} - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - source-map@0.5.7: {} - source-map@0.6.1: {} + source-map@0.6.1: + optional: true source-map@0.7.4: {} @@ -10847,12 +9448,12 @@ snapshots: postcss-sorting: 8.0.2(postcss@8.4.38) stylelint: 16.6.1(typescript@5.4.5) - stylelint-scss@6.3.0(stylelint@16.6.1(typescript@5.4.5)): + stylelint-scss@6.3.1(stylelint@16.6.1(typescript@5.4.5)): dependencies: - known-css-properties: 0.30.0 + known-css-properties: 0.31.0 postcss-media-query-parser: 0.2.3 postcss-resolve-nested-selector: 0.1.1 - postcss-selector-parser: 6.0.16 + postcss-selector-parser: 6.1.0 postcss-value-parser: 4.2.0 stylelint: 16.6.1(typescript@5.4.5) @@ -10868,7 +9469,7 @@ snapshots: cosmiconfig: 9.0.0(typescript@5.4.5) css-functions-list: 3.2.2 css-tree: 2.3.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 fast-glob: 3.3.2 fastest-levenshtein: 1.0.16 file-entry-cache: 9.0.0 @@ -10906,7 +9507,7 @@ snapshots: stylus@0.62.0: dependencies: '@adobe/css-tools': 4.3.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 glob: 7.2.3 sax: 1.3.0 source-map: 0.7.4 @@ -10925,7 +9526,7 @@ snapshots: sumchecker@3.0.1: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -10937,10 +9538,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - supports-hyperlinks@3.0.0: dependencies: has-flag: 4.0.0 @@ -10958,8 +9555,6 @@ snapshots: react: 19.0.0-rc-9d4fba0788-20240530 use-sync-external-store: 1.2.2(react@19.0.0-rc-9d4fba0788-20240530) - symbol-tree@3.2.4: {} - synckit@0.8.8: dependencies: '@pkgr/core': 0.1.1 @@ -10973,7 +9568,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.4.3: + tailwindcss@3.4.4: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -10985,7 +9580,7 @@ snapshots: is-glob: 4.0.3 jiti: 1.21.0 lilconfig: 2.1.0 - micromatch: 4.0.5 + micromatch: 4.0.7 normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.1 @@ -10994,13 +9589,13 @@ snapshots: postcss-js: 4.0.1(postcss@8.4.38) postcss-load-config: 4.0.2(postcss@8.4.38) postcss-nested: 6.0.1(postcss@8.4.38) - postcss-selector-parser: 6.0.16 + postcss-selector-parser: 6.1.0 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: - ts-node - telegram@2.21.2: + telegram@2.22.2: dependencies: '@cryptography/aes': 0.1.1 async-mutex: 0.3.2 @@ -11048,17 +9643,6 @@ snapshots: dependencies: is-number: 7.0.0 - tough-cookie@4.1.4: - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - - tr46@5.0.0: - dependencies: - punycode: 2.3.1 - trim-lines@3.0.1: {} trough@2.2.0: {} @@ -11090,7 +9674,7 @@ snapshots: tslib@2.6.2: {} - tsx@4.11.0: + tsx@4.12.0: dependencies: esbuild: 0.20.2 get-tsconfig: 4.7.5 @@ -11103,8 +9687,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.13.1: optional: true @@ -11244,8 +9826,6 @@ snapshots: universalify@0.1.2: {} - universalify@0.2.0: {} - universalify@2.0.1: {} unzip-response@2.0.1: {} @@ -11277,11 +9857,6 @@ snapshots: dependencies: prepend-http: 1.0.4 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - use-resize-observer@9.1.0(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): dependencies: '@juggle/resize-observer': 3.4.0 @@ -11319,43 +9894,43 @@ snapshots: esbuild: 0.19.12 monaco-editor: 0.49.0 - vite-plugin-sass-dts@1.3.22(postcss@8.4.38)(prettier@3.2.5)(sass@1.77.4)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): + vite-plugin-sass-dts@1.3.22(postcss@8.4.38)(prettier@3.3.1)(sass@1.77.4)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: postcss: 8.4.38 postcss-js: 4.0.1(postcss@8.4.38) - prettier: 3.2.5 + prettier: 3.3.1 sass: 1.77.4 - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) - vite-plugin-svgr@4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): + vite-plugin-svgr@4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.17.2) '@svgr/core': 8.1.0(typescript@5.4.5) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.4.5)) - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) transitivePeerDependencies: - supports-color - typescript - vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0): + vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0): dependencies: esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.17.2 optionalDependencies: - '@types/node': 20.12.13 + '@types/node': 20.14.2 fsevents: 2.3.3 less: 4.2.0 sass: 1.77.4 @@ -11363,14 +9938,8 @@ snapshots: void-elements@3.1.0: {} - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - web-streams-polyfill@3.3.3: {} - webidl-conversions@7.0.0: {} - websocket@1.0.35: dependencies: bufferutil: 4.0.8 @@ -11382,17 +9951,6 @@ snapshots: transitivePeerDependencies: - supports-color - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - - whatwg-mimetype@4.0.0: {} - - whatwg-url@14.0.0: - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 - which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -11445,8 +10003,6 @@ snapshots: word-wrap@1.2.5: {} - workerpool@6.2.1: {} - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -11489,17 +10045,8 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 5.0.10 - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - xdg-basedir@3.0.0: {} - xml-name-validator@5.0.0: {} - - xmlchars@2.2.0: {} - y18n@5.0.8: {} yaeti@0.0.6: {} @@ -11512,27 +10059,8 @@ snapshots: yaml@2.4.2: {} - yargs-parser@20.2.4: {} - yargs-parser@21.1.1: {} - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - yargs@17.7.2: dependencies: cliui: 8.0.1 diff --git a/clash-nyanpasu/scripts/package.json b/clash-nyanpasu/scripts/package.json index a33f3f6e4d..cdf222218b 100644 --- a/clash-nyanpasu/scripts/package.json +++ b/clash-nyanpasu/scripts/package.json @@ -8,13 +8,13 @@ }, "devDependencies": { "@types/adm-zip": "0.5.5", - "adm-zip": "0.5.12", + "adm-zip": "0.5.14", "colorize-template": "1.0.0", "consola": "3.2.3", "fs-extra": "11.2.0", "https-proxy-agent": "7.0.4", "node-fetch": "3.3.2", "picocolors": "1.0.1", - "telegram": "2.21.2" + "telegram": "2.22.2" } } diff --git a/clash-verge-rev/.github/build-for-linux/build.sh b/clash-verge-rev/.github/build-for-linux/build.sh index 6389453346..0a7a4bc0ca 100644 --- a/clash-verge-rev/.github/build-for-linux/build.sh +++ b/clash-verge-rev/.github/build-for-linux/build.sh @@ -2,7 +2,7 @@ pnpm install pnpm check $INPUT_TARGET sed -i "s/#openssl/openssl={version=\"0.10\",features=[\"vendored\"]}/g" src-tauri/Cargo.toml if [ "$INPUT_TARGET" = "x86_64-unknown-linux-gnu" ]; then - pnpm build --target $INPUT_TARGET + cargo tauri build --target $INPUT_TARGET else - pnpm build --target $INPUT_TARGET -b deb + cargo tauri build --target $INPUT_TARGET -b deb,rpm fi diff --git a/clash-verge-rev/.github/build-for-linux/entrypoint.sh b/clash-verge-rev/.github/build-for-linux/entrypoint.sh index c07360347e..c23f6217c2 100644 --- a/clash-verge-rev/.github/build-for-linux/entrypoint.sh +++ b/clash-verge-rev/.github/build-for-linux/entrypoint.sh @@ -5,6 +5,8 @@ tar -Jxvf ./node-v20.10.0-linux-x64.tar.xz export PATH=$(pwd)/node-v20.10.0-linux-x64/bin:$PATH npm install pnpm -g +cargo install --git https://github.com/tauri-apps/tauri --branch 1.x tauri-cli + rustup target add "$INPUT_TARGET" if [ "$INPUT_TARGET" = "x86_64-unknown-linux-gnu" ]; then diff --git a/clash-verge-rev/.github/workflows/alpha.yml b/clash-verge-rev/.github/workflows/alpha.yml index f393dcc330..5c5b6eae89 100644 --- a/clash-verge-rev/.github/workflows/alpha.yml +++ b/clash-verge-rev/.github/workflows/alpha.yml @@ -66,6 +66,12 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} with: tagName: alpha releaseName: "Clash Verge Rev Alpha" @@ -134,7 +140,9 @@ jobs: body: "More new features are now supported." prerelease: true token: ${{ secrets.GITHUB_TOKEN }} - files: src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb + files: | + src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb + src-tauri/target/${{ matrix.target }}/release/bundle/rpm/*.rpm alpha-for-fixed-webview2: strategy: @@ -248,12 +256,12 @@ jobs: - MacOS apple M芯片: aarch64.dmg ### Linux - - Linux 64位: amd64.AppImage/amd64.deb - - Linux 32位: i386.deb - - Linux arm64架构: arm64.deb - - Linux armv7架构: armhf.deb + - Linux 64位: amd64.AppImage/amd64.deb/amd64.rpm + - Linux 32位: i386.deb/i386.rpm + - Linux arm64架构: arm64.deb/aarch64.rpm + - Linux armv7架构: armhf.deb/armhfp.rpm - ### Windows (Win7 用户请查看下面FAQ手动替换内核使用) + ### Windows (Win7 用户请查看下面FAQ中的解决方案) #### 正常版本(推荐) - 64位: x64-setup.exe - 32位: x86-setup.exe diff --git a/clash-verge-rev/.github/workflows/release.yml b/clash-verge-rev/.github/workflows/release.yml index 5159687e54..fcdfa46fa2 100644 --- a/clash-verge-rev/.github/workflows/release.yml +++ b/clash-verge-rev/.github/workflows/release.yml @@ -100,6 +100,12 @@ jobs: NODE_OPTIONS: "--max_old_space_size=4096" TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} with: target: ${{ matrix.target }} @@ -126,7 +132,9 @@ jobs: name: "Clash Verge Rev v${{env.VERSION}}" body: "More new features are now supported." token: ${{ secrets.GITHUB_TOKEN }} - files: src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb + files: | + src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb + src-tauri/target/${{ matrix.target }}/release/bundle/rpm/*.rpm release-for-fixed-webview2: strategy: diff --git a/clash-verge-rev/UPDATELOG.md b/clash-verge-rev/UPDATELOG.md index 76b524e679..77bbcdff82 100644 --- a/clash-verge-rev/UPDATELOG.md +++ b/clash-verge-rev/UPDATELOG.md @@ -1,3 +1,17 @@ +## v1.6.5 + +### Features + +- 添加 RPM 包支持 +- 优化细节 + +### Bugs Fixes + +- MacOS 10.15 编辑器空白的问题 +- MacOS 低版本启动白屏的问题 + +--- + ## v1.6.4 ### Features diff --git a/clash-verge-rev/package.json b/clash-verge-rev/package.json index 2f4166e635..1c6a0e3aa4 100644 --- a/clash-verge-rev/package.json +++ b/clash-verge-rev/package.json @@ -1,6 +1,6 @@ { "name": "clash-verge", - "version": "1.6.4", + "version": "1.6.5", "license": "GPL-3.0-only", "scripts": { "dev": "tauri dev", @@ -24,30 +24,30 @@ "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@juggle/resize-observer": "^3.4.0", - "@mui/icons-material": "^5.15.16", + "@mui/icons-material": "^5.15.19", "@mui/lab": "5.0.0-alpha.149", - "@mui/material": "^5.15.16", - "@mui/x-data-grid": "^6.19.11", - "@tauri-apps/api": "^1.5.4", + "@mui/material": "^5.15.19", + "@mui/x-data-grid": "^6.20.0", + "@tauri-apps/api": "^1.5.6", "@types/json-schema": "^7.0.15", - "ahooks": "^3.7.11", - "axios": "^1.6.8", + "ahooks": "^3.8.0", + "axios": "^1.7.2", "dayjs": "1.11.5", - "i18next": "^23.11.3", + "i18next": "^23.11.5", "lodash-es": "^4.17.21", - "meta-json-schema": "1.18.5-alpha", + "meta-json-schema": "1.18.5-alpha4", "monaco-editor": "^0.49.0", "monaco-yaml": "^5.1.1", "nanoid": "^5.0.7", "react": "^18.3.1", "react-dom": "^18.3.1", "react-error-boundary": "^3.1.4", - "react-hook-form": "^7.51.4", + "react-hook-form": "^7.51.5", "react-i18next": "^13.5.0", "react-markdown": "^9.0.1", - "react-router-dom": "^6.23.0", + "react-router-dom": "^6.23.1", "react-transition-group": "^4.4.5", - "react-virtuoso": "^4.7.10", + "react-virtuoso": "^4.7.11", "recoil": "^0.7.7", "swr": "^1.3.0", "tar": "^6.2.1", @@ -55,16 +55,16 @@ }, "devDependencies": { "@actions/github": "^5.1.1", - "@tauri-apps/cli": "^1.5.13", + "@tauri-apps/cli": "^1.5.14", "@types/fs-extra": "^9.0.13", "@types/js-cookie": "^3.0.6", "@types/lodash-es": "^4.17.12", - "@types/react": "^18.3.1", + "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/react-transition-group": "^4.4.10", - "@vitejs/plugin-legacy": "^5.4.0", + "@vitejs/plugin-legacy": "^5.4.1", "@vitejs/plugin-react": "^4.3.0", - "adm-zip": "^0.5.12", + "adm-zip": "^0.5.13", "cross-env": "^7.0.3", "fs-extra": "^11.2.0", "https-proxy-agent": "^5.0.1", @@ -72,10 +72,10 @@ "node-fetch": "^3.3.2", "prettier": "^2.8.8", "pretty-quick": "^3.3.1", - "sass": "^1.77.0", + "sass": "^1.77.4", "terser": "^5.31.0", "typescript": "^5.4.5", - "vite": "^5.2.11", + "vite": "^5.2.12", "vite-plugin-monaco-editor": "^1.1.0", "vite-plugin-svgr": "^4.2.0" }, @@ -84,5 +84,6 @@ "semi": true, "singleQuote": false, "endOfLine": "lf" - } + }, + "packageManager": "pnpm@9.1.4" } diff --git a/clash-verge-rev/pnpm-lock.yaml b/clash-verge-rev/pnpm-lock.yaml index db08d3497a..c66c97ef67 100644 --- a/clash-verge-rev/pnpm-lock.yaml +++ b/clash-verge-rev/pnpm-lock.yaml @@ -26,41 +26,41 @@ importers: specifier: ^3.4.0 version: 3.4.0 "@mui/icons-material": - specifier: ^5.15.16 - version: 5.15.18(@mui/material@5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + specifier: ^5.15.19 + version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) "@mui/lab": specifier: 5.0.0-alpha.149 - version: 5.0.0-alpha.149(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.0.0-alpha.149(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@mui/material": - specifier: ^5.15.16 - version: 5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.15.19 + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@mui/x-data-grid": - specifier: ^6.19.11 - version: 6.20.0(@mui/material@5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^6.20.0 + version: 6.20.0(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@tauri-apps/api": - specifier: ^1.5.4 + specifier: ^1.5.6 version: 1.5.6 "@types/json-schema": specifier: ^7.0.15 version: 7.0.15 ahooks: - specifier: ^3.7.11 + specifier: ^3.8.0 version: 3.8.0(react@18.3.1) axios: - specifier: ^1.6.8 + specifier: ^1.7.2 version: 1.7.2 dayjs: specifier: 1.11.5 version: 1.11.5 i18next: - specifier: ^23.11.3 + specifier: ^23.11.5 version: 23.11.5 lodash-es: specifier: ^4.17.21 version: 4.17.21 meta-json-schema: - specifier: 1.18.5-alpha - version: 1.18.5-alpha + specifier: 1.18.5-alpha4 + version: 1.18.5-alpha4 monaco-editor: specifier: ^0.49.0 version: 0.49.0 @@ -80,7 +80,7 @@ importers: specifier: ^3.1.4 version: 3.1.4(react@18.3.1) react-hook-form: - specifier: ^7.51.4 + specifier: ^7.51.5 version: 7.51.5(react@18.3.1) react-i18next: specifier: ^13.5.0 @@ -89,13 +89,13 @@ importers: specifier: ^9.0.1 version: 9.0.1(@types/react@18.3.3)(react@18.3.1) react-router-dom: - specifier: ^6.23.0 + specifier: ^6.23.1 version: 6.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-transition-group: specifier: ^4.4.5 version: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-virtuoso: - specifier: ^4.7.10 + specifier: ^4.7.11 version: 4.7.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) recoil: specifier: ^0.7.7 @@ -114,7 +114,7 @@ importers: specifier: ^5.1.1 version: 5.1.1 "@tauri-apps/cli": - specifier: ^1.5.13 + specifier: ^1.5.14 version: 1.5.14 "@types/fs-extra": specifier: ^9.0.13 @@ -126,7 +126,7 @@ importers: specifier: ^4.17.12 version: 4.17.12 "@types/react": - specifier: ^18.3.1 + specifier: ^18.3.3 version: 18.3.3 "@types/react-dom": specifier: ^18.3.0 @@ -135,14 +135,14 @@ importers: specifier: ^4.4.10 version: 4.4.10 "@vitejs/plugin-legacy": - specifier: ^5.4.0 - version: 5.4.0(terser@5.31.0)(vite@5.2.11(@types/node@20.12.12)(sass@1.77.2)(terser@5.31.0)) + specifier: ^5.4.1 + version: 5.4.1(terser@5.31.0)(vite@5.2.12(@types/node@20.14.1)(sass@1.77.4)(terser@5.31.0)) "@vitejs/plugin-react": specifier: ^4.3.0 - version: 4.3.0(vite@5.2.11(@types/node@20.12.12)(sass@1.77.2)(terser@5.31.0)) + version: 4.3.0(vite@5.2.12(@types/node@20.14.1)(sass@1.77.4)(terser@5.31.0)) adm-zip: - specifier: ^0.5.12 - version: 0.5.12 + specifier: ^0.5.13 + version: 0.5.13 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -165,8 +165,8 @@ importers: specifier: ^3.3.1 version: 3.3.1(prettier@2.8.8) sass: - specifier: ^1.77.0 - version: 1.77.2 + specifier: ^1.77.4 + version: 1.77.4 terser: specifier: ^5.31.0 version: 5.31.0 @@ -174,14 +174,14 @@ importers: specifier: ^5.4.5 version: 5.4.5 vite: - specifier: ^5.2.11 - version: 5.2.11(@types/node@20.12.12)(sass@1.77.2)(terser@5.31.0) + specifier: ^5.2.12 + version: 5.2.12(@types/node@20.14.1)(sass@1.77.4)(terser@5.31.0) vite-plugin-monaco-editor: specifier: ^1.1.0 version: 1.1.0(monaco-editor@0.49.0) vite-plugin-svgr: specifier: ^4.2.0 - version: 4.2.0(rollup@4.18.0)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.12)(sass@1.77.2)(terser@5.31.0)) + version: 4.2.0(rollup@4.18.0)(typescript@5.4.5)(vite@5.2.12(@types/node@20.14.1)(sass@1.77.4)(terser@5.31.0)) packages: "@actions/github@5.1.1": @@ -1562,16 +1562,16 @@ packages: "@types/react": optional: true - "@mui/core-downloads-tracker@5.15.18": + "@mui/core-downloads-tracker@5.15.19": resolution: { - integrity: sha512-/9pVk+Al8qxAjwFUADv4BRZgMpZM4m5E+2Q/20qhVPuIJWqKp4Ie4tGExac6zu93rgPTYVQGgu+1vjiT0E+cEw==, + integrity: sha512-tCHSi/Tomez9ERynFhZRvFO6n9ATyrPs+2N80DMDzp6xDVirbBjEwhPcE+x7Lj+nwYw0SqFkOxyvMP0irnm55w==, } - "@mui/icons-material@5.15.18": + "@mui/icons-material@5.15.19": resolution: { - integrity: sha512-jGhyw02TSLM0NgW+MDQRLLRUD/K4eN9rlK2pTBTL1OtzyZmQ8nB060zK1wA0b7cVrIiG+zyrRmNAvGWXwm2N9Q==, + integrity: sha512-RsEiRxA5azN9b8gI7JRqekkgvxQUlitoBOtZglflb8cUDyP12/cP4gRwhb44Ea1/zwwGGjAj66ZJpGHhKfibNA==, } engines: { node: ">=12.0.0" } peerDependencies: @@ -1603,10 +1603,10 @@ packages: "@types/react": optional: true - "@mui/material@5.15.18": + "@mui/material@5.15.19": resolution: { - integrity: sha512-n+/dsiqux74fFfcRUJjok+ieNQ7+BEk6/OwX9cLcLvriZrZb+/7Y8+Fd2HlUUbn5N0CDurgAHm0VH1DqyJ9HAw==, + integrity: sha512-lp5xQBbcRuxNtjpWU0BWZgIrv2XLUz4RJ0RqFXBdESIsKoGCQZ6P3wwU5ZPuj5TjssNiKv9AlM+vHopRxZhvVQ==, } engines: { node: ">=12.0.0" } peerDependencies: @@ -2238,10 +2238,10 @@ packages: integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==, } - "@types/node@20.12.12": + "@types/node@20.14.1": resolution: { - integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==, + integrity: sha512-T2MzSGEu+ysB/FkWfqmhV3PLyQlowdptmmgD20C6QxsS8Fmv5SjpZ1ayXaEC0S21/h5UJ9iA6W/5vSNU5l00OA==, } "@types/parse-json@4.0.2": @@ -2292,10 +2292,10 @@ packages: integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, } - "@vitejs/plugin-legacy@5.4.0": + "@vitejs/plugin-legacy@5.4.1": resolution: { - integrity: sha512-Z7o44IbOIir/appjqtVzxnmLeGD8DjWGNm48lfPWZn4hxjzUjTkMX7BDwncpauWAQ/0VIz6uPeMHl3Za0Rw7wA==, + integrity: sha512-kee0l7dVevCNs1l3u2PnihVunvQ0WTJL2UJ/siQGD3Iht546mR9NO16tCv32uCP6lcGO1QDLqlPqInJtV1FE7A==, } engines: { node: ^18.0.0 || >=20.0.0 } peerDependencies: @@ -2319,12 +2319,12 @@ packages: engines: { node: ">=0.4.0" } hasBin: true - adm-zip@0.5.12: + adm-zip@0.5.13: resolution: { - integrity: sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==, + integrity: sha512-4U51tTl9J8UVEcuKGr6zRzY95tWoAa9l+ureGBNmsfleszjZblm5NyEEL/ZQxkhi86co5mZhSvL2T7gkZ6feYQ==, } - engines: { node: ">=6.0" } + engines: { node: ">=12.0" } agent-base@6.0.2: resolution: @@ -2469,10 +2469,10 @@ packages: } engines: { node: ">=10" } - caniuse-lite@1.0.30001623: + caniuse-lite@1.0.30001627: resolution: { - integrity: sha512-X/XhAVKlpIxWPpgRTnlgZssJrF0m6YtRA0QDWgsBNT12uZM6LPRydR7ip405Y3t1LamD8cP2TZFEDZFBf5ApcA==, + integrity: sha512-4zgNiB8nTyV/tHhwZrFs88ryjls/lHiqFhrxCW4qSTeuRByBVnPYpDInchOIySWknznucaf31Z4KYqjfbrecVw==, } ccount@2.0.1: @@ -2641,10 +2641,10 @@ packages: integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==, } - debug@4.3.4: + debug@4.3.5: resolution: { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==, } engines: { node: ">=6.0" } peerDependencies: @@ -2697,10 +2697,10 @@ packages: integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, } - electron-to-chromium@1.4.783: + electron-to-chromium@1.4.788: resolution: { - integrity: sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==, + integrity: sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA==, } end-of-stream@1.4.4: @@ -3282,10 +3282,10 @@ packages: integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, } - meta-json-schema@1.18.5-alpha: + meta-json-schema@1.18.5-alpha4: resolution: { - integrity: sha512-ENjCoAdafLHz27AXzJCls7EnQ1X3JgzX3JPMzYXLzY1zofOxpEd6KeQh1JebAVYbGV9HM0wWSyIoKFRaWcKD5A==, + integrity: sha512-q+JzaM3tMssFPtfu7nxQmILKbJwq08c+0OfRnrdyYwiBaDd0Nim3LPIkiz9vJiuF4c3o5utLU39Q3z8VoUT0qQ==, } micromark-core-commonmark@2.0.1: @@ -3976,10 +3976,10 @@ packages: engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true - sass@1.77.2: + sass@1.77.4: resolution: { - integrity: sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==, + integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==, } engines: { node: ">=14.0.0" } hasBin: true @@ -4329,10 +4329,10 @@ packages: peerDependencies: vite: ^2.6.0 || 3 || 4 || 5 - vite@5.2.11: + vite@5.2.12: resolution: { - integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==, + integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==, } engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true @@ -4450,10 +4450,10 @@ packages: } engines: { node: ">= 6" } - yaml@2.4.2: + yaml@2.4.3: resolution: { - integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==, + integrity: sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==, } engines: { node: ">= 14" } hasBin: true @@ -4504,7 +4504,7 @@ snapshots: "@babel/traverse": 7.24.6 "@babel/types": 7.24.6 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.3.5 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -4559,7 +4559,7 @@ snapshots: "@babel/core": 7.24.6 "@babel/helper-compilation-targets": 7.24.6 "@babel/helper-plugin-utils": 7.24.6 - debug: 4.3.4 + debug: 4.3.5 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -5189,7 +5189,7 @@ snapshots: "@babel/helper-split-export-declaration": 7.24.6 "@babel/parser": 7.24.6 "@babel/types": 7.24.6 - debug: 4.3.4 + debug: 4.3.5 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -5442,25 +5442,25 @@ snapshots: optionalDependencies: "@types/react": 18.3.3 - "@mui/core-downloads-tracker@5.15.18": {} + "@mui/core-downloads-tracker@5.15.19": {} - "@mui/icons-material@5.15.18(@mui/material@5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)": + "@mui/icons-material@5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)": dependencies: "@babel/runtime": 7.24.6 - "@mui/material": 5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@mui/material": 5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: "@types/react": 18.3.3 - "@mui/lab@5.0.0-alpha.149(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@mui/lab@5.0.0-alpha.149(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: "@babel/runtime": 7.24.6 "@mui/base": 5.0.0-beta.20(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@mui/material": 5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@mui/material": 5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@mui/system": 5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) "@mui/types": 7.2.14(@types/react@18.3.3) "@mui/utils": 5.15.14(@types/react@18.3.3)(react@18.3.1) - "@mui/x-tree-view": 6.0.0-alpha.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/base@5.0.0-beta.20(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/material@5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@mui/x-tree-view": 6.0.0-alpha.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/base@5.0.0-beta.20(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 @@ -5470,11 +5470,11 @@ snapshots: "@emotion/styled": 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) "@types/react": 18.3.3 - "@mui/material@5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: "@babel/runtime": 7.24.6 "@mui/base": 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@mui/core-downloads-tracker": 5.15.18 + "@mui/core-downloads-tracker": 5.15.19 "@mui/system": 5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) "@mui/types": 7.2.14(@types/react@18.3.3) "@mui/utils": 5.15.14(@types/react@18.3.3)(react@18.3.1) @@ -5541,10 +5541,10 @@ snapshots: optionalDependencies: "@types/react": 18.3.3 - "@mui/x-data-grid@6.20.0(@mui/material@5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@mui/x-data-grid@6.20.0(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: "@babel/runtime": 7.24.6 - "@mui/material": 5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@mui/material": 5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@mui/system": 5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) "@mui/utils": 5.15.14(@types/react@18.3.3)(react@18.3.1) clsx: 2.1.1 @@ -5555,13 +5555,13 @@ snapshots: transitivePeerDependencies: - "@types/react" - "@mui/x-tree-view@6.0.0-alpha.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/base@5.0.0-beta.20(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/material@5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@mui/x-tree-view@6.0.0-alpha.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/base@5.0.0-beta.20(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: "@babel/runtime": 7.24.6 "@emotion/react": 11.11.4(@types/react@18.3.3)(react@18.3.1) "@emotion/styled": 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) "@mui/base": 5.0.0-beta.20(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@mui/material": 5.15.18(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@mui/material": 5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@mui/system": 5.15.15(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) "@mui/utils": 5.15.14(@types/react@18.3.3)(react@18.3.1) "@types/react-transition-group": 4.4.10 @@ -5845,7 +5845,7 @@ snapshots: "@types/fs-extra@9.0.13": dependencies: - "@types/node": 20.12.12 + "@types/node": 20.14.1 "@types/hast@3.0.4": dependencies: @@ -5867,7 +5867,7 @@ snapshots: "@types/ms@0.7.34": {} - "@types/node@20.12.12": + "@types/node@20.14.1": dependencies: undici-types: 5.26.5 @@ -5894,7 +5894,7 @@ snapshots: "@ungap/structured-clone@1.2.0": {} - "@vitejs/plugin-legacy@5.4.0(terser@5.31.0)(vite@5.2.11(@types/node@20.12.12)(sass@1.77.2)(terser@5.31.0))": + "@vitejs/plugin-legacy@5.4.1(terser@5.31.0)(vite@5.2.12(@types/node@20.14.1)(sass@1.77.4)(terser@5.31.0))": dependencies: "@babel/core": 7.24.6 "@babel/preset-env": 7.24.6(@babel/core@7.24.6) @@ -5905,28 +5905,28 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.31.0 - vite: 5.2.11(@types/node@20.12.12)(sass@1.77.2)(terser@5.31.0) + vite: 5.2.12(@types/node@20.14.1)(sass@1.77.4)(terser@5.31.0) transitivePeerDependencies: - supports-color - "@vitejs/plugin-react@4.3.0(vite@5.2.11(@types/node@20.12.12)(sass@1.77.2)(terser@5.31.0))": + "@vitejs/plugin-react@4.3.0(vite@5.2.12(@types/node@20.14.1)(sass@1.77.4)(terser@5.31.0))": dependencies: "@babel/core": 7.24.6 "@babel/plugin-transform-react-jsx-self": 7.24.6(@babel/core@7.24.6) "@babel/plugin-transform-react-jsx-source": 7.24.6(@babel/core@7.24.6) "@types/babel__core": 7.20.5 react-refresh: 0.14.2 - vite: 5.2.11(@types/node@20.12.12)(sass@1.77.2)(terser@5.31.0) + vite: 5.2.12(@types/node@20.14.1)(sass@1.77.4)(terser@5.31.0) transitivePeerDependencies: - supports-color acorn@8.11.3: {} - adm-zip@0.5.12: {} + adm-zip@0.5.13: {} agent-base@6.0.2: dependencies: - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -6011,8 +6011,8 @@ snapshots: browserslist@4.23.0: dependencies: - caniuse-lite: 1.0.30001623 - electron-to-chromium: 1.4.783 + caniuse-lite: 1.0.30001627 + electron-to-chromium: 1.4.788 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) @@ -6022,7 +6022,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001623: {} + caniuse-lite@1.0.30001627: {} ccount@2.0.1: {} @@ -6113,7 +6113,7 @@ snapshots: dayjs@1.11.5: {} - debug@4.3.4: + debug@4.3.5: dependencies: ms: 2.1.2 @@ -6141,7 +6141,7 @@ snapshots: no-case: 3.0.4 tslib: 2.6.2 - electron-to-chromium@1.4.783: {} + electron-to-chromium@1.4.788: {} end-of-stream@1.4.4: dependencies: @@ -6307,7 +6307,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -6516,7 +6516,7 @@ snapshots: merge-stream@2.0.0: {} - meta-json-schema@1.18.5-alpha: {} + meta-json-schema@1.18.5-alpha4: {} micromark-core-commonmark@2.0.1: dependencies: @@ -6632,7 +6632,7 @@ snapshots: micromark@4.0.0: dependencies: "@types/debug": 4.1.12 - debug: 4.3.4 + debug: 4.3.5 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -6704,7 +6704,7 @@ snapshots: vscode-languageserver-textdocument: 1.0.11 vscode-languageserver-types: 3.17.5 vscode-uri: 3.0.8 - yaml: 2.4.2 + yaml: 2.4.3 mri@1.2.0: {} @@ -6997,7 +6997,7 @@ snapshots: "@rollup/rollup-win32-x64-msvc": 4.18.0 fsevents: 2.3.3 - sass@1.77.2: + sass@1.77.4: dependencies: chokidar: 3.6.0 immutable: 4.3.6 @@ -7180,26 +7180,26 @@ snapshots: dependencies: monaco-editor: 0.49.0 - vite-plugin-svgr@4.2.0(rollup@4.18.0)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.12)(sass@1.77.2)(terser@5.31.0)): + vite-plugin-svgr@4.2.0(rollup@4.18.0)(typescript@5.4.5)(vite@5.2.12(@types/node@20.14.1)(sass@1.77.4)(terser@5.31.0)): dependencies: "@rollup/pluginutils": 5.1.0(rollup@4.18.0) "@svgr/core": 8.1.0(typescript@5.4.5) "@svgr/plugin-jsx": 8.1.0(@svgr/core@8.1.0(typescript@5.4.5)) - vite: 5.2.11(@types/node@20.12.12)(sass@1.77.2)(terser@5.31.0) + vite: 5.2.12(@types/node@20.14.1)(sass@1.77.4)(terser@5.31.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite@5.2.11(@types/node@20.12.12)(sass@1.77.2)(terser@5.31.0): + vite@5.2.12(@types/node@20.14.1)(sass@1.77.4)(terser@5.31.0): dependencies: esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.18.0 optionalDependencies: - "@types/node": 20.12.12 + "@types/node": 20.14.1 fsevents: 2.3.3 - sass: 1.77.2 + sass: 1.77.4 terser: 5.31.0 void-elements@3.1.0: {} @@ -7238,6 +7238,6 @@ snapshots: yaml@1.10.2: {} - yaml@2.4.2: {} + yaml@2.4.3: {} zwitch@2.0.4: {} diff --git a/clash-verge-rev/src-tauri/Cargo.lock b/clash-verge-rev/src-tauri/Cargo.lock index 50433c12ab..a078b5378d 100644 --- a/clash-verge-rev/src-tauri/Cargo.lock +++ b/clash-verge-rev/src-tauri/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -17,17 +17,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.14", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.11" @@ -35,7 +24,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.14", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -97,25 +86,24 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "arboard" -version = "3.3.2" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2041f1943049c7978768d84e6d0fd95de98b76d6c4727b09e78ec253d29fa58" +checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" dependencies = [ "clipboard-win", "core-graphics 0.23.2", - "image", + "image 0.25.1", "log 0.4.21", - "objc", - "objc-foundation", - "objc_id", + "objc2", + "objc2-app-kit", + "objc2-foundation", "parking_lot", - "thiserror", "windows-sys 0.48.0", "wl-clipboard-rs", "x11rb", @@ -140,7 +128,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb" dependencies = [ "event-listener 5.3.0", - "event-listener-strategy 0.5.2", + "event-listener-strategy", "futures-core", "pin-project-lite", ] @@ -158,22 +146,21 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 5.3.0", - "event-listener-strategy 0.5.2", + "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a" +checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" dependencies = [ "async-task", "concurrent-queue", @@ -200,7 +187,7 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ - "async-lock 3.3.0", + "async-lock 3.4.0", "blocking", "futures-lite 2.3.0", ] @@ -231,7 +218,7 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" dependencies = [ - "async-lock 3.3.0", + "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", @@ -255,12 +242,12 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy 0.4.0", + "event-listener 5.3.0", + "event-listener-strategy", "pin-project-lite", ] @@ -298,9 +285,9 @@ version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d" dependencies = [ - "async-channel 2.2.1", + "async-channel 2.3.1", "async-io 2.3.2", - "async-lock 3.3.0", + "async-lock 3.4.0", "async-signal", "async-task", "blocking", @@ -320,17 +307,17 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] name = "async-signal" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afe66191c335039c7bb78f99dc7520b0cbb166b3a1cb33a03f53d8a1c6f2afda" +checksum = "329972aa325176e89114919f2a80fdae4f4c040f66a370b1a1159c6c0f94e7aa" dependencies = [ "async-io 2.3.2", - "async-lock 3.3.0", + "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", @@ -355,7 +342,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -400,15 +387,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" dependencies = [ "addr2line", "cc", @@ -433,9 +420,9 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" @@ -474,13 +461,21 @@ dependencies = [ ] [[package]] -name = "blocking" -version = "1.6.0" +name = "block2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "async-channel 2.2.1", - "async-lock 3.3.0", + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", "async-task", "futures-io", "futures-lite 2.3.0", @@ -517,9 +512,9 @@ dependencies = [ "boa_profiler", "bytemuck", "cfg-if", - "dashmap 5.5.3", + "dashmap", "fast-float", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "icu_normalizer", "indexmap 2.2.6", "intrusive-collections", @@ -554,7 +549,7 @@ checksum = "c055ef3cd87ea7db014779195bc90c6adfc35de4902e3b2fe587adecbd384578" dependencies = [ "boa_macros", "boa_profiler", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "thin-vec", ] @@ -566,7 +561,7 @@ checksum = "0cacc9caf022d92195c827a3e5bf83f96089d4bfaff834b359ac7b6be46e9187" dependencies = [ "boa_gc", "boa_macros", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "indexmap 2.2.6", "once_cell", "phf 0.11.2", @@ -582,7 +577,7 @@ checksum = "6be9c93793b60dac381af475b98634d4b451e28336e72218cad9a20176218dbc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", "synstructure", ] @@ -650,22 +645,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -719,9 +714,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.95" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" [[package]] name = "cesu8" @@ -788,7 +783,7 @@ dependencies = [ [[package]] name = "clash-verge" -version = "1.6.4" +version = "1.6.5" dependencies = [ "anyhow", "auto-launch", @@ -802,7 +797,7 @@ dependencies = [ "log4rs", "nanoid", "once_cell", - "open 5.1.2", + "open 5.1.3", "parking_lot", "percent-encoding", "port_scanner", @@ -900,7 +895,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -982,9 +977,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -1002,9 +997,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -1030,9 +1025,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crypto-common" @@ -1068,7 +1063,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -1078,14 +1073,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -1093,37 +1088,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.60", -] - -[[package]] -name = "dashmap" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" -dependencies = [ - "cfg-if", - "num_cpus", + "syn 2.0.66", ] [[package]] @@ -1133,7 +1118,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", @@ -1161,17 +1146,17 @@ dependencies = [ [[package]] name = "delay_timer" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d70c0d5d2addc05d1e0cf7e60b3a5bf08415f03136a773d7c66b4e4a3b892cef" +checksum = "20eba879b7ee5f1d255d5666e16646fe384f899f71a4c0b4b0644e2e074964fe" dependencies = [ "anyhow", "async-trait", "autocfg", "concat-idents", "cron_clock", - "dashmap 4.0.2", - "event-listener 2.5.3", + "dashmap", + "event-listener 5.3.0", "futures", "log 0.4.21", "lru", @@ -1213,7 +1198,7 @@ checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -1330,7 +1315,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -1371,9 +1356,9 @@ checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" [[package]] name = "either" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "embed-resource" @@ -1384,7 +1369,7 @@ dependencies = [ "cc", "memchr", "rustc_version 0.4.0", - "toml 0.8.12", + "toml 0.8.13", "vswhom", "winreg 0.52.0", ] @@ -1428,7 +1413,7 @@ checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -1439,9 +1424,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1470,17 +1455,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - [[package]] name = "event-listener" version = "5.3.0" @@ -1492,16 +1466,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - [[package]] name = "event-listener-strategy" version = "0.5.2" @@ -1583,9 +1547,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.29" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4556222738635b7a3417ae6130d8f52201e45a0c4d1a907f0826383adb5f85e7" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -1624,7 +1588,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -1742,7 +1706,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -1916,9 +1880,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -1927,9 +1891,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "gio" @@ -2112,15 +2076,15 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http 1.1.0", "indexmap 2.2.6", "slab", @@ -2149,17 +2113,14 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.11", + "ahash", "allocator-api2", ] @@ -2340,7 +2301,7 @@ dependencies = [ "httpdate", "itoa 1.0.11", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -2356,7 +2317,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.4", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "httparse", @@ -2415,9 +2376,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" dependencies = [ "bytes", "futures-channel", @@ -2426,7 +2387,7 @@ dependencies = [ "http-body 1.0.0", "hyper 1.3.1", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tower", "tower-service", @@ -2523,9 +2484,9 @@ checksum = "545c6c3e8bf9580e2dafee8de6f9ec14826aaf359787789c7724f1f85f47d3dc" [[package]] name = "icu_normalizer" -version = "1.4.1" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c183e31ed700f1ecd6b032d104c52fe8b15d028956b73727c97ec176b170e187" +checksum = "accb85c5b2e76f8dade22978b3795ae1e550198c6cfc7e915144e17cd6e2ab56" dependencies = [ "displaydoc", "icu_collections", @@ -2541,15 +2502,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22026918a80e6a9a330cb01b60f950e2b4e5284c59528fd0c6150076ef4c8522" +checksum = "e3744fecc0df9ce19999cdaf1f9f3a48c253431ce1d67ef499128fe9d0b607ab" [[package]] name = "icu_properties" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976e296217453af983efa25f287a4c1da04b9a63bf1ed63719455068e4453eb5" +checksum = "d8173ba888885d250016e957b8ebfd5a65cdb690123d8833a19f6833f9c2b579" dependencies = [ "displaydoc", "icu_collections", @@ -2562,9 +2523,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6a86c0e384532b06b6c104814f9c1b13bcd5b64409001c0d05713a1f3529d99" +checksum = "e70a8b51ee5dd4ff8f20ee9b1dd1bc07afc110886a3747b1fec04cc6e5a15815" [[package]] name = "icu_provider" @@ -2591,7 +2552,7 @@ checksum = "d2abdd3a62551e8337af119c5899e600ca0c88ec8f23a46c60ba216c803dcf1a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -2636,6 +2597,17 @@ dependencies = [ "byteorder", "color_quant", "num-traits", +] + +[[package]] +name = "image" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" +dependencies = [ + "bytemuck", + "byteorder", + "num-traits", "png", "tiff", ] @@ -2658,7 +2630,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "serde", ] @@ -2682,9 +2654,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -2737,7 +2709,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c416c05ba2a10240e022887617af3128fccdbf69713214da0fc81a5690d00df7" dependencies = [ - "ahash 0.8.11", + "ahash", "once_cell", "regex 1.10.4", ] @@ -2842,14 +2814,13 @@ dependencies = [ [[package]] name = "json-patch" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6" +checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" dependencies = [ "serde", "serde_json", "thiserror", - "treediff", ] [[package]] @@ -2903,9 +2874,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libloading" @@ -2951,15 +2922,15 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d642685b028806386b2b6e75685faadd3eb65a85fff7df711ce18446a422da" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" [[package]] name = "lock_api" @@ -3040,11 +3011,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.7.8" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ - "hashbrown 0.12.3", + "hashbrown 0.14.5", ] [[package]] @@ -3173,9 +3144,9 @@ checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" dependencies = [ "adler", "simd-adler32", @@ -3221,11 +3192,10 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static 1.4.0", "libc", "log 0.4.21", "openssl", @@ -3369,11 +3339,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" dependencies = [ - "autocfg", "num-integer", "num-traits", "serde", @@ -3407,9 +3376,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -3463,7 +3432,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -3496,6 +3465,105 @@ dependencies = [ "objc_id", ] +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.5.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.5.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.5.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.5.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.5.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + [[package]] name = "objc_exception" version = "0.1.2" @@ -3516,9 +3584,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" dependencies = [ "memchr", ] @@ -3547,9 +3615,9 @@ dependencies = [ [[package]] name = "open" -version = "5.1.2" +version = "5.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "449f0ff855d85ddbf1edd5b646d65249ead3f5e422aaa86b7d2d0b049b103e32" +checksum = "2eb49fbd5616580e9974662cb96a3463da4476e649a7e4b258df0de065db0657" dependencies = [ "is-wsl", "libc", @@ -3579,7 +3647,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -3674,9 +3742,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -3697,9 +3765,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" @@ -3731,9 +3799,9 @@ checksum = "0a6dda33d67c26f0aac90d324ab2eb7239c819fc7b2552fe9faa4fe88441edc8" [[package]] name = "pest" -version = "2.7.9" +version = "2.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "311fb059dee1a7b802f036316d790138c613a4e8b180c822e3925a662e9f0c95" +checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" dependencies = [ "memchr", "thiserror", @@ -3742,9 +3810,9 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", "indexmap 2.2.6", @@ -3864,7 +3932,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -3911,7 +3979,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -3928,9 +3996,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" dependencies = [ "atomic-waker", "fastrand 2.1.0", @@ -4088,9 +4156,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" dependencies = [ "unicode-ident", ] @@ -4179,7 +4247,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", ] [[package]] @@ -4250,7 +4318,7 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", "libredox", "thiserror", ] @@ -4327,7 +4395,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eae2a1ebfecc58aff952ef8ccd364329abe627762f5bf09ff42eb9d98522479" dependencies = [ - "hashbrown 0.14.3", + "hashbrown 0.14.5", "memchr", ] @@ -4379,12 +4447,12 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" dependencies = [ - "base64 0.22.0", + "base64 0.22.1", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.4", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "http-body-util", @@ -4452,7 +4520,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.14", + "getrandom 0.2.15", "libc", "spin", "untrusted", @@ -4479,9 +4547,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -4504,7 +4572,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.22", + "semver 1.0.23", ] [[package]] @@ -4530,7 +4598,7 @@ dependencies = [ "bitflags 2.5.0", "errno", "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys 0.4.14", "windows-sys 0.52.0", ] @@ -4563,21 +4631,21 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ - "base64 0.22.0", + "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.102.3" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ "ring", "rustls-pki-types", @@ -4586,15 +4654,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "ryu-js" @@ -4634,11 +4702,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "core-foundation", "core-foundation-sys", "libc", @@ -4647,9 +4715,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -4695,9 +4763,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] @@ -4714,14 +4782,14 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" dependencies = [ - "pest 2.7.9", + "pest 2.7.10", ] [[package]] name = "serde" -version = "1.0.199" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] @@ -4738,20 +4806,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.199" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ "indexmap 2.2.6", "itoa 1.0.11", @@ -4767,14 +4835,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -4793,11 +4861,11 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.8.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c85f8e96d1d6857f13768fcbd895fcb06225510022a2774ed8b5150581847b0" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" dependencies = [ - "base64 0.22.0", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", @@ -4811,14 +4879,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.8.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8b3a576c4eb2924262d5951a3b737ccaf16c931e39a2810c36f9a7e25575557" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -5005,9 +5073,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5102,9 +5170,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" @@ -5125,9 +5193,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", @@ -5148,14 +5216,14 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] name = "sysinfo" -version = "0.30.11" +version = "0.30.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87341a165d73787554941cd5ef55ad728011566fe714e987d1b976c15dbc3a83" +checksum = "732ffa00f53e6b2af46208fba5718d9662a421049204e156328b66791ffa15ae" dependencies = [ "cfg-if", "core-foundation-sys", @@ -5169,7 +5237,7 @@ dependencies = [ [[package]] name = "sysproxy" version = "0.3.0" -source = "git+https://github.com/zzzgydi/sysproxy-rs?branch=main#24e8d46cb338a6a8e28742dea6ed993cd6450780" +source = "git+https://github.com/zzzgydi/sysproxy-rs?branch=main#bd912f90ae7f20b75c9278795551c13a7ea4c271" dependencies = [ "interfaces", "iptools", @@ -5223,7 +5291,7 @@ dependencies = [ "cfg-expr 0.15.8", "heck 0.5.0", "pkg-config", - "toml 0.8.12", + "toml 0.8.13", "version-compare 0.2.0", ] @@ -5251,7 +5319,7 @@ dependencies = [ "glib", "glib-sys", "gtk", - "image", + "image 0.24.9", "instant", "jni", "lazy_static 1.4.0", @@ -5312,9 +5380,8 @@ checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "tauri" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "047aefcc7721bfb8024a9bc39d4719112262610502de7a224fa62c4570cd78d4" +version = "1.6.7" +source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" dependencies = [ "anyhow", "base64 0.21.7", @@ -5326,6 +5393,7 @@ dependencies = [ "encoding_rs", "flate2", "futures-util", + "getrandom 0.2.15", "glib", "glob", "gtk", @@ -5349,7 +5417,7 @@ dependencies = [ "regex 1.10.4", "reqwest 0.11.27", "rfd", - "semver 1.0.22", + "semver 1.0.23", "serde", "serde_json", "serde_repr", @@ -5375,16 +5443,15 @@ dependencies = [ [[package]] name = "tauri-build" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9914a4715e0b75d9f387a285c7e26b5bbfeb1249ad9f842675a82481565c532" +version = "1.5.2" +source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" dependencies = [ "anyhow", "cargo_toml", "dirs-next", - "heck 0.4.1", + "heck 0.5.0", "json-patch", - "semver 1.0.22", + "semver 1.0.23", "serde", "serde_json", "tauri-utils", @@ -5394,9 +5461,8 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1554c5857f65dbc377cefb6b97c8ac77b1cb2a90d30d3448114d5d6b48a77fc" +version = "1.4.3" +source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" dependencies = [ "base64 0.21.7", "brotli", @@ -5407,7 +5473,7 @@ dependencies = [ "proc-macro2", "quote", "regex 1.10.4", - "semver 1.0.22", + "semver 1.0.23", "serde", "serde_json", "sha2 0.10.8", @@ -5420,11 +5486,10 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "277abf361a3a6993ec16bcbb179de0d6518009b851090a01adfea12ac89fa875" +version = "1.4.4" +source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "syn 1.0.109", @@ -5434,9 +5499,8 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2d0652aa2891ff3e9caa2401405257ea29ab8372cce01f186a5825f1bd0e76" +version = "0.14.3" +source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" dependencies = [ "gtk", "http 0.2.12", @@ -5455,9 +5519,8 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "067c56fc153b3caf406d7cd6de4486c80d1d66c0f414f39e94cb2f5543f6445f" +version = "0.14.8" +source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" dependencies = [ "arboard", "cocoa 0.24.1", @@ -5476,15 +5539,14 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ad0bbb31fccd1f4c56275d0a5c3abdf1f59999f72cb4ef8b79b4ed42082a21" +version = "1.5.4" +source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" dependencies = [ "brotli", "ctor", "dunce", "glob", - "heck 0.4.1", + "heck 0.5.0", "html5ever", "infer 0.13.0", "json-patch", @@ -5494,7 +5556,7 @@ dependencies = [ "phf 0.11.2", "proc-macro2", "quote", - "semver 1.0.22", + "semver 1.0.23", "serde", "serde_json", "serde_with", @@ -5616,22 +5678,22 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -5710,9 +5772,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ "displaydoc", "zerovec", @@ -5735,9 +5797,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -5747,20 +5809,20 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.6", + "socket2 0.5.7", "tokio-macros", "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -5798,16 +5860,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -5833,21 +5894,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.12" +version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "a4e43f8cc456c9704c851ae29c67e17ef65d2c30017c17a9765b89c382dc8bba" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.12", + "toml_edit 0.22.13", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] @@ -5878,15 +5939,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.12" +version = "0.22.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +checksum = "c127785850e8c20836d49732ae6abfa47616e60bf9d9f57c43c250361a9db96c" dependencies = [ "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.7", + "winnow 0.6.9", ] [[package]] @@ -5902,7 +5963,6 @@ dependencies = [ "tokio", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -5937,7 +5997,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -5981,9 +6041,9 @@ dependencies = [ [[package]] name = "tree_magic_mini" -version = "3.1.4" +version = "3.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ee137597cdb361b55a4746983e4ac1b35ab6024396a419944ad473bb915265" +checksum = "469a727cac55b41448315cc10427c069c618ac59bb6a4480283fcd811749bdc2" dependencies = [ "fnv", "home", @@ -5993,15 +6053,6 @@ dependencies = [ "petgraph", ] -[[package]] -name = "treediff" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5" -dependencies = [ - "serde_json", -] - [[package]] name = "try-lock" version = "0.2.5" @@ -6180,7 +6231,7 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", ] [[package]] @@ -6244,9 +6295,9 @@ dependencies = [ [[package]] name = "waker-fn" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "walkdir" @@ -6329,7 +6380,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", "wasm-bindgen-shared", ] @@ -6363,7 +6414,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6389,9 +6440,9 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40" +checksum = "34e9e6b6d4a2bb4e7e69433e0b35c7923b95d4dc8503a84d25ec917a4bbfdf07" dependencies = [ "cc", "downcast-rs", @@ -6403,9 +6454,9 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.2" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f" +checksum = "1e63801c85358a431f986cffa74ba9599ff571fc5774ac113ed3b490c19a1133" dependencies = [ "bitflags 2.5.0", "rustix 0.38.34", @@ -6440,9 +6491,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283" +checksum = "67da50b9f80159dec0ea4c11c13e24ef9e7574bd6ce24b01860a175010cea565" dependencies = [ "proc-macro2", "quick-xml", @@ -6451,9 +6502,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" +checksum = "105b1842da6554f91526c14a2a2172897b7f745a805d62af4ce698706be79c12" dependencies = [ "dlib", "log 0.4.21", @@ -6730,7 +6781,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -6741,7 +6792,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -7041,9 +7092,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.7" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578" +checksum = "86c949fede1d13936a99f14fafd3e76fd642b556dd2ce96287fbe2e0151bfac6" dependencies = [ "memchr", ] @@ -7105,15 +7156,15 @@ checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] name = "writeable" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad7bb64b8ef9c0aa27b6da38b452b0ee9fd82beaf276a87dd796fb55cbae14e" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.24.8" +version = "0.24.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a04e72739ee84a218e3dbf8625888eadc874285637003ed21ab96a1bbbb538ec" +checksum = "00711278ed357350d44c749c286786ecac644e044e4da410d466212152383b45" dependencies = [ "base64 0.13.1", "block", @@ -7170,9 +7221,9 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "gethostname", "rustix 0.38.34", @@ -7181,9 +7232,9 @@ dependencies = [ [[package]] name = "x11rb-protocol" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "xattr" @@ -7192,7 +7243,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys 0.4.14", "rustix 0.38.34", ] @@ -7214,9 +7265,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e71b2e4f287f467794c671e2b8f8a5f3716b3c829079a1c44740148eff07e4" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" dependencies = [ "serde", "stable_deref_trait", @@ -7226,33 +7277,32 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", "synstructure", ] [[package]] name = "zbus" -version = "4.1.2" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ff46f2a25abd690ed072054733e0bc3157e3d4c45f41bd183dce09c2ff8ab9" +checksum = "989c3977a7aafa97b12b9a35d21cdcff9b0d2289762b14683f45d66b1ba6c48f" dependencies = [ "async-broadcast", "async-executor", "async-fs 2.1.2", "async-io 2.3.2", - "async-lock 3.3.0", + "async-lock 3.4.0", "async-process 2.2.2", "async-recursion", "async-task", "async-trait", "blocking", - "derivative", "enumflags2", "event-listener 5.3.0", "futures-core", @@ -7277,15 +7327,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "4.1.2" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0e3852c93dcdb49c9462afe67a2a468f7bd464150d866e861eaf06208633e0" +checksum = "6fe9de53245dcf426b7be226a4217dd5e339080e5d46e64a02d6e5dcbf90fca1" dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "regex 1.10.4", - "syn 1.0.109", + "syn 2.0.66", "zvariant_utils", ] @@ -7302,56 +7351,56 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] name = "zerofrom" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", "synstructure", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zerovec" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff4439ae91fb5c72b8abc12f3f2dbf51bd27e6eadb9f8a5bc8898dddb0e27ea" +checksum = "bb2cc8827d6c0994478a15c53f374f46fbd41bea663d809b14744bc42e6b109c" dependencies = [ "yoke", "zerofrom", @@ -7360,13 +7409,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4e5997cbf58990550ef1f0e5124a05e47e1ebd33a84af25739be6031a62c20" +checksum = "97cf56601ee5052b4417d90c8755c6683473c926039908196cf35d99f893ebe7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.66", ] [[package]] @@ -7382,9 +7431,9 @@ dependencies = [ [[package]] name = "zvariant" -version = "4.0.2" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1b3ca6db667bfada0f1ebfc94b2b1759ba25472ee5373d4551bb892616389a" +checksum = "9aa6d31a02fbfb602bfde791de7fedeb9c2c18115b3d00f3a36e489f46ffbbc7" dependencies = [ "endi", "enumflags2", @@ -7395,24 +7444,24 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "4.0.2" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a4b236063316163b69039f77ce3117accb41a09567fd24c168e43491e521bc" +checksum = "642bf1b6b6d527988b3e8193d20969d53700a36eac734d21ae6639db168701c8" dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.66", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" +checksum = "fc242db087efc22bd9ade7aa7809e4ba828132edc312871584a6b4391bdf8786" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.66", ] diff --git a/clash-verge-rev/src-tauri/Cargo.toml b/clash-verge-rev/src-tauri/Cargo.toml index 7a9165026b..71d5dded7c 100644 --- a/clash-verge-rev/src-tauri/Cargo.toml +++ b/clash-verge-rev/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clash-verge" -version = "1.6.4" +version = "1.6.5" description = "clash verge" authors = ["zzzgydi", "wonfen", "MystiPanda"] license = "GPL-3.0-only" @@ -10,13 +10,13 @@ edition = "2021" build = "build.rs" [build-dependencies] -tauri-build = { version = "1", features = [] } +tauri-build = { git="https://github.com/Pylogmon/tauri",branch = "1.x", features = [] } [dependencies] warp = "0.3" anyhow = "1.0" dirs = "5.0" -open = "5.0" +open = "5.1" log = "0.4" dunce = "1.0" log4rs = "1" @@ -26,9 +26,9 @@ sysinfo = "0.30" boa_engine = "0.18" serde_json = "1.0" serde_yaml = "0.9" -once_cell = "1.18" +once_cell = "1.19" port_scanner = "0.1.5" -delay_timer = "0.11.5" +delay_timer = "0.11" parking_lot = "0.12" percent-encoding = "2.3.1" window-shadows = { version = "0.2" } @@ -37,8 +37,7 @@ serde = { version = "1.0", features = ["derive"] } reqwest = { version = "0.12", features = ["json", "rustls-tls"] } sysproxy = { git="https://github.com/zzzgydi/sysproxy-rs", branch = "main" } auto-launch = { git="https://github.com/zzzgydi/auto-launch", branch = "main" } -tauri = { version = "1.6", features = [ "fs-read-file", "fs-exists", "path-all", "protocol-asset", "dialog-open", "notification-all", "icon-png", "icon-ico", "clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all", "devtools"] } - +tauri = { git="https://github.com/Pylogmon/tauri",branch = "1.x", features = [ "fs-read-file", "fs-exists", "path-all", "protocol-asset", "dialog-open", "notification-all", "icon-png", "icon-ico", "clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all", "devtools"] } [target.'cfg(windows)'.dependencies] runas = "=1.2.0" deelevate = "0.2.0" diff --git a/clash-verge-rev/src-tauri/src/feat.rs b/clash-verge-rev/src-tauri/src/feat.rs index f590351615..8f0f2efd81 100644 --- a/clash-verge-rev/src-tauri/src/feat.rs +++ b/clash-verge-rev/src-tauri/src/feat.rs @@ -385,11 +385,19 @@ pub async fn test_delay(url: String) -> Result { .get(url).header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"); let start = Instant::now(); - let response = request.send().await?; - if response.status().is_success() { - let delay = start.elapsed().as_millis() as u32; - Ok(delay) - } else { - Ok(10000u32) + let response = request.send().await; + match response { + Ok(response) => { + log::trace!(target: "app", "test_delay response: {:#?}", response); + if response.status().is_success() { + Ok(start.elapsed().as_millis() as u32) + } else { + Ok(10000u32) + } + } + Err(err) => { + log::trace!(target: "app", "test_delay error: {:#?}", err); + Err(err.into()) + } } } diff --git a/clash-verge-rev/src-tauri/tauri.conf.json b/clash-verge-rev/src-tauri/tauri.conf.json index 6ad011d4ae..84d7d9a944 100644 --- a/clash-verge-rev/src-tauri/tauri.conf.json +++ b/clash-verge-rev/src-tauri/tauri.conf.json @@ -2,7 +2,7 @@ "$schema": "../node_modules/@tauri-apps/cli/schema.json", "package": { "productName": "Clash Verge", - "version": "1.6.4" + "version": "1.6.5" }, "build": { "distDir": "../dist", @@ -75,7 +75,7 @@ }, "windows": [], "security": { - "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self';" + "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: asset: 'unsafe-eval' 'unsafe-inline' 'self';" } } } diff --git a/clash-verge-rev/src-tauri/tauri.linux.conf.json b/clash-verge-rev/src-tauri/tauri.linux.conf.json index ec1e7b5820..6300207260 100644 --- a/clash-verge-rev/src-tauri/tauri.linux.conf.json +++ b/clash-verge-rev/src-tauri/tauri.linux.conf.json @@ -6,10 +6,20 @@ }, "bundle": { "identifier": "io.github.clash-verge-rev.clash-verge-rev", - "targets": ["deb", "appimage", "updater"], + "targets": ["deb", "rpm", "appimage", "updater"], "deb": { "depends": ["openssl"], - "desktopTemplate": "./template/clash-verge.desktop" + "desktopTemplate": "./template/clash-verge.desktop", + "provides": ["clash-verge", "clash-meta"], + "conflicts": ["clash-verge", "clash-meta"], + "replaces": ["clash-verge", "clash-meta"] + }, + "rpm": { + "depends": ["openssl"], + "desktopTemplate": "./template/clash-verge.desktop", + "provides": ["clash-verge", "clash-meta"], + "conflicts": ["clash-verge", "clash-meta"], + "obsoletes": ["clash-verge", "clash-meta"] } } } diff --git a/clash-verge-rev/src/assets/image/test/apple.svg b/clash-verge-rev/src/assets/image/test/apple.svg new file mode 100644 index 0000000000..70b04ed548 --- /dev/null +++ b/clash-verge-rev/src/assets/image/test/apple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/clash-verge-rev/src/assets/image/test/github.svg b/clash-verge-rev/src/assets/image/test/github.svg new file mode 100644 index 0000000000..0baedc70fc --- /dev/null +++ b/clash-verge-rev/src/assets/image/test/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/clash-verge-rev/src/assets/image/test/google.svg b/clash-verge-rev/src/assets/image/test/google.svg new file mode 100644 index 0000000000..b8bd3e9609 --- /dev/null +++ b/clash-verge-rev/src/assets/image/test/google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/clash-verge-rev/src/assets/image/test/youtube.svg b/clash-verge-rev/src/assets/image/test/youtube.svg new file mode 100644 index 0000000000..1afee17835 --- /dev/null +++ b/clash-verge-rev/src/assets/image/test/youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/clash-verge-rev/src/components/connection/connection-item.tsx b/clash-verge-rev/src/components/connection/connection-item.tsx index 5924800ae5..fa4a48a86b 100644 --- a/clash-verge-rev/src/components/connection/connection-item.tsx +++ b/clash-verge-rev/src/components/connection/connection-item.tsx @@ -19,6 +19,7 @@ const Tag = styled("span")(({ theme }) => ({ border: "1px solid", borderRadius: 4, borderColor: alpha(theme.palette.text.secondary, 0.35), + marginTop: "4px", marginRight: "4px", })); diff --git a/clash-verge-rev/src/components/test/test-viewer.tsx b/clash-verge-rev/src/components/test/test-viewer.tsx index 21918c4f7c..00d7f8d08b 100644 --- a/clash-verge-rev/src/components/test/test-viewer.tsx +++ b/clash-verge-rev/src/components/test/test-viewer.tsx @@ -39,7 +39,7 @@ export const TestViewer = forwardRef((props, ref) => { } return x; }); - await patchVerge({ ...verge, test_list: newList }); + await patchVerge({ test_list: newList }); }; useImperativeHandle(ref, () => ({ diff --git a/clash-verge-rev/src/pages/_theme.tsx b/clash-verge-rev/src/pages/_theme.tsx index 68bddf244b..ec8a92cd91 100644 --- a/clash-verge-rev/src/pages/_theme.tsx +++ b/clash-verge-rev/src/pages/_theme.tsx @@ -4,14 +4,14 @@ const OS = getSystem(); // default theme setting export const defaultTheme = { primary_color: "#007AFF", - secondary_color: "#fc9b76", + secondary_color: "#FC9B76", primary_text: "#000000", - secondary_text: "#3c3c4399", + secondary_text: "#3C3C4399", info_color: "#007AFF", error_color: "#FF3B30", warning_color: "#FF9500", success_color: "#06943D", - background_color: "#f5f5f5", + background_color: "#F5F5F5", font_family: `-apple-system, BlinkMacSystemFont,"Microsoft YaHei UI", "Microsoft YaHei", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji"${ OS === "windows" ? ", twemoji mozilla" : "" }`, @@ -22,9 +22,9 @@ export const defaultDarkTheme = { ...defaultTheme, primary_color: "#0A84FF", secondary_color: "#FF9F0A", - primary_text: "#ffffff", - background_color: "#2e303d", - secondary_text: "#ebebf599", + primary_text: "#FFFFFF", + background_color: "#2E303D", + secondary_text: "#EBEBF599", info_color: "#0A84FF", error_color: "#FF453A", warning_color: "#FF9F0A", diff --git a/clash-verge-rev/src/pages/connections.tsx b/clash-verge-rev/src/pages/connections.tsx index 96c9a03824..8494427cfd 100644 --- a/clash-verge-rev/src/pages/connections.tsx +++ b/clash-verge-rev/src/pages/connections.tsx @@ -1,14 +1,6 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { useLockFn } from "ahooks"; -import { - Box, - Button, - IconButton, - MenuItem, - Select, - SelectProps, - styled, -} from "@mui/material"; +import { Box, Button, IconButton, MenuItem } from "@mui/material"; import { useRecoilState } from "recoil"; import { Virtuoso } from "react-virtuoso"; import { useTranslation } from "react-i18next"; @@ -34,7 +26,7 @@ const initConn = { uploadTotal: 0, downloadTotal: 0, connections: [] }; type OrderFunc = (list: IConnectionsItem[]) => IConnectionsItem[]; const ConnectionsPage = () => { - const { t, i18n } = useTranslation(); + const { t } = useTranslation(); const { clashInfo } = useClashInfo(); const { theme } = useCustomTheme(); const isDark = theme.palette.mode === "dark"; @@ -130,7 +122,7 @@ const ConnectionsPage = () => { return ( {t("Connections")}} contentStyle={{ height: "100%" }} header={ @@ -159,7 +151,7 @@ const ConnectionsPage = () => { } @@ -209,7 +201,7 @@ const ConnectionsPage = () => { ) : ( ( + itemContent={(_, item) => ( detailRef.current?.open(item)} diff --git a/clash-verge-rev/src/pages/test.tsx b/clash-verge-rev/src/pages/test.tsx index f3c73bb0fa..dc6fa6bfd3 100644 --- a/clash-verge-rev/src/pages/test.tsx +++ b/clash-verge-rev/src/pages/test.tsx @@ -22,6 +22,12 @@ import { TestItem } from "@/components/test/test-item"; import { emit } from "@tauri-apps/api/event"; import { nanoid } from "nanoid"; +// test icons +import apple from "@/assets/image/test/apple.svg?raw"; +import github from "@/assets/image/test/github.svg?raw"; +import google from "@/assets/image/test/google.svg?raw"; +import youtube from "@/assets/image/test/youtube.svg?raw"; + const TestPage = () => { const { t } = useTranslation(); const sensors = useSensors( @@ -38,19 +44,25 @@ const TestPage = () => { uid: nanoid(), name: "Apple", url: "https://www.apple.com", - icon: "https://www.apple.com/favicon.ico", + icon: apple, }, { uid: nanoid(), name: "GitHub", url: "https://www.github.com", - icon: ``, + icon: github, }, { uid: nanoid(), name: "Google", url: "https://www.google.com", - icon: ``, + icon: google, + }, + { + uid: nanoid(), + name: "Youtube", + url: "https://www.youtube.com", + icon: youtube, }, ]; diff --git a/clash-verge-rev/vite.config.ts b/clash-verge-rev/vite.config.ts index 4c47fa861c..9e4f714084 100644 --- a/clash-verge-rev/vite.config.ts +++ b/clash-verge-rev/vite.config.ts @@ -12,10 +12,12 @@ export default defineConfig({ svgr(), react(), legacy({ - targets: ["edge>=109", "safari>=13"], + renderLegacyChunks: false, + modernTargets: ["edge>=109", "safari>=13"], modernPolyfills: true, - polyfills: ["web.structured-clone"], additionalModernPolyfills: [ + "core-js/modules/es.object.has-own.js", + "core-js/modules/web.structured-clone.js", path.resolve("./src/polyfills/matchMedia.js"), path.resolve("./src/polyfills/WeakRef.js"), path.resolve("./src/polyfills/RegExp.js"), diff --git a/dns-over-https/doh-server/ietf.go b/dns-over-https/doh-server/ietf.go index c3535b14b5..a4503a9d68 100644 --- a/dns-over-https/doh-server/ietf.go +++ b/dns-over-https/doh-server/ietf.go @@ -62,7 +62,7 @@ func (s *Server) parseRequestIETF(ctx context.Context, w http.ResponseWriter, r if len(requestBinary) == 0 { return &DNSRequest{ errcode: 400, - errtext: fmt.Sprintf("Invalid argument value: \"dns\""), + errtext: "Invalid argument value: \"dns\"", } } diff --git a/echo/cf-workers/ws/.editorconfig b/echo/cf-workers/ws/.editorconfig new file mode 100644 index 0000000000..a727df347a --- /dev/null +++ b/echo/cf-workers/ws/.editorconfig @@ -0,0 +1,12 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = tab +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.yml] +indent_style = space diff --git a/echo/cf-workers/ws/.gitignore b/echo/cf-workers/ws/.gitignore new file mode 100644 index 0000000000..3b0fe33c47 --- /dev/null +++ b/echo/cf-workers/ws/.gitignore @@ -0,0 +1,172 @@ +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# wrangler project + +.dev.vars +.wrangler/ diff --git a/echo/cf-workers/ws/.prettierrc b/echo/cf-workers/ws/.prettierrc new file mode 100644 index 0000000000..5c7b5d3c7a --- /dev/null +++ b/echo/cf-workers/ws/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 140, + "singleQuote": true, + "semi": true, + "useTabs": true +} diff --git a/echo/cf-workers/ws/package-lock.json b/echo/cf-workers/ws/package-lock.json new file mode 100644 index 0000000000..b4414da761 --- /dev/null +++ b/echo/cf-workers/ws/package-lock.json @@ -0,0 +1,5047 @@ +{ + "name": "ws", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "ws", + "version": "0.0.0", + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.1.0", + "@cloudflare/workers-types": "^4.20240603.0", + "typescript": "^5.0.4", + "vitest": "1.3.0", + "wrangler": "^3.0.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.2.tgz", + "integrity": "sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==", + "dev": true, + "dependencies": { + "mime": "^3.0.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@cloudflare/vitest-pool-workers": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@cloudflare/vitest-pool-workers/-/vitest-pool-workers-0.1.19.tgz", + "integrity": "sha512-fb3rxrihwd4OsBf4mALlezo6nnuL5p/BopGu47MeV5LlTjP3sGFT1QYbXsdv6rfNsxBGSP7uAahCWBhTsNFy0w==", + "dev": true, + "dependencies": { + "birpc": "0.2.14", + "cjs-module-lexer": "^1.2.3", + "devalue": "^4.3.0", + "esbuild": "0.17.19", + "miniflare": "3.20240405.1", + "wrangler": "3.50.0", + "zod": "^3.20.6" + }, + "peerDependencies": { + "@vitest/runner": "1.3.0", + "@vitest/snapshot": "1.3.0", + "vitest": "1.3.0" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/node_modules/@cloudflare/kv-asset-handler": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.1.tgz", + "integrity": "sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==", + "dev": true, + "dependencies": { + "mime": "^3.0.0" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/node_modules/wrangler": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.50.0.tgz", + "integrity": "sha512-JlLuch+6DtaC5HGp8YD9Au++XvMv34g3ySdlB5SyPbaObELi8P9ZID5vgyf9AA75djzxL7cuNOk1YdKCJEuq0w==", + "dev": true, + "dependencies": { + "@cloudflare/kv-asset-handler": "0.3.1", + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", + "blake3-wasm": "^2.1.5", + "chokidar": "^3.5.3", + "esbuild": "0.17.19", + "miniflare": "3.20240405.1", + "nanoid": "^3.3.3", + "path-to-regexp": "^6.2.0", + "resolve": "^1.22.8", + "resolve.exports": "^2.0.2", + "selfsigned": "^2.0.1", + "source-map": "0.6.1", + "ts-json-schema-generator": "^1.5.0", + "xxhash-wasm": "^1.0.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=16.17.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20240405.0" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240405.0.tgz", + "integrity": "sha512-ut8kwpHmlz9dNSjoov6v1b6jS50J46Mj9QcMA0t1Hne36InaQk/qqPSd12fN5p2GesZ9OOBJvBdDsTblVdyJ1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240405.0.tgz", + "integrity": "sha512-x3A3Ym+J2DH1uYnw0aedeKOTnUebEo312+Aladv7bFri97pjRJcqVbYhMtOHLkHjwYn7bpKSY2eL5iM+0XT29A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240405.0.tgz", + "integrity": "sha512-3tYpfjtxEQ0R30Pna7OF3Bz0CTx30hc0QNtH61KnkvXtaeYMkWutSKQKXIuVlPa/7v1MHp+8ViBXMflmS7HquA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240405.0.tgz", + "integrity": "sha512-NpKZlvmdgcX/m4tP5zM91AfJpZrue2/GRA+Sl3szxAivu2uE5jDVf5SS9dzqzCVfPrdhylqH7yeL4U/cafFNOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240405.0.tgz", + "integrity": "sha512-REBeJMxvUCjwuEVzSSIBtzAyM69QjToab8qBst0S9vdih+9DObym4dw8CevdBQhDbFrHiyL9E6pAZpLPNHVgCw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workers-types": { + "version": "4.20240603.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240603.0.tgz", + "integrity": "sha512-KmsjZcd/dPWM51FoT08cvUGCq9l3nFEriloQ12mcdJPoW911Gi5S/9Cq4xeFvTrtk9TJ2krvxP23IeobecRmOQ==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", + "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", + "dev": true, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild-plugins/node-modules-polyfill": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", + "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" + }, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitest/expect": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.0.tgz", + "integrity": "sha512-7bWt0vBTZj08B+Ikv70AnLRicohYwFgzNjFqo9SxxqHHxSlUJGSXmCRORhOnRMisiUryKMdvsi1n27Bc6jL9DQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "1.3.0", + "@vitest/utils": "1.3.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.3.0.tgz", + "integrity": "sha512-1Jb15Vo/Oy7mwZ5bXi7zbgszsdIBNjc4IqP8Jpr/8RdBC4nF1CTzIAn2dxYvpF1nGSseeL39lfLQ2uvs5u1Y9A==", + "dev": true, + "dependencies": { + "@vitest/utils": "1.3.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.0.tgz", + "integrity": "sha512-swmktcviVVPYx9U4SEQXLV6AEY51Y6bZ14jA2yo6TgMxQ3h+ZYiO0YhAHGJNp0ohCFbPAis1R9kK0cvN6lDPQA==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.0.tgz", + "integrity": "sha512-AkCU0ThZunMvblDpPKgjIi025UxR8V7MZ/g/EwmAGpjIujLVV2X6rGYGmxE2D4FJbAy0/ijdROHMWa2M/6JVMw==", + "dev": true, + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.0.tgz", + "integrity": "sha512-/LibEY/fkaXQufi4GDlQZhikQsPO2entBKtfuyIpr1jV4DpaeasqkeHjhdOhU24vSHshcSuEyVlWdzvv2XmYCw==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "dependencies": { + "printable-characters": "^1.0.42" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birpc": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.14.tgz", + "integrity": "sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/capnp-ts": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", + "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", + "dev": true, + "dependencies": { + "debug": "^4.3.1", + "tslib": "^2.2.0" + } + }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "dev": true + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/devalue": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.3.tgz", + "integrity": "sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==", + "dev": true + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/miniflare": { + "version": "3.20240405.1", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240405.1.tgz", + "integrity": "sha512-oShOR/ckr9JTO1bkPQH0nXvuSgJjoE+E5+M1tvP01Q8Z+Q0GJnzU2+FDYUH8yIK/atHv7snU8yy0X6KWVn1YdQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "acorn": "^8.8.0", + "acorn-walk": "^8.2.0", + "capnp-ts": "^0.7.0", + "exit-hook": "^2.2.1", + "glob-to-regexp": "^0.4.1", + "stoppable": "^1.1.0", + "undici": "^5.28.2", + "workerd": "1.20240405.0", + "ws": "^8.11.0", + "youch": "^3.2.2", + "zod": "^3.20.6" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", + "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", + "dev": true, + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.0", + "pathe": "^1.1.2" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/rollup": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-inject/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/rollup-plugin-inject/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, + "dependencies": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", + "dev": true, + "dependencies": { + "js-tokens": "^9.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tinybench": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", + "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-json-schema-generator": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-1.5.1.tgz", + "integrity": "sha512-apX5qG2+NA66j7b4AJm8q/DpdTeOsjfh7A3LpKsUiil0FepkNwtN28zYgjrsiiya2/OPhsr/PSjX5FUYg79rCg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.15", + "commander": "^12.0.0", + "glob": "^8.0.3", + "json5": "^2.2.3", + "normalize-path": "^3.0.0", + "safe-stable-stringify": "^2.4.3", + "typescript": "~5.4.2" + }, + "bin": { + "ts-json-schema-generator": "bin/ts-json-schema-generator" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "dev": true + }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/vite": { + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz", + "integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.3.0.tgz", + "integrity": "sha512-D/oiDVBw75XMnjAXne/4feCkCEwcbr2SU1bjAhCcfI5Bq3VoOHji8/wCPAfUkDIeohJ5nSZ39fNxM3dNZ6OBOA==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/vitest": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.3.0.tgz", + "integrity": "sha512-V9qb276J1jjSx9xb75T2VoYXdO1UKi+qfflY7V7w93jzX7oA/+RtYE6TcifxksxsZvygSSMwu2Uw6di7yqDMwg==", + "dev": true, + "dependencies": { + "@vitest/expect": "1.3.0", + "@vitest/runner": "1.3.0", + "@vitest/snapshot": "1.3.0", + "@vitest/spy": "1.3.0", + "@vitest/utils": "1.3.0", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.3.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.3.0", + "@vitest/ui": "1.3.0", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/workerd": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240405.0.tgz", + "integrity": "sha512-AWrOSBh4Ll7sBWHuh0aywm8hDkKqsZmcwnDB0PVGszWZM5mndNBI5iJ/8haXVpdoyqkJQEVdhET9JDi4yU8tRg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20240405.0", + "@cloudflare/workerd-darwin-arm64": "1.20240405.0", + "@cloudflare/workerd-linux-64": "1.20240405.0", + "@cloudflare/workerd-linux-arm64": "1.20240405.0", + "@cloudflare/workerd-windows-64": "1.20240405.0" + } + }, + "node_modules/wrangler": { + "version": "3.59.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.59.0.tgz", + "integrity": "sha512-MLKejazUJrekbD8EnQfN6d7fei+IGnq2aVXeILFDy0aTktVNXKvO+eC+mND1zOr+k0KvQN4sJo8vGwqYoY7btw==", + "dev": true, + "dependencies": { + "@cloudflare/kv-asset-handler": "0.3.2", + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", + "blake3-wasm": "^2.1.5", + "chokidar": "^3.5.3", + "esbuild": "0.17.19", + "miniflare": "3.20240524.2", + "nanoid": "^3.3.3", + "path-to-regexp": "^6.2.0", + "resolve": "^1.22.8", + "resolve.exports": "^2.0.2", + "selfsigned": "^2.0.1", + "source-map": "0.6.1", + "xxhash-wasm": "^1.0.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=16.17.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20240524.0" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/wrangler/node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240524.0.tgz", + "integrity": "sha512-ATaXjefbTsrv4mpn4Fdua114RRDXcX5Ky+Mv+f4JTUllgalmqC4CYMN4jxRz9IpJU/fNMN8IEfvUyuJBAcl9Iw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/wrangler/node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240524.0.tgz", + "integrity": "sha512-wnbsZI4CS0QPCd+wnBHQ40C28A/2Qo4ESi1YhE2735G3UNcc876MWksZhsubd+XH0XPIra6eNFqyw6wRMpQOXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/wrangler/node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240524.0.tgz", + "integrity": "sha512-E8mj+HPBryKwaJAiNsYzXtVjKCL0KvUBZbtxJxlWM4mLSQhT+uwGT3nydb/hFY59rZnQgZslw0oqEWht5TEYiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/wrangler/node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240524.0.tgz", + "integrity": "sha512-/Fr1W671t2triNCDCBWdStxngnbUfZunZ/2e4kaMLzJDJLYDtYdmvOUCBDzUD4ssqmIMbn9RCQQ0U+CLEoqBqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/wrangler/node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240524.0.tgz", + "integrity": "sha512-G+ThDEx57g9mAEKqhWnHaaJgpeGYtyhkmwM/BDpLqPks/rAY5YEfZbY4YL1pNk1kkcZDXGrwIsY8xe9Apf5JdA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/wrangler/node_modules/miniflare": { + "version": "3.20240524.2", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240524.2.tgz", + "integrity": "sha512-Js+8cB61KJG0z2HuQTPLT9S6FwTBuMZfjtml3azUarLYsCF91N+PhIkvNpbkwCXcfRvscdjJ0RlT6lBQYEuIwA==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "acorn": "^8.8.0", + "acorn-walk": "^8.2.0", + "capnp-ts": "^0.7.0", + "exit-hook": "^2.2.1", + "glob-to-regexp": "^0.4.1", + "stoppable": "^1.1.0", + "undici": "^5.28.2", + "workerd": "1.20240524.0", + "ws": "^8.11.0", + "youch": "^3.2.2", + "zod": "^3.20.6" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/wrangler/node_modules/workerd": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240524.0.tgz", + "integrity": "sha512-LWLe5D8PVHBcqturmBbwgI71r7YPpIMYZoVEH6S4G35EqIJ55cb0n3FipoSyraoIfpcCxCFxX1K6WsRHbP3pFA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20240524.0", + "@cloudflare/workerd-darwin-arm64": "1.20240524.0", + "@cloudflare/workerd-linux-64": "1.20240524.0", + "@cloudflare/workerd-linux-arm64": "1.20240524.0", + "@cloudflare/workerd-windows-64": "1.20240524.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xxhash-wasm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/youch": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz", + "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==", + "dev": true, + "dependencies": { + "cookie": "^0.5.0", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + }, + "dependencies": { + "@cloudflare/kv-asset-handler": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.2.tgz", + "integrity": "sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==", + "dev": true, + "requires": { + "mime": "^3.0.0" + } + }, + "@cloudflare/vitest-pool-workers": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@cloudflare/vitest-pool-workers/-/vitest-pool-workers-0.1.19.tgz", + "integrity": "sha512-fb3rxrihwd4OsBf4mALlezo6nnuL5p/BopGu47MeV5LlTjP3sGFT1QYbXsdv6rfNsxBGSP7uAahCWBhTsNFy0w==", + "dev": true, + "requires": { + "birpc": "0.2.14", + "cjs-module-lexer": "^1.2.3", + "devalue": "^4.3.0", + "esbuild": "0.17.19", + "miniflare": "3.20240405.1", + "wrangler": "3.50.0", + "zod": "^3.20.6" + }, + "dependencies": { + "@cloudflare/kv-asset-handler": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.1.tgz", + "integrity": "sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==", + "dev": true, + "requires": { + "mime": "^3.0.0" + } + }, + "wrangler": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.50.0.tgz", + "integrity": "sha512-JlLuch+6DtaC5HGp8YD9Au++XvMv34g3ySdlB5SyPbaObELi8P9ZID5vgyf9AA75djzxL7cuNOk1YdKCJEuq0w==", + "dev": true, + "requires": { + "@cloudflare/kv-asset-handler": "0.3.1", + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", + "blake3-wasm": "^2.1.5", + "chokidar": "^3.5.3", + "esbuild": "0.17.19", + "fsevents": "~2.3.2", + "miniflare": "3.20240405.1", + "nanoid": "^3.3.3", + "path-to-regexp": "^6.2.0", + "resolve": "^1.22.8", + "resolve.exports": "^2.0.2", + "selfsigned": "^2.0.1", + "source-map": "0.6.1", + "ts-json-schema-generator": "^1.5.0", + "xxhash-wasm": "^1.0.1" + } + } + } + }, + "@cloudflare/workerd-darwin-64": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240405.0.tgz", + "integrity": "sha512-ut8kwpHmlz9dNSjoov6v1b6jS50J46Mj9QcMA0t1Hne36InaQk/qqPSd12fN5p2GesZ9OOBJvBdDsTblVdyJ1w==", + "dev": true, + "optional": true + }, + "@cloudflare/workerd-darwin-arm64": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240405.0.tgz", + "integrity": "sha512-x3A3Ym+J2DH1uYnw0aedeKOTnUebEo312+Aladv7bFri97pjRJcqVbYhMtOHLkHjwYn7bpKSY2eL5iM+0XT29A==", + "dev": true, + "optional": true + }, + "@cloudflare/workerd-linux-64": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240405.0.tgz", + "integrity": "sha512-3tYpfjtxEQ0R30Pna7OF3Bz0CTx30hc0QNtH61KnkvXtaeYMkWutSKQKXIuVlPa/7v1MHp+8ViBXMflmS7HquA==", + "dev": true, + "optional": true + }, + "@cloudflare/workerd-linux-arm64": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240405.0.tgz", + "integrity": "sha512-NpKZlvmdgcX/m4tP5zM91AfJpZrue2/GRA+Sl3szxAivu2uE5jDVf5SS9dzqzCVfPrdhylqH7yeL4U/cafFNOg==", + "dev": true, + "optional": true + }, + "@cloudflare/workerd-windows-64": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240405.0.tgz", + "integrity": "sha512-REBeJMxvUCjwuEVzSSIBtzAyM69QjToab8qBst0S9vdih+9DObym4dw8CevdBQhDbFrHiyL9E6pAZpLPNHVgCw==", + "dev": true, + "optional": true + }, + "@cloudflare/workers-types": { + "version": "4.20240603.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240603.0.tgz", + "integrity": "sha512-KmsjZcd/dPWM51FoT08cvUGCq9l3nFEriloQ12mcdJPoW911Gi5S/9Cq4xeFvTrtk9TJ2krvxP23IeobecRmOQ==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@esbuild-plugins/node-globals-polyfill": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", + "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", + "dev": true, + "requires": {} + }, + "@esbuild-plugins/node-modules-polyfill": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", + "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + "dev": true, + "requires": { + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" + } + }, + "@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "dev": true, + "optional": true + }, + "@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true + }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "dev": true, + "optional": true + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@vitest/expect": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.0.tgz", + "integrity": "sha512-7bWt0vBTZj08B+Ikv70AnLRicohYwFgzNjFqo9SxxqHHxSlUJGSXmCRORhOnRMisiUryKMdvsi1n27Bc6jL9DQ==", + "dev": true, + "requires": { + "@vitest/spy": "1.3.0", + "@vitest/utils": "1.3.0", + "chai": "^4.3.10" + } + }, + "@vitest/runner": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.3.0.tgz", + "integrity": "sha512-1Jb15Vo/Oy7mwZ5bXi7zbgszsdIBNjc4IqP8Jpr/8RdBC4nF1CTzIAn2dxYvpF1nGSseeL39lfLQ2uvs5u1Y9A==", + "dev": true, + "requires": { + "@vitest/utils": "1.3.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + } + }, + "@vitest/snapshot": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.0.tgz", + "integrity": "sha512-swmktcviVVPYx9U4SEQXLV6AEY51Y6bZ14jA2yo6TgMxQ3h+ZYiO0YhAHGJNp0ohCFbPAis1R9kK0cvN6lDPQA==", + "dev": true, + "requires": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + } + }, + "@vitest/spy": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.0.tgz", + "integrity": "sha512-AkCU0ThZunMvblDpPKgjIi025UxR8V7MZ/g/EwmAGpjIujLVV2X6rGYGmxE2D4FJbAy0/ijdROHMWa2M/6JVMw==", + "dev": true, + "requires": { + "tinyspy": "^2.2.0" + } + }, + "@vitest/utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.0.tgz", + "integrity": "sha512-/LibEY/fkaXQufi4GDlQZhikQsPO2entBKtfuyIpr1jV4DpaeasqkeHjhdOhU24vSHshcSuEyVlWdzvv2XmYCw==", + "dev": true, + "requires": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + } + }, + "acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true + }, + "acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true + }, + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "requires": { + "printable-characters": "^1.0.42" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true + }, + "birpc": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.14.tgz", + "integrity": "sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==", + "dev": true + }, + "blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true + }, + "capnp-ts": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", + "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", + "dev": true, + "requires": { + "debug": "^4.3.1", + "tslib": "^2.2.0" + } + }, + "chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + } + }, + "check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "requires": { + "get-func-name": "^2.0.2" + } + }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "dev": true + }, + "commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true + }, + "confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true + }, + "debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "devalue": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.3.tgz", + "integrity": "sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==", + "dev": true + }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true + }, + "esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0" + } + }, + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + } + }, + "exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true + }, + "get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "requires": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "requires": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + } + }, + "loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.1" + } + }, + "magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "miniflare": { + "version": "3.20240405.1", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240405.1.tgz", + "integrity": "sha512-oShOR/ckr9JTO1bkPQH0nXvuSgJjoE+E5+M1tvP01Q8Z+Q0GJnzU2+FDYUH8yIK/atHv7snU8yy0X6KWVn1YdQ==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "0.8.1", + "acorn": "^8.8.0", + "acorn-walk": "^8.2.0", + "capnp-ts": "^0.7.0", + "exit-hook": "^2.2.1", + "glob-to-regexp": "^0.4.1", + "stoppable": "^1.1.0", + "undici": "^5.28.2", + "workerd": "1.20240405.0", + "ws": "^8.11.0", + "youch": "^3.2.2", + "zod": "^3.20.6" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "mlly": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "dev": true, + "requires": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true + }, + "pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pkg-types": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", + "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", + "dev": true, + "requires": { + "confbox": "^0.1.7", + "mlly": "^1.7.0", + "pathe": "^1.1.2" + } + }, + "postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + } + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true + }, + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true + }, + "rollup": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "@types/estree": "1.0.5", + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, + "requires": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + } + } + }, + "safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "dev": true + }, + "selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "requires": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "requires": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, + "std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true + }, + "stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, + "strip-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", + "dev": true, + "requires": { + "js-tokens": "^9.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "tinybench": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", + "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", + "dev": true + }, + "tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "dev": true + }, + "tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-json-schema-generator": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-1.5.1.tgz", + "integrity": "sha512-apX5qG2+NA66j7b4AJm8q/DpdTeOsjfh7A3LpKsUiil0FepkNwtN28zYgjrsiiya2/OPhsr/PSjX5FUYg79rCg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.15", + "commander": "^12.0.0", + "glob": "^8.0.3", + "json5": "^2.2.3", + "normalize-path": "^3.0.0", + "safe-stable-stringify": "^2.4.3", + "typescript": "~5.4.2" + } + }, + "tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true + }, + "ufo": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "dev": true + }, + "undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dev": true, + "requires": { + "@fastify/busboy": "^2.0.0" + } + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "vite": { + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz", + "integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==", + "dev": true, + "requires": { + "esbuild": "^0.20.1", + "fsevents": "~2.3.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + } + } + }, + "vite-node": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.3.0.tgz", + "integrity": "sha512-D/oiDVBw75XMnjAXne/4feCkCEwcbr2SU1bjAhCcfI5Bq3VoOHji8/wCPAfUkDIeohJ5nSZ39fNxM3dNZ6OBOA==", + "dev": true, + "requires": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + } + }, + "vitest": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.3.0.tgz", + "integrity": "sha512-V9qb276J1jjSx9xb75T2VoYXdO1UKi+qfflY7V7w93jzX7oA/+RtYE6TcifxksxsZvygSSMwu2Uw6di7yqDMwg==", + "dev": true, + "requires": { + "@vitest/expect": "1.3.0", + "@vitest/runner": "1.3.0", + "@vitest/snapshot": "1.3.0", + "@vitest/spy": "1.3.0", + "@vitest/utils": "1.3.0", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.3.0", + "why-is-node-running": "^2.2.2" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "requires": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + } + }, + "workerd": { + "version": "1.20240405.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240405.0.tgz", + "integrity": "sha512-AWrOSBh4Ll7sBWHuh0aywm8hDkKqsZmcwnDB0PVGszWZM5mndNBI5iJ/8haXVpdoyqkJQEVdhET9JDi4yU8tRg==", + "dev": true, + "requires": { + "@cloudflare/workerd-darwin-64": "1.20240405.0", + "@cloudflare/workerd-darwin-arm64": "1.20240405.0", + "@cloudflare/workerd-linux-64": "1.20240405.0", + "@cloudflare/workerd-linux-arm64": "1.20240405.0", + "@cloudflare/workerd-windows-64": "1.20240405.0" + } + }, + "wrangler": { + "version": "3.59.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.59.0.tgz", + "integrity": "sha512-MLKejazUJrekbD8EnQfN6d7fei+IGnq2aVXeILFDy0aTktVNXKvO+eC+mND1zOr+k0KvQN4sJo8vGwqYoY7btw==", + "dev": true, + "requires": { + "@cloudflare/kv-asset-handler": "0.3.2", + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", + "blake3-wasm": "^2.1.5", + "chokidar": "^3.5.3", + "esbuild": "0.17.19", + "fsevents": "~2.3.2", + "miniflare": "3.20240524.2", + "nanoid": "^3.3.3", + "path-to-regexp": "^6.2.0", + "resolve": "^1.22.8", + "resolve.exports": "^2.0.2", + "selfsigned": "^2.0.1", + "source-map": "0.6.1", + "xxhash-wasm": "^1.0.1" + }, + "dependencies": { + "@cloudflare/workerd-darwin-64": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240524.0.tgz", + "integrity": "sha512-ATaXjefbTsrv4mpn4Fdua114RRDXcX5Ky+Mv+f4JTUllgalmqC4CYMN4jxRz9IpJU/fNMN8IEfvUyuJBAcl9Iw==", + "dev": true, + "optional": true + }, + "@cloudflare/workerd-darwin-arm64": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240524.0.tgz", + "integrity": "sha512-wnbsZI4CS0QPCd+wnBHQ40C28A/2Qo4ESi1YhE2735G3UNcc876MWksZhsubd+XH0XPIra6eNFqyw6wRMpQOXA==", + "dev": true, + "optional": true + }, + "@cloudflare/workerd-linux-64": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240524.0.tgz", + "integrity": "sha512-E8mj+HPBryKwaJAiNsYzXtVjKCL0KvUBZbtxJxlWM4mLSQhT+uwGT3nydb/hFY59rZnQgZslw0oqEWht5TEYiQ==", + "dev": true, + "optional": true + }, + "@cloudflare/workerd-linux-arm64": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240524.0.tgz", + "integrity": "sha512-/Fr1W671t2triNCDCBWdStxngnbUfZunZ/2e4kaMLzJDJLYDtYdmvOUCBDzUD4ssqmIMbn9RCQQ0U+CLEoqBqw==", + "dev": true, + "optional": true + }, + "@cloudflare/workerd-windows-64": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240524.0.tgz", + "integrity": "sha512-G+ThDEx57g9mAEKqhWnHaaJgpeGYtyhkmwM/BDpLqPks/rAY5YEfZbY4YL1pNk1kkcZDXGrwIsY8xe9Apf5JdA==", + "dev": true, + "optional": true + }, + "miniflare": { + "version": "3.20240524.2", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240524.2.tgz", + "integrity": "sha512-Js+8cB61KJG0z2HuQTPLT9S6FwTBuMZfjtml3azUarLYsCF91N+PhIkvNpbkwCXcfRvscdjJ0RlT6lBQYEuIwA==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "0.8.1", + "acorn": "^8.8.0", + "acorn-walk": "^8.2.0", + "capnp-ts": "^0.7.0", + "exit-hook": "^2.2.1", + "glob-to-regexp": "^0.4.1", + "stoppable": "^1.1.0", + "undici": "^5.28.2", + "workerd": "1.20240524.0", + "ws": "^8.11.0", + "youch": "^3.2.2", + "zod": "^3.20.6" + } + }, + "workerd": { + "version": "1.20240524.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240524.0.tgz", + "integrity": "sha512-LWLe5D8PVHBcqturmBbwgI71r7YPpIMYZoVEH6S4G35EqIJ55cb0n3FipoSyraoIfpcCxCFxX1K6WsRHbP3pFA==", + "dev": true, + "requires": { + "@cloudflare/workerd-darwin-64": "1.20240524.0", + "@cloudflare/workerd-darwin-arm64": "1.20240524.0", + "@cloudflare/workerd-linux-64": "1.20240524.0", + "@cloudflare/workerd-linux-arm64": "1.20240524.0", + "@cloudflare/workerd-windows-64": "1.20240524.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "ws": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "dev": true, + "requires": {} + }, + "xxhash-wasm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", + "dev": true + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + }, + "youch": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz", + "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==", + "dev": true, + "requires": { + "cookie": "^0.5.0", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" + } + }, + "zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true + } + } +} diff --git a/echo/cf-workers/ws/package.json b/echo/cf-workers/ws/package.json new file mode 100644 index 0000000000..60a776acf2 --- /dev/null +++ b/echo/cf-workers/ws/package.json @@ -0,0 +1,19 @@ +{ + "name": "ws", + "version": "0.0.0", + "private": true, + "scripts": { + "deploy": "wrangler deploy", + "dev": "wrangler dev", + "start": "wrangler dev", + "test": "vitest", + "cf-typegen": "wrangler types" + }, + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.1.0", + "@cloudflare/workers-types": "^4.20240603.0", + "typescript": "^5.0.4", + "vitest": "1.3.0", + "wrangler": "^3.0.0" + } +} diff --git a/echo/cf-workers/ws/src/index.ts b/echo/cf-workers/ws/src/index.ts new file mode 100644 index 0000000000..6e217bd7fa --- /dev/null +++ b/echo/cf-workers/ws/src/index.ts @@ -0,0 +1,92 @@ +/** + * Welcome to Cloudflare Workers! This is your first worker. + * + * - Run `npm run dev` in your terminal to start a development server + * - Open a browser tab at http://localhost:8787/ to see your worker in action + * - Run `npm run deploy` to publish your worker + * + * Bind resources to your worker in `wrangler.toml`. After adding bindings, a type definition for the + * `Env` object can be regenerated with `npm run cf-typegen`. + * + * Learn more at https://developers.cloudflare.com/workers/ + */ +import { connect } from 'cloudflare:sockets'; + +async function handleRequest(request) { + const upgradeHeader = request.headers.get('Upgrade'); + if (!upgradeHeader || upgradeHeader !== 'websocket') { + return new Response('Expected Upgrade: websocket', { status: 426 }); + } + + const url = new URL(request.url); + const queryParams = url.searchParams; + const remoteAddr = queryParams.get('remote_addr'); + + const webSocketPair = new WebSocketPair(); + const [client, server] = Object.values(webSocketPair); + server.accept(); + + const tcpSocket = connect(remoteAddr); + + function closeAll() { + client.close(); + server.close(); + tcpSocket.close(); + } + + const readableStream = new ReadableStream({ + start(controller) { + server.addEventListener('message', (event) => { + controller.enqueue(event.data); + }); + server.addEventListener('close', () => { + controller.close(); + closeAll(); + }); + server.addEventListener('error', (err) => { + controller.error(err); + closeAll(); + }); + }, + }); + + const writableStream = new WritableStream({ + write(chunk) { + server.send(chunk); + }, + close() { + closeAll(); + }, + abort(err) { + console.error('Stream error:', err); + closeAll(); + }, + }); + + readableStream + .pipeTo(tcpSocket.writable) + .then(() => console.log('All data successfully written!')) + .catch((e) => { + console.error('Something went wrong on read!', e.message); + closeAll(); + }); + + tcpSocket.readable + .pipeTo(writableStream) + .then(() => console.log('All data successfully written!')) + .catch((e) => { + console.error('Something went wrong on write!', e.message); + closeAll(); + }); + + return new Response(null, { + status: 101, + webSocket: client, + }); +} + +export default { + async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { + return handleRequest(request); + }, +}; diff --git a/echo/cf-workers/ws/tsconfig.json b/echo/cf-workers/ws/tsconfig.json new file mode 100644 index 0000000000..91924903c2 --- /dev/null +++ b/echo/cf-workers/ws/tsconfig.json @@ -0,0 +1,104 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2021" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "lib": ["es2021"] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, + "jsx": "react" /* Specify what JSX code is generated. */, + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "es2022" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "Bundler" /* Specify how TypeScript looks up a file from a given module specifier. */, + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + "types": [ + "@cloudflare/workers-types/2023-07-01" + ] /* Specify type package names to be included without being referenced in a source file. */, + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + "resolveJsonModule": true /* Enable importing .json files */, + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */, + "checkJs": false /* Enable error reporting in type-checked JavaScript files. */, + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + "noEmit": true /* Disable emitting files from a compilation. */, + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + "isolatedModules": true /* Ensure that each file can be safely transpiled without relying on other imports. */, + "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + // "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "exclude": ["test"] +} diff --git a/echo/cf-workers/ws/vitest.config.ts b/echo/cf-workers/ws/vitest.config.ts new file mode 100644 index 0000000000..973627c268 --- /dev/null +++ b/echo/cf-workers/ws/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config"; + +export default defineWorkersConfig({ + test: { + poolOptions: { + workers: { + wrangler: { configPath: "./wrangler.toml" }, + }, + }, + }, +}); diff --git a/echo/cf-workers/ws/worker-configuration.d.ts b/echo/cf-workers/ws/worker-configuration.d.ts new file mode 100644 index 0000000000..5b2319b3f2 --- /dev/null +++ b/echo/cf-workers/ws/worker-configuration.d.ts @@ -0,0 +1,4 @@ +// Generated by Wrangler +// After adding bindings to `wrangler.toml`, regenerate this interface via `npm run cf-typegen` +interface Env { +} diff --git a/echo/cf-workers/ws/wrangler.toml b/echo/cf-workers/ws/wrangler.toml new file mode 100644 index 0000000000..26f2da7fe0 --- /dev/null +++ b/echo/cf-workers/ws/wrangler.toml @@ -0,0 +1,108 @@ +#:schema node_modules/wrangler/config-schema.json +name = "ws" +main = "src/index.ts" +compatibility_date = "2024-06-03" +compatibility_flags = ["nodejs_compat"] + +# Automatically place your workloads in an optimal location to minimize latency. +# If you are running back-end logic in a Worker, running it closer to your back-end infrastructure +# rather than the end user may result in better performance. +# Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement +# [placement] +# mode = "smart" + +# Variable bindings. These are arbitrary, plaintext strings (similar to environment variables) +# Docs: +# - https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables +# Note: Use secrets to store sensitive data. +# - https://developers.cloudflare.com/workers/configuration/secrets/ +# [vars] +# MY_VARIABLE = "production_value" + +# Bind the Workers AI model catalog. Run machine learning models, powered by serverless GPUs, on Cloudflare’s global network +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#workers-ai +# [ai] +# binding = "AI" + +# Bind an Analytics Engine dataset. Use Analytics Engine to write analytics within your Pages Function. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#analytics-engine-datasets +# [[analytics_engine_datasets]] +# binding = "MY_DATASET" + +# Bind a headless browser instance running on Cloudflare's global network. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#browser-rendering +# [browser] +# binding = "MY_BROWSER" + +# Bind a D1 database. D1 is Cloudflare’s native serverless SQL database. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#d1-databases +# [[d1_databases]] +# binding = "MY_DB" +# database_name = "my-database" +# database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + +# Bind a dispatch namespace. Use Workers for Platforms to deploy serverless functions programmatically on behalf of your customers. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#dispatch-namespace-bindings-workers-for-platforms +# [[dispatch_namespaces]] +# binding = "MY_DISPATCHER" +# namespace = "my-namespace" + +# Bind a Durable Object. Durable objects are a scale-to-zero compute primitive based on the actor model. +# Durable Objects can live for as long as needed. Use these when you need a long-running "server", such as in realtime apps. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#durable-objects +# [[durable_objects.bindings]] +# name = "MY_DURABLE_OBJECT" +# class_name = "MyDurableObject" + +# Durable Object migrations. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#migrations +# [[migrations]] +# tag = "v1" +# new_classes = ["MyDurableObject"] + +# Bind a Hyperdrive configuration. Use to accelerate access to your existing databases from Cloudflare Workers. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#hyperdrive +# [[hyperdrive]] +# binding = "MY_HYPERDRIVE" +# id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +# Bind a KV Namespace. Use KV as persistent storage for small key-value pairs. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#kv-namespaces +# [[kv_namespaces]] +# binding = "MY_KV_NAMESPACE" +# id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +# Bind an mTLS certificate. Use to present a client certificate when communicating with another service. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#mtls-certificates +# [[mtls_certificates]] +# binding = "MY_CERTIFICATE" +# certificate_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + +# Bind a Queue producer. Use this binding to schedule an arbitrary task that may be processed later by a Queue consumer. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#queues +# [[queues.producers]] +# binding = "MY_QUEUE" +# queue = "my-queue" + +# Bind a Queue consumer. Queue Consumers can retrieve tasks scheduled by Producers to act on them. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#queues +# [[queues.consumers]] +# queue = "my-queue" + +# Bind an R2 Bucket. Use R2 to store arbitrarily large blobs of data, such as files. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#r2-buckets +# [[r2_buckets]] +# binding = "MY_BUCKET" +# bucket_name = "my-bucket" + +# Bind another Worker service. Use this binding to call another Worker without network overhead. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings +# [[services]] +# binding = "MY_SERVICE" +# service = "my-service" + +# Bind a Vectorize index. Use to store and query vector embeddings for semantic search, classification and other vector search use-cases. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#vectorize-indexes +# [[vectorize]] +# binding = "MY_INDEX" +# index_name = "my-index" diff --git a/echo/examples/cf-ws.json b/echo/examples/cf-ws.json new file mode 100644 index 0000000000..0294138d56 --- /dev/null +++ b/echo/examples/cf-ws.json @@ -0,0 +1,15 @@ +{ + "web_port": 9000, + "relay_configs": [ + { + "listen": "127.0.0.1:1235", + "listen_type": "raw", + "transport_type": "ws", + "tcp_remotes": ["ws://0.0.0.0:8787"], + "ws_config": { + "path": "pwd", + "remote_addr": "127.0.0.1:5201" + } + } + ] +} diff --git a/echo/examples/with_ping.json b/echo/examples/with_ping.json index c1a111fc53..78c26e8b3f 100644 --- a/echo/examples/with_ping.json +++ b/echo/examples/with_ping.json @@ -2,6 +2,7 @@ "web_port": 9000, "log_level": "info", "enable_ping": true, + "relay_sync_interval": 6, "relay_configs": [ { "listen": "127.0.0.1:1234", diff --git a/echo/examples/ws_config.json b/echo/examples/ws_config.json new file mode 100644 index 0000000000..58172c0dcc --- /dev/null +++ b/echo/examples/ws_config.json @@ -0,0 +1,24 @@ +{ + "relay_configs": [ + { + "listen": "127.0.0.1:1235", + "listen_type": "raw", + "transport_type": "ws", + "tcp_remotes": ["ws://0.0.0.0:2443"], + "ws_config": { + "path": "pwd", + "remote_addr": "127.0.0.1:5201" + } + }, + { + "listen": "127.0.0.1:2443", + "listen_type": "ws", + "transport_type": "raw", + "tcp_remotes": ["0.0.0.0:5201"], + "ws_config": { + "path": "pwd", + "remote_addr": "127.0.0.1:5201" + } + } + ] +} diff --git a/echo/internal/cli/cmd.go b/echo/internal/cli/cmd.go index d1f6bbb590..6e006e4e96 100644 --- a/echo/internal/cli/cmd.go +++ b/echo/internal/cli/cmd.go @@ -15,7 +15,7 @@ After=network.target [Service] LimitNOFILE=65535 -ExecStart=/root/ehco -c "" +ExecStart=ehco -c "" Restart=always [Install] diff --git a/echo/internal/cmgr/cmgr.go b/echo/internal/cmgr/cmgr.go index 387c25d93b..560ac509aa 100644 --- a/echo/internal/cmgr/cmgr.go +++ b/echo/internal/cmgr/cmgr.go @@ -7,7 +7,7 @@ import ( "time" "github.com/Ehco1996/ehco/internal/conn" - "github.com/Ehco1996/ehco/pkg/node_metric" + "github.com/Ehco1996/ehco/pkg/metric_reader" "go.uber.org/zap" ) @@ -39,7 +39,7 @@ type cmgrImpl struct { lock sync.RWMutex cfg *Config l *zap.SugaredLogger - mr node_metric.Reader + mr metric_reader.Reader // k: relay label, v: connection list activeConnectionsMap map[string][]conn.RelayConn @@ -54,7 +54,7 @@ func NewCmgr(cfg *Config) Cmgr { closedConnectionsMap: make(map[string][]conn.RelayConn), } if cfg.NeedMetrics() { - cmgr.mr = node_metric.NewReader(cfg.MetricsURL) + cmgr.mr = metric_reader.NewReader(cfg.MetricsURL) } return cmgr } diff --git a/echo/internal/cmgr/config.go b/echo/internal/cmgr/config.go index 265ac807cd..12e475cf63 100644 --- a/echo/internal/cmgr/config.go +++ b/echo/internal/cmgr/config.go @@ -3,9 +3,9 @@ package cmgr var DummyConfig = &Config{} type Config struct { - SyncURL string `json:"sync_url,omitempty"` - MetricsURL string `json:"metrics_url,omitempty"` - SyncInterval int `json:"sync_interval,omitempty"` // in seconds + SyncURL string + MetricsURL string + SyncInterval int // in seconds } func (c *Config) NeedSync() bool { diff --git a/echo/internal/cmgr/metric_sync.go b/echo/internal/cmgr/metric_sync.go index 63df84e4c3..267166e31c 100644 --- a/echo/internal/cmgr/metric_sync.go +++ b/echo/internal/cmgr/metric_sync.go @@ -7,7 +7,7 @@ import ( "github.com/Ehco1996/ehco/internal/conn" "github.com/Ehco1996/ehco/internal/constant" myhttp "github.com/Ehco1996/ehco/pkg/http" - "github.com/Ehco1996/ehco/pkg/node_metric" + "github.com/Ehco1996/ehco/pkg/metric_reader" "go.uber.org/zap" ) @@ -26,9 +26,9 @@ type VersionInfo struct { } type syncReq struct { - Version VersionInfo `json:"version"` - Node node_metric.NodeMetrics `json:"node"` - Stats []StatsPerRule `json:"stats"` + Version VersionInfo `json:"version"` + Node metric_reader.NodeMetrics `json:"node"` + Stats []StatsPerRule `json:"stats"` } func (cm *cmgrImpl) syncOnce(ctx context.Context) error { diff --git a/echo/internal/relay/conf/cfg.go b/echo/internal/relay/conf/cfg.go index a42aab3b65..eea710d1bb 100644 --- a/echo/internal/relay/conf/cfg.go +++ b/echo/internal/relay/conf/cfg.go @@ -3,6 +3,7 @@ package conf import ( "errors" "fmt" + "net/url" "github.com/Ehco1996/ehco/internal/constant" @@ -11,10 +12,17 @@ import ( ) const ( - ProtocolHTTP = "http" - ProtocolTLS = "tls" + ProtocolHTTP = "http" + ProtocolTLS = "tls" + WS_HANDSHAKE_PATH = "handshake" + WS_QUERY_REMOTE_ADDR = "remote_addr" ) +type WSConfig struct { + Path string `json:"path,omitempty"` + RemoteAddr string `json:"remote_addr,omitempty"` +} + type Config struct { Listen string `json:"listen"` ListenType string `json:"listen_type"` @@ -22,9 +30,28 @@ type Config struct { TCPRemotes []string `json:"tcp_remotes"` UDPRemotes []string `json:"udp_remotes"` - Label string `json:"label,omitempty"` - MaxConnection int `json:"max_connection,omitempty"` - BlockedProtocols []string `json:"blocked_protocols,omitempty"` + Label string `json:"label,omitempty"` + MaxConnection int `json:"max_connection,omitempty"` + BlockedProtocols []string `json:"blocked_protocols,omitempty"` + WSConfig *WSConfig `json:"ws_config,omitempty"` +} + +func (r *Config) GetWSHandShakePath() string { + if r.WSConfig != nil && r.WSConfig.Path != "" { + return r.WSConfig.Path + } + return WS_HANDSHAKE_PATH +} + +func (r *Config) GetWSRemoteAddr(baseAddr string) (string, error) { + addr, err := url.JoinPath(baseAddr, r.GetWSHandShakePath()) + if err != nil { + return "", err + } + if r.WSConfig != nil && r.WSConfig.RemoteAddr != "" { + addr += fmt.Sprintf("?%s=%s", WS_QUERY_REMOTE_ADDR, r.WSConfig.RemoteAddr) + } + return addr, nil } func (r *Config) Validate() error { diff --git a/echo/internal/relay/relay.go b/echo/internal/relay/relay.go index 0964b66eba..2e8829400a 100644 --- a/echo/internal/relay/relay.go +++ b/echo/internal/relay/relay.go @@ -19,12 +19,12 @@ func (r *Relay) UniqueID() string { return r.cfg.Label } -func NewRelay(cfg *conf.Config, connMgr cmgr.Cmgr) (*Relay, error) { - base := transporter.NewBaseTransporter(cfg, connMgr) - s, err := transporter.NewRelayServer(cfg.ListenType, base) +func NewRelay(cfg *conf.Config, cmgr cmgr.Cmgr) (*Relay, error) { + s, err := transporter.NewRelayServer(cfg, cmgr) if err != nil { return nil, err } + r := &Relay{ relayServer: s, cfg: cfg, diff --git a/echo/internal/transporter/base.go b/echo/internal/transporter/base.go index 6ebca196da..6f38630b81 100644 --- a/echo/internal/transporter/base.go +++ b/echo/internal/transporter/base.go @@ -19,10 +19,11 @@ import ( ) type baseTransporter struct { + cfg *conf.Config + l *zap.SugaredLogger + cmgr cmgr.Cmgr - cfg *conf.Config tCPRemotes lb.RoundRobin - l *zap.SugaredLogger } func NewBaseTransporter(cfg *conf.Config, cmgr cmgr.Cmgr) *baseTransporter { diff --git a/echo/internal/transporter/interface.go b/echo/internal/transporter/interface.go index da40fe537c..360f896620 100644 --- a/echo/internal/transporter/interface.go +++ b/echo/internal/transporter/interface.go @@ -3,7 +3,9 @@ package transporter import ( "net" + "github.com/Ehco1996/ehco/internal/cmgr" "github.com/Ehco1996/ehco/internal/constant" + "github.com/Ehco1996/ehco/internal/relay/conf" "github.com/Ehco1996/ehco/pkg/lb" ) @@ -14,8 +16,8 @@ type RelayClient interface { RelayTCPConn(c net.Conn, handshakeF TCPHandShakeF) error } -func NewRelayClient(relayType string, base *baseTransporter) (RelayClient, error) { - switch relayType { +func newRelayClient(base *baseTransporter) (RelayClient, error) { + switch base.cfg.TransportType { case constant.RelayTypeRaw: return newRawClient(base) case constant.RelayTypeWS: @@ -27,7 +29,7 @@ func NewRelayClient(relayType string, base *baseTransporter) (RelayClient, error case constant.RelayTypeMTCP: return newMtcpClient(base) default: - panic("unsupported transport type") + panic("unsupported transport type" + base.cfg.TransportType) } } @@ -36,8 +38,9 @@ type RelayServer interface { Close() error } -func NewRelayServer(relayType string, base *baseTransporter) (RelayServer, error) { - switch relayType { +func NewRelayServer(cfg *conf.Config, cmgr cmgr.Cmgr) (RelayServer, error) { + base := NewBaseTransporter(cfg, cmgr) + switch cfg.ListenType { case constant.RelayTypeRaw: return newRawServer(base) case constant.RelayTypeWS: @@ -49,6 +52,6 @@ func NewRelayServer(relayType string, base *baseTransporter) (RelayServer, error case constant.RelayTypeMTCP: return newMtcpServer(base) default: - panic("unsupported transport type") + panic("unsupported transport type" + cfg.ListenType) } } diff --git a/echo/internal/transporter/raw.go b/echo/internal/transporter/raw.go index c52df4651d..7f1b5940ad 100644 --- a/echo/internal/transporter/raw.go +++ b/echo/internal/transporter/raw.go @@ -57,7 +57,7 @@ func newRawServer(base *baseTransporter) (*RawServer, error) { if err != nil { return nil, err } - relayer, err := NewRelayClient(base.cfg.TransportType, base) + relayer, err := newRelayClient(base) if err != nil { return nil, err } @@ -80,6 +80,7 @@ func (s *RawServer) ListenAndServe() error { return err } go func(c net.Conn) { + defer c.Close() if err := s.RelayTCPConn(c, s.relayer.TCPHandShake); err != nil { s.l.Errorf("RelayTCPConn error: %s", err.Error()) } diff --git a/echo/internal/transporter/ws.go b/echo/internal/transporter/ws.go index 37e4d6c313..a41eb45a6c 100644 --- a/echo/internal/transporter/ws.go +++ b/echo/internal/transporter/ws.go @@ -8,6 +8,7 @@ import ( "github.com/gobwas/ws" "github.com/labstack/echo/v4" + "go.uber.org/zap" "github.com/Ehco1996/ehco/internal/conn" "github.com/Ehco1996/ehco/internal/constant" @@ -37,7 +38,11 @@ func newWsClient(base *baseTransporter) (*WsClient, error) { func (s *WsClient) TCPHandShake(remote *lb.Node) (net.Conn, error) { t1 := time.Now() - wsc, _, _, err := s.dialer.Dial(context.TODO(), remote.Address+"/handshake/") + addr, err := s.cfg.GetWSRemoteAddr(remote.Address) + if err != nil { + return nil, err + } + wsc, _, _, err := s.dialer.Dial(context.TODO(), addr) if err != nil { return nil, err } @@ -68,10 +73,13 @@ func newWsServer(base *baseTransporter) (*WsServer, error) { }, } e := web.NewEchoServer() + e.Use(web.NginxLogMiddleware(zap.S().Named("ws-server"))) + e.GET("/", echo.WrapHandler(web.MakeIndexF())) - e.GET("/handshake/", echo.WrapHandler(http.HandlerFunc(s.HandleRequest))) + e.GET(base.cfg.GetWSHandShakePath(), echo.WrapHandler(http.HandlerFunc(s.HandleRequest))) + s.e = e - relayer, err := NewRelayClient(base.cfg.TransportType, base) + relayer, err := newRelayClient(base) if err != nil { return nil, err } diff --git a/echo/internal/transporter/wss_mux.go b/echo/internal/transporter/wss_mux.go index e7af0f9f2e..95b10986d6 100644 --- a/echo/internal/transporter/wss_mux.go +++ b/echo/internal/transporter/wss_mux.go @@ -57,7 +57,11 @@ func (c *MwssClient) initNewSession(ctx context.Context, addr string) (*smux.Ses func (s *MwssClient) TCPHandShake(remote *lb.Node) (net.Conn, error) { t1 := time.Now() - mwssc, err := s.muxTP.Dial(context.TODO(), remote.Address+"/handshake/") + addr, err := s.cfg.GetWSRemoteAddr(remote.Address) + if err != nil { + return nil, err + } + mwssc, err := s.muxTP.Dial(context.TODO(), addr) if err != nil { return nil, err } @@ -81,7 +85,7 @@ func newMwssServer(base *baseTransporter) (*MwssServer, error) { WssServer: wssServer, muxServerImpl: newMuxServer(base.cfg.Listen, base.l.Named("mwss")), } - s.e.GET("/handshake/", echo.WrapHandler(http.HandlerFunc(s.HandleRequest))) + s.e.GET(base.cfg.GetWSHandShakePath(), echo.WrapHandler(http.HandlerFunc(s.HandleRequest))) return s, nil } diff --git a/echo/pkg/node_metric/reader.go b/echo/pkg/metric_reader/reader.go similarity index 88% rename from echo/pkg/node_metric/reader.go rename to echo/pkg/metric_reader/reader.go index 22cdfac5fd..d6e227da96 100644 --- a/echo/pkg/node_metric/reader.go +++ b/echo/pkg/metric_reader/reader.go @@ -1,4 +1,4 @@ -package node_metric +package metric_reader import ( "context" @@ -10,6 +10,7 @@ import ( dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/expfmt" + "go.uber.org/zap" ) type Reader interface { @@ -30,6 +31,27 @@ func NewReader(metricsURL string) *readerImpl { } } +func (b *readerImpl) parsePingInfo(metricMap map[string]*dto.MetricFamily, nm *NodeMetrics) error { + metric, ok := metricMap["ehco_ping_response_duration_seconds"] + if !ok { + // this metric is optional when enable_ping = false + zap.S().Warn("ping metric not found") + return nil + } + for _, m := range metric.Metric { + g := m.GetHistogram() + ip := "" + val := float64(g.GetSampleSum()) / float64(g.GetSampleCount()) * 1000 // to ms + for _, label := range m.GetLabel() { + if label.GetName() == "ip" { + ip = label.GetValue() + } + } + nm.PingMetrics = append(nm.PingMetrics, PingMetric{Latency: val, Target: ip}) + } + return nil +} + func (b *readerImpl) parseCpuInfo(metricMap map[string]*dto.MetricFamily, nm *NodeMetrics) error { handleMetric := func(metricName string, handleValue func(float64, string)) error { metric, ok := metricMap[metricName] @@ -250,8 +272,7 @@ func (b *readerImpl) ReadOnce(ctx context.Context) (*NodeMetrics, error) { if err != nil { return nil, err } - - nm := &NodeMetrics{syncTime: time.Now()} + nm := &NodeMetrics{syncTime: time.Now(), PingMetrics: []PingMetric{}} if err := b.parseCpuInfo(parsed, nm); err != nil { return nil, err } @@ -264,6 +285,10 @@ func (b *readerImpl) ReadOnce(ctx context.Context) (*NodeMetrics, error) { if err := b.parseNetworkInfo(parsed, nm); err != nil { return nil, err } + if err := b.parsePingInfo(parsed, nm); err != nil { + return nil, err + } + b.lastMetrics = nm return nm, nil } diff --git a/echo/pkg/node_metric/types.go b/echo/pkg/metric_reader/types.go similarity index 80% rename from echo/pkg/node_metric/types.go rename to echo/pkg/metric_reader/types.go index 0846d79904..3f691511d6 100644 --- a/echo/pkg/node_metric/types.go +++ b/echo/pkg/metric_reader/types.go @@ -1,6 +1,8 @@ -package node_metric +package metric_reader -import "time" +import ( + "time" +) type NodeMetrics struct { // cpu @@ -24,5 +26,13 @@ type NodeMetrics struct { NetworkReceiveBytesRate float64 `json:"network_receive_bytes_rate"` NetworkTransmitBytesRate float64 `json:"network_transmit_bytes_rate"` + // ping + PingMetrics []PingMetric `json:"ping_metrics"` + syncTime time.Time } + +type PingMetric struct { + Latency float64 `json:"latency"` // in ms + Target string `json:"target"` +} diff --git a/echo/pkg/node_metric/utils.go b/echo/pkg/metric_reader/utils.go similarity index 95% rename from echo/pkg/node_metric/utils.go rename to echo/pkg/metric_reader/utils.go index 419a65c700..9749148197 100644 --- a/echo/pkg/node_metric/utils.go +++ b/echo/pkg/metric_reader/utils.go @@ -1,4 +1,4 @@ -package node_metric +package metric_reader import "regexp" diff --git a/geoip/go.mod b/geoip/go.mod index d5e00457ea..abc4773f66 100644 --- a/geoip/go.mod +++ b/geoip/go.mod @@ -2,29 +2,29 @@ module github.com/Loyalsoldier/geoip go 1.21 -toolchain go1.21.7 +toolchain go1.21.10 require ( github.com/maxmind/mmdbwriter v1.0.0 - github.com/oschwald/maxminddb-golang v1.12.0 - github.com/v2fly/v2ray-core/v5 v5.14.1 + github.com/oschwald/maxminddb-golang v1.13.0 + github.com/v2fly/v2ray-core/v5 v5.16.1 go4.org/netipx v0.0.0-20231129151722-fdeea329fbba - google.golang.org/protobuf v1.33.0 + google.golang.org/protobuf v1.34.1 gopkg.in/yaml.v2 v2.4.0 ) require ( github.com/adrg/xdg v0.4.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pires/go-proxyproto v0.7.0 // indirect - github.com/quic-go/quic-go v0.41.0 // indirect + github.com/quic-go/quic-go v0.43.0 // indirect go.starlark.net v0.0.0-20230612165344-9532f5667272 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/net v0.24.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/geoip/go.sum b/geoip/go.sum index a78115ab08..db17cada9a 100644 --- a/geoip/go.sum +++ b/geoip/go.sum @@ -6,12 +6,12 @@ github.com/aead/cmac v0.0.0-20160719120800-7af84192f0b1 h1:+JkXLHME8vLJafGhOH4ao github.com/aead/cmac v0.0.0-20160719120800-7af84192f0b1/go.mod h1:nuudZmJhzWtx2212z+pkuy7B6nkBqa+xwNXZHL1j8cg= github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= +github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d h1:zsO4lp+bjv5XvPTF58Vq+qgmZEYZttJK+CWtSZhKenI= github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d/go.mod h1:f1iKL6ZhUWvbk7PdWVmOaak10o86cqMUYEmn1CZNGEI= -github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= -github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/bufbuild/protocompile v0.10.0 h1:+jW/wnLMLxaCEG8AX9lD0bQ5v9h1RUiMKOBOT5ll9dM= +github.com/bufbuild/protocompile v0.10.0/go.mod h1:G9qQIQo0xZ6Uyj6CMNz0saGmx2so+KONo8/KrELABiY= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -29,12 +29,10 @@ github.com/ebfe/bcrypt_pbkdf v0.0.0-20140212075826-3c8d2dcb253a h1:YtdtTUN1iH97s github.com/ebfe/bcrypt_pbkdf v0.0.0-20140212075826-3c8d2dcb253a/go.mod h1:/CZpbhAusDOobpcb9yubw46kdYjq0zRC0Wpg9a9zFQM= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk= -github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI= -github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk= -github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= +github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4= github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= @@ -43,8 +41,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= -github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -59,9 +57,8 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -70,7 +67,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= @@ -79,10 +75,10 @@ github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9S github.com/google/pprof v0.0.0-20230602150820-91b7bce49751/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= -github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/jhump/protoreflect v1.16.0 h1:54fZg+49widqXYQ0b+usAFHbMkBGR4PpXrsHc8+TBDg= +github.com/jhump/protoreflect v1.16.0/go.mod h1:oYPd7nPvcBw/5wlDfm/AVmU9zH9BgqGCI469pGxfj/8= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/reedsolomon v1.11.7 h1:9uaHU0slncktTEEg4+7Vl7q7XUNMBUOK4R9gnKhMjAU= @@ -91,8 +87,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 h1:EnfXoSqDfSNJv0VBNqY/88RNnhSGYkrHaO0mmFGbVsc= github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg= github.com/maxmind/mmdbwriter v1.0.0 h1:bieL4P6yaYaHvbtLSwnKtEvScUKKD6jcKaLiTM3WSMw= @@ -105,8 +101,8 @@ github.com/onsi/ginkgo/v2 v2.10.0 h1:sfUl4qgLdvkChZrWCYndY2EAu9BRIw1YphNAzy1VNWs github.com/onsi/ginkgo/v2 v2.10.0/go.mod h1:UDQOh5wbQUlMnkLfVaIUMtQ1Vus92oM+P2JX1aulgcE= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -github.com/oschwald/maxminddb-golang v1.12.0 h1:9FnTOD0YOhP7DGxGsq4glzpGy5+w7pq50AS6wALUMYs= -github.com/oschwald/maxminddb-golang v1.12.0/go.mod h1:q0Nob5lTCqyQ8WT6FYgS1L7PXKVVbgiymefNwIjPzgY= +github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU= +github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= @@ -119,18 +115,18 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= github.com/pion/sctp v1.8.7 h1:JnABvFakZueGAn4KU/4PSKg+GWbF6QWbKTWZOSGJjXw= github.com/pion/sctp v1.8.7/go.mod h1:g1Ul+ARqZq5JEmoFy87Q/4CePtKnTJ1QCL9dBBdN6AU= -github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo= -github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.5 h1:iyi25i/21gQck4hfRhomF6SktmUQjRsRW4WJdhfc3Kc= +github.com/pion/transport/v2 v2.2.5/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwyq0Hs= github.com/pires/go-proxyproto v0.7.0/go.mod h1:Vz/1JPY/OACxWGQNIRY2BeyDmpoaWmEP40O9LbuiFR4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/quic-go/quic-go v0.41.0 h1:aD8MmHfgqTURWNJy48IYFg2OnxwHT3JL7ahGs73lb4k= -github.com/quic-go/quic-go v0.41.0/go.mod h1:qCkNjqczPEvgsOnxZ0eCD14lv+B2LHlFAB++CNOh9hA= -github.com/refraction-networking/utls v1.5.4 h1:9k6EO2b8TaOGsQ7Pl7p9w6PUhx18/ZCeT0WNTZ7Uw4o= -github.com/refraction-networking/utls v1.5.4/go.mod h1:SPuDbBmgLGp8s+HLNc83FuavwZCFoMmExj+ltUHiHUw= +github.com/quic-go/quic-go v0.43.0 h1:sjtsTKWX0dsHpuMJvLxGqoQdtgJnbAPWY+W+5vjYW/g= +github.com/quic-go/quic-go v0.43.0/go.mod h1:132kz4kL3F9vxhW3CtQJLDVwcFe5wdWeJXXijhsO57M= +github.com/refraction-networking/utls v1.6.5 h1:Jlfqgs/t1Uy6FHHQ8Fz9ZTrRmP/zS7d/NZw7BLahaL8= +github.com/refraction-networking/utls v1.6.5/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0= github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg= github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= @@ -141,16 +137,16 @@ github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb h1:XfLJSPIO github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb/go.mod h1:bR6DqgcAl1zTcOX8/pE2Qkj9XO00eCNqmKb7lXP8EAg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/v2fly/BrowserBridge v0.0.0-20210430233438-0570fc1d7d08 h1:4Yh46CVE3k/lPq6hUbEdbB1u1anRBXLewm3k+L0iOMc= github.com/v2fly/BrowserBridge v0.0.0-20210430233438-0570fc1d7d08/go.mod h1:KAuQNm+LWQCOFqdBcUgihPzRpVXRKzGbTNhfEfRZ4wY= github.com/v2fly/VSign v0.0.0-20201108000810-e2adc24bf848 h1:p1UzXK6VAutXFFQMnre66h7g1BjRKUnLv0HfmmRoz7w= github.com/v2fly/VSign v0.0.0-20201108000810-e2adc24bf848/go.mod h1:p80Bv154ZtrGpXMN15slDCqc9UGmfBuUzheDFBYaW/M= github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e h1:5QefA066A1tF8gHIiADmOVOV5LS43gt3ONnlEl3xkwI= github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e/go.mod h1:5t19P9LBIrNamL6AcMQOncg/r10y3Pc01AbHeMhwlpU= -github.com/v2fly/v2ray-core/v5 v5.14.1 h1:b+NPseG+3cvLMMccgX7zFdCye/NstVABGOyuhG4XLDg= -github.com/v2fly/v2ray-core/v5 v5.14.1/go.mod h1:Z57o2Vp+xgrf7EDFMDlZsickQuImRdQoDcqrO690zT0= +github.com/v2fly/v2ray-core/v5 v5.16.1 h1:hIuRzCJhmRYqCA76hGiNLkAHopgbNt91L871wlJ/yUU= +github.com/v2fly/v2ray-core/v5 v5.16.1/go.mod h1:3pWIBTmNagMKpzd9/QicXq/7JZCQt716GsGZdBNmYkU= github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI= github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= github.com/xiaokangwang/VLite v0.0.0-20220418190619-cff95160a432 h1:I/ATawgO2RerCq9ACwL0wBB8xNXZdE3J+93MCEHReRs= @@ -159,52 +155,52 @@ github.com/xtaci/smux v1.5.24 h1:77emW9dtnOxxOQ5ltR+8BbsX1kzcOxQ5gB+aaV9hXOY= github.com/xtaci/smux v1.5.24/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY= go.starlark.net v0.0.0-20230612165344-9532f5667272 h1:2/wtqS591wZyD2OsClsVBKRPEvBsQt/Js+fsCiYhwu8= go.starlark.net v0.0.0-20230612165344-9532f5667272/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= -go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= -go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 h1:Di6/M8l0O2lCLc6VVRWhgCiApHV8MnQurBnFSHsQtNY= golang.org/x/exp v0.0.0-20230725093048-515e97ebf090/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -212,13 +208,13 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -227,10 +223,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -243,5 +237,5 @@ gvisor.dev/gvisor v0.0.0-20231020174304-b8a429915ff1 h1:qDCwdCWECGnwQSQC01Dpnp09 gvisor.dev/gvisor v0.0.0-20231020174304-b8a429915ff1/go.mod h1:8hmigyCdYtw5xJGfQDJzSH5Ju8XEIDBnpyi8+O6GRt8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= -lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= +lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= diff --git a/lede/package/libs/elfutils/Makefile b/lede/package/libs/elfutils/Makefile index d4e5d994e8..94b01d73b2 100644 --- a/lede/package/libs/elfutils/Makefile +++ b/lede/package/libs/elfutils/Makefile @@ -83,6 +83,11 @@ CONFIGURE_VARS += \ TARGET_CFLAGS += -D_GNU_SOURCE -Wno-unused-result -Wno-format-nonliteral +ifneq ($(filter $(GCC_MAJOR_VERSION),12 13),) +TARGET_CFLAGS += \ + -Wno-error=use-after-free +endif + define Build/InstallDev $(INSTALL_DIR) $(1)/usr/include $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/ diff --git a/lede/package/libs/gettext-full/Makefile b/lede/package/libs/gettext-full/Makefile index 2319401baf..55164644ed 100644 --- a/lede/package/libs/gettext-full/Makefile +++ b/lede/package/libs/gettext-full/Makefile @@ -64,6 +64,7 @@ HOST_CONFIGURE_ARGS += \ --disable-rpath \ --disable-java \ --disable-openmp \ + --disable-curses \ --without-emacs \ --without-libxml2-prefix diff --git a/lede/package/libs/gettext-full/patches/020-fix_clang.patch b/lede/package/libs/gettext-full/patches/020-fix_clang.patch new file mode 100644 index 0000000000..284b5ab9fa --- /dev/null +++ b/lede/package/libs/gettext-full/patches/020-fix_clang.patch @@ -0,0 +1,11 @@ +--- a/libtextstyle/lib/iconv-ostream.c ++++ b/libtextstyle/lib/iconv-ostream.c +@@ -231,7 +231,7 @@ iconv_ostream__write_mem (iconv_ostream_t stream, const void *data, size_t len) + } + + static void +-iconv_ostream__flush (iconv_ostream_t stream) ++iconv_ostream__flush (iconv_ostream_t stream, ostream_flush_scope_t scope) + { + abort (); + } diff --git a/lede/package/libs/libjson-c/Makefile b/lede/package/libs/libjson-c/Makefile index 2c312f200e..063cf26442 100644 --- a/lede/package/libs/libjson-c/Makefile +++ b/lede/package/libs/libjson-c/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=json-c -PKG_VERSION:=0.16 -PKG_RELEASE:=2 +PKG_VERSION:=0.17 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-nodoc.tar.gz PKG_SOURCE_URL:=https://s3.amazonaws.com/json-c_releases/releases/ -PKG_HASH:=ac8a3dd6820daaca579b23fbc74664310fbc3d67f52f6707cda67d21dde5570f +PKG_HASH:=8df3b66597333dd365762cab2de2ff68e41e3808a04b692e696e0550648eefaa PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=MIT diff --git a/lede/package/libs/libjson-c/patches/001-dont-build-docs.patch b/lede/package/libs/libjson-c/patches/001-dont-build-docs.patch index f35da80724..1de420f8b8 100644 --- a/lede/package/libs/libjson-c/patches/001-dont-build-docs.patch +++ b/lede/package/libs/libjson-c/patches/001-dont-build-docs.patch @@ -1,6 +1,6 @@ --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -433,8 +433,6 @@ configure_file(json.h.cmakein ${PROJECT_ +@@ -451,8 +451,6 @@ configure_file(json.h.cmakein ${PROJECT_ include_directories(${PROJECT_SOURCE_DIR}) include_directories(${PROJECT_BINARY_DIR}) diff --git a/lede/target/linux/ramips/dts/mt7621_leigod_a7000.dts b/lede/target/linux/ramips/dts/mt7621_leigod_a7000.dts index 292d22f714..a7b08d527f 100644 --- a/lede/target/linux/ramips/dts/mt7621_leigod_a7000.dts +++ b/lede/target/linux/ramips/dts/mt7621_leigod_a7000.dts @@ -88,10 +88,10 @@ reg = <0x50000 0x1e00000>; }; - partition@1f00000 { - label = "sysinfo"; - reg = <0x1f00000 0x10000>; - }; + partition@1f00000 { + label = "sysinfo"; + reg = <0x1f00000 0x10000>; + }; }; }; }; @@ -137,7 +137,7 @@ &state_default { gpio { - groups = "jtag", "wdt"; + groups = "jtag", "uart3", "wdt"; function = "gpio"; }; }; diff --git a/lede/target/linux/ramips/dts/mt7621_openfi_5pro.dts b/lede/target/linux/ramips/dts/mt7621_openfi_5pro.dts old mode 100755 new mode 100644 index 7560d405bd..1ef292a780 --- a/lede/target/linux/ramips/dts/mt7621_openfi_5pro.dts +++ b/lede/target/linux/ramips/dts/mt7621_openfi_5pro.dts @@ -118,7 +118,7 @@ }; &pcie1 { - wifi1: mt76@0,0 { + mt76@0,0 { compatible = "mediatek,mt76"; reg = <0x0000 0 0 0 0>; mediatek,mtd-eeprom = <&factory 0x8000>; @@ -147,7 +147,7 @@ &state_default { gpio { - groups = "wdt", "i2c", "jtag"; + groups = "wdt", "jtag"; function = "gpio"; }; }; diff --git a/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-fastrhino.dtsi b/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-fastrhino.dtsi index 186fc67615..4588af44d9 100644 --- a/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-fastrhino.dtsi +++ b/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-fastrhino.dtsi @@ -46,16 +46,6 @@ vin-supply = <&vcc12v_dcin>; }; - vcc5v0_usb: vcc5v0-usb { - compatible = "regulator-fixed"; - regulator-always-on; - regulator-boot-on; - regulator-min-microvolt = <5000000>; - regulator-max-microvolt = <5000000>; - regulator-name = "vcc5v0_usb"; - vin-supply = <&vcc12v_dcin>; - }; - vcc5v0_usb_otg: vcc5v0-usb-otg { compatible = "regulator-fixed"; enable-active-high; @@ -65,7 +55,7 @@ regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; regulator-name = "vcc5v0_usb_otg"; - vin-supply = <&vcc5v0_usb>; + vin-supply = <&vcc5v0_sys>; }; vcc3v3_pcie: vcc3v3-pcie { @@ -75,10 +65,10 @@ regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-name = "vcc3v3_pcie"; - vin-supply = <&vcc12v_dcin>; + vin-supply = <&vcc5v0_sys>; }; - gpio-keys { + keys { compatible = "gpio-keys"; pinctrl-names = "default"; pinctrl-0 = <&reset_button_pin>; @@ -112,10 +102,6 @@ status = "okay"; }; -&combphy2 { - status = "okay"; -}; - &cpu0 { cpu-supply = <&vdd_cpu>; }; @@ -132,7 +118,6 @@ cpu-supply = <&vdd_cpu>; }; -#ifdef DTS_NO_LEGACY &display_subsystem { status = "disabled"; }; @@ -141,7 +126,6 @@ mali-supply = <&vdd_gpu>; status = "okay"; }; -#endif &i2c0 { status = "okay"; @@ -459,8 +443,8 @@ &pmu_io_domains { pmuio1-supply = <&vcc3v3_pmu>; pmuio2-supply = <&vcc3v3_pmu>; - vccio1-supply = <&vccio_acodec>; - vccio3-supply = <&vccio_sd>; + vccio1-supply = <&vcc_3v3>; + vccio3-supply = <&vcc_3v3>; vccio4-supply = <&vcc_1v8>; vccio5-supply = <&vcc_3v3>; vccio6-supply = <&vcc_1v8>; @@ -501,6 +485,7 @@ }; &usb2phy0_host { + phy-supply = <&vcc5v0_sys>; status = "okay"; }; @@ -509,7 +494,6 @@ status = "okay"; }; -#ifdef DTS_NO_LEGACY &vop { assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; @@ -519,4 +503,3 @@ &vop_mmu { status = "okay"; }; -#endif diff --git a/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-hinlink-opc.dtsi b/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-hinlink-opc.dtsi index d7b4219971..77c336a8f4 100644 --- a/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-hinlink-opc.dtsi +++ b/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-hinlink-opc.dtsi @@ -22,7 +22,6 @@ stdout-path = "serial2:1500000n8"; }; -#ifdef DTS_NO_LEGACY hdmi-con { compatible = "hdmi-connector"; type = "a"; @@ -33,7 +32,6 @@ }; }; }; -#endif keys { compatible = "gpio-keys"; @@ -180,7 +178,6 @@ cpu-supply = <&vdd_cpu>; }; -#ifdef DTS_NO_LEGACY &gpu { mali-supply = <&vdd_gpu>; status = "okay"; @@ -207,7 +204,6 @@ &hdmi_sound { status = "okay"; }; -#endif &i2c0 { status = "okay"; @@ -451,11 +447,9 @@ status = "okay"; }; -#ifdef DTS_NO_LEGACY &i2s0_8ch { status = "okay"; }; -#endif &i2s1_8ch { rockchip,trcm-sync-tx-only; @@ -589,7 +583,7 @@ disable-wp; pinctrl-names = "default"; pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>; - sd-uhs-sdr104; + sd-uhs-sdr50; vmmc-supply = <&vcc3v3_sd>; vqmmc-supply = <&vccio_sd>; status = "okay"; @@ -648,7 +642,6 @@ status = "okay"; }; -#ifdef DTS_NO_LEGACY &vop { assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; @@ -665,4 +658,3 @@ remote-endpoint = <&hdmi_in_vp0>; }; }; -#endif diff --git a/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts b/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts index 1541e747b1..c5bb0080c2 100644 --- a/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts +++ b/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts @@ -8,7 +8,7 @@ #include "rk3568.dtsi" / { - model = "Radxa ROCK3 Model A"; + model = "Radxa ROCK 3A"; compatible = "radxa,rock3a", "rockchip,rk3568"; aliases { @@ -21,7 +21,6 @@ stdout-path = "serial2:1500000n8"; }; -#ifdef DTS_NO_LEGACY hdmi-con { compatible = "hdmi-connector"; type = "a"; @@ -32,7 +31,6 @@ }; }; }; -#endif leds { compatible = "gpio-leds"; @@ -62,14 +60,14 @@ }; }; - vcc12v_dcin: vcc12v-dcin { + vcc12v_dcin: vcc12v-dcin-regulator { compatible = "regulator-fixed"; regulator-name = "vcc12v_dcin"; regulator-always-on; regulator-boot-on; }; - vcc3v3_sys: vcc3v3-sys { + vcc3v3_sys: vcc3v3-sys-regulator { compatible = "regulator-fixed"; regulator-name = "vcc3v3_sys"; regulator-always-on; @@ -79,7 +77,7 @@ vin-supply = <&vcc12v_dcin>; }; - vcc5v0_sys: vcc5v0-sys { + vcc5v0_sys: vcc5v0-sys-regulator { compatible = "regulator-fixed"; regulator-name = "vcc5v0_sys"; regulator-always-on; @@ -89,7 +87,7 @@ vin-supply = <&vcc12v_dcin>; }; - vcc5v0_usb: vcc5v0-usb { + vcc5v0_usb: vcc5v0-usb-regulator { compatible = "regulator-fixed"; regulator-name = "vcc5v0_usb"; regulator-always-on; @@ -99,7 +97,7 @@ vin-supply = <&vcc12v_dcin>; }; - vcc5v0_usb_host: vcc5v0-usb-host { + vcc5v0_usb_host: vcc5v0-usb-host-regulator { compatible = "regulator-fixed"; enable-active-high; gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>; @@ -111,7 +109,7 @@ vin-supply = <&vcc5v0_usb>; }; - vcc5v0_usb_hub: vcc5v0-usb-hub { + vcc5v0_usb_hub: vcc5v0-usb-hub-regulator { compatible = "regulator-fixed"; enable-active-high; gpio = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>; @@ -122,7 +120,7 @@ vin-supply = <&vcc5v0_usb>; }; - vcc5v0_usb_otg: vcc5v0-usb-otg { + vcc5v0_usb_otg: vcc5v0-usb-otg-regulator { compatible = "regulator-fixed"; enable-active-high; gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>; @@ -134,7 +132,7 @@ vin-supply = <&vcc5v0_usb>; }; - pcie30_avdd0v9: pcie30-avdd0v9 { + pcie30_avdd0v9: pcie30-avdd0v9-regulator { compatible = "regulator-fixed"; regulator-name = "pcie30_avdd0v9"; regulator-always-on; @@ -144,7 +142,7 @@ vin-supply = <&vcc3v3_sys>; }; - pcie30_avdd1v8: pcie30-avdd1v8 { + pcie30_avdd1v8: pcie30-avdd1v8-regulator { compatible = "regulator-fixed"; regulator-name = "pcie30_avdd1v8"; regulator-always-on; @@ -155,7 +153,7 @@ }; /* pi6c pcie clock generator */ - vcc3v3_pi6c_03: vcc3v3-pi6c-03 { + vcc3v3_pi6c_03: vcc3v3-pi6c-03-regulator { compatible = "regulator-fixed"; regulator-name = "vcc3v3_pi6c_03"; regulator-always-on; @@ -165,7 +163,7 @@ vin-supply = <&vcc5v0_sys>; }; - vcc3v3_pcie: vcc3v3-pcie { + vcc3v3_pcie: vcc3v3-pcie-regulator { compatible = "regulator-fixed"; enable-active-high; gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>; @@ -177,7 +175,7 @@ vin-supply = <&vcc5v0_sys>; }; - vcc_cam: vcc-cam { + vcc_cam: vcc-cam-regulator { compatible = "regulator-fixed"; enable-active-high; gpio = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>; @@ -193,7 +191,7 @@ }; }; - vcc_mipi: vcc-mipi { + vcc_mipi: vcc-mipi-regulator { compatible = "regulator-fixed"; enable-active-high; gpio = <&gpio3 RK_PC0 GPIO_ACTIVE_HIGH>; @@ -261,7 +259,6 @@ status = "okay"; }; -#ifdef DTS_NO_LEGACY &gpu { mali-supply = <&vdd_gpu>; status = "okay"; @@ -270,6 +267,8 @@ &hdmi { avdd-0v9-supply = <&vdda0v9_image>; avdd-1v8-supply = <&vcca1v8_image>; + pinctrl-names = "default"; + pinctrl-0 = <&hdmitx_scl &hdmitx_sda &hdmitxm1_cec>; status = "okay"; }; @@ -288,7 +287,6 @@ &hdmi_sound { status = "okay"; }; -#endif &i2c0 { status = "okay"; @@ -324,8 +322,6 @@ pinctrl-0 = <&pmic_int>, <&i2s1m0_mclk>; rockchip,system-power-controller; #sound-dai-cells = <0>; - wakeup-source; - vcc1-supply = <&vcc3v3_sys>; vcc2-supply = <&vcc3v3_sys>; vcc3-supply = <&vcc3v3_sys>; @@ -335,6 +331,7 @@ vcc7-supply = <&vcc3v3_sys>; vcc8-supply = <&vcc3v3_sys>; vcc9-supply = <&vcc3v3_sys>; + wakeup-source; regulators { vdd_logic: DCDC_REG1 { @@ -528,6 +525,18 @@ }; }; +&i2c3 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c3m1_xfer>; + status = "disabled"; +}; + +&i2c4 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c4m1_xfer>; + status = "disabled"; +}; + &i2c5 { status = "okay"; @@ -544,13 +553,13 @@ }; }; -#ifdef DTS_NO_LEGACY &i2s0_8ch { status = "okay"; }; -#endif &i2s1_8ch { + pinctrl-names = "default"; + pinctrl-0 = <&i2s1m0_sclktx &i2s1m0_lrcktx &i2s1m0_sdi0 &i2s1m0_sdo0>; rockchip,trcm-sync-tx-only; status = "okay"; }; @@ -686,6 +695,20 @@ status = "okay"; }; +&sfc { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0x0>; + spi-max-frequency = <104000000>; + spi-rx-bus-width = <4>; + spi-tx-bus-width = <1>; + }; +}; + &tsadc { rockchip,hw-tshut-mode = <1>; rockchip,hw-tshut-polarity = <0>; @@ -749,7 +772,6 @@ status = "okay"; }; -#ifdef DTS_NO_LEGACY &vop { assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; @@ -766,4 +788,3 @@ remote-endpoint = <&hdmi_in_vp0>; }; }; -#endif diff --git a/lede/target/linux/rockchip/patches-6.1/013-v6.11-PCI-dw-rockchip-Fix-initial-PERST-GPIO-value.patch b/lede/target/linux/rockchip/patches-6.1/013-v6.11-PCI-dw-rockchip-Fix-initial-PERST-GPIO-value.patch new file mode 100644 index 0000000000..698660b724 --- /dev/null +++ b/lede/target/linux/rockchip/patches-6.1/013-v6.11-PCI-dw-rockchip-Fix-initial-PERST-GPIO-value.patch @@ -0,0 +1,76 @@ +From b7f824141f4163c64a940f3a69bf6d8b76f77c7f Mon Sep 17 00:00:00 2001 +From: Niklas Cassel +Date: Wed, 17 Apr 2024 18:42:26 +0200 +Subject: [PATCH] PCI: dw-rockchip: Fix initial PERST# GPIO value +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +PERST# is active low according to the PCIe specification. + +However, the existing pcie-dw-rockchip.c driver does: + + gpiod_set_value(..., 0); msleep(100); gpiod_set_value(..., 1); + +when asserting + deasserting PERST#. + +This is of course wrong, but because all the device trees for this +compatible string have also incorrectly marked this GPIO as ACTIVE_HIGH: + + $ git grep -B 10 reset-gpios arch/arm64/boot/dts/rockchip/rk3568* + $ git grep -B 10 reset-gpios arch/arm64/boot/dts/rockchip/rk3588* + +The actual toggling of PERST# is correct, and we cannot change it anyway, +since that would break device tree compatibility. + +However, this driver does request the GPIO to be initialized as +GPIOD_OUT_HIGH, which does cause a silly sequence where PERST# gets +toggled back and forth for no good reason. + +Fix this by requesting the GPIO to be initialized as GPIOD_OUT_LOW (which +for this driver means PERST# asserted). + +This will avoid an unnecessary signal change where PERST# gets deasserted +(by devm_gpiod_get_optional()) and then gets asserted (by +rockchip_pcie_start_link()) just a few instructions later. + +Before patch, debug prints on EP side, when booting RC: + + [ 845.606810] pci: PERST# asserted by host! + [ 852.483985] pci: PERST# de-asserted by host! + [ 852.503041] pci: PERST# asserted by host! + [ 852.610318] pci: PERST# de-asserted by host! + +After patch, debug prints on EP side, when booting RC: + + [ 125.107921] pci: PERST# asserted by host! + [ 132.111429] pci: PERST# de-asserted by host! + +This extra, very short, PERST# assertion + deassertion has been reported to +cause issues with certain WLAN controllers, e.g. RTL8822CE. + +Fixes: 0e898eb8df4e ("PCI: rockchip-dwc: Add Rockchip RK356X host controller driver") +Link: https://lore.kernel.org/linux-pci/20240417164227.398901-1-cassel@kernel.org +Tested-by: Heiko Stuebner +Tested-by: Jianfeng Liu +Signed-off-by: Niklas Cassel +Signed-off-by: Krzysztof Wilczyński +Signed-off-by: Bjorn Helgaas +Reviewed-by: Heiko Stuebner +Reviewed-by: Manivannan Sadhasivam +Cc: stable@vger.kernel.org # v5.15+ +--- + drivers/pci/controller/dwc/pcie-dw-rockchip.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c ++++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c +@@ -240,7 +240,7 @@ static int rockchip_pcie_resource_get(struct platform_device *pdev, + return PTR_ERR(rockchip->apb_base); + + rockchip->rst_gpio = devm_gpiod_get_optional(&pdev->dev, "reset", +- GPIOD_OUT_HIGH); ++ GPIOD_OUT_LOW); + if (IS_ERR(rockchip->rst_gpio)) + return PTR_ERR(rockchip->rst_gpio); + diff --git a/lede/target/linux/rockchip/patches-6.6/007-v6.11-PCI-dw-rockchip-Fix-initial-PERST-GPIO-value.patch b/lede/target/linux/rockchip/patches-6.6/007-v6.11-PCI-dw-rockchip-Fix-initial-PERST-GPIO-value.patch new file mode 100644 index 0000000000..698660b724 --- /dev/null +++ b/lede/target/linux/rockchip/patches-6.6/007-v6.11-PCI-dw-rockchip-Fix-initial-PERST-GPIO-value.patch @@ -0,0 +1,76 @@ +From b7f824141f4163c64a940f3a69bf6d8b76f77c7f Mon Sep 17 00:00:00 2001 +From: Niklas Cassel +Date: Wed, 17 Apr 2024 18:42:26 +0200 +Subject: [PATCH] PCI: dw-rockchip: Fix initial PERST# GPIO value +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +PERST# is active low according to the PCIe specification. + +However, the existing pcie-dw-rockchip.c driver does: + + gpiod_set_value(..., 0); msleep(100); gpiod_set_value(..., 1); + +when asserting + deasserting PERST#. + +This is of course wrong, but because all the device trees for this +compatible string have also incorrectly marked this GPIO as ACTIVE_HIGH: + + $ git grep -B 10 reset-gpios arch/arm64/boot/dts/rockchip/rk3568* + $ git grep -B 10 reset-gpios arch/arm64/boot/dts/rockchip/rk3588* + +The actual toggling of PERST# is correct, and we cannot change it anyway, +since that would break device tree compatibility. + +However, this driver does request the GPIO to be initialized as +GPIOD_OUT_HIGH, which does cause a silly sequence where PERST# gets +toggled back and forth for no good reason. + +Fix this by requesting the GPIO to be initialized as GPIOD_OUT_LOW (which +for this driver means PERST# asserted). + +This will avoid an unnecessary signal change where PERST# gets deasserted +(by devm_gpiod_get_optional()) and then gets asserted (by +rockchip_pcie_start_link()) just a few instructions later. + +Before patch, debug prints on EP side, when booting RC: + + [ 845.606810] pci: PERST# asserted by host! + [ 852.483985] pci: PERST# de-asserted by host! + [ 852.503041] pci: PERST# asserted by host! + [ 852.610318] pci: PERST# de-asserted by host! + +After patch, debug prints on EP side, when booting RC: + + [ 125.107921] pci: PERST# asserted by host! + [ 132.111429] pci: PERST# de-asserted by host! + +This extra, very short, PERST# assertion + deassertion has been reported to +cause issues with certain WLAN controllers, e.g. RTL8822CE. + +Fixes: 0e898eb8df4e ("PCI: rockchip-dwc: Add Rockchip RK356X host controller driver") +Link: https://lore.kernel.org/linux-pci/20240417164227.398901-1-cassel@kernel.org +Tested-by: Heiko Stuebner +Tested-by: Jianfeng Liu +Signed-off-by: Niklas Cassel +Signed-off-by: Krzysztof Wilczyński +Signed-off-by: Bjorn Helgaas +Reviewed-by: Heiko Stuebner +Reviewed-by: Manivannan Sadhasivam +Cc: stable@vger.kernel.org # v5.15+ +--- + drivers/pci/controller/dwc/pcie-dw-rockchip.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c ++++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c +@@ -240,7 +240,7 @@ static int rockchip_pcie_resource_get(struct platform_device *pdev, + return PTR_ERR(rockchip->apb_base); + + rockchip->rst_gpio = devm_gpiod_get_optional(&pdev->dev, "reset", +- GPIOD_OUT_HIGH); ++ GPIOD_OUT_LOW); + if (IS_ERR(rockchip->rst_gpio)) + return PTR_ERR(rockchip->rst_gpio); + diff --git a/lede/toolchain/gcc/Config.version b/lede/toolchain/gcc/Config.version index 8670f49b4c..9ffe340663 100644 --- a/lede/toolchain/gcc/Config.version +++ b/lede/toolchain/gcc/Config.version @@ -16,5 +16,5 @@ config GCC_VERSION string default "8.4.0" if GCC_VERSION_8 default "12.2.0" if GCC_VERSION_12 - default "13.2.0" if GCC_VERSION_13 + default "13.3.0" if GCC_VERSION_13 default "11.3.0" diff --git a/lede/toolchain/gcc/common.mk b/lede/toolchain/gcc/common.mk index a87cf8ccaf..55be62280d 100644 --- a/lede/toolchain/gcc/common.mk +++ b/lede/toolchain/gcc/common.mk @@ -41,8 +41,8 @@ ifeq ($(PKG_VERSION),12.2.0) PKG_HASH:=e549cf9cf3594a00e27b6589d4322d70e0720cdd213f39beb4181e06926230ff endif -ifeq ($(PKG_VERSION),13.2.0) - PKG_HASH:=e275e76442a6067341a27f04c5c6b83d8613144004c0413528863dc6b5c743da +ifeq ($(PKG_VERSION),13.3.0) + PKG_HASH:=0845e9621c9543a13f484e94584a49ffc0129970e9914624235fc1d061a0c083 endif PATCH_DIR=../patches-$(GCC_MAJOR_VERSION).x diff --git a/lede/toolchain/gcc/patches-13.x/300-mips_Os_cpu_rtx_cost_model.patch b/lede/toolchain/gcc/patches-13.x/300-mips_Os_cpu_rtx_cost_model.patch index ce21e0433d..2ca42ad777 100644 --- a/lede/toolchain/gcc/patches-13.x/300-mips_Os_cpu_rtx_cost_model.patch +++ b/lede/toolchain/gcc/patches-13.x/300-mips_Os_cpu_rtx_cost_model.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau --- a/gcc/config/mips/mips.cc +++ b/gcc/config/mips/mips.cc -@@ -20213,7 +20213,7 @@ mips_option_override (void) +@@ -20219,7 +20219,7 @@ mips_option_override (void) flag_pcc_struct_return = 0; /* Decide which rtx_costs structure to use. */ diff --git a/lede/toolchain/gcc/patches-13.x/970-macos_arm64-building-fix.patch b/lede/toolchain/gcc/patches-13.x/970-macos_arm64-building-fix.patch index 7844268e7e..a0470b1396 100644 --- a/lede/toolchain/gcc/patches-13.x/970-macos_arm64-building-fix.patch +++ b/lede/toolchain/gcc/patches-13.x/970-macos_arm64-building-fix.patch @@ -17,7 +17,7 @@ Date: Mon Aug 16 13:16:21 2021 +0100 --- a/gcc/config/aarch64/aarch64.h +++ b/gcc/config/aarch64/aarch64.h -@@ -1185,7 +1185,7 @@ extern enum aarch64_code_model aarch64_c +@@ -1195,7 +1195,7 @@ extern enum aarch64_code_model aarch64_c /* Extra specs when building a native AArch64-hosted compiler. Option rewriting rules based on host system. */ diff --git a/lede/tools/b43-tools/Makefile b/lede/tools/b43-tools/Makefile index bae498c78f..19918efde4 100644 --- a/lede/tools/b43-tools/Makefile +++ b/lede/tools/b43-tools/Makefile @@ -23,7 +23,7 @@ define Host/Compile $(HOST_MAKE_FLAGS) \ $(1) QUIET_SPARSE=: +$(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR)/assembler \ - CFLAGS="$(HOST_CFLAGS) -include endian.h" \ + CFLAGS="$(HOST_CFLAGS) -include endian.h -Wno-error=int-conversion" \ $(HOST_MAKE_FLAGS) \ LDFLAGS= \ $(1) QUIET_SPARSE=: diff --git a/lede/tools/coreutils/Makefile b/lede/tools/coreutils/Makefile index c64210c5a7..f799e83c5b 100644 --- a/lede/tools/coreutils/Makefile +++ b/lede/tools/coreutils/Makefile @@ -8,11 +8,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=coreutils PKG_CPE_ID:=cpe:/a:gnu:coreutils -PKG_VERSION:=8.32 +PKG_VERSION:=9.3 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/coreutils -PKG_HASH:=4458d8de7849df44ccab15e16b1548b285224dbba5f08fac070c1c0e0bcc4cfa +PKG_HASH:=adbcfcfe899235b71e8768dcf07cd532520b7f54f9a8064843f8d199a904bbaa HOST_BUILD_PARALLEL := 1 diff --git a/lede/tools/cpio/Makefile b/lede/tools/cpio/Makefile index 82b5aa8365..bd6e258980 100644 --- a/lede/tools/cpio/Makefile +++ b/lede/tools/cpio/Makefile @@ -3,11 +3,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=cpio PKG_CPE_ID:=cpe:/a:gnu:cpio -PKG_VERSION:=2.13 +PKG_VERSION:=2.15 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=@GNU/cpio -PKG_HASH:=eab5bdc5ae1df285c59f2a4f140a98fc33678a0bf61bdba67d9436ae26b46f6d +PKG_HASH:=937610b97c329a1ec9268553fb780037bcfff0dcffe9725ebc4fd9c1aa9075db include $(INCLUDE_DIR)/host-build.mk diff --git a/lede/tools/cpio/patches/001-duplicate-program-name.patch b/lede/tools/cpio/patches/001-duplicate-program-name.patch deleted file mode 100644 index a7c3fbc8ae..0000000000 --- a/lede/tools/cpio/patches/001-duplicate-program-name.patch +++ /dev/null @@ -1,18 +0,0 @@ -author Sergey Poznyakoff - -https://git.savannah.gnu.org/cgit/cpio.git/commit/?id=641d3f489cf6238bb916368d4ba0d9325a235afb - -* src/global.c: Remove superfluous declaration of program_name - ---- a/src/global.c -+++ b/src/global.c -@@ -184,9 +184,6 @@ unsigned int warn_option = 0; - /* Extract to standard output? */ - bool to_stdout_option = false; - --/* The name this program was run with. */ --char *program_name; -- - /* A pointer to either lstat or stat, depending on whether - dereferencing of symlinks is done for input files. */ - int (*xstat) (); diff --git a/lede/tools/cpio/patches/010-clang.patch b/lede/tools/cpio/patches/010-clang.patch deleted file mode 100644 index 89c7a8149e..0000000000 --- a/lede/tools/cpio/patches/010-clang.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/gnu/xalloc-oversized.h -+++ b/gnu/xalloc-oversized.h -@@ -52,7 +52,7 @@ typedef size_t __xalloc_count_type; - #elif ((5 <= __GNUC__ \ - || (__has_builtin (__builtin_mul_overflow) \ - && __has_builtin (__builtin_constant_p))) \ -- && !__STRICT_ANSI__) -+ && !__STRICT_ANSI__) && !defined(__clang__) - # define xalloc_oversized(n, s) \ - (__builtin_constant_p (n) && __builtin_constant_p (s) \ - ? __xalloc_oversized (n, s) \ diff --git a/mieru/.github/workflows/external_connect.yaml b/mieru/.github/workflows/external_connect.yaml index 0d46b40143..c0a1d8a890 100644 --- a/mieru/.github/workflows/external_connect.yaml +++ b/mieru/.github/workflows/external_connect.yaml @@ -13,5 +13,5 @@ jobs: go-version-file: go.mod - name: Build test binaries run: make test-binary - - name: Run packet drop test + - name: Run external connection test run: sudo ./test/deploy/externalconnect/test.sh diff --git a/mieru/Makefile b/mieru/Makefile index a6be7ed48c..d92f85c15e 100644 --- a/mieru/Makefile +++ b/mieru/Makefile @@ -32,7 +32,7 @@ PROJECT_NAME=$(shell basename "${ROOT}") # - pkg/version/current.go # # Use `tools/bump_version.sh` script to change all those files at one shot. -VERSION="3.0.1" +VERSION="3.2.0" # Build binaries and installation packages. .PHONY: build diff --git a/mieru/build/package/mieru/amd64/debian/DEBIAN/control b/mieru/build/package/mieru/amd64/debian/DEBIAN/control index df8b222d7c..bd913b5c38 100755 --- a/mieru/build/package/mieru/amd64/debian/DEBIAN/control +++ b/mieru/build/package/mieru/amd64/debian/DEBIAN/control @@ -1,5 +1,5 @@ Package: mieru -Version: 3.0.1 +Version: 3.2.0 Section: net Priority: optional Architecture: amd64 diff --git a/mieru/build/package/mieru/amd64/rpm/mieru.spec b/mieru/build/package/mieru/amd64/rpm/mieru.spec index 322bd56ed8..13d5e9ee6d 100644 --- a/mieru/build/package/mieru/amd64/rpm/mieru.spec +++ b/mieru/build/package/mieru/amd64/rpm/mieru.spec @@ -1,5 +1,5 @@ Name: mieru -Version: 3.0.1 +Version: 3.2.0 Release: 1%{?dist} Summary: Mieru proxy client License: GPLv3+ diff --git a/mieru/build/package/mieru/arm64/debian/DEBIAN/control b/mieru/build/package/mieru/arm64/debian/DEBIAN/control index 7be8d11f2f..b95e6b34f2 100755 --- a/mieru/build/package/mieru/arm64/debian/DEBIAN/control +++ b/mieru/build/package/mieru/arm64/debian/DEBIAN/control @@ -1,5 +1,5 @@ Package: mieru -Version: 3.0.1 +Version: 3.2.0 Section: net Priority: optional Architecture: arm64 diff --git a/mieru/build/package/mieru/arm64/rpm/mieru.spec b/mieru/build/package/mieru/arm64/rpm/mieru.spec index 322bd56ed8..13d5e9ee6d 100644 --- a/mieru/build/package/mieru/arm64/rpm/mieru.spec +++ b/mieru/build/package/mieru/arm64/rpm/mieru.spec @@ -1,5 +1,5 @@ Name: mieru -Version: 3.0.1 +Version: 3.2.0 Release: 1%{?dist} Summary: Mieru proxy client License: GPLv3+ diff --git a/mieru/build/package/mita/amd64/debian/DEBIAN/control b/mieru/build/package/mita/amd64/debian/DEBIAN/control index eb0ac7267a..f827359e8c 100755 --- a/mieru/build/package/mita/amd64/debian/DEBIAN/control +++ b/mieru/build/package/mita/amd64/debian/DEBIAN/control @@ -1,5 +1,5 @@ Package: mita -Version: 3.0.1 +Version: 3.2.0 Section: net Priority: optional Architecture: amd64 diff --git a/mieru/build/package/mita/amd64/debian/lib/systemd/system/mita.service b/mieru/build/package/mita/amd64/debian/lib/systemd/system/mita.service index 196f7fc343..0cc38095cc 100644 --- a/mieru/build/package/mita/amd64/debian/lib/systemd/system/mita.service +++ b/mieru/build/package/mita/amd64/debian/lib/systemd/system/mita.service @@ -11,7 +11,7 @@ Environment="MITA_LOG_NO_TIMESTAMP=true" ExecStart=/usr/bin/mita run Nice=-10 Restart=on-failure -RestartSec=1 +RestartSec=5 [Install] WantedBy=multi-user.target diff --git a/mieru/build/package/mita/amd64/rpm/mita.service b/mieru/build/package/mita/amd64/rpm/mita.service index c1caf54de6..3aca8f89b6 100644 --- a/mieru/build/package/mita/amd64/rpm/mita.service +++ b/mieru/build/package/mita/amd64/rpm/mita.service @@ -11,7 +11,7 @@ Environment="MITA_LOG_NO_TIMESTAMP=true" ExecStart=/usr/bin/mita run Nice=-10 Restart=on-failure -RestartSec=1 +RestartSec=5 [Install] WantedBy=multi-user.target diff --git a/mieru/build/package/mita/amd64/rpm/mita.spec b/mieru/build/package/mita/amd64/rpm/mita.spec index 3a1a00def1..381436d112 100644 --- a/mieru/build/package/mita/amd64/rpm/mita.spec +++ b/mieru/build/package/mita/amd64/rpm/mita.spec @@ -1,5 +1,5 @@ Name: mita -Version: 3.0.1 +Version: 3.2.0 Release: 1%{?dist} Summary: Mieru proxy server License: GPLv3+ diff --git a/mieru/build/package/mita/arm64/debian/DEBIAN/control b/mieru/build/package/mita/arm64/debian/DEBIAN/control index 59d43493ef..265ca1f791 100755 --- a/mieru/build/package/mita/arm64/debian/DEBIAN/control +++ b/mieru/build/package/mita/arm64/debian/DEBIAN/control @@ -1,5 +1,5 @@ Package: mita -Version: 3.0.1 +Version: 3.2.0 Section: net Priority: optional Architecture: arm64 diff --git a/mieru/build/package/mita/arm64/debian/lib/systemd/system/mita.service b/mieru/build/package/mita/arm64/debian/lib/systemd/system/mita.service index 21ff11831c..ec2bed6002 100644 --- a/mieru/build/package/mita/arm64/debian/lib/systemd/system/mita.service +++ b/mieru/build/package/mita/arm64/debian/lib/systemd/system/mita.service @@ -11,7 +11,7 @@ Environment="MITA_LOG_NO_TIMESTAMP=true" ExecStart=/usr/bin/mita run Nice=-10 Restart=on-failure -RestartSec=1 +RestartSec=5 [Install] WantedBy=multi-user.target diff --git a/mieru/build/package/mita/arm64/rpm/mita.service b/mieru/build/package/mita/arm64/rpm/mita.service index da47d62173..f969627a0d 100644 --- a/mieru/build/package/mita/arm64/rpm/mita.service +++ b/mieru/build/package/mita/arm64/rpm/mita.service @@ -11,7 +11,7 @@ Environment="MITA_LOG_NO_TIMESTAMP=true" ExecStart=/usr/bin/mita run Nice=-10 Restart=on-failure -RestartSec=1 +RestartSec=5 [Install] WantedBy=multi-user.target diff --git a/mieru/build/package/mita/arm64/rpm/mita.spec b/mieru/build/package/mita/arm64/rpm/mita.spec index cdbf5639d0..3b5ca4db35 100644 --- a/mieru/build/package/mita/arm64/rpm/mita.spec +++ b/mieru/build/package/mita/arm64/rpm/mita.spec @@ -1,5 +1,5 @@ Name: mita -Version: 3.0.1 +Version: 3.2.0 Release: 1%{?dist} Summary: Mieru proxy server License: GPLv3+ diff --git a/mieru/configs/examples/mita.service b/mieru/configs/examples/mita.service index 8fffb3ef53..b0d95ed1db 100755 --- a/mieru/configs/examples/mita.service +++ b/mieru/configs/examples/mita.service @@ -12,7 +12,7 @@ Environment="MITA_LOG_NO_TIMESTAMP=true" ExecStart=/usr/bin/mita run Nice=-10 Restart=on-failure -RestartSec=1 +RestartSec=5 [Install] WantedBy=multi-user.target diff --git a/mieru/docs/client-install.md b/mieru/docs/client-install.md index dc2fb3c7f9..d08dd0c810 100644 --- a/mieru/docs/client-install.md +++ b/mieru/docs/client-install.md @@ -105,6 +105,18 @@ mieru stop Note that every time you change the settings with `mieru apply config `, you need to restart the client with `mieru stop` and `mieru start` for the new settings to take effect. +## Test the Connection Between Client and Server + +```sh +mieru test + +OR + +mieru test https:// +``` + +If the output shows `Connected to ...`, it indicates that the mieru client has successfully connected to the proxy server. + ## Configuring the browser Chrome / Firefox and other browsers can use socks5 proxy to access blocked websites by installing browser plugins. For the address of the socks5 proxy, please fill in `127.0.0.1:xxxx`, where `xxxx` is the value of `socks5Port` in the client settings. This address will also be printed when the `mieru start` command is called. diff --git a/mieru/docs/client-install.zh_CN.md b/mieru/docs/client-install.zh_CN.md index 7c4379997d..5940a85a59 100644 --- a/mieru/docs/client-install.zh_CN.md +++ b/mieru/docs/client-install.zh_CN.md @@ -105,6 +105,18 @@ mieru stop 注意,每次使用 `mieru apply config ` 修改设置后,需要用 `mieru stop` 和 `mieru start` 重启客户端,才能使新设置生效。 +## 测试客户端与服务器的连接 + +```sh +mieru test + +或者 + +mieru test https:// +``` + +如果输出显示 `Connected to ...`,表示 mieru 客户端成功连接了代理服务器。 + ## 配置浏览器 Chrome / Firefox 等浏览器可以通过安装插件,使用 socks5 代理访问墙外的网站。关于 socks5 代理的地址,请填写 `127.0.0.1:xxxx`,其中 `xxxx` 是客户端设置中 `socks5Port` 的值。这个地址在调用 `mieru start` 指令时也会打印出来。 diff --git a/mieru/docs/operation.md b/mieru/docs/operation.md index 0e88bbac6e..b8fb4da3c8 100644 --- a/mieru/docs/operation.md +++ b/mieru/docs/operation.md @@ -96,7 +96,8 @@ To determine if the connectivity is OK, you can look at the client metrics. To g }, "replay": { "KnownSession": 0, - "NewSession": 0 + "NewSession": 0, + "NewSessionDecrypted": 0 }, "socks5": { "ConnectionRefusedErrors": 0, diff --git a/mieru/docs/operation.zh_CN.md b/mieru/docs/operation.zh_CN.md index 34323a9df5..a5467ec783 100644 --- a/mieru/docs/operation.zh_CN.md +++ b/mieru/docs/operation.zh_CN.md @@ -96,7 +96,8 @@ mieru start }, "replay": { "KnownSession": 0, - "NewSession": 0 + "NewSession": 0, + "NewSessionDecrypted": 0 }, "socks5": { "ConnectionRefusedErrors": 0, diff --git a/mieru/docs/server-install.md b/mieru/docs/server-install.md index 4542a71108..134deb8509 100644 --- a/mieru/docs/server-install.md +++ b/mieru/docs/server-install.md @@ -8,32 +8,32 @@ Before installation and configuration, connect to the server via SSH and then ex ```sh # Debian / Ubuntu - X86_64 -curl -LSO https://github.com/enfein/mieru/releases/download/v3.0.1/mita_3.0.1_amd64.deb +curl -LSO https://github.com/enfein/mieru/releases/download/v3.2.0/mita_3.2.0_amd64.deb # Debian / Ubuntu - ARM 64 -curl -LSO https://github.com/enfein/mieru/releases/download/v3.0.1/mita_3.0.1_arm64.deb +curl -LSO https://github.com/enfein/mieru/releases/download/v3.2.0/mita_3.2.0_arm64.deb # RedHat / CentOS / Rocky Linux - X86_64 -curl -LSO https://github.com/enfein/mieru/releases/download/v3.0.1/mita-3.0.1-1.x86_64.rpm +curl -LSO https://github.com/enfein/mieru/releases/download/v3.2.0/mita-3.2.0-1.x86_64.rpm # RedHat / CentOS / Rocky Linux - ARM 64 -curl -LSO https://github.com/enfein/mieru/releases/download/v3.0.1/mita-3.0.1-1.aarch64.rpm +curl -LSO https://github.com/enfein/mieru/releases/download/v3.2.0/mita-3.2.0-1.aarch64.rpm ``` ## Install mita package ```sh # Debian / Ubuntu - X86_64 -sudo dpkg -i mita_3.0.1_amd64.deb +sudo dpkg -i mita_3.2.0_amd64.deb # Debian / Ubuntu - ARM 64 -sudo dpkg -i mita_3.0.1_arm64.deb +sudo dpkg -i mita_3.2.0_arm64.deb # RedHat / CentOS / Rocky Linux - X86_64 -sudo rpm -Uvh --force mita-3.0.1-1.x86_64.rpm +sudo rpm -Uvh --force mita-3.2.0-1.x86_64.rpm # RedHat / CentOS / Rocky Linux - ARM 64 -sudo rpm -Uvh --force mita-3.0.1-1.aarch64.rpm +sudo rpm -Uvh --force mita-3.2.0-1.aarch64.rpm ``` Those instructions can also be used to upgrade the version of mita software package. diff --git a/mieru/docs/server-install.zh_CN.md b/mieru/docs/server-install.zh_CN.md index 4e8b42fd9c..c4b7e1ec91 100644 --- a/mieru/docs/server-install.zh_CN.md +++ b/mieru/docs/server-install.zh_CN.md @@ -8,32 +8,32 @@ ```sh # Debian / Ubuntu - X86_64 -curl -LSO https://github.com/enfein/mieru/releases/download/v3.0.1/mita_3.0.1_amd64.deb +curl -LSO https://github.com/enfein/mieru/releases/download/v3.2.0/mita_3.2.0_amd64.deb # Debian / Ubuntu - ARM 64 -curl -LSO https://github.com/enfein/mieru/releases/download/v3.0.1/mita_3.0.1_arm64.deb +curl -LSO https://github.com/enfein/mieru/releases/download/v3.2.0/mita_3.2.0_arm64.deb # RedHat / CentOS / Rocky Linux - X86_64 -curl -LSO https://github.com/enfein/mieru/releases/download/v3.0.1/mita-3.0.1-1.x86_64.rpm +curl -LSO https://github.com/enfein/mieru/releases/download/v3.2.0/mita-3.2.0-1.x86_64.rpm # RedHat / CentOS / Rocky Linux - ARM 64 -curl -LSO https://github.com/enfein/mieru/releases/download/v3.0.1/mita-3.0.1-1.aarch64.rpm +curl -LSO https://github.com/enfein/mieru/releases/download/v3.2.0/mita-3.2.0-1.aarch64.rpm ``` ## 安装 mita 软件包 ```sh # Debian / Ubuntu - X86_64 -sudo dpkg -i mita_3.0.1_amd64.deb +sudo dpkg -i mita_3.2.0_amd64.deb # Debian / Ubuntu - ARM 64 -sudo dpkg -i mita_3.0.1_arm64.deb +sudo dpkg -i mita_3.2.0_arm64.deb # RedHat / CentOS / Rocky Linux - X86_64 -sudo rpm -Uvh --force mita-3.0.1-1.x86_64.rpm +sudo rpm -Uvh --force mita-3.2.0-1.x86_64.rpm # RedHat / CentOS / Rocky Linux - ARM 64 -sudo rpm -Uvh --force mita-3.0.1-1.aarch64.rpm +sudo rpm -Uvh --force mita-3.2.0-1.aarch64.rpm ``` 上述指令也可以用来升级 mita 软件包的版本。 diff --git a/mieru/pkg/cipher/cache.go b/mieru/pkg/cipher/cache.go index 745ffff175..35d78b31ee 100644 --- a/mieru/pkg/cipher/cache.go +++ b/mieru/pkg/cipher/cache.go @@ -21,7 +21,7 @@ import ( "time" ) -const cacheValidInterval = KeyRefreshInterval / 2 +const cacheValidInterval = KeyRefreshInterval / 4 type cachedCiphers struct { cipherList []BlockCipher diff --git a/mieru/pkg/cli/client.go b/mieru/pkg/cli/client.go index a1cd38a255..cadf6c803e 100644 --- a/mieru/pkg/cli/client.go +++ b/mieru/pkg/cli/client.go @@ -23,10 +23,11 @@ import ( "io" "net" "net/http" - "net/url" + "os" "os/exec" "runtime/pprof" "strconv" + "strings" "sync" "time" @@ -38,10 +39,10 @@ import ( "github.com/enfein/mieru/pkg/metrics" "github.com/enfein/mieru/pkg/protocolv2" "github.com/enfein/mieru/pkg/socks5" + "github.com/enfein/mieru/pkg/socks5client" "github.com/enfein/mieru/pkg/stderror" "github.com/enfein/mieru/pkg/util" "github.com/enfein/mieru/pkg/util/sockopts" - "golang.org/x/net/proxy" "google.golang.org/grpc" "google.golang.org/protobuf/proto" ) @@ -86,7 +87,15 @@ func RegisterClientCommands() { RegisterCallback( []string{"", "test"}, func(s []string) error { - return unexpectedArgsError(s, 2) + if len(s) > 3 { + return fmt.Errorf("usage: mieru test [URL]. More than 1 URL is provided") + } + if len(s) == 3 { + if !strings.HasPrefix(s[2], "http://") && !strings.HasPrefix(s[2], "https://") { + return fmt.Errorf("provided URL is invalid, it must start with %q or %q", "http://", "https://") + } + } + return nil }, clientTestFunc, ) @@ -236,7 +245,7 @@ var clientHelpFunc = func(s []string) error { help: "Check mieru client status.", }, { - cmd: "test", + cmd: "test [URL]", help: "Test mieru client connection to the Internet via proxy server.", }, { @@ -334,6 +343,8 @@ var clientStartFunc = func(s []string) error { if errors.Is(cmd.Err, exec.ErrDot) { cmd.Err = nil } + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr if err := cmd.Start(); err != nil { return fmt.Errorf(stderror.StartClientFailedErr, err) } @@ -612,17 +623,9 @@ var clientTestFunc = func(s []string) error { return fmt.Errorf(stderror.GetClientConfigFailedErr, err) } - proxyURL, err := url.Parse(fmt.Sprintf("socks5://127.0.0.1:%d", config.GetSocks5Port())) - if err != nil { - return fmt.Errorf("failed to parse proxy URL: %w", err) - } - dialer, err := proxy.FromURL(proxyURL, proxy.Direct) - if err != nil { - return fmt.Errorf("failed to create proxy dialer: %w", err) - } httpClient := &http.Client{ Transport: &http.Transport{ - Dial: dialer.Dial, + Dial: socks5client.Dial(fmt.Sprintf("socks5://127.0.0.1:%d", config.GetSocks5Port()), socks5client.ConnectCmd), }, CheckRedirect: func(req *http.Request, via []*http.Request) error { return nil @@ -630,8 +633,12 @@ var clientTestFunc = func(s []string) error { Timeout: appctl.RPCTimeout, } + destination := "https://google.com/generate_204" + if len(s) == 3 { + destination = s[2] + } beginTime := time.Now() - resp, err := httpClient.Get("https://google.com/generate_204") + resp, err := httpClient.Get(destination) if err != nil { return err } @@ -640,10 +647,10 @@ var clientTestFunc = func(s []string) error { defer resp.Body.Close() io.ReadAll(resp.Body) - if resp.StatusCode != 204 { + if resp.StatusCode < 200 || resp.StatusCode >= 300 { return fmt.Errorf("received unexpected status code %d after %v", resp.StatusCode, d) } - log.Infof("Connected to https://google.com after %v", d) + log.Infof("Connected to %q after %v", destination, d) return nil } diff --git a/mieru/pkg/cli/server.go b/mieru/pkg/cli/server.go index 23630bd209..4df1dacb4a 100644 --- a/mieru/pkg/cli/server.go +++ b/mieru/pkg/cli/server.go @@ -279,6 +279,9 @@ var serverHelpFunc = func(s []string) error { var serverStartFunc = func(s []string) error { appStatus, err := appctl.GetServerStatusWithRPC(context.Background()) if err != nil { + if stderror.IsConnRefused(err) { + return fmt.Errorf(stderror.ServerNotRunningWithCommand) + } return fmt.Errorf(stderror.GetServerStatusFailedErr, err) } if err := appctl.IsServerDaemonRunning(appStatus); err != nil { @@ -461,6 +464,9 @@ var serverRunFunc = func(s []string) error { var serverStopFunc = func(s []string) error { appStatus, err := appctl.GetServerStatusWithRPC(context.Background()) if err != nil { + if stderror.IsConnRefused(err) { + return fmt.Errorf(stderror.ServerNotRunningWithCommand) + } return fmt.Errorf(stderror.GetServerStatusFailedErr, err) } if err := appctl.IsServerDaemonRunning(appStatus); err != nil { @@ -487,6 +493,9 @@ var serverStopFunc = func(s []string) error { var serverReloadFunc = func(s []string) error { appStatus, err := appctl.GetServerStatusWithRPC(context.Background()) if err != nil { + if stderror.IsConnRefused(err) { + return fmt.Errorf(stderror.ServerNotRunningWithCommand) + } return fmt.Errorf(stderror.GetServerStatusFailedErr, err) } if err := appctl.IsServerDaemonRunning(appStatus); err != nil { @@ -510,15 +519,14 @@ var serverStatusFunc = func(s []string) error { appStatus, err := appctl.GetServerStatusWithRPC(context.Background()) if err != nil { if stderror.IsConnRefused(err) { - // This is the most common reason, no need to show more details. - return fmt.Errorf(stderror.ServerNotRunning) + return fmt.Errorf(stderror.ServerNotRunningWithCommand) } else if stderror.IsPermissionDenied(err) { currentUser, err := user.Current() if err != nil { cmd := strings.Join(s, " ") return fmt.Errorf("unable to determine the OS user which executed command %q", cmd) } - return fmt.Errorf("unable to connect to mita server daemon via %q, please retry after running \"sudo usermod -a -G mita %s\" command and logout the system, then login again", appctl.ServerUDS(), currentUser.Username) + return fmt.Errorf("unable to connect to mita server daemon via %q; please retry after running \"sudo usermod -a -G mita %s\" command and logout the system, then login again", appctl.ServerUDS(), currentUser.Username) } else { return fmt.Errorf(stderror.GetServerStatusFailedErr, err) } @@ -537,6 +545,9 @@ var serverStatusFunc = func(s []string) error { var serverApplyConfigFunc = func(s []string) error { appStatus, err := appctl.GetServerStatusWithRPC(context.Background()) if err != nil { + if stderror.IsConnRefused(err) { + return fmt.Errorf(stderror.ServerNotRunningWithCommand) + } return fmt.Errorf(stderror.GetServerStatusFailedErr, err) } if err := appctl.IsServerDaemonRunning(appStatus); err != nil { @@ -572,6 +583,9 @@ var serverApplyConfigFunc = func(s []string) error { var serverDescribeConfigFunc = func(s []string) error { appStatus, err := appctl.GetServerStatusWithRPC(context.Background()) if err != nil { + if stderror.IsConnRefused(err) { + return fmt.Errorf(stderror.ServerNotRunningWithCommand) + } return fmt.Errorf(stderror.GetServerStatusFailedErr, err) } if err := appctl.IsServerDaemonRunning(appStatus); err != nil { @@ -599,6 +613,9 @@ var serverDescribeConfigFunc = func(s []string) error { var serverDeleteUserFunc = func(s []string) error { appStatus, err := appctl.GetServerStatusWithRPC(context.Background()) if err != nil { + if stderror.IsConnRefused(err) { + return fmt.Errorf(stderror.ServerNotRunningWithCommand) + } return fmt.Errorf(stderror.GetServerStatusFailedErr, err) } if err := appctl.IsServerDaemonRunning(appStatus); err != nil { @@ -640,6 +657,9 @@ var serverDeleteUserFunc = func(s []string) error { var serverGetMetricsFunc = func(s []string) error { appStatus, err := appctl.GetServerStatusWithRPC(context.Background()) if err != nil { + if stderror.IsConnRefused(err) { + return fmt.Errorf(stderror.ServerNotRunningWithCommand) + } return fmt.Errorf(stderror.GetServerStatusFailedErr, err) } if err := appctl.IsServerDaemonRunning(appStatus); err != nil { @@ -663,6 +683,9 @@ var serverGetMetricsFunc = func(s []string) error { var serverGetConnectionsFunc = func(s []string) error { appStatus, err := appctl.GetServerStatusWithRPC(context.Background()) if err != nil { + if stderror.IsConnRefused(err) { + return fmt.Errorf(stderror.ServerNotRunningWithCommand) + } return fmt.Errorf(stderror.GetServerStatusFailedErr, err) } if err := appctl.IsServerDaemonRunning(appStatus); err != nil { diff --git a/mieru/pkg/log/formatter.go b/mieru/pkg/log/formatter.go index edd784ebf4..08d675a778 100644 --- a/mieru/pkg/log/formatter.go +++ b/mieru/pkg/log/formatter.go @@ -3,6 +3,7 @@ package log import ( "bytes" "fmt" + "os" "sort" "strings" "time" @@ -55,6 +56,7 @@ func (f *CliFormatter) Format(entry *Entry) ([]byte, error) { } // DaemonFormatter is the a log formatter that is suitable for daemon. +// FATAL log is also printed to stderr. type DaemonFormatter struct { NoTimestamp bool } @@ -118,6 +120,11 @@ func (f *DaemonFormatter) Format(entry *Entry) ([]byte, error) { buf.WriteString(value) } buf.WriteString("\n") + + if entry.Level == FatalLevel { + fmt.Fprint(os.Stderr, buf.String()) + } + return buf.Bytes(), nil } diff --git a/mieru/pkg/protocolv2/mux.go b/mieru/pkg/protocolv2/mux.go index 098d8d224d..4f47972d0b 100644 --- a/mieru/pkg/protocolv2/mux.go +++ b/mieru/pkg/protocolv2/mux.go @@ -23,7 +23,6 @@ import ( mrand "math/rand" "net" "reflect" - "runtime" "strings" "sync" "time" @@ -38,23 +37,21 @@ import ( ) const ( - idleUnderlayTickerInterval = 5 * time.Second - userCipherCacheWarmInterval = 15 * time.Second + idleUnderlayTickerInterval = 5 * time.Second ) // Mux manages the sessions and underlays. type Mux struct { // ---- common fields ---- - isClient bool - endpoints []UnderlayProperties - underlays []Underlay - chAccept chan net.Conn - chAcceptErr chan error - used bool - done chan struct{} - mu sync.Mutex - cleaner *time.Ticker - userCipherCacheWarmer *time.Ticker + isClient bool + endpoints []UnderlayProperties + underlays []Underlay + chAccept chan net.Conn + chAcceptErr chan error + used bool + done chan struct{} + mu sync.Mutex + cleaner *time.Ticker // ---- client fields ---- password []byte @@ -74,13 +71,12 @@ func NewMux(isClinet bool) *Mux { log.Infof("Initializing server multiplexer") } mux := &Mux{ - isClient: isClinet, - underlays: make([]Underlay, 0), - chAccept: make(chan net.Conn, sessionChanCapacity), - chAcceptErr: make(chan error, 1), // non-blocking - done: make(chan struct{}), - cleaner: time.NewTicker(idleUnderlayTickerInterval), - userCipherCacheWarmer: time.NewTicker(userCipherCacheWarmInterval), + isClient: isClinet, + underlays: make([]Underlay, 0), + chAccept: make(chan net.Conn, sessionChanCapacity), + chAcceptErr: make(chan error, 1), // non-blocking + done: make(chan struct{}), + cleaner: time.NewTicker(idleUnderlayTickerInterval), } // Run maintenance tasks in the background. @@ -89,13 +85,14 @@ func NewMux(isClinet bool) *Mux { select { case <-mux.cleaner.C: mux.mu.Lock() - mux.cleanUnderlay() + if isClinet { + mux.cleanUnderlay(true) + } else { + mux.cleanUnderlay(false) + } mux.mu.Unlock() - case <-mux.userCipherCacheWarmer.C: - mux.warmUserCipherCache() case <-mux.done: mux.cleaner.Stop() - mux.userCipherCacheWarmer.Stop() return } } @@ -268,7 +265,7 @@ func (m *Mux) DialContext(ctx context.Context) (net.Conn, error) { var err error // Try to find a underlay for the session. - m.cleanUnderlay() + m.cleanUnderlay(true) underlay := m.maybePickExistingUnderlay() if underlay == nil { underlay, err = m.newUnderlay(ctx) @@ -401,7 +398,7 @@ func (m *Mux) acceptUnderlayLoop(ctx context.Context, properties UnderlayPropert log.Debugf("Created new server underlay %v", underlay) m.mu.Lock() m.underlays = append(m.underlays, underlay) - m.cleanUnderlay() + m.cleanUnderlay(false) m.mu.Unlock() UnderlayPassiveOpens.Add(1) currEst := UnderlayCurrEstablished.Add(1) @@ -456,7 +453,7 @@ func (m *Mux) acceptUnderlayLoop(ctx context.Context, properties UnderlayPropert log.Infof("Created new server underlay %v", underlay) m.mu.Lock() m.underlays = append(m.underlays, underlay) - m.cleanUnderlay() + m.cleanUnderlay(false) m.mu.Unlock() UnderlayPassiveOpens.Add(1) currEst := UnderlayCurrEstablished.Add(1) @@ -608,67 +605,32 @@ func (m *Mux) maybePickExistingUnderlay() Underlay { // cleanUnderlay removes closed underlays. // This method MUST be called only when holding the mu lock. -func (m *Mux) cleanUnderlay() { +func (m *Mux) cleanUnderlay(alsoDisableIdleUnderlay bool) { remaining := make([]Underlay, 0) - cnt := 0 + disable := 0 + close := 0 for _, underlay := range m.underlays { select { case <-underlay.Done(): default: - if underlay.Scheduler().Idle() { + if alsoDisableIdleUnderlay && underlay.NSessions() == 0 { + if underlay.Scheduler().TryDisable() { + disable++ + } + } + if underlay.NSessions() == 0 && underlay.Scheduler().Idle() { underlay.Close() - cnt++ + close++ } else { remaining = append(remaining, underlay) } } } m.underlays = remaining - if cnt > 0 { - log.Debugf("Mux cleaned %d underlays", cnt) - } -} - -func (m *Mux) warmUserCipherCache() { - if m.isClient { - return - } - - m.mu.Lock() - userList := make([]*appctlpb.User, len(m.users)) - i := 0 - for _, user := range m.users { - userList[i] = user - i++ - } - m.mu.Unlock() - - warmSingleUser := func(user *appctlpb.User) { - password, err := hex.DecodeString(user.GetHashedPassword()) - if err != nil { - return - } - if len(password) == 0 { - password = cipher.HashPassword([]byte(user.GetPassword()), []byte(user.GetName())) - } - cipher.BlockCipherListFromPassword(password, true) - } - - cpus := runtime.NumCPU() - if len(userList) <= cpus { - for _, user := range userList { - warmSingleUser(user) - } - } else { - // Do parallel. - for i := 0; i < cpus; i++ { - go func(userList []*appctlpb.User, workerID int, nWorker int) { - for j := 0; j < len(userList); j++ { - if j%nWorker == workerID { - warmSingleUser(userList[j]) - } - } - }(userList, i, cpus) - } + if disable > 0 { + log.Debugf("Mux disabled scheduling from %d underlays", disable) + } + if close > 0 { + log.Debugf("Mux cleaned %d underlays", close) } } diff --git a/mieru/pkg/protocolv2/scheduler.go b/mieru/pkg/protocolv2/scheduler.go index f73ab50fe7..5b05111ff2 100644 --- a/mieru/pkg/protocolv2/scheduler.go +++ b/mieru/pkg/protocolv2/scheduler.go @@ -24,25 +24,25 @@ import ( ) var ( - // scheduleIdleTime determines when an idle underlay should be closed. - // It may take 5 seconds to 15 seconds in different machines. - scheduleIdleTime = time.Duration(5+rng.FixedInt(11)) * time.Second + // scheduleIdleTime determines when a underlay is considered idle. + // It takes 60 seconds to 120 seconds in different machines. + scheduleIdleTime = time.Duration(60+rng.FixedInt(61)) * time.Second ) // ScheduleController controls scheduling a new client session to a underlay. type ScheduleController struct { pending int // number of pending sessions going to be scheduled lastScheduleTime time.Time - disable bool // if scheduling to the underlay is disabled - disableTime time.Time + disableTime time.Time // if set, scheduling to the underlay is disabled after this time mu sync.Mutex } // IncPending increases the number of pending sessions by 1. +// The number of pending sessions can't increase if the scheduler is disabled. func (c *ScheduleController) IncPending() (ok bool) { c.mu.Lock() defer c.mu.Unlock() - if c.disable { + if !util.IsZeroTime(c.disableTime) && time.Since(c.disableTime) > 0 { return false } c.pending++ @@ -51,48 +51,51 @@ func (c *ScheduleController) IncPending() (ok bool) { } // DecPending decreases the number of pending sessions by 1. -func (c *ScheduleController) DecPending() (ok bool) { +func (c *ScheduleController) DecPending() { c.mu.Lock() defer c.mu.Unlock() - if c.disable { - return false - } c.pending-- c.lastScheduleTime = time.Now() - return true } // IsDisabled returns true if scheduling new sessions to the underlay is disabled. func (c *ScheduleController) IsDisabled() bool { c.mu.Lock() defer c.mu.Unlock() - return c.disable + return !util.IsZeroTime(c.disableTime) && time.Since(c.disableTime) > 0 } -// Idle returns true if the scheduling has been disabled for the given interval time. +// Idle returns true if the scheduling has been disabled for the given interval. func (c *ScheduleController) Idle() bool { c.mu.Lock() defer c.mu.Unlock() - return c.disable && time.Since(c.disableTime) > scheduleIdleTime + return !util.IsZeroTime(c.disableTime) && time.Since(c.lastScheduleTime) > scheduleIdleTime && time.Since(c.disableTime) > scheduleIdleTime } // TryDisable tries to disable scheduling new sessions. -func (c *ScheduleController) TryDisable() (ok bool) { +func (c *ScheduleController) TryDisable() (successful bool) { c.mu.Lock() defer c.mu.Unlock() + if !util.IsZeroTime(c.disableTime) { + return false // already disabled + } if c.pending > 0 { return false } - if util.IsZeroTime(c.lastScheduleTime) { - c.lastScheduleTime = time.Now() - } - if time.Since(c.lastScheduleTime) < scheduleIdleTime { + if !util.IsZeroTime(c.lastScheduleTime) && time.Since(c.lastScheduleTime) < scheduleIdleTime { return false } - if c.disable { - return true - } - c.disable = true c.disableTime = time.Now() return true } + +// SetRemainingTime disables the scheduler after the given duration. +// Do nothing if the scheduler has already been disabled. +func (c *ScheduleController) SetRemainingTime(d time.Duration) { + c.mu.Lock() + defer c.mu.Unlock() + if d <= 0 || !util.IsZeroTime(c.disableTime) { + return + } + c.disableTime = time.Now().Add(d) +} diff --git a/mieru/pkg/protocolv2/underlay.go b/mieru/pkg/protocolv2/underlay.go index 19897d438b..2ae2fad8ee 100644 --- a/mieru/pkg/protocolv2/underlay.go +++ b/mieru/pkg/protocolv2/underlay.go @@ -67,7 +67,10 @@ type Underlay interface { // The session is destroyed when this returns. RemoveSession(*Session) error - // Returns information of all the sessions. + // Returns the number of sessions. + NSessions() int + + // Returns detailed information of all the sessions. Sessions() []SessionInfo // Run event loop. diff --git a/mieru/pkg/protocolv2/underlay_base.go b/mieru/pkg/protocolv2/underlay_base.go index 419666421f..948cdf3b70 100644 --- a/mieru/pkg/protocolv2/underlay_base.go +++ b/mieru/pkg/protocolv2/underlay_base.go @@ -168,22 +168,18 @@ func (b *baseUnderlay) RemoveSession(s *Session) error { s.wg.Wait() s.conn = nil s = nil - - if b.isClient { - // May disable scheduling if the underlay has no session. - sessions := 0 - b.sessionMap.Range(func(k, v any) bool { - sessions += 1 - return false - }) - if sessions == 0 { - b.scheduler.TryDisable() - } - } - return nil } +func (b *baseUnderlay) NSessions() int { + n := 0 + b.sessionMap.Range(func(k, v any) bool { + n++ + return true + }) + return n +} + func (b *baseUnderlay) Sessions() []SessionInfo { res := make([]SessionInfo, 0) b.sessionMap.Range(func(k, v any) bool { diff --git a/mieru/pkg/protocolv2/underlay_udp.go b/mieru/pkg/protocolv2/underlay_udp.go index 387dc64fcc..f875a855d9 100644 --- a/mieru/pkg/protocolv2/underlay_udp.go +++ b/mieru/pkg/protocolv2/underlay_udp.go @@ -102,6 +102,8 @@ func NewUDPUnderlay(ctx context.Context, network, laddr, raddr string, mtu int, serverAddr: remoteAddr, block: block, } + // The block cipher expires after this time. + u.scheduler.SetRemainingTime(cipher.KeyRefreshInterval / 2) return u, nil } diff --git a/mieru/pkg/stderror/template.go b/mieru/pkg/stderror/template.go index d78c7dd9a5..9eb22c2fe6 100644 --- a/mieru/pkg/stderror/template.go +++ b/mieru/pkg/stderror/template.go @@ -22,9 +22,9 @@ const ( ClientNotRunning = "mieru client is not running" ClientNotRunningErr = "mieru client is not running: %w" CreateClientLifecycleRPCClientFailedErr = "create mieru client lifecycle RPC client failed: %w" - CreateEmptyServerConfigFailedErr = "create empty mieru server config file failed: %w" - CreateServerConfigRPCClientFailedErr = "create mieru server config RPC client failed: %w" - CreateServerLifecycleRPCClientFailedErr = "create mieru server lifecycle RPC client failed: %w" + CreateEmptyServerConfigFailedErr = "create empty mita server config file failed: %w" + CreateServerConfigRPCClientFailedErr = "create mita server config RPC client failed: %w" + CreateServerLifecycleRPCClientFailedErr = "create mita server lifecycle RPC client failed: %w" CreateSocks5ServerFailedErr = "create socks5 server failed: %w" DecodeHashedPasswordFailedErr = "decode hashed password failed: %w" ExitFailedErr = "process exit failed: %w" @@ -33,23 +33,23 @@ const ( GetHeapProfileFailedErr = "get heap profile failed: %w" GetMemoryStatisticsFailedErr = "get memory statistics failed: %w" GetMetricsFailedErr = "get metrics failed: %w" - GetServerConfigFailedErr = "get mieru server config failed: %w" - GetServerStatusFailedErr = "get mieru server status failed: %w" + GetServerConfigFailedErr = "get mita server config failed: %w" + GetServerStatusFailedErr = "get mita server status failed: %w" GetThreadDumpFailedErr = "get thread dump failed: %w" InvalidPortBindingsErr = "invalid port bindings: %w" InvalidTransportProtocol = "invalid transport protocol" LookupIPFailedErr = "look up IP address failed: %w" ParseIPFailed = "parse IP address failed" - ReloadServerFailedErr = "reload mieru server failed: %w" + ReloadServerFailedErr = "reload mita server failed: %w" SegmentSizeTooBig = "segment size too big" - ServerNotRunning = "mieru server daemon is not running" - ServerNotRunningErr = "mieru server daemon is not running: %w" - ServerProxyNotRunningErr = "mieru server proxy is not running: %w" - SetServerConfigFailedErr = "set mieru server config failed: %w" + ServerNotRunningErr = "mita server daemon is not running: %w" + ServerNotRunningWithCommand = "mita server daemon is not running; please run command \"sudo systemctl restart mita\" to start server daemon; run command \"sudo journalctl -e -u mita --no-pager\" to check log if unable to start" + ServerProxyNotRunningErr = "mita server proxy is not running: %w" + SetServerConfigFailedErr = "set mita server config failed: %w" StartClientFailedErr = "start mieru client failed: %w" StartCPUProfileFailedErr = "start CPU profile failed: %w" - StartServerProxyFailedErr = "start mieru server proxy failed: %w" - StopServerProxyFailedErr = "stop mieru server proxy failed: %w" + StartServerProxyFailedErr = "start mita server proxy failed: %w" + StopServerProxyFailedErr = "stop mita server proxy failed: %w" StoreClientConfigFailedErr = "store mieru client config failed: %w" ValidateFullClientConfigFailedErr = "validate full client config failed: %w" ValidateServerConfigPatchFailedErr = "validate server config patch failed: %w" diff --git a/mieru/pkg/util/sockopts/reuse.go b/mieru/pkg/util/sockopts/reuse.go index 1981c77a41..e2dae92357 100644 --- a/mieru/pkg/util/sockopts/reuse.go +++ b/mieru/pkg/util/sockopts/reuse.go @@ -13,7 +13,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -//go:build !(android || linux) +//go:build !(android || darwin || linux) package sockopts @@ -21,7 +21,7 @@ import ( "syscall" ) -// ReuseAddrPort does nothing outside Android and Linux platform. +// ReuseAddrPort does nothing in unsupported platforms. func ReuseAddrPort() Control { return func(network, address string, conn syscall.RawConn) error { return nil diff --git a/mieru/pkg/util/sockopts/reuse_unix.go b/mieru/pkg/util/sockopts/reuse_unix.go index 6bf868ef7f..27c14a4899 100644 --- a/mieru/pkg/util/sockopts/reuse_unix.go +++ b/mieru/pkg/util/sockopts/reuse_unix.go @@ -13,7 +13,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -//go:build android || linux +//go:build android || darwin || linux package sockopts diff --git a/mieru/pkg/version/current.go b/mieru/pkg/version/current.go index 0d2df57320..e081444a09 100644 --- a/mieru/pkg/version/current.go +++ b/mieru/pkg/version/current.go @@ -16,5 +16,5 @@ package version const ( - AppVersion = "3.0.1" + AppVersion = "3.2.0" ) diff --git a/mieru/test/deploy/externalconnect/libtest.sh b/mieru/test/deploy/externalconnect/libtest.sh index 7a0a36494e..b5fd2e3105 100755 --- a/mieru/test/deploy/externalconnect/libtest.sh +++ b/mieru/test/deploy/externalconnect/libtest.sh @@ -26,13 +26,15 @@ function run_external_connect_test() { echo "Failed $failure_count times with $i runs." if [[ "$failure_count" -ge 2 ]]; then echo "Test failed: too many runs have a non-zero exit code." - exit 1 + return 1 fi else ((success_count++)) fi sleep 1 done + + return 0 } function print_mieru_client_log() { @@ -45,14 +47,16 @@ function delete_mieru_client_log() { rm -rf $HOME/.cache/mieru/*.log } -function print_mieru_server_thread_dump() { - echo "========== BEGIN OF MIERU SERVER THREAD DUMP ==========" - ./mita get thread-dump - echo "========== END OF MIERU SERVER THREAD DUMP ==========" +function print_mieru_client_metrics() { + echo "========== BEGIN OF MIERU CLIENT METRICS ==========" + ./mieru get metrics + ./mieru get memory-statistics + echo "========== END OF MIERU CLIENT METRICS ==========" } -function print_mieru_client_thread_dump() { - echo "========== BEGIN OF MIERU CLIENT THREAD DUMP ==========" - ./mieru get thread-dump - echo "========== END OF MIERU CLIENT THREAD DUMP ==========" +function print_mieru_server_metrics() { + echo "========== BEGIN OF MIERU SERVER METRICS ==========" + ./mita get metrics + ./mita get memory-statistics + echo "========== END OF MIERU SERVER METRICS ==========" } diff --git a/mieru/test/deploy/externalconnect/server_tcp.json b/mieru/test/deploy/externalconnect/server_tcp.json index 2352525b10..201539f0ad 100644 --- a/mieru/test/deploy/externalconnect/server_tcp.json +++ b/mieru/test/deploy/externalconnect/server_tcp.json @@ -26,5 +26,5 @@ "advancedSettings": { "allowLocalDestination": true }, - "loggingLevel": "DEBUG" + "loggingLevel": "TRACE" } diff --git a/mieru/test/deploy/externalconnect/server_udp.json b/mieru/test/deploy/externalconnect/server_udp.json index 9bdb561853..884e01ed3c 100644 --- a/mieru/test/deploy/externalconnect/server_udp.json +++ b/mieru/test/deploy/externalconnect/server_udp.json @@ -26,6 +26,6 @@ "advancedSettings": { "allowLocalDestination": true }, - "loggingLevel": "DEBUG", + "loggingLevel": "TRACE", "mtu": 1500 } diff --git a/mieru/test/deploy/externalconnect/test_tcp.sh b/mieru/test/deploy/externalconnect/test_tcp.sh index 44ed557c8d..497dcbe2de 100755 --- a/mieru/test/deploy/externalconnect/test_tcp.sh +++ b/mieru/test/deploy/externalconnect/test_tcp.sh @@ -58,6 +58,14 @@ fi # Start testing. sleep 2 run_external_connect_test +if [[ "$?" -ne 0 ]]; then + print_mieru_client_log + sleep 1 + print_mieru_client_metrics + sleep 1 + print_mieru_server_metrics + exit 1 +fi # Stop mieru client. ./mieru stop diff --git a/mieru/test/deploy/externalconnect/test_udp.sh b/mieru/test/deploy/externalconnect/test_udp.sh index dbdff78028..741fe8a345 100755 --- a/mieru/test/deploy/externalconnect/test_udp.sh +++ b/mieru/test/deploy/externalconnect/test_udp.sh @@ -58,6 +58,14 @@ fi # Start testing. sleep 2 run_external_connect_test +if [[ "$?" -ne 0 ]]; then + print_mieru_client_log + sleep 1 + print_mieru_client_metrics + sleep 1 + print_mieru_server_metrics + exit 1 +fi # Stop mieru client. ./mieru stop diff --git a/mieru/test/deploy/httptest/libtest.sh b/mieru/test/deploy/httptest/libtest.sh index 3a84e7497c..260d55e307 100755 --- a/mieru/test/deploy/httptest/libtest.sh +++ b/mieru/test/deploy/httptest/libtest.sh @@ -25,14 +25,28 @@ function delete_mieru_client_log() { rm -rf $HOME/.cache/mieru/*.log } +function print_mieru_client_thread_dump() { + echo "========== BEGIN OF MIERU CLIENT THREAD DUMP ==========" + ./mieru get thread-dump + echo "========== END OF MIERU CLIENT THREAD DUMP ==========" +} + function print_mieru_server_thread_dump() { echo "========== BEGIN OF MIERU SERVER THREAD DUMP ==========" ./mita get thread-dump echo "========== END OF MIERU SERVER THREAD DUMP ==========" } -function print_mieru_client_thread_dump() { - echo "========== BEGIN OF MIERU CLIENT THREAD DUMP ==========" - ./mieru get thread-dump - echo "========== END OF MIERU CLIENT THREAD DUMP ==========" +function print_mieru_client_metrics() { + echo "========== BEGIN OF MIERU CLIENT METRICS ==========" + ./mieru get metrics + ./mieru get memory-statistics + echo "========== END OF MIERU CLIENT METRICS ==========" +} + +function print_mieru_server_metrics() { + echo "========== BEGIN OF MIERU SERVER METRICS ==========" + ./mita get metrics + ./mita get memory-statistics + echo "========== END OF MIERU SERVER METRICS ==========" } diff --git a/mieru/test/deploy/httptest/test_mix_udp_associate.sh b/mieru/test/deploy/httptest/test_mix_udp_associate.sh index d0ad7150a9..d0f870b38b 100755 --- a/mieru/test/deploy/httptest/test_mix_udp_associate.sh +++ b/mieru/test/deploy/httptest/test_mix_udp_associate.sh @@ -77,17 +77,9 @@ fi ./mita get heap-profile /test/mita.associate.heap.gz # Print metrics and memory statistics. -echo "client metrics" -./mieru get metrics +print_mieru_client_metrics sleep 1 -echo "server metrics" -./mita get metrics -sleep 1 -echo "client memory statistics" -./mieru get memory-statistics -sleep 1 -echo "server memory statistics" -./mita get memory-statistics +print_mieru_server_metrics sleep 1 # Stop mieru client. diff --git a/mieru/test/deploy/httptest/test_tcp.sh b/mieru/test/deploy/httptest/test_tcp.sh index 04538a57a2..6a40f66da4 100755 --- a/mieru/test/deploy/httptest/test_tcp.sh +++ b/mieru/test/deploy/httptest/test_tcp.sh @@ -101,12 +101,10 @@ fi ./mieru get heap-profile /test/mieru.tcp.heap.gz ./mita get heap-profile /test/mita.tcp.heap.gz -# Print memory statistics. -echo "client memory statistics" -./mieru get memory-statistics +# Print metrics and memory statistics. +print_mieru_client_metrics sleep 1 -echo "server memory statistics" -./mita get memory-statistics +print_mieru_server_metrics sleep 1 # Stop mieru client. diff --git a/mieru/test/deploy/httptest/test_udp.sh b/mieru/test/deploy/httptest/test_udp.sh index 732f98068f..c7b472f069 100755 --- a/mieru/test/deploy/httptest/test_udp.sh +++ b/mieru/test/deploy/httptest/test_udp.sh @@ -101,12 +101,10 @@ fi ./mieru get heap-profile /test/mieru.udp.heap.gz ./mita get heap-profile /test/mita.udp.heap.gz -# Print memory statistics. -echo "client memory statistics" -./mieru get memory-statistics +# Print metrics and memory statistics. +print_mieru_client_metrics sleep 1 -echo "server memory statistics" -./mita get memory-statistics +print_mieru_server_metrics sleep 1 # Stop mieru client. diff --git a/mieru/tools/gen_users.py b/mieru/tools/gen_users.py index 08289238c7..8299d4bf12 100755 --- a/mieru/tools/gen_users.py +++ b/mieru/tools/gen_users.py @@ -16,7 +16,7 @@ # along with this program. If not, see . ''' -This program generates users that can be used in mieru server configurations. +This program generates users that can be used in mita server configurations. ''' diff --git a/mihomo/component/process/process_linux.go b/mihomo/component/process/process_linux.go index f817449554..4667104cc2 100644 --- a/mihomo/component/process/process_linux.go +++ b/mihomo/component/process/process_linux.go @@ -2,19 +2,23 @@ package process import ( "bytes" + "context" "encoding/binary" "fmt" "net/netip" "os" - "path" "path/filepath" "runtime" "strings" + "sync" "syscall" "unicode" "unsafe" + "github.com/metacubex/mihomo/log" + "github.com/mdlayher/netlink" + tun "github.com/metacubex/sing-tun" "golang.org/x/sys/unix" ) @@ -59,6 +63,19 @@ type inetDiagResponse struct { INode uint32 } +type MyCallback struct{} + +var ( + packageManager tun.PackageManager + once sync.Once +) + +func (cb *MyCallback) OnPackagesUpdated(packageCount int, sharedCount int) {} + +func (cb *MyCallback) NewError(ctx context.Context, err error) { + log.Warnln("%s", err) +} + func findProcessName(network string, ip netip.Addr, srcPort int) (uint32, string, error) { uid, inode, err := resolveSocketByNetlink(network, ip, srcPort) if err != nil { @@ -162,12 +179,7 @@ func resolveProcessNameByProcSearch(inode, uid uint32) (string, error) { } if runtime.GOOS == "android" { if bytes.Equal(buffer[:n], socket) { - cmdline, err := os.ReadFile(path.Join(processPath, "cmdline")) - if err != nil { - return "", err - } - - return splitCmdline(cmdline), nil + return findPackageName(uid), nil } } else { if bytes.Equal(buffer[:n], socket) { @@ -181,17 +193,29 @@ func resolveProcessNameByProcSearch(inode, uid uint32) (string, error) { return "", fmt.Errorf("process of uid(%d),inode(%d) not found", uid, inode) } -func splitCmdline(cmdline []byte) string { - cmdline = bytes.Trim(cmdline, " ") - - idx := bytes.IndexFunc(cmdline, func(r rune) bool { - return unicode.IsControl(r) || unicode.IsSpace(r) || r == ':' +func findPackageName(uid uint32) string { + once.Do(func() { + callback := &MyCallback{} + var err error + packageManager, err = tun.NewPackageManager(callback) + if err != nil { + log.Warnln("%s", err) + } + err = packageManager.Start() + if err != nil { + log.Warnln("%s", err) + return + } }) - if idx == -1 { - return filepath.Base(string(cmdline)) + if sharedPackage, loaded := packageManager.SharedPackageByID(uid % 100000); loaded { + fmt.Println(loaded) + return sharedPackage } - return filepath.Base(string(cmdline[:idx])) + if packageName, loaded := packageManager.PackageByID(uid % 100000); loaded { + return packageName + } + return "" } func isPid(s string) bool { diff --git a/mihomo/listener/sing_tun/server.go b/mihomo/listener/sing_tun/server.go index 09bf308c73..a5edb77f63 100644 --- a/mihomo/listener/sing_tun/server.go +++ b/mihomo/listener/sing_tun/server.go @@ -24,6 +24,7 @@ import ( E "github.com/sagernet/sing/common/exceptions" F "github.com/sagernet/sing/common/format" "github.com/sagernet/sing/common/ranges" + "golang.org/x/exp/slices" ) var InterfaceName = "Meta" @@ -60,19 +61,21 @@ func CalculateInterfaceName(name string) (tunName string) { return } tunIndex := 0 - indexSet := make(map[int]struct{}) + indexArr := make([]int, 0, len(interfaces)) for _, netInterface := range interfaces { if strings.HasPrefix(netInterface.Name, tunName) { index, parseErr := strconv.ParseInt(netInterface.Name[len(tunName):], 10, 16) if parseErr == nil { - indexSet[int(index)] = struct{}{} + indexArr = append(indexArr, int(index)) } } } - for index := range indexSet { + slices.Sort(indexArr) + indexArr = slices.Compact(indexArr) + for _, index := range indexArr { if index == tunIndex { tunIndex += 1 - } else { // indexSet already sorted and distinct, so this tunIndex nobody used + } else { // indexArr already sorted and distinct, so this tunIndex nobody used break } } diff --git a/mihomo/transport/tuic/congestion_v2/bbr_sender.go b/mihomo/transport/tuic/congestion_v2/bbr_sender.go index ed29bd7e95..d8852fbc96 100644 --- a/mihomo/transport/tuic/congestion_v2/bbr_sender.go +++ b/mihomo/transport/tuic/congestion_v2/bbr_sender.go @@ -62,7 +62,7 @@ const ( // Flag. defaultStartupFullLossCount = 8 quicBbr2DefaultLossThreshold = 0.02 - maxBbrBurstPackets = 3 + maxBbrBurstPackets = 10 ) type bbrMode int @@ -334,6 +334,8 @@ func (b *bbrSender) OnPacketSent( } b.sampler.OnPacketSent(sentTime, packetNumber, bytes, bytesInFlight, isRetransmittable) + + b.maybeAppLimited(bytesInFlight) } // CanSend implements the SendAlgorithm interface. @@ -413,8 +415,6 @@ func (b *bbrSender) OnCongestionEventEx(priorInFlight congestion.ByteCount, even // packet in lost_packets. var lastPacketSendState sendTimeState - b.maybeApplimited(priorInFlight) - // Update bytesInFlight b.bytesInFlight = priorInFlight for _, p := range ackedPackets { @@ -541,7 +541,7 @@ func (b *bbrSender) setDrainGain(drainGain float64) { b.drainGain = drainGain } -// What's the current estimated bandwidth in bytes per second. +// Get the current bandwidth estimate. Note that Bandwidth is in bits per second. func (b *bbrSender) bandwidthEstimate() Bandwidth { return b.maxBandwidth.GetBest() } @@ -700,14 +700,13 @@ func (b *bbrSender) checkIfFullBandwidthReached(lastPacketSendState *sendTimeSta } } -func (b *bbrSender) maybeApplimited(bytesInFlight congestion.ByteCount) { +func (b *bbrSender) maybeAppLimited(bytesInFlight congestion.ByteCount) { congestionWindow := b.GetCongestionWindow() if bytesInFlight >= congestionWindow { return } availableBytes := congestionWindow - bytesInFlight - drainLimited := b.mode == bbrModeDrain && bytesInFlight > congestionWindow/2 - if !drainLimited || availableBytes > maxBbrBurstPackets*b.maxDatagramSize { + if availableBytes > maxBbrBurstPackets*b.maxDatagramSize { b.sampler.OnAppLimited() } } diff --git a/openwrt-packages/adguardhome/Makefile b/openwrt-packages/adguardhome/Makefile index 1d2ebac15e..eb773a6404 100644 --- a/openwrt-packages/adguardhome/Makefile +++ b/openwrt-packages/adguardhome/Makefile @@ -6,12 +6,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=adguardhome -PKG_VERSION:=0.107.50 +PKG_VERSION:=0.107.51 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/AdguardTeam/AdGuardHome/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=6c46f69f7fb7556286e579d6472d64435ed2c0920c6a798ac50664dddcc3c5a8 +PKG_HASH:=dea9685282e55940925ff7211f7d72072de5b98134c8f01d5569c04284681650 PKG_LICENSE:=GPL-3.0-only PKG_LICENSE_FILES:=LICENSE.txt @@ -57,7 +57,7 @@ define Download/adguardhome-frontend URL:=https://github.com/AdguardTeam/AdGuardHome/releases/download/v$(PKG_VERSION)/ URL_FILE:=AdGuardHome_frontend.tar.gz FILE:=$(FRONTEND_FILE) - HASH:=ad364302567f003072f9fbc78797fba200ef68f9a7291730af777499a6935aa8 + HASH:=253d05185865840e14e841e4245c3fdb0fdcca28649902303d3869e0bd07cfd7 endef define Build/Prepare diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua index 89378eec45..ef406ad3ff 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua @@ -73,7 +73,7 @@ local doh_validate = function(self, value, t) for i = 1, #val do local v = val[i] if v then - if not datatypes.ipmask4(v) then + if not datatypes.ipmask4(v) and not datatypes.ipmask6(v) then flag = 1 end end diff --git a/ryujinx/Directory.Packages.props b/ryujinx/Directory.Packages.props index a932475479..c6cc01f9a6 100644 --- a/ryujinx/Directory.Packages.props +++ b/ryujinx/Directory.Packages.props @@ -20,7 +20,7 @@ - + diff --git a/ryujinx/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs b/ryujinx/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs index 12ebabddd5..89b1e9e6bb 100644 --- a/ryujinx/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs +++ b/ryujinx/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs @@ -237,7 +237,7 @@ namespace ARMeilleure.CodeGen.Arm64 long originalPosition = _stream.Position; _stream.Seek(0, SeekOrigin.Begin); - _stream.Read(code, 0, code.Length); + _stream.ReadExactly(code, 0, code.Length); _stream.Seek(originalPosition, SeekOrigin.Begin); RelocInfo relocInfo; diff --git a/ryujinx/src/ARMeilleure/CodeGen/X86/Assembler.cs b/ryujinx/src/ARMeilleure/CodeGen/X86/Assembler.cs index 55bf072484..96f4de049c 100644 --- a/ryujinx/src/ARMeilleure/CodeGen/X86/Assembler.cs +++ b/ryujinx/src/ARMeilleure/CodeGen/X86/Assembler.cs @@ -1444,7 +1444,7 @@ namespace ARMeilleure.CodeGen.X86 Span buffer = new byte[jump.JumpPosition - _stream.Position]; - _stream.Read(buffer); + _stream.ReadExactly(buffer); _stream.Seek(ReservedBytesForJump, SeekOrigin.Current); codeStream.Write(buffer); diff --git a/ryujinx/src/Ryujinx.Common/Memory/MemoryOwner.cs b/ryujinx/src/Ryujinx.Common/Memory/MemoryOwner.cs new file mode 100644 index 0000000000..5e567ab8d6 --- /dev/null +++ b/ryujinx/src/Ryujinx.Common/Memory/MemoryOwner.cs @@ -0,0 +1,140 @@ +#nullable enable +using System; +using System.Buffers; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Threading; + +namespace Ryujinx.Common.Memory +{ + /// + /// An implementation with an embedded length and fast + /// accessor, with memory allocated from . + /// + /// The type of item to store. + public sealed class MemoryOwner : IMemoryOwner + { + private readonly int _length; + private T[]? _array; + + /// + /// Initializes a new instance of the class with the specified parameters. + /// + /// The length of the new memory buffer to use + private MemoryOwner(int length) + { + _length = length; + _array = ArrayPool.Shared.Rent(length); + } + + /// + /// Creates a new instance with the specified length. + /// + /// The length of the new memory buffer to use + /// A instance of the requested length + /// Thrown when is not valid + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static MemoryOwner Rent(int length) => new(length); + + /// + /// Creates a new instance with the specified length and the content cleared. + /// + /// The length of the new memory buffer to use + /// A instance of the requested length and the content cleared + /// Thrown when is not valid + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static MemoryOwner RentCleared(int length) + { + MemoryOwner result = new(length); + + result._array.AsSpan(0, length).Clear(); + + return result; + } + + /// + /// Creates a new instance with the content copied from the specified buffer. + /// + /// The buffer to copy + /// A instance with the same length and content as + public static MemoryOwner RentCopy(ReadOnlySpan buffer) + { + MemoryOwner result = new(buffer.Length); + + buffer.CopyTo(result._array); + + return result; + } + + /// + /// Gets the number of items in the current instance. + /// + public int Length + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => _length; + } + + /// + public Memory Memory + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + T[]? array = _array; + + if (array is null) + { + ThrowObjectDisposedException(); + } + + return new(array, 0, _length); + } + } + + /// + /// Gets a wrapping the memory belonging to the current instance. + /// + /// + /// Uses a trick made possible by the .NET 6+ runtime array layout. + /// + public Span Span + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + T[]? array = _array; + + if (array is null) + { + ThrowObjectDisposedException(); + } + + ref T firstElementRef = ref MemoryMarshal.GetArrayDataReference(array); + + return MemoryMarshal.CreateSpan(ref firstElementRef, _length); + } + } + + /// + public void Dispose() + { + T[]? array = Interlocked.Exchange(ref _array, null); + + if (array is not null) + { + ArrayPool.Shared.Return(array); + } + } + + /// + /// Throws an when is . + /// + [DoesNotReturn] + private static void ThrowObjectDisposedException() + { + throw new ObjectDisposedException(nameof(MemoryOwner), "The buffer has already been disposed."); + } + } +} diff --git a/ryujinx/src/Ryujinx.Common/Memory/SpanOwner.cs b/ryujinx/src/Ryujinx.Common/Memory/SpanOwner.cs new file mode 100644 index 0000000000..a4b4adf32b --- /dev/null +++ b/ryujinx/src/Ryujinx.Common/Memory/SpanOwner.cs @@ -0,0 +1,114 @@ +using System; +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Ryujinx.Common.Memory +{ + /// + /// A stack-only type that rents a buffer of a specified length from . + /// It does not implement to avoid being boxed, but should still be disposed. This + /// is easy since C# 8, which allows use of C# `using` constructs on any type that has a public Dispose() method. + /// To keep this type simple, fast, and read-only, it does not check or guard against multiple disposals. + /// For all these reasons, all usage should be with a `using` block or statement. + /// + /// The type of item to store. + public readonly ref struct SpanOwner + { + private readonly int _length; + private readonly T[] _array; + + /// + /// Initializes a new instance of the struct with the specified parameters. + /// + /// The length of the new memory buffer to use + private SpanOwner(int length) + { + _length = length; + _array = ArrayPool.Shared.Rent(length); + } + + /// + /// Gets an empty instance. + /// + public static SpanOwner Empty + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new(0); + } + + /// + /// Creates a new instance with the specified length. + /// + /// The length of the new memory buffer to use + /// A instance of the requested length + /// Thrown when is not valid + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SpanOwner Rent(int length) => new(length); + + /// + /// Creates a new instance with the length and the content cleared. + /// + /// The length of the new memory buffer to use + /// A instance of the requested length and the content cleared + /// Thrown when is not valid + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SpanOwner RentCleared(int length) + { + SpanOwner result = new(length); + + result._array.AsSpan(0, length).Clear(); + + return result; + } + + /// + /// Creates a new instance with the content copied from the specified buffer. + /// + /// The buffer to copy + /// A instance with the same length and content as + public static SpanOwner RentCopy(ReadOnlySpan buffer) + { + SpanOwner result = new(buffer.Length); + + buffer.CopyTo(result._array); + + return result; + } + + /// + /// Gets the number of items in the current instance + /// + public int Length + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => _length; + } + + /// + /// Gets a wrapping the memory belonging to the current instance. + /// + /// + /// Uses a trick made possible by the .NET 6+ runtime array layout. + /// + public Span Span + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + ref T firstElementRef = ref MemoryMarshal.GetArrayDataReference(_array); + + return MemoryMarshal.CreateSpan(ref firstElementRef, _length); + } + } + + /// + /// Implements the duck-typed method. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Dispose() + { + ArrayPool.Shared.Return(_array); + } + } +} diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/IImageArray.cs b/ryujinx/src/Ryujinx.Graphics.GAL/IImageArray.cs index 30cff50b15..d119aa9fbd 100644 --- a/ryujinx/src/Ryujinx.Graphics.GAL/IImageArray.cs +++ b/ryujinx/src/Ryujinx.Graphics.GAL/IImageArray.cs @@ -1,6 +1,8 @@ +using System; + namespace Ryujinx.Graphics.GAL { - public interface IImageArray + public interface IImageArray : IDisposable { void SetFormats(int index, Format[] imageFormats); void SetImages(int index, ITexture[] images); diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/ITextureArray.cs b/ryujinx/src/Ryujinx.Graphics.GAL/ITextureArray.cs index 35c2116b54..9ee79dacbb 100644 --- a/ryujinx/src/Ryujinx.Graphics.GAL/ITextureArray.cs +++ b/ryujinx/src/Ryujinx.Graphics.GAL/ITextureArray.cs @@ -1,6 +1,8 @@ +using System; + namespace Ryujinx.Graphics.GAL { - public interface ITextureArray + public interface ITextureArray : IDisposable { void SetSamplers(int index, ISampler[] samplers); void SetTextures(int index, ITexture[] textures); diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs index edaae3042d..ef227d4a54 100644 --- a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs +++ b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs @@ -66,6 +66,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading Register(CommandType.CounterEventDispose); Register(CommandType.CounterEventFlush); + Register(CommandType.ImageArrayDispose); Register(CommandType.ImageArraySetFormats); Register(CommandType.ImageArraySetImages); @@ -88,6 +89,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading Register(CommandType.TextureSetDataSliceRegion); Register(CommandType.TextureSetStorage); + Register(CommandType.TextureArrayDispose); Register(CommandType.TextureArraySetSamplers); Register(CommandType.TextureArraySetTextures); diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs index 7586953526..cf3f5d6c14 100644 --- a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs +++ b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs @@ -26,6 +26,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading CounterEventDispose, CounterEventFlush, + ImageArrayDispose, ImageArraySetFormats, ImageArraySetImages, @@ -48,6 +49,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading TextureSetDataSliceRegion, TextureSetStorage, + TextureArrayDispose, TextureArraySetSamplers, TextureArraySetTextures, diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/ImageArray/ImageArrayDisposeCommand.cs b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/ImageArray/ImageArrayDisposeCommand.cs new file mode 100644 index 0000000000..ac2ac933b7 --- /dev/null +++ b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/ImageArray/ImageArrayDisposeCommand.cs @@ -0,0 +1,21 @@ +using Ryujinx.Graphics.GAL.Multithreading.Model; +using Ryujinx.Graphics.GAL.Multithreading.Resources; + +namespace Ryujinx.Graphics.GAL.Multithreading.Commands.ImageArray +{ + struct ImageArrayDisposeCommand : IGALCommand, IGALCommand + { + public readonly CommandType CommandType => CommandType.ImageArrayDispose; + private TableRef _imageArray; + + public void Set(TableRef imageArray) + { + _imageArray = imageArray; + } + + public static void Run(ref ImageArrayDisposeCommand command, ThreadedRenderer threaded, IRenderer renderer) + { + command._imageArray.Get(threaded).Base.Dispose(); + } + } +} diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/TextureArray/TextureArrayDisposeCommand.cs b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/TextureArray/TextureArrayDisposeCommand.cs new file mode 100644 index 0000000000..fec1c48f0d --- /dev/null +++ b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/TextureArray/TextureArrayDisposeCommand.cs @@ -0,0 +1,21 @@ +using Ryujinx.Graphics.GAL.Multithreading.Model; +using Ryujinx.Graphics.GAL.Multithreading.Resources; + +namespace Ryujinx.Graphics.GAL.Multithreading.Commands.TextureArray +{ + struct TextureArrayDisposeCommand : IGALCommand, IGALCommand + { + public readonly CommandType CommandType => CommandType.TextureArrayDispose; + private TableRef _textureArray; + + public void Set(TableRef textureArray) + { + _textureArray = textureArray; + } + + public static void Run(ref TextureArrayDisposeCommand command, ThreadedRenderer threaded, IRenderer renderer) + { + command._textureArray.Get(threaded).Base.Dispose(); + } + } +} diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/TextureAndSamplerArray/TextureArraySetSamplersCommand.cs b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/TextureArray/TextureArraySetSamplersCommand.cs similarity index 100% rename from ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/TextureAndSamplerArray/TextureArraySetSamplersCommand.cs rename to ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/TextureArray/TextureArraySetSamplersCommand.cs diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/TextureAndSamplerArray/TextureArraySetTexturesCommand.cs b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/TextureArray/TextureArraySetTexturesCommand.cs similarity index 100% rename from ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/TextureAndSamplerArray/TextureArraySetTexturesCommand.cs rename to ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Commands/TextureArray/TextureArraySetTexturesCommand.cs diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ThreadedImageArray.cs b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ThreadedImageArray.cs index d26ee1fbd5..19bc6f233a 100644 --- a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ThreadedImageArray.cs +++ b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ThreadedImageArray.cs @@ -21,6 +21,12 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Resources return new TableRef(_renderer, reference); } + public void Dispose() + { + _renderer.New().Set(Ref(this)); + _renderer.QueueCommand(); + } + public void SetFormats(int index, Format[] imageFormats) { _renderer.New().Set(Ref(this), index, Ref(imageFormats)); diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ThreadedTextureArray.cs b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ThreadedTextureArray.cs index 82405a1f69..4334c70484 100644 --- a/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ThreadedTextureArray.cs +++ b/ryujinx/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ThreadedTextureArray.cs @@ -22,6 +22,12 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Resources return new TableRef(_renderer, reference); } + public void Dispose() + { + _renderer.New().Set(Ref(this)); + _renderer.QueueCommand(); + } + public void SetSamplers(int index, ISampler[] samplers) { _renderer.New().Set(Ref(this), index, Ref(samplers.ToArray())); diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs index 18e28b3dd7..01e34c7771 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs @@ -1113,6 +1113,15 @@ namespace Ryujinx.Graphics.Gpu.Image nextNode = nextNode.Next; _cacheFromBuffer.Remove(toRemove.Value.Key); _lruCache.Remove(toRemove); + + if (toRemove.Value.Key.IsImage) + { + toRemove.Value.ImageArray.Dispose(); + } + else + { + toRemove.Value.TextureArray.Dispose(); + } } } @@ -1124,11 +1133,20 @@ namespace Ryujinx.Graphics.Gpu.Image { List keysToRemove = null; - foreach (CacheEntryFromPoolKey key in _cacheFromPool.Keys) + foreach ((CacheEntryFromPoolKey key, CacheEntry entry) in _cacheFromPool) { if (key.MatchesPool(pool)) { (keysToRemove ??= new()).Add(key); + + if (key.IsImage) + { + entry.ImageArray.Dispose(); + } + else + { + entry.TextureArray.Dispose(); + } } } diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs index ab4508f6d1..3837092c94 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs @@ -195,7 +195,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache switch (algorithm) { case CompressionAlgorithm.None: - stream.Read(data); + stream.ReadExactly(data); break; case CompressionAlgorithm.Deflate: stream = new DeflateStream(stream, CompressionMode.Decompress, true); diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs index 59d2cfb3fe..08cd3bb02e 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs @@ -220,7 +220,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache } dataFileStream.Seek((long)entry.Offset, SeekOrigin.Begin); - dataFileStream.Read(cb1Data); + dataFileStream.ReadExactly(cb1Data); BinarySerializer.ReadCompressed(dataFileStream, guestCode); _cache[index] = (guestCode, cb1Data); @@ -279,7 +279,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache dataFileStream.Seek((long)entry.Offset, SeekOrigin.Begin); byte[] cachedCode = new byte[entry.CodeSize]; byte[] cachedCb1Data = new byte[entry.Cb1DataSize]; - dataFileStream.Read(cachedCb1Data); + dataFileStream.ReadExactly(cachedCb1Data); BinarySerializer.ReadCompressed(dataFileStream, cachedCode); if (data.SequenceEqual(cachedCode) && cb1Data.SequenceEqual(cachedCb1Data)) diff --git a/ryujinx/src/Ryujinx.Graphics.OpenGL/Image/ImageArray.cs b/ryujinx/src/Ryujinx.Graphics.OpenGL/Image/ImageArray.cs index 1c5acedf3a..6198823d9d 100644 --- a/ryujinx/src/Ryujinx.Graphics.OpenGL/Image/ImageArray.cs +++ b/ryujinx/src/Ryujinx.Graphics.OpenGL/Image/ImageArray.cs @@ -63,5 +63,9 @@ namespace Ryujinx.Graphics.OpenGL.Image } } } + + public void Dispose() + { + } } } diff --git a/ryujinx/src/Ryujinx.Graphics.OpenGL/Image/TextureArray.cs b/ryujinx/src/Ryujinx.Graphics.OpenGL/Image/TextureArray.cs index d70b0a0081..41ac058c1c 100644 --- a/ryujinx/src/Ryujinx.Graphics.OpenGL/Image/TextureArray.cs +++ b/ryujinx/src/Ryujinx.Graphics.OpenGL/Image/TextureArray.cs @@ -48,5 +48,9 @@ namespace Ryujinx.Graphics.OpenGL.Image } } } + + public void Dispose() + { + } } } diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs index f3be29bb9d..cc7977f848 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs @@ -98,11 +98,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv Logger = parameters.Logger; TargetApi = parameters.TargetApi; - AddCapability(Capability.Shader); - AddCapability(Capability.Float64); - - SetMemoryModel(AddressingModel.Logical, MemoryModel.GLSL450); - Delegates = new SpirvDelegates(this); } diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs index ccfdc46d09..b259dde28c 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs @@ -43,6 +43,10 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv CodeGenContext context = new(info, parameters, instPool, integerPool); + context.AddCapability(Capability.Shader); + + context.SetMemoryModel(AddressingModel.Logical, MemoryModel.GLSL450); + context.AddCapability(Capability.GroupNonUniformBallot); context.AddCapability(Capability.GroupNonUniformShuffle); context.AddCapability(Capability.GroupNonUniformVote); @@ -51,6 +55,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv context.AddCapability(Capability.ImageQuery); context.AddCapability(Capability.SampledBuffer); + if (parameters.HostCapabilities.SupportsShaderFloat64) + { + context.AddCapability(Capability.Float64); + } + if (parameters.Definitions.TransformFeedbackEnabled && parameters.Definitions.LastInVertexPipeline) { context.AddCapability(Capability.TransformFeedback); @@ -58,7 +67,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv if (parameters.Definitions.Stage == ShaderStage.Fragment) { - if (context.Info.IoDefinitions.Contains(new IoDefinition(StorageKind.Input, IoVariable.Layer))) + if (context.Info.IoDefinitions.Contains(new IoDefinition(StorageKind.Input, IoVariable.Layer)) || + context.Info.IoDefinitions.Contains(new IoDefinition(StorageKind.Input, IoVariable.PrimitiveId))) { context.AddCapability(Capability.Geometry); } diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/HostCapabilities.cs b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/HostCapabilities.cs index 2523272b0c..11fe6599db 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/HostCapabilities.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/HostCapabilities.cs @@ -8,6 +8,7 @@ namespace Ryujinx.Graphics.Shader.Translation public readonly bool SupportsGeometryShaderPassthrough; public readonly bool SupportsShaderBallot; public readonly bool SupportsShaderBarrierDivergence; + public readonly bool SupportsShaderFloat64; public readonly bool SupportsTextureShadowLod; public readonly bool SupportsViewportMask; @@ -18,6 +19,7 @@ namespace Ryujinx.Graphics.Shader.Translation bool supportsGeometryShaderPassthrough, bool supportsShaderBallot, bool supportsShaderBarrierDivergence, + bool supportsShaderFloat64, bool supportsTextureShadowLod, bool supportsViewportMask) { @@ -27,6 +29,7 @@ namespace Ryujinx.Graphics.Shader.Translation SupportsGeometryShaderPassthrough = supportsGeometryShaderPassthrough; SupportsShaderBallot = supportsShaderBallot; SupportsShaderBarrierDivergence = supportsShaderBarrierDivergence; + SupportsShaderFloat64 = supportsShaderFloat64; SupportsTextureShadowLod = supportsTextureShadowLod; SupportsViewportMask = supportsViewportMask; } diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs index 59914736ee..a579433f92 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs @@ -363,6 +363,7 @@ namespace Ryujinx.Graphics.Shader.Translation GpuAccessor.QueryHostSupportsGeometryShaderPassthrough(), GpuAccessor.QueryHostSupportsShaderBallot(), GpuAccessor.QueryHostSupportsShaderBarrierDivergence(), + GpuAccessor.QueryHostSupportsShaderFloat64(), GpuAccessor.QueryHostSupportsTextureShadowLod(), GpuAccessor.QueryHostSupportsViewportMask()); diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs index 382f88d053..3590d5d057 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs @@ -291,8 +291,9 @@ namespace Ryujinx.Graphics.Vulkan } else { - PipelineStageFlags stageFlags = _textureArrayRefs[segment.Binding].Stage.ConvertToPipelineStageFlags(); - _textureArrayRefs[segment.Binding].Array?.QueueWriteToReadBarriers(cbs, stageFlags); + ref var arrayRef = ref _textureArrayRefs[segment.Binding]; + PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags(); + arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags); } } } @@ -311,8 +312,40 @@ namespace Ryujinx.Graphics.Vulkan } else { - PipelineStageFlags stageFlags = _imageArrayRefs[segment.Binding].Stage.ConvertToPipelineStageFlags(); - _imageArrayRefs[segment.Binding].Array?.QueueWriteToReadBarriers(cbs, stageFlags); + ref var arrayRef = ref _imageArrayRefs[segment.Binding]; + PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags(); + arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags); + } + } + } + + for (int setIndex = PipelineBase.DescriptorSetLayouts; setIndex < _program.BindingSegments.Length; setIndex++) + { + var bindingSegments = _program.BindingSegments[setIndex]; + + if (bindingSegments.Length == 0) + { + continue; + } + + ResourceBindingSegment segment = bindingSegments[0]; + + if (segment.IsArray) + { + if (segment.Type == ResourceType.Texture || + segment.Type == ResourceType.Sampler || + segment.Type == ResourceType.TextureAndSampler || + segment.Type == ResourceType.BufferTexture) + { + ref var arrayRef = ref _textureArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts]; + PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags(); + arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags); + } + else if (segment.Type == ResourceType.Image || segment.Type == ResourceType.BufferImage) + { + ref var arrayRef = ref _imageArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts]; + PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags(); + arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags); } } } diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/ImageArray.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/ImageArray.cs index 3c7f321ff7..e42750d3ce 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/ImageArray.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/ImageArray.cs @@ -2,11 +2,10 @@ using Ryujinx.Graphics.GAL; using Silk.NET.Vulkan; using System; using System.Collections.Generic; -using System.Diagnostics; namespace Ryujinx.Graphics.Vulkan { - class ImageArray : IImageArray + class ImageArray : ResourceArray, IImageArray { private readonly VulkanRenderer _gd; @@ -25,19 +24,11 @@ namespace Ryujinx.Graphics.Vulkan private HashSet _storages; - private DescriptorSet[] _cachedDescriptorSets; - private int _cachedCommandBufferIndex; private int _cachedSubmissionCount; - private ShaderCollection _cachedDscProgram; - private int _cachedDscSetIndex; - private int _cachedDscIndex; - private readonly bool _isBuffer; - private int _bindCount; - public ImageArray(VulkanRenderer gd, int size, bool isBuffer) { _gd = gd; @@ -104,12 +95,7 @@ namespace Ryujinx.Graphics.Vulkan { _cachedCommandBufferIndex = -1; _storages = null; - _cachedDescriptorSets = null; - - if (_bindCount != 0) - { - _gd.PipelineInternal.ForceImageDirty(); - } + SetDirty(_gd); } public void QueueWriteToReadBarriers(CommandBufferScoped cbs, PipelineStageFlags stageFlags) @@ -195,7 +181,7 @@ namespace Ryujinx.Graphics.Vulkan int setIndex, TextureView dummyTexture) { - if (_cachedDescriptorSets != null) + if (TryGetCachedDescriptorSets(cbs, program, setIndex, out DescriptorSet[] sets)) { // We still need to ensure the current command buffer holds a reference to all used textures. @@ -208,12 +194,9 @@ namespace Ryujinx.Graphics.Vulkan GetBufferViews(cbs); } - return _cachedDescriptorSets; + return sets; } - _cachedDscProgram?.ReleaseManualDescriptorSetCollection(_cachedDscSetIndex, _cachedDscIndex); - var dsc = program.GetNewManualDescriptorSetCollection(cbs.CommandBufferIndex, setIndex, out _cachedDscIndex).Get(cbs); - DescriptorSetTemplate template = program.Templates[setIndex]; DescriptorSetTemplateWriter tu = templateUpdater.Begin(template); @@ -227,24 +210,9 @@ namespace Ryujinx.Graphics.Vulkan tu.Push(GetBufferViews(cbs)); } - var sets = dsc.GetSets(); templateUpdater.Commit(_gd, device, sets[0]); - _cachedDescriptorSets = sets; - _cachedDscProgram = program; - _cachedDscSetIndex = setIndex; return sets; } - - public void IncrementBindCount() - { - _bindCount++; - } - - public void DecrementBindCount() - { - int newBindCount = --_bindCount; - Debug.Assert(newBindCount >= 0); - } } } diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs index 0bce3b72df..806b872bc2 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Memory; using Silk.NET.Vulkan; using System; @@ -165,14 +166,15 @@ namespace Ryujinx.Graphics.Vulkan /// True if all fences were signaled before the timeout expired, false otherwise private bool WaitForFencesImpl(Vk api, Device device, int offset, int size, bool hasTimeout, ulong timeout) { - Span fenceHolders = new FenceHolder[CommandBufferPool.MaxCommandBuffers]; + using SpanOwner fenceHoldersOwner = SpanOwner.Rent(CommandBufferPool.MaxCommandBuffers); + Span fenceHolders = fenceHoldersOwner.Span; int count = size != 0 ? GetOverlappingFences(fenceHolders, offset, size) : GetFences(fenceHolders); Span fences = stackalloc Fence[count]; int fenceCount = 0; - for (int i = 0; i < count; i++) + for (int i = 0; i < fences.Length; i++) { if (fenceHolders[i].TryGet(out Fence fence)) { diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineConverter.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineConverter.cs index 41618c736e..7d124c830a 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineConverter.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineConverter.cs @@ -180,9 +180,6 @@ namespace Ryujinx.Graphics.Vulkan pipeline.LogicOpEnable = state.LogicOpEnable; pipeline.LogicOp = state.LogicOp.Convert(); - pipeline.MinDepthBounds = 0f; // Not implemented. - pipeline.MaxDepthBounds = 0f; // Not implemented. - pipeline.PatchControlPoints = state.PatchControlPoints; pipeline.PolygonMode = PolygonMode.Fill; // Not implemented. pipeline.PrimitiveRestartEnable = state.PrimitiveRestartEnable; @@ -208,17 +205,11 @@ namespace Ryujinx.Graphics.Vulkan pipeline.StencilFrontPassOp = state.StencilTest.FrontDpPass.Convert(); pipeline.StencilFrontDepthFailOp = state.StencilTest.FrontDpFail.Convert(); pipeline.StencilFrontCompareOp = state.StencilTest.FrontFunc.Convert(); - pipeline.StencilFrontCompareMask = 0; - pipeline.StencilFrontWriteMask = 0; - pipeline.StencilFrontReference = 0; pipeline.StencilBackFailOp = state.StencilTest.BackSFail.Convert(); pipeline.StencilBackPassOp = state.StencilTest.BackDpPass.Convert(); pipeline.StencilBackDepthFailOp = state.StencilTest.BackDpFail.Convert(); pipeline.StencilBackCompareOp = state.StencilTest.BackFunc.Convert(); - pipeline.StencilBackCompareMask = 0; - pipeline.StencilBackWriteMask = 0; - pipeline.StencilBackReference = 0; pipeline.StencilTestEnable = state.StencilTest.TestEnable; diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCacheEntry.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCacheEntry.cs index 7d0948d6e6..ae296b033f 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCacheEntry.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCacheEntry.cs @@ -3,6 +3,7 @@ using Silk.NET.Vulkan; using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics; using System.Runtime.InteropServices; namespace Ryujinx.Graphics.Vulkan @@ -15,6 +16,7 @@ namespace Ryujinx.Graphics.Vulkan private readonly Device _device; public DescriptorSetLayout[] DescriptorSetLayouts { get; } + public bool[] DescriptorSetLayoutsUpdateAfterBind { get; } public PipelineLayout PipelineLayout { get; } private readonly int[] _consumedDescriptorsPerSet; @@ -31,20 +33,37 @@ namespace Ryujinx.Graphics.Vulkan private struct ManualDescriptorSetEntry { public Auto DescriptorSet; - public int CbIndex; - public int CbSubmissionCount; + public uint CbRefMask; public bool InUse; - public ManualDescriptorSetEntry(Auto descriptorSet, int cbIndex, int cbSubmissionCount, bool inUse) + public ManualDescriptorSetEntry(Auto descriptorSet, int cbIndex) { DescriptorSet = descriptorSet; - CbIndex = cbIndex; - CbSubmissionCount = cbSubmissionCount; - InUse = inUse; + CbRefMask = 1u << cbIndex; + InUse = true; + } + } + + private readonly struct PendingManualDsConsumption + { + public FenceHolder Fence { get; } + public int CommandBufferIndex { get; } + public int SetIndex { get; } + public int CacheIndex { get; } + + public PendingManualDsConsumption(FenceHolder fence, int commandBufferIndex, int setIndex, int cacheIndex) + { + Fence = fence; + CommandBufferIndex = commandBufferIndex; + SetIndex = setIndex; + CacheIndex = cacheIndex; + fence.Get(); } } private readonly List[] _manualDsCache; + private readonly Queue _pendingManualDsConsumptions; + private readonly Queue[] _freeManualDsCacheEntries; private readonly Dictionary _pdTemplates; private readonly ResourceDescriptorCollection _pdDescriptors; @@ -70,6 +89,8 @@ namespace Ryujinx.Graphics.Vulkan _dsCacheCursor = new int[setsCount]; _manualDsCache = new List[setsCount]; + _pendingManualDsConsumptions = new Queue(); + _freeManualDsCacheEntries = new Queue[setsCount]; } public PipelineLayoutCacheEntry( @@ -78,7 +99,11 @@ namespace Ryujinx.Graphics.Vulkan ReadOnlyCollection setDescriptors, bool usePushDescriptors) : this(gd, device, setDescriptors.Count) { - (DescriptorSetLayouts, PipelineLayout) = PipelineLayoutFactory.Create(gd, device, setDescriptors, usePushDescriptors); + ResourceLayouts layouts = PipelineLayoutFactory.Create(gd, device, setDescriptors, usePushDescriptors); + + DescriptorSetLayouts = layouts.DescriptorSetLayouts; + DescriptorSetLayoutsUpdateAfterBind = layouts.DescriptorSetLayoutsUpdateAfterBind; + PipelineLayout = layouts.PipelineLayout; _consumedDescriptorsPerSet = new int[setDescriptors.Count]; _poolSizes = new DescriptorPoolSize[setDescriptors.Count][]; @@ -133,7 +158,7 @@ namespace Ryujinx.Graphics.Vulkan _poolSizes[setIndex], setIndex, _consumedDescriptorsPerSet[setIndex], - false); + DescriptorSetLayoutsUpdateAfterBind[setIndex]); list.Add(dsc); isNew = true; @@ -144,49 +169,99 @@ namespace Ryujinx.Graphics.Vulkan return list[index]; } - public Auto GetNewManualDescriptorSetCollection(int commandBufferIndex, int setIndex, out int cacheIndex) + public Auto GetNewManualDescriptorSetCollection(CommandBufferScoped cbs, int setIndex, out int cacheIndex) { - int submissionCount = _gd.CommandBufferPool.GetSubmissionCount(commandBufferIndex); + FreeCompletedManualDescriptorSets(); var list = _manualDsCache[setIndex] ??= new(); var span = CollectionsMarshal.AsSpan(list); - for (int index = 0; index < span.Length; index++) + Queue freeQueue = _freeManualDsCacheEntries[setIndex]; + + // Do we have at least one freed descriptor set? If so, just use that. + if (freeQueue != null && freeQueue.TryDequeue(out int freeIndex)) { - ref ManualDescriptorSetEntry entry = ref span[index]; + ref ManualDescriptorSetEntry entry = ref span[freeIndex]; - if (!entry.InUse && (entry.CbIndex != commandBufferIndex || entry.CbSubmissionCount != submissionCount)) - { - entry.InUse = true; - entry.CbIndex = commandBufferIndex; - entry.CbSubmissionCount = submissionCount; + Debug.Assert(!entry.InUse && entry.CbRefMask == 0); - cacheIndex = index; + entry.InUse = true; + entry.CbRefMask = 1u << cbs.CommandBufferIndex; + cacheIndex = freeIndex; - return entry.DescriptorSet; - } + _pendingManualDsConsumptions.Enqueue(new PendingManualDsConsumption(cbs.GetFence(), cbs.CommandBufferIndex, setIndex, freeIndex)); + + return entry.DescriptorSet; } + // Otherwise create a new descriptor set, and add to our pending queue for command buffer consumption tracking. var dsc = _descriptorSetManager.AllocateDescriptorSet( _gd.Api, DescriptorSetLayouts[setIndex], _poolSizes[setIndex], setIndex, _consumedDescriptorsPerSet[setIndex], - false); + DescriptorSetLayoutsUpdateAfterBind[setIndex]); cacheIndex = list.Count; - list.Add(new ManualDescriptorSetEntry(dsc, commandBufferIndex, submissionCount, inUse: true)); + list.Add(new ManualDescriptorSetEntry(dsc, cbs.CommandBufferIndex)); + _pendingManualDsConsumptions.Enqueue(new PendingManualDsConsumption(cbs.GetFence(), cbs.CommandBufferIndex, setIndex, cacheIndex)); return dsc; } + public void UpdateManualDescriptorSetCollectionOwnership(CommandBufferScoped cbs, int setIndex, int cacheIndex) + { + FreeCompletedManualDescriptorSets(); + + var list = _manualDsCache[setIndex]; + var span = CollectionsMarshal.AsSpan(list); + ref var entry = ref span[cacheIndex]; + + uint cbMask = 1u << cbs.CommandBufferIndex; + + if ((entry.CbRefMask & cbMask) == 0) + { + entry.CbRefMask |= cbMask; + + _pendingManualDsConsumptions.Enqueue(new PendingManualDsConsumption(cbs.GetFence(), cbs.CommandBufferIndex, setIndex, cacheIndex)); + } + } + + private void FreeCompletedManualDescriptorSets() + { + FenceHolder signalledFence = null; + while (_pendingManualDsConsumptions.TryPeek(out var pds) && (pds.Fence == signalledFence || pds.Fence.IsSignaled())) + { + signalledFence = pds.Fence; // Already checked - don't need to do it again. + var dequeued = _pendingManualDsConsumptions.Dequeue(); + Debug.Assert(dequeued.Fence == pds.Fence); + pds.Fence.Put(); + + var span = CollectionsMarshal.AsSpan(_manualDsCache[dequeued.SetIndex]); + ref var entry = ref span[dequeued.CacheIndex]; + entry.CbRefMask &= ~(1u << dequeued.CommandBufferIndex); + + if (!entry.InUse && entry.CbRefMask == 0) + { + // If not in use by any array, and not bound to any command buffer, the descriptor set can be re-used immediately. + (_freeManualDsCacheEntries[dequeued.SetIndex] ??= new()).Enqueue(dequeued.CacheIndex); + } + } + } + public void ReleaseManualDescriptorSetCollection(int setIndex, int cacheIndex) { var list = _manualDsCache[setIndex]; var span = CollectionsMarshal.AsSpan(list); span[cacheIndex].InUse = false; + + if (span[cacheIndex].CbRefMask == 0) + { + // This is no longer in use by any array, so if not bound to any command buffer, the descriptor set can be re-used immediately. + (_freeManualDsCacheEntries[setIndex] ??= new()).Enqueue(cacheIndex); + } } private static Span GetDescriptorPoolSizes(Span output, ResourceDescriptorCollection setDescriptor, uint multiplier) @@ -291,6 +366,11 @@ namespace Ryujinx.Graphics.Vulkan _gd.Api.DestroyDescriptorSetLayout(_device, DescriptorSetLayouts[i], null); } + while (_pendingManualDsConsumptions.TryDequeue(out var pds)) + { + pds.Fence.Put(); + } + _descriptorSetManager.Dispose(); } } diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs index 8bf286c654..bca119f6ad 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs @@ -1,18 +1,23 @@ +using Ryujinx.Common.Memory; using Ryujinx.Graphics.GAL; using Silk.NET.Vulkan; +using System; using System.Collections.ObjectModel; namespace Ryujinx.Graphics.Vulkan { + record struct ResourceLayouts(DescriptorSetLayout[] DescriptorSetLayouts, bool[] DescriptorSetLayoutsUpdateAfterBind, PipelineLayout PipelineLayout); + static class PipelineLayoutFactory { - public static unsafe (DescriptorSetLayout[], PipelineLayout) Create( + public static unsafe ResourceLayouts Create( VulkanRenderer gd, Device device, ReadOnlyCollection setDescriptors, bool usePushDescriptors) { DescriptorSetLayout[] layouts = new DescriptorSetLayout[setDescriptors.Count]; + bool[] updateAfterBindFlags = new bool[setDescriptors.Count]; bool isMoltenVk = gd.IsMoltenVk; @@ -32,10 +37,11 @@ namespace Ryujinx.Graphics.Vulkan DescriptorSetLayoutBinding[] layoutBindings = new DescriptorSetLayoutBinding[rdc.Descriptors.Count]; + bool hasArray = false; + for (int descIndex = 0; descIndex < rdc.Descriptors.Count; descIndex++) { ResourceDescriptor descriptor = rdc.Descriptors[descIndex]; - ResourceStages stages = descriptor.Stages; if (descriptor.Type == ResourceType.StorageBuffer && isMoltenVk) @@ -52,16 +58,37 @@ namespace Ryujinx.Graphics.Vulkan DescriptorCount = (uint)descriptor.Count, StageFlags = stages.Convert(), }; + + if (descriptor.Count > 1) + { + hasArray = true; + } } fixed (DescriptorSetLayoutBinding* pLayoutBindings = layoutBindings) { + DescriptorSetLayoutCreateFlags flags = DescriptorSetLayoutCreateFlags.None; + + if (usePushDescriptors && setIndex == 0) + { + flags = DescriptorSetLayoutCreateFlags.PushDescriptorBitKhr; + } + + if (gd.Vendor == Vendor.Intel && hasArray) + { + // Some vendors (like Intel) have low per-stage limits. + // We must set the flag if we exceed those limits. + flags |= DescriptorSetLayoutCreateFlags.UpdateAfterBindPoolBit; + + updateAfterBindFlags[setIndex] = true; + } + var descriptorSetLayoutCreateInfo = new DescriptorSetLayoutCreateInfo { SType = StructureType.DescriptorSetLayoutCreateInfo, PBindings = pLayoutBindings, BindingCount = (uint)layoutBindings.Length, - Flags = usePushDescriptors && setIndex == 0 ? DescriptorSetLayoutCreateFlags.PushDescriptorBitKhr : DescriptorSetLayoutCreateFlags.None, + Flags = flags, }; gd.Api.CreateDescriptorSetLayout(device, descriptorSetLayoutCreateInfo, null, out layouts[setIndex]).ThrowOnError(); @@ -82,7 +109,7 @@ namespace Ryujinx.Graphics.Vulkan gd.Api.CreatePipelineLayout(device, &pipelineLayoutCreateInfo, null, out layout).ThrowOnError(); } - return (layouts, layout); + return new ResourceLayouts(layouts, updateAfterBindFlags, layout); } } } diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineState.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineState.cs index c38748936b..2a8f930811 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineState.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineState.cs @@ -71,244 +71,232 @@ namespace Ryujinx.Graphics.Vulkan set => Internal.Id4 = (Internal.Id4 & 0xFFFFFFFF) | ((ulong)value << 32); } - public float MinDepthBounds - { - readonly get => BitConverter.Int32BitsToSingle((int)((Internal.Id5 >> 0) & 0xFFFFFFFF)); - set => Internal.Id5 = (Internal.Id5 & 0xFFFFFFFF00000000) | ((ulong)(uint)BitConverter.SingleToInt32Bits(value) << 0); - } - - public float MaxDepthBounds - { - readonly get => BitConverter.Int32BitsToSingle((int)((Internal.Id5 >> 32) & 0xFFFFFFFF)); - set => Internal.Id5 = (Internal.Id5 & 0xFFFFFFFF) | ((ulong)(uint)BitConverter.SingleToInt32Bits(value) << 32); - } - public PolygonMode PolygonMode { - readonly get => (PolygonMode)((Internal.Id6 >> 0) & 0x3FFFFFFF); - set => Internal.Id6 = (Internal.Id6 & 0xFFFFFFFFC0000000) | ((ulong)value << 0); + readonly get => (PolygonMode)((Internal.Id5 >> 0) & 0x3FFFFFFF); + set => Internal.Id5 = (Internal.Id5 & 0xFFFFFFFFC0000000) | ((ulong)value << 0); } public uint StagesCount { - readonly get => (byte)((Internal.Id6 >> 30) & 0xFF); - set => Internal.Id6 = (Internal.Id6 & 0xFFFFFFC03FFFFFFF) | ((ulong)value << 30); + readonly get => (byte)((Internal.Id5 >> 30) & 0xFF); + set => Internal.Id5 = (Internal.Id5 & 0xFFFFFFC03FFFFFFF) | ((ulong)value << 30); } public uint VertexAttributeDescriptionsCount { - readonly get => (byte)((Internal.Id6 >> 38) & 0xFF); - set => Internal.Id6 = (Internal.Id6 & 0xFFFFC03FFFFFFFFF) | ((ulong)value << 38); + readonly get => (byte)((Internal.Id5 >> 38) & 0xFF); + set => Internal.Id5 = (Internal.Id5 & 0xFFFFC03FFFFFFFFF) | ((ulong)value << 38); } public uint VertexBindingDescriptionsCount { - readonly get => (byte)((Internal.Id6 >> 46) & 0xFF); - set => Internal.Id6 = (Internal.Id6 & 0xFFC03FFFFFFFFFFF) | ((ulong)value << 46); + readonly get => (byte)((Internal.Id5 >> 46) & 0xFF); + set => Internal.Id5 = (Internal.Id5 & 0xFFC03FFFFFFFFFFF) | ((ulong)value << 46); } public uint ViewportsCount { - readonly get => (byte)((Internal.Id6 >> 54) & 0xFF); - set => Internal.Id6 = (Internal.Id6 & 0xC03FFFFFFFFFFFFF) | ((ulong)value << 54); + readonly get => (byte)((Internal.Id5 >> 54) & 0xFF); + set => Internal.Id5 = (Internal.Id5 & 0xC03FFFFFFFFFFFFF) | ((ulong)value << 54); } public uint ScissorsCount { - readonly get => (byte)((Internal.Id7 >> 0) & 0xFF); - set => Internal.Id7 = (Internal.Id7 & 0xFFFFFFFFFFFFFF00) | ((ulong)value << 0); + readonly get => (byte)((Internal.Id6 >> 0) & 0xFF); + set => Internal.Id6 = (Internal.Id6 & 0xFFFFFFFFFFFFFF00) | ((ulong)value << 0); } public uint ColorBlendAttachmentStateCount { - readonly get => (byte)((Internal.Id7 >> 8) & 0xFF); - set => Internal.Id7 = (Internal.Id7 & 0xFFFFFFFFFFFF00FF) | ((ulong)value << 8); + readonly get => (byte)((Internal.Id6 >> 8) & 0xFF); + set => Internal.Id6 = (Internal.Id6 & 0xFFFFFFFFFFFF00FF) | ((ulong)value << 8); } public PrimitiveTopology Topology { - readonly get => (PrimitiveTopology)((Internal.Id7 >> 16) & 0xF); - set => Internal.Id7 = (Internal.Id7 & 0xFFFFFFFFFFF0FFFF) | ((ulong)value << 16); + readonly get => (PrimitiveTopology)((Internal.Id6 >> 16) & 0xF); + set => Internal.Id6 = (Internal.Id6 & 0xFFFFFFFFFFF0FFFF) | ((ulong)value << 16); } public LogicOp LogicOp { - readonly get => (LogicOp)((Internal.Id7 >> 20) & 0xF); - set => Internal.Id7 = (Internal.Id7 & 0xFFFFFFFFFF0FFFFF) | ((ulong)value << 20); + readonly get => (LogicOp)((Internal.Id6 >> 20) & 0xF); + set => Internal.Id6 = (Internal.Id6 & 0xFFFFFFFFFF0FFFFF) | ((ulong)value << 20); } public CompareOp DepthCompareOp { - readonly get => (CompareOp)((Internal.Id7 >> 24) & 0x7); - set => Internal.Id7 = (Internal.Id7 & 0xFFFFFFFFF8FFFFFF) | ((ulong)value << 24); + readonly get => (CompareOp)((Internal.Id6 >> 24) & 0x7); + set => Internal.Id6 = (Internal.Id6 & 0xFFFFFFFFF8FFFFFF) | ((ulong)value << 24); } public StencilOp StencilFrontFailOp { - readonly get => (StencilOp)((Internal.Id7 >> 27) & 0x7); - set => Internal.Id7 = (Internal.Id7 & 0xFFFFFFFFC7FFFFFF) | ((ulong)value << 27); + readonly get => (StencilOp)((Internal.Id6 >> 27) & 0x7); + set => Internal.Id6 = (Internal.Id6 & 0xFFFFFFFFC7FFFFFF) | ((ulong)value << 27); } public StencilOp StencilFrontPassOp { - readonly get => (StencilOp)((Internal.Id7 >> 30) & 0x7); - set => Internal.Id7 = (Internal.Id7 & 0xFFFFFFFE3FFFFFFF) | ((ulong)value << 30); + readonly get => (StencilOp)((Internal.Id6 >> 30) & 0x7); + set => Internal.Id6 = (Internal.Id6 & 0xFFFFFFFE3FFFFFFF) | ((ulong)value << 30); } public StencilOp StencilFrontDepthFailOp { - readonly get => (StencilOp)((Internal.Id7 >> 33) & 0x7); - set => Internal.Id7 = (Internal.Id7 & 0xFFFFFFF1FFFFFFFF) | ((ulong)value << 33); + readonly get => (StencilOp)((Internal.Id6 >> 33) & 0x7); + set => Internal.Id6 = (Internal.Id6 & 0xFFFFFFF1FFFFFFFF) | ((ulong)value << 33); } public CompareOp StencilFrontCompareOp { - readonly get => (CompareOp)((Internal.Id7 >> 36) & 0x7); - set => Internal.Id7 = (Internal.Id7 & 0xFFFFFF8FFFFFFFFF) | ((ulong)value << 36); + readonly get => (CompareOp)((Internal.Id6 >> 36) & 0x7); + set => Internal.Id6 = (Internal.Id6 & 0xFFFFFF8FFFFFFFFF) | ((ulong)value << 36); } public StencilOp StencilBackFailOp { - readonly get => (StencilOp)((Internal.Id7 >> 39) & 0x7); - set => Internal.Id7 = (Internal.Id7 & 0xFFFFFC7FFFFFFFFF) | ((ulong)value << 39); + readonly get => (StencilOp)((Internal.Id6 >> 39) & 0x7); + set => Internal.Id6 = (Internal.Id6 & 0xFFFFFC7FFFFFFFFF) | ((ulong)value << 39); } public StencilOp StencilBackPassOp { - readonly get => (StencilOp)((Internal.Id7 >> 42) & 0x7); - set => Internal.Id7 = (Internal.Id7 & 0xFFFFE3FFFFFFFFFF) | ((ulong)value << 42); + readonly get => (StencilOp)((Internal.Id6 >> 42) & 0x7); + set => Internal.Id6 = (Internal.Id6 & 0xFFFFE3FFFFFFFFFF) | ((ulong)value << 42); } public StencilOp StencilBackDepthFailOp { - readonly get => (StencilOp)((Internal.Id7 >> 45) & 0x7); - set => Internal.Id7 = (Internal.Id7 & 0xFFFF1FFFFFFFFFFF) | ((ulong)value << 45); + readonly get => (StencilOp)((Internal.Id6 >> 45) & 0x7); + set => Internal.Id6 = (Internal.Id6 & 0xFFFF1FFFFFFFFFFF) | ((ulong)value << 45); } public CompareOp StencilBackCompareOp { - readonly get => (CompareOp)((Internal.Id7 >> 48) & 0x7); - set => Internal.Id7 = (Internal.Id7 & 0xFFF8FFFFFFFFFFFF) | ((ulong)value << 48); + readonly get => (CompareOp)((Internal.Id6 >> 48) & 0x7); + set => Internal.Id6 = (Internal.Id6 & 0xFFF8FFFFFFFFFFFF) | ((ulong)value << 48); } public CullModeFlags CullMode { - readonly get => (CullModeFlags)((Internal.Id7 >> 51) & 0x3); - set => Internal.Id7 = (Internal.Id7 & 0xFFE7FFFFFFFFFFFF) | ((ulong)value << 51); + readonly get => (CullModeFlags)((Internal.Id6 >> 51) & 0x3); + set => Internal.Id6 = (Internal.Id6 & 0xFFE7FFFFFFFFFFFF) | ((ulong)value << 51); } public bool PrimitiveRestartEnable { - readonly get => ((Internal.Id7 >> 53) & 0x1) != 0UL; - set => Internal.Id7 = (Internal.Id7 & 0xFFDFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 53); + readonly get => ((Internal.Id6 >> 53) & 0x1) != 0UL; + set => Internal.Id6 = (Internal.Id6 & 0xFFDFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 53); } public bool DepthClampEnable { - readonly get => ((Internal.Id7 >> 54) & 0x1) != 0UL; - set => Internal.Id7 = (Internal.Id7 & 0xFFBFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 54); + readonly get => ((Internal.Id6 >> 54) & 0x1) != 0UL; + set => Internal.Id6 = (Internal.Id6 & 0xFFBFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 54); } public bool RasterizerDiscardEnable { - readonly get => ((Internal.Id7 >> 55) & 0x1) != 0UL; - set => Internal.Id7 = (Internal.Id7 & 0xFF7FFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 55); + readonly get => ((Internal.Id6 >> 55) & 0x1) != 0UL; + set => Internal.Id6 = (Internal.Id6 & 0xFF7FFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 55); } public FrontFace FrontFace { - readonly get => (FrontFace)((Internal.Id7 >> 56) & 0x1); - set => Internal.Id7 = (Internal.Id7 & 0xFEFFFFFFFFFFFFFF) | ((ulong)value << 56); + readonly get => (FrontFace)((Internal.Id6 >> 56) & 0x1); + set => Internal.Id6 = (Internal.Id6 & 0xFEFFFFFFFFFFFFFF) | ((ulong)value << 56); } public bool DepthBiasEnable { - readonly get => ((Internal.Id7 >> 57) & 0x1) != 0UL; - set => Internal.Id7 = (Internal.Id7 & 0xFDFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 57); + readonly get => ((Internal.Id6 >> 57) & 0x1) != 0UL; + set => Internal.Id6 = (Internal.Id6 & 0xFDFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 57); } public bool DepthTestEnable { - readonly get => ((Internal.Id7 >> 58) & 0x1) != 0UL; - set => Internal.Id7 = (Internal.Id7 & 0xFBFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 58); + readonly get => ((Internal.Id6 >> 58) & 0x1) != 0UL; + set => Internal.Id6 = (Internal.Id6 & 0xFBFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 58); } public bool DepthWriteEnable { - readonly get => ((Internal.Id7 >> 59) & 0x1) != 0UL; - set => Internal.Id7 = (Internal.Id7 & 0xF7FFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 59); + readonly get => ((Internal.Id6 >> 59) & 0x1) != 0UL; + set => Internal.Id6 = (Internal.Id6 & 0xF7FFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 59); } public bool DepthBoundsTestEnable { - readonly get => ((Internal.Id7 >> 60) & 0x1) != 0UL; - set => Internal.Id7 = (Internal.Id7 & 0xEFFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 60); + readonly get => ((Internal.Id6 >> 60) & 0x1) != 0UL; + set => Internal.Id6 = (Internal.Id6 & 0xEFFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 60); } public bool StencilTestEnable { - readonly get => ((Internal.Id7 >> 61) & 0x1) != 0UL; - set => Internal.Id7 = (Internal.Id7 & 0xDFFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 61); + readonly get => ((Internal.Id6 >> 61) & 0x1) != 0UL; + set => Internal.Id6 = (Internal.Id6 & 0xDFFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 61); } public bool LogicOpEnable { - readonly get => ((Internal.Id7 >> 62) & 0x1) != 0UL; - set => Internal.Id7 = (Internal.Id7 & 0xBFFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 62); + readonly get => ((Internal.Id6 >> 62) & 0x1) != 0UL; + set => Internal.Id6 = (Internal.Id6 & 0xBFFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 62); } public bool HasDepthStencil { - readonly get => ((Internal.Id7 >> 63) & 0x1) != 0UL; - set => Internal.Id7 = (Internal.Id7 & 0x7FFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 63); + readonly get => ((Internal.Id6 >> 63) & 0x1) != 0UL; + set => Internal.Id6 = (Internal.Id6 & 0x7FFFFFFFFFFFFFFF) | ((value ? 1UL : 0UL) << 63); } public uint PatchControlPoints { - readonly get => (uint)((Internal.Id8 >> 0) & 0xFFFFFFFF); - set => Internal.Id8 = (Internal.Id8 & 0xFFFFFFFF00000000) | ((ulong)value << 0); + readonly get => (uint)((Internal.Id7 >> 0) & 0xFFFFFFFF); + set => Internal.Id7 = (Internal.Id7 & 0xFFFFFFFF00000000) | ((ulong)value << 0); } public uint SamplesCount { - readonly get => (uint)((Internal.Id8 >> 32) & 0xFFFFFFFF); - set => Internal.Id8 = (Internal.Id8 & 0xFFFFFFFF) | ((ulong)value << 32); + readonly get => (uint)((Internal.Id7 >> 32) & 0xFFFFFFFF); + set => Internal.Id7 = (Internal.Id7 & 0xFFFFFFFF) | ((ulong)value << 32); } public bool AlphaToCoverageEnable { - readonly get => ((Internal.Id9 >> 0) & 0x1) != 0UL; - set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFFE) | ((value ? 1UL : 0UL) << 0); + readonly get => ((Internal.Id8 >> 0) & 0x1) != 0UL; + set => Internal.Id8 = (Internal.Id8 & 0xFFFFFFFFFFFFFFFE) | ((value ? 1UL : 0UL) << 0); } public bool AlphaToOneEnable { - readonly get => ((Internal.Id9 >> 1) & 0x1) != 0UL; - set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFFD) | ((value ? 1UL : 0UL) << 1); + readonly get => ((Internal.Id8 >> 1) & 0x1) != 0UL; + set => Internal.Id8 = (Internal.Id8 & 0xFFFFFFFFFFFFFFFD) | ((value ? 1UL : 0UL) << 1); } public bool AdvancedBlendSrcPreMultiplied { - readonly get => ((Internal.Id9 >> 2) & 0x1) != 0UL; - set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFFB) | ((value ? 1UL : 0UL) << 2); + readonly get => ((Internal.Id8 >> 2) & 0x1) != 0UL; + set => Internal.Id8 = (Internal.Id8 & 0xFFFFFFFFFFFFFFFB) | ((value ? 1UL : 0UL) << 2); } public bool AdvancedBlendDstPreMultiplied { - readonly get => ((Internal.Id9 >> 3) & 0x1) != 0UL; - set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFF7) | ((value ? 1UL : 0UL) << 3); + readonly get => ((Internal.Id8 >> 3) & 0x1) != 0UL; + set => Internal.Id8 = (Internal.Id8 & 0xFFFFFFFFFFFFFFF7) | ((value ? 1UL : 0UL) << 3); } public BlendOverlapEXT AdvancedBlendOverlap { - readonly get => (BlendOverlapEXT)((Internal.Id9 >> 4) & 0x3); - set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFCF) | ((ulong)value << 4); + readonly get => (BlendOverlapEXT)((Internal.Id8 >> 4) & 0x3); + set => Internal.Id8 = (Internal.Id8 & 0xFFFFFFFFFFFFFFCF) | ((ulong)value << 4); } public bool DepthMode { - readonly get => ((Internal.Id9 >> 6) & 0x1) != 0UL; - set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFBF) | ((value ? 1UL : 0UL) << 6); + readonly get => ((Internal.Id8 >> 6) & 0x1) != 0UL; + set => Internal.Id8 = (Internal.Id8 & 0xFFFFFFFFFFFFFFBF) | ((value ? 1UL : 0UL) << 6); } public bool HasTessellationControlShader; @@ -408,8 +396,6 @@ namespace Ryujinx.Graphics.Vulkan fixed (VertexInputAttributeDescription* pVertexAttributeDescriptions = &Internal.VertexAttributeDescriptions[0]) fixed (VertexInputAttributeDescription* pVertexAttributeDescriptions2 = &_vertexAttributeDescriptions2[0]) fixed (VertexInputBindingDescription* pVertexBindingDescriptions = &Internal.VertexBindingDescriptions[0]) - fixed (Viewport* pViewports = &Internal.Viewports[0]) - fixed (Rect2D* pScissors = &Internal.Scissors[0]) fixed (PipelineColorBlendAttachmentState* pColorBlendAttachmentState = &Internal.ColorBlendAttachmentState[0]) { var vertexInputState = new PipelineVertexInputStateCreateInfo @@ -472,18 +458,13 @@ namespace Ryujinx.Graphics.Vulkan CullMode = CullMode, FrontFace = FrontFace, DepthBiasEnable = DepthBiasEnable, - DepthBiasClamp = DepthBiasClamp, - DepthBiasConstantFactor = DepthBiasConstantFactor, - DepthBiasSlopeFactor = DepthBiasSlopeFactor, }; var viewportState = new PipelineViewportStateCreateInfo { SType = StructureType.PipelineViewportStateCreateInfo, ViewportCount = ViewportsCount, - PViewports = pViewports, ScissorCount = ScissorsCount, - PScissors = pScissors, }; if (gd.Capabilities.SupportsDepthClipControl) @@ -511,19 +492,13 @@ namespace Ryujinx.Graphics.Vulkan StencilFrontFailOp, StencilFrontPassOp, StencilFrontDepthFailOp, - StencilFrontCompareOp, - StencilFrontCompareMask, - StencilFrontWriteMask, - StencilFrontReference); + StencilFrontCompareOp); var stencilBack = new StencilOpState( StencilBackFailOp, StencilBackPassOp, StencilBackDepthFailOp, - StencilBackCompareOp, - StencilBackCompareMask, - StencilBackWriteMask, - StencilBackReference); + StencilBackCompareOp); var depthStencilState = new PipelineDepthStencilStateCreateInfo { @@ -531,12 +506,10 @@ namespace Ryujinx.Graphics.Vulkan DepthTestEnable = DepthTestEnable, DepthWriteEnable = DepthWriteEnable, DepthCompareOp = DepthCompareOp, - DepthBoundsTestEnable = DepthBoundsTestEnable, + DepthBoundsTestEnable = false, StencilTestEnable = StencilTestEnable, Front = stencilFront, Back = stencilBack, - MinDepthBounds = MinDepthBounds, - MaxDepthBounds = MaxDepthBounds, }; uint blendEnables = 0; @@ -591,22 +564,21 @@ namespace Ryujinx.Graphics.Vulkan } bool supportsExtDynamicState = gd.Capabilities.SupportsExtendedDynamicState; - int dynamicStatesCount = supportsExtDynamicState ? 9 : 8; + int dynamicStatesCount = supportsExtDynamicState ? 8 : 7; DynamicState* dynamicStates = stackalloc DynamicState[dynamicStatesCount]; dynamicStates[0] = DynamicState.Viewport; dynamicStates[1] = DynamicState.Scissor; dynamicStates[2] = DynamicState.DepthBias; - dynamicStates[3] = DynamicState.DepthBounds; - dynamicStates[4] = DynamicState.StencilCompareMask; - dynamicStates[5] = DynamicState.StencilWriteMask; - dynamicStates[6] = DynamicState.StencilReference; - dynamicStates[7] = DynamicState.BlendConstants; + dynamicStates[3] = DynamicState.StencilCompareMask; + dynamicStates[4] = DynamicState.StencilWriteMask; + dynamicStates[5] = DynamicState.StencilReference; + dynamicStates[6] = DynamicState.BlendConstants; if (supportsExtDynamicState) { - dynamicStates[8] = DynamicState.VertexInputBindingStrideExt; + dynamicStates[7] = DynamicState.VertexInputBindingStrideExt; } var pipelineDynamicStateCreateInfo = new PipelineDynamicStateCreateInfo @@ -632,7 +604,6 @@ namespace Ryujinx.Graphics.Vulkan PDynamicState = &pipelineDynamicStateCreateInfo, Layout = PipelineLayout, RenderPass = renderPass, - BasePipelineIndex = -1, }; Result result = gd.Api.CreateGraphicsPipelines(device, cache, 1, &pipelineCreateInfo, null, &pipelineHandle); diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineUid.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineUid.cs index 238f06e2ac..c562242165 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineUid.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/PipelineUid.cs @@ -17,20 +17,17 @@ namespace Ryujinx.Graphics.Vulkan public ulong Id4; public ulong Id5; public ulong Id6; + public ulong Id7; - public ulong Id8; - public ulong Id9; - private readonly uint VertexAttributeDescriptionsCount => (byte)((Id6 >> 38) & 0xFF); - private readonly uint VertexBindingDescriptionsCount => (byte)((Id6 >> 46) & 0xFF); - private readonly uint ColorBlendAttachmentStateCount => (byte)((Id7 >> 8) & 0xFF); - private readonly bool HasDepthStencil => ((Id7 >> 63) & 0x1) != 0UL; + private readonly uint VertexAttributeDescriptionsCount => (byte)((Id5 >> 38) & 0xFF); + private readonly uint VertexBindingDescriptionsCount => (byte)((Id5 >> 46) & 0xFF); + private readonly uint ColorBlendAttachmentStateCount => (byte)((Id6 >> 8) & 0xFF); + private readonly bool HasDepthStencil => ((Id6 >> 63) & 0x1) != 0UL; public Array32 VertexAttributeDescriptions; public Array33 VertexBindingDescriptions; - public Array16 Viewports; - public Array16 Scissors; public Array8 ColorBlendAttachmentState; public Array9 AttachmentFormats; public uint AttachmentIntegerFormatMask; @@ -45,7 +42,7 @@ namespace Ryujinx.Graphics.Vulkan { if (!Unsafe.As>(ref Id0).Equals(Unsafe.As>(ref other.Id0)) || !Unsafe.As>(ref Id4).Equals(Unsafe.As>(ref other.Id4)) || - !Unsafe.As>(ref Id8).Equals(Unsafe.As>(ref other.Id8))) + !Unsafe.As>(ref Id7).Equals(Unsafe.As>(ref other.Id7))) { return false; } @@ -88,8 +85,7 @@ namespace Ryujinx.Graphics.Vulkan Id5 * 23 ^ Id6 * 23 ^ Id7 * 23 ^ - Id8 * 23 ^ - Id9 * 23; + Id8 * 23; for (int i = 0; i < (int)VertexAttributeDescriptionsCount; i++) { diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/ResourceArray.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/ResourceArray.cs new file mode 100644 index 0000000000..0880a10f07 --- /dev/null +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/ResourceArray.cs @@ -0,0 +1,74 @@ +using Silk.NET.Vulkan; +using System; +using System.Diagnostics; + +namespace Ryujinx.Graphics.Vulkan +{ + class ResourceArray : IDisposable + { + private DescriptorSet[] _cachedDescriptorSets; + + private ShaderCollection _cachedDscProgram; + private int _cachedDscSetIndex; + private int _cachedDscIndex; + + private int _bindCount; + + protected void SetDirty(VulkanRenderer gd) + { + ReleaseDescriptorSet(); + + if (_bindCount != 0) + { + gd.PipelineInternal.ForceTextureDirty(); + } + } + + public bool TryGetCachedDescriptorSets(CommandBufferScoped cbs, ShaderCollection program, int setIndex, out DescriptorSet[] sets) + { + if (_cachedDescriptorSets != null) + { + _cachedDscProgram.UpdateManualDescriptorSetCollectionOwnership(cbs, _cachedDscSetIndex, _cachedDscIndex); + + sets = _cachedDescriptorSets; + + return true; + } + + var dsc = program.GetNewManualDescriptorSetCollection(cbs, setIndex, out _cachedDscIndex).Get(cbs); + + sets = dsc.GetSets(); + + _cachedDescriptorSets = sets; + _cachedDscProgram = program; + _cachedDscSetIndex = setIndex; + + return false; + } + + public void IncrementBindCount() + { + _bindCount++; + } + + public void DecrementBindCount() + { + int newBindCount = --_bindCount; + Debug.Assert(newBindCount >= 0); + } + + private void ReleaseDescriptorSet() + { + if (_cachedDescriptorSets != null) + { + _cachedDscProgram.ReleaseManualDescriptorSetCollection(_cachedDscSetIndex, _cachedDscIndex); + _cachedDescriptorSets = null; + } + } + + public void Dispose() + { + ReleaseDescriptorSet(); + } + } +} diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs index f2d648a517..f9637789e3 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs @@ -604,9 +604,14 @@ namespace Ryujinx.Graphics.Vulkan return _plce.GetNewDescriptorSetCollection(setIndex, out isNew); } - public Auto GetNewManualDescriptorSetCollection(int commandBufferIndex, int setIndex, out int cacheIndex) + public Auto GetNewManualDescriptorSetCollection(CommandBufferScoped cbs, int setIndex, out int cacheIndex) { - return _plce.GetNewManualDescriptorSetCollection(commandBufferIndex, setIndex, out cacheIndex); + return _plce.GetNewManualDescriptorSetCollection(cbs, setIndex, out cacheIndex); + } + + public void UpdateManualDescriptorSetCollectionOwnership(CommandBufferScoped cbs, int setIndex, int cacheIndex) + { + _plce.UpdateManualDescriptorSetCollectionOwnership(cbs, setIndex, cacheIndex); } public void ReleaseManualDescriptorSetCollection(int setIndex, int cacheIndex) diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/TextureArray.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/TextureArray.cs index fe834225c5..31c408d64f 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/TextureArray.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/TextureArray.cs @@ -2,11 +2,10 @@ using Ryujinx.Graphics.GAL; using Silk.NET.Vulkan; using System; using System.Collections.Generic; -using System.Diagnostics; namespace Ryujinx.Graphics.Vulkan { - class TextureArray : ITextureArray + class TextureArray : ResourceArray, ITextureArray { private readonly VulkanRenderer _gd; @@ -25,19 +24,11 @@ namespace Ryujinx.Graphics.Vulkan private HashSet _storages; - private DescriptorSet[] _cachedDescriptorSets; - private int _cachedCommandBufferIndex; private int _cachedSubmissionCount; - private ShaderCollection _cachedDscProgram; - private int _cachedDscSetIndex; - private int _cachedDscIndex; - private readonly bool _isBuffer; - private int _bindCount; - public TextureArray(VulkanRenderer gd, int size, bool isBuffer) { _gd = gd; @@ -113,12 +104,7 @@ namespace Ryujinx.Graphics.Vulkan { _cachedCommandBufferIndex = -1; _storages = null; - _cachedDescriptorSets = null; - - if (_bindCount != 0) - { - _gd.PipelineInternal.ForceTextureDirty(); - } + SetDirty(_gd); } public void QueueWriteToReadBarriers(CommandBufferScoped cbs, PipelineStageFlags stageFlags) @@ -211,7 +197,7 @@ namespace Ryujinx.Graphics.Vulkan TextureView dummyTexture, SamplerHolder dummySampler) { - if (_cachedDescriptorSets != null) + if (TryGetCachedDescriptorSets(cbs, program, setIndex, out DescriptorSet[] sets)) { // We still need to ensure the current command buffer holds a reference to all used textures. @@ -224,12 +210,9 @@ namespace Ryujinx.Graphics.Vulkan GetBufferViews(cbs); } - return _cachedDescriptorSets; + return sets; } - _cachedDscProgram?.ReleaseManualDescriptorSetCollection(_cachedDscSetIndex, _cachedDscIndex); - var dsc = program.GetNewManualDescriptorSetCollection(cbs.CommandBufferIndex, setIndex, out _cachedDscIndex).Get(cbs); - DescriptorSetTemplate template = program.Templates[setIndex]; DescriptorSetTemplateWriter tu = templateUpdater.Begin(template); @@ -243,24 +226,9 @@ namespace Ryujinx.Graphics.Vulkan tu.Push(GetBufferViews(cbs)); } - var sets = dsc.GetSets(); templateUpdater.Commit(_gd, device, sets[0]); - _cachedDescriptorSets = sets; - _cachedDscProgram = program; - _cachedDscSetIndex = setIndex; return sets; } - - public void IncrementBindCount() - { - _bindCount++; - } - - public void DecrementBindCount() - { - int newBindCount = --_bindCount; - Debug.Assert(newBindCount >= 0); - } } } diff --git a/ryujinx/src/Ryujinx.Gtk3/UI/Windows/AvatarWindow.cs b/ryujinx/src/Ryujinx.Gtk3/UI/Windows/AvatarWindow.cs index 7cddc362be..d9ecd47b76 100644 --- a/ryujinx/src/Ryujinx.Gtk3/UI/Windows/AvatarWindow.cs +++ b/ryujinx/src/Ryujinx.Gtk3/UI/Windows/AvatarWindow.cs @@ -233,7 +233,7 @@ namespace Ryujinx.UI.Windows reader.ReadInt64(); // Padding byte[] input = new byte[stream.Length - stream.Position]; - stream.Read(input, 0, input.Length); + stream.ReadExactly(input, 0, input.Length); long inputOffset = 0; diff --git a/ryujinx/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs b/ryujinx/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs index 82783e638a..176011ddee 100644 --- a/ryujinx/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs +++ b/ryujinx/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs @@ -65,7 +65,7 @@ namespace Ryujinx.UI.App.Common Stream resourceStream = Assembly.GetCallingAssembly().GetManifestResourceStream(resourceName); byte[] resourceByteArray = new byte[resourceStream.Length]; - resourceStream.Read(resourceByteArray); + resourceStream.ReadExactly(resourceByteArray); return resourceByteArray; } diff --git a/ryujinx/src/Ryujinx/UI/ViewModels/UserFirmwareAvatarSelectorViewModel.cs b/ryujinx/src/Ryujinx/UI/ViewModels/UserFirmwareAvatarSelectorViewModel.cs index 89b591229f..12adfe94bb 100644 --- a/ryujinx/src/Ryujinx/UI/ViewModels/UserFirmwareAvatarSelectorViewModel.cs +++ b/ryujinx/src/Ryujinx/UI/ViewModels/UserFirmwareAvatarSelectorViewModel.cs @@ -151,7 +151,7 @@ namespace Ryujinx.Ava.UI.ViewModels reader.ReadInt64(); // Padding byte[] input = new byte[stream.Length - stream.Position]; - stream.Read(input, 0, input.Length); + stream.ReadExactly(input, 0, input.Length); uint inputOffset = 0; diff --git a/shadowsocks-rust/.github/workflows/build-release.yml b/shadowsocks-rust/.github/workflows/build-release.yml index f9f5955ba8..17b97643c0 100644 --- a/shadowsocks-rust/.github/workflows/build-release.yml +++ b/shadowsocks-rust/.github/workflows/build-release.yml @@ -23,13 +23,13 @@ jobs: matrix: target: - i686-unknown-linux-musl - # - x86_64-pc-windows-gnu + - x86_64-pc-windows-gnu - x86_64-unknown-linux-gnu - x86_64-unknown-linux-musl - # - armv7-unknown-linux-musleabihf - # - armv7-unknown-linux-gnueabihf + - armv7-unknown-linux-musleabihf + - armv7-unknown-linux-gnueabihf - arm-unknown-linux-gnueabi - # - arm-unknown-linux-gnueabihf + - arm-unknown-linux-gnueabihf - arm-unknown-linux-musleabi - arm-unknown-linux-musleabihf - aarch64-unknown-linux-gnu diff --git a/shadowsocks-rust/Cargo.lock b/shadowsocks-rust/Cargo.lock index c62a6ecd54..43e58e1c51 100644 --- a/shadowsocks-rust/Cargo.lock +++ b/shadowsocks-rust/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -200,38 +200,11 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" -[[package]] -name = "aws-lc-rs" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "474d7cec9d0a1126fad1b224b767fcbf351c23b0309bb21ec210bcfd379926a5" -dependencies = [ - "aws-lc-sys", - "mirai-annotations", - "paste", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7505fc3cb7acbf42699a43a79dd9caa4ed9e99861dfbb837c5c0fb5a0a8d2980" -dependencies = [ - "bindgen", - "cc", - "cmake", - "dunce", - "fs_extra", - "libc", - "paste", -] - [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" dependencies = [ "addr2line", "cc", @@ -272,29 +245,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.5.0", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.66", - "which", -] - [[package]] name = "bit-vec" version = "0.6.3" @@ -469,15 +419,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-if" version = "1.0.0" @@ -537,17 +478,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "clang-sys" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "4.5.4" @@ -808,12 +738,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - [[package]] name = "ecdsa" version = "0.16.9" @@ -835,12 +759,6 @@ dependencies = [ "signature", ] -[[package]] -name = "either" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" - [[package]] name = "elliptic-curve" version = "0.13.8" @@ -1005,12 +923,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "fsevent-sys" version = "4.1.0" @@ -1160,15 +1072,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "group" @@ -1373,15 +1279,6 @@ dependencies = [ "digest", ] -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "hostname" version = "0.3.1" @@ -1512,9 +1409,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d8d52be92d09acc2e01dddb7fde3ad983fc6489c7db4837e605bc3fca4cb63e" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" dependencies = [ "bytes", "futures-channel", @@ -1541,7 +1438,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core", ] [[package]] @@ -1621,12 +1518,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "ioctl-sys" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd11f3a29434026f5ff98c730b668ba74b1033637b8817940b54d040696133c" - [[package]] name = "ipconfig" version = "0.3.2" @@ -1660,15 +1551,6 @@ version = "1.70.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.11" @@ -1750,12 +1632,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" version = "0.2.155" @@ -1924,12 +1800,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" version = "0.7.3" @@ -1951,19 +1821,12 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -1987,16 +1850,6 @@ dependencies = [ "libc", ] -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "notify" version = "6.1.1" @@ -2062,9 +1915,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" dependencies = [ "memchr", ] @@ -2225,12 +2078,6 @@ dependencies = [ "windows-targets 0.52.5", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "percent-encoding" version = "2.3.1" @@ -2365,16 +2212,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.66", -] - [[package]] name = "primeorder" version = "0.13.6" @@ -2410,9 +2247,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.83" +version = "1.0.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" +checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" dependencies = [ "unicode-ident", ] @@ -2803,21 +2640,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls" -version = "0.23.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79adb16721f56eb2d843e67676896a61ce7a0fa622dc18d3e372477a029d2740" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "rustls-pki-types", - "rustls-webpki 0.102.4", - "subtle", - "zeroize", -] - [[package]] name = "rustls-native-certs" version = "0.6.3" @@ -2884,7 +2706,6 @@ version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ - "aws-lc-rs", "ring 0.17.8", "rustls-pki-types", "untrusted 0.9.0", @@ -2978,9 +2799,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] @@ -3006,9 +2827,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", @@ -3142,7 +2963,7 @@ dependencies = [ [[package]] name = "shadowsocks-rust" -version = "1.19.0" +version = "1.19.2" dependencies = [ "base64 0.22.1", "build-time", @@ -3183,7 +3004,7 @@ dependencies = [ [[package]] name = "shadowsocks-service" -version = "1.19.0" +version = "1.19.2" dependencies = [ "arc-swap", "async-trait", @@ -3221,8 +3042,8 @@ dependencies = [ "thiserror", "tokio", "tokio-native-tls", - "tokio-rustls 0.26.0", - "tun", + "tokio-rustls 0.25.0", + "tun2", "webpki-roots 0.26.1", "windows-sys 0.52.0", ] @@ -3236,12 +3057,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -3581,9 +3396,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -3600,9 +3415,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", @@ -3640,17 +3455,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls 0.23.8", - "rustls-pki-types", - "tokio", -] - [[package]] name = "tokio-tfo" version = "0.3.1" @@ -3778,17 +3582,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] -name = "tun" -version = "0.6.1" +name = "tun2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0adb9992bbd5ca76f3847ed579ad4ee8defb2ec2eea918cceef17ccc66fa4fd4" +checksum = "5af6b725dd317dd689d1e37f559e70cfbe6e87effdaf5f62c80d919bfc9eda95" dependencies = [ - "byteorder", "bytes", + "cfg-if", "futures-core", - "ioctl-sys", + "ipnet", "libc", "log", + "nix", "thiserror", "tokio", "tokio-util", @@ -4036,18 +3841,6 @@ dependencies = [ "rustls-pki-types", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "widestring" version = "1.1.0" @@ -4087,21 +3880,12 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core 0.51.1", - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-core" -version = "0.51.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" -dependencies = [ - "windows-targets 0.48.5", + "windows-core", + "windows-targets 0.52.5", ] [[package]] @@ -4285,9 +4069,9 @@ dependencies = [ [[package]] name = "wintun" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29b83b0eca06dd125dbcd48a45327c708a6da8aada3d95a3f06db0ce4b17e0d4" +checksum = "1b3c8c8876c686f8a2d6376999ac1c9a24c74d2968551c9394f7e89127783685" dependencies = [ "c2rust-bitfields", "libloading", @@ -4333,23 +4117,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zstd" diff --git a/shadowsocks-rust/Cargo.toml b/shadowsocks-rust/Cargo.toml index 3a9795757a..76fc6306de 100644 --- a/shadowsocks-rust/Cargo.toml +++ b/shadowsocks-rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shadowsocks-rust" -version = "1.19.0" +version = "1.19.2" authors = ["Shadowsocks Contributors"] description = "shadowsocks is a fast tunnel proxy that helps you bypass firewalls." repository = "https://github.com/shadowsocks/shadowsocks-rust" @@ -248,7 +248,7 @@ jemallocator = { version = "0.5", optional = true } snmalloc-rs = { version = "0.3", optional = true } rpmalloc = { version = "0.2", optional = true } -shadowsocks-service = { version = "1.19.0", path = "./crates/shadowsocks-service" } +shadowsocks-service = { version = "1.19.2", path = "./crates/shadowsocks-service" } windows-service = { version = "0.7", optional = true } diff --git a/shadowsocks-rust/Cross.toml b/shadowsocks-rust/Cross.toml index aafcef55cf..3035805387 100644 --- a/shadowsocks-rust/Cross.toml +++ b/shadowsocks-rust/Cross.toml @@ -1,45 +1,13 @@ [build] +dockerfile = "./docker/linux-cross/Dockerfile" pre-build = [ - # https://aws.github.io/aws-lc-rs/requirements/linux.html - "apt-get update", - "apt-get install --assume-yes llvm-5.0-dev libclang-5.0-dev clang-5.0", "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain stable", ". $HOME/.cargo/env", "cargo install --force --locked bindgen-cli && mv $HOME/.cargo/bin/bindgen /usr/bin", - "rustup self uninstall -y", + "rm -rf $HOME/.cargo" ] + [build.env] passthrough = ["RUSTFLAGS"] -[target.x86_64-pc-windows-gnu] -pre-build = [ - # Install NASM for rustls, which deps on aws-lc-rs by default, and it needs NASM - "apt-get update", - "apt-get install --assume-yes llvm-5.0-dev libclang-5.0-dev clang-5.0 nasm", - "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain stable", - ". $HOME/.cargo/env", - "cargo install --force --locked bindgen-cli && mv $HOME/.cargo/bin/bindgen /usr/bin", - "rustup self uninstall -y", -] - -[target.aarch64-unknown-linux-gnu] -pre-build = [] - -[target.aarch64-unknown-linux-musl] -pre-build = [] - -[target.x86_64-unknown-linux-gnu] -pre-build = [] - -[target.x86_64-unknown-linux-musl] -pre-build = [] - -[target.i686-unknown-linux-gnu] -pre-build = [] - -[target.aarch64-apple-darwin] -pre-build = [] - -[target.x86_64-apple-darwin] -pre-build = [] diff --git a/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml b/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml index cf4eb97ae2..5c4220a928 100644 --- a/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml +++ b/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shadowsocks-service" -version = "1.19.0" +version = "1.19.2" authors = ["Shadowsocks Contributors"] description = "shadowsocks is a fast tunnel proxy that helps you bypass firewalls." repository = "https://github.com/shadowsocks/shadowsocks-rust" @@ -93,7 +93,7 @@ local-tunnel = ["local"] # Enable socks4 protocol for sslocal local-socks4 = ["local"] # Enable Tun interface protocol for sslocal -local-tun = ["local", "etherparse", "tun", "smoltcp"] +local-tun = ["local", "etherparse", "tun2", "smoltcp"] # Enable Fake DNS local-fake-dns = ["local", "trust-dns", "sled", "bson"] # sslocal support online URL (SIP008 Online Configuration Delivery) @@ -148,7 +148,7 @@ tokio = { version = "1.5", features = [ tokio-native-tls = { version = "0.3", optional = true } native-tls = { version = "0.2.8", optional = true, features = ["alpn"] } webpki-roots = { version = "0.26", optional = true } -tokio-rustls = { version = "0.26", optional = true } +tokio-rustls = { version = "0.25", optional = true } rustls-native-certs = { version = "0.7", optional = true } async-trait = "0.1" @@ -167,7 +167,7 @@ ipnet = "2.9" iprange = "0.6" regex = "1.4" -tun = { version = "0.6", optional = true, features = ["async"] } +tun2 = { version = "1", optional = true, features = ["async"] } etherparse = { version = "0.15", optional = true } smoltcp = { version = "0.11", optional = true, default-features = false, features = [ "std", diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/redir/udprelay/sys/unix/bsd.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/redir/udprelay/sys/unix/bsd.rs index acc9bb65f4..aae4f58f7c 100644 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/redir/udprelay/sys/unix/bsd.rs +++ b/shadowsocks-rust/crates/shadowsocks-service/src/local/redir/udprelay/sys/unix/bsd.rs @@ -7,7 +7,6 @@ use std::{ task::{Context, Poll}, }; -use cfg_if::cfg_if; use futures::{future::poll_fn, ready}; use log::{error, trace, warn}; use shadowsocks::net::is_dual_stack_addr; @@ -148,31 +147,11 @@ impl UdpSocketRedir for UdpRedirSocket { loop { let mut read_guard = ready!(self.io.poll_read_ready(cx))?; - cfg_if! { - if #[cfg(any(target_os = "macos", target_os = "ios"))] { - use crate::local::redir::sys::bsd_pf::PF; - - let (peer_addr, n) = match self.io.get_ref().recv_from(buf) { - Err(ref e) if e.kind() == ErrorKind::WouldBlock => { - read_guard.clear_ready(); - continue; - } - Err(e) => return Err(e), - Ok(x) => x, - }; - - let bind_addr = self.local_addr()?; - let actual_addr = PF.natlook(&bind_addr, &peer_addr, Protocol::UDP)?; - - return Ok((n, peer_addr, actual_addr)); - } else if #[cfg(target_os = "freebsd")] { - match recv_dest_from(self.io.get_ref(), buf) { - Err(ref e) if e.kind() == ErrorKind::WouldBlock => { - read_guard.clear_ready(); - } - x => return Poll::Ready(x), - } + match recv_dest_from(self.io.get_ref(), buf) { + Err(ref e) if e.kind() == ErrorKind::WouldBlock => { + read_guard.clear_ready(); } + x => return Poll::Ready(x), } } } diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/redir/udprelay/sys/unix/macos.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/redir/udprelay/sys/unix/macos.rs index c11782b1aa..fd34ff6cad 100644 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/redir/udprelay/sys/unix/macos.rs +++ b/shadowsocks-rust/crates/shadowsocks-service/src/local/redir/udprelay/sys/unix/macos.rs @@ -1,52 +1,208 @@ use std::{ - io, - net::SocketAddr, + io::{self, Error, ErrorKind}, + mem, + net::{SocketAddr, UdpSocket}, + os::unix::io::AsRawFd, task::{Context, Poll}, }; +use futures::{future::poll_fn, ready}; +use log::{error, trace, warn}; +use shadowsocks::net::is_dual_stack_addr; +use socket2::{Domain, Protocol, SockAddr, Socket, Type}; +use tokio::io::unix::AsyncFd; + use crate::{ config::RedirType, - local::redir::redir_ext::{RedirSocketOpts, UdpSocketRedir}, + local::redir::{ + redir_ext::{RedirSocketOpts, UdpSocketRedir}, + sys::{bsd_pf::PF, set_ipv6_only}, + }, }; -pub struct UdpRedirSocket; +pub struct UdpRedirSocket { + io: AsyncFd, +} impl UdpRedirSocket { /// Create a new UDP socket binded to `addr` /// /// This will allow listening to `addr` that is not in local host - pub fn listen(_ty: RedirType, _addr: SocketAddr) -> io::Result { - unimplemented!("UDP transparent proxy is not supported on macOS, iOS, ...") + pub fn listen(ty: RedirType, addr: SocketAddr) -> io::Result { + UdpRedirSocket::bind(ty, addr, false) } /// Create a new UDP socket binded to `addr` /// /// This will allow binding to `addr` that is not in local host - pub fn bind_nonlocal( - _ty: RedirType, - _addr: SocketAddr, - _redir_opts: &RedirSocketOpts, - ) -> io::Result { - unimplemented!("UDP transparent proxy is not supported on macOS, iOS, ...") + pub fn bind_nonlocal(ty: RedirType, addr: SocketAddr, _: &RedirSocketOpts) -> io::Result { + UdpRedirSocket::bind(ty, addr, true) + } + + fn bind(ty: RedirType, addr: SocketAddr, reuse_port: bool) -> io::Result { + if ty == RedirType::NotSupported { + return Err(Error::new( + ErrorKind::InvalidInput, + "not supported udp transparent proxy type", + )); + } + + let socket = Socket::new(Domain::for_address(addr), Type::DGRAM, Some(Protocol::UDP))?; + set_socket_before_bind(&addr, &socket)?; + + socket.set_nonblocking(true)?; + socket.set_reuse_address(true)?; + if reuse_port { + if let Err(err) = socket.set_reuse_port(true) { + if let Some(errno) = err.raw_os_error() { + match errno { + libc::ENOPROTOOPT => { + trace!("failed to set SO_REUSEPORT, error: {}", err); + } + _ => { + error!("failed to set SO_REUSEPORT, error: {}", err); + return Err(err); + } + } + } else { + error!("failed to set SO_REUSEPORT, error: {}", err); + return Err(err); + } + } + } + + let sock_addr = SockAddr::from(addr); + + if is_dual_stack_addr(&addr) { + // set IP_ORIGDSTADDR before bind() + + match set_ipv6_only(&socket, false) { + Ok(..) => { + if let Err(err) = socket.bind(&sock_addr) { + warn!( + "bind() dual-stack address {} failed, error: {}, fallback to IPV6_V6ONLY=true", + addr, err + ); + + if let Err(err) = set_ipv6_only(&socket, true) { + warn!( + "set IPV6_V6ONLY=true failed, error: {}, bind() to {} directly", + err, addr + ); + } + + socket.bind(&sock_addr)?; + } + } + Err(err) => { + warn!( + "set IPV6_V6ONLY=false failed, error: {}, bind() to {} directly", + err, addr + ); + socket.bind(&sock_addr)?; + } + } + } else { + socket.bind(&sock_addr)?; + } + + let io = AsyncFd::new(socket.into())?; + Ok(UdpRedirSocket { io }) } /// Send data to the socket to the given target address - pub async fn send_to(&self, _buf: &[u8], _target: SocketAddr) -> io::Result { - unimplemented!("UDP transparent proxy is not supported on macOS, iOS, ...") + pub async fn send_to(&self, buf: &[u8], target: SocketAddr) -> io::Result { + poll_fn(|cx| self.poll_send_to(cx, buf, target)).await + } + + fn poll_send_to(&self, cx: &mut Context<'_>, buf: &[u8], target: SocketAddr) -> Poll> { + loop { + let mut write_guard = ready!(self.io.poll_write_ready(cx))?; + + match self.io.get_ref().send_to(buf, target) { + Err(ref e) if e.kind() == ErrorKind::WouldBlock => { + write_guard.clear_ready(); + } + x => return Poll::Ready(x), + } + } } /// Returns the local address that this socket is bound to. pub fn local_addr(&self) -> io::Result { - unimplemented!("UDP transparent proxy is not supported on macOS, iOS, ...") + self.io.get_ref().local_addr() } } impl UdpSocketRedir for UdpRedirSocket { fn poll_recv_dest_from( &self, - _cx: &mut Context<'_>, - _buf: &mut [u8], + cx: &mut Context<'_>, + buf: &mut [u8], ) -> Poll> { - unimplemented!("UDP transparent proxy is not supported on macOS, iOS, ...") + loop { + let mut read_guard = ready!(self.io.poll_read_ready(cx))?; + + let (n, peer_addr) = match self.io.get_ref().recv_from(buf) { + Err(ref e) if e.kind() == ErrorKind::WouldBlock => { + read_guard.clear_ready(); + continue; + } + Err(e) => return Err(e).into(), + Ok(x) => x, + }; + + let bind_addr = self.local_addr()?; + let actual_addr = PF.natlook(&bind_addr, &peer_addr, Protocol::UDP)?; + + return Ok((n, peer_addr, actual_addr)).into(); + } } } + +fn set_disable_ip_fragmentation(level: libc::c_int, socket: &Socket) -> io::Result<()> { + // https://www.freebsd.org/cgi/man.cgi?query=ip&sektion=4&manpath=FreeBSD+9.0-RELEASE + + // sys/netinet/in.h + const IP_DONTFRAG: libc::c_int = 67; // don't fragment packet + + // sys/netinet6/in6.h + const IPV6_DONTFRAG: libc::c_int = 62; // bool; disable IPv6 fragmentation + + let enable: libc::c_int = 1; + + let opt = match level { + libc::IPPROTO_IP => IP_DONTFRAG, + libc::IPPROTO_IPV6 => IPV6_DONTFRAG, + _ => unreachable!("level can only be IPPROTO_IP or IPPROTO_IPV6"), + }; + + unsafe { + let ret = libc::setsockopt( + socket.as_raw_fd(), + level, + opt, + &enable as *const _ as *const _, + mem::size_of_val(&enable) as libc::socklen_t, + ); + + if ret < 0 { + return Err(io::Error::last_os_error()); + } + } + + Ok(()) +} + +fn set_socket_before_bind(addr: &SocketAddr, socket: &Socket) -> io::Result<()> { + // https://www.freebsd.org/cgi/man.cgi?query=ip&sektion=4&manpath=FreeBSD+9.0-RELEASE + let level = match *addr { + SocketAddr::V4(..) => libc::IPPROTO_IP, + SocketAddr::V6(..) => libc::IPPROTO_IPV6, + }; + + // 1. disable IP fragmentation + set_disable_ip_fragmentation(level, socket)?; + + Ok(()) +} diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/fake_tun.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/fake_tun.rs index f28b3ea30c..b374847ba1 100644 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/fake_tun.rs +++ b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/fake_tun.rs @@ -2,13 +2,13 @@ use std::{ io::{self, Read, Write}, - net::Ipv4Addr, + net::IpAddr, pin::Pin, task::{Context, Poll}, }; use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; -use tun::{Configuration, Device, Error as TunError}; +use tun2::{AbstractDevice, Configuration, Error as TunError}; pub struct FakeQueue; @@ -30,63 +30,61 @@ impl Write for FakeQueue { pub struct FakeDevice; -impl Device for FakeDevice { - type Queue = FakeQueue; - - fn name(&self) -> tun::Result { +impl AbstractDevice for FakeDevice { + fn tun_name(&self) -> tun2::Result { Err(TunError::NotImplemented) } - fn set_name(&mut self, _: &str) -> tun::Result<()> { + fn set_tun_name(&mut self, _: &str) -> tun2::Result<()> { Err(TunError::NotImplemented) } - fn enabled(&mut self, _: bool) -> tun::Result<()> { + fn enabled(&mut self, _: bool) -> tun2::Result<()> { Err(TunError::NotImplemented) } - fn address(&self) -> tun::Result { + fn address(&self) -> tun2::Result { Err(TunError::NotImplemented) } - fn set_address(&mut self, _: Ipv4Addr) -> tun::Result<()> { + fn set_address(&mut self, _: IpAddr) -> tun2::Result<()> { Err(TunError::NotImplemented) } - fn destination(&self) -> tun::Result { + fn destination(&self) -> tun2::Result { Err(TunError::NotImplemented) } - fn set_destination(&mut self, _: Ipv4Addr) -> tun::Result<()> { + fn set_destination(&mut self, _: IpAddr) -> tun2::Result<()> { Err(TunError::NotImplemented) } - fn broadcast(&self) -> tun::Result { + fn broadcast(&self) -> tun2::Result { Err(TunError::NotImplemented) } - fn set_broadcast(&mut self, _: Ipv4Addr) -> tun::Result<()> { + fn set_broadcast(&mut self, _: IpAddr) -> tun2::Result<()> { Err(TunError::NotImplemented) } - fn netmask(&self) -> tun::Result { + fn netmask(&self) -> tun2::Result { Err(TunError::NotImplemented) } - fn set_netmask(&mut self, _: Ipv4Addr) -> tun::Result<()> { + fn set_netmask(&mut self, _: IpAddr) -> tun2::Result<()> { Err(TunError::NotImplemented) } - fn mtu(&self) -> tun::Result { + fn mtu(&self) -> tun2::Result { Err(TunError::NotImplemented) } - fn set_mtu(&mut self, _: i32) -> tun::Result<()> { + fn set_mtu(&mut self, _: u16) -> tun2::Result<()> { Err(TunError::NotImplemented) } - fn queue(&mut self, _: usize) -> Option<&mut Self::Queue> { - None + fn packet_information(&self) -> bool { + false } } @@ -108,12 +106,14 @@ impl Write for FakeDevice { pub struct AsyncDevice(FakeDevice); -impl AsyncDevice { - pub fn get_ref(&self) -> &FakeDevice { +impl AsRef for AsyncDevice { + fn as_ref(&self) -> &FakeDevice { &self.0 } +} - pub fn get_mut(&mut self) -> &mut FakeDevice { +impl AsMut for AsyncDevice { + fn as_mut(&mut self) -> &mut FakeDevice { &mut self.0 } } diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/mod.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/mod.rs index ce65b5f950..53dc2d183c 100644 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/mod.rs +++ b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/mod.rs @@ -4,30 +4,35 @@ use std::os::unix::io::RawFd; use std::{ io::{self, ErrorKind}, - net::{IpAddr, Ipv4Addr, SocketAddr}, + net::{IpAddr, SocketAddr}, sync::Arc, time::Duration, }; use byte_string::ByteStr; use cfg_if::cfg_if; -use ipnet::{IpNet, Ipv4Net}; +use ipnet::IpNet; use log::{debug, error, info, trace, warn}; use shadowsocks::config::Mode; use smoltcp::wire::{IpProtocol, TcpPacket, UdpPacket}; -use tokio::{io::AsyncReadExt, sync::mpsc, time}; +use tokio::{ + io::{AsyncReadExt, AsyncWriteExt}, + sync::mpsc, + time, +}; cfg_if! { if #[cfg(any(target_os = "ios", target_os = "macos", target_os = "linux", target_os = "android", - target_os = "windows"))] { - use tun::{ - create_as_async, AsyncDevice, Configuration as TunConfiguration, Device as TunDevice, Error as TunError, Layer, + target_os = "windows", + target_os = "freebsd"))] { + use tun2::{ + create_as_async, AsyncDevice, Configuration as TunConfiguration, AbstractDevice, Error as TunError, Layer, }; } else { - use tun::{Configuration as TunConfiguration, Device as TunDevice, Error as TunError, Layer}; + use tun2::{AbstractDevice, Configuration as TunConfiguration, Error as TunError, Layer}; mod fake_tun; use self::fake_tun::{create_as_async, AsyncDevice}; @@ -36,15 +41,9 @@ cfg_if! { use crate::local::{context::ServiceContext, loadbalancing::PingBalancer}; -use self::{ - ip_packet::IpPacket, - sys::{write_packet_with_pi, IFF_PI_PREFIX_LEN}, - tcp::TcpTun, - udp::UdpTun, -}; +use self::{ip_packet::IpPacket, tcp::TcpTun, udp::UdpTun}; mod ip_packet; -mod sys; mod tcp; mod udp; mod virt_device; @@ -84,7 +83,7 @@ impl TunBuilder { } pub fn name(&mut self, name: &str) { - self.tun_config.name(name); + self.tun_config.tun_name(name); } #[cfg(unix)] @@ -108,11 +107,13 @@ impl TunBuilder { pub async fn build(mut self) -> io::Result { self.tun_config.layer(Layer::L3).up(); - #[cfg(target_os = "linux")] - self.tun_config.platform(|tun_config| { - // IFF_NO_PI preventing excessive buffer reallocating - tun_config.packet_information(false); - }); + // XXX: tun2 set IFF_NO_PI by default. + // + // #[cfg(target_os = "linux")] + // self.tun_config.platform_config(|tun_config| { + // // IFF_NO_PI preventing excessive buffer reallocating + // tun_config.packet_information(false); + // }); let device = match create_as_async(&self.tun_config) { Ok(d) => d, @@ -130,7 +131,7 @@ impl TunBuilder { let tcp = TcpTun::new( self.context, self.balancer, - device.get_ref().mtu().unwrap_or(1500) as u32, + device.as_ref().mtu().unwrap_or(1500) as u32, ); Ok(Tun { @@ -157,21 +158,17 @@ pub struct Tun { impl Tun { /// Start serving pub async fn run(mut self) -> io::Result<()> { - if let Ok(mtu) = self.device.get_ref().mtu() { - assert!(mtu > 0 && mtu as usize > IFF_PI_PREFIX_LEN); - } - info!( "shadowsocks tun device {}, mode {}", self.device - .get_ref() - .name() + .as_ref() + .tun_name() .or_else(|r| Ok::<_, ()>(r.to_string())) .unwrap(), self.mode, ); - let address = match self.device.get_ref().address() { + let address = match self.device.as_ref().address() { Ok(a) => a, Err(err) => { error!("[TUN] failed to get device address, error: {}", err); @@ -179,7 +176,7 @@ impl Tun { } }; - let netmask = match self.device.get_ref().netmask() { + let netmask = match self.device.as_ref().netmask() { Ok(n) => n, Err(err) => { error!("[TUN] failed to get device netmask, error: {}", err); @@ -187,7 +184,7 @@ impl Tun { } }; - let address_net = match Ipv4Net::with_netmask(address, netmask) { + let address_net = match IpNet::with_netmask(address, netmask) { Ok(n) => n, Err(err) => { error!("[TUN] invalid address {}, netmask {}, error: {}", address, netmask, err); @@ -202,14 +199,9 @@ impl Tun { netmask ); - // Set default route - if let Err(err) = sys::set_route_configuration(self.device.get_mut()).await { - warn!("[TUN] tun device set route failed, error: {}", err); - } - let address_broadcast = address_net.broadcast(); - let mut packet_buffer = vec![0u8; 65536 + IFF_PI_PREFIX_LEN].into_boxed_slice(); + let mut packet_buffer = vec![0u8; 65536].into_boxed_slice(); let mut udp_cleanup_timer = time::interval(self.udp_cleanup_interval); loop { @@ -218,15 +210,7 @@ impl Tun { n = self.device.read(&mut packet_buffer) => { let n = n?; - if n <= IFF_PI_PREFIX_LEN { - error!( - "[TUN] packet too short, packet: {:?}", - ByteStr::new(&packet_buffer[..n]) - ); - continue; - } - - let packet = &mut packet_buffer[IFF_PI_PREFIX_LEN..n]; + let packet = &mut packet_buffer[..n]; trace!("[TUN] received IP packet {:?}", ByteStr::new(packet)); if let Err(err) = self.handle_tun_frame(&address_broadcast, packet).await { @@ -236,10 +220,17 @@ impl Tun { // UDP channel sent back packet = self.udp.recv_packet() => { - if let Err(err) = write_packet_with_pi(&mut self.device, &packet).await { - error!("[TUN] failed to set packet information, error: {}, {:?}", err, ByteStr::new(&packet)); - } else { - trace!("[TUN] sent IP packet (UDP) {:?}", ByteStr::new(&packet)); + match self.device.write(&packet).await { + Ok(n) => { + if n < packet.len() { + warn!("[TUN] sent IP packet (UDP), but truncated. sent {} < {}, {:?}", n, packet.len(), ByteStr::new(&packet)); + } else { + trace!("[TUN] sent IP packet (UDP) {:?}", ByteStr::new(&packet)); + } + } + Err(err) => { + error!("[TUN] failed to set packet information, error: {}, {:?}", err, ByteStr::new(&packet)); + } } } @@ -256,17 +247,24 @@ impl Tun { // TCP channel sent back packet = self.tcp.recv_packet() => { - if let Err(err) = write_packet_with_pi(&mut self.device, &packet).await { - error!("[TUN] failed to set packet information, error: {}, {:?}", err, ByteStr::new(&packet)); - } else { - trace!("[TUN] sent IP packet (TCP) {:?}", ByteStr::new(&packet)); + match self.device.write(&packet).await { + Ok(n) => { + if n < packet.len() { + warn!("[TUN] sent IP packet (TCP), but truncated. sent {} < {}, {:?}", n, packet.len(), ByteStr::new(&packet)); + } else { + trace!("[TUN] sent IP packet (TCP) {:?}", ByteStr::new(&packet)); + } + } + Err(err) => { + error!("[TUN] failed to set packet information, error: {}, {:?}", err, ByteStr::new(&packet)); + } } } } } } - async fn handle_tun_frame(&mut self, device_broadcast_addr: &Ipv4Addr, frame: &[u8]) -> smoltcp::wire::Result<()> { + async fn handle_tun_frame(&mut self, device_broadcast_addr: &IpAddr, frame: &[u8]) -> smoltcp::wire::Result<()> { let packet = match IpPacket::new_checked(frame)? { Some(packet) => packet, None => { @@ -275,20 +273,20 @@ impl Tun { } }; + trace!("[TUN] {:?}", packet); + let src_ip_addr = packet.src_addr(); let dst_ip_addr = packet.dst_addr(); - let src_non_unicast = match src_ip_addr { - IpAddr::V4(v4) => { - v4.is_broadcast() || v4.is_multicast() || v4.is_unspecified() || v4 == *device_broadcast_addr - } - IpAddr::V6(v6) => v6.is_multicast() || v6.is_unspecified(), - }; - let dst_non_unicast = match dst_ip_addr { - IpAddr::V4(v4) => { - v4.is_broadcast() || v4.is_multicast() || v4.is_unspecified() || v4 == *device_broadcast_addr - } - IpAddr::V6(v6) => v6.is_multicast() || v6.is_unspecified(), - }; + let src_non_unicast = src_ip_addr == *device_broadcast_addr + || match src_ip_addr { + IpAddr::V4(v4) => v4.is_broadcast() || v4.is_multicast() || v4.is_unspecified(), + IpAddr::V6(v6) => v6.is_multicast() || v6.is_unspecified(), + }; + let dst_non_unicast = dst_ip_addr == *device_broadcast_addr + || match dst_ip_addr { + IpAddr::V4(v4) => v4.is_broadcast() || v4.is_multicast() || v4.is_unspecified(), + IpAddr::V6(v6) => v6.is_multicast() || v6.is_unspecified(), + }; if src_non_unicast || dst_non_unicast { trace!( diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/mod.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/mod.rs deleted file mode 100644 index c44ea91faa..0000000000 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/mod.rs +++ /dev/null @@ -1,16 +0,0 @@ -#![allow(unused)] - -use cfg_if::cfg_if; - -cfg_if! { - if #[cfg(unix)] { - mod unix; - pub use self::unix::*; - } else if #[cfg(windows)] { - mod windows; - pub use self::windows::*; - } else { - mod others; - pub use self::others::*; - } -} diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/others.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/others.rs deleted file mode 100644 index fb966718fb..0000000000 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/others.rs +++ /dev/null @@ -1,23 +0,0 @@ -use std::{ - io::{self, Read, Write}, - marker::Unpin, -}; - -use tokio::io::{AsyncWrite, AsyncWriteExt}; -use tun::Device; - -/// Packet Information length in bytes -pub const IFF_PI_PREFIX_LEN: usize = 0; - -/// Writing packet with packet information -pub async fn write_packet_with_pi(writer: &mut W, packet: &[u8]) -> io::Result<()> { - writer.write_all(packet).await -} - -/// Set platform specific route configuration -pub async fn set_route_configuration(_: &mut (dyn Device + Send)) -> io::Result<()> -where - Q: Read + Write, -{ - Ok(()) -} diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/android.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/android.rs deleted file mode 100644 index e2937c234f..0000000000 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/android.rs +++ /dev/null @@ -1,27 +0,0 @@ -use std::{ - io::{self, Read, Write}, - marker::Unpin, -}; - -use tokio::io::{AsyncWrite, AsyncWriteExt}; -use tun::Device; - -/// Packet Information length in bytes -/// -/// Tun device on Android doesn't have Packet Information header, so ther is no prefix headers -pub const IFF_PI_PREFIX_LEN: usize = 0; - -/// Writing packet with packet information -/// -/// Tun device on Android doesn't have Packet Information header, so there is nothing to prepend on Linux -pub async fn write_packet_with_pi(writer: &mut W, packet: &[u8]) -> io::Result<()> { - writer.write_all(packet).await -} - -/// Set platform specific route configuration -pub async fn set_route_configuration(_: &mut (dyn Device + Send)) -> io::Result<()> -where - Q: Read + Write, -{ - Ok(()) -} diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/apple/macos.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/apple/macos.rs deleted file mode 100644 index 8cf468f197..0000000000 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/apple/macos.rs +++ /dev/null @@ -1,180 +0,0 @@ -use std::{ - ffi::CStr, - io::{self, ErrorKind, Read, Write}, - mem, - ptr, -}; - -use log::{error, trace}; -use tun::{Device, Error as TunError}; - -/// These numbers are used by reliable protocols for determining -/// retransmission behavior and are included in the routing structure. -#[repr(C)] -#[allow(non_camel_case_types)] -#[derive(Debug, Clone, Copy)] -struct rt_metrics { - rmx_locks: u32, //< Kernel must leave these values alone - rmx_mtu: u32, //< MTU for this path - rmx_hopcount: u32, //< max hops expected - rmx_expire: i32, //< lifetime for route, e.g. redirect - rmx_recvpipe: u32, //< inbound delay-bandwidth product - rmx_sendpipe: u32, //< outbound delay-bandwidth product - rmx_ssthresh: u32, //< outbound gateway buffer limit - rmx_rtt: u32, //< estimated round trip time - rmx_rttvar: u32, //< estimated rtt variance - rmx_pksent: u32, //< packets sent using this route - rmx_state: u32, //< route state - rmx_filler: [u32; 3], //< will be used for T/TCP later -} - -/// Structures for routing messages. -#[repr(C)] -#[allow(non_camel_case_types)] -#[derive(Debug, Clone, Copy)] -struct rt_msghdr { - rtm_msglen: libc::c_ushort, //< to skip over non-understood messages - rtm_version: libc::c_uchar, //< future binary compatibility - rtm_type: libc::c_uchar, //< message type - rtm_index: libc::c_ushort, //< index for associated ifp - rtm_flags: libc::c_int, //< flags, incl. kern & message, e.g. DONE - rtm_addrs: libc::c_int, //< bitmask identifying sockaddrs in msg - rtm_pid: libc::pid_t, //< identify sender - rtm_seq: libc::c_int, //< for sender to identify action - rtm_errno: libc::c_int, //< why failed - rtm_use: libc::c_int, //< from rtentry - rtm_inits: u32, //< which metrics we are initializing - rtm_rmx: rt_metrics, //< metrics themselves -} - -#[repr(C)] -#[allow(non_camel_case_types)] -#[derive(Debug, Clone, Copy)] -struct rt_msg { - rtm: rt_msghdr, - dst: libc::sockaddr_in, - gateway: libc::sockaddr_dl, - netmask: libc::sockaddr_in, -} - -/// Set platform specific route configuration -pub async fn set_route_configuration(device: &mut (dyn Device + Send)) -> io::Result<()> -where - Q: Read + Write, -{ - let tun_address = match device.address() { - Ok(t) => t, - Err(err) => { - error!("tun device doesn't have address, error: {}", err); - return Err(io::Error::new(ErrorKind::Other, err)); - } - }; - - let tun_netmask = match device.netmask() { - Ok(m) => m, - Err(err) => { - error!("tun device doesn't have netmask, error: {}", err); - return Err(io::Error::new(ErrorKind::Other, err)); - } - }; - - let tun_name = match device.name() { - Ok(n) => n, - Err(err) => match err { - TunError::Io(err) => return Err(err), - e => return Err(io::Error::new(ErrorKind::Other, e)), - }, - }; - - // routing packets that saddr & daddr are in the subnet of the Tun interface - // - // This is only required for the TCP tunnel, and it is the default behavior on Linux - // - // https://opensource.apple.com/source/network_cmds/network_cmds-307.0.1/route.tproj/route.c.auto.html - - unsafe { - let mut rtmsg: rt_msg = mem::zeroed(); - rtmsg.rtm.rtm_type = libc::RTM_ADD as libc::c_uchar; - rtmsg.rtm.rtm_flags = libc::RTF_UP | libc::RTF_STATIC; - rtmsg.rtm.rtm_version = libc::RTM_VERSION as libc::c_uchar; - rtmsg.rtm.rtm_seq = rand::random(); - rtmsg.rtm.rtm_addrs = libc::RTA_DST | libc::RTA_GATEWAY | libc::RTA_NETMASK; - rtmsg.rtm.rtm_msglen = mem::size_of_val(&rtmsg) as libc::c_ushort; - rtmsg.rtm.rtm_pid = libc::getpid(); - - // Set address as destination addr - { - rtmsg.dst.sin_family = libc::AF_INET as libc::sa_family_t; - rtmsg.dst.sin_addr = libc::in_addr { - s_addr: u32::from_ne_bytes(tun_address.octets()), - }; - rtmsg.dst.sin_len = mem::size_of_val(&rtmsg.dst) as u8; - } - - // Get the interface's link address (sockaddr_dl) - let found_gateway = { - let mut found_ifaddr = false; - - let mut ifap: *mut libc::ifaddrs = ptr::null_mut(); - if libc::getifaddrs(&mut ifap) != 0 { - return Err(io::Error::last_os_error()); - } - - let mut ifa = ifap; - while !ifa.is_null() { - if !(*ifa).ifa_addr.is_null() && (*(*ifa).ifa_addr).sa_family as i32 == libc::AF_LINK { - let ifa_name = CStr::from_ptr((*ifa).ifa_name); - if ifa_name.to_bytes() == tun_name.as_bytes() { - // Found the link_addr of tun interface. - - let sdl: *mut libc::sockaddr_dl = (*ifa).ifa_addr as *mut _; - rtmsg.gateway = *sdl; - - found_ifaddr = true; - break; - } - } - - ifa = (*ifa).ifa_next; - } - libc::freeifaddrs(ifap); - - found_ifaddr - }; - - if !found_gateway { - error!("couldn't get interface \"{}\" AF_LINK address", tun_name); - return Err(io::Error::new( - ErrorKind::Other, - "couldn't get interface AF_LINK address", - )); - } - - // netmask - { - rtmsg.netmask.sin_family = libc::AF_INET as libc::sa_family_t; - rtmsg.netmask.sin_addr = libc::in_addr { - s_addr: u32::from_ne_bytes(tun_netmask.octets()), - }; - rtmsg.netmask.sin_len = mem::size_of_val(&rtmsg.netmask) as u8; - } - - trace!("add route {:?}", rtmsg); - - let fd = libc::socket(libc::PF_ROUTE, libc::SOCK_RAW, 0); - if fd < 0 { - return Err(io::Error::last_os_error()); - } - - let n = libc::write(fd, &mut rtmsg as *mut _ as *mut _, mem::size_of_val(&rtmsg)); - if n < 0 { - let err = io::Error::last_os_error(); - libc::close(fd); - return Err(err); - } - - libc::close(fd); - } - - Ok(()) -} diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/apple/mod.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/apple/mod.rs deleted file mode 100644 index 3aab8bf0bd..0000000000 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/apple/mod.rs +++ /dev/null @@ -1,64 +0,0 @@ -use std::{ - io::{self, ErrorKind, IoSlice}, - marker::Unpin, -}; - -use cfg_if::cfg_if; -use tokio::io::{AsyncWrite, AsyncWriteExt}; - -cfg_if! { - if #[cfg(target_os = "macos")] { - mod macos; - pub use self::macos::*; - } else { - mod others; - pub use self::others::*; - } -} - -/// Packet Information length in bytes -pub const IFF_PI_PREFIX_LEN: usize = 4; - -/// Prepending Packet Information -/// -/// ``` -/// +--------+--------+--------+--------+ -/// | Flags (0) | Protocol | -/// +--------+--------+--------+--------+ -/// ``` -pub async fn write_packet_with_pi(writer: &mut W, packet: &[u8]) -> io::Result<()> { - if packet.is_empty() { - return Err(io::Error::new(ErrorKind::InvalidInput, "empty packet")); - } - - let mut header = [0u8; 4]; - - // Protocol, infer from the original packet - let protocol = match packet[0] >> 4 { - 4 => libc::PF_INET, - 6 => libc::PF_INET6, - _ => return Err(io::Error::new(ErrorKind::InvalidData, "neither an IPv4 or IPv6 packet")), - }; - - let protocol_buf = &mut header[2..]; - let protocol_bytes = (protocol as u16).to_be_bytes(); - protocol_buf.copy_from_slice(&protocol_bytes); - - let bufs = [IoSlice::new(&header), IoSlice::new(packet)]; - let n = writer.write_vectored(&bufs).await?; - - // Packets must be written together with the header - if n != header.len() + packet.len() { - return Err(io::Error::new( - ErrorKind::Other, - format!( - "write_vectored header {} bytes, packet {} bytes, but sent {} bytes", - header.len(), - packet.len(), - n - ), - )); - } - - Ok(()) -} diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/apple/others.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/apple/others.rs deleted file mode 100644 index d74444b2cb..0000000000 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/apple/others.rs +++ /dev/null @@ -1,11 +0,0 @@ -use std::io::{self, Read, Write}; - -use tun::Device; - -/// Set platform specific route configuration -pub async fn set_route_configuration(_: &mut (dyn Device + Send)) -> io::Result<()> -where - Q: Read + Write, -{ - Ok(()) -} diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/bsd.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/bsd.rs deleted file mode 100644 index 34e23a7c89..0000000000 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/bsd.rs +++ /dev/null @@ -1,62 +0,0 @@ -use std::{ - io::{self, ErrorKind, IoSlice, Read, Write}, - marker::Unpin, -}; - -use tokio::io::{AsyncWrite, AsyncWriteExt}; -use tun::Device; - -/// Packet Information length in bytes -pub const IFF_PI_PREFIX_LEN: usize = 4; - -/// Prepending Packet Information -/// -/// ``` -/// +--------+--------+--------+--------+ -/// | Flags (0) | Protocol | -/// +--------+--------+--------+--------+ -/// ``` -pub async fn write_packet_with_pi(writer: &mut W, packet: &[u8]) -> io::Result<()> { - if packet.is_empty() { - return Err(io::Error::new(ErrorKind::InvalidInput, "empty packet")); - } - - let mut header = [0u8; 4]; - - // Protocol, infer from the original packet - let protocol = match packet[0] >> 4 { - 4 => libc::PF_INET, - 6 => libc::PF_INET6, - _ => return Err(io::Error::new(ErrorKind::InvalidData, "neither an IPv4 or IPv6 packet")), - }; - - let protocol_buf = &mut header[2..]; - let protocol_bytes = (protocol as u16).to_be_bytes(); - protocol_buf.copy_from_slice(&protocol_bytes); - - let bufs = [IoSlice::new(&header), IoSlice::new(packet)]; - let n = writer.write_vectored(&bufs).await?; - - // Packets must be written together with the header - if n != header.len() + packet.len() { - return Err(io::Error::new( - ErrorKind::Other, - format!( - "write_vectored header {} bytes, packet {} bytes, but sent {} bytes", - header.len(), - packet.len(), - n - ), - )); - } - - Ok(()) -} - -/// Set platform specific route configuration -pub async fn set_route_configuration(_: &mut (dyn Device + Send)) -> io::Result<()> -where - Q: Read + Write, -{ - Ok(()) -} diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/linux.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/linux.rs deleted file mode 100644 index 58fa8185fa..0000000000 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/linux.rs +++ /dev/null @@ -1,27 +0,0 @@ -use std::{ - io::{self, Read, Write}, - marker::Unpin, -}; - -use tokio::io::{AsyncWrite, AsyncWriteExt}; -use tun::Device; - -/// Packet Information length in bytes -/// -/// Tun device have set `IFF_NO_PI`, so ther is no prefix headers -pub const IFF_PI_PREFIX_LEN: usize = 0; - -/// Writing packet with packet information -/// -/// Tun device have set `IFF_NO_PI`, so there is nothing to prepend on Linux -pub async fn write_packet_with_pi(writer: &mut W, packet: &[u8]) -> io::Result<()> { - writer.write_all(packet).await -} - -/// Set platform specific route configuration -pub async fn set_route_configuration(_: &mut (dyn Device + Send)) -> io::Result<()> -where - Q: Read + Write, -{ - Ok(()) -} diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/mod.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/mod.rs deleted file mode 100644 index fce535d6cf..0000000000 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/mod.rs +++ /dev/null @@ -1,20 +0,0 @@ -use cfg_if::cfg_if; - -cfg_if! { - if #[cfg(any(target_os = "linux"))] { - mod linux; - pub use self::linux::*; - } else if #[cfg(target_vendor = "apple")] { - mod apple; - pub use self::apple::*; - } else if #[cfg(any(target_os = "freebsd", target_os = "openbsd"))] { - mod bsd; - pub use self::bsd::*; - } else if #[cfg(target_os = "android")] { - mod android; - pub use self::android::*; - } else { - mod others; - pub use self::others::*; - } -} diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/others.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/others.rs deleted file mode 100644 index fb966718fb..0000000000 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/unix/others.rs +++ /dev/null @@ -1,23 +0,0 @@ -use std::{ - io::{self, Read, Write}, - marker::Unpin, -}; - -use tokio::io::{AsyncWrite, AsyncWriteExt}; -use tun::Device; - -/// Packet Information length in bytes -pub const IFF_PI_PREFIX_LEN: usize = 0; - -/// Writing packet with packet information -pub async fn write_packet_with_pi(writer: &mut W, packet: &[u8]) -> io::Result<()> { - writer.write_all(packet).await -} - -/// Set platform specific route configuration -pub async fn set_route_configuration(_: &mut (dyn Device + Send)) -> io::Result<()> -where - Q: Read + Write, -{ - Ok(()) -} diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/windows/mod.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/windows/mod.rs deleted file mode 100644 index 62f48860c0..0000000000 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/tun/sys/windows/mod.rs +++ /dev/null @@ -1,27 +0,0 @@ -use std::{ - io::{self, Read, Write}, - marker::Unpin, -}; - -use tokio::io::{AsyncWrite, AsyncWriteExt}; -use tun::Device; - -/// Packet Information length in bytes -/// -/// Tun device on Windows (https://wintun.net) doesn't have Packet Information header, so there is no prefix headers -pub const IFF_PI_PREFIX_LEN: usize = 0; - -/// Writing packet with packet information -/// -/// Tun device on Windows (https://wintun.net) doesn't have Packet Information header, so there is nothing to prepend on Windows -pub async fn write_packet_with_pi(writer: &mut W, packet: &[u8]) -> io::Result<()> { - writer.write_all(packet).await -} - -/// Set platform specific route configuration -pub async fn set_route_configuration(_: &mut (dyn Device + Send)) -> io::Result<()> -where - Q: Read + Write, -{ - Ok(()) -} diff --git a/shadowsocks-rust/debian/changelog b/shadowsocks-rust/debian/changelog index 6b67143033..f568f7cd28 100644 --- a/shadowsocks-rust/debian/changelog +++ b/shadowsocks-rust/debian/changelog @@ -1,3 +1,20 @@ +shadowsocks-rust (1.19.2) unstable; urgency=medium + + ## Bug Fixes + + - `local-tun`: `tun2` handles IP packet information automatically. + +shadowsocks-rust (1.19.1) unstable; urgency=medium + + ## Features + + - Rollback `rustls` to v0.22, v0.23 first introduced `aws-lc` as the default crypto implementation, but it cannot be built on some targets if there are still older versions of `rustls` in the dependency tree. + - `local-tun`: Switch from `tun` to `tun2`, which is a fork of `tun`. `tun` seems to be abandoned. + + ## Bug Fixes + + - #1539 `local-fake-dns`: Query Response Message has to include the original Query and flags. + shadowsocks-rust (1.19.0) unstable; urgency=medium ## Features diff --git a/shadowsocks-rust/docker/linux-cross/Dockerfile b/shadowsocks-rust/docker/linux-cross/Dockerfile new file mode 100644 index 0000000000..5f17c9a5e8 --- /dev/null +++ b/shadowsocks-rust/docker/linux-cross/Dockerfile @@ -0,0 +1,11 @@ +ARG CROSS_BASE_IMAGE +FROM $CROSS_BASE_IMAGE + +ARG DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && \ + apt-get install --assume-yes --no-install-recommends build-essential cmake nasm llvm-8-dev libclang-8-dev clang-8 && \ + git config --global --add safe.directory '*' && \ + rm -rf /tmp/* + +ENV GOCACHE=/tmp diff --git a/sing-box/common/settings/proxy_linux.go b/sing-box/common/settings/proxy_linux.go index 4211b2f88d..84e27b123b 100644 --- a/sing-box/common/settings/proxy_linux.go +++ b/sing-box/common/settings/proxy_linux.go @@ -16,30 +16,40 @@ import ( ) type LinuxSystemProxy struct { - hasGSettings bool - hasKWriteConfig5 bool - sudoUser string - serverAddr M.Socksaddr - supportSOCKS bool - isEnabled bool + hasGSettings bool + kWriteConfigCmd string + sudoUser string + serverAddr M.Socksaddr + supportSOCKS bool + isEnabled bool } func NewSystemProxy(ctx context.Context, serverAddr M.Socksaddr, supportSOCKS bool) (*LinuxSystemProxy, error) { hasGSettings := common.Error(exec.LookPath("gsettings")) == nil - hasKWriteConfig5 := common.Error(exec.LookPath("kwriteconfig5")) == nil + kWriteConfigCmds := []string{ + "kwriteconfig5", + "kwriteconfig6", + } + var kWriteConfigCmd string + for _, cmd := range kWriteConfigCmds { + if common.Error(exec.LookPath(cmd)) == nil { + kWriteConfigCmd = cmd + break + } + } var sudoUser string if os.Getuid() == 0 { sudoUser = os.Getenv("SUDO_USER") } - if !hasGSettings && !hasKWriteConfig5 { + if !hasGSettings && kWriteConfigCmd == "" { return nil, E.New("unsupported desktop environment") } return &LinuxSystemProxy{ - hasGSettings: hasGSettings, - hasKWriteConfig5: hasKWriteConfig5, - sudoUser: sudoUser, - serverAddr: serverAddr, - supportSOCKS: supportSOCKS, + hasGSettings: hasGSettings, + kWriteConfigCmd: kWriteConfigCmd, + sudoUser: sudoUser, + serverAddr: serverAddr, + supportSOCKS: supportSOCKS, }, nil } @@ -70,8 +80,8 @@ func (p *LinuxSystemProxy) Enable() error { return err } } - if p.hasKWriteConfig5 { - err := p.runAsUser("kwriteconfig5", "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "1") + if p.kWriteConfigCmd != "" { + err := p.runAsUser(p.kWriteConfigCmd, "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "1") if err != nil { return err } @@ -83,7 +93,7 @@ func (p *LinuxSystemProxy) Enable() error { if err != nil { return err } - err = p.runAsUser("kwriteconfig5", "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "Authmode", "0") + err = p.runAsUser(p.kWriteConfigCmd, "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "Authmode", "0") if err != nil { return err } @@ -103,8 +113,8 @@ func (p *LinuxSystemProxy) Disable() error { return err } } - if p.hasKWriteConfig5 { - err := p.runAsUser("kwriteconfig5", "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "0") + if p.kWriteConfigCmd != "" { + err := p.runAsUser(p.kWriteConfigCmd, "--file", "kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "0") if err != nil { return err } @@ -150,7 +160,7 @@ func (p *LinuxSystemProxy) setKDEProxy(proxyTypes ...string) error { proxyUrl = "http://" + p.serverAddr.String() } err := p.runAsUser( - "kwriteconfig5", + p.kWriteConfigCmd, "--file", "kioslaverc", "--group", diff --git a/sing-box/docs/changelog.md b/sing-box/docs/changelog.md index 4c5b129a29..295e0a8840 100644 --- a/sing-box/docs/changelog.md +++ b/sing-box/docs/changelog.md @@ -2,6 +2,10 @@ icon: material/alert-decagram --- +#### 1.10.0-alpha.7 + +* Fixes and improvements + #### 1.10.0-alpha.5 * Improve auto-redirect **1** diff --git a/sing-box/go.mod b/sing-box/go.mod index daaee0d6b9..ffdcf9e26b 100644 --- a/sing-box/go.mod +++ b/sing-box/go.mod @@ -24,17 +24,16 @@ require ( github.com/sagernet/cloudflare-tls v0.0.0-20231208171750-a4483c1b7cd1 github.com/sagernet/gomobile v0.1.3 github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f - github.com/sagernet/nftables v0.3.0-beta.2 github.com/sagernet/quic-go v0.43.1-beta.1 github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 - github.com/sagernet/sing v0.5.0-alpha.7 - github.com/sagernet/sing-dns v0.2.0-beta.18 + github.com/sagernet/sing v0.5.0-alpha.8 + github.com/sagernet/sing-dns v0.3.0-beta.1 github.com/sagernet/sing-mux v0.2.0 github.com/sagernet/sing-quic v0.2.0-beta.5 github.com/sagernet/sing-shadowsocks v0.2.6 github.com/sagernet/sing-shadowsocks2 v0.2.0 github.com/sagernet/sing-shadowtls v0.1.4 - github.com/sagernet/sing-tun v0.4.0-beta.4 + github.com/sagernet/sing-tun v0.4.0-beta.6 github.com/sagernet/sing-vmess v0.1.8 github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 github.com/sagernet/tfo-go v0.0.0-20231209031829-7b5343ac1dc6 @@ -46,7 +45,6 @@ require ( go.uber.org/zap v1.27.0 go4.org/netipx v0.0.0-20231129151722-fdeea329fbba golang.org/x/crypto v0.23.0 - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 golang.org/x/net v0.25.0 golang.org/x/sys v0.20.0 golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6 @@ -83,11 +81,13 @@ require ( github.com/quic-go/qpack v0.4.0 // indirect github.com/quic-go/qtls-go1-20 v0.4.1 // indirect github.com/sagernet/netlink v0.0.0-20240523065131-45e60152f9ba // indirect + github.com/sagernet/nftables v0.3.0-beta.2 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 // indirect github.com/vishvananda/netns v0.0.4 // indirect github.com/zeebo/blake3 v0.2.3 // indirect go.uber.org/multierr v1.11.0 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/text v0.15.0 // indirect diff --git a/sing-box/go.sum b/sing-box/go.sum index ba83799dde..097e3faea7 100644 --- a/sing-box/go.sum +++ b/sing-box/go.sum @@ -108,10 +108,10 @@ github.com/sagernet/quic-go v0.43.1-beta.1/go.mod h1:BkrQYeop7Jx3hN3TW8/76CXcdhY github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc= github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU= github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo= -github.com/sagernet/sing v0.5.0-alpha.7 h1:yxjiH0vQAotu87JNJ9B0BGO0OJqsFjug84xcYdwyDm4= -github.com/sagernet/sing v0.5.0-alpha.7/go.mod h1:Xh4KO9nGdvm4K/LVg9Xn9jSxJdqe9KcXbAzNC1S2qfw= -github.com/sagernet/sing-dns v0.2.0-beta.18 h1:6vzXZThRdA7YUzBOpSbUT48XRumtl/KIpIHFSOP0za8= -github.com/sagernet/sing-dns v0.2.0-beta.18/go.mod h1:k/dmFcQpg6+m08gC1yQBy+13+QkuLqpKr4bIreq4U24= +github.com/sagernet/sing v0.5.0-alpha.8 h1:2KtzBvKP6hwknsi/G6H4vRgR4it31HQ6quLb0Woze7c= +github.com/sagernet/sing v0.5.0-alpha.8/go.mod h1:Xh4KO9nGdvm4K/LVg9Xn9jSxJdqe9KcXbAzNC1S2qfw= +github.com/sagernet/sing-dns v0.3.0-beta.1 h1:ZARhK79eWYckWcGtYBLIT68LnwfbdE2EojkpIpoPGlc= +github.com/sagernet/sing-dns v0.3.0-beta.1/go.mod h1:k/dmFcQpg6+m08gC1yQBy+13+QkuLqpKr4bIreq4U24= github.com/sagernet/sing-mux v0.2.0 h1:4C+vd8HztJCWNYfufvgL49xaOoOHXty2+EAjnzN3IYo= github.com/sagernet/sing-mux v0.2.0/go.mod h1:khzr9AOPocLa+g53dBplwNDz4gdsyx/YM3swtAhlkHQ= github.com/sagernet/sing-quic v0.2.0-beta.5 h1:ceKFLd1iS5AtM+pScKmcDp5k7R6WgYIe8vl6nB0aVsE= @@ -122,8 +122,8 @@ github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wK github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ= github.com/sagernet/sing-shadowtls v0.1.4 h1:aTgBSJEgnumzFenPvc+kbD9/W0PywzWevnVpEx6Tw3k= github.com/sagernet/sing-shadowtls v0.1.4/go.mod h1:F8NBgsY5YN2beQavdgdm1DPlhaKQlaL6lpDdcBglGK4= -github.com/sagernet/sing-tun v0.4.0-beta.4 h1:94OB9fQupn0qBPvlDzKRAq1lSIPHAvVBaw69/jEZfgQ= -github.com/sagernet/sing-tun v0.4.0-beta.4/go.mod h1:DxLIyhjWU/HwGYoX0vNGg2c5QgTQIakphU1MuERR5tQ= +github.com/sagernet/sing-tun v0.4.0-beta.6 h1:Ybp1Yr2iNuh9iI/+f8L6R5MkhMJEMNtRHNBdmvVq9P0= +github.com/sagernet/sing-tun v0.4.0-beta.6/go.mod h1:X9taVYeJXEtK9v6BpS1V/gUXTwY4nQKH4iYDLX1JUXY= github.com/sagernet/sing-vmess v0.1.8 h1:XVWad1RpTy9b5tPxdm5MCU8cGfrTGdR8qCq6HV2aCNc= github.com/sagernet/sing-vmess v0.1.8/go.mod h1:vhx32UNzTDUkNwOyIjcZQohre1CaytquC5mPplId8uA= github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ= diff --git a/sing-box/inbound/tun.go b/sing-box/inbound/tun.go index 2275fa068c..a0e7f5fa51 100644 --- a/sing-box/inbound/tun.go +++ b/sing-box/inbound/tun.go @@ -3,6 +3,7 @@ package inbound import ( "context" "net" + "os" "strconv" "strings" "time" @@ -37,7 +38,7 @@ type Tun struct { tunStack tun.Stack platformInterface platform.Interface platformOptions option.TunPlatformOptions - autoRedirect *tunAutoRedirect + autoRedirect tun.AutoRedirect } func NewTun(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.TunInboundOptions, platformInterface platform.Interface) (*Tun, error) { @@ -105,7 +106,15 @@ func NewTun(ctx context.Context, router adapter.Router, logger log.ContextLogger if !options.AutoRoute { return nil, E.New("`auto_route` is required by `auto_redirect`") } - inbound.autoRedirect, err = newAutoRedirect(inbound) + disableNFTables, dErr := strconv.ParseBool(os.Getenv("DISABLE_NFTABLES")) + inbound.autoRedirect, err = tun.NewAutoRedirect(tun.AutoRedirectOptions{ + TunOptions: &inbound.tunOptions, + Context: ctx, + Handler: inbound, + Logger: logger, + TableName: "sing-box", + DisableNFTables: dErr == nil && disableNFTables, + }) if err != nil { return nil, E.Cause(err, "initialize auto redirect") } @@ -222,7 +231,7 @@ func (t *Tun) Close() error { return common.Close( t.tunStack, t.tunIf, - common.PtrOrNil(t.autoRedirect), + t.autoRedirect, ) } @@ -234,7 +243,11 @@ func (t *Tun) NewConnection(ctx context.Context, conn net.Conn, upstreamMetadata metadata.Source = upstreamMetadata.Source metadata.Destination = upstreamMetadata.Destination metadata.InboundOptions = t.inboundOptions - t.logger.InfoContext(ctx, "inbound connection from ", metadata.Source) + if upstreamMetadata.Protocol != "" { + t.logger.InfoContext(ctx, "inbound ", upstreamMetadata.Protocol, " connection from ", metadata.Source) + } else { + t.logger.InfoContext(ctx, "inbound connection from ", metadata.Source) + } t.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination) err := t.router.RouteConnection(ctx, conn, metadata) if err != nil { diff --git a/sing-box/inbound/tun_auto_redirect.go b/sing-box/inbound/tun_auto_redirect.go deleted file mode 100644 index 8ebc04d299..0000000000 --- a/sing-box/inbound/tun_auto_redirect.go +++ /dev/null @@ -1,197 +0,0 @@ -//go:build linux - -package inbound - -import ( - "context" - "net" - "net/netip" - "os" - "os/exec" - "strconv" - - "github.com/sagernet/nftables" - "github.com/sagernet/sing-box/adapter" - "github.com/sagernet/sing-box/common/redir" - C "github.com/sagernet/sing-box/constant" - "github.com/sagernet/sing-box/option" - "github.com/sagernet/sing-tun" - E "github.com/sagernet/sing/common/exceptions" - M "github.com/sagernet/sing/common/metadata" - N "github.com/sagernet/sing/common/network" - - "golang.org/x/sys/unix" -) - -type tunAutoRedirect struct { - myInboundAdapter - tunOptions *tun.Options - enableIPv4 bool - enableIPv6 bool - iptablesPath string - ip6tablesPath string - useNfTables bool - androidSu bool - suPath string -} - -func newAutoRedirect(t *Tun) (*tunAutoRedirect, error) { - s := &tunAutoRedirect{ - myInboundAdapter: myInboundAdapter{ - protocol: C.TypeRedirect, - network: []string{N.NetworkTCP}, - ctx: t.ctx, - router: t.router, - logger: t.logger, - tag: t.tag, - listenOptions: option.ListenOptions{ - InboundOptions: t.inboundOptions, - }, - }, - tunOptions: &t.tunOptions, - } - s.connHandler = s - - if C.IsAndroid { - s.enableIPv4 = true - s.iptablesPath = "/system/bin/iptables" - userId := os.Getuid() - if userId != 0 { - var ( - suPath string - err error - ) - if t.platformInterface != nil { - suPath, err = exec.LookPath("/bin/su") - } else { - suPath, err = exec.LookPath("su") - } - if err == nil { - s.androidSu = true - s.suPath = suPath - } else { - return nil, E.Extend(E.Cause(err, "root permission is required for auto redirect"), os.Getenv("PATH")) - } - } - } else { - err := s.initializeNfTables() - if err != nil && err != os.ErrInvalid { - t.logger.Debug("device has no nftables support: ", err) - } - if len(t.tunOptions.Inet4Address) > 0 { - s.enableIPv4 = true - if !s.useNfTables { - s.iptablesPath, err = exec.LookPath("iptables") - if err != nil { - return nil, E.Cause(err, "iptables is required") - } - } - } - if len(t.tunOptions.Inet6Address) > 0 { - s.enableIPv6 = true - if !s.useNfTables { - s.ip6tablesPath, err = exec.LookPath("ip6tables") - if err != nil { - if !s.enableIPv4 { - return nil, E.Cause(err, "ip6tables is required") - } else { - s.enableIPv6 = false - t.logger.Error("device has no ip6tables nat support: ", err) - } - } - } - } - } - var listenAddr netip.Addr - if C.IsAndroid { - listenAddr = netip.AddrFrom4([4]byte{127, 0, 0, 1}) - } else if s.enableIPv6 { - listenAddr = netip.IPv6Unspecified() - } else { - listenAddr = netip.IPv4Unspecified() - } - s.listenOptions.Listen = option.NewListenAddress(listenAddr) - return s, nil -} - -func (t *tunAutoRedirect) initializeNfTables() error { - disabled, err := strconv.ParseBool(os.Getenv("AUTO_REDIRECT_DISABLE_NFTABLES")) - if err == nil && disabled { - return os.ErrInvalid - } - nft, err := nftables.New() - if err != nil { - return err - } - defer nft.CloseLasting() - _, err = nft.ListTablesOfFamily(unix.AF_INET) - if err != nil { - return err - } - t.useNfTables = true - return nil -} - -func (t *tunAutoRedirect) Start() error { - err := t.myInboundAdapter.Start() - if err != nil { - return E.Cause(err, "start redirect server") - } - t.cleanupTables() - err = t.setupTables() - if err != nil { - return err - } - return nil -} - -func (t *tunAutoRedirect) Close() error { - t.cleanupTables() - return t.myInboundAdapter.Close() -} - -func (t *tunAutoRedirect) NewConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) error { - destination, err := redir.GetOriginalDestination(conn) - if err != nil { - return E.Cause(err, "get redirect destination") - } - metadata.Destination = M.SocksaddrFromNetIP(destination) - return t.newConnection(ctx, conn, metadata) -} - -func (t *tunAutoRedirect) setupTables() error { - var setupTables func(int) error - if t.useNfTables { - setupTables = t.setupNfTables - } else { - setupTables = t.setupIPTables - } - if t.enableIPv4 { - err := setupTables(unix.AF_INET) - if err != nil { - return err - } - } - if t.enableIPv6 { - err := setupTables(unix.AF_INET6) - if err != nil { - return err - } - } - return nil -} - -func (t *tunAutoRedirect) cleanupTables() { - var cleanupTables func(int) - if t.useNfTables { - cleanupTables = t.cleanupNfTables - } else { - cleanupTables = t.cleanupIPTables - } - if t.enableIPv4 { - cleanupTables(unix.AF_INET) - } - if t.enableIPv6 { - cleanupTables(unix.AF_INET6) - } -} diff --git a/sing-box/inbound/tun_auto_redirect_iptables.go b/sing-box/inbound/tun_auto_redirect_iptables.go deleted file mode 100644 index b1aa7dff13..0000000000 --- a/sing-box/inbound/tun_auto_redirect_iptables.go +++ /dev/null @@ -1,235 +0,0 @@ -//go:build linux - -package inbound - -import ( - "net/netip" - "os/exec" - "strings" - - E "github.com/sagernet/sing/common/exceptions" - F "github.com/sagernet/sing/common/format" - M "github.com/sagernet/sing/common/metadata" - - "golang.org/x/sys/unix" -) - -const ( - iptablesTableNameOutput = "sing-box-output" - iptablesTableNameForward = "sing-box-forward" - iptablesTableNamePreRouteing = "sing-box-prerouting" -) - -func (t *tunAutoRedirect) iptablesPathForFamily(family int) string { - if family == unix.AF_INET { - return t.iptablesPath - } else { - return t.ip6tablesPath - } -} - -func (t *tunAutoRedirect) setupIPTables(family int) error { - iptablesPath := t.iptablesPathForFamily(family) - // OUTPUT - err := t.runShell(iptablesPath, "-t nat -N", iptablesTableNameOutput) - if err != nil { - return err - } - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNameOutput, - "-p tcp -o", t.tunOptions.Name, - "-j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) - if err != nil { - return err - } - err = t.runShell(iptablesPath, "-t nat -I OUTPUT -j", iptablesTableNameOutput) - if err != nil { - return err - } - if !t.androidSu { - // FORWARD - err = t.runShell(iptablesPath, "-N", iptablesTableNameForward) - if err != nil { - return err - } - err = t.runShell(iptablesPath, "-A", iptablesTableNameForward, - "-i", t.tunOptions.Name, "-j", "ACCEPT") - if err != nil { - return err - } - err = t.runShell(iptablesPath, "-A", iptablesTableNameForward, - "-o", t.tunOptions.Name, "-j", "ACCEPT") - if err != nil { - return err - } - err = t.runShell(iptablesPath, "-I FORWARD -j", iptablesTableNameForward) - if err != nil { - return err - } - // PREROUTING - err = t.setupIPTablesPreRouting(family) - if err != nil { - return err - } - } - return nil -} - -func (t *tunAutoRedirect) setupIPTablesPreRouting(family int) error { - iptablesPath := t.iptablesPathForFamily(family) - err := t.runShell(iptablesPath, "-t nat -N", iptablesTableNamePreRouteing) - if err != nil { - return err - } - var ( - routeAddress []netip.Prefix - routeExcludeAddress []netip.Prefix - ) - if family == unix.AF_INET { - routeAddress = t.tunOptions.Inet4RouteAddress - routeExcludeAddress = t.tunOptions.Inet4RouteExcludeAddress - } else { - routeAddress = t.tunOptions.Inet6RouteAddress - routeExcludeAddress = t.tunOptions.Inet6RouteExcludeAddress - } - if len(routeAddress) > 0 && (len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0) { - return E.New("`*_route_address` is conflict with `include_interface` or `include_uid`") - } - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-i", t.tunOptions.Name, "-j RETURN") - if err != nil { - return err - } - for _, address := range routeExcludeAddress { - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-d", address.String(), "-j RETURN") - if err != nil { - return err - } - } - for _, name := range t.tunOptions.ExcludeInterface { - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-i", name, "-j RETURN") - if err != nil { - return err - } - } - for _, uid := range t.tunOptions.ExcludeUID { - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-m owner --uid-owner", uid, "-j RETURN") - if err != nil { - return err - } - } - var dnsServerAddress netip.Addr - if family == unix.AF_INET { - dnsServerAddress = t.tunOptions.Inet4Address[0].Addr().Next() - } else { - dnsServerAddress = t.tunOptions.Inet6Address[0].Addr().Next() - } - if len(routeAddress) > 0 { - for _, address := range routeAddress { - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-d", address.String(), "-p udp --dport 53 -j DNAT --to", dnsServerAddress) - if err != nil { - return err - } - } - } else if len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0 { - for _, name := range t.tunOptions.IncludeInterface { - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-i", name, "-p udp --dport 53 -j DNAT --to", dnsServerAddress) - if err != nil { - return err - } - } - for _, uidRange := range t.tunOptions.IncludeUID { - for uid := uidRange.Start; uid <= uidRange.End; uid++ { - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-m owner --uid-owner", uid, "-p udp --dport 53 -j DNAT --to", dnsServerAddress) - if err != nil { - return err - } - } - } - } else { - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-p udp --dport 53 -j DNAT --to", dnsServerAddress) - if err != nil { - return err - } - } - - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, "-m addrtype --dst-type LOCAL -j RETURN") - if err != nil { - return err - } - - if len(routeAddress) > 0 { - for _, address := range routeAddress { - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-d", address.String(), "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) - if err != nil { - return err - } - } - } else if len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0 { - for _, name := range t.tunOptions.IncludeInterface { - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-i", name, "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) - if err != nil { - return err - } - } - for _, uidRange := range t.tunOptions.IncludeUID { - for uid := uidRange.Start; uid <= uidRange.End; uid++ { - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-m owner --uid-owner", uid, "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) - if err != nil { - return err - } - } - } - } else { - err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, - "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) - if err != nil { - return err - } - } - err = t.runShell(iptablesPath, "-t nat -I PREROUTING -j", iptablesTableNamePreRouteing) - if err != nil { - return err - } - return nil -} - -func (t *tunAutoRedirect) cleanupIPTables(family int) { - iptablesPath := t.iptablesPathForFamily(family) - _ = t.runShell(iptablesPath, "-t nat -D OUTPUT -j", iptablesTableNameOutput) - _ = t.runShell(iptablesPath, "-t nat -F", iptablesTableNameOutput) - _ = t.runShell(iptablesPath, "-t nat -X", iptablesTableNameOutput) - if !t.androidSu { - _ = t.runShell(iptablesPath, "-D FORWARD -j", iptablesTableNameForward) - _ = t.runShell(iptablesPath, "-F", iptablesTableNameForward) - _ = t.runShell(iptablesPath, "-X", iptablesTableNameForward) - _ = t.runShell(iptablesPath, "-t nat -D PREROUTING -j", iptablesTableNamePreRouteing) - _ = t.runShell(iptablesPath, "-t nat -F", iptablesTableNamePreRouteing) - _ = t.runShell(iptablesPath, "-t nat -X", iptablesTableNamePreRouteing) - } -} - -func (t *tunAutoRedirect) runShell(commands ...any) error { - commandStr := strings.Join(F.MapToString(commands), " ") - var command *exec.Cmd - if t.androidSu { - command = exec.Command(t.suPath, "-c", commandStr) - } else { - commandArray := strings.Split(commandStr, " ") - command = exec.Command(commandArray[0], commandArray[1:]...) - } - combinedOutput, err := command.CombinedOutput() - if err != nil { - return E.Extend(err, F.ToString(commandStr, ": ", string(combinedOutput))) - } - return nil -} diff --git a/sing-box/inbound/tun_auto_redirect_nftables.go b/sing-box/inbound/tun_auto_redirect_nftables.go deleted file mode 100644 index ed84adf4c6..0000000000 --- a/sing-box/inbound/tun_auto_redirect_nftables.go +++ /dev/null @@ -1,231 +0,0 @@ -//go:build linux - -package inbound - -import ( - "net/netip" - - "github.com/sagernet/nftables" - "github.com/sagernet/nftables/binaryutil" - "github.com/sagernet/nftables/expr" - F "github.com/sagernet/sing/common/format" - M "github.com/sagernet/sing/common/metadata" - - "golang.org/x/sys/unix" -) - -const ( - nftablesTableName = "sing-box" - nftablesChainOutput = "output" - nftablesChainForward = "forward" - nftablesChainPreRouting = "prerouting" -) - -func nftablesFamily(family int) nftables.TableFamily { - switch family { - case unix.AF_INET: - return nftables.TableFamilyIPv4 - case unix.AF_INET6: - return nftables.TableFamilyIPv6 - default: - panic(F.ToString("unknown family ", family)) - } -} - -func (t *tunAutoRedirect) setupNfTables(family int) error { - nft, err := nftables.New() - if err != nil { - return err - } - defer nft.CloseLasting() - table := nft.AddTable(&nftables.Table{ - Name: nftablesTableName, - Family: nftablesFamily(family), - }) - chainOutput := nft.AddChain(&nftables.Chain{ - Name: nftablesChainOutput, - Table: table, - Hooknum: nftables.ChainHookOutput, - Priority: nftables.ChainPriorityMangle, - Type: nftables.ChainTypeNAT, - }) - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainOutput, - Exprs: nftablesRuleIfName(expr.MetaKeyOIFNAME, t.tunOptions.Name, nftablesRuleRedirectToPorts(M.AddrPortFromNet(t.tcpListener.Addr()).Port())...), - }) - chainForward := nft.AddChain(&nftables.Chain{ - Name: nftablesChainForward, - Table: table, - Hooknum: nftables.ChainHookForward, - Priority: nftables.ChainPriorityMangle, - }) - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainForward, - Exprs: nftablesRuleIfName(expr.MetaKeyIIFNAME, t.tunOptions.Name, &expr.Verdict{ - Kind: expr.VerdictAccept, - }), - }) - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainForward, - Exprs: nftablesRuleIfName(expr.MetaKeyOIFNAME, t.tunOptions.Name, &expr.Verdict{ - Kind: expr.VerdictAccept, - }), - }) - t.setupNfTablesPreRouting(nft, table) - return nft.Flush() -} - -func (t *tunAutoRedirect) setupNfTablesPreRouting(nft *nftables.Conn, table *nftables.Table) { - chainPreRouting := nft.AddChain(&nftables.Chain{ - Name: nftablesChainPreRouting, - Table: table, - Hooknum: nftables.ChainHookPrerouting, - Priority: nftables.ChainPriorityMangle, - Type: nftables.ChainTypeNAT, - }) - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainPreRouting, - Exprs: nftablesRuleIfName(expr.MetaKeyIIFNAME, t.tunOptions.Name, &expr.Verdict{ - Kind: expr.VerdictReturn, - }), - }) - var ( - routeAddress []netip.Prefix - routeExcludeAddress []netip.Prefix - ) - if table.Family == nftables.TableFamilyIPv4 { - routeAddress = t.tunOptions.Inet4RouteAddress - routeExcludeAddress = t.tunOptions.Inet4RouteExcludeAddress - } else { - routeAddress = t.tunOptions.Inet6RouteAddress - routeExcludeAddress = t.tunOptions.Inet6RouteExcludeAddress - } - for _, address := range routeExcludeAddress { - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainPreRouting, - Exprs: nftablesRuleDestinationAddress(address, &expr.Verdict{ - Kind: expr.VerdictReturn, - }), - }) - } - for _, name := range t.tunOptions.ExcludeInterface { - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainPreRouting, - Exprs: nftablesRuleIfName(expr.MetaKeyIIFNAME, name, &expr.Verdict{ - Kind: expr.VerdictReturn, - }), - }) - } - for _, uidRange := range t.tunOptions.ExcludeUID { - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainPreRouting, - Exprs: nftablesRuleMetaUInt32Range(expr.MetaKeySKUID, uidRange, &expr.Verdict{ - Kind: expr.VerdictReturn, - }), - }) - } - - var routeExprs []expr.Any - if len(routeAddress) > 0 { - for _, address := range routeAddress { - routeExprs = append(routeExprs, nftablesRuleDestinationAddress(address)...) - } - } - redirectPort := M.AddrPortFromNet(t.tcpListener.Addr()).Port() - var dnsServerAddress netip.Addr - if table.Family == nftables.TableFamilyIPv4 { - dnsServerAddress = t.tunOptions.Inet4Address[0].Addr().Next() - } else { - dnsServerAddress = t.tunOptions.Inet6Address[0].Addr().Next() - } - - if len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0 { - for _, name := range t.tunOptions.IncludeInterface { - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainPreRouting, - Exprs: nftablesRuleIfName(expr.MetaKeyIIFNAME, name, append(routeExprs, nftablesRuleHijackDNS(table.Family, dnsServerAddress)...)...), - }) - } - for _, uidRange := range t.tunOptions.IncludeUID { - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainPreRouting, - Exprs: nftablesRuleMetaUInt32Range(expr.MetaKeySKUID, uidRange, append(routeExprs, nftablesRuleHijackDNS(table.Family, dnsServerAddress)...)...), - }) - } - } else { - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainPreRouting, - Exprs: append(routeExprs, nftablesRuleHijackDNS(table.Family, dnsServerAddress)...), - }) - } - - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainPreRouting, - Exprs: []expr.Any{ - &expr.Fib{ - Register: 1, - FlagDADDR: true, - ResultADDRTYPE: true, - }, - &expr.Cmp{ - Op: expr.CmpOpEq, - Register: 1, - Data: binaryutil.NativeEndian.PutUint32(unix.RTN_LOCAL), - }, - &expr.Verdict{ - Kind: expr.VerdictReturn, - }, - }, - }) - - if len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0 { - for _, name := range t.tunOptions.IncludeInterface { - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainPreRouting, - Exprs: nftablesRuleIfName(expr.MetaKeyIIFNAME, name, append(routeExprs, nftablesRuleRedirectToPorts(redirectPort)...)...), - }) - } - for _, uidRange := range t.tunOptions.IncludeUID { - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainPreRouting, - Exprs: nftablesRuleMetaUInt32Range(expr.MetaKeySKUID, uidRange, append(routeExprs, nftablesRuleRedirectToPorts(redirectPort)...)...), - }) - } - } else { - nft.AddRule(&nftables.Rule{ - Table: table, - Chain: chainPreRouting, - Exprs: append(routeExprs, nftablesRuleRedirectToPorts(redirectPort)...), - }) - } -} - -func (t *tunAutoRedirect) cleanupNfTables(family int) { - conn, err := nftables.New() - if err != nil { - return - } - defer conn.CloseLasting() - conn.FlushTable(&nftables.Table{ - Name: nftablesTableName, - Family: nftablesFamily(family), - }) - conn.DelTable(&nftables.Table{ - Name: nftablesTableName, - Family: nftablesFamily(family), - }) - _ = conn.Flush() -} diff --git a/sing-box/inbound/tun_auto_redirect_nftables_expr.go b/sing-box/inbound/tun_auto_redirect_nftables_expr.go deleted file mode 100644 index 27c0309f38..0000000000 --- a/sing-box/inbound/tun_auto_redirect_nftables_expr.go +++ /dev/null @@ -1,153 +0,0 @@ -//go:build linux - -package inbound - -import ( - "net" - "net/netip" - - "github.com/sagernet/nftables" - "github.com/sagernet/nftables/binaryutil" - "github.com/sagernet/nftables/expr" - "github.com/sagernet/sing/common/ranges" - - "golang.org/x/sys/unix" -) - -func nftablesIfname(n string) []byte { - b := make([]byte, 16) - copy(b, n+"\x00") - return b -} - -func nftablesRuleIfName(key expr.MetaKey, value string, exprs ...expr.Any) []expr.Any { - newExprs := []expr.Any{ - &expr.Meta{Key: key, Register: 1}, - &expr.Cmp{ - Op: expr.CmpOpEq, - Register: 1, - Data: nftablesIfname(value), - }, - } - newExprs = append(newExprs, exprs...) - return newExprs -} - -func nftablesRuleMetaUInt32Range(key expr.MetaKey, uidRange ranges.Range[uint32], exprs ...expr.Any) []expr.Any { - newExprs := []expr.Any{ - &expr.Meta{Key: key, Register: 1}, - &expr.Range{ - Op: expr.CmpOpEq, - Register: 1, - FromData: binaryutil.BigEndian.PutUint32(uidRange.Start), - ToData: binaryutil.BigEndian.PutUint32(uidRange.End), - }, - } - newExprs = append(newExprs, exprs...) - return newExprs -} - -func nftablesRuleDestinationAddress(address netip.Prefix, exprs ...expr.Any) []expr.Any { - var newExprs []expr.Any - if address.Addr().Is4() { - newExprs = append(newExprs, &expr.Payload{ - OperationType: expr.PayloadLoad, - DestRegister: 1, - SourceRegister: 0, - Base: expr.PayloadBaseNetworkHeader, - Offset: 16, - Len: 4, - }, &expr.Bitwise{ - SourceRegister: 1, - DestRegister: 1, - Len: 4, - Xor: make([]byte, 4), - Mask: net.CIDRMask(address.Bits(), 32), - }) - } else { - newExprs = append(newExprs, &expr.Payload{ - OperationType: expr.PayloadLoad, - DestRegister: 1, - SourceRegister: 0, - Base: expr.PayloadBaseNetworkHeader, - Offset: 24, - Len: 16, - }, &expr.Bitwise{ - SourceRegister: 1, - DestRegister: 1, - Len: 16, - Xor: make([]byte, 16), - Mask: net.CIDRMask(address.Bits(), 128), - }) - } - newExprs = append(newExprs, &expr.Cmp{ - Op: expr.CmpOpEq, - Register: 1, - Data: address.Masked().Addr().AsSlice(), - }) - newExprs = append(newExprs, exprs...) - return newExprs -} - -func nftablesRuleHijackDNS(family nftables.TableFamily, dnsServerAddress netip.Addr) []expr.Any { - return []expr.Any{ - &expr.Meta{ - Key: expr.MetaKeyL4PROTO, - Register: 1, - }, - &expr.Cmp{ - Op: expr.CmpOpEq, - Register: 1, - Data: []byte{unix.IPPROTO_UDP}, - }, - &expr.Payload{ - OperationType: expr.PayloadLoad, - DestRegister: 1, - SourceRegister: 0, - Base: expr.PayloadBaseTransportHeader, - Offset: 2, - Len: 2, - }, &expr.Cmp{ - Op: expr.CmpOpEq, - Register: 1, - Data: binaryutil.BigEndian.PutUint16(53), - }, &expr.Immediate{ - Register: 1, - Data: dnsServerAddress.AsSlice(), - }, &expr.NAT{ - Type: expr.NATTypeDestNAT, - Family: uint32(family), - RegAddrMin: 1, - }, - } -} - -const ( - NF_NAT_RANGE_MAP_IPS = 1 << iota - NF_NAT_RANGE_PROTO_SPECIFIED - NF_NAT_RANGE_PROTO_RANDOM - NF_NAT_RANGE_PERSISTENT - NF_NAT_RANGE_PROTO_RANDOM_FULLY - NF_NAT_RANGE_PROTO_OFFSET -) - -func nftablesRuleRedirectToPorts(redirectPort uint16) []expr.Any { - return []expr.Any{ - &expr.Meta{ - Key: expr.MetaKeyL4PROTO, - Register: 1, - }, - &expr.Cmp{ - Op: expr.CmpOpEq, - Register: 1, - Data: []byte{unix.IPPROTO_TCP}, - }, - &expr.Immediate{ - Register: 1, - Data: binaryutil.BigEndian.PutUint16(redirectPort), - }, &expr.Redir{ - RegisterProtoMin: 1, - Flags: NF_NAT_RANGE_PROTO_SPECIFIED, - }, - } -} diff --git a/sing-box/inbound/tun_auto_redirect_stub.go b/sing-box/inbound/tun_auto_redirect_stub.go deleted file mode 100644 index 4bfdafa3b2..0000000000 --- a/sing-box/inbound/tun_auto_redirect_stub.go +++ /dev/null @@ -1,23 +0,0 @@ -//go:build !linux - -package inbound - -import ( - "os" - - E "github.com/sagernet/sing/common/exceptions" -) - -type tunAutoRedirect struct{} - -func newAutoRedirect(t *Tun) (*tunAutoRedirect, error) { - return nil, E.New("only supported on linux") -} - -func (t *tunAutoRedirect) Start() error { - return os.ErrInvalid -} - -func (t *tunAutoRedirect) Close() error { - return os.ErrInvalid -} diff --git a/sing-box/route/router.go b/sing-box/route/router.go index e8950f1871..adabd5906a 100644 --- a/sing-box/route/router.go +++ b/sing-box/route/router.go @@ -402,20 +402,17 @@ func (r *Router) Initialize(inbounds []adapter.Inbound, outbounds []adapter.Outb defaultOutboundForPacketConnection = detour } } - var index, packetIndex int if defaultOutboundForConnection == nil { - for i, detour := range outbounds { + for _, detour := range outbounds { if common.Contains(detour.Network(), N.NetworkTCP) { - index = i defaultOutboundForConnection = detour break } } } if defaultOutboundForPacketConnection == nil { - for i, detour := range outbounds { + for _, detour := range outbounds { if common.Contains(detour.Network(), N.NetworkUDP) { - packetIndex = i defaultOutboundForPacketConnection = detour break } @@ -432,22 +429,6 @@ func (r *Router) Initialize(inbounds []adapter.Inbound, outbounds []adapter.Outb outbounds = append(outbounds, detour) outboundByTag[detour.Tag()] = detour } - if defaultOutboundForConnection != defaultOutboundForPacketConnection { - var description string - if defaultOutboundForConnection.Tag() != "" { - description = defaultOutboundForConnection.Tag() - } else { - description = F.ToString(index) - } - var packetDescription string - if defaultOutboundForPacketConnection.Tag() != "" { - packetDescription = defaultOutboundForPacketConnection.Tag() - } else { - packetDescription = F.ToString(packetIndex) - } - r.logger.Info("using ", defaultOutboundForConnection.Type(), "[", description, "] as default outbound for connection") - r.logger.Info("using ", defaultOutboundForPacketConnection.Type(), "[", packetDescription, "] as default outbound for packet connection") - } r.inboundByTag = inboundByTag r.outbounds = outbounds r.defaultOutboundForConnection = defaultOutboundForConnection @@ -1138,6 +1119,9 @@ func (r *Router) AutoDetectInterfaceFunc() control.Func { if r.platformInterface != nil && r.platformInterface.UsePlatformAutoDetectInterfaceControl() { return r.platformInterface.AutoDetectInterfaceControl() } else { + if r.interfaceMonitor == nil { + return nil + } return control.BindToInterfaceFunc(r.InterfaceFinder(), func(network string, address string) (interfaceName string, interfaceIndex int, err error) { remoteAddr := M.ParseSocksaddr(address).Addr if C.IsLinux { diff --git a/sing-box/route/router_dns.go b/sing-box/route/router_dns.go index c3383e8b46..b0d278cdc9 100644 --- a/sing-box/route/router_dns.go +++ b/sing-box/route/router_dns.go @@ -8,7 +8,6 @@ import ( "time" "github.com/sagernet/sing-box/adapter" - C "github.com/sagernet/sing-box/constant" "github.com/sagernet/sing-dns" "github.com/sagernet/sing/common/cache" E "github.com/sagernet/sing/common/exceptions" @@ -122,12 +121,10 @@ func (r *Router) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, er for { var ( dnsCtx context.Context - cancel context.CancelFunc addressLimit bool ) dnsCtx, transport, strategy, rule, ruleIndex = r.matchDNS(ctx, true, ruleIndex) - dnsCtx, cancel = context.WithTimeout(dnsCtx, C.DNSTimeout) if rule != nil && rule.WithAddressLimit() && isAddressQuery(message) { addressLimit = true response, err = r.dnsClient.ExchangeWithResponseCheck(dnsCtx, transport, message, strategy, func(response *mDNS.Msg) bool { @@ -138,7 +135,6 @@ func (r *Router) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, er addressLimit = false response, err = r.dnsClient.Exchange(dnsCtx, transport, message, strategy) } - cancel() var rejected bool if err != nil { if errors.Is(err, dns.ErrResponseRejectedCached) { @@ -200,7 +196,6 @@ func (r *Router) Lookup(ctx context.Context, domain string, strategy dns.DomainS for { var ( dnsCtx context.Context - cancel context.CancelFunc addressLimit bool ) metadata.ResetRuleCache() @@ -209,7 +204,6 @@ func (r *Router) Lookup(ctx context.Context, domain string, strategy dns.DomainS if strategy == dns.DomainStrategyAsIS { strategy = transportStrategy } - dnsCtx, cancel = context.WithTimeout(dnsCtx, C.DNSTimeout) if rule != nil && rule.WithAddressLimit() { addressLimit = true responseAddrs, err = r.dnsClient.LookupWithResponseCheck(dnsCtx, transport, domain, strategy, func(responseAddrs []netip.Addr) bool { @@ -220,7 +214,6 @@ func (r *Router) Lookup(ctx context.Context, domain string, strategy dns.DomainS addressLimit = false responseAddrs, err = r.dnsClient.Lookup(dnsCtx, transport, domain, strategy) } - cancel() if err != nil { if errors.Is(err, dns.ErrResponseRejectedCached) { r.dnsLogger.DebugContext(ctx, "response rejected for ", domain, " (cached)") diff --git a/sing-box/transport/wireguard/client_bind.go b/sing-box/transport/wireguard/client_bind.go index 39adce251e..6c534532a1 100644 --- a/sing-box/transport/wireguard/client_bind.go +++ b/sing-box/transport/wireguard/client_bind.go @@ -12,6 +12,8 @@ import ( E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" + "github.com/sagernet/sing/service" + "github.com/sagernet/sing/service/pause" "github.com/sagernet/wireguard-go/conn" ) @@ -19,6 +21,9 @@ var _ conn.Bind = (*ClientBind)(nil) type ClientBind struct { ctx context.Context + pauseManager pause.Manager + bindCtx context.Context + bindDone context.CancelFunc errorHandler E.Handler dialer N.Dialer reservedForEndpoint map[netip.AddrPort][3]uint8 @@ -33,6 +38,7 @@ type ClientBind struct { func NewClientBind(ctx context.Context, errorHandler E.Handler, dialer N.Dialer, isConnect bool, connectAddr netip.AddrPort, reserved [3]uint8) *ClientBind { return &ClientBind{ ctx: ctx, + pauseManager: service.FromContext[pause.Manager](ctx), errorHandler: errorHandler, dialer: dialer, reservedForEndpoint: make(map[netip.AddrPort][3]uint8), @@ -55,6 +61,11 @@ func (c *ClientBind) connect() (*wireConn, error) { } c.connAccess.Lock() defer c.connAccess.Unlock() + select { + case <-c.done: + return nil, net.ErrClosed + default: + } serverConn = c.conn if serverConn != nil { select { @@ -65,7 +76,7 @@ func (c *ClientBind) connect() (*wireConn, error) { } } if c.isConnect { - udpConn, err := c.dialer.DialContext(c.ctx, N.NetworkUDP, M.SocksaddrFromNetIP(c.connectAddr)) + udpConn, err := c.dialer.DialContext(c.bindCtx, N.NetworkUDP, M.SocksaddrFromNetIP(c.connectAddr)) if err != nil { return nil, err } @@ -74,7 +85,7 @@ func (c *ClientBind) connect() (*wireConn, error) { done: make(chan struct{}), } } else { - udpConn, err := c.dialer.ListenPacket(c.ctx, M.Socksaddr{Addr: netip.IPv4Unspecified()}) + udpConn, err := c.dialer.ListenPacket(c.bindCtx, M.Socksaddr{Addr: netip.IPv4Unspecified()}) if err != nil { return nil, err } @@ -92,6 +103,7 @@ func (c *ClientBind) Open(port uint16) (fns []conn.ReceiveFunc, actualPort uint1 c.done = make(chan struct{}) default: } + c.bindCtx, c.bindDone = context.WithCancel(c.ctx) return []conn.ReceiveFunc{c.receive}, 0, nil } @@ -105,6 +117,7 @@ func (c *ClientBind) receive(packets [][]byte, sizes []int, eps []conn.Endpoint) } c.errorHandler.NewError(context.Background(), E.Cause(err, "connect to server")) err = nil + c.pauseManager.WaitActive() time.Sleep(time.Second) return } @@ -130,12 +143,17 @@ func (c *ClientBind) receive(packets [][]byte, sizes []int, eps []conn.Endpoint) } func (c *ClientBind) Close() error { - common.Close(common.PtrOrNil(c.conn)) select { case <-c.done: default: close(c.done) } + if c.bindDone != nil { + c.bindDone() + } + c.connAccess.Lock() + defer c.connAccess.Unlock() + common.Close(common.PtrOrNil(c.conn)) return nil } @@ -146,6 +164,8 @@ func (c *ClientBind) SetMark(mark uint32) error { func (c *ClientBind) Send(bufs [][]byte, ep conn.Endpoint) error { udpConn, err := c.connect() if err != nil { + c.pauseManager.WaitActive() + time.Sleep(time.Second) return err } destination := netip.AddrPort(ep.(Endpoint)) diff --git a/small/hysteria/Makefile b/small/hysteria/Makefile index fbfa404010..8c8d304038 100644 --- a/small/hysteria/Makefile +++ b/small/hysteria/Makefile @@ -5,16 +5,16 @@ include $(TOPDIR)/rules.mk PKG_NAME:=hysteria -PKG_VERSION:=2.4.4 +PKG_VERSION:=2.4.5 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/apernet/hysteria/tar.gz/app/v$(PKG_VERSION)? -PKG_HASH:=bbfe5ae78a7c90ec3b5bff5af34accc73eb2daa7dd7cf5ac954768a2833f8d60 +PKG_HASH:=e0d5ffb3ddd5e98092f29e908edb64468b1d8b40af78281cc0054b26f542a48b PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-app-v$(PKG_VERSION) PKG_LICENSE:=MIT -PKG_LICENSE_FILE:=LICENSE +PKG_LICENSE_FILES:=LICENSE PKG_MAINTAINER:=Tianling Shen PKG_BUILD_DEPENDS:=golang/host @@ -23,12 +23,12 @@ PKG_USE_MIPS16:=0 PKG_BUILD_FLAGS:=no-mips16 GO_PKG:=github.com/apernet/hysteria -GO_PKG_BUILD_PKG:=$(GO_PKG)/app +GO_PKG_BUILD_PKG:=$(GO_PKG)/app/v2 GO_PKG_LDFLAGS_X = \ - $(GO_PKG)/app/cmd.appVersion=v$(PKG_VERSION) \ - $(GO_PKG)/app/cmd.appType=release \ - $(GO_PKG)/app/cmd.appPlatform=$(GO_OS) \ - $(GO_PKG)/app/cmd.appArch=$(GO_ARCH) + $(GO_PKG)/app/v2/cmd.appVersion=v$(PKG_VERSION) \ + $(GO_PKG)/app/v2/cmd.appType=release \ + $(GO_PKG)/app/v2/cmd.appPlatform=$(GO_OS) \ + $(GO_PKG)/app/v2/cmd.appArch=$(GO_ARCH) include $(INCLUDE_DIR)/package.mk include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk @@ -37,7 +37,7 @@ define Package/hysteria SECTION:=net CATEGORY:=Network TITLE:=A feature-packed network utility optimized for networks of poor quality - URL:=https://github.com/apernet/hysteria + URL:=https://github.com/tobyxdd/hysteria DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle endef @@ -51,7 +51,7 @@ endef define Package/hysteria/install $(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR)) - $(INSTALL_DIR) $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/app $(1)/usr/bin/hysteria endef diff --git a/small/luci-app-mosdns/Makefile b/small/luci-app-mosdns/Makefile index 13e9982f21..bb832df9e0 100644 --- a/small/luci-app-mosdns/Makefile +++ b/small/luci-app-mosdns/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-mosdns -PKG_VERSION:=1.5.20 +PKG_VERSION:=1.5.22 PKG_RELEASE:=1 LUCI_TITLE:=LuCI Support for mosdns diff --git a/small/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua b/small/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua index cff0c60a59..5d6d76d7d8 100644 --- a/small/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua +++ b/small/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua @@ -47,7 +47,7 @@ o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("basic", Flag, "redirect", translate("DNS Forward"), translate("Forward Dnsmasq Domain Name resolution requests to MosDNS")) o.default = true -o = s:taboption("basic", Flag, "prefer_ipv4", translate("Remote DNS prefer IPv4"), translate("IPv4 is preferred for remote DNS resolution of dual-stack addresses, and is not affected when the destination is IPv6 only")) +o = s:taboption("basic", Flag, "prefer_ipv4", translate("Remote DNS prefer IPv4"), translate("IPv4 is preferred for Remote / Streaming Media DNS resolution of dual-stack addresses, and is not affected when the destination is IPv6 only")) o:depends( "configfile", "/var/etc/mosdns.json") o.default = true @@ -85,6 +85,22 @@ o:value("tls://208.67.222.222", translate("Cisco Public DNS (208.67.222.222)")) o:value("tls://208.67.220.220", translate("Cisco Public DNS (208.67.220.220)")) o:depends("configfile", "/var/etc/mosdns.json") +o = s:taboption("basic", Flag, "custom_stream_media_dns", translate("Custom Stream Media DNS"), translate("Netflix, Disney+, Hulu and streaming media rules list will use this DNS")) +o:depends( "configfile", "/var/etc/mosdns.json") +o.default = false + +o = s:taboption("basic", DynamicList, "stream_media_dns", translate("Streaming Media DNS server")) +o:value("tls://1.1.1.1", translate("CloudFlare Public DNS (1.1.1.1)")) +o:value("tls://1.0.0.1", translate("CloudFlare Public DNS (1.0.0.1)")) +o:value("tls://8.8.8.8", translate("Google Public DNS (8.8.8.8)")) +o:value("tls://8.8.4.4", translate("Google Public DNS (8.8.4.4)")) +o:value("tls://9.9.9.9", translate("Quad9 Public DNS (9.9.9.9)")) +o:value("tls://149.112.112.112", translate("Quad9 Public DNS (149.112.112.112)")) +o:value("tls://208.67.222.222", translate("Cisco Public DNS (208.67.222.222)")) +o:value("tls://208.67.220.220", translate("Cisco Public DNS (208.67.220.220)")) +o.default = "tls://8.8.8.8" +o:depends("custom_stream_media_dns", "1") + o = s:taboption("basic", ListValue, "bootstrap_dns", translate("Bootstrap DNS servers"), translate("Bootstrap DNS servers are used to resolve IP addresses of the DoH/DoT resolvers you specify as upstreams")) o:value("119.29.29.29", translate("Tencent Public DNS (119.29.29.29)")) o:value("119.28.28.28", translate("Tencent Public DNS (119.28.28.28)")) @@ -125,7 +141,7 @@ o.rmempty = false o.default = false o:depends("configfile", "/var/etc/mosdns.json") -o = s:taboption("advanced", Value, "remote_ecs_ip", translate("IP Address"), translate("Please provide the IP address you use when accessing foreign websites. This IP subnet (0/24) will be used as the ECS address for Remote DNS requests") .. '
' .. translate("This feature is typically used when using a self-built DNS server as an Remote DNS upstream (requires support from the upstream server)")) +o = s:taboption("advanced", Value, "remote_ecs_ip", translate("IP Address"), translate("Please provide the IP address you use when accessing foreign websites. This IP subnet (0/24) will be used as the ECS address for Remote / Streaming Media DNS requests") .. '
' .. translate("This feature is typically used when using a self-built DNS server as an Remote / Streaming Media DNS upstream (requires support from the upstream server)")) o.datatype = "ipaddr" o:depends("enable_ecs_remote", "1") diff --git a/small/luci-app-mosdns/luasrc/model/cbi/mosdns/rule_list.lua b/small/luci-app-mosdns/luasrc/model/cbi/mosdns/rule_list.lua index 1d6554e23c..d41957beb3 100644 --- a/small/luci-app-mosdns/luasrc/model/cbi/mosdns/rule_list.lua +++ b/small/luci-app-mosdns/luasrc/model/cbi/mosdns/rule_list.lua @@ -7,6 +7,7 @@ local hosts_list_file = "/etc/mosdns/rule/hosts.txt" local redirect_list_file = "/etc/mosdns/rule/redirect.txt" local local_ptr_file = "/etc/mosdns/rule/local-ptr.txt" local ddns_list_file = "/etc/mosdns/rule/ddnslist.txt" +local streaming_media_list_file = "/etc/mosdns/rule/streaming.txt" m = Map("mosdns") @@ -20,6 +21,7 @@ s:tab("ddns_list", translate("DDNS Lists")) s:tab("hosts_list", translate("Hosts")) s:tab("redirect_list", translate("Redirect")) s:tab("local_ptr_list", translate("Block PTR")) +s:tab("streaming_media_list", translate("Streaming Media")) o = s:taboption("white_list", TextValue, "whitelist", "", "" .. translate("These domain names allow DNS resolution with the highest priority. Please input the domain names of websites, every line can input only one website domain. For example: hm.baidu.com.") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") o.rows = 15 @@ -91,6 +93,16 @@ o.validate = function(self, value) return value end +o = s:taboption("streaming_media_list", TextValue, "streaming_media", "", "" .. translate("These domains are always resolved using Streaming Media DNS. Please input the domain names of websites, every line can input only one website domain. For example: netflix.com.") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(streaming_media_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(streaming_media_list_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(streaming_media_list_file, "") end +o.validate = function(self, value) + return value +end + local apply = luci.http.formvalue("cbi.apply") if apply then luci.sys.exec("/etc/init.d/mosdns reload") diff --git a/small/luci-app-mosdns/po/zh-cn/mosdns.po b/small/luci-app-mosdns/po/zh-cn/mosdns.po index 07859801ed..15989d5bab 100644 --- a/small/luci-app-mosdns/po/zh-cn/mosdns.po +++ b/small/luci-app-mosdns/po/zh-cn/mosdns.po @@ -163,8 +163,8 @@ msgstr "日志文件" msgid "Remote DNS prefer IPv4" msgstr "远程 DNS 首选 IPv4" -msgid "IPv4 is preferred for remote DNS resolution of dual-stack addresses, and is not affected when the destination is IPv6 only" -msgstr "远程 DNS 解析双栈地址时首选 IPv4,目标仅 IPv6 时不受影响" +msgid "IPv4 is preferred for Remote / Streaming Media DNS resolution of dual-stack addresses, and is not affected when the destination is IPv6 only" +msgstr "远程 / 流媒体 DNS 解析双栈地址时首选 IPv4,目标仅 IPv6 时不受影响" msgid "Custom China DNS" msgstr "自定义国内 DNS" @@ -280,11 +280,11 @@ msgstr "启用 EDNS 客户端子网" msgid "IP Address" msgstr "IP 地址" -msgid "Please provide the IP address you use when accessing foreign websites. This IP subnet (0/24) will be used as the ECS address for Remote DNS requests" -msgstr "请提供您在访问国外网站时使用的 IP 地址,这个 IP 子网(0/24)将用作远程 DNS 请求的 ECS 地址" +msgid "Please provide the IP address you use when accessing foreign websites. This IP subnet (0/24) will be used as the ECS address for Remote / Streaming Media DNS requests" +msgstr "请提供您在访问国外网站时使用的 IP 地址,这个 IP 子网(0/24)将用作 远程 / 流媒体 DNS 请求的 ECS 地址" -msgid "This feature is typically used when using a self-built DNS server as an Remote DNS upstream (requires support from the upstream server)" -msgstr "此功能通常在使用自建 DNS 服务器作为 远程 DNS 上游时使用(需要上游服务器的支持)" +msgid "This feature is typically used when using a self-built DNS server as an Remote / Streaming Media DNS upstream (requires support from the upstream server)" +msgstr "此功能通常在使用自建 DNS 服务器作为 远程 / 流媒体 DNS 上游时使用(需要上游服务器的支持)" msgid "Prevent DNS Leaks" msgstr "防止 DNS 泄漏" @@ -396,3 +396,18 @@ msgstr "输入需要导出的 GeoIP.dat 类别条目,允许添加多个标签" msgid "Export directory: /var/mosdns" msgstr "导出目录:/var/mosdns" + +msgid "Custom Stream Media DNS" +msgstr "自定义流媒体 DNS" + +msgid "Streaming Media DNS server" +msgstr "流媒体 DNS 服务器" + +msgid "Netflix, Disney+, Hulu and streaming media rules list will use this DNS" +msgstr "自定义 Netflix、Disney+、Hulu 以及 “流媒体” 规则列表的 DNS 服务器" + +msgid "Streaming Media" +msgstr "流媒体" + +msgid "These domains are always resolved using Streaming Media DNS. Please input the domain names of websites, every line can input only one website domain. For example: netflix.com." +msgstr "启用 “自定义流媒体 DNS” 时,加入的域名始终使用 “流媒体 DNS 服务器” 进行解析(每个域名一行,支持域名匹配规则)" diff --git a/small/luci-app-mosdns/root/etc/config/mosdns b/small/luci-app-mosdns/root/etc/config/mosdns index 603ab7637e..a15981f5a1 100644 --- a/small/luci-app-mosdns/root/etc/config/mosdns +++ b/small/luci-app-mosdns/root/etc/config/mosdns @@ -24,6 +24,7 @@ config mosdns 'config' option dns_leak '0' option cloudflare '0' option listen_port_api '9091' + option custom_stream_media_dns '0' option bootstrap_dns '119.29.29.29' list remote_dns 'tls://8.8.8.8' list remote_dns 'tls://1.1.1.1' diff --git a/small/luci-app-mosdns/root/etc/init.d/mosdns b/small/luci-app-mosdns/root/etc/init.d/mosdns index 8670fb14d6..aa16291f48 100755 --- a/small/luci-app-mosdns/root/etc/init.d/mosdns +++ b/small/luci-app-mosdns/root/etc/init.d/mosdns @@ -51,6 +51,8 @@ get_config() { config_get remote_dns $1 remote_dns "tls://8.8.8.8 tls://1.1.1.1" config_get custom_local_dns $1 custom_local_dns 0 config_get apple_optimization $1 apple_optimization 0 + config_get custom_stream_media_dns $1 custom_stream_media_dns 0 + config_get stream_media_dns $1 stream_media_dns "tls://8.8.8.8" config_get bootstrap_dns $1 bootstrap_dns "119.29.29.29" config_get listen_port_api $1 listen_port_api 9091 config_get concurrent $1 concurrent 1 @@ -205,6 +207,19 @@ generate_config() { json_close_array json_close_object json_close_object + # plugin: stream_media + json_add_object + json_add_string "tag" "stream_media" + json_add_string "type" "domain_set" + json_add_object "args" + json_add_array "files" + json_add_string "" "/var/mosdns/geosite_disney.txt" + json_add_string "" "/var/mosdns/geosite_netflix.txt" + json_add_string "" "/var/mosdns/geosite_hulu.txt" + json_add_string "" "/etc/mosdns/rule/streaming.txt" + json_close_array + json_close_object + json_close_object # plugin: cloudflare_cidr json_add_object json_add_string "tag" "cloudflare_cidr" @@ -315,6 +330,51 @@ generate_config() { json_close_object json_close_array json_close_object + # plugin: forward_stream_media + json_add_object + json_add_string "tag" "forward_stream_media" + json_add_string "type" "forward" + json_add_object "args" + json_add_int "concurrent" "$concurrent" + json_add_array "upstreams" + for addr in $stream_media_dns; do + enable_http3=0 + if echo "$addr" | grep -q "^h3://"; then + enable_http3=1 + addr=$(echo $addr | sed 's/h3:\/\//https:\/\//g') + fi + json_add_object + json_add_string "addr" "$addr" + json_add_string "bootstrap" "$bootstrap_dns" + json_add_boolean "enable_pipeline" "$enable_pipeline" + json_add_boolean "insecure_skip_verify" "$insecure_skip_verify" + json_add_int "idle_timeout" "$idle_timeout" + [ "$enable_http3" -eq 1 ] && json_add_boolean "enable_http3" "1" + json_close_object + done + json_close_array + json_close_object + json_close_object + # plugin: forward_stream_media_upstream + json_add_object + json_add_string "tag" "forward_stream_media_upstream" + json_add_string "type" "sequence" + json_add_array "args" + [ "$prefer_ipv4" -eq 1 ] && { + json_add_object + json_add_string "exec" "prefer_ipv4" + json_close_object + } + [ "$enable_ecs_remote" -eq 1 ] && { + json_add_object + json_add_string "exec" "ecs $remote_ecs_ip" + json_close_object + } + json_add_object + json_add_string "exec" "\$forward_stream_media" + json_close_object + json_close_array + json_close_object # plugin: modify_ttl json_add_object json_add_string "tag" "modify_ttl" @@ -491,6 +551,17 @@ generate_config() { json_close_object json_close_array json_close_object + # plugin: query_is_stream_media_domain + json_add_object + json_add_string "tag" "query_is_stream_media_domain" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "matches" "qname \$stream_media" + json_add_string "exec" "\$forward_stream_media_upstream" + json_close_object + json_close_array + json_close_object # plugin: main_sequence json_add_object json_add_string "tag" "main_sequence" @@ -549,6 +620,14 @@ generate_config() { json_add_object json_add_string "exec" "jump has_resp_sequence" json_close_object + [ "$custom_stream_media_dns" -eq 1 ] && { + json_add_object + json_add_string "exec" "\$query_is_stream_media_domain" + json_close_object + json_add_object + json_add_string "exec" "jump has_resp_sequence" + json_close_object + } json_add_object json_add_string "exec" "\$query_is_local_domain" json_close_object diff --git a/small/luci-app-mosdns/root/etc/mosdns/rule/streaming.txt b/small/luci-app-mosdns/root/etc/mosdns/rule/streaming.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/small/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh b/small/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh index a8fb606457..32eaf55c1e 100755 --- a/small/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh +++ b/small/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh @@ -143,6 +143,7 @@ v2dat_dump() { adblock=$(uci -q get mosdns.config.adblock) ad_source=$(uci -q get mosdns.config.ad_source) configfile=$(uci -q get mosdns.config.configfile) + streaming_media=$(uci -q get mosdns.config.custom_stream_media_dns) mkdir -p /var/mosdns rm -f /var/mosdns/geo*.txt if [ "$configfile" = "/var/etc/mosdns.json" ]; then @@ -150,6 +151,8 @@ v2dat_dump() { v2dat unpack geoip -o /var/mosdns -f cn $v2dat_dir/geoip.dat v2dat unpack geosite -o /var/mosdns -f cn -f apple -f 'geolocation-!cn' $v2dat_dir/geosite.dat [ "$adblock" -eq 1 ] && [ $(echo $ad_source | grep -c geosite.dat) -ge '1' ] && v2dat unpack geosite -o /var/mosdns -f category-ads-all $v2dat_dir/geosite.dat + [ "$streaming_media" -eq 1 ] && v2dat unpack geosite -o /var/mosdns -f netflix -f disney -f hulu $v2dat_dir/geosite.dat || \ + touch /var/mosdns/geosite_disney.txt ; touch /var/mosdns/geosite_netflix.txt ; touch /var/mosdns/geosite_hulu.txt else # custom config v2dat unpack geoip -o /var/mosdns -f cn $v2dat_dir/geoip.dat diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua index 89378eec45..ef406ad3ff 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua @@ -73,7 +73,7 @@ local doh_validate = function(self, value, t) for i = 1, #val do local v = val[i] if v then - if not datatypes.ipmask4(v) then + if not datatypes.ipmask4(v) and not datatypes.ipmask6(v) then flag = 1 end end diff --git a/small/shadowsocks-rust/Makefile b/small/shadowsocks-rust/Makefile index b0ebc98dda..084b5854f9 100644 --- a/small/shadowsocks-rust/Makefile +++ b/small/shadowsocks-rust/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=shadowsocks-rust -PKG_VERSION:=1.19.0 +PKG_VERSION:=1.19.2 PKG_RELEASE:=1 PKG_SOURCE_HEADER:=shadowsocks-v$(PKG_VERSION) @@ -21,29 +21,29 @@ endif ifeq ($(ARCH),aarch64) PKG_SOURCE:=$(PKG_SOURCE_HEADER).aarch64-$(PKG_SOURCE_BODY).$(PKG_SOURCE_FOOTER) - PKG_HASH:=c0ac84f0efdae92b19e72f5477438da5d2c835d3e0bf14a2b8dea0e0b6bcc064 + PKG_HASH:=cf462a5f0d2c8d09babcf709978172a62d08758f67390fe09f5509dce454f511 else ifeq ($(ARCH),arm) # Referred to golang/golang-values.mk ARM_CPU_FEATURES:=$(word 2,$(subst +,$(space),$(call qstrip,$(CONFIG_CPU_TYPE)))) ifeq ($(ARM_CPU_FEATURES),) PKG_SOURCE:=$(PKG_SOURCE_HEADER).arm-$(PKG_SOURCE_BODY)eabi.$(PKG_SOURCE_FOOTER) - PKG_HASH:=2d350f6d990cfd0f0af70ec889e77bf121f7a711129bb2ff7def926676cb90ee + PKG_HASH:=f71fa138fda5cd5b22e35bf4991cd18db8dac1dea75b43ce835151f9d80a78c0 else PKG_SOURCE:=$(PKG_SOURCE_HEADER).arm-$(PKG_SOURCE_BODY)eabihf.$(PKG_SOURCE_FOOTER) - PKG_HASH:=da2ace727b75039aabc4ebff74bc1ade07ffd21e46d4239aa7537b8665f71d33 + PKG_HASH:=5ac5267b25ed65d9943b5112a5bfd038f040b1458f200f14730be02a64fddbc0 endif else ifeq ($(ARCH),i386) PKG_SOURCE:=$(PKG_SOURCE_HEADER).i686-$(PKG_SOURCE_BODY).$(PKG_SOURCE_FOOTER) - PKG_HASH:=074ac1591be87ba846df962f895b0dd7b07120ef900a1fbfee86b40f8f13d93d + PKG_HASH:=4d08ec5232b8848902949c39f03a5f066d6d1acd8506306ea5de0f1c8734d90a else ifeq ($(ARCH),x86_64) PKG_SOURCE:=$(PKG_SOURCE_HEADER).x86_64-$(PKG_SOURCE_BODY).$(PKG_SOURCE_FOOTER) - PKG_HASH:=b2321bd795db6fb71b3bc70da03e1dd6aa64d194ce3183ffda789e08329edfd1 + PKG_HASH:=19ecd3c86dbb05012b34c4d8c38eec2c24ca5d10ad52e2b7e7554f8176bf4fa8 else ifeq ($(ARCH),mips) PKG_SOURCE:=$(PKG_SOURCE_HEADER).mips-$(PKG_SOURCE_BODY).$(PKG_SOURCE_FOOTER) - PKG_HASH:=e5ba11eb81c94d5376586df8ad05793cf87038c83c2b02a6a1fbd3aebd6aecf8 + PKG_HASH:=2e3ec0d4b32c58b074290bd6764c17f1ba5972c28a39ef90463bfdea37830599 else ifeq ($(ARCH),mipsel) PKG_SOURCE:=$(PKG_SOURCE_HEADER).mipsel-$(PKG_SOURCE_BODY).$(PKG_SOURCE_FOOTER) - PKG_HASH:=e735d637f3c2e57b1d102f1a0c64bc3688f59632b7aa946310d5338117e308fd + PKG_HASH:=3f8920df884f115d838e070f6b67ea98d3fb97ad1ccb93b802615869c447230c # Set the default value to make OpenWrt Package Checker happy else PKG_SOURCE:=dummy diff --git a/small/v2ray-geodata/Makefile b/small/v2ray-geodata/Makefile index 715e21f107..c5ac9c10a0 100644 --- a/small/v2ray-geodata/Makefile +++ b/small/v2ray-geodata/Makefile @@ -12,31 +12,31 @@ PKG_MAINTAINER:=Tianling Shen include $(INCLUDE_DIR)/package.mk -GEOIP_VER:=202405300042 +GEOIP_VER:=202406060042 GEOIP_FILE:=geoip.dat.$(GEOIP_VER) define Download/geoip URL:=https://github.com/v2fly/geoip/releases/download/$(GEOIP_VER)/ URL_FILE:=geoip.dat FILE:=$(GEOIP_FILE) - HASH:=ee22e254e7cb9a2e45d8851a70022662c15c739604c379029ae8f6a19a3ccc4f + HASH:=19d53a38cfaaac6e5a2be6d0b2710ebf094979d33380cdcb5fd5d073f07a2248 endef -GEOSITE_VER:=20240508170917 +GEOSITE_VER:=20240604215500 GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER) define Download/geosite URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/ URL_FILE:=dlc.dat FILE:=$(GEOSITE_FILE) - HASH:=25d6120b009498ac83ae723e9751a19ff545fac4800dad53ab6e2592c3407533 + HASH:=146800cbe3ec546a8ca3ed75524ad34bb3bf9d77d6f707b361eef67e4cf45d07 endef -GEOSITE_IRAN_VER:=202405270027 +GEOSITE_IRAN_VER:=202406030028 GEOSITE_IRAN_FILE:=iran.dat.$(GEOSITE_IRAN_VER) define Download/geosite-ir URL:=https://github.com/bootmortis/iran-hosted-domains/releases/download/$(GEOSITE_IRAN_VER)/ URL_FILE:=iran.dat FILE:=$(GEOSITE_IRAN_FILE) - HASH:=8c37d450d8b756fcc58e71eeef67d4db419c05216259c177bd2cf01c55851d67 + HASH:=5dc876f4ba837ae095f889a81a5529ee8fc07a6290e2f4ece3fcd6943c58996b endef define Package/v2ray-geodata/template diff --git a/v2rayn/v2rayN/ProtosLib/ProtosLib.csproj b/v2rayn/v2rayN/ProtosLib/ProtosLib.csproj index a9dab02aed..2c84666b65 100644 --- a/v2rayn/v2rayN/ProtosLib/ProtosLib.csproj +++ b/v2rayn/v2rayN/ProtosLib/ProtosLib.csproj @@ -9,9 +9,9 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/v2rayn/v2rayN/v2rayN/Common/JsonUtils.cs b/v2rayn/v2rayN/v2rayN/Common/JsonUtils.cs index 2198ba3541..ab81d41efa 100644 --- a/v2rayn/v2rayN/v2rayN/Common/JsonUtils.cs +++ b/v2rayn/v2rayN/v2rayN/Common/JsonUtils.cs @@ -105,9 +105,12 @@ namespace v2rayN /// /// /// - public static int ToFile(object? obj, string filePath, bool nullValue = true) + public static int ToFile(object? obj, string? filePath, bool nullValue = true) { - int result; + if (filePath is null) + { + return -1; + } try { using FileStream file = File.Create(filePath); @@ -119,14 +122,13 @@ namespace v2rayN }; JsonSerializer.Serialize(file, obj, options); - result = 0; + return 0; } catch (Exception ex) { Logging.SaveLog(ex.Message, ex); - result = -1; + return -1; } - return result; } } } \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Common/QRCodeHelper.cs b/v2rayn/v2rayN/v2rayN/Common/QRCodeHelper.cs index 9b02a48b83..255ab475d5 100644 --- a/v2rayn/v2rayN/v2rayN/Common/QRCodeHelper.cs +++ b/v2rayn/v2rayN/v2rayN/Common/QRCodeHelper.cs @@ -1,13 +1,13 @@ using QRCoder; using QRCoder.Xaml; using System.Drawing; -using System.Windows.Interop; using System.Windows; +using System.Windows.Interop; using System.Windows.Media; +using ZXing; using ZXing.Common; using ZXing.QrCode; using ZXing.Windows.Compatibility; -using ZXing; namespace v2rayN { diff --git a/v2rayn/v2rayN/v2rayN/Models/EConfigType.cs b/v2rayn/v2rayN/v2rayN/Enums/EConfigType.cs similarity index 90% rename from v2rayn/v2rayN/v2rayN/Models/EConfigType.cs rename to v2rayn/v2rayN/v2rayN/Enums/EConfigType.cs index 81880eb43d..60ef796a43 100644 --- a/v2rayn/v2rayN/v2rayN/Models/EConfigType.cs +++ b/v2rayn/v2rayN/v2rayN/Enums/EConfigType.cs @@ -1,4 +1,4 @@ -namespace v2rayN.Models +namespace v2rayN.Enums { public enum EConfigType { diff --git a/v2rayn/v2rayN/v2rayN/Models/ECoreType.cs b/v2rayn/v2rayN/v2rayN/Enums/ECoreType.cs similarity index 92% rename from v2rayn/v2rayN/v2rayN/Models/ECoreType.cs rename to v2rayn/v2rayN/v2rayN/Enums/ECoreType.cs index f1556b32b2..54c078870f 100644 --- a/v2rayn/v2rayN/v2rayN/Models/ECoreType.cs +++ b/v2rayn/v2rayN/v2rayN/Enums/ECoreType.cs @@ -1,4 +1,4 @@ -namespace v2rayN.Models +namespace v2rayN.Enums { public enum ECoreType { diff --git a/v2rayn/v2rayN/v2rayN/Models/EGlobalHotkey.cs b/v2rayn/v2rayN/v2rayN/Enums/EGlobalHotkey.cs similarity index 87% rename from v2rayn/v2rayN/v2rayN/Models/EGlobalHotkey.cs rename to v2rayn/v2rayN/v2rayN/Enums/EGlobalHotkey.cs index 46183028bd..f4a92bdba8 100644 --- a/v2rayn/v2rayN/v2rayN/Models/EGlobalHotkey.cs +++ b/v2rayn/v2rayN/v2rayN/Enums/EGlobalHotkey.cs @@ -1,4 +1,4 @@ -namespace v2rayN.Models +namespace v2rayN.Enums { public enum EGlobalHotkey { diff --git a/v2rayn/v2rayN/v2rayN/Models/EInboundProtocol.cs b/v2rayn/v2rayN/v2rayN/Enums/EInboundProtocol.cs similarity index 85% rename from v2rayn/v2rayN/v2rayN/Models/EInboundProtocol.cs rename to v2rayn/v2rayN/v2rayN/Enums/EInboundProtocol.cs index 79440fb96c..5bc955a889 100644 --- a/v2rayn/v2rayN/v2rayN/Models/EInboundProtocol.cs +++ b/v2rayn/v2rayN/v2rayN/Enums/EInboundProtocol.cs @@ -1,4 +1,4 @@ -namespace v2rayN.Models +namespace v2rayN.Enums { public enum EInboundProtocol { diff --git a/v2rayn/v2rayN/v2rayN/Models/EMove.cs b/v2rayn/v2rayN/v2rayN/Enums/EMove.cs similarity index 82% rename from v2rayn/v2rayN/v2rayN/Models/EMove.cs rename to v2rayn/v2rayN/v2rayN/Enums/EMove.cs index 0629e62db9..fcbc23dccd 100644 --- a/v2rayn/v2rayN/v2rayN/Models/EMove.cs +++ b/v2rayn/v2rayN/v2rayN/Enums/EMove.cs @@ -1,4 +1,4 @@ -namespace v2rayN.Models +namespace v2rayN.Enums { public enum EMove { diff --git a/v2rayn/v2rayN/v2rayN/Models/EServerColName.cs b/v2rayn/v2rayN/v2rayN/Enums/EServerColName.cs similarity index 91% rename from v2rayn/v2rayN/v2rayN/Models/EServerColName.cs rename to v2rayn/v2rayN/v2rayN/Enums/EServerColName.cs index 8bf9111bc4..453dbe881a 100644 --- a/v2rayn/v2rayN/v2rayN/Models/EServerColName.cs +++ b/v2rayn/v2rayN/v2rayN/Enums/EServerColName.cs @@ -1,4 +1,4 @@ -namespace v2rayN.Models +namespace v2rayN.Enums { public enum EServerColName { diff --git a/v2rayn/v2rayN/v2rayN/Models/ESpeedActionType.cs b/v2rayn/v2rayN/v2rayN/Enums/ESpeedActionType.cs similarity index 81% rename from v2rayn/v2rayN/v2rayN/Models/ESpeedActionType.cs rename to v2rayn/v2rayN/v2rayN/Enums/ESpeedActionType.cs index dee2970903..e0663d92d6 100644 --- a/v2rayn/v2rayN/v2rayN/Models/ESpeedActionType.cs +++ b/v2rayn/v2rayN/v2rayN/Enums/ESpeedActionType.cs @@ -1,4 +1,4 @@ -namespace v2rayN.Models +namespace v2rayN.Enums { public enum ESpeedActionType { diff --git a/v2rayn/v2rayN/v2rayN/Models/ESysProxyType.cs b/v2rayn/v2rayN/v2rayN/Enums/ESysProxyType.cs similarity index 83% rename from v2rayn/v2rayN/v2rayN/Models/ESysProxyType.cs rename to v2rayn/v2rayN/v2rayN/Enums/ESysProxyType.cs index 9c5bb423e1..b08576122c 100644 --- a/v2rayn/v2rayN/v2rayN/Models/ESysProxyType.cs +++ b/v2rayn/v2rayN/v2rayN/Enums/ESysProxyType.cs @@ -1,4 +1,4 @@ -namespace v2rayN.Models +namespace v2rayN.Enums { public enum ESysProxyType { diff --git a/v2rayn/v2rayN/v2rayN/Models/ETransport.cs b/v2rayn/v2rayN/v2rayN/Enums/ETransport.cs similarity index 85% rename from v2rayn/v2rayN/v2rayN/Models/ETransport.cs rename to v2rayn/v2rayN/v2rayN/Enums/ETransport.cs index 15eac5da10..7ad8a66e4b 100644 --- a/v2rayn/v2rayN/v2rayN/Models/ETransport.cs +++ b/v2rayn/v2rayN/v2rayN/Enums/ETransport.cs @@ -1,4 +1,4 @@ -namespace v2rayN.Models +namespace v2rayN.Enums { public enum ETransport { diff --git a/v2rayn/v2rayN/v2rayN/Models/EViewAction.cs b/v2rayn/v2rayN/v2rayN/Enums/EViewAction.cs similarity index 77% rename from v2rayn/v2rayN/v2rayN/Models/EViewAction.cs rename to v2rayn/v2rayN/v2rayN/Enums/EViewAction.cs index 1abdbde858..8a5a4641e3 100644 --- a/v2rayn/v2rayN/v2rayN/Models/EViewAction.cs +++ b/v2rayn/v2rayN/v2rayN/Enums/EViewAction.cs @@ -1,4 +1,4 @@ -namespace v2rayN.Models +namespace v2rayN.Enums { public enum EViewAction { diff --git a/v2rayn/v2rayN/v2rayN/Global.cs b/v2rayn/v2rayN/v2rayN/Global.cs index ec89420453..28b9331f9a 100644 --- a/v2rayn/v2rayN/v2rayN/Global.cs +++ b/v2rayn/v2rayN/v2rayN/Global.cs @@ -1,4 +1,4 @@ -using v2rayN.Models; +using v2rayN.Enums; namespace v2rayN { @@ -106,7 +106,6 @@ namespace v2rayN @"https://speed.cloudflare.com/__down?bytes=100000000", @"https://speed.cloudflare.com/__down?bytes=10000000", @"http://cachefly.cachefly.net/50mb.test", - @"http://cachefly.cachefly.net/100mb.test", @"http://cachefly.cachefly.net/10mb.test" }; diff --git a/v2rayn/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayn/v2rayN/v2rayN/Handler/ConfigHandler.cs index cd1819e055..a8a248bbe7 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -1,6 +1,8 @@ using System.Data; using System.IO; using System.Text.RegularExpressions; +using v2rayN.Enums; +using v2rayN.Handler.Fmt; using v2rayN.Models; namespace v2rayN.Handler @@ -1069,12 +1071,12 @@ namespace v2rayN.Handler /// 批量添加服务器 /// /// - /// + /// /// /// 成功导入的数量 - private static int AddBatchServers(Config config, string clipboardData, string subid, bool isSub, List lstOriSub) + private static int AddBatchServers(Config config, string strData, string subid, bool isSub, List lstOriSub) { - if (Utils.IsNullOrEmpty(clipboardData)) + if (Utils.IsNullOrEmpty(strData)) { return -1; } @@ -1091,7 +1093,7 @@ namespace v2rayN.Handler //Check for duplicate indexId List? lstDbIndexId = null; List lstAdd = new(); - var arrData = clipboardData.Split(Environment.NewLine.ToCharArray()).Where(t => !t.IsNullOrEmpty()); + var arrData = strData.Split(Environment.NewLine.ToCharArray()).Where(t => !t.IsNullOrEmpty()); if (isSub) { arrData = arrData.Distinct(); @@ -1107,7 +1109,7 @@ namespace v2rayN.Handler } continue; } - var profileItem = ShareHandler.ImportFromClipboardConfig(str, out string msg); + var profileItem = FmtHandler.ResolveConfig(str, out string msg); if (profileItem is null) { continue; @@ -1176,9 +1178,9 @@ namespace v2rayN.Handler return countServers; } - private static int AddBatchServers4Custom(Config config, string clipboardData, string subid, bool isSub, List lstOriSub) + private static int AddBatchServers4Custom(Config config, string strData, string subid, bool isSub, List lstOriSub) { - if (Utils.IsNullOrEmpty(clipboardData)) + if (Utils.IsNullOrEmpty(strData)) { return -1; } @@ -1194,7 +1196,7 @@ namespace v2rayN.Handler } //Is v2ray array configuration - var configObjects = JsonUtils.Deserialize(clipboardData); + var configObjects = JsonUtils.Deserialize(strData); if (configObjects != null && configObjects.Length > 0) { if (isSub && !Utils.IsNullOrEmpty(subid)) @@ -1235,42 +1237,42 @@ namespace v2rayN.Handler ProfileItem profileItem = new(); //Is v2ray configuration - var v2rayConfig = JsonUtils.Deserialize(clipboardData); + var v2rayConfig = JsonUtils.Deserialize(strData); if (v2rayConfig?.inbounds?.Count > 0 && v2rayConfig.outbounds?.Count > 0) { var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); - File.WriteAllText(fileName, clipboardData); + File.WriteAllText(fileName, strData); profileItem.coreType = ECoreType.Xray; profileItem.address = fileName; profileItem.remarks = v2rayConfig.remarks ?? "v2ray_custom"; } //Is Clash configuration - else if (Contains(clipboardData, "port", "socks-port", "proxies")) + else if (Contains(strData, "port", "socks-port", "proxies")) { var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.yaml"); - File.WriteAllText(fileName, clipboardData); + File.WriteAllText(fileName, strData); profileItem.coreType = ECoreType.mihomo; profileItem.address = fileName; profileItem.remarks = "clash_custom"; } //Is hysteria configuration - else if (Contains(clipboardData, "server", "up", "down", "listen", "", "")) + else if (Contains(strData, "server", "up", "down", "listen", "", "")) { var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); - File.WriteAllText(fileName, clipboardData); + File.WriteAllText(fileName, strData); profileItem.coreType = ECoreType.hysteria; profileItem.address = fileName; profileItem.remarks = "hysteria_custom"; } //Is naiveproxy configuration - else if (Contains(clipboardData, "listen", "proxy", "", "")) + else if (Contains(strData, "listen", "proxy", "", "")) { var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); - File.WriteAllText(fileName, clipboardData); + File.WriteAllText(fileName, strData); profileItem.coreType = ECoreType.naiveproxy; profileItem.address = fileName; @@ -1281,7 +1283,7 @@ namespace v2rayN.Handler { return -1; //var fileName = Utile.GetTempPath($"{Utile.GetGUID(false)}.txt"); - //File.WriteAllText(fileName, clipboardData); + //File.WriteAllText(fileName, strData); //profileItem.address = fileName; //profileItem.remarks = "other_custom"; @@ -1313,9 +1315,9 @@ namespace v2rayN.Handler } } - private static int AddBatchServers4SsSIP008(Config config, string clipboardData, string subid, bool isSub, List lstOriSub) + private static int AddBatchServers4SsSIP008(Config config, string strData, string subid, bool isSub, List lstOriSub) { - if (Utils.IsNullOrEmpty(clipboardData)) + if (Utils.IsNullOrEmpty(strData)) { return -1; } @@ -1326,10 +1328,10 @@ namespace v2rayN.Handler } //SsSIP008 - var lstSsServer = JsonUtils.Deserialize>(clipboardData); + var lstSsServer = JsonUtils.Deserialize>(strData); if (lstSsServer?.Count <= 0) { - var ssSIP008 = JsonUtils.Deserialize(clipboardData); + var ssSIP008 = JsonUtils.Deserialize(strData); if (ssSIP008?.servers?.Count > 0) { lstSsServer = ssSIP008.servers; @@ -1364,7 +1366,7 @@ namespace v2rayN.Handler return -1; } - public static int AddBatchServers(Config config, string clipboardData, string subid, bool isSub) + public static int AddBatchServers(Config config, string strData, string subid, bool isSub) { List? lstOriSub = null; if (isSub && !Utils.IsNullOrEmpty(subid)) @@ -1373,28 +1375,28 @@ namespace v2rayN.Handler } var counter = 0; - if (Utils.IsBase64String(clipboardData)) + if (Utils.IsBase64String(strData)) { - counter = AddBatchServers(config, Utils.Base64Decode(clipboardData), subid, isSub, lstOriSub); + counter = AddBatchServers(config, Utils.Base64Decode(strData), subid, isSub, lstOriSub); } if (counter < 1) { - counter = AddBatchServers(config, clipboardData, subid, isSub, lstOriSub); + counter = AddBatchServers(config, strData, subid, isSub, lstOriSub); } if (counter < 1) { - counter = AddBatchServers(config, Utils.Base64Decode(clipboardData), subid, isSub, lstOriSub); + counter = AddBatchServers(config, Utils.Base64Decode(strData), subid, isSub, lstOriSub); } if (counter < 1) { - counter = AddBatchServers4SsSIP008(config, clipboardData, subid, isSub, lstOriSub); + counter = AddBatchServers4SsSIP008(config, strData, subid, isSub, lstOriSub); } //maybe other sub if (counter < 1) { - counter = AddBatchServers4Custom(config, clipboardData, subid, isSub, lstOriSub); + counter = AddBatchServers4Custom(config, strData, subid, isSub, lstOriSub); } return counter; @@ -1532,16 +1534,16 @@ namespace v2rayN.Handler /// AddBatchRoutingRules /// /// - /// + /// /// - public static int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData) + public static int AddBatchRoutingRules(ref RoutingItem routingItem, string strData) { - if (Utils.IsNullOrEmpty(clipboardData)) + if (Utils.IsNullOrEmpty(strData)) { return -1; } - var lstRules = JsonUtils.Deserialize>(clipboardData); + var lstRules = JsonUtils.Deserialize>(strData); if (lstRules == null) { return -1; diff --git a/v2rayn/v2rayN/v2rayN/Handler/CoreConfigHandler.cs b/v2rayn/v2rayN/v2rayN/Handler/CoreConfig/CoreConfigHandler.cs similarity index 95% rename from v2rayn/v2rayN/v2rayN/Handler/CoreConfigHandler.cs rename to v2rayn/v2rayN/v2rayN/Handler/CoreConfig/CoreConfigHandler.cs index bc7c92985c..3f73f5423d 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/CoreConfigHandler.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/CoreConfig/CoreConfigHandler.cs @@ -1,8 +1,9 @@ using System.IO; +using v2rayN.Enums; using v2rayN.Models; using v2rayN.Resx; -namespace v2rayN.Handler +namespace v2rayN.Handler.CoreConfig { /// /// Core configuration file processing class @@ -154,7 +155,7 @@ namespace v2rayN.Handler { if (coreType == ECoreType.sing_box) { - if ((new CoreConfigSingbox(config)).GenerateClientSpeedtestConfig(selecteds, out SingboxConfig? singboxConfig, out msg) != 0) + if (new CoreConfigSingbox(config).GenerateClientSpeedtestConfig(selecteds, out SingboxConfig? singboxConfig, out msg) != 0) { return -1; } @@ -162,7 +163,7 @@ namespace v2rayN.Handler } else { - if ((new CoreConfigV2ray(config)).GenerateClientSpeedtestConfig(selecteds, out V2rayConfig? v2rayConfig, out msg) != 0) + if (new CoreConfigV2ray(config).GenerateClientSpeedtestConfig(selecteds, out V2rayConfig? v2rayConfig, out msg) != 0) { return -1; } diff --git a/v2rayn/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs b/v2rayn/v2rayN/v2rayN/Handler/CoreConfig/CoreConfigSingbox.cs similarity index 99% rename from v2rayn/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs rename to v2rayn/v2rayN/v2rayN/Handler/CoreConfig/CoreConfigSingbox.cs index c2cd926c8f..887bfd2215 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/CoreConfig/CoreConfigSingbox.cs @@ -1,9 +1,10 @@ using System.Net; using System.Net.NetworkInformation; +using v2rayN.Enums; using v2rayN.Models; using v2rayN.Resx; -namespace v2rayN.Handler +namespace v2rayN.Handler.CoreConfig { internal class CoreConfigSingbox { @@ -25,6 +26,11 @@ namespace v2rayN.Handler msg = ResUI.CheckServerSettings; return -1; } + if (node.GetNetwork() == nameof(ETransport.kcp)) + { + msg = ResUI.Incorrectconfiguration + $" - {node.GetNetwork()}"; + return -1; + } msg = ResUI.InitialConfiguration; @@ -114,7 +120,7 @@ namespace v2rayN.Handler var listen = "::"; singboxConfig.inbounds = []; - if (!_config.tunModeItem.enableTun || (_config.tunModeItem.enableTun && _config.tunModeItem.enableExInbound)) + if (!_config.tunModeItem.enableTun || _config.tunModeItem.enableTun && _config.tunModeItem.enableExInbound) { var inbound = new Inbound4Sbox() { diff --git a/v2rayn/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs b/v2rayn/v2rayN/v2rayN/Handler/CoreConfig/CoreConfigV2ray.cs similarity index 99% rename from v2rayn/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs rename to v2rayn/v2rayN/v2rayN/Handler/CoreConfig/CoreConfigV2ray.cs index 8ca96e9513..e182008032 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/CoreConfig/CoreConfigV2ray.cs @@ -1,9 +1,10 @@ using System.Net; using System.Net.NetworkInformation; +using v2rayN.Enums; using v2rayN.Models; using v2rayN.Resx; -namespace v2rayN.Handler +namespace v2rayN.Handler.CoreConfig { internal class CoreConfigV2ray { @@ -276,8 +277,8 @@ namespace v2rayN.Handler if (!hasDomainIp) { if (!Utils.IsNullOrEmpty(rules.port) - || (rules.protocol?.Count > 0) - || (rules.inboundTag?.Count > 0) + || rules.protocol?.Count > 0 + || rules.inboundTag?.Count > 0 ) { var it = JsonUtils.DeepCopy(rules); @@ -673,7 +674,7 @@ namespace v2rayN.Handler { authority = Utils.IsNullOrEmpty(host) ? null : host, serviceName = node.path, - multiMode = (node.headerType == Global.GrpcMultiMode), + multiMode = node.headerType == Global.GrpcMultiMode, idle_timeout = _config.grpcItem.idle_timeout, health_check_timeout = _config.grpcItem.health_check_timeout, permit_without_stream = _config.grpcItem.permit_without_stream, diff --git a/v2rayn/v2rayN/v2rayN/Handler/CoreHandler.cs b/v2rayn/v2rayN/v2rayN/Handler/CoreHandler.cs index b6b37c2f4e..dbe70658eb 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/CoreHandler.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/CoreHandler.cs @@ -2,6 +2,8 @@ using System.IO; using System.Reactive.Linq; using System.Text; +using v2rayN.Enums; +using v2rayN.Handler.CoreConfig; using v2rayN.Models; using v2rayN.Resx; @@ -39,6 +41,7 @@ namespace v2rayN.Handler if (CoreConfigHandler.GenerateClientConfig(node, fileName, out string msg, out string content) != 0) { ShowMsg(false, msg); + return; } else { diff --git a/v2rayn/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayn/v2rayN/v2rayN/Handler/DownloadHandle.cs index d29106e645..8500e9f7b7 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -4,7 +4,7 @@ using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Net.Sockets; -using v2rayN.Models; +using v2rayN.Enums; using v2rayN.Resx; namespace v2rayN.Handler diff --git a/v2rayn/v2rayN/v2rayN/Handler/Fmt/BaseFmt.cs b/v2rayn/v2rayN/v2rayN/Handler/Fmt/BaseFmt.cs new file mode 100644 index 0000000000..8bc9bb4843 --- /dev/null +++ b/v2rayn/v2rayN/v2rayN/Handler/Fmt/BaseFmt.cs @@ -0,0 +1,184 @@ +using System.Collections.Specialized; +using v2rayN.Enums; +using v2rayN.Models; + +namespace v2rayN.Handler.Fmt +{ + internal class BaseFmt + { + protected static string GetIpv6(string address) + { + if (Utils.IsIpv6(address)) + { + // 检查地址是否已经被方括号包围,如果没有,则添加方括号 + return address.StartsWith('[') && address.EndsWith(']') ? address : $"[{address}]"; + } + return address; // 如果不是IPv6地址,直接返回原地址 + } + + protected static int GetStdTransport(ProfileItem item, string? securityDef, ref Dictionary dicQuery) + { + if (!Utils.IsNullOrEmpty(item.flow)) + { + dicQuery.Add("flow", item.flow); + } + + if (!Utils.IsNullOrEmpty(item.streamSecurity)) + { + dicQuery.Add("security", item.streamSecurity); + } + else + { + if (securityDef != null) + { + dicQuery.Add("security", securityDef); + } + } + if (!Utils.IsNullOrEmpty(item.sni)) + { + dicQuery.Add("sni", item.sni); + } + if (!Utils.IsNullOrEmpty(item.alpn)) + { + dicQuery.Add("alpn", Utils.UrlEncode(item.alpn)); + } + if (!Utils.IsNullOrEmpty(item.fingerprint)) + { + dicQuery.Add("fp", Utils.UrlEncode(item.fingerprint)); + } + if (!Utils.IsNullOrEmpty(item.publicKey)) + { + dicQuery.Add("pbk", Utils.UrlEncode(item.publicKey)); + } + if (!Utils.IsNullOrEmpty(item.shortId)) + { + dicQuery.Add("sid", Utils.UrlEncode(item.shortId)); + } + if (!Utils.IsNullOrEmpty(item.spiderX)) + { + dicQuery.Add("spx", Utils.UrlEncode(item.spiderX)); + } + + dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : nameof(ETransport.tcp)); + + switch (item.network) + { + case nameof(ETransport.tcp): + dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : Global.None); + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + break; + + case nameof(ETransport.kcp): + dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : Global.None); + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("seed", Utils.UrlEncode(item.path)); + } + break; + + case nameof(ETransport.ws): + case nameof(ETransport.httpupgrade): + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("path", Utils.UrlEncode(item.path)); + } + break; + + case nameof(ETransport.http): + case nameof(ETransport.h2): + dicQuery["type"] = nameof(ETransport.http); + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("path", Utils.UrlEncode(item.path)); + } + break; + + case nameof(ETransport.quic): + dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : Global.None); + dicQuery.Add("quicSecurity", Utils.UrlEncode(item.requestHost)); + dicQuery.Add("key", Utils.UrlEncode(item.path)); + break; + + case nameof(ETransport.grpc): + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("authority", Utils.UrlEncode(item.requestHost)); + dicQuery.Add("serviceName", Utils.UrlEncode(item.path)); + if (item.headerType is Global.GrpcGunMode or Global.GrpcMultiMode) + { + dicQuery.Add("mode", Utils.UrlEncode(item.headerType)); + } + } + break; + } + return 0; + } + + protected static int ResolveStdTransport(NameValueCollection query, ref ProfileItem item) + { + item.flow = query["flow"] ?? ""; + item.streamSecurity = query["security"] ?? ""; + item.sni = query["sni"] ?? ""; + item.alpn = Utils.UrlDecode(query["alpn"] ?? ""); + item.fingerprint = Utils.UrlDecode(query["fp"] ?? ""); + item.publicKey = Utils.UrlDecode(query["pbk"] ?? ""); + item.shortId = Utils.UrlDecode(query["sid"] ?? ""); + item.spiderX = Utils.UrlDecode(query["spx"] ?? ""); + + item.network = query["type"] ?? nameof(ETransport.tcp); + switch (item.network) + { + case nameof(ETransport.tcp): + item.headerType = query["headerType"] ?? Global.None; + item.requestHost = Utils.UrlDecode(query["host"] ?? ""); + + break; + + case nameof(ETransport.kcp): + item.headerType = query["headerType"] ?? Global.None; + item.path = Utils.UrlDecode(query["seed"] ?? ""); + break; + + case nameof(ETransport.ws): + case nameof(ETransport.httpupgrade): + item.requestHost = Utils.UrlDecode(query["host"] ?? ""); + item.path = Utils.UrlDecode(query["path"] ?? "/"); + break; + + case nameof(ETransport.http): + case nameof(ETransport.h2): + item.network = nameof(ETransport.h2); + item.requestHost = Utils.UrlDecode(query["host"] ?? ""); + item.path = Utils.UrlDecode(query["path"] ?? "/"); + break; + + case nameof(ETransport.quic): + item.headerType = query["headerType"] ?? Global.None; + item.requestHost = query["quicSecurity"] ?? Global.None; + item.path = Utils.UrlDecode(query["key"] ?? ""); + break; + + case nameof(ETransport.grpc): + item.requestHost = Utils.UrlDecode(query["authority"] ?? ""); + item.path = Utils.UrlDecode(query["serviceName"] ?? ""); + item.headerType = Utils.UrlDecode(query["mode"] ?? Global.GrpcGunMode); + break; + + default: + break; + } + return 0; + } + } +} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Handler/Fmt/FmtHandler.cs b/v2rayn/v2rayN/v2rayN/Handler/Fmt/FmtHandler.cs new file mode 100644 index 0000000000..34ec25a337 --- /dev/null +++ b/v2rayn/v2rayN/v2rayN/Handler/Fmt/FmtHandler.cs @@ -0,0 +1,95 @@ +using v2rayN.Enums; +using v2rayN.Models; +using v2rayN.Resx; + +namespace v2rayN.Handler.Fmt +{ + internal class FmtHandler + { + public static string? GetShareUri(ProfileItem item) + { + try + { + var url = item.configType switch + { + EConfigType.VMess => VmessFmt.ToUri(item), + EConfigType.Shadowsocks => ShadowsocksFmt.ToUri(item), + EConfigType.Socks => SocksFmt.ToUri(item), + EConfigType.Trojan => TrojanFmt.ToUri(item), + EConfigType.VLESS => VLESSFmt.ToUri(item), + EConfigType.Hysteria2 => Hysteria2Fmt.ToUri(item), + EConfigType.Tuic => TuicFmt.ToUri(item), + EConfigType.Wireguard => WireguardFmt.ToUri(item), + _ => null, + }; + + return url; + } + catch (Exception ex) + { + Logging.SaveLog(ex.Message, ex); + return ""; + } + } + + + public static ProfileItem? ResolveConfig(string config, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + + try + { + string str = config.TrimEx(); + if (Utils.IsNullOrEmpty(str)) + { + msg = ResUI.FailedReadConfiguration; + return null; + } + + if (str.StartsWith(Global.ProtocolShares[EConfigType.VMess])) + { + return VmessFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.Shadowsocks])) + { + return ShadowsocksFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.Socks])) + { + return SocksFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.Trojan])) + { + return TrojanFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.VLESS])) + { + return VLESSFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.Hysteria2]) || str.StartsWith(Global.Hysteria2ProtocolShare)) + { + return Hysteria2Fmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.Tuic])) + { + return TuicFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.Wireguard])) + { + return WireguardFmt.Resolve(str, out msg); + } + else + { + msg = ResUI.NonvmessOrssProtocol; + return null; + } + } + catch (Exception ex) + { + Logging.SaveLog(ex.Message, ex); + msg = ResUI.Incorrectconfiguration; + return null; + } + } + } +} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Handler/Fmt/Hysteria2Fmt.cs b/v2rayn/v2rayN/v2rayN/Handler/Fmt/Hysteria2Fmt.cs new file mode 100644 index 0000000000..6565e935c7 --- /dev/null +++ b/v2rayn/v2rayN/v2rayN/Handler/Fmt/Hysteria2Fmt.cs @@ -0,0 +1,68 @@ +using v2rayN.Enums; +using v2rayN.Models; +using v2rayN.Resx; + +namespace v2rayN.Handler.Fmt +{ + internal class Hysteria2Fmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + ProfileItem item = new() + { + configType = EConfigType.Hysteria2 + }; + + Uri url = new(str); + + item.address = url.IdnHost; + item.port = url.Port; + item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.id = Utils.UrlDecode(url.UserInfo); + + var query = Utils.ParseQueryString(url.Query); + ResolveStdTransport(query, ref item); + item.path = Utils.UrlDecode(query["obfs-password"] ?? ""); + item.allowInsecure = (query["insecure"] ?? "") == "1" ? "true" : "false"; + + return item; + } + + public static string? ToUri(ProfileItem? item) + { + if (item == null) return null; + string url = string.Empty; + + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + var dicQuery = new Dictionary(); + if (!Utils.IsNullOrEmpty(item.sni)) + { + dicQuery.Add("sni", item.sni); + } + if (!Utils.IsNullOrEmpty(item.alpn)) + { + dicQuery.Add("alpn", Utils.UrlEncode(item.alpn)); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("obfs", "salamander"); + dicQuery.Add("obfs-password", Utils.UrlEncode(item.path)); + } + dicQuery.Add("insecure", item.allowInsecure.ToLower() == "true" ? "1" : "0"); + + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + + url = string.Format("{0}@{1}:{2}", + item.id, + GetIpv6(item.address), + item.port); + url = $"{Global.ProtocolShares[EConfigType.Hysteria2]}{url}/{query}{remark}"; + return url; + } + } +} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Handler/Fmt/ShadowsocksFmt.cs b/v2rayn/v2rayN/v2rayN/Handler/Fmt/ShadowsocksFmt.cs new file mode 100644 index 0000000000..92f51400b3 --- /dev/null +++ b/v2rayn/v2rayN/v2rayN/Handler/Fmt/ShadowsocksFmt.cs @@ -0,0 +1,150 @@ +using System.Text.RegularExpressions; +using v2rayN.Enums; +using v2rayN.Models; +using v2rayN.Resx; + +namespace v2rayN.Handler.Fmt +{ + internal class ShadowsocksFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + ProfileItem? item; + + item = ResolveSSLegacy(str) ?? ResolveSip002(str); + if (item == null) + { + return null; + } + if (item.address.Length == 0 || item.port == 0 || item.security.Length == 0 || item.id.Length == 0) + { + return null; + } + + item.configType = EConfigType.Shadowsocks; + + return item; + } + + public static string? ToUri(ProfileItem? item) + { + if (item == null) return null; + string url = string.Empty; + + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + //url = string.Format("{0}:{1}@{2}:{3}", + // item.security, + // item.id, + // item.address, + // item.port); + //url = Utile.Base64Encode(url); + //new Sip002 + var pw = Utils.Base64Encode($"{item.security}:{item.id}"); + url = $"{pw}@{GetIpv6(item.address)}:{item.port}"; + url = $"{Global.ProtocolShares[EConfigType.Shadowsocks]}{url}{remark}"; + return url; + } + + private static readonly Regex UrlFinder = new(@"ss://(?[A-Za-z0-9+-/=_]+)(?:#(?\S+))?", RegexOptions.IgnoreCase | RegexOptions.Compiled); + private static readonly Regex DetailsParser = new(@"^((?.+?):(?.*)@(?.+?):(?\d+?))$", RegexOptions.IgnoreCase | RegexOptions.Compiled); + + private static ProfileItem? ResolveSSLegacy(string result) + { + var match = UrlFinder.Match(result); + if (!match.Success) + return null; + + ProfileItem item = new(); + var base64 = match.Groups["base64"].Value.TrimEnd('/'); + var tag = match.Groups["tag"].Value; + if (!Utils.IsNullOrEmpty(tag)) + { + item.remarks = Utils.UrlDecode(tag); + } + Match details; + try + { + details = DetailsParser.Match(Utils.Base64Decode(base64)); + } + catch (FormatException) + { + return null; + } + if (!details.Success) + return null; + item.security = details.Groups["method"].Value; + item.id = details.Groups["password"].Value; + item.address = details.Groups["hostname"].Value; + item.port = Utils.ToInt(details.Groups["port"].Value); + return item; + } + + private static ProfileItem? ResolveSip002(string result) + { + Uri parsedUrl; + try + { + parsedUrl = new Uri(result); + } + catch (UriFormatException) + { + return null; + } + ProfileItem item = new() + { + remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), + address = parsedUrl.IdnHost, + port = parsedUrl.Port, + }; + string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.UriEscaped); + //2022-blake3 + if (rawUserInfo.Contains(':')) + { + string[] userInfoParts = rawUserInfo.Split(new[] { ':' }, 2); + if (userInfoParts.Length != 2) + { + return null; + } + item.security = userInfoParts[0]; + item.id = Utils.UrlDecode(userInfoParts[1]); + } + else + { + // parse base64 UserInfo + string userInfo = Utils.Base64Decode(rawUserInfo); + string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); + if (userInfoParts.Length != 2) + { + return null; + } + item.security = userInfoParts[0]; + item.id = userInfoParts[1]; + } + + var queryParameters = Utils.ParseQueryString(parsedUrl.Query); + if (queryParameters["plugin"] != null) + { + //obfs-host exists + var obfsHost = queryParameters["plugin"]?.Split(';').FirstOrDefault(t => t.Contains("obfs-host")); + if (queryParameters["plugin"].Contains("obfs=http") && !Utils.IsNullOrEmpty(obfsHost)) + { + obfsHost = obfsHost?.Replace("obfs-host=", ""); + item.network = Global.DefaultNetwork; + item.headerType = Global.TcpHeaderHttp; + item.requestHost = obfsHost ?? ""; + } + else + { + return null; + } + } + + return item; + } + } +} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Handler/Fmt/SocksFmt.cs b/v2rayn/v2rayN/v2rayN/Handler/Fmt/SocksFmt.cs new file mode 100644 index 0000000000..ae99f3f800 --- /dev/null +++ b/v2rayn/v2rayN/v2rayN/Handler/Fmt/SocksFmt.cs @@ -0,0 +1,131 @@ +using v2rayN.Enums; +using v2rayN.Models; +using v2rayN.Resx; + +namespace v2rayN.Handler.Fmt +{ + internal class SocksFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + ProfileItem? item; + + item = ResolveSocksNew(str) ?? ResolveSocks(str); + if (item == null) + { + return null; + } + if (item.address.Length == 0 || item.port == 0) + { + return null; + } + + item.configType = EConfigType.Socks; + + return item; + } + + public static string? ToUri(ProfileItem? item) + { + if (item == null) return null; + string url = string.Empty; + + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + //url = string.Format("{0}:{1}@{2}:{3}", + // item.security, + // item.id, + // item.address, + // item.port); + //url = Utile.Base64Encode(url); + //new + var pw = Utils.Base64Encode($"{item.security}:{item.id}"); + url = $"{pw}@{GetIpv6(item.address)}:{item.port}"; + url = $"{Global.ProtocolShares[EConfigType.Socks]}{url}{remark}"; + return url; + } + + private static ProfileItem? ResolveSocks(string result) + { + ProfileItem item = new() + { + configType = EConfigType.Socks + }; + result = result[Global.ProtocolShares[EConfigType.Socks].Length..]; + //remark + int indexRemark = result.IndexOf("#"); + if (indexRemark > 0) + { + try + { + item.remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); + } + catch { } + result = result[..indexRemark]; + } + //part decode + int indexS = result.IndexOf("@"); + if (indexS > 0) + { + } + else + { + result = Utils.Base64Decode(result); + } + + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + string[] arr21 = arr1[0].Split(':'); + //string[] arr22 = arr1[1].Split(':'); + int indexPort = arr1[1].LastIndexOf(":"); + if (arr21.Length != 2 || indexPort < 0) + { + return null; + } + item.address = arr1[1][..indexPort]; + item.port = Utils.ToInt(arr1[1][(indexPort + 1)..]); + item.security = arr21[0]; + item.id = arr21[1]; + + return item; + } + + private static ProfileItem? ResolveSocksNew(string result) + { + Uri parsedUrl; + try + { + parsedUrl = new Uri(result); + } + catch (UriFormatException) + { + return null; + } + ProfileItem item = new() + { + remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), + address = parsedUrl.IdnHost, + port = parsedUrl.Port, + }; + + // parse base64 UserInfo + string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.Unescaped); + string userInfo = Utils.Base64Decode(rawUserInfo); + string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); + if (userInfoParts.Length == 2) + { + item.security = userInfoParts[0]; + item.id = userInfoParts[1]; + } + + return item; + } + } +} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Handler/Fmt/TrojanFmt.cs b/v2rayn/v2rayN/v2rayN/Handler/Fmt/TrojanFmt.cs new file mode 100644 index 0000000000..71f23805d8 --- /dev/null +++ b/v2rayn/v2rayN/v2rayN/Handler/Fmt/TrojanFmt.cs @@ -0,0 +1,53 @@ +using v2rayN.Enums; +using v2rayN.Models; +using v2rayN.Resx; + +namespace v2rayN.Handler.Fmt +{ + internal class TrojanFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + + ProfileItem item = new() + { + configType = EConfigType.Trojan + }; + + Uri url = new(str); + + item.address = url.IdnHost; + item.port = url.Port; + item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.id = Utils.UrlDecode(url.UserInfo); + + var query = Utils.ParseQueryString(url.Query); + ResolveStdTransport(query, ref item); + + return item; + } + + public static string? ToUri(ProfileItem? item) + { + if (item == null) return null; + string url = string.Empty; + + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + var dicQuery = new Dictionary(); + GetStdTransport(item, null, ref dicQuery); + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + + url = string.Format("{0}@{1}:{2}", + item.id, + GetIpv6(item.address), + item.port); + url = $"{Global.ProtocolShares[EConfigType.Trojan]}{url}{query}{remark}"; + return url; + } + } +} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Handler/Fmt/TuicFmt.cs b/v2rayn/v2rayN/v2rayN/Handler/Fmt/TuicFmt.cs new file mode 100644 index 0000000000..f1c64cd9b2 --- /dev/null +++ b/v2rayn/v2rayN/v2rayN/Handler/Fmt/TuicFmt.cs @@ -0,0 +1,68 @@ +using v2rayN.Enums; +using v2rayN.Models; +using v2rayN.Resx; + +namespace v2rayN.Handler.Fmt +{ + internal class TuicFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + + ProfileItem item = new() + { + configType = EConfigType.Tuic + }; + + Uri url = new(str); + + item.address = url.IdnHost; + item.port = url.Port; + item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + var userInfoParts = url.UserInfo.Split(new[] { ':' }, 2); + if (userInfoParts.Length == 2) + { + item.id = userInfoParts[0]; + item.security = userInfoParts[1]; + } + + var query = Utils.ParseQueryString(url.Query); + ResolveStdTransport(query, ref item); + item.headerType = query["congestion_control"] ?? ""; + + return item; + } + + public static string? ToUri(ProfileItem? item) + { + if (item == null) return null; + string url = string.Empty; + + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + var dicQuery = new Dictionary(); + if (!Utils.IsNullOrEmpty(item.sni)) + { + dicQuery.Add("sni", item.sni); + } + if (!Utils.IsNullOrEmpty(item.alpn)) + { + dicQuery.Add("alpn", Utils.UrlEncode(item.alpn)); + } + dicQuery.Add("congestion_control", item.headerType); + + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + + url = string.Format("{0}@{1}:{2}", + $"{item.id}:{item.security}", + GetIpv6(item.address), + item.port); + url = $"{Global.ProtocolShares[EConfigType.Tuic]}{url}{query}{remark}"; + return url; + } + } +} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Handler/Fmt/VLESSFmt.cs b/v2rayn/v2rayN/v2rayN/Handler/Fmt/VLESSFmt.cs new file mode 100644 index 0000000000..b7451ca2da --- /dev/null +++ b/v2rayn/v2rayN/v2rayN/Handler/Fmt/VLESSFmt.cs @@ -0,0 +1,64 @@ +using v2rayN.Enums; +using v2rayN.Models; +using v2rayN.Resx; + +namespace v2rayN.Handler.Fmt +{ + internal class VLESSFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + + ProfileItem item = new() + { + configType = EConfigType.VLESS, + security = Global.None + }; + + Uri url = new(str); + + item.address = url.IdnHost; + item.port = url.Port; + item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.id = Utils.UrlDecode(url.UserInfo); + + var query = Utils.ParseQueryString(url.Query); + item.security = query["encryption"] ?? Global.None; + item.streamSecurity = query["security"] ?? ""; + ResolveStdTransport(query, ref item); + + return item; + } + + public static string? ToUri(ProfileItem? item) + { + if (item == null) return null; + string url = string.Empty; + + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + var dicQuery = new Dictionary(); + if (!Utils.IsNullOrEmpty(item.security)) + { + dicQuery.Add("encryption", item.security); + } + else + { + dicQuery.Add("encryption", Global.None); + } + GetStdTransport(item, Global.None, ref dicQuery); + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + + url = string.Format("{0}@{1}:{2}", + item.id, + GetIpv6(item.address), + item.port); + url = $"{Global.ProtocolShares[EConfigType.VLESS]}{url}{query}{remark}"; + return url; + } + } +} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Handler/Fmt/VmessFmt.cs b/v2rayn/v2rayN/v2rayN/Handler/Fmt/VmessFmt.cs new file mode 100644 index 0000000000..5e0b230f07 --- /dev/null +++ b/v2rayn/v2rayN/v2rayN/Handler/Fmt/VmessFmt.cs @@ -0,0 +1,228 @@ +using System.Text.RegularExpressions; +using v2rayN.Enums; +using v2rayN.Models; +using v2rayN.Resx; + +namespace v2rayN.Handler.Fmt +{ + internal class VmessFmt : BaseFmt + { + private static readonly Regex StdVmessUserInfo = new( + @"^(?[a-z]+)(\+(?[a-z]+))?:(?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$", RegexOptions.Compiled); + + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + ProfileItem? item; + int indexSplit = str.IndexOf("?"); + if (indexSplit > 0) + { + item = ResolveStdVmess(str) ?? ResolveVmess4Kitsunebi(str); + } + else + { + item = ResolveVmess(str, out msg); + } + return item; + } + + public static string? ToUri(ProfileItem? item) + { + if (item == null) return null; + string url = string.Empty; + + VmessQRCode vmessQRCode = new() + { + v = item.configVersion, + ps = item.remarks.TrimEx(), + add = item.address, + port = item.port, + id = item.id, + aid = item.alterId, + scy = item.security, + net = item.network, + type = item.headerType, + host = item.requestHost, + path = item.path, + tls = item.streamSecurity, + sni = item.sni, + alpn = item.alpn, + fp = item.fingerprint + }; + + url = JsonUtils.Serialize(vmessQRCode); + url = Utils.Base64Encode(url); + url = $"{Global.ProtocolShares[EConfigType.VMess]}{url}"; + + return url; + } + + private static ProfileItem? ResolveVmess(string result, out string msg) + { + msg = string.Empty; + var item = new ProfileItem + { + configType = EConfigType.VMess + }; + + result = result[Global.ProtocolShares[EConfigType.VMess].Length..]; + result = Utils.Base64Decode(result); + + //转成Json + VmessQRCode? vmessQRCode = JsonUtils.Deserialize(result); + if (vmessQRCode == null) + { + msg = ResUI.FailedConversionConfiguration; + return null; + } + + item.network = Global.DefaultNetwork; + item.headerType = Global.None; + + item.configVersion = Utils.ToInt(vmessQRCode.v); + item.remarks = Utils.ToString(vmessQRCode.ps); + item.address = Utils.ToString(vmessQRCode.add); + item.port = Utils.ToInt(vmessQRCode.port); + item.id = Utils.ToString(vmessQRCode.id); + item.alterId = Utils.ToInt(vmessQRCode.aid); + item.security = Utils.ToString(vmessQRCode.scy); + + item.security = !Utils.IsNullOrEmpty(vmessQRCode.scy) ? vmessQRCode.scy : Global.DefaultSecurity; + if (!Utils.IsNullOrEmpty(vmessQRCode.net)) + { + item.network = vmessQRCode.net; + } + if (!Utils.IsNullOrEmpty(vmessQRCode.type)) + { + item.headerType = vmessQRCode.type; + } + + item.requestHost = Utils.ToString(vmessQRCode.host); + item.path = Utils.ToString(vmessQRCode.path); + item.streamSecurity = Utils.ToString(vmessQRCode.tls); + item.sni = Utils.ToString(vmessQRCode.sni); + item.alpn = Utils.ToString(vmessQRCode.alpn); + item.fingerprint = Utils.ToString(vmessQRCode.fp); + + return item; + } + + private static ProfileItem? ResolveStdVmess(string result) + { + ProfileItem item = new() + { + configType = EConfigType.VMess, + security = "auto" + }; + + Uri u = new(result); + + item.address = u.IdnHost; + item.port = u.Port; + item.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + var query = Utils.ParseQueryString(u.Query); + + var m = StdVmessUserInfo.Match(u.UserInfo); + if (!m.Success) return null; + + item.id = m.Groups["id"].Value; + + if (m.Groups["streamSecurity"].Success) + { + item.streamSecurity = m.Groups["streamSecurity"].Value; + } + switch (item.streamSecurity) + { + case Global.StreamSecurity: + break; + + default: + if (!Utils.IsNullOrEmpty(item.streamSecurity)) + return null; + break; + } + + item.network = m.Groups["network"].Value; + switch (item.network) + { + case nameof(ETransport.tcp): + string t1 = query["type"] ?? Global.None; + item.headerType = t1; + break; + + case nameof(ETransport.kcp): + item.headerType = query["type"] ?? Global.None; + break; + + case nameof(ETransport.ws): + case nameof(ETransport.httpupgrade): + string p1 = query["path"] ?? "/"; + string h1 = query["host"] ?? ""; + item.requestHost = Utils.UrlDecode(h1); + item.path = p1; + break; + + case nameof(ETransport.http): + case nameof(ETransport.h2): + item.network = nameof(ETransport.h2); + string p2 = query["path"] ?? "/"; + string h2 = query["host"] ?? ""; + item.requestHost = Utils.UrlDecode(h2); + item.path = p2; + break; + + case nameof(ETransport.quic): + string s = query["security"] ?? Global.None; + string k = query["key"] ?? ""; + string t3 = query["type"] ?? Global.None; + item.headerType = t3; + item.requestHost = Utils.UrlDecode(s); + item.path = k; + break; + + default: + return null; + } + + return item; + } + + private static ProfileItem? ResolveVmess4Kitsunebi(string result) + { + ProfileItem item = new() + { + configType = EConfigType.VMess + }; + result = result[Global.ProtocolShares[EConfigType.VMess].Length..]; + int indexSplit = result.IndexOf("?"); + if (indexSplit > 0) + { + result = result[..indexSplit]; + } + result = Utils.Base64Decode(result); + + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + string[] arr21 = arr1[0].Split(':'); + string[] arr22 = arr1[1].Split(':'); + if (arr21.Length != 2 || arr22.Length != 2) + { + return null; + } + + item.address = arr22[0]; + item.port = Utils.ToInt(arr22[1]); + item.security = arr21[0]; + item.id = arr21[1]; + + item.network = Global.DefaultNetwork; + item.headerType = Global.None; + item.remarks = "Alien"; + + return item; + } + } +} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Handler/Fmt/WireguardFmt.cs b/v2rayn/v2rayN/v2rayN/Handler/Fmt/WireguardFmt.cs new file mode 100644 index 0000000000..08af7262cc --- /dev/null +++ b/v2rayn/v2rayN/v2rayN/Handler/Fmt/WireguardFmt.cs @@ -0,0 +1,73 @@ +using v2rayN.Enums; +using v2rayN.Models; +using v2rayN.Resx; + +namespace v2rayN.Handler.Fmt +{ + internal class WireguardFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + + ProfileItem item = new() + { + configType = EConfigType.Wireguard + }; + + Uri url = new(str); + + item.address = url.IdnHost; + item.port = url.Port; + item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.id = Utils.UrlDecode(url.UserInfo); + + var query = Utils.ParseQueryString(url.Query); + + item.publicKey = Utils.UrlDecode(query["publickey"] ?? ""); + item.path = Utils.UrlDecode(query["reserved"] ?? ""); + item.requestHost = Utils.UrlDecode(query["address"] ?? ""); + item.shortId = Utils.UrlDecode(query["mtu"] ?? ""); + + return item; + } + + public static string? ToUri(ProfileItem? item) + { + if (item == null) return null; + string url = string.Empty; + + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + + var dicQuery = new Dictionary(); + if (!Utils.IsNullOrEmpty(item.publicKey)) + { + dicQuery.Add("publickey", Utils.UrlEncode(item.publicKey)); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("reserved", Utils.UrlEncode(item.path)); + } + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("address", Utils.UrlEncode(item.requestHost)); + } + if (!Utils.IsNullOrEmpty(item.shortId)) + { + dicQuery.Add("mtu", Utils.UrlEncode(item.shortId)); + } + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + + url = string.Format("{0}@{1}:{2}", + Utils.UrlEncode(item.id), + GetIpv6(item.address), + item.port); + url = $"{Global.ProtocolShares[EConfigType.Wireguard]}{url}/{query}{remark}"; + return url; + } + } +} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Handler/HotkeyHandler.cs b/v2rayn/v2rayN/v2rayN/Handler/HotkeyHandler.cs index 6ffec9aec2..623f9de26f 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/HotkeyHandler.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/HotkeyHandler.cs @@ -4,6 +4,7 @@ using System.Text; using System.Windows; using System.Windows.Input; using System.Windows.Interop; +using v2rayN.Enums; using v2rayN.Models; using v2rayN.Resx; diff --git a/v2rayn/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayn/v2rayN/v2rayN/Handler/LazyConfig.cs index 04766ffed5..b1061b6d23 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -1,4 +1,5 @@ using System.Runtime.Intrinsics.X86; +using v2rayN.Enums; using v2rayN.Models; namespace v2rayN.Handler diff --git a/v2rayn/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayn/v2rayN/v2rayN/Handler/MainFormHandler.cs index 5d5d61ddcf..607bafd166 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -3,6 +3,8 @@ using Splat; using System.Drawing; using System.IO; using System.Windows.Media.Imaging; +using v2rayN.Enums; +using v2rayN.Handler.CoreConfig; using v2rayN.Models; using v2rayN.Resx; diff --git a/v2rayn/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayn/v2rayN/v2rayN/Handler/ShareHandler.cs deleted file mode 100644 index 309bde8917..0000000000 --- a/v2rayn/v2rayN/v2rayN/Handler/ShareHandler.cs +++ /dev/null @@ -1,1003 +0,0 @@ -using System.Collections.Specialized; -using System.Text.RegularExpressions; -using v2rayN.Models; -using v2rayN.Resx; - -namespace v2rayN.Handler -{ - internal class ShareHandler - { - #region GetShareUrl - - /// - /// GetShareUrl - /// - /// - /// - public static string? GetShareUrl(ProfileItem item) - { - try - { - string? url = string.Empty; - - url = item.configType switch - { - EConfigType.VMess => ShareVmess(item), - EConfigType.Shadowsocks => ShareShadowsocks(item), - EConfigType.Socks => ShareSocks(item), - EConfigType.Trojan => ShareTrojan(item), - EConfigType.VLESS => ShareVLESS(item), - EConfigType.Hysteria2 => ShareHysteria2(item), - EConfigType.Tuic => ShareTuic(item), - EConfigType.Wireguard => ShareWireguard(item), - _ => null, - }; - - return url; - } - catch (Exception ex) - { - Logging.SaveLog(ex.Message, ex); - return ""; - } - } - - private static string ShareVmess(ProfileItem item) - { - string url = string.Empty; - - VmessQRCode vmessQRCode = new() - { - v = item.configVersion, - ps = item.remarks.TrimEx(), - add = item.address, - port = item.port, - id = item.id, - aid = item.alterId, - scy = item.security, - net = item.network, - type = item.headerType, - host = item.requestHost, - path = item.path, - tls = item.streamSecurity, - sni = item.sni, - alpn = item.alpn, - fp = item.fingerprint - }; - - url = JsonUtils.Serialize(vmessQRCode); - url = Utils.Base64Encode(url); - url = $"{Global.ProtocolShares[EConfigType.VMess]}{url}"; - - return url; - } - - private static string ShareShadowsocks(ProfileItem item) - { - string url = string.Empty; - - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - //url = string.Format("{0}:{1}@{2}:{3}", - // item.security, - // item.id, - // item.address, - // item.port); - //url = Utile.Base64Encode(url); - //new Sip002 - var pw = Utils.Base64Encode($"{item.security}:{item.id}"); - url = $"{pw}@{GetIpv6(item.address)}:{item.port}"; - url = $"{Global.ProtocolShares[EConfigType.Shadowsocks]}{url}{remark}"; - return url; - } - - private static string ShareSocks(ProfileItem item) - { - string url = string.Empty; - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - //url = string.Format("{0}:{1}@{2}:{3}", - // item.security, - // item.id, - // item.address, - // item.port); - //url = Utile.Base64Encode(url); - //new - var pw = Utils.Base64Encode($"{item.security}:{item.id}"); - url = $"{pw}@{GetIpv6(item.address)}:{item.port}"; - url = $"{Global.ProtocolShares[EConfigType.Socks]}{url}{remark}"; - return url; - } - - private static string ShareTrojan(ProfileItem item) - { - string url = string.Empty; - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - var dicQuery = new Dictionary(); - GetStdTransport(item, null, ref dicQuery); - string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); - - url = string.Format("{0}@{1}:{2}", - item.id, - GetIpv6(item.address), - item.port); - url = $"{Global.ProtocolShares[EConfigType.Trojan]}{url}{query}{remark}"; - return url; - } - - private static string ShareVLESS(ProfileItem item) - { - string url = string.Empty; - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - var dicQuery = new Dictionary(); - if (!Utils.IsNullOrEmpty(item.security)) - { - dicQuery.Add("encryption", item.security); - } - else - { - dicQuery.Add("encryption", Global.None); - } - GetStdTransport(item, Global.None, ref dicQuery); - string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); - - url = string.Format("{0}@{1}:{2}", - item.id, - GetIpv6(item.address), - item.port); - url = $"{Global.ProtocolShares[EConfigType.VLESS]}{url}{query}{remark}"; - return url; - } - - private static string ShareHysteria2(ProfileItem item) - { - string url = string.Empty; - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - var dicQuery = new Dictionary(); - if (!Utils.IsNullOrEmpty(item.sni)) - { - dicQuery.Add("sni", item.sni); - } - if (!Utils.IsNullOrEmpty(item.alpn)) - { - dicQuery.Add("alpn", Utils.UrlEncode(item.alpn)); - } - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("obfs", "salamander"); - dicQuery.Add("obfs-password", Utils.UrlEncode(item.path)); - } - dicQuery.Add("insecure", item.allowInsecure.ToLower() == "true" ? "1" : "0"); - - string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); - - url = string.Format("{0}@{1}:{2}", - item.id, - GetIpv6(item.address), - item.port); - url = $"{Global.ProtocolShares[EConfigType.Hysteria2]}{url}/{query}{remark}"; - return url; - } - - private static string ShareTuic(ProfileItem item) - { - string url = string.Empty; - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - var dicQuery = new Dictionary(); - if (!Utils.IsNullOrEmpty(item.sni)) - { - dicQuery.Add("sni", item.sni); - } - if (!Utils.IsNullOrEmpty(item.alpn)) - { - dicQuery.Add("alpn", Utils.UrlEncode(item.alpn)); - } - dicQuery.Add("congestion_control", item.headerType); - - string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); - - url = string.Format("{0}@{1}:{2}", - $"{item.id}:{item.security}", - GetIpv6(item.address), - item.port); - url = $"{Global.ProtocolShares[EConfigType.Tuic]}{url}{query}{remark}"; - return url; - } - - private static string ShareWireguard(ProfileItem item) - { - string url = string.Empty; - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - - var dicQuery = new Dictionary(); - if (!Utils.IsNullOrEmpty(item.publicKey)) - { - dicQuery.Add("publickey", Utils.UrlEncode(item.publicKey)); - } - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("reserved", Utils.UrlEncode(item.path)); - } - if (!Utils.IsNullOrEmpty(item.requestHost)) - { - dicQuery.Add("address", Utils.UrlEncode(item.requestHost)); - } - if (!Utils.IsNullOrEmpty(item.shortId)) - { - dicQuery.Add("mtu", Utils.UrlEncode(item.shortId)); - } - string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); - - url = string.Format("{0}@{1}:{2}", - Utils.UrlEncode(item.id), - GetIpv6(item.address), - item.port); - url = $"{Global.ProtocolShares[EConfigType.Wireguard]}{url}/{query}{remark}"; - return url; - } - - private static string GetIpv6(string address) - { - if (Utils.IsIpv6(address)) - { - // 检查地址是否已经被方括号包围,如果没有,则添加方括号 - return address.StartsWith('[') && address.EndsWith(']') ? address : $"[{address}]"; - } - return address; // 如果不是IPv6地址,直接返回原地址 - } - - private static int GetStdTransport(ProfileItem item, string? securityDef, ref Dictionary dicQuery) - { - if (!Utils.IsNullOrEmpty(item.flow)) - { - dicQuery.Add("flow", item.flow); - } - - if (!Utils.IsNullOrEmpty(item.streamSecurity)) - { - dicQuery.Add("security", item.streamSecurity); - } - else - { - if (securityDef != null) - { - dicQuery.Add("security", securityDef); - } - } - if (!Utils.IsNullOrEmpty(item.sni)) - { - dicQuery.Add("sni", item.sni); - } - if (!Utils.IsNullOrEmpty(item.alpn)) - { - dicQuery.Add("alpn", Utils.UrlEncode(item.alpn)); - } - if (!Utils.IsNullOrEmpty(item.fingerprint)) - { - dicQuery.Add("fp", Utils.UrlEncode(item.fingerprint)); - } - if (!Utils.IsNullOrEmpty(item.publicKey)) - { - dicQuery.Add("pbk", Utils.UrlEncode(item.publicKey)); - } - if (!Utils.IsNullOrEmpty(item.shortId)) - { - dicQuery.Add("sid", Utils.UrlEncode(item.shortId)); - } - if (!Utils.IsNullOrEmpty(item.spiderX)) - { - dicQuery.Add("spx", Utils.UrlEncode(item.spiderX)); - } - - dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : nameof(ETransport.tcp)); - - switch (item.network) - { - case nameof(ETransport.tcp): - dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : Global.None); - if (!Utils.IsNullOrEmpty(item.requestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); - } - break; - - case nameof(ETransport.kcp): - dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : Global.None); - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("seed", Utils.UrlEncode(item.path)); - } - break; - - case nameof(ETransport.ws): - case nameof(ETransport.httpupgrade): - if (!Utils.IsNullOrEmpty(item.requestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); - } - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("path", Utils.UrlEncode(item.path)); - } - break; - - case nameof(ETransport.http): - case nameof(ETransport.h2): - dicQuery["type"] = nameof(ETransport.http); - if (!Utils.IsNullOrEmpty(item.requestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); - } - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("path", Utils.UrlEncode(item.path)); - } - break; - - case nameof(ETransport.quic): - dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : Global.None); - dicQuery.Add("quicSecurity", Utils.UrlEncode(item.requestHost)); - dicQuery.Add("key", Utils.UrlEncode(item.path)); - break; - - case nameof(ETransport.grpc): - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("authority", Utils.UrlEncode(item.requestHost)); - dicQuery.Add("serviceName", Utils.UrlEncode(item.path)); - if (item.headerType is Global.GrpcGunMode or Global.GrpcMultiMode) - { - dicQuery.Add("mode", Utils.UrlEncode(item.headerType)); - } - } - break; - } - return 0; - } - - #endregion GetShareUrl - - #region ImportShareUrl - - /// - /// 从剪贴板导入URL - /// - /// - /// - public static ProfileItem? ImportFromClipboardConfig(string clipboardData, out string msg) - { - msg = ResUI.ConfigurationFormatIncorrect; - ProfileItem? profileItem; - - try - { - string result = clipboardData.TrimEx(); - if (Utils.IsNullOrEmpty(result)) - { - msg = ResUI.FailedReadConfiguration; - return null; - } - - if (result.StartsWith(Global.ProtocolShares[EConfigType.VMess])) - { - int indexSplit = result.IndexOf("?"); - if (indexSplit > 0) - { - profileItem = ResolveStdVmess(result) ?? ResolveVmess4Kitsunebi(result); - } - else - { - profileItem = ResolveVmess(result, out msg); - } - } - else if (result.StartsWith(Global.ProtocolShares[EConfigType.Shadowsocks])) - { - profileItem = ResolveSSLegacy(result) ?? ResolveSip002(result); - if (profileItem == null) - { - return null; - } - if (profileItem.address.Length == 0 || profileItem.port == 0 || profileItem.security.Length == 0 || profileItem.id.Length == 0) - { - return null; - } - - profileItem.configType = EConfigType.Shadowsocks; - } - else if (result.StartsWith(Global.ProtocolShares[EConfigType.Socks])) - { - profileItem = ResolveSocksNew(result) ?? ResolveSocks(result); - if (profileItem == null) - { - return null; - } - if (profileItem.address.Length == 0 || profileItem.port == 0) - { - return null; - } - - profileItem.configType = EConfigType.Socks; - } - else if (result.StartsWith(Global.ProtocolShares[EConfigType.Trojan])) - { - profileItem = ResolveTrojan(result); - } - else if (result.StartsWith(Global.ProtocolShares[EConfigType.VLESS])) - { - profileItem = ResolveStdVLESS(result); - } - else if (result.StartsWith(Global.ProtocolShares[EConfigType.Hysteria2]) || result.StartsWith(Global.Hysteria2ProtocolShare)) - { - profileItem = ResolveHysteria2(result); - } - else if (result.StartsWith(Global.ProtocolShares[EConfigType.Tuic])) - { - profileItem = ResolveTuic(result); - } - else if (result.StartsWith(Global.ProtocolShares[EConfigType.Wireguard])) - { - profileItem = ResolveWireguard(result); - } - else - { - msg = ResUI.NonvmessOrssProtocol; - return null; - } - } - catch (Exception ex) - { - Logging.SaveLog(ex.Message, ex); - msg = ResUI.Incorrectconfiguration; - return null; - } - - return profileItem; - } - - private static ProfileItem? ResolveVmess(string result, out string msg) - { - msg = string.Empty; - var profileItem = new ProfileItem - { - configType = EConfigType.VMess - }; - - result = result[Global.ProtocolShares[EConfigType.VMess].Length..]; - result = Utils.Base64Decode(result); - - //转成Json - VmessQRCode? vmessQRCode = JsonUtils.Deserialize(result); - if (vmessQRCode == null) - { - msg = ResUI.FailedConversionConfiguration; - return null; - } - - profileItem.network = Global.DefaultNetwork; - profileItem.headerType = Global.None; - - profileItem.configVersion = Utils.ToInt(vmessQRCode.v); - profileItem.remarks = Utils.ToString(vmessQRCode.ps); - profileItem.address = Utils.ToString(vmessQRCode.add); - profileItem.port = Utils.ToInt(vmessQRCode.port); - profileItem.id = Utils.ToString(vmessQRCode.id); - profileItem.alterId = Utils.ToInt(vmessQRCode.aid); - profileItem.security = Utils.ToString(vmessQRCode.scy); - - profileItem.security = !Utils.IsNullOrEmpty(vmessQRCode.scy) ? vmessQRCode.scy : Global.DefaultSecurity; - if (!Utils.IsNullOrEmpty(vmessQRCode.net)) - { - profileItem.network = vmessQRCode.net; - } - if (!Utils.IsNullOrEmpty(vmessQRCode.type)) - { - profileItem.headerType = vmessQRCode.type; - } - - profileItem.requestHost = Utils.ToString(vmessQRCode.host); - profileItem.path = Utils.ToString(vmessQRCode.path); - profileItem.streamSecurity = Utils.ToString(vmessQRCode.tls); - profileItem.sni = Utils.ToString(vmessQRCode.sni); - profileItem.alpn = Utils.ToString(vmessQRCode.alpn); - profileItem.fingerprint = Utils.ToString(vmessQRCode.fp); - - return profileItem; - } - - private static ProfileItem? ResolveVmess4Kitsunebi(string result) - { - ProfileItem profileItem = new() - { - configType = EConfigType.VMess - }; - result = result[Global.ProtocolShares[EConfigType.VMess].Length..]; - int indexSplit = result.IndexOf("?"); - if (indexSplit > 0) - { - result = result[..indexSplit]; - } - result = Utils.Base64Decode(result); - - string[] arr1 = result.Split('@'); - if (arr1.Length != 2) - { - return null; - } - string[] arr21 = arr1[0].Split(':'); - string[] arr22 = arr1[1].Split(':'); - if (arr21.Length != 2 || arr22.Length != 2) - { - return null; - } - - profileItem.address = arr22[0]; - profileItem.port = Utils.ToInt(arr22[1]); - profileItem.security = arr21[0]; - profileItem.id = arr21[1]; - - profileItem.network = Global.DefaultNetwork; - profileItem.headerType = Global.None; - profileItem.remarks = "Alien"; - - return profileItem; - } - - private static ProfileItem? ResolveStdVmess(string result) - { - ProfileItem i = new() - { - configType = EConfigType.VMess, - security = "auto" - }; - - Uri u = new(result); - - i.address = u.IdnHost; - i.port = u.Port; - i.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - var query = Utils.ParseQueryString(u.Query); - - var m = StdVmessUserInfo.Match(u.UserInfo); - if (!m.Success) return null; - - i.id = m.Groups["id"].Value; - - if (m.Groups["streamSecurity"].Success) - { - i.streamSecurity = m.Groups["streamSecurity"].Value; - } - switch (i.streamSecurity) - { - case Global.StreamSecurity: - break; - - default: - if (!Utils.IsNullOrEmpty(i.streamSecurity)) - return null; - break; - } - - i.network = m.Groups["network"].Value; - switch (i.network) - { - case nameof(ETransport.tcp): - string t1 = query["type"] ?? Global.None; - i.headerType = t1; - break; - - case nameof(ETransport.kcp): - i.headerType = query["type"] ?? Global.None; - break; - - case nameof(ETransport.ws): - case nameof(ETransport.httpupgrade): - string p1 = query["path"] ?? "/"; - string h1 = query["host"] ?? ""; - i.requestHost = Utils.UrlDecode(h1); - i.path = p1; - break; - - case nameof(ETransport.http): - case nameof(ETransport.h2): - i.network = nameof(ETransport.h2); - string p2 = query["path"] ?? "/"; - string h2 = query["host"] ?? ""; - i.requestHost = Utils.UrlDecode(h2); - i.path = p2; - break; - - case nameof(ETransport.quic): - string s = query["security"] ?? Global.None; - string k = query["key"] ?? ""; - string t3 = query["type"] ?? Global.None; - i.headerType = t3; - i.requestHost = Utils.UrlDecode(s); - i.path = k; - break; - - default: - return null; - } - - return i; - } - - private static ProfileItem? ResolveSip002(string result) - { - Uri parsedUrl; - try - { - parsedUrl = new Uri(result); - } - catch (UriFormatException) - { - return null; - } - ProfileItem server = new() - { - remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), - address = parsedUrl.IdnHost, - port = parsedUrl.Port, - }; - string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.UriEscaped); - //2022-blake3 - if (rawUserInfo.Contains(':')) - { - string[] userInfoParts = rawUserInfo.Split(new[] { ':' }, 2); - if (userInfoParts.Length != 2) - { - return null; - } - server.security = userInfoParts[0]; - server.id = Utils.UrlDecode(userInfoParts[1]); - } - else - { - // parse base64 UserInfo - string userInfo = Utils.Base64Decode(rawUserInfo); - string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); - if (userInfoParts.Length != 2) - { - return null; - } - server.security = userInfoParts[0]; - server.id = userInfoParts[1]; - } - - var queryParameters = Utils.ParseQueryString(parsedUrl.Query); - if (queryParameters["plugin"] != null) - { - //obfs-host exists - var obfsHost = queryParameters["plugin"]?.Split(';').FirstOrDefault(t => t.Contains("obfs-host")); - if (queryParameters["plugin"].Contains("obfs=http") && !Utils.IsNullOrEmpty(obfsHost)) - { - obfsHost = obfsHost?.Replace("obfs-host=", ""); - server.network = Global.DefaultNetwork; - server.headerType = Global.TcpHeaderHttp; - server.requestHost = obfsHost ?? ""; - } - else - { - return null; - } - } - - return server; - } - - private static readonly Regex UrlFinder = new(@"ss://(?[A-Za-z0-9+-/=_]+)(?:#(?\S+))?", RegexOptions.IgnoreCase | RegexOptions.Compiled); - private static readonly Regex DetailsParser = new(@"^((?.+?):(?.*)@(?.+?):(?\d+?))$", RegexOptions.IgnoreCase | RegexOptions.Compiled); - - private static ProfileItem? ResolveSSLegacy(string result) - { - var match = UrlFinder.Match(result); - if (!match.Success) - return null; - - ProfileItem server = new(); - var base64 = match.Groups["base64"].Value.TrimEnd('/'); - var tag = match.Groups["tag"].Value; - if (!Utils.IsNullOrEmpty(tag)) - { - server.remarks = Utils.UrlDecode(tag); - } - Match details; - try - { - details = DetailsParser.Match(Utils.Base64Decode(base64)); - } - catch (FormatException) - { - return null; - } - if (!details.Success) - return null; - server.security = details.Groups["method"].Value; - server.id = details.Groups["password"].Value; - server.address = details.Groups["hostname"].Value; - server.port = Utils.ToInt(details.Groups["port"].Value); - return server; - } - - private static readonly Regex StdVmessUserInfo = new( - @"^(?[a-z]+)(\+(?[a-z]+))?:(?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$", RegexOptions.Compiled); - - private static ProfileItem? ResolveSocks(string result) - { - ProfileItem profileItem = new() - { - configType = EConfigType.Socks - }; - result = result[Global.ProtocolShares[EConfigType.Socks].Length..]; - //remark - int indexRemark = result.IndexOf("#"); - if (indexRemark > 0) - { - try - { - profileItem.remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); - } - catch { } - result = result[..indexRemark]; - } - //part decode - int indexS = result.IndexOf("@"); - if (indexS > 0) - { - } - else - { - result = Utils.Base64Decode(result); - } - - string[] arr1 = result.Split('@'); - if (arr1.Length != 2) - { - return null; - } - string[] arr21 = arr1[0].Split(':'); - //string[] arr22 = arr1[1].Split(':'); - int indexPort = arr1[1].LastIndexOf(":"); - if (arr21.Length != 2 || indexPort < 0) - { - return null; - } - profileItem.address = arr1[1][..indexPort]; - profileItem.port = Utils.ToInt(arr1[1][(indexPort + 1)..]); - profileItem.security = arr21[0]; - profileItem.id = arr21[1]; - - return profileItem; - } - - private static ProfileItem? ResolveSocksNew(string result) - { - Uri parsedUrl; - try - { - parsedUrl = new Uri(result); - } - catch (UriFormatException) - { - return null; - } - ProfileItem server = new() - { - remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), - address = parsedUrl.IdnHost, - port = parsedUrl.Port, - }; - - // parse base64 UserInfo - string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.Unescaped); - string userInfo = Utils.Base64Decode(rawUserInfo); - string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); - if (userInfoParts.Length == 2) - { - server.security = userInfoParts[0]; - server.id = userInfoParts[1]; - } - - return server; - } - - private static ProfileItem ResolveTrojan(string result) - { - ProfileItem item = new() - { - configType = EConfigType.Trojan - }; - - Uri url = new(result); - - item.address = url.IdnHost; - item.port = url.Port; - item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - item.id = Utils.UrlDecode(url.UserInfo); - - var query = Utils.ParseQueryString(url.Query); - ResolveStdTransport(query, ref item); - - return item; - } - - private static ProfileItem ResolveStdVLESS(string result) - { - ProfileItem item = new() - { - configType = EConfigType.VLESS, - security = Global.None - }; - - Uri url = new(result); - - item.address = url.IdnHost; - item.port = url.Port; - item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - item.id = Utils.UrlDecode(url.UserInfo); - - var query = Utils.ParseQueryString(url.Query); - item.security = query["encryption"] ?? Global.None; - item.streamSecurity = query["security"] ?? ""; - ResolveStdTransport(query, ref item); - - return item; - } - - private static ProfileItem ResolveHysteria2(string result) - { - ProfileItem item = new() - { - configType = EConfigType.Hysteria2 - }; - - Uri url = new(result); - - item.address = url.IdnHost; - item.port = url.Port; - item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - item.id = Utils.UrlDecode(url.UserInfo); - - var query = Utils.ParseQueryString(url.Query); - ResolveStdTransport(query, ref item); - item.path = Utils.UrlDecode(query["obfs-password"] ?? ""); - item.allowInsecure = (query["insecure"] ?? "") == "1" ? "true" : "false"; - - return item; - } - - private static ProfileItem ResolveTuic(string result) - { - ProfileItem item = new() - { - configType = EConfigType.Tuic - }; - - Uri url = new(result); - - item.address = url.IdnHost; - item.port = url.Port; - item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - var userInfoParts = url.UserInfo.Split(new[] { ':' }, 2); - if (userInfoParts.Length == 2) - { - item.id = userInfoParts[0]; - item.security = userInfoParts[1]; - } - - var query = Utils.ParseQueryString(url.Query); - ResolveStdTransport(query, ref item); - item.headerType = query["congestion_control"] ?? ""; - - return item; - } - - private static ProfileItem ResolveWireguard(string result) - { - ProfileItem item = new() - { - configType = EConfigType.Wireguard - }; - - Uri url = new(result); - - item.address = url.IdnHost; - item.port = url.Port; - item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - item.id = Utils.UrlDecode(url.UserInfo); - - var query = Utils.ParseQueryString(url.Query); - - item.publicKey = Utils.UrlDecode(query["publickey"] ?? ""); - item.path = Utils.UrlDecode(query["reserved"] ?? ""); - item.requestHost = Utils.UrlDecode(query["address"] ?? ""); - item.shortId = Utils.UrlDecode(query["mtu"] ?? ""); - - return item; - } - - private static int ResolveStdTransport(NameValueCollection query, ref ProfileItem item) - { - item.flow = query["flow"] ?? ""; - item.streamSecurity = query["security"] ?? ""; - item.sni = query["sni"] ?? ""; - item.alpn = Utils.UrlDecode(query["alpn"] ?? ""); - item.fingerprint = Utils.UrlDecode(query["fp"] ?? ""); - item.publicKey = Utils.UrlDecode(query["pbk"] ?? ""); - item.shortId = Utils.UrlDecode(query["sid"] ?? ""); - item.spiderX = Utils.UrlDecode(query["spx"] ?? ""); - - item.network = query["type"] ?? nameof(ETransport.tcp); - switch (item.network) - { - case nameof(ETransport.tcp): - item.headerType = query["headerType"] ?? Global.None; - item.requestHost = Utils.UrlDecode(query["host"] ?? ""); - - break; - - case nameof(ETransport.kcp): - item.headerType = query["headerType"] ?? Global.None; - item.path = Utils.UrlDecode(query["seed"] ?? ""); - break; - - case nameof(ETransport.ws): - case nameof(ETransport.httpupgrade): - item.requestHost = Utils.UrlDecode(query["host"] ?? ""); - item.path = Utils.UrlDecode(query["path"] ?? "/"); - break; - - case nameof(ETransport.http): - case nameof(ETransport.h2): - item.network = nameof(ETransport.h2); - item.requestHost = Utils.UrlDecode(query["host"] ?? ""); - item.path = Utils.UrlDecode(query["path"] ?? "/"); - break; - - case nameof(ETransport.quic): - item.headerType = query["headerType"] ?? Global.None; - item.requestHost = query["quicSecurity"] ?? Global.None; - item.path = Utils.UrlDecode(query["key"] ?? ""); - break; - - case nameof(ETransport.grpc): - item.requestHost = Utils.UrlDecode(query["authority"] ?? ""); - item.path = Utils.UrlDecode(query["serviceName"] ?? ""); - item.headerType = Utils.UrlDecode(query["mode"] ?? Global.GrpcGunMode); - break; - - default: - break; - } - return 0; - } - - #endregion ImportShareUrl - } -} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayn/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index e30118a83d..f89515050c 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Net; using System.Net.Sockets; +using v2rayN.Enums; using v2rayN.Models; using v2rayN.Resx; diff --git a/v2rayn/v2rayN/v2rayN/Handler/StatisticsSingbox.cs b/v2rayn/v2rayN/v2rayN/Handler/StatisticsSingbox.cs index a845004cf4..bc9ac0e975 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/StatisticsSingbox.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/StatisticsSingbox.cs @@ -1,5 +1,6 @@ using System.Net.WebSockets; using System.Text; +using v2rayN.Enums; using v2rayN.Models; namespace v2rayN.Handler diff --git a/v2rayn/v2rayN/v2rayN/Handler/StatisticsV2ray.cs b/v2rayn/v2rayN/v2rayN/Handler/StatisticsV2ray.cs index 9bf83f970e..67385453ec 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/StatisticsV2ray.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/StatisticsV2ray.cs @@ -1,6 +1,7 @@ using Grpc.Core; using Grpc.Net.Client; using ProtosLib.Statistics; +using v2rayN.Enums; using v2rayN.Models; namespace v2rayN.Handler diff --git a/v2rayn/v2rayN/v2rayN/Handler/SysProxyHandle.cs b/v2rayn/v2rayN/v2rayN/Handler/SysProxyHandle.cs index d61313984b..679c3aa5cd 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/SysProxyHandle.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/SysProxyHandle.cs @@ -1,4 +1,5 @@ using PacLib; +using v2rayN.Enums; using v2rayN.Models; namespace v2rayN.Handler diff --git a/v2rayn/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayn/v2rayN/v2rayN/Handler/UpdateHandle.cs index 175b3af257..996ded0a69 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -6,6 +6,7 @@ using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using System.Windows; +using v2rayN.Enums; using v2rayN.Models; using v2rayN.Resx; @@ -299,9 +300,6 @@ namespace v2rayN.Handler { await UpdateGeoFile("geosite", _config, update); await UpdateGeoFile("geoip", _config, update); - - //await UpdateGeoFile4Singbox("geosite", _config, false, update); - //await UpdateGeoFile4Singbox("geoip", _config, true, update); }); } @@ -327,7 +325,7 @@ namespace v2rayN.Handler var result = await (new DownloadHandle()).DownloadStringAsync(url, true, ""); if (!Utils.IsNullOrEmpty(result)) { - responseHandler(type, result, preRelease); + ResponseHandler(type, result, preRelease); } else { @@ -345,7 +343,7 @@ namespace v2rayN.Handler /// /// 获取V2RayCore版本 /// - private SemanticVersion getCoreVersion(ECoreType type) + private SemanticVersion GetCoreVersion(ECoreType type) { try { @@ -410,7 +408,7 @@ namespace v2rayN.Handler } } - private void responseHandler(ECoreType type, string gitHubReleaseApi, bool preRelease) + private void ResponseHandler(ECoreType type, string gitHubReleaseApi, bool preRelease) { try { @@ -431,7 +429,7 @@ namespace v2rayN.Handler case ECoreType.Xray: case ECoreType.v2fly_v5: { - curVersion = getCoreVersion(type); + curVersion = GetCoreVersion(type); message = string.Format(ResUI.IsLatestCore, type, curVersion.ToVersionString("v")); string osBit = "64"; switch (RuntimeInformation.ProcessArchitecture) @@ -456,7 +454,7 @@ namespace v2rayN.Handler case ECoreType.clash_meta: case ECoreType.mihomo: { - curVersion = getCoreVersion(type); + curVersion = GetCoreVersion(type); message = string.Format(ResUI.IsLatestCore, type, curVersion); switch (RuntimeInformation.ProcessArchitecture) { @@ -477,7 +475,7 @@ namespace v2rayN.Handler } case ECoreType.sing_box: { - curVersion = getCoreVersion(type); + curVersion = GetCoreVersion(type); message = string.Format(ResUI.IsLatestCore, type, curVersion.ToVersionString("v")); switch (RuntimeInformation.ProcessArchitecture) { diff --git a/v2rayn/v2rayN/v2rayN/Models/Config.cs b/v2rayn/v2rayN/v2rayN/Models/Config.cs index d763f48530..0d411d66b8 100644 --- a/v2rayn/v2rayN/v2rayN/Models/Config.cs +++ b/v2rayn/v2rayN/v2rayN/Models/Config.cs @@ -1,4 +1,6 @@ -namespace v2rayN.Models +using v2rayN.Enums; + +namespace v2rayN.Models { /// /// 本软件配置文件实体类 diff --git a/v2rayn/v2rayN/v2rayN/Models/ConfigItems.cs b/v2rayn/v2rayN/v2rayN/Models/ConfigItems.cs index af768b498d..a986dbf93f 100644 --- a/v2rayn/v2rayN/v2rayN/Models/ConfigItems.cs +++ b/v2rayn/v2rayN/v2rayN/Models/ConfigItems.cs @@ -1,4 +1,5 @@ using System.Windows.Input; +using v2rayN.Enums; namespace v2rayN.Models { @@ -186,7 +187,7 @@ namespace v2rayN.Models public string domainStrategy4Singbox { get; set; } public string domainMatcher { get; set; } public string routingIndexId { get; set; } - public bool enableRoutingAdvanced { get; set; } + public bool enableRoutingAdvanced { get; set; } } [Serializable] diff --git a/v2rayn/v2rayN/v2rayN/Models/ConfigOld.cs b/v2rayn/v2rayN/v2rayN/Models/ConfigOld.cs deleted file mode 100644 index 9f27b610b1..0000000000 --- a/v2rayn/v2rayN/v2rayN/Models/ConfigOld.cs +++ /dev/null @@ -1,440 +0,0 @@ -namespace v2rayN.Models -{ - [Serializable] - public class ConfigOld - { - #region property - - /// - /// 允许日志 - /// - public bool logEnabled - { - get; set; - } - - /// - /// 日志等级 - /// - public string loglevel - { - get; set; - } - - public string indexId - { - get; set; - } - - /// - /// 允许Mux多路复用 - /// - public bool muxEnabled - { - get; set; - } - - /// - /// - /// - public ESysProxyType sysProxyType - { - get; set; - } - - /// - /// 启用实时网速和流量统计 - /// - public bool enableStatistics - { - get; set; - } - - /// - /// 去重时优先保留较旧(顶部)节点 - /// - public bool keepOlderDedupl - { - get; set; - } - - /// - /// 视图刷新率 - /// - public int statisticsFreshRate - { - get; set; - } - - /// - /// 自定义远程DNS - /// - public string remoteDNS - { - get; set; - } - - /// - /// Outbound Freedom domainStrategy - /// - public string domainStrategy4Freedom - { - get; set; - } - - /// - /// 是否允许不安全连接 - /// - public bool defAllowInsecure - { - get; set; - } - - /// - /// 域名解析策略 - /// - public string domainStrategy - { - get; set; - } - - public string domainMatcher - { - get; set; - } - - public int routingIndex - { - get; set; - } - - public bool enableRoutingAdvanced - { - get; set; - } - - public bool ignoreGeoUpdateCore - { - get; set; - } - - /// - /// systemProxyExceptions - /// - public string systemProxyExceptions - { - get; set; - } - - public string systemProxyAdvancedProtocol { get; set; } - - public int autoUpdateInterval { get; set; } = 0; - - public int autoUpdateSubInterval { get; set; } = 0; - - public bool checkPreReleaseUpdate { get; set; } = false; - - public bool enableSecurityProtocolTls13 - { - get; set; - } - - public int trayMenuServersLimit { get; set; } - - #endregion property - - #region other entities - - /// - /// 本地监听 - /// - public List inbound - { - get; set; - } - - /// - /// vmess服务器信息 - /// - public List vmess - { - get; set; - } - - /// - /// KcpItem - /// - public KcpItem kcpItem - { - get; set; - } - - /// - /// 订阅 - /// - public List subItem - { - get; set; - } - - /// - /// UI - /// - public UIItem uiItem - { - get; set; - } - - public List routings - { - get; set; - } - - public ConstItem constItem - { - get; set; - } - - public List globalHotkeys - { - get; set; - } - - public List coreTypeItem - { - get; set; - } - - #endregion other entities - } - - [Serializable] - public class VmessItem - { - public VmessItem() - { - indexId = string.Empty; - configType = EConfigType.VMess; - configVersion = 2; - sort = 0; - address = string.Empty; - port = 0; - id = string.Empty; - alterId = 0; - security = string.Empty; - network = string.Empty; - remarks = string.Empty; - headerType = string.Empty; - requestHost = string.Empty; - path = string.Empty; - streamSecurity = string.Empty; - allowInsecure = string.Empty; - testResult = string.Empty; - subid = string.Empty; - flow = string.Empty; - groupId = string.Empty; - } - - public string indexId - { - get; set; - } - - /// - /// config type(1=normal,2=custom) - /// - public EConfigType configType - { - get; set; - } - - /// - /// 版本(现在=2) - /// - public int configVersion - { - get; set; - } - - public int sort - { - get; set; - } - - /// - /// 远程服务器地址 - /// - public string address - { - get; set; - } - - /// - /// 远程服务器端口 - /// - public int port - { - get; set; - } - - /// - /// 远程服务器ID - /// - public string id - { - get; set; - } - - /// - /// 远程服务器额外ID - /// - public int alterId - { - get; set; - } - - /// - /// 本地安全策略 - /// - public string security - { - get; set; - } - - /// - /// tcp,kcp,ws,h2,quic - /// - public string network - { - get; set; - } - - /// - /// - /// - public string remarks - { - get; set; - } - - /// - /// 伪装类型 - /// - public string headerType - { - get; set; - } - - /// - /// 伪装的域名 - /// - public string requestHost - { - get; set; - } - - /// - /// ws h2 path - /// - public string path - { - get; set; - } - - /// - /// 传输层安全 - /// - public string streamSecurity - { - get; set; - } - - /// - /// 是否允许不安全连接(用于客户端) - /// - public string allowInsecure - { - get; set; - } - - /// - /// - /// - public string testResult - { - get; set; - } - - /// - /// SubItem id - /// - public string subid - { - get; set; - } - - /// - /// VLESS flow - /// - public string flow - { - get; set; - } - - /// - /// tls sni - /// - public string sni - { - get; set; - } - - public string groupId - { - get; set; - } = string.Empty; - - public ECoreType? coreType - { - get; set; - } - - public int preSocksPort - { - get; set; - } - - public string fingerprint { get; set; } - } - - [Serializable] - public class RoutingItemOld - { - public string remarks - { - get; set; - } - - public string url - { - get; set; - } - - public List rules - { - get; set; - } - - public bool enabled { get; set; } = true; - - public bool locked - { - get; set; - } - - public string customIcon - { - get; set; - } - } -} \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Models/CoreInfo.cs b/v2rayn/v2rayN/v2rayN/Models/CoreInfo.cs index 00ecb3fdef..ad773c8ce5 100644 --- a/v2rayn/v2rayN/v2rayN/Models/CoreInfo.cs +++ b/v2rayn/v2rayN/v2rayN/Models/CoreInfo.cs @@ -1,4 +1,6 @@ -namespace v2rayN.Models +using v2rayN.Enums; + +namespace v2rayN.Models { [Serializable] public class CoreInfo diff --git a/v2rayn/v2rayN/v2rayN/Models/DNSItem.cs b/v2rayn/v2rayN/v2rayN/Models/DNSItem.cs index 315de91d3b..c8c27738d6 100644 --- a/v2rayn/v2rayN/v2rayN/Models/DNSItem.cs +++ b/v2rayn/v2rayN/v2rayN/Models/DNSItem.cs @@ -1,4 +1,5 @@ using SQLite; +using v2rayN.Enums; namespace v2rayN.Models { diff --git a/v2rayn/v2rayN/v2rayN/Models/ProfileItem.cs b/v2rayn/v2rayN/v2rayN/Models/ProfileItem.cs index 9118abff07..aea244e84c 100644 --- a/v2rayn/v2rayN/v2rayN/Models/ProfileItem.cs +++ b/v2rayn/v2rayN/v2rayN/Models/ProfileItem.cs @@ -1,4 +1,5 @@ using SQLite; +using v2rayN.Enums; namespace v2rayN.Models { diff --git a/v2rayn/v2rayN/v2rayN/Models/ServerTestItem.cs b/v2rayn/v2rayN/v2rayN/Models/ServerTestItem.cs index 3955da7764..8faea95ee4 100644 --- a/v2rayn/v2rayN/v2rayN/Models/ServerTestItem.cs +++ b/v2rayn/v2rayN/v2rayN/Models/ServerTestItem.cs @@ -1,4 +1,6 @@ -namespace v2rayN.Models +using v2rayN.Enums; + +namespace v2rayN.Models { [Serializable] internal class ServerTestItem diff --git a/v2rayn/v2rayN/v2rayN/Models/SingboxConfig.cs b/v2rayn/v2rayN/v2rayN/Models/SingboxConfig.cs index 45012e684d..da4675b933 100644 --- a/v2rayn/v2rayN/v2rayN/Models/SingboxConfig.cs +++ b/v2rayn/v2rayN/v2rayN/Models/SingboxConfig.cs @@ -241,6 +241,6 @@ public string? path { get; set; } public string? url { get; set; } public string? download_detour { get; set; } - public string? update_interval { get; set; } + public string? update_interval { get; set; } } } \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs b/v2rayn/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs index bb191b4639..686f46a429 100644 --- a/v2rayn/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs +++ b/v2rayn/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs @@ -3,6 +3,7 @@ using ReactiveUI.Fody.Helpers; using Splat; using System.Reactive; using System.Windows; +using v2rayN.Enums; using v2rayN.Handler; using v2rayN.Models; using v2rayN.Resx; diff --git a/v2rayn/v2rayN/v2rayN/ViewModels/DNSSettingViewModel.cs b/v2rayn/v2rayN/v2rayN/ViewModels/DNSSettingViewModel.cs index d618c2d581..fcf5d6356e 100644 --- a/v2rayn/v2rayN/v2rayN/ViewModels/DNSSettingViewModel.cs +++ b/v2rayn/v2rayN/v2rayN/ViewModels/DNSSettingViewModel.cs @@ -3,6 +3,7 @@ using ReactiveUI.Fody.Helpers; using Splat; using System.Reactive; using System.Windows; +using v2rayN.Enums; using v2rayN.Handler; using v2rayN.Models; using v2rayN.Resx; diff --git a/v2rayn/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayn/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs index f4417a14c2..0bdee0a475 100644 --- a/v2rayn/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs +++ b/v2rayn/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs @@ -14,7 +14,9 @@ using System.Reactive.Linq; using System.Text; using System.Windows; using System.Windows.Media; +using v2rayN.Enums; using v2rayN.Handler; +using v2rayN.Handler.Fmt; using v2rayN.Models; using v2rayN.Resx; using v2rayN.Views; @@ -1152,7 +1154,7 @@ namespace v2rayN.ViewModels _noticeHandler?.Enqueue(ResUI.PleaseSelectServer); return; } - var url = ShareHandler.GetShareUrl(item); + var url = FmtHandler.GetShareUri(item); if (Utils.IsNullOrEmpty(url)) { return; @@ -1293,7 +1295,7 @@ namespace v2rayN.ViewModels StringBuilder sb = new(); foreach (var it in lstSelecteds) { - string url = ShareHandler.GetShareUrl(it); + string url = FmtHandler.GetShareUri(it); if (Utils.IsNullOrEmpty(url)) { continue; @@ -1318,7 +1320,7 @@ namespace v2rayN.ViewModels StringBuilder sb = new(); foreach (var it in lstSelecteds) { - string? url = ShareHandler.GetShareUrl(it); + string? url = FmtHandler.GetShareUri(it); if (Utils.IsNullOrEmpty(url)) { continue; diff --git a/v2rayn/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs b/v2rayn/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs index e0987cdae2..77a4851d89 100644 --- a/v2rayn/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs +++ b/v2rayn/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs @@ -3,6 +3,7 @@ using ReactiveUI.Fody.Helpers; using Splat; using System.Reactive; using System.Windows; +using v2rayN.Enums; using v2rayN.Handler; using v2rayN.Models; using v2rayN.Resx; @@ -263,7 +264,7 @@ namespace v2rayN.ViewModels var needReboot = (EnableStatistics != _config.guiItem.enableStatistics || EnableDragDropSort != _config.uiItem.enableDragDropSort || EnableHWA != _config.guiItem.enableHWA - || CurrentFontFamily != _config.uiItem.currentFontFamily); + || CurrentFontFamily != _config.uiItem.currentFontFamily); //if (Utile.IsNullOrEmpty(Kcpmtu.ToString()) || !Utile.IsNumeric(Kcpmtu.ToString()) // || Utile.IsNullOrEmpty(Kcptti.ToString()) || !Utile.IsNumeric(Kcptti.ToString()) diff --git a/v2rayn/v2rayN/v2rayN/ViewModels/RoutingRuleSettingViewModel.cs b/v2rayn/v2rayN/v2rayN/ViewModels/RoutingRuleSettingViewModel.cs index f6489450bd..2d5b532fca 100644 --- a/v2rayn/v2rayN/v2rayN/ViewModels/RoutingRuleSettingViewModel.cs +++ b/v2rayn/v2rayN/v2rayN/ViewModels/RoutingRuleSettingViewModel.cs @@ -4,6 +4,7 @@ using ReactiveUI.Fody.Helpers; using Splat; using System.Reactive; using System.Windows; +using v2rayN.Enums; using v2rayN.Handler; using v2rayN.Models; using v2rayN.Resx; @@ -289,7 +290,7 @@ namespace v2rayN.ViewModels private void ImportRulesFromClipboard() { - string clipboardData = Utils.GetClipboardData(); + var clipboardData = Utils.GetClipboardData(); if (AddBatchRoutingRules(SelectedRouting, clipboardData) == 0) { RefreshRulesItems(); diff --git a/v2rayn/v2rayN/v2rayN/Views/AddServer2Window.xaml.cs b/v2rayn/v2rayN/v2rayN/Views/AddServer2Window.xaml.cs index 414cef744f..a02db935d9 100644 --- a/v2rayn/v2rayN/v2rayN/Views/AddServer2Window.xaml.cs +++ b/v2rayn/v2rayN/v2rayN/Views/AddServer2Window.xaml.cs @@ -1,6 +1,7 @@ using ReactiveUI; using System.Reactive.Disposables; using System.Windows; +using v2rayN.Enums; using v2rayN.Models; using v2rayN.ViewModels; diff --git a/v2rayn/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs b/v2rayn/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs index 0bbac569b0..17d43528b7 100644 --- a/v2rayn/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs +++ b/v2rayn/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs @@ -2,6 +2,7 @@ using System.Reactive.Disposables; using System.Windows; using System.Windows.Controls; +using v2rayN.Enums; using v2rayN.Handler; using v2rayN.Models; using v2rayN.Resx; diff --git a/v2rayn/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs b/v2rayn/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs index 513c504b7e..d05ae01376 100644 --- a/v2rayn/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs +++ b/v2rayn/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs @@ -2,6 +2,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Input; +using v2rayN.Enums; using v2rayN.Handler; using v2rayN.Models; using v2rayN.Resx; diff --git a/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs b/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs index b16972cb6d..bc37d8ff71 100644 --- a/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs +++ b/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs @@ -10,6 +10,7 @@ using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; using v2rayN.Base; +using v2rayN.Enums; using v2rayN.Handler; using v2rayN.Models; using v2rayN.Resx; diff --git a/v2rayn/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs b/v2rayn/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs index 05761af072..53bdb32df8 100644 --- a/v2rayn/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs +++ b/v2rayn/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs @@ -42,7 +42,7 @@ namespace v2rayN.Views _config.inbound[0].destOverride?.ForEach(it => { clbdestOverride.SelectedItems.Add(it); - }); + }); Global.IEProxyProtocols.ForEach(it => { cmbsystemProxyAdvancedProtocol.Items.Add(it); diff --git a/v2rayn/v2rayN/v2rayN/Views/RoutingRuleSettingWindow.xaml.cs b/v2rayn/v2rayN/v2rayN/Views/RoutingRuleSettingWindow.xaml.cs index 6e11e1db45..750288500f 100644 --- a/v2rayn/v2rayN/v2rayN/Views/RoutingRuleSettingWindow.xaml.cs +++ b/v2rayn/v2rayN/v2rayN/Views/RoutingRuleSettingWindow.xaml.cs @@ -2,6 +2,7 @@ using System.Reactive.Disposables; using System.Windows; using System.Windows.Input; +using v2rayN.Enums; using v2rayN.Models; using v2rayN.ViewModels; diff --git a/v2rayn/v2rayN/v2rayN/v2rayN.csproj b/v2rayn/v2rayN/v2rayN/v2rayN.csproj index 7c16b224aa..7b2ba3a90c 100644 --- a/v2rayn/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayn/v2rayN/v2rayN/v2rayN.csproj @@ -24,7 +24,7 @@ - + diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/AngConfig.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/AngConfig.kt deleted file mode 100644 index 01f2bdd876..0000000000 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/AngConfig.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.v2ray.ang.dto - -data class AngConfig( - var index: Int, - var vmess: ArrayList, - var subItem: ArrayList -) { - data class VmessBean(var guid: String = "123456", - var address: String = "v2ray.cool", - var port: Int = 10086, - var id: String = "a3482e88-686a-4a58-8126-99c9df64b7bf", - var alterId: Int = 64, - var security: String = "aes-128-cfb", - var network: String = "tcp", - var remarks: String = "def", - var headerType: String = "", - var requestHost: String = "", - var path: String = "", - var streamSecurity: String = "", - var allowInsecure: String = "", - var configType: Int = 1, - var configVersion: Int = 1, - var testResult: String = "", - var subid: String = "", - var flow: String = "", - var sni: String = "") - - data class SubItemBean(var id: String = "", - var remarks: String = "", - var url: String = "", - var enabled: Boolean = true) -} diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt index 27000dbb32..fe5c79192e 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt @@ -157,7 +157,7 @@ data class V2rayConfig( var headers: HeadersBean = HeadersBean(), val version: String? = null, val method: String? = null) { - data class HeadersBean(var Host: List = ArrayList(), + data class HeadersBean(var Host: List? = ArrayList(), @SerializedName("User-Agent") val userAgent: List? = null, @SerializedName("Accept-Encoding") @@ -247,7 +247,7 @@ data class V2rayConfig( requestObj.headers.Host = (host ?: "").split(",").map { it.trim() }.filter { it.isNotEmpty() } requestObj.path = (path ?: "").split(",").map { it.trim() }.filter { it.isNotEmpty() } tcpSetting.header.request = requestObj - sni = requestObj.headers.Host.getOrNull(0) ?: sni + sni = requestObj.headers.Host?.getOrNull(0) ?: sni } } else { tcpSetting.header.type = "none" diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/SubscriptionUpdater.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/SubscriptionUpdater.kt index 9cd6e1aeaa..2ba506b39d 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/SubscriptionUpdater.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/SubscriptionUpdater.kt @@ -71,7 +71,7 @@ object SubscriptionUpdater { val count = AngConfigManager.importBatchConfig(server, subid, append) if (count <= 0) { - AngConfigManager.importBatchConfig(Utils.decode(server!!), subid, append) + AngConfigManager.importBatchConfig(Utils.decode(server), subid, append) } if (count <= 0) { AngConfigManager.appendCustomConfigServer(server, subid) diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt index 3662b8bdf7..2ea7adf7d6 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt @@ -162,7 +162,7 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter(R.id.listview) as ListView - listview!!.adapter = adapter + listview?.adapter = adapter init() } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt index b672b66798..b16ca78cfa 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt @@ -39,8 +39,8 @@ object Utils { * @param text * @return */ - fun getEditable(text: String): Editable { - return Editable.Factory.getInstance().newEditable(text) + fun getEditable(text: String?): Editable { + return Editable.Factory.getInstance().newEditable(text?:"") } /** @@ -101,16 +101,16 @@ object Utils { /** * base64 decode */ - fun decode(text: String): String { + fun decode(text: String?): String { tryDecodeBase64(text)?.let { return it } - if (text.endsWith('=')) { + if (text?.endsWith('=')==true) { // try again for some loosely formatted base64 tryDecodeBase64(text.trimEnd('='))?.let { return it } } return "" } - fun tryDecodeBase64(text: String): String? { + fun tryDecodeBase64(text: String?): String? { try { return Base64.decode(text, Base64.NO_WRAP).toString(charset("UTF-8")) } catch (e: Exception) { @@ -302,7 +302,11 @@ object Utils { /** * readTextFromAssets */ - fun readTextFromAssets(context: Context, fileName: String): String { + fun readTextFromAssets(context: Context?, fileName: String): String { + if(context == null) + { + return "" + } val content = context.assets.open(fileName).bufferedReader().use { it.readText() } @@ -389,7 +393,10 @@ object Utils { } } - fun getIpv6Address(address: String): String { + fun getIpv6Address(address: String?): String { + if(address == null){ + return "" + } return if (isIpv6Address(address) && !address.contains('[') && !address.contains(']')) { String.format("[%s]", address) } else { diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt index f4ad2da5db..050e10e5c9 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt @@ -295,10 +295,10 @@ object V2rayConfigUtil { rulesDomain.domain?.add(it) } } - if (rulesDomain.domain?.size!! > 0) { + if ((rulesDomain.domain?.size ?: 0) > 0) { v2rayConfig.routing.rules.add(rulesDomain) } - if (rulesIP.ip?.size!! > 0) { + if ((rulesIP.ip?.size ?: 0) > 0) { v2rayConfig.routing.rules.add(rulesIP) } } @@ -560,7 +560,7 @@ object V2rayConfigUtil { } else { path } - outbound.streamSettings?.tcpSettings?.header?.request?.headers?.Host = host!! + outbound.streamSettings?.tcpSettings?.header?.request?.headers?.Host = host } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/ShadowsocksFmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/ShadowsocksFmt.kt index f79ccb0815..668264aafb 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/ShadowsocksFmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/ShadowsocksFmt.kt @@ -58,7 +58,7 @@ object ShadowsocksFmt { val url = String.format( "%s@%s:%s", pw, - Utils.getIpv6Address(outbound.getServerAddress()!!), + Utils.getIpv6Address(outbound.getServerAddress()), outbound.getServerPort() ) return url + remark diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/SocksFmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/SocksFmt.kt index 420f8a68f9..0148ec886e 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/SocksFmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/SocksFmt.kt @@ -61,7 +61,7 @@ object SocksFmt { val url = String.format( "%s@%s:%s", Utils.encode(pw), - Utils.getIpv6Address(outbound.getServerAddress()!!), + Utils.getIpv6Address(outbound.getServerAddress()), outbound.getServerPort() ) return url + remark diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/TrojanFmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/TrojanFmt.kt index b3365fcb62..0a42f8bd0c 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/TrojanFmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/TrojanFmt.kt @@ -52,7 +52,7 @@ object TrojanFmt { fingerprint = queryParam["fp"] ?: "" config.outboundBean?.streamSettings?.populateTlsSettings( queryParam["security"] ?: V2rayConfig.TLS, - allowInsecure, queryParam["sni"] ?: sni!!, fingerprint, queryParam["alpn"], + allowInsecure, queryParam["sni"] ?: sni?:"", fingerprint, queryParam["alpn"], null, null, null ) flow = queryParam["flow"] ?: "" @@ -92,16 +92,16 @@ object TrojanFmt { Utils.removeWhiteSpace(tlsSetting.alpn.joinToString()).orEmpty() } if (!TextUtils.isEmpty(tlsSetting.fingerprint)) { - dicQuery["fp"] = tlsSetting.fingerprint!! + dicQuery["fp"] = tlsSetting.fingerprint?:"" } if (!TextUtils.isEmpty(tlsSetting.publicKey)) { - dicQuery["pbk"] = tlsSetting.publicKey!! + dicQuery["pbk"] = tlsSetting.publicKey?:"" } if (!TextUtils.isEmpty(tlsSetting.shortId)) { - dicQuery["sid"] = tlsSetting.shortId!! + dicQuery["sid"] = tlsSetting.shortId?:"" } if (!TextUtils.isEmpty(tlsSetting.spiderX)) { - dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX!!) + dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX?:"") } } dicQuery["type"] = @@ -162,7 +162,7 @@ object TrojanFmt { val url = String.format( "%s@%s:%s", outbound.getPassword(), - Utils.getIpv6Address(outbound.getServerAddress()!!), + Utils.getIpv6Address(outbound.getServerAddress()), outbound.getServerPort() ) return url + query + remark diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VlessFmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VlessFmt.kt index e689a31e83..6ab3003be9 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VlessFmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VlessFmt.kt @@ -92,16 +92,16 @@ object VlessFmt { Utils.removeWhiteSpace(tlsSetting.alpn.joinToString()).orEmpty() } if (!TextUtils.isEmpty(tlsSetting.fingerprint)) { - dicQuery["fp"] = tlsSetting.fingerprint!! + dicQuery["fp"] = tlsSetting.fingerprint?:"" } if (!TextUtils.isEmpty(tlsSetting.publicKey)) { - dicQuery["pbk"] = tlsSetting.publicKey!! + dicQuery["pbk"] = tlsSetting.publicKey?:"" } if (!TextUtils.isEmpty(tlsSetting.shortId)) { - dicQuery["sid"] = tlsSetting.shortId!! + dicQuery["sid"] = tlsSetting.shortId?:"" } if (!TextUtils.isEmpty(tlsSetting.spiderX)) { - dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX!!) + dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX?:"") } } dicQuery["type"] = @@ -162,7 +162,7 @@ object VlessFmt { val url = String.format( "%s@%s:%s", outbound.getPassword(), - Utils.getIpv6Address(outbound.getServerAddress()!!), + Utils.getIpv6Address(outbound.getServerAddress()), outbound.getServerPort() ) return url + query + remark diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt index 90c1ebe9ee..d00a4d75bf 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt @@ -63,7 +63,7 @@ object WireguardFmt { val url = String.format( "%s@%s:%s", Utils.urlEncode(outbound.getPassword().toString()), - Utils.getIpv6Address(outbound.getServerAddress()!!), + Utils.getIpv6Address(outbound.getServerAddress()), outbound.getServerPort() ) return url + query + remark diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt index 08e4b5eac1..7e0510c8ac 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt @@ -60,8 +60,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { } var serverList = MmkvManager.decodeServerList() - var subscriptionId: String = settingsStorage.decodeString(AppConfig.CACHE_SUBSCRIPTION_ID, "")!! - var keywordFilter: String = settingsStorage.decodeString(AppConfig.CACHE_KEYWORD_FILTER, "")!! + var subscriptionId: String = settingsStorage.decodeString(AppConfig.CACHE_SUBSCRIPTION_ID, "")?:"" + var keywordFilter: String = settingsStorage.decodeString(AppConfig.CACHE_KEYWORD_FILTER, "")?:"" private set val serversCache = mutableListOf() val isRunning by lazy { MutableLiveData() } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/SubViewModel.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/SubViewModel.kt index b2f5cd42d8..67ad1ee3cd 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/SubViewModel.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/SubViewModel.kt @@ -83,7 +83,7 @@ class SubViewModel(application: Application) : AndroidViewModel(application) { fun importBatchConfig(server: String?, subid: String = "", append: Boolean): Int { var count = AngConfigManager.importBatchConfig(server, subid, append) if (count <= 0) { - count = AngConfigManager.importBatchConfig(Utils.decode(server!!), subid, append) + count = AngConfigManager.importBatchConfig(Utils.decode(server), subid, append) } if (count <= 0) { count = AngConfigManager.appendCustomConfigServer(server, subid) diff --git a/v2rayng/V2rayNG/app/src/main/res/layout/activity_about.xml b/v2rayng/V2rayNG/app/src/main/res/layout/activity_about.xml index adb1602e2c..9818c3a45e 100644 --- a/v2rayng/V2rayNG/app/src/main/res/layout/activity_about.xml +++ b/v2rayng/V2rayNG/app/src/main/res/layout/activity_about.xml @@ -1,226 +1,230 @@ - + android:layout_height="match_parent"> - - - + android:gravity="top" + android:orientation="vertical"> + android:clickable="true" + android:focusable="true" + android:foreground="?attr/selectableItemBackground" + android:gravity="center|start" + android:orientation="horizontal" + android:padding="16dp"> + + + + + + + + + + + + + + + + + + + + + + android:paddingStart="16dp" + android:text="@string/title_configuration_restore" + android:textAppearance="@style/TextAppearance.AppCompat.Subhead" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/xray-core/go.mod b/xray-core/go.mod index c3c4f8bd39..abd2226ac6 100644 --- a/xray-core/go.mod +++ b/xray-core/go.mod @@ -14,7 +14,7 @@ require ( github.com/pires/go-proxyproto v0.7.0 github.com/quic-go/quic-go v0.44.0 github.com/refraction-networking/utls v1.6.6 - github.com/sagernet/sing v0.3.8 + github.com/sagernet/sing v0.4.0 github.com/sagernet/sing-shadowsocks v0.2.6 github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb github.com/stretchr/testify v1.9.0 @@ -22,10 +22,10 @@ require ( github.com/vishvananda/netlink v1.2.1-beta.2.0.20230316163032-ced5aaba43e3 github.com/xtls/reality v0.0.0-20240429224917-ecc4401070cc go4.org/netipx v0.0.0-20231129151722-fdeea329fbba - golang.org/x/crypto v0.23.0 - golang.org/x/net v0.25.0 + golang.org/x/crypto v0.24.0 + golang.org/x/net v0.26.0 golang.org/x/sync v0.7.0 - golang.org/x/sys v0.20.0 + golang.org/x/sys v0.21.0 golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 google.golang.org/grpc v1.64.0 google.golang.org/protobuf v1.34.1 @@ -39,23 +39,23 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-metro v0.0.0-20211217172704-adc40b04c140 // indirect github.com/francoispqt/gojay v1.2.13 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 // indirect - github.com/klauspost/compress v1.17.7 // indirect + github.com/google/pprof v0.0.0-20240528025155-186aa0362fba // indirect + github.com/klauspost/compress v1.17.8 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect - github.com/onsi/ginkgo/v2 v2.16.0 // indirect + github.com/onsi/ginkgo/v2 v2.19.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect github.com/vishvananda/netns v0.0.4 // indirect go.uber.org/mock v0.4.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc // indirect golang.org/x/mod v0.17.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/xray-core/go.sum b/xray-core/go.sum index f961a90fac..004795369f 100644 --- a/xray-core/go.sum +++ b/xray-core/go.sum @@ -38,8 +38,8 @@ github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aev github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= @@ -49,8 +49,6 @@ github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/ github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= @@ -61,8 +59,8 @@ github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+u github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20240528025155-186aa0362fba h1:ql1qNgCyOB7iAEk8JTNM+zJrgIbnyCKX/wdlyPufP5g= +github.com/google/pprof v0.0.0-20240528025155-186aa0362fba/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -76,8 +74,8 @@ github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= +github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -96,10 +94,10 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/onsi/ginkgo/v2 v2.16.0 h1:7q1w9frJDzninhXxjZd+Y/x54XNjG/UlRLIYPZafsPM= -github.com/onsi/ginkgo/v2 v2.16.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= +github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= @@ -121,8 +119,8 @@ github.com/refraction-networking/utls v1.6.6/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5D github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg= github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/sagernet/sing v0.3.8 h1:gm4JKalPhydMYX2zFOTnnd4TXtM/16WFRqSjMepYQQk= -github.com/sagernet/sing v0.3.8/go.mod h1:+60H3Cm91RnL9dpVGWDPHt0zTQImO9Vfqt9a4rSambI= +github.com/sagernet/sing v0.4.0 h1:sCLSqLHOptgFvzQO9FfaYMl4PONePZkclMznpeKhdHc= +github.com/sagernet/sing v0.4.0/go.mod h1:Xh4KO9nGdvm4K/LVg9Xn9jSxJdqe9KcXbAzNC1S2qfw= github.com/sagernet/sing-shadowsocks v0.2.6 h1:xr7ylAS/q1cQYS8oxKKajhuQcchd5VJJ4K4UZrrpp0s= github.com/sagernet/sing-shadowsocks v0.2.6/go.mod h1:j2YZBIpWIuElPFL/5sJAj470bcn/3QQ5lxZUNKLDNAM= github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb h1:XfLJSPIOUX+osiMraVgIrMR27uMXnRJWGm1+GL8/63U= @@ -181,11 +179,11 @@ golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc h1:O9NuF4s+E/PvMIy+9IUZB9znFwUIXEWSstNjek6VpVg= +golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -203,8 +201,8 @@ golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -230,15 +228,15 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220804214406-8e32c043e418/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= @@ -250,8 +248,8 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -271,8 +269,8 @@ google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= diff --git a/xray-core/infra/conf/transport_internet.go b/xray-core/infra/conf/transport_internet.go index 908a95d3ef..3ebb532667 100644 --- a/xray-core/infra/conf/transport_internet.go +++ b/xray-core/infra/conf/transport_internet.go @@ -208,8 +208,10 @@ func (c *HttpUpgradeConfig) Build() (proto.Message, error) { // Host priority: Host field > headers field > address. if c.Host == "" && c.Headers["host"] != "" { c.Host = c.Headers["host"] + delete(c.Headers,"host") } else if c.Host == "" && c.Headers["Host"] != "" { c.Host = c.Headers["Host"] + delete(c.Headers,"Host") } config := &httpupgrade.Config{ Path: path, diff --git a/xray-core/infra/conf/wireguard.go b/xray-core/infra/conf/wireguard.go index a4f0eda6e2..adf5184196 100644 --- a/xray-core/infra/conf/wireguard.go +++ b/xray-core/infra/conf/wireguard.go @@ -22,14 +22,14 @@ func (c *WireGuardPeerConfig) Build() (proto.Message, error) { config := new(wireguard.PeerConfig) if c.PublicKey != "" { - config.PublicKey, err = parseWireGuardKey(c.PublicKey) + config.PublicKey, err = ParseWireGuardKey(c.PublicKey) if err != nil { return nil, err } } if c.PreSharedKey != "" { - config.PreSharedKey, err = parseWireGuardKey(c.PreSharedKey) + config.PreSharedKey, err = ParseWireGuardKey(c.PreSharedKey) if err != nil { return nil, err } @@ -64,7 +64,7 @@ func (c *WireGuardConfig) Build() (proto.Message, error) { config := new(wireguard.DeviceConfig) var err error - config.SecretKey, err = parseWireGuardKey(c.SecretKey) + config.SecretKey, err = ParseWireGuardKey(c.SecretKey) if err != nil { return nil, err } @@ -132,7 +132,7 @@ func (c *WireGuardConfig) Build() (proto.Message, error) { return config, nil } -func parseWireGuardKey(str string) (string, error) { +func ParseWireGuardKey(str string) (string, error) { var err error if len(str)%2 == 0 { diff --git a/xray-core/proxy/wireguard/tun_linux.go b/xray-core/proxy/wireguard/tun_linux.go index b85a9d097e..5ec40ffe83 100644 --- a/xray-core/proxy/wireguard/tun_linux.go +++ b/xray-core/proxy/wireguard/tun_linux.go @@ -29,7 +29,7 @@ type deviceNet struct { func newDeviceNet(interfaceName string) *deviceNet { var dialer net.Dialer - bindControl := control.BindToInterface(control.DefaultInterfaceFinder(), interfaceName, -1) + bindControl := control.BindToInterface(control.NewDefaultInterfaceFinder(), interfaceName, -1) dialer.Control = control.Append(dialer.Control, bindControl) return &deviceNet{dialer: dialer} } diff --git a/xray-core/testing/scenarios/wireguard_test.go b/xray-core/testing/scenarios/wireguard_test.go new file mode 100644 index 0000000000..6b16ca166b --- /dev/null +++ b/xray-core/testing/scenarios/wireguard_test.go @@ -0,0 +1,124 @@ +package scenarios + +import ( + "testing" + //"time" + + "github.com/xtls/xray-core/app/log" + "github.com/xtls/xray-core/app/proxyman" + "github.com/xtls/xray-core/common" + clog "github.com/xtls/xray-core/common/log" + "github.com/xtls/xray-core/common/net" + "github.com/xtls/xray-core/common/serial" + core "github.com/xtls/xray-core/core" + "github.com/xtls/xray-core/infra/conf" + "github.com/xtls/xray-core/proxy/dokodemo" + "github.com/xtls/xray-core/proxy/freedom" + "github.com/xtls/xray-core/proxy/wireguard" + "github.com/xtls/xray-core/testing/servers/tcp" + "github.com/xtls/xray-core/testing/servers/udp" + //"golang.org/x/sync/errgroup" +) + +func TestWireguard(t *testing.T) { + tcpServer := tcp.Server{ + MsgProcessor: xor, + } + dest, err := tcpServer.Start() + common.Must(err) + defer tcpServer.Close() + + serverPrivate, _ := conf.ParseWireGuardKey("EGs4lTSJPmgELx6YiJAmPR2meWi6bY+e9rTdCipSj10=") + serverPublic, _ := conf.ParseWireGuardKey("osAMIyil18HeZXGGBDC9KpZoM+L2iGyXWVSYivuM9B0=") + clientPrivate, _ := conf.ParseWireGuardKey("CPQSpgxgdQRZa5SUbT3HLv+mmDVHLW5YR/rQlzum/2I=") + clientPublic, _ := conf.ParseWireGuardKey("MmLJ5iHFVVBp7VsB0hxfpQ0wEzAbT2KQnpQpj0+RtBw=") + + serverPort := udp.PickPort() + serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: clog.Severity_Debug, + ErrorLogType: log.LogType_Console, + }), + }, + Inbound: []*core.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}}, + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&wireguard.DeviceConfig{ + IsClient: false, + KernelMode: false, + Endpoint: []string{"10.0.0.1"}, + Mtu: 1420, + SecretKey: serverPrivate, + Peers: []*wireguard.PeerConfig{{ + PublicKey: serverPublic, + AllowedIps: []string{"0.0.0.0/0", "::0/0"}, + }}, + }), + }, + }, + Outbound: []*core.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + clientPort := tcp.PickPort() + clientConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: clog.Severity_Debug, + ErrorLogType: log.LogType_Console, + }), + }, + Inbound: []*core.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}}, + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ + Address: net.NewIPOrDomain(dest.Address), + Port: uint32(dest.Port), + NetworkList: &net.NetworkList{ + Network: []net.Network{net.Network_TCP}, + }, + }), + }, + }, + Outbound: []*core.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&wireguard.DeviceConfig{ + IsClient: true, + KernelMode: false, + Endpoint: []string{"10.0.0.2"}, + Mtu: 1420, + SecretKey: clientPrivate, + Peers: []*wireguard.PeerConfig{{ + Endpoint: "127.0.0.1:" + serverPort.String(), + PublicKey: clientPublic, + AllowedIps: []string{"0.0.0.0/0", "::0/0"}, + }}, + }), + }, + }, + } + + servers, err := InitializeServerConfigs(serverConfig, clientConfig) + common.Must(err) + defer CloseAllServers(servers) + + // FIXME: for some reason wg server does not receive + + // var errg errgroup.Group + // for i := 0; i < 1; i++ { + // errg.Go(testTCPConn(clientPort, 1024, time.Second*2)) + // } + // if err := errg.Wait(); err != nil { + // t.Error(err) + // } +} \ No newline at end of file diff --git a/xray-core/transport/internet/httpupgrade/dialer.go b/xray-core/transport/internet/httpupgrade/dialer.go index b54af9a6a8..f1be7c4ef8 100644 --- a/xray-core/transport/internet/httpupgrade/dialer.go +++ b/xray-core/transport/internet/httpupgrade/dialer.go @@ -24,8 +24,10 @@ type ConnRF struct { func (c *ConnRF) Read(b []byte) (int, error) { if c.First { c.First = false - // TODO The bufio usage here is unreliable - resp, err := http.ReadResponse(bufio.NewReader(c.Conn), c.Req) // nolint:bodyclose + // create reader capped to size of `b`, so it can be fully drained into + // `b` later with a single Read call + reader := bufio.NewReaderSize(c.Conn, len(b)) + resp, err := http.ReadResponse(reader, c.Req) // nolint:bodyclose if err != nil { return 0, err } @@ -34,6 +36,8 @@ func (c *ConnRF) Read(b []byte) (int, error) { strings.ToLower(resp.Header.Get("Connection")) != "upgrade" { return 0, newError("unrecognized reply") } + // drain remaining bufreader + return reader.Read(b[:reader.Buffered()]) } return c.Conn.Read(b) } @@ -74,7 +78,7 @@ func dialhttpUpgrade(ctx context.Context, dest net.Destination, streamSettings * Header: make(http.Header), } for key, value := range transportConfiguration.Header { - req.Header.Add(key, value) + AddHeader(req.Header, key, value) } req.Header.Set("Connection", "upgrade") req.Header.Set("Upgrade", "websocket") @@ -100,7 +104,14 @@ func dialhttpUpgrade(ctx context.Context, dest net.Destination, streamSettings * return connRF, nil } -func dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (stat.Connection, error) { +//http.Header.Add() will convert headers to MIME header format. +//Some people don't like this because they want to send "Web*S*ocket". +//So we add a simple function to replace that method. +func AddHeader(header http.Header, key, value string) { + header[key] = append(header[key], value) +} + +func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (stat.Connection, error) { newError("creating connection to ", dest).WriteToLog(session.ExportIDToError(ctx)) conn, err := dialhttpUpgrade(ctx, dest, streamSettings) @@ -111,5 +122,5 @@ func dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me } func init() { - common.Must(internet.RegisterTransportDialer(protocolName, dial)) + common.Must(internet.RegisterTransportDialer(protocolName, Dial)) } diff --git a/xray-core/transport/internet/httpupgrade/httpupgrade_test.go b/xray-core/transport/internet/httpupgrade/httpupgrade_test.go new file mode 100644 index 0000000000..991c37cb99 --- /dev/null +++ b/xray-core/transport/internet/httpupgrade/httpupgrade_test.go @@ -0,0 +1,212 @@ +package httpupgrade_test + +import ( + "context" + "runtime" + "testing" + "time" + + "github.com/xtls/xray-core/common" + "github.com/xtls/xray-core/common/net" + "github.com/xtls/xray-core/common/protocol/tls/cert" + "github.com/xtls/xray-core/testing/servers/tcp" + "github.com/xtls/xray-core/transport/internet" + . "github.com/xtls/xray-core/transport/internet/httpupgrade" + "github.com/xtls/xray-core/transport/internet/stat" + "github.com/xtls/xray-core/transport/internet/tls" +) + +func Test_listenHTTPUpgradeAndDial(t *testing.T) { + listenPort := tcp.PickPort() + listen, err := ListenHTTPUpgrade(context.Background(), net.LocalHostIP, listenPort, &internet.MemoryStreamConfig{ + ProtocolName: "httpupgrade", + ProtocolSettings: &Config{ + Path: "httpupgrade", + }, + }, func(conn stat.Connection) { + go func(c stat.Connection) { + defer c.Close() + + var b [1024]byte + _, err := c.Read(b[:]) + if err != nil { + return + } + + common.Must2(c.Write([]byte("Response"))) + }(conn) + }) + common.Must(err) + + ctx := context.Background() + streamSettings := &internet.MemoryStreamConfig{ + ProtocolName: "httpupgrade", + ProtocolSettings: &Config{Path: "httpupgrade"}, + } + conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), listenPort), streamSettings) + + common.Must(err) + _, err = conn.Write([]byte("Test connection 1")) + common.Must(err) + + var b [1024]byte + n, err := conn.Read(b[:]) + common.Must(err) + if string(b[:n]) != "Response" { + t.Error("response: ", string(b[:n])) + } + + common.Must(conn.Close()) + <-time.After(time.Second * 5) + conn, err = Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), listenPort), streamSettings) + common.Must(err) + _, err = conn.Write([]byte("Test connection 2")) + common.Must(err) + n, err = conn.Read(b[:]) + common.Must(err) + if string(b[:n]) != "Response" { + t.Error("response: ", string(b[:n])) + } + common.Must(conn.Close()) + + common.Must(listen.Close()) +} + +func Test_listenHTTPUpgradeAndDialWithHeaders(t *testing.T) { + listenPort := tcp.PickPort() + listen, err := ListenHTTPUpgrade(context.Background(), net.LocalHostIP, listenPort, &internet.MemoryStreamConfig{ + ProtocolName: "httpupgrade", + ProtocolSettings: &Config{ + Path: "httpupgrade", + Header: map[string]string{ + "User-Agent": "Mozilla", + }, + }, + }, func(conn stat.Connection) { + go func(c stat.Connection) { + defer c.Close() + + var b [1024]byte + _, err := c.Read(b[:]) + if err != nil { + return + } + + common.Must2(c.Write([]byte("Response"))) + }(conn) + }) + common.Must(err) + + ctx := context.Background() + streamSettings := &internet.MemoryStreamConfig{ + ProtocolName: "httpupgrade", + ProtocolSettings: &Config{Path: "httpupgrade"}, + } + conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), listenPort), streamSettings) + + common.Must(err) + _, err = conn.Write([]byte("Test connection 1")) + common.Must(err) + + var b [1024]byte + n, err := conn.Read(b[:]) + common.Must(err) + if string(b[:n]) != "Response" { + t.Error("response: ", string(b[:n])) + } + + common.Must(conn.Close()) + <-time.After(time.Second * 5) + conn, err = Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), listenPort), streamSettings) + common.Must(err) + _, err = conn.Write([]byte("Test connection 2")) + common.Must(err) + n, err = conn.Read(b[:]) + common.Must(err) + if string(b[:n]) != "Response" { + t.Error("response: ", string(b[:n])) + } + common.Must(conn.Close()) + + common.Must(listen.Close()) +} + +func TestDialWithRemoteAddr(t *testing.T) { + listenPort := tcp.PickPort() + listen, err := ListenHTTPUpgrade(context.Background(), net.LocalHostIP, listenPort, &internet.MemoryStreamConfig{ + ProtocolName: "httpupgrade", + ProtocolSettings: &Config{ + Path: "httpupgrade", + }, + }, func(conn stat.Connection) { + go func(c stat.Connection) { + defer c.Close() + + var b [1024]byte + _, err := c.Read(b[:]) + // common.Must(err) + if err != nil { + return + } + + _, err = c.Write([]byte("Response")) + common.Must(err) + }(conn) + }) + common.Must(err) + + conn, err := Dial(context.Background(), net.TCPDestination(net.DomainAddress("localhost"), listenPort), &internet.MemoryStreamConfig{ + ProtocolName: "httpupgrade", + ProtocolSettings: &Config{Path: "httpupgrade", Header: map[string]string{"X-Forwarded-For": "1.1.1.1"}}, + }) + + common.Must(err) + _, err = conn.Write([]byte("Test connection 1")) + common.Must(err) + + var b [1024]byte + n, err := conn.Read(b[:]) + common.Must(err) + if string(b[:n]) != "Response" { + t.Error("response: ", string(b[:n])) + } + + common.Must(listen.Close()) +} + +func Test_listenHTTPUpgradeAndDial_TLS(t *testing.T) { + listenPort := tcp.PickPort() + if runtime.GOARCH == "arm64" { + return + } + + start := time.Now() + + streamSettings := &internet.MemoryStreamConfig{ + ProtocolName: "httpupgrade", + ProtocolSettings: &Config{ + Path: "httpupgrades", + }, + SecurityType: "tls", + SecuritySettings: &tls.Config{ + AllowInsecure: true, + Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil, cert.CommonName("localhost")))}, + }, + } + listen, err := ListenHTTPUpgrade(context.Background(), net.LocalHostIP, listenPort, streamSettings, func(conn stat.Connection) { + go func() { + _ = conn.Close() + }() + }) + common.Must(err) + defer listen.Close() + + conn, err := Dial(context.Background(), net.TCPDestination(net.DomainAddress("localhost"), listenPort), streamSettings) + common.Must(err) + _ = conn.Close() + + end := time.Now() + if !end.Before(start.Add(time.Second * 5)) { + t.Error("end: ", end, " start: ", start) + } +} diff --git a/xray-core/transport/internet/httpupgrade/hub.go b/xray-core/transport/internet/httpupgrade/hub.go index f78f844284..5c3ccbd360 100644 --- a/xray-core/transport/internet/httpupgrade/hub.go +++ b/xray-core/transport/internet/httpupgrade/hub.go @@ -78,12 +78,8 @@ func (s *server) Handle(conn net.Conn) (stat.Connection, error) { Port: int(0), } } - if remoteAddr == nil { - return nil, newError("remoteAddr is nil") - } - conn = newConnection(conn, remoteAddr) - return stat.Connection(conn), nil + return stat.Connection(newConnection(conn, remoteAddr)), nil } func (s *server) keepAccepting() { @@ -101,7 +97,7 @@ func (s *server) keepAccepting() { } } -func listenHTTPUpgrade(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, addConn internet.ConnHandler) (internet.Listener, error) { +func ListenHTTPUpgrade(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, addConn internet.ConnHandler) (internet.Listener, error) { transportConfiguration := streamSettings.ProtocolSettings.(*Config) if transportConfiguration != nil { if streamSettings.SocketSettings == nil { @@ -151,5 +147,5 @@ func listenHTTPUpgrade(ctx context.Context, address net.Address, port net.Port, } func init() { - common.Must(internet.RegisterTransportListener(protocolName, listenHTTPUpgrade)) + common.Must(internet.RegisterTransportListener(protocolName, ListenHTTPUpgrade)) } diff --git a/xray-core/transport/internet/websocket/ws_test.go b/xray-core/transport/internet/websocket/ws_test.go index 12223353f7..48892ead97 100644 --- a/xray-core/transport/internet/websocket/ws_test.go +++ b/xray-core/transport/internet/websocket/ws_test.go @@ -9,6 +9,7 @@ import ( "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/protocol/tls/cert" + "github.com/xtls/xray-core/testing/servers/tcp" "github.com/xtls/xray-core/transport/internet" "github.com/xtls/xray-core/transport/internet/stat" "github.com/xtls/xray-core/transport/internet/tls" @@ -16,7 +17,8 @@ import ( ) func Test_listenWSAndDial(t *testing.T) { - listen, err := ListenWS(context.Background(), net.LocalHostIP, 13146, &internet.MemoryStreamConfig{ + listenPort := tcp.PickPort() + listen, err := ListenWS(context.Background(), net.LocalHostIP, listenPort, &internet.MemoryStreamConfig{ ProtocolName: "websocket", ProtocolSettings: &Config{ Path: "ws", @@ -41,7 +43,7 @@ func Test_listenWSAndDial(t *testing.T) { ProtocolName: "websocket", ProtocolSettings: &Config{Path: "ws"}, } - conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13146), streamSettings) + conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), listenPort), streamSettings) common.Must(err) _, err = conn.Write([]byte("Test connection 1")) @@ -56,7 +58,7 @@ func Test_listenWSAndDial(t *testing.T) { common.Must(conn.Close()) <-time.After(time.Second * 5) - conn, err = Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13146), streamSettings) + conn, err = Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), listenPort), streamSettings) common.Must(err) _, err = conn.Write([]byte("Test connection 2")) common.Must(err) @@ -71,7 +73,8 @@ func Test_listenWSAndDial(t *testing.T) { } func TestDialWithRemoteAddr(t *testing.T) { - listen, err := ListenWS(context.Background(), net.LocalHostIP, 13148, &internet.MemoryStreamConfig{ + listenPort := tcp.PickPort() + listen, err := ListenWS(context.Background(), net.LocalHostIP, listenPort, &internet.MemoryStreamConfig{ ProtocolName: "websocket", ProtocolSettings: &Config{ Path: "ws", @@ -93,7 +96,7 @@ func TestDialWithRemoteAddr(t *testing.T) { }) common.Must(err) - conn, err := Dial(context.Background(), net.TCPDestination(net.DomainAddress("localhost"), 13148), &internet.MemoryStreamConfig{ + conn, err := Dial(context.Background(), net.TCPDestination(net.DomainAddress("localhost"), listenPort), &internet.MemoryStreamConfig{ ProtocolName: "websocket", ProtocolSettings: &Config{Path: "ws", Header: map[string]string{"X-Forwarded-For": "1.1.1.1"}}, }) @@ -113,6 +116,7 @@ func TestDialWithRemoteAddr(t *testing.T) { } func Test_listenWSAndDial_TLS(t *testing.T) { + listenPort := tcp.PickPort() if runtime.GOARCH == "arm64" { return } @@ -130,7 +134,7 @@ func Test_listenWSAndDial_TLS(t *testing.T) { Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil, cert.CommonName("localhost")))}, }, } - listen, err := ListenWS(context.Background(), net.LocalHostIP, 13143, streamSettings, func(conn stat.Connection) { + listen, err := ListenWS(context.Background(), net.LocalHostIP, listenPort, streamSettings, func(conn stat.Connection) { go func() { _ = conn.Close() }() @@ -138,7 +142,7 @@ func Test_listenWSAndDial_TLS(t *testing.T) { common.Must(err) defer listen.Close() - conn, err := Dial(context.Background(), net.TCPDestination(net.DomainAddress("localhost"), 13143), streamSettings) + conn, err := Dial(context.Background(), net.TCPDestination(net.DomainAddress("localhost"), listenPort), streamSettings) common.Must(err) _ = conn.Close() diff --git a/yass/.circleci/config.yml b/yass/.circleci/config.yml index c50a34a215..a87db997e9 100644 --- a/yass/.circleci/config.yml +++ b/yass/.circleci/config.yml @@ -41,7 +41,7 @@ commands: sudo apt-get update -qq sudo DEBIAN_FRONTEND=noninteractive apt-get install -y clang - install-deps: + install-deps-gtk3: steps: - run: command: | @@ -52,6 +52,17 @@ commands: cmake --version rm -f *.tar.gz + install-deps-qt6: + steps: + - run: + command: | + sudo apt-get update -qq + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y cmake ninja-build qt6-base-dev qt6-tools-dev qt6-tools-dev-tools libglx-dev libgl1-mesa-dev qt6-l10n-tools libncurses5 gettext libcurl4-openssl-dev dpkg-dev + curl -L -O https://github.com/Kitware/CMake/releases/download/v3.28.5/cmake-3.28.5-linux-x86_64.tar.gz + sudo tar -C /usr/local --strip-components=1 -xf cmake-3.28.5-linux-x86_64.tar.gz + cmake --version + rm -f *.tar.gz + install-deps-golang: steps: - run: @@ -81,6 +92,16 @@ commands: cd build cmake -G Ninja -DGUI=on -DBUILD_TESTS=on -DBORINGSSL_BUILD_TESTS=on -DCMAKE_BUILD_TYPE=Release -DUSE_TCMALLOC=on .. + configure-qt6: + steps: + - run: + command: | + export "CC=$PWD/third_party/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin/clang" + export "CXX=$PWD/third_party/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin/clang++" + mkdir build + cd build + cmake -G Ninja -DGUI=on -DUSE_QT6=on -DBUILD_TESTS=on -DBORINGSSL_BUILD_TESTS=on -DCMAKE_BUILD_TYPE=Release -DUSE_TCMALLOC=on .. + configure-gcc: steps: - run: @@ -192,19 +213,31 @@ jobs: steps: - checkout - update-submodule - - install-deps + - install-deps-gtk3 - install-deps-golang - download-toolchain-clang - configure - build - test + basic-qt6: + executor: ubuntu + steps: + - checkout + - update-submodule + - install-deps-qt6 + - install-deps-golang + - download-toolchain-clang + - configure-qt6 + - build + - test + basic-gcc: executor: ubuntu steps: - checkout - update-submodule - - install-deps + - install-deps-gtk3 - install-deps-golang - download-toolchain-gcc - configure-gcc @@ -216,7 +249,7 @@ jobs: steps: - checkout - update-submodule - - install-deps + - install-deps-gtk3 - install-deps-golang - download-toolchain-clang - configure-without-libcxx @@ -230,7 +263,7 @@ jobs: steps: - checkout - update-submodule - - install-deps + - install-deps-gtk3 - install-deps-golang - download-toolchain-arm - configure-arm @@ -242,7 +275,7 @@ jobs: steps: - checkout - update-submodule - - install-deps + - install-deps-gtk3 - install-deps-golang - download-toolchain - configure-asan @@ -254,7 +287,7 @@ jobs: steps: - checkout - update-submodule - - install-deps + - install-deps-gtk3 - install-deps-golang - download-toolchain - configure-ubsan @@ -266,7 +299,7 @@ jobs: steps: - checkout - update-submodule - - install-deps + - install-deps-gtk3 - install-deps-golang - download-toolchain - configure-tsan @@ -278,7 +311,7 @@ jobs: steps: - checkout - update-submodule - - install-deps + - install-deps-gtk3 - install-deps-golang - download-toolchain - configure-msan @@ -290,6 +323,10 @@ workflows: jobs: - basic + x64-basic-qt6: + jobs: + - basic-qt6 + x64-basic-gcc: jobs: - basic-gcc diff --git a/yass/.gitattributes b/yass/.gitattributes index e0a769395f..625ecce2cf 100644 --- a/yass/.gitattributes +++ b/yass/.gitattributes @@ -4,3 +4,5 @@ *.crt text eol=lf *.sh text eol=lf *.patch text eol=lf +*.ts text eol=lf +*.qm binary diff --git a/yass/.github/workflows/clang-tidy.yml b/yass/.github/workflows/clang-tidy.yml index 881c956428..a0a4a9136d 100644 --- a/yass/.github/workflows/clang-tidy.yml +++ b/yass/.github/workflows/clang-tidy.yml @@ -18,7 +18,7 @@ on: schedule: - cron: '0 16 * * *' env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: win-clang-tidy: @@ -42,7 +42,7 @@ jobs: # unshallow must come first otherwise submodule may be get unshallowed git fetch --tags --unshallow git submodule update --init --depth 1 - - name: Cache clang, nasm and wixtoolset 3 + - name: Cache clang, nasm, nsis and wixtoolset 3 id: clang-cache uses: actions/cache@v4 with: @@ -50,7 +50,8 @@ jobs: third_party/nasm third_party/llvm-build/Release+Asserts third_party/wix311 - key: ${{ runner.os }}-toolchain-${{ hashFiles('CLANG_REVISION') }}-v${{ env.CACHE_EPOCH }} + third_party/nsis + key: ${{ runner.os }}-toolchain-nsis-${{ hashFiles('CLANG_REVISION') }}-v${{ env.CACHE_EPOCH }} - name: Cache golang uses: actions/cache@v4 with: @@ -64,7 +65,7 @@ jobs: run: | cd tools go build - - name: "Download dependency: clang, nasm and wixtoolset 3" + - name: "Download dependency: clang, nasm, nsis and wixtoolset 3" if: ${{ steps.clang-cache.outputs.cache-hit != 'true' }} run: | scripts\download-toolchain.bat @@ -86,9 +87,6 @@ jobs: set "VSCMD_START_DIR=%CD%" set Platform=${{ matrix.arch }} - set "Path=%CD%\third_party\nasm;%Path%" - set "Path=%CD%\third_party\wix311;%Path%" - call "%vsdevcmd%" -arch=%Platform% -host_arch=amd64 -winsdk=%Winsdk% -no_logo -vcvars_ver=%VCToolsVersion% tools\build -clang-tidy-mode "-clang-tidy-executable-path=%CD%/third_party/llvm-build/Release+Asserts/bin/clang-tidy.exe" -msvc-tgt-arch=${{ matrix.arch }} -msvc-crt-linkage=${{ matrix.crt-linkage }} -build-test -build-benchmark -no-packaging || exit /b diff --git a/yass/.github/workflows/compiler.yml b/yass/.github/workflows/compiler.yml index a711034433..2e2e5d4d3d 100644 --- a/yass/.github/workflows/compiler.yml +++ b/yass/.github/workflows/compiler.yml @@ -33,7 +33,7 @@ concurrency: group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: win-compiler-compatible-2022: @@ -56,7 +56,7 @@ jobs: # unshallow must come first otherwise submodule may be get unshallowed git fetch --tags --unshallow git submodule update --init --depth 1 - - name: Cache clang, nasm and wixtoolset 3 + - name: Cache clang, nasm, nsis and wixtoolset 3 id: clang-cache uses: actions/cache@v4 with: @@ -64,7 +64,8 @@ jobs: third_party/nasm third_party/llvm-build/Release+Asserts third_party/wix311 - key: ${{ runner.os }}-toolchain-${{ hashFiles('CLANG_REVISION') }}-v${{ env.CACHE_EPOCH }} + third_party/nsis + key: ${{ runner.os }}-toolchain-nsis-${{ hashFiles('CLANG_REVISION') }}-v${{ env.CACHE_EPOCH }} - name: Cache msvc curl id: curl-cache uses: actions/cache@v4 @@ -87,7 +88,7 @@ jobs: run: | cd tools go build - - name: "Download dependency: clang, nasm and wixtoolset 3" + - name: "Download dependency: clang, nasm, nsis and wixtoolset 3" if: ${{ steps.clang-cache.outputs.cache-hit != 'true' }} run: | scripts\download-toolchain.bat @@ -113,9 +114,6 @@ jobs: set "VSCMD_START_DIR=%CD%" set Platform=${{ matrix.arch }} - set "Path=%CD%\third_party\nasm;%Path%" - set "Path=%CD%\third_party\wix311;%Path%" - call "%vsdevcmd%" -arch=%Platform% -host_arch=amd64 -winsdk=%Winsdk% -no_logo -vcvars_ver=%VCToolsVersion% tools\build -msvc-tgt-arch=${{ matrix.arch }} -msvc-crt-linkage=${{ matrix.crt-linkage }} -use-libcxx=false -build-test -no-packaging || exit /b @@ -160,7 +158,8 @@ jobs: third_party/nasm third_party/llvm-build/Release+Asserts third_party/wix311 - key: ${{ runner.os }}-toolchain-${{ hashFiles('CLANG_REVISION') }}-v${{ env.CACHE_EPOCH }} + third_party/nsis + key: ${{ runner.os }}-toolchain-nsis-${{ hashFiles('CLANG_REVISION') }}-v${{ env.CACHE_EPOCH }} - name: Cache mingw64 llvm id: mingw-cache uses: actions/cache@v4 diff --git a/yass/.github/workflows/releases-android-binary.yml b/yass/.github/workflows/releases-android-binary.yml index 9873babfb0..64fcefec5d 100644 --- a/yass/.github/workflows/releases-android-binary.yml +++ b/yass/.github/workflows/releases-android-binary.yml @@ -35,7 +35,7 @@ concurrency: group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: android-binary-release: diff --git a/yass/.github/workflows/releases-deb.yml b/yass/.github/workflows/releases-deb.yml index f93dc99fd1..5d260f8bff 100644 --- a/yass/.github/workflows/releases-deb.yml +++ b/yass/.github/workflows/releases-deb.yml @@ -35,7 +35,7 @@ concurrency: group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct DH_QUIET: 1 jobs: diff --git a/yass/.github/workflows/releases-freebsd-binary.yml b/yass/.github/workflows/releases-freebsd-binary.yml index 897563ec69..c638f404dc 100644 --- a/yass/.github/workflows/releases-freebsd-binary.yml +++ b/yass/.github/workflows/releases-freebsd-binary.yml @@ -35,7 +35,7 @@ concurrency: group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: freebsd-binary-release: diff --git a/yass/.github/workflows/releases-ios.yml b/yass/.github/workflows/releases-ios.yml index 561ef3ac3d..beb820e860 100644 --- a/yass/.github/workflows/releases-ios.yml +++ b/yass/.github/workflows/releases-ios.yml @@ -21,7 +21,7 @@ concurrency: group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: ios-simulator-release: diff --git a/yass/.github/workflows/releases-linux-binary.yml b/yass/.github/workflows/releases-linux-binary.yml index 65cfe6f1c6..de19f31365 100644 --- a/yass/.github/workflows/releases-linux-binary.yml +++ b/yass/.github/workflows/releases-linux-binary.yml @@ -35,7 +35,7 @@ concurrency: group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: linux-binary-release: diff --git a/yass/.github/workflows/releases-macos.yml b/yass/.github/workflows/releases-macos.yml index ea7c85d9a0..f358f1d566 100644 --- a/yass/.github/workflows/releases-macos.yml +++ b/yass/.github/workflows/releases-macos.yml @@ -35,7 +35,7 @@ concurrency: group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: mac-release: diff --git a/yass/.github/workflows/releases-mingw-new.yml b/yass/.github/workflows/releases-mingw-new.yml index 0d308d9b47..a3a9c2d631 100644 --- a/yass/.github/workflows/releases-mingw-new.yml +++ b/yass/.github/workflows/releases-mingw-new.yml @@ -35,7 +35,7 @@ concurrency: group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: mingw64-release: @@ -47,7 +47,7 @@ jobs: - arch: i686 variant: msvcrt - arch: x86_64 - variant: msvcrt + variant: ucrt - arch: aarch64 variant: ucrt env: @@ -59,14 +59,12 @@ jobs: # unshallow must come first otherwise submodule may be get unshallowed git fetch --tags --unshallow git submodule update --init --depth 1 - - name: Cache clang, nasm and wixtoolset 3 + - name: Cache clang id: clang-cache uses: actions/cache@v4 with: path: | - third_party/nasm third_party/llvm-build/Release+Asserts - third_party/wix311 key: ${{ runner.os }}-toolchain-${{ hashFiles('CLANG_REVISION') }}-v${{ env.CACHE_EPOCH }} - name: Cache mingw64 llvm id: mingw-cache diff --git a/yass/.github/workflows/releases-mingw.yml b/yass/.github/workflows/releases-mingw.yml index 674713935e..629f8ebc05 100644 --- a/yass/.github/workflows/releases-mingw.yml +++ b/yass/.github/workflows/releases-mingw.yml @@ -18,7 +18,7 @@ on: schedule: - cron: '0 16 * * *' env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: mingw64-release: diff --git a/yass/.github/workflows/releases-openwrt-binary.yml b/yass/.github/workflows/releases-openwrt-binary.yml index dd30030e61..7bf5d58b18 100644 --- a/yass/.github/workflows/releases-openwrt-binary.yml +++ b/yass/.github/workflows/releases-openwrt-binary.yml @@ -35,7 +35,7 @@ concurrency: group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: openwrt-binary-release: diff --git a/yass/.github/workflows/releases-rpm.yml b/yass/.github/workflows/releases-rpm.yml index 959dcd5c81..cb498b8299 100644 --- a/yass/.github/workflows/releases-rpm.yml +++ b/yass/.github/workflows/releases-rpm.yml @@ -35,7 +35,7 @@ concurrency: group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: docker_publish: diff --git a/yass/.github/workflows/releases-src.yml b/yass/.github/workflows/releases-src.yml index 368425e74d..e51b36f708 100644 --- a/yass/.github/workflows/releases-src.yml +++ b/yass/.github/workflows/releases-src.yml @@ -55,7 +55,7 @@ jobs: - name: Populate depedencies run: | sudo apt-get update -qq - sudo apt-get install -y libarchive-tools + sudo apt-get install -y libarchive-tools zstd - name: Build tarball and zip archive run: | ./scripts/build-src.sh diff --git a/yass/.github/workflows/releases-windows.yml b/yass/.github/workflows/releases-windows.yml index d237e5f4aa..0ed30dbd7a 100644 --- a/yass/.github/workflows/releases-windows.yml +++ b/yass/.github/workflows/releases-windows.yml @@ -24,7 +24,7 @@ defaults: run: shell: cmd env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: windows-release: @@ -44,7 +44,7 @@ jobs: # unshallow must come first otherwise submodule may be get unshallowed git fetch --tags --unshallow git submodule update --init --depth 1 - - name: Cache clang, nasm and wixtoolset 3 + - name: Cache clang, nasm, nsis and wixtoolset 3 id: clang-cache uses: actions/cache@v4 with: @@ -52,7 +52,8 @@ jobs: third_party/nasm third_party/llvm-build/Release+Asserts third_party/wix311 - key: ${{ runner.os }}-toolchain-${{ hashFiles('CLANG_REVISION') }}-v${{ env.CACHE_EPOCH }} + third_party/nsis + key: ${{ runner.os }}-toolchain-nsis-${{ hashFiles('CLANG_REVISION') }}-v${{ env.CACHE_EPOCH }} - name: Cache msvc curl id: curl-cache uses: actions/cache@v4 @@ -89,7 +90,7 @@ jobs: run: | cd tools go build - - name: "Download dependency: clang, nasm and wixtoolset 3" + - name: "Download dependency: clang, nasm, nsis and wixtoolset 3" if: ${{ steps.clang-cache.outputs.cache-hit != 'true' }} run: | scripts\download-toolchain.bat @@ -124,9 +125,6 @@ jobs: set "VSCMD_START_DIR=%CD%" set Platform=${{ matrix.arch }} - set "Path=%CD%\third_party\nasm;%Path%" - set "Path=%CD%\third_party\wix311;%Path%" - call "%vsdevcmd%" -arch=%Platform% -host_arch=amd64 -winsdk=%Winsdk% -no_logo -vcvars_ver=%VCToolsVersion% tools\build -msvc-tgt-arch=${{ matrix.arch }} -msvc-crt-linkage=${{ matrix.crt-linkage }} -build-benchmark -build-test || exit /b @@ -171,7 +169,7 @@ jobs: # unshallow must come first otherwise submodule may be get unshallowed git fetch --tags --unshallow git submodule update --init --depth 1 - - name: Cache clang, nasm and wixtoolset 3 + - name: Cache clang, nasm, nsis and wixtoolset 3 id: clang-cache uses: actions/cache@v4 with: @@ -179,7 +177,8 @@ jobs: third_party/nasm third_party/llvm-build/Release+Asserts third_party/wix311 - key: ${{ runner.os }}-toolchain-${{ hashFiles('CLANG_REVISION') }}-v${{ env.CACHE_EPOCH }} + third_party/nsis + key: ${{ runner.os }}-toolchain-nsis-${{ hashFiles('CLANG_REVISION') }}-v${{ env.CACHE_EPOCH }} - name: Cache golang uses: actions/cache@v4 with: @@ -193,7 +192,7 @@ jobs: run: | cd tools go build - - name: "Download dependency: clang, nasm and wixtoolset 3" + - name: "Download dependency: clang, nasm, nsis and wixtoolset 3" if: ${{ steps.clang-cache.outputs.cache-hit != 'true' }} run: | scripts\download-toolchain.bat @@ -224,9 +223,6 @@ jobs: set Platform=${{ matrix.arch }} set VSCMD_ARG_TGT_ARCH=${{ matrix.arch }} - set "Path=%CD%\third_party\nasm;%Path%" - set "Path=%CD%\third_party\wix311;%Path%" - call "scripts\callxp-%Platform%.cmd" tools\build -msvc-tgt-arch=${{ matrix.arch }} -msvc-crt-linkage=${{ matrix.crt-linkage }} -msvc-allow-xp -build-test -build-benchmark || exit /b diff --git a/yass/.github/workflows/sanitizers.yml b/yass/.github/workflows/sanitizers.yml index d2634bbb77..6589b1d1e0 100644 --- a/yass/.github/workflows/sanitizers.yml +++ b/yass/.github/workflows/sanitizers.yml @@ -18,7 +18,7 @@ on: schedule: - cron: '0 16 * * *' env: - CACHE_EPOCH: 126-1 + CACHE_EPOCH: 127-3 GOPROXY: direct jobs: sanitizer-linux: diff --git a/yass/.gitignore b/yass/.gitignore index a425f67166..b79a065d4d 100644 --- a/yass/.gitignore +++ b/yass/.gitignore @@ -11,6 +11,7 @@ sscxx *.zip /third_party/llvm-build /third_party/vcredist +/third_party/nsis /third_party/nasm /third_party/wix311 /third_party/mingw32 @@ -57,6 +58,7 @@ sscxx *.bz2 *.rpm *.deb +*.zst /tools/build /build-* /cmake-build-* diff --git a/yass/BUILDING.md b/yass/BUILDING.md index 3fd02b7e4c..92eb0bf9ed 100644 --- a/yass/BUILDING.md +++ b/yass/BUILDING.md @@ -1,17 +1,26 @@ # Building Instruments -## Build Binary +## Windows (MinGW) -### Windows (MinGW llvm-mingw) +1. Install [Chocolatey][chocolatey] Package Manager. -1. Make sure you have [Git for Windows][gitforwindows] installed. -2. Make sure you have [Perl], [CMake] (3.13 or later), [Ninja], [Golang] and [NASM] installed and put them in `PATH`. +Run the following command in ADMINISTRATIVE powershell: +``` +Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) +``` + +2. Install required tools via [Chocolatey]. + +Run the following command in ADMINISTRATIVE shell: +``` +choco install 7zip.install +choco install git.install +choco install strawberryperl --version=5.38.2.2 +choco install cmake.portable --version=3.28.5 +choco install ninja +choco install golang +``` - * A recent version of Perl is required. - On Windows, [Active State Perl](http://www.activestate.com/activeperl/) has been reported to work, as has MSYS Perl. - [Strawberry Perl](http://strawberryperl.com/) also works but it adds [GCC] to `PATH`, - which can confuse some build tools when identifying the compiler - (removing `C:\Strawberry\c\bin` from `PATH` should resolve any problems). 3. Open `Git Bash` from Start Menu and run ``` @@ -20,9 +29,43 @@ cd yass ./scripts/build-mingw.sh ``` -4. Enjoy +## Windows (MSYS2) -### Windows (MSVC) +1. Download and run MSYS2 installer from [MSYS2 site][msys2]. +2. Install required tools + +Run `MSYS2 CLANG64` in Start Menu: +``` +pacman -S mingw-w64-clang-x86_64-clang \ + mingw-w64-clang-x86_64-gcc-compat \ + mingw-w64-clang-x86_64-perl \ + mingw-w64-clang-x86_64-go \ + mingw-w64-clang-x86_64-cmake \ + mingw-w64-clang-x86_64-ninja \ + mingw-w64-clang-x86_64-nasm \ + git +``` + +Notes: you might need to get `GOROOT` manually after install `mingw-w64-clang-x86_64-go` +package by running: +``` +export GOROOT=/clang64/lib/go +export GOPATH=/clang64 +``` + +3. Compiling the program. + +Run `MSYS2 CLANG64` in Start Menu: +``` +git clone https://github.com/Chilledheart/yass +cd yass +mkdir build +cd build +cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DGUI=on .. +ninja yass +``` + +## Windows (MSVC) 1. Make sure you have [Git for Windows][gitforwindows] installed. 2. Make sure you have [Perl], [CMake] (3.13 or later), [Ninja], [Golang] and [NASM] installed and put them in `PATH`. @@ -45,10 +88,9 @@ cd yass Notes: please make sure you have [LLVM][llvm-win64] (17.0 or above). -5. Run `x64 Native Tools Command Prompt for VS 2019 (or 2022)` in Start Menu. - -6. Compile the program with Release configuration. +5. Compile the program with Release configuration. +Run `x64 Native Tools Command Prompt for VS 2019 (or 2022)` in Start Menu: ``` git clone https://github.com/Chilledheart/yass cd yass @@ -60,99 +102,28 @@ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DGUI=on .. ninja yass ``` -### Windows (MinGW MSYS2) +## macOS -1. Install MSYS2 Package from [official site][msys2]. -2. Run MSYS2 CLANG64 in Start Menu. -3. Install required tools -``` -pacman -S mingw-w64-clang-x86_64-clang \ - mingw-w64-clang-x86_64-gcc-compat \ - mingw-w64-clang-x86_64-perl \ - mingw-w64-clang-x86_64-go \ - mingw-w64-clang-x86_64-cmake \ - mingw-w64-clang-x86_64-ninja \ - mingw-w64-clang-x86_64-nasm \ - git -``` - -Notes: you might need to get `GOROOT` manually after install `mingw-w64-clang-x86_64-go` -package by running: -``` -export GOROOT=/clang64/lib/go -export GOPATH=/clang64 -``` - -4. Compiling the program. -``` -git clone https://github.com/Chilledheart/yass -cd yass -mkdir build -cd build -cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DGUI=on .. -ninja yass -``` -5. Enjoy - -### macOS - -1. Make sure you have [Xcode Command Line Tools][xcode-commandline] installed ([Xcode] if possible): +1. Make sure you have both of [Xcode] and [Homebrew] installed: Run in `Terminal`: ``` +xcode-select -s /Applications/Xcode.app xcode-select --install +xcodebuild -runFirstLaunch ``` -2. Install the required build tools... -(for [Homebrew] users) +Run in `Terminal`: +``` +/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" +``` +2. Install the required build tools via homebrew Run in `Terminal`: ``` brew install ninja cmake go p7zip ``` -(for [MacPorts] users) - -Run in `Terminal`: -``` -sudo port install ninja cmake go p7zip -``` - -(for people who don't use [MacPorts] or [Homebrew]) - -1. [CMake] - -Run in Terminal: -``` -cd $TMPDIR -curl -L -O https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1-macos10.10-universal.dmg -hdiutil attach cmake-3.25.1-macos10.10-universal.dmg -ditto /Volumes/cmake-3.25.1-macos10.10-universal/CMake.app /Applications/CMake.app -hdiutil detach /Volumes/cmake-3.25.1-macos10.10-universal -echo 'export PATH="/Applications/CMake.app/Contents/bin:${PATH}"' >> .zprofile -export PATH="/Applications/CMake.app/Contents/bin:${PATH}" -``` -2. [Ninja] - -Run in Terminal: -``` -cd $TMPDIR -curl -L -O https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-mac.zip -unzip ninja-mac.zip -sudo install -m 755 ninja /usr/local/bin/ninja -``` -3. [Golang] - -Run in Terminal: -``` -cd $TMPDIR -# Change to https://go.dev/dl/go1.18.10.darwin-arm64.tar.gz if you are using Apple Silicon -curl -L -O https://go.dev/dl/go1.18.10.darwin-amd64.tar.gz -sudo tar -C /usr/local -xzf go1.18.10.darwin-amd64.tar.gz -echo 'export PATH="/usr/local/go/bin:${PATH}"' >> .zprofile -export PATH="/usr/local/go/bin:${PATH}" -``` - 3. Compile the program with Release configuration. ``` git clone https://github.com/Chilledheart/yass @@ -163,71 +134,59 @@ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DGUI=on .. ninja yass ``` - -### Debian/Ubuntu +## Debian/Ubuntu 1. Install GNU C++ Compiler: + +Run in `Console`: ``` sudo apt-get install -y build-essential git ``` + 2. Install required dependencies: + +Run in `Console`: ``` -sudo apt-get install -y \ - cmake \ - ninja-build \ - pkg-config \ - perl \ - gettext \ - libgtk-3-dev +sudo apt-get install -y cmake ninja-build pkg-config perl gettext libgtk-3-dev golang ``` -Notes: please make sure you have [GCC] (7.1 or above) or [Clang] (17.0 or above) and [CMake] (3.13 or above). - -For [GCC], cmake argument `-DUSE_LIBCXX=off` should be passed to disable libc++ build under gcc. +Notes: please make sure you have [GCC] (7.1 or above) and [CMake] (3.13 or above). You might want to give these APT/PPA sites a look if the requirements are not meet: * [PPA for Ubuntu Toolchain](https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test) * [Kitware CMake](https://apt.kitware.com/) -3. Install Golang manually: -``` -cd /tmp -wget https://go.dev/dl/go1.18.10.linux-amd64.tar.gz -sudo tar -C /usr/local -xzf go1.18.10.linux-amd64.tar.gz -echo 'export PATH="/usr/local/go/bin:${PATH}"' >> ~/.bashrc -export PATH="/usr/local/go/bin:${PATH}" -``` -4. Compile the program with Release configuration. +3. Compile the program with Release configuration. + +Run in `Console`: ``` git clone https://github.com/Chilledheart/yass cd yass mkdir build cd build -cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DGUI=on .. +cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DGUI=on -DENABLE_GOLD=off -DUSE_LIBCXX=off -DUSE_GTK4=off .. ninja yass ``` -### Fedora/RHEL/CentOS/AlmaLinux/Rocky Linux +## Fedora/RHEL/CentOS/AlmaLinux/Rocky Linux 1. Install GNU C++ Compiler: + +Run in `Console`: ``` -sudo yum install -y gcc gcc-c++ \ - make python bash coreutils diffutils patch git +sudo yum install -y gcc gcc-c++ make python bash coreutils diffutils patch git ``` 2. Install required dependencies: + +Run in `Console`: ``` -sudo yum install -y \ - cmake \ - ninja-build \ - pkg-config \ - perl \ - gtk3-devel \ - gettext \ - golang +sudo yum install -y cmake ninja-build pkg-config perl gtk3-devel gettext golang +``` +or (for RHEL/CentOS users) +``` +sudo yum install -y cmake3 ninja-build pkg-config perl gtk3-devel gettext golang ``` -Notes: please make sure you have [GCC] (7.1 or above) or [Clang] (17.0 or above) and [CMake] (3.13 or above). - -For [GCC], cmake argument `-DUSE_LIBCXX=off` should be passed to disable libc++ build under gcc. +Notes: please make sure you have [GCC] (7.1 or above) and [CMake] (3.13 or above). You might want to enable CodeReady (for RHEL), PowerTools (for CentOS) and EPEL repo before above commands: @@ -247,140 +206,51 @@ subscription-manager repos --enable rhel-*-optional-rpms \ * [EPEL] 9: `yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm` 3. Compile the program with Release configuration. + +Run in `Console`: ``` git clone https://github.com/Chilledheart/yass cd yass mkdir build cd build -cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DGUI=on .. +cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DGUI=on -DENABLE_GOLD=off -DUSE_LIBCXX=off -DUSE_GTK4=off .. ninja yass ``` -### FreeBSD -1. Install Clang Compiler (Optional): +## FreeBSD +1. Install Clang Compiler: It is impossible to upgrade system compiler without upgrading OS, -so you can install latest [Clang]: +so you have to install latest [Clang] (not required since FreeBSD 14.1): + +Run in `Console`: ``` -pkg install llvm17-lite +pkg install llvm18-lite ``` -Notes: please make sure you have [Clang] (17.0 or above) and [CMake] (3.13 or above). 2. Install required dependencies: -``` -pkg install -y \ - git \ - cmake \ - ninja \ - pkgconf \ - perl5 \ - gettext \ - gtk3 \ - go -``` - -Notes: please install `src.txz` package of system otherwise you might need to create symbolics of unwind.h like below: +Run in `Console`: ``` -ln -sf /usr/include/c++/v1/unwind.h /usr/include/unwind.h -ln -sf /usr/include/c++/v1/unwind-arm.h /usr/include/unwind-arm.h -ln -sf /usr/include/c++/v1/unwind-itanium.h /usr/include/unwind-itanium.h +pkg install -y git cmake ninja pkgconf perl5 gettext gtk3 go ``` -Notes: Not required since FreeBSD 13.1 - 3. Compile the program with Release configuration. + +Run in `Console`: ``` git clone https://github.com/Chilledheart/yass cd yass -export PATH="/usr/local/llvm17/bin:$PATH" +export PATH="/usr/local/llvm18/bin:$PATH" export CC=clang export CXX=clang++ mkdir build cd build -cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DGUI=on .. +cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DGUI=on -DUSE_GTK4=off .. ninja yass ``` -## Build Packaging - -### MinGW/Packaging - -Make sure you have [Golang] installed on your system. - -Run in `Git Bash` in Start Menu: -``` -./scripts/build-mingw.sh -``` - -### macOS/Packaging - -Make sure you have [Golang] installed on your system. - -Run in `Terminal`: -``` -cd tools -go build -cd .. -./tools/build -``` - -### Debian/Packaging - -1. Install Packaging Tools -``` -sudo apt-get install -y git build-essential fakeroot devscripts debhelper -``` - -2. Install [Clang] and put its binaries in `PATH` - -3. Generate Packages under parent directory -``` -export CC=clang -export CXX=clang++ -./scripts/build-deb.sh -``` - -### Fedora/RHEL/CentOS/AlmaLinux/Rocky Linux Packaging - -1. Install Packaging Tools -``` -sudo yum install -y gcc gcc-c++ \ - rpm-build rpm-devel rpmlint make python bash coreutils diffutils patch rpmdevtools -``` - -2. Install [Clang] and put its binaries in `PATH` - -3. Generate Packages under current directory -``` -export CC=clang -export CXX=clang++ -./scripts/build-rpm.sh -``` - -### FreeBSD/Packaging - -Make sure you have [Golang] installed on your system. - -Run in Terminal: -``` -cd tools -go build -cd .. -./tools/build -``` - -### Android/Packaging -See [android's README.md](android/README.md) - -### HarmonyOS/Packaging -See [harmonyOS's README.md](harmony/README.md) - -### iOS/Packaging -Make sure you have Xcode installed on your system. - -TBD - +[chocolatey]: https://chocolatey.org/install#individual [gitforwindows]: https://gitforwindows.org/ [visualstudio]: https://visualstudio.microsoft.com/downloads/ [Perl]: https://www.perl.org/get.html @@ -390,11 +260,8 @@ TBD [Golang]: https://go.dev/dl/ [GCC]: https://gcc.gnu.org/ [NASM]: https://www.nasm.us/ -[xcode-commandline]: https://developer.apple.com/download/more/ [Xcode]: https://apps.apple.com/us/app/xcode/id497799835?mt=12 -[MacPorts]: https://www.macports.org/install.php [HomeBrew]: https://docs.brew.sh/Installation -[python]: https://www.python.org/downloads/ -[llvm-win64]: https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.6/LLVM-17.0.6-win64.exe +[llvm-win64]: https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.6/LLVM-18.1.6-win64.exe [msys2]: https://www.msys2.org/ [EPEL]: https://docs.fedoraproject.org/en-US/epel diff --git a/yass/CLANG_REVISION b/yass/CLANG_REVISION index cb74c04925..7c5d11a59c 100644 --- a/yass/CLANG_REVISION +++ b/yass/CLANG_REVISION @@ -1 +1 @@ -llvmorg-19-init-9433-g76ea5feb-1 \ No newline at end of file +llvmorg-19-init-10646-g084e2b53-7 \ No newline at end of file diff --git a/yass/CMakeLists.txt b/yass/CMakeLists.txt index 46d16360f6..09bc4a3ae0 100644 --- a/yass/CMakeLists.txt +++ b/yass/CMakeLists.txt @@ -425,10 +425,6 @@ option(CLI "Build with cli." ON) option(SERVER "Build with server." ON) option(GUI "Build against GUI." OFF) -cmake_dependent_option(USE_GTK4 - "Build with gtk4 (GUI)" ON - "GUI AND NOT WIN32 AND NOT APPLE AND NOT OHOS AND NOT ANDROID" OFF) - option(BUILD_BENCHMARKS "Build with benchmark." OFF) option(BUILD_SHARED_LIBS "Build with shared libraries." OFF) option(BUILD_TESTS "Build with test." OFF) @@ -504,6 +500,14 @@ option(USE_MOLD "Build with mold linker" OFF) option(USE_LLD "Build with lld linker" OFF) option(USE_GOLD "Build with gold linker" OFF) +cmake_dependent_option(USE_QT6 + "Build with Qt6 (GUI)" OFF + "GUI AND NOT WIN32 AND NOT APPLE AND NOT OHOS AND NOT ANDROID" OFF) + +cmake_dependent_option(USE_GTK4 + "Build with gtk4 (GUI)" ON + "GUI AND NOT USE_QT6 AND NOT WIN32 AND NOT APPLE AND NOT OHOS AND NOT ANDROID" OFF) + # Dynamic users are supported from version 235 # see https://0pointer.net/blog/dynamic-users-with-systemd.html if (USE_OLD_SYSTEMD_SERVICE) @@ -1777,6 +1781,11 @@ if (WIN32) set(CMAKE_C_CREATE_CONSOLE_EXE "-mconsole -Xlinker --subsystem -Xlinker console${SUBSYSTEM_VERSION_SUFFIX}") set(CMAKE_CXX_CREATE_CONSOLE_EXE "-mconsole -Xlinker --subsystem -Xlinker console${SUBSYSTEM_VERSION_SUFFIX}") endif() + + if (MINGW AND MINGW_MSVCRT100) + # see https://github.com/mingw-w64/mingw-w64/blob/master/mingw-w64-headers/configure.ac#L172 + add_definitions(-D__MSVCRT_VERSION__=0xA00) + endif() endif() # On windows preload settings @@ -1934,6 +1943,28 @@ endif() if (HAVE_MALLINFO2) add_definitions(-DHAVE_MALLINFO2) endif() +if (MINGW) + # see https://github.com/mingw-w64/mingw-w64/blob/master/mingw-w64-headers/crt/_mingw.h.in#L215 + # 0xE00 stands for UCRT + check_c_source_compiles (" + #include <_mingw.h> + #if __MSVCRT_VERSION__ < 0x0E00 && !defined(_UCRT) + int main() {} + #endif + " HAVE_MINGW_MSVCRT) + check_c_source_compiles (" + #include <_mingw.h> + #if __MSVCRT_VERSION__ >= 0x0E00 || defined(_UCRT) + int main() {} + #endif + " HAVE_MINGW_UCRT) + if (HAVE_MINGW_MSVCRT) + list(APPEND YASS_APP_FEATURES "mingw msvcrt") + endif() + if (HAVE_MINGW_UCRT) + list(APPEND YASS_APP_FEATURES "mingw ucrt") + endif() +endif() # ***************************************************************************************** # Core Support Libraries @@ -2096,6 +2127,15 @@ elseif (GUI) if (NOT PKG_CONFIG_FOUND) message(WARNING "pkg-config (required to search gtk+ path) not found, disabling GUI build") set(GUI off) + elseif(USE_QT6) + find_package(Qt6 REQUIRED Widgets Gui OPTIONAL_COMPONENTS LinguistTools) + set(GUI_USE_FILE "") + set(GUI_INCLUDE_DIRS "") + set(GUI_DEFINITIONS "") + set(GUI_C_CXX_FLAGS "") + set(GUI_LIBRARY_DIRS "") + set(GUI_LIBRARIES Qt::Widgets Qt::Gui) + set(GUI_FLAVOUR "qt6") else() pkg_check_modules(FONTCONFIG fontconfig) if (NOT FONTCONFIG_FOUND) @@ -3839,6 +3879,171 @@ if (ENABLE_CLANG_TIDY) set(CMAKE_OBJCXX_CLANG_TIDY "${CLANG_TIDY_EXECUTABLE}") endif() +# ***************************************************************************************** +# delayload code +# ***************************************************************************************** +if (WIN32) + # This is a superset of all the delayloads needed for chrome.exe, chrome.dll, + # and chrome_elf.dll. The linker will automatically ignore anything which is not + # linked to the binary at all (it is harmless to have an unmatched /delayload). + # + # We delayload most libraries as the dlls are simply not required at startup (or + # at all, depending on the process type). In unsandboxed process they will load + # when first needed. + # + # Some dlls open handles when they are loaded, and we may not want them to be + # loaded in renderers or other sandboxed processes. Conversely, some dlls must + # be loaded before sandbox lockdown. + # + # Some dlls themselves load others - in particular, to avoid unconditionally + # loading user32.dll - we require that the following dlls are all delayloaded: + # user32, gdi32, comctl32, comdlg32, cryptui, d3d9, dwmapi, imm32, msi, ole32, + # oleacc, rstrtmgr, shell32, shlwapi, and uxtheme. + # + # Advapi32.dll is unconditionally loaded at process startup on Windows 10, but + # on Windows 11 it is not, which makes it worthwhile to delay load it. + # Additionally, advapi32.dll exports several functions that are forwarded to + # other DLLs such as cryptbase.dll. If calls to those functions are present but + # there are some processes where the functions are never called then delay + # loading of advapi32.dll avoids pulling in those DLLs (such as cryptbase.dll) + # unnecessarily, even if advapi32.dll itself is loaded. + if (MSVC) + set(DELAY_LDFLAGS + "/DELAYLOAD:api-ms-win-core-synch-l1-2-0.dll" + "/DELAYLOAD:api-ms-win-core-winrt-error-l1-1-0.dll" + "/DELAYLOAD:api-ms-win-core-winrt-l1-1-0.dll" + "/DELAYLOAD:api-ms-win-core-winrt-string-l1-1-0.dll" + "/DELAYLOAD:advapi32.dll" + "/DELAYLOAD:comctl32.dll" + "/DELAYLOAD:comdlg32.dll" + "/DELAYLOAD:credui.dll" + "/DELAYLOAD:cryptui.dll" + "/DELAYLOAD:d3d11.dll" + "/DELAYLOAD:d3d12.dll" + "/DELAYLOAD:d3d9.dll" + "/DELAYLOAD:dwmapi.dll" + "/DELAYLOAD:dxgi.dll" + "/DELAYLOAD:dxva2.dll" + "/DELAYLOAD:esent.dll" + "/DELAYLOAD:fontsub.dll" + "/DELAYLOAD:gdi32.dll" + "/DELAYLOAD:hid.dll" + "/DELAYLOAD:imagehlp.dll" + "/DELAYLOAD:imm32.dll" + "/DELAYLOAD:msi.dll" + "/DELAYLOAD:netapi32.dll" + "/DELAYLOAD:ncrypt.dll" + "/DELAYLOAD:ole32.dll" + "/DELAYLOAD:oleacc.dll" + "/DELAYLOAD:pdh.dll" + "/DELAYLOAD:propsys.dll" + "/DELAYLOAD:psapi.dll" + "/DELAYLOAD:rpcrt4.dll" + "/DELAYLOAD:rstrtmgr.dll" + "/DELAYLOAD:setupapi.dll" + "/DELAYLOAD:shell32.dll" + "/DELAYLOAD:shlwapi.dll" + "/DELAYLOAD:uiautomationcore.dll" + "/DELAYLOAD:urlmon.dll" + "/DELAYLOAD:user32.dll" + "/DELAYLOAD:usp10.dll" + "/DELAYLOAD:uxtheme.dll" + "/DELAYLOAD:wer.dll" + "/DELAYLOAD:wevtapi.dll" + "/DELAYLOAD:wininet.dll" + "/DELAYLOAD:winusb.dll" + "/DELAYLOAD:wsock32.dll" + "/DELAYLOAD:wtsapi32.dll" + + "/DELAYLOAD:crypt32.dll" + "/DELAYLOAD:dbghelp.dll" + "/DELAYLOAD:dhcpcsvc.dll" + "/DELAYLOAD:dwrite.dll" + "/DELAYLOAD:iphlpapi.dll" + "/DELAYLOAD:oleaut32.dll" + "/DELAYLOAD:secur32.dll" + "/DELAYLOAD:userenv.dll" + "/DELAYLOAD:winhttp.dll" + "/DELAYLOAD:winmm.dll" + "/DELAYLOAD:winspool.drv" + "/DELAYLOAD:wintrust.dll" + "/DELAYLOAD:ws2_32.dll" + "/DELAYLOAD:mswsock.dll" + ) + add_link_options(${DELAY_LDFLAGS}) + endif() + if (MINGW AND USE_LLD) + set(DELAY_LDFLAGS + "-Wl,--delayload=api-ms-win-core-synch-l1-2-0.dll" + "-Wl,--delayload=api-ms-win-core-winrt-error-l1-1-0.dll" + "-Wl,--delayload=api-ms-win-core-winrt-l1-1-0.dll" + "-Wl,--delayload=api-ms-win-core-winrt-string-l1-1-0.dll" + "-Wl,--delayload=advapi32.dll" + "-Wl,--delayload=comctl32.dll" + "-Wl,--delayload=comdlg32.dll" + "-Wl,--delayload=credui.dll" + "-Wl,--delayload=cryptui.dll" + "-Wl,--delayload=d3d11.dll" + "-Wl,--delayload=d3d12.dll" + "-Wl,--delayload=d3d9.dll" + "-Wl,--delayload=dwmapi.dll" + "-Wl,--delayload=dxgi.dll" + "-Wl,--delayload=dxva2.dll" + "-Wl,--delayload=esent.dll" + "-Wl,--delayload=fontsub.dll" + "-Wl,--delayload=gdi32.dll" + "-Wl,--delayload=hid.dll" + "-Wl,--delayload=imagehlp.dll" + "-Wl,--delayload=imm32.dll" + "-Wl,--delayload=msi.dll" + "-Wl,--delayload=netapi32.dll" + "-Wl,--delayload=ncrypt.dll" + "-Wl,--delayload=ole32.dll" + "-Wl,--delayload=oleacc.dll" + "-Wl,--delayload=pdh.dll" + "-Wl,--delayload=propsys.dll" + "-Wl,--delayload=psapi.dll" + "-Wl,--delayload=rpcrt4.dll" + "-Wl,--delayload=rstrtmgr.dll" + "-Wl,--delayload=setupapi.dll" + "-Wl,--delayload=shell32.dll" + "-Wl,--delayload=shlwapi.dll" + "-Wl,--delayload=uiautomationcore.dll" + "-Wl,--delayload=urlmon.dll" + "-Wl,--delayload=user32.dll" + "-Wl,--delayload=usp10.dll" + "-Wl,--delayload=uxtheme.dll" + "-Wl,--delayload=wer.dll" + "-Wl,--delayload=wevtapi.dll" + "-Wl,--delayload=wininet.dll" + "-Wl,--delayload=winusb.dll" + "-Wl,--delayload=wsock32.dll" + "-Wl,--delayload=wtsapi32.dll" + + "-Wl,--delayload=crypt32.dll" + "-Wl,--delayload=dbghelp.dll" + "-Wl,--delayload=dhcpcsvc.dll" + "-Wl,--delayload=dwrite.dll" + "-Wl,--delayload=iphlpapi.dll" + "-Wl,--delayload=oleaut32.dll" + "-Wl,--delayload=secur32.dll" + "-Wl,--delayload=userenv.dll" + "-Wl,--delayload=winhttp.dll" + "-Wl,--delayload=winmm.dll" + "-Wl,--delayload=winspool.drv" + "-Wl,--delayload=wintrust.dll" + "-Wl,--delayload=ws2_32.dll" + "-Wl,--delayload=mswsock.dll" + ) + add_link_options(${DELAY_LDFLAGS}) + endif() + + # https://docs.microsoft.com/en-us/cpp/build/reference/understanding-the-helper-function?view=msvc-170 + # see chrome/app/delay_load_failure_hook_win.cc + add_library(delayload_hook STATIC src/delay_load_failure_hook_win.cc) + link_libraries(delayload_hook) +endif() + # ***************************************************************************************** # Source code # ***************************************************************************************** @@ -4323,12 +4528,30 @@ if (GUI) src/ios/utils.mm src/ios/utils.cpp src/ios/main.mm) + elseif(GUI_FLAVOUR STREQUAL "qt6") + file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/src/qt6/yass.qrc + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/src/freedesktop/yass.png + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/images) + list(APPEND SRC_FILES + src/qt6/yass_window.hpp + src/qt6/yass_window.cpp + src/qt6/yass.hpp + src/qt6/yass.cpp + src/qt6/option_dialog.hpp + src/qt6/option_dialog.cpp + src/qt6/tray_icon.hpp + src/qt6/tray_icon.cpp + src/freedesktop/utils.cpp + ${CMAKE_CURRENT_BINARY_DIR}/yass.qrc + ) elseif(GUI_FLAVOUR STREQUAL "gtk3") list(APPEND SRC_FILES src/gtk/yass.cpp src/gtk/yass_window.cpp src/gtk/option_dialog.cpp src/gtk/utils_gtk.cpp + src/freedesktop/utils.cpp ) include(CompilePo) create_po_target(yass en src/gtk/yass_en.po) @@ -4349,7 +4572,9 @@ if (GUI) src/gtk4/yass.cpp src/gtk4/yass_window.cpp src/gtk4/option_dialog.cpp - src/gtk/utils_gtk.cpp) + src/gtk/utils_gtk.cpp + src/freedesktop/utils.cpp + ) # HOLDPLACE for TODO gettext support include(CompilePo) create_po_target(yass en src/gtk4/yass_en.po) @@ -4380,6 +4605,33 @@ if (GUI) target_link_libraries(${APP_NAME} PRIVATE tun2proxy) set_target_properties(${APP_NAME} PROPERTIES LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/src/harmony/export.lds -u RegisterEntryModule") + elseif(GUI_FLAVOUR STREQUAL "qt6") + add_executable(${APP_NAME} + ${SRC_FILES} + ${GUI_USE_FILE} + ) + if (NOT CMAKE_CROSSCOMPILING AND TARGET Qt::lupdate) + file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/qt6/lang/yass_*.ts") + # Custom target to update .ts files and include new strings from source files + # Depends on Qt's LinguistTools + get_target_property(QT_LUPDATE_EXECUTABLE Qt::lupdate IMPORTED_LOCATION) + add_custom_target(update-ts + COMMAND ${QT_LUPDATE_EXECUTABLE} -extensions cc,cpp,hpp + -locations none + -I "${CMAKE_CURRENT_SOURCE_DIR}/src" + "${CMAKE_CURRENT_SOURCE_DIR}/src/qt6" + -ts ${TS_FILES} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/qt6" + VERBATIM + COMMAND_EXPAND_LISTS) + # Based on https://gist.github.com/giraldeau/546ba5512a74dfe9d8ea0862d66db412 + set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/src/qt6/lang") + qt_add_translation(QM_FILES ${TS_FILES} OPTIONS -removeidentical -silent) + target_sources(${APP_NAME} PRIVATE ${QM_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/src/qt6/lang/lang.qrc") + else() + file(GLOB QM_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/qt6/lang/yass_*.qm") + target_sources(${APP_NAME} PRIVATE ${QM_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/src/qt6/lang/lang.qrc") + endif() else() add_executable(${APP_NAME} WIN32 ${GUI_OPTIONS} ${SRC_FILES} @@ -4410,6 +4662,14 @@ if (GUI) elseif(GUI_FLAVOUR STREQUAL "ios") target_include_directories(${APP_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/ios) + elseif(GUI_FLAVOUR STREQUAL "qt6") + target_include_directories(${APP_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src/qt6) + set_target_properties( + ${APP_NAME} + PROPERTIES AUTOMOC ON + AUTOUIC ON + AUTORCC ON) elseif(GUI_FLAVOUR STREQUAL "gtk3") target_include_directories(${APP_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk) @@ -4435,87 +4695,6 @@ if (GUI) yass_core ) - if (GUI_FLAVOUR STREQUAL "windows" AND MSVC) - # Most of the dlls are simply not required at startup (or at all, depending - # on how the browser is used). The following dlls are interconnected and need to - # be delayloaded together to ensure user32 does not load too early or at all, - # depending on the process type: user32, gdi32, comctl32, comdlg32, cryptui, - # d3d9, dwmapi, imm32, msi, ole32, oleacc, rstrtmgr, shell32, shlwapi, and - # uxtheme. - set (DELAY_LDFLAGS - "/DELAYLOAD:api-ms-win-core-winrt-error-l1-1-0.dll" - "/DELAYLOAD:api-ms-win-core-winrt-l1-1-0.dll" - "/DELAYLOAD:api-ms-win-core-winrt-string-l1-1-0.dll" - "/DELAYLOAD:comctl32.dll" - "/DELAYLOAD:comdlg32.dll" - "/DELAYLOAD:credui.dll" - "/DELAYLOAD:cryptui.dll" - "/DELAYLOAD:d3d11.dll" - "/DELAYLOAD:d3d9.dll" - "/DELAYLOAD:dwmapi.dll" - "/DELAYLOAD:dxgi.dll" - "/DELAYLOAD:dxva2.dll" - "/DELAYLOAD:esent.dll" - "/DELAYLOAD:gdi32.dll" - "/DELAYLOAD:hid.dll" - "/DELAYLOAD:imagehlp.dll" - "/DELAYLOAD:imm32.dll" - "/DELAYLOAD:msi.dll" - "/DELAYLOAD:netapi32.dll" - "/DELAYLOAD:ncrypt.dll" - "/DELAYLOAD:ole32.dll" - "/DELAYLOAD:oleacc.dll" - "/DELAYLOAD:propsys.dll" - "/DELAYLOAD:psapi.dll" - "/DELAYLOAD:rpcrt4.dll" - "/DELAYLOAD:rstrtmgr.dll" - "/DELAYLOAD:setupapi.dll" - "/DELAYLOAD:shell32.dll" - "/DELAYLOAD:shlwapi.dll" - "/DELAYLOAD:urlmon.dll" - "/DELAYLOAD:user32.dll" - "/DELAYLOAD:usp10.dll" - "/DELAYLOAD:uxtheme.dll" - "/DELAYLOAD:wer.dll" - "/DELAYLOAD:wevtapi.dll" - "/DELAYLOAD:wininet.dll" - "/DELAYLOAD:winusb.dll" - "/DELAYLOAD:wsock32.dll" - "/DELAYLOAD:wtsapi32.dll" - - "/DELAYLOAD:advapi32.dll" - "/DELAYLOAD:crypt32.dll" - "/DELAYLOAD:dbghelp.dll" - "/DELAYLOAD:dhcpcsvc.dll" - "/DELAYLOAD:dwrite.dll" - "/DELAYLOAD:iphlpapi.dll" - "/DELAYLOAD:oleaut32.dll" - "/DELAYLOAD:secur32.dll" - "/DELAYLOAD:uiautomationcore.dll" - "/DELAYLOAD:userenv.dll" - "/DELAYLOAD:winhttp.dll" - "/DELAYLOAD:winmm.dll" - "/DELAYLOAD:winspool.drv" - "/DELAYLOAD:wintrust.dll" - "/DELAYLOAD:ws2_32.dll" - ) - # TODO implement own delay load helper - # https://docs.microsoft.com/en-us/cpp/build/reference/understanding-the-helper-function?view=msvc-170 - # __pfnDliFailureHook2: Delay load failure hook that generates a crash report. By default a failure - # to delay load will trigger an exception handled by the delay load runtime and - # this won't generate a crash report. - # https://docs.microsoft.com/en-us/cpp/build/reference/failure-hooks?view=vs-2019 - # __pfnDliNotifyHook2: verify if loaded libraries are allowed - # FIXME it seems delay loader's delayimp library isn't be found correctly - # when it comes with static CRT build. - string(REPLACE ";" " " DELAY_LDFLAGS "${DELAY_LDFLAGS}") - set_target_properties(${APP_NAME} PROPERTIES - LINK_FLAGS "${DELAY_LDFLAGS}") - - # enforce default delayload implementation - target_link_libraries(${APP_NAME} PUBLIC delayimp) - endif() - if (GUI_FLAVOUR STREQUAL "windows" AND MSVC) set_target_properties(${APP_NAME} PROPERTIES COMPILE_PDB_NAME ${APP_NAME} @@ -4802,24 +4981,24 @@ if (GUI) install(TARGETS ${APP_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() - if (GUI_FLAVOUR STREQUAL "gtk3" OR GUI_FLAVOUR STREQUAL "gtk4") + if (GUI_FLAVOUR STREQUAL "qt6" OR GUI_FLAVOUR STREQUAL "gtk3" OR GUI_FLAVOUR STREQUAL "gtk4") install(FILES - ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/it.gui.yass.desktop + ${CMAKE_CURRENT_SOURCE_DIR}/src/freedesktop/it.gui.yass.desktop DESTINATION share/applications) install(FILES - ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/yass.png + ${CMAKE_CURRENT_SOURCE_DIR}/src/freedesktop/yass.png DESTINATION share/pixmaps) install(DIRECTORY - ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/icons/16x16 - ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/icons/22x22 - ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/icons/24x24 - ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/icons/32x32 - ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/icons/48x48 - ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/icons/128x128 - ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/icons/256x256 - ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/icons/512x512 + ${CMAKE_CURRENT_SOURCE_DIR}/src/freedesktop/icons/16x16 + ${CMAKE_CURRENT_SOURCE_DIR}/src/freedesktop/icons/22x22 + ${CMAKE_CURRENT_SOURCE_DIR}/src/freedesktop/icons/24x24 + ${CMAKE_CURRENT_SOURCE_DIR}/src/freedesktop/icons/32x32 + ${CMAKE_CURRENT_SOURCE_DIR}/src/freedesktop/icons/48x48 + ${CMAKE_CURRENT_SOURCE_DIR}/src/freedesktop/icons/128x128 + ${CMAKE_CURRENT_SOURCE_DIR}/src/freedesktop/icons/256x256 + ${CMAKE_CURRENT_SOURCE_DIR}/src/freedesktop/icons/512x512 DESTINATION share/icons/hicolor) endif() endif() diff --git a/yass/CRASHPAD_COMMIT b/yass/CRASHPAD_COMMIT index 243eed00ce..fa43ea9b08 100644 --- a/yass/CRASHPAD_COMMIT +++ b/yass/CRASHPAD_COMMIT @@ -1 +1 @@ -1174aa4fc3196f478b5b4b77fc970d1cb85cb7cf \ No newline at end of file +6af42bc0b22b732fdcebe9f706204e5fb229b209 \ No newline at end of file diff --git a/yass/Makefile b/yass/Makefile index 4bff56eef2..a35da50ea9 100644 --- a/yass/Makefile +++ b/yass/Makefile @@ -1,5 +1,6 @@ SRC_DIR := src SRC_FILES := $(wildcard $(SRC_DIR)/*.mm) +SRC_FILES := $(wildcard $(SRC_DIR)/*.cc) SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp) SRC_FILES += $(wildcard $(SRC_DIR)/*.hpp) SRC_FILES += $(wildcard $(SRC_DIR)/android/*.cpp) @@ -13,10 +14,14 @@ SRC_FILES += $(wildcard $(SRC_DIR)/core/*.cpp) SRC_FILES += $(wildcard $(SRC_DIR)/core/*.hpp) SRC_FILES += $(wildcard $(SRC_DIR)/crypto/*.cpp) SRC_FILES += $(wildcard $(SRC_DIR)/crypto/*.hpp) +SRC_FILES += $(wildcard $(SRC_DIR)/freedesktop/*.cpp) +SRC_FILES += $(wildcard $(SRC_DIR)/freedesktop/*.hpp) SRC_FILES += $(wildcard $(SRC_DIR)/gtk/*.cpp) SRC_FILES += $(wildcard $(SRC_DIR)/gtk/*.hpp) SRC_FILES += $(wildcard $(SRC_DIR)/gtk4/*.cpp) SRC_FILES += $(wildcard $(SRC_DIR)/gtk4/*.hpp) +SRC_FILES += $(wildcard $(SRC_DIR)/qt6/*.cpp) +SRC_FILES += $(wildcard $(SRC_DIR)/qt6/*.hpp) SRC_FILES += $(wildcard $(SRC_DIR)/harmony/*.cpp) SRC_FILES += $(wildcard $(SRC_DIR)/harmony/*.hpp) SRC_FILES += $(wildcard $(SRC_DIR)/i18n/*.cpp) diff --git a/yass/PACKAGING.md b/yass/PACKAGING.md new file mode 100644 index 0000000000..56b149725b --- /dev/null +++ b/yass/PACKAGING.md @@ -0,0 +1,80 @@ +# Packaging Instruments + +## Prerequisite +In addition, make sure you have these packages INSTALLED on your system. +- MinGW: [NSIS] and [7Zip] +- MSVC: [NSIS], [7Zip] and [wixtoolset][wix3] (put installation path in PATH environment variable) +- macOS: [Xcode] +- Debian: fakeroot devscripts debhelper clang +- Fedora and Fedora-like: rpm-build rpm-devel rpmlint rpmdevtools clang + +## Windows (MinGW)/Packaging + +Run in `Git Bash` in Start Menu: +``` +./scripts/build-mingw.sh +``` + +## Windows (MSVC)/Packaging + +Run `x64 Native Tools Command Prompt for VS 2019 (or 2022)` in Start Menu: +``` +cd tools +go build +cd .. +./tools/build +``` + +## macOS/Packaging + +Run in `Terminal`: +``` +cd tools +go build +cd .. +./tools/build +``` + +## Debian/Packaging + +Generate Packages under parent directory +``` +export CC=clang +export CXX=clang++ +./scripts/build-deb.sh +``` + +## Fedora/RHEL/CentOS/AlmaLinux/Rocky Linux Packaging + +Generate Packages under current directory +``` +export CC=clang +export CXX=clang++ +./scripts/build-rpm.sh +``` + +## FreeBSD/Packaging + +Generate Packages under current directory +``` +cd tools +go build +cd .. +./tools/build +``` + +## Android/Packaging +See [android's README.md](android/README.md) + +## HarmonyOS/Packaging +See [harmonyOS's README.md](harmony/README.md) + +## iOS/Packaging +Make sure you have [Xcode] installed on your system. + +TBD + +[NSIS]: https://nsis.sourceforge.io/Download +[7Zip]: https://www.7-zip.org/ +[wix3]: https://wixtoolset.org/docs/wix3/ +[Xcode]: https://apps.apple.com/us/app/xcode/id497799835?mt=12 diff --git a/yass/README.md b/yass/README.md index 2cd28b266f..6028b7d2dc 100644 --- a/yass/README.md +++ b/yass/README.md @@ -5,10 +5,13 @@ [![GitHub release (latest by SemVer)](https://img.shields.io/github/downloads/Chilledheart/yass/latest/total)](https://github.com/Chilledheart/yass/releases/latest) [![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/Chilledheart/yass)](https://github.com/Chilledheart/yass/releases) -[![aur yass-proxy](https://img.shields.io/aur/version/yass-proxy)](https://aur.archlinux.org/packages/yass-proxy) -[![aur yass-proxy-cli](https://img.shields.io/aur/version/yass-proxy-cli)](https://aur.archlinux.org/packages/yass-proxy-cli) [![homebrew cask](https://img.shields.io/homebrew/cask/v/yass)](https://formulae.brew.sh/cask/yass) +[![aur yass-proxy](https://img.shields.io/aur/version/yass-proxy)](https://aur.archlinux.org/packages/yass-proxy) +[![aur yass-proxy-gtk3](https://img.shields.io/aur/version/yass-proxy-gtk3)](https://aur.archlinux.org/packages/yass-proxy-gtk3) +[![aur yass-proxy-qt6](https://img.shields.io/aur/version/yass-proxy-qt6)](https://aur.archlinux.org/packages/yass-proxy-qt6) +[![aur yass-proxy-cli](https://img.shields.io/aur/version/yass-proxy-cli)](https://aur.archlinux.org/packages/yass-proxy-cli) + yass is an efficient forward proxy client supporting http/socks4/socks4a/socks5 protocol running on PC and mobile devices. ## License @@ -30,7 +33,7 @@ See [Protecting Chrome Traffic with Hybrid Kyber KEM](https://blog.chromium.org/ ### Prebuilt binaries - Android [download apk](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-android-release-arm64-1.10.4.apk) or [download 32-bit apk](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-android-release-arm-1.10.4.apk) - iOS [join via TestFlight](https://testflight.apple.com/join/6AkiEq09) -- Windows [download installer](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-mingw-win7-release-x86_64-1.10.4-system-installer.exe) or [download 32-bit installer](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-mingw-winxp-release-i686-1.10.4-system-installer.exe) [(require vc 2010 runtime)][vs2010_x86] or [download woa arm64 installer](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-mingw-release-aarch64-1.10.4-system-installer.exe) +- Windows [download installer](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-mingw-win7-release-x86_64-1.10.4-system-installer.exe) [(require KB2999226 below windows 10)][KB2999226] or [download 32-bit installer](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-mingw-winxp-release-i686-1.10.4-system-installer.exe) [(require vc 2010 runtime)][vs2010_x86] or [download woa arm64 installer](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-mingw-release-aarch64-1.10.4-system-installer.exe) - macOS [download intel dmg](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-macos-release-x64-1.10.4.dmg) or [download apple silicon dmg](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-macos-release-arm64-1.10.4.dmg) > via homebrew: `brew install --cask yass` - Linux [download rpm](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass.el7.x86_64.1.10.4.rpm) or [download deb](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-ubuntu-16.04-xenial_amd64.1.10.4.deb) @@ -107,4 +110,5 @@ See more at manpage _yass_server(1)_ See [Server Usage](https://github.com/Chilledheart/yass/wiki/Usage:-server-setup) for more. [license-link]: LICENSE +[KB2999226]: https://support.microsoft.com/en-us/topic/update-for-universal-c-runtime-in-windows-c0514201-7fe6-95a3-b0a5-287930f3560c [vs2010_x86]: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe diff --git a/yass/cmake/platforms/Android.cmake b/yass/cmake/platforms/Android.cmake index e90f4c5103..3babd0e5a3 100644 --- a/yass/cmake/platforms/Android.cmake +++ b/yass/cmake/platforms/Android.cmake @@ -22,3 +22,12 @@ set(CMAKE_SYSROOT "${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${ANDROID_CURREN set(CMAKE_CXX_COMPILE_OBJECT " -o -c -nostdinc++") string(APPEND CMAKE_CXX_STANDARD_LIBRARIES " -nostdlib++") + +# target environment on the build host system +set(CMAKE_FIND_ROOT_PATH "${CMAKE_SYSROOT}") + +# modify default behavior of FIND_XXX() commands +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/yass/cmake/platforms/FreeBSD.cmake b/yass/cmake/platforms/FreeBSD.cmake index fa48b700d3..5cf3f4bcf9 100644 --- a/yass/cmake/platforms/FreeBSD.cmake +++ b/yass/cmake/platforms/FreeBSD.cmake @@ -12,3 +12,12 @@ set(CMAKE_RANLIB "${LLVM_SYSROOT}/bin/llvm-ranlib" CACHE FILEPATH "") set(CMAKE_CXX_COMPILER_RANLIB "${LLVM_SYSROOT}/bin/llvm-ranlib" CACHE FILEPATH "") set(CMAKE_SYSROOT "${GCC_SYSROOT}" CACHE STRING "") + +# target environment on the build host system +set(CMAKE_FIND_ROOT_PATH "${GCC_SYSROOT}") + +# modify default behavior of FIND_XXX() commands +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/yass/cmake/platforms/Linux.cmake b/yass/cmake/platforms/Linux.cmake index c71144eafa..17d5c147fa 100644 --- a/yass/cmake/platforms/Linux.cmake +++ b/yass/cmake/platforms/Linux.cmake @@ -29,3 +29,12 @@ set(CMAKE_C_FLAGS "${_CMAKE_C_FLAGS_INITIAL} ${COMPILE_FLAGS}" CACHE STRING "" F set(_CMAKE_CXX_FLAGS_INITIAL "${CMAKE_CXX_FLAGS}" CACHE STRING "") set(CMAKE_CXX_FLAGS "${_CMAKE_CXX_FLAGS_INITIAL} ${COMPILE_FLAGS}" CACHE STRING "" FORCE) + +# target environment on the build host system +set(CMAKE_FIND_ROOT_PATH ${GCC_SYSROOT}) + +# modify default behavior of FIND_XXX() commands +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/yass/cmake/platforms/MinGW.cmake b/yass/cmake/platforms/MinGW.cmake index 72eb9535c7..11bdbca792 100644 --- a/yass/cmake/platforms/MinGW.cmake +++ b/yass/cmake/platforms/MinGW.cmake @@ -38,7 +38,6 @@ else() set(CMAKE_SYSROOT "${MINGW_SYSROOT}/${GCC_TARGET}" CACHE STRING "") endif() - # target environment on the build host system set(CMAKE_FIND_ROOT_PATH ${LLVM_SYSROOT}/${GCC_TARGET}) @@ -46,3 +45,4 @@ set(CMAKE_FIND_ROOT_PATH ${LLVM_SYSROOT}/${GCC_TARGET}) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/yass/cmake/platforms/WinMsvc.cmake b/yass/cmake/platforms/WinMsvc.cmake index 039151cc91..a6a86307e0 100644 --- a/yass/cmake/platforms/WinMsvc.cmake +++ b/yass/cmake/platforms/WinMsvc.cmake @@ -341,6 +341,11 @@ set(CMAKE_CXX_STANDARD_LIBRARIES "" CACHE STRING "" FORCE) # where is the target environment set (CMAKE_FIND_ROOT_PATH "${WINSDK_BASE}") +# modify default behavior of FIND_XXX() commands +set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set (CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set (CMAKE_SYSTEM_INCLUDE_PATH "${ATLMFC_INCLUDE}" "${MSVC_INCLUDE}" diff --git a/yass/debian/changelog b/yass/debian/changelog index ee7f99e78d..63c6c5264f 100644 --- a/yass/debian/changelog +++ b/yass/debian/changelog @@ -1,3 +1,9 @@ +yass (1.10.5-1) UNRELEASED; urgency=medium + + * miscellaneous fixes + * fix gtk3 wayland app icon issue + + -- Chilledheart Mon, 3 Jun 2024 12:03:18 +0800 yass (1.10.4-1) UNRELEASED; urgency=medium * miscellaneous fixes diff --git a/yass/scripts/build-mingw.sh b/yass/scripts/build-mingw.sh index 01342ef943..639736e992 100755 --- a/yass/scripts/build-mingw.sh +++ b/yass/scripts/build-mingw.sh @@ -9,6 +9,10 @@ MACHINE=$(uname -m) WITH_CPU=${WITH_CPU:-${MACHINE}} +LLVM_MINGW_VER=20240518 +NASM_VER=2.16.03 +NSIS_VER=3.10 + case "$WITH_CPU" in x86|i586|i686) WITH_CPU="i686" @@ -23,34 +27,34 @@ esac case "$ARCH" in MINGW*|MSYS*) - if [ ! -d third_party/llvm-mingw-20231128-ucrt-${MACHINE} ]; then + if [ ! -d third_party/llvm-mingw-${LLVM_MINGW_VER}-ucrt-${MACHINE} ]; then pushd third_party - curl -C - -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20231128/llvm-mingw-20231128-ucrt-${MACHINE}.zip - "/c/Program Files/7-Zip/7z.exe" x llvm-mingw-20231128-ucrt-${MACHINE}.zip -aoa - rm -f llvm-mingw-20231128-ucrt-${MACHINE}.zip + curl -C - -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/${LLVM_MINGW_VER}/llvm-mingw-${LLVM_MINGW_VER}-ucrt-${MACHINE}.zip + "/c/Program Files/7-Zip/7z.exe" x llvm-mingw-${LLVM_MINGW_VER}-ucrt-${MACHINE}.zip -aoa + rm -f llvm-mingw-${LLVM_MINGW_VER}-ucrt-${MACHINE}.zip popd fi - LLVM_BASE="$PWD/third_party/llvm-mingw-20231128-ucrt-${MACHINE}" + LLVM_BASE="$PWD/third_party/llvm-mingw-${LLVM_MINGW_VER}-ucrt-${MACHINE}" ;; Linux) - if [ ! -d third_party/llvm-mingw-20231128-ucrt-ubuntu-20.04-${MACHINE} ]; then + if [ ! -d third_party/llvm-mingw-${LLVM_MINGW_VER}-ucrt-ubuntu-20.04-${MACHINE} ]; then pushd third_party - curl -C - -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20231128/llvm-mingw-20231128-ucrt-ubuntu-20.04-${MACHINE}.tar.xz - tar -xf llvm-mingw-20231128-ucrt-ubuntu-20.04-${MACHINE}.tar.xz - rm -f llvm-mingw-20231128-ucrt-ubuntu-20.04-${MACHINE}.tar.xz + curl -C - -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/${LLVM_MINGW_VER}/llvm-mingw-${LLVM_MINGW_VER}-ucrt-ubuntu-20.04-${MACHINE}.tar.xz + tar -xf llvm-mingw-${LLVM_MINGW_VER}-ucrt-ubuntu-20.04-${MACHINE}.tar.xz + rm -f llvm-mingw-${LLVM_MINGW_VER}-ucrt-ubuntu-20.04-${MACHINE}.tar.xz popd fi - LLVM_BASE="$PWD/third_party/llvm-mingw-20231128-ucrt-ubuntu-20.04-${MACHINE}" + LLVM_BASE="$PWD/third_party/llvm-mingw-${LLVM_MINGW_VER}-ucrt-ubuntu-20.04-${MACHINE}" ;; Darwin) - if [ ! -d third_party/llvm-mingw-20231128-ucrt-macos-universal ]; then + if [ ! -d third_party/llvm-mingw-${LLVM_MINGW_VER}-ucrt-macos-universal ]; then pushd third_party - curl -C - -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20231128/llvm-mingw-20231128-ucrt-macos-universal.tar.xz - tar -xf llvm-mingw-20231128-ucrt-macos-universal.tar.xz - rm -f llvm-mingw-20231128-ucrt-macos-universal.tar.xz + curl -C - -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/${LLVM_MINGW_VER}/llvm-mingw-${LLVM_MINGW_VER}-ucrt-macos-universal.tar.xz + tar -xf llvm-mingw-${LLVM_MINGW_VER}-ucrt-macos-universal.tar.xz + rm -f llvm-mingw-${LLVM_MINGW_VER}-ucrt-macos-universal.tar.xz popd fi - LLVM_BASE="$PWD/third_party/llvm-mingw-20231128-ucrt-macos-universal" + LLVM_BASE="$PWD/third_party/llvm-mingw-${LLVM_MINGW_VER}-ucrt-macos-universal" ;; *) echo "Unsupported OS ${ARCH}" @@ -58,6 +62,39 @@ case "$ARCH" in ;; esac +case "$ARCH" in + MINGW*|MSYS*) + if [ ! -d third_party/nasm ]; then + pushd third_party + curl -C - -L -O "https://www.nasm.us/pub/nasm/releasebuilds/${NASM_VER}/win64/nasm-${NASM_VER}-win64.zip" + "/c/Program Files/7-Zip/7z.exe" x nasm-${NASM_VER}-win64.zip -aoa + rm -rf nasm + mv -f nasm-${NASM_VER} nasm + rm -f nasm-${NASM_VER}-win64.zip + popd + fi + if [ ! -d third_party/nsis ]; then + pushd third_party + curl -C - -L -o nsis-${NSIS_VER}.zip "https://sourceforge.net/projects/nsis/files/NSIS%203/${NSIS_VER}/nsis-${NSIS_VER}.zip/download" + "/c/Program Files/7-Zip/7z.exe" x nsis-${NSIS_VER}.zip -aoa + rm -rf nsis + mv -f nsis-${NSIS_VER} nsis + rm -f nsis-${NSIS_VER}.zip + popd + fi + ;; + *) + NASM_EXE="$(which nasm)" + if [ -z "$NASM_EXE" ]; then + echo "nasm is required but not found in PATH" + fi + NSIS_EXE="$(which makensis)" + if [ -z "$NSIS_EXE" ]; then + echo "nsis is required but not found in PATH" + fi + ;; +esac + pushd tools go build popd diff --git a/yass/scripts/build-src.sh b/yass/scripts/build-src.sh index a78e3ac3e8..06f1291072 100755 --- a/yass/scripts/build-src.sh +++ b/yass/scripts/build-src.sh @@ -30,6 +30,7 @@ rm -f yass-${VERSION}.tar yass-${VERSION}.tar.gz yass-${VERSION}.tar.bz2 gzip -9 --keep yass-${VERSION}.tar bzip2 -9 --keep yass-${VERSION}.tar +zstd -T0 -19 -f --keep yass-${VERSION}.tar rm -f yass-${VERSION}.tar @@ -42,16 +43,16 @@ rm -f yass-${VERSION}.tar echo "md5sum " echo "======================================================================" -md5sum *.tar.gz *.tar.bz2 *.zip +md5sum *.tar.gz *.tar.bz2 *.tar.zst *.zip echo "sha1sum " echo "======================================================================" -sha1sum *.tar.gz *.tar.bz2 *.zip +sha1sum *.tar.gz *.tar.bz2 *.tar.zst *.zip echo "sha256sum " echo "======================================================================" -sha256sum *.tar.gz *.tar.bz2 *.zip +sha256sum *.tar.gz *.tar.bz2 *.tar.zst *.zip echo "sha512sum " echo "======================================================================" -sha512sum *.tar.gz *.tar.bz2 *.zip +sha512sum *.tar.gz *.tar.bz2 *.tar.zst *.zip diff --git a/yass/scripts/download-clang-prebuilt-binaries.py b/yass/scripts/download-clang-prebuilt-binaries.py index 04eff970e2..8f1290b82e 100755 --- a/yass/scripts/download-clang-prebuilt-binaries.py +++ b/yass/scripts/download-clang-prebuilt-binaries.py @@ -102,19 +102,13 @@ def main(): f'clang-{clang_revision}-{clang_arch}.tgz') download_url(f'https://commondatastorage.googleapis.com/chromium-browser-clang/{clang_arch}/clang-tidy-{clang_revision}.tgz', f'clang-tidy-{clang_revision}-{clang_arch}.tgz') - download_url(f'https://commondatastorage.googleapis.com/chromium-browser-clang/{clang_arch}/libclang-{clang_revision}.tgz', - f'libclang-{clang_revision}-{clang_arch}.tgz') - download_url(f'https://commondatastorage.googleapis.com/chromium-browser-clang/{clang_arch}/clangd-{clang_revision}.tgz', - f'clangd-{clang_revision}-{clang_arch}.tgz') extract_tarfile(f'clang-{clang_revision}-{clang_arch}.tgz') extract_tarfile(f'clang-tidy-{clang_revision}-{clang_arch}.tgz') - extract_tarfile(f'libclang-{clang_revision}-{clang_arch}.tgz') - extract_tarfile(f'clangd-{clang_revision}-{clang_arch}.tgz') # create a shim to lld-link os.chdir('bin') if platform.system() == 'Windows': - write_output(['clang-cl.exe', '..\..\..\..\scripts\llvm-lib.c', '/DWIN32', + write_output(['clang-cl.exe', '..\\..\\..\\..\\scripts\\llvm-lib.c', '/DWIN32', '/DWIN32_LEAN_AND_MEAN', '/D_UNICODE', '/DUNICODE', '/MT', '/O2', '/Ob2', '/DNDEBUG', 'shell32.lib'], check=True) else: diff --git a/yass/scripts/download-toolchain.bat b/yass/scripts/download-toolchain.bat index 54e214cfa2..08e1cd7d81 100644 --- a/yass/scripts/download-toolchain.bat +++ b/yass/scripts/download-toolchain.bat @@ -34,3 +34,16 @@ rmdir /s /q wix311 if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL% cd .. del /s /q third_party\wix311*.zip + +echo "Install dependency: nsis" + +cd third_party +curl -C - -L -o nsis-3.10.zip "https://sourceforge.net/projects/nsis/files/NSIS%%203/3.10/nsis-3.10.zip/download" +if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL% +"C:\Program Files\7-Zip\7z.exe" x nsis-3.10.zip -aoa +if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL% +rmdir /s /q nsis +rename nsis-3.10 nsis +if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL% +cd .. +del /s /q third_party\nsis-*.zip diff --git a/yass/src/config/config_impl_local.hpp b/yass/src/config/config_impl_local.hpp index 2cd7fbcff8..6dc5ad7c6a 100644 --- a/yass/src/config/config_impl_local.hpp +++ b/yass/src/config/config_impl_local.hpp @@ -81,7 +81,9 @@ class ConfigImplLocal : public ConfigImpl { return false; } - std::string json_content = root_.dump(4); + // Call with defaults except in the case of UTF-8 errors which we replace + // invalid UTF-8 characters instead of throwing an exception. + std::string json_content = root_.dump(4, ' ', false, nlohmann::detail::error_handler_t::replace); if (static_cast(json_content.size()) != WriteFileWithBuffer(path_, json_content)) { std::cerr << "failed to write to path: \"" << path_ << " with content \"" << json_content << "\"" << std::endl; return false; diff --git a/yass/src/config/config_test.cpp b/yass/src/config/config_test.cpp index 356cc56364..67b59f3c98 100644 --- a/yass/src/config/config_test.cpp +++ b/yass/src/config/config_test.cpp @@ -9,6 +9,11 @@ #include #include #include "config/config_impl.hpp" +#include "core/process_utils.hpp" +#include "core/rand_util.hpp" +#include "core/utils_fs.hpp" + +using namespace yass; ABSL_FLAG(bool, test_bool, true, "Test bool value"); ABSL_FLAG(int32_t, test_signed_val, 0, "Test int32_t value"); @@ -20,6 +25,7 @@ ABSL_FLAG(std::string, test_string, "", "Test string value"); class ConfigTest : public ::testing::Test { public: void SetUp() override { + key_prefix_ = absl::StrCat("pid_", GetPID(), "_run_", RandUint64()); #if !(defined(_WIN32) || defined(__APPLE__)) original_configfile_ = config::g_configfile; const char* tmpdir = getenv("TMPDIR"); @@ -29,16 +35,20 @@ class ConfigTest : public ::testing::Test { #else tmpdir = "/tmp"; #endif - config::g_configfile = absl::StrCat(tmpdir, "/", "yass.json"); + config::g_configfile = absl::StrCat(tmpdir, "/", "yass_unittest_", key_prefix(), ".tmp"); #endif } void TearDown() override { #if !(defined(_WIN32) || defined(__APPLE__)) + RemoveFile(config::g_configfile); config::g_configfile = original_configfile_; #endif } + const std::string& key_prefix() const { return key_prefix_; } + private: + std::string key_prefix_; #if !(defined(_WIN32) || defined(__APPLE__)) std::string original_configfile_; #endif @@ -46,150 +56,156 @@ class ConfigTest : public ::testing::Test { TEST_F(ConfigTest, RWBool) { auto config_impl = config::ConfigImpl::Create(); - bool test_bool = true; + constexpr bool test_bool = true; + const std::string test_key = absl::StrCat("test_bool_", key_prefix()); absl::SetFlag(&FLAGS_test_bool, test_bool); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Write("test_bool", FLAGS_test_bool)); + EXPECT_TRUE(config_impl->Write(test_key, FLAGS_test_bool)); ASSERT_TRUE(config_impl->Close()); absl::SetFlag(&FLAGS_test_bool, false); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(false)); - EXPECT_TRUE(config_impl->Read("test_bool", &FLAGS_test_bool)); + EXPECT_TRUE(config_impl->Read(test_key, &FLAGS_test_bool)); ASSERT_TRUE(config_impl->Close()); EXPECT_EQ(absl::GetFlag(FLAGS_test_bool), test_bool); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Delete("test_bool")); + EXPECT_TRUE(config_impl->Delete(test_key)); ASSERT_TRUE(config_impl->Close()); } TEST_F(ConfigTest, RWInt32) { auto config_impl = config::ConfigImpl::Create(); - int32_t test_signed_val = -12345; + constexpr int32_t test_signed_val = -12345; + const std::string test_key = absl::StrCat("test_signed_val_", key_prefix()); absl::SetFlag(&FLAGS_test_signed_val, test_signed_val); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Write("test_signed_val", FLAGS_test_signed_val)); + EXPECT_TRUE(config_impl->Write(test_key, FLAGS_test_signed_val)); ASSERT_TRUE(config_impl->Close()); absl::SetFlag(&FLAGS_test_signed_val, 0); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(false)); - EXPECT_TRUE(config_impl->Read("test_signed_val", &FLAGS_test_signed_val)); + EXPECT_TRUE(config_impl->Read(test_key, &FLAGS_test_signed_val)); ASSERT_TRUE(config_impl->Close()); EXPECT_EQ(absl::GetFlag(FLAGS_test_signed_val), test_signed_val); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Delete("test_signed_val")); + EXPECT_TRUE(config_impl->Delete(test_key)); ASSERT_TRUE(config_impl->Close()); } TEST_F(ConfigTest, RWUint32) { auto config_impl = config::ConfigImpl::Create(); - uint32_t test_unsigned_val = 12345U; + constexpr uint32_t test_unsigned_val = 12345U; + const std::string test_key = absl::StrCat("test_unsigned_val_", key_prefix()); absl::SetFlag(&FLAGS_test_unsigned_val, test_unsigned_val); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Write("test_unsigned_val", FLAGS_test_unsigned_val)); + EXPECT_TRUE(config_impl->Write(test_key, FLAGS_test_unsigned_val)); ASSERT_TRUE(config_impl->Close()); absl::SetFlag(&FLAGS_test_unsigned_val, 0); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(false)); - EXPECT_TRUE(config_impl->Read("test_unsigned_val", &FLAGS_test_unsigned_val)); + EXPECT_TRUE(config_impl->Read(test_key, &FLAGS_test_unsigned_val)); ASSERT_TRUE(config_impl->Close()); EXPECT_EQ(absl::GetFlag(FLAGS_test_unsigned_val), test_unsigned_val); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Delete("test_unsigned_val")); + EXPECT_TRUE(config_impl->Delete(test_key)); ASSERT_TRUE(config_impl->Close()); } TEST_F(ConfigTest, RWInt64) { auto config_impl = config::ConfigImpl::Create(); - int64_t test_signed_64val = -123456LL - INT32_MAX; + constexpr int64_t test_signed_64val = -123456LL - INT32_MAX; + const std::string test_key = absl::StrCat("test_signed_64val_", key_prefix()); absl::SetFlag(&FLAGS_test_signed_64val, test_signed_64val); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Write("test_signed_64val", FLAGS_test_signed_64val)); + EXPECT_TRUE(config_impl->Write(test_key, FLAGS_test_signed_64val)); ASSERT_TRUE(config_impl->Close()); absl::SetFlag(&FLAGS_test_signed_64val, 0); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(false)); - EXPECT_TRUE(config_impl->Read("test_signed_64val", &FLAGS_test_signed_64val)); + EXPECT_TRUE(config_impl->Read(test_key, &FLAGS_test_signed_64val)); ASSERT_TRUE(config_impl->Close()); EXPECT_EQ(absl::GetFlag(FLAGS_test_signed_64val), test_signed_64val); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Delete("test_signed_64val")); + EXPECT_TRUE(config_impl->Delete(test_key)); ASSERT_TRUE(config_impl->Close()); } TEST_F(ConfigTest, RWUint64) { auto config_impl = config::ConfigImpl::Create(); - uint64_t test_unsigned_64val = 123456ULL + UINT32_MAX; + constexpr uint64_t test_unsigned_64val = 123456ULL + UINT32_MAX; + const std::string test_key = absl::StrCat("test_unsigned_64val_", key_prefix()); absl::SetFlag(&FLAGS_test_unsigned_64val, test_unsigned_64val); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Write("test_unsigned_64val", FLAGS_test_unsigned_64val)); + EXPECT_TRUE(config_impl->Write(test_key, FLAGS_test_unsigned_64val)); ASSERT_TRUE(config_impl->Close()); absl::SetFlag(&FLAGS_test_unsigned_64val, 0); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(false)); - EXPECT_TRUE(config_impl->Read("test_unsigned_64val", &FLAGS_test_unsigned_64val)); + EXPECT_TRUE(config_impl->Read(test_key, &FLAGS_test_unsigned_64val)); ASSERT_TRUE(config_impl->Close()); EXPECT_EQ(absl::GetFlag(FLAGS_test_unsigned_64val), test_unsigned_64val); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Delete("test_unsigned_64val")); + EXPECT_TRUE(config_impl->Delete(test_key)); ASSERT_TRUE(config_impl->Close()); } TEST_F(ConfigTest, RWString) { auto config_impl = config::ConfigImpl::Create(); constexpr std::string_view test_string = "test-str"; + const std::string test_key = absl::StrCat("test_string_", key_prefix()); absl::SetFlag(&FLAGS_test_string, test_string); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Write("test_string", FLAGS_test_string)); + EXPECT_TRUE(config_impl->Write(test_key, FLAGS_test_string)); ASSERT_TRUE(config_impl->Close()); absl::SetFlag(&FLAGS_test_string, ""); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(false)); - EXPECT_TRUE(config_impl->Read("test_string", &FLAGS_test_string)); + EXPECT_TRUE(config_impl->Read(test_key, &FLAGS_test_string)); ASSERT_TRUE(config_impl->Close()); EXPECT_EQ(absl::GetFlag(FLAGS_test_string), test_string); config_impl = config::ConfigImpl::Create(); ASSERT_TRUE(config_impl->Open(true)); - EXPECT_TRUE(config_impl->Delete("test_string")); + EXPECT_TRUE(config_impl->Delete(test_key)); ASSERT_TRUE(config_impl->Close()); } diff --git a/yass/src/crashpad_helper.cpp b/yass/src/crashpad_helper.cpp index 0f1a42c29b..ff44985db5 100644 --- a/yass/src/crashpad_helper.cpp +++ b/yass/src/crashpad_helper.cpp @@ -16,7 +16,6 @@ using namespace std::string_literals; #ifdef __ANDROID__ -extern struct android_app* a_app; extern std::string a_data_dir; #endif diff --git a/yass/src/delay_load_failure_hook_win.cc b/yass/src/delay_load_failure_hook_win.cc new file mode 100644 index 0000000000..eb9de81a13 --- /dev/null +++ b/yass/src/delay_load_failure_hook_win.cc @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ + +// windows.h needs to be included before delayimp.h. +#include + +#define __pfnDliFailureHook2 __pfnDliFailureHook2Hidden +#include +#undef __pfnDliFailureHook2 +#include + +namespace yass { + +extern void DisableDelayLoadFailureHooksForMainExecutable(); + +extern FARPROC WINAPI HandleDelayLoadFailureCommon(unsigned reason, DelayLoadInfo* dll_info); + +FARPROC WINAPI HandleDelayLoadFailureCommon(unsigned reason, + DelayLoadInfo* dll_info) { + // ERROR_COMMITMENT_LIMIT means that there is no memory. Convert this into a + // more suitable crash rather than just CHECKing in this function. + if (dll_info->dwLastError == ERROR_COMMITMENT_LIMIT) { + _exit(255); + } + + // DEBUG_ALIAS_FOR_CSTR(dll_name, dll_info->szDll, 256); + // SCOPED_CRASH_KEY_STRING256("DelayLoad", "ModuleName", dll_name); + + // Deterministically crash here. Returning 0 from the hook would likely result + // in the process crashing anyway, but in a form that might trigger undefined + // behavior or be hard to diagnose. See https://crbug.com/1320845. + abort(); + + return 0; +} + +namespace { + +bool g_hooks_enabled = true; + +// Delay load failure hook that generates a crash report. By default a failure +// to delay load will trigger an exception handled by the delay load runtime and +// this won't generate a crash report. +FARPROC WINAPI DelayLoadFailureHookEXE(unsigned reason, + DelayLoadInfo* dll_info) { + if (!g_hooks_enabled) + return 0; + + return HandleDelayLoadFailureCommon(reason, dll_info); +} + +} // namespace + +void DisableDelayLoadFailureHooksForMainExecutable() { + g_hooks_enabled = false; +} + +} // namespace yass + +// Set the delay load failure hook to the function above. +// +// The |__pfnDliFailureHook2| failure notification hook gets called +// automatically by the delay load runtime in case of failure, see +// https://docs.microsoft.com/en-us/cpp/build/reference/failure-hooks?view=vs-2019 +// for more information about this. +extern "C" const PfnDliHook __pfnDliFailureHook2 = + yass::DelayLoadFailureHookEXE; diff --git a/yass/src/gtk/icons/128x128/apps/yass.png b/yass/src/freedesktop/icons/128x128/apps/yass.png similarity index 100% rename from yass/src/gtk/icons/128x128/apps/yass.png rename to yass/src/freedesktop/icons/128x128/apps/yass.png diff --git a/yass/src/gtk/icons/16x16/apps/yass.png b/yass/src/freedesktop/icons/16x16/apps/yass.png similarity index 100% rename from yass/src/gtk/icons/16x16/apps/yass.png rename to yass/src/freedesktop/icons/16x16/apps/yass.png diff --git a/yass/src/gtk/icons/22x22/apps/yass.png b/yass/src/freedesktop/icons/22x22/apps/yass.png similarity index 100% rename from yass/src/gtk/icons/22x22/apps/yass.png rename to yass/src/freedesktop/icons/22x22/apps/yass.png diff --git a/yass/src/gtk/icons/24x24/apps/yass.png b/yass/src/freedesktop/icons/24x24/apps/yass.png similarity index 100% rename from yass/src/gtk/icons/24x24/apps/yass.png rename to yass/src/freedesktop/icons/24x24/apps/yass.png diff --git a/yass/src/gtk/icons/256x256/apps/yass.png b/yass/src/freedesktop/icons/256x256/apps/yass.png similarity index 100% rename from yass/src/gtk/icons/256x256/apps/yass.png rename to yass/src/freedesktop/icons/256x256/apps/yass.png diff --git a/yass/src/gtk/icons/32x32/apps/yass.png b/yass/src/freedesktop/icons/32x32/apps/yass.png similarity index 100% rename from yass/src/gtk/icons/32x32/apps/yass.png rename to yass/src/freedesktop/icons/32x32/apps/yass.png diff --git a/yass/src/gtk/icons/48x48/apps/yass.png b/yass/src/freedesktop/icons/48x48/apps/yass.png similarity index 100% rename from yass/src/gtk/icons/48x48/apps/yass.png rename to yass/src/freedesktop/icons/48x48/apps/yass.png diff --git a/yass/src/gtk/icons/512x512/apps/yass.png b/yass/src/freedesktop/icons/512x512/apps/yass.png similarity index 100% rename from yass/src/gtk/icons/512x512/apps/yass.png rename to yass/src/freedesktop/icons/512x512/apps/yass.png diff --git a/yass/src/gtk/it.gui.yass.desktop b/yass/src/freedesktop/it.gui.yass.desktop similarity index 100% rename from yass/src/gtk/it.gui.yass.desktop rename to yass/src/freedesktop/it.gui.yass.desktop diff --git a/yass/src/freedesktop/utils.cpp b/yass/src/freedesktop/utils.cpp new file mode 100644 index 0000000000..6c299d76e5 --- /dev/null +++ b/yass/src/freedesktop/utils.cpp @@ -0,0 +1,338 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ + +#include "freedesktop/utils.hpp" + +#include "config/config.hpp" +#include "core/logging.hpp" +#include "core/process_utils.hpp" +#include "core/utils.hpp" +#include "core/utils_fs.hpp" +#include "net/asio.hpp" + +#include +#include +#include + +using namespace std::string_literals; + +using namespace yass; + +static constexpr const char kDefaultAutoStartName[] = "it.gui.yass"; + +static constexpr const std::string_view kAutoStartFileContent = + "[Desktop Entry]\n" + "Version=1.0\n" + "Type=Application\n" + "Name=yass\n" + "Comment=Yet Another Shadow Socket is a lightweight and secure http/socks4/socks5 proxy for embedded devices and " + "low end boxes.\n" + "Icon=yass\n" + "Exec=\"%s\" --background\n" + "Terminal=false\n" + "Categories=Network;GTK;Utility\n"; + +namespace { + +// followed +// https://github.com/qt/qtbase/blob/7fe1198f6edb40de2299272c7523d85d7486598b/src/corelib/io/qstandardpaths_unix.cpp#L218 +std::string GetConfigDir() { + const char* config_dir_ptr = getenv("XDG_CONFIG_HOME"); + std::string config_dir; + // spec says relative paths should be ignored + if (config_dir_ptr == nullptr || config_dir_ptr[0] != '/') { + config_dir = ExpandUser("~/.config"); + } else { + config_dir = config_dir_ptr; + } + return config_dir; +} + +std::string GetAutostartDirectory() { + return absl::StrCat(GetConfigDir(), "/", "autostart"); +} + +bool IsKDE() { + const char* desktop_ptr = getenv("XDG_SESSION_DESKTOP"); + std::string_view desktop = desktop_ptr ? std::string_view(desktop_ptr) : std::string_view(); + return desktop == "KDE" || desktop == "plasma"; +} +} // namespace + +bool Utils::GetAutoStart() { + std::string autostart_desktop_path = absl::StrCat(GetAutostartDirectory(), "/", kDefaultAutoStartName, ".desktop"); + return IsFile(autostart_desktop_path); +} + +void Utils::EnableAutoStart(bool on) { + std::string autostart_desktop_path = absl::StrCat(GetAutostartDirectory(), "/", kDefaultAutoStartName, ".desktop"); + if (!on) { + if (!RemoveFile(autostart_desktop_path)) { + PLOG(WARNING) << "Internal error: unable to remove autostart file"; + } + VLOG(1) << "[autostart] removed autostart entry: " << autostart_desktop_path; + } else { + if (!CreateDirectories(GetAutostartDirectory())) { + PLOG(WARNING) << "Internal error: unable to create config directory"; + } + + // force update, delete first + if (IsFile(autostart_desktop_path) && !RemoveFile(autostart_desktop_path)) { + PLOG(WARNING) << "Internal error: unable to remove previous autostart file"; + } + + // write to target + std::string executable_path = "yass"s; + GetExecutablePath(&executable_path); + std::string desktop_entry = absl::StrFormat(kAutoStartFileContent, executable_path); + if (!WriteFileWithBuffer(autostart_desktop_path, desktop_entry)) { + PLOG(WARNING) << "Internal error: unable to create autostart file"; + } + + VLOG(1) << "[autostart] written autostart entry: " << autostart_desktop_path; + } + + // Update Desktop Database + std::string _; + std::vector params = {"update-desktop-database"s, ExpandUser("~/.local/share/applications"s)}; + if (ExecuteProcess(params, &_, &_) != 0) { + PLOG(WARNING) << "update-desktop-database failed"; + } else { + VLOG(1) << "[autostart] refreshed desktop database"; + } +} + +bool Utils::GetSystemProxy() { + if (IsKDE()) { + bool enabled; + std::string server_addr, bypass_addr; + if (!QuerySystemProxy_KDE(&enabled, &server_addr, &bypass_addr)) { + return false; + } + return enabled && server_addr == GetLocalAddr(); + } + bool enabled; + std::string server_host, server_port, bypass_addr; + if (!QuerySystemProxy(&enabled, &server_host, &server_port, &bypass_addr)) { + return false; + } + auto local_host = absl::StrCat("'", absl::GetFlag(FLAGS_local_host), "'"); + auto local_port = std::to_string(absl::GetFlag(FLAGS_local_port)); + return enabled && server_host == local_host && server_port == local_port; +} + +bool Utils::SetSystemProxy(bool on) { + bool ret = true; + if (IsKDE()) { + bool enabled; + std::string server_addr, bypass_addr; + if (!QuerySystemProxy_KDE(&enabled, &server_addr, &bypass_addr)) { + return false; + } + if (on) { + server_addr = GetLocalAddr(); + } + ret = ::SetSystemProxy_KDE(on, server_addr, bypass_addr); + } + bool enabled; + std::string server_host, server_port, bypass_addr = "['localhost', '127.0.0.0/8', '::1']"s; + ::QuerySystemProxy(&enabled, &server_host, &server_port, &bypass_addr); + if (on) { + server_host = absl::StrCat("'", absl::GetFlag(FLAGS_local_host), "'"); + server_port = std::to_string(absl::GetFlag(FLAGS_local_port)); + } + return ::SetSystemProxy(on, server_host, server_port, bypass_addr) && ret; +} + +std::string Utils::GetLocalAddr() { + std::ostringstream ss; + auto local_host = absl::GetFlag(FLAGS_local_host); + auto local_port = absl::GetFlag(FLAGS_local_port); + + asio::error_code ec; + auto addr = asio::ip::make_address(local_host.c_str(), ec); + bool host_is_ip_address = !ec; + if (host_is_ip_address && addr.is_v6()) { + if (addr.is_unspecified()) { + local_host = "::1"s; + } + ss << "http://[" << local_host << "]:" << local_port; + } else { + if (host_is_ip_address && addr.is_unspecified()) { + local_host = "127.0.0.1"s; + } + ss << "http://" << local_host << ":" << local_port; + } + return ss.str(); +} + +bool QuerySystemProxy(bool* enabled, std::string* server_host, std::string* server_port, std::string* bypass_addr) { + std::string output, _; + std::vector params = {"gsettings"s, "get"s, "org.gnome.system.proxy"s, "mode"s}; + if (ExecuteProcess(params, &output, &_) != 0) { + return false; + } + // trim whites + if (!output.empty() && output[output.size() - 1] == '\n') { + output.resize(output.size() - 1); + } + *enabled = output == "'manual'"s; + + params = {"gsettings"s, "get"s, "org.gnome.system.proxy.http"s, "host"s}; + if (ExecuteProcess(params, &output, &_) != 0) { + return false; + } + // trim whites + if (!output.empty() && output[output.size() - 1] == '\n') { + output.resize(output.size() - 1); + } + *server_host = output; + + params = {"gsettings"s, "get"s, "org.gnome.system.proxy.http"s, "port"s}; + if (ExecuteProcess(params, &output, &_) != 0) { + return false; + } + // trim whites + if (!output.empty() && output[output.size() - 1] == '\n') { + output.resize(output.size() - 1); + } + *server_port = output; + + params = {"gsettings"s, "get"s, "org.gnome.system.proxy"s, "ignore-hosts"s}; + if (ExecuteProcess(params, &output, &_) != 0) { + return false; + } + // trim whites + if (!output.empty() && output[output.size() - 1] == '\n') { + output.resize(output.size() - 1); + } + *bypass_addr = output; + return true; +} + +bool SetSystemProxy(bool enable, + const std::string& server_host, + const std::string& server_port, + const std::string& bypass_addr) { + std::string _; + std::vector params = {"gsettings"s, "set"s, "org.gnome.system.proxy"s, "mode"s, + enable ? "'manual'"s : "'none'"s}; + if (ExecuteProcess(params, &_, &_) != 0) { + return false; + } + + static constexpr std::string_view kProtocol[] = { + "org.gnome.system.proxy.http", + "org.gnome.system.proxy.https", + "org.gnome.system.proxy.ftp", + "org.gnome.system.proxy.socks", + }; + for (std::string_view protocol : kProtocol) { + params = {"gsettings"s, "set"s, std::string(protocol), "host"s, server_host}; + if (ExecuteProcess(params, &_, &_) != 0) { + return false; + } + + params = {"gsettings"s, "set"s, std::string(protocol), "port"s, server_port}; + if (ExecuteProcess(params, &_, &_) != 0) { + return false; + } + } + + params = {"gsettings"s, "set"s, "org.gnome.system.proxy"s, "use-same-proxy"s, "true"s}; + if (ExecuteProcess(params, &_, &_) != 0) { + return false; + } + + params = {"gsettings"s, "set"s, "org.gnome.system.proxy"s, "ignore-hosts"s, bypass_addr}; + if (ExecuteProcess(params, &_, &_) != 0) { + return false; + } + + params = {"gsettings"s, "set"s, "org.gnome.system.proxy"s, "mode"s, enable ? "'manual'"s : "'none'"s}; + if (ExecuteProcess(params, &_, &_) != 0) { + return false; + } + return true; +} + +bool QuerySystemProxy_KDE(bool* enabled, std::string* server_addr, std::string* bypass_addr) { + bypass_addr->clear(); + + std::string config_dir = GetConfigDir(); + std::string output, _; + std::vector params = { + "kreadconfig5"s, "--file"s, config_dir + "/kioslaverc"s, "--group"s, "Proxy Settings"s, "--key"s, "ProxyType"s}; + if (ExecuteProcess(params, &output, &_) != 0) { + return false; + } + // trim whites + if (!output.empty() && output[output.size() - 1] == '\n') { + output.resize(output.size() - 1); + } + *enabled = output == "1"s; + + params = {"kreadconfig5"s, "--file"s, config_dir + "/kioslaverc"s, "--group"s, "Proxy Settings"s, + "--key"s, "httpProxy"s}; + if (ExecuteProcess(params, &output, &_) != 0) { + return false; + } + // trim whites + if (!output.empty() && output[output.size() - 1] == '\n') { + output.resize(output.size() - 1); + } + *server_addr = output; + + params = {"kreadconfig5"s, "--file"s, config_dir + "/kioslaverc"s, "--group"s, "Proxy Settings"s, + "--key"s, "NoProxyFor"s}; + if (ExecuteProcess(params, &output, &_) != 0) { + return false; + } + // trim whites + if (!output.empty() && output[output.size() - 1] == '\n') { + output.resize(output.size() - 1); + } + *bypass_addr = output; + + return true; +} + +bool SetSystemProxy_KDE(bool enable, const std::string& server_addr, const std::string& bypass_addr) { + std::string config_dir = GetConfigDir(); + std::string _; + std::vector params = {"kwriteconfig5"s, "--file"s, config_dir + "/kioslaverc"s, + "--group"s, "Proxy Settings"s, "--key"s, + "ProxyType"s, enable ? "1"s : "0"s}; + if (ExecuteProcess(params, &_, &_) != 0) { + return false; + } + + static constexpr std::string_view kProtocol[] = { + "httpProxy", + "httpsProxy", + "ftpProxy", + "socksProxy", + }; + + for (std::string_view protocol : kProtocol) { + params = {"kwriteconfig5"s, "--file"s, config_dir + "/kioslaverc"s, "--group"s, + "Proxy Settings"s, "--key"s, std::string(protocol), server_addr}; + if (ExecuteProcess(params, &_, &_) != 0) { + return false; + } + } + + params = {"kwriteconfig5"s, "--file"s, config_dir + "/kioslaverc"s, "--group"s, "Proxy Settings"s, "--key"s, + "NoProxyFor"s, bypass_addr}; + if (ExecuteProcess(params, &_, &_) != 0) { + return false; + } + + params = {"dbus-send"s, "--type=signal"s, "/KIO/Scheduler"s, "org.kde.KIO.Scheduler.reparseSlaveConfiguration"s, + "string:''"s}; + if (ExecuteProcess(params, &_, &_) != 0) { + return false; + } + + return true; +} diff --git a/yass/src/freedesktop/utils.hpp b/yass/src/freedesktop/utils.hpp new file mode 100644 index 0000000000..07a8243b2b --- /dev/null +++ b/yass/src/freedesktop/utils.hpp @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ +#ifndef YASS_FREEDESKTOP_UTILS +#define YASS_FREEDESKTOP_UTILS + +#include +#include +#include + +class Utils { + public: + static bool GetAutoStart(); + static void EnableAutoStart(bool on); + static bool GetSystemProxy(); + static bool SetSystemProxy(bool on); + static std::string GetLocalAddr(); +}; + +bool QuerySystemProxy(bool* enabled, std::string* server_host, std::string* server_port, std::string* bypass_addr); + +bool SetSystemProxy(bool enable, + const std::string& server_host, + const std::string& server_port, + const std::string& bypass_addr); + +bool QuerySystemProxy_KDE(bool* enabled, std::string* server_addr, std::string* bypass_addr); + +bool SetSystemProxy_KDE(bool enable, const std::string& server_addr, const std::string& bypass_addr); + +#endif // YASS_FREEDESKTOP_UTILS diff --git a/yass/src/gtk/yass.png b/yass/src/freedesktop/yass.png similarity index 100% rename from yass/src/gtk/yass.png rename to yass/src/freedesktop/yass.png diff --git a/yass/src/gtk/utils.hpp b/yass/src/gtk/utils.hpp index 1393a94b1c..b6c610f079 100644 --- a/yass/src/gtk/utils.hpp +++ b/yass/src/gtk/utils.hpp @@ -1,32 +1,11 @@ // SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2022-2023 Chilledheart */ +/* Copyright (c) 2022-2024 Chilledheart */ #ifndef YASS_GUI_UTILS #define YASS_GUI_UTILS + #include -#include #include #include -#include - -class Utils { - public: - static bool GetAutoStart(); - static void EnableAutoStart(bool on); - static bool GetSystemProxy(); - static bool SetSystemProxy(bool on); - static std::string GetLocalAddr(); -}; - -bool QuerySystemProxy(bool* enabled, std::string* server_host, std::string* server_port, std::string* bypass_addr); - -bool SetSystemProxy(bool enable, - const std::string& server_host, - const std::string& server_port, - const std::string& bypass_addr); - -bool QuerySystemProxy_KDE(bool* enabled, std::string* server_addr, std::string* bypass_addr); - -bool SetSystemProxy_KDE(bool enable, const std::string& server_addr, const std::string& bypass_addr); template std::unique_ptr make_unique_ptr_gfree(T* p) { diff --git a/yass/src/gtk/utils_gtk.cpp b/yass/src/gtk/utils_gtk.cpp index 4a2a1c6fe6..01c1a82d04 100644 --- a/yass/src/gtk/utils_gtk.cpp +++ b/yass/src/gtk/utils_gtk.cpp @@ -1,17 +1,11 @@ // SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2022-2023 Chilledheart */ +/* Copyright (c) 2022-2024 Chilledheart */ #include "gtk/utils.hpp" -#include "config/config.hpp" #include "core/logging.hpp" -#include "core/process_utils.hpp" #include "core/utils.hpp" -#include "core/utils_fs.hpp" -#include "net/asio.hpp" -#include -#include #include #include #include @@ -27,329 +21,6 @@ #define G_SOURCE_FUNC(f) ((GSourceFunc)(void (*)(void))(f)) #endif -using namespace std::string_literals; - -using namespace yass; - -static constexpr const char kDefaultAutoStartName[] = "it.gui.yass"; - -static constexpr const std::string_view kAutoStartFileContent = - "[Desktop Entry]\n" - "Version=1.0\n" - "Type=Application\n" - "Name=yass\n" - "Comment=Yet Another Shadow Socket is a lightweight and secure http/socks4/socks5 proxy for embedded devices and " - "low end boxes.\n" - "Icon=yass\n" - "Exec=\"%s\" --background\n" - "Terminal=false\n" - "Categories=Network;GTK;Utility\n"; - -namespace { - -// followed -// https://github.com/qt/qtbase/blob/7fe1198f6edb40de2299272c7523d85d7486598b/src/corelib/io/qstandardpaths_unix.cpp#L218 -std::string GetConfigDir() { - const char* config_dir_ptr = getenv("XDG_CONFIG_HOME"); - std::string config_dir; - // spec says relative paths should be ignored - if (config_dir_ptr == nullptr || config_dir_ptr[0] != '/') { - config_dir = ExpandUser("~/.config"); - } else { - config_dir = config_dir_ptr; - } - return config_dir; -} - -std::string GetAutostartDirectory() { - return absl::StrCat(GetConfigDir(), "/", "autostart"); -} - -bool IsKDE() { - const char* desktop_ptr = getenv("XDG_SESSION_DESKTOP"); - std::string_view desktop = desktop_ptr ? std::string_view(desktop_ptr) : std::string_view(); - return desktop == "KDE" || desktop == "plasma"; -} -} // namespace - -bool Utils::GetAutoStart() { - std::string autostart_desktop_path = absl::StrCat(GetAutostartDirectory(), "/", kDefaultAutoStartName, ".desktop"); - return IsFile(autostart_desktop_path); -} - -void Utils::EnableAutoStart(bool on) { - std::string autostart_desktop_path = absl::StrCat(GetAutostartDirectory(), "/", kDefaultAutoStartName, ".desktop"); - if (!on) { - if (!RemoveFile(autostart_desktop_path)) { - PLOG(WARNING) << "Internal error: unable to remove autostart file"; - } - VLOG(1) << "[autostart] removed autostart entry: " << autostart_desktop_path; - } else { - if (!CreateDirectories(GetAutostartDirectory())) { - PLOG(WARNING) << "Internal error: unable to create config directory"; - } - - // force update, delete first - if (IsFile(autostart_desktop_path) && !RemoveFile(autostart_desktop_path)) { - PLOG(WARNING) << "Internal error: unable to remove previous autostart file"; - } - - // write to target - std::string executable_path = "yass"s; - GetExecutablePath(&executable_path); - std::string desktop_entry = absl::StrFormat(kAutoStartFileContent, executable_path); - if (!WriteFileWithBuffer(autostart_desktop_path, desktop_entry)) { - PLOG(WARNING) << "Internal error: unable to create autostart file"; - } - - VLOG(1) << "[autostart] written autostart entry: " << autostart_desktop_path; - } - - // Update Desktop Database - std::string _; - std::vector params = {"update-desktop-database"s, ExpandUser("~/.local/share/applications"s)}; - if (ExecuteProcess(params, &_, &_) != 0) { - PLOG(WARNING) << "update-desktop-database failed"; - } else { - VLOG(1) << "[autostart] refreshed desktop database"; - } -} - -bool Utils::GetSystemProxy() { - if (IsKDE()) { - bool enabled; - std::string server_addr, bypass_addr; - if (!QuerySystemProxy_KDE(&enabled, &server_addr, &bypass_addr)) { - return false; - } - return enabled && server_addr == GetLocalAddr(); - } - bool enabled; - std::string server_host, server_port, bypass_addr; - if (!QuerySystemProxy(&enabled, &server_host, &server_port, &bypass_addr)) { - return false; - } - auto local_host = absl::StrCat("'", absl::GetFlag(FLAGS_local_host), "'"); - auto local_port = std::to_string(absl::GetFlag(FLAGS_local_port)); - return enabled && server_host == local_host && server_port == local_port; -} - -bool Utils::SetSystemProxy(bool on) { - bool ret = true; - if (IsKDE()) { - bool enabled; - std::string server_addr, bypass_addr; - if (!QuerySystemProxy_KDE(&enabled, &server_addr, &bypass_addr)) { - return false; - } - if (on) { - server_addr = GetLocalAddr(); - } - ret = ::SetSystemProxy_KDE(on, server_addr, bypass_addr); - } - bool enabled; - std::string server_host, server_port, bypass_addr = "['localhost', '127.0.0.0/8', '::1']"s; - ::QuerySystemProxy(&enabled, &server_host, &server_port, &bypass_addr); - if (on) { - server_host = absl::StrCat("'", absl::GetFlag(FLAGS_local_host), "'"); - server_port = std::to_string(absl::GetFlag(FLAGS_local_port)); - } - return ::SetSystemProxy(on, server_host, server_port, bypass_addr) && ret; -} - -std::string Utils::GetLocalAddr() { - std::ostringstream ss; - auto local_host = absl::GetFlag(FLAGS_local_host); - auto local_port = absl::GetFlag(FLAGS_local_port); - - asio::error_code ec; - auto addr = asio::ip::make_address(local_host.c_str(), ec); - bool host_is_ip_address = !ec; - if (host_is_ip_address && addr.is_v6()) { - if (addr.is_unspecified()) { - local_host = "::1"s; - } - ss << "http://[" << local_host << "]:" << local_port; - } else { - if (host_is_ip_address && addr.is_unspecified()) { - local_host = "127.0.0.1"s; - } - ss << "http://" << local_host << ":" << local_port; - } - return ss.str(); -} - -bool QuerySystemProxy(bool* enabled, std::string* server_host, std::string* server_port, std::string* bypass_addr) { - std::string output, _; - std::vector params = {"gsettings"s, "get"s, "org.gnome.system.proxy"s, "mode"s}; - if (ExecuteProcess(params, &output, &_) != 0) { - return false; - } - // trim whites - if (!output.empty() && output[output.size() - 1] == '\n') { - output.resize(output.size() - 1); - } - *enabled = output == "'manual'"s; - - params = {"gsettings"s, "get"s, "org.gnome.system.proxy.http"s, "host"s}; - if (ExecuteProcess(params, &output, &_) != 0) { - return false; - } - // trim whites - if (!output.empty() && output[output.size() - 1] == '\n') { - output.resize(output.size() - 1); - } - *server_host = output; - - params = {"gsettings"s, "get"s, "org.gnome.system.proxy.http"s, "port"s}; - if (ExecuteProcess(params, &output, &_) != 0) { - return false; - } - // trim whites - if (!output.empty() && output[output.size() - 1] == '\n') { - output.resize(output.size() - 1); - } - *server_port = output; - - params = {"gsettings"s, "get"s, "org.gnome.system.proxy"s, "ignore-hosts"s}; - if (ExecuteProcess(params, &output, &_) != 0) { - return false; - } - // trim whites - if (!output.empty() && output[output.size() - 1] == '\n') { - output.resize(output.size() - 1); - } - *bypass_addr = output; - return true; -} - -bool SetSystemProxy(bool enable, - const std::string& server_host, - const std::string& server_port, - const std::string& bypass_addr) { - std::string _; - std::vector params = {"gsettings"s, "set"s, "org.gnome.system.proxy"s, "mode"s, - enable ? "'manual'"s : "'none'"s}; - if (ExecuteProcess(params, &_, &_) != 0) { - return false; - } - - static constexpr std::string_view kProtocol[] = { - "org.gnome.system.proxy.http", - "org.gnome.system.proxy.https", - "org.gnome.system.proxy.ftp", - "org.gnome.system.proxy.socks", - }; - for (std::string_view protocol : kProtocol) { - params = {"gsettings"s, "set"s, std::string(protocol), "host"s, server_host}; - if (ExecuteProcess(params, &_, &_) != 0) { - return false; - } - - params = {"gsettings"s, "set"s, std::string(protocol), "port"s, server_port}; - if (ExecuteProcess(params, &_, &_) != 0) { - return false; - } - } - - params = {"gsettings"s, "set"s, "org.gnome.system.proxy"s, "use-same-proxy"s, "true"s}; - if (ExecuteProcess(params, &_, &_) != 0) { - return false; - } - - params = {"gsettings"s, "set"s, "org.gnome.system.proxy"s, "ignore-hosts"s, bypass_addr}; - if (ExecuteProcess(params, &_, &_) != 0) { - return false; - } - - params = {"gsettings"s, "set"s, "org.gnome.system.proxy"s, "mode"s, enable ? "'manual'"s : "'none'"s}; - if (ExecuteProcess(params, &_, &_) != 0) { - return false; - } - return true; -} - -bool QuerySystemProxy_KDE(bool* enabled, std::string* server_addr, std::string* bypass_addr) { - bypass_addr->clear(); - - std::string config_dir = GetConfigDir(); - std::string output, _; - std::vector params = { - "kreadconfig5"s, "--file"s, config_dir + "/kioslaverc"s, "--group"s, "Proxy Settings"s, "--key"s, "ProxyType"s}; - if (ExecuteProcess(params, &output, &_) != 0) { - return false; - } - // trim whites - if (!output.empty() && output[output.size() - 1] == '\n') { - output.resize(output.size() - 1); - } - *enabled = output == "1"s; - - params = {"kreadconfig5"s, "--file"s, config_dir + "/kioslaverc"s, "--group"s, "Proxy Settings"s, - "--key"s, "httpProxy"s}; - if (ExecuteProcess(params, &output, &_) != 0) { - return false; - } - // trim whites - if (!output.empty() && output[output.size() - 1] == '\n') { - output.resize(output.size() - 1); - } - *server_addr = output; - - params = {"kreadconfig5"s, "--file"s, config_dir + "/kioslaverc"s, "--group"s, "Proxy Settings"s, - "--key"s, "NoProxyFor"s}; - if (ExecuteProcess(params, &output, &_) != 0) { - return false; - } - // trim whites - if (!output.empty() && output[output.size() - 1] == '\n') { - output.resize(output.size() - 1); - } - *bypass_addr = output; - - return true; -} - -bool SetSystemProxy_KDE(bool enable, const std::string& server_addr, const std::string& bypass_addr) { - std::string config_dir = GetConfigDir(); - std::string _; - std::vector params = {"kwriteconfig5"s, "--file"s, config_dir + "/kioslaverc"s, - "--group"s, "Proxy Settings"s, "--key"s, - "ProxyType"s, enable ? "1"s : "0"s}; - if (ExecuteProcess(params, &_, &_) != 0) { - return false; - } - - static constexpr std::string_view kProtocol[] = { - "httpProxy", - "httpsProxy", - "ftpProxy", - "socksProxy", - }; - - for (std::string_view protocol : kProtocol) { - params = {"kwriteconfig5"s, "--file"s, config_dir + "/kioslaverc"s, "--group"s, - "Proxy Settings"s, "--key"s, std::string(protocol), server_addr}; - if (ExecuteProcess(params, &_, &_) != 0) { - return false; - } - } - - params = {"kwriteconfig5"s, "--file"s, config_dir + "/kioslaverc"s, "--group"s, "Proxy Settings"s, "--key"s, - "NoProxyFor"s, bypass_addr}; - if (ExecuteProcess(params, &_, &_) != 0) { - return false; - } - - params = {"dbus-send"s, "--type=signal"s, "/KIO/Scheduler"s, "org.kde.KIO.Scheduler.reparseSlaveConfiguration"s, - "string:''"s}; - if (ExecuteProcess(params, &_, &_) != 0) { - return false; - } - - return true; -} - Dispatcher::Dispatcher() = default; Dispatcher::~Dispatcher() { Destroy(); diff --git a/yass/src/gtk/yass.cpp b/yass/src/gtk/yass.cpp index b64c33d389..342214a70a 100644 --- a/yass/src/gtk/yass.cpp +++ b/yass/src/gtk/yass.cpp @@ -20,6 +20,7 @@ #include "core/utils.hpp" #include "crashpad_helper.hpp" #include "crypto/crypter_export.hpp" +#include "freedesktop/utils.hpp" #include "gtk/utils.hpp" #include "gtk/yass_window.hpp" #include "version.h" @@ -98,6 +99,9 @@ YASSApp::YASSApp() #endif idle_source_(g_timeout_source_new(200)) { g_set_application_name(kAppName); + // for wayland's fix see https://gitlab.gnome.org/GNOME/gtk/-/issues/2822 + // In order to achieve this with GTK+3 call g_set_prgname() with the application id you passed to #GtkApplication. + g_set_prgname(kAppId); gdk_init(nullptr, nullptr); gtk_init(nullptr, nullptr); diff --git a/yass/src/gtk/yass.gresource.xml b/yass/src/gtk/yass.gresource.xml deleted file mode 100644 index 46ae2a2e16..0000000000 --- a/yass/src/gtk/yass.gresource.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - menu.ui - yass_window.ui - option_dialog.ui - - diff --git a/yass/src/gtk/yass_window.cpp b/yass/src/gtk/yass_window.cpp index d5066872d6..35e3b91e1c 100644 --- a/yass/src/gtk/yass_window.cpp +++ b/yass/src/gtk/yass_window.cpp @@ -11,6 +11,7 @@ #include "cli/cli_connection_stats.hpp" #include "core/utils.hpp" #include "feature.h" +#include "freedesktop/utils.hpp" #include "gtk/option_dialog.hpp" #include "gtk/utils.hpp" #include "gtk/yass.hpp" @@ -466,7 +467,7 @@ void YASSWindow::OnAbout() { comments += YASS_APP_FEATURES; gtk_about_dialog_set_comments(about_dialog, comments.c_str()); gtk_about_dialog_set_copyright(about_dialog, YASS_APP_COPYRIGHT); - gtk_about_dialog_set_license_type(about_dialog, GTK_LICENSE_GPL_2_0); + gtk_about_dialog_set_license_type(about_dialog, GTK_LICENSE_GPL_2_0_ONLY); gtk_about_dialog_set_logo_icon_name(about_dialog, "yass"); gtk_about_dialog_set_program_name(about_dialog, YASS_APP_PRODUCT_NAME); gtk_about_dialog_set_version(about_dialog, YASS_APP_PRODUCT_VERSION); diff --git a/yass/src/gtk/yass_window.hpp b/yass/src/gtk/yass_window.hpp index ab553e6330..cce404cfcb 100644 --- a/yass/src/gtk/yass_window.hpp +++ b/yass/src/gtk/yass_window.hpp @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2019-2022 Chilledheart */ +/* Copyright (c) 2019-2024 Chilledheart */ #ifndef YASS_WINDOW_H #define YASS_WINDOW_H diff --git a/yass/src/gtk4/yass.cpp b/yass/src/gtk4/yass.cpp index 70a8d3872c..147bdff5a2 100644 --- a/yass/src/gtk4/yass.cpp +++ b/yass/src/gtk4/yass.cpp @@ -21,6 +21,7 @@ #include "crashpad_helper.hpp" #include "crypto/crypter_export.hpp" #include "feature.h" +#include "freedesktop/utils.hpp" #include "gtk4/option_dialog.hpp" #include "gtk4/yass_window.hpp" #include "version.h" @@ -369,7 +370,7 @@ void YASSApp::OnAbout() { comments += YASS_APP_FEATURES; gtk_about_dialog_set_comments(about_dialog, comments.c_str()); gtk_about_dialog_set_copyright(about_dialog, YASS_APP_COPYRIGHT); - gtk_about_dialog_set_license_type(about_dialog, GTK_LICENSE_GPL_2_0); + gtk_about_dialog_set_license_type(about_dialog, GTK_LICENSE_GPL_2_0_ONLY); gtk_about_dialog_set_logo_icon_name(about_dialog, "yass"); gtk_about_dialog_set_program_name(about_dialog, YASS_APP_PRODUCT_NAME); gtk_about_dialog_set_version(about_dialog, YASS_APP_PRODUCT_VERSION); diff --git a/yass/src/gtk4/yass_window.cpp b/yass/src/gtk4/yass_window.cpp index 6e39afbdc0..f92939e224 100644 --- a/yass/src/gtk4/yass_window.cpp +++ b/yass/src/gtk4/yass_window.cpp @@ -10,6 +10,7 @@ #include "cli/cli_connection_stats.hpp" #include "core/utils.hpp" +#include "freedesktop/utils.hpp" #include "gtk/utils.hpp" #include "gtk4/yass.hpp" #include "version.h" diff --git a/yass/src/gtk4/yass_window.hpp b/yass/src/gtk4/yass_window.hpp index 20753102d5..33280bbf57 100644 --- a/yass/src/gtk4/yass_window.hpp +++ b/yass/src/gtk4/yass_window.hpp @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2019-2023 Chilledheart */ +/* Copyright (c) 2019-2024 Chilledheart */ #ifndef YASS_WINDOW_H #define YASS_WINDOW_H diff --git a/yass/src/qt6/lang/lang.qrc b/yass/src/qt6/lang/lang.qrc new file mode 100644 index 0000000000..4f6d7a96fd --- /dev/null +++ b/yass/src/qt6/lang/lang.qrc @@ -0,0 +1,6 @@ + + + yass_en.qm + yass_zh_CN.qm + + diff --git a/yass/src/qt6/lang/yass_en.qm b/yass/src/qt6/lang/yass_en.qm new file mode 100644 index 0000000000..be651eede2 --- /dev/null +++ b/yass/src/qt6/lang/yass_en.qm @@ -0,0 +1 @@ + + + + + OptionDialog + + YASS Option + + + + TCP keep alive + + + + The number of TCP keep-alive probes + + + + TCP keep alive after idle + + + + TCP keep alive interval + + + + Kyber post-quantum key agreement for TLS + + + + Okay + + + + Cancel + + + + + TrayIcon + + Option + + + + Exit + + + + File + + + + + YASSApp + + Connected with conns: + + + + Connecting + + + + Failed to connect due to + + + + Disconnecting + + + + Disconnected with + + + + + YASSWindow + + YASS + + + + Option + + + + Exit + + + + File + + + + About + + + + Help + + + + Start + + + + Stop + + + + Server Host + + + + Server SNI + + + + Server Port + + + + Username + + + + Password + + + + Cipher/Method + + + + Local Host + + + + Local Port + + + + DNS over HTTPS URL + + + + DNS over TLS Host + + + + Timeout + + + + Auto Start + + + + System Proxy + + + + READY + + + + tx rate: + + + + rx rate: + + + + Start Failed + + + + About + + + + Authors: + + + + Last Change: + + + + Enabled Feature: + + + + Website: + + + + Copyright: + + + + License: + + + + GNU General Public License, version 2 only + + + + diff --git a/yass/src/qt6/lang/yass_zh_CN.qm b/yass/src/qt6/lang/yass_zh_CN.qm new file mode 100644 index 0000000000..58c1798181 Binary files /dev/null and b/yass/src/qt6/lang/yass_zh_CN.qm differ diff --git a/yass/src/qt6/lang/yass_zh_CN.ts b/yass/src/qt6/lang/yass_zh_CN.ts new file mode 100644 index 0000000000..2da29693db --- /dev/null +++ b/yass/src/qt6/lang/yass_zh_CN.ts @@ -0,0 +1,216 @@ + + + + + OptionDialog + + YASS Option + YASS 选项 + + + TCP keep alive + TCP 保活 + + + The number of TCP keep-alive probes + TCP 保活测量数 + + + TCP keep alive after idle + TCP 在闲置以后的保活次数 + + + TCP keep alive interval + TCP 保活间隔 + + + Kyber post-quantum key agreement for TLS + TLS的Kyber后量子密钥协商 + + + Okay + 确认 + + + Cancel + 取消 + + + + TrayIcon + + Option + 选项 + 选项 + + + Exit + 退出 + 退出 + + + File + File + 文件 + + + + YASSApp + + Connected with conns: + 已产生连接: + + + Connecting + 连接中 + + + Failed to connect due to + 无法连接因为 + + + Disconnecting + 断开连接中 + + + Disconnected with + 断开连接于服务器 + + + + YASSWindow + + YASS + YASS + + + Option + 选项 + + + Exit + 退出 + + + File + 文件 + + + About + 关于 + + + Help + 帮助 + + + Start + 启动 + + + Stop + 停止 + + + Server Host + 服务器域名 + + + Server SNI + 服务器名称指示 + + + Server Port + 服务器端口号 + + + Username + 用户名 + + + Password + 密码 + + + Cipher/Method + 加密方式 + + + Local Host + 本地域名 + + + Local Port + 本地端口号 + + + DNS over HTTPS URL + 基于 HTTPS 的 DNS (DoH) URL + + + DNS over TLS Host + 基于 TLS 的 DNS (DoT) 域名 + + + Timeout + 超时时间 + + + Auto Start + 随系统自启动 + + + System Proxy + 系统代理 + + + READY + 就绪 + + + + tx rate: + 上传速率: + + + rx rate: + 下载速率: + + + Start Failed + 启动失败 + + + About + 关于 + + + Authors: + 作者: + + + Last Change: + 最后改动: + + + Enabled Feature: + 启用功能: + + + Website: + 官方网站: + + + Copyright: + 版权声明: + + + License: + 分发许可证: + + + GNU General Public License, version 2 only + GNU 通用公共许可证,仅限第2版 + + + diff --git a/yass/src/qt6/option_dialog.cpp b/yass/src/qt6/option_dialog.cpp new file mode 100644 index 0000000000..39f010bc9c --- /dev/null +++ b/yass/src/qt6/option_dialog.cpp @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ +#include "qt6/option_dialog.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include "config/config.hpp" +#include "core/logging.hpp" +#include "core/utils.hpp" + +OptionDialog::OptionDialog(QWidget* parent) : QDialog(parent) { + setWindowTitle(tr("YASS Option")); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + QGridLayout* grid = new QGridLayout; + grid->setContentsMargins(10, 0, 20, 0); + + auto tcp_keep_alive_label = new QLabel(tr("TCP keep alive")); + auto tcp_keep_alive_cnt_label = new QLabel(tr("The number of TCP keep-alive probes")); + auto tcp_keep_alive_idle_timeout_label = new QLabel(tr("TCP keep alive after idle")); + auto tcp_keep_alive_interval_label = new QLabel(tr("TCP keep alive interval")); + + auto enable_post_quantum_kyber_label = new QLabel(tr("Kyber post-quantum key agreement for TLS")); + + grid->addWidget(tcp_keep_alive_label, 0, 0); + grid->addWidget(tcp_keep_alive_cnt_label, 1, 0); + grid->addWidget(tcp_keep_alive_idle_timeout_label, 2, 0); + grid->addWidget(tcp_keep_alive_interval_label, 3, 0); + grid->addWidget(enable_post_quantum_kyber_label, 4, 0); + + tcp_keep_alive_ = new QCheckBox; + tcp_keep_alive_cnt_ = new QLineEdit; + tcp_keep_alive_cnt_->setValidator(new QIntValidator(0, INT32_MAX, this)); + tcp_keep_alive_idle_timeout_ = new QLineEdit; + tcp_keep_alive_idle_timeout_->setValidator(new QIntValidator(0, INT32_MAX, this)); + tcp_keep_alive_interval_ = new QLineEdit; + tcp_keep_alive_interval_->setValidator(new QIntValidator(0, INT32_MAX, this)); + enable_post_quantum_kyber_ = new QCheckBox; + + grid->addWidget(tcp_keep_alive_, 0, 1); + grid->addWidget(tcp_keep_alive_cnt_, 1, 1); + grid->addWidget(tcp_keep_alive_idle_timeout_, 2, 1); + grid->addWidget(tcp_keep_alive_interval_, 3, 1); + grid->addWidget(enable_post_quantum_kyber_, 4, 1); + + okay_button_ = new QPushButton(tr("Okay")); + connect(okay_button_, &QPushButton::clicked, this, &OptionDialog::OnOkayButtonClicked); + + cancel_button_ = new QPushButton(tr("Cancel")); + connect(cancel_button_, &QPushButton::clicked, this, &OptionDialog::OnCancelButtonClicked); + + grid->addWidget(okay_button_, 5, 0); + grid->addWidget(cancel_button_, 5, 1); + + setLayout(grid); + + LoadChanges(); +} + +void OptionDialog::OnOkayButtonClicked() { + if (!OnSave()) { + return; + } + config::SaveConfig(); + accept(); +} + +void OptionDialog::OnCancelButtonClicked() { + reject(); +} + +void OptionDialog::LoadChanges() { + tcp_keep_alive_->setChecked(absl::GetFlag(FLAGS_tcp_keep_alive)); + auto tcp_keep_alive_cnt_str = std::to_string(absl::GetFlag(FLAGS_tcp_keep_alive_cnt)); + tcp_keep_alive_cnt_->setText(QString::fromUtf8(tcp_keep_alive_cnt_str)); + auto tcp_keep_alive_idle_timeout_str = std::to_string(absl::GetFlag(FLAGS_tcp_keep_alive_idle_timeout)); + tcp_keep_alive_idle_timeout_->setText(QString::fromUtf8(tcp_keep_alive_idle_timeout_str)); + auto tcp_keep_alive_interval_str = std::to_string(absl::GetFlag(FLAGS_tcp_keep_alive_interval)); + tcp_keep_alive_interval_->setText(QString::fromUtf8(tcp_keep_alive_interval_str)); + + enable_post_quantum_kyber_->setChecked(absl::GetFlag(FLAGS_enable_post_quantum_kyber)); +} + +bool OptionDialog::OnSave() { + auto tcp_keep_alive = tcp_keep_alive_->checkState() == Qt::CheckState::Checked; + auto tcp_keep_alive_cnt = StringToIntegerU(tcp_keep_alive_cnt_->text().toUtf8().data()); + auto tcp_keep_alive_idle_timeout = StringToIntegerU(tcp_keep_alive_idle_timeout_->text().toUtf8().data()); + auto tcp_keep_alive_interval = StringToIntegerU(tcp_keep_alive_interval_->text().toUtf8().data()); + + auto enable_post_quantum_kyber = enable_post_quantum_kyber_->checkState() == Qt::CheckState::Checked; + + if (!tcp_keep_alive_cnt.has_value() || !tcp_keep_alive_idle_timeout.has_value() || + !tcp_keep_alive_interval.has_value()) { + LOG(WARNING) << "invalid options"; + return false; + } + + absl::SetFlag(&FLAGS_tcp_keep_alive, tcp_keep_alive); + absl::SetFlag(&FLAGS_tcp_keep_alive_cnt, tcp_keep_alive_cnt.value()); + absl::SetFlag(&FLAGS_tcp_keep_alive_idle_timeout, tcp_keep_alive_idle_timeout.value()); + absl::SetFlag(&FLAGS_tcp_keep_alive_interval, tcp_keep_alive_interval.value()); + + absl::SetFlag(&FLAGS_enable_post_quantum_kyber, enable_post_quantum_kyber); + + return true; +} diff --git a/yass/src/qt6/option_dialog.hpp b/yass/src/qt6/option_dialog.hpp new file mode 100644 index 0000000000..3e222301a3 --- /dev/null +++ b/yass/src/qt6/option_dialog.hpp @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ +#ifndef OPTION_DIALOG +#define OPTION_DIALOG + +#include + +class QCheckBox; +class QLineEdit; +class QPushButton; +class OptionDialog : public QDialog { + Q_OBJECT + public: + OptionDialog(QWidget* parent); + + private: + void OnOkayButtonClicked(); + void OnCancelButtonClicked(); + + private: + void LoadChanges(); + bool OnSave(); + + private: + QCheckBox* tcp_keep_alive_; + QLineEdit* tcp_keep_alive_cnt_; + QLineEdit* tcp_keep_alive_idle_timeout_; + QLineEdit* tcp_keep_alive_interval_; + QCheckBox* enable_post_quantum_kyber_; + + QPushButton* okay_button_; + QPushButton* cancel_button_; +}; + +#endif // OPTION_DIALOG diff --git a/yass/src/qt6/tray_icon.cpp b/yass/src/qt6/tray_icon.cpp new file mode 100644 index 0000000000..5dbcfec855 --- /dev/null +++ b/yass/src/qt6/tray_icon.cpp @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ + +#include "qt6/tray_icon.hpp" + +#include +#include + +#include "qt6/option_dialog.hpp" +#include "qt6/yass.hpp" +#include "qt6/yass_window.hpp" + +TrayIcon::TrayIcon(QObject* parent) : QSystemTrayIcon(parent) { + setIcon(QIcon(":/res/images/yass.png")); + + // create action + QAction* option_action = new QAction(tr("Option"), this); + connect(option_action, &QAction::triggered, this, &TrayIcon::OnOption); + + QAction* exit_action = new QAction(tr("Exit"), this); + connect(exit_action, &QAction::triggered, this, [&]() { App()->quit(); }); + + QMenu* menu = new QMenu(tr("File")); + menu->addAction(option_action); + menu->addSeparator(); + menu->addAction(exit_action); + + setContextMenu(menu); + + // connect signal + connect(this, &TrayIcon::activated, this, &TrayIcon::onActivated); +} + +void TrayIcon::OnOption() { + App()->mainWindow()->showWindow(); + OptionDialog dialog(App()->mainWindow()); + dialog.exec(); +} + +void TrayIcon::onActivated(QSystemTrayIcon::ActivationReason reason) { + switch (reason) { + case QSystemTrayIcon::Trigger: // single click + case QSystemTrayIcon::MiddleClick: + case QSystemTrayIcon::DoubleClick: + App()->mainWindow()->showWindow(); + break; + default: + break; + } +} diff --git a/yass/src/qt6/tray_icon.hpp b/yass/src/qt6/tray_icon.hpp new file mode 100644 index 0000000000..8ebd70964b --- /dev/null +++ b/yass/src/qt6/tray_icon.hpp @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ +#ifndef TRAY_ICON_H +#define TRAY_ICON_H + +#include + +class TrayIcon : public QSystemTrayIcon { + Q_OBJECT + + public: + TrayIcon(QObject* parent); + + private slots: + void onActivated(QSystemTrayIcon::ActivationReason); + void OnOption(); +}; +#endif // TRAY_ICON_H diff --git a/yass/src/qt6/yass.cpp b/yass/src/qt6/yass.cpp new file mode 100644 index 0000000000..613c5204cb --- /dev/null +++ b/yass/src/qt6/yass.cpp @@ -0,0 +1,246 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ + +#include "qt6/yass.hpp" +#include "qt6/tray_icon.hpp" +#include "qt6/yass_window.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "third_party/boringssl/src/include/openssl/crypto.h" + +#include "config/config.hpp" +#include "core/logging.hpp" +#include "core/utils.hpp" +#include "crashpad_helper.hpp" +#include "crypto/crypter_export.hpp" +#include "feature.h" +#include "freedesktop/utils.hpp" +#include "version.h" + +int main(int argc, const char** argv) { + SetExecutablePath(argv[0]); + std::string exec_path; + if (!GetExecutablePath(&exec_path)) { + return -1; + } + + // Set C library locale to make sure CommandLine can parse + // argument values in the correct encoding and to make sure + // generated file names (think downloads) are in the file system's + // encoding. + setlocale(LC_ALL, ""); + // For numbers we never want the C library's locale sensitive + // conversion from number to string because the only thing it + // changes is the decimal separator which is not good enough for + // the UI and can be harmful elsewhere. + setlocale(LC_NUMERIC, "C"); + + absl::InitializeSymbolizer(exec_path.c_str()); +#ifdef HAVE_CRASHPAD + CHECK(InitializeCrashpad(exec_path)); +#else + absl::FailureSignalHandlerOptions failure_handle_options; + absl::InstallFailureSignalHandler(failure_handle_options); +#endif + + config::SetClientUsageMessage(exec_path); + config::ReadConfigFileAndArguments(argc, argv); + + CRYPTO_library_init(); + + YASSApp program(argc, const_cast(argv)); + +#ifndef _WIN32 + // setup signal handler + signal(SIGPIPE, SIG_IGN); + + struct sigaction sig_handler; + + sig_handler.sa_handler = [](int signal_num) { App()->quit(); }; + sigemptyset(&sig_handler.sa_mask); + sig_handler.sa_flags = 0; + + sigaction(SIGINT, &sig_handler, nullptr); + + /* Block SIGPIPE in all threads, this can happen if a thread calls write on + a closed pipe. */ + sigset_t sigpipe_mask; + sigemptyset(&sigpipe_mask); + sigaddset(&sigpipe_mask, SIGPIPE); + sigset_t saved_mask; + if (pthread_sigmask(SIG_BLOCK, &sigpipe_mask, &saved_mask) == -1) { + PLOG(WARNING) << "pthread_sigmask failed"; + return -1; + } +#endif + + // call program init + if (!program.Init()) { + return 0; + } + + // enter event loop + return program.exec(); +} + +YASSApp::YASSApp(int& argc, char** argv) : QApplication(argc, argv) { + QObject::connect(this, &YASSApp::OnStartedSignal, this, &YASSApp::OnStarted); + QObject::connect(this, &YASSApp::OnStartFailedSignal, this, &YASSApp::OnStartFailed); + QObject::connect(this, &YASSApp::OnStoppedSignal, this, &YASSApp::OnStopped); +} + +bool YASSApp::Init() { + setApplicationVersion(YASS_APP_TAG); + setWindowIcon(QIcon::fromTheme("yass", QIcon(":/res/images/yass.png"))); + setDesktopFileName("it.gui.yass"); + + QObject::connect(this, &QCoreApplication::aboutToQuit, this, &YASSApp::OnQuit); + + qt_translator_ = new QTranslator(this); + my_translator_ = new QTranslator(this); + // TODO changable locale + QLocale locale = QLocale::system(); + +#if defined(_WIN32) + (void)qt_translator_->load("qt_" + locale.name()); +#else + (void)qt_translator_->load("qt_" + locale.name(), QLibraryInfo::path(QLibraryInfo::TranslationsPath)); +#endif + + if (!my_translator_->load(QString(":/lang/yass_%1.qm").arg(locale.name()))) { + LOG(ERROR) << "Failed to find language resource: " << locale.name().toUtf8().data() + << " fallback to en_us language"; + (void)my_translator_->load(":/lang/yass_en.qm"); + } + qApp->installTranslator(qt_translator_); + qApp->installTranslator(my_translator_); + + main_window_ = new YASSWindow(); + main_window_->show(); + main_window_->moveToCenter(); + + tray_icon_ = new TrayIcon(this); + tray_icon_->show(); + + worker_ = std::make_unique(); + + if (Utils::GetAutoStart()) { + main_window_->OnStartButtonClicked(); + } + idle_timer_ = new QTimer(this); + idle_timer_->setInterval(100); + QObject::connect(idle_timer_, &QTimer::timeout, this, &YASSApp::OnIdle); + + idle_timer_->start(); + + return true; +} + +void YASSApp::OnIdle() { + main_window_->UpdateStatusBar(); +} + +std::string YASSApp::GetStatus() const { + std::ostringstream ss; + if (state_ == STARTED) { + ss << tr("Connected with conns: ").toUtf8().data() << worker_->currentConnections(); + } else if (state_ == STARTING) { + ss << tr("Connecting").toUtf8().data(); + } else if (state_ == START_FAILED) { + ss << tr("Failed to connect due to ").toUtf8().data() << error_msg_.c_str(); + } else if (state_ == STOPPING) { + ss << tr("Disconnecting").toUtf8().data(); + } else { + ss << tr("Disconnected with ").toUtf8().data() << worker_->GetRemoteDomain(); + } + return ss.str(); +} + +void YASSApp::OnStart(bool quiet) { + state_ = STARTING; + std::string err_msg = SaveConfig(); + if (!err_msg.empty()) { + OnStartFailed(err_msg); + return; + } + + absl::AnyInvocable callback; + if (!quiet) { + callback = [this](asio::error_code ec) { + bool successed = false; + std::string msg; + + if (ec) { + msg = ec.message(); + successed = false; + } else { + successed = true; + } + + if (successed) + emit OnStartedSignal(); + else + emit OnStartFailedSignal(msg); + }; + } + worker_->Start(std::move(callback)); +} + +void YASSApp::OnStop(bool quiet) { + state_ = STOPPING; + + absl::AnyInvocable callback; + if (!quiet) { + callback = [this]() { emit OnStoppedSignal(); }; + } + worker_->Stop(std::move(callback)); +} + +void YASSApp::OnQuit() { + LOG(WARNING) << "Application Exit"; + PrintMallocStats(); +} + +void YASSApp::OnStarted() { + state_ = STARTED; + config::SaveConfig(); + main_window_->Started(); +} + +void YASSApp::OnStartFailed(const std::string& error_msg) { + state_ = START_FAILED; + + error_msg_ = error_msg; + main_window_->StartFailed(); +} + +void YASSApp::OnStopped() { + state_ = STOPPED; + main_window_->Stopped(); +} + +std::string YASSApp::SaveConfig() { + auto server_host = main_window_->GetServerHost(); + auto server_sni = main_window_->GetServerSNI(); + auto server_port = main_window_->GetServerPort(); + auto username = main_window_->GetUsername(); + auto password = main_window_->GetPassword(); + auto method_string = main_window_->GetMethod(); + auto local_host = main_window_->GetLocalHost(); + auto local_port = main_window_->GetLocalPort(); + auto doh_url = main_window_->GetDoHUrl(); + auto dot_host = main_window_->GetDoTHost(); + auto connect_timeout = main_window_->GetTimeout(); + + return config::ReadConfigFromArgument(server_host, server_sni, server_port, username, password, method_string, + local_host, local_port, doh_url, dot_host, connect_timeout); +} diff --git a/yass/src/qt6/yass.hpp b/yass/src/qt6/yass.hpp new file mode 100644 index 0000000000..d6a6a12241 --- /dev/null +++ b/yass/src/qt6/yass.hpp @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ +#ifndef _YASS_QT6_YASS_HPP +#define _YASS_QT6_YASS_HPP + +#include + +#include "cli/cli_worker.hpp" + +class TrayIcon; +class QTimer; +class QTranslator; +class YASSWindow; +class YASSApp : public QApplication { + Q_OBJECT + public: + YASSApp(int& argc, char** argv); + + bool Init(); + + private slots: + void OnIdle(); + + public: + void OnStart(bool quiet = false); + void OnStop(bool quiet = false); + + std::string GetStatus() const; + enum YASSState { STARTED, STARTING, START_FAILED, STOPPING, STOPPED, MAX_STATE }; + YASSState GetState() const { return state_; } + + YASSWindow* mainWindow() { return main_window_; } + + signals: + void OnStartedSignal(); + void OnStartFailedSignal(const std::string& error_msg); + void OnStoppedSignal(); + + private slots: + void OnQuit(); + void OnStarted(); + void OnStartFailed(const std::string& error_msg); + void OnStopped(); + + private: + std::string SaveConfig(); + + private: + QTimer* idle_timer_; + QTranslator* qt_translator_; + QTranslator* my_translator_; + + private: + YASSState state_ = STOPPED; + + friend class YASSWindow; + YASSWindow* main_window_ = nullptr; + TrayIcon* tray_icon_ = nullptr; + + std::unique_ptr worker_; + std::string error_msg_; +}; + +inline YASSApp* App() { + return static_cast(qApp); +} + +#endif // _YASS_QT6_YASS_HPP diff --git a/yass/src/qt6/yass.qrc b/yass/src/qt6/yass.qrc new file mode 100644 index 0000000000..33a4af05aa --- /dev/null +++ b/yass/src/qt6/yass.qrc @@ -0,0 +1,5 @@ + + + images/yass.png + + diff --git a/yass/src/qt6/yass_window.cpp b/yass/src/qt6/yass_window.cpp new file mode 100644 index 0000000000..ab15bea849 --- /dev/null +++ b/yass/src/qt6/yass_window.cpp @@ -0,0 +1,415 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ + +#include "qt6/yass_window.hpp" +#include "qt6/option_dialog.hpp" +#include "qt6/yass.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cli/cli_connection_stats.hpp" +#include "config/config.hpp" +#include "feature.h" +#include "freedesktop/utils.hpp" +#include "version.h" + +YASSWindow::YASSWindow(QWidget* parent) : QMainWindow(parent) { + setWindowIcon(QIcon::fromTheme("yass", QIcon(":/res/images/yass.png"))); + setWindowTitle(tr("YASS")); + + // Vertical Box + + QVBoxLayout* vbox = new QVBoxLayout; + vbox->addSpacing(0); + vbox->setContentsMargins(0, 0, 0, 0); + + // MenuBar << Vertical Box + // + QAction* option_action = new QAction(tr("Option"), this); + connect(option_action, &QAction::triggered, this, &YASSWindow::OnOption); + + QAction* exit_action = new QAction(tr("Exit"), this); + connect(exit_action, &QAction::triggered, this, [&]() { App()->quit(); }); + + QMenu* menu = new QMenu(tr("File")); + menu->addAction(option_action); + menu->addSeparator(); + menu->addAction(exit_action); + + QAction* about_action = new QAction(tr("About"), this); + connect(about_action, &QAction::triggered, this, &YASSWindow::OnAbout); + + QMenu* help_menu = new QMenu(tr("Help")); + help_menu->addAction(about_action); + + QMenuBar* menubar = new QMenuBar; + menubar->addMenu(menu); + menubar->addMenu(help_menu); + vbox->addWidget(menubar); + + // Horizon Box << Vertical Box + + QHBoxLayout* hbox = new QHBoxLayout; + hbox->addSpacing(20); + hbox->setContentsMargins(0, 0, 0, 0); + + // Left Box << Horizon Box << Vertical Box + + QVBoxLayout* left_box = new QVBoxLayout; + left_box->addSpacing(0); + left_box->setContentsMargins(15, 0, 15, 0); + start_button_ = new QPushButton(tr("Start")); + stop_button_ = new QPushButton(tr("Stop")); + start_button_->setContentsMargins(0, 30, 0, 30); + connect(start_button_, &QPushButton::clicked, this, &YASSWindow::OnStartButtonClicked); + left_box->addWidget(start_button_); + stop_button_->setContentsMargins(0, 30, 0, 30); + connect(stop_button_, &QPushButton::clicked, this, &YASSWindow::OnStopButtonClicked); + stop_button_->setEnabled(false); + left_box->addWidget(stop_button_); + hbox->addItem(left_box); + + // Right Grid << Horizon Box << Vertical Box + + QGridLayout* right_grid = new QGridLayout; + right_grid->setContentsMargins(10, 0, 20, 0); + + auto server_host_label = new QLabel(tr("Server Host")); + auto server_sni_label = new QLabel(tr("Server SNI")); + auto server_port_label = new QLabel(tr("Server Port")); + auto username_label = new QLabel(tr("Username")); + auto password_label = new QLabel(tr("Password")); + auto method_label = new QLabel(tr("Cipher/Method")); + auto local_host_label = new QLabel(tr("Local Host")); + auto local_port_label = new QLabel(tr("Local Port")); + auto doh_url_label = new QLabel(tr("DNS over HTTPS URL")); + auto dot_host_label = new QLabel(tr("DNS over TLS Host")); + auto timeout_label = new QLabel(tr("Timeout")); + auto autostart_label = new QLabel(tr("Auto Start")); + auto systemproxy_label = new QLabel(tr("System Proxy")); + + right_grid->addWidget(server_host_label, 0, 0); + right_grid->addWidget(server_sni_label, 1, 0); + right_grid->addWidget(server_port_label, 2, 0); + right_grid->addWidget(username_label, 3, 0); + right_grid->addWidget(password_label, 4, 0); + right_grid->addWidget(method_label, 5, 0); + right_grid->addWidget(local_host_label, 6, 0); + right_grid->addWidget(local_port_label, 7, 0); + right_grid->addWidget(doh_url_label, 8, 0); + right_grid->addWidget(dot_host_label, 9, 0); + right_grid->addWidget(timeout_label, 10, 0); + right_grid->addWidget(autostart_label, 11, 0); + right_grid->addWidget(systemproxy_label, 12, 0); + + server_host_ = new QLineEdit; + server_sni_ = new QLineEdit; + server_port_ = new QLineEdit; + server_port_->setValidator(new QIntValidator(0, UINT16_MAX, this)); + username_ = new QLineEdit; + password_ = new QLineEdit; + password_->setEchoMode(QLineEdit::Password); + + static constexpr const char* const method_names[] = { +#define XX(num, name, string) string, + CIPHER_METHOD_VALID_MAP(XX) +#undef XX + }; + + method_ = new QComboBox; + for (const char* method_name : method_names) { + method_->addItem(method_name); + } + + local_host_ = new QLineEdit; + local_port_ = new QLineEdit; + local_port_->setValidator(new QIntValidator(0, UINT16_MAX, this)); + doh_url_ = new QLineEdit; + doh_url_->setPlaceholderText("https://1.1.1.1/dns-query"); + dot_host_ = new QLineEdit; + dot_host_->setPlaceholderText("1.1.1.1"); + timeout_ = new QLineEdit; + timeout_->setValidator(new QIntValidator(0, INT32_MAX, this)); + + autostart_ = new QCheckBox; + systemproxy_ = new QCheckBox; + autostart_->setChecked(Utils::GetAutoStart()); + systemproxy_->setChecked(Utils::GetSystemProxy()); + connect(autostart_, &QPushButton::clicked, this, &YASSWindow::OnAutoStartClicked); + connect(systemproxy_, &QPushButton::clicked, this, &YASSWindow::OnSystemProxyClicked); + + right_grid->addWidget(server_host_, 0, 1); + right_grid->addWidget(server_sni_, 1, 1); + right_grid->addWidget(server_port_, 2, 1); + right_grid->addWidget(username_, 3, 1); + right_grid->addWidget(password_, 4, 1); + right_grid->addWidget(method_, 5, 1); + right_grid->addWidget(local_host_, 6, 1); + right_grid->addWidget(local_port_, 7, 1); + right_grid->addWidget(doh_url_, 8, 1); + right_grid->addWidget(dot_host_, 9, 1); + right_grid->addWidget(timeout_, 10, 1); + right_grid->addWidget(autostart_, 11, 1); + right_grid->addWidget(systemproxy_, 12, 1); + + hbox->addItem(right_grid); + + // StatusBar << Vertical Box + + vbox->addItem(hbox); + status_bar_ = new QStatusBar; + status_bar_->showMessage(tr("READY")); + vbox->addWidget(status_bar_); + + QWidget* wrapper = new QWidget; + wrapper->setObjectName("mainWrapper"); + wrapper->setLayout(vbox); + + setCentralWidget(wrapper); + + LoadChanges(); +} + +void YASSWindow::moveToCenter() { + move(screen()->geometry().center() - frameGeometry().center()); +} + +void YASSWindow::showWindow() { + showNormal(); + show(); + raise(); + activateWindow(); +} + +void YASSWindow::OnStartButtonClicked() { + start_button_->setEnabled(false); + stop_button_->setEnabled(false); + + server_host_->setEnabled(false); + server_sni_->setEnabled(false); + server_port_->setEnabled(false); + username_->setEnabled(false); + password_->setEnabled(false); + method_->setEnabled(false); + local_host_->setEnabled(false); + local_port_->setEnabled(false); + doh_url_->setEnabled(false); + dot_host_->setEnabled(false); + timeout_->setEnabled(false); + + App()->OnStart(); +} + +void YASSWindow::OnStopButtonClicked() { + start_button_->setEnabled(false); + stop_button_->setEnabled(false); + + App()->OnStop(); +} + +void YASSWindow::OnAutoStartClicked() { + Utils::EnableAutoStart(autostart_->checkState() == Qt::CheckState::Checked); +} + +void YASSWindow::OnSystemProxyClicked() { + Utils::SetSystemProxy(systemproxy_->checkState() == Qt::CheckState::Checked); +} + +std::string YASSWindow::GetServerHost() { + return server_host_->text().toUtf8().data(); +} + +std::string YASSWindow::GetServerSNI() { + return server_sni_->text().toUtf8().data(); +} + +std::string YASSWindow::GetServerPort() { + return server_port_->text().toUtf8().data(); +} + +std::string YASSWindow::GetUsername() { + return username_->text().toUtf8().data(); +} + +std::string YASSWindow::GetPassword() { + return password_->text().toUtf8().data(); +} + +std::string YASSWindow::GetMethod() { + return method_->currentText().toUtf8().data(); +} + +std::string YASSWindow::GetLocalHost() { + return local_host_->text().toUtf8().data(); +} + +std::string YASSWindow::GetLocalPort() { + return local_port_->text().toUtf8().data(); +} + +std::string YASSWindow::GetDoHUrl() { + return doh_url_->text().toUtf8().data(); +} + +std::string YASSWindow::GetDoTHost() { + return dot_host_->text().toUtf8().data(); +} + +std::string YASSWindow::GetTimeout() { + return timeout_->text().toUtf8().data(); +} + +std::string YASSWindow::GetStatusMessage() { + if (App()->GetState() != YASSApp::STARTED) { + return App()->GetStatus(); + } + uint64_t sync_time = GetMonotonicTime(); + uint64_t delta_time = sync_time - last_sync_time_; + if (delta_time > NS_PER_SECOND) { + uint64_t rx_bytes = net::cli::total_rx_bytes; + uint64_t tx_bytes = net::cli::total_tx_bytes; + rx_rate_ = static_cast(rx_bytes - last_rx_bytes_) / delta_time * NS_PER_SECOND; + tx_rate_ = static_cast(tx_bytes - last_tx_bytes_) / delta_time * NS_PER_SECOND; + last_sync_time_ = sync_time; + last_rx_bytes_ = rx_bytes; + last_tx_bytes_ = tx_bytes; + } + + std::ostringstream ss; + ss << App()->GetStatus(); + ss << tr(" tx rate: ").toUtf8().data(); + HumanReadableByteCountBin(&ss, rx_rate_); + ss << "/s"; + ss << tr(" rx rate: ").toUtf8().data(); + HumanReadableByteCountBin(&ss, tx_rate_); + ss << "/s"; + + return ss.str(); +} + +void YASSWindow::Started() { + UpdateStatusBar(); + + start_button_->setEnabled(false); + stop_button_->setEnabled(true); +} + +void YASSWindow::StartFailed() { + UpdateStatusBar(); + + start_button_->setEnabled(true); + stop_button_->setEnabled(false); + + server_host_->setEnabled(true); + server_sni_->setEnabled(true); + server_port_->setEnabled(true); + username_->setEnabled(true); + password_->setEnabled(true); + method_->setEnabled(true); + local_host_->setEnabled(true); + local_port_->setEnabled(true); + doh_url_->setEnabled(true); + dot_host_->setEnabled(true); + timeout_->setEnabled(true); + + QMessageBox::warning(this, tr("Start Failed"), QString::fromStdString(App()->GetStatus())); +} + +void YASSWindow::Stopped() { + UpdateStatusBar(); + + start_button_->setEnabled(true); + stop_button_->setEnabled(false); + + server_host_->setEnabled(true); + server_sni_->setEnabled(true); + server_port_->setEnabled(true); + username_->setEnabled(true); + password_->setEnabled(true); + method_->setEnabled(true); + local_host_->setEnabled(true); + local_port_->setEnabled(true); + doh_url_->setEnabled(true); + dot_host_->setEnabled(true); + timeout_->setEnabled(true); +} + +void YASSWindow::LoadChanges() { + auto server_host_str = absl::GetFlag(FLAGS_server_host); + auto server_sni_str = absl::GetFlag(FLAGS_server_sni); + auto server_port_str = std::to_string(absl::GetFlag(FLAGS_server_port)); + auto username_str = absl::GetFlag(FLAGS_username); + auto password_str = absl::GetFlag(FLAGS_password); + uint32_t cipher_method = absl::GetFlag(FLAGS_method).method; + auto local_host_str = absl::GetFlag(FLAGS_local_host); + auto local_port_str = std::to_string(absl::GetFlag(FLAGS_local_port)); + auto doh_url_str = absl::GetFlag(FLAGS_doh_url); + auto dot_host_str = absl::GetFlag(FLAGS_dot_host); + auto timeout_str = std::to_string(absl::GetFlag(FLAGS_connect_timeout)); + + server_host_->setText(QString::fromStdString(server_host_str)); + server_sni_->setText(QString::fromStdString(server_sni_str)); + server_port_->setText(QString::fromStdString(server_port_str)); + username_->setText(QString::fromStdString(username_str)); + password_->setText(QString::fromStdString(password_str)); + + static const uint32_t method_ids[] = { +#define XX(num, name, string) num, + CIPHER_METHOD_VALID_MAP(XX) +#undef XX + }; + unsigned int i; + for (i = 0; i < std::size(method_ids); ++i) { + if (cipher_method == method_ids[i]) + break; + } + + method_->setCurrentIndex(i); + + local_host_->setText(QString::fromStdString(local_host_str)); + local_port_->setText(QString::fromStdString(local_port_str)); + doh_url_->setText(QString::fromStdString(doh_url_str)); + dot_host_->setText(QString::fromStdString(dot_host_str)); + timeout_->setText(QString::fromStdString(timeout_str)); +} + +void YASSWindow::UpdateStatusBar() { + std::string status_msg = GetStatusMessage(); + if (last_status_msg_ == status_msg) { + return; + } + last_status_msg_ = status_msg; + status_bar_->showMessage(QString::fromStdString(last_status_msg_)); +} + +void YASSWindow::OnOption() { + OptionDialog dialog(this); + dialog.exec(); +} + +void YASSWindow::OnAbout() { + QString title, text; + + title = tr("About ") + QString::fromUtf8(YASS_APP_PRODUCT_NAME) + " " + QString::fromUtf8(YASS_APP_PRODUCT_VERSION); + + text += tr("Last Change: ") + QString::fromUtf8(YASS_APP_LAST_CHANGE) + "\n"; + text += tr("Enabled Feature: ") + QString::fromUtf8(YASS_APP_FEATURES) + "\n"; + text += tr("Website: ") + QString::fromUtf8(YASS_APP_WEBSITE) + "\n"; + text += tr("Copyright: ") + QString::fromUtf8(YASS_APP_COPYRIGHT) + "\n"; + text += tr("Authors: ") + QString::fromUtf8(YASS_APP_COMPANY_NAME) + "\n"; + text += tr("License: ") + tr("GNU General Public License, version 2 only") + "\n"; + QMessageBox::about(this, title, text); +} diff --git a/yass/src/qt6/yass_window.hpp b/yass/src/qt6/yass_window.hpp new file mode 100644 index 0000000000..1723f784e1 --- /dev/null +++ b/yass/src/qt6/yass_window.hpp @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ + +#ifndef YASS_WINDOW_H +#define YASS_WINDOW_H + +#include + +#include + +class QCheckBox; +class QComboBox; +class QPushButton; +class QStatusBar; +class QLineEdit; +class YASSWindow : public QMainWindow { + Q_OBJECT + + public: + YASSWindow(QWidget* parent = nullptr); + + void moveToCenter(); + void showWindow(); + + friend class YASSApp; + + public slots: + void OnStartButtonClicked(); + void OnStopButtonClicked(); + + void OnAutoStartClicked(); + void OnSystemProxyClicked(); + + private: + // Left Panel + QPushButton* start_button_; + QPushButton* stop_button_; + + // Right Panel + QLineEdit* server_host_; + QLineEdit* server_sni_; + QLineEdit* server_port_; + QLineEdit* username_; + QLineEdit* password_; + QComboBox* method_; + QLineEdit* local_host_; + QLineEdit* local_port_; + QLineEdit* doh_url_; + QLineEdit* dot_host_; + QLineEdit* timeout_; + QCheckBox* autostart_; + QCheckBox* systemproxy_; + + QStatusBar* status_bar_; + std::string last_status_msg_; + + public: + std::string GetServerHost(); + std::string GetServerSNI(); + std::string GetServerPort(); + std::string GetUsername(); + std::string GetPassword(); + std::string GetMethod(); + std::string GetLocalHost(); + std::string GetLocalPort(); + std::string GetDoHUrl(); + std::string GetDoTHost(); + std::string GetTimeout(); + std::string GetStatusMessage(); + + void Started(); + void StartFailed(); + void Stopped(); + + void LoadChanges(); + void UpdateStatusBar(); + + private slots: + void OnAbout(); + void OnOption(); + + private: + uint64_t last_sync_time_ = 0; + uint64_t last_rx_bytes_ = 0; + uint64_t last_tx_bytes_ = 0; + uint64_t rx_rate_ = 0; + uint64_t tx_rate_ = 0; +}; + +#endif // YASS_WINDOW_H diff --git a/yass/src/win32/utils_win.cpp b/yass/src/win32/utils_win.cpp index bdbb04f364..69386f62af 100644 --- a/yass/src/win32/utils_win.cpp +++ b/yass/src/win32/utils_win.cpp @@ -226,15 +226,25 @@ HMODULE LoadRasapi32Library() { return LoadLibraryExW(L"rasapi32.dll", nullptr, 0); } +static std::once_flag Rasapi32InitOnceFlag; + DWORD WINAPI RasEnumEntriesW(LPCWSTR unnamedParam1, LPCWSTR unnamedParam2, LPRASENTRYNAMEW unnamedParam3, LPDWORD unnamedParam4, LPDWORD unnamedParam5) { - HMODULE raspi32Module = LoadRasapi32Library(); + static HMODULE m; + std::call_once(Rasapi32InitOnceFlag, [&]() { + m = LoadRasapi32Library(); + DCHECK_NE(m, nullptr); + }); + if (m == nullptr) { + ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; + } static const auto fPointer = - reinterpret_cast(reinterpret_cast(::GetProcAddress(raspi32Module, "RasEnumEntriesW"))); + reinterpret_cast(reinterpret_cast(::GetProcAddress(m, "RasEnumEntriesW"))); if (fPointer == nullptr) { ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; @@ -242,8 +252,6 @@ DWORD WINAPI RasEnumEntriesW(LPCWSTR unnamedParam1, DWORD ret = fPointer(unnamedParam1, unnamedParam2, unnamedParam3, unnamedParam4, unnamedParam5); - ::FreeLibrary(raspi32Module); - return ret; } @@ -1060,12 +1068,9 @@ bool GetAllRasConnection(std::vector* result) { LOG(WARNING) << "RasEnumEntriesA: mismatched dwCb and dwEntries"; return false; } - // Allocate the memory needed for the array of RAS entry names. - lpRasEntryName = reinterpret_cast(malloc(sizeof(RASENTRYNAMEW) * dwEntries)); - if (lpRasEntryName == nullptr) { - LOG(WARNING) << "RasEnumEntries: not enough memory"; - return false; - } + std::vector vRasEntryName; + vRasEntryName.resize(dwEntries); + lpRasEntryName = &vRasEntryName[0]; // The first RASENTRYNAME structure in the array must contain the structure size for (DWORD i = 0; i < dwEntries; ++i) { lpRasEntryName[i].dwSize = sizeof(RASENTRYNAMEW); @@ -1075,27 +1080,25 @@ bool GetAllRasConnection(std::vector* result) { dwRet = RasEnumEntriesW(nullptr, nullptr, lpRasEntryName, &dwCb, &dwEntries); // If successful, print the RAS entry names - if (dwRet == ERROR_SUCCESS) { - LOG(INFO) << "RasEnumEntries success found: " << dwEntries << " entries"; + if (dwRet == ERROR_SUCCESS && dwEntries != 0) { + DCHECK_LE(dwEntries, vRasEntryName.size()); + vRasEntryName.resize(dwEntries); for (DWORD i = 0; i < dwEntries; i++) { result->emplace_back(lpRasEntryName[i].szEntryName); } - } else { - PLOG(WARNING) << "RasEnumEntries failed"; } - // Deallocate memory for the connection buffer - free(lpRasEntryName); - lpRasEntryName = nullptr; - } else if (dwRet == ERROR_SUCCESS) { - LOG(INFO) << "RasEnumEntries success found: " << dwEntries << " entries"; + } else if (dwRet == ERROR_SUCCESS && dwEntries != 0) { + DCHECK_LE(dwEntries, std::size(rasEntryNames)); for (DWORD i = 0; i < dwEntries; i++) { result->emplace_back(lpRasEntryName[i].szEntryName); } - } else { - PLOG(WARNING) << "RasEnumEntries failed"; } - if (dwRet == ERROR_SUCCESS && result->empty()) { + if (dwRet == ERROR_SUCCESS && dwEntries != 0) { + LOG(INFO) << "RasEnumEntries: found: " << dwEntries << " entries"; + } else if (dwRet == ERROR_SUCCESS && dwEntries == 0) { LOG(INFO) << "RasEnumEntries: there were no RAS entry names found"; + } else if (dwRet != ERROR_SUCCESS) { + PLOG(WARNING) << "RasEnumEntries failed"; } return dwRet == ERROR_SUCCESS; } diff --git a/yass/third_party/abseil-cpp/CMake/AbseilDll.cmake b/yass/third_party/abseil-cpp/CMake/AbseilDll.cmake index 2a40532a43..b15e90ba8b 100644 --- a/yass/third_party/abseil-cpp/CMake/AbseilDll.cmake +++ b/yass/third_party/abseil-cpp/CMake/AbseilDll.cmake @@ -508,6 +508,7 @@ set(ABSL_INTERNAL_DLL_TARGETS "log_internal_check_op" "log_internal_conditions" "log_internal_config" + "log_internal_fnmatch" "log_internal_format" "log_internal_globals" "log_internal_log_impl" @@ -587,6 +588,7 @@ set(ABSL_INTERNAL_DLL_TARGETS "strerror" "strings" "strings_internal" + "string_view" "symbolize" "synchronization" "thread_pool" @@ -597,6 +599,7 @@ set(ABSL_INTERNAL_DLL_TARGETS "type_traits" "utility" "variant" + "vlog_config_internal" ) set(ABSL_INTERNAL_TEST_DLL_FILES @@ -675,12 +678,7 @@ function(absl_internal_dll_contains) STRING(REGEX REPLACE "^absl::" "" _target ${ABSL_INTERNAL_DLL_TARGET}) - list(FIND - ABSL_INTERNAL_DLL_TARGETS - "${_target}" - _index) - - if (${_index} GREATER -1) + if (_target IN_LIST ABSL_INTERNAL_DLL_TARGETS) set(${ABSL_INTERNAL_DLL_OUTPUT} 1 PARENT_SCOPE) else() set(${ABSL_INTERNAL_DLL_OUTPUT} 0 PARENT_SCOPE) @@ -697,12 +695,7 @@ function(absl_internal_test_dll_contains) STRING(REGEX REPLACE "^absl::" "" _target ${ABSL_INTERNAL_TEST_DLL_TARGET}) - list(FIND - ABSL_INTERNAL_TEST_DLL_TARGETS - "${_target}" - _index) - - if (${_index} GREATER -1) + if (_target IN_LIST ABSL_INTERNAL_TEST_DLL_TARGETS) set(${ABSL_INTERNAL_TEST_DLL_OUTPUT} 1 PARENT_SCOPE) else() set(${ABSL_INTERNAL_TEST_DLL_OUTPUT} 0 PARENT_SCOPE) diff --git a/yass/third_party/abseil-cpp/absl/CMakeLists.txt b/yass/third_party/abseil-cpp/absl/CMakeLists.txt index 3a7c12fe99..810d7f31b9 100644 --- a/yass/third_party/abseil-cpp/absl/CMakeLists.txt +++ b/yass/third_party/abseil-cpp/absl/CMakeLists.txt @@ -36,9 +36,9 @@ add_subdirectory(time) add_subdirectory(types) add_subdirectory(utility) -if (${ABSL_BUILD_DLL}) +if (ABSL_BUILD_DLL) absl_make_dll() - if (${ABSL_BUILD_TEST_HELPERS}) + if ((BUILD_TESTING AND ABSL_BUILD_TESTING) OR ABSL_BUILD_TEST_HELPERS) absl_make_dll(TEST ON) endif() endif() diff --git a/yass/third_party/abseil-cpp/absl/algorithm/container.h b/yass/third_party/abseil-cpp/absl/algorithm/container.h index c7bafae147..a2d126b728 100644 --- a/yass/third_party/abseil-cpp/absl/algorithm/container.h +++ b/yass/third_party/abseil-cpp/absl/algorithm/container.h @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include diff --git a/yass/third_party/abseil-cpp/absl/base/attributes.h b/yass/third_party/abseil-cpp/absl/base/attributes.h index 7666a5e23f..9955f14073 100644 --- a/yass/third_party/abseil-cpp/absl/base/attributes.h +++ b/yass/third_party/abseil-cpp/absl/base/attributes.h @@ -821,6 +821,32 @@ #define ABSL_ATTRIBUTE_LIFETIME_BOUND #endif +// ABSL_INTERNAL_ATTRIBUTE_VIEW indicates that a type acts like a view i.e. a +// raw (non-owning) pointer. This enables diagnoses similar to those enabled by +// ABSL_ATTRIBUTE_LIFETIME_BOUND. +// +// See the following links for details: +// https://reviews.llvm.org/D64448 +// https://lists.llvm.org/pipermail/cfe-dev/2018-November/060355.html +#if ABSL_HAVE_CPP_ATTRIBUTE(gsl::Pointer) +#define ABSL_INTERNAL_ATTRIBUTE_VIEW [[gsl::Pointer]] +#else +#define ABSL_INTERNAL_ATTRIBUTE_VIEW +#endif + +// ABSL_INTERNAL_ATTRIBUTE_OWNER indicates that a type acts like a smart +// (owning) pointer. This enables diagnoses similar to those enabled by +// ABSL_ATTRIBUTE_LIFETIME_BOUND. +// +// See the following links for details: +// https://reviews.llvm.org/D64448 +// https://lists.llvm.org/pipermail/cfe-dev/2018-November/060355.html +#if ABSL_HAVE_CPP_ATTRIBUTE(gsl::Owner) +#define ABSL_INTERNAL_ATTRIBUTE_OWNER [[gsl::Owner]] +#else +#define ABSL_INTERNAL_ATTRIBUTE_OWNER +#endif + // ABSL_ATTRIBUTE_TRIVIAL_ABI // Indicates that a type is "trivially relocatable" -- meaning it can be // relocated without invoking the constructor/destructor, using a form of move diff --git a/yass/third_party/abseil-cpp/absl/base/config.h b/yass/third_party/abseil-cpp/absl/base/config.h index 5fa9f0efe5..bc3893ca39 100644 --- a/yass/third_party/abseil-cpp/absl/base/config.h +++ b/yass/third_party/abseil-cpp/absl/base/config.h @@ -231,12 +231,11 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || #endif // ABSL_HAVE_TLS is defined to 1 when __thread should be supported. -// We assume __thread is supported on Linux or Asylo when compiled with Clang or +// We assume __thread is supported on Linux when compiled with Clang or // compiled against libstdc++ with _GLIBCXX_HAVE_TLS defined. #ifdef ABSL_HAVE_TLS #error ABSL_HAVE_TLS cannot be directly set -#elif (defined(__linux__) || defined(__ASYLO__)) && \ - (defined(__clang__) || defined(_GLIBCXX_HAVE_TLS)) +#elif (defined(__linux__)) && (defined(__clang__) || defined(_GLIBCXX_HAVE_TLS)) #define ABSL_HAVE_TLS 1 #endif @@ -414,9 +413,9 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || #elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ defined(_AIX) || defined(__ros__) || defined(__native_client__) || \ defined(__asmjs__) || defined(__EMSCRIPTEN__) || defined(__Fuchsia__) || \ - defined(__sun) || defined(__ASYLO__) || defined(__myriad2__) || \ - defined(__HAIKU__) || defined(__OpenBSD__) || defined(__NetBSD__) || \ - defined(__QNX__) || defined(__VXWORKS__) || defined(__hexagon__) + defined(__sun) || defined(__myriad2__) || defined(__HAIKU__) || \ + defined(__OpenBSD__) || defined(__NetBSD__) || defined(__QNX__) || \ + defined(__VXWORKS__) || defined(__hexagon__) #define ABSL_HAVE_MMAP 1 #endif @@ -900,7 +899,7 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || #error ABSL_INTERNAL_HAS_CXA_DEMANGLE cannot be directly set #elif defined(OS_ANDROID) && (defined(__i386__) || defined(__x86_64__)) #define ABSL_INTERNAL_HAS_CXA_DEMANGLE 0 -#elif defined(__GNUC__) && !defined(__mips__) +#elif defined(__GNUC__) #define ABSL_INTERNAL_HAS_CXA_DEMANGLE 1 #elif defined(__clang__) && !defined(_MSC_VER) #define ABSL_INTERNAL_HAS_CXA_DEMANGLE 1 diff --git a/yass/third_party/abseil-cpp/absl/container/internal/compressed_tuple_test.cc b/yass/third_party/abseil-cpp/absl/container/internal/compressed_tuple_test.cc index 49818fb853..3cd9e18bbb 100644 --- a/yass/third_party/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +++ b/yass/third_party/abseil-cpp/absl/container/internal/compressed_tuple_test.cc @@ -15,8 +15,11 @@ #include "absl/container/internal/compressed_tuple.h" #include +#include #include +#include #include +#include #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -55,6 +58,7 @@ namespace { using absl::test_internal::CopyableMovableInstance; using absl::test_internal::InstanceTracker; +using ::testing::Each; TEST(CompressedTupleTest, Sizeof) { EXPECT_EQ(sizeof(int), sizeof(CompressedTuple)); @@ -71,6 +75,30 @@ TEST(CompressedTupleTest, Sizeof) { sizeof(CompressedTuple, NotEmpty, Empty<1>>)); } +TEST(CompressedTupleTest, PointerToEmpty) { + auto to_void_ptrs = [](const auto&... objs) { + return std::vector{static_cast(&objs)...}; + }; + { + using Tuple = CompressedTuple>; + EXPECT_EQ(sizeof(int), sizeof(Tuple)); + Tuple t; + EXPECT_THAT(to_void_ptrs(t.get<1>()), Each(&t)); + } + { + using Tuple = CompressedTuple, Empty<1>>; + EXPECT_EQ(sizeof(int), sizeof(Tuple)); + Tuple t; + EXPECT_THAT(to_void_ptrs(t.get<1>(), t.get<2>()), Each(&t)); + } + { + using Tuple = CompressedTuple, Empty<1>, Empty<2>>; + EXPECT_EQ(sizeof(int), sizeof(Tuple)); + Tuple t; + EXPECT_THAT(to_void_ptrs(t.get<1>(), t.get<2>(), t.get<3>()), Each(&t)); + } +} + TEST(CompressedTupleTest, OneMoveOnRValueConstructionTemp) { InstanceTracker tracker; CompressedTuple x1(CopyableMovableInstance(1)); diff --git a/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc b/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc index c23c1f3bb2..1cae03819d 100644 --- a/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +++ b/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc @@ -23,7 +23,10 @@ #include "absl/base/attributes.h" #include "absl/base/config.h" #include "absl/base/dynamic_annotations.h" +#include "absl/base/internal/endian.h" +#include "absl/base/optimization.h" #include "absl/container/internal/container_memory.h" +#include "absl/container/internal/hashtablez_sampler.h" #include "absl/hash/hash.h" namespace absl { @@ -157,6 +160,8 @@ FindInfo find_first_non_full_outofline(const CommonFields& common, return find_first_non_full(common, hash); } +namespace { + // Returns the address of the slot just after slot assuming each slot has the // specified size. static inline void* NextSlot(void* slot, size_t slot_size) { @@ -169,8 +174,22 @@ static inline void* PrevSlot(void* slot, size_t slot_size) { return reinterpret_cast(reinterpret_cast(slot) - slot_size); } -void DropDeletesWithoutResize(CommonFields& common, const void* hash_fn, - const PolicyFunctions& policy, void* tmp_space) { +// Finds guaranteed to exists empty slot from the given position. +// NOTE: this function is almost never triggered inside of the +// DropDeletesWithoutResize, so we keep it simple. +// The table is rather sparse, so empty slot will be found very quickly. +size_t FindEmptySlot(size_t start, size_t end, const ctrl_t* ctrl) { + for (size_t i = start; i < end; ++i) { + if (IsEmpty(ctrl[i])) { + return i; + } + } + assert(false && "no empty slot"); + return ~size_t{}; +} + +void DropDeletesWithoutResize(CommonFields& common, + const PolicyFunctions& policy) { void* set = &common; void* slot_array = common.slot_array(); const size_t capacity = common.capacity(); @@ -194,15 +213,26 @@ void DropDeletesWithoutResize(CommonFields& common, const void* hash_fn, // repeat procedure for current slot with moved from element (target) ctrl_t* ctrl = common.control(); ConvertDeletedToEmptyAndFullToDeleted(ctrl, capacity); + const void* hash_fn = policy.hash_fn(common); auto hasher = policy.hash_slot; auto transfer = policy.transfer; const size_t slot_size = policy.slot_size; size_t total_probe_length = 0; void* slot_ptr = SlotAddress(slot_array, 0, slot_size); + + // The index of an empty slot that can be used as temporary memory for + // the swap operation. + constexpr size_t kUnknownId = ~size_t{}; + size_t tmp_space_id = kUnknownId; + for (size_t i = 0; i != capacity; ++i, slot_ptr = NextSlot(slot_ptr, slot_size)) { assert(slot_ptr == SlotAddress(slot_array, i, slot_size)); + if (IsEmpty(ctrl[i])) { + tmp_space_id = i; + continue; + } if (!IsDeleted(ctrl[i])) continue; const size_t hash = (*hasher)(hash_fn, slot_ptr); const FindInfo target = find_first_non_full(common, hash); @@ -231,16 +261,26 @@ void DropDeletesWithoutResize(CommonFields& common, const void* hash_fn, SetCtrl(common, new_i, H2(hash), slot_size); (*transfer)(set, new_slot_ptr, slot_ptr); SetCtrl(common, i, ctrl_t::kEmpty, slot_size); + // Initialize or change empty space id. + tmp_space_id = i; } else { assert(IsDeleted(ctrl[new_i])); SetCtrl(common, new_i, H2(hash), slot_size); // Until we are done rehashing, DELETED marks previously FULL slots. + if (tmp_space_id == kUnknownId) { + tmp_space_id = FindEmptySlot(i + 1, capacity, ctrl); + } + void* tmp_space = SlotAddress(slot_array, tmp_space_id, slot_size); + SanitizerUnpoisonMemoryRegion(tmp_space, slot_size); + // Swap i and new_i elements. (*transfer)(set, tmp_space, new_slot_ptr); (*transfer)(set, new_slot_ptr, slot_ptr); (*transfer)(set, slot_ptr, tmp_space); + SanitizerPoisonMemoryRegion(tmp_space, slot_size); + // repeat the processing of the ith slot --i; slot_ptr = PrevSlot(slot_ptr, slot_size); @@ -267,6 +307,8 @@ static bool WasNeverFull(CommonFields& c, size_t index) { Group::kWidth; } +} // namespace + void EraseMetaOnly(CommonFields& c, size_t index, size_t slot_size) { assert(IsFull(c.control()[index]) && "erasing a dangling iterator"); c.decrement_size(); @@ -301,77 +343,126 @@ void ClearBackingArray(CommonFields& c, const PolicyFunctions& policy, } void HashSetResizeHelper::GrowIntoSingleGroupShuffleControlBytes( - ctrl_t* new_ctrl, size_t new_capacity) const { + ctrl_t* __restrict new_ctrl, size_t new_capacity) const { assert(is_single_group(new_capacity)); constexpr size_t kHalfWidth = Group::kWidth / 2; + constexpr size_t kQuarterWidth = Group::kWidth / 4; assert(old_capacity_ < kHalfWidth); + static_assert(sizeof(uint64_t) >= kHalfWidth, + "Group size is too large. The ctrl bytes for half a group must " + "fit into a uint64_t for this implementation."); + static_assert(sizeof(uint64_t) <= Group::kWidth, + "Group size is too small. The ctrl bytes for a group must " + "cover a uint64_t for this implementation."); const size_t half_old_capacity = old_capacity_ / 2; // NOTE: operations are done with compile time known size = kHalfWidth. // Compiler optimizes that into single ASM operation. - // Copy second half of bytes to the beginning. - // We potentially copy more bytes in order to have compile time known size. - // Mirrored bytes from the old_ctrl() will also be copied. - // In case of old_capacity_ == 3, we will copy 1st element twice. + // Load the bytes from half_old_capacity + 1. This contains the last half of + // old_ctrl bytes, followed by the sentinel byte, and then the first half of + // the cloned bytes. This effectively shuffles the control bytes. + uint64_t copied_bytes = 0; + copied_bytes = + absl::little_endian::Load64(old_ctrl() + half_old_capacity + 1); + + // We change the sentinel byte to kEmpty before storing to both the start of + // the new_ctrl, and past the end of the new_ctrl later for the new cloned + // bytes. Note that this is faster than setting the sentinel byte to kEmpty + // after the copy directly in new_ctrl because we are limited on store + // bandwidth. + constexpr uint64_t kEmptyXorSentinel = + static_cast(ctrl_t::kEmpty) ^ + static_cast(ctrl_t::kSentinel); + const uint64_t mask_convert_old_sentinel_to_empty = + kEmptyXorSentinel << (half_old_capacity * 8); + copied_bytes ^= mask_convert_old_sentinel_to_empty; + + // Copy second half of bytes to the beginning. This correctly sets the bytes + // [0, old_capacity]. We potentially copy more bytes in order to have compile + // time known size. Mirrored bytes from the old_ctrl() will also be copied. In + // case of old_capacity_ == 3, we will copy 1st element twice. // Examples: + // (old capacity = 1) // old_ctrl = 0S0EEEEEEE... - // new_ctrl = S0EEEEEEEE... + // new_ctrl = E0EEEEEE??... // - // old_ctrl = 01S01EEEEE... - // new_ctrl = 1S01EEEEEE... + // (old capacity = 3) + // old_ctrl = 012S012EEEEE... + // new_ctrl = 12E012EE????... // + // (old capacity = 7) // old_ctrl = 0123456S0123456EE... - // new_ctrl = 456S0123?????????... - std::memcpy(new_ctrl, old_ctrl() + half_old_capacity + 1, kHalfWidth); - // Clean up copied kSentinel from old_ctrl. - new_ctrl[half_old_capacity] = ctrl_t::kEmpty; + // new_ctrl = 456E0123?????????... + absl::little_endian::Store64(new_ctrl, copied_bytes); - // Clean up damaged or uninitialized bytes. - - // Clean bytes after the intended size of the copy. - // Example: - // new_ctrl = 1E01EEEEEEE???? - // *new_ctrl= 1E0EEEEEEEE???? - // position / + // Set the space [old_capacity + 1, new_capacity] to empty as these bytes will + // not be written again. This is safe because + // NumControlBytes = new_capacity + kWidth and new_capacity >= + // old_capacity+1. + // Examples: + // (old_capacity = 3, new_capacity = 15) + // new_ctrl = 12E012EE?????????????...?? + // *new_ctrl = 12E0EEEEEEEEEEEEEEEE?...?? + // position / S + // + // (old_capacity = 7, new_capacity = 15) + // new_ctrl = 456E0123?????????????????...?? + // *new_ctrl = 456E0123EEEEEEEEEEEEEEEE?...?? + // position / S std::memset(new_ctrl + old_capacity_ + 1, static_cast(ctrl_t::kEmpty), - kHalfWidth); - // Clean non-mirrored bytes that are not initialized. - // For small old_capacity that may be inside of mirrored bytes zone. + Group::kWidth); + + // Set the last kHalfWidth bytes to empty, to ensure the bytes all the way to + // the end are initialized. // Examples: - // new_ctrl = 1E0EEEEEEEE??????????.... - // *new_ctrl= 1E0EEEEEEEEEEEEE?????.... - // position / + // new_ctrl = 12E0EEEEEEEEEEEEEEEE?...??????? + // *new_ctrl = 12E0EEEEEEEEEEEEEEEE???EEEEEEEE + // position S / // - // new_ctrl = 456E0123???????????... - // *new_ctrl= 456E0123EEEEEEEE???... - // position / - std::memset(new_ctrl + kHalfWidth, static_cast(ctrl_t::kEmpty), - kHalfWidth); - // Clean last mirrored bytes that are not initialized - // and will not be overwritten by mirroring. - // Examples: - // new_ctrl = 1E0EEEEEEEEEEEEE???????? - // *new_ctrl= 1E0EEEEEEEEEEEEEEEEEEEEE - // position S / - // - // new_ctrl = 456E0123EEEEEEEE??????????????? - // *new_ctrl= 456E0123EEEEEEEE???????EEEEEEEE - // position S / - std::memset(new_ctrl + new_capacity + kHalfWidth, + // new_ctrl = 456E0123EEEEEEEEEEEEEEEE??????? + // *new_ctrl = 456E0123EEEEEEEEEEEEEEEEEEEEEEE + // position S / + std::memset(new_ctrl + NumControlBytes(new_capacity) - kHalfWidth, static_cast(ctrl_t::kEmpty), kHalfWidth); - // Create mirrored bytes. old_capacity_ < kHalfWidth - // Example: - // new_ctrl = 456E0123EEEEEEEE???????EEEEEEEE - // *new_ctrl= 456E0123EEEEEEEE456E0123EEEEEEE - // position S/ - ctrl_t g[kHalfWidth]; - std::memcpy(g, new_ctrl, kHalfWidth); - std::memcpy(new_ctrl + new_capacity + 1, g, kHalfWidth); + // Copy the first bytes to the end (starting at new_capacity +1) to set the + // cloned bytes. Note that we use the already copied bytes from old_ctrl here + // rather than copying from new_ctrl to avoid a Read-after-Write hazard, since + // new_ctrl was just written to. The first old_capacity-1 bytes are set + // correctly. Then there may be up to old_capacity bytes that need to be + // overwritten, and any remaining bytes will be correctly set to empty. This + // sets [new_capacity + 1, new_capacity +1 + old_capacity] correctly. + // Examples: + // new_ctrl = 12E0EEEEEEEEEEEEEEEE?...??????? + // *new_ctrl = 12E0EEEEEEEEEEEE12E012EEEEEEEEE + // position S/ + // + // new_ctrl = 456E0123EEEEEEEE?...???EEEEEEEE + // *new_ctrl = 456E0123EEEEEEEE456E0123EEEEEEE + // position S/ + absl::little_endian::Store64(new_ctrl + new_capacity + 1, copied_bytes); - // Finally set sentinel to its place. + // Set The remaining bytes at the end past the cloned bytes to empty. The + // incorrectly set bytes are [new_capacity + old_capacity + 2, + // min(new_capacity + 1 + kHalfWidth, new_capacity + old_capacity + 2 + + // half_old_capacity)]. Taking the difference, we need to set min(kHalfWidth - + // (old_capacity + 1), half_old_capacity)]. Since old_capacity < kHalfWidth, + // half_old_capacity < kQuarterWidth, so we set kQuarterWidth beginning at + // new_capacity + old_capacity + 2 to kEmpty. + // Examples: + // new_ctrl = 12E0EEEEEEEEEEEE12E012EEEEEEEEE + // *new_ctrl = 12E0EEEEEEEEEEEE12E0EEEEEEEEEEE + // position S / + // + // new_ctrl = 456E0123EEEEEEEE456E0123EEEEEEE + // *new_ctrl = 456E0123EEEEEEEE456E0123EEEEEEE (no change) + // position S / + std::memset(new_ctrl + new_capacity + old_capacity_ + 2, + static_cast(ctrl_t::kEmpty), kQuarterWidth); + + // Finally, we set the new sentinel byte. new_ctrl[new_capacity] = ctrl_t::kSentinel; } @@ -424,6 +515,129 @@ void HashSetResizeHelper::TransferSlotAfterSoo(CommonFields& c, PoisonSingleGroupEmptySlots(c, slot_size); } +namespace { + +// Called whenever the table needs to vacate empty slots either by removing +// tombstones via rehash or growth. +ABSL_ATTRIBUTE_NOINLINE +FindInfo FindInsertPositionWithGrowthOrRehash(CommonFields& common, size_t hash, + const PolicyFunctions& policy) { + const size_t cap = common.capacity(); + if (cap > Group::kWidth && + // Do these calculations in 64-bit to avoid overflow. + common.size() * uint64_t{32} <= cap * uint64_t{25}) { + // Squash DELETED without growing if there is enough capacity. + // + // Rehash in place if the current size is <= 25/32 of capacity. + // Rationale for such a high factor: 1) DropDeletesWithoutResize() is + // faster than resize, and 2) it takes quite a bit of work to add + // tombstones. In the worst case, seems to take approximately 4 + // insert/erase pairs to create a single tombstone and so if we are + // rehashing because of tombstones, we can afford to rehash-in-place as + // long as we are reclaiming at least 1/8 the capacity without doing more + // than 2X the work. (Where "work" is defined to be size() for rehashing + // or rehashing in place, and 1 for an insert or erase.) But rehashing in + // place is faster per operation than inserting or even doubling the size + // of the table, so we actually afford to reclaim even less space from a + // resize-in-place. The decision is to rehash in place if we can reclaim + // at about 1/8th of the usable capacity (specifically 3/28 of the + // capacity) which means that the total cost of rehashing will be a small + // fraction of the total work. + // + // Here is output of an experiment using the BM_CacheInSteadyState + // benchmark running the old case (where we rehash-in-place only if we can + // reclaim at least 7/16*capacity) vs. this code (which rehashes in place + // if we can recover 3/32*capacity). + // + // Note that although in the worst-case number of rehashes jumped up from + // 15 to 190, but the number of operations per second is almost the same. + // + // Abridged output of running BM_CacheInSteadyState benchmark from + // raw_hash_set_benchmark. N is the number of insert/erase operations. + // + // | OLD (recover >= 7/16 | NEW (recover >= 3/32) + // size | N/s LoadFactor NRehashes | N/s LoadFactor NRehashes + // 448 | 145284 0.44 18 | 140118 0.44 19 + // 493 | 152546 0.24 11 | 151417 0.48 28 + // 538 | 151439 0.26 11 | 151152 0.53 38 + // 583 | 151765 0.28 11 | 150572 0.57 50 + // 628 | 150241 0.31 11 | 150853 0.61 66 + // 672 | 149602 0.33 12 | 150110 0.66 90 + // 717 | 149998 0.35 12 | 149531 0.70 129 + // 762 | 149836 0.37 13 | 148559 0.74 190 + // 807 | 149736 0.39 14 | 151107 0.39 14 + // 852 | 150204 0.42 15 | 151019 0.42 15 + DropDeletesWithoutResize(common, policy); + } else { + // Otherwise grow the container. + policy.resize(common, NextCapacity(cap), HashtablezInfoHandle{}); + } + // This function is typically called with tables containing deleted slots. + // The table will be big and `FindFirstNonFullAfterResize` will always + // fallback to `find_first_non_full`. So using `find_first_non_full` directly. + return find_first_non_full(common, hash); +} + +} // namespace + +const void* GetHashRefForEmptyHasher(const CommonFields& common) { + // Empty base optimization typically make the empty base class address to be + // the same as the first address of the derived class object. + // But we generally assume that for empty hasher we can return any valid + // pointer. + return &common; +} + +size_t PrepareInsertNonSoo(CommonFields& common, size_t hash, FindInfo target, + const PolicyFunctions& policy) { + // When there are no deleted slots in the table + // and growth_left is positive, we can insert at the first + // empty slot in the probe sequence (target). + const bool use_target_hint = + // Optimization is disabled when generations are enabled. + // We have to rehash even sparse tables randomly in such mode. + !SwisstableGenerationsEnabled() && + common.growth_info().HasNoDeletedAndGrowthLeft(); + if (ABSL_PREDICT_FALSE(!use_target_hint)) { + // Notes about optimized mode when generations are disabled: + // We do not enter this branch if table has no deleted slots + // and growth_left is positive. + // We enter this branch in the following cases listed in decreasing + // frequency: + // 1. Table without deleted slots (>95% cases) that needs to be resized. + // 2. Table with deleted slots that has space for the inserting element. + // 3. Table with deleted slots that needs to be rehashed or resized. + if (ABSL_PREDICT_TRUE(common.growth_info().HasNoGrowthLeftAndNoDeleted())) { + const size_t old_capacity = common.capacity(); + policy.resize(common, NextCapacity(old_capacity), HashtablezInfoHandle{}); + target = HashSetResizeHelper::FindFirstNonFullAfterResize( + common, old_capacity, hash); + } else { + // Note: the table may have no deleted slots here when generations + // are enabled. + const bool rehash_for_bug_detection = + common.should_rehash_for_bug_detection_on_insert(); + if (rehash_for_bug_detection) { + // Move to a different heap allocation in order to detect bugs. + const size_t cap = common.capacity(); + policy.resize(common, + common.growth_left() > 0 ? cap : NextCapacity(cap), + HashtablezInfoHandle{}); + } + if (ABSL_PREDICT_TRUE(common.growth_left() > 0)) { + target = find_first_non_full(common, hash); + } else { + target = FindInsertPositionWithGrowthOrRehash(common, hash, policy); + } + } + } + PrepareInsertCommon(common); + common.growth_info().OverwriteControlAsFull(common.control()[target.offset]); + SetCtrl(common, target.offset, H2(hash), policy.slot_size); + common.infoz().RecordInsert(hash, target.probe_length); + return target.offset; +} + } // namespace container_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h b/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h index 1d2e2d14a9..1f677a4edf 100644 --- a/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +++ b/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h @@ -623,7 +623,12 @@ inline h2_t H2(size_t hash) { return hash & 0x7F; } // Helpers for checking the state of a control byte. inline bool IsEmpty(ctrl_t c) { return c == ctrl_t::kEmpty; } -inline bool IsFull(ctrl_t c) { return c >= static_cast(0); } +inline bool IsFull(ctrl_t c) { + // Cast `c` to the underlying type instead of casting `0` to `ctrl_t` as `0` + // is not a value in the enum. Both ways are equivalent, but this way makes + // linters happier. + return static_cast>(c) >= 0; +} inline bool IsDeleted(ctrl_t c) { return c == ctrl_t::kDeleted; } inline bool IsEmptyOrDeleted(ctrl_t c) { return c < ctrl_t::kSentinel; } @@ -1126,6 +1131,13 @@ class GrowthInfo { return static_cast>(growth_left_info_) > 0; } + // Returns true if the table satisfies two properties: + // 1. Guaranteed to have no kDeleted slots. + // 2. There is no growth left. + bool HasNoGrowthLeftAndNoDeleted() const { + return growth_left_info_ == 0; + } + // Returns true if table guaranteed to have no k bool HasNoDeleted() const { return static_cast>(growth_left_info_) >= 0; @@ -1374,6 +1386,8 @@ class CommonFields : public CommonFieldsGenerationInfo { // This is stored in the heap allocation before the control bytes. // TODO(b/289225379): experiment with moving growth_info back inline to // increase room for SOO. + size_t growth_left() const { return growth_info().GetGrowthLeft(); } + GrowthInfo& growth_info() { auto* gl_ptr = reinterpret_cast(control()) - 1; assert(reinterpret_cast(gl_ptr) % alignof(GrowthInfo) == 0); @@ -1933,8 +1947,7 @@ class HashSetResizeHelper { // will be no performance benefit. // It has implicit assumption that `resize` will call // `GrowSizeIntoSingleGroup*` in case `IsGrowingIntoSingleGroupApplicable`. - // Falls back to `find_first_non_full` in case of big groups, so it is - // safe to use after `rehash_and_grow_if_necessary`. + // Falls back to `find_first_non_full` in case of big groups. static FindInfo FindFirstNonFullAfterResize(const CommonFields& c, size_t old_capacity, size_t hash) { @@ -2216,14 +2229,22 @@ size_t PrepareInsertAfterSoo(size_t hash, size_t slot_size, struct PolicyFunctions { size_t slot_size; + // Returns the pointer to the hash function stored in the set. + const void* (*hash_fn)(const CommonFields& common); + // Returns the hash of the pointed-to slot. size_t (*hash_slot)(const void* hash_fn, void* slot); - // Transfer the contents of src_slot to dst_slot. + // Transfers the contents of src_slot to dst_slot. void (*transfer)(void* set, void* dst_slot, void* src_slot); - // Deallocate the backing store from common. + // Deallocates the backing store from common. void (*dealloc)(CommonFields& common, const PolicyFunctions& policy); + + // Resizes set to the new capacity. + // Arguments are used as in raw_hash_set::resize_impl. + void (*resize)(CommonFields& common, size_t new_capacity, + HashtablezInfoHandle forced_infoz); }; // ClearBackingArray clears the backing array, either modifying it in place, @@ -2261,9 +2282,26 @@ ABSL_ATTRIBUTE_NOINLINE void TransferRelocatable(void*, void* dst, void* src) { memcpy(dst, src, SizeOfSlot); } -// Type-erased version of raw_hash_set::drop_deletes_without_resize. -void DropDeletesWithoutResize(CommonFields& common, const void* hash_fn, - const PolicyFunctions& policy, void* tmp_space); +// Type erased raw_hash_set::get_hash_ref_fn for the empty hash function case. +const void* GetHashRefForEmptyHasher(const CommonFields& common); + +// Given the hash of a value not currently in the table and the first empty +// slot in the probe sequence, finds a viable slot index to insert it at. +// +// In case there's no space left, the table can be resized or rehashed +// (for tables with deleted slots, see FindInsertPositionWithGrowthOrRehash). +// +// In the case of absence of deleted slots and positive growth_left, the element +// can be inserted in the provided `target` position. +// +// When the table has deleted slots (according to GrowthInfo), the target +// position will be searched one more time using `find_first_non_full`. +// +// REQUIRES: Table is not SOO. +// REQUIRES: At least one non-full slot available. +// REQUIRES: `target` is a valid empty position to insert. +size_t PrepareInsertNonSoo(CommonFields& common, size_t hash, FindInfo target, + const PolicyFunctions& policy); // A SwissTable. // @@ -3533,7 +3571,7 @@ class raw_hash_set { // common(), old_capacity, hash) // can be called right after `resize`. void resize(size_t new_capacity) { - resize_impl(new_capacity, HashtablezInfoHandle{}); + raw_hash_set::resize_impl(common(), new_capacity, HashtablezInfoHandle{}); } // As above, except that we also accept a pre-sampled, forced infoz for @@ -3541,19 +3579,24 @@ class raw_hash_set { // store the infoz. void resize_with_soo_infoz(HashtablezInfoHandle forced_infoz) { assert(forced_infoz.IsSampled()); - resize_impl(NextCapacity(SooCapacity()), forced_infoz); + raw_hash_set::resize_impl(common(), NextCapacity(SooCapacity()), + forced_infoz); } - ABSL_ATTRIBUTE_NOINLINE void resize_impl( - size_t new_capacity, HashtablezInfoHandle forced_infoz) { + // Resizes set to the new capacity. + // It is a static function in order to use its pointer in GetPolicyFunctions. + ABSL_ATTRIBUTE_NOINLINE static void resize_impl( + CommonFields& common, size_t new_capacity, + HashtablezInfoHandle forced_infoz) { + raw_hash_set* set = reinterpret_cast(&common); assert(IsValidCapacity(new_capacity)); - assert(!fits_in_soo(new_capacity)); - const bool was_soo = is_soo(); - const bool had_soo_slot = was_soo && !empty(); + assert(!set->fits_in_soo(new_capacity)); + const bool was_soo = set->is_soo(); + const bool had_soo_slot = was_soo && !set->empty(); const ctrl_t soo_slot_h2 = - had_soo_slot ? static_cast(H2(hash_of(soo_slot()))) + had_soo_slot ? static_cast(H2(set->hash_of(set->soo_slot()))) : ctrl_t::kEmpty; - HashSetResizeHelper resize_helper(common(), was_soo, had_soo_slot, + HashSetResizeHelper resize_helper(common, was_soo, had_soo_slot, forced_infoz); // Initialize HashSetResizeHelper::old_heap_or_soo_. We can't do this in // HashSetResizeHelper constructor because it can't transfer slots when @@ -3561,11 +3604,12 @@ class raw_hash_set { // TODO(b/289225379): try to handle more of the SOO cases inside // InitializeSlots. See comment on cl/555990034 snapshot #63. if (PolicyTraits::transfer_uses_memcpy() || !had_soo_slot) { - resize_helper.old_heap_or_soo() = common().heap_or_soo(); + resize_helper.old_heap_or_soo() = common.heap_or_soo(); } else { - transfer(to_slot(resize_helper.old_soo_data()), soo_slot()); + set->transfer(set->to_slot(resize_helper.old_soo_data()), + set->soo_slot()); } - common().set_capacity(new_capacity); + common.set_capacity(new_capacity); // Note that `InitializeSlots` does different number initialization steps // depending on the values of `transfer_uses_memcpy` and capacities. // Refer to the comment in `InitializeSlots` for more details. @@ -3573,7 +3617,7 @@ class raw_hash_set { resize_helper.InitializeSlots( - common(), CharAlloc(alloc_ref()), soo_slot_h2, sizeof(key_type), + common, CharAlloc(set->alloc_ref()), soo_slot_h2, sizeof(key_type), sizeof(value_type)); // In the SooEnabled() case, capacity is never 0 so we don't check. @@ -3585,30 +3629,30 @@ class raw_hash_set { // Nothing more to do in this case. if (was_soo && !had_soo_slot) return; - slot_type* new_slots = slot_array(); + slot_type* new_slots = set->slot_array(); if (grow_single_group) { if (PolicyTraits::transfer_uses_memcpy()) { // InitializeSlots did all the work. return; } if (was_soo) { - transfer(new_slots + resize_helper.SooSlotIndex(), - to_slot(resize_helper.old_soo_data())); + set->transfer(new_slots + resize_helper.SooSlotIndex(), + to_slot(resize_helper.old_soo_data())); return; } else { // We want GrowSizeIntoSingleGroup to be called here in order to make // InitializeSlots not depend on PolicyTraits. - resize_helper.GrowSizeIntoSingleGroup(common(), - alloc_ref()); + resize_helper.GrowSizeIntoSingleGroup(common, + set->alloc_ref()); } } else { // InitializeSlots prepares control bytes to correspond to empty table. const auto insert_slot = [&](slot_type* slot) { - size_t hash = PolicyTraits::apply(HashElement{hash_ref()}, + size_t hash = PolicyTraits::apply(HashElement{set->hash_ref()}, PolicyTraits::element(slot)); - auto target = find_first_non_full(common(), hash); - SetCtrl(common(), target.offset, H2(hash), sizeof(slot_type)); - transfer(new_slots + target.offset, slot); + auto target = find_first_non_full(common, hash); + SetCtrl(common, target.offset, H2(hash), sizeof(slot_type)); + set->transfer(new_slots + target.offset, slot); return target.probe_length; }; if (was_soo) { @@ -3623,80 +3667,13 @@ class raw_hash_set { total_probe_length += insert_slot(old_slots + i); } } - infoz().RecordRehash(total_probe_length); + common.infoz().RecordRehash(total_probe_length); } } - resize_helper.DeallocateOld(CharAlloc(alloc_ref()), + resize_helper.DeallocateOld(CharAlloc(set->alloc_ref()), sizeof(slot_type)); } - // Prunes control bytes to remove as many tombstones as possible. - // - // See the comment on `rehash_and_grow_if_necessary()`. - inline void drop_deletes_without_resize() { - // Stack-allocate space for swapping elements. - alignas(slot_type) unsigned char tmp[sizeof(slot_type)]; - DropDeletesWithoutResize(common(), &hash_ref(), GetPolicyFunctions(), tmp); - } - - // Called whenever the table *might* need to conditionally grow. - // - // This function is an optimization opportunity to perform a rehash even when - // growth is unnecessary, because vacating tombstones is beneficial for - // performance in the long-run. - void rehash_and_grow_if_necessary() { - const size_t cap = capacity(); - if (cap > Group::kWidth && - // Do these calculations in 64-bit to avoid overflow. - size() * uint64_t{32} <= cap * uint64_t{25}) { - // Squash DELETED without growing if there is enough capacity. - // - // Rehash in place if the current size is <= 25/32 of capacity. - // Rationale for such a high factor: 1) drop_deletes_without_resize() is - // faster than resize, and 2) it takes quite a bit of work to add - // tombstones. In the worst case, seems to take approximately 4 - // insert/erase pairs to create a single tombstone and so if we are - // rehashing because of tombstones, we can afford to rehash-in-place as - // long as we are reclaiming at least 1/8 the capacity without doing more - // than 2X the work. (Where "work" is defined to be size() for rehashing - // or rehashing in place, and 1 for an insert or erase.) But rehashing in - // place is faster per operation than inserting or even doubling the size - // of the table, so we actually afford to reclaim even less space from a - // resize-in-place. The decision is to rehash in place if we can reclaim - // at about 1/8th of the usable capacity (specifically 3/28 of the - // capacity) which means that the total cost of rehashing will be a small - // fraction of the total work. - // - // Here is output of an experiment using the BM_CacheInSteadyState - // benchmark running the old case (where we rehash-in-place only if we can - // reclaim at least 7/16*capacity) vs. this code (which rehashes in place - // if we can recover 3/32*capacity). - // - // Note that although in the worst-case number of rehashes jumped up from - // 15 to 190, but the number of operations per second is almost the same. - // - // Abridged output of running BM_CacheInSteadyState benchmark from - // raw_hash_set_benchmark. N is the number of insert/erase operations. - // - // | OLD (recover >= 7/16 | NEW (recover >= 3/32) - // size | N/s LoadFactor NRehashes | N/s LoadFactor NRehashes - // 448 | 145284 0.44 18 | 140118 0.44 19 - // 493 | 152546 0.24 11 | 151417 0.48 28 - // 538 | 151439 0.26 11 | 151152 0.53 38 - // 583 | 151765 0.28 11 | 150572 0.57 50 - // 628 | 150241 0.31 11 | 150853 0.61 66 - // 672 | 149602 0.33 12 | 150110 0.66 90 - // 717 | 149998 0.35 12 | 149531 0.70 129 - // 762 | 149836 0.37 13 | 148559 0.74 190 - // 807 | 149736 0.39 14 | 151107 0.39 14 - // 852 | 150204 0.42 15 | 151019 0.42 15 - drop_deletes_without_resize(); - } else { - // Otherwise grow the container. - resize(NextCapacity(cap)); - } - } - // Casting directly from e.g. char* to slot_type* can cause compilation errors // on objective-C. This function converts to void* first, avoiding the issue. static slot_type* to_slot(void* buf) { @@ -3817,6 +3794,7 @@ class raw_hash_set { template std::pair find_or_prepare_insert_non_soo(const K& key) { + assert(!is_soo()); prefetch_heap_block(); auto hash = hash_ref()(key); auto seq = probe(common(), hash); @@ -3833,9 +3811,10 @@ class raw_hash_set { if (ABSL_PREDICT_TRUE(mask_empty)) { size_t target = seq.offset( GetInsertionOffset(mask_empty, capacity(), hash, control())); - return { - iterator_at(prepare_insert(hash, FindInfo{target, seq.index()})), - true}; + return {iterator_at(PrepareInsertNonSoo(common(), hash, + FindInfo{target, seq.index()}, + GetPolicyFunctions())), + true}; } seq.next(); assert(seq.index() <= capacity() && "full table!"); @@ -3852,63 +3831,6 @@ class raw_hash_set { return find_or_prepare_insert_non_soo(key); } - // Given the hash of a value not currently in the table and the first empty - // slot in the probe sequence, finds the viable slot index to insert it at. - // - // In case there's no space left, the table can be resized or rehashed - // (see rehash_and_grow_if_necessary). - // - // In case of absence of deleted slots and positive growth_left, element can - // be inserted in the provided `target` position. - // - // When table has deleted slots (according to GrowthInfo), target position - // will be searched one more time using `find_first_non_full`. - // - // REQUIRES: At least one non-full slot available. - // REQUIRES: `target` is a valid empty position to insert. - size_t prepare_insert(size_t hash, FindInfo target) ABSL_ATTRIBUTE_NOINLINE { - assert(!is_soo()); - // When there are no deleted slots in the table - // and growth_left is positive, we can insert at the first - // empty slot in the probe sequence (target). - bool use_target_hint = false; - // Optimization is disabled on enabled generations. - // We have to rehash even sparse tables randomly in such mode. -#ifndef ABSL_SWISSTABLE_ENABLE_GENERATIONS - use_target_hint = growth_info().HasNoDeletedAndGrowthLeft(); -#endif - if (ABSL_PREDICT_FALSE(!use_target_hint)) { - const bool rehash_for_bug_detection = - common().should_rehash_for_bug_detection_on_insert(); - if (rehash_for_bug_detection) { - // Move to a different heap allocation in order to detect bugs. - const size_t cap = capacity(); - resize(growth_left() > 0 ? cap : NextCapacity(cap)); - } - if (!rehash_for_bug_detection && - ABSL_PREDICT_FALSE(growth_left() == 0)) { - const size_t old_capacity = capacity(); - rehash_and_grow_if_necessary(); - // NOTE: It is safe to use `FindFirstNonFullAfterResize` after - // `rehash_and_grow_if_necessary`, whether capacity changes or not. - // `rehash_and_grow_if_necessary` may *not* call `resize` - // and perform `drop_deletes_without_resize` instead. But this - // could happen only on big tables and will not change capacity. - // For big tables `FindFirstNonFullAfterResize` will always - // fallback to normal `find_first_non_full`. - target = HashSetResizeHelper::FindFirstNonFullAfterResize( - common(), old_capacity, hash); - } else { - target = find_first_non_full(common(), hash); - } - } - PrepareInsertCommon(common()); - growth_info().OverwriteControlAsFull(control()[target.offset]); - SetCtrl(common(), target.offset, H2(hash), sizeof(slot_type)); - infoz().RecordInsert(hash, target.probe_length); - return target.offset; - } - // Constructs the value in the space pointed by the iterator. This only works // after an unsuccessful find_or_prepare_insert() and before any other // modifications happen in the raw_hash_set. @@ -3949,7 +3871,7 @@ class raw_hash_set { // See `CapacityToGrowth()`. size_t growth_left() const { assert(!is_soo()); - return growth_info().GetGrowthLeft(); + return common().growth_left(); } GrowthInfo& growth_info() { @@ -4009,6 +3931,10 @@ class raw_hash_set { return settings_.template get<3>(); } + static const void* get_hash_ref_fn(const CommonFields& common) { + auto* h = reinterpret_cast(&common); + return &h->hash_ref(); + } static void transfer_slot_fn(void* set, void* dst, void* src) { auto* h = static_cast(set); h->transfer(static_cast(dst), static_cast(src)); @@ -4030,6 +3956,10 @@ class raw_hash_set { static const PolicyFunctions& GetPolicyFunctions() { static constexpr PolicyFunctions value = { sizeof(slot_type), + // TODO(b/328722020): try to type erase + // for standard layout and alignof(Hash) <= alignof(CommonFields). + std::is_empty::value ? &GetHashRefForEmptyHasher + : &raw_hash_set::get_hash_ref_fn, PolicyTraits::template get_hash_slot_fn(), PolicyTraits::transfer_uses_memcpy() ? TransferRelocatable @@ -4037,6 +3967,7 @@ class raw_hash_set { (std::is_same>::value ? &DeallocateStandard : &raw_hash_set::dealloc_fn), + &raw_hash_set::resize_impl, }; return value; } diff --git a/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc b/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc index c4e05d6019..10f793efaf 100644 --- a/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +++ b/yass/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc @@ -126,6 +126,22 @@ TEST(GrowthInfoTest, HasNoDeletedAndGrowthLeft) { EXPECT_TRUE(gi.HasNoDeletedAndGrowthLeft()); } +TEST(GrowthInfoTest, HasNoGrowthLeftAndNoDeleted) { + GrowthInfo gi; + gi.InitGrowthLeftNoDeleted(1); + EXPECT_FALSE(gi.HasNoGrowthLeftAndNoDeleted()); + gi.OverwriteEmptyAsFull(); + EXPECT_TRUE(gi.HasNoGrowthLeftAndNoDeleted()); + gi.OverwriteFullAsDeleted(); + EXPECT_FALSE(gi.HasNoGrowthLeftAndNoDeleted()); + gi.OverwriteFullAsEmpty(); + EXPECT_FALSE(gi.HasNoGrowthLeftAndNoDeleted()); + gi.InitGrowthLeftNoDeleted(0); + EXPECT_TRUE(gi.HasNoGrowthLeftAndNoDeleted()); + gi.OverwriteFullAsEmpty(); + EXPECT_FALSE(gi.HasNoGrowthLeftAndNoDeleted()); +} + TEST(GrowthInfoTest, OverwriteFullAsEmpty) { GrowthInfo gi; gi.InitGrowthLeftNoDeleted(5); diff --git a/yass/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake b/yass/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake index d96bd8394b..da2282fe73 100644 --- a/yass/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +++ b/yass/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake @@ -87,7 +87,6 @@ list(APPEND ABSL_LLVM_FLAGS "-Wc++98-compat-extra-semi" "-Wcast-qual" "-Wconversion" - "-Wdead-code-aggressive" "-Wdeprecated-pragma" "-Wfloat-overflow-conversion" "-Wfloat-zero-conversion" @@ -128,7 +127,6 @@ list(APPEND ABSL_LLVM_TEST_FLAGS "-Wc++98-compat-extra-semi" "-Wcast-qual" "-Wconversion" - "-Wdead-code-aggressive" "-Wdeprecated-pragma" "-Wfloat-overflow-conversion" "-Wfloat-zero-conversion" diff --git a/yass/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl b/yass/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl index 0a34423668..b9e0071e35 100644 --- a/yass/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl +++ b/yass/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl @@ -88,7 +88,6 @@ ABSL_LLVM_FLAGS = [ "-Wc++98-compat-extra-semi", "-Wcast-qual", "-Wconversion", - "-Wdead-code-aggressive", "-Wdeprecated-pragma", "-Wfloat-overflow-conversion", "-Wfloat-zero-conversion", @@ -129,7 +128,6 @@ ABSL_LLVM_TEST_FLAGS = [ "-Wc++98-compat-extra-semi", "-Wcast-qual", "-Wconversion", - "-Wdead-code-aggressive", "-Wdeprecated-pragma", "-Wfloat-overflow-conversion", "-Wfloat-zero-conversion", diff --git a/yass/third_party/abseil-cpp/absl/copts/copts.py b/yass/third_party/abseil-cpp/absl/copts/copts.py index 1aa0924922..2d85ac744f 100644 --- a/yass/third_party/abseil-cpp/absl/copts/copts.py +++ b/yass/third_party/abseil-cpp/absl/copts/copts.py @@ -47,7 +47,6 @@ ABSL_LLVM_FLAGS = [ "-Wc++98-compat-extra-semi", "-Wcast-qual", "-Wconversion", - "-Wdead-code-aggressive", "-Wdeprecated-pragma", "-Wfloat-overflow-conversion", "-Wfloat-zero-conversion", diff --git a/yass/third_party/abseil-cpp/absl/debugging/internal/demangle.cc b/yass/third_party/abseil-cpp/absl/debugging/internal/demangle.cc index 71d4eb0a67..40a55c7dbf 100644 --- a/yass/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +++ b/yass/third_party/abseil-cpp/absl/debugging/internal/demangle.cc @@ -81,6 +81,7 @@ static const AbbrevPair kOperatorList[] = { {"rs", ">>", 2}, {"lS", "<<=", 2}, {"rS", ">>=", 2}, + {"ss", "<=>", 2}, {"eq", "==", 2}, {"ne", "!=", 2}, {"lt", "<", 2}, @@ -100,6 +101,7 @@ static const AbbrevPair kOperatorList[] = { {"qu", "?", 3}, {"st", "sizeof", 0}, // Special syntax {"sz", "sizeof", 1}, // Not a real operator name, but used in expressions. + {"sZ", "sizeof...", 0}, // Special syntax {nullptr, nullptr, 0}, }; @@ -298,8 +300,8 @@ static bool ParseOneCharToken(State *state, const char one_char_token) { return false; } -// Returns true and advances "mangled_cur" if we find "two_char_token" -// at "mangled_cur" position. It is assumed that "two_char_token" does +// Returns true and advances "mangled_idx" if we find "two_char_token" +// at "mangled_idx" position. It is assumed that "two_char_token" does // not contain '\0'. static bool ParseTwoCharToken(State *state, const char *two_char_token) { ComplexityGuard guard(state); @@ -312,6 +314,21 @@ static bool ParseTwoCharToken(State *state, const char *two_char_token) { return false; } +// Returns true and advances "mangled_idx" if we find "three_char_token" +// at "mangled_idx" position. It is assumed that "three_char_token" does +// not contain '\0'. +static bool ParseThreeCharToken(State *state, const char *three_char_token) { + ComplexityGuard guard(state); + if (guard.IsTooComplex()) return false; + if (RemainingInput(state)[0] == three_char_token[0] && + RemainingInput(state)[1] == three_char_token[1] && + RemainingInput(state)[2] == three_char_token[2]) { + state->parse_state.mangled_idx += 3; + return true; + } + return false; +} + // Returns true and advances "mangled_cur" if we find any character in // "char_class" at "mangled_cur" position. static bool ParseCharClass(State *state, const char *char_class) { @@ -578,10 +595,14 @@ static bool ParseTemplateArgs(State *state); static bool ParseTemplateArg(State *state); static bool ParseBaseUnresolvedName(State *state); static bool ParseUnresolvedName(State *state); +static bool ParseUnionSelector(State* state); +static bool ParseFunctionParam(State* state); +static bool ParseBracedExpression(State *state); static bool ParseExpression(State *state); static bool ParseExprPrimary(State *state); -static bool ParseExprCastValue(State *state); +static bool ParseExprCastValueAndTrailingE(State *state); static bool ParseQRequiresClauseExpr(State *state); +static bool ParseRequirement(State *state); static bool ParseLocalName(State *state); static bool ParseLocalNameSuffix(State *state); static bool ParseDiscriminator(State *state); @@ -739,6 +760,7 @@ static bool ParseNestedName(State *state) { // ::= // ::= // ::= +// ::= // ::= // ::= # empty // ::= <(template) unqualified-name> @@ -750,7 +772,7 @@ static bool ParsePrefix(State *state) { bool has_something = false; while (true) { MaybeAppendSeparator(state); - if (ParseTemplateParam(state) || + if (ParseTemplateParam(state) || ParseDecltype(state) || ParseSubstitution(state, /*accept_std=*/true) || ParseUnscopedName(state) || (ParseOneCharToken(state, 'M') && ParseUnnamedTypeName(state))) { @@ -840,7 +862,11 @@ static bool ParseLocalSourceName(State *state) { // ::= Ut [<(nonnegative) number>] _ // ::= // ::= Ul E [<(nonnegative) number>] _ -// ::= <(parameter) type>+ +// ::= * <(parameter) type>+ +// +// For * in see: +// +// https://github.com/itanium-cxx-abi/cxx-abi/issues/31 static bool ParseUnnamedTypeName(State *state) { ComplexityGuard guard(state); if (guard.IsTooComplex()) return false; @@ -863,6 +889,7 @@ static bool ParseUnnamedTypeName(State *state) { // Closure type. which = -1; if (ParseTwoCharToken(state, "Ul") && DisableAppend(state) && + ZeroOrMore(ParseTemplateParamDecl, state) && OneOrMore(ParseType, state) && RestoreAppend(state, copy.append) && ParseOneCharToken(state, 'E') && Optional(ParseNumber(state, &which)) && which <= std::numeric_limits::max() - 2 && // Don't overflow. @@ -1023,7 +1050,8 @@ static bool ParseOperatorName(State *state, int *arity) { // ::= TT // ::= TI // ::= TS -// ::= TH # thread-local +// ::= TW # thread-local wrapper +// ::= TH # thread-local initialization // ::= Tc <(base) encoding> // ::= GV <(object) name> // ::= T <(base) encoding> @@ -1036,13 +1064,31 @@ static bool ParseOperatorName(State *state, int *arity) { // ::= Th <(base) encoding> // ::= Tv <(base) encoding> // -// Note: we don't care much about them since they don't appear in -// stack traces. The are special data. +// Note: Most of these are special data, not functions that occur in stack +// traces. Exceptions are TW and TH, which denote functions supporting the +// thread_local feature. For these see: +// +// https://maskray.me/blog/2021-02-14-all-about-thread-local-storage static bool ParseSpecialName(State *state) { ComplexityGuard guard(state); if (guard.IsTooComplex()) return false; ParseState copy = state->parse_state; - if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "VTISH") && + + if (ParseTwoCharToken(state, "TW")) { + MaybeAppend(state, "thread-local wrapper routine for "); + if (ParseName(state)) return true; + state->parse_state = copy; + return false; + } + + if (ParseTwoCharToken(state, "TH")) { + MaybeAppend(state, "thread-local initialization routine for "); + if (ParseName(state)) return true; + state->parse_state = copy; + return false; + } + + if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "VTIS") && ParseType(state)) { return true; } @@ -1365,19 +1411,30 @@ static bool ParseExceptionSpec(State *state) { return false; } -// ::= [exception-spec] F [Y] [O] E +// ::= +// [exception-spec] F [Y] [] E +// +// ::= R | O static bool ParseFunctionType(State *state) { ComplexityGuard guard(state); if (guard.IsTooComplex()) return false; ParseState copy = state->parse_state; - if (Optional(ParseExceptionSpec(state)) && ParseOneCharToken(state, 'F') && - Optional(ParseOneCharToken(state, 'Y')) && ParseBareFunctionType(state) && - Optional(ParseOneCharToken(state, 'O')) && - ParseOneCharToken(state, 'E')) { - return true; + Optional(ParseExceptionSpec(state)); + if (!ParseOneCharToken(state, 'F')) { + state->parse_state = copy; + return false; } - state->parse_state = copy; - return false; + Optional(ParseOneCharToken(state, 'Y')); + if (!ParseBareFunctionType(state)) { + state->parse_state = copy; + return false; + } + Optional(ParseCharClass(state, "RO")); + if (!ParseOneCharToken(state, 'E')) { + state->parse_state = copy; + return false; + } + return true; } // ::= <(signature) type>+ @@ -1628,7 +1685,7 @@ static bool ParseTemplateArg(State *state) { // ::= L [] [ E] if (ParseLocalSourceName(state) && Optional(ParseTemplateArgs(state))) { copy = state->parse_state; - if (ParseExprCastValue(state) && ParseOneCharToken(state, 'E')) { + if (ParseExprCastValueAndTrailingE(state)) { return true; } state->parse_state = copy; @@ -1743,26 +1800,100 @@ static bool ParseUnresolvedName(State *state) { return false; } +// ::= _ [] +// +// https://github.com/itanium-cxx-abi/cxx-abi/issues/47 +static bool ParseUnionSelector(State *state) { + return ParseOneCharToken(state, '_') && Optional(ParseNumber(state, nullptr)); +} + +// ::= fp <(top-level) CV-qualifiers> _ +// ::= fp <(top-level) CV-qualifiers> _ +// ::= fL p <(top-level) CV-qualifiers> _ +// ::= fL p <(top-level) CV-qualifiers> _ +// ::= fpT # this +static bool ParseFunctionParam(State *state) { + ComplexityGuard guard(state); + if (guard.IsTooComplex()) return false; + + ParseState copy = state->parse_state; + + // Function-param expression (level 0). + if (ParseTwoCharToken(state, "fp") && Optional(ParseCVQualifiers(state)) && + Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { + return true; + } + state->parse_state = copy; + + // Function-param expression (level 1+). + if (ParseTwoCharToken(state, "fL") && Optional(ParseNumber(state, nullptr)) && + ParseOneCharToken(state, 'p') && Optional(ParseCVQualifiers(state)) && + Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { + return true; + } + state->parse_state = copy; + + return ParseThreeCharToken(state, "fpT"); +} + +// ::= +// ::= di +// ::= dx +// ::= dX +static bool ParseBracedExpression(State *state) { + ComplexityGuard guard(state); + if (guard.IsTooComplex()) return false; + + ParseState copy = state->parse_state; + + if (ParseTwoCharToken(state, "di") && ParseSourceName(state) && + ParseBracedExpression(state)) { + return true; + } + state->parse_state = copy; + + if (ParseTwoCharToken(state, "dx") && ParseExpression(state) && + ParseBracedExpression(state)) { + return true; + } + state->parse_state = copy; + + if (ParseTwoCharToken(state, "dX") && + ParseExpression(state) && ParseExpression(state) && + ParseBracedExpression(state)) { + return true; + } + state->parse_state = copy; + + return ParseExpression(state); +} + // ::= <1-ary operator-name> // ::= <2-ary operator-name> // ::= <3-ary operator-name> // ::= cl + E // ::= cp * E # Clang-specific. +// ::= so [] * [p] E // ::= cv # type (expression) // ::= cv _ * E # type (expr-list) +// ::= tl * E // ::= st // ::= // ::= +// ::= sZ +// ::= sZ // ::= // ::= dt # expr.name // ::= pt # expr->name // ::= sp # argument pack expansion +// ::= fl +// ::= fr +// ::= fL +// ::= fR // ::= sr // ::= sr -// ::= fp <(top-level) CV-qualifiers> _ -// ::= fp <(top-level) CV-qualifiers> _ -// ::= fL p <(top-level) CV-qualifiers> _ -// ::= fL p <(top-level) CV-qualifiers> _ +// ::= u * E # vendor extension +// ::= rq + E static bool ParseExpression(State *state) { ComplexityGuard guard(state); if (guard.IsTooComplex()) return false; @@ -1787,17 +1918,26 @@ static bool ParseExpression(State *state) { } state->parse_state = copy; - // Function-param expression (level 0). - if (ParseTwoCharToken(state, "fp") && Optional(ParseCVQualifiers(state)) && - Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { + // ::= so [] * [p] E + // + // https://github.com/itanium-cxx-abi/cxx-abi/issues/47 + if (ParseTwoCharToken(state, "so") && ParseType(state) && + ParseExpression(state) && Optional(ParseNumber(state, nullptr)) && + ZeroOrMore(ParseUnionSelector, state) && + Optional(ParseOneCharToken(state, 'p')) && + ParseOneCharToken(state, 'E')) { return true; } state->parse_state = copy; - // Function-param expression (level 1+). - if (ParseTwoCharToken(state, "fL") && Optional(ParseNumber(state, nullptr)) && - ParseOneCharToken(state, 'p') && Optional(ParseCVQualifiers(state)) && - Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { + // ::= + if (ParseFunctionParam(state)) return true; + state->parse_state = copy; + + // ::= tl * E + if (ParseTwoCharToken(state, "tl") && ParseType(state) && + ZeroOrMore(ParseBracedExpression, state) && + ParseOneCharToken(state, 'E')) { return true; } state->parse_state = copy; @@ -1845,9 +1985,42 @@ static bool ParseExpression(State *state) { } state->parse_state = copy; + // sizeof...(pack) + // + // ::= sZ + // ::= sZ + if (ParseTwoCharToken(state, "sZ") && + (ParseFunctionParam(state) || ParseTemplateParam(state))) { + return true; + } + state->parse_state = copy; + + // Unary folds (... op pack) and (pack op ...). + // + // ::= fl + // ::= fr + if ((ParseTwoCharToken(state, "fl") || ParseTwoCharToken(state, "fr")) && + ParseOperatorName(state, nullptr) && ParseExpression(state)) { + return true; + } + state->parse_state = copy; + + // Binary folds (init op ... op pack) and (pack op ... op init). + // + // ::= fL + // ::= fR + if ((ParseTwoCharToken(state, "fL") || ParseTwoCharToken(state, "fR")) && + ParseOperatorName(state, nullptr) && ParseExpression(state) && + ParseExpression(state)) { + return true; + } + state->parse_state = copy; + // Object and pointer member access expressions. + // + // ::= (dt | pt) if ((ParseTwoCharToken(state, "dt") || ParseTwoCharToken(state, "pt")) && - ParseExpression(state) && ParseType(state)) { + ParseExpression(state) && ParseUnresolvedName(state)) { return true; } state->parse_state = copy; @@ -1867,6 +2040,22 @@ static bool ParseExpression(State *state) { } state->parse_state = copy; + // Vendor extended expressions + if (ParseOneCharToken(state, 'u') && ParseSourceName(state) && + ZeroOrMore(ParseTemplateArg, state) && ParseOneCharToken(state, 'E')) { + return true; + } + state->parse_state = copy; + + // ::= rq + E + // + // https://github.com/itanium-cxx-abi/cxx-abi/issues/24 + if (ParseTwoCharToken(state, "rq") && OneOrMore(ParseRequirement, state) && + ParseOneCharToken(state, 'E')) { + return true; + } + state->parse_state = copy; + return ParseUnresolvedName(state); } @@ -1912,10 +2101,35 @@ static bool ParseExprPrimary(State *state) { return false; } - // The merged cast production. - if (ParseOneCharToken(state, 'L') && ParseType(state) && - ParseExprCastValue(state)) { - return true; + if (ParseOneCharToken(state, 'L')) { + // There are two special cases in which a literal may or must contain a type + // without a value. The first is that both LDnE and LDn0E are valid + // encodings of nullptr, used in different situations. Recognize LDnE here, + // leaving LDn0E to be recognized by the general logic afterward. + if (ParseThreeCharToken(state, "DnE")) return true; + + // The second special case is a string literal, currently mangled in C++98 + // style as LA_KcE. This is inadequate to support C++11 and + // later versions, and the discussion of this problem has not converged. + // + // https://github.com/itanium-cxx-abi/cxx-abi/issues/64 + // + // For now the bare-type mangling is what's used in practice, so we + // recognize this form and only this form if an array type appears here. + // Someday we'll probably have to accept a new form of value mangling in + // LA...E constructs. (Note also that C++20 allows a wide range of + // class-type objects as template arguments, so someday their values will be + // mangled and we'll have to recognize them here too.) + if (RemainingInput(state)[0] == 'A' /* an array type follows */) { + if (ParseType(state) && ParseOneCharToken(state, 'E')) return true; + state->parse_state = copy; + return false; + } + + // The merged cast production. + if (ParseType(state) && ParseExprCastValueAndTrailingE(state)) { + return true; + } } state->parse_state = copy; @@ -1929,7 +2143,7 @@ static bool ParseExprPrimary(State *state) { } // or , followed by 'E', as described above ParseExprPrimary. -static bool ParseExprCastValue(State *state) { +static bool ParseExprCastValueAndTrailingE(State *state) { ComplexityGuard guard(state); if (guard.IsTooComplex()) return false; // We have to be able to backtrack after accepting a number because we could @@ -1983,6 +2197,39 @@ static bool ParseQRequiresClauseExpr(State *state) { return false; } +// ::= X [N] [R ] +// ::= T +// ::= Q +// +// ::= +// +// ::= +// +// https://github.com/itanium-cxx-abi/cxx-abi/issues/24 +static bool ParseRequirement(State *state) { + ComplexityGuard guard(state); + if (guard.IsTooComplex()) return false; + + ParseState copy = state->parse_state; + + if (ParseOneCharToken(state, 'X') && ParseExpression(state) && + Optional(ParseOneCharToken(state, 'N')) && + // This logic backtracks cleanly if we eat an R but a valid type doesn't + // follow it. + (!ParseOneCharToken(state, 'R') || ParseName(state))) { + return true; + } + state->parse_state = copy; + + if (ParseOneCharToken(state, 'T') && ParseType(state)) return true; + state->parse_state = copy; + + if (ParseOneCharToken(state, 'Q') && ParseExpression(state)) return true; + state->parse_state = copy; + + return false; +} + // ::= Z <(function) encoding> E <(entity) name> [] // ::= Z <(function) encoding> E s [] // diff --git a/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc b/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc index 7086cab243..06ee7a4bdc 100644 --- a/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +++ b/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc @@ -36,6 +36,34 @@ bool IsLower(char c) { return 'a' <= c && c <= 'z'; } bool IsUpper(char c) { return 'A' <= c && c <= 'Z'; } bool IsAlpha(char c) { return IsLower(c) || IsUpper(c); } bool IsIdentifierChar(char c) { return IsAlpha(c) || IsDigit(c) || c == '_'; } +bool IsLowerHexDigit(char c) { return IsDigit(c) || ('a' <= c && c <= 'f'); } + +const char* BasicTypeName(char c) { + switch (c) { + case 'a': return "i8"; + case 'b': return "bool"; + case 'c': return "char"; + case 'd': return "f64"; + case 'e': return "str"; + case 'f': return "f32"; + case 'h': return "u8"; + case 'i': return "isize"; + case 'j': return "usize"; + case 'l': return "i32"; + case 'm': return "u32"; + case 'n': return "i128"; + case 'o': return "u128"; + case 'p': return "_"; + case 's': return "i16"; + case 't': return "u16"; + case 'u': return "()"; + case 'v': return "..."; + case 'x': return "i64"; + case 'y': return "u64"; + case 'z': return "!"; + } + return nullptr; +} // Parser for Rust symbol mangling v0, whose grammar is defined here: // @@ -62,11 +90,12 @@ class RustSymbolParser { // Recursive-descent parsing is a beautifully readable translation of a // grammar, but it risks stack overflow if implemented by naive recursion on // the C++ call stack. So we simulate recursion by goto and switch instead, - // keeping a bounded stack of "return addresses" in the stack_ member. + // keeping a bounded stack of "return addresses" in the recursion_stack_ + // member. // // The callee argument is a statement label. We goto that label after - // saving the "return address" on stack_. The next continue statement in - // the for loop below "returns" from this "call". + // saving the "return address" on recursion_stack_. The next continue + // statement in the for loop below "returns" from this "call". // // The caller argument names the return point. Each value of caller must // appear in only one ABSL_DEMANGLER_RECURSE call and be listed in the @@ -80,9 +109,9 @@ class RustSymbolParser { // ParseIdentifier. #define ABSL_DEMANGLER_RECURSE(callee, caller) \ do { \ - if (depth_ == data_stack_pointer_) return false; \ + if (recursion_depth_ == kStackSize) return false; \ /* The next continue will switch on this saved value ... */ \ - stack_[depth_++] = caller; \ + recursion_stack_[recursion_depth_++] = caller; \ goto callee; \ /* ... and will land here, resuming the suspended code. */ \ case caller: {} \ @@ -92,10 +121,10 @@ class RustSymbolParser { // excessively complex input and infinite-loop bugs. int iter = 0; goto whole_encoding; - for (; iter < kMaxReturns && depth_ > 0; ++iter) { + for (; iter < kMaxReturns && recursion_depth_ > 0; ++iter) { // This switch resumes the code path most recently suspended by // ABSL_DEMANGLER_RECURSE. - switch (static_cast(stack_[--depth_])) { + switch (recursion_stack_[--recursion_depth_]) { // // symbol-name -> // _R decimal-number? path instantiating-crate? vendor-specific-suffix? @@ -115,15 +144,19 @@ class RustSymbolParser { // path -> crate-root | inherent-impl | trait-impl | trait-definition | // nested-path | generic-args | backref + // + // Note that ABSL_DEMANGLER_RECURSE does not work inside a nested switch + // (which would hide the generated case label). Thus we jump out of the + // inner switch with gotos before performing any fake recursion. path: switch (Take()) { case 'C': goto crate_root; - case 'M': return false; // inherent-impl not yet implemented - case 'X': return false; // trait-impl not yet implemented - case 'Y': return false; // trait-definition not yet implemented + case 'M': goto inherent_impl; + case 'X': goto trait_impl; + case 'Y': goto trait_definition; case 'N': goto nested_path; - case 'I': return false; // generic-args not yet implemented - case 'B': return false; // backref not yet implemented + case 'I': goto generic_args; + case 'B': goto path_backref; default: return false; } @@ -132,16 +165,54 @@ class RustSymbolParser { if (!ParseIdentifier()) return false; continue; - // nested-path -> N namespace path identifier (N consumed above) + // inherent-impl -> M impl-path type (M already consumed) + inherent_impl: + if (!Emit("<")) return false; + ABSL_DEMANGLER_RECURSE(impl_path, kInherentImplType); + ABSL_DEMANGLER_RECURSE(type, kInherentImplEnding); + if (!Emit(">")) return false; + continue; + + // trait-impl -> X impl-path type path (X already consumed) + trait_impl: + if (!Emit("<")) return false; + ABSL_DEMANGLER_RECURSE(impl_path, kTraitImplType); + ABSL_DEMANGLER_RECURSE(type, kTraitImplInfix); + if (!Emit(" as ")) return false; + ABSL_DEMANGLER_RECURSE(path, kTraitImplEnding); + if (!Emit(">")) return false; + continue; + + // impl-path -> disambiguator? path (but never print it!) + impl_path: + ++silence_depth_; + { + int ignored_disambiguator; + if (!ParseDisambiguator(ignored_disambiguator)) return false; + } + ABSL_DEMANGLER_RECURSE(path, kImplPathEnding); + --silence_depth_; + continue; + + // trait-definition -> Y type path (Y already consumed) + trait_definition: + if (!Emit("<")) return false; + ABSL_DEMANGLER_RECURSE(type, kTraitDefinitionInfix); + if (!Emit(" as ")) return false; + ABSL_DEMANGLER_RECURSE(path, kTraitDefinitionEnding); + if (!Emit(">")) return false; + continue; + + // nested-path -> N namespace path identifier (N already consumed) // namespace -> lower | upper nested_path: - // Uppercase namespaces must be saved on the stack so we can print + // Uppercase namespaces must be saved on a stack so we can print // ::{closure#0} or ::{shim:vtable#0} or ::{X:name#0} as needed. if (IsUpper(Peek())) { - if (!PushByte(static_cast(Take()))) return false; + if (!PushNamespace(Take())) return false; ABSL_DEMANGLER_RECURSE(path, kIdentifierInUppercaseNamespace); if (!Emit("::")) return false; - if (!ParseIdentifier(static_cast(PopByte()))) return false; + if (!ParseIdentifier(PopNamespace())) return false; continue; } @@ -156,6 +227,274 @@ class RustSymbolParser { // Neither upper or lower return false; + + // type -> basic-type | array-type | slice-type | tuple-type | + // ref-type | mut-ref-type | const-ptr-type | mut-ptr-type | + // fn-type | dyn-trait-type | path | backref + // + // We use ifs instead of switch (Take()) because the default case jumps + // to path, which will need to see the first character not yet Taken + // from the input. Because we do not use a nested switch here, + // ABSL_DEMANGLER_RECURSE works fine in the 'S' case. + type: + if (IsLower(Peek())) { + const char* type_name = BasicTypeName(Take()); + if (type_name == nullptr || !Emit(type_name)) return false; + continue; + } + if (Eat('A')) { + // array-type = A type const + if (!Emit("[")) return false; + ABSL_DEMANGLER_RECURSE(type, kArraySize); + if (!Emit("; ")) return false; + ABSL_DEMANGLER_RECURSE(constant, kFinishArray); + if (!Emit("]")) return false; + continue; + } + if (Eat('S')) { + if (!Emit("[")) return false; + ABSL_DEMANGLER_RECURSE(type, kSliceEnding); + if (!Emit("]")) return false; + continue; + } + if (Eat('T')) goto tuple_type; + if (Eat('R')) { + if (!Emit("&")) return false; + if (!ParseOptionalLifetime()) return false; + goto type; + } + if (Eat('Q')) { + if (!Emit("&mut ")) return false; + if (!ParseOptionalLifetime()) return false; + goto type; + } + if (Eat('P')) { + if (!Emit("*const ")) return false; + goto type; + } + if (Eat('O')) { + if (!Emit("*mut ")) return false; + goto type; + } + if (Eat('F')) goto fn_type; + if (Eat('D')) goto dyn_trait_type; + if (Eat('B')) goto type_backref; + goto path; + + // tuple-type -> T type* E (T already consumed) + tuple_type: + if (!Emit("(")) return false; + + // The toolchain should call the unit type u instead of TE, but the + // grammar and other demanglers also recognize TE, so we do too. + if (Eat('E')) { + if (!Emit(")")) return false; + continue; + } + + // A tuple with one element is rendered (type,) instead of (type). + ABSL_DEMANGLER_RECURSE(type, kAfterFirstTupleElement); + if (Eat('E')) { + if (!Emit(",)")) return false; + continue; + } + + // A tuple with two elements is of course (x, y). + if (!Emit(", ")) return false; + ABSL_DEMANGLER_RECURSE(type, kAfterSecondTupleElement); + if (Eat('E')) { + if (!Emit(")")) return false; + continue; + } + + // And (x, y, z) for three elements. + if (!Emit(", ")) return false; + ABSL_DEMANGLER_RECURSE(type, kAfterThirdTupleElement); + if (Eat('E')) { + if (!Emit(")")) return false; + continue; + } + + // For longer tuples we write (x, y, z, ...), printing none of the + // content of the fourth and later types. Thus we avoid exhausting + // output buffers and human readers' patience when some library has a + // long tuple as an implementation detail, without having to + // completely obfuscate all tuples. + if (!Emit(", ...)")) return false; + ++silence_depth_; + while (!Eat('E')) { + ABSL_DEMANGLER_RECURSE(type, kAfterSubsequentTupleElement); + } + --silence_depth_; + continue; + + // fn-type -> F fn-sig (F already consumed) + // fn-sig -> binder? U? (K abi)? type* E type + // abi -> C | undisambiguated-identifier + // + // We follow the C++ demangler in suppressing details of function + // signatures. Every function type is rendered "fn...". + fn_type: + if (!Emit("fn...")) return false; + ++silence_depth_; + if (!ParseOptionalBinder()) return false; + (void)Eat('U'); + if (Eat('K')) { + if (!Eat('C') && !ParseUndisambiguatedIdentifier()) return false; + } + while (!Eat('E')) { + ABSL_DEMANGLER_RECURSE(type, kContinueParameterList); + } + ABSL_DEMANGLER_RECURSE(type, kFinishFn); + --silence_depth_; + continue; + + // dyn-trait-type -> D dyn-bounds lifetime (D already consumed) + // dyn-bounds -> binder? dyn-trait* E + // + // The grammar strangely allows an empty trait list, even though the + // compiler should never output one. We follow existing demanglers in + // rendering DEL_ as "dyn ". + // + // Because auto traits lengthen a type name considerably without + // providing much value to a search for related source code, it would be + // desirable to abbreviate + // dyn main::Trait + std::marker::Copy + std::marker::Send + // to + // dyn main::Trait + ..., + // eliding the auto traits. But it is difficult to do so correctly, in + // part because there is no guarantee that the mangling will list the + // main trait first. So we just print all the traits in their order of + // appearance in the mangled name. + dyn_trait_type: + if (!Emit("dyn ")) return false; + if (!ParseOptionalBinder()) return false; + if (!Eat('E')) { + ABSL_DEMANGLER_RECURSE(dyn_trait, kBeginAutoTraits); + while (!Eat('E')) { + if (!Emit(" + ")) return false; + ABSL_DEMANGLER_RECURSE(dyn_trait, kContinueAutoTraits); + } + } + if (!ParseRequiredLifetime()) return false; + continue; + + // dyn-trait -> path dyn-trait-assoc-binding* + // dyn-trait-assoc-binding -> p undisambiguated-identifier type + // + // We render nonempty binding lists as <>, omitting their contents as + // for generic-args. + dyn_trait: + ABSL_DEMANGLER_RECURSE(path, kContinueDynTrait); + if (Peek() == 'p') { + if (!Emit("<>")) return false; + ++silence_depth_; + while (Eat('p')) { + if (!ParseUndisambiguatedIdentifier()) return false; + ABSL_DEMANGLER_RECURSE(type, kContinueAssocBinding); + } + --silence_depth_; + } + continue; + + // const -> type const-data | p | backref + // + // const is a C++ keyword, so we use the label `constant` instead. + constant: + if (Eat('B')) goto const_backref; + if (Eat('p')) { + if (!Emit("_")) return false; + continue; + } + + // Scan the type without printing it. + // + // The Rust language restricts the type of a const generic argument + // much more than the mangling grammar does. We do not enforce this. + // + // We also do not bother printing false, true, 'A', and '\u{abcd}' for + // the types bool and char. Because we do not print generic-args + // contents, we expect to print constants only in array sizes, and + // those should not be bool or char. + ++silence_depth_; + ABSL_DEMANGLER_RECURSE(type, kConstData); + --silence_depth_; + + // const-data -> n? hex-digit* _ + // + // Although the grammar doesn't say this, existing demanglers expect + // that zero is 0, not an empty digit sequence, and no nonzero value + // may have leading zero digits. Also n0_ is accepted and printed as + // -0, though a toolchain will probably never write that encoding. + if (Eat('n') && !EmitChar('-')) return false; + if (!Emit("0x")) return false; + if (Eat('0')) { + if (!EmitChar('0')) return false; + if (!Eat('_')) return false; + continue; + } + while (IsLowerHexDigit(Peek())) { + if (!EmitChar(Take())) return false; + } + if (!Eat('_')) return false; + continue; + + // generic-args -> I path generic-arg* E (I already consumed) + // + // We follow the C++ demangler in omitting all the arguments from the + // output, printing only the list opening and closing tokens. + generic_args: + ABSL_DEMANGLER_RECURSE(path, kBeginGenericArgList); + if (!Emit("::<>")) return false; + ++silence_depth_; + while (!Eat('E')) { + ABSL_DEMANGLER_RECURSE(generic_arg, kContinueGenericArgList); + } + --silence_depth_; + continue; + + // generic-arg -> lifetime | type | K const + generic_arg: + if (Peek() == 'L') { + if (!ParseOptionalLifetime()) return false; + continue; + } + if (Eat('K')) goto constant; + goto type; + + // backref -> B base-62-number (B already consumed) + // + // The BeginBackref call parses and range-checks the base-62-number. We + // always do that much. + // + // The recursive call parses and prints what the backref points at. We + // save CPU and stack by skipping this work if the output would be + // suppressed anyway. + path_backref: + if (!BeginBackref()) return false; + if (silence_depth_ == 0) { + ABSL_DEMANGLER_RECURSE(path, kPathBackrefEnding); + } + EndBackref(); + continue; + + // This represents the same backref production as in path_backref but + // parses the target as a type instead of a path. + type_backref: + if (!BeginBackref()) return false; + if (silence_depth_ == 0) { + ABSL_DEMANGLER_RECURSE(type, kTypeBackrefEnding); + } + EndBackref(); + continue; + + const_backref: + if (!BeginBackref()) return false; + if (silence_depth_ == 0) { + ABSL_DEMANGLER_RECURSE(constant, kConstantBackrefEnding); + } + EndBackref(); + continue; } } @@ -169,12 +508,52 @@ class RustSymbolParser { kVendorSpecificSuffix, kIdentifierInUppercaseNamespace, kIdentifierInLowercaseNamespace, + kInherentImplType, + kInherentImplEnding, + kTraitImplType, + kTraitImplInfix, + kTraitImplEnding, + kImplPathEnding, + kTraitDefinitionInfix, + kTraitDefinitionEnding, + kArraySize, + kFinishArray, + kSliceEnding, + kAfterFirstTupleElement, + kAfterSecondTupleElement, + kAfterThirdTupleElement, + kAfterSubsequentTupleElement, + kContinueParameterList, + kFinishFn, + kBeginAutoTraits, + kContinueAutoTraits, + kContinueDynTrait, + kContinueAssocBinding, + kConstData, + kBeginGenericArgList, + kContinueGenericArgList, + kPathBackrefEnding, + kTypeBackrefEnding, + kConstantBackrefEnding, }; - // Element count for the stack_ array. A larger kStackSize accommodates more + // Element counts for the stack arrays. Larger stack sizes accommodate more // deeply nested names at the cost of a larger footprint on the C++ call // stack. - enum { kStackSize = 256 }; + enum { + // Maximum recursive calls outstanding at one time. + kStackSize = 256, + + // Maximum N nested-paths open at once. We do not expect + // closures inside closures inside closures as much as functions inside + // modules inside other modules, so we can use a smaller array here. + kNamespaceStackSize = 64, + + // Maximum number of nested backrefs. We can keep this stack pretty small + // because we do not follow backrefs inside generic-args or other contexts + // that suppress printing, so deep stacking is unlikely in practice. + kPositionStackSize = 16, + }; // Returns the next input character without consuming it. char Peek() const { return encoding_[pos_]; } @@ -311,6 +690,20 @@ class RustSymbolParser { int disambiguator = 0; if (!ParseDisambiguator(disambiguator)) return false; + return ParseUndisambiguatedIdentifier(uppercase_namespace, disambiguator); + } + + // Consumes from the input an identifier with no preceding disambiguator, + // returning true on success. + // + // When ParseIdentifier calls this, it passes the N character and + // disambiguator value so that "{closure#42}" and similar forms can be + // rendered correctly. + // + // At other appearances of undisambiguated-identifier in the grammar, this + // treatment is not applicable, and the call site omits both arguments. + ABSL_MUST_USE_RESULT bool ParseUndisambiguatedIdentifier( + char uppercase_namespace = '\0', int disambiguator = 0) { // undisambiguated-identifier -> u? decimal-number _? bytes const bool is_punycoded = Eat('u'); if (!IsDigit(Peek())) return false; @@ -320,6 +713,8 @@ class RustSymbolParser { // Emit the beginnings of braced forms like {shim:vtable#0}. if (uppercase_namespace == '\0') { + // Decoding of Punycode is not yet implemented. For now we emit + // "{Punycode ...}" with the raw encoding inside. if (is_punycoded && !Emit("{Punycode ")) return false; } else { switch (uppercase_namespace) { @@ -383,25 +778,116 @@ class RustSymbolParser { return true; } - // Pushes byte onto the data stack (the right side of stack_) and returns - // true if stack_ is not full, else returns false. - ABSL_MUST_USE_RESULT bool PushByte(std::uint8_t byte) { - if (depth_ == data_stack_pointer_) return false; - stack_[--data_stack_pointer_] = byte; + // Consumes a binder of higher-ranked lifetimes if one is present. On success + // returns true and discards the encoded lifetime count. On parse failure + // returns false. + ABSL_MUST_USE_RESULT bool ParseOptionalBinder() { + // binder -> G base-62-number + if (!Eat('G')) return true; + int ignored_binding_count; + return ParseBase62Number(ignored_binding_count); + } + + // Consumes a lifetime if one is present. + // + // On success returns true and discards the lifetime index. We do not print + // or even range-check lifetimes because they are a finer detail than other + // things we omit from output, such as the entire contents of generic-args. + // + // On parse failure returns false. + ABSL_MUST_USE_RESULT bool ParseOptionalLifetime() { + // lifetime -> L base-62-number + if (!Eat('L')) return true; + int ignored_de_bruijn_index; + return ParseBase62Number(ignored_de_bruijn_index); + } + + // Consumes a lifetime just like ParseOptionalLifetime, but returns false if + // there is no lifetime here. + ABSL_MUST_USE_RESULT bool ParseRequiredLifetime() { + if (Peek() != 'L') return false; + return ParseOptionalLifetime(); + } + + // Pushes ns onto the namespace stack and returns true if the stack is not + // full, else returns false. + ABSL_MUST_USE_RESULT bool PushNamespace(char ns) { + if (namespace_depth_ == kNamespaceStackSize) return false; + namespace_stack_[namespace_depth_++] = ns; return true; } - // Pops the last pushed data byte from stack_. Requires that the data stack - // is not empty (data_stack_pointer_ < kStackSize). - std::uint8_t PopByte() { return stack_[data_stack_pointer_++]; } + // Pops the last pushed namespace. Requires that the namespace stack is not + // empty (namespace_depth_ > 0). + char PopNamespace() { return namespace_stack_[--namespace_depth_]; } - // Call and data stacks reside in stack_. The leftmost depth_ elements - // contain ReturnAddresses pushed by ABSL_DEMANGLER_RECURSE. The elements - // from index data_stack_pointer_ to the right edge of stack_ contain bytes - // pushed by PushByte. - std::uint8_t stack_[kStackSize] = {}; - int data_stack_pointer_ = kStackSize; - int depth_ = 0; + // Pushes position onto the position stack and returns true if the stack is + // not full, else returns false. + ABSL_MUST_USE_RESULT bool PushPosition(int position) { + if (position_depth_ == kPositionStackSize) return false; + position_stack_[position_depth_++] = position; + return true; + } + + // Pops the last pushed input position. Requires that the position stack is + // not empty (position_depth_ > 0). + int PopPosition() { return position_stack_[--position_depth_]; } + + // Consumes a base-62-number denoting a backref target, pushes the current + // input position on the data stack, and sets the input position to the + // beginning of the backref target. Returns true on success. Returns false + // if parsing failed, the stack is exhausted, or the backref target position + // is out of range. + ABSL_MUST_USE_RESULT bool BeginBackref() { + // backref = B base-62-number (B already consumed) + // + // Reject backrefs that don't parse, overflow int, or don't point backward. + // If the offset looks fine, adjust it to account for the _R prefix. + int offset = 0; + const int offset_of_this_backref = + pos_ - 2 /* _R */ - 1 /* B already consumed */; + if (!ParseBase62Number(offset) || offset < 0 || + offset >= offset_of_this_backref) { + return false; + } + offset += 2; + + // Save the old position to restore later. + if (!PushPosition(pos_)) return false; + + // Move the input position to the backref target. + // + // Note that we do not check whether the new position points to the + // beginning of a construct matching the context in which the backref + // appeared. We just jump to it and see whether nested parsing succeeds. + // We therefore accept various wrong manglings, e.g., a type backref + // pointing to an 'l' character inside an identifier, which happens to mean + // i32 when parsed as a type mangling. This saves the complexity and RAM + // footprint of remembering which offsets began which kinds of + // substructures. Existing demanglers take similar shortcuts. + pos_ = offset; + return true; + } + + // Cleans up after a backref production by restoring the previous input + // position from the data stack. + void EndBackref() { pos_ = PopPosition(); } + + // The leftmost recursion_depth_ elements of recursion_stack_ contain the + // ReturnAddresses pushed by ABSL_DEMANGLER_RECURSE calls not yet completed. + ReturnAddress recursion_stack_[kStackSize] = {}; + int recursion_depth_ = 0; + + // The leftmost namespace_depth_ elements of namespace_stack_ contain the + // uppercase namespace identifiers for open nested-paths, e.g., 'C' for a + // closure. + char namespace_stack_[kNamespaceStackSize] = {}; + int namespace_depth_ = 0; + + // The leftmost position_depth_ elements of position_stack_ contain the input + // positions to return to after fully printing the targets of backrefs. + int position_stack_[kPositionStackSize] = {}; + int position_depth_ = 0; // Anything parsed while silence_depth_ > 0 contributes nothing to the // demangled output. For constructs omitted from the demangling, such as @@ -409,8 +895,8 @@ class RustSymbolParser { // silence_depth_ on the way in and decrement silence_depth_ on the way out. int silence_depth_ = 0; - // Input: encoding_ points just after the _R in a Rust mangled symbol, and - // encoding_[pos_] is the next input character to be scanned. + // Input: encoding_ points to a Rust mangled symbol, and encoding_[pos_] is + // the next input character to be scanned. int pos_ = 0; const char* encoding_ = nullptr; diff --git a/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.h b/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.h index 8e9060b42f..1c19815f24 100644 --- a/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.h +++ b/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.h @@ -33,10 +33,8 @@ namespace debugging_internal { // call-stack space. It is suitable for symbolizing stack traces in a signal // handler. // -// The demangling logic is under development. In this version of Abseil, -// DemangleRustSymbolEncoding parses a few simple kinds of symbol names, but -// nothing having backreferences in the input or angle brackets in the -// demangling, and it emits raw Punycode instead of the UTF-8 represented by it. +// The demangling logic is under development; search for "not yet implemented" +// in the .cc file to see where the gaps are. bool DemangleRustSymbolEncoding(const char* mangled, char* out, std::size_t out_size); diff --git a/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust_test.cc b/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust_test.cc index 2841576ef9..00bba780da 100644 --- a/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust_test.cc +++ b/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_rust_test.cc @@ -209,6 +209,374 @@ TEST(DemangleRust, NestedUppercaseNamespaces) { "crate_name::{Y:y#2}::{X:x#3}::{closure#4}"); } +TEST(DemangleRust, TraitDefinition) { + EXPECT_DEMANGLING( + "_RNvYNtC7crate_a9my_structNtC7crate_b8my_trait1f", + "::f"); +} + +TEST(DemangleRust, BasicTypeNames) { + EXPECT_DEMANGLING("_RNvYaNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYbNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYcNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYdNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYeNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYfNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYhNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYiNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYjNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYlNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYmNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYnNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYoNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYpNtC1c1t1f", "<_ as c::t>::f"); + EXPECT_DEMANGLING("_RNvYsNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYtNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYuNtC1c1t1f", "<() as c::t>::f"); + EXPECT_DEMANGLING("_RNvYvNtC1c1t1f", "<... as c::t>::f"); + EXPECT_DEMANGLING("_RNvYxNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYyNtC1c1t1f", "::f"); + EXPECT_DEMANGLING("_RNvYzNtC1c1t1f", "::f"); + + EXPECT_DEMANGLING_FAILS("_RNvYkNtC1c1t1f"); +} + +TEST(DemangleRust, SliceTypes) { + EXPECT_DEMANGLING("_RNvYSlNtC1c1t1f", "<[i32] as c::t>::f"); + EXPECT_DEMANGLING("_RNvYSNtC1d1sNtC1c1t1f", "<[d::s] as c::t>::f"); +} + +TEST(DemangleRust, ImmutableReferenceTypes) { + EXPECT_DEMANGLING("_RNvYRlNtC1c1t1f", "<&i32 as c::t>::f"); + EXPECT_DEMANGLING("_RNvYRNtC1d1sNtC1c1t1f", "<&d::s as c::t>::f"); +} + +TEST(DemangleRust, MutableReferenceTypes) { + EXPECT_DEMANGLING("_RNvYQlNtC1c1t1f", "<&mut i32 as c::t>::f"); + EXPECT_DEMANGLING("_RNvYQNtC1d1sNtC1c1t1f", "<&mut d::s as c::t>::f"); +} + +TEST(DemangleRust, ConstantRawPointerTypes) { + EXPECT_DEMANGLING("_RNvYPlNtC1c1t1f", "<*const i32 as c::t>::f"); + EXPECT_DEMANGLING("_RNvYPNtC1d1sNtC1c1t1f", "<*const d::s as c::t>::f"); +} + +TEST(DemangleRust, MutableRawPointerTypes) { + EXPECT_DEMANGLING("_RNvYOlNtC1c1t1f", "<*mut i32 as c::t>::f"); + EXPECT_DEMANGLING("_RNvYONtC1d1sNtC1c1t1f", "<*mut d::s as c::t>::f"); +} + +TEST(DemangleRust, TupleLength0) { + EXPECT_DEMANGLING("_RNvYTENtC1c1t1f", "<() as c::t>::f"); +} + +TEST(DemangleRust, TupleLength1) { + EXPECT_DEMANGLING("_RNvYTlENtC1c1t1f", "<(i32,) as c::t>::f"); + EXPECT_DEMANGLING("_RNvYTNtC1d1sENtC1c1t1f", "<(d::s,) as c::t>::f"); +} + +TEST(DemangleRust, TupleLength2) { + EXPECT_DEMANGLING("_RNvYTlmENtC1c1t1f", "<(i32, u32) as c::t>::f"); + EXPECT_DEMANGLING("_RNvYTNtC1d1xNtC1e1yENtC1c1t1f", + "<(d::x, e::y) as c::t>::f"); +} + +TEST(DemangleRust, TupleLength3) { + EXPECT_DEMANGLING("_RNvYTlmnENtC1c1t1f", "<(i32, u32, i128) as c::t>::f"); + EXPECT_DEMANGLING("_RNvYTNtC1d1xNtC1e1yNtC1f1zENtC1c1t1f", + "<(d::x, e::y, f::z) as c::t>::f"); +} + +TEST(DemangleRust, LongerTuplesAbbreviated) { + EXPECT_DEMANGLING("_RNvYTlmnoENtC1c1t1f", + "<(i32, u32, i128, ...) as c::t>::f"); + EXPECT_DEMANGLING("_RNvYTlmnNtC1d1xNtC1e1yENtC1c1t1f", + "<(i32, u32, i128, ...) as c::t>::f"); +} + +TEST(DemangleRust, PathBackrefToCrate) { + EXPECT_DEMANGLING("_RNvYNtC8my_crate9my_structNtB4_8my_trait1f", + "::f"); +} + +TEST(DemangleRust, PathBackrefToNestedPath) { + EXPECT_DEMANGLING("_RNvYNtNtC1c1m1sNtB4_1t1f", "::f"); +} + +TEST(DemangleRust, PathBackrefAsInstantiatingCrate) { + EXPECT_DEMANGLING("_RNCNvC8my_crate7my_func0B3_", + "my_crate::my_func::{closure#0}"); +} + +TEST(DemangleRust, TypeBackrefsNestedInTuple) { + EXPECT_DEMANGLING("_RNvYTTRlB4_ERB3_ENtC1c1t1f", + "<((&i32, &i32), &(&i32, &i32)) as c::t>::f"); +} + +TEST(DemangleRust, NoInfiniteLoopOnBackrefToTheWhole) { + EXPECT_DEMANGLING_FAILS("_RB_"); + EXPECT_DEMANGLING_FAILS("_RNvB_1sNtC1c1t1f"); +} + +TEST(DemangleRust, NoCrashOnForwardBackref) { + EXPECT_DEMANGLING_FAILS("_RB0_"); + EXPECT_DEMANGLING_FAILS("_RB1_"); + EXPECT_DEMANGLING_FAILS("_RB2_"); + EXPECT_DEMANGLING_FAILS("_RB3_"); + EXPECT_DEMANGLING_FAILS("_RB4_"); +} + +TEST(DemangleRust, PathBackrefsDoNotRecurseDuringSilence) { + // B_ points at the value f (the whole mangling), so the cycle would lead to + // parse failure if the parser tried to parse what was pointed to. + EXPECT_DEMANGLING("_RNvYTlmnNtB_1sENtC1c1t1f", + "<(i32, u32, i128, ...) as c::t>::f"); +} + +TEST(DemangleRust, TypeBackrefsDoNotRecurseDuringSilence) { + // B2_ points at the tuple type, likewise making a cycle that the parser + // avoids following. + EXPECT_DEMANGLING("_RNvYTlmnB2_ENtC1c1t1f", + "<(i32, u32, i128, ...) as c::t>::f"); +} + +TEST(DemangleRust, ConstBackrefsDoNotRecurseDuringSilence) { + // B_ points at the whole I...E mangling, which does not parse as a const. + EXPECT_DEMANGLING("_RINvC1c1fAlB_E", "c::f::<>"); +} + +TEST(DemangleRust, ReturnFromBackrefToInputPosition256) { + // Show that we can resume at input positions that don't fit into a byte. + EXPECT_DEMANGLING("_RNvYNtC1c238very_long_type_" + "ABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij" + "ABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij" + "ABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij" + "ABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij" + "ABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij" + "ABCDEFGHIJabcdefghijABC" + "NtB4_1t1f", + "::f"); +} + +TEST(DemangleRust, EmptyGenericArgs) { + EXPECT_DEMANGLING("_RINvC1c1fE", "c::f::<>"); +} + +TEST(DemangleRust, OneSimpleTypeInGenericArgs) { + EXPECT_DEMANGLING("_RINvC1c1flE", // c::f:: + "c::f::<>"); +} + +TEST(DemangleRust, OneTupleInGenericArgs) { + EXPECT_DEMANGLING("_RINvC1c1fTlmEE", // c::f::<(i32, u32)> + "c::f::<>"); +} + +TEST(DemangleRust, OnePathInGenericArgs) { + EXPECT_DEMANGLING("_RINvC1c1fNtC1d1sE", // c::f:: + "c::f::<>"); +} + +TEST(DemangleRust, LongerGenericArgs) { + EXPECT_DEMANGLING("_RINvC1c1flmRNtC1d1sE", // c::f:: + "c::f::<>"); +} + +TEST(DemangleRust, BackrefInGenericArgs) { + EXPECT_DEMANGLING("_RINvC1c1fRlB7_NtB2_1sE", // c::f::<&i32, &i32, c::s> + "c::f::<>"); +} + +TEST(DemangleRust, NestedGenericArgs) { + EXPECT_DEMANGLING("_RINvC1c1fINtB2_1slEmE", // c::f::, u32> + "c::f::<>"); +} + +TEST(DemangleRust, MonomorphicEntityNestedInsideGeneric) { + EXPECT_DEMANGLING("_RNvINvC1c1fppE1g", // c::f::<_, _>::g + "c::f::<>::g"); +} + +TEST(DemangleRust, ArrayTypeWithSimpleElementType) { + EXPECT_DEMANGLING("_RNvYAlj1f_NtC1c1t1f", "<[i32; 0x1f] as c::t>::f"); +} + +TEST(DemangleRust, ArrayTypeWithComplexElementType) { + EXPECT_DEMANGLING("_RNvYAINtC1c1slEj1f_NtB6_1t1f", + "<[c::s::<>; 0x1f] as c::t>::f"); +} + +TEST(DemangleRust, NestedArrayType) { + EXPECT_DEMANGLING("_RNvYAAlj1f_j2e_NtC1c1t1f", + "<[[i32; 0x1f]; 0x2e] as c::t>::f"); +} + +TEST(DemangleRust, BackrefArraySize) { + EXPECT_DEMANGLING("_RNvYAAlj1f_B5_NtC1c1t1f", + "<[[i32; 0x1f]; 0x1f] as c::t>::f"); +} + +TEST(DemangleRust, ZeroArraySize) { + EXPECT_DEMANGLING("_RNvYAlj0_NtC1c1t1f", "<[i32; 0x0] as c::t>::f"); +} + +TEST(DemangleRust, SurprisingMinusesInArraySize) { + // Compilers shouldn't do this stuff, but existing demanglers accept it. + EXPECT_DEMANGLING("_RNvYAljn0_NtC1c1t1f", "<[i32; -0x0] as c::t>::f"); + EXPECT_DEMANGLING("_RNvYAljn42_NtC1c1t1f", "<[i32; -0x42] as c::t>::f"); +} + +TEST(DemangleRust, NumberAsGenericArg) { + EXPECT_DEMANGLING("_RINvC1c1fKl8_E", // c::f::<0x8> + "c::f::<>"); +} + +TEST(DemangleRust, NumberAsFirstOfTwoGenericArgs) { + EXPECT_DEMANGLING("_RINvC1c1fKl8_mE", // c::f::<0x8, u32> + "c::f::<>"); +} + +TEST(DemangleRust, NumberAsSecondOfTwoGenericArgs) { + EXPECT_DEMANGLING("_RINvC1c1fmKl8_E", // c::f:: + "c::f::<>"); +} + +TEST(DemangleRust, NumberPlaceholder) { + EXPECT_DEMANGLING("_RNvINvC1c1fKpE1g", // c::f::<_>::g + "c::f::<>::g"); +} + +TEST(DemangleRust, InherentImplWithoutDisambiguator) { + EXPECT_DEMANGLING("_RNvMNtC8my_crate6my_modNtB2_9my_struct7my_func", + "::my_func"); +} + +TEST(DemangleRust, InherentImplWithDisambiguator) { + EXPECT_DEMANGLING("_RNvMs_NtC8my_crate6my_modNtB4_9my_struct7my_func", + "::my_func"); +} + +TEST(DemangleRust, TraitImplWithoutDisambiguator) { + EXPECT_DEMANGLING("_RNvXC8my_crateNtB2_9my_structNtB2_8my_trait7my_func", + "::my_func"); +} + +TEST(DemangleRust, TraitImplWithDisambiguator) { + EXPECT_DEMANGLING("_RNvXs_C8my_crateNtB4_9my_structNtB4_8my_trait7my_func", + "::my_func"); +} + +TEST(DemangleRust, TraitImplWithNonpathSelfType) { + EXPECT_DEMANGLING("_RNvXC8my_crateRlNtB2_8my_trait7my_func", + "<&i32 as my_crate::my_trait>::my_func"); +} + +TEST(DemangleRust, ThunkType) { + EXPECT_DEMANGLING("_RNvYFEuNtC1c1t1f", // ::f + "::f"); +} + +TEST(DemangleRust, NontrivialFunctionReturnType) { + EXPECT_DEMANGLING( + "_RNvYFERTlmENtC1c1t1f", // &(i32, u32) as c::t>::f + "::f"); +} + +TEST(DemangleRust, OneParameterType) { + EXPECT_DEMANGLING("_RNvYFlEuNtC1c1t1f", // ::f + "::f"); +} + +TEST(DemangleRust, TwoParameterTypes) { + EXPECT_DEMANGLING("_RNvYFlmEuNtC1c1t1f", // ::f + "::f"); +} + +TEST(DemangleRust, ExternC) { + EXPECT_DEMANGLING("_RNvYFKCEuNtC1c1t1f", // >::f + "::f"); +} + +TEST(DemangleRust, ExternOther) { + EXPECT_DEMANGLING( + "_RNvYFK5not_CEuNtC1c1t1f", // ::f + "::f"); +} + +TEST(DemangleRust, Unsafe) { + EXPECT_DEMANGLING("_RNvYFUEuNtC1c1t1f", // ::f + "::f"); +} + +TEST(DemangleRust, Binder) { + EXPECT_DEMANGLING( + // fn(&'a i32) -> &'a i32 as c::t>::f + "_RNvYFG_RL0_lEB5_NtC1c1t1f", + "::f"); +} + +TEST(DemangleRust, AllFnSigFeaturesInOrder) { + EXPECT_DEMANGLING( + // unsafe extern "C" fn(&'a i32) -> &'a i32 as c::t>::f + "_RNvYFG_UKCRL0_lEB8_NtC1c1t1f", + "::f"); +} + +TEST(DemangleRust, LifetimeInGenericArgs) { + EXPECT_DEMANGLING("_RINvC1c1fINtB2_1sL_EE", // c::f::> + "c::f::<>"); +} + +TEST(DemangleRust, EmptyDynTrait) { + // This shouldn't happen, but the grammar allows it and existing demanglers + // accept it. + EXPECT_DEMANGLING("_RNvYDEL_NtC1c1t1f", + "::f"); +} + +TEST(DemangleRust, SimpleDynTrait) { + EXPECT_DEMANGLING("_RNvYDNtC1c1tEL_NtC1d1u1f", + "::f"); +} + +TEST(DemangleRust, DynTraitWithOneAssociatedType) { + EXPECT_DEMANGLING( + "_RNvYDNtC1c1tp1xlEL_NtC1d1u1f", // as d::u>::f + " as d::u>::f"); +} + +TEST(DemangleRust, DynTraitWithTwoAssociatedTypes) { + EXPECT_DEMANGLING( + // as d::u>::f + "_RNvYDNtC1c1tp1xlp1ymEL_NtC1d1u1f", + " as d::u>::f"); +} + +TEST(DemangleRust, DynTraitPlusAutoTrait) { + EXPECT_DEMANGLING( + "_RNvYDNtC1c1tNtNtC3std6marker4SendEL_NtC1d1u1f", + "::f"); +} + +TEST(DemangleRust, DynTraitPlusTwoAutoTraits) { + EXPECT_DEMANGLING( + "_RNvYDNtC1c1tNtNtC3std6marker4CopyNtBc_4SyncEL_NtC1d1u1f", + "::f"); +} + +TEST(DemangleRust, HigherRankedDynTrait) { + EXPECT_DEMANGLING( + // c::t::<&'a i32> as d::u>::f + "_RNvYDG_INtC1c1tRL0_lEEL_NtC1d1u1f", + " as d::u>::f"); +} } // namespace } // namespace debugging_internal diff --git a/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_test.cc b/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_test.cc index 0f2411a1d7..8a29edce74 100644 --- a/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_test.cc +++ b/yass/third_party/abseil-cpp/absl/debugging/internal/demangle_test.cc @@ -212,6 +212,139 @@ TEST(Demangle, TemplateParamSubstitutionWithGenericLambda) { EXPECT_STREQ(tmp, "Fooer<>::foo<>()"); } +TEST(Demangle, LambdaRequiresTrue) { + char tmp[100]; + + // auto $_0::operator()(int) const requires true + ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QLb1E", tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "$_0::operator()<>()"); +} + +TEST(Demangle, LambdaRequiresSimpleExpression) { + char tmp[100]; + + // auto $_0::operator()(int) const requires 2 + 2 == 4 + ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QeqplLi2ELi2ELi4E", + tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "$_0::operator()<>()"); +} + +TEST(Demangle, LambdaRequiresRequiresExpressionContainingTrue) { + char tmp[100]; + + // auto $_0::operator()(int) const requires requires { true; } + ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXLb1EE", tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "$_0::operator()<>()"); +} + +TEST(Demangle, LambdaRequiresRequiresExpressionContainingConcept) { + char tmp[100]; + + // auto $_0::operator()(int) const + // requires requires { std::same_as; } + ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXsr3stdE7same_asIDtfp_EiEE", + tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "$_0::operator()<>()"); +} + +TEST(Demangle, LambdaRequiresRequiresExpressionContainingNoexceptExpression) { + char tmp[100]; + + // auto $_0::operator()(int) const + // requires requires { {fp + fp} noexcept; } + ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXplfp_fp_NE", tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "$_0::operator()<>()"); +} + +TEST(Demangle, LambdaRequiresRequiresExpressionContainingReturnTypeConstraint) { + char tmp[100]; + + // auto $_0::operator()(int) const + // requires requires { {fp + fp} -> std::same_as; } + ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXplfp_fp_RNSt7same_asIDtfp_EEEE", + tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "$_0::operator()<>()"); +} + +TEST(Demangle, LambdaRequiresRequiresExpressionWithBothNoexceptAndReturnType) { + char tmp[100]; + + // auto $_0::operator()(int) const + // requires requires { {fp + fp} noexcept -> std::same_as; } + ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXplfp_fp_NRNSt7same_asIDtfp_EEEE", + tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "$_0::operator()<>()"); +} + +TEST(Demangle, LambdaRequiresRequiresExpressionContainingType) { + char tmp[100]; + + // auto $_0::operator()(S) const + // requires requires { typename S::T; } + ASSERT_TRUE(Demangle("_ZNK3$_0clI1SEEDaT_QrqTNS2_1TEE", tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "$_0::operator()<>()"); +} + +TEST(Demangle, LambdaRequiresRequiresExpressionNestingAnotherRequires) { + char tmp[100]; + + // auto $_0::operator()(int) const requires requires { requires true; } + ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqQLb1EE", tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "$_0::operator()<>()"); +} + +TEST(Demangle, LambdaRequiresRequiresExpressionContainingTwoRequirements) { + char tmp[100]; + + // auto $_0::operator()(int) const + // requires requires { requires true; requires 2 + 2 == 4; } + ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXLb1EXeqplLi2ELi2ELi4EE", + tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "$_0::operator()<>()"); +} + +TEST(Demangle, LambdaWithExplicitTypeArgument) { + char tmp[100]; + + // Source: + // + // template T f(T t) { + // return [](U u) { return u + u; }(t); + // } + // + // template int f(int); + // + // Full LLVM demangling of the lambda call operator: + // + // auto int f(int)::'lambda'(int):: + // operator()(int) const + ASSERT_TRUE(Demangle("_ZZ1fIiET_S0_ENKUlTyS0_E_clIiEEDaS0_", + tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "f<>()::{lambda()#1}::operator()<>()"); +} + +TEST(Demangle, LambdaWithExplicitPackArgument) { + char tmp[100]; + + // Source: + // + // template T h(T t) { + // return [](U... u) { + // return ((u + u) + ... + 0); + // }(t); + // } + // + // template int h(int); + // + // Full LLVM demangling of the lambda call operator: + // + // auto int f(int)::'lambda'($T...):: + // operator()($T...) const + ASSERT_TRUE(Demangle("_ZZ1fIiET_S0_ENKUlTpTyDpT_E_clIJiEEEDaS2_", + tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "f<>()::{lambda()#1}::operator()<>()"); +} + // Test corner cases of boundary conditions. TEST(Demangle, CornerCases) { char tmp[10]; @@ -276,6 +409,34 @@ TEST(Demangle, Clones) { EXPECT_FALSE(Demangle("_ZL3Foov.isra.2.constprop.", tmp, sizeof(tmp))); } +TEST(Demangle, LiteralOfGlobalNamespaceEnumType) { + char tmp[80]; + + // void f<(E)42>() + EXPECT_TRUE(Demangle("_Z1fIL1E42EEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); +} + +TEST(Demangle, NullptrLiterals) { + char tmp[80]; + + // void f() + EXPECT_TRUE(Demangle("_Z1fILDnEEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); + + // also void f() + EXPECT_TRUE(Demangle("_Z1fILDn0EEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); +} + +TEST(Demangle, StringLiterals) { + char tmp[80]; + + // void f<"">() + EXPECT_TRUE(Demangle("_Z1fILA42_KcEEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); +} + // Test the GNU abi_tag extension. TEST(Demangle, AbiTags) { char tmp[80]; @@ -300,6 +461,261 @@ TEST(Demangle, AbiTags) { EXPECT_STREQ("C[abi:bar][abi:foo]()", tmp); } +TEST(Demangle, ThisPointerInDependentSignature) { + char tmp[80]; + + // decltype(g(this)) S::f() + EXPECT_TRUE(Demangle("_ZN1S1fIiEEDTcl1gIT_EfpTEEv", tmp, sizeof(tmp))); + EXPECT_STREQ("S::f<>()", tmp); +} + +TEST(Demangle, DependentMemberOperatorCall) { + char tmp[80]; + + // decltype(fp.operator()()) f(C) + EXPECT_TRUE(Demangle("_Z1fI1CEDTcldtfp_onclEET_", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); +} + +TEST(Demangle, TypeNestedUnderDecltype) { + char tmp[80]; + + // Source: + // + // template struct S { using t = int; }; + // template decltype(S{})::t f() { return {}; } + // void g() { f(); } + // + // Full LLVM demangling of the instantiation of f: + // + // decltype(S{})::t f() + EXPECT_TRUE(Demangle("_Z1fIiENDTtl1SIT_EEE1tEv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); +} + +// Test subobject-address template parameters. +TEST(Demangle, SubobjectAddresses) { + char tmp[80]; + + // void f>() + EXPECT_TRUE(Demangle("_Z1fIXsoKcL_Z1aE123EEEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); + + // void f<&a.>() + EXPECT_TRUE(Demangle("_Z1fIXadsoKcL_Z1aEEEEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); + + // void f<&a.>() + EXPECT_TRUE(Demangle("_Z1fIXadsoKcL_Z1aE123EEEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); + + // void f<&a.>(), past the end this time + EXPECT_TRUE(Demangle("_Z1fIXadsoKcL_Z1aE123pEEEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); + + // void f<&a.>() with union-selectors + EXPECT_TRUE(Demangle("_Z1fIXadsoKcL_Z1aE__1_234EEEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); + + // void f<&a.>(), past the end, with union-selector + EXPECT_TRUE(Demangle("_Z1fIXadsoKcL_Z1aE123_456pEEEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); +} + +TEST(Demangle, UnaryFoldExpressions) { + char tmp[80]; + + // Source: + // + // template struct S {}; + // + // template auto f(T... t) -> S<((sizeof(T) == 4) || ...)> { + // return {}; + // } + // + // void g() { f(1, 2L); } + // + // Full LLVM demangling of the instantiation of f: + // + // S<((sizeof (int) == 4, sizeof (long) == 4) || ...)> f(int, long) + EXPECT_TRUE(Demangle("_Z1fIJilEE1SIXfrooeqstT_Li4EEEDpS1_", + tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); + + // The like with a left fold. + // + // S<(... || (sizeof (int) == 4, sizeof (long) == 4))> f(int, long) + EXPECT_TRUE(Demangle("_Z1fIJilEE1SIXflooeqstT_Li4EEEDpS1_", + tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); +} + +TEST(Demangle, BinaryFoldExpressions) { + char tmp[80]; + + // Source: + // + // template struct S {}; + // + // template auto f(T... t) + // -> S<((sizeof(T) == 4) || ... || false)> { + // return {}; + // } + // + // void g() { f(1, 2L); } + // + // Full LLVM demangling of the instantiation of f: + // + // S<((sizeof (int) == 4, sizeof (long) == 4) || ... || false)> + // f(int, long) + EXPECT_TRUE(Demangle("_Z1fIJilEE1SIXfRooeqstT_Li4ELb0EEEDpS1_", + tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); + + // The like with a left fold. + // + // S<(false || ... || (sizeof (int) == 4, sizeof (long) == 4))> + // f(int, long) + EXPECT_TRUE(Demangle("_Z1fIJilEE1SIXfLooLb0EeqstT_Li4EEEDpS1_", + tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); +} + +TEST(Demangle, SizeofPacks) { + char tmp[80]; + + // template struct S {}; + // + // template auto f(T... p) -> S { return {}; } + // template auto f(int, long) -> S<2>; + // + // template auto g(T... p) -> S { return {}; } + // template auto g(int, long) -> S<2>; + + // S f(int, long) + EXPECT_TRUE(Demangle("_Z1fIJilEE1SIXsZT_EEDpT_", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); + + // S g(int, long) + EXPECT_TRUE(Demangle("_Z1gIJilEE1SIXsZfp_EEDpT_", tmp, sizeof(tmp))); + EXPECT_STREQ("g<>()", tmp); +} + +TEST(Demangle, Spaceship) { + char tmp[80]; + + // #include + // + // struct S { auto operator<=>(const S&) const = default; }; + // auto (S::*f) = &S::operator<=>; // make sure S::operator<=> is emitted + // + // template auto g(T x, T y) -> decltype(x <=> y) { + // return x <=> y; + // } + // template auto g(S x, S y) -> decltype(x <=> y); + + // S::operator<=>(S const&) const + EXPECT_TRUE(Demangle("_ZNK1SssERKS_", tmp, sizeof(tmp))); + EXPECT_STREQ("S::operator<=>()", tmp); + + // decltype(fp <=> fp0) g(S, S) + EXPECT_TRUE(Demangle("_Z1gI1SEDTssfp_fp0_ET_S2_", tmp, sizeof(tmp))); + EXPECT_STREQ("g<>()", tmp); +} + +TEST(Demangle, VendorExtendedExpressions) { + char tmp[80]; + + // void f<__e()>() + EXPECT_TRUE(Demangle("_Z1fIXu3__eEEEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); + + // void f<__e(int, long)>() + EXPECT_TRUE(Demangle("_Z1fIXu3__eilEEEvv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); +} + +TEST(Demangle, DirectListInitialization) { + char tmp[80]; + + // template decltype(T{}) f() { return T{}; } + // template decltype(int{}) f(); + // + // struct XYZ { int x, y, z; }; + // template decltype(T{1, 2, 3}) g() { return T{1, 2, 3}; } + // template decltype(XYZ{1, 2, 3}) g(); + // + // template decltype(T{.x = 1, .y = 2, .z = 3}) h() { + // return T{.x = 1, .y = 2, .z = 3}; + // } + // template decltype(XYZ{.x = 1, .y = 2, .z = 3}) h(); + // + // // The following two cases require full C99 designated initializers, + // // not part of C++ but likely available as an extension if you ask your + // // compiler nicely. + // + // struct A { int a[4]; }; + // template decltype(T{.a[2] = 42}) i() { return T{.a[2] = 42}; } + // template decltype(A{.a[2] = 42}) i(); + // + // template decltype(T{.a[1 ... 3] = 42}) j() { + // return T{.a[1 ... 3] = 42}; + // } + // template decltype(A{.a[1 ... 3] = 42}) j(); + + // decltype(int{}) f() + EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_EEv", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); + + // decltype(XYZ{1, 2, 3}) g() + EXPECT_TRUE(Demangle("_Z1gI3XYZEDTtlT_Li1ELi2ELi3EEEv", tmp, sizeof(tmp))); + EXPECT_STREQ("g<>()", tmp); + + // decltype(XYZ{.x = 1, .y = 2, .z = 3}) h() + EXPECT_TRUE(Demangle("_Z1hI3XYZEDTtlT_di1xLi1Edi1yLi2Edi1zLi3EEEv", + tmp, sizeof(tmp))); + EXPECT_STREQ("h<>()", tmp); + + // decltype(A{.a[2] = 42}) i() + EXPECT_TRUE(Demangle("_Z1iI1AEDTtlT_di1adxLi2ELi42EEEv", tmp, sizeof(tmp))); + EXPECT_STREQ("i<>()", tmp); + + // decltype(A{.a[1 ... 3] = 42}) j() + EXPECT_TRUE(Demangle("_Z1jI1AEDTtlT_di1adXLi1ELi3ELi42EEEv", + tmp, sizeof(tmp))); + EXPECT_STREQ("j<>()", tmp); +} + +TEST(Demangle, ReferenceQualifiedFunctionTypes) { + char tmp[80]; + + // void f(void (*)() const &, int) + EXPECT_TRUE(Demangle("_Z1fPKFvvREi", tmp, sizeof(tmp))); + EXPECT_STREQ("f()", tmp); + + // void f(void (*)() &&, int) + EXPECT_TRUE(Demangle("_Z1fPFvvOEi", tmp, sizeof(tmp))); + EXPECT_STREQ("f()", tmp); + + // void f(void (*)(int&) &, int) + EXPECT_TRUE(Demangle("_Z1fPFvRiREi", tmp, sizeof(tmp))); + EXPECT_STREQ("f()", tmp); + + // void f(void (*)(S&&) &&, int) + EXPECT_TRUE(Demangle("_Z1fPFvO1SOEi", tmp, sizeof(tmp))); + EXPECT_STREQ("f()", tmp); +} + +TEST(Demangle, ThreadLocalWrappers) { + char tmp[80]; + + EXPECT_TRUE(Demangle("_ZTWN2ns3varE", tmp, sizeof(tmp))); + EXPECT_STREQ("thread-local wrapper routine for ns::var", tmp); + + EXPECT_TRUE(Demangle("_ZTHN2ns3varE", tmp, sizeof(tmp))); + EXPECT_STREQ("thread-local initialization routine for ns::var", tmp); +} + // Test one Rust symbol to exercise Demangle's delegation path. Rust demangling // itself is more thoroughly tested in demangle_rust_test.cc. TEST(Demangle, DelegatesToDemangleRustSymbolEncoding) { diff --git a/yass/third_party/abseil-cpp/absl/functional/CMakeLists.txt b/yass/third_party/abseil-cpp/absl/functional/CMakeLists.txt index 869170ff95..38fea8b859 100644 --- a/yass/third_party/abseil-cpp/absl/functional/CMakeLists.txt +++ b/yass/third_party/abseil-cpp/absl/functional/CMakeLists.txt @@ -129,7 +129,10 @@ absl_cc_test( COPTS ${ABSL_TEST_COPTS} DEPS - absl::variant + absl::config + absl::overload + absl::string_view absl::strings + absl::variant GTest::gmock_main ) diff --git a/yass/third_party/abseil-cpp/absl/functional/any_invocable.h b/yass/third_party/abseil-cpp/absl/functional/any_invocable.h index bc980731b4..3acb9fd089 100644 --- a/yass/third_party/abseil-cpp/absl/functional/any_invocable.h +++ b/yass/third_party/abseil-cpp/absl/functional/any_invocable.h @@ -34,6 +34,7 @@ #define ABSL_FUNCTIONAL_ANY_INVOCABLE_H_ #include +#include #include #include #include diff --git a/yass/third_party/abseil-cpp/absl/functional/internal/any_invocable.h b/yass/third_party/abseil-cpp/absl/functional/internal/any_invocable.h index ce58fd8cab..c2d8cd4727 100644 --- a/yass/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +++ b/yass/third_party/abseil-cpp/absl/functional/internal/any_invocable.h @@ -58,12 +58,12 @@ #include #include #include -#include #include #include #include #include +#include "absl/base/attributes.h" #include "absl/base/config.h" #include "absl/base/internal/invoke.h" #include "absl/base/macros.h" diff --git a/yass/third_party/abseil-cpp/absl/functional/overload.h b/yass/third_party/abseil-cpp/absl/functional/overload.h index 34ffa689a4..7e19e70503 100644 --- a/yass/third_party/abseil-cpp/absl/functional/overload.h +++ b/yass/third_party/abseil-cpp/absl/functional/overload.h @@ -62,7 +62,7 @@ struct Overload final : T... { // aggregate initialization. Before then we must provide a constructor that // makes this work. // - explicit Overload(T... ts) : T(std::move(ts))... {} + constexpr explicit Overload(T... ts) : T(std::move(ts))... {} }; // Before C++20, which added support for CTAD for aggregate types, we must also diff --git a/yass/third_party/abseil-cpp/absl/functional/overload_test.cc b/yass/third_party/abseil-cpp/absl/functional/overload_test.cc index a2e87674c6..fa49d298c2 100644 --- a/yass/third_party/abseil-cpp/absl/functional/overload_test.cc +++ b/yass/third_party/abseil-cpp/absl/functional/overload_test.cc @@ -32,12 +32,10 @@ namespace { TEST(OverloadTest, DispatchConsidersTypeWithAutoFallback) { auto overloaded = absl::Overload{ - [](int v) -> std::string { return absl::StrCat("int ", v); }, - [](double v) -> std::string { return absl::StrCat("double ", v); }, - [](const char* v) -> std::string { - return absl::StrCat("const char* ", v); - }, - [](auto v) -> std::string { return absl::StrCat("auto ", v); }, + [](int v) { return absl::StrCat("int ", v); }, + [](double v) { return absl::StrCat("double ", v); }, + [](const char* v) { return absl::StrCat("const char* ", v); }, + [](auto v) { return absl::StrCat("auto ", v); }, }; EXPECT_EQ("int 1", overloaded(1)); @@ -196,6 +194,20 @@ TEST(OverloadTest, UseWithParentheses) { EXPECT_EQ(5, absl::visit(overloaded, v)); } +TEST(OverloadTest, HasConstexprConstructor) { + constexpr auto overloaded = absl::Overload{ + [](int v) { return absl::StrCat("int ", v); }, + [](double v) { return absl::StrCat("double ", v); }, + [](const char* v) { return absl::StrCat("const char* ", v); }, + [](auto v) { return absl::StrCat("auto ", v); }, + }; + + EXPECT_EQ("int 1", overloaded(1)); + EXPECT_EQ("double 2.5", overloaded(2.5)); + EXPECT_EQ("const char* hello", overloaded("hello")); + EXPECT_EQ("auto 1.5", overloaded(1.5f)); +} + } // namespace #endif diff --git a/yass/third_party/abseil-cpp/absl/log/BUILD.bazel b/yass/third_party/abseil-cpp/absl/log/BUILD.bazel index dd192a10ad..b13cf4d4a7 100644 --- a/yass/third_party/abseil-cpp/absl/log/BUILD.bazel +++ b/yass/third_party/abseil-cpp/absl/log/BUILD.bazel @@ -357,6 +357,8 @@ cc_library( "//absl/base:core_headers", "//absl/log/internal:test_helpers", "//absl/status", + "//absl/strings", + "//absl/strings:string_view", "@com_google_googletest//:gtest", ], ) diff --git a/yass/third_party/abseil-cpp/absl/log/CMakeLists.txt b/yass/third_party/abseil-cpp/absl/log/CMakeLists.txt index 59aa19f3bd..43844651d1 100644 --- a/yass/third_party/abseil-cpp/absl/log/CMakeLists.txt +++ b/yass/third_party/abseil-cpp/absl/log/CMakeLists.txt @@ -789,6 +789,8 @@ absl_cc_test( absl::core_headers absl::log_internal_test_helpers absl::status + absl::strings + absl::string_view GTest::gmock_main ) @@ -832,6 +834,8 @@ absl_cc_test( absl::core_headers absl::log_internal_test_helpers absl::status + absl::strings + absl::string_view GTest::gmock_main ) diff --git a/yass/third_party/abseil-cpp/absl/log/check_test_impl.inc b/yass/third_party/abseil-cpp/absl/log/check_test_impl.inc index d5c0aee471..64318108e7 100644 --- a/yass/third_party/abseil-cpp/absl/log/check_test_impl.inc +++ b/yass/third_party/abseil-cpp/absl/log/check_test_impl.inc @@ -31,6 +31,8 @@ #include "absl/base/config.h" #include "absl/log/internal/test_helpers.h" #include "absl/status/status.h" +#include "absl/strings/string_view.h" +#include "absl/strings/substitute.h" // NOLINTBEGIN(misc-definitions-in-headers) @@ -521,6 +523,162 @@ TEST(CHECKDeathTest, TestUserDefinedStreaming) { "Check failed: v1 == v2 (ComparableType{1} vs. ComparableType{2})")); } +// A type that can be printed using AbslStringify. +struct StringifiableType { + int x = 0; + explicit StringifiableType(int x) : x(x) {} + friend bool operator==(const StringifiableType& lhs, + const StringifiableType& rhs) { + return lhs.x == rhs.x; + } + friend bool operator!=(const StringifiableType& lhs, + const StringifiableType& rhs) { + return lhs.x != rhs.x; + } + friend bool operator<(const StringifiableType& lhs, + const StringifiableType& rhs) { + return lhs.x < rhs.x; + } + friend bool operator>(const StringifiableType& lhs, + const StringifiableType& rhs) { + return lhs.x > rhs.x; + } + friend bool operator<=(const StringifiableType& lhs, + const StringifiableType& rhs) { + return lhs.x <= rhs.x; + } + friend bool operator>=(const StringifiableType& lhs, + const StringifiableType& rhs) { + return lhs.x >= rhs.x; + } + template + friend void AbslStringify(Sink& sink, const StringifiableType& obj) { + absl::Format(&sink, "StringifiableType{%d}", obj.x); + } + + // Make sure no unintended copy happens. + StringifiableType(const StringifiableType&) = delete; +}; + +TEST(CHECKTest, TestUserDefinedAbslStringify) { + const StringifiableType v1(1); + const StringifiableType v2(2); + + ABSL_TEST_CHECK_EQ(v1, v1); + ABSL_TEST_CHECK_NE(v1, v2); + ABSL_TEST_CHECK_LT(v1, v2); + ABSL_TEST_CHECK_LE(v1, v2); + ABSL_TEST_CHECK_GT(v2, v1); + ABSL_TEST_CHECK_GE(v2, v1); +} + +TEST(CHECKDeathTest, TestUserDefinedAbslStringify) { + const StringifiableType v1(1); + const StringifiableType v2(2); + + // Returns a matcher for the expected check failure message when comparing two + // values. + auto expected_output = [](int lhs, absl::string_view condition, int rhs) { + return HasSubstr( + absl::Substitute("Check failed: v$0 $1 v$2 (StringifiableType{$0} vs. " + "StringifiableType{$2})", + lhs, condition, rhs)); + }; + // Test comparisons where the check fails. + EXPECT_DEATH(ABSL_TEST_CHECK_EQ(v1, v2), expected_output(1, "==", 2)); + EXPECT_DEATH(ABSL_TEST_CHECK_NE(v1, v1), expected_output(1, "!=", 1)); + EXPECT_DEATH(ABSL_TEST_CHECK_LT(v2, v1), expected_output(2, "<", 1)); + EXPECT_DEATH(ABSL_TEST_CHECK_LE(v2, v1), expected_output(2, "<=", 1)); + EXPECT_DEATH(ABSL_TEST_CHECK_GT(v1, v2), expected_output(1, ">", 2)); + EXPECT_DEATH(ABSL_TEST_CHECK_GE(v1, v2), expected_output(1, ">=", 2)); +} + +// A type that can be printed using both AbslStringify and operator<<. +struct StringifiableStreamableType { + int x = 0; + explicit StringifiableStreamableType(int x) : x(x) {} + + friend bool operator==(const StringifiableStreamableType& lhs, + const StringifiableStreamableType& rhs) { + return lhs.x == rhs.x; + } + friend bool operator!=(const StringifiableStreamableType& lhs, + const StringifiableStreamableType& rhs) { + return lhs.x != rhs.x; + } + template + friend void AbslStringify(Sink& sink, + const StringifiableStreamableType& obj) { + absl::Format(&sink, "Strigified{%d}", obj.x); + } + friend std::ostream& operator<<(std::ostream& out, + const StringifiableStreamableType& obj) { + return out << "Streamed{" << obj.x << "}"; + } + + // Avoid unintentional copy. + StringifiableStreamableType(const StringifiableStreamableType&) = delete; +}; + +TEST(CHECKDeathTest, TestStreamingPreferredOverAbslStringify) { + StringifiableStreamableType v1(1); + StringifiableStreamableType v2(2); + + EXPECT_DEATH( + ABSL_TEST_CHECK_EQ(v1, v2), + HasSubstr("Check failed: v1 == v2 (Streamed{1} vs. Streamed{2})")); +} + +// A type whose pointer can be passed to AbslStringify. +struct PointerIsStringifiable {}; +template +void AbslStringify(Sink& sink, const PointerIsStringifiable* var) { + sink.Append("PointerIsStringifiable"); +} + +// Verifies that a pointer is printed as a number despite having AbslStringify +// defined. Users may implement AbslStringify that dereferences the pointer, and +// doing so as part of DCHECK would not be good. +TEST(CHECKDeathTest, TestPointerPrintedAsNumberDespiteAbslStringify) { + const auto* p = reinterpret_cast(0x1234); + +#ifdef _MSC_VER + EXPECT_DEATH( + ABSL_TEST_CHECK_EQ(p, nullptr), + HasSubstr("Check failed: p == nullptr (0000000000001234 vs. (null))")); +#else // _MSC_VER + EXPECT_DEATH(ABSL_TEST_CHECK_EQ(p, nullptr), + HasSubstr("Check failed: p == nullptr (0x1234 vs. (null))")); +#endif // _MSC_VER +} + +// An uncopyable object with operator<<. +struct Uncopyable { + int x; + explicit Uncopyable(int x) : x(x) {} + Uncopyable(const Uncopyable&) = delete; + friend bool operator==(const Uncopyable& lhs, const Uncopyable& rhs) { + return lhs.x == rhs.x; + } + friend bool operator!=(const Uncopyable& lhs, const Uncopyable& rhs) { + return lhs.x != rhs.x; + } + friend std::ostream& operator<<(std::ostream& os, const Uncopyable& obj) { + return os << "Uncopyable{" << obj.x << "}"; + } +}; + +// Test that an uncopyable object can be used. +// Will catch us if implementation has an unintended copy. +TEST(CHECKDeathTest, TestUncopyable) { + const Uncopyable v1(1); + const Uncopyable v2(2); + + EXPECT_DEATH( + ABSL_TEST_CHECK_EQ(v1, v2), + HasSubstr("Check failed: v1 == v2 (Uncopyable{1} vs. Uncopyable{2})")); +} + } // namespace absl_log_internal // NOLINTEND(misc-definitions-in-headers) diff --git a/yass/third_party/abseil-cpp/absl/log/internal/check_op.cc b/yass/third_party/abseil-cpp/absl/log/internal/check_op.cc index f4b67647a6..23c4a3b205 100644 --- a/yass/third_party/abseil-cpp/absl/log/internal/check_op.cc +++ b/yass/third_party/abseil-cpp/absl/log/internal/check_op.cc @@ -16,6 +16,10 @@ #include +#include + +#include "absl/strings/string_view.h" + #ifdef _MSC_VER #define strcasecmp _stricmp #else @@ -113,6 +117,22 @@ DEFINE_CHECK_STROP_IMPL(CHECK_STRCASEEQ, strcasecmp, true) DEFINE_CHECK_STROP_IMPL(CHECK_STRCASENE, strcasecmp, false) #undef DEFINE_CHECK_STROP_IMPL +namespace detect_specialization { + +StringifySink::StringifySink(std::ostream& os) : os_(os) {} + +void StringifySink::Append(absl::string_view text) { os_ << text; } + +void StringifySink::Append(size_t length, char ch) { + for (size_t i = 0; i < length; ++i) os_.put(ch); +} + +void AbslFormatFlush(StringifySink* sink, absl::string_view text) { + sink->Append(text); +} + +} // namespace detect_specialization + } // namespace log_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/yass/third_party/abseil-cpp/absl/log/internal/check_op.h b/yass/third_party/abseil-cpp/absl/log/internal/check_op.h index 0d24f4d157..215922079c 100644 --- a/yass/third_party/abseil-cpp/absl/log/internal/check_op.h +++ b/yass/third_party/abseil-cpp/absl/log/internal/check_op.h @@ -24,9 +24,11 @@ #include +#include #include #include #include +#include #include #include "absl/base/attributes.h" @@ -35,6 +37,8 @@ #include "absl/log/internal/nullguard.h" #include "absl/log/internal/nullstream.h" #include "absl/log/internal/strip.h" +#include "absl/strings/has_absl_stringify.h" +#include "absl/strings/string_view.h" // `ABSL_LOG_INTERNAL_STRIP_STRING_LITERAL` wraps string literals that // should be stripped when `ABSL_MIN_LOG_LEVEL` exceeds `kFatal`. @@ -287,6 +291,44 @@ decltype(detect_specialization::operator<<(std::declval(), std::declval())) Detect(char); +// A sink for AbslStringify which redirects everything to a std::ostream. +class StringifySink { + public: + explicit StringifySink(std::ostream& os ABSL_ATTRIBUTE_LIFETIME_BOUND); + + void Append(absl::string_view text); + void Append(size_t length, char ch); + friend void AbslFormatFlush(StringifySink* sink, absl::string_view text); + + private: + std::ostream& os_; +}; + +// Wraps a type implementing AbslStringify, and implements operator<<. +template +class StringifyToStreamWrapper { + public: + explicit StringifyToStreamWrapper(const T& v ABSL_ATTRIBUTE_LIFETIME_BOUND) + : v_(v) {} + + friend std::ostream& operator<<(std::ostream& os, + const StringifyToStreamWrapper& wrapper) { + StringifySink sink(os); + AbslStringify(sink, wrapper.v_); + return os; + } + + private: + const T& v_; +}; + +// This overload triggers when T implements AbslStringify. +// StringifyToStreamWrapper is used to allow MakeCheckOpString to use +// operator<<. +template +std::enable_if_t::value, + StringifyToStreamWrapper> +Detect(...); // Ellipsis has lowest preference when int passed. } // namespace detect_specialization template @@ -342,20 +384,20 @@ ABSL_LOG_INTERNAL_DEFINE_MAKE_CHECK_OP_STRING_EXTERN(const void*); // `(int, int)` override works around the issue that the compiler will not // instantiate the template version of the function on values of unnamed enum // type. -#define ABSL_LOG_INTERNAL_CHECK_OP_IMPL(name, op) \ - template \ - inline constexpr ::std::string* name##Impl(const T1& v1, const T2& v2, \ - const char* exprtext) { \ - using U1 = CheckOpStreamType; \ - using U2 = CheckOpStreamType; \ - return ABSL_PREDICT_TRUE(v1 op v2) \ - ? nullptr \ - : ABSL_LOG_INTERNAL_CHECK_OP_IMPL_RESULT(U1, U2, v1, v2, \ - exprtext); \ - } \ - inline constexpr ::std::string* name##Impl(int v1, int v2, \ - const char* exprtext) { \ - return name##Impl(v1, v2, exprtext); \ +#define ABSL_LOG_INTERNAL_CHECK_OP_IMPL(name, op) \ + template \ + inline constexpr ::std::string* name##Impl(const T1& v1, const T2& v2, \ + const char* exprtext) { \ + using U1 = CheckOpStreamType; \ + using U2 = CheckOpStreamType; \ + return ABSL_PREDICT_TRUE(v1 op v2) \ + ? nullptr \ + : ABSL_LOG_INTERNAL_CHECK_OP_IMPL_RESULT(U1, U2, U1(v1), \ + U2(v2), exprtext); \ + } \ + inline constexpr ::std::string* name##Impl(int v1, int v2, \ + const char* exprtext) { \ + return name##Impl(v1, v2, exprtext); \ } ABSL_LOG_INTERNAL_CHECK_OP_IMPL(Check_EQ, ==) diff --git a/yass/third_party/abseil-cpp/absl/random/BUILD.bazel b/yass/third_party/abseil-cpp/absl/random/BUILD.bazel index 9ae3bc8a06..f276cc08a1 100644 --- a/yass/third_party/abseil-cpp/absl/random/BUILD.bazel +++ b/yass/third_party/abseil-cpp/absl/random/BUILD.bazel @@ -140,9 +140,9 @@ cc_library( deps = [ ":distributions", ":mocking_bit_gen", - "//absl/meta:type_traits", + "//absl/base:config", "//absl/random/internal:mock_overload_set", - "@com_google_googletest//:gtest", + "//absl/random/internal:mock_validators", ], ) @@ -154,15 +154,13 @@ cc_library( ], linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ - ":distributions", ":random", + "//absl/base:config", + "//absl/base:core_headers", "//absl/base:fast_type_id", "//absl/container:flat_hash_map", "//absl/meta:type_traits", - "//absl/random/internal:distribution_caller", - "//absl/strings", - "//absl/types:span", - "//absl/types:variant", + "//absl/random/internal:mock_helpers", "//absl/utility", "@com_google_googletest//:gtest", ], @@ -223,6 +221,8 @@ cc_test( deps = [ ":distributions", ":random", + "//absl/meta:type_traits", + "//absl/numeric:int128", "//absl/random/internal:distribution_test_util", "@com_google_googletest//:gtest", "@com_google_googletest//:gtest_main", @@ -481,9 +481,11 @@ cc_test( "no_test_wasm", ], deps = [ + ":distributions", ":mock_distributions", ":mocking_bit_gen", ":random", + "//absl/numeric:int128", "@com_google_googletest//:gtest", "@com_google_googletest//:gtest_main", ], diff --git a/yass/third_party/abseil-cpp/absl/random/CMakeLists.txt b/yass/third_party/abseil-cpp/absl/random/CMakeLists.txt index d30b43fc83..af91d1a48e 100644 --- a/yass/third_party/abseil-cpp/absl/random/CMakeLists.txt +++ b/yass/third_party/abseil-cpp/absl/random/CMakeLists.txt @@ -77,6 +77,7 @@ absl_cc_library( LINKOPTS ${ABSL_DEFAULT_LINKOPTS} DEPS + absl::config absl::fast_type_id absl::optional ) @@ -92,6 +93,7 @@ absl_cc_library( LINKOPTS ${ABSL_DEFAULT_LINKOPTS} DEPS + absl::config absl::random_mocking_bit_gen absl::random_internal_mock_helpers TESTONLY @@ -108,17 +110,15 @@ absl_cc_library( LINKOPTS ${ABSL_DEFAULT_LINKOPTS} DEPS + absl::config + absl::core_headers absl::flat_hash_map absl::raw_logging_internal - absl::random_distributions - absl::random_internal_distribution_caller + absl::random_internal_mock_helpers absl::random_internal_mock_overload_set + absl::random_internal_mock_validators absl::random_random - absl::strings - absl::span - absl::type_traits absl::utility - absl::variant GTest::gmock GTest::gtest PUBLIC @@ -135,6 +135,7 @@ absl_cc_test( LINKOPTS ${ABSL_DEFAULT_LINKOPTS} DEPS + absl::random_distributions absl::random_mocking_bit_gen absl::random_random GTest::gmock @@ -287,6 +288,8 @@ absl_cc_test( DEPS absl::random_distributions absl::random_random + absl::type_traits + absl::int128 absl::random_internal_distribution_test_util GTest::gmock GTest::gtest_main @@ -1172,6 +1175,26 @@ absl_cc_library( absl::type_traits ) +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + random_internal_mock_validators + HDRS + "internal/mock_validators.h" + COPTS + ${ABSL_DEFAULT_COPTS} + LINKOPTS + ${ABSL_DEFAULT_LINKOPTS} + DEPS + absl::random_internal_iostream_state_saver + absl::random_internal_uniform_helper + absl::config + absl::raw_logging_internal + absl::strings + absl::string_view + TESTONLY +) + # Internal-only target, do not depend on directly. absl_cc_test( NAME @@ -1185,6 +1208,7 @@ absl_cc_test( DEPS absl::random_internal_uniform_helper GTest::gtest_main + absl::int128 ) # Internal-only target, do not depend on directly. diff --git a/yass/third_party/abseil-cpp/absl/random/beta_distribution.h b/yass/third_party/abseil-cpp/absl/random/beta_distribution.h index c154066fb8..432c51612a 100644 --- a/yass/third_party/abseil-cpp/absl/random/beta_distribution.h +++ b/yass/third_party/abseil-cpp/absl/random/beta_distribution.h @@ -181,18 +181,18 @@ class beta_distribution { result_type alpha_; result_type beta_; - result_type a_; // the smaller of {alpha, beta}, or 1.0/alpha_ in JOEHNK - result_type b_; // the larger of {alpha, beta}, or 1.0/beta_ in JOEHNK - result_type x_; // alpha + beta, or the result in degenerate cases - result_type log_x_; // log(x_) - result_type y_; // "beta" in Cheng - result_type gamma_; // "gamma" in Cheng + result_type a_{}; // the smaller of {alpha, beta}, or 1.0/alpha_ in JOEHNK + result_type b_{}; // the larger of {alpha, beta}, or 1.0/beta_ in JOEHNK + result_type x_{}; // alpha + beta, or the result in degenerate cases + result_type log_x_{}; // log(x_) + result_type y_{}; // "beta" in Cheng + result_type gamma_{}; // "gamma" in Cheng - Method method_; + Method method_{}; // Placing this last for optimal alignment. // Whether alpha_ != a_, i.e. true iff alpha_ > beta_. - bool inverted_; + bool inverted_{}; static_assert(std::is_floating_point::value, "Class-template absl::beta_distribution<> must be " diff --git a/yass/third_party/abseil-cpp/absl/random/distributions.h b/yass/third_party/abseil-cpp/absl/random/distributions.h index d62f7f3b96..b6ade685d4 100644 --- a/yass/third_party/abseil-cpp/absl/random/distributions.h +++ b/yass/third_party/abseil-cpp/absl/random/distributions.h @@ -46,23 +46,23 @@ #ifndef ABSL_RANDOM_DISTRIBUTIONS_H_ #define ABSL_RANDOM_DISTRIBUTIONS_H_ -#include -#include #include -#include #include +#include "absl/base/config.h" #include "absl/base/internal/inline_variable.h" +#include "absl/meta/type_traits.h" #include "absl/random/bernoulli_distribution.h" #include "absl/random/beta_distribution.h" #include "absl/random/exponential_distribution.h" #include "absl/random/gaussian_distribution.h" #include "absl/random/internal/distribution_caller.h" // IWYU pragma: export +#include "absl/random/internal/traits.h" #include "absl/random/internal/uniform_helper.h" // IWYU pragma: export #include "absl/random/log_uniform_int_distribution.h" #include "absl/random/poisson_distribution.h" -#include "absl/random/uniform_int_distribution.h" -#include "absl/random/uniform_real_distribution.h" +#include "absl/random/uniform_int_distribution.h" // IWYU pragma: export +#include "absl/random/uniform_real_distribution.h" // IWYU pragma: export #include "absl/random/zipf_distribution.h" namespace absl { @@ -176,7 +176,7 @@ Uniform(TagType tag, return random_internal::DistributionCaller::template Call< distribution_t>(&urbg, tag, static_cast(lo), - static_cast(hi)); + static_cast(hi)); } // absl::Uniform(bitgen, lo, hi) @@ -200,7 +200,7 @@ Uniform(URBG&& urbg, // NOLINT(runtime/references) return random_internal::DistributionCaller::template Call< distribution_t>(&urbg, static_cast(lo), - static_cast(hi)); + static_cast(hi)); } // absl::Uniform(bitgen) @@ -208,7 +208,7 @@ Uniform(URBG&& urbg, // NOLINT(runtime/references) // Overload of Uniform() using the minimum and maximum values of a given type // `T` (which must be unsigned), returning a value of type `unsigned T` template -typename absl::enable_if_t::value, R> // +typename absl::enable_if_t::is_signed, R> // Uniform(URBG&& urbg) { // NOLINT(runtime/references) using gen_t = absl::decay_t; using distribution_t = random_internal::UniformDistributionWrapper; diff --git a/yass/third_party/abseil-cpp/absl/random/distributions_test.cc b/yass/third_party/abseil-cpp/absl/random/distributions_test.cc index 5321a11c85..ea32183944 100644 --- a/yass/third_party/abseil-cpp/absl/random/distributions_test.cc +++ b/yass/third_party/abseil-cpp/absl/random/distributions_test.cc @@ -17,10 +17,14 @@ #include #include #include -#include +#include +#include +#include #include #include "gtest/gtest.h" +#include "absl/meta/type_traits.h" +#include "absl/numeric/int128.h" #include "absl/random/internal/distribution_test_util.h" #include "absl/random/random.h" @@ -30,7 +34,6 @@ constexpr int kSize = 400000; class RandomDistributionsTest : public testing::Test {}; - struct Invalid {}; template @@ -93,17 +96,18 @@ void CheckArgsInferType() { } template -auto ExplicitUniformReturnT(int) -> decltype( - absl::Uniform(*std::declval(), - std::declval(), std::declval())); +auto ExplicitUniformReturnT(int) -> decltype(absl::Uniform( + std::declval(), + std::declval(), std::declval())); template Invalid ExplicitUniformReturnT(...); template -auto ExplicitTaggedUniformReturnT(int) -> decltype(absl::Uniform( - std::declval(), *std::declval(), - std::declval(), std::declval())); +auto ExplicitTaggedUniformReturnT(int) + -> decltype(absl::Uniform( + std::declval(), std::declval(), + std::declval(), std::declval())); template Invalid ExplicitTaggedUniformReturnT(...); @@ -135,6 +139,14 @@ void CheckArgsReturnExpectedType() { ""); } +// Takes the type of `absl::Uniform(gen)` if valid or `Invalid` otherwise. +template +auto UniformNoBoundsReturnT(int) + -> decltype(absl::Uniform(std::declval())); + +template +Invalid UniformNoBoundsReturnT(...); + TEST_F(RandomDistributionsTest, UniformTypeInference) { // Infers common types. CheckArgsInferType(); @@ -221,6 +233,38 @@ TEST_F(RandomDistributionsTest, UniformNoBounds) { absl::Uniform(gen); absl::Uniform(gen); absl::Uniform(gen); + + // Compile-time validity tests. + + // Allows unsigned ints. + testing::StaticAssertTypeEq(0))>(); + testing::StaticAssertTypeEq(0))>(); + testing::StaticAssertTypeEq(0))>(); + testing::StaticAssertTypeEq(0))>(); + testing::StaticAssertTypeEq< + absl::uint128, decltype(UniformNoBoundsReturnT(0))>(); + + // Disallows signed ints. + testing::StaticAssertTypeEq(0))>(); + testing::StaticAssertTypeEq(0))>(); + testing::StaticAssertTypeEq(0))>(); + testing::StaticAssertTypeEq(0))>(); + testing::StaticAssertTypeEq< + Invalid, decltype(UniformNoBoundsReturnT(0))>(); + + // Disallows float types. + testing::StaticAssertTypeEq(0))>(); + testing::StaticAssertTypeEq(0))>(); } TEST_F(RandomDistributionsTest, UniformNonsenseRanges) { diff --git a/yass/third_party/abseil-cpp/absl/random/internal/BUILD.bazel b/yass/third_party/abseil-cpp/absl/random/internal/BUILD.bazel index 69fb5f2b4b..5e05130de8 100644 --- a/yass/third_party/abseil-cpp/absl/random/internal/BUILD.bazel +++ b/yass/third_party/abseil-cpp/absl/random/internal/BUILD.bazel @@ -527,6 +527,7 @@ cc_library( hdrs = ["mock_helpers.h"], linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ + "//absl/base:config", "//absl/base:fast_type_id", "//absl/types:optional", ], @@ -539,6 +540,7 @@ cc_library( linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":mock_helpers", + "//absl/base:config", "//absl/random:mocking_bit_gen", "@com_google_googletest//:gtest", ], @@ -712,7 +714,19 @@ cc_library( ":traits", "//absl/base:config", "//absl/meta:type_traits", - "//absl/numeric:int128", + ], +) + +cc_library( + name = "mock_validators", + hdrs = ["mock_validators.h"], + deps = [ + ":iostream_state_saver", + ":uniform_helper", + "//absl/base:config", + "//absl/base:raw_logging_internal", + "//absl/strings", + "//absl/strings:string_view", ], ) diff --git a/yass/third_party/abseil-cpp/absl/random/internal/mock_helpers.h b/yass/third_party/abseil-cpp/absl/random/internal/mock_helpers.h index a7a97bfc39..19d05612ee 100644 --- a/yass/third_party/abseil-cpp/absl/random/internal/mock_helpers.h +++ b/yass/third_party/abseil-cpp/absl/random/internal/mock_helpers.h @@ -16,10 +16,9 @@ #ifndef ABSL_RANDOM_INTERNAL_MOCK_HELPERS_H_ #define ABSL_RANDOM_INTERNAL_MOCK_HELPERS_H_ -#include -#include #include +#include "absl/base/config.h" #include "absl/base/internal/fast_type_id.h" #include "absl/types/optional.h" @@ -27,6 +26,16 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace random_internal { +// A no-op validator meeting the ValidatorT requirements for MockHelpers. +// +// Custom validators should follow a similar structure, passing the type to +// MockHelpers::MockFor(m, CustomValidatorT()). +struct NoOpValidator { + // Default validation: do nothing. + template + static void Validate(ResultT, Args&&...) {} +}; + // MockHelpers works in conjunction with MockOverloadSet, MockingBitGen, and // BitGenRef to enable the mocking capability for absl distribution functions. // @@ -109,6 +118,29 @@ class MockHelpers { 0, urbg, std::forward(args)...); } + // Acquire a mock for the KeyT (may or may not be a signature), set up to use + // the ValidatorT to verify that the result is in the range of the RNG + // function. + // + // KeyT is used to generate a typeid-based lookup for the mock. + // KeyT is a signature of the form: + // result_type(discriminator_type, std::tuple) + // The mocked function signature will be composed from KeyT as: + // result_type(args...) + // ValidatorT::Validate will be called after the result of the RNG. The + // signature is expected to be of the form: + // ValidatorT::Validate(result, args...) + template + static auto MockFor(MockURBG& m, ValidatorT) + -> decltype(m.template RegisterMock< + typename KeySignature::result_type, + typename KeySignature::arg_tuple_type>( + m, std::declval(), ValidatorT())) { + return m.template RegisterMock::result_type, + typename KeySignature::arg_tuple_type>( + m, ::absl::base_internal::FastTypeId(), ValidatorT()); + } + // Acquire a mock for the KeyT (may or may not be a signature). // // KeyT is used to generate a typeid-based lookup for the mock. @@ -117,14 +149,8 @@ class MockHelpers { // The mocked function signature will be composed from KeyT as: // result_type(args...) template - static auto MockFor(MockURBG& m) - -> decltype(m.template RegisterMock< - typename KeySignature::result_type, - typename KeySignature::arg_tuple_type>( - m, std::declval())) { - return m.template RegisterMock::result_type, - typename KeySignature::arg_tuple_type>( - m, ::absl::base_internal::FastTypeId()); + static decltype(auto) MockFor(MockURBG& m) { + return MockFor(m, NoOpValidator()); } }; diff --git a/yass/third_party/abseil-cpp/absl/random/internal/mock_overload_set.h b/yass/third_party/abseil-cpp/absl/random/internal/mock_overload_set.h index 0d9c6c120c..cfaeeeef1a 100644 --- a/yass/third_party/abseil-cpp/absl/random/internal/mock_overload_set.h +++ b/yass/third_party/abseil-cpp/absl/random/internal/mock_overload_set.h @@ -16,9 +16,11 @@ #ifndef ABSL_RANDOM_INTERNAL_MOCK_OVERLOAD_SET_H_ #define ABSL_RANDOM_INTERNAL_MOCK_OVERLOAD_SET_H_ +#include #include #include "gmock/gmock.h" +#include "absl/base/config.h" #include "absl/random/internal/mock_helpers.h" #include "absl/random/mocking_bit_gen.h" @@ -26,7 +28,7 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace random_internal { -template +template struct MockSingleOverload; // MockSingleOverload @@ -38,8 +40,8 @@ struct MockSingleOverload; // arguments to MockingBitGen::Register. // // The underlying KeyT must match the KeyT constructed by DistributionCaller. -template -struct MockSingleOverload { +template +struct MockSingleOverload { static_assert(std::is_same::value, "Overload signature must have return type matching the " "distribution result_type."); @@ -47,15 +49,21 @@ struct MockSingleOverload { template auto gmock_Call(MockURBG& gen, const ::testing::Matcher&... matchers) - -> decltype(MockHelpers::MockFor(gen).gmock_Call(matchers...)) { - static_assert(std::is_base_of::value, - "Mocking requires an absl::MockingBitGen"); - return MockHelpers::MockFor(gen).gmock_Call(matchers...); + -> decltype(MockHelpers::MockFor(gen, ValidatorT()) + .gmock_Call(matchers...)) { + static_assert( + std::is_base_of, MockURBG>::value || + std::is_base_of, MockURBG>::value, + "Mocking requires an absl::MockingBitGen"); + return MockHelpers::MockFor(gen, ValidatorT()) + .gmock_Call(matchers...); } }; -template -struct MockSingleOverload { +template +struct MockSingleOverload { static_assert(std::is_same::value, "Overload signature must have return type matching the " "distribution result_type."); @@ -64,14 +72,44 @@ struct MockSingleOverload { template auto gmock_Call(const ::testing::Matcher& matcher, MockURBG& gen, const ::testing::Matcher&... matchers) - -> decltype(MockHelpers::MockFor(gen).gmock_Call(matcher, - matchers...)) { - static_assert(std::is_base_of::value, - "Mocking requires an absl::MockingBitGen"); - return MockHelpers::MockFor(gen).gmock_Call(matcher, matchers...); + -> decltype(MockHelpers::MockFor(gen, ValidatorT()) + .gmock_Call(matcher, matchers...)) { + static_assert( + std::is_base_of, MockURBG>::value || + std::is_base_of, MockURBG>::value, + "Mocking requires an absl::MockingBitGen"); + return MockHelpers::MockFor(gen, ValidatorT()) + .gmock_Call(matcher, matchers...); } }; +// MockOverloadSetWithValidator +// +// MockOverloadSetWithValidator is a wrapper around MockOverloadSet which takes +// an additional Validator parameter, allowing for customization of the mock +// behavior. +// +// `ValidatorT::Validate(result, args...)` will be called after the mock +// distribution returns a value in `result`, allowing for validation against the +// args. +template +struct MockOverloadSetWithValidator; + +template +struct MockOverloadSetWithValidator + : public MockSingleOverload { + using MockSingleOverload::gmock_Call; +}; + +template +struct MockOverloadSetWithValidator + : public MockSingleOverload, + public MockOverloadSetWithValidator { + using MockSingleOverload::gmock_Call; + using MockOverloadSetWithValidator::gmock_Call; +}; + // MockOverloadSet // // MockOverloadSet takes a distribution and a collection of signatures and @@ -79,20 +117,8 @@ struct MockSingleOverload { // `EXPECT_CALL(mock_overload_set, Call(...))` expand and do overload resolution // correctly. template -struct MockOverloadSet; - -template -struct MockOverloadSet : public MockSingleOverload { - using MockSingleOverload::gmock_Call; -}; - -template -struct MockOverloadSet - : public MockSingleOverload, - public MockOverloadSet { - using MockSingleOverload::gmock_Call; - using MockOverloadSet::gmock_Call; -}; +using MockOverloadSet = + MockOverloadSetWithValidator; } // namespace random_internal ABSL_NAMESPACE_END diff --git a/yass/third_party/abseil-cpp/absl/random/internal/mock_validators.h b/yass/third_party/abseil-cpp/absl/random/internal/mock_validators.h new file mode 100644 index 0000000000..d76d169c25 --- /dev/null +++ b/yass/third_party/abseil-cpp/absl/random/internal/mock_validators.h @@ -0,0 +1,98 @@ +// Copyright 2024 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_RANDOM_INTERNAL_MOCK_VALIDATORS_H_ +#define ABSL_RANDOM_INTERNAL_MOCK_VALIDATORS_H_ + +#include + +#include "absl/base/config.h" +#include "absl/base/internal/raw_logging.h" +#include "absl/random/internal/iostream_state_saver.h" +#include "absl/random/internal/uniform_helper.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace random_internal { + +template +class UniformDistributionValidator { + public: + // Handle absl::Uniform(gen, absl::IntervalTag, lo, hi). + template + static void Validate(NumType x, TagType tag, NumType lo, NumType hi) { + // For invalid ranges, absl::Uniform() simply returns one of the bounds. + if (x == lo && lo == hi) return; + + ValidateImpl(std::is_floating_point{}, x, tag, lo, hi); + } + + // Handle absl::Uniform(gen, lo, hi). + static void Validate(NumType x, NumType lo, NumType hi) { + Validate(x, IntervalClosedOpenTag(), lo, hi); + } + + // Handle absl::Uniform(gen). + static void Validate(NumType) { + // absl::Uniform(gen) spans the entire range of `NumType`, so any + // value is okay. This overload exists because the validation logic attempts + // to call it anyway rather than adding extra SFINAE. + } + + private: + static absl::string_view TagLbBound(IntervalClosedOpenTag) { return "["; } + static absl::string_view TagLbBound(IntervalOpenOpenTag) { return "("; } + static absl::string_view TagLbBound(IntervalClosedClosedTag) { return "["; } + static absl::string_view TagLbBound(IntervalOpenClosedTag) { return "("; } + static absl::string_view TagUbBound(IntervalClosedOpenTag) { return ")"; } + static absl::string_view TagUbBound(IntervalOpenOpenTag) { return ")"; } + static absl::string_view TagUbBound(IntervalClosedClosedTag) { return "]"; } + static absl::string_view TagUbBound(IntervalOpenClosedTag) { return "]"; } + + template + static void ValidateImpl(std::true_type /* is_floating_point */, NumType x, + TagType tag, NumType lo, NumType hi) { + UniformDistributionWrapper dist(tag, lo, hi); + NumType lb = dist.a(); + NumType ub = dist.b(); + // uniform_real_distribution is always closed-open, so the upper bound is + // always non-inclusive. + ABSL_INTERNAL_CHECK(lb <= x && x < ub, + absl::StrCat(x, " is not in ", TagLbBound(tag), lo, + ", ", hi, TagUbBound(tag))); + } + + template + static void ValidateImpl(std::false_type /* is_floating_point */, NumType x, + TagType tag, NumType lo, NumType hi) { + using stream_type = + typename random_internal::stream_format_type::type; + + UniformDistributionWrapper dist(tag, lo, hi); + NumType lb = dist.a(); + NumType ub = dist.b(); + ABSL_INTERNAL_CHECK( + lb <= x && x <= ub, + absl::StrCat(stream_type{x}, " is not in ", TagLbBound(tag), + stream_type{lo}, ", ", stream_type{hi}, TagUbBound(tag))); + } +}; + +} // namespace random_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_RANDOM_INTERNAL_MOCK_VALIDATORS_H_ diff --git a/yass/third_party/abseil-cpp/absl/random/mock_distributions.h b/yass/third_party/abseil-cpp/absl/random/mock_distributions.h index 764ab370ab..b379262cb6 100644 --- a/yass/third_party/abseil-cpp/absl/random/mock_distributions.h +++ b/yass/third_party/abseil-cpp/absl/random/mock_distributions.h @@ -46,16 +46,18 @@ #ifndef ABSL_RANDOM_MOCK_DISTRIBUTIONS_H_ #define ABSL_RANDOM_MOCK_DISTRIBUTIONS_H_ -#include -#include -#include - -#include "gmock/gmock.h" -#include "gtest/gtest.h" -#include "absl/meta/type_traits.h" +#include "absl/base/config.h" +#include "absl/random/bernoulli_distribution.h" +#include "absl/random/beta_distribution.h" #include "absl/random/distributions.h" +#include "absl/random/exponential_distribution.h" +#include "absl/random/gaussian_distribution.h" #include "absl/random/internal/mock_overload_set.h" +#include "absl/random/internal/mock_validators.h" +#include "absl/random/log_uniform_int_distribution.h" #include "absl/random/mocking_bit_gen.h" +#include "absl/random/poisson_distribution.h" +#include "absl/random/zipf_distribution.h" namespace absl { ABSL_NAMESPACE_BEGIN @@ -80,8 +82,9 @@ ABSL_NAMESPACE_BEGIN // assert(x == 123456) // template -using MockUniform = random_internal::MockOverloadSet< +using MockUniform = random_internal::MockOverloadSetWithValidator< random_internal::UniformDistributionWrapper, + random_internal::UniformDistributionValidator, R(IntervalClosedOpenTag, MockingBitGen&, R, R), R(IntervalClosedClosedTag, MockingBitGen&, R, R), R(IntervalOpenOpenTag, MockingBitGen&, R, R), diff --git a/yass/third_party/abseil-cpp/absl/random/mock_distributions_test.cc b/yass/third_party/abseil-cpp/absl/random/mock_distributions_test.cc index de23bafe1e..80df871474 100644 --- a/yass/third_party/abseil-cpp/absl/random/mock_distributions_test.cc +++ b/yass/third_party/abseil-cpp/absl/random/mock_distributions_test.cc @@ -14,7 +14,13 @@ #include "absl/random/mock_distributions.h" +#include +#include + +#include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/numeric/int128.h" +#include "absl/random/distributions.h" #include "absl/random/mocking_bit_gen.h" #include "absl/random/random.h" @@ -69,4 +75,213 @@ TEST(MockDistributions, Examples) { EXPECT_EQ(absl::LogUniform(gen, 0, 1000000, 2), 2040); } +TEST(MockUniform, OutOfBoundsIsAllowed) { + absl::MockingBitGen gen; + + EXPECT_CALL(absl::MockUniform(), Call(gen, 1, 100)).WillOnce(Return(0)); + EXPECT_EQ(absl::Uniform(gen, 1, 100), 0); +} + +TEST(ValidatedMockDistributions, UniformUInt128Works) { + absl::random_internal::MockingBitGenImpl gen; + + EXPECT_CALL(absl::MockUniform(), Call(gen)) + .WillOnce(Return(absl::Uint128Max())); + EXPECT_EQ(absl::Uniform(gen), absl::Uint128Max()); +} + +TEST(ValidatedMockDistributions, UniformDoubleBoundaryCases) { + absl::random_internal::MockingBitGenImpl gen; + + EXPECT_CALL(absl::MockUniform(), Call(gen, 1.0, 10.0)) + .WillOnce(Return( + std::nextafter(10.0, -std::numeric_limits::infinity()))); + EXPECT_EQ(absl::Uniform(gen, 1.0, 10.0), + std::nextafter(10.0, -std::numeric_limits::infinity())); + + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalOpen, gen, 1.0, 10.0)) + .WillOnce(Return( + std::nextafter(10.0, -std::numeric_limits::infinity()))); + EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1.0, 10.0), + std::nextafter(10.0, -std::numeric_limits::infinity())); + + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalOpen, gen, 1.0, 10.0)) + .WillOnce( + Return(std::nextafter(1.0, std::numeric_limits::infinity()))); + EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1.0, 10.0), + std::nextafter(1.0, std::numeric_limits::infinity())); +} + +TEST(ValidatedMockDistributions, UniformDoubleEmptyRangeCases) { + absl::random_internal::MockingBitGenImpl gen; + + ON_CALL(absl::MockUniform(), Call(absl::IntervalOpen, gen, 1.0, 1.0)) + .WillByDefault(Return(1.0)); + EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1.0, 1.0), 1.0); + + ON_CALL(absl::MockUniform(), + Call(absl::IntervalOpenClosed, gen, 1.0, 1.0)) + .WillByDefault(Return(1.0)); + EXPECT_EQ(absl::Uniform(absl::IntervalOpenClosed, gen, 1.0, 1.0), + 1.0); + + ON_CALL(absl::MockUniform(), + Call(absl::IntervalClosedOpen, gen, 1.0, 1.0)) + .WillByDefault(Return(1.0)); + EXPECT_EQ(absl::Uniform(absl::IntervalClosedOpen, gen, 1.0, 1.0), + 1.0); +} + +TEST(ValidatedMockDistributions, UniformIntEmptyRangeCases) { + absl::random_internal::MockingBitGenImpl gen; + + ON_CALL(absl::MockUniform(), Call(absl::IntervalOpen, gen, 1, 1)) + .WillByDefault(Return(1)); + EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1, 1), 1); + + ON_CALL(absl::MockUniform(), Call(absl::IntervalOpenClosed, gen, 1, 1)) + .WillByDefault(Return(1)); + EXPECT_EQ(absl::Uniform(absl::IntervalOpenClosed, gen, 1, 1), 1); + + ON_CALL(absl::MockUniform(), Call(absl::IntervalClosedOpen, gen, 1, 1)) + .WillByDefault(Return(1)); + EXPECT_EQ(absl::Uniform(absl::IntervalClosedOpen, gen, 1, 1), 1); +} + +TEST(ValidatedMockUniformDeathTest, Examples) { + absl::random_internal::MockingBitGenImpl gen; + + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), Call(gen, 1, 100)) + .WillOnce(Return(0)); + absl::Uniform(gen, 1, 100); + }, + " 0 is not in \\[1, 100\\)"); + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), Call(gen, 1, 100)) + .WillOnce(Return(101)); + absl::Uniform(gen, 1, 100); + }, + " 101 is not in \\[1, 100\\)"); + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), Call(gen, 1, 100)) + .WillOnce(Return(100)); + absl::Uniform(gen, 1, 100); + }, + " 100 is not in \\[1, 100\\)"); + + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalOpen, gen, 1, 100)) + .WillOnce(Return(1)); + absl::Uniform(absl::IntervalOpen, gen, 1, 100); + }, + " 1 is not in \\(1, 100\\)"); + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalOpen, gen, 1, 100)) + .WillOnce(Return(101)); + absl::Uniform(absl::IntervalOpen, gen, 1, 100); + }, + " 101 is not in \\(1, 100\\)"); + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalOpen, gen, 1, 100)) + .WillOnce(Return(100)); + absl::Uniform(absl::IntervalOpen, gen, 1, 100); + }, + " 100 is not in \\(1, 100\\)"); + + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalOpenClosed, gen, 1, 100)) + .WillOnce(Return(1)); + absl::Uniform(absl::IntervalOpenClosed, gen, 1, 100); + }, + " 1 is not in \\(1, 100\\]"); + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalOpenClosed, gen, 1, 100)) + .WillOnce(Return(101)); + absl::Uniform(absl::IntervalOpenClosed, gen, 1, 100); + }, + " 101 is not in \\(1, 100\\]"); + + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalOpenClosed, gen, 1, 100)) + .WillOnce(Return(0)); + absl::Uniform(absl::IntervalOpenClosed, gen, 1, 100); + }, + " 0 is not in \\(1, 100\\]"); + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalOpenClosed, gen, 1, 100)) + .WillOnce(Return(101)); + absl::Uniform(absl::IntervalOpenClosed, gen, 1, 100); + }, + " 101 is not in \\(1, 100\\]"); + + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalClosed, gen, 1, 100)) + .WillOnce(Return(0)); + absl::Uniform(absl::IntervalClosed, gen, 1, 100); + }, + " 0 is not in \\[1, 100\\]"); + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalClosed, gen, 1, 100)) + .WillOnce(Return(101)); + absl::Uniform(absl::IntervalClosed, gen, 1, 100); + }, + " 101 is not in \\[1, 100\\]"); +} + +TEST(ValidatedMockUniformDeathTest, DoubleBoundaryCases) { + absl::random_internal::MockingBitGenImpl gen; + + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), Call(gen, 1.0, 10.0)) + .WillOnce(Return(10.0)); + EXPECT_EQ(absl::Uniform(gen, 1.0, 10.0), 10.0); + }, + " 10 is not in \\[1, 10\\)"); + + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalOpen, gen, 1.0, 10.0)) + .WillOnce(Return(10.0)); + EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1.0, 10.0), + 10.0); + }, + " 10 is not in \\(1, 10\\)"); + + EXPECT_DEATH_IF_SUPPORTED( + { + EXPECT_CALL(absl::MockUniform(), + Call(absl::IntervalOpen, gen, 1.0, 10.0)) + .WillOnce(Return(1.0)); + EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1.0, 10.0), + 1.0); + }, + " 1 is not in \\(1, 10\\)"); +} + } // namespace diff --git a/yass/third_party/abseil-cpp/absl/random/mocking_bit_gen.h b/yass/third_party/abseil-cpp/absl/random/mocking_bit_gen.h index 89fa5a47a6..92f2e4fc7f 100644 --- a/yass/third_party/abseil-cpp/absl/random/mocking_bit_gen.h +++ b/yass/third_party/abseil-cpp/absl/random/mocking_bit_gen.h @@ -28,37 +28,175 @@ #ifndef ABSL_RANDOM_MOCKING_BIT_GEN_H_ #define ABSL_RANDOM_MOCKING_BIT_GEN_H_ -#include -#include #include #include #include #include #include "gmock/gmock.h" -#include "gtest/gtest.h" +#include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/internal/fast_type_id.h" #include "absl/container/flat_hash_map.h" #include "absl/meta/type_traits.h" -#include "absl/random/distributions.h" -#include "absl/random/internal/distribution_caller.h" +#include "absl/random/internal/mock_helpers.h" #include "absl/random/random.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/str_join.h" -#include "absl/types/span.h" -#include "absl/types/variant.h" #include "absl/utility/utility.h" namespace absl { ABSL_NAMESPACE_BEGIN +class BitGenRef; + namespace random_internal { template struct DistributionCaller; class MockHelpers; +// Implements MockingBitGen with an option to turn on extra validation. +template +class MockingBitGenImpl { + public: + MockingBitGenImpl() = default; + ~MockingBitGenImpl() = default; + + // URBG interface + using result_type = absl::BitGen::result_type; + + static constexpr result_type(min)() { return (absl::BitGen::min)(); } + static constexpr result_type(max)() { return (absl::BitGen::max)(); } + result_type operator()() { return gen_(); } + + private: + // GetMockFnType returns the testing::MockFunction for a result and tuple. + // This method only exists for type deduction and is otherwise unimplemented. + template + static auto GetMockFnType(ResultT, std::tuple) + -> ::testing::MockFunction; + + // MockFnCaller is a helper method for use with absl::apply to + // apply an ArgTupleT to a compatible MockFunction. + // NOTE: MockFnCaller is essentially equivalent to the lambda: + // [fn](auto... args) { return fn->Call(std::move(args)...)} + // however that fails to build on some supported platforms. + template + struct MockFnCaller; + + // specialization for std::tuple. + template + struct MockFnCaller> { + MockFnType* fn; + inline ResultT operator()(Args... args) { + ResultT result = fn->Call(args...); + ValidatorT::Validate(result, args...); + return result; + } + }; + + // FunctionHolder owns a particular ::testing::MockFunction associated with + // a mocked type signature, and implement the type-erased Apply call, which + // applies type-erased arguments to the mock. + class FunctionHolder { + public: + virtual ~FunctionHolder() = default; + + // Call is a dispatch function which converts the + // generic type-erased parameters into a specific mock invocation call. + virtual void Apply(/*ArgTupleT*/ void* args_tuple, + /*ResultT*/ void* result) = 0; + }; + + template + class FunctionHolderImpl final : public FunctionHolder { + public: + void Apply(void* args_tuple, void* result) final { + // Requires tuple_args to point to a ArgTupleT, which is a + // std::tuple used to invoke the mock function. Requires result + // to point to a ResultT, which is the result of the call. + *static_cast(result) = absl::apply( + MockFnCaller{&mock_fn_}, + *static_cast(args_tuple)); + } + + MockFnType mock_fn_; + }; + + // MockingBitGen::RegisterMock + // + // RegisterMock(FastTypeIdType) is the main extension + // point for extending the MockingBitGen framework. It provides a mechanism to + // install a mock expectation for a function like ResultT(Args...) keyed by + // type_idex onto the MockingBitGen context. The key is that the type_index + // used to register must match the type index used to call the mock. + // + // The returned MockFunction<...> type can be used to setup additional + // distribution parameters of the expectation. + template + auto RegisterMock(SelfT&, base_internal::FastTypeIdType type, ValidatorT) + -> decltype(GetMockFnType(std::declval(), + std::declval()))& { + using ActualValidatorT = + std::conditional_t; + using MockFnType = decltype(GetMockFnType(std::declval(), + std::declval())); + + using WrappedFnType = absl::conditional_t< + std::is_same>::value, + ::testing::NiceMock, + absl::conditional_t< + std::is_same>::value, + ::testing::NaggyMock, + absl::conditional_t< + std::is_same>::value, + ::testing::StrictMock, MockFnType>>>; + + using ImplT = + FunctionHolderImpl; + auto& mock = mocks_[type]; + if (!mock) { + mock = absl::make_unique(); + } + return static_cast(mock.get())->mock_fn_; + } + + // MockingBitGen::InvokeMock + // + // InvokeMock(FastTypeIdType, args, result) is the entrypoint for invoking + // mocks registered on MockingBitGen. + // + // When no mocks are registered on the provided FastTypeIdType, returns false. + // Otherwise attempts to invoke the mock function ResultT(Args...) that + // was previously registered via the type_index. + // Requires tuple_args to point to a ArgTupleT, which is a std::tuple + // used to invoke the mock function. + // Requires result to point to a ResultT, which is the result of the call. + inline bool InvokeMock(base_internal::FastTypeIdType type, void* args_tuple, + void* result) { + // Trigger a mock, if there exists one that matches `param`. + auto it = mocks_.find(type); + if (it == mocks_.end()) return false; + it->second->Apply(args_tuple, result); + return true; + } + + absl::flat_hash_map> + mocks_; + absl::BitGen gen_; + + template + friend struct ::absl::random_internal::DistributionCaller; // for InvokeMock + friend class ::absl::BitGenRef; // for InvokeMock + friend class ::absl::random_internal::MockHelpers; // for RegisterMock, + // InvokeMock +}; + } // namespace random_internal -class BitGenRef; // MockingBitGen // @@ -101,138 +239,14 @@ class BitGenRef; // since the underlying implementation creates a type-specific pointer which // will be distinct across different DLL boundaries. // -class MockingBitGen { - public: - MockingBitGen() = default; - ~MockingBitGen() = default; +using MockingBitGen = random_internal::MockingBitGenImpl; - // URBG interface - using result_type = absl::BitGen::result_type; - - static constexpr result_type(min)() { return (absl::BitGen::min)(); } - static constexpr result_type(max)() { return (absl::BitGen::max)(); } - result_type operator()() { return gen_(); } - - private: - // GetMockFnType returns the testing::MockFunction for a result and tuple. - // This method only exists for type deduction and is otherwise unimplemented. - template - static auto GetMockFnType(ResultT, std::tuple) - -> ::testing::MockFunction; - - // MockFnCaller is a helper method for use with absl::apply to - // apply an ArgTupleT to a compatible MockFunction. - // NOTE: MockFnCaller is essentially equivalent to the lambda: - // [fn](auto... args) { return fn->Call(std::move(args)...)} - // however that fails to build on some supported platforms. - template - struct MockFnCaller; - - // specialization for std::tuple. - template - struct MockFnCaller> { - MockFnType* fn; - inline ResultT operator()(Args... args) { - return fn->Call(std::move(args)...); - } - }; - - // FunctionHolder owns a particular ::testing::MockFunction associated with - // a mocked type signature, and implement the type-erased Apply call, which - // applies type-erased arguments to the mock. - class FunctionHolder { - public: - virtual ~FunctionHolder() = default; - - // Call is a dispatch function which converts the - // generic type-erased parameters into a specific mock invocation call. - virtual void Apply(/*ArgTupleT*/ void* args_tuple, - /*ResultT*/ void* result) = 0; - }; - - template - class FunctionHolderImpl final : public FunctionHolder { - public: - void Apply(void* args_tuple, void* result) override { - // Requires tuple_args to point to a ArgTupleT, which is a - // std::tuple used to invoke the mock function. Requires result - // to point to a ResultT, which is the result of the call. - *static_cast(result) = - absl::apply(MockFnCaller{&mock_fn_}, - *static_cast(args_tuple)); - } - - MockFnType mock_fn_; - }; - - // MockingBitGen::RegisterMock - // - // RegisterMock(FastTypeIdType) is the main extension - // point for extending the MockingBitGen framework. It provides a mechanism to - // install a mock expectation for a function like ResultT(Args...) keyed by - // type_idex onto the MockingBitGen context. The key is that the type_index - // used to register must match the type index used to call the mock. - // - // The returned MockFunction<...> type can be used to setup additional - // distribution parameters of the expectation. - template - auto RegisterMock(SelfT&, base_internal::FastTypeIdType type) - -> decltype(GetMockFnType(std::declval(), - std::declval()))& { - using MockFnType = decltype(GetMockFnType(std::declval(), - std::declval())); - - using WrappedFnType = absl::conditional_t< - std::is_same>::value, - ::testing::NiceMock, - absl::conditional_t< - std::is_same>::value, - ::testing::NaggyMock, - absl::conditional_t< - std::is_same>::value, - ::testing::StrictMock, MockFnType>>>; - - using ImplT = FunctionHolderImpl; - auto& mock = mocks_[type]; - if (!mock) { - mock = absl::make_unique(); - } - return static_cast(mock.get())->mock_fn_; - } - - // MockingBitGen::InvokeMock - // - // InvokeMock(FastTypeIdType, args, result) is the entrypoint for invoking - // mocks registered on MockingBitGen. - // - // When no mocks are registered on the provided FastTypeIdType, returns false. - // Otherwise attempts to invoke the mock function ResultT(Args...) that - // was previously registered via the type_index. - // Requires tuple_args to point to a ArgTupleT, which is a std::tuple - // used to invoke the mock function. - // Requires result to point to a ResultT, which is the result of the call. - inline bool InvokeMock(base_internal::FastTypeIdType type, void* args_tuple, - void* result) { - // Trigger a mock, if there exists one that matches `param`. - auto it = mocks_.find(type); - if (it == mocks_.end()) return false; - it->second->Apply(args_tuple, result); - return true; - } - - absl::flat_hash_map> - mocks_; - absl::BitGen gen_; - - template - friend struct ::absl::random_internal::DistributionCaller; // for InvokeMock - friend class ::absl::BitGenRef; // for InvokeMock - friend class ::absl::random_internal::MockHelpers; // for RegisterMock, - // InvokeMock -}; +// UnvalidatedMockingBitGen +// +// UnvalidatedMockingBitGen is a variant of MockingBitGen which does no extra +// validation. +using UnvalidatedMockingBitGen ABSL_DEPRECATED("Use MockingBitGen instead") = + random_internal::MockingBitGenImpl; ABSL_NAMESPACE_END } // namespace absl diff --git a/yass/third_party/abseil-cpp/absl/random/mocking_bit_gen_test.cc b/yass/third_party/abseil-cpp/absl/random/mocking_bit_gen_test.cc index 9ccdf568d7..26e673ac63 100644 --- a/yass/third_party/abseil-cpp/absl/random/mocking_bit_gen_test.cc +++ b/yass/third_party/abseil-cpp/absl/random/mocking_bit_gen_test.cc @@ -16,9 +16,11 @@ #include "absl/random/mocking_bit_gen.h" #include +#include #include +#include #include -#include +#include #include "gmock/gmock.h" #include "gtest/gtest-spi.h" @@ -246,33 +248,33 @@ TEST(WillOnce, DistinctCounters) { absl::MockingBitGen gen; EXPECT_CALL(absl::MockUniform(), Call(gen, 1, 1000000)) .Times(3) - .WillRepeatedly(Return(0)); + .WillRepeatedly(Return(1)); EXPECT_CALL(absl::MockUniform(), Call(gen, 1000001, 2000000)) .Times(3) - .WillRepeatedly(Return(1)); - EXPECT_EQ(absl::Uniform(gen, 1000001, 2000000), 1); - EXPECT_EQ(absl::Uniform(gen, 1, 1000000), 0); - EXPECT_EQ(absl::Uniform(gen, 1000001, 2000000), 1); - EXPECT_EQ(absl::Uniform(gen, 1, 1000000), 0); - EXPECT_EQ(absl::Uniform(gen, 1000001, 2000000), 1); - EXPECT_EQ(absl::Uniform(gen, 1, 1000000), 0); + .WillRepeatedly(Return(1000001)); + EXPECT_EQ(absl::Uniform(gen, 1000001, 2000000), 1000001); + EXPECT_EQ(absl::Uniform(gen, 1, 1000000), 1); + EXPECT_EQ(absl::Uniform(gen, 1000001, 2000000), 1000001); + EXPECT_EQ(absl::Uniform(gen, 1, 1000000), 1); + EXPECT_EQ(absl::Uniform(gen, 1000001, 2000000), 1000001); + EXPECT_EQ(absl::Uniform(gen, 1, 1000000), 1); } TEST(TimesModifier, ModifierSaturatesAndExpires) { EXPECT_NONFATAL_FAILURE( []() { absl::MockingBitGen gen; - EXPECT_CALL(absl::MockUniform(), Call(gen, 1, 1000000)) + EXPECT_CALL(absl::MockUniform(), Call(gen, 0, 1000000)) .Times(3) .WillRepeatedly(Return(15)) .RetiresOnSaturation(); - EXPECT_EQ(absl::Uniform(gen, 1, 1000000), 15); - EXPECT_EQ(absl::Uniform(gen, 1, 1000000), 15); - EXPECT_EQ(absl::Uniform(gen, 1, 1000000), 15); + EXPECT_EQ(absl::Uniform(gen, 0, 1000000), 15); + EXPECT_EQ(absl::Uniform(gen, 0, 1000000), 15); + EXPECT_EQ(absl::Uniform(gen, 0, 1000000), 15); // Times(3) has expired - Should get a different value now. - EXPECT_NE(absl::Uniform(gen, 1, 1000000), 15); + EXPECT_NE(absl::Uniform(gen, 0, 1000000), 15); }(), ""); } @@ -394,7 +396,7 @@ TEST(MockingBitGen, StrictMock_TooMany) { EXPECT_EQ(absl::Uniform(gen, 1, 1000), 145); EXPECT_NONFATAL_FAILURE( - [&]() { EXPECT_EQ(absl::Uniform(gen, 10, 1000), 0); }(), + [&]() { EXPECT_EQ(absl::Uniform(gen, 0, 1000), 0); }(), "over-saturated and active"); } diff --git a/yass/third_party/abseil-cpp/absl/strings/has_absl_stringify.h b/yass/third_party/abseil-cpp/absl/strings/has_absl_stringify.h index 274a7865d1..9af0191dc5 100644 --- a/yass/third_party/abseil-cpp/absl/strings/has_absl_stringify.h +++ b/yass/third_party/abseil-cpp/absl/strings/has_absl_stringify.h @@ -18,6 +18,7 @@ #include #include +#include "absl/base/config.h" #include "absl/strings/string_view.h" namespace absl { diff --git a/yass/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h b/yass/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h index 5c0c375dbc..cb29767663 100644 --- a/yass/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +++ b/yass/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h @@ -109,7 +109,17 @@ class BigUnsigned { size_ = (std::min)(size_ + word_shift, max_words); count %= 32; if (count == 0) { +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=warray-bounds +// shows a lot of bogus -Warray-bounds warnings under GCC. +// This is not the only one in Abseil. +#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(14, 0) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Warray-bounds" +#endif std::copy_backward(words_, words_ + size_ - word_shift, words_ + size_); +#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(14, 0) +#pragma GCC diagnostic pop +#endif } else { for (int i = (std::min)(size_, max_words - 1); i > word_shift; --i) { words_[i] = (words_[i - word_shift] << count) | diff --git a/yass/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h b/yass/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h index f82cfe26c3..98f27dff69 100644 --- a/yass/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h +++ b/yass/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h @@ -17,6 +17,9 @@ #include "absl/strings/has_absl_stringify.h" +#include +#include + #include "absl/base/config.h" namespace absl { @@ -34,7 +37,14 @@ namespace strings_internal { // // https://github.com/google/googletest/pull/4368#issuecomment-1717699895 // https://github.com/google/googletest/pull/4368#issuecomment-1717699895 -using ::absl::HasAbslStringify; +template +struct HasAbslStringify : std::false_type {}; + +template +struct HasAbslStringify< + T, std::enable_if_t(), + std::declval()))>::value>> : std::true_type {}; } // namespace strings_internal diff --git a/yass/third_party/abseil-cpp/absl/strings/internal/str_format/convert_test.cc b/yass/third_party/abseil-cpp/absl/strings/internal/str_format/convert_test.cc index 3a4c27d78b..baffe05256 100644 --- a/yass/third_party/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +++ b/yass/third_party/abseil-cpp/absl/strings/internal/str_format/convert_test.cc @@ -844,15 +844,13 @@ void TestWithMultipleFormatsHelper(Floating tested_float) { // Apple formats NaN differently (+nan) vs. (nan) if (std::isnan(tested_float)) continue; #endif - if (string_printf_result != str_format_result) { - // We use ASSERT_EQ here because failures are usually correlated and a - // bug would print way too many failed expectations causing the test - // to time out. - ASSERT_EQ(string_printf_result, str_format_result) - << fmt_str << " " << StrPrint("%.18g", tested_float) << " " - << StrPrint("%a", tested_float) << " " - << StrPrint("%.50f", tested_float); - } + // We use ASSERT_EQ here because failures are usually correlated and a + // bug would print way too many failed expectations causing the test + // to time out. + ASSERT_EQ(string_printf_result, str_format_result) + << fmt_str << " " << StrPrint("%.18g", tested_float) << " " + << StrPrint("%a", tested_float) << " " + << StrPrint("%.50f", tested_float); } } } diff --git a/yass/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h b/yass/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h index 440d47ff2f..3e730c7aab 100644 --- a/yass/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +++ b/yass/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h @@ -33,6 +33,7 @@ #include #include +#include #include #include #include @@ -321,6 +322,15 @@ std::string JoinRange(const Range& range, absl::string_view separator) { return JoinRange(begin(range), end(range), separator); } +template +std::string JoinTuple(const Tuple& value, absl::string_view separator, + std::index_sequence) { + return JoinRange( + std::initializer_list{ + static_cast(std::get(value)).Piece()...}, + separator); +} + } // namespace strings_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/yass/third_party/abseil-cpp/absl/strings/str_join.h b/yass/third_party/abseil-cpp/absl/strings/str_join.h index 6a92c0f53a..8d7bc6ba79 100644 --- a/yass/third_party/abseil-cpp/absl/strings/str_join.h +++ b/yass/third_party/abseil-cpp/absl/strings/str_join.h @@ -247,12 +247,20 @@ std::string StrJoin(const Range& range, absl::string_view separator, return strings_internal::JoinRange(range, separator, fmt); } -template +template ::value>::type> std::string StrJoin(std::initializer_list il, absl::string_view separator, Formatter&& fmt) { return strings_internal::JoinRange(il, separator, fmt); } +template +inline std::string StrJoin(std::initializer_list il, + absl::string_view separator, Formatter&& fmt) { + return strings_internal::JoinRange(il, separator, fmt); +} + template std::string StrJoin(const std::tuple& value, absl::string_view separator, Formatter&& fmt) { @@ -269,16 +277,22 @@ std::string StrJoin(const Range& range, absl::string_view separator) { return strings_internal::JoinRange(range, separator); } -template -std::string StrJoin(std::initializer_list il, - absl::string_view separator) { +template ::value>::type> +std::string StrJoin(std::initializer_list il, absl::string_view separator) { + return strings_internal::JoinRange(il, separator); +} + +inline std::string StrJoin(std::initializer_list il, + absl::string_view separator) { return strings_internal::JoinRange(il, separator); } template std::string StrJoin(const std::tuple& value, absl::string_view separator) { - return strings_internal::JoinAlgorithm(value, separator, AlphaNumFormatter()); + return strings_internal::JoinTuple(value, separator, + std::index_sequence_for{}); } ABSL_NAMESPACE_END diff --git a/yass/third_party/abseil-cpp/absl/strings/str_join_benchmark.cc b/yass/third_party/abseil-cpp/absl/strings/str_join_benchmark.cc index d6f689ff30..be7a725710 100644 --- a/yass/third_party/abseil-cpp/absl/strings/str_join_benchmark.cc +++ b/yass/third_party/abseil-cpp/absl/strings/str_join_benchmark.cc @@ -16,6 +16,7 @@ #include "absl/strings/str_join.h" #include +#include #include #include @@ -94,4 +95,13 @@ BENCHMARK(BM_JoinStreamable) ->ArgPair(16, 256) ->ArgPair(256, 256); +void BM_JoinTuple(benchmark::State& state) { + for (auto _ : state) { + std::string s = + absl::StrJoin(std::make_tuple(123456789, 987654321, 24680, 13579), "/"); + benchmark::DoNotOptimize(s); + } +} +BENCHMARK(BM_JoinTuple); + } // namespace diff --git a/yass/third_party/abseil-cpp/absl/strings/str_join_test.cc b/yass/third_party/abseil-cpp/absl/strings/str_join_test.cc index 449f95be3e..cd52e11d13 100644 --- a/yass/third_party/abseil-cpp/absl/strings/str_join_test.cc +++ b/yass/third_party/abseil-cpp/absl/strings/str_join_test.cc @@ -428,6 +428,42 @@ TEST(StrJoin, InitializerList) { } } +TEST(StrJoin, StringViewInitializerList) { + { + // Tests initializer_list of string_views + std::string b = "b"; + EXPECT_EQ("a-b-c", absl::StrJoin({"a", b, "c"}, "-")); + } + { + // Tests initializer_list of string_views with a non-default formatter + TestingParenFormatter f; + std::string b = "b"; + EXPECT_EQ("(a)-(b)-(c)", absl::StrJoin({"a", b, "c"}, "-", f)); + } + + class NoCopy { + public: + explicit NoCopy(absl::string_view view) : view_(view) {} + NoCopy(const NoCopy&) = delete; + operator absl::string_view() { return view_; } // NOLINT + private: + absl::string_view view_; + }; + { + // Tests initializer_list of string_views preferred over initializer_list + // for T that is implicitly convertible to string_view + EXPECT_EQ("a-b-c", + absl::StrJoin({NoCopy("a"), NoCopy("b"), NoCopy("c")}, "-")); + } + { + // Tests initializer_list of string_views preferred over initializer_list + // for T that is implicitly convertible to string_view + TestingParenFormatter f; + EXPECT_EQ("(a)-(b)-(c)", + absl::StrJoin({NoCopy("a"), NoCopy("b"), NoCopy("c")}, "-", f)); + } +} + TEST(StrJoin, Tuple) { EXPECT_EQ("", absl::StrJoin(std::make_tuple(), "-")); EXPECT_EQ("hello", absl::StrJoin(std::make_tuple("hello"), "-")); diff --git a/yass/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc b/yass/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc index bc546719b8..a5db946a70 100644 --- a/yass/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc +++ b/yass/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc @@ -36,7 +36,7 @@ extern "C" int __clock_gettime(clockid_t c, struct timespec* ts); extern "C" int clock_gettime(clockid_t c, struct timespec* ts) { if (c == CLOCK_MONOTONIC && !absl::synchronization_internal::KernelTimeout::SupportsSteadyClock()) { - absl::SharedBitGen gen; + thread_local absl::BitGen gen; // NOLINT ts->tv_sec = absl::Uniform(gen, 0, 1'000'000'000); ts->tv_nsec = absl::Uniform(gen, 0, 1'000'000'000); return 0; diff --git a/yass/third_party/abseil-cpp/absl/synchronization/internal/waiter_test.cc b/yass/third_party/abseil-cpp/absl/synchronization/internal/waiter_test.cc index 992db29be8..da138961d0 100644 --- a/yass/third_party/abseil-cpp/absl/synchronization/internal/waiter_test.cc +++ b/yass/third_party/abseil-cpp/absl/synchronization/internal/waiter_test.cc @@ -44,7 +44,7 @@ extern "C" int __clock_gettime(clockid_t c, struct timespec* ts); extern "C" int clock_gettime(clockid_t c, struct timespec* ts) { if (c == CLOCK_MONOTONIC && !absl::synchronization_internal::KernelTimeout::SupportsSteadyClock()) { - absl::SharedBitGen gen; + thread_local absl::BitGen gen; // NOLINT ts->tv_sec = absl::Uniform(gen, 0, 1'000'000'000); ts->tv_nsec = absl::Uniform(gen, 0, 1'000'000'000); return 0; diff --git a/yass/third_party/abseil-cpp/ci/linux_docker_containers.sh b/yass/third_party/abseil-cpp/ci/linux_docker_containers.sh index 232233d136..bd8d8ef3bc 100644 --- a/yass/third_party/abseil-cpp/ci/linux_docker_containers.sh +++ b/yass/third_party/abseil-cpp/ci/linux_docker_containers.sh @@ -16,7 +16,7 @@ # Test scripts should source this file to get the identifiers. readonly LINUX_ALPINE_CONTAINER="gcr.io/google.com/absl-177019/alpine:20230612" -readonly LINUX_CLANG_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20231218" +readonly LINUX_CLANG_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20240523" readonly LINUX_ARM_CLANG_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_arm_hybrid-latest:20231219" -readonly LINUX_GCC_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20231218" +readonly LINUX_GCC_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20240523_rc1" readonly LINUX_GCC_FLOOR_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-floor:20230120" diff --git a/yass/third_party/abseil-cpp/ci/windows_msvc_cmake.bat b/yass/third_party/abseil-cpp/ci/windows_msvc_cmake.bat index c0f1ac9455..8b431d770f 100755 --- a/yass/third_party/abseil-cpp/ci/windows_msvc_cmake.bat +++ b/yass/third_party/abseil-cpp/ci/windows_msvc_cmake.bat @@ -56,7 +56,6 @@ CD "build" SET CXXFLAGS="/WX" %CMAKE_BIN% ^ - -DABSL_BUILD_TEST_HELPERS=ON ^ -DABSL_BUILD_TESTING=ON ^ -DABSL_GOOGLETEST_DOWNLOAD_URL=%ABSL_GOOGLETEST_DOWNLOAD_URL% ^ -DBUILD_SHARED_LIBS=%ABSL_CMAKE_BUILD_SHARED% ^ diff --git a/yass/third_party/googletest/ci/linux-presubmit.sh b/yass/third_party/googletest/ci/linux-presubmit.sh index 35e1670724..6d2b3fb573 100644 --- a/yass/third_party/googletest/ci/linux-presubmit.sh +++ b/yass/third_party/googletest/ci/linux-presubmit.sh @@ -31,7 +31,7 @@ set -euox pipefail -readonly LINUX_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20231218" +readonly LINUX_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20240523" readonly LINUX_GCC_FLOOR_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-floor:20230120" if [[ -z ${GTEST_ROOT:-} ]]; then diff --git a/yass/third_party/googletest/docs/reference/testing.md b/yass/third_party/googletest/docs/reference/testing.md index c93556e662..3ed5211117 100644 --- a/yass/third_party/googletest/docs/reference/testing.md +++ b/yass/third_party/googletest/docs/reference/testing.md @@ -140,6 +140,7 @@ See also ### TYPED_TEST_SUITE {#TYPED_TEST_SUITE} `TYPED_TEST_SUITE(`*`TestFixtureName`*`,`*`Types`*`)` +`TYPED_TEST_SUITE(`*`TestFixtureName`*`,`*`Types`*`,`*`NameGenerator`*`)` Defines a typed test suite based on the test fixture *`TestFixtureName`*. The test suite name is *`TestFixtureName`*. @@ -169,6 +170,22 @@ TYPED_TEST_SUITE(MyFixture, MyTypes); The type alias (`using` or `typedef`) is necessary for the `TYPED_TEST_SUITE` macro to parse correctly. +The optional third argument *`NameGenerator`* allows specifying a class that +exposes a templated static function `GetName(int)`. For example: + +```cpp +class NameGenerator { + public: + template + static std::string GetName(int) { + if constexpr (std::is_same_v) return "char"; + if constexpr (std::is_same_v) return "int"; + if constexpr (std::is_same_v) return "unsignedInt"; + } +}; +TYPED_TEST_SUITE(MyFixture, MyTypes, NameGenerator); +``` + See also [`TYPED_TEST`](#TYPED_TEST) and [Typed Tests](../advanced.md#typed-tests) for more information. diff --git a/yass/third_party/googletest/googlemock/src/gmock-matchers.cc b/yass/third_party/googletest/googlemock/src/gmock-matchers.cc index 81a5b7ea5a..277add6b62 100644 --- a/yass/third_party/googletest/googlemock/src/gmock-matchers.cc +++ b/yass/third_party/googletest/googlemock/src/gmock-matchers.cc @@ -236,9 +236,8 @@ static void LogElementMatcherPairVec(const ElementMatcherPairs& pairs, os << "{"; const char* sep = ""; for (Iter it = pairs.begin(); it != pairs.end(); ++it) { - os << sep << "\n (" - << "element #" << it->first << ", " - << "matcher #" << it->second << ")"; + os << sep << "\n (" << "element #" << it->first << ", " << "matcher #" + << it->second << ")"; sep = ","; } os << "\n}"; @@ -374,20 +373,20 @@ bool UnorderedElementsAreMatcherImplBase::VerifyMatchMatrix( return true; } - if (match_flags() == UnorderedMatcherRequire::ExactMatch) { - if (matrix.LhsSize() != matrix.RhsSize()) { - // The element count doesn't match. If the container is empty, - // there's no need to explain anything as Google Mock already - // prints the empty container. Otherwise we just need to show - // how many elements there actually are. - if (matrix.LhsSize() != 0 && listener->IsInterested()) { - *listener << "which has " << Elements(matrix.LhsSize()); - } - return false; + const bool is_exact_match_with_size_discrepency = + match_flags() == UnorderedMatcherRequire::ExactMatch && + matrix.LhsSize() != matrix.RhsSize(); + if (is_exact_match_with_size_discrepency) { + // The element count doesn't match. If the container is empty, + // there's no need to explain anything as Google Mock already + // prints the empty container. Otherwise we just need to show + // how many elements there actually are. + if (matrix.LhsSize() != 0 && listener->IsInterested()) { + *listener << "which has " << Elements(matrix.LhsSize()) << "\n"; } } - bool result = true; + bool result = !is_exact_match_with_size_discrepency; ::std::vector element_matched(matrix.LhsSize(), 0); ::std::vector matcher_matched(matrix.RhsSize(), 0); diff --git a/yass/third_party/googletest/googlemock/test/gmock-matchers-containers_test.cc b/yass/third_party/googletest/googlemock/test/gmock-matchers-containers_test.cc index 38fd9a5dd7..acea4ec357 100644 --- a/yass/third_party/googletest/googlemock/test/gmock-matchers-containers_test.cc +++ b/yass/third_party/googletest/googlemock/test/gmock-matchers-containers_test.cc @@ -2014,7 +2014,14 @@ TEST_F(UnorderedElementsAreTest, FailMessageCountWrong) { StringMatchResultListener listener; EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3), v, &listener)) << listener.str(); - EXPECT_THAT(listener.str(), Eq("which has 1 element")); + EXPECT_THAT(listener.str(), + Eq("which has 1 element\n" + "where the following matchers don't match any elements:\n" + "matcher #0: is equal to 1,\n" + "matcher #1: is equal to 2,\n" + "matcher #2: is equal to 3\n" + "and where the following elements don't match any matchers:\n" + "element #0: 4")); } TEST_F(UnorderedElementsAreTest, FailMessageCountWrongZero) { @@ -2022,7 +2029,11 @@ TEST_F(UnorderedElementsAreTest, FailMessageCountWrongZero) { StringMatchResultListener listener; EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3), v, &listener)) << listener.str(); - EXPECT_THAT(listener.str(), Eq("")); + EXPECT_THAT(listener.str(), + Eq("where the following matchers don't match any elements:\n" + "matcher #0: is equal to 1,\n" + "matcher #1: is equal to 2,\n" + "matcher #2: is equal to 3")); } TEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatchers) { @@ -2438,7 +2449,7 @@ TEST(UnorderedPointwiseTest, RejectsWrongSize) { const double lhs[2] = {1, 2}; const int rhs[1] = {0}; EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs))); - EXPECT_EQ("which has 2 elements", + EXPECT_EQ("which has 2 elements\n", Explain(UnorderedPointwise(Gt(), rhs), lhs)); const int rhs2[3] = {0, 1, 2}; diff --git a/yass/third_party/googletest/googletest/src/gtest.cc b/yass/third_party/googletest/googletest/src/gtest.cc index d64c18d7fd..9a17180b35 100644 --- a/yass/third_party/googletest/googletest/src/gtest.cc +++ b/yass/third_party/googletest/googletest/src/gtest.cc @@ -6700,17 +6700,17 @@ void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) { } if (remove_flag) { - // Shift the remainder of the argv list left by one. Note - // that argv has (*argc + 1) elements, the last one always being - // NULL. The following loop moves the trailing NULL element as - // well. - for (int j = i; j != *argc; j++) { - argv[j] = argv[j + 1]; + // Shift the remainder of the argv list left by one. + for (int j = i + 1; j < *argc; ++j) { + argv[j - 1] = argv[j]; } // Decrements the argument count. (*argc)--; + // Terminate the array with nullptr. + argv[*argc] = nullptr; + // We also need to decrement the iterator as we just removed // an element. i--; diff --git a/yass/third_party/gperftools/src/windows/patch_functions.cc b/yass/third_party/gperftools/src/windows/patch_functions.cc index 4216c1f488..86c4683ff6 100644 --- a/yass/third_party/gperftools/src/windows/patch_functions.cc +++ b/yass/third_party/gperftools/src/windows/patch_functions.cc @@ -985,43 +985,6 @@ BOOL WINAPI WindowsInfo::Perftools_FreeLibrary(HMODULE hLibModule) { return rv; } -// see https://learn.microsoft.com/en-us/answers/questions/518344/tell-if-process-archtitecture-is-arm64-(x64-compat -typedef BOOL (WINAPI* PFNISWOW64PROCESS2)(HANDLE hProcess, - USHORT *pProcessMachine, - USHORT *pNativeMachine); -#ifndef IMAGE_FILE_MACHINE_UNKNOWN -#define IMAGE_FILE_MACHINE_UNKNOWN 0x0 -#endif // IMAGE_FILE_MACHINE_UNKNOWN -#ifndef IMAGE_FILE_MACHINE_ARM64 -#define IMAGE_FILE_MACHINE_ARM64 0xAA64 -#endif // IMAGE_FILE_MACHINE_ARM64 - -static BOOL IsWow64Process2Wrapper(HANDLE hProcess, - USHORT *pProcessMachine, - USHORT *pNativeMachine) { - HMODULE m = GetModuleHandleW(L"Kernel32.dll"); - assert(m && "kernel32 dll not loaded"); - static const auto fPointer = - reinterpret_cast( - reinterpret_cast(::GetProcAddress(m, "IsWow64Process2"))); - if (fPointer == nullptr) { - ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; - } - return fPointer(hProcess, pProcessMachine, pNativeMachine); -} - -static bool IsArm64NativeMachine() { - USHORT ProcessMachine = IMAGE_FILE_MACHINE_UNKNOWN; - USHORT NativeMachine = IMAGE_FILE_MACHINE_UNKNOWN; - - if (!IsWow64Process2Wrapper(GetCurrentProcess(), - &ProcessMachine, &NativeMachine)) { - return false; - } - return NativeMachine == IMAGE_FILE_MACHINE_ARM64; -} - // --------------------------------------------------------------------- // PatchWindowsFunctions() @@ -1036,9 +999,7 @@ void PatchWindowsFunctions() { disable_env[0] == '1' && disable_env[1] == '\0'; - const bool is_arm64_native = IsArm64NativeMachine(); - - if (!should_skip && !is_arm64_native) { + if (!should_skip) { // This does the libc patching in every module, and the main executable. PatchAllModules(); main_executable_windows.Patch(); diff --git a/yass/third_party/libc++/CMakeLists.txt b/yass/third_party/libc++/CMakeLists.txt index 06fe7a18b5..8192c36900 100644 --- a/yass/third_party/libc++/CMakeLists.txt +++ b/yass/third_party/libc++/CMakeLists.txt @@ -59,7 +59,7 @@ foreach(CompilerFlag ${CompilerFlags}) string(REPLACE "-stdlib=libc++" "" ${CompilerFlag} "${${CompilerFlag}}") endforeach() -set(libcxx_CR "e3b94d0e5b86883fd77696bf10dc33ba250ba99b") +set(libcxx_CR "852bc6746f45add53fec19f3a29280e69e358d44") # Fixed libc++ configuration macros are in # buildtools/third_party/libc++/__config_site. This config only has defines # that vary depending on gn args, and non-define flags. diff --git a/yass/third_party/libc++/trunk/benchmarks/CMakeLists.txt b/yass/third_party/libc++/trunk/benchmarks/CMakeLists.txt index 387e013afe..928238c1ac 100644 --- a/yass/third_party/libc++/trunk/benchmarks/CMakeLists.txt +++ b/yass/third_party/libc++/trunk/benchmarks/CMakeLists.txt @@ -182,6 +182,7 @@ set(BENCHMARK_TESTS algorithms/make_heap.bench.cpp algorithms/make_heap_then_sort_heap.bench.cpp algorithms/min.bench.cpp + algorithms/minmax.bench.cpp algorithms/min_max_element.bench.cpp algorithms/mismatch.bench.cpp algorithms/pop_heap.bench.cpp diff --git a/yass/third_party/libc++/trunk/benchmarks/algorithms/minmax.bench.cpp b/yass/third_party/libc++/trunk/benchmarks/algorithms/minmax.bench.cpp new file mode 100644 index 0000000000..b0ff7f91c1 --- /dev/null +++ b/yass/third_party/libc++/trunk/benchmarks/algorithms/minmax.bench.cpp @@ -0,0 +1,68 @@ +#include +#include + +#include + +void run_sizes(auto benchmark) { + benchmark->Arg(1) + ->Arg(2) + ->Arg(3) + ->Arg(4) + ->Arg(5) + ->Arg(6) + ->Arg(7) + ->Arg(8) + ->Arg(9) + ->Arg(10) + ->Arg(11) + ->Arg(12) + ->Arg(13) + ->Arg(14) + ->Arg(15) + ->Arg(16) + ->Arg(17) + ->Arg(18) + ->Arg(19) + ->Arg(20) + ->Arg(21) + ->Arg(22) + ->Arg(23) + ->Arg(24) + ->Arg(25) + ->Arg(26) + ->Arg(27) + ->Arg(28) + ->Arg(29) + ->Arg(30) + ->Arg(31) + ->Arg(32) + ->Arg(64) + ->Arg(512) + ->Arg(1024) + ->Arg(4000) + ->Arg(4096) + ->Arg(5500) + ->Arg(64000) + ->Arg(65536) + ->Arg(70000); +} + +template +static void BM_std_minmax(benchmark::State& state) { + std::vector vec(state.range(), 3); + + for (auto _ : state) { + benchmark::DoNotOptimize(vec); + benchmark::DoNotOptimize(std::ranges::minmax(vec)); + } +} +BENCHMARK(BM_std_minmax)->Apply(run_sizes); +BENCHMARK(BM_std_minmax)->Apply(run_sizes); +BENCHMARK(BM_std_minmax)->Apply(run_sizes); +BENCHMARK(BM_std_minmax)->Apply(run_sizes); +BENCHMARK(BM_std_minmax)->Apply(run_sizes); +BENCHMARK(BM_std_minmax)->Apply(run_sizes); +BENCHMARK(BM_std_minmax)->Apply(run_sizes); +BENCHMARK(BM_std_minmax)->Apply(run_sizes); + +BENCHMARK_MAIN(); diff --git a/yass/third_party/libc++/trunk/benchmarks/algorithms/mismatch.bench.cpp b/yass/third_party/libc++/trunk/benchmarks/algorithms/mismatch.bench.cpp index 9274932a76..7917828790 100644 --- a/yass/third_party/libc++/trunk/benchmarks/algorithms/mismatch.bench.cpp +++ b/yass/third_party/libc++/trunk/benchmarks/algorithms/mismatch.bench.cpp @@ -10,6 +10,15 @@ #include #include +void BenchmarkSizes(benchmark::internal::Benchmark* Benchmark) { + Benchmark->DenseRange(1, 8); + for (size_t i = 16; i != 1 << 20; i *= 2) { + Benchmark->Arg(i - 1); + Benchmark->Arg(i); + Benchmark->Arg(i + 1); + } +} + // TODO: Look into benchmarking aligned and unaligned memory explicitly // (currently things happen to be aligned because they are malloced that way) template @@ -24,8 +33,24 @@ static void bm_mismatch(benchmark::State& state) { benchmark::DoNotOptimize(std::mismatch(vec1.begin(), vec1.end(), vec2.begin())); } } -BENCHMARK(bm_mismatch)->DenseRange(1, 8)->Range(16, 1 << 20); -BENCHMARK(bm_mismatch)->DenseRange(1, 8)->Range(16, 1 << 20); -BENCHMARK(bm_mismatch)->DenseRange(1, 8)->Range(16, 1 << 20); +BENCHMARK(bm_mismatch)->Apply(BenchmarkSizes); +BENCHMARK(bm_mismatch)->Apply(BenchmarkSizes); +BENCHMARK(bm_mismatch)->Apply(BenchmarkSizes); + +template +static void bm_mismatch_two_range_overload(benchmark::State& state) { + std::vector vec1(state.range(), '1'); + std::vector vec2(state.range(), '1'); + std::mt19937_64 rng(std::random_device{}()); + + vec1.back() = '2'; + for (auto _ : state) { + benchmark::DoNotOptimize(vec1); + benchmark::DoNotOptimize(std::mismatch(vec1.begin(), vec1.end(), vec2.begin(), vec2.end())); + } +} +BENCHMARK(bm_mismatch_two_range_overload)->DenseRange(1, 8)->Range(16, 1 << 20); +BENCHMARK(bm_mismatch_two_range_overload)->DenseRange(1, 8)->Range(16, 1 << 20); +BENCHMARK(bm_mismatch_two_range_overload)->DenseRange(1, 8)->Range(16, 1 << 20); BENCHMARK_MAIN(); diff --git a/yass/third_party/libc++/trunk/docs/DesignDocs/NodiscardPolicy.rst b/yass/third_party/libc++/trunk/docs/DesignDocs/NodiscardPolicy.rst new file mode 100644 index 0000000000..afbb18b009 --- /dev/null +++ b/yass/third_party/libc++/trunk/docs/DesignDocs/NodiscardPolicy.rst @@ -0,0 +1,42 @@ +=================================================== +Guidelines for applying ``[[nodiscard]]`` in libc++ +=================================================== + +Libc++ adds ``[[nodiscard]]`` to functions in a lot of places. The standards +committee has decided to not have a recommended practice where to put them, so +this document lists where ``[[nodiscard]]`` should be applied in libc++. + +When should ``[[nodiscard]]`` be added to functions? +==================================================== + +``[[nodiscard]]`` should be applied to functions + +- where discarding the return value is most likely a correctness issue. + For example a locking constructor in ``unique_lock``. + +- where discarding the return value likely points to the user wanting to do + something different. For example ``vector::empty()``, which probably should + have been ``vector::clear()``. + + This can help spotting bugs easily which otherwise may take a very long time + to find. + +- which return a constant. For example ``numeric_limits::min()``. +- which only observe a value. For example ``string::size()``. + + Code that discards values from these kinds of functions is dead code. It can + either be removed, or the programmer meant to do something different. + +- where discarding the value is most likely a misuse of the function. For + example ``find``. + + This protects programmers from assuming too much about how the internals of + a function work, making code more robust in the presence of future + optimizations. + +What should be done when adding ``[[nodiscard]]`` to a function? +================================================================ + +Applications of ``[[nodiscard]]`` are code like any other code, so we aim to +test them. This can be done with a ``.verify.cpp`` test. Many examples are +available. Just look for tests with the suffix ``.nodiscard.verify.cpp``. diff --git a/yass/third_party/libc++/trunk/docs/FeatureTestMacroTable.rst b/yass/third_party/libc++/trunk/docs/FeatureTestMacroTable.rst index b213f430aa..3197d2cd1b 100644 --- a/yass/third_party/libc++/trunk/docs/FeatureTestMacroTable.rst +++ b/yass/third_party/libc++/trunk/docs/FeatureTestMacroTable.rst @@ -21,437 +21,449 @@ Status :name: feature-status-table :widths: auto - =================================================== ================= - Macro Name Value - =================================================== ================= + ========================================================== ================= + Macro Name Value + ========================================================== ================= **C++14** - --------------------------------------------------------------------- - ``__cpp_lib_chrono_udls`` ``201304L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_complex_udls`` ``201309L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_exchange_function`` ``201304L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_generic_associative_lookup`` ``201304L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_integer_sequence`` ``201304L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_integral_constant_callable`` ``201304L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_is_final`` ``201402L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_is_null_pointer`` ``201309L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_make_reverse_iterator`` ``201402L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_make_unique`` ``201304L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_null_iterators`` ``201304L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_quoted_string_io`` ``201304L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_result_of_sfinae`` ``201210L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_robust_nonmodifying_seq_ops`` ``201304L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_shared_timed_mutex`` ``201402L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_string_udls`` ``201304L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_transformation_trait_aliases`` ``201304L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_transparent_operators`` ``201210L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_tuple_element_t`` ``201402L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_tuples_by_type`` ``201304L`` - --------------------------------------------------- ----------------- + ---------------------------------------------------------------------------- + ``__cpp_lib_chrono_udls`` ``201304L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_complex_udls`` ``201309L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_exchange_function`` ``201304L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_generic_associative_lookup`` ``201304L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_integer_sequence`` ``201304L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_integral_constant_callable`` ``201304L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_is_final`` ``201402L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_is_null_pointer`` ``201309L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_make_reverse_iterator`` ``201402L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_make_unique`` ``201304L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_null_iterators`` ``201304L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_quoted_string_io`` ``201304L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_result_of_sfinae`` ``201210L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_robust_nonmodifying_seq_ops`` ``201304L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_shared_timed_mutex`` ``201402L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_string_udls`` ``201304L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_transformation_trait_aliases`` ``201304L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_transparent_operators`` ``201210L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_tuple_element_t`` ``201402L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_tuples_by_type`` ``201304L`` + ---------------------------------------------------------- ----------------- **C++17** - --------------------------------------------------------------------- - ``__cpp_lib_addressof_constexpr`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_allocator_traits_is_always_equal`` ``201411L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_any`` ``201606L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_apply`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_array_constexpr`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_as_const`` ``201510L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_atomic_is_always_lock_free`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_bool_constant`` ``201505L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_boyer_moore_searcher`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_byte`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_chrono`` ``201611L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_clamp`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_enable_shared_from_this`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_execution`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_filesystem`` ``201703L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_gcd_lcm`` ``201606L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_hardware_interference_size`` ``201703L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_has_unique_object_representations`` ``201606L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_hypot`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_incomplete_container_elements`` ``201505L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_invoke`` ``201411L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_is_aggregate`` ``201703L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_is_invocable`` ``201703L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_is_swappable`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_launder`` ``201606L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_logical_traits`` ``201510L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_make_from_tuple`` ``201606L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_map_try_emplace`` ``201411L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_math_special_functions`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_memory_resource`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_node_extract`` ``201606L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_nonmember_container_access`` ``201411L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_not_fn`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_optional`` ``201606L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_parallel_algorithm`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_raw_memory_algorithms`` ``201606L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_sample`` ``201603L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_scoped_lock`` ``201703L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_shared_mutex`` ``201505L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_shared_ptr_arrays`` ``201611L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_shared_ptr_weak_type`` ``201606L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_string_view`` ``201606L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_to_chars`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_transparent_operators`` ``201510L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_type_trait_variable_templates`` ``201510L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_uncaught_exceptions`` ``201411L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_unordered_map_try_emplace`` ``201411L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_variant`` ``202102L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_void_t`` ``201411L`` - --------------------------------------------------- ----------------- + ---------------------------------------------------------------------------- + ``__cpp_lib_addressof_constexpr`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_allocator_traits_is_always_equal`` ``201411L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_any`` ``201606L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_apply`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_array_constexpr`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_as_const`` ``201510L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_atomic_is_always_lock_free`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_bool_constant`` ``201505L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_boyer_moore_searcher`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_byte`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_chrono`` ``201611L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_clamp`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_enable_shared_from_this`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_execution`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_filesystem`` ``201703L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_gcd_lcm`` ``201606L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_hardware_interference_size`` ``201703L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_has_unique_object_representations`` ``201606L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_hypot`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_incomplete_container_elements`` ``201505L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_invoke`` ``201411L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_is_aggregate`` ``201703L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_is_invocable`` ``201703L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_is_swappable`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_launder`` ``201606L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_logical_traits`` ``201510L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_make_from_tuple`` ``201606L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_map_try_emplace`` ``201411L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_math_special_functions`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_memory_resource`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_node_extract`` ``201606L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_nonmember_container_access`` ``201411L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_not_fn`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_optional`` ``201606L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_parallel_algorithm`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_raw_memory_algorithms`` ``201606L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_sample`` ``201603L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_scoped_lock`` ``201703L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_shared_mutex`` ``201505L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_shared_ptr_arrays`` ``201611L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_shared_ptr_weak_type`` ``201606L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_string_view`` ``201606L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_to_chars`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_transparent_operators`` ``201510L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_type_trait_variable_templates`` ``201510L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_uncaught_exceptions`` ``201411L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_unordered_map_try_emplace`` ``201411L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_variant`` ``202102L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_void_t`` ``201411L`` + ---------------------------------------------------------- ----------------- **C++20** - --------------------------------------------------------------------- - ``__cpp_lib_array_constexpr`` ``201811L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_assume_aligned`` ``201811L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_atomic_flag_test`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_atomic_float`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_atomic_lock_free_type_aliases`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_atomic_ref`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_atomic_shared_ptr`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_atomic_value_initialization`` ``201911L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_atomic_wait`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_barrier`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_bind_front`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_bit_cast`` ``201806L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_bitops`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_bounded_array_traits`` ``201902L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_char8_t`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_concepts`` ``202002L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_algorithms`` ``201806L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_complex`` ``201711L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_dynamic_alloc`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_functional`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_iterator`` ``201811L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_memory`` ``201811L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_numeric`` ``201911L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_string`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_string_view`` ``201811L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_tuple`` ``201811L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_utility`` ``201811L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_vector`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_coroutine`` ``201902L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_destroying_delete`` ``201806L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_endian`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_erase_if`` ``202002L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_execution`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_format`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_format_uchar`` ``202311L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_generic_unordered_lookup`` ``201811L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_int_pow2`` ``202002L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_integer_comparison_functions`` ``202002L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_interpolate`` ``201902L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_is_constant_evaluated`` ``201811L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_is_layout_compatible`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_is_nothrow_convertible`` ``201806L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_is_pointer_interconvertible`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_jthread`` ``201911L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_latch`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_list_remove_return_type`` ``201806L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_math_constants`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_move_iterator_concept`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_polymorphic_allocator`` ``201902L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_remove_cvref`` ``201711L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_semaphore`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_shared_ptr_arrays`` ``201707L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_shift`` ``201806L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_smart_ptr_for_overwrite`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_source_location`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_span`` ``202002L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_ssize`` ``201902L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_starts_ends_with`` ``201711L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_string_view`` ``201803L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_syncbuf`` ``201803L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_three_way_comparison`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_to_address`` ``201711L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_to_array`` ``201907L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_type_identity`` ``201806L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_unwrap_ref`` ``201811L`` - --------------------------------------------------- ----------------- + ---------------------------------------------------------------------------- + ``__cpp_lib_array_constexpr`` ``201811L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_assume_aligned`` ``201811L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_atomic_flag_test`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_atomic_float`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_atomic_lock_free_type_aliases`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_atomic_ref`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_atomic_shared_ptr`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_atomic_value_initialization`` ``201911L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_atomic_wait`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_barrier`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_bind_front`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_bit_cast`` ``201806L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_bitops`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_bounded_array_traits`` ``201902L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_char8_t`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_concepts`` ``202002L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_algorithms`` ``201806L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_complex`` ``201711L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_dynamic_alloc`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_functional`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_iterator`` ``201811L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_memory`` ``201811L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_numeric`` ``201911L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_string`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_string_view`` ``201811L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_tuple`` ``201811L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_utility`` ``201811L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_vector`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_coroutine`` ``201902L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_destroying_delete`` ``201806L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_endian`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_erase_if`` ``202002L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_execution`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_format`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_format_uchar`` ``202311L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_generic_unordered_lookup`` ``201811L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_int_pow2`` ``202002L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_integer_comparison_functions`` ``202002L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_interpolate`` ``201902L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_is_constant_evaluated`` ``201811L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_is_layout_compatible`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_is_nothrow_convertible`` ``201806L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_is_pointer_interconvertible`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_jthread`` ``201911L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_latch`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_list_remove_return_type`` ``201806L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_math_constants`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_move_iterator_concept`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_polymorphic_allocator`` ``201902L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_remove_cvref`` ``201711L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_semaphore`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_shared_ptr_arrays`` ``201707L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_shift`` ``201806L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_smart_ptr_for_overwrite`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_source_location`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_span`` ``202002L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ssize`` ``201902L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_starts_ends_with`` ``201711L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_string_view`` ``201803L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_syncbuf`` ``201803L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_three_way_comparison`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_to_address`` ``201711L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_to_array`` ``201907L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_type_identity`` ``201806L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_unwrap_ref`` ``201811L`` + ---------------------------------------------------------- ----------------- **C++23** - --------------------------------------------------------------------- - ``__cpp_lib_adaptor_iterator_pair_constructor`` ``202106L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_allocate_at_least`` ``202302L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_associative_heterogeneous_erasure`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_bind_back`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_byteswap`` ``202110L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_bitset`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_charconv`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_cmath`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_memory`` ``202202L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_constexpr_typeinfo`` ``202106L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_expected`` ``202211L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_format_ranges`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_formatters`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_forward_like`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_invoke_r`` ``202106L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_ios_noreplace`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_is_scoped_enum`` ``202011L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_mdspan`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_move_only_function`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_optional`` ``202110L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_out_ptr`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_print`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_as_const`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_as_rvalue`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_chunk`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_chunk_by`` ``202202L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_contains`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_iota`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_join_with`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_repeat`` ``202207L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_slide`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_starts_ends_with`` ``202106L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_to_container`` ``202202L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_ranges_zip`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_reference_from_temporary`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_spanstream`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_stacktrace`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_stdatomic_h`` ``202011L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_string_contains`` ``202011L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_string_resize_and_overwrite`` ``202110L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_to_string`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_to_underlying`` ``202102L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_tuple_like`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_unreachable`` ``202202L`` - --------------------------------------------------- ----------------- + ---------------------------------------------------------------------------- + ``__cpp_lib_adaptor_iterator_pair_constructor`` ``202106L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_allocate_at_least`` ``202302L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_associative_heterogeneous_erasure`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_bind_back`` ``202202L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_byteswap`` ``202110L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_bitset`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_charconv`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_cmath`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_memory`` ``202202L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constexpr_typeinfo`` ``202106L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_expected`` ``202211L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_format_path`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_format_ranges`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_formatters`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_forward_like`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_invoke_r`` ``202106L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ios_noreplace`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_is_scoped_enum`` ``202011L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_mdspan`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_move_only_function`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_optional`` ``202110L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_out_ptr`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_print`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_as_const`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_as_rvalue`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_chunk`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_chunk_by`` ``202202L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_contains`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_iota`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_join_with`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_repeat`` ``202207L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_slide`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_starts_ends_with`` ``202106L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_to_container`` ``202202L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_zip`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_reference_from_temporary`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_spanstream`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_stacktrace`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_stdatomic_h`` ``202011L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_string_contains`` ``202011L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_string_resize_and_overwrite`` ``202110L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_to_string`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_to_underlying`` ``202102L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_tuple_like`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_unreachable`` ``202202L`` + ---------------------------------------------------------- ----------------- **C++26** - --------------------------------------------------------------------- - ``__cpp_lib_associative_heterogeneous_insertion`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_bind_back`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_bind_front`` ``202306L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_bitset`` ``202306L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_copyable_function`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_debugging`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_freestanding_algorithm`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_freestanding_array`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_freestanding_cstring`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_freestanding_expected`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_freestanding_mdspan`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_freestanding_optional`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_freestanding_string_view`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_freestanding_variant`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_fstream_native_handle`` ``202306L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_function_ref`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_hazard_pointer`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_linalg`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_out_ptr`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_ratio`` ``202306L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_rcu`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_saturation_arithmetic`` ``202311L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_smart_ptr_owner_equality`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_span_at`` ``202311L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_span_initializer_list`` ``202311L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_sstream_from_string_view`` ``202306L`` - --------------------------------------------------- ----------------- - ``__cpp_lib_submdspan`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_text_encoding`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_to_chars`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_tuple_like`` *unimplemented* - --------------------------------------------------- ----------------- - ``__cpp_lib_within_lifetime`` *unimplemented* - =================================================== ================= + ---------------------------------------------------------------------------- + ``__cpp_lib_associative_heterogeneous_insertion`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_atomic_min_max`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_bind_front`` ``202306L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_bitset`` ``202306L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_constrained_equality`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_copyable_function`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_debugging`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_default_template_type_for_algorithm_values`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_freestanding_algorithm`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_freestanding_array`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_freestanding_cstring`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_freestanding_expected`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_freestanding_mdspan`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_freestanding_optional`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_freestanding_string_view`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_freestanding_variant`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_fstream_native_handle`` ``202306L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_function_ref`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_generate_random`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_hazard_pointer`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_linalg`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_out_ptr`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_concat`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_ratio`` ``202306L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_rcu`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_reference_wrapper`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_saturation_arithmetic`` ``202311L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_smart_ptr_owner_equality`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_span_at`` ``202311L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_span_initializer_list`` ``202311L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_sstream_from_string_view`` ``202306L`` + ---------------------------------------------------------- ----------------- + ``__cpp_lib_submdspan`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_text_encoding`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_to_chars`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_tuple_like`` *unimplemented* + ---------------------------------------------------------- ----------------- + ``__cpp_lib_within_lifetime`` *unimplemented* + ========================================================== ================= diff --git a/yass/third_party/libc++/trunk/docs/ReleaseNotes/19.rst b/yass/third_party/libc++/trunk/docs/ReleaseNotes/19.rst index dd39c1bbbc..81c05b9112 100644 --- a/yass/third_party/libc++/trunk/docs/ReleaseNotes/19.rst +++ b/yass/third_party/libc++/trunk/docs/ReleaseNotes/19.rst @@ -42,6 +42,9 @@ Implemented Papers - P2652R2 - Disallow User Specialization of ``allocator_traits`` - P2819R2 - Add ``tuple`` protocol to ``complex`` - P2495R3 - Interfacing ``stringstream``\s with ``string_view`` +- P2867R2 - Remove Deprecated ``strstream``\s From C++26 +- P2872R3 - Remove ``wstring_convert`` From C++26 +- P3142R0 - Printing Blank Lines with ``println`` (as DR against C++23) - P2302R4 - ``std::ranges::contains`` - P1659R3 - ``std::ranges::starts_with`` and ``std::ranges::ends_with`` @@ -54,6 +57,16 @@ Improvements and New Features - The ``std::mismatch`` algorithm has been optimized for integral types, which can lead up to 40x performance improvements. +- The ``std::ranges::minmax`` algorithm has been optimized for integral types, resulting in a performance increase of + up to 100x. + +- The ``_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM`` macro has been added to make the declarations in ```` available. + +- The ``_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT`` macro has been added to make the declarations in ```` + available. + +- The formatting library is updated to Unicode 15.1.0. + Deprecations and Removals ------------------------- @@ -85,6 +98,11 @@ Deprecations and Removals libatomic is not available. If you are one such user, please reach out to the libc++ developers so we can collaborate on a path for supporting atomics properly on freestanding platforms. +- LWG3430 disallow implicit conversion of the source arguments to ``std::filesystem::path`` when + constructing ``std::basic_*fstream``. This effectively removes the possibility to directly construct + a ``std::basic_*fstream`` from a ``std::basic_string_view``, a input-iterator or a C-string, instead + you can construct a temporary ``std::basic_string``. This change has been applied to C++17 and later. + Upcoming Deprecations and Removals ---------------------------------- @@ -102,7 +120,10 @@ TODO ABI Affecting Changes --------------------- -TODO + +- The optional POSIX macro ``ENODATA`` has been deprecated in C++ and POSIX 2017. The + ``random_device`` could throw a ``system_error`` with this value. It now + throws ``ENOMSG``. Build System Changes diff --git a/yass/third_party/libc++/trunk/docs/Status/Cxx20Issues.csv b/yass/third_party/libc++/trunk/docs/Status/Cxx20Issues.csv index f0e9c4090f..db57b15256 100644 --- a/yass/third_party/libc++/trunk/docs/Status/Cxx20Issues.csv +++ b/yass/third_party/libc++/trunk/docs/Status/Cxx20Issues.csv @@ -269,7 +269,7 @@ "`3355 `__","The memory algorithms should support move-only input iterators introduced by P1207","Prague","|Complete|","15.0","|ranges|" "`3356 `__","``__cpp_lib_nothrow_convertible``\ should be ``__cpp_lib_is_nothrow_convertible``\ ","Prague","|Complete|","12.0" "`3358 `__","|sect|\ [span.cons] is mistaken that ``to_address``\ can throw","Prague","|Complete|","17.0" -"`3359 `__","````\ leap second support should allow for negative leap seconds","Prague","","","|chrono|" +"`3359 `__","````\ leap second support should allow for negative leap seconds","Prague","|Complete|","19.0","|chrono|" "`3360 `__","``three_way_comparable_with``\ is inconsistent with similar concepts","Prague","|Nothing To Do|","","|spaceship|" "`3362 `__","Strike ``stop_source``\ 's ``operator!=``\ ","Prague","","" "`3363 `__","``drop_while_view``\ should opt-out of ``sized_range``\ ","Prague","|Nothing To Do|","","|ranges|" @@ -286,7 +286,7 @@ "`3380 `__","``common_type``\ and comparison categories","Prague","|Complete|","15.0","|spaceship|" "`3381 `__","``begin``\ and ``data``\ must agree for ``contiguous_range``\ ","Prague","|Nothing To Do|","","|ranges|" "`3382 `__","NTTP for ``pair``\ and ``array``\ ","Prague","","" -"`3383 `__","|sect|\ [time.zone.leap.nonmembers] ``sys_seconds``\ should be replaced with ``seconds``\ ","Prague","","","|chrono|" +"`3383 `__","|sect|\ [time.zone.leap.nonmembers] ``sys_seconds``\ should be replaced with ``seconds``\ ","Prague","|Complete|","19.0","|chrono|" "`3384 `__","``transform_view::*sentinel*``\ has an incorrect ``operator-``\ ","Prague","|Complete|","15.0","|ranges|" "`3385 `__","``common_iterator``\ is not sufficiently constrained for non-copyable iterators","Prague","|Complete|","15.0","|ranges|" "`3387 `__","|sect|\ [range.reverse.view] ``reverse_view``\ unintentionally requires ``range``\ ","Prague","|Complete|","15.0","|ranges|" diff --git a/yass/third_party/libc++/trunk/docs/Status/Cxx20Papers.csv b/yass/third_party/libc++/trunk/docs/Status/Cxx20Papers.csv index db6491419a..77078b11a7 100644 --- a/yass/third_party/libc++/trunk/docs/Status/Cxx20Papers.csv +++ b/yass/third_party/libc++/trunk/docs/Status/Cxx20Papers.csv @@ -179,7 +179,7 @@ "`P1970R2 `__","LWG","Consistency for size() functions: Add ranges::ssize","Prague","|Complete|","15.0","|ranges|" "`P1973R1 `__","LWG","Rename ""_default_init"" Functions, Rev1","Prague","|Complete|","16.0" "`P1976R2 `__","LWG","Fixed-size span construction from dynamic range","Prague","|Complete|","11.0","|ranges|" -"`P1981R0 `__","LWG","Rename leap to leap_second","Prague","* *","" +"`P1981R0 `__","LWG","Rename leap to leap_second","Prague","|Complete|","19.0","|chrono|" "`P1982R0 `__","LWG","Rename link to time_zone_link","Prague","|Complete|","19.0","|chrono|" "`P1983R0 `__","LWG","Wording for GB301, US296, US292, US291, and US283","Prague","|Complete|","15.0","|ranges|" "`P1994R1 `__","LWG","elements_view needs its own sentinel","Prague","|Complete|","16.0","|ranges|" diff --git a/yass/third_party/libc++/trunk/docs/Status/Cxx23.rst b/yass/third_party/libc++/trunk/docs/Status/Cxx23.rst index 3e6e33f08c..b19ff4fdc0 100644 --- a/yass/third_party/libc++/trunk/docs/Status/Cxx23.rst +++ b/yass/third_party/libc++/trunk/docs/Status/Cxx23.rst @@ -43,6 +43,7 @@ Paper Status .. [#note-P0533R9] P0533R9: ``isfinite``, ``isinf``, ``isnan`` and ``isnormal`` are implemented. .. [#note-P1413R3] P1413R3: ``std::aligned_storage_t`` and ``std::aligned_union_t`` are marked deprecated, but clang doesn't issue a diagnostic for deprecated using template declarations. + .. [#note-P2387R3] P2387R3: ``bind_back`` only .. [#note-P2520R0] P2520R0: Libc++ implemented this paper as a DR in C++20 as well. .. [#note-P2711R1] P2711R1: ``join_with_view`` hasn't been done yet since this type isn't implemented yet. .. [#note-P2770R0] P2770R0: ``join_with_view`` hasn't been done yet since this type isn't implemented yet. @@ -64,3 +65,4 @@ Library Working Group Issues Status .. [#note-LWG3750] LWG3750 Only ``__cpp_lib_format_ranges`` is fully implemented. .. [#note-LWG3798] LWG3798: ``join_with_view``, ``zip_transform_view``, and ``adjacent_transform_view`` haven't been done yet since these types aren't implemented yet. + .. [#note-LWG3036] LWG3036: This issue was reverted by P2875R4 diff --git a/yass/third_party/libc++/trunk/docs/Status/Cxx23Issues.csv b/yass/third_party/libc++/trunk/docs/Status/Cxx23Issues.csv index ebdc4a745c..a212d56685 100644 --- a/yass/third_party/libc++/trunk/docs/Status/Cxx23Issues.csv +++ b/yass/third_party/libc++/trunk/docs/Status/Cxx23Issues.csv @@ -16,7 +16,7 @@ "`2820 `__","Clarify ```` macros","November 2020","|Nothing To Do|","" "`3120 `__","Unclear behavior of ``monotonic_buffer_resource::release()``","November 2020","","" "`3170 `__","``is_always_equal`` added to ``std::allocator`` makes the standard library treat derived types as always equal","November 2020","|Complete|","18.0" -"`3036 `__","``polymorphic_allocator::destroy`` is extraneous","November 2020","","" +"`3036 `__","``polymorphic_allocator::destroy`` is extraneous","November 2020","|Nothing To Do| [#note-LWG3036]_","" "`3171 `__","LWG2989 breaks ``directory_entry`` stream insertion","November 2020","|Complete|","14.0" "`3306 `__","``ranges::advance`` violates its preconditions","November 2020","|Complete|","14.0","|ranges|" "`3403 `__","Domain of ``ranges::ssize(E)`` doesn't ``match ranges::size(E)``","November 2020","","","|ranges|" @@ -64,7 +64,7 @@ `2818 `__,"``::std::`` everywhere rule needs tweaking","June 2021","|Nothing To Do|","" `2997 `__,"LWG 491 and the specification of ``{forward_,}list::unique``","June 2021","","" `3410 `__,"``lexicographical_compare_three_way`` is overspecified","June 2021","|Complete|","17.0","|spaceship|" -`3430 `__,"``std::fstream`` & co. should be constructible from string_view","June 2021","","" +`3430 `__,"``std::fstream`` & co. should be constructible from string_view","June 2021","|Complete|","19.0","" `3462 `__,"§[formatter.requirements]: Formatter requirements forbid use of ``fc.arg()``","June 2021","|Nothing To Do|","","|format|" `3481 `__,"``viewable_range`` mishandles lvalue move-only views","June 2021","Superseded by `P2415R2 `__","","|ranges|" `3506 `__,"Missing allocator-extended constructors for ``priority_queue``","June 2021","|Complete|","14.0" diff --git a/yass/third_party/libc++/trunk/docs/Status/Cxx23Papers.csv b/yass/third_party/libc++/trunk/docs/Status/Cxx23Papers.csv index 80547c5c1f..065db97a0b 100644 --- a/yass/third_party/libc++/trunk/docs/Status/Cxx23Papers.csv +++ b/yass/third_party/libc++/trunk/docs/Status/Cxx23Papers.csv @@ -45,7 +45,7 @@ "`P1413R3 `__","LWG","Deprecate ``std::aligned_storage`` and ``std::aligned_union``","February 2022","|Complete| [#note-P1413R3]_","" "`P2255R2 `__","LWG","A type trait to detect reference binding to temporary","February 2022","","" "`P2273R3 `__","LWG","Making ``std::unique_ptr`` constexpr","February 2022","|Complete|","16.0" -"`P2387R3 `__","LWG","Pipe support for user-defined range adaptors","February 2022","","","|ranges|" +"`P2387R3 `__","LWG","Pipe support for user-defined range adaptors","February 2022","|Partial| [#note-P2387R3]_","","|ranges|" "`P2440R1 `__","LWG","``ranges::iota``, ``ranges::shift_left`` and ``ranges::shift_right``","February 2022","","","|ranges|" "`P2441R2 `__","LWG","``views::join_with``","February 2022","|In Progress|","","|ranges|" "`P2442R1 `__","LWG","Windowing range adaptors: ``views::chunk`` and ``views::slide``","February 2022","","","|ranges|" diff --git a/yass/third_party/libc++/trunk/docs/Status/Cxx2cIssues.csv b/yass/third_party/libc++/trunk/docs/Status/Cxx2cIssues.csv index 58e9958097..008f7418ab 100644 --- a/yass/third_party/libc++/trunk/docs/Status/Cxx2cIssues.csv +++ b/yass/third_party/libc++/trunk/docs/Status/Cxx2cIssues.csv @@ -40,5 +40,28 @@ "`3990 `__","Program-defined specializations of ``std::tuple`` and ``std::variant`` can't be properly supported","Kona November 2023","","","" "`4001 `__","``iota_view`` should provide ``empty``","Kona November 2023","","","|ranges|" "","","","","","" -"`3343 `__","Ordering of calls to ``unlock()`` and ``notify_all()`` in Effects element of ``notify_all_at_thread_exit()`` should be reversed","Not Yet Adopted","|Complete|","16.0","" +"`3767 `__","``codecvt`` incorrectly added to locale","Tokyo March 2024","","","" +"`3919 `__","``enumerate_view`` may invoke UB for sized common non-forward underlying ranges","Tokyo March 2024","","","|ranges|" +"`3950 `__","``std::basic_string_view`` comparison operators are overspecified","Tokyo March 2024","|Complete|","18.0","" +"`3975 `__","Specializations of ``basic_format_context`` should not be permitted","Tokyo March 2024","|Nothing To Do|","","|format|" +"`3984 `__","``ranges::to``'s recursion branch may be ill-formed","Tokyo March 2024","","","|ranges|" +"`4011 `__","``""Effects: Equivalent to return""`` in ``[span.elem]``","Tokyo March 2024","|Nothing To Do|","","" +"`4012 `__","``common_view::begin/end`` are missing the ``simple-view`` check","Tokyo March 2024","","","|ranges|" +"`4013 `__","``lazy_split_view::outer-iterator::value_type`` should not provide default constructor","Tokyo March 2024","","","|ranges|" +"`4016 `__","container-insertable checks do not match what container-inserter does","Tokyo March 2024","","","" +"`4023 `__","Preconditions of ``std::basic_streambuf::setg/setp``","Tokyo March 2024","","","" +"`4025 `__","Move assignment operator of ``std::expected`` should not be conditionally deleted","Tokyo March 2024","","","" +"`4030 `__","Clarify whether arithmetic expressions in ``[numeric.sat.func]`` are mathematical or C++","Tokyo March 2024","|Nothing To Do|","","" +"`4031 `__","``bad_expected_access`` member functions should be ``noexcept``","Tokyo March 2024","|Complete|","16.0","" +"`4035 `__","``single_view`` should provide ``empty``","Tokyo March 2024","","","|ranges|" +"`4036 `__","``__alignof_is_defined`` is only implicitly specified in C++ and not yet deprecated","Tokyo March 2024","","","" +"`4037 `__","Static data members of ``ctype_base`` are not yet required to be usable in constant expressions","Tokyo March 2024","","","" +"`4038 `__","``std::text_encoding::aliases_view`` should have constexpr iterators","Tokyo March 2024","","","" +"`4043 `__","""ASCII"" is not a registered character encoding","Tokyo March 2024","|Nothing To Do|","","" +"`4045 `__","``tuple`` can create dangling references from ``tuple-like``","Tokyo March 2024","","","" +"`4053 `__","Unary call to ``std::views::repeat`` does not decay the argument","Tokyo March 2024","","","|ranges|" +"`4054 `__","Repeating a ``repeat_view`` should repeat the view","Tokyo March 2024","","","|ranges|" +"","","","","","" +"`3343 `__","Ordering of calls to ``unlock()`` and ``notify_all()`` in Effects element of ``notify_all_at_thread_exit()`` should be reversed","Not Yet Adopted","|Complete|","16.0","" +"XXXX","","The sys_info range should be affected by save","Not Yet Adopted","|Complete|","19.0" "","","","","","" diff --git a/yass/third_party/libc++/trunk/docs/Status/Cxx2cPapers.csv b/yass/third_party/libc++/trunk/docs/Status/Cxx2cPapers.csv index 4a5443dea1..fa11da62bc 100644 --- a/yass/third_party/libc++/trunk/docs/Status/Cxx2cPapers.csv +++ b/yass/third_party/libc++/trunk/docs/Status/Cxx2cPapers.csv @@ -46,3 +46,20 @@ "`P2264R7 `__","LWG","Make ``assert()`` macro user friendly for C and C++","Kona November 2023","","","" "`P1673R13 `__","LWG","A free function linear algebra interface based on the BLAS","Kona November 2023","","","" "","","","","","","" +"`P2875R4 `__","LWG","Undeprecate ``polymorphic_allocator::destroy`` for C++26","Tokyo March 2024","|Complete|","15.0","" +"`P2867R2 `__","LWG","Remove Deprecated ``strstreams`` From C++26","Tokyo March 2024","|Complete|","19.0","" +"`P2869R4 `__","LWG","Remove Deprecated ``shared_ptr`` Atomic Access APIs from C++26","Tokyo March 2024","","","" +"`P2872R3 `__","LWG","Remove ``wstring_convert`` From C++26","Tokyo March 2024","|Complete|","19.0","" +"`P3107R5 `__","LWG","Permit an efficient implementation of ``std::print``","Tokyo March 2024","","","|format| |DR|" +"`P3142R0 `__","LWG","Printing Blank Lines with ``println``","Tokyo March 2024","|Complete|","19.0","|format|" +"`P2845R8 `__","LWG","Formatting of ``std::filesystem::path``","Tokyo March 2024","","","|format|" +"`P0493R5 `__","LWG","Atomic minimum/maximum","Tokyo March 2024","","","" +"`P2542R8 `__","LWG","``views::concat``","Tokyo March 2024","","","|ranges|" +"`P2591R5 `__","LWG","Concatenation of strings and string views","Tokyo March 2024","","","" +"`P2248R8 `__","LWG","Enabling list-initialization for algorithms","Tokyo March 2024","","","" +"`P2810R4 `__","LWG","``is_debugger_present`` ``is_replaceable``","Tokyo March 2024","","","" +"`P1068R11 `__","LWG","Vector API for random number generation","Tokyo March 2024","","","" +"`P2944R3 `__","LWG","Comparisons for ``reference_wrapper``","Tokyo March 2024","","","" +"`P2642R6 `__","LWG","Padded ``mdspan`` layouts","Tokyo March 2024","","","" +"`P3029R1 `__","LWG","Better ``mdspan``'s CTAD","Tokyo March 2024","","","" +"","","","","","","" diff --git a/yass/third_party/libc++/trunk/docs/Status/FormatIssues.csv b/yass/third_party/libc++/trunk/docs/Status/FormatIssues.csv index b7acc76b8c..7da77def92 100644 --- a/yass/third_party/libc++/trunk/docs/Status/FormatIssues.csv +++ b/yass/third_party/libc++/trunk/docs/Status/FormatIssues.csv @@ -20,6 +20,10 @@ Number,Name,Standard,Assignee,Status,First released version "`P2905R2 `__","Runtime format strings","C++26 DR","Mark de Wever","|Complete|",18.0 "`P2918R2 `__","Runtime format strings II","C++26","Mark de Wever","|Complete|",18.0 "`P2909R4 `__","Fix formatting of code units as integers (Dude, where’s my ``char``?)","C++26 DR","Mark de Wever","|Complete|",18.0 +"`P3107R5 `__","Permit an efficient implementation of ``std::print``","C++26 DR","Mark de Wever","|In Progress|","" +"`P3142R0 `__","Printing Blank Lines with ``println``","C++26 DR","Hristo Hristov","|Complete|",19.0 +"`P2845R8 `__","Formatting of ``std::filesystem::path``","C++26","Mark de Wever","","" + `P1361 `_,"Integration of chrono with text formatting","C++20",Mark de Wever,|In Progress|, `P2372 `__,"Fixing locale handling in chrono formatters","C++20",Mark de Wever,|In Progress|, "`P2419R2 `__","Clarify handling of encodings in localized formatting of chrono types","C++23", diff --git a/yass/third_party/libc++/trunk/docs/Status/FormatPaper.csv b/yass/third_party/libc++/trunk/docs/Status/FormatPaper.csv index 82da54284c..e9d407e79e 100644 --- a/yass/third_party/libc++/trunk/docs/Status/FormatPaper.csv +++ b/yass/third_party/libc++/trunk/docs/Status/FormatPaper.csv @@ -2,12 +2,12 @@ Section,Description,Dependencies,Assignee,Status,First released version `P1361 `__ `P2372 `__,"Formatting chrono" `[time.syn] `_,"Formatter ``chrono::duration``",,Mark de Wever,|Complete|,16.0 `[time.syn] `_,"Formatter ``chrono::sys_time``",,Mark de Wever,|Complete|,17.0 -`[time.syn] `_,"Formatter ``chrono::utc_time``",A ```` implementation,Not assigned,,, -`[time.syn] `_,"Formatter ``chrono::tai_time``",A ```` implementation,Not assigned,,, -`[time.syn] `_,"Formatter ``chrono::gps_time``",A ```` implementation,Not assigned,,, +`[time.syn] `_,"Formatter ``chrono::utc_time``",A ```` implementation,Mark de Wever,,, +`[time.syn] `_,"Formatter ``chrono::tai_time``",A ```` implementation,Mark de Wever,,, +`[time.syn] `_,"Formatter ``chrono::gps_time``",A ```` implementation,Mark de Wever,,, `[time.syn] `_,"Formatter ``chrono::file_time``",,Mark de Wever,|Complete|,17.0 `[time.syn] `_,"Formatter ``chrono::local_time``",,Mark de Wever,|Complete|,17.0 -`[time.syn] `_,"Formatter ``chrono::local-time-format-t``",A ```` implementation,Not assigned,,, +`[time.syn] `_,"Formatter ``chrono::local-time-format-t``",A ```` implementation,Mark de Wever,,, `[time.syn] `_,"Formatter ``chrono::day``",,Mark de Wever,|Complete|,16.0 `[time.syn] `_,"Formatter ``chrono::month``",,Mark de Wever,|Complete|,16.0 `[time.syn] `_,"Formatter ``chrono::year``",,Mark de Wever,|Complete|,16.0 @@ -28,25 +28,6 @@ Section,Description,Dependencies,Assignee,Status,First released version `[time.syn] `_,"Formatter ``chrono::local_info``",A ```` implementation,Mark de Wever,, `[time.syn] `_,"Formatter ``chrono::zoned_time``",A ```` implementation,Mark de Wever,, -`P2286R8 `__,"Formatting ranges" -`[format.syn] `_,"Concept ``formattable``",,Mark de Wever,|Complete|,16.0 -`[format.string.std] `_,"std-format-spec ``type`` debug",,Mark de Wever,|Complete|,16.0 -`[format.range] `_,"Formatting for ranges: sequences",,Mark de Wever,|Complete|,16.0 -`[format.range.fmtmap] `_,"Formatting for ranges: map",,Mark de Wever,|Complete|,16.0 -`[format.range.fmtset] `_,"Formatting for ranges: set",,Mark de Wever,|Complete|,16.0 -`[format.range] `_,"Formatting for ranges: container adaptors",,Mark de Wever,|Complete|,16.0 -`[format.range] `_,"Formatting for ranges: ``pair`` and ``tuple``",,Mark de Wever,|Complete|,16.0 -`[format.range] `_,"Formatting for ranges: ``vector``",,Mark de Wever,|Complete|,16.0 - -"`P2585R0 `__","Improving default container formatting" -`[format.range.fmtstr] `_,"Formatting for ranges: strings",,Mark de Wever,|Complete|,17.0 -`[format.range.fmtstr] `_,"Formatting for ranges: debug_strings",,Mark de Wever,|Complete|,17.0 - "`P2693R1 `__","Formatting ``thread::id`` and ``stacktrace``" `[thread.thread.id] `_,"Formatting ``thread::id``",,Mark de Wever,|Complete|,17.0 `[stacktrace.format] `_,"Formatting ``stacktrace``",A ```` implementation,Mark de Wever,, - -"`P2093R14 `__","Formatted output" -`[print.fun] `__,"Output to ``stdout``",,Mark de Wever,|Complete|, 17.0 -`[print.fun] `__,"Output to ``FILE*``",,Mark de Wever,|Complete|, 17.0 -`[ostream.formatted.print] `__,"Output to ``ostream``",,Mark de Wever,|Complete|, 18.0 diff --git a/yass/third_party/libc++/trunk/docs/Status/SpaceshipProjects.csv b/yass/third_party/libc++/trunk/docs/Status/SpaceshipProjects.csv index c8221078e9..3d14f487d9 100644 --- a/yass/third_party/libc++/trunk/docs/Status/SpaceshipProjects.csv +++ b/yass/third_party/libc++/trunk/docs/Status/SpaceshipProjects.csv @@ -173,7 +173,7 @@ Section,Description,Dependencies,Assignee,Complete | `year_month_weekday_last `_",None,Hristo Hristov,|Complete| `[time.zone.nonmembers] `_,"`chrono::time_zone`",A ```` implementation,Mark de Wever,|Complete| `[time.zone.zonedtime.nonmembers] `_,"`chrono::zoned_time`",A ```` implementation,Mark de Wever,|In Progress| -`[time.zone.leap.nonmembers] `_,"`chrono::time_leap_seconds`",A ```` implementation,Mark de Wever,|In Progress| +`[time.zone.leap.nonmembers] `_,"`chrono::time_leap_seconds`",A ```` implementation,Mark de Wever,|Complete| `[time.zone.link.nonmembers] `_,"`chrono::time_zone_link`",A ```` implementation,Mark de Wever,|Complete| - `5.13 Clause 28: Localization library `_,,,, "| `[locale] `_ diff --git a/yass/third_party/libc++/trunk/docs/UsingLibcxx.rst b/yass/third_party/libc++/trunk/docs/UsingLibcxx.rst index ac12b0b969..bc7817d14d 100644 --- a/yass/third_party/libc++/trunk/docs/UsingLibcxx.rst +++ b/yass/third_party/libc++/trunk/docs/UsingLibcxx.rst @@ -234,7 +234,7 @@ C++17 Specific Configuration Macros C++20 Specific Configuration Macros ----------------------------------- -**_LIBCPP_ENABLE_CXX20_REMOVED_SHARED_PTR_UNIQUE** +**_LIBCPP_ENABLE_CXX20_REMOVED_SHARED_PTR_UNIQUE**: This macro is used to re-enable the function ``std::shared_ptr<...>::unique()``. @@ -267,12 +267,19 @@ C++26 Specific Configuration Macros **_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT**: This macro is used to re-enable all named declarations in ````. -**_LIBCPP_ENABLE_CXX26_REMOVED_STRING_RESERVE** +**_LIBCPP_ENABLE_CXX26_REMOVED_STRING_RESERVE**: This macro is used to re-enable the function ``std::basic_string<...>::reserve()``. **_LIBCPP_ENABLE_CXX26_REMOVED_ALLOCATOR_MEMBERS**: - This macro is used to re-enable redundant member of ``allocator::is_always_equal`` + This macro is used to re-enable redundant member of ``allocator::is_always_equal``. + +**_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM**: + This macro is used to re-enable all named declarations in ````. + +**_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT**: + This macro is used to re-enable the ``wstring_convert`` and ``wbuffer_convert`` + in ````. Libc++ Extensions ================= diff --git a/yass/third_party/libc++/trunk/docs/index.rst b/yass/third_party/libc++/trunk/docs/index.rst index aa1bd4b83b..743f99297d 100644 --- a/yass/third_party/libc++/trunk/docs/index.rst +++ b/yass/third_party/libc++/trunk/docs/index.rst @@ -66,6 +66,25 @@ Getting Started with libc++ Current Status ============== +libc++ has become the default C++ Standard Library implementation for many major platforms, including Apple's macOS, +iOS, watchOS, and tvOS, Google Search, the Android operating system, and FreeBSD. As a result, libc++ has an estimated +user base of over 1 billion daily active users. + +Since its inception, libc++ has focused on delivering high performance, standards-conformance, and portability. It has +been extensively tested and optimized, making it robust and production ready. libc++ fully implements C++11 and C++14, +with C++17, C++20, C++23, and C++26 features being actively developed and making steady progress. + +libc++ is continuously integrated and tested on a wide range of platforms and configurations, ensuring its reliability +and compatibility across various systems. The library's extensive test suite and rigorous quality assurance process have +made it a top choice for platform providers looking to offer their users a robust and efficient C++ Standard Library. + +As an open-source project, libc++ benefits from a vibrant community of contributors who work together to improve the +library and add new features. This ongoing development and support ensure that libc++ remains at the forefront of +C++ standardization efforts and continues to meet the evolving needs of C++ developers worldwide. + + +History +------- After its initial introduction, many people have asked "why start a new library instead of contributing to an existing library?" (like Apache's libstdcxx, GNU's libstdc++, STLport, etc). There are many contributing @@ -115,7 +134,7 @@ velocity, libc++ drops support for older compilers as newer ones are released. ============ =============== ========================== ===================== Compiler Versions Restrictions Support policy ============ =============== ========================== ===================== -Clang 16, 17, 18-git latest two stable releases per `LLVM's release page `_ and the development version +Clang 17, 18, 19-git latest two stable releases per `LLVM's release page `_ and the development version AppleClang 15 latest stable release per `Xcode's release page `_ Open XL 17.1 (AIX) latest stable release per `Open XL's documentation page `_ GCC 13 In C++11 or later only latest stable release per `GCC's release page `_ @@ -189,6 +208,7 @@ Design Documents DesignDocs/FeatureTestMacros DesignDocs/FileTimeType DesignDocs/HeaderRemovalPolicy + DesignDocs/NodiscardPolicy DesignDocs/NoexceptPolicy DesignDocs/PSTLIntegration DesignDocs/ThreadingSupportAPI diff --git a/yass/third_party/libc++/trunk/include/CMakeLists.txt b/yass/third_party/libc++/trunk/include/CMakeLists.txt index 07b5e974ea..d4e8c196a9 100644 --- a/yass/third_party/libc++/trunk/include/CMakeLists.txt +++ b/yass/third_party/libc++/trunk/include/CMakeLists.txt @@ -282,6 +282,7 @@ set(files __chrono/formatter.h __chrono/hh_mm_ss.h __chrono/high_resolution_clock.h + __chrono/leap_second.h __chrono/literals.h __chrono/month.h __chrono/month_weekday.h @@ -290,6 +291,7 @@ set(files __chrono/parser_std_format_spec.h __chrono/statically_widen.h __chrono/steady_clock.h + __chrono/sys_info.h __chrono/system_clock.h __chrono/time_point.h __chrono/time_zone.h @@ -394,6 +396,7 @@ set(files __format/formatter_pointer.h __format/formatter_string.h __format/formatter_tuple.h + __format/indic_conjunct_break_table.h __format/parser_std_format_spec.h __format/range_default_formatter.h __format/range_formatter.h @@ -709,12 +712,12 @@ set(files __tree __tuple/find_index.h __tuple/make_tuple_types.h - __tuple/pair_like.h __tuple/sfinae_helpers.h __tuple/tuple_element.h __tuple/tuple_indices.h __tuple/tuple_like.h __tuple/tuple_like_ext.h + __tuple/tuple_like_no_subrange.h __tuple/tuple_size.h __tuple/tuple_types.h __type_traits/add_const.h @@ -737,6 +740,7 @@ set(files __type_traits/datasizeof.h __type_traits/decay.h __type_traits/dependent_type.h + __type_traits/desugars_to.h __type_traits/disjunction.h __type_traits/enable_if.h __type_traits/extent.h @@ -821,7 +825,6 @@ set(files __type_traits/nat.h __type_traits/negation.h __type_traits/noexcept_move_assign_container.h - __type_traits/operation_traits.h __type_traits/promote.h __type_traits/rank.h __type_traits/remove_all_extents.h @@ -860,6 +863,7 @@ set(files __utility/pair.h __utility/piecewise_construct.h __utility/priority_tag.h + __utility/private_constructor_tag.h __utility/rel_ops.h __utility/small_buffer.h __utility/swap.h diff --git a/yass/third_party/libc++/trunk/include/__algorithm/comp.h b/yass/third_party/libc++/trunk/include/__algorithm/comp.h index 3902f75603..a0fa88d6d2 100644 --- a/yass/third_party/libc++/trunk/include/__algorithm/comp.h +++ b/yass/third_party/libc++/trunk/include/__algorithm/comp.h @@ -10,8 +10,7 @@ #define _LIBCPP___ALGORITHM_COMP_H #include <__config> -#include <__type_traits/integral_constant.h> -#include <__type_traits/operation_traits.h> +#include <__type_traits/desugars_to.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -27,7 +26,7 @@ struct __equal_to { }; template -struct __desugars_to<__equal_tag, __equal_to, _Tp, _Up> : true_type {}; +inline const bool __desugars_to_v<__equal_tag, __equal_to, _Tp, _Up> = true; // The definition is required because __less is part of the ABI, but it's empty // because all comparisons should be transparent. @@ -42,6 +41,9 @@ struct __less { } }; +template +inline const bool __desugars_to_v<__less_tag, __less<>, _Tp, _Tp> = true; + _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___ALGORITHM_COMP_H diff --git a/yass/third_party/libc++/trunk/include/__algorithm/equal.h b/yass/third_party/libc++/trunk/include/__algorithm/equal.h index c76a16b47f..1341d9e415 100644 --- a/yass/third_party/libc++/trunk/include/__algorithm/equal.h +++ b/yass/third_party/libc++/trunk/include/__algorithm/equal.h @@ -18,12 +18,11 @@ #include <__iterator/distance.h> #include <__iterator/iterator_traits.h> #include <__string/constexpr_c_functions.h> +#include <__type_traits/desugars_to.h> #include <__type_traits/enable_if.h> -#include <__type_traits/integral_constant.h> #include <__type_traits/is_constant_evaluated.h> #include <__type_traits/is_equality_comparable.h> #include <__type_traits/is_volatile.h> -#include <__type_traits/operation_traits.h> #include <__utility/move.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -47,7 +46,7 @@ _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 boo template ::value && !is_volatile<_Tp>::value && + __enable_if_t<__desugars_to_v<__equal_tag, _BinaryPredicate, _Tp, _Up> && !is_volatile<_Tp>::value && !is_volatile<_Up>::value && __libcpp_is_trivially_equality_comparable<_Tp, _Up>::value, int> = 0> _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool @@ -87,7 +86,7 @@ template ::value && __is_identity<_Proj1>::value && + __enable_if_t<__desugars_to_v<__equal_tag, _Pred, _Tp, _Up> && __is_identity<_Proj1>::value && __is_identity<_Proj2>::value && !is_volatile<_Tp>::value && !is_volatile<_Up>::value && __libcpp_is_trivially_equality_comparable<_Tp, _Up>::value, int> = 0> diff --git a/yass/third_party/libc++/trunk/include/__algorithm/mismatch.h b/yass/third_party/libc++/trunk/include/__algorithm/mismatch.h index 4eb693a1f2..4ada29eabc 100644 --- a/yass/third_party/libc++/trunk/include/__algorithm/mismatch.h +++ b/yass/third_party/libc++/trunk/include/__algorithm/mismatch.h @@ -11,17 +11,20 @@ #define _LIBCPP___ALGORITHM_MISMATCH_H #include <__algorithm/comp.h> +#include <__algorithm/min.h> #include <__algorithm/simd_utils.h> #include <__algorithm/unwrap_iter.h> #include <__config> #include <__functional/identity.h> +#include <__type_traits/desugars_to.h> #include <__type_traits/invoke.h> #include <__type_traits/is_constant_evaluated.h> #include <__type_traits/is_equality_comparable.h> -#include <__type_traits/operation_traits.h> +#include <__type_traits/is_integral.h> #include <__utility/move.h> #include <__utility/pair.h> #include <__utility/unreachable.h> +#include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -56,7 +59,7 @@ template ::value && __desugars_to<__equal_tag, _Pred, _Tp, _Tp>::value && + __enable_if_t::value && __desugars_to_v<__equal_tag, _Pred, _Tp, _Tp> && __is_identity<_Proj1>::value && __is_identity<_Proj2>::value, int> = 0> _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_Tp*, _Tp*> @@ -64,7 +67,10 @@ __mismatch(_Tp* __first1, _Tp* __last1, _Tp* __first2, _Pred& __pred, _Proj1& __ constexpr size_t __unroll_count = 4; constexpr size_t __vec_size = __native_vector_size<_Tp>; using __vec = __simd_vector<_Tp, __vec_size>; + if (!__libcpp_is_constant_evaluated()) { + auto __orig_first1 = __first1; + auto __last2 = __first2 + (__last1 - __first1); while (static_cast(__last1 - __first1) >= __unroll_count * __vec_size) [[__unlikely__]] { __vec __lhs[__unroll_count]; __vec __rhs[__unroll_count]; @@ -84,8 +90,32 @@ __mismatch(_Tp* __first1, _Tp* __last1, _Tp* __first2, _Pred& __pred, _Proj1& __ __first1 += __unroll_count * __vec_size; __first2 += __unroll_count * __vec_size; } + + // check the remaining 0-3 vectors + while (static_cast(__last1 - __first1) >= __vec_size) { + if (auto __cmp_res = std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2); + !std::__all_of(__cmp_res)) { + auto __offset = std::__find_first_not_set(__cmp_res); + return {__first1 + __offset, __first2 + __offset}; + } + __first1 += __vec_size; + __first2 += __vec_size; + } + + if (__last1 - __first1 == 0) + return {__first1, __first2}; + + // Check if we can load elements in front of the current pointer. If that's the case load a vector at + // (last - vector_size) to check the remaining elements + if (static_cast(__first1 - __orig_first1) >= __vec_size) { + __first1 = __last1 - __vec_size; + __first2 = __last2 - __vec_size; + auto __offset = + std::__find_first_not_set(std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2)); + return {__first1 + __offset, __first2 + __offset}; + } // else loop over the elements individually } - // TODO: Consider vectorizing the tail + return std::__mismatch_loop(__first1, __last1, __first2, __pred, __proj1, __proj2); } @@ -107,6 +137,25 @@ mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __fi } #if _LIBCPP_STD_VER >= 14 +template +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_Iter1, _Iter2> __mismatch( + _Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2, _Pred& __pred, _Proj1& __proj1, _Proj2& __proj2) { + while (__first1 != __last1 && __first2 != __last2) { + if (!std::__invoke(__pred, std::__invoke(__proj1, *__first1), std::__invoke(__proj2, *__first2))) + break; + ++__first1; + ++__first2; + } + return {std::move(__first1), std::move(__first2)}; +} + +template +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_Tp*, _Tp*> +__mismatch(_Tp* __first1, _Tp* __last1, _Tp* __first2, _Tp* __last2, _Pred& __pred, _Proj1& __proj1, _Proj2& __proj2) { + auto __len = std::min(__last1 - __first1, __last2 - __first2); + return std::__mismatch(__first1, __first1 + __len, __first2, __pred, __proj1, __proj2); +} + template _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_InputIterator1, _InputIterator2> mismatch(_InputIterator1 __first1, @@ -114,10 +163,16 @@ mismatch(_InputIterator1 __first1, _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred) { - for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void)++__first2) - if (!__pred(*__first1, *__first2)) - break; - return pair<_InputIterator1, _InputIterator2>(__first1, __first2); + __identity __proj; + auto __res = std::__mismatch( + std::__unwrap_iter(__first1), + std::__unwrap_iter(__last1), + std::__unwrap_iter(__first2), + std::__unwrap_iter(__last2), + __pred, + __proj, + __proj); + return {std::__rewrap_iter(__first1, __res.first), std::__rewrap_iter(__first2, __res.second)}; } template diff --git a/yass/third_party/libc++/trunk/include/__algorithm/pstl_backends/cpu_backends/transform_reduce.h b/yass/third_party/libc++/trunk/include/__algorithm/pstl_backends/cpu_backends/transform_reduce.h index 14a0d76741..376abd39fa 100644 --- a/yass/third_party/libc++/trunk/include/__algorithm/pstl_backends/cpu_backends/transform_reduce.h +++ b/yass/third_party/libc++/trunk/include/__algorithm/pstl_backends/cpu_backends/transform_reduce.h @@ -14,9 +14,9 @@ #include <__iterator/concepts.h> #include <__iterator/iterator_traits.h> #include <__numeric/transform_reduce.h> +#include <__type_traits/desugars_to.h> #include <__type_traits/is_arithmetic.h> #include <__type_traits/is_execution_policy.h> -#include <__type_traits/operation_traits.h> #include <__utility/move.h> #include #include @@ -37,7 +37,7 @@ template , - __enable_if_t<__desugars_to<__plus_tag, _BinaryOperation, _Tp, _UnaryResult>::value && is_arithmetic_v<_Tp> && + __enable_if_t<__desugars_to_v<__plus_tag, _BinaryOperation, _Tp, _UnaryResult> && is_arithmetic_v<_Tp> && is_arithmetic_v<_UnaryResult>, int> = 0> _LIBCPP_HIDE_FROM_ABI _Tp @@ -53,8 +53,8 @@ template , - __enable_if_t::value && - is_arithmetic_v<_Tp> && is_arithmetic_v<_UnaryResult>), + __enable_if_t && is_arithmetic_v<_Tp> && + is_arithmetic_v<_UnaryResult>), int> = 0> _LIBCPP_HIDE_FROM_ABI _Tp __simd_transform_reduce(_Size __n, _Tp __init, _BinaryOperation __binary_op, _UnaryOperation __f) noexcept { diff --git a/yass/third_party/libc++/trunk/include/__algorithm/ranges_contains_subrange.h b/yass/third_party/libc++/trunk/include/__algorithm/ranges_contains_subrange.h index 4cd03cbb53..bc5a86ce3d 100644 --- a/yass/third_party/libc++/trunk/include/__algorithm/ranges_contains_subrange.h +++ b/yass/third_party/libc++/trunk/include/__algorithm/ranges_contains_subrange.h @@ -15,11 +15,11 @@ #include <__functional/ranges_operations.h> #include <__functional/reference_wrapper.h> #include <__iterator/concepts.h> -#include <__iterator/distance.h> #include <__iterator/indirectly_comparable.h> #include <__iterator/projected.h> #include <__ranges/access.h> #include <__ranges/concepts.h> +#include <__ranges/size.h> #include <__ranges/subrange.h> #include <__utility/move.h> @@ -53,8 +53,7 @@ struct __fn { _Pred __pred = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) { - auto __n2 = ranges::distance(__first2, __last2); - if (__n2 == 0) + if (__first2 == __last2) return true; auto __ret = ranges::search( @@ -70,14 +69,13 @@ struct __fn { requires indirectly_comparable, iterator_t<_Range2>, _Pred, _Proj1, _Proj2> _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr bool static operator()(_Range1&& __range1, _Range2&& __range2, _Pred __pred = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) { - auto __n2 = 0; if constexpr (sized_range<_Range2>) { - __n2 = ranges::size(__range2); + if (ranges::size(__range2) == 0) + return true; } else { - __n2 = std::distance(cbegin(__range2), cend(__range2)); + if (ranges::begin(__range2) == ranges::end(__range2)) + return true; } - if (__n2 == 0) - return true; auto __ret = ranges::search(__range1, __range2, __pred, std::ref(__proj1), std::ref(__proj2)); return __ret.empty() == false; diff --git a/yass/third_party/libc++/trunk/include/__algorithm/ranges_minmax.h b/yass/third_party/libc++/trunk/include/__algorithm/ranges_minmax.h index 22a62b620c..ca57225233 100644 --- a/yass/third_party/libc++/trunk/include/__algorithm/ranges_minmax.h +++ b/yass/third_party/libc++/trunk/include/__algorithm/ranges_minmax.h @@ -23,7 +23,9 @@ #include <__iterator/projected.h> #include <__ranges/access.h> #include <__ranges/concepts.h> +#include <__type_traits/desugars_to.h> #include <__type_traits/is_reference.h> +#include <__type_traits/is_trivially_copyable.h> #include <__type_traits/remove_cvref.h> #include <__utility/forward.h> #include <__utility/move.h> @@ -83,7 +85,20 @@ struct __fn { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__first != __last, "range has to contain at least one element"); - if constexpr (forward_range<_Range>) { + // This optimiation is not in minmax_element because clang doesn't see through the pointers and as a result doesn't + // vectorize the code. + if constexpr (contiguous_range<_Range> && is_integral_v<_ValueT> && + __is_cheap_to_copy<_ValueT> & __is_identity<_Proj>::value && + __desugars_to_v<__less_tag, _Comp, _ValueT, _ValueT>) { + minmax_result<_ValueT> __result = {__r[0], __r[0]}; + for (auto __e : __r) { + if (__e < __result.min) + __result.min = __e; + if (__result.max < __e) + __result.max = __e; + } + return __result; + } else if constexpr (forward_range<_Range>) { // Special-case the one element case. Avoid repeatedly initializing objects from the result of an iterator // dereference when doing so might not be idempotent. The `if constexpr` avoids the extra branch in cases where // it's not needed. diff --git a/yass/third_party/libc++/trunk/include/__algorithm/ranges_mismatch.h b/yass/third_party/libc++/trunk/include/__algorithm/ranges_mismatch.h index 037af39126..d8a7dd43af 100644 --- a/yass/third_party/libc++/trunk/include/__algorithm/ranges_mismatch.h +++ b/yass/third_party/libc++/trunk/include/__algorithm/ranges_mismatch.h @@ -10,6 +10,8 @@ #define _LIBCPP___ALGORITHM_RANGES_MISMATCH_H #include <__algorithm/in_in_result.h> +#include <__algorithm/mismatch.h> +#include <__algorithm/unwrap_range.h> #include <__config> #include <__functional/identity.h> #include <__functional/invoke.h> @@ -42,13 +44,17 @@ struct __fn { template static _LIBCPP_HIDE_FROM_ABI constexpr mismatch_result<_I1, _I2> __go(_I1 __first1, _S1 __last1, _I2 __first2, _S2 __last2, _Pred& __pred, _Proj1& __proj1, _Proj2& __proj2) { - while (__first1 != __last1 && __first2 != __last2) { - if (!std::invoke(__pred, std::invoke(__proj1, *__first1), std::invoke(__proj2, *__first2))) - break; - ++__first1; - ++__first2; + if constexpr (forward_iterator<_I1> && forward_iterator<_I2>) { + auto __range1 = std::__unwrap_range(__first1, __last1); + auto __range2 = std::__unwrap_range(__first2, __last2); + auto __res = + std::__mismatch(__range1.first, __range1.second, __range2.first, __range2.second, __pred, __proj1, __proj2); + return {std::__rewrap_range<_S1>(__first1, __res.first), std::__rewrap_range<_S2>(__first2, __res.second)}; + } else { + auto __res = std::__mismatch( + std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), __pred, __proj1, __proj2); + return {std::move(__res.first), std::move(__res.second)}; } - return {std::move(__first1), std::move(__first2)}; } template requires indirectly_comparable, iterator_t<_R2>, _Pred, _Proj1, _Proj2> - _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr mismatch_result, - borrowed_iterator_t<_R2>> + _LIBCPP_NODISCARD_EXT + _LIBCPP_HIDE_FROM_ABI constexpr mismatch_result, borrowed_iterator_t<_R2>> operator()(_R1&& __r1, _R2&& __r2, _Pred __pred = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const { return __go( ranges::begin(__r1), ranges::end(__r1), ranges::begin(__r2), ranges::end(__r2), __pred, __proj1, __proj2); diff --git a/yass/third_party/libc++/trunk/include/__algorithm/simd_utils.h b/yass/third_party/libc++/trunk/include/__algorithm/simd_utils.h index 1aedb3db01..8d540ae2cc 100644 --- a/yass/third_party/libc++/trunk/include/__algorithm/simd_utils.h +++ b/yass/third_party/libc++/trunk/include/__algorithm/simd_utils.h @@ -9,6 +9,7 @@ #ifndef _LIBCPP___ALGORITHM_SIMD_UTILS_H #define _LIBCPP___ALGORITHM_SIMD_UTILS_H +#include <__algorithm/min.h> #include <__bit/bit_cast.h> #include <__bit/countr.h> #include <__config> @@ -22,8 +23,11 @@ # pragma GCC system_header #endif +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + // TODO: Find out how altivec changes things and allow vectorizations there too. -#if _LIBCPP_STD_VER >= 14 && defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER >= 1700 && !defined(__ALTIVEC__) +#if _LIBCPP_STD_VER >= 14 && defined(_LIBCPP_CLANG_VER) && !defined(__ALTIVEC__) # define _LIBCPP_HAS_ALGORITHM_VECTOR_UTILS 1 #else # define _LIBCPP_HAS_ALGORITHM_VECTOR_UTILS 0 @@ -94,7 +98,8 @@ _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI size_t __find_first_set(__simd_vector<_T // This has MSan disabled du to https://github.com/llvm/llvm-project/issues/85876 auto __impl = [&](_MaskT) _LIBCPP_NO_SANITIZE("memory") noexcept { - return std::__countr_zero(__builtin_bit_cast(_MaskT, __builtin_convertvector(__vec, __mask_vec))); + return std::min( + _Np, std::__countr_zero(__builtin_bit_cast(_MaskT, __builtin_convertvector(__vec, __mask_vec)))); }; if constexpr (sizeof(__mask_vec) == sizeof(uint8_t)) { @@ -120,4 +125,6 @@ _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP_HAS_ALGORITHM_VECTOR_UTILS +_LIBCPP_POP_MACROS + #endif // _LIBCPP___ALGORITHM_SIMD_UTILS_H diff --git a/yass/third_party/libc++/trunk/include/__bit/countl.h b/yass/third_party/libc++/trunk/include/__bit/countl.h index 396cfc2c3f..13df8d4e66 100644 --- a/yass/third_party/libc++/trunk/include/__bit/countl.h +++ b/yass/third_party/libc++/trunk/include/__bit/countl.h @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO: __builtin_clzg is available since Clang 19 and GCC 14. When support for older versions is dropped, we can +// refactor this code to exclusively use __builtin_clzg. + #ifndef _LIBCPP___BIT_COUNTL_H #define _LIBCPP___BIT_COUNTL_H @@ -38,6 +41,9 @@ _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_cl #ifndef _LIBCPP_HAS_NO_INT128 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_clz(__uint128_t __x) _NOEXCEPT { +# if __has_builtin(__builtin_clzg) + return __builtin_clzg(__x); +# else // The function is written in this form due to C++ constexpr limitations. // The algorithm: // - Test whether any bit in the high 64-bits is set @@ -49,12 +55,16 @@ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_clz(__uint128_t __x) // zeros in the high 64-bits. return ((__x >> 64) == 0) ? (64 + __builtin_clzll(static_cast(__x))) : __builtin_clzll(static_cast(__x >> 64)); +# endif } #endif // _LIBCPP_HAS_NO_INT128 template _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 int __countl_zero(_Tp __t) _NOEXCEPT { static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__countl_zero requires an unsigned integer type"); +#if __has_builtin(__builtin_clzg) + return __builtin_clzg(__t, numeric_limits<_Tp>::digits); +#else // __has_builtin(__builtin_clzg) if (__t == 0) return numeric_limits<_Tp>::digits; @@ -79,6 +89,7 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 int __countl_zero(_Tp __t) _ } return __ret + __iter; } +#endif // __has_builtin(__builtin_clzg) } #if _LIBCPP_STD_VER >= 20 diff --git a/yass/third_party/libc++/trunk/include/__bit/countr.h b/yass/third_party/libc++/trunk/include/__bit/countr.h index b6b3ac52ca..724a0bc238 100644 --- a/yass/third_party/libc++/trunk/include/__bit/countr.h +++ b/yass/third_party/libc++/trunk/include/__bit/countr.h @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO: __builtin_ctzg is available since Clang 19 and GCC 14. When support for older versions is dropped, we can +// refactor this code to exclusively use __builtin_ctzg. + #ifndef _LIBCPP___BIT_COUNTR_H #define _LIBCPP___BIT_COUNTR_H @@ -37,9 +40,11 @@ _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_ct template _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 int __countr_zero(_Tp __t) _NOEXCEPT { +#if __has_builtin(__builtin_ctzg) + return __builtin_ctzg(__t, numeric_limits<_Tp>::digits); +#else // __has_builtin(__builtin_ctzg) if (__t == 0) return numeric_limits<_Tp>::digits; - if (sizeof(_Tp) <= sizeof(unsigned int)) return std::__libcpp_ctz(static_cast(__t)); else if (sizeof(_Tp) <= sizeof(unsigned long)) @@ -55,6 +60,7 @@ _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 int __coun } return __ret + std::__libcpp_ctz(static_cast(__t)); } +#endif // __has_builtin(__builtin_ctzg) } #if _LIBCPP_STD_VER >= 20 diff --git a/yass/third_party/libc++/trunk/include/__bit/popcount.h b/yass/third_party/libc++/trunk/include/__bit/popcount.h index b0319cef25..37b3a3e1f3 100644 --- a/yass/third_party/libc++/trunk/include/__bit/popcount.h +++ b/yass/third_party/libc++/trunk/include/__bit/popcount.h @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO: __builtin_popcountg is available since Clang 19 and GCC 14. When support for older versions is dropped, we can +// refactor this code to exclusively use __builtin_popcountg. + #ifndef _LIBCPP___BIT_POPCOUNT_H #define _LIBCPP___BIT_POPCOUNT_H @@ -39,6 +42,9 @@ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_popcount(unsigned lo template <__libcpp_unsigned_integer _Tp> _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr int popcount(_Tp __t) noexcept { +# if __has_builtin(__builtin_popcountg) + return __builtin_popcountg(__t); +# else // __has_builtin(__builtin_popcountg) if (sizeof(_Tp) <= sizeof(unsigned int)) return std::__libcpp_popcount(static_cast(__t)); else if (sizeof(_Tp) <= sizeof(unsigned long)) @@ -53,6 +59,7 @@ _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr int popcount(_Tp __t) noex } return __ret; } +# endif // __has_builtin(__builtin_popcountg) } #endif // _LIBCPP_STD_VER >= 20 diff --git a/yass/third_party/libc++/trunk/include/__chrono/leap_second.h b/yass/third_party/libc++/trunk/include/__chrono/leap_second.h new file mode 100644 index 0000000000..557abc15ff --- /dev/null +++ b/yass/third_party/libc++/trunk/include/__chrono/leap_second.h @@ -0,0 +1,126 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// For information see https://libcxx.llvm.org/DesignDocs/TimeZone.html + +#ifndef _LIBCPP___CHRONO_LEAP_SECOND_H +#define _LIBCPP___CHRONO_LEAP_SECOND_H + +#include +// Enable the contents of the header only when libc++ was built with experimental features enabled. +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB) + +# include <__chrono/duration.h> +# include <__chrono/system_clock.h> +# include <__chrono/time_point.h> +# include <__compare/ordering.h> +# include <__compare/three_way_comparable.h> +# include <__config> +# include <__utility/private_constructor_tag.h> + +# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +# endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +# if _LIBCPP_STD_VER >= 20 + +namespace chrono { + +class leap_second { +public: + [[nodiscard]] + _LIBCPP_HIDE_FROM_ABI explicit constexpr leap_second(__private_constructor_tag, sys_seconds __date, seconds __value) + : __date_(__date), __value_(__value) {} + + _LIBCPP_HIDE_FROM_ABI leap_second(const leap_second&) = default; + _LIBCPP_HIDE_FROM_ABI leap_second& operator=(const leap_second&) = default; + + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr sys_seconds date() const noexcept { return __date_; } + + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr seconds value() const noexcept { return __value_; } + +private: + sys_seconds __date_; + seconds __value_; +}; + +_LIBCPP_HIDE_FROM_ABI inline constexpr bool operator==(const leap_second& __x, const leap_second& __y) { + return __x.date() == __y.date(); +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr strong_ordering operator<=>(const leap_second& __x, const leap_second& __y) { + return __x.date() <=> __y.date(); +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool operator==(const leap_second& __x, const sys_time<_Duration>& __y) { + return __x.date() == __y; +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool operator<(const leap_second& __x, const sys_time<_Duration>& __y) { + return __x.date() < __y; +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool operator<(const sys_time<_Duration>& __x, const leap_second& __y) { + return __x < __y.date(); +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool operator>(const leap_second& __x, const sys_time<_Duration>& __y) { + return __y < __x; +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool operator>(const sys_time<_Duration>& __x, const leap_second& __y) { + return __y < __x; +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool operator<=(const leap_second& __x, const sys_time<_Duration>& __y) { + return !(__y < __x); +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool operator<=(const sys_time<_Duration>& __x, const leap_second& __y) { + return !(__y < __x); +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool operator>=(const leap_second& __x, const sys_time<_Duration>& __y) { + return !(__x < __y); +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool operator>=(const sys_time<_Duration>& __x, const leap_second& __y) { + return !(__x < __y); +} + +# ifndef _LIBCPP_COMPILER_GCC +// This requirement cause a compilation loop in GCC-13 and running out of memory. +// TODO TZDB Test whether GCC-14 fixes this. +template + requires three_way_comparable_with> +_LIBCPP_HIDE_FROM_ABI constexpr auto operator<=>(const leap_second& __x, const sys_time<_Duration>& __y) { + return __x.date() <=> __y; +} +# endif + +} // namespace chrono + +# endif //_LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB) + +#endif // _LIBCPP___CHRONO_LEAP_SECOND_H diff --git a/yass/third_party/libc++/trunk/include/__chrono/sys_info.h b/yass/third_party/libc++/trunk/include/__chrono/sys_info.h new file mode 100644 index 0000000000..794d22f2cc --- /dev/null +++ b/yass/third_party/libc++/trunk/include/__chrono/sys_info.h @@ -0,0 +1,51 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// For information see https://libcxx.llvm.org/DesignDocs/TimeZone.html + +#ifndef _LIBCPP___CHRONO_SYS_INFO_H +#define _LIBCPP___CHRONO_SYS_INFO_H + +#include +// Enable the contents of the header only when libc++ was built with experimental features enabled. +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB) + +# include <__chrono/duration.h> +# include <__chrono/system_clock.h> +# include <__chrono/time_point.h> +# include <__config> +# include + +# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +# endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +# if _LIBCPP_STD_VER >= 20 + +namespace chrono { + +struct sys_info { + sys_seconds begin; + sys_seconds end; + seconds offset; + minutes save; + string abbrev; +}; + +} // namespace chrono + +# endif //_LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB) + +#endif // _LIBCPP___CHRONO_SYS_INFO_H diff --git a/yass/third_party/libc++/trunk/include/__chrono/time_zone.h b/yass/third_party/libc++/trunk/include/__chrono/time_zone.h index 7d97327a6c..8e30034b79 100644 --- a/yass/third_party/libc++/trunk/include/__chrono/time_zone.h +++ b/yass/third_party/libc++/trunk/include/__chrono/time_zone.h @@ -16,6 +16,9 @@ // Enable the contents of the header only when libc++ was built with experimental features enabled. #if !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB) +# include <__chrono/duration.h> +# include <__chrono/sys_info.h> +# include <__chrono/system_clock.h> # include <__compare/strong_order.h> # include <__config> # include <__memory/unique_ptr.h> @@ -55,10 +58,18 @@ public: _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI string_view name() const noexcept { return __name(); } + template + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI sys_info get_info(const sys_time<_Duration>& __time) const { + return __get_info(chrono::time_point_cast(__time)); + } + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI const __impl& __implementation() const noexcept { return *__impl_; } private: [[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI string_view __name() const noexcept; + + [[nodiscard]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI sys_info __get_info(sys_seconds __time) const; + unique_ptr<__impl> __impl_; }; diff --git a/yass/third_party/libc++/trunk/include/__chrono/time_zone_link.h b/yass/third_party/libc++/trunk/include/__chrono/time_zone_link.h index 17e915d267..c76ddeff9f 100644 --- a/yass/third_party/libc++/trunk/include/__chrono/time_zone_link.h +++ b/yass/third_party/libc++/trunk/include/__chrono/time_zone_link.h @@ -18,6 +18,7 @@ # include <__compare/strong_order.h> # include <__config> +# include <__utility/private_constructor_tag.h> # include # include @@ -37,9 +38,8 @@ namespace chrono { class time_zone_link { public: - struct __constructor_tag; _LIBCPP_NODISCARD_EXT - _LIBCPP_HIDE_FROM_ABI explicit time_zone_link(__constructor_tag&&, string_view __name, string_view __target) + _LIBCPP_HIDE_FROM_ABI explicit time_zone_link(__private_constructor_tag, string_view __name, string_view __target) : __name_{__name}, __target_{__target} {} _LIBCPP_HIDE_FROM_ABI time_zone_link(time_zone_link&&) = default; diff --git a/yass/third_party/libc++/trunk/include/__chrono/tzdb.h b/yass/third_party/libc++/trunk/include/__chrono/tzdb.h index 582172e5df..e0bfedf0d7 100644 --- a/yass/third_party/libc++/trunk/include/__chrono/tzdb.h +++ b/yass/third_party/libc++/trunk/include/__chrono/tzdb.h @@ -16,6 +16,8 @@ // Enable the contents of the header only when libc++ was built with experimental features enabled. #if !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB) +# include <__algorithm/ranges_lower_bound.h> +# include <__chrono/leap_second.h> # include <__chrono/time_zone.h> # include <__chrono/time_zone_link.h> # include <__config> @@ -40,6 +42,42 @@ struct tzdb { string version; vector zones; vector links; + + vector leap_seconds; + + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI const time_zone* __locate_zone(string_view __name) const { + if (const time_zone* __result = __find_in_zone(__name)) + return __result; + + if (auto __it = ranges::lower_bound(links, __name, {}, &time_zone_link::name); + __it != links.end() && __it->name() == __name) + if (const time_zone* __result = __find_in_zone(__it->target())) + return __result; + + return nullptr; + } + + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI const time_zone* locate_zone(string_view __name) const { + if (const time_zone* __result = __locate_zone(__name)) + return __result; + + std::__throw_runtime_error("tzdb: requested time zone not found"); + } + + _LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI const time_zone* current_zone() const { + return __current_zone(); + } + +private: + _LIBCPP_HIDE_FROM_ABI const time_zone* __find_in_zone(string_view __name) const noexcept { + if (auto __it = ranges::lower_bound(zones, __name, {}, &time_zone::name); + __it != zones.end() && __it->name() == __name) + return std::addressof(*__it); + + return nullptr; + } + + [[nodiscard]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI const time_zone* __current_zone() const; }; } // namespace chrono diff --git a/yass/third_party/libc++/trunk/include/__chrono/tzdb_list.h b/yass/third_party/libc++/trunk/include/__chrono/tzdb_list.h index e8aaf31e36..693899d372 100644 --- a/yass/third_party/libc++/trunk/include/__chrono/tzdb_list.h +++ b/yass/third_party/libc++/trunk/include/__chrono/tzdb_list.h @@ -17,6 +17,7 @@ #if !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB) # include <__availability> +# include <__chrono/time_zone.h> # include <__chrono/tzdb.h> # include <__config> # include <__fwd/string.h> @@ -84,6 +85,15 @@ _LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI inline con return get_tzdb_list().front(); } +_LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI inline const time_zone* +locate_zone(string_view __name) { + return get_tzdb().locate_zone(__name); +} + +_LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI inline const time_zone* current_zone() { + return get_tzdb().current_zone(); +} + _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI const tzdb& reload_tzdb(); _LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI string remote_version(); diff --git a/yass/third_party/libc++/trunk/include/__config b/yass/third_party/libc++/trunk/include/__config index 8550b1da4a..d98b54926b 100644 --- a/yass/third_party/libc++/trunk/include/__config +++ b/yass/third_party/libc++/trunk/include/__config @@ -44,8 +44,8 @@ // Warn if a compiler version is used that is not supported anymore // LLVM RELEASE Update the minimum compiler versions # if defined(_LIBCPP_CLANG_VER) -# if _LIBCPP_CLANG_VER < 1600 -# warning "Libc++ only supports Clang 16 and later" +# if _LIBCPP_CLANG_VER < 1700 +# warning "Libc++ only supports Clang 17 and later" # endif # elif defined(_LIBCPP_APPLE_CLANG_VER) # if _LIBCPP_APPLE_CLANG_VER < 1500 diff --git a/yass/third_party/libc++/trunk/include/__exception/operations.h b/yass/third_party/libc++/trunk/include/__exception/operations.h index 8f374c0cce..0a9c7a7c7f 100644 --- a/yass/third_party/libc++/trunk/include/__exception/operations.h +++ b/yass/third_party/libc++/trunk/include/__exception/operations.h @@ -9,7 +9,6 @@ #ifndef _LIBCPP___EXCEPTION_OPERATIONS_H #define _LIBCPP___EXCEPTION_OPERATIONS_H -#include <__availability> #include <__config> #include diff --git a/yass/third_party/libc++/trunk/include/__expected/bad_expected_access.h b/yass/third_party/libc++/trunk/include/__expected/bad_expected_access.h index 27f01d9350..9d490307b6 100644 --- a/yass/third_party/libc++/trunk/include/__expected/bad_expected_access.h +++ b/yass/third_party/libc++/trunk/include/__expected/bad_expected_access.h @@ -27,15 +27,17 @@ _LIBCPP_BEGIN_NAMESPACE_STD template class bad_expected_access; +_LIBCPP_DIAGNOSTIC_PUSH +_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wweak-vtables") template <> class bad_expected_access : public exception { protected: - _LIBCPP_HIDE_FROM_ABI bad_expected_access() noexcept = default; - _LIBCPP_HIDE_FROM_ABI bad_expected_access(const bad_expected_access&) = default; - _LIBCPP_HIDE_FROM_ABI bad_expected_access(bad_expected_access&&) = default; - _LIBCPP_HIDE_FROM_ABI bad_expected_access& operator=(const bad_expected_access&) = default; - _LIBCPP_HIDE_FROM_ABI bad_expected_access& operator=(bad_expected_access&&) = default; - _LIBCPP_HIDE_FROM_ABI_VIRTUAL ~bad_expected_access() override = default; + _LIBCPP_HIDE_FROM_ABI bad_expected_access() noexcept = default; + _LIBCPP_HIDE_FROM_ABI bad_expected_access(const bad_expected_access&) noexcept = default; + _LIBCPP_HIDE_FROM_ABI bad_expected_access(bad_expected_access&&) noexcept = default; + _LIBCPP_HIDE_FROM_ABI bad_expected_access& operator=(const bad_expected_access&) noexcept = default; + _LIBCPP_HIDE_FROM_ABI bad_expected_access& operator=(bad_expected_access&&) noexcept = default; + _LIBCPP_HIDE_FROM_ABI_VIRTUAL ~bad_expected_access() override = default; public: // The way this has been designed (by using a class template below) means that we'll already @@ -44,6 +46,7 @@ public: // it adds deployment target restrictions. _LIBCPP_HIDE_FROM_ABI_VIRTUAL const char* what() const noexcept override { return "bad access to std::expected"; } }; +_LIBCPP_DIAGNOSTIC_POP template class bad_expected_access : public bad_expected_access { diff --git a/yass/third_party/libc++/trunk/include/__filesystem/copy_options.h b/yass/third_party/libc++/trunk/include/__filesystem/copy_options.h index 1bf71292c8..097eebe611 100644 --- a/yass/third_party/libc++/trunk/include/__filesystem/copy_options.h +++ b/yass/third_party/libc++/trunk/include/__filesystem/copy_options.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FILESYSTEM_COPY_OPTIONS_H #define _LIBCPP___FILESYSTEM_COPY_OPTIONS_H -#include <__availability> #include <__config> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) diff --git a/yass/third_party/libc++/trunk/include/__filesystem/directory_options.h b/yass/third_party/libc++/trunk/include/__filesystem/directory_options.h index 683c4678e0..d0cd3ebfda 100644 --- a/yass/third_party/libc++/trunk/include/__filesystem/directory_options.h +++ b/yass/third_party/libc++/trunk/include/__filesystem/directory_options.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FILESYSTEM_DIRECTORY_OPTIONS_H #define _LIBCPP___FILESYSTEM_DIRECTORY_OPTIONS_H -#include <__availability> #include <__config> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) diff --git a/yass/third_party/libc++/trunk/include/__filesystem/file_status.h b/yass/third_party/libc++/trunk/include/__filesystem/file_status.h index 3e2b32eef8..da316c8b02 100644 --- a/yass/third_party/libc++/trunk/include/__filesystem/file_status.h +++ b/yass/third_party/libc++/trunk/include/__filesystem/file_status.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FILESYSTEM_FILE_STATUS_H #define _LIBCPP___FILESYSTEM_FILE_STATUS_H -#include <__availability> #include <__config> #include <__filesystem/file_type.h> #include <__filesystem/perms.h> diff --git a/yass/third_party/libc++/trunk/include/__filesystem/file_time_type.h b/yass/third_party/libc++/trunk/include/__filesystem/file_time_type.h index e086dbcc3f..63e4ae1578 100644 --- a/yass/third_party/libc++/trunk/include/__filesystem/file_time_type.h +++ b/yass/third_party/libc++/trunk/include/__filesystem/file_time_type.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FILESYSTEM_FILE_TIME_TYPE_H #define _LIBCPP___FILESYSTEM_FILE_TIME_TYPE_H -#include <__availability> #include <__chrono/file_clock.h> #include <__chrono/time_point.h> #include <__config> diff --git a/yass/third_party/libc++/trunk/include/__filesystem/file_type.h b/yass/third_party/libc++/trunk/include/__filesystem/file_type.h index c509085d90..e4ac1dfee9 100644 --- a/yass/third_party/libc++/trunk/include/__filesystem/file_type.h +++ b/yass/third_party/libc++/trunk/include/__filesystem/file_type.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FILESYSTEM_FILE_TYPE_H #define _LIBCPP___FILESYSTEM_FILE_TYPE_H -#include <__availability> #include <__config> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) diff --git a/yass/third_party/libc++/trunk/include/__filesystem/perm_options.h b/yass/third_party/libc++/trunk/include/__filesystem/perm_options.h index 529ef13558..64c16ee60a 100644 --- a/yass/third_party/libc++/trunk/include/__filesystem/perm_options.h +++ b/yass/third_party/libc++/trunk/include/__filesystem/perm_options.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FILESYSTEM_PERM_OPTIONS_H #define _LIBCPP___FILESYSTEM_PERM_OPTIONS_H -#include <__availability> #include <__config> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) diff --git a/yass/third_party/libc++/trunk/include/__filesystem/perms.h b/yass/third_party/libc++/trunk/include/__filesystem/perms.h index 8f5f9a7e82..458f1e6e53 100644 --- a/yass/third_party/libc++/trunk/include/__filesystem/perms.h +++ b/yass/third_party/libc++/trunk/include/__filesystem/perms.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FILESYSTEM_PERMS_H #define _LIBCPP___FILESYSTEM_PERMS_H -#include <__availability> #include <__config> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) diff --git a/yass/third_party/libc++/trunk/include/__filesystem/space_info.h b/yass/third_party/libc++/trunk/include/__filesystem/space_info.h index 2e80ae3b2c..3fa57d3309 100644 --- a/yass/third_party/libc++/trunk/include/__filesystem/space_info.h +++ b/yass/third_party/libc++/trunk/include/__filesystem/space_info.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FILESYSTEM_SPACE_INFO_H #define _LIBCPP___FILESYSTEM_SPACE_INFO_H -#include <__availability> #include <__config> #include diff --git a/yass/third_party/libc++/trunk/include/__format/escaped_output_table.h b/yass/third_party/libc++/trunk/include/__format/escaped_output_table.h index e9f4a6e4f6..b194f9431c 100644 --- a/yass/third_party/libc++/trunk/include/__format/escaped_output_table.h +++ b/yass/third_party/libc++/trunk/include/__format/escaped_output_table.h @@ -110,7 +110,7 @@ namespace __escaped_output_table { /// - bits [0, 10] The size of the range, allowing 2048 elements. /// - bits [11, 31] The lower bound code point of the range. The upper bound of /// the range is lower bound + size. -_LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[893] = { +_LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[894] = { 0x00000020, 0x0003f821, 0x00056800, @@ -464,14 +464,14 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[893] = { 0x0174d000, 0x0177a00b, 0x017eb019, - 0x017fe004, + 0x01800000, 0x01815005, 0x01820000, 0x0184b803, 0x01880004, 0x01898000, 0x018c7800, - 0x018f200b, + 0x018f200a, 0x0190f800, 0x05246802, 0x05263808, @@ -1000,8 +1000,9 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[893] = { 0x15b9d005, 0x15c0f001, 0x1675100d, - 0x175f0fff, - 0x179f0c1e, + 0x175f080e, + 0x1772f7ff, + 0x17b2f1a1, 0x17d0f5e1, 0x189a5804}; diff --git a/yass/third_party/libc++/trunk/include/__format/format_args.h b/yass/third_party/libc++/trunk/include/__format/format_args.h index 79fe51f96c..a5fde36a29 100644 --- a/yass/third_party/libc++/trunk/include/__format/format_args.h +++ b/yass/third_party/libc++/trunk/include/__format/format_args.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FORMAT_FORMAT_ARGS_H #define _LIBCPP___FORMAT_FORMAT_ARGS_H -#include <__availability> #include <__config> #include <__format/format_arg.h> #include <__format/format_arg_store.h> diff --git a/yass/third_party/libc++/trunk/include/__format/format_context.h b/yass/third_party/libc++/trunk/include/__format/format_context.h index bf603c5c62..087d4bf289 100644 --- a/yass/third_party/libc++/trunk/include/__format/format_context.h +++ b/yass/third_party/libc++/trunk/include/__format/format_context.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FORMAT_FORMAT_CONTEXT_H #define _LIBCPP___FORMAT_FORMAT_CONTEXT_H -#include <__availability> #include <__concepts/same_as.h> #include <__config> #include <__format/buffer.h> diff --git a/yass/third_party/libc++/trunk/include/__format/formatter.h b/yass/third_party/libc++/trunk/include/__format/formatter.h index 47e35789b8..e2f418f936 100644 --- a/yass/third_party/libc++/trunk/include/__format/formatter.h +++ b/yass/third_party/libc++/trunk/include/__format/formatter.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FORMAT_FORMATTER_H #define _LIBCPP___FORMAT_FORMATTER_H -#include <__availability> #include <__config> #include <__fwd/format.h> diff --git a/yass/third_party/libc++/trunk/include/__format/formatter_bool.h b/yass/third_party/libc++/trunk/include/__format/formatter_bool.h index 5e3daff7b3..17dc69541e 100644 --- a/yass/third_party/libc++/trunk/include/__format/formatter_bool.h +++ b/yass/third_party/libc++/trunk/include/__format/formatter_bool.h @@ -12,7 +12,6 @@ #include <__algorithm/copy.h> #include <__assert> -#include <__availability> #include <__config> #include <__format/concepts.h> #include <__format/format_parse_context.h> diff --git a/yass/third_party/libc++/trunk/include/__format/formatter_char.h b/yass/third_party/libc++/trunk/include/__format/formatter_char.h index 3358d42225..d33e84368a 100644 --- a/yass/third_party/libc++/trunk/include/__format/formatter_char.h +++ b/yass/third_party/libc++/trunk/include/__format/formatter_char.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FORMAT_FORMATTER_CHAR_H #define _LIBCPP___FORMAT_FORMATTER_CHAR_H -#include <__availability> #include <__concepts/same_as.h> #include <__config> #include <__format/concepts.h> diff --git a/yass/third_party/libc++/trunk/include/__format/formatter_floating_point.h b/yass/third_party/libc++/trunk/include/__format/formatter_floating_point.h index 1d94cc349c..fa42ba203b 100644 --- a/yass/third_party/libc++/trunk/include/__format/formatter_floating_point.h +++ b/yass/third_party/libc++/trunk/include/__format/formatter_floating_point.h @@ -690,7 +690,7 @@ __format_floating_point(_Tp __value, _FormatContext& __ctx, __format_spec::__par // Let P equal the precision if nonzero, 6 if the precision is not // specified, or 1 if the precision is 0. Then, if a conversion with // style E would have an exponent of X: - int __p = std::max(1, (__specs.__has_precision() ? __specs.__precision_ : 6)); + int __p = std::max(1, (__specs.__has_precision() ? __specs.__precision_ : 6)); if (__result.__exponent == __result.__last) // if P > X >= -4, the conversion is with style f or F and precision P - 1 - X. // By including the radix point it calculates P - (1 + X) diff --git a/yass/third_party/libc++/trunk/include/__format/formatter_integer.h b/yass/third_party/libc++/trunk/include/__format/formatter_integer.h index d57082b388..41400f0047 100644 --- a/yass/third_party/libc++/trunk/include/__format/formatter_integer.h +++ b/yass/third_party/libc++/trunk/include/__format/formatter_integer.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FORMAT_FORMATTER_INTEGER_H #define _LIBCPP___FORMAT_FORMATTER_INTEGER_H -#include <__availability> #include <__concepts/arithmetic.h> #include <__config> #include <__format/concepts.h> diff --git a/yass/third_party/libc++/trunk/include/__format/formatter_pointer.h b/yass/third_party/libc++/trunk/include/__format/formatter_pointer.h index 3373996ec3..6941343efd 100644 --- a/yass/third_party/libc++/trunk/include/__format/formatter_pointer.h +++ b/yass/third_party/libc++/trunk/include/__format/formatter_pointer.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FORMAT_FORMATTER_POINTER_H #define _LIBCPP___FORMAT_FORMATTER_POINTER_H -#include <__availability> #include <__config> #include <__format/concepts.h> #include <__format/format_parse_context.h> diff --git a/yass/third_party/libc++/trunk/include/__format/formatter_string.h b/yass/third_party/libc++/trunk/include/__format/formatter_string.h index d1ccfb9b5f..347439fc8d 100644 --- a/yass/third_party/libc++/trunk/include/__format/formatter_string.h +++ b/yass/third_party/libc++/trunk/include/__format/formatter_string.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FORMAT_FORMATTER_STRING_H #define _LIBCPP___FORMAT_FORMATTER_STRING_H -#include <__availability> #include <__config> #include <__format/concepts.h> #include <__format/format_parse_context.h> diff --git a/yass/third_party/libc++/trunk/include/__format/indic_conjunct_break_table.h b/yass/third_party/libc++/trunk/include/__format/indic_conjunct_break_table.h new file mode 100644 index 0000000000..44521d2749 --- /dev/null +++ b/yass/third_party/libc++/trunk/include/__format/indic_conjunct_break_table.h @@ -0,0 +1,350 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// WARNING, this entire header is generated by +// utils/generate_indic_conjunct_break_table.py +// DO NOT MODIFY! + +// UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE +// +// See Terms of Use +// for definitions of Unicode Inc.'s Data Files and Software. +// +// NOTICE TO USER: Carefully read the following legal agreement. +// BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S +// DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), +// YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +// TERMS AND CONDITIONS OF THIS AGREEMENT. +// IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE +// THE DATA FILES OR SOFTWARE. +// +// COPYRIGHT AND PERMISSION NOTICE +// +// Copyright (c) 1991-2022 Unicode, Inc. All rights reserved. +// Distributed under the Terms of Use in https://www.unicode.org/copyright.html. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Unicode data files and any associated documentation +// (the "Data Files") or Unicode software and any associated documentation +// (the "Software") to deal in the Data Files or Software +// without restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, and/or sell copies of +// the Data Files or Software, and to permit persons to whom the Data Files +// or Software are furnished to do so, provided that either +// (a) this copyright and permission notice appear with all copies +// of the Data Files or Software, or +// (b) this copyright and permission notice appear in associated +// Documentation. +// +// THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT OF THIRD PARTY RIGHTS. +// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +// NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +// DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THE DATA FILES OR SOFTWARE. +// +// Except as contained in this notice, the name of a copyright holder +// shall not be used in advertising or otherwise to promote the sale, +// use or other dealings in these Data Files or Software without prior +// written authorization of the copyright holder. + +#ifndef _LIBCPP___FORMAT_INDIC_CONJUNCT_BREAK_TABLE_H +#define _LIBCPP___FORMAT_INDIC_CONJUNCT_BREAK_TABLE_H + +#include <__algorithm/ranges_upper_bound.h> +#include <__config> +#include <__iterator/access.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER >= 20 + +namespace __indic_conjunct_break { + +enum class __property : uint8_t { + // Values generated from the data files. + __Consonant, + __Extend, + __Linker, + + // The code unit has none of above properties. + __none +}; + +/// The entries of the indic conjunct break property table. +/// +/// The data is generated from +/// - https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt +/// +/// The data has 3 values +/// - bits [0, 1] The property. One of the values generated from the datafiles +/// of \ref __property +/// - bits [2, 10] The size of the range. +/// - bits [11, 31] The lower bound code point of the range. The upper bound of +/// the range is lower bound + size. +/// +/// The 9 bits for the size allow a maximum range of 512 elements. Some ranges +/// in the Unicode tables are larger. They are stored in multiple consecutive +/// ranges in the data table. An alternative would be to store the sizes in a +/// separate 16-bit value. The original MSVC STL code had such an approach, but +/// this approach uses less space for the data and is about 4% faster in the +/// following benchmark. +/// libcxx/benchmarks/std_format_spec_string_unicode.bench.cpp +// clang-format off +_LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[201] = { + 0x00180139, + 0x001a807d, + 0x00241811, + 0x002c88b1, + 0x002df801, + 0x002e0805, + 0x002e2005, + 0x002e3801, + 0x00308029, + 0x00325851, + 0x00338001, + 0x0036b019, + 0x0036f815, + 0x00373805, + 0x0037500d, + 0x00388801, + 0x00398069, + 0x003f5821, + 0x003fe801, + 0x0040b00d, + 0x0040d821, + 0x00412809, + 0x00414811, + 0x0042c809, + 0x0044c01d, + 0x0046505d, + 0x00471871, + 0x0048a890, + 0x0049e001, + 0x004a6802, + 0x004a880d, + 0x004ac01c, + 0x004bc01c, + 0x004ca84c, + 0x004d5018, + 0x004d9000, + 0x004db00c, + 0x004de001, + 0x004e6802, + 0x004ee004, + 0x004ef800, + 0x004f8004, + 0x004ff001, + 0x0051e001, + 0x0054a84c, + 0x00555018, + 0x00559004, + 0x0055a810, + 0x0055e001, + 0x00566802, + 0x0057c800, + 0x0058a84c, + 0x00595018, + 0x00599004, + 0x0059a810, + 0x0059e001, + 0x005a6802, + 0x005ae004, + 0x005af800, + 0x005b8800, + 0x0060a84c, + 0x0061503c, + 0x0061e001, + 0x00626802, + 0x0062a805, + 0x0062c008, + 0x0065e001, + 0x0068a894, + 0x0069d805, + 0x006a6802, + 0x0071c009, + 0x0072400d, + 0x0075c009, + 0x0076400d, + 0x0078c005, + 0x0079a801, + 0x0079b801, + 0x0079c801, + 0x007b8805, + 0x007ba001, + 0x007bd00d, + 0x007c0001, + 0x007c1009, + 0x007c3005, + 0x007e3001, + 0x0081b801, + 0x0081c805, + 0x00846801, + 0x009ae809, + 0x00b8a001, + 0x00be9001, + 0x00bee801, + 0x00c54801, + 0x00c9c809, + 0x00d0b805, + 0x00d30001, + 0x00d3a81d, + 0x00d3f801, + 0x00d58035, + 0x00d5f83d, + 0x00d9a001, + 0x00db5821, + 0x00dd5801, + 0x00df3001, + 0x00e1b801, + 0x00e68009, + 0x00e6a031, + 0x00e71019, + 0x00e76801, + 0x00e7a001, + 0x00e7c005, + 0x00ee00fd, + 0x01006801, + 0x01068031, + 0x01070801, + 0x0107282d, + 0x01677809, + 0x016bf801, + 0x016f007d, + 0x01815015, + 0x0184c805, + 0x05337801, + 0x0533a025, + 0x0534f005, + 0x05378005, + 0x05416001, + 0x05470045, + 0x05495809, + 0x054d9801, + 0x05558001, + 0x05559009, + 0x0555b805, + 0x0555f005, + 0x05560801, + 0x0557b001, + 0x055f6801, + 0x07d8f001, + 0x07f1003d, + 0x080fe801, + 0x08170001, + 0x081bb011, + 0x08506801, + 0x08507801, + 0x0851c009, + 0x0851f801, + 0x08572805, + 0x0869200d, + 0x08755805, + 0x0877e809, + 0x087a3029, + 0x087c100d, + 0x08838001, + 0x0883f801, + 0x0885d001, + 0x08880009, + 0x08899805, + 0x088b9801, + 0x088e5001, + 0x0891b001, + 0x08974805, + 0x0899d805, + 0x089b3019, + 0x089b8011, + 0x08a23001, + 0x08a2f001, + 0x08a61801, + 0x08ae0001, + 0x08b5b801, + 0x08b95801, + 0x08c1d001, + 0x08c9f001, + 0x08ca1801, + 0x08d1a001, + 0x08d23801, + 0x08d4c801, + 0x08ea1001, + 0x08ea2005, + 0x08ecb801, + 0x08fa1001, + 0x0b578011, + 0x0b598019, + 0x0de4f001, + 0x0e8b2801, + 0x0e8b3809, + 0x0e8b7011, + 0x0e8bd81d, + 0x0e8c2819, + 0x0e8d500d, + 0x0e921009, + 0x0f000019, + 0x0f004041, + 0x0f00d819, + 0x0f011805, + 0x0f013011, + 0x0f047801, + 0x0f098019, + 0x0f157001, + 0x0f17600d, + 0x0f27600d, + 0x0f468019, + 0x0f4a2019}; +// clang-format on + +/// Returns the indic conjuct break property of a code point. +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr __property __get_property(const char32_t __code_point) noexcept { + // The algorithm searches for the upper bound of the range and, when found, + // steps back one entry. This algorithm is used since the code point can be + // anywhere in the range. After a lower bound is found the next step is to + // compare whether the code unit is indeed in the range. + // + // Since the entry contains a code unit, size, and property the code point + // being sought needs to be adjusted. Just shifting the code point to the + // proper position doesn't work; suppose an entry has property 0, size 1, + // and lower bound 3. This results in the entry 0x1810. + // When searching for code point 3 it will search for 0x1800, find 0x1810 + // and moves to the previous entry. Thus the lower bound value will never + // be found. + // The simple solution is to set the bits belonging to the property and + // size. Then the upper bound for code point 3 will return the entry after + // 0x1810. After moving to the previous entry the algorithm arrives at the + // correct entry. + ptrdiff_t __i = std::ranges::upper_bound(__entries, (__code_point << 11) | 0x7ffu) - __entries; + if (__i == 0) + return __property::__none; + + --__i; + uint32_t __upper_bound = (__entries[__i] >> 11) + ((__entries[__i] >> 2) & 0b1'1111'1111); + if (__code_point <= __upper_bound) + return static_cast<__property>(__entries[__i] & 0b11); + + return __property::__none; +} + +} // namespace __indic_conjunct_break + +#endif //_LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_INDIC_CONJUNCT_BREAK_TABLE_H diff --git a/yass/third_party/libc++/trunk/include/__format/unicode.h b/yass/third_party/libc++/trunk/include/__format/unicode.h index 40067ca344..de7d0fea1d 100644 --- a/yass/third_party/libc++/trunk/include/__format/unicode.h +++ b/yass/third_party/libc++/trunk/include/__format/unicode.h @@ -15,8 +15,10 @@ #include <__concepts/same_as.h> #include <__config> #include <__format/extended_grapheme_cluster_table.h> +#include <__format/indic_conjunct_break_table.h> #include <__iterator/concepts.h> #include <__iterator/readable_traits.h> // iter_value_t +#include <__utility/unreachable.h> #include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -292,84 +294,231 @@ private: }; # endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS -_LIBCPP_HIDE_FROM_ABI constexpr bool __at_extended_grapheme_cluster_break( - bool& __ri_break_allowed, - bool __has_extened_pictographic, - __extended_grapheme_custer_property_boundary::__property __prev, - __extended_grapheme_custer_property_boundary::__property __next) { - using __extended_grapheme_custer_property_boundary::__property; +// State machine to implement the Extended Grapheme Cluster Boundary +// +// The exact rules may change between Unicode versions. +// This implements the extended rules see +// https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries +class __extended_grapheme_cluster_break { + using __EGC_property = __extended_grapheme_custer_property_boundary::__property; + using __inCB_property = __indic_conjunct_break::__property; - __has_extened_pictographic |= __prev == __property::__Extended_Pictographic; - - // https://www.unicode.org/reports/tr29/tr29-39.html#Grapheme_Cluster_Boundary_Rules - - // *** Break at the start and end of text, unless the text is empty. *** - - _LIBCPP_ASSERT_INTERNAL(__prev != __property::__sot, "should be handled in the constructor"); // GB1 - _LIBCPP_ASSERT_INTERNAL(__prev != __property::__eot, "should be handled by our caller"); // GB2 - - // *** Do not break between a CR and LF. Otherwise, break before and after controls. *** - if (__prev == __property::__CR && __next == __property::__LF) // GB3 - return false; - - if (__prev == __property::__Control || __prev == __property::__CR || __prev == __property::__LF) // GB4 - return true; - - if (__next == __property::__Control || __next == __property::__CR || __next == __property::__LF) // GB5 - return true; - - // *** Do not break Hangul syllable sequences. *** - if (__prev == __property::__L && (__next == __property::__L || __next == __property::__V || - __next == __property::__LV || __next == __property::__LVT)) // GB6 - return false; - - if ((__prev == __property::__LV || __prev == __property::__V) && - (__next == __property::__V || __next == __property::__T)) // GB7 - return false; - - if ((__prev == __property::__LVT || __prev == __property::__T) && __next == __property::__T) // GB8 - return false; - - // *** Do not break before extending characters or ZWJ. *** - if (__next == __property::__Extend || __next == __property::__ZWJ) - return false; // GB9 - - // *** Do not break before SpacingMarks, or after Prepend characters. *** - if (__next == __property::__SpacingMark) // GB9a - return false; - - if (__prev == __property::__Prepend) // GB9b - return false; - - // *** Do not break within emoji modifier sequences or emoji zwj sequences. *** - - // GB11 \p{Extended_Pictographic} Extend* ZWJ x \p{Extended_Pictographic} - // - // Note that several parts of this rule are matched by GB9: Any x (Extend | ZWJ) - // - \p{Extended_Pictographic} x Extend - // - Extend x Extend - // - \p{Extended_Pictographic} x ZWJ - // - Extend x ZWJ - // - // So the only case left to test is - // - \p{Extended_Pictographic}' x ZWJ x \p{Extended_Pictographic} - // where \p{Extended_Pictographic}' is stored in __has_extened_pictographic - if (__has_extened_pictographic && __prev == __property::__ZWJ && __next == __property::__Extended_Pictographic) - return false; - - // *** Do not break within emoji flag sequences *** - - // That is, do not break between regional indicator (RI) symbols if there - // is an odd number of RI characters before the break point. - - if (__prev == __property::__Regional_Indicator && __next == __property::__Regional_Indicator) { // GB12 + GB13 - __ri_break_allowed = !__ri_break_allowed; - return __ri_break_allowed; +public: + _LIBCPP_HIDE_FROM_ABI constexpr explicit __extended_grapheme_cluster_break(char32_t __first_code_point) + : __prev_code_point_(__first_code_point), + __prev_property_(__extended_grapheme_custer_property_boundary::__get_property(__first_code_point)) { + // Initializes the active rule. + if (__prev_property_ == __EGC_property::__Extended_Pictographic) + __active_rule_ = __rule::__GB11_emoji; + else if (__prev_property_ == __EGC_property::__Regional_Indicator) + __active_rule_ = __rule::__GB12_GB13_regional_indicator; + else if (__indic_conjunct_break::__get_property(__first_code_point) == __inCB_property::__Consonant) + __active_rule_ = __rule::__GB9c_indic_conjunct_break; } - // *** Otherwise, break everywhere. *** - return true; // GB999 -} + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool operator()(char32_t __next_code_point) { + __EGC_property __next_property = __extended_grapheme_custer_property_boundary::__get_property(__next_code_point); + bool __result = __evaluate(__next_code_point, __next_property); + __prev_code_point_ = __next_code_point; + __prev_property_ = __next_property; + return __result; + } + + // The code point whose break propery are considered during the next + // evaluation cyle. + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr char32_t __current_code_point() const { return __prev_code_point_; } + +private: + // The naming of the identifiers matches the Unicode standard. + // NOLINTBEGIN(readability-identifier-naming) + + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool + __evaluate(char32_t __next_code_point, __EGC_property __next_property) { + switch (__active_rule_) { + case __rule::__none: + return __evaluate_none(__next_code_point, __next_property); + case __rule::__GB9c_indic_conjunct_break: + return __evaluate_GB9c_indic_conjunct_break(__next_code_point, __next_property); + case __rule::__GB11_emoji: + return __evaluate_GB11_emoji(__next_code_point, __next_property); + case __rule::__GB12_GB13_regional_indicator: + return __evaluate_GB12_GB13_regional_indicator(__next_code_point, __next_property); + } + __libcpp_unreachable(); + } + + _LIBCPP_HIDE_FROM_ABI constexpr bool __evaluate_none(char32_t __next_code_point, __EGC_property __next_property) { + // *** Break at the start and end of text, unless the text is empty. *** + + _LIBCPP_ASSERT_INTERNAL(__prev_property_ != __EGC_property::__sot, "should be handled in the constructor"); // GB1 + _LIBCPP_ASSERT_INTERNAL(__prev_property_ != __EGC_property::__eot, "should be handled by our caller"); // GB2 + + // *** Do not break between a CR and LF. Otherwise, break before and after controls. *** + if (__prev_property_ == __EGC_property::__CR && __next_property == __EGC_property::__LF) // GB3 + return false; + + if (__prev_property_ == __EGC_property::__Control || __prev_property_ == __EGC_property::__CR || + __prev_property_ == __EGC_property::__LF) // GB4 + return true; + + if (__next_property == __EGC_property::__Control || __next_property == __EGC_property::__CR || + __next_property == __EGC_property::__LF) // GB5 + return true; + + // *** Do not break Hangul syllable sequences. *** + if (__prev_property_ == __EGC_property::__L && + (__next_property == __EGC_property::__L || __next_property == __EGC_property::__V || + __next_property == __EGC_property::__LV || __next_property == __EGC_property::__LVT)) // GB6 + return false; + + if ((__prev_property_ == __EGC_property::__LV || __prev_property_ == __EGC_property::__V) && + (__next_property == __EGC_property::__V || __next_property == __EGC_property::__T)) // GB7 + return false; + + if ((__prev_property_ == __EGC_property::__LVT || __prev_property_ == __EGC_property::__T) && + __next_property == __EGC_property::__T) // GB8 + return false; + + // *** Do not break before extending characters or ZWJ. *** + if (__next_property == __EGC_property::__Extend || __next_property == __EGC_property::__ZWJ) + return false; // GB9 + + // *** Do not break before SpacingMarks, or after Prepend characters. *** + if (__next_property == __EGC_property::__SpacingMark) // GB9a + return false; + + if (__prev_property_ == __EGC_property::__Prepend) // GB9b + return false; + + // *** Do not break within certain combinations with Indic_Conjunct_Break (InCB)=Linker. *** + if (__indic_conjunct_break::__get_property(__next_code_point) == __inCB_property::__Consonant) { + __active_rule_ = __rule::__GB9c_indic_conjunct_break; + __GB9c_indic_conjunct_break_state_ = __GB9c_indic_conjunct_break_state::__Consonant; + return true; + } + + // *** Do not break within emoji modifier sequences or emoji zwj sequences. *** + if (__next_property == __EGC_property::__Extended_Pictographic) { + __active_rule_ = __rule::__GB11_emoji; + __GB11_emoji_state_ = __GB11_emoji_state::__Extended_Pictographic; + return true; + } + + // *** Do not break within emoji flag sequences *** + + // That is, do not break between regional indicator (RI) symbols if there + // is an odd number of RI characters before the break point. + if (__next_property == __EGC_property::__Regional_Indicator) { // GB12 + GB13 + __active_rule_ = __rule::__GB12_GB13_regional_indicator; + return true; + } + + // *** Otherwise, break everywhere. *** + return true; // GB999 + } + + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool + __evaluate_GB9c_indic_conjunct_break(char32_t __next_code_point, __EGC_property __next_property) { + __inCB_property __break = __indic_conjunct_break::__get_property(__next_code_point); + if (__break == __inCB_property::__none) { + __active_rule_ = __rule::__none; + return __evaluate_none(__next_code_point, __next_property); + } + + switch (__GB9c_indic_conjunct_break_state_) { + case __GB9c_indic_conjunct_break_state::__Consonant: + if (__break == __inCB_property::__Extend) { + return false; + } + if (__break == __inCB_property::__Linker) { + __GB9c_indic_conjunct_break_state_ = __GB9c_indic_conjunct_break_state::__Linker; + return false; + } + __active_rule_ = __rule::__none; + return __evaluate_none(__next_code_point, __next_property); + + case __GB9c_indic_conjunct_break_state::__Linker: + if (__break == __inCB_property::__Extend) { + return false; + } + if (__break == __inCB_property::__Linker) { + return false; + } + if (__break == __inCB_property::__Consonant) { + __GB9c_indic_conjunct_break_state_ = __GB9c_indic_conjunct_break_state::__Consonant; + return false; + } + __active_rule_ = __rule::__none; + return __evaluate_none(__next_code_point, __next_property); + } + __libcpp_unreachable(); + } + + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool + __evaluate_GB11_emoji(char32_t __next_code_point, __EGC_property __next_property) { + switch (__GB11_emoji_state_) { + case __GB11_emoji_state::__Extended_Pictographic: + if (__next_property == __EGC_property::__Extend) { + __GB11_emoji_state_ = __GB11_emoji_state::__Extend; + return false; + } + [[fallthrough]]; + case __GB11_emoji_state::__Extend: + if (__next_property == __EGC_property::__ZWJ) { + __GB11_emoji_state_ = __GB11_emoji_state::__ZWJ; + return false; + } + if (__next_property == __EGC_property::__Extend) + return false; + __active_rule_ = __rule::__none; + return __evaluate_none(__next_code_point, __next_property); + + case __GB11_emoji_state::__ZWJ: + if (__next_property == __EGC_property::__Extended_Pictographic) { + __GB11_emoji_state_ = __GB11_emoji_state::__Extended_Pictographic; + return false; + } + __active_rule_ = __rule::__none; + return __evaluate_none(__next_code_point, __next_property); + } + __libcpp_unreachable(); + } + + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool + __evaluate_GB12_GB13_regional_indicator(char32_t __next_code_point, __EGC_property __next_property) { + __active_rule_ = __rule::__none; + if (__next_property == __EGC_property::__Regional_Indicator) + return false; + return __evaluate_none(__next_code_point, __next_property); + } + + char32_t __prev_code_point_; + __EGC_property __prev_property_; + + enum class __rule { + __none, + __GB9c_indic_conjunct_break, + __GB11_emoji, + __GB12_GB13_regional_indicator, + }; + __rule __active_rule_ = __rule::__none; + + enum class __GB11_emoji_state { + __Extended_Pictographic, + __Extend, + __ZWJ, + }; + __GB11_emoji_state __GB11_emoji_state_ = __GB11_emoji_state::__Extended_Pictographic; + + enum class __GB9c_indic_conjunct_break_state { + __Consonant, + __Linker, + }; + + __GB9c_indic_conjunct_break_state __GB9c_indic_conjunct_break_state_ = __GB9c_indic_conjunct_break_state::__Consonant; + + // NOLINTEND(readability-identifier-naming) +}; /// Helper class to extract an extended grapheme cluster from a Unicode character range. /// @@ -382,9 +531,7 @@ class __extended_grapheme_cluster_view { public: _LIBCPP_HIDE_FROM_ABI constexpr explicit __extended_grapheme_cluster_view(_Iterator __first, _Iterator __last) - : __code_point_view_(__first, __last), - __next_code_point_(__code_point_view_.__consume().__code_point), - __next_prop_(__extended_grapheme_custer_property_boundary::__get_property(__next_code_point_)) {} + : __code_point_view_(__first, __last), __at_break_(__code_point_view_.__consume().__code_point) {} struct __cluster { /// The first code point of the extended grapheme cluster. @@ -400,44 +547,20 @@ public: _Iterator __last_; }; - _LIBCPP_HIDE_FROM_ABI constexpr __cluster __consume() { - _LIBCPP_ASSERT_INTERNAL(__next_prop_ != __extended_grapheme_custer_property_boundary::__property::__eot, - "can't move beyond the end of input"); - - char32_t __code_point = __next_code_point_; - if (!__code_point_view_.__at_end()) - return {__code_point, __get_break()}; - - __next_prop_ = __extended_grapheme_custer_property_boundary::__property::__eot; - return {__code_point, __code_point_view_.__position()}; + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr __cluster __consume() { + char32_t __code_point = __at_break_.__current_code_point(); + _Iterator __position = __code_point_view_.__position(); + while (!__code_point_view_.__at_end()) { + if (__at_break_(__code_point_view_.__consume().__code_point)) + break; + __position = __code_point_view_.__position(); + } + return {__code_point, __position}; } private: __code_point_view<_CharT> __code_point_view_; - - char32_t __next_code_point_; - __extended_grapheme_custer_property_boundary::__property __next_prop_; - - _LIBCPP_HIDE_FROM_ABI constexpr _Iterator __get_break() { - bool __ri_break_allowed = true; - bool __has_extened_pictographic = false; - while (true) { - _Iterator __result = __code_point_view_.__position(); - __extended_grapheme_custer_property_boundary::__property __prev = __next_prop_; - if (__code_point_view_.__at_end()) { - __next_prop_ = __extended_grapheme_custer_property_boundary::__property::__eot; - return __result; - } - __next_code_point_ = __code_point_view_.__consume().__code_point; - __next_prop_ = __extended_grapheme_custer_property_boundary::__get_property(__next_code_point_); - - __has_extened_pictographic |= - __prev == __extended_grapheme_custer_property_boundary::__property::__Extended_Pictographic; - - if (__at_extended_grapheme_cluster_break(__ri_break_allowed, __has_extened_pictographic, __prev, __next_prop_)) - return __result; - } - } + __extended_grapheme_cluster_break __at_break_; }; template diff --git a/yass/third_party/libc++/trunk/include/__format/width_estimation_table.h b/yass/third_party/libc++/trunk/include/__format/width_estimation_table.h index 6309483367..c9a9f6719c 100644 --- a/yass/third_party/libc++/trunk/include/__format/width_estimation_table.h +++ b/yass/third_party/libc++/trunk/include/__format/width_estimation_table.h @@ -119,7 +119,7 @@ namespace __width_estimation_table { /// - bits [0, 13] The size of the range, allowing 16384 elements. /// - bits [14, 31] The lower bound code point of the range. The upper bound of /// the range is lower bound + size. -_LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[108] = { +_LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[107] = { 0x0440005f /* 00001100 - 0000115f [ 96] */, // 0x08c68001 /* 0000231a - 0000231b [ 2] */, // 0x08ca4001 /* 00002329 - 0000232a [ 2] */, // @@ -158,14 +158,13 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[108] = { 0x0ba00019 /* 00002e80 - 00002e99 [ 26] */, // 0x0ba6c058 /* 00002e9b - 00002ef3 [ 89] */, // 0x0bc000d5 /* 00002f00 - 00002fd5 [ 214] */, // - 0x0bfc000b /* 00002ff0 - 00002ffb [ 12] */, // - 0x0c00003e /* 00003000 - 0000303e [ 63] */, // + 0x0bfc004e /* 00002ff0 - 0000303e [ 79] */, // 0x0c104055 /* 00003041 - 00003096 [ 86] */, // 0x0c264066 /* 00003099 - 000030ff [ 103] */, // 0x0c41402a /* 00003105 - 0000312f [ 43] */, // 0x0c4c405d /* 00003131 - 0000318e [ 94] */, // 0x0c640053 /* 00003190 - 000031e3 [ 84] */, // - 0x0c7c002e /* 000031f0 - 0000321e [ 47] */, // + 0x0c7bc02f /* 000031ef - 0000321e [ 48] */, // 0x0c880027 /* 00003220 - 00003247 [ 40] */, // 0x0c943fff /* 00003250 - 0000724f [16384] */, // 0x1c94323c /* 00007250 - 0000a48c [12861] */, // diff --git a/yass/third_party/libc++/trunk/include/__functional/bind_back.h b/yass/third_party/libc++/trunk/include/__functional/bind_back.h index ce26d3b706..3c42d4769e 100644 --- a/yass/third_party/libc++/trunk/include/__functional/bind_back.h +++ b/yass/third_party/libc++/trunk/include/__functional/bind_back.h @@ -62,6 +62,20 @@ _LIBCPP_HIDE_FROM_ABI constexpr auto __bind_back(_Fn&& __f, _Args&&... __args) n std::forward<_Fn>(__f), std::forward_as_tuple(std::forward<_Args>(__args)...)); } +# if _LIBCPP_STD_VER >= 23 +template +_LIBCPP_HIDE_FROM_ABI constexpr auto bind_back(_Fn&& __f, _Args&&... __args) { + static_assert(is_constructible_v, _Fn>, "bind_back requires decay_t to be constructible from F"); + static_assert(is_move_constructible_v>, "bind_back requires decay_t to be move constructible"); + static_assert((is_constructible_v, _Args> && ...), + "bind_back requires all decay_t to be constructible from respective Args"); + static_assert((is_move_constructible_v> && ...), + "bind_back requires all decay_t to be move constructible"); + return __bind_back_t, tuple...>>( + std::forward<_Fn>(__f), std::forward_as_tuple(std::forward<_Args>(__args)...)); +} +# endif // _LIBCPP_STD_VER >= 23 + #endif // _LIBCPP_STD_VER >= 20 _LIBCPP_END_NAMESPACE_STD diff --git a/yass/third_party/libc++/trunk/include/__functional/operations.h b/yass/third_party/libc++/trunk/include/__functional/operations.h index 7ddc00650f..240f127e54 100644 --- a/yass/third_party/libc++/trunk/include/__functional/operations.h +++ b/yass/third_party/libc++/trunk/include/__functional/operations.h @@ -13,8 +13,7 @@ #include <__config> #include <__functional/binary_function.h> #include <__functional/unary_function.h> -#include <__type_traits/integral_constant.h> -#include <__type_traits/operation_traits.h> +#include <__type_traits/desugars_to.h> #include <__utility/forward.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -41,10 +40,10 @@ _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(plus); // The non-transparent std::plus specialization is only equivalent to a raw plus // operator when we don't perform an implicit conversion when calling it. template -struct __desugars_to<__plus_tag, plus<_Tp>, _Tp, _Tp> : true_type {}; +inline const bool __desugars_to_v<__plus_tag, plus<_Tp>, _Tp, _Tp> = true; template -struct __desugars_to<__plus_tag, plus, _Tp, _Up> : true_type {}; +inline const bool __desugars_to_v<__plus_tag, plus, _Tp, _Up> = true; #if _LIBCPP_STD_VER >= 14 template <> @@ -315,11 +314,11 @@ struct _LIBCPP_TEMPLATE_VIS equal_to { // The non-transparent std::equal_to specialization is only equivalent to a raw equality // comparison when we don't perform an implicit conversion when calling it. template -struct __desugars_to<__equal_tag, equal_to<_Tp>, _Tp, _Tp> : true_type {}; +inline const bool __desugars_to_v<__equal_tag, equal_to<_Tp>, _Tp, _Tp> = true; // In the transparent case, we do not enforce that template -struct __desugars_to<__equal_tag, equal_to, _Tp, _Up> : true_type {}; +inline const bool __desugars_to_v<__equal_tag, equal_to, _Tp, _Up> = true; #if _LIBCPP_STD_VER >= 14 template @@ -360,6 +359,9 @@ struct _LIBCPP_TEMPLATE_VIS less : __binary_function<_Tp, _Tp, bool> { }; _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(less); +template +inline const bool __desugars_to_v<__less_tag, less<_Tp>, _Tp, _Tp> = true; + #if _LIBCPP_STD_VER >= 14 template <> struct _LIBCPP_TEMPLATE_VIS less { @@ -371,6 +373,9 @@ struct _LIBCPP_TEMPLATE_VIS less { } typedef void is_transparent; }; + +template +inline const bool __desugars_to_v<__less_tag, less<>, _Tp, _Tp> = true; #endif #if _LIBCPP_STD_VER >= 14 diff --git a/yass/third_party/libc++/trunk/include/__functional/ranges_operations.h b/yass/third_party/libc++/trunk/include/__functional/ranges_operations.h index 38b2801804..27f06eadd0 100644 --- a/yass/third_party/libc++/trunk/include/__functional/ranges_operations.h +++ b/yass/third_party/libc++/trunk/include/__functional/ranges_operations.h @@ -13,8 +13,7 @@ #include <__concepts/equality_comparable.h> #include <__concepts/totally_ordered.h> #include <__config> -#include <__type_traits/integral_constant.h> -#include <__type_traits/operation_traits.h> +#include <__type_traits/desugars_to.h> #include <__utility/forward.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -98,7 +97,10 @@ struct greater_equal { // For ranges we do not require that the types on each side of the equality // operator are of the same type template -struct __desugars_to<__equal_tag, ranges::equal_to, _Tp, _Up> : true_type {}; +inline const bool __desugars_to_v<__equal_tag, ranges::equal_to, _Tp, _Up> = true; + +template +inline const bool __desugars_to_v<__less_tag, ranges::less, _Tp, _Up> = true; #endif // _LIBCPP_STD_VER >= 20 diff --git a/yass/third_party/libc++/trunk/include/__fwd/format.h b/yass/third_party/libc++/trunk/include/__fwd/format.h index 6f5c712437..b30c220f8a 100644 --- a/yass/third_party/libc++/trunk/include/__fwd/format.h +++ b/yass/third_party/libc++/trunk/include/__fwd/format.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___FWD_FORMAT_H #define _LIBCPP___FWD_FORMAT_H -#include <__availability> #include <__config> #include <__iterator/concepts.h> diff --git a/yass/third_party/libc++/trunk/include/__iterator/advance.h b/yass/third_party/libc++/trunk/include/__iterator/advance.h index 7959bdeae3..296db1aaab 100644 --- a/yass/third_party/libc++/trunk/include/__iterator/advance.h +++ b/yass/third_party/libc++/trunk/include/__iterator/advance.h @@ -170,14 +170,14 @@ public: } else { // Otherwise, if `n` is non-negative, while `bool(i != bound_sentinel)` is true, increments `i` but at // most `n` times. - while (__i != __bound_sentinel && __n > 0) { + while (__n > 0 && __i != __bound_sentinel) { ++__i; --__n; } // Otherwise, while `bool(i != bound_sentinel)` is true, decrements `i` but at most `-n` times. if constexpr (bidirectional_iterator<_Ip> && same_as<_Ip, _Sp>) { - while (__i != __bound_sentinel && __n < 0) { + while (__n < 0 && __i != __bound_sentinel) { --__i; ++__n; } diff --git a/yass/third_party/libc++/trunk/include/__locale b/yass/third_party/libc++/trunk/include/__locale index 2186db8493..36ac099d65 100644 --- a/yass/third_party/libc++/trunk/include/__locale +++ b/yass/third_party/libc++/trunk/include/__locale @@ -10,13 +10,13 @@ #ifndef _LIBCPP___LOCALE #define _LIBCPP___LOCALE -#include <__availability> #include <__config> #include <__locale_dir/locale_base_api.h> #include <__memory/shared_ptr.h> // __shared_count #include <__mutex/once_flag.h> #include <__type_traits/make_unsigned.h> #include <__utility/no_destroy.h> +#include <__utility/private_constructor_tag.h> #include #include #include @@ -98,8 +98,7 @@ private: template friend struct __no_destroy; - struct __private_tag {}; - _LIBCPP_HIDE_FROM_ABI explicit locale(__private_tag, __imp* __loc) : __locale_(__loc) {} + _LIBCPP_HIDE_FROM_ABI explicit locale(__private_constructor_tag, __imp* __loc) : __locale_(__loc) {} void __install_ctor(const locale&, facet*, long); static locale& __global(); @@ -1249,10 +1248,10 @@ extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname; #endif -extern template class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS - codecvt_byname; // deprecated in C++20 -extern template class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS - codecvt_byname; // deprecated in C++20 +extern template class _LIBCPP_DEPRECATED_IN_CXX20 +_LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname; // deprecated in C++20 +extern template class _LIBCPP_DEPRECATED_IN_CXX20 +_LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname; // deprecated in C++20 #ifndef _LIBCPP_HAS_NO_CHAR8_T extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname; // C++20 extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname; // C++20 diff --git a/yass/third_party/libc++/trunk/include/__memory/construct_at.h b/yass/third_party/libc++/trunk/include/__memory/construct_at.h index 91d17134db..eb02132480 100644 --- a/yass/third_party/libc++/trunk/include/__memory/construct_at.h +++ b/yass/third_party/libc++/trunk/include/__memory/construct_at.h @@ -44,7 +44,7 @@ _LIBCPP_HIDE_FROM_ABI constexpr _Tp* construct_at(_Tp* __location, _Args&&... __ #endif template ()) _Tp(std::declval<_Args>()...))> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* __construct_at(_Tp* __location, _Args&&... __args) { +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp* __construct_at(_Tp* __location, _Args&&... __args) { #if _LIBCPP_STD_VER >= 20 return std::construct_at(__location, std::forward<_Args>(__args)...); #else diff --git a/yass/third_party/libc++/trunk/include/__memory/shared_ptr.h b/yass/third_party/libc++/trunk/include/__memory/shared_ptr.h index 794a794d8f..a8ff189df2 100644 --- a/yass/third_party/libc++/trunk/include/__memory/shared_ptr.h +++ b/yass/third_party/libc++/trunk/include/__memory/shared_ptr.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___MEMORY_SHARED_PTR_H #define _LIBCPP___MEMORY_SHARED_PTR_H -#include <__availability> #include <__compare/compare_three_way.h> #include <__compare/ordering.h> #include <__config> diff --git a/yass/third_party/libc++/trunk/include/__memory/uses_allocator_construction.h b/yass/third_party/libc++/trunk/include/__memory/uses_allocator_construction.h index 71ae5bcd32..9b7262bec5 100644 --- a/yass/third_party/libc++/trunk/include/__memory/uses_allocator_construction.h +++ b/yass/third_party/libc++/trunk/include/__memory/uses_allocator_construction.h @@ -12,7 +12,7 @@ #include <__config> #include <__memory/construct_at.h> #include <__memory/uses_allocator.h> -#include <__tuple/pair_like.h> +#include <__tuple/tuple_like_no_subrange.h> #include <__type_traits/enable_if.h> #include <__type_traits/is_same.h> #include <__type_traits/remove_cv.h> @@ -128,11 +128,7 @@ __uses_allocator_construction_args(const _Alloc& __alloc, const pair<_Up, _Vp>&& std::forward_as_tuple(std::get<1>(std::move(__pair)))); } -template < class _Pair, - class _Alloc, - __pair_like _PairLike, - __enable_if_t<__is_cv_std_pair<_Pair> && !__is_specialization_of_subrange>::value, - int> = 0> +template , int> = 0> _LIBCPP_HIDE_FROM_ABI constexpr auto __uses_allocator_construction_args(const _Alloc& __alloc, _PairLike&& __p) noexcept { return std::__uses_allocator_construction_args<_Pair>( @@ -161,9 +157,7 @@ inline constexpr bool __convertible_to_const_pair_ref = # if _LIBCPP_STD_VER >= 23 template inline constexpr bool __uses_allocator_constraints = - __is_cv_std_pair<_Tp> && - (__is_specialization_of_subrange>::value || - (!__pair_like<_Up> && !__convertible_to_const_pair_ref<_Up>)); + __is_cv_std_pair<_Tp> && !__pair_like_no_subrange<_Up> && !__convertible_to_const_pair_ref<_Up>; # else template inline constexpr bool __uses_allocator_constraints = __is_cv_std_pair<_Tp> && !__convertible_to_const_pair_ref<_Up>; diff --git a/yass/third_party/libc++/trunk/include/__memory_resource/polymorphic_allocator.h b/yass/third_party/libc++/trunk/include/__memory_resource/polymorphic_allocator.h index cfd07bc84f..823c1503c2 100644 --- a/yass/third_party/libc++/trunk/include/__memory_resource/polymorphic_allocator.h +++ b/yass/third_party/libc++/trunk/include/__memory_resource/polymorphic_allocator.h @@ -12,6 +12,7 @@ #include <__assert> #include <__availability> #include <__config> +#include <__fwd/pair.h> #include <__memory_resource/memory_resource.h> #include <__utility/exception_guard.h> #include diff --git a/yass/third_party/libc++/trunk/include/__numeric/pstl_transform_reduce.h b/yass/third_party/libc++/trunk/include/__numeric/pstl_transform_reduce.h index 2f412d41f7..07ecf0d995 100644 --- a/yass/third_party/libc++/trunk/include/__numeric/pstl_transform_reduce.h +++ b/yass/third_party/libc++/trunk/include/__numeric/pstl_transform_reduce.h @@ -87,7 +87,7 @@ _LIBCPP_HIDE_FROM_ABI _Tp transform_reduce( } // This overload doesn't get a customization point because it's trivial to detect (through e.g. -// __desugars_to) when specializing the more general variant, which should always be preferred +// __desugars_to_v) when specializing the more general variant, which should always be preferred template #include <__config> #include <__iterator/iterator_traits.h> +#include <__type_traits/is_unsigned.h> #include #include #include @@ -79,6 +80,11 @@ void seed_seq::__init(_InputIterator __first, _InputIterator __last) { template void seed_seq::generate(_RandomAccessIterator __first, _RandomAccessIterator __last) { + using _ValueType = typename iterator_traits<_RandomAccessIterator>::value_type; + static_assert(is_unsigned<_ValueType>::value && sizeof(_ValueType) >= sizeof(uint32_t), + "[rand.util.seedseq]/7 requires the value_type of the iterator to be an unsigned " + "integer capable of accommodating 32-bit quantities."); + if (__first != __last) { std::fill(__first, __last, 0x8b8b8b8b); const size_t __n = static_cast(__last - __first); diff --git a/yass/third_party/libc++/trunk/include/__ranges/subrange.h b/yass/third_party/libc++/trunk/include/__ranges/subrange.h index bb4411cf35..051bc31139 100644 --- a/yass/third_party/libc++/trunk/include/__ranges/subrange.h +++ b/yass/third_party/libc++/trunk/include/__ranges/subrange.h @@ -28,8 +28,8 @@ #include <__ranges/enable_borrowed_range.h> #include <__ranges/size.h> #include <__ranges/view_interface.h> -#include <__tuple/pair_like.h> #include <__tuple/tuple_element.h> +#include <__tuple/tuple_like_no_subrange.h> #include <__tuple/tuple_size.h> #include <__type_traits/conditional.h> #include <__type_traits/decay.h> @@ -64,7 +64,7 @@ concept __convertible_to_non_slicing = template concept __pair_like_convertible_from = - !range<_Pair> && __pair_like<_Pair> && constructible_from<_Pair, _Iter, _Sent> && + !range<_Pair> && __pair_like_no_subrange<_Pair> && constructible_from<_Pair, _Iter, _Sent> && __convertible_to_non_slicing<_Iter, tuple_element_t<0, _Pair>> && convertible_to<_Sent, tuple_element_t<1, _Pair>>; template _Pair> - requires __pair_like_convertible_from<_Pair, const _Iter&, const _Sent&> + template <__pair_like_convertible_from _Pair> _LIBCPP_HIDE_FROM_ABI constexpr operator _Pair() const { return _Pair(__begin_, __end_); } diff --git a/yass/third_party/libc++/trunk/include/__ranges/zip_view.h b/yass/third_party/libc++/trunk/include/__ranges/zip_view.h index d3665a149a..fe3c87a930 100644 --- a/yass/third_party/libc++/trunk/include/__ranges/zip_view.h +++ b/yass/third_party/libc++/trunk/include/__ranges/zip_view.h @@ -36,6 +36,7 @@ #include <__utility/forward.h> #include <__utility/integer_sequence.h> #include <__utility/move.h> +#include <__utility/pair.h> #include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) diff --git a/yass/third_party/libc++/trunk/include/__stop_token/stop_callback.h b/yass/third_party/libc++/trunk/include/__stop_token/stop_callback.h index 9e5b0338d4..7b526820f9 100644 --- a/yass/third_party/libc++/trunk/include/__stop_token/stop_callback.h +++ b/yass/third_party/libc++/trunk/include/__stop_token/stop_callback.h @@ -21,6 +21,7 @@ #include <__type_traits/is_nothrow_constructible.h> #include <__utility/forward.h> #include <__utility/move.h> +#include <__utility/private_constructor_tag.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -49,13 +50,13 @@ public: requires constructible_from<_Callback, _Cb> _LIBCPP_HIDE_FROM_ABI explicit stop_callback(const stop_token& __st, _Cb&& __cb) noexcept(is_nothrow_constructible_v<_Callback, _Cb>) - : stop_callback(__private_tag{}, __st.__state_, std::forward<_Cb>(__cb)) {} + : stop_callback(__private_constructor_tag{}, __st.__state_, std::forward<_Cb>(__cb)) {} template requires constructible_from<_Callback, _Cb> _LIBCPP_HIDE_FROM_ABI explicit stop_callback(stop_token&& __st, _Cb&& __cb) noexcept(is_nothrow_constructible_v<_Callback, _Cb>) - : stop_callback(__private_tag{}, std::move(__st.__state_), std::forward<_Cb>(__cb)) {} + : stop_callback(__private_constructor_tag{}, std::move(__st.__state_), std::forward<_Cb>(__cb)) {} _LIBCPP_HIDE_FROM_ABI ~stop_callback() { if (__state_) { @@ -74,10 +75,8 @@ private: friend __stop_callback_base; - struct __private_tag {}; - template - _LIBCPP_HIDE_FROM_ABI explicit stop_callback(__private_tag, _StatePtr&& __state, _Cb&& __cb) noexcept( + _LIBCPP_HIDE_FROM_ABI explicit stop_callback(__private_constructor_tag, _StatePtr&& __state, _Cb&& __cb) noexcept( is_nothrow_constructible_v<_Callback, _Cb>) : __stop_callback_base([](__stop_callback_base* __cb_base) noexcept { // stop callback is supposed to only be called once diff --git a/yass/third_party/libc++/trunk/include/__thread/support/pthread.h b/yass/third_party/libc++/trunk/include/__thread/support/pthread.h index e194e5c68a..531f3e71de 100644 --- a/yass/third_party/libc++/trunk/include/__thread/support/pthread.h +++ b/yass/third_party/libc++/trunk/include/__thread/support/pthread.h @@ -10,7 +10,6 @@ #ifndef _LIBCPP___THREAD_SUPPORT_PTHREAD_H #define _LIBCPP___THREAD_SUPPORT_PTHREAD_H -#include <__availability> #include <__chrono/convert_to_timespec.h> #include <__chrono/duration.h> #include <__config> diff --git a/yass/third_party/libc++/trunk/include/__tuple/tuple_like.h b/yass/third_party/libc++/trunk/include/__tuple/tuple_like.h index 967e4a543c..c080a3dcf1 100644 --- a/yass/third_party/libc++/trunk/include/__tuple/tuple_like.h +++ b/yass/third_party/libc++/trunk/include/__tuple/tuple_like.h @@ -10,12 +10,9 @@ #define _LIBCPP___TUPLE_TUPLE_LIKE_H #include <__config> -#include <__fwd/array.h> -#include <__fwd/complex.h> -#include <__fwd/pair.h> #include <__fwd/subrange.h> -#include <__fwd/tuple.h> -#include <__type_traits/integral_constant.h> +#include <__tuple/tuple_like_no_subrange.h> +#include <__tuple/tuple_size.h> #include <__type_traits/remove_cvref.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -27,29 +24,16 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 20 template -struct __tuple_like_impl : false_type {}; +inline constexpr bool __is_ranges_subrange_v = false; -template -struct __tuple_like_impl > : true_type {}; - -template -struct __tuple_like_impl > : true_type {}; - -template -struct __tuple_like_impl > : true_type {}; - -template -struct __tuple_like_impl > : true_type {}; - -# if _LIBCPP_STD_VER >= 26 +template +inline constexpr bool __is_ranges_subrange_v> = true; template -struct __tuple_like_impl> : true_type {}; +concept __tuple_like = __tuple_like_no_subrange<_Tp> || __is_ranges_subrange_v>; -# endif - -template -concept __tuple_like = __tuple_like_impl>::value; +// As of writing this comment every use of `pair-like` in the standard excludes `ranges::subrange`, so +// you most likely want to use `__pair_like_no_subrange` if you're looking for `pair-like`. #endif // _LIBCPP_STD_VER >= 20 diff --git a/yass/third_party/libc++/trunk/include/__tuple/tuple_like_no_subrange.h b/yass/third_party/libc++/trunk/include/__tuple/tuple_like_no_subrange.h new file mode 100644 index 0000000000..274b0bf188 --- /dev/null +++ b/yass/third_party/libc++/trunk/include/__tuple/tuple_like_no_subrange.h @@ -0,0 +1,61 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___TUPLE_TUPLE_LIKE_NO_SUBRANGE_H +#define _LIBCPP___TUPLE_TUPLE_LIKE_NO_SUBRANGE_H + +#include <__config> +#include <__fwd/array.h> +#include <__fwd/complex.h> +#include <__fwd/pair.h> +#include <__fwd/tuple.h> +#include <__tuple/tuple_size.h> +#include <__type_traits/remove_cvref.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER >= 20 + +template +inline constexpr bool __tuple_like_no_subrange_impl = false; + +template +inline constexpr bool __tuple_like_no_subrange_impl> = true; + +template +inline constexpr bool __tuple_like_no_subrange_impl> = true; + +template +inline constexpr bool __tuple_like_no_subrange_impl> = true; + +# if _LIBCPP_STD_VER >= 26 + +template +inline constexpr bool __tuple_like_no_subrange_impl> = true; + +# endif + +template +concept __tuple_like_no_subrange = __tuple_like_no_subrange_impl>; + +// This is equivalent to the exposition-only type trait `pair-like`, except that it is false for specializations of +// `ranges::subrange`. This is more useful than the pair-like concept in the standard because every use of `pair-like` +// excludes `ranges::subrange`. +template +concept __pair_like_no_subrange = __tuple_like_no_subrange<_Tp> && tuple_size>::value == 2; + +#endif // _LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___TUPLE_TUPLE_LIKE_NO_SUBRANGE_H diff --git a/yass/third_party/libc++/trunk/include/__type_traits/copy_cv.h b/yass/third_party/libc++/trunk/include/__type_traits/copy_cv.h index b1c057ff77..d482cb42bf 100644 --- a/yass/third_party/libc++/trunk/include/__type_traits/copy_cv.h +++ b/yass/third_party/libc++/trunk/include/__type_traits/copy_cv.h @@ -19,28 +19,32 @@ _LIBCPP_BEGIN_NAMESPACE_STD // Let COPYCV(FROM, TO) be an alias for type TO with the addition of FROM's // top-level cv-qualifiers. -template +template struct __copy_cv { - using type = _To; + template + using __apply = _To; +}; + +template +struct __copy_cv { + template + using __apply = const _To; +}; + +template +struct __copy_cv { + template + using __apply = volatile _To; +}; + +template +struct __copy_cv { + template + using __apply = const volatile _To; }; template -struct __copy_cv { - using type = const _To; -}; - -template -struct __copy_cv { - using type = volatile _To; -}; - -template -struct __copy_cv { - using type = const volatile _To; -}; - -template -using __copy_cv_t = typename __copy_cv<_From, _To>::type; +using __copy_cv_t = typename __copy_cv<_From>::template __apply<_To>; _LIBCPP_END_NAMESPACE_STD diff --git a/yass/third_party/libc++/trunk/include/__type_traits/operation_traits.h b/yass/third_party/libc++/trunk/include/__type_traits/desugars_to.h similarity index 84% rename from yass/third_party/libc++/trunk/include/__type_traits/operation_traits.h rename to yass/third_party/libc++/trunk/include/__type_traits/desugars_to.h index ef6e716934..97a2ee5448 100644 --- a/yass/third_party/libc++/trunk/include/__type_traits/operation_traits.h +++ b/yass/third_party/libc++/trunk/include/__type_traits/desugars_to.h @@ -6,11 +6,10 @@ // //===----------------------------------------------------------------------===// -#ifndef _LIBCPP___TYPE_TRAITS_OPERATION_TRAITS_H -#define _LIBCPP___TYPE_TRAITS_OPERATION_TRAITS_H +#ifndef _LIBCPP___TYPE_TRAITS_DESUGARS_TO_H +#define _LIBCPP___TYPE_TRAITS_DESUGARS_TO_H #include <__config> -#include <__type_traits/integral_constant.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -21,6 +20,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD // Tags to represent the canonical operations struct __equal_tag {}; struct __plus_tag {}; +struct __less_tag {}; // This class template is used to determine whether an operation "desugars" // (or boils down) to a given canonical operation. @@ -33,8 +33,8 @@ struct __plus_tag {}; // predicate being passed is actually going to call a builtin operator, or has // some specific semantics. template -struct __desugars_to : false_type {}; +inline const bool __desugars_to_v = false; _LIBCPP_END_NAMESPACE_STD -#endif // _LIBCPP___TYPE_TRAITS_OPERATION_TRAITS_H +#endif // _LIBCPP___TYPE_TRAITS_DESUGARS_TO_H diff --git a/yass/third_party/libc++/trunk/include/__utility/pair.h b/yass/third_party/libc++/trunk/include/__utility/pair.h index 0056806877..e05250ba05 100644 --- a/yass/third_party/libc++/trunk/include/__utility/pair.h +++ b/yass/third_party/libc++/trunk/include/__utility/pair.h @@ -15,12 +15,11 @@ #include <__config> #include <__fwd/array.h> #include <__fwd/pair.h> -#include <__fwd/subrange.h> #include <__fwd/tuple.h> -#include <__tuple/pair_like.h> #include <__tuple/sfinae_helpers.h> #include <__tuple/tuple_element.h> #include <__tuple/tuple_indices.h> +#include <__tuple/tuple_like_no_subrange.h> #include <__tuple/tuple_size.h> #include <__type_traits/common_reference.h> #include <__type_traits/common_type.h> @@ -60,14 +59,6 @@ struct __non_trivially_copyable_base { __non_trivially_copyable_base(__non_trivially_copyable_base const&) _NOEXCEPT {} }; -#if _LIBCPP_STD_VER >= 23 -template -struct __is_specialization_of_subrange : false_type {}; - -template -struct __is_specialization_of_subrange> : true_type {}; -#endif - template struct _LIBCPP_TEMPLATE_VIS pair #if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR) @@ -201,19 +192,19 @@ struct _LIBCPP_TEMPLATE_VIS pair # endif # if _LIBCPP_STD_VER >= 23 + // TODO: Remove this workaround in LLVM 20. The bug got fixed in Clang 18. // This is a workaround for http://llvm.org/PR60710. We should be able to remove it once Clang is fixed. template _LIBCPP_HIDE_FROM_ABI static constexpr bool __pair_like_explicit_wknd() { - if constexpr (__pair_like<_PairLike>) { + if constexpr (__pair_like_no_subrange<_PairLike>) { return !is_convertible_v(std::declval<_PairLike&&>())), first_type> || !is_convertible_v(std::declval<_PairLike&&>())), second_type>; } return false; } - template <__pair_like _PairLike> - requires(!__is_specialization_of_subrange>::value && - is_constructible_v(std::declval<_PairLike &&>()))> && + template <__pair_like_no_subrange _PairLike> + requires(is_constructible_v(std::declval<_PairLike &&>()))> && is_constructible_v(std::declval<_PairLike &&>()))>) _LIBCPP_HIDE_FROM_ABI constexpr explicit(__pair_like_explicit_wknd<_PairLike>()) pair(_PairLike&& __p) : first(std::get<0>(std::forward<_PairLike>(__p))), second(std::get<1>(std::forward<_PairLike>(__p))) {} @@ -306,8 +297,8 @@ struct _LIBCPP_TEMPLATE_VIS pair return *this; } - template <__pair_like _PairLike> - requires(__different_from<_PairLike, pair> && !__is_specialization_of_subrange>::value && + template <__pair_like_no_subrange _PairLike> + requires(__different_from<_PairLike, pair> && is_assignable_v(std::declval<_PairLike>()))> && is_assignable_v(std::declval<_PairLike>()))>) _LIBCPP_HIDE_FROM_ABI constexpr pair& operator=(_PairLike&& __p) { @@ -316,8 +307,8 @@ struct _LIBCPP_TEMPLATE_VIS pair return *this; } - template <__pair_like _PairLike> - requires(__different_from<_PairLike, pair> && !__is_specialization_of_subrange>::value && + template <__pair_like_no_subrange _PairLike> + requires(__different_from<_PairLike, pair> && is_assignable_v(std::declval<_PairLike>()))> && is_assignable_v(std::declval<_PairLike>()))>) _LIBCPP_HIDE_FROM_ABI constexpr pair const& operator=(_PairLike&& __p) const { @@ -440,7 +431,9 @@ private: tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, __tuple_indices<_I1...>, - __tuple_indices<_I2...>); + __tuple_indices<_I2...>) + : first(std::forward<_Args1>(std::get<_I1>(__first_args))...), + second(std::forward<_Args2>(std::get<_I2>(__second_args))...) {} #endif }; diff --git a/yass/third_party/libc++/trunk/include/__tuple/pair_like.h b/yass/third_party/libc++/trunk/include/__utility/private_constructor_tag.h similarity index 58% rename from yass/third_party/libc++/trunk/include/__tuple/pair_like.h rename to yass/third_party/libc++/trunk/include/__utility/private_constructor_tag.h index 192682dc7e..462cab48c9 100644 --- a/yass/third_party/libc++/trunk/include/__tuple/pair_like.h +++ b/yass/third_party/libc++/trunk/include/__utility/private_constructor_tag.h @@ -1,3 +1,4 @@ +// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -6,13 +7,10 @@ // //===----------------------------------------------------------------------===// -#ifndef _LIBCPP___TUPLE_PAIR_LIKE_H -#define _LIBCPP___TUPLE_PAIR_LIKE_H +#ifndef _LIBCPP__UTILITY_PRIVATE_CONSTRUCTOR_TAG_H +#define _LIBCPP__UTILITY_PRIVATE_CONSTRUCTOR_TAG_H #include <__config> -#include <__tuple/tuple_like.h> -#include <__tuple/tuple_size.h> -#include <__type_traits/remove_cvref.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -20,13 +18,11 @@ _LIBCPP_BEGIN_NAMESPACE_STD -#if _LIBCPP_STD_VER >= 20 - -template -concept __pair_like = __tuple_like<_Tp> && tuple_size>::value == 2; - -#endif // _LIBCPP_STD_VER >= 20 +// This tag allows defining non-standard exposition-only constructors while +// preventing users from being able to use them, since this reserved-name tag +// needs to be used. +struct __private_constructor_tag {}; _LIBCPP_END_NAMESPACE_STD -#endif // _LIBCPP___TUPLE_PAIR_LIKE_H +#endif // _LIBCPP__UTILITY_PRIVATE_CONSTRUCTOR_TAG_H diff --git a/yass/third_party/libc++/trunk/include/any b/yass/third_party/libc++/trunk/include/any index a6212fedfa..0e66890593 100644 --- a/yass/third_party/libc++/trunk/include/any +++ b/yass/third_party/libc++/trunk/include/any @@ -80,7 +80,6 @@ namespace std { */ -#include <__availability> #include <__config> #include <__memory/allocator.h> #include <__memory/allocator_destructor.h> diff --git a/yass/third_party/libc++/trunk/include/chrono b/yass/third_party/libc++/trunk/include/chrono index 5bab3f8ad5..5eddd05019 100644 --- a/yass/third_party/libc++/trunk/include/chrono +++ b/yass/third_party/libc++/trunk/include/chrono @@ -688,6 +688,10 @@ struct tzdb { string version; vector zones; vector links; + vector leap_seconds; + + const time_zone* locate_zone(string_view tz_name) const; + const time_zone* current_zone() const; }; class tzdb_list { // C++20 @@ -713,11 +717,22 @@ public: // [time.zone.db.access], time zone database access const tzdb& get_tzdb(); // C++20 tzdb_list& get_tzdb_list(); // C++20 +const time_zone* locate_zone(string_view tz_name); // C++20 +const time_zone* current_zone() // C++20 // [time.zone.db.remote], remote time zone database support const tzdb& reload_tzdb(); // C++20 string remote_version(); // C++20 +// [time.zone.info], information classes +struct sys_info { // C++20 + sys_seconds begin; + sys_seconds end; + seconds offset; + minutes save; + string abbrev; +}; + // 25.10.5, class time_zone // C++20 enum class choose {earliest, latest}; class time_zone { @@ -727,10 +742,50 @@ class time_zone { // unspecified additional constructors string_view name() const noexcept; + + template + sys_info get_info(const sys_time& st) const; }; bool operator==(const time_zone& x, const time_zone& y) noexcept; // C++20 strong_ordering operator<=>(const time_zone& x, const time_zone& y) noexcept; // C++20 +// [time.zone.leap], leap second support +class leap_second { // C++20 +public: + leap_second(const leap_second&) = default; + leap_second& operator=(const leap_second&) = default; + + // unspecified additional constructors + + constexpr sys_seconds date() const noexcept; + constexpr seconds value() const noexcept; +}; + +constexpr bool operator==(const leap_second& x, const leap_second& y); // C++20 +constexpr strong_ordering operator<=>(const leap_second& x, const leap_second& y); + +template // C++20 + constexpr bool operator==(const leap_second& x, const sys_time& y); +template // C++20 + constexpr bool operator< (const leap_second& x, const sys_time& y); +template // C++20 + constexpr bool operator< (const sys_time& x, const leap_second& y); +template // C++20 + constexpr bool operator> (const leap_second& x, const sys_time& y); +template // C++20 + constexpr bool operator> (const sys_time& x, const leap_second& y); +template // C++20 + constexpr bool operator<=(const leap_second& x, const sys_time& y); +template // C++20 + constexpr bool operator<=(const sys_time& x, const leap_second& y); +template // C++20 + constexpr bool operator>=(const leap_second& x, const sys_time& y); +template // C++20 + constexpr bool operator>=(const sys_time& x, const leap_second& y); +template // C++20 + requires three_way_comparable_with> + constexpr auto operator<=>(const leap_second& x, const sys_time& y); + // [time.zone.link], class time_zone_link class time_zone_link { // C++20 public: @@ -838,6 +893,7 @@ constexpr chrono::year operator ""y(unsigned lo #include <__chrono/month_weekday.h> #include <__chrono/monthday.h> #include <__chrono/steady_clock.h> +#include <__chrono/sys_info.h> #include <__chrono/system_clock.h> #include <__chrono/time_point.h> #include <__chrono/weekday.h> @@ -862,6 +918,7 @@ constexpr chrono::year operator ""y(unsigned lo #if !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) && \ !defined(_LIBCPP_HAS_NO_LOCALIZATION) +# include <__chrono/leap_second.h> # include <__chrono/time_zone.h> # include <__chrono/time_zone_link.h> # include <__chrono/tzdb.h> diff --git a/yass/third_party/libc++/trunk/include/fstream b/yass/third_party/libc++/trunk/include/fstream index 7a084d114b..7128f72e16 100644 --- a/yass/third_party/libc++/trunk/include/fstream +++ b/yass/third_party/libc++/trunk/include/fstream @@ -78,8 +78,8 @@ public: basic_ifstream(); explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in); explicit basic_ifstream(const string& s, ios_base::openmode mode = ios_base::in); - explicit basic_ifstream(const filesystem::path& p, - ios_base::openmode mode = ios_base::in); // C++17 + template + explicit basic_ifstream(const T& s, ios_base::openmode mode = ios_base::in); // Since C++17 basic_ifstream(basic_ifstream&& rhs); basic_ifstream& operator=(basic_ifstream&& rhs); @@ -117,8 +117,8 @@ public: basic_ofstream(); explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out); explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out); - explicit basic_ofstream(const filesystem::path& p, - ios_base::openmode mode = ios_base::out); // C++17 + template + explicit basic_ofstream(const T& s, ios_base::openmode mode = ios_base::out); // Since C++17 basic_ofstream(basic_ofstream&& rhs); basic_ofstream& operator=(basic_ofstream&& rhs); @@ -158,8 +158,8 @@ public: basic_fstream(); explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out); explicit basic_fstream(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out); - explicit basic_fstream(const filesystem::path& p, - ios_base::openmode mode = ios_base::in|ios_base::out); C++17 + template + explicit basic_fstream(const T& s, ios_base::openmode mode = ios_base::in | ios_base::out); // Since C++17 basic_fstream(basic_fstream&& rhs); basic_fstream& operator=(basic_fstream&& rhs); @@ -192,6 +192,8 @@ typedef basic_fstream wfstream; #include <__config> #include <__fwd/fstream.h> #include <__locale> +#include <__type_traits/enable_if.h> +#include <__type_traits/is_same.h> #include <__utility/move.h> #include <__utility/swap.h> #include <__utility/unreachable.h> @@ -1101,8 +1103,9 @@ public: # endif _LIBCPP_HIDE_FROM_ABI explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in); # if _LIBCPP_STD_VER >= 17 + template >> _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY _LIBCPP_HIDE_FROM_ABI explicit basic_ifstream( - const filesystem::path& __p, ios_base::openmode __mode = ios_base::in) + const _Tp& __p, ios_base::openmode __mode = ios_base::in) : basic_ifstream(__p.c_str(), __mode) {} # endif // _LIBCPP_STD_VER >= 17 _LIBCPP_HIDE_FROM_ABI basic_ifstream(basic_ifstream&& __rhs); @@ -1255,8 +1258,9 @@ public: _LIBCPP_HIDE_FROM_ABI explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out); # if _LIBCPP_STD_VER >= 17 + template >> _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY _LIBCPP_HIDE_FROM_ABI explicit basic_ofstream( - const filesystem::path& __p, ios_base::openmode __mode = ios_base::out) + const _Tp& __p, ios_base::openmode __mode = ios_base::out) : basic_ofstream(__p.c_str(), __mode) {} # endif // _LIBCPP_STD_VER >= 17 @@ -1414,8 +1418,9 @@ public: ios_base::openmode __mode = ios_base::in | ios_base::out); # if _LIBCPP_STD_VER >= 17 + template >> _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY _LIBCPP_HIDE_FROM_ABI explicit basic_fstream( - const filesystem::path& __p, ios_base::openmode __mode = ios_base::in | ios_base::out) + const _Tp& __p, ios_base::openmode __mode = ios_base::in | ios_base::out) : basic_fstream(__p.c_str(), __mode) {} # endif // _LIBCPP_STD_VER >= 17 diff --git a/yass/third_party/libc++/trunk/include/functional b/yass/third_party/libc++/trunk/include/functional index a2774a48bd..a2476c93ad 100644 --- a/yass/third_party/libc++/trunk/include/functional +++ b/yass/third_party/libc++/trunk/include/functional @@ -207,6 +207,12 @@ binary_negate not2(const Predicate& pred); template constexpr unspecified not_fn(F&& f); // C++17, constexpr in C++20 +// [func.bind.partial], function templates bind_front and bind_back +template + constexpr unspecified bind_front(F&&, Args&&...); // C++20 +template + constexpr unspecified bind_back(F&&, Args&&...); // C++23 + template struct is_bind_expression; template struct is_placeholder; diff --git a/yass/third_party/libc++/trunk/include/future b/yass/third_party/libc++/trunk/include/future index fda1591818..3c22868606 100644 --- a/yass/third_party/libc++/trunk/include/future +++ b/yass/third_party/libc++/trunk/include/future @@ -369,7 +369,6 @@ template struct uses_allocator, Alloc>; #endif #include <__assert> -#include <__availability> #include <__chrono/duration.h> #include <__chrono/time_point.h> #include <__exception/exception_ptr.h> diff --git a/yass/third_party/libc++/trunk/include/libcxx.imp b/yass/third_party/libc++/trunk/include/libcxx.imp index fb446da5dc..6c77ba8343 100644 --- a/yass/third_party/libc++/trunk/include/libcxx.imp +++ b/yass/third_party/libc++/trunk/include/libcxx.imp @@ -279,6 +279,7 @@ { include: [ "<__chrono/formatter.h>", "private", "", "public" ] }, { include: [ "<__chrono/hh_mm_ss.h>", "private", "", "public" ] }, { include: [ "<__chrono/high_resolution_clock.h>", "private", "", "public" ] }, + { include: [ "<__chrono/leap_second.h>", "private", "", "public" ] }, { include: [ "<__chrono/literals.h>", "private", "", "public" ] }, { include: [ "<__chrono/month.h>", "private", "", "public" ] }, { include: [ "<__chrono/month_weekday.h>", "private", "", "public" ] }, @@ -287,6 +288,7 @@ { include: [ "<__chrono/parser_std_format_spec.h>", "private", "", "public" ] }, { include: [ "<__chrono/statically_widen.h>", "private", "", "public" ] }, { include: [ "<__chrono/steady_clock.h>", "private", "", "public" ] }, + { include: [ "<__chrono/sys_info.h>", "private", "", "public" ] }, { include: [ "<__chrono/system_clock.h>", "private", "", "public" ] }, { include: [ "<__chrono/time_point.h>", "private", "", "public" ] }, { include: [ "<__chrono/time_zone.h>", "private", "", "public" ] }, @@ -388,6 +390,7 @@ { include: [ "<__format/formatter_pointer.h>", "private", "", "public" ] }, { include: [ "<__format/formatter_string.h>", "private", "", "public" ] }, { include: [ "<__format/formatter_tuple.h>", "private", "", "public" ] }, + { include: [ "<__format/indic_conjunct_break_table.h>", "private", "", "public" ] }, { include: [ "<__format/parser_std_format_spec.h>", "private", "", "public" ] }, { include: [ "<__format/range_default_formatter.h>", "private", "", "public" ] }, { include: [ "<__format/range_formatter.h>", "private", "", "public" ] }, @@ -705,12 +708,12 @@ { include: [ "<__thread/timed_backoff_policy.h>", "private", "", "public" ] }, { include: [ "<__tuple/find_index.h>", "private", "", "public" ] }, { include: [ "<__tuple/make_tuple_types.h>", "private", "", "public" ] }, - { include: [ "<__tuple/pair_like.h>", "private", "", "public" ] }, { include: [ "<__tuple/sfinae_helpers.h>", "private", "", "public" ] }, { include: [ "<__tuple/tuple_element.h>", "private", "", "public" ] }, { include: [ "<__tuple/tuple_indices.h>", "private", "", "public" ] }, { include: [ "<__tuple/tuple_like.h>", "private", "", "public" ] }, { include: [ "<__tuple/tuple_like_ext.h>", "private", "", "public" ] }, + { include: [ "<__tuple/tuple_like_no_subrange.h>", "private", "", "public" ] }, { include: [ "<__tuple/tuple_size.h>", "private", "", "public" ] }, { include: [ "<__tuple/tuple_types.h>", "private", "", "public" ] }, { include: [ "<__type_traits/add_const.h>", "private", "", "public" ] }, @@ -733,6 +736,7 @@ { include: [ "<__type_traits/datasizeof.h>", "private", "", "public" ] }, { include: [ "<__type_traits/decay.h>", "private", "", "public" ] }, { include: [ "<__type_traits/dependent_type.h>", "private", "", "public" ] }, + { include: [ "<__type_traits/desugars_to.h>", "private", "", "public" ] }, { include: [ "<__type_traits/disjunction.h>", "private", "", "public" ] }, { include: [ "<__type_traits/enable_if.h>", "private", "", "public" ] }, { include: [ "<__type_traits/extent.h>", "private", "", "public" ] }, @@ -817,7 +821,6 @@ { include: [ "<__type_traits/nat.h>", "private", "", "public" ] }, { include: [ "<__type_traits/negation.h>", "private", "", "public" ] }, { include: [ "<__type_traits/noexcept_move_assign_container.h>", "private", "", "public" ] }, - { include: [ "<__type_traits/operation_traits.h>", "private", "", "public" ] }, { include: [ "<__type_traits/promote.h>", "private", "", "public" ] }, { include: [ "<__type_traits/rank.h>", "private", "", "public" ] }, { include: [ "<__type_traits/remove_all_extents.h>", "private", "", "public" ] }, diff --git a/yass/third_party/libc++/trunk/include/locale b/yass/third_party/libc++/trunk/include/locale index e3c63e3abe..748b276a85 100644 --- a/yass/third_party/libc++/trunk/include/locale +++ b/yass/third_party/libc++/trunk/include/locale @@ -84,7 +84,7 @@ template charT tolower(charT c, const locale& loc); template, class Byte_alloc = allocator> -class wstring_convert +class wstring_convert // Removed in C++26 { public: typedef basic_string, Byte_alloc> byte_string; @@ -119,7 +119,7 @@ public: }; template > -class wbuffer_convert +class wbuffer_convert // Removed in C++26 : public basic_streambuf { public: @@ -3107,6 +3107,8 @@ extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname; extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname; #endif +#if _LIBCPP_STD_VER < 26 || defined(_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT) + template , @@ -3712,6 +3714,8 @@ wbuffer_convert<_Codecvt, _Elem, _Tr>* wbuffer_convert<_Codecvt, _Elem, _Tr>::__ _LIBCPP_SUPPRESS_DEPRECATED_POP +#endif // _LIBCPP_STD_VER < 26 || defined(_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT) + _LIBCPP_END_NAMESPACE_STD _LIBCPP_POP_MACROS diff --git a/yass/third_party/libc++/trunk/include/module.modulemap b/yass/third_party/libc++/trunk/include/module.modulemap index 079c6234d4..9c0f0ddd20 100644 --- a/yass/third_party/libc++/trunk/include/module.modulemap +++ b/yass/third_party/libc++/trunk/include/module.modulemap @@ -1145,6 +1145,7 @@ module std_private_chrono_high_resolution_clock [system] { export std_private_chrono_steady_clock export std_private_chrono_system_clock } +module std_private_chrono_leap_second [system] { header "__chrono/leap_second.h" } module std_private_chrono_literals [system] { header "__chrono/literals.h" } module std_private_chrono_month [system] { header "__chrono/month.h" } module std_private_chrono_month_weekday [system] { header "__chrono/month_weekday.h" } @@ -1166,6 +1167,9 @@ module std_private_chrono_time_zone [system] { module std_private_chrono_time_zone_link [system] { header "__chrono/time_zone_link.h" } +module std_private_chrono_sys_info [system] { + header "__chrono/sys_info.h" +} module std_private_chrono_system_clock [system] { header "__chrono/system_clock.h" export std_private_chrono_time_point @@ -1338,12 +1342,14 @@ module std_private_format_formatter_output [system] { header "__f module std_private_format_formatter_pointer [system] { header "__format/formatter_pointer.h" } module std_private_format_formatter_string [system] { header "__format/formatter_string.h" } module std_private_format_formatter_tuple [system] { header "__format/formatter_tuple.h" } +module std_private_format_indic_conjunct_break_table [system] { header "__format/indic_conjunct_break_table.h" } module std_private_format_parser_std_format_spec [system] { header "__format/parser_std_format_spec.h" } module std_private_format_range_default_formatter [system] { header "__format/range_default_formatter.h" } module std_private_format_range_formatter [system] { header "__format/range_formatter.h" } module std_private_format_unicode [system] { header "__format/unicode.h" export std_private_format_extended_grapheme_cluster_table + export std_private_format_indic_conjunct_break_table } module std_private_format_width_estimation_table [system] { header "__format/width_estimation_table.h" } module std_private_format_write_escaped [system] { header "__format/write_escaped.h" } @@ -1738,7 +1744,10 @@ module std_private_ranges_transform_view [system] { } module std_private_ranges_view_interface [system] { header "__ranges/view_interface.h" } module std_private_ranges_views [system] { header "__ranges/views.h" } -module std_private_ranges_zip_view [system] { header "__ranges/zip_view.h" } +module std_private_ranges_zip_view [system] { + header "__ranges/zip_view.h" + export std_private_utility_pair +} module std_private_span_span_fwd [system] { header "__fwd/span.h" } @@ -1810,20 +1819,22 @@ module std_private_thread_thread [system] { } module std_private_thread_timed_backoff_policy [system] { header "__thread/timed_backoff_policy.h" } -module std_private_tuple_find_index [system] { header "__tuple/find_index.h" } -module std_private_tuple_make_tuple_types [system] { header "__tuple/make_tuple_types.h" } -module std_private_tuple_pair_like [system] { - header "__tuple/pair_like.h" - export std_private_tuple_tuple_like +module std_private_tuple_find_index [system] { header "__tuple/find_index.h" } +module std_private_tuple_make_tuple_types [system] { header "__tuple/make_tuple_types.h" } +module std_private_tuple_tuple_like_no_subrange [system] { + header "__tuple/tuple_like_no_subrange.h" } -module std_private_tuple_sfinae_helpers [system] { header "__tuple/sfinae_helpers.h" } -module std_private_tuple_tuple_element [system] { header "__tuple/tuple_element.h" } -module std_private_tuple_tuple_fwd [system] { header "__fwd/tuple.h" } -module std_private_tuple_tuple_indices [system] { header "__tuple/tuple_indices.h" } -module std_private_tuple_tuple_like [system] { header "__tuple/tuple_like.h" } -module std_private_tuple_tuple_like_ext [system] { header "__tuple/tuple_like_ext.h" } -module std_private_tuple_tuple_size [system] { header "__tuple/tuple_size.h" } -module std_private_tuple_tuple_types [system] { header "__tuple/tuple_types.h" } +module std_private_tuple_sfinae_helpers [system] { header "__tuple/sfinae_helpers.h" } +module std_private_tuple_tuple_element [system] { header "__tuple/tuple_element.h" } +module std_private_tuple_tuple_fwd [system] { header "__fwd/tuple.h" } +module std_private_tuple_tuple_indices [system] { header "__tuple/tuple_indices.h" } +module std_private_tuple_tuple_like [system] { + header "__tuple/tuple_like.h" + export * +} +module std_private_tuple_tuple_like_ext [system] { header "__tuple/tuple_like_ext.h" } +module std_private_tuple_tuple_size [system] { header "__tuple/tuple_size.h" } +module std_private_tuple_tuple_types [system] { header "__tuple/tuple_types.h" } module std_private_type_traits_add_const [system] { header "__type_traits/add_const.h" } module std_private_type_traits_add_cv [system] { header "__type_traits/add_cv.h" } @@ -1861,6 +1872,7 @@ module std_private_type_traits_decay [system export std_private_type_traits_add_pointer } module std_private_type_traits_dependent_type [system] { header "__type_traits/dependent_type.h" } +module std_private_type_traits_desugars_to [system] { header "__type_traits/desugars_to.h" } module std_private_type_traits_disjunction [system] { header "__type_traits/disjunction.h" } module std_private_type_traits_enable_if [system] { header "__type_traits/enable_if.h" } module std_private_type_traits_extent [system] { header "__type_traits/extent.h" } @@ -2011,7 +2023,6 @@ module std_private_type_traits_maybe_const [system module std_private_type_traits_nat [system] { header "__type_traits/nat.h" } module std_private_type_traits_negation [system] { header "__type_traits/negation.h" } module std_private_type_traits_noexcept_move_assign_container [system] { header "__type_traits/noexcept_move_assign_container.h" } -module std_private_type_traits_operation_traits [system] { header "__type_traits/operation_traits.h" } module std_private_type_traits_promote [system] { header "__type_traits/promote.h" } module std_private_type_traits_rank [system] { header "__type_traits/rank.h" } module std_private_type_traits_remove_all_extents [system] { header "__type_traits/remove_all_extents.h" } @@ -2079,18 +2090,19 @@ module std_private_utility_pair [system] { export std_private_type_traits_is_nothrow_move_assignable export std_private_utility_pair_fwd } -module std_private_utility_pair_fwd [system] { header "__fwd/pair.h" } -module std_private_utility_piecewise_construct [system] { header "__utility/piecewise_construct.h" } -module std_private_utility_priority_tag [system] { header "__utility/priority_tag.h" } -module std_private_utility_rel_ops [system] { header "__utility/rel_ops.h" } -module std_private_utility_small_buffer [system] { header "__utility/small_buffer.h" } -module std_private_utility_swap [system] { +module std_private_utility_pair_fwd [system] { header "__fwd/pair.h" } +module std_private_utility_piecewise_construct [system] { header "__utility/piecewise_construct.h" } +module std_private_utility_priority_tag [system] { header "__utility/priority_tag.h" } +module std_private_utility_private_constructor_tag [system] { header "__utility/private_constructor_tag.h" } +module std_private_utility_rel_ops [system] { header "__utility/rel_ops.h" } +module std_private_utility_small_buffer [system] { header "__utility/small_buffer.h" } +module std_private_utility_swap [system] { header "__utility/swap.h" export std_private_type_traits_is_swappable } -module std_private_utility_to_underlying [system] { header "__utility/to_underlying.h" } -module std_private_utility_unreachable [system] { header "__utility/unreachable.h" } +module std_private_utility_to_underlying [system] { header "__utility/to_underlying.h" } +module std_private_utility_unreachable [system] { header "__utility/unreachable.h" } -module std_private_variant_monostate [system] { header "__variant/monostate.h" } +module std_private_variant_monostate [system] { header "__variant/monostate.h" } -module std_private_vector_fwd [system] { header "__fwd/vector.h" } +module std_private_vector_fwd [system] { header "__fwd/vector.h" } diff --git a/yass/third_party/libc++/trunk/include/new b/yass/third_party/libc++/trunk/include/new index 988f7a8442..5a245dc5ef 100644 --- a/yass/third_party/libc++/trunk/include/new +++ b/yass/third_party/libc++/trunk/include/new @@ -86,7 +86,6 @@ void operator delete[](void* ptr, void*) noexcept; */ -#include <__availability> #include <__config> #include <__exception/exception.h> #include <__type_traits/is_function.h> diff --git a/yass/third_party/libc++/trunk/include/ostream b/yass/third_party/libc++/trunk/include/ostream index 42819ceb25..d4fc1c58b8 100644 --- a/yass/third_party/libc++/trunk/include/ostream +++ b/yass/third_party/libc++/trunk/include/ostream @@ -164,6 +164,7 @@ template void print(ostream& os, format_string fmt, Args&&... args); template // since C++23 void println(ostream& os, format_string fmt, Args&&... args); +void println(ostream& os); // since C++26 void vprint_unicode(ostream& os, string_view fmt, format_args args); // since C++23 void vprint_nonunicode(ostream& os, string_view fmt, format_args args); // since C++23 @@ -1163,6 +1164,9 @@ _LIBCPP_HIDE_FROM_ABI void println(ostream& __os, format_string<_Args...> __fmt, # endif // _LIBCPP_HAS_NO_UNICODE } +template // TODO PRINT template or availability markup fires too eagerly (http://llvm.org/PR61563). +_LIBCPP_HIDE_FROM_ABI inline void println(ostream& __os) { std::print(__os, "\n"); } + #endif // _LIBCPP_STD_VER >= 23 _LIBCPP_END_NAMESPACE_STD diff --git a/yass/third_party/libc++/trunk/include/print b/yass/third_party/libc++/trunk/include/print index a9f10433a7..e0bcf214ea 100644 --- a/yass/third_party/libc++/trunk/include/print +++ b/yass/third_party/libc++/trunk/include/print @@ -15,8 +15,10 @@ namespace std { // [print.fun], print functions template void print(format_string fmt, Args&&... args); + void println(); // Since C++26 template void print(FILE* stream, format_string fmt, Args&&... args); + void println(FILE* stream); // Since C++26 template void println(format_string fmt, Args&&... args); @@ -356,6 +358,12 @@ _LIBCPP_HIDE_FROM_ABI void println(FILE* __stream, format_string<_Args...> __fmt # endif // _LIBCPP_HAS_NO_UNICODE } +template // TODO PRINT template or availability markup fires too eagerly (http://llvm.org/PR61563). +_LIBCPP_HIDE_FROM_ABI inline void println(FILE* __stream) { std::print(__stream, "\n"); } + +template // TODO PRINT template or availability markup fires too eagerly (http://llvm.org/PR61563). +_LIBCPP_HIDE_FROM_ABI inline void println() { println(stdout); } + template _LIBCPP_HIDE_FROM_ABI void println(format_string<_Args...> __fmt, _Args&&... __args) { std::println(stdout, __fmt, std::forward<_Args>(__args)...); diff --git a/yass/third_party/libc++/trunk/include/shared_mutex b/yass/third_party/libc++/trunk/include/shared_mutex index 38b559e893..9cc391db6f 100644 --- a/yass/third_party/libc++/trunk/include/shared_mutex +++ b/yass/third_party/libc++/trunk/include/shared_mutex @@ -128,7 +128,6 @@ template # error " is not supported since libc++ has been configured without support for threads." #endif -#include <__availability> #include <__chrono/duration.h> #include <__chrono/steady_clock.h> #include <__chrono/time_point.h> diff --git a/yass/third_party/libc++/trunk/include/stddef.h b/yass/third_party/libc++/trunk/include/stddef.h index 887776b150..1583e78e37 100644 --- a/yass/third_party/libc++/trunk/include/stddef.h +++ b/yass/third_party/libc++/trunk/include/stddef.h @@ -7,18 +7,6 @@ // //===----------------------------------------------------------------------===// -#if defined(__need_ptrdiff_t) || defined(__need_size_t) || defined(__need_wchar_t) || defined(__need_NULL) || \ - defined(__need_wint_t) - -# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -# endif - -# include_next - -#elif !defined(_LIBCPP_STDDEF_H) -# define _LIBCPP_STDDEF_H - /* stddef.h synopsis @@ -36,15 +24,18 @@ Types: */ -# include <__config> +#include <__config> -# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -# endif +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif -# if __has_include_next() -# include_next -# endif +// Note: This include is outside of header guards because we sometimes get included multiple times +// with different defines and the underlying will know how to deal with that. +#include_next + +#ifndef _LIBCPP_STDDEF_H +# define _LIBCPP_STDDEF_H # ifdef __cplusplus typedef decltype(nullptr) nullptr_t; diff --git a/yass/third_party/libc++/trunk/include/strstream b/yass/third_party/libc++/trunk/include/strstream index e9f533644f..c8df6eb0da 100644 --- a/yass/third_party/libc++/trunk/include/strstream +++ b/yass/third_party/libc++/trunk/include/strstream @@ -13,7 +13,7 @@ /* strstream synopsis -class strstreambuf +class strstreambuf // Removed in C++26 : public basic_streambuf { public: @@ -63,7 +63,7 @@ private: void (*pfree)(void*); // exposition only }; -class istrstream +class istrstream // Removed in C++26 : public basic_istream { public: @@ -81,7 +81,7 @@ private: strstreambuf sb; // exposition only }; -class ostrstream +class ostrstream // Removed in C++26 : public basic_ostream { public: @@ -99,7 +99,7 @@ private: strstreambuf sb; // exposition only }; -class strstream +class strstream // Removed in C++26 : public basic_iostream { public: @@ -138,6 +138,8 @@ private: # pragma GCC system_header #endif +#if _LIBCPP_STD_VER < 26 || defined(_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM) || defined(_LIBCPP_BUILDING_LIBRARY) + _LIBCPP_PUSH_MACROS #include <__undef_macros> @@ -344,4 +346,6 @@ _LIBCPP_END_NAMESPACE_STD _LIBCPP_POP_MACROS +#endif // _LIBCPP_STD_VER < 26 || defined(_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM) || defined(_LIBCPP_BUILDING_LIBRARY) + #endif // _LIBCPP_STRSTREAM diff --git a/yass/third_party/libc++/trunk/include/thread b/yass/third_party/libc++/trunk/include/thread index ed70bde760..68ce63bd01 100644 --- a/yass/third_party/libc++/trunk/include/thread +++ b/yass/third_party/libc++/trunk/include/thread @@ -92,7 +92,6 @@ void sleep_for(const chrono::duration& rel_time); # error " is not supported since libc++ has been configured without support for threads." #endif -#include <__availability> #include <__thread/formatter.h> #include <__thread/jthread.h> #include <__thread/support.h> diff --git a/yass/third_party/libc++/trunk/include/tuple b/yass/third_party/libc++/trunk/include/tuple index a9f0d680fe..c7fc5509a0 100644 --- a/yass/third_party/libc++/trunk/include/tuple +++ b/yass/third_party/libc++/trunk/include/tuple @@ -210,6 +210,7 @@ template #include <__config> #include <__functional/invoke.h> #include <__fwd/array.h> +#include <__fwd/pair.h> #include <__fwd/tuple.h> #include <__memory/allocator_arg_t.h> #include <__memory/uses_allocator.h> @@ -250,7 +251,6 @@ template #include <__utility/forward.h> #include <__utility/integer_sequence.h> #include <__utility/move.h> -#include <__utility/pair.h> #include <__utility/piecewise_construct.h> #include <__utility/swap.h> #include @@ -1348,17 +1348,6 @@ tuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls) { template struct _LIBCPP_TEMPLATE_VIS uses_allocator, _Alloc> : true_type {}; -template -template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_T1, _T2>::pair( - piecewise_construct_t, - tuple<_Args1...>& __first_args, - tuple<_Args2...>& __second_args, - __tuple_indices<_I1...>, - __tuple_indices<_I2...>) - : first(std::forward<_Args1>(std::get<_I1>(__first_args))...), - second(std::forward<_Args2>(std::get<_I2>(__second_args))...) {} - # if _LIBCPP_STD_VER >= 17 # define _LIBCPP_NOEXCEPT_RETURN(...) \ noexcept(noexcept(__VA_ARGS__)) { return __VA_ARGS__; } diff --git a/yass/third_party/libc++/trunk/include/typeinfo b/yass/third_party/libc++/trunk/include/typeinfo index dafc7b8924..d1c0de3c1b 100644 --- a/yass/third_party/libc++/trunk/include/typeinfo +++ b/yass/third_party/libc++/trunk/include/typeinfo @@ -56,7 +56,6 @@ public: */ -#include <__availability> #include <__config> #include <__exception/exception.h> #include <__type_traits/is_constant_evaluated.h> @@ -276,7 +275,19 @@ struct __type_info_implementations { __impl; }; -class _LIBCPP_EXPORTED_FROM_ABI type_info { +# if defined(__arm64__) && __has_cpp_attribute(clang::ptrauth_vtable_pointer) +# if __has_feature(ptrauth_type_info_discriminated_vtable_pointer) +# define _LIBCPP_TYPE_INFO_VTABLE_POINTER_AUTH \ + [[clang::ptrauth_vtable_pointer(process_independent, address_discrimination, type_discrimination)]] +# else +# define _LIBCPP_TYPE_INFO_VTABLE_POINTER_AUTH \ + [[clang::ptrauth_vtable_pointer(process_independent, no_address_discrimination, no_extra_discrimination)]] +# endif +# else +# define _LIBCPP_TYPE_INFO_VTABLE_POINTER_AUTH +# endif + +class _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_TYPE_INFO_VTABLE_POINTER_AUTH type_info { type_info& operator=(const type_info&); type_info(const type_info&); diff --git a/yass/third_party/libc++/trunk/include/variant b/yass/third_party/libc++/trunk/include/variant index f5e99fc323..1b5e84e954 100644 --- a/yass/third_party/libc++/trunk/include/variant +++ b/yass/third_party/libc++/trunk/include/variant @@ -235,11 +235,13 @@ namespace std { #include <__type_traits/is_destructible.h> #include <__type_traits/is_nothrow_assignable.h> #include <__type_traits/is_nothrow_constructible.h> +#include <__type_traits/is_reference.h> #include <__type_traits/is_trivially_assignable.h> #include <__type_traits/is_trivially_constructible.h> #include <__type_traits/is_trivially_destructible.h> #include <__type_traits/is_void.h> #include <__type_traits/remove_const.h> +#include <__type_traits/remove_cvref.h> #include <__type_traits/type_identity.h> #include <__type_traits/void_t.h> #include <__utility/declval.h> diff --git a/yass/third_party/libc++/trunk/include/version b/yass/third_party/libc++/trunk/include/version index 3bd296e34a..0ed77345ba 100644 --- a/yass/third_party/libc++/trunk/include/version +++ b/yass/third_party/libc++/trunk/include/version @@ -35,13 +35,13 @@ __cpp_lib_atomic_flag_test 201907L __cpp_lib_atomic_float 201711L __cpp_lib_atomic_is_always_lock_free 201603L __cpp_lib_atomic_lock_free_type_aliases 201907L +__cpp_lib_atomic_min_max 202403L __cpp_lib_atomic_ref 201806L __cpp_lib_atomic_shared_ptr 201711L __cpp_lib_atomic_value_initialization 201911L __cpp_lib_atomic_wait 201907L __cpp_lib_barrier 201907L -__cpp_lib_bind_back 202306L - 202202L // C++23 +__cpp_lib_bind_back 202202L __cpp_lib_bind_front 202306L 201907L // C++20 __cpp_lib_bit_cast 201806L @@ -77,9 +77,14 @@ __cpp_lib_constexpr_tuple 201811L __cpp_lib_constexpr_typeinfo 202106L __cpp_lib_constexpr_utility 201811L __cpp_lib_constexpr_vector 201907L +__cpp_lib_constrained_equality 202403L + __cpp_lib_copyable_function 202306L __cpp_lib_coroutine 201902L __cpp_lib_debugging 202311L +__cpp_lib_default_template_type_for_algorithm_values 202403L + + __cpp_lib_destroying_delete 201806L __cpp_lib_enable_shared_from_this 201603L __cpp_lib_endian 201907L @@ -92,6 +97,7 @@ __cpp_lib_execution 201902L __cpp_lib_expected 202211L __cpp_lib_filesystem 201703L __cpp_lib_format 202106L +__cpp_lib_format_path 202403L __cpp_lib_format_ranges 202207L __cpp_lib_format_uchar 202311L __cpp_lib_formatters 202302L @@ -107,6 +113,7 @@ __cpp_lib_freestanding_variant 202311L __cpp_lib_fstream_native_handle 202306L __cpp_lib_function_ref 202306L __cpp_lib_gcd_lcm 201606L +__cpp_lib_generate_random 202403L __cpp_lib_generic_associative_lookup 201304L __cpp_lib_generic_unordered_lookup 201811L __cpp_lib_hardware_interference_size 201703L @@ -170,6 +177,7 @@ __cpp_lib_ranges_as_const 202207L __cpp_lib_ranges_as_rvalue 202207L __cpp_lib_ranges_chunk 202202L __cpp_lib_ranges_chunk_by 202202L +__cpp_lib_ranges_concat 202403L __cpp_lib_ranges_contains 202207L __cpp_lib_ranges_iota 202202L __cpp_lib_ranges_join_with 202202L @@ -185,6 +193,7 @@ __cpp_lib_ratio 202306L __cpp_lib_raw_memory_algorithms 201606L __cpp_lib_rcu 202306L __cpp_lib_reference_from_temporary 202202L +__cpp_lib_reference_wrapper 202403L __cpp_lib_remove_cvref 201711L __cpp_lib_result_of_sfinae 201210L __cpp_lib_robust_nonmodifying_seq_ops 201304L @@ -439,7 +448,7 @@ __cpp_lib_within_lifetime 202306L # define __cpp_lib_adaptor_iterator_pair_constructor 202106L # define __cpp_lib_allocate_at_least 202302L // # define __cpp_lib_associative_heterogeneous_erasure 202110L -// # define __cpp_lib_bind_back 202202L +# define __cpp_lib_bind_back 202202L # define __cpp_lib_byteswap 202110L # define __cpp_lib_constexpr_bitset 202207L # define __cpp_lib_constexpr_charconv 202207L @@ -448,6 +457,7 @@ __cpp_lib_within_lifetime 202306L # define __cpp_lib_constexpr_memory 202202L # define __cpp_lib_constexpr_typeinfo 202106L # define __cpp_lib_expected 202211L +// # define __cpp_lib_format_path 202403L # define __cpp_lib_format_ranges 202207L // # define __cpp_lib_formatters 202302L # define __cpp_lib_forward_like 202207L @@ -486,13 +496,14 @@ __cpp_lib_within_lifetime 202306L #if _LIBCPP_STD_VER >= 26 // # define __cpp_lib_associative_heterogeneous_insertion 202306L -# undef __cpp_lib_bind_back -// # define __cpp_lib_bind_back 202306L +// # define __cpp_lib_atomic_min_max 202403L # undef __cpp_lib_bind_front # define __cpp_lib_bind_front 202306L # define __cpp_lib_bitset 202306L +// # define __cpp_lib_constrained_equality 202403L // # define __cpp_lib_copyable_function 202306L // # define __cpp_lib_debugging 202311L +// # define __cpp_lib_default_template_type_for_algorithm_values 202403L // # define __cpp_lib_freestanding_algorithm 202311L // # define __cpp_lib_freestanding_array 202311L // # define __cpp_lib_freestanding_cstring 202306L @@ -505,12 +516,15 @@ __cpp_lib_within_lifetime 202306L # define __cpp_lib_fstream_native_handle 202306L # endif // # define __cpp_lib_function_ref 202306L +// # define __cpp_lib_generate_random 202403L // # define __cpp_lib_hazard_pointer 202306L // # define __cpp_lib_linalg 202311L # undef __cpp_lib_out_ptr // # define __cpp_lib_out_ptr 202311L +// # define __cpp_lib_ranges_concat 202403L # define __cpp_lib_ratio 202306L // # define __cpp_lib_rcu 202306L +// # define __cpp_lib_reference_wrapper 202403L # define __cpp_lib_saturation_arithmetic 202311L // # define __cpp_lib_smart_ptr_owner_equality 202306L # define __cpp_lib_span_at 202311L diff --git a/yass/third_party/libc++/trunk/modules/std/chrono.inc b/yass/third_party/libc++/trunk/modules/std/chrono.inc index 109023a3ab..575e6347ae 100644 --- a/yass/third_party/libc++/trunk/modules/std/chrono.inc +++ b/yass/third_party/libc++/trunk/modules/std/chrono.inc @@ -199,33 +199,32 @@ export namespace std { using std::chrono::tzdb_list; // [time.zone.db.access], time zone database access - // using std::chrono::current_zone; + using std::chrono::current_zone; using std::chrono::get_tzdb; using std::chrono::get_tzdb_list; - // using std::chrono::locate_zone; + using std::chrono::locate_zone; // [time.zone.db.remote], remote time zone database support using std::chrono::reload_tzdb; using std::chrono::remote_version; -# endif // !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) && - // !defined(_LIBCPP_HAS_NO_LOCALIZATION) - -# if 0 +# if 0 // [time.zone.exception], exception classes using std::chrono::ambiguous_local_time; using std::chrono::nonexistent_local_time; +# endif // if 0 // [time.zone.info], information classes using std::chrono::sys_info; +# if 0 // [time.zone.timezone], class time_zone using std::chrono::choose; -# endif -# ifdef _LIBCPP_ENABLE_EXPERIMENTAL +# endif // if 0 + using std::chrono::time_zone; -# endif -# if 0 + +# if 0 // [time.zone.zonedtraits], class template zoned_traits using std::chrono::zoned_traits; @@ -234,22 +233,23 @@ export namespace std { using std::chrono::zoned_time; using std::chrono::zoned_seconds; +# endif // if 0 // [time.zone.leap], leap second support using std::chrono::leap_second; -# endif -# ifdef _LIBCPP_ENABLE_EXPERIMENTAL // [time.zone.link], class time_zone_link using std::chrono::time_zone_link; -# endif -# if 0 +# if 0 // [time.format], formatting using std::chrono::local_time_format; -# endif -#endif // _LIBCPP_ENABLE_EXPERIMENTAL - } // namespace chrono +# endif +# endif // _LIBCPP_ENABLE_EXPERIMENTAL +#endif // !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) && + // !defined(_LIBCPP_HAS_NO_LOCALIZATION) + + } // namespace chrono #ifndef _LIBCPP_HAS_NO_LOCALIZATION using std::formatter; diff --git a/yass/third_party/libc++/trunk/modules/std/functional.inc b/yass/third_party/libc++/trunk/modules/std/functional.inc index 1148944a9d..ddc7d023ee 100644 --- a/yass/third_party/libc++/trunk/modules/std/functional.inc +++ b/yass/third_party/libc++/trunk/modules/std/functional.inc @@ -56,8 +56,10 @@ export namespace std { using std::not_fn; // [func.bind.partial], function templates bind_front and bind_back - // using std::bind_back; using std::bind_front; +#if _LIBCPP_STD_VER >= 23 + using std::bind_back; +#endif // [func.bind], bind using std::is_bind_expression; diff --git a/yass/third_party/libc++/trunk/modules/std/locale.inc b/yass/third_party/libc++/trunk/modules/std/locale.inc index c34f56530e..8975453864 100644 --- a/yass/third_party/libc++/trunk/modules/std/locale.inc +++ b/yass/third_party/libc++/trunk/modules/std/locale.inc @@ -67,10 +67,15 @@ export namespace std { using std::messages_base; using std::messages_byname; +# if _LIBCPP_STD_VER < 26 || defined(_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT) + // [depr.conversions.buffer] using std::wbuffer_convert; // [depr.conversions.string] using std::wstring_convert; + +# endif // _LIBCPP_STD_VER < 26 || defined(_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT) + #endif // _LIBCPP_HAS_NO_LOCALIZATION } // namespace std diff --git a/yass/third_party/libc++/trunk/modules/std/strstream.inc b/yass/third_party/libc++/trunk/modules/std/strstream.inc index a33c514f15..808796701a 100644 --- a/yass/third_party/libc++/trunk/modules/std/strstream.inc +++ b/yass/third_party/libc++/trunk/modules/std/strstream.inc @@ -9,9 +9,11 @@ export namespace std { #ifndef _LIBCPP_HAS_NO_LOCALIZATION +# if _LIBCPP_STD_VER < 26 || defined(_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM) using std::istrstream; using std::ostrstream; using std::strstream; using std::strstreambuf; +# endif // _LIBCPP_STD_VER < 26 || defined(_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM) #endif // _LIBCPP_HAS_NO_LOCALIZATION } // namespace std diff --git a/yass/third_party/libc++/trunk/src/CMakeLists.txt b/yass/third_party/libc++/trunk/src/CMakeLists.txt index 1110a79ddc..208500ec14 100644 --- a/yass/third_party/libc++/trunk/src/CMakeLists.txt +++ b/yass/third_party/libc++/trunk/src/CMakeLists.txt @@ -334,7 +334,6 @@ endif() if (LIBCXX_ENABLE_LOCALIZATION AND LIBCXX_ENABLE_FILESYSTEM AND LIBCXX_ENABLE_TIME_ZONE_DATABASE) list(APPEND LIBCXX_EXPERIMENTAL_SOURCES - include/tzdb/time_zone_link_private.h include/tzdb/time_zone_private.h include/tzdb/types_private.h include/tzdb/tzdb_list_private.h diff --git a/yass/third_party/libc++/trunk/src/include/overridable_function.h b/yass/third_party/libc++/trunk/src/include/overridable_function.h index 7b0fba10f4..fca66ea6da 100644 --- a/yass/third_party/libc++/trunk/src/include/overridable_function.h +++ b/yass/third_party/libc++/trunk/src/include/overridable_function.h @@ -13,6 +13,10 @@ #include <__config> #include +#if defined(__arm64e__) && __has_feature(ptrauth_calls) +# include +#endif + #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif @@ -81,6 +85,14 @@ _LIBCPP_HIDE_FROM_ABI bool __is_function_overridden(_Ret (*__fptr)(_Args...)) no uintptr_t __end = reinterpret_cast(&__lcxx_override_end); uintptr_t __ptr = reinterpret_cast(__fptr); +#if defined(__arm64e__) && __has_feature(ptrauth_calls) + // We must pass a void* to ptrauth_strip since it only accepts a pointer type. Also, in particular, + // we must NOT pass a function pointer, otherwise we will strip the function pointer, and then attempt + // to authenticate and re-sign it when casting it to a uintptr_t again, which will fail because we just + // stripped the function pointer. See rdar://122927845. + __ptr = reinterpret_cast(ptrauth_strip(reinterpret_cast(__ptr), ptrauth_key_function_pointer)); +#endif + // Finally, the function was overridden if it falls outside of the section's bounds. return __ptr < __start || __ptr > __end; } diff --git a/yass/third_party/libc++/trunk/src/include/tzdb/time_zone_link_private.h b/yass/third_party/libc++/trunk/src/include/tzdb/time_zone_link_private.h deleted file mode 100644 index 1392376252..0000000000 --- a/yass/third_party/libc++/trunk/src/include/tzdb/time_zone_link_private.h +++ /dev/null @@ -1,27 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// For information see https://libcxx.llvm.org/DesignDocs/TimeZone.html - -#ifndef _LIBCPP_SRC_INCLUDE_TZDB_TIME_ZONE_LINK_PRIVATE_H -#define _LIBCPP_SRC_INCLUDE_TZDB_TIME_ZONE_LINK_PRIVATE_H - -#include - -_LIBCPP_BEGIN_NAMESPACE_STD - -namespace chrono { - -struct time_zone_link::__constructor_tag {}; - -} // namespace chrono - -_LIBCPP_END_NAMESPACE_STD - -#endif // _LIBCPP_SRC_INCLUDE_TZDB_TIME_ZONE_LINK_PRIVATE_H diff --git a/yass/third_party/libc++/trunk/src/include/tzdb/time_zone_private.h b/yass/third_party/libc++/trunk/src/include/tzdb/time_zone_private.h index 039a3b0ffe..2c47e9fdb1 100644 --- a/yass/third_party/libc++/trunk/src/include/tzdb/time_zone_private.h +++ b/yass/third_party/libc++/trunk/src/include/tzdb/time_zone_private.h @@ -24,7 +24,8 @@ namespace chrono { class time_zone::__impl { public: - explicit _LIBCPP_HIDE_FROM_ABI __impl(string&& __name) : __name_(std::move(__name)) {} + explicit _LIBCPP_HIDE_FROM_ABI __impl(string&& __name, const __tz::__rules_storage_type& __rules_db) + : __name_(std::move(__name)), __rules_db_(__rules_db) {} [[nodiscard]] _LIBCPP_HIDE_FROM_ABI string_view __name() const noexcept { return __name_; } @@ -33,12 +34,20 @@ public: return __continuations_; } + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI const __tz::__rules_storage_type& __rules_db() const { return __rules_db_; } + private: string __name_; // Note the first line has a name + __continuation, the other lines // are just __continuations. So there is always at least one item in // the vector. vector<__tz::__continuation> __continuations_; + + // Continuations often depend on a set of rules. The rules are stored in + // parallel data structurs in tzdb_list. From the time_zone it's not possible + // to find its associated tzdb entry and thus not possible to find its + // associated rules. Therefore a link to the rules in stored in this class. + const __tz::__rules_storage_type& __rules_db_; }; } // namespace chrono diff --git a/yass/third_party/libc++/trunk/src/include/tzdb/types_private.h b/yass/third_party/libc++/trunk/src/include/tzdb/types_private.h index 4604b9fc88..c86982948b 100644 --- a/yass/third_party/libc++/trunk/src/include/tzdb/types_private.h +++ b/yass/third_party/libc++/trunk/src/include/tzdb/types_private.h @@ -33,7 +33,17 @@ namespace chrono::__tz { // Sun>=8 first Sunday on or after the eighth // Sun<=25 last Sunday on or before the 25th struct __constrained_weekday { - /* year_month_day operator()(year __year, month __month);*/ // needed but not implemented + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI year_month_day operator()(year __year, month __month) const { + auto __result = static_cast(year_month_day{__year, __month, __day}); + weekday __wd{static_cast(__result)}; + + if (__comparison == __le) + __result -= __wd - __weekday; + else + __result += __weekday - __wd; + + return __result; + } weekday __weekday; enum __comparison_t { __le, __ge } __comparison; @@ -85,7 +95,8 @@ struct __continuation { // used. // If this field contains - then standard time always // applies. This is indicated by the monostate. - using __rules_t = variant; + // TODO TZDB Investigate implantation the size_t based caching. + using __rules_t = variant; __rules_t __rules; diff --git a/yass/third_party/libc++/trunk/src/locale.cpp b/yass/third_party/libc++/trunk/src/locale.cpp index 7fdd5be181..1ca88e30f6 100644 --- a/yass/third_party/libc++/trunk/src/locale.cpp +++ b/yass/third_party/libc++/trunk/src/locale.cpp @@ -497,7 +497,7 @@ constinit __no_destroy locale::__imp::classic_locale_imp_(__uninitialized_tag{}); // initialized below in classic() const locale& locale::classic() { - static const __no_destroy classic_locale(__private_tag{}, [] { + static const __no_destroy classic_locale(__private_constructor_tag{}, [] { // executed exactly once on first initialization of `classic_locale` locale::__imp::classic_locale_imp_.__emplace(1u); return &locale::__imp::classic_locale_imp_.__get(); diff --git a/yass/third_party/libc++/trunk/src/random.cpp b/yass/third_party/libc++/trunk/src/random.cpp index 93590af310..14c6f4473d 100644 --- a/yass/third_party/libc++/trunk/src/random.cpp +++ b/yass/third_party/libc++/trunk/src/random.cpp @@ -79,10 +79,8 @@ unsigned random_device::operator()() { char* p = reinterpret_cast(&r); while (n > 0) { ssize_t s = read(__f_, p, n); - _LIBCPP_SUPPRESS_DEPRECATED_PUSH if (s == 0) - __throw_system_error(ENODATA, "random_device got EOF"); // TODO ENODATA -> ENOMSG - _LIBCPP_SUPPRESS_DEPRECATED_POP + __throw_system_error(ENOMSG, "random_device got EOF"); if (s == -1) { if (errno != EINTR) __throw_system_error(errno, "random_device got an unexpected error"); diff --git a/yass/third_party/libc++/trunk/src/time_zone.cpp b/yass/third_party/libc++/trunk/src/time_zone.cpp index b6bf06a116..aef6ac674a 100644 --- a/yass/third_party/libc++/trunk/src/time_zone.cpp +++ b/yass/third_party/libc++/trunk/src/time_zone.cpp @@ -8,14 +8,712 @@ // For information see https://libcxx.llvm.org/DesignDocs/TimeZone.html +// TODO TZDB look at optimizations +// +// The current algorithm is correct but not efficient. For example, in a named +// rule based continuation finding the next rule does quite a bit of work, +// returns the next rule and "forgets" its state. This could be better. +// +// It would be possible to cache lookups. If a time for a zone is calculated its +// sys_info could be kept and the next lookup could test whether the time is in +// a "known" sys_info. The wording in the Standard hints at this slowness by +// "suggesting" this could be implemented on the user's side. + +// TODO TZDB look at removing quirks +// +// The code has some special rules to adjust the timing at the continuation +// switches. This works correctly, but some of the places feel odd. It would be +// good to investigate this further and see whether all quirks are needed or +// that there are better fixes. +// +// These quirks often use a 12h interval; this is the scan interval of zdump, +// which implies there are no sys_info objects with a duration of less than 12h. + +#include +#include #include +#include +#include +#include #include "include/tzdb/time_zone_private.h" +#include "include/tzdb/tzdb_list_private.h" + +// TODO TZDB remove debug printing +#ifdef PRINT +# include +#endif _LIBCPP_BEGIN_NAMESPACE_STD +#ifdef PRINT +template <> +struct formatter { + template + constexpr typename ParseContext::iterator parse(ParseContext& ctx) { + return ctx.begin(); + } + + template + typename FormatContext::iterator format(const chrono::sys_info& info, FormatContext& ctx) const { + return std::format_to( + ctx.out(), "[{}, {}) {:%Q%q} {:%Q%q} {}", info.begin, info.end, info.offset, info.save, info.abbrev); + } +}; +#endif + namespace chrono { +//===----------------------------------------------------------------------===// +// Details +//===----------------------------------------------------------------------===// + +struct __sys_info { + sys_info __info; + bool __can_merge; // Can the returned sys_info object be merged with +}; + +// Return type for helper function to get a sys_info. +// - The expected result returns the "best" sys_info object. This object can be +// before the requested time. Sometimes sys_info objects from different +// continuations share their offset, save, and abbrev and these objects are +// merged to one sys_info object. The __can_merge flag determines whether the +// current result can be merged with the next result. +// - The unexpected result means no sys_info object was found and the time is +// the time to be used for the next search iteration. +using __sys_info_result = expected<__sys_info, sys_seconds>; + +template , _Proj>> _Comp = ranges::less> +[[nodiscard]] static ranges::borrowed_iterator_t<_Range> +__binary_find(_Range&& __r, const _Type& __value, _Comp __comp = {}, _Proj __proj = {}) { + auto __end = ranges::end(__r); + auto __ret = ranges::lower_bound(ranges::begin(__r), __end, __value, __comp, __proj); + if (__ret == __end) + return __end; + + // When the value does not match the predicate it's equal and a valid result + // was found. + return !std::invoke(__comp, __value, std::invoke(__proj, *__ret)) ? __ret : __end; +} + +// Format based on https://data.iana.org/time-zones/tz-how-to.html +// +// 1 a time zone abbreviation that is a string of three or more characters that +// are either ASCII alphanumerics, "+", or "-" +// 2 the string "%z", in which case the "%z" will be replaced by a numeric time +// zone abbreviation +// 3 a pair of time zone abbreviations separated by a slash ('/'), in which +// case the first string is the abbreviation for the standard time name and +// the second string is the abbreviation for the daylight saving time name +// 4 a string containing "%s", in which case the "%s" will be replaced by the +// text in the appropriate Rule's LETTER column, and the resulting string +// should be a time zone abbreviation +// +// Rule 1 is not strictly validated since America/Barbados uses a two letter +// abbreviation AT. +[[nodiscard]] static string +__format(const __tz::__continuation& __continuation, const string& __letters, seconds __save) { + bool __shift = false; + string __result; + for (char __c : __continuation.__format) { + if (__shift) { + switch (__c) { + case 's': + std::ranges::copy(__letters, std::back_inserter(__result)); + break; + + case 'z': { + if (__continuation.__format.size() != 2) + std::__throw_runtime_error( + std::format("corrupt tzdb FORMAT field: %z should be the entire contents, instead contains '{}'", + __continuation.__format) + .c_str()); + chrono::hh_mm_ss __offset{__continuation.__stdoff + __save}; + if (__offset.is_negative()) { + __result += '-'; + __offset = chrono::hh_mm_ss{-(__continuation.__stdoff + __save)}; + } else + __result += '+'; + + if (__offset.minutes() != 0min) + std::format_to(std::back_inserter(__result), "{:%H%M}", __offset); + else + std::format_to(std::back_inserter(__result), "{:%H}", __offset); + } break; + + default: + std::__throw_runtime_error( + std::format("corrupt tzdb FORMAT field: invalid sequence '%{}' found, expected %s or %z", __c).c_str()); + } + __shift = false; + + } else if (__c == '/') { + if (__save != 0s) + __result.clear(); + else + break; + + } else if (__c == '%') { + __shift = true; + } else if (__c == '+' || __c == '-' || std::isalnum(__c)) { + __result.push_back(__c); + } else { + std::__throw_runtime_error( + std::format( + "corrupt tzdb FORMAT field: invalid character '{}' found, expected +, -, or an alphanumeric value", __c) + .c_str()); + } + } + + if (__shift) + std::__throw_runtime_error("corrupt tzdb FORMAT field: input ended with the start of the escape sequence '%'"); + + if (__result.empty()) + std::__throw_runtime_error("corrupt tzdb FORMAT field: result is empty"); + + return __result; +} + +[[nodiscard]] static sys_seconds __to_sys_seconds(year_month_day __ymd, seconds __seconds) { + seconds __result = static_cast(__ymd).time_since_epoch() + __seconds; + return sys_seconds{__result}; +} + +[[nodiscard]] static seconds __at_to_sys_seconds(const __tz::__continuation& __continuation) { + switch (__continuation.__at.__clock) { + case __tz::__clock::__local: + return __continuation.__at.__time - __continuation.__stdoff - + std::visit( + [](const auto& __value) { + using _Tp = decay_t; + if constexpr (same_as<_Tp, monostate>) + return chrono::seconds{0}; + else if constexpr (same_as<_Tp, __tz::__save>) + return chrono::duration_cast(__value.__time); + else if constexpr (same_as<_Tp, std::string>) + // For a named rule based continuation the SAVE depends on the RULE + // active at the end. This should be determined separately. + return chrono::seconds{0}; + else + static_assert(sizeof(_Tp) == 0); // TODO TZDB static_assert(false); after droping clang-16 support + + std::__libcpp_unreachable(); + }, + __continuation.__rules); + + case __tz::__clock::__universal: + return __continuation.__at.__time; + + case __tz::__clock::__standard: + return __continuation.__at.__time - __continuation.__stdoff; + } + std::__libcpp_unreachable(); +} + +[[nodiscard]] static year_month_day __to_year_month_day(year __year, month __month, __tz::__on __on) { + return std::visit( + [&](const auto& __value) { + using _Tp = decay_t; + if constexpr (same_as<_Tp, chrono::day>) + return year_month_day{__year, __month, __value}; + else if constexpr (same_as<_Tp, weekday_last>) + return year_month_day{static_cast(year_month_weekday_last{__year, __month, __value})}; + else if constexpr (same_as<_Tp, __tz::__constrained_weekday>) + return __value(__year, __month); + else + static_assert(sizeof(_Tp) == 0); // TODO TZDB static_assert(false); after droping clang-16 support + + std::__libcpp_unreachable(); + }, + __on); +} + +[[nodiscard]] static sys_seconds __until_to_sys_seconds(const __tz::__continuation& __continuation) { + // Does UNTIL contain the magic value for the last continuation? + if (__continuation.__year == chrono::year::min()) + return sys_seconds::max(); + + year_month_day __ymd = chrono::__to_year_month_day(__continuation.__year, __continuation.__in, __continuation.__on); + return chrono::__to_sys_seconds(__ymd, chrono::__at_to_sys_seconds(__continuation)); +} + +// Holds the UNTIL time for a continuation with a named rule. +// +// Unlike continuations with an fixed SAVE named rules have a variable SAVE. +// This means when the UNTIL uses the local wall time the actual UNTIL value can +// only be determined when the SAVE is known. This class holds that abstraction. +class __named_rule_until { +public: + explicit __named_rule_until(const __tz::__continuation& __continuation) + : __until_{chrono::__until_to_sys_seconds(__continuation)}, + __needs_adjustment_{ + // The last continuation of a ZONE has no UNTIL which basically is + // until the end of _local_ time. This value is expressed by + // sys_seconds::max(). Subtracting the SAVE leaves large value. + // However SAVE can be negative, which would add a value to maximum + // leading to undefined behaviour. In practice this often results in + // an overflow to a very small value. + __until_ != sys_seconds::max() && __continuation.__at.__clock == __tz::__clock::__local} {} + + // Gives the unadjusted until value, this is useful when the SAVE is not known + // at all. + sys_seconds __until() const noexcept { return __until_; } + + bool __needs_adjustment() const noexcept { return __needs_adjustment_; } + + // Returns the UNTIL adjusted for SAVE. + sys_seconds operator()(seconds __save) const noexcept { return __until_ - __needs_adjustment_ * __save; } + +private: + sys_seconds __until_; + bool __needs_adjustment_; +}; + +[[nodiscard]] static seconds __at_to_seconds(seconds __stdoff, const __tz::__rule& __rule) { + switch (__rule.__at.__clock) { + case __tz::__clock::__local: + // Local time and standard time behave the same. This is not + // correct. Local time needs to adjust for the current saved time. + // To know the saved time the rules need to be known and sorted. + // This needs a time so to avoid the chicken and egg adjust the + // saving of the local time later. + return __rule.__at.__time - __stdoff; + + case __tz::__clock::__universal: + return __rule.__at.__time; + + case __tz::__clock::__standard: + return __rule.__at.__time - __stdoff; + } + std::__libcpp_unreachable(); +} + +[[nodiscard]] static sys_seconds __from_to_sys_seconds(seconds __stdoff, const __tz::__rule& __rule, year __year) { + year_month_day __ymd = chrono::__to_year_month_day(__year, __rule.__in, __rule.__on); + + seconds __at = chrono::__at_to_seconds(__stdoff, __rule); + return chrono::__to_sys_seconds(__ymd, __at); +} + +[[nodiscard]] static sys_seconds __from_to_sys_seconds(seconds __stdoff, const __tz::__rule& __rule) { + return chrono::__from_to_sys_seconds(__stdoff, __rule, __rule.__from); +} + +[[nodiscard]] static const vector<__tz::__rule>& +__get_rules(const __tz::__rules_storage_type& __rules_db, const string& __rule_name) { + auto __result = chrono::__binary_find(__rules_db, __rule_name, {}, [](const auto& __p) { return __p.first; }); + if (__result == std::end(__rules_db)) + std::__throw_runtime_error(("corrupt tzdb: rule '" + __rule_name + " 'does not exist").c_str()); + + return __result->second; +} + +// Returns the letters field for a time before the first rule. +// +// Per https://data.iana.org/time-zones/tz-how-to.html +// One wrinkle, not fully explained in zic.8.txt, is what happens when switching +// to a named rule. To what values should the SAVE and LETTER data be +// initialized? +// +// 1 If at least one transition has happened, use the SAVE and LETTER data from +// the most recent. +// 2 If switching to a named rule before any transition has happened, assume +// standard time (SAVE zero), and use the LETTER data from the earliest +// transition with a SAVE of zero. +// +// This function implements case 2. +[[nodiscard]] static string __letters_before_first_rule(const vector<__tz::__rule>& __rules) { + auto __letters = + __rules // + | views::filter([](const __tz::__rule& __rule) { return __rule.__save.__time == 0s; }) // + | views::transform([](const __tz::__rule& __rule) { return __rule.__letters; }) // + | views::take(1); + + if (__letters.empty()) + std::__throw_runtime_error("corrupt tzdb: rule has zero entries"); + + return __letters.front(); +} + +// Determines the information based on the continuation and the rules. +// +// There are several special cases to take into account +// +// === Entries before the first rule becomes active === +// Asia/Hong_Kong +// 9 - JST 1945 N 18 2 // (1) +// 8 HK HK%sT // (2) +// R HK 1946 o - Ap 21 0 1 S // (3) +// There (1) is active until Novemer 18th 1945 at 02:00, after this time +// (2) becomes active. The first rule entry for HK (3) becomes active +// from April 21st 1945 at 01:00. In the period between (2) is active. +// This entry has an offset. +// This entry has no save, letters, or dst flag. So in the period +// after (1) and until (3) no rule entry is associated with the time. + +[[nodiscard]] static sys_info __get_sys_info_before_first_rule( + sys_seconds __begin, + sys_seconds __end, + const __tz::__continuation& __continuation, + const vector<__tz::__rule>& __rules) { + return sys_info{ + __begin, + __end, + __continuation.__stdoff, + chrono::minutes(0), + chrono::__format(__continuation, __letters_before_first_rule(__rules), 0s)}; +} + +// Returns the sys_info object for a time before the first rule. +// When this first rule has a SAVE of 0s the sys_info for the time before the +// first rule and for the first rule are identical and will be merged. +[[nodiscard]] static sys_info __get_sys_info_before_first_rule( + sys_seconds __begin, + sys_seconds __rule_end, // The end used when SAVE != 0s + sys_seconds __next_end, // The end used when SAVE == 0s the times are merged + const __tz::__continuation& __continuation, + const vector<__tz::__rule>& __rules, + vector<__tz::__rule>::const_iterator __rule) { + if (__rule->__save.__time != 0s) + return __get_sys_info_before_first_rule(__begin, __rule_end, __continuation, __rules); + + return sys_info{ + __begin, __next_end, __continuation.__stdoff, 0min, chrono::__format(__continuation, __rule->__letters, 0s)}; +} + +[[nodiscard]] static seconds __at_to_seconds(seconds __stdoff, seconds __save, const __tz::__rule& __rule) { + switch (__rule.__at.__clock) { + case __tz::__clock::__local: + return __rule.__at.__time - __stdoff - __save; + + case __tz::__clock::__universal: + return __rule.__at.__time; + + case __tz::__clock::__standard: + return __rule.__at.__time - __stdoff; + } + std::__libcpp_unreachable(); +} + +[[nodiscard]] static sys_seconds +__rule_to_sys_seconds(seconds __stdoff, seconds __save, const __tz::__rule& __rule, year __year) { + year_month_day __ymd = chrono::__to_year_month_day(__year, __rule.__in, __rule.__on); + + seconds __at = chrono::__at_to_seconds(__stdoff, __save, __rule); + return chrono::__to_sys_seconds(__ymd, __at); +} + +// Returns the first rule after __time. +// Note that a rule can be "active" in multiple years, this may result in an +// infinite loop where the same rule is returned every time, use __current to +// guard against that. +// +// When no next rule exists the returned time will be sys_seconds::max(). This +// can happen in practice. For example, +// +// R So 1945 o - May 24 2 2 M +// R So 1945 o - S 24 3 1 S +// R So 1945 o - N 18 2s 0 - +// +// Has 3 rules that are all only active in 1945. +[[nodiscard]] static pair::const_iterator> +__next_rule(sys_seconds __time, + seconds __stdoff, + seconds __save, + const vector<__tz::__rule>& __rules, + vector<__tz::__rule>::const_iterator __current) { + year __year = year_month_day{chrono::floor(__time)}.year(); + + // Note it would probably be better to store the pairs in a vector and then + // use min() to get the smallest element + map::const_iterator> __candidates; + // Note this evaluates all rules which is a waste of effort; when the entries + // are beyond the current year's "next year" (where "next year" is not always + // year + 1) the algorithm should end. + for (auto __it = __rules.begin(); __it != __rules.end(); ++__it) { + for (year __y = __it->__from; __y <= __it->__to; ++__y) { + // Adding the current entry for the current year may lead to infinite + // loops due to the SAVE adjustment. Skip these entries. + if (__y == __year && __it == __current) + continue; + + sys_seconds __t = chrono::__rule_to_sys_seconds(__stdoff, __save, *__it, __y); + if (__t <= __time) + continue; + + _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(!__candidates.contains(__t), "duplicated rule"); + __candidates[__t] = __it; + break; + } + } + + if (!__candidates.empty()) [[likely]] { + auto __it = __candidates.begin(); + + // When no rule is selected the time before the first rule and the first rule + // should not be merged. + if (__time == sys_seconds::min()) + return *__it; + + // There can be two constitutive rules that are the same. For example, + // Hong Kong + // + // R HK 1973 o - D 30 3:30 1 S (R1) + // R HK 1965 1976 - Ap Su>=16 3:30 1 S (R2) + // + // 1973-12-29 19:30:00 R1 becomes active. + // 1974-04-20 18:30:00 R2 becomes active. + // Both rules have a SAVE of 1 hour and LETTERS are S for both of them. + while (__it != __candidates.end()) { + if (__current->__save.__time != __it->second->__save.__time || __current->__letters != __it->second->__letters) + return *__it; + + ++__it; + } + } + + return {sys_seconds::max(), __rules.end()}; +} + +// Returns the first rule of a set of rules. +// This is not always the first of the listed rules. For example +// R Sa 2008 2009 - Mar Su>=8 0 0 - +// R Sa 2007 2008 - O Su>=8 0 1 - +// The transition in October 2007 happens before the transition in March 2008. +[[nodiscard]] static vector<__tz::__rule>::const_iterator +__first_rule(seconds __stdoff, const vector<__tz::__rule>& __rules) { + return chrono::__next_rule(sys_seconds::min(), __stdoff, 0s, __rules, __rules.end()).second; +} + +[[nodiscard]] static __sys_info_result __get_sys_info_rule( + sys_seconds __time, + sys_seconds __continuation_begin, + const __tz::__continuation& __continuation, + const vector<__tz::__rule>& __rules) { + auto __rule = chrono::__first_rule(__continuation.__stdoff, __rules); + _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(__rule != __rules.end(), "the set of rules has no first rule"); + + // Avoid selecting a time before the start of the continuation + __time = std::max(__time, __continuation_begin); + + sys_seconds __rule_begin = chrono::__from_to_sys_seconds(__continuation.__stdoff, *__rule); + + // The time sought is very likely inside the current rule. + // When the continuation's UNTIL uses the local clock there are edge cases + // where this is not true. + // + // Start to walk the rules to find the proper one. + // + // For now we just walk all the rules TODO TZDB investigate whether a smarter + // algorithm would work. + auto __next = chrono::__next_rule(__rule_begin, __continuation.__stdoff, __rule->__save.__time, __rules, __rule); + + // Ignore small steps, this happens with America/Punta_Arenas for the + // transition + // -4:42:46 - SMT 1927 S + // -5 x -05/-04 1932 S + // ... + // + // R x 1927 1931 - S 1 0 1 - + // R x 1928 1932 - Ap 1 0 0 - + // + // America/Punta_Arenas Thu Sep 1 04:42:45 1927 UT = Thu Sep 1 00:42:45 1927 -04 isdst=1 gmtoff=-14400 + // America/Punta_Arenas Sun Apr 1 03:59:59 1928 UT = Sat Mar 31 23:59:59 1928 -04 isdst=1 gmtoff=-14400 + // America/Punta_Arenas Sun Apr 1 04:00:00 1928 UT = Sat Mar 31 23:00:00 1928 -05 isdst=0 gmtoff=-18000 + // + // Without this there will be a transition + // [1927-09-01 04:42:45, 1927-09-01 05:00:00) -05:00:00 0min -05 + + if (sys_seconds __begin = __rule->__save.__time != 0s ? __rule_begin : __next.first; __time < __begin) { + if (__continuation_begin == sys_seconds::min() || __begin - __continuation_begin > 12h) + return __sys_info{__get_sys_info_before_first_rule( + __continuation_begin, __rule_begin, __next.first, __continuation, __rules, __rule), + false}; + + // Europe/Berlin + // 1 c CE%sT 1945 May 24 2 (C1) + // 1 So CE%sT 1946 (C2) + // + // R c 1944 1945 - Ap M>=1 2s 1 S (R1) + // + // R So 1945 o - May 24 2 2 M (R2) + // + // When C2 becomes active the time would be before the first rule R2, + // giving a 1 hour sys_info. + seconds __save = __rule->__save.__time; + __named_rule_until __continuation_end{__continuation}; + sys_seconds __sys_info_end = std::min(__continuation_end(__save), __next.first); + + return __sys_info{ + sys_info{__continuation_begin, + __sys_info_end, + __continuation.__stdoff + __save, + chrono::duration_cast(__save), + chrono::__format(__continuation, __rule->__letters, __save)}, + __sys_info_end == __continuation_end(__save)}; + } + + // See above for America/Asuncion + if (__rule->__save.__time == 0s && __time < __next.first) { + return __sys_info{ + sys_info{__continuation_begin, + __next.first, + __continuation.__stdoff, + 0min, + chrono::__format(__continuation, __rule->__letters, 0s)}, + false}; + } + + __named_rule_until __continuation_end{__continuation}; + if (__time >= __continuation_end.__until() && !__continuation_end.__needs_adjustment()) + // note std::unexpected(__end); is ambiguous with std::unexpected() in , + return __sys_info_result{std::unexpect, __continuation_end.__until()}; + + while (__next.second != __rules.end()) { +#ifdef PRINT + std::print( + stderr, + "Rule for {}: [{}, {}) off={} save={} duration={}\n", + __time, + __rule_begin, + __next.first, + __continuation.__stdoff, + __rule->__save.__time, + __next.first - __rule_begin); +#endif + + sys_seconds __end = __continuation_end(__rule->__save.__time); + + sys_seconds __sys_info_begin = std::max(__continuation_begin, __rule_begin); + sys_seconds __sys_info_end = std::min(__end, __next.first); + seconds __diff = chrono::abs(__sys_info_end - __sys_info_begin); + + if (__diff < 12h) { + // Z America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 O 31 + // -4:16:48 - CMT 1920 May + // -4 - -04 1930 D + // -4 A -04/-03 1969 O 5 + // -3 A -03/-02 1999 O 3 + // -4 A -04/-03 2000 Mar 3 + // ... + // + // ... + // R A 1989 1992 - O Su>=15 0 1 - + // R A 1999 o - O Su>=1 0 1 - + // R A 2000 o - Mar 3 0 0 - + // R A 2007 o - D 30 0 1 - + // ... + + // The 1999 switch uses the same rule, but with a different stdoff. + // R A 1999 o - O Su>=1 0 1 - + // stdoff -3 -> 1999-10-03 03:00:00 + // stdoff -4 -> 1999-10-03 04:00:00 + // This generates an invalid entry and this is evaluated as a transition. + // Looking at the zdump like output in libc++ this generates jumps in + // the UTC time. + + __rule = __next.second; + __next = __next_rule(__next.first, __continuation.__stdoff, __rule->__save.__time, __rules, __rule); + __end = __continuation_end(__rule->__save.__time); + __sys_info_end = std::min(__end, __next.first); + } + + if ((__time >= __rule_begin && __time < __next.first) || __next.first >= __end) { + __sys_info_begin = std::max(__continuation_begin, __rule_begin); + __sys_info_end = std::min(__end, __next.first); + + return __sys_info{ + sys_info{__sys_info_begin, + __sys_info_end, + __continuation.__stdoff + __rule->__save.__time, + chrono::duration_cast(__rule->__save.__time), + chrono::__format(__continuation, __rule->__letters, __rule->__save.__time)}, + __sys_info_end == __end}; + } + + __rule_begin = __next.first; + __rule = __next.second; + __next = __next_rule(__rule_begin, __continuation.__stdoff, __rule->__save.__time, __rules, __rule); + } + + return __sys_info{ + sys_info{std::max(__continuation_begin, __rule_begin), + __continuation_end(__rule->__save.__time), + __continuation.__stdoff + __rule->__save.__time, + chrono::duration_cast(__rule->__save.__time), + chrono::__format(__continuation, __rule->__letters, __rule->__save.__time)}, + true}; +} + +[[nodiscard]] static __sys_info_result __get_sys_info_basic( + sys_seconds __time, sys_seconds __continuation_begin, const __tz::__continuation& __continuation, seconds __save) { + sys_seconds __continuation_end = chrono::__until_to_sys_seconds(__continuation); + return __sys_info{ + sys_info{__continuation_begin, + __continuation_end, + __continuation.__stdoff + __save, + chrono::duration_cast(__save), + __continuation.__format}, + true}; +} + +[[nodiscard]] static __sys_info_result +__get_sys_info(sys_seconds __time, + sys_seconds __continuation_begin, + const __tz::__continuation& __continuation, + const __tz::__rules_storage_type& __rules_db) { + return std::visit( + [&](const auto& __value) { + using _Tp = decay_t; + if constexpr (same_as<_Tp, std::string>) + return chrono::__get_sys_info_rule( + __time, __continuation_begin, __continuation, __get_rules(__rules_db, __value)); + else if constexpr (same_as<_Tp, monostate>) + return chrono::__get_sys_info_basic(__time, __continuation_begin, __continuation, chrono::seconds(0)); + else if constexpr (same_as<_Tp, __tz::__save>) + return chrono::__get_sys_info_basic(__time, __continuation_begin, __continuation, __value.__time); + else + static_assert(sizeof(_Tp) == 0); // TODO TZDB static_assert(false); after droping clang-16 support + + std::__libcpp_unreachable(); + }, + __continuation.__rules); +} + +// The transition from one continuation to the next continuation may result in +// two constitutive continuations with the same "offset" information. +// [time.zone.info.sys]/3 +// The begin and end data members indicate that, for the associated time_zone +// and time_point, the offset and abbrev are in effect in the range +// [begin, end). This information can be used to efficiently iterate the +// transitions of a time_zone. +// +// Note that this does considers a change in the SAVE field not to be a +// different sys_info, zdump does consider this different. +// LWG XXXX The sys_info range should be affected by save +// matches the behaviour of the Standard and zdump. +// +// Iff the "offsets" are the same '__current.__end' is replaced with +// '__next.__end', which effectively merges the two objects in one object. The +// function returns true if a merge occurred. +[[nodiscard]] bool __merge_continuation(sys_info& __current, const sys_info& __next) { + if (__current.end != __next.begin) + return false; + + if (__current.offset != __next.offset || __current.abbrev != __next.abbrev || __current.save != __next.save) + return false; + + __current.end = __next.end; + return true; +} + +//===----------------------------------------------------------------------===// +// Public API +//===----------------------------------------------------------------------===// + [[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI time_zone time_zone::__create(unique_ptr&& __p) { _LIBCPP_ASSERT_NON_NULL(__p != nullptr, "initialized time_zone without a valid pimpl object"); time_zone result; @@ -27,6 +725,173 @@ _LIBCPP_EXPORTED_FROM_ABI time_zone::~time_zone() = default; [[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI string_view time_zone::__name() const noexcept { return __impl_->__name(); } +[[nodiscard]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI sys_info +time_zone::__get_info(sys_seconds __time) const { + optional __result; + bool __valid_result = false; // true iff __result.has_value() is true and + // __result.begin <= __time < __result.end is true. + bool __can_merge = false; + sys_seconds __continuation_begin = sys_seconds::min(); + // Iterates over the Zone entry and its continuations. Internally the Zone + // entry is split in a Zone information and the first continuation. The last + // continuation has no UNTIL field. This means the loop should always find a + // continuation. + // + // For more information on background of zone information please consult the + // following information + // [zic manual](https://www.man7.org/linux/man-pages/man8/zic.8.html) + // [tz source info](https://data.iana.org/time-zones/tz-how-to.html) + // On POSIX systems the zdump tool can be useful: + // zdump -v Asia/Hong_Kong + // Gives all transitions in the Hong Kong time zone. + // + // During iteration the result for the current continuation is returned. If + // no continuation is applicable it will return the end time as "error". When + // two continuations are contiguous and contain the "same" information these + // ranges are merged as one range. + // The merging requires keeping any result that occurs before __time, + // likewise when a valid result is found the algorithm needs to test the next + // continuation to see whether it can be merged. For example, Africa/Ceuta + // Continuations + // 0 s WE%sT 1929 (C1) + // 0 - WET 1967 (C2) + // 0 Sp WE%sT 1984 Mar 16 (C3) + // + // Rules + // R s 1926 1929 - O Sa>=1 24s 0 - (R1) + // + // R Sp 1967 o - Jun 3 12 1 S (R2) + // + // The rule R1 is the last rule used in C1. The rule R2 is the first rule in + // C3. Since R2 is the first rule this means when a continuation uses this + // rule its value prior to R2 will be SAVE 0 LETTERS of the first entry with a + // SAVE of 0, in this case WET. + // This gives the following changes in the information. + // 1928-10-07 00:00:00 C1 R1 becomes active: offset 0 save 0 abbrev WET + // 1929-01-01 00:00:00 C2 becomes active: offset 0 save 0 abbrev WET + // 1967-01-01 00:00:00 C3 becomes active: offset 0 save 0 abbrev WET + // 1967-06-03 12:00:00 C3 R2 becomes active: offset 0 save 1 abbrev WEST + // + // The first 3 entries are contiguous and contain the same information, this + // means the period [1928-10-07 00:00:00, 1967-06-03 12:00:00) should be + // returned in one sys_info object. + + const auto& __continuations = __impl_->__continuations(); + const __tz::__rules_storage_type& __rules_db = __impl_->__rules_db(); + for (auto __it = __continuations.begin(); __it != __continuations.end(); ++__it) { + const auto& __continuation = *__it; + __sys_info_result __sys_info = chrono::__get_sys_info(__time, __continuation_begin, __continuation, __rules_db); + + if (__sys_info) { + _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN( + __sys_info->__info.begin < __sys_info->__info.end, "invalid sys_info range"); + + // Filters out dummy entries + // Z America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 O 31 + // ... + // -4 A -04/-03 2000 Mar 3 (C1) + // -3 A -03/-02 (C2) + // + // ... + // R A 2000 o - Mar 3 0 0 - + // R A 2007 o - D 30 0 1 - + // ... + // + // This results in an entry + // [2000-03-03 03:00:00, 2000-03-03 04:00:00) -10800s 60min -03 + // for [C1 & R1, C1, R2) which due to the end of the continuation is an + // one hour "sys_info". Instead the entry should be ignored and replaced + // by [C2 & R1, C2 & R2) which is the proper range + // "[2000-03-03 03:00:00, 2007-12-30 03:00:00) -02:00:00 60min -02 + + if (std::holds_alternative(__continuation.__rules) && __sys_info->__can_merge && + __sys_info->__info.begin + 12h > __sys_info->__info.end) { + __continuation_begin = __sys_info->__info.begin; + continue; + } + + if (!__result) { + // First entry found, always keep it. + __result = __sys_info->__info; + + __valid_result = __time >= __result->begin && __time < __result->end; + __can_merge = __sys_info->__can_merge; + } else if (__can_merge && chrono::__merge_continuation(*__result, __sys_info->__info)) { + // The results are merged, update the result state. This may + // "overwrite" a valid sys_info object with another valid sys_info + // object. + __valid_result = __time >= __result->begin && __time < __result->end; + __can_merge = __sys_info->__can_merge; + } else { + // Here things get interesting: + // For example, America/Argentina/San_Luis + // + // -3 A -03/-02 2008 Ja 21 (C1) + // -4 Sa -04/-03 2009 O 11 (C2) + // + // R A 2007 o - D 30 0 1 - (R1) + // + // R Sa 2007 2008 - O Su>=8 0 1 - (R2) + // + // Based on C1 & R1 the end time of C1 is 2008-01-21 03:00:00 + // Based on C2 & R2 the end time of C1 is 2008-01-21 02:00:00 + // In this case the earlier time is the real time of the transition. + // However the algorithm used gives 2008-01-21 03:00:00. + // + // So we need to calculate the previous UNTIL in the current context and + // see whether it's earlier. + + // The results could not be merged. + // - When we have a valid result that result is the final result. + // - Otherwise the result we had is before __time and the result we got + // is at a later time (possibly valid). This result is always better + // than the previous result. + if (__valid_result) { + return *__result; + } else { + _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN( + __it != __continuations.begin(), "the first rule should always seed the result"); + const auto& __last = *(__it - 1); + if (std::holds_alternative(__last.__rules)) { + // Europe/Berlin + // 1 c CE%sT 1945 May 24 2 (C1) + // 1 So CE%sT 1946 (C2) + // + // R c 1944 1945 - Ap M>=1 2s 1 S (R1) + // + // R So 1945 o - May 24 2 2 M (R2) + // + // When C2 becomes active the time would be before the first rule R2, + // giving a 1 hour sys_info. This is not valid and the results need + // merging. + + if (__result->end != __sys_info->__info.begin) { + // When the UTC gap between the rules is due to the change of + // offsets adjust the new time to remove the gap. + sys_seconds __end = __result->end - __result->offset; + sys_seconds __begin = __sys_info->__info.begin - __sys_info->__info.offset; + if (__end == __begin) { + __sys_info->__info.begin = __result->end; + } + } + } + + __result = __sys_info->__info; + __valid_result = __time >= __result->begin && __time < __result->end; + __can_merge = __sys_info->__can_merge; + } + } + __continuation_begin = __result->end; + } else { + __continuation_begin = __sys_info.error(); + } + } + if (__valid_result) + return *__result; + + std::__throw_runtime_error("tzdb: corrupt db"); +} + } // namespace chrono _LIBCPP_END_NAMESPACE_STD diff --git a/yass/third_party/libc++/trunk/src/tzdb.cpp b/yass/third_party/libc++/trunk/src/tzdb.cpp index 0307f754ca..d521d81052 100644 --- a/yass/third_party/libc++/trunk/src/tzdb.cpp +++ b/yass/third_party/libc++/trunk/src/tzdb.cpp @@ -15,7 +15,6 @@ #include #include -#include "include/tzdb/time_zone_link_private.h" #include "include/tzdb/time_zone_private.h" #include "include/tzdb/types_private.h" #include "include/tzdb/tzdb_list_private.h" @@ -560,7 +559,7 @@ static void __parse_rule(tzdb& __tzdb, __tz::__rules_storage_type& __rules, istr static void __parse_zone(tzdb& __tzdb, __tz::__rules_storage_type& __rules, istream& __input) { chrono::__skip_mandatory_whitespace(__input); - auto __p = std::make_unique(chrono::__parse_string(__input)); + auto __p = std::make_unique(chrono::__parse_string(__input), __rules); vector<__tz::__continuation>& __continuations = __p->__continuations(); chrono::__skip_mandatory_whitespace(__input); @@ -581,7 +580,7 @@ static void __parse_link(tzdb& __tzdb, istream& __input) { string __name = chrono::__parse_string(__input); chrono::__skip_line(__input); - __tzdb.links.emplace_back(time_zone_link::__constructor_tag{}, std::move(__name), std::move(__target)); + __tzdb.links.emplace_back(std::__private_constructor_tag{}, std::move(__name), std::move(__target)); } static void __parse_tzdata(tzdb& __db, __tz::__rules_storage_type& __rules, istream& __input) { @@ -622,6 +621,36 @@ static void __parse_tzdata(tzdb& __db, __tz::__rules_storage_type& __rules, istr } } +static void __parse_leap_seconds(vector& __leap_seconds, istream&& __input) { + // The file stores dates since 1 January 1900, 00:00:00, we want + // seconds since 1 January 1970. + constexpr auto __offset = sys_days{1970y / January / 1} - sys_days{1900y / January / 1}; + + while (true) { + switch (__input.peek()) { + case istream::traits_type::eof(): + return; + + case ' ': + case '\t': + case '\n': + __input.get(); + continue; + + case '#': + chrono::__skip_line(__input); + continue; + } + + sys_seconds __date = sys_seconds{seconds{chrono::__parse_integral(__input, false)}} - __offset; + chrono::__skip_mandatory_whitespace(__input); + seconds __value{chrono::__parse_integral(__input, false)}; + chrono::__skip_line(__input); + + __leap_seconds.emplace_back(std::__private_constructor_tag{}, __date, __value); + } +} + void __init_tzdb(tzdb& __tzdb, __tz::__rules_storage_type& __rules) { filesystem::path __root = chrono::__libcpp_tzdb_directory(); ifstream __tzdata{__root / "tzdata.zi"}; @@ -631,8 +660,74 @@ void __init_tzdb(tzdb& __tzdb, __tz::__rules_storage_type& __rules) { std::ranges::sort(__tzdb.zones); std::ranges::sort(__tzdb.links); std::ranges::sort(__rules, {}, [](const auto& p) { return p.first; }); + + // There are two files with the leap second information + // - leapseconds as specified by zic + // - leap-seconds.list the source data + // The latter is much easier to parse, it seems Howard shares that + // opinion. + chrono::__parse_leap_seconds(__tzdb.leap_seconds, ifstream{__root / "leap-seconds.list"}); + // The Standard requires the leap seconds to be sorted. The file + // leap-seconds.list usually provides them in sorted order, but that is not + // guaranteed so we ensure it here. + std::ranges::sort(__tzdb.leap_seconds); } +#ifdef _WIN32 +[[nodiscard]] static const time_zone* __current_zone_windows(const tzdb& tzdb) { + // TODO TZDB Implement this on Windows. + std::__throw_runtime_error("unknown time zone"); +} +#else // ifdef _WIN32 +[[nodiscard]] static const time_zone* __current_zone_posix(const tzdb& tzdb) { + // On POSIX systems there are several ways to configure the time zone. + // In order of priority they are: + // - TZ environment variable + // https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08 + // The documentation is unclear whether or not it's allowed to + // change time zone information. For example the TZ string + // MST7MDT + // this is an entry in tzdata.zi. The value + // MST + // is also an entry. Is it allowed to use the following? + // MST-3 + // Even when this is valid there is no time_zone record in the + // database. Since the library would need to return a valid pointer, + // this means the library needs to allocate and leak a pointer. + // + // - The time zone name is the target of the symlink /etc/localtime + // relative to /usr/share/zoneinfo/ + + // The algorithm is like this: + // - If the environment variable TZ is set and points to a valid + // record use this value. + // - Else use the name based on the `/etc/localtime` symlink. + + if (const char* __tz = getenv("TZ")) + if (const time_zone* __result = tzdb.__locate_zone(__tz)) + return __result; + + filesystem::path __path = "/etc/localtime"; + if (!std::filesystem::exists(__path)) + std::__throw_runtime_error("tzdb: the symlink '/etc/localtime' does not exist"); + + if (!std::filesystem::is_symlink(__path)) + std::__throw_runtime_error("tzdb: the path '/etc/localtime' is not a symlink"); + + filesystem::path __tz = filesystem::read_symlink(__path); + // The path may be a relative path, in that case convert it to an absolute + // path based on the proper initial directory. + if (__tz.is_relative()) + __tz = filesystem::canonical("/etc" / __tz); + + string __name = filesystem::relative(__tz, "/usr/share/zoneinfo/"); + if (const time_zone* __result = tzdb.__locate_zone(__name)) + return __result; + + std::__throw_runtime_error(("tzdb: the time zone '" + __name + "' is not found in the database").c_str()); +} +#endif // ifdef _WIN32 + //===----------------------------------------------------------------------===// // Public API //===----------------------------------------------------------------------===// @@ -642,6 +737,14 @@ _LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI tzdb_l return __result; } +[[nodiscard]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI const time_zone* tzdb::__current_zone() const { +#ifdef _WIN32 + return chrono::__current_zone_windows(*this); +#else + return chrono::__current_zone_posix(*this); +#endif +} + _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI const tzdb& reload_tzdb() { if (chrono::remote_version() == chrono::get_tzdb().version) return chrono::get_tzdb(); diff --git a/yass/third_party/libc++/trunk/test/libcxx/atomics/diagnose_invalid_memory_order.verify.cpp b/yass/third_party/libc++/trunk/test/libcxx/atomics/diagnose_invalid_memory_order.verify.cpp index defd43cf26..2790916eda 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/atomics/diagnose_invalid_memory_order.verify.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/atomics/diagnose_invalid_memory_order.verify.cpp @@ -9,7 +9,7 @@ // This test fails with Clang <18 because diagnose_if doesn't emit all of the // diagnostics when -fdelayed-template-parsing is enabled, like it is in MSVC // mode. -// XFAIL: msvc && (clang-16 || clang-17) +// XFAIL: msvc && clang-17 // REQUIRES: diagnose-if-support diff --git a/yass/third_party/libc++/trunk/test/libcxx/diagnostics/chrono.nodiscard_extensions.compile.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/diagnostics/chrono.nodiscard_extensions.compile.pass.cpp index 8019824046..cbdb2ab175 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/diagnostics/chrono.nodiscard_extensions.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/diagnostics/chrono.nodiscard_extensions.compile.pass.cpp @@ -26,6 +26,7 @@ // These types have "private" constructors. extern std::chrono::time_zone tz; extern std::chrono::time_zone_link link; +extern std::chrono::leap_second leap; void test() { std::chrono::tzdb_list& list = std::chrono::get_tzdb_list(); @@ -37,10 +38,19 @@ void test() { std::chrono::get_tzdb_list(); std::chrono::get_tzdb(); + std::chrono::locate_zone("name"); + std::chrono::current_zone(); std::chrono::remote_version(); + { + const std::chrono::tzdb& t = list.front(); + t.locate_zone("name"); + t.current_zone(); + } + { tz.name(); + tz.get_info(std::chrono::sys_seconds{}); operator==(tz, tz); operator<=>(tz, tz); } @@ -51,4 +61,9 @@ void test() { operator==(link, link); operator<=>(link, link); } + + { + leap.date(); + leap.value(); + } } diff --git a/yass/third_party/libc++/trunk/test/libcxx/diagnostics/chrono.nodiscard_extensions.verify.cpp b/yass/third_party/libc++/trunk/test/libcxx/diagnostics/chrono.nodiscard_extensions.verify.cpp index e9b2755949..e88c176af4 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/diagnostics/chrono.nodiscard_extensions.verify.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/diagnostics/chrono.nodiscard_extensions.verify.cpp @@ -23,6 +23,7 @@ // These types have "private" constructors. extern std::chrono::time_zone tz; extern std::chrono::time_zone_link link; +extern std::chrono::leap_second leap; void test() { std::chrono::tzdb_list& list = std::chrono::get_tzdb_list(); @@ -32,13 +33,23 @@ void test() { list.cbegin(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} list.cend(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + { + const std::chrono::tzdb& t = list.front(); + t.locate_zone("name"); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + t.current_zone(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + } + namespace crno = std::chrono; crno::get_tzdb_list(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} crno::get_tzdb(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + crno::locate_zone("n"); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + crno::current_zone(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} crno::remote_version(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} { + std::chrono::sys_seconds s{}; tz.name(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + tz.get_info(s); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} operator==(tz, tz); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} operator<=>(tz, tz); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} } @@ -51,4 +62,9 @@ void test() { // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} operator<=>(link, link); } + + { + leap.date(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + leap.value(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + } } diff --git a/yass/third_party/libc++/trunk/test/libcxx/fuzzing/format_no_args.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/fuzzing/format_no_args.pass.cpp new file mode 100644 index 0000000000..2faf27eda9 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/libcxx/fuzzing/format_no_args.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-exceptions + +// UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME + +// XFAIL: availability-fp_to_chars-missing + +#include +#include +#include + +#include "fuzz.h" + +extern "C" int LLVMFuzzerTestOneInput(const std::uint8_t* data, std::size_t size) { + try { + [[maybe_unused]] auto result = std::vformat(std::string_view{(const char*)(data), size}, std::make_format_args()); + } catch (std::format_error const&) { + // If the fuzzing input isn't a valid thing we can format and we detect it, it's okay. We are looking for crashes. + return 0; + } + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/libcxx/gdb/gdb_pretty_printer_test.sh.cpp b/yass/third_party/libc++/trunk/test/libcxx/gdb/gdb_pretty_printer_test.sh.cpp index 479c1b93fc..640365889e 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/gdb/gdb_pretty_printer_test.sh.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/gdb/gdb_pretty_printer_test.sh.cpp @@ -12,7 +12,7 @@ // UNSUPPORTED: c++03 // TODO: Investigate these failures which break the CI. -// UNSUPPORTED: clang-16, clang-17, clang-18, clang-19 +// UNSUPPORTED: clang-17, clang-18, clang-19 // TODO: Investigate this failure on GCC 13 (in Ubuntu Jammy) // UNSUPPORTED: gcc-13 diff --git a/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/fstream.cons/wchar_pointer.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/fstream.cons/wchar_pointer.pass.cpp index c2b23bba42..652783fc65 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/fstream.cons/wchar_pointer.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/fstream.cons/wchar_pointer.pass.cpp @@ -18,7 +18,7 @@ // UNSUPPORTED: no-wide-characters // TODO: This should not be necessary -// ADDITIONAL_COMPILE_FLAGS:-D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS:-D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT #include #include diff --git a/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/fstream.members/open_wchar_pointer.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/fstream.members/open_wchar_pointer.pass.cpp index 9a5564fa9e..b592492f84 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/fstream.members/open_wchar_pointer.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/fstream.members/open_wchar_pointer.pass.cpp @@ -18,7 +18,7 @@ // UNSUPPORTED: no-wide-characters // TODO: This should not be necessary -// ADDITIONAL_COMPILE_FLAGS:-D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS:-D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT #include #include diff --git a/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/ofstream.cons/wchar_pointer.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/ofstream.cons/wchar_pointer.pass.cpp index 185ee9e5f9..3730e73648 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/ofstream.cons/wchar_pointer.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/ofstream.cons/wchar_pointer.pass.cpp @@ -18,7 +18,7 @@ // UNSUPPORTED: no-wide-characters // TODO: This should not be necessary -// ADDITIONAL_COMPILE_FLAGS:-D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS:-D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT #include #include diff --git a/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/ofstream.members/open_wchar_pointer.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/ofstream.members/open_wchar_pointer.pass.cpp index 9403643ad6..bfbbd53221 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/ofstream.members/open_wchar_pointer.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/input.output/file.streams/fstreams/ofstream.members/open_wchar_pointer.pass.cpp @@ -18,7 +18,7 @@ // UNSUPPORTED: no-wide-characters // TODO: This should not be necessary -// ADDITIONAL_COMPILE_FLAGS:-D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS:-D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT #include #include diff --git a/yass/third_party/libc++/trunk/test/libcxx/input.output/filesystems/class.directory_entry/directory_entry.mods/last_write_time.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/input.output/filesystems/class.directory_entry/directory_entry.mods/last_write_time.pass.cpp index 26703f748d..1acbed55d2 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/input.output/filesystems/class.directory_entry/directory_entry.mods/last_write_time.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/input.output/filesystems/class.directory_entry/directory_entry.mods/last_write_time.pass.cpp @@ -9,7 +9,7 @@ // UNSUPPORTED: c++03, c++11, c++14 // UNSUPPORTED: availability-filesystem-missing // UNSUPPORTED: no-filesystem -// ADDITIONAL_COMPILE_FLAGS: -I %S/../../../../../../src +// ADDITIONAL_COMPILE_FLAGS: -I %{libcxx-dir}/src // This test relies on calling functions from the libcxx internal headers // of ; the Windows implementation uses different diff --git a/yass/third_party/libc++/trunk/test/libcxx/input.output/filesystems/convert_file_time.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/input.output/filesystems/convert_file_time.pass.cpp index 3c901c4e9f..699bbfb9e6 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/input.output/filesystems/convert_file_time.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/input.output/filesystems/convert_file_time.pass.cpp @@ -13,7 +13,7 @@ // typedef TrivialClock file_time_type; -// ADDITIONAL_COMPILE_FLAGS: -I %S/../../../../src -Wno-macro-redefined +// ADDITIONAL_COMPILE_FLAGS: -I %{libcxx-dir}/src -Wno-macro-redefined #include #include diff --git a/yass/third_party/libc++/trunk/test/libcxx/localization/locales/locale.convenience/conversions/conversions.string/ctor_move.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/localization/locales/locale.convenience/conversions/conversions.string/ctor_move.pass.cpp index 006bece211..a536e6e9b0 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/localization/locales/locale.convenience/conversions/conversions.string/ctor_move.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/localization/locales/locale.convenience/conversions/conversions.string/ctor_move.pass.cpp @@ -10,7 +10,7 @@ // UNSUPPORTED: c++03 -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // diff --git a/yass/third_party/libc++/trunk/test/libcxx/ranges/range.adaptors/range.lazy.split/no_unique_address.compile.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/ranges/range.adaptors/range.lazy.split/no_unique_address.compile.pass.cpp index b411ce198e..a0bfb7c4a2 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/ranges/range.adaptors/range.lazy.split/no_unique_address.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/ranges/range.adaptors/range.lazy.split/no_unique_address.compile.pass.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 -// XFAIL: msvc && (clang-16 || clang-17) +// XFAIL: msvc && clang-17 // class lazy_split_view { // _LIBCPP_NO_UNIQUE_ADDRESS _View __base_ = _View(); diff --git a/yass/third_party/libc++/trunk/test/libcxx/ranges/range.adaptors/range.split/no_unique_address.compile.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/ranges/range.adaptors/range.split/no_unique_address.compile.pass.cpp index 0d8bfbc031..694cf1fd0d 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/ranges/range.adaptors/range.split/no_unique_address.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/ranges/range.adaptors/range.split/no_unique_address.compile.pass.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 -// XFAIL: msvc && (clang-16 || clang-17) +// XFAIL: msvc && clang-17 // class split_view { // _LIBCPP_NO_UNIQUE_ADDRESS _View __base_ = _View(); diff --git a/yass/third_party/libc++/trunk/test/libcxx/ranges/range.factories/range.istream.view/no_unique_address.compile.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/ranges/range.factories/range.istream.view/no_unique_address.compile.pass.cpp index 8359d26724..a77c4e4d1b 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/ranges/range.factories/range.istream.view/no_unique_address.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/ranges/range.factories/range.istream.view/no_unique_address.compile.pass.cpp @@ -8,7 +8,7 @@ // UNSUPPORTED: no-localization // UNSUPPORTED: c++03, c++11, c++14, c++17 -// XFAIL: msvc && (clang-16 || clang-17) +// XFAIL: msvc && clang-17 // Test the libc++ extension that the value stored in `std::ranges::istream_view` has been marked // as _LIBCPP_NO_UNIQUE_ADDRESS diff --git a/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/leap_seconds.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/leap_seconds.pass.cpp new file mode 100644 index 0000000000..282bddcf9a --- /dev/null +++ b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/leap_seconds.pass.cpp @@ -0,0 +1,119 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// Tests the IANA database leap seconds parsing and operations. +// This is not part of the public tzdb interface. + +#include +#include +#include +#include +#include + +#include "assert_macros.h" +#include "concat_macros.h" +#include "filesystem_test_helper.h" +#include "test_tzdb.h" + +scoped_test_env env; +[[maybe_unused]] const std::filesystem::path dir = env.create_dir("zoneinfo"); +const std::filesystem::path tzdata = env.create_file("zoneinfo/tzdata.zi"); +const std::filesystem::path leap_seconds = env.create_file("zoneinfo/leap-seconds.list"); + +std::string_view std::chrono::__libcpp_tzdb_directory() { + static std::string result = dir.string(); + return result; +} + +void write(std::string_view input) { + static int version = 0; + + std::ofstream f{tzdata}; + f << "# version " << version++ << '\n'; + std::ofstream{leap_seconds}.write(input.data(), input.size()); +} + +static const std::chrono::tzdb& parse(std::string_view input) { + write(input); + return std::chrono::reload_tzdb(); +} + +static void test_exception(std::string_view input, [[maybe_unused]] std::string_view what) { + write(input); + + TEST_VALIDATE_EXCEPTION( + std::runtime_error, + [&]([[maybe_unused]] const std::runtime_error& e) { + TEST_LIBCPP_REQUIRE( + e.what() == what, + TEST_WRITE_CONCATENATED("\nExpected exception ", what, "\nActual exception ", e.what(), '\n')); + }, + TEST_IGNORE_NODISCARD std::chrono::reload_tzdb()); +} + +static void test_invalid() { + test_exception("0", "corrupt tzdb: expected a non-zero digit"); + + test_exception("1", "corrupt tzdb: expected whitespace"); + + test_exception("1 ", "corrupt tzdb: expected a non-zero digit"); + + test_exception("5764607523034234880 2", "corrupt tzdb: integral too large"); +} + +static void test_leap_seconds() { + using namespace std::chrono; + + // Test whether loading also sorts the entries in the proper order. + const tzdb& result = parse( + R"( +2303683200 12 # 1 Jan 1973 +2287785600 11 # 1 Jul 1972 +2272060800 10 # 1 Jan 1972 +86400 1 # 2 Jan 1900 Dummy entry to test before 1970 + +# largest accepted value by the parser +5764607523034234879 2 +)"); + + assert(result.leap_seconds.size() == 5); + + assert(result.leap_seconds[0].date() == sys_seconds{sys_days{1900y / January / 2}}); + assert(result.leap_seconds[0].value() == 1s); + + assert(result.leap_seconds[1].date() == sys_seconds{sys_days{1972y / January / 1}}); + assert(result.leap_seconds[1].value() == 10s); + + assert(result.leap_seconds[2].date() == sys_seconds{sys_days{1972y / July / 1}}); + assert(result.leap_seconds[2].value() == 11s); + + assert(result.leap_seconds[3].date() == sys_seconds{sys_days{1973y / January / 1}}); + assert(result.leap_seconds[3].value() == 12s); + + assert(result.leap_seconds[4].date() == + sys_seconds{5764607523034234879s + // The database uses 1900-01-01 as epoch. + - std::chrono::duration_cast( + sys_days{1970y / January / 1} - sys_days{1900y / January / 1})}); + assert(result.leap_seconds[4].value() == 2s); +} + +int main(int, const char**) { + test_invalid(); + test_leap_seconds(); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/rules.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/rules.pass.cpp index 4814f4aad8..fcfc34625f 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/rules.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/rules.pass.cpp @@ -17,7 +17,7 @@ // Tests the IANA database rules parsing and operations. // This is not part of the public tzdb interface. // The test uses private implementation headers. -// ADDITIONAL_COMPILE_FLAGS: -I %S/../../../../../src/include +// ADDITIONAL_COMPILE_FLAGS: -I %{libcxx-dir}/src/include #include #include diff --git a/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp new file mode 100644 index 0000000000..971f7f04c4 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp @@ -0,0 +1,84 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// struct tzdb + +// const time_zone* locate_zone(string_view tz_name) const; + +#include +#include +#include +#include + +#include "test_macros.h" +#include "assert_macros.h" +#include "concat_macros.h" +#include "filesystem_test_helper.h" +#include "test_tzdb.h" + +scoped_test_env env; +[[maybe_unused]] const std::filesystem::path dir = env.create_dir("zoneinfo"); +const std::filesystem::path file = env.create_file("zoneinfo/tzdata.zi"); + +std::string_view std::chrono::__libcpp_tzdb_directory() { + static std::string result = dir.string(); + return result; +} + +void write(std::string_view input) { + static int version = 0; + + std::ofstream f{file}; + f << "# version " << version++ << '\n'; + f.write(input.data(), input.size()); +} + +static const std::chrono::tzdb& parse(std::string_view input) { + write(input); + return std::chrono::reload_tzdb(); +} + +int main(int, const char**) { + const std::chrono::tzdb& tzdb = parse( + R"( +Z zone 0 r f +L zone link +L link link_to_link +)"); + + { + const std::chrono::time_zone* tz = tzdb.locate_zone("zone"); + assert(tz); + assert(tz->name() == "zone"); + } + { + const std::chrono::time_zone* tz = tzdb.locate_zone("link"); + assert(tz); + assert(tz->name() == "zone"); + } + + TEST_VALIDATE_EXCEPTION( + std::runtime_error, + [&]([[maybe_unused]] const std::runtime_error& e) { + std::string_view what{"tzdb: requested time zone not found"}; + TEST_LIBCPP_REQUIRE( + e.what() == what, + TEST_WRITE_CONCATENATED("\nExpected exception ", what, "\nActual exception ", e.what(), '\n')); + }, + TEST_IGNORE_NODISCARD tzdb.locate_zone("link_to_link")); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/zones.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/zones.pass.cpp index 8571e0d05e..e97b36fca2 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/zones.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.db/zones.pass.cpp @@ -17,7 +17,7 @@ // Tests the IANA database zones parsing and operations. // This is not part of the public tzdb interface. // The test uses private implementation headers. -// ADDITIONAL_COMPILE_FLAGS: -I %S/../../../../../src/include +// ADDITIONAL_COMPILE_FLAGS: -I %{libcxx-dir}/src/include #include #include diff --git a/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.timezone/time.zone.members/get_info.sys_time.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.timezone/time.zone.members/get_info.sys_time.pass.cpp new file mode 100644 index 0000000000..194f58215b --- /dev/null +++ b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.timezone/time.zone.members/get_info.sys_time.pass.cpp @@ -0,0 +1,199 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// class time_zone; + +// template +// sys_info get_info(const sys_time<_Duration>& time) const; + +// tests the parts not validated in the public test +// - Validates a zone with an UNTIL in its last continuation is corrupt +// - The formatting of the FORMAT field's constrains +// - Formatting of "%z", this is valid but not present in the actual database + +#include +#include +#include +#include +#include + +#include "test_macros.h" +#include "assert_macros.h" +#include "concat_macros.h" +#include "filesystem_test_helper.h" +#include "test_tzdb.h" + +/***** ***** HELPERS ***** *****/ + +scoped_test_env env; +[[maybe_unused]] const std::filesystem::path dir = env.create_dir("zoneinfo"); +const std::filesystem::path file = env.create_file("zoneinfo/tzdata.zi"); + +std::string_view std::chrono::__libcpp_tzdb_directory() { + static std::string result = dir.string(); + return result; +} + +static void write(std::string_view input) { + static int version = 0; + + std::ofstream f{file}; + f << "# version " << version++ << '\n'; + f.write(input.data(), input.size()); +} + +static const std::chrono::tzdb& parse(std::string_view input) { + write(input); + return std::chrono::reload_tzdb(); +} + +[[nodiscard]] static std::chrono::sys_seconds to_sys_seconds(int year) { + std::chrono::year_month_day result{std::chrono::year{year}, std::chrono::January, std::chrono::day{1}}; + + return std::chrono::time_point_cast(static_cast(result)); +} + +static void test_exception([[maybe_unused]] std::string_view input, [[maybe_unused]] std::string_view what) { +#ifndef TEST_HAS_NO_EXCEPTIONS + const std::chrono::tzdb& tzdb = parse(input); + const std::chrono::time_zone* tz = tzdb.locate_zone("Format"); + TEST_VALIDATE_EXCEPTION( + std::runtime_error, + [&]([[maybe_unused]] const std::runtime_error& e) { + TEST_LIBCPP_REQUIRE( + e.what() == what, + TEST_WRITE_CONCATENATED("\nExpected exception ", what, "\nActual exception ", e.what(), '\n')); + }, + TEST_IGNORE_NODISCARD tz->get_info(to_sys_seconds(2000))); +#endif // TEST_HAS_NO_EXCEPTIONS +} + +static void zone_without_until_entry() { +#ifndef TEST_HAS_NO_EXCEPTIONS + const std::chrono::tzdb& tzdb = parse( + R"( +Z America/Paramaribo -3:40:40 - LMT 1911 +-3:40:52 - PMT 1935 +-3:40:36 - PMT 1945 O +-3:30 - -0330 1984 O +# -3 - -03 Commented out so the last entry has an UNTIL field. +)"); + const std::chrono::time_zone* tz = tzdb.locate_zone("America/Paramaribo"); + + TEST_IGNORE_NODISCARD tz->get_info(to_sys_seconds(1984)); + TEST_VALIDATE_EXCEPTION( + std::runtime_error, + [&]([[maybe_unused]] const std::runtime_error& e) { + std::string what = "tzdb: corrupt db"; + TEST_LIBCPP_REQUIRE( + e.what() == what, + TEST_WRITE_CONCATENATED("\nExpected exception ", what, "\nActual exception ", e.what(), '\n')); + }, + TEST_IGNORE_NODISCARD tz->get_info(to_sys_seconds(1985))); +#endif // TEST_HAS_NO_EXCEPTIONS +} + +static void invalid_format() { + test_exception( + R"( +R F 2000 max - Jan 5 0 0 foo +Z Format 0 F %zandfoo)", + "corrupt tzdb FORMAT field: %z should be the entire contents, instead contains '%zandfoo'"); + + test_exception( + R"( +R F 2000 max - Jan 5 0 0 foo +Z Format 0 F %q)", + "corrupt tzdb FORMAT field: invalid sequence '%q' found, expected %s or %z"); + + test_exception( + R"( +R F 2000 max - Jan 5 0 0 foo +Z Format 0 F !)", + "corrupt tzdb FORMAT field: invalid character '!' found, expected +, -, or an alphanumeric value"); + + test_exception( + R"( +R F 2000 max - Jan 5 0 0 foo +Z Format 0 F @)", + "corrupt tzdb FORMAT field: invalid character '@' found, expected +, -, or an alphanumeric value"); + + test_exception( + R"( +R F 2000 max - Jan 5 0 0 foo +Z Format 0 F $)", + "corrupt tzdb FORMAT field: invalid character '$' found, expected +, -, or an alphanumeric value"); + + test_exception( + R"( +R F 1970 max - Jan 5 0 0 foo +Z Format 0 F %)", + "corrupt tzdb FORMAT field: input ended with the start of the escape sequence '%'"); + + test_exception( + R"( +R F 2000 max - Jan 5 0 0 - +Z Format 0 F %s)", + "corrupt tzdb FORMAT field: result is empty"); +} + +static void test_abbrev(std::string_view input, std::string_view expected) { + const std::chrono::tzdb& tzdb = parse(input); + const std::chrono::time_zone* tz = tzdb.locate_zone("Format"); + std::string result = tz->get_info(to_sys_seconds(2000)).abbrev; + TEST_LIBCPP_REQUIRE(result == expected, TEST_WRITE_CONCATENATED("\nExpected ", expected, "\nActual ", result, '\n')); +} + +// This format is valid, however is not used in the tzdata.zi. +static void percentage_z_format() { + test_abbrev( + R"( +R F 1999 max - Jan 5 0 0 foo +Z Format 0 F %z)", + "+00"); + + test_abbrev( + R"( +R F 1999 max - Jan 5 0 1 foo +Z Format 0 F %z)", + "+01"); + + test_abbrev( + R"( +R F 1999 max - Jan 5 0 -1 foo +Z Format 0 F %z)", + "-01"); + + test_abbrev( + R"( +R F 1999 max - Jan 5 0 0 foo +Z Format 0:45 F %z)", + "+0045"); + + test_abbrev( + R"( +R F 1999 max - Jan 5 0 -1 foo +Z Format 0:45 F %z)", + "-0015"); +} + +int main(int, const char**) { + zone_without_until_entry(); + invalid_format(); + percentage_z_format(); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.timezone/time.zone.members/get_info.sys_time.rule_selection.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.timezone/time.zone.members/get_info.sys_time.rule_selection.pass.cpp new file mode 100644 index 0000000000..accd5bcdc8 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/libcxx/time/time.zone/time.zone.timezone/time.zone.members/get_info.sys_time.rule_selection.pass.cpp @@ -0,0 +1,185 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// class time_zone; + +// template +// sys_info get_info(const sys_time<_Duration>& time) const; + +// The time zone database contains of the following entries +// - Zones, +// - Rules, +// - Links, and +// - Leapseconds. +// +// The public tzdb struct stores all entries except the Rules. How +// implementations keep track of the Rules is not specified. When the sys_info +// for a time_zone is requested it needs to use the correct Rules. This lookup +// cannot rely on 'get_tzdb()` since that returns the most recently loaded +// database. +// +// A reload could change the rules of a time zone or the time zone could no +// longer be present in the current database. These two conditions are tested. +// +// It is possible the tzdb entry has been removed by the user from the tzdb_list +// after a reload. This is UB and not tested. + +#include +#include +#include + +#include "test_macros.h" +#include "assert_macros.h" +#include "concat_macros.h" +#include "filesystem_test_helper.h" +#include "test_tzdb.h" + +/***** ***** HELPERS ***** *****/ + +scoped_test_env env; +[[maybe_unused]] const std::filesystem::path dir = env.create_dir("zoneinfo"); +const std::filesystem::path file = env.create_file("zoneinfo/tzdata.zi"); + +std::string_view std::chrono::__libcpp_tzdb_directory() { + static std::string result = dir.string(); + return result; +} + +static void write(std::string_view input) { + static int version = 0; + + std::ofstream f{file}; + f << "# version " << version++ << '\n'; + f.write(input.data(), input.size()); +} + +static const std::chrono::tzdb& parse(std::string_view input) { + write(input); + return std::chrono::reload_tzdb(); +} + +[[nodiscard]] static std::chrono::sys_seconds to_sys_seconds( + std::chrono::year year, + std::chrono::month month, + std::chrono::day day, + std::chrono::hours h = std::chrono::hours(0), + std::chrono::minutes m = std::chrono::minutes{0}, + std::chrono::seconds s = std::chrono::seconds{0}) { + std::chrono::year_month_day result{year, month, day}; + + return std::chrono::time_point_cast(static_cast(result)) + h + m + s; +} + +static void assert_equal(const std::chrono::sys_info& lhs, const std::chrono::sys_info& rhs) { + TEST_REQUIRE(lhs.begin == rhs.begin, + TEST_WRITE_CONCATENATED("\nBegin:\nExpected output ", lhs.begin, "\nActual output ", rhs.begin, '\n')); + TEST_REQUIRE(lhs.end == rhs.end, + TEST_WRITE_CONCATENATED("\nEnd:\nExpected output ", lhs.end, "\nActual output ", rhs.end, '\n')); + TEST_REQUIRE( + lhs.offset == rhs.offset, + TEST_WRITE_CONCATENATED("\nOffset:\nExpected output ", lhs.offset, "\nActual output ", rhs.offset, '\n')); + TEST_REQUIRE(lhs.save == rhs.save, + TEST_WRITE_CONCATENATED("\nSave:\nExpected output ", lhs.save, "\nActual output ", rhs.save, '\n')); + TEST_REQUIRE( + lhs.abbrev == rhs.abbrev, + TEST_WRITE_CONCATENATED("\nAbbrev:\nExpected output ", lhs.abbrev, "\nActual output ", rhs.abbrev, '\n')); +} + +/***** ***** TESTS ***** *****/ + +int main(int, const char**) { + using namespace std::literals::chrono_literals; + + // DST starts on the first of March. + const std::chrono::tzdb& tzdb_1 = parse( + R"( +Z Test 0 - LMT 1900 +0 Rule %s + +R Rule 1900 max - Mar 1 2u 1 Summer +R Rule 1900 max - Oct 1 2u 0 Winter +)"); + + const std::chrono::time_zone* tz_1 = tzdb_1.locate_zone("Test"); + assert_equal( + std::chrono::sys_info( + to_sys_seconds(1901y, std::chrono::March, 1d, 2h), + to_sys_seconds(1901y, std::chrono::October, 1d, 2h), + 1h, + 60min, + "Summer"), + tz_1->get_info(to_sys_seconds(1901y, std::chrono::March, 1d, 2h))); + + // The DST start changes from the first of March to the first of April. + const std::chrono::tzdb& tzdb_2 = parse( + R"( +Z Test 0 - LMT 1900 +0 Rule %s + +R Rule 1900 max - Apr 1 2u 1 Summer +R Rule 1900 max - Oct 1 2u 0 Winter +)"); + + const std::chrono::time_zone* tz_2 = tzdb_2.locate_zone("Test"); + assert_equal( + std::chrono::sys_info( + to_sys_seconds(1900y, std::chrono::October, 1d, 2h), + to_sys_seconds(1901y, std::chrono::April, 1d, 2h), + 0s, + 0min, + "Winter"), + tz_2->get_info(to_sys_seconds(1901y, std::chrono::March, 1d, 2h))); + + // Validate when using tz_1 the DST still starts on the first of March. + assert_equal( + std::chrono::sys_info( + to_sys_seconds(1901y, std::chrono::March, 1d, 2h), + to_sys_seconds(1901y, std::chrono::October, 1d, 2h), + 1h, + 60min, + "Summer"), + tz_1->get_info(to_sys_seconds(1901y, std::chrono::March, 1d, 2h))); + + // The zone Test is no longer present + [[maybe_unused]] const std::chrono::tzdb& tzdb_3 = parse("Z Etc/UTC 0 - UTC"); +#ifndef TEST_HAS_NO_EXCEPTIONS + TEST_VALIDATE_EXCEPTION( + std::runtime_error, + [&]([[maybe_unused]] const std::runtime_error& e) { + std::string what = "tzdb: requested time zone not found"; + TEST_LIBCPP_REQUIRE( + e.what() == what, + TEST_WRITE_CONCATENATED("\nExpected exception ", what, "\nActual exception ", e.what(), '\n')); + }, + TEST_IGNORE_NODISCARD tzdb_3.locate_zone("Test")); +#endif // TEST_HAS_NO_EXCEPTIONS + + // Search the zone Test in the original version 1 of the TZDB. + // This database should be unaffected by the removal in version 3. + tz_1 = tzdb_1.locate_zone("Test"); + + // Validate the rules still uses version 1's DST switch in March. + assert_equal( + std::chrono::sys_info( + to_sys_seconds(1901y, std::chrono::March, 1d, 2h), + to_sys_seconds(1901y, std::chrono::October, 1d, 2h), + 1h, + 60min, + "Summer"), + tz_1->get_info(to_sys_seconds(1901y, std::chrono::March, 1d, 2h))); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/libcxx/transitive_includes/cxx23.csv b/yass/third_party/libc++/trunk/test/libcxx/transitive_includes/cxx23.csv index 79c67dc00c..9ae422a31f 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/transitive_includes/cxx23.csv +++ b/yass/third_party/libc++/trunk/test/libcxx/transitive_includes/cxx23.csv @@ -80,7 +80,6 @@ chrono cstring chrono ctime chrono cwchar chrono forward_list -chrono initializer_list chrono limits chrono new chrono optional @@ -452,6 +451,7 @@ random vector random version ranges compare ranges cstddef +ranges cstdint ranges cwchar ranges initializer_list ranges iterator diff --git a/yass/third_party/libc++/trunk/test/libcxx/transitive_includes/cxx26.csv b/yass/third_party/libc++/trunk/test/libcxx/transitive_includes/cxx26.csv index 79c67dc00c..9ae422a31f 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/transitive_includes/cxx26.csv +++ b/yass/third_party/libc++/trunk/test/libcxx/transitive_includes/cxx26.csv @@ -80,7 +80,6 @@ chrono cstring chrono ctime chrono cwchar chrono forward_list -chrono initializer_list chrono limits chrono new chrono optional @@ -452,6 +451,7 @@ random vector random version ranges compare ranges cstddef +ranges cstdint ranges cwchar ranges initializer_list ranges iterator diff --git a/yass/third_party/libc++/trunk/test/libcxx/utilities/format/format.string/format.string.std/extended_grapheme_cluster.h b/yass/third_party/libc++/trunk/test/libcxx/utilities/format/format.string/format.string.std/extended_grapheme_cluster.h index 204dcacb11..eb7500a828 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/utilities/format/format.string/format.string.std/extended_grapheme_cluster.h +++ b/yass/third_party/libc++/trunk/test/libcxx/utilities/format/format.string/format.string.std/extended_grapheme_cluster.h @@ -82,7 +82,7 @@ struct data { }; /// The data for UTF-8. -std::array, 602> data_utf8 = {{ +std::array, 1187> data_utf8 = {{ {"\U00000020\U00000020", {32, 32}, {1, 2}}, {"\U00000020\U00000308\U00000020", {32, 32}, {3, 4}}, {"\U00000020\U0000000d", {32, 13}, {1, 2}}, @@ -97,8 +97,8 @@ std::array, 602> data_utf8 = {{ {"\U00000020\U00000308\U0001f1e6", {32, 127462}, {3, 7}}, {"\U00000020\U00000600", {32, 1536}, {1, 3}}, {"\U00000020\U00000308\U00000600", {32, 1536}, {3, 5}}, - {"\U00000020\U00000903", {32}, {4}}, - {"\U00000020\U00000308\U00000903", {32}, {6}}, + {"\U00000020\U00000a03", {32}, {4}}, + {"\U00000020\U00000308\U00000a03", {32}, {6}}, {"\U00000020\U00001100", {32, 4352}, {1, 4}}, {"\U00000020\U00000308\U00001100", {32, 4352}, {3, 6}}, {"\U00000020\U00001160", {32, 4448}, {1, 4}}, @@ -109,10 +109,24 @@ std::array, 602> data_utf8 = {{ {"\U00000020\U00000308\U0000ac00", {32, 44032}, {3, 6}}, {"\U00000020\U0000ac01", {32, 44033}, {1, 4}}, {"\U00000020\U00000308\U0000ac01", {32, 44033}, {3, 6}}, + {"\U00000020\U00000900", {32}, {4}}, + {"\U00000020\U00000308\U00000900", {32}, {6}}, + {"\U00000020\U00000903", {32}, {4}}, + {"\U00000020\U00000308\U00000903", {32}, {6}}, + {"\U00000020\U00000904", {32, 2308}, {1, 4}}, + {"\U00000020\U00000308\U00000904", {32, 2308}, {3, 6}}, + {"\U00000020\U00000d4e", {32, 3406}, {1, 4}}, + {"\U00000020\U00000308\U00000d4e", {32, 3406}, {3, 6}}, + {"\U00000020\U00000915", {32, 2325}, {1, 4}}, + {"\U00000020\U00000308\U00000915", {32, 2325}, {3, 6}}, {"\U00000020\U0000231a", {32, 8986}, {1, 4}}, {"\U00000020\U00000308\U0000231a", {32, 8986}, {3, 6}}, {"\U00000020\U00000300", {32}, {3}}, {"\U00000020\U00000308\U00000300", {32}, {5}}, + {"\U00000020\U0000093c", {32}, {4}}, + {"\U00000020\U00000308\U0000093c", {32}, {6}}, + {"\U00000020\U0000094d", {32}, {4}}, + {"\U00000020\U00000308\U0000094d", {32}, {6}}, {"\U00000020\U0000200d", {32}, {4}}, {"\U00000020\U00000308\U0000200d", {32}, {6}}, {"\U00000020\U00000378", {32, 888}, {1, 3}}, @@ -131,8 +145,8 @@ std::array, 602> data_utf8 = {{ {"\U0000000d\U00000308\U0001f1e6", {13, 776, 127462}, {1, 3, 7}}, {"\U0000000d\U00000600", {13, 1536}, {1, 3}}, {"\U0000000d\U00000308\U00000600", {13, 776, 1536}, {1, 3, 5}}, - {"\U0000000d\U00000903", {13, 2307}, {1, 4}}, - {"\U0000000d\U00000308\U00000903", {13, 776}, {1, 6}}, + {"\U0000000d\U00000a03", {13, 2563}, {1, 4}}, + {"\U0000000d\U00000308\U00000a03", {13, 776}, {1, 6}}, {"\U0000000d\U00001100", {13, 4352}, {1, 4}}, {"\U0000000d\U00000308\U00001100", {13, 776, 4352}, {1, 3, 6}}, {"\U0000000d\U00001160", {13, 4448}, {1, 4}}, @@ -143,10 +157,24 @@ std::array, 602> data_utf8 = {{ {"\U0000000d\U00000308\U0000ac00", {13, 776, 44032}, {1, 3, 6}}, {"\U0000000d\U0000ac01", {13, 44033}, {1, 4}}, {"\U0000000d\U00000308\U0000ac01", {13, 776, 44033}, {1, 3, 6}}, + {"\U0000000d\U00000900", {13, 2304}, {1, 4}}, + {"\U0000000d\U00000308\U00000900", {13, 776}, {1, 6}}, + {"\U0000000d\U00000903", {13, 2307}, {1, 4}}, + {"\U0000000d\U00000308\U00000903", {13, 776}, {1, 6}}, + {"\U0000000d\U00000904", {13, 2308}, {1, 4}}, + {"\U0000000d\U00000308\U00000904", {13, 776, 2308}, {1, 3, 6}}, + {"\U0000000d\U00000d4e", {13, 3406}, {1, 4}}, + {"\U0000000d\U00000308\U00000d4e", {13, 776, 3406}, {1, 3, 6}}, + {"\U0000000d\U00000915", {13, 2325}, {1, 4}}, + {"\U0000000d\U00000308\U00000915", {13, 776, 2325}, {1, 3, 6}}, {"\U0000000d\U0000231a", {13, 8986}, {1, 4}}, {"\U0000000d\U00000308\U0000231a", {13, 776, 8986}, {1, 3, 6}}, {"\U0000000d\U00000300", {13, 768}, {1, 3}}, {"\U0000000d\U00000308\U00000300", {13, 776}, {1, 5}}, + {"\U0000000d\U0000093c", {13, 2364}, {1, 4}}, + {"\U0000000d\U00000308\U0000093c", {13, 776}, {1, 6}}, + {"\U0000000d\U0000094d", {13, 2381}, {1, 4}}, + {"\U0000000d\U00000308\U0000094d", {13, 776}, {1, 6}}, {"\U0000000d\U0000200d", {13, 8205}, {1, 4}}, {"\U0000000d\U00000308\U0000200d", {13, 776}, {1, 6}}, {"\U0000000d\U00000378", {13, 888}, {1, 3}}, @@ -165,8 +193,8 @@ std::array, 602> data_utf8 = {{ {"\U0000000a\U00000308\U0001f1e6", {10, 776, 127462}, {1, 3, 7}}, {"\U0000000a\U00000600", {10, 1536}, {1, 3}}, {"\U0000000a\U00000308\U00000600", {10, 776, 1536}, {1, 3, 5}}, - {"\U0000000a\U00000903", {10, 2307}, {1, 4}}, - {"\U0000000a\U00000308\U00000903", {10, 776}, {1, 6}}, + {"\U0000000a\U00000a03", {10, 2563}, {1, 4}}, + {"\U0000000a\U00000308\U00000a03", {10, 776}, {1, 6}}, {"\U0000000a\U00001100", {10, 4352}, {1, 4}}, {"\U0000000a\U00000308\U00001100", {10, 776, 4352}, {1, 3, 6}}, {"\U0000000a\U00001160", {10, 4448}, {1, 4}}, @@ -177,10 +205,24 @@ std::array, 602> data_utf8 = {{ {"\U0000000a\U00000308\U0000ac00", {10, 776, 44032}, {1, 3, 6}}, {"\U0000000a\U0000ac01", {10, 44033}, {1, 4}}, {"\U0000000a\U00000308\U0000ac01", {10, 776, 44033}, {1, 3, 6}}, + {"\U0000000a\U00000900", {10, 2304}, {1, 4}}, + {"\U0000000a\U00000308\U00000900", {10, 776}, {1, 6}}, + {"\U0000000a\U00000903", {10, 2307}, {1, 4}}, + {"\U0000000a\U00000308\U00000903", {10, 776}, {1, 6}}, + {"\U0000000a\U00000904", {10, 2308}, {1, 4}}, + {"\U0000000a\U00000308\U00000904", {10, 776, 2308}, {1, 3, 6}}, + {"\U0000000a\U00000d4e", {10, 3406}, {1, 4}}, + {"\U0000000a\U00000308\U00000d4e", {10, 776, 3406}, {1, 3, 6}}, + {"\U0000000a\U00000915", {10, 2325}, {1, 4}}, + {"\U0000000a\U00000308\U00000915", {10, 776, 2325}, {1, 3, 6}}, {"\U0000000a\U0000231a", {10, 8986}, {1, 4}}, {"\U0000000a\U00000308\U0000231a", {10, 776, 8986}, {1, 3, 6}}, {"\U0000000a\U00000300", {10, 768}, {1, 3}}, {"\U0000000a\U00000308\U00000300", {10, 776}, {1, 5}}, + {"\U0000000a\U0000093c", {10, 2364}, {1, 4}}, + {"\U0000000a\U00000308\U0000093c", {10, 776}, {1, 6}}, + {"\U0000000a\U0000094d", {10, 2381}, {1, 4}}, + {"\U0000000a\U00000308\U0000094d", {10, 776}, {1, 6}}, {"\U0000000a\U0000200d", {10, 8205}, {1, 4}}, {"\U0000000a\U00000308\U0000200d", {10, 776}, {1, 6}}, {"\U0000000a\U00000378", {10, 888}, {1, 3}}, @@ -199,8 +241,8 @@ std::array, 602> data_utf8 = {{ {"\U00000001\U00000308\U0001f1e6", {1, 776, 127462}, {1, 3, 7}}, {"\U00000001\U00000600", {1, 1536}, {1, 3}}, {"\U00000001\U00000308\U00000600", {1, 776, 1536}, {1, 3, 5}}, - {"\U00000001\U00000903", {1, 2307}, {1, 4}}, - {"\U00000001\U00000308\U00000903", {1, 776}, {1, 6}}, + {"\U00000001\U00000a03", {1, 2563}, {1, 4}}, + {"\U00000001\U00000308\U00000a03", {1, 776}, {1, 6}}, {"\U00000001\U00001100", {1, 4352}, {1, 4}}, {"\U00000001\U00000308\U00001100", {1, 776, 4352}, {1, 3, 6}}, {"\U00000001\U00001160", {1, 4448}, {1, 4}}, @@ -211,10 +253,24 @@ std::array, 602> data_utf8 = {{ {"\U00000001\U00000308\U0000ac00", {1, 776, 44032}, {1, 3, 6}}, {"\U00000001\U0000ac01", {1, 44033}, {1, 4}}, {"\U00000001\U00000308\U0000ac01", {1, 776, 44033}, {1, 3, 6}}, + {"\U00000001\U00000900", {1, 2304}, {1, 4}}, + {"\U00000001\U00000308\U00000900", {1, 776}, {1, 6}}, + {"\U00000001\U00000903", {1, 2307}, {1, 4}}, + {"\U00000001\U00000308\U00000903", {1, 776}, {1, 6}}, + {"\U00000001\U00000904", {1, 2308}, {1, 4}}, + {"\U00000001\U00000308\U00000904", {1, 776, 2308}, {1, 3, 6}}, + {"\U00000001\U00000d4e", {1, 3406}, {1, 4}}, + {"\U00000001\U00000308\U00000d4e", {1, 776, 3406}, {1, 3, 6}}, + {"\U00000001\U00000915", {1, 2325}, {1, 4}}, + {"\U00000001\U00000308\U00000915", {1, 776, 2325}, {1, 3, 6}}, {"\U00000001\U0000231a", {1, 8986}, {1, 4}}, {"\U00000001\U00000308\U0000231a", {1, 776, 8986}, {1, 3, 6}}, {"\U00000001\U00000300", {1, 768}, {1, 3}}, {"\U00000001\U00000308\U00000300", {1, 776}, {1, 5}}, + {"\U00000001\U0000093c", {1, 2364}, {1, 4}}, + {"\U00000001\U00000308\U0000093c", {1, 776}, {1, 6}}, + {"\U00000001\U0000094d", {1, 2381}, {1, 4}}, + {"\U00000001\U00000308\U0000094d", {1, 776}, {1, 6}}, {"\U00000001\U0000200d", {1, 8205}, {1, 4}}, {"\U00000001\U00000308\U0000200d", {1, 776}, {1, 6}}, {"\U00000001\U00000378", {1, 888}, {1, 3}}, @@ -233,8 +289,8 @@ std::array, 602> data_utf8 = {{ {"\U0000034f\U00000308\U0001f1e6", {847, 127462}, {4, 8}}, {"\U0000034f\U00000600", {847, 1536}, {2, 4}}, {"\U0000034f\U00000308\U00000600", {847, 1536}, {4, 6}}, - {"\U0000034f\U00000903", {847}, {5}}, - {"\U0000034f\U00000308\U00000903", {847}, {7}}, + {"\U0000034f\U00000a03", {847}, {5}}, + {"\U0000034f\U00000308\U00000a03", {847}, {7}}, {"\U0000034f\U00001100", {847, 4352}, {2, 5}}, {"\U0000034f\U00000308\U00001100", {847, 4352}, {4, 7}}, {"\U0000034f\U00001160", {847, 4448}, {2, 5}}, @@ -245,10 +301,24 @@ std::array, 602> data_utf8 = {{ {"\U0000034f\U00000308\U0000ac00", {847, 44032}, {4, 7}}, {"\U0000034f\U0000ac01", {847, 44033}, {2, 5}}, {"\U0000034f\U00000308\U0000ac01", {847, 44033}, {4, 7}}, + {"\U0000034f\U00000900", {847}, {5}}, + {"\U0000034f\U00000308\U00000900", {847}, {7}}, + {"\U0000034f\U00000903", {847}, {5}}, + {"\U0000034f\U00000308\U00000903", {847}, {7}}, + {"\U0000034f\U00000904", {847, 2308}, {2, 5}}, + {"\U0000034f\U00000308\U00000904", {847, 2308}, {4, 7}}, + {"\U0000034f\U00000d4e", {847, 3406}, {2, 5}}, + {"\U0000034f\U00000308\U00000d4e", {847, 3406}, {4, 7}}, + {"\U0000034f\U00000915", {847, 2325}, {2, 5}}, + {"\U0000034f\U00000308\U00000915", {847, 2325}, {4, 7}}, {"\U0000034f\U0000231a", {847, 8986}, {2, 5}}, {"\U0000034f\U00000308\U0000231a", {847, 8986}, {4, 7}}, {"\U0000034f\U00000300", {847}, {4}}, {"\U0000034f\U00000308\U00000300", {847}, {6}}, + {"\U0000034f\U0000093c", {847}, {5}}, + {"\U0000034f\U00000308\U0000093c", {847}, {7}}, + {"\U0000034f\U0000094d", {847}, {5}}, + {"\U0000034f\U00000308\U0000094d", {847}, {7}}, {"\U0000034f\U0000200d", {847}, {5}}, {"\U0000034f\U00000308\U0000200d", {847}, {7}}, {"\U0000034f\U00000378", {847, 888}, {2, 4}}, @@ -267,8 +337,8 @@ std::array, 602> data_utf8 = {{ {"\U0001f1e6\U00000308\U0001f1e6", {127462, 127462}, {6, 10}}, {"\U0001f1e6\U00000600", {127462, 1536}, {4, 6}}, {"\U0001f1e6\U00000308\U00000600", {127462, 1536}, {6, 8}}, - {"\U0001f1e6\U00000903", {127462}, {7}}, - {"\U0001f1e6\U00000308\U00000903", {127462}, {9}}, + {"\U0001f1e6\U00000a03", {127462}, {7}}, + {"\U0001f1e6\U00000308\U00000a03", {127462}, {9}}, {"\U0001f1e6\U00001100", {127462, 4352}, {4, 7}}, {"\U0001f1e6\U00000308\U00001100", {127462, 4352}, {6, 9}}, {"\U0001f1e6\U00001160", {127462, 4448}, {4, 7}}, @@ -279,10 +349,24 @@ std::array, 602> data_utf8 = {{ {"\U0001f1e6\U00000308\U0000ac00", {127462, 44032}, {6, 9}}, {"\U0001f1e6\U0000ac01", {127462, 44033}, {4, 7}}, {"\U0001f1e6\U00000308\U0000ac01", {127462, 44033}, {6, 9}}, + {"\U0001f1e6\U00000900", {127462}, {7}}, + {"\U0001f1e6\U00000308\U00000900", {127462}, {9}}, + {"\U0001f1e6\U00000903", {127462}, {7}}, + {"\U0001f1e6\U00000308\U00000903", {127462}, {9}}, + {"\U0001f1e6\U00000904", {127462, 2308}, {4, 7}}, + {"\U0001f1e6\U00000308\U00000904", {127462, 2308}, {6, 9}}, + {"\U0001f1e6\U00000d4e", {127462, 3406}, {4, 7}}, + {"\U0001f1e6\U00000308\U00000d4e", {127462, 3406}, {6, 9}}, + {"\U0001f1e6\U00000915", {127462, 2325}, {4, 7}}, + {"\U0001f1e6\U00000308\U00000915", {127462, 2325}, {6, 9}}, {"\U0001f1e6\U0000231a", {127462, 8986}, {4, 7}}, {"\U0001f1e6\U00000308\U0000231a", {127462, 8986}, {6, 9}}, {"\U0001f1e6\U00000300", {127462}, {6}}, {"\U0001f1e6\U00000308\U00000300", {127462}, {8}}, + {"\U0001f1e6\U0000093c", {127462}, {7}}, + {"\U0001f1e6\U00000308\U0000093c", {127462}, {9}}, + {"\U0001f1e6\U0000094d", {127462}, {7}}, + {"\U0001f1e6\U00000308\U0000094d", {127462}, {9}}, {"\U0001f1e6\U0000200d", {127462}, {7}}, {"\U0001f1e6\U00000308\U0000200d", {127462}, {9}}, {"\U0001f1e6\U00000378", {127462, 888}, {4, 6}}, @@ -301,8 +385,8 @@ std::array, 602> data_utf8 = {{ {"\U00000600\U00000308\U0001f1e6", {1536, 127462}, {4, 8}}, {"\U00000600\U00000600", {1536}, {4}}, {"\U00000600\U00000308\U00000600", {1536, 1536}, {4, 6}}, - {"\U00000600\U00000903", {1536}, {5}}, - {"\U00000600\U00000308\U00000903", {1536}, {7}}, + {"\U00000600\U00000a03", {1536}, {5}}, + {"\U00000600\U00000308\U00000a03", {1536}, {7}}, {"\U00000600\U00001100", {1536}, {5}}, {"\U00000600\U00000308\U00001100", {1536, 4352}, {4, 7}}, {"\U00000600\U00001160", {1536}, {5}}, @@ -313,48 +397,76 @@ std::array, 602> data_utf8 = {{ {"\U00000600\U00000308\U0000ac00", {1536, 44032}, {4, 7}}, {"\U00000600\U0000ac01", {1536}, {5}}, {"\U00000600\U00000308\U0000ac01", {1536, 44033}, {4, 7}}, + {"\U00000600\U00000900", {1536}, {5}}, + {"\U00000600\U00000308\U00000900", {1536}, {7}}, + {"\U00000600\U00000903", {1536}, {5}}, + {"\U00000600\U00000308\U00000903", {1536}, {7}}, + {"\U00000600\U00000904", {1536}, {5}}, + {"\U00000600\U00000308\U00000904", {1536, 2308}, {4, 7}}, + {"\U00000600\U00000d4e", {1536}, {5}}, + {"\U00000600\U00000308\U00000d4e", {1536, 3406}, {4, 7}}, + {"\U00000600\U00000915", {1536}, {5}}, + {"\U00000600\U00000308\U00000915", {1536, 2325}, {4, 7}}, {"\U00000600\U0000231a", {1536}, {5}}, {"\U00000600\U00000308\U0000231a", {1536, 8986}, {4, 7}}, {"\U00000600\U00000300", {1536}, {4}}, {"\U00000600\U00000308\U00000300", {1536}, {6}}, + {"\U00000600\U0000093c", {1536}, {5}}, + {"\U00000600\U00000308\U0000093c", {1536}, {7}}, + {"\U00000600\U0000094d", {1536}, {5}}, + {"\U00000600\U00000308\U0000094d", {1536}, {7}}, {"\U00000600\U0000200d", {1536}, {5}}, {"\U00000600\U00000308\U0000200d", {1536}, {7}}, {"\U00000600\U00000378", {1536}, {4}}, {"\U00000600\U00000308\U00000378", {1536, 888}, {4, 6}}, - {"\U00000903\U00000020", {2307, 32}, {3, 4}}, - {"\U00000903\U00000308\U00000020", {2307, 32}, {5, 6}}, - {"\U00000903\U0000000d", {2307, 13}, {3, 4}}, - {"\U00000903\U00000308\U0000000d", {2307, 13}, {5, 6}}, - {"\U00000903\U0000000a", {2307, 10}, {3, 4}}, - {"\U00000903\U00000308\U0000000a", {2307, 10}, {5, 6}}, - {"\U00000903\U00000001", {2307, 1}, {3, 4}}, - {"\U00000903\U00000308\U00000001", {2307, 1}, {5, 6}}, - {"\U00000903\U0000034f", {2307}, {5}}, - {"\U00000903\U00000308\U0000034f", {2307}, {7}}, - {"\U00000903\U0001f1e6", {2307, 127462}, {3, 7}}, - {"\U00000903\U00000308\U0001f1e6", {2307, 127462}, {5, 9}}, - {"\U00000903\U00000600", {2307, 1536}, {3, 5}}, - {"\U00000903\U00000308\U00000600", {2307, 1536}, {5, 7}}, - {"\U00000903\U00000903", {2307}, {6}}, - {"\U00000903\U00000308\U00000903", {2307}, {8}}, - {"\U00000903\U00001100", {2307, 4352}, {3, 6}}, - {"\U00000903\U00000308\U00001100", {2307, 4352}, {5, 8}}, - {"\U00000903\U00001160", {2307, 4448}, {3, 6}}, - {"\U00000903\U00000308\U00001160", {2307, 4448}, {5, 8}}, - {"\U00000903\U000011a8", {2307, 4520}, {3, 6}}, - {"\U00000903\U00000308\U000011a8", {2307, 4520}, {5, 8}}, - {"\U00000903\U0000ac00", {2307, 44032}, {3, 6}}, - {"\U00000903\U00000308\U0000ac00", {2307, 44032}, {5, 8}}, - {"\U00000903\U0000ac01", {2307, 44033}, {3, 6}}, - {"\U00000903\U00000308\U0000ac01", {2307, 44033}, {5, 8}}, - {"\U00000903\U0000231a", {2307, 8986}, {3, 6}}, - {"\U00000903\U00000308\U0000231a", {2307, 8986}, {5, 8}}, - {"\U00000903\U00000300", {2307}, {5}}, - {"\U00000903\U00000308\U00000300", {2307}, {7}}, - {"\U00000903\U0000200d", {2307}, {6}}, - {"\U00000903\U00000308\U0000200d", {2307}, {8}}, - {"\U00000903\U00000378", {2307, 888}, {3, 5}}, - {"\U00000903\U00000308\U00000378", {2307, 888}, {5, 7}}, + {"\U00000a03\U00000020", {2563, 32}, {3, 4}}, + {"\U00000a03\U00000308\U00000020", {2563, 32}, {5, 6}}, + {"\U00000a03\U0000000d", {2563, 13}, {3, 4}}, + {"\U00000a03\U00000308\U0000000d", {2563, 13}, {5, 6}}, + {"\U00000a03\U0000000a", {2563, 10}, {3, 4}}, + {"\U00000a03\U00000308\U0000000a", {2563, 10}, {5, 6}}, + {"\U00000a03\U00000001", {2563, 1}, {3, 4}}, + {"\U00000a03\U00000308\U00000001", {2563, 1}, {5, 6}}, + {"\U00000a03\U0000034f", {2563}, {5}}, + {"\U00000a03\U00000308\U0000034f", {2563}, {7}}, + {"\U00000a03\U0001f1e6", {2563, 127462}, {3, 7}}, + {"\U00000a03\U00000308\U0001f1e6", {2563, 127462}, {5, 9}}, + {"\U00000a03\U00000600", {2563, 1536}, {3, 5}}, + {"\U00000a03\U00000308\U00000600", {2563, 1536}, {5, 7}}, + {"\U00000a03\U00000a03", {2563}, {6}}, + {"\U00000a03\U00000308\U00000a03", {2563}, {8}}, + {"\U00000a03\U00001100", {2563, 4352}, {3, 6}}, + {"\U00000a03\U00000308\U00001100", {2563, 4352}, {5, 8}}, + {"\U00000a03\U00001160", {2563, 4448}, {3, 6}}, + {"\U00000a03\U00000308\U00001160", {2563, 4448}, {5, 8}}, + {"\U00000a03\U000011a8", {2563, 4520}, {3, 6}}, + {"\U00000a03\U00000308\U000011a8", {2563, 4520}, {5, 8}}, + {"\U00000a03\U0000ac00", {2563, 44032}, {3, 6}}, + {"\U00000a03\U00000308\U0000ac00", {2563, 44032}, {5, 8}}, + {"\U00000a03\U0000ac01", {2563, 44033}, {3, 6}}, + {"\U00000a03\U00000308\U0000ac01", {2563, 44033}, {5, 8}}, + {"\U00000a03\U00000900", {2563}, {6}}, + {"\U00000a03\U00000308\U00000900", {2563}, {8}}, + {"\U00000a03\U00000903", {2563}, {6}}, + {"\U00000a03\U00000308\U00000903", {2563}, {8}}, + {"\U00000a03\U00000904", {2563, 2308}, {3, 6}}, + {"\U00000a03\U00000308\U00000904", {2563, 2308}, {5, 8}}, + {"\U00000a03\U00000d4e", {2563, 3406}, {3, 6}}, + {"\U00000a03\U00000308\U00000d4e", {2563, 3406}, {5, 8}}, + {"\U00000a03\U00000915", {2563, 2325}, {3, 6}}, + {"\U00000a03\U00000308\U00000915", {2563, 2325}, {5, 8}}, + {"\U00000a03\U0000231a", {2563, 8986}, {3, 6}}, + {"\U00000a03\U00000308\U0000231a", {2563, 8986}, {5, 8}}, + {"\U00000a03\U00000300", {2563}, {5}}, + {"\U00000a03\U00000308\U00000300", {2563}, {7}}, + {"\U00000a03\U0000093c", {2563}, {6}}, + {"\U00000a03\U00000308\U0000093c", {2563}, {8}}, + {"\U00000a03\U0000094d", {2563}, {6}}, + {"\U00000a03\U00000308\U0000094d", {2563}, {8}}, + {"\U00000a03\U0000200d", {2563}, {6}}, + {"\U00000a03\U00000308\U0000200d", {2563}, {8}}, + {"\U00000a03\U00000378", {2563, 888}, {3, 5}}, + {"\U00000a03\U00000308\U00000378", {2563, 888}, {5, 7}}, {"\U00001100\U00000020", {4352, 32}, {3, 4}}, {"\U00001100\U00000308\U00000020", {4352, 32}, {5, 6}}, {"\U00001100\U0000000d", {4352, 13}, {3, 4}}, @@ -369,8 +481,8 @@ std::array, 602> data_utf8 = {{ {"\U00001100\U00000308\U0001f1e6", {4352, 127462}, {5, 9}}, {"\U00001100\U00000600", {4352, 1536}, {3, 5}}, {"\U00001100\U00000308\U00000600", {4352, 1536}, {5, 7}}, - {"\U00001100\U00000903", {4352}, {6}}, - {"\U00001100\U00000308\U00000903", {4352}, {8}}, + {"\U00001100\U00000a03", {4352}, {6}}, + {"\U00001100\U00000308\U00000a03", {4352}, {8}}, {"\U00001100\U00001100", {4352}, {6}}, {"\U00001100\U00000308\U00001100", {4352, 4352}, {5, 8}}, {"\U00001100\U00001160", {4352}, {6}}, @@ -381,10 +493,24 @@ std::array, 602> data_utf8 = {{ {"\U00001100\U00000308\U0000ac00", {4352, 44032}, {5, 8}}, {"\U00001100\U0000ac01", {4352}, {6}}, {"\U00001100\U00000308\U0000ac01", {4352, 44033}, {5, 8}}, + {"\U00001100\U00000900", {4352}, {6}}, + {"\U00001100\U00000308\U00000900", {4352}, {8}}, + {"\U00001100\U00000903", {4352}, {6}}, + {"\U00001100\U00000308\U00000903", {4352}, {8}}, + {"\U00001100\U00000904", {4352, 2308}, {3, 6}}, + {"\U00001100\U00000308\U00000904", {4352, 2308}, {5, 8}}, + {"\U00001100\U00000d4e", {4352, 3406}, {3, 6}}, + {"\U00001100\U00000308\U00000d4e", {4352, 3406}, {5, 8}}, + {"\U00001100\U00000915", {4352, 2325}, {3, 6}}, + {"\U00001100\U00000308\U00000915", {4352, 2325}, {5, 8}}, {"\U00001100\U0000231a", {4352, 8986}, {3, 6}}, {"\U00001100\U00000308\U0000231a", {4352, 8986}, {5, 8}}, {"\U00001100\U00000300", {4352}, {5}}, {"\U00001100\U00000308\U00000300", {4352}, {7}}, + {"\U00001100\U0000093c", {4352}, {6}}, + {"\U00001100\U00000308\U0000093c", {4352}, {8}}, + {"\U00001100\U0000094d", {4352}, {6}}, + {"\U00001100\U00000308\U0000094d", {4352}, {8}}, {"\U00001100\U0000200d", {4352}, {6}}, {"\U00001100\U00000308\U0000200d", {4352}, {8}}, {"\U00001100\U00000378", {4352, 888}, {3, 5}}, @@ -403,8 +529,8 @@ std::array, 602> data_utf8 = {{ {"\U00001160\U00000308\U0001f1e6", {4448, 127462}, {5, 9}}, {"\U00001160\U00000600", {4448, 1536}, {3, 5}}, {"\U00001160\U00000308\U00000600", {4448, 1536}, {5, 7}}, - {"\U00001160\U00000903", {4448}, {6}}, - {"\U00001160\U00000308\U00000903", {4448}, {8}}, + {"\U00001160\U00000a03", {4448}, {6}}, + {"\U00001160\U00000308\U00000a03", {4448}, {8}}, {"\U00001160\U00001100", {4448, 4352}, {3, 6}}, {"\U00001160\U00000308\U00001100", {4448, 4352}, {5, 8}}, {"\U00001160\U00001160", {4448}, {6}}, @@ -415,10 +541,24 @@ std::array, 602> data_utf8 = {{ {"\U00001160\U00000308\U0000ac00", {4448, 44032}, {5, 8}}, {"\U00001160\U0000ac01", {4448, 44033}, {3, 6}}, {"\U00001160\U00000308\U0000ac01", {4448, 44033}, {5, 8}}, + {"\U00001160\U00000900", {4448}, {6}}, + {"\U00001160\U00000308\U00000900", {4448}, {8}}, + {"\U00001160\U00000903", {4448}, {6}}, + {"\U00001160\U00000308\U00000903", {4448}, {8}}, + {"\U00001160\U00000904", {4448, 2308}, {3, 6}}, + {"\U00001160\U00000308\U00000904", {4448, 2308}, {5, 8}}, + {"\U00001160\U00000d4e", {4448, 3406}, {3, 6}}, + {"\U00001160\U00000308\U00000d4e", {4448, 3406}, {5, 8}}, + {"\U00001160\U00000915", {4448, 2325}, {3, 6}}, + {"\U00001160\U00000308\U00000915", {4448, 2325}, {5, 8}}, {"\U00001160\U0000231a", {4448, 8986}, {3, 6}}, {"\U00001160\U00000308\U0000231a", {4448, 8986}, {5, 8}}, {"\U00001160\U00000300", {4448}, {5}}, {"\U00001160\U00000308\U00000300", {4448}, {7}}, + {"\U00001160\U0000093c", {4448}, {6}}, + {"\U00001160\U00000308\U0000093c", {4448}, {8}}, + {"\U00001160\U0000094d", {4448}, {6}}, + {"\U00001160\U00000308\U0000094d", {4448}, {8}}, {"\U00001160\U0000200d", {4448}, {6}}, {"\U00001160\U00000308\U0000200d", {4448}, {8}}, {"\U00001160\U00000378", {4448, 888}, {3, 5}}, @@ -437,8 +577,8 @@ std::array, 602> data_utf8 = {{ {"\U000011a8\U00000308\U0001f1e6", {4520, 127462}, {5, 9}}, {"\U000011a8\U00000600", {4520, 1536}, {3, 5}}, {"\U000011a8\U00000308\U00000600", {4520, 1536}, {5, 7}}, - {"\U000011a8\U00000903", {4520}, {6}}, - {"\U000011a8\U00000308\U00000903", {4520}, {8}}, + {"\U000011a8\U00000a03", {4520}, {6}}, + {"\U000011a8\U00000308\U00000a03", {4520}, {8}}, {"\U000011a8\U00001100", {4520, 4352}, {3, 6}}, {"\U000011a8\U00000308\U00001100", {4520, 4352}, {5, 8}}, {"\U000011a8\U00001160", {4520, 4448}, {3, 6}}, @@ -449,10 +589,24 @@ std::array, 602> data_utf8 = {{ {"\U000011a8\U00000308\U0000ac00", {4520, 44032}, {5, 8}}, {"\U000011a8\U0000ac01", {4520, 44033}, {3, 6}}, {"\U000011a8\U00000308\U0000ac01", {4520, 44033}, {5, 8}}, + {"\U000011a8\U00000900", {4520}, {6}}, + {"\U000011a8\U00000308\U00000900", {4520}, {8}}, + {"\U000011a8\U00000903", {4520}, {6}}, + {"\U000011a8\U00000308\U00000903", {4520}, {8}}, + {"\U000011a8\U00000904", {4520, 2308}, {3, 6}}, + {"\U000011a8\U00000308\U00000904", {4520, 2308}, {5, 8}}, + {"\U000011a8\U00000d4e", {4520, 3406}, {3, 6}}, + {"\U000011a8\U00000308\U00000d4e", {4520, 3406}, {5, 8}}, + {"\U000011a8\U00000915", {4520, 2325}, {3, 6}}, + {"\U000011a8\U00000308\U00000915", {4520, 2325}, {5, 8}}, {"\U000011a8\U0000231a", {4520, 8986}, {3, 6}}, {"\U000011a8\U00000308\U0000231a", {4520, 8986}, {5, 8}}, {"\U000011a8\U00000300", {4520}, {5}}, {"\U000011a8\U00000308\U00000300", {4520}, {7}}, + {"\U000011a8\U0000093c", {4520}, {6}}, + {"\U000011a8\U00000308\U0000093c", {4520}, {8}}, + {"\U000011a8\U0000094d", {4520}, {6}}, + {"\U000011a8\U00000308\U0000094d", {4520}, {8}}, {"\U000011a8\U0000200d", {4520}, {6}}, {"\U000011a8\U00000308\U0000200d", {4520}, {8}}, {"\U000011a8\U00000378", {4520, 888}, {3, 5}}, @@ -471,8 +625,8 @@ std::array, 602> data_utf8 = {{ {"\U0000ac00\U00000308\U0001f1e6", {44032, 127462}, {5, 9}}, {"\U0000ac00\U00000600", {44032, 1536}, {3, 5}}, {"\U0000ac00\U00000308\U00000600", {44032, 1536}, {5, 7}}, - {"\U0000ac00\U00000903", {44032}, {6}}, - {"\U0000ac00\U00000308\U00000903", {44032}, {8}}, + {"\U0000ac00\U00000a03", {44032}, {6}}, + {"\U0000ac00\U00000308\U00000a03", {44032}, {8}}, {"\U0000ac00\U00001100", {44032, 4352}, {3, 6}}, {"\U0000ac00\U00000308\U00001100", {44032, 4352}, {5, 8}}, {"\U0000ac00\U00001160", {44032}, {6}}, @@ -483,10 +637,24 @@ std::array, 602> data_utf8 = {{ {"\U0000ac00\U00000308\U0000ac00", {44032, 44032}, {5, 8}}, {"\U0000ac00\U0000ac01", {44032, 44033}, {3, 6}}, {"\U0000ac00\U00000308\U0000ac01", {44032, 44033}, {5, 8}}, + {"\U0000ac00\U00000900", {44032}, {6}}, + {"\U0000ac00\U00000308\U00000900", {44032}, {8}}, + {"\U0000ac00\U00000903", {44032}, {6}}, + {"\U0000ac00\U00000308\U00000903", {44032}, {8}}, + {"\U0000ac00\U00000904", {44032, 2308}, {3, 6}}, + {"\U0000ac00\U00000308\U00000904", {44032, 2308}, {5, 8}}, + {"\U0000ac00\U00000d4e", {44032, 3406}, {3, 6}}, + {"\U0000ac00\U00000308\U00000d4e", {44032, 3406}, {5, 8}}, + {"\U0000ac00\U00000915", {44032, 2325}, {3, 6}}, + {"\U0000ac00\U00000308\U00000915", {44032, 2325}, {5, 8}}, {"\U0000ac00\U0000231a", {44032, 8986}, {3, 6}}, {"\U0000ac00\U00000308\U0000231a", {44032, 8986}, {5, 8}}, {"\U0000ac00\U00000300", {44032}, {5}}, {"\U0000ac00\U00000308\U00000300", {44032}, {7}}, + {"\U0000ac00\U0000093c", {44032}, {6}}, + {"\U0000ac00\U00000308\U0000093c", {44032}, {8}}, + {"\U0000ac00\U0000094d", {44032}, {6}}, + {"\U0000ac00\U00000308\U0000094d", {44032}, {8}}, {"\U0000ac00\U0000200d", {44032}, {6}}, {"\U0000ac00\U00000308\U0000200d", {44032}, {8}}, {"\U0000ac00\U00000378", {44032, 888}, {3, 5}}, @@ -505,8 +673,8 @@ std::array, 602> data_utf8 = {{ {"\U0000ac01\U00000308\U0001f1e6", {44033, 127462}, {5, 9}}, {"\U0000ac01\U00000600", {44033, 1536}, {3, 5}}, {"\U0000ac01\U00000308\U00000600", {44033, 1536}, {5, 7}}, - {"\U0000ac01\U00000903", {44033}, {6}}, - {"\U0000ac01\U00000308\U00000903", {44033}, {8}}, + {"\U0000ac01\U00000a03", {44033}, {6}}, + {"\U0000ac01\U00000308\U00000a03", {44033}, {8}}, {"\U0000ac01\U00001100", {44033, 4352}, {3, 6}}, {"\U0000ac01\U00000308\U00001100", {44033, 4352}, {5, 8}}, {"\U0000ac01\U00001160", {44033, 4448}, {3, 6}}, @@ -517,14 +685,268 @@ std::array, 602> data_utf8 = {{ {"\U0000ac01\U00000308\U0000ac00", {44033, 44032}, {5, 8}}, {"\U0000ac01\U0000ac01", {44033, 44033}, {3, 6}}, {"\U0000ac01\U00000308\U0000ac01", {44033, 44033}, {5, 8}}, + {"\U0000ac01\U00000900", {44033}, {6}}, + {"\U0000ac01\U00000308\U00000900", {44033}, {8}}, + {"\U0000ac01\U00000903", {44033}, {6}}, + {"\U0000ac01\U00000308\U00000903", {44033}, {8}}, + {"\U0000ac01\U00000904", {44033, 2308}, {3, 6}}, + {"\U0000ac01\U00000308\U00000904", {44033, 2308}, {5, 8}}, + {"\U0000ac01\U00000d4e", {44033, 3406}, {3, 6}}, + {"\U0000ac01\U00000308\U00000d4e", {44033, 3406}, {5, 8}}, + {"\U0000ac01\U00000915", {44033, 2325}, {3, 6}}, + {"\U0000ac01\U00000308\U00000915", {44033, 2325}, {5, 8}}, {"\U0000ac01\U0000231a", {44033, 8986}, {3, 6}}, {"\U0000ac01\U00000308\U0000231a", {44033, 8986}, {5, 8}}, {"\U0000ac01\U00000300", {44033}, {5}}, {"\U0000ac01\U00000308\U00000300", {44033}, {7}}, + {"\U0000ac01\U0000093c", {44033}, {6}}, + {"\U0000ac01\U00000308\U0000093c", {44033}, {8}}, + {"\U0000ac01\U0000094d", {44033}, {6}}, + {"\U0000ac01\U00000308\U0000094d", {44033}, {8}}, {"\U0000ac01\U0000200d", {44033}, {6}}, {"\U0000ac01\U00000308\U0000200d", {44033}, {8}}, {"\U0000ac01\U00000378", {44033, 888}, {3, 5}}, {"\U0000ac01\U00000308\U00000378", {44033, 888}, {5, 7}}, + {"\U00000900\U00000020", {2304, 32}, {3, 4}}, + {"\U00000900\U00000308\U00000020", {2304, 32}, {5, 6}}, + {"\U00000900\U0000000d", {2304, 13}, {3, 4}}, + {"\U00000900\U00000308\U0000000d", {2304, 13}, {5, 6}}, + {"\U00000900\U0000000a", {2304, 10}, {3, 4}}, + {"\U00000900\U00000308\U0000000a", {2304, 10}, {5, 6}}, + {"\U00000900\U00000001", {2304, 1}, {3, 4}}, + {"\U00000900\U00000308\U00000001", {2304, 1}, {5, 6}}, + {"\U00000900\U0000034f", {2304}, {5}}, + {"\U00000900\U00000308\U0000034f", {2304}, {7}}, + {"\U00000900\U0001f1e6", {2304, 127462}, {3, 7}}, + {"\U00000900\U00000308\U0001f1e6", {2304, 127462}, {5, 9}}, + {"\U00000900\U00000600", {2304, 1536}, {3, 5}}, + {"\U00000900\U00000308\U00000600", {2304, 1536}, {5, 7}}, + {"\U00000900\U00000a03", {2304}, {6}}, + {"\U00000900\U00000308\U00000a03", {2304}, {8}}, + {"\U00000900\U00001100", {2304, 4352}, {3, 6}}, + {"\U00000900\U00000308\U00001100", {2304, 4352}, {5, 8}}, + {"\U00000900\U00001160", {2304, 4448}, {3, 6}}, + {"\U00000900\U00000308\U00001160", {2304, 4448}, {5, 8}}, + {"\U00000900\U000011a8", {2304, 4520}, {3, 6}}, + {"\U00000900\U00000308\U000011a8", {2304, 4520}, {5, 8}}, + {"\U00000900\U0000ac00", {2304, 44032}, {3, 6}}, + {"\U00000900\U00000308\U0000ac00", {2304, 44032}, {5, 8}}, + {"\U00000900\U0000ac01", {2304, 44033}, {3, 6}}, + {"\U00000900\U00000308\U0000ac01", {2304, 44033}, {5, 8}}, + {"\U00000900\U00000900", {2304}, {6}}, + {"\U00000900\U00000308\U00000900", {2304}, {8}}, + {"\U00000900\U00000903", {2304}, {6}}, + {"\U00000900\U00000308\U00000903", {2304}, {8}}, + {"\U00000900\U00000904", {2304, 2308}, {3, 6}}, + {"\U00000900\U00000308\U00000904", {2304, 2308}, {5, 8}}, + {"\U00000900\U00000d4e", {2304, 3406}, {3, 6}}, + {"\U00000900\U00000308\U00000d4e", {2304, 3406}, {5, 8}}, + {"\U00000900\U00000915", {2304, 2325}, {3, 6}}, + {"\U00000900\U00000308\U00000915", {2304, 2325}, {5, 8}}, + {"\U00000900\U0000231a", {2304, 8986}, {3, 6}}, + {"\U00000900\U00000308\U0000231a", {2304, 8986}, {5, 8}}, + {"\U00000900\U00000300", {2304}, {5}}, + {"\U00000900\U00000308\U00000300", {2304}, {7}}, + {"\U00000900\U0000093c", {2304}, {6}}, + {"\U00000900\U00000308\U0000093c", {2304}, {8}}, + {"\U00000900\U0000094d", {2304}, {6}}, + {"\U00000900\U00000308\U0000094d", {2304}, {8}}, + {"\U00000900\U0000200d", {2304}, {6}}, + {"\U00000900\U00000308\U0000200d", {2304}, {8}}, + {"\U00000900\U00000378", {2304, 888}, {3, 5}}, + {"\U00000900\U00000308\U00000378", {2304, 888}, {5, 7}}, + {"\U00000903\U00000020", {2307, 32}, {3, 4}}, + {"\U00000903\U00000308\U00000020", {2307, 32}, {5, 6}}, + {"\U00000903\U0000000d", {2307, 13}, {3, 4}}, + {"\U00000903\U00000308\U0000000d", {2307, 13}, {5, 6}}, + {"\U00000903\U0000000a", {2307, 10}, {3, 4}}, + {"\U00000903\U00000308\U0000000a", {2307, 10}, {5, 6}}, + {"\U00000903\U00000001", {2307, 1}, {3, 4}}, + {"\U00000903\U00000308\U00000001", {2307, 1}, {5, 6}}, + {"\U00000903\U0000034f", {2307}, {5}}, + {"\U00000903\U00000308\U0000034f", {2307}, {7}}, + {"\U00000903\U0001f1e6", {2307, 127462}, {3, 7}}, + {"\U00000903\U00000308\U0001f1e6", {2307, 127462}, {5, 9}}, + {"\U00000903\U00000600", {2307, 1536}, {3, 5}}, + {"\U00000903\U00000308\U00000600", {2307, 1536}, {5, 7}}, + {"\U00000903\U00000a03", {2307}, {6}}, + {"\U00000903\U00000308\U00000a03", {2307}, {8}}, + {"\U00000903\U00001100", {2307, 4352}, {3, 6}}, + {"\U00000903\U00000308\U00001100", {2307, 4352}, {5, 8}}, + {"\U00000903\U00001160", {2307, 4448}, {3, 6}}, + {"\U00000903\U00000308\U00001160", {2307, 4448}, {5, 8}}, + {"\U00000903\U000011a8", {2307, 4520}, {3, 6}}, + {"\U00000903\U00000308\U000011a8", {2307, 4520}, {5, 8}}, + {"\U00000903\U0000ac00", {2307, 44032}, {3, 6}}, + {"\U00000903\U00000308\U0000ac00", {2307, 44032}, {5, 8}}, + {"\U00000903\U0000ac01", {2307, 44033}, {3, 6}}, + {"\U00000903\U00000308\U0000ac01", {2307, 44033}, {5, 8}}, + {"\U00000903\U00000900", {2307}, {6}}, + {"\U00000903\U00000308\U00000900", {2307}, {8}}, + {"\U00000903\U00000903", {2307}, {6}}, + {"\U00000903\U00000308\U00000903", {2307}, {8}}, + {"\U00000903\U00000904", {2307, 2308}, {3, 6}}, + {"\U00000903\U00000308\U00000904", {2307, 2308}, {5, 8}}, + {"\U00000903\U00000d4e", {2307, 3406}, {3, 6}}, + {"\U00000903\U00000308\U00000d4e", {2307, 3406}, {5, 8}}, + {"\U00000903\U00000915", {2307, 2325}, {3, 6}}, + {"\U00000903\U00000308\U00000915", {2307, 2325}, {5, 8}}, + {"\U00000903\U0000231a", {2307, 8986}, {3, 6}}, + {"\U00000903\U00000308\U0000231a", {2307, 8986}, {5, 8}}, + {"\U00000903\U00000300", {2307}, {5}}, + {"\U00000903\U00000308\U00000300", {2307}, {7}}, + {"\U00000903\U0000093c", {2307}, {6}}, + {"\U00000903\U00000308\U0000093c", {2307}, {8}}, + {"\U00000903\U0000094d", {2307}, {6}}, + {"\U00000903\U00000308\U0000094d", {2307}, {8}}, + {"\U00000903\U0000200d", {2307}, {6}}, + {"\U00000903\U00000308\U0000200d", {2307}, {8}}, + {"\U00000903\U00000378", {2307, 888}, {3, 5}}, + {"\U00000903\U00000308\U00000378", {2307, 888}, {5, 7}}, + {"\U00000904\U00000020", {2308, 32}, {3, 4}}, + {"\U00000904\U00000308\U00000020", {2308, 32}, {5, 6}}, + {"\U00000904\U0000000d", {2308, 13}, {3, 4}}, + {"\U00000904\U00000308\U0000000d", {2308, 13}, {5, 6}}, + {"\U00000904\U0000000a", {2308, 10}, {3, 4}}, + {"\U00000904\U00000308\U0000000a", {2308, 10}, {5, 6}}, + {"\U00000904\U00000001", {2308, 1}, {3, 4}}, + {"\U00000904\U00000308\U00000001", {2308, 1}, {5, 6}}, + {"\U00000904\U0000034f", {2308}, {5}}, + {"\U00000904\U00000308\U0000034f", {2308}, {7}}, + {"\U00000904\U0001f1e6", {2308, 127462}, {3, 7}}, + {"\U00000904\U00000308\U0001f1e6", {2308, 127462}, {5, 9}}, + {"\U00000904\U00000600", {2308, 1536}, {3, 5}}, + {"\U00000904\U00000308\U00000600", {2308, 1536}, {5, 7}}, + {"\U00000904\U00000a03", {2308}, {6}}, + {"\U00000904\U00000308\U00000a03", {2308}, {8}}, + {"\U00000904\U00001100", {2308, 4352}, {3, 6}}, + {"\U00000904\U00000308\U00001100", {2308, 4352}, {5, 8}}, + {"\U00000904\U00001160", {2308, 4448}, {3, 6}}, + {"\U00000904\U00000308\U00001160", {2308, 4448}, {5, 8}}, + {"\U00000904\U000011a8", {2308, 4520}, {3, 6}}, + {"\U00000904\U00000308\U000011a8", {2308, 4520}, {5, 8}}, + {"\U00000904\U0000ac00", {2308, 44032}, {3, 6}}, + {"\U00000904\U00000308\U0000ac00", {2308, 44032}, {5, 8}}, + {"\U00000904\U0000ac01", {2308, 44033}, {3, 6}}, + {"\U00000904\U00000308\U0000ac01", {2308, 44033}, {5, 8}}, + {"\U00000904\U00000900", {2308}, {6}}, + {"\U00000904\U00000308\U00000900", {2308}, {8}}, + {"\U00000904\U00000903", {2308}, {6}}, + {"\U00000904\U00000308\U00000903", {2308}, {8}}, + {"\U00000904\U00000904", {2308, 2308}, {3, 6}}, + {"\U00000904\U00000308\U00000904", {2308, 2308}, {5, 8}}, + {"\U00000904\U00000d4e", {2308, 3406}, {3, 6}}, + {"\U00000904\U00000308\U00000d4e", {2308, 3406}, {5, 8}}, + {"\U00000904\U00000915", {2308, 2325}, {3, 6}}, + {"\U00000904\U00000308\U00000915", {2308, 2325}, {5, 8}}, + {"\U00000904\U0000231a", {2308, 8986}, {3, 6}}, + {"\U00000904\U00000308\U0000231a", {2308, 8986}, {5, 8}}, + {"\U00000904\U00000300", {2308}, {5}}, + {"\U00000904\U00000308\U00000300", {2308}, {7}}, + {"\U00000904\U0000093c", {2308}, {6}}, + {"\U00000904\U00000308\U0000093c", {2308}, {8}}, + {"\U00000904\U0000094d", {2308}, {6}}, + {"\U00000904\U00000308\U0000094d", {2308}, {8}}, + {"\U00000904\U0000200d", {2308}, {6}}, + {"\U00000904\U00000308\U0000200d", {2308}, {8}}, + {"\U00000904\U00000378", {2308, 888}, {3, 5}}, + {"\U00000904\U00000308\U00000378", {2308, 888}, {5, 7}}, + {"\U00000d4e\U00000020", {3406}, {4}}, + {"\U00000d4e\U00000308\U00000020", {3406, 32}, {5, 6}}, + {"\U00000d4e\U0000000d", {3406, 13}, {3, 4}}, + {"\U00000d4e\U00000308\U0000000d", {3406, 13}, {5, 6}}, + {"\U00000d4e\U0000000a", {3406, 10}, {3, 4}}, + {"\U00000d4e\U00000308\U0000000a", {3406, 10}, {5, 6}}, + {"\U00000d4e\U00000001", {3406, 1}, {3, 4}}, + {"\U00000d4e\U00000308\U00000001", {3406, 1}, {5, 6}}, + {"\U00000d4e\U0000034f", {3406}, {5}}, + {"\U00000d4e\U00000308\U0000034f", {3406}, {7}}, + {"\U00000d4e\U0001f1e6", {3406}, {7}}, + {"\U00000d4e\U00000308\U0001f1e6", {3406, 127462}, {5, 9}}, + {"\U00000d4e\U00000600", {3406}, {5}}, + {"\U00000d4e\U00000308\U00000600", {3406, 1536}, {5, 7}}, + {"\U00000d4e\U00000a03", {3406}, {6}}, + {"\U00000d4e\U00000308\U00000a03", {3406}, {8}}, + {"\U00000d4e\U00001100", {3406}, {6}}, + {"\U00000d4e\U00000308\U00001100", {3406, 4352}, {5, 8}}, + {"\U00000d4e\U00001160", {3406}, {6}}, + {"\U00000d4e\U00000308\U00001160", {3406, 4448}, {5, 8}}, + {"\U00000d4e\U000011a8", {3406}, {6}}, + {"\U00000d4e\U00000308\U000011a8", {3406, 4520}, {5, 8}}, + {"\U00000d4e\U0000ac00", {3406}, {6}}, + {"\U00000d4e\U00000308\U0000ac00", {3406, 44032}, {5, 8}}, + {"\U00000d4e\U0000ac01", {3406}, {6}}, + {"\U00000d4e\U00000308\U0000ac01", {3406, 44033}, {5, 8}}, + {"\U00000d4e\U00000900", {3406}, {6}}, + {"\U00000d4e\U00000308\U00000900", {3406}, {8}}, + {"\U00000d4e\U00000903", {3406}, {6}}, + {"\U00000d4e\U00000308\U00000903", {3406}, {8}}, + {"\U00000d4e\U00000904", {3406}, {6}}, + {"\U00000d4e\U00000308\U00000904", {3406, 2308}, {5, 8}}, + {"\U00000d4e\U00000d4e", {3406}, {6}}, + {"\U00000d4e\U00000308\U00000d4e", {3406, 3406}, {5, 8}}, + {"\U00000d4e\U00000915", {3406}, {6}}, + {"\U00000d4e\U00000308\U00000915", {3406, 2325}, {5, 8}}, + {"\U00000d4e\U0000231a", {3406}, {6}}, + {"\U00000d4e\U00000308\U0000231a", {3406, 8986}, {5, 8}}, + {"\U00000d4e\U00000300", {3406}, {5}}, + {"\U00000d4e\U00000308\U00000300", {3406}, {7}}, + {"\U00000d4e\U0000093c", {3406}, {6}}, + {"\U00000d4e\U00000308\U0000093c", {3406}, {8}}, + {"\U00000d4e\U0000094d", {3406}, {6}}, + {"\U00000d4e\U00000308\U0000094d", {3406}, {8}}, + {"\U00000d4e\U0000200d", {3406}, {6}}, + {"\U00000d4e\U00000308\U0000200d", {3406}, {8}}, + {"\U00000d4e\U00000378", {3406}, {5}}, + {"\U00000d4e\U00000308\U00000378", {3406, 888}, {5, 7}}, + {"\U00000915\U00000020", {2325, 32}, {3, 4}}, + {"\U00000915\U00000308\U00000020", {2325, 32}, {5, 6}}, + {"\U00000915\U0000000d", {2325, 13}, {3, 4}}, + {"\U00000915\U00000308\U0000000d", {2325, 13}, {5, 6}}, + {"\U00000915\U0000000a", {2325, 10}, {3, 4}}, + {"\U00000915\U00000308\U0000000a", {2325, 10}, {5, 6}}, + {"\U00000915\U00000001", {2325, 1}, {3, 4}}, + {"\U00000915\U00000308\U00000001", {2325, 1}, {5, 6}}, + {"\U00000915\U0000034f", {2325}, {5}}, + {"\U00000915\U00000308\U0000034f", {2325}, {7}}, + {"\U00000915\U0001f1e6", {2325, 127462}, {3, 7}}, + {"\U00000915\U00000308\U0001f1e6", {2325, 127462}, {5, 9}}, + {"\U00000915\U00000600", {2325, 1536}, {3, 5}}, + {"\U00000915\U00000308\U00000600", {2325, 1536}, {5, 7}}, + {"\U00000915\U00000a03", {2325}, {6}}, + {"\U00000915\U00000308\U00000a03", {2325}, {8}}, + {"\U00000915\U00001100", {2325, 4352}, {3, 6}}, + {"\U00000915\U00000308\U00001100", {2325, 4352}, {5, 8}}, + {"\U00000915\U00001160", {2325, 4448}, {3, 6}}, + {"\U00000915\U00000308\U00001160", {2325, 4448}, {5, 8}}, + {"\U00000915\U000011a8", {2325, 4520}, {3, 6}}, + {"\U00000915\U00000308\U000011a8", {2325, 4520}, {5, 8}}, + {"\U00000915\U0000ac00", {2325, 44032}, {3, 6}}, + {"\U00000915\U00000308\U0000ac00", {2325, 44032}, {5, 8}}, + {"\U00000915\U0000ac01", {2325, 44033}, {3, 6}}, + {"\U00000915\U00000308\U0000ac01", {2325, 44033}, {5, 8}}, + {"\U00000915\U00000900", {2325}, {6}}, + {"\U00000915\U00000308\U00000900", {2325}, {8}}, + {"\U00000915\U00000903", {2325}, {6}}, + {"\U00000915\U00000308\U00000903", {2325}, {8}}, + {"\U00000915\U00000904", {2325, 2308}, {3, 6}}, + {"\U00000915\U00000308\U00000904", {2325, 2308}, {5, 8}}, + {"\U00000915\U00000d4e", {2325, 3406}, {3, 6}}, + {"\U00000915\U00000308\U00000d4e", {2325, 3406}, {5, 8}}, + {"\U00000915\U00000915", {2325, 2325}, {3, 6}}, + {"\U00000915\U00000308\U00000915", {2325, 2325}, {5, 8}}, + {"\U00000915\U0000231a", {2325, 8986}, {3, 6}}, + {"\U00000915\U00000308\U0000231a", {2325, 8986}, {5, 8}}, + {"\U00000915\U00000300", {2325}, {5}}, + {"\U00000915\U00000308\U00000300", {2325}, {7}}, + {"\U00000915\U0000093c", {2325}, {6}}, + {"\U00000915\U00000308\U0000093c", {2325}, {8}}, + {"\U00000915\U0000094d", {2325}, {6}}, + {"\U00000915\U00000308\U0000094d", {2325}, {8}}, + {"\U00000915\U0000200d", {2325}, {6}}, + {"\U00000915\U00000308\U0000200d", {2325}, {8}}, + {"\U00000915\U00000378", {2325, 888}, {3, 5}}, + {"\U00000915\U00000308\U00000378", {2325, 888}, {5, 7}}, {"\U0000231a\U00000020", {8986, 32}, {3, 4}}, {"\U0000231a\U00000308\U00000020", {8986, 32}, {5, 6}}, {"\U0000231a\U0000000d", {8986, 13}, {3, 4}}, @@ -539,8 +961,8 @@ std::array, 602> data_utf8 = {{ {"\U0000231a\U00000308\U0001f1e6", {8986, 127462}, {5, 9}}, {"\U0000231a\U00000600", {8986, 1536}, {3, 5}}, {"\U0000231a\U00000308\U00000600", {8986, 1536}, {5, 7}}, - {"\U0000231a\U00000903", {8986}, {6}}, - {"\U0000231a\U00000308\U00000903", {8986}, {8}}, + {"\U0000231a\U00000a03", {8986}, {6}}, + {"\U0000231a\U00000308\U00000a03", {8986}, {8}}, {"\U0000231a\U00001100", {8986, 4352}, {3, 6}}, {"\U0000231a\U00000308\U00001100", {8986, 4352}, {5, 8}}, {"\U0000231a\U00001160", {8986, 4448}, {3, 6}}, @@ -551,10 +973,24 @@ std::array, 602> data_utf8 = {{ {"\U0000231a\U00000308\U0000ac00", {8986, 44032}, {5, 8}}, {"\U0000231a\U0000ac01", {8986, 44033}, {3, 6}}, {"\U0000231a\U00000308\U0000ac01", {8986, 44033}, {5, 8}}, + {"\U0000231a\U00000900", {8986}, {6}}, + {"\U0000231a\U00000308\U00000900", {8986}, {8}}, + {"\U0000231a\U00000903", {8986}, {6}}, + {"\U0000231a\U00000308\U00000903", {8986}, {8}}, + {"\U0000231a\U00000904", {8986, 2308}, {3, 6}}, + {"\U0000231a\U00000308\U00000904", {8986, 2308}, {5, 8}}, + {"\U0000231a\U00000d4e", {8986, 3406}, {3, 6}}, + {"\U0000231a\U00000308\U00000d4e", {8986, 3406}, {5, 8}}, + {"\U0000231a\U00000915", {8986, 2325}, {3, 6}}, + {"\U0000231a\U00000308\U00000915", {8986, 2325}, {5, 8}}, {"\U0000231a\U0000231a", {8986, 8986}, {3, 6}}, {"\U0000231a\U00000308\U0000231a", {8986, 8986}, {5, 8}}, {"\U0000231a\U00000300", {8986}, {5}}, {"\U0000231a\U00000308\U00000300", {8986}, {7}}, + {"\U0000231a\U0000093c", {8986}, {6}}, + {"\U0000231a\U00000308\U0000093c", {8986}, {8}}, + {"\U0000231a\U0000094d", {8986}, {6}}, + {"\U0000231a\U00000308\U0000094d", {8986}, {8}}, {"\U0000231a\U0000200d", {8986}, {6}}, {"\U0000231a\U00000308\U0000200d", {8986}, {8}}, {"\U0000231a\U00000378", {8986, 888}, {3, 5}}, @@ -573,8 +1009,8 @@ std::array, 602> data_utf8 = {{ {"\U00000300\U00000308\U0001f1e6", {768, 127462}, {4, 8}}, {"\U00000300\U00000600", {768, 1536}, {2, 4}}, {"\U00000300\U00000308\U00000600", {768, 1536}, {4, 6}}, - {"\U00000300\U00000903", {768}, {5}}, - {"\U00000300\U00000308\U00000903", {768}, {7}}, + {"\U00000300\U00000a03", {768}, {5}}, + {"\U00000300\U00000308\U00000a03", {768}, {7}}, {"\U00000300\U00001100", {768, 4352}, {2, 5}}, {"\U00000300\U00000308\U00001100", {768, 4352}, {4, 7}}, {"\U00000300\U00001160", {768, 4448}, {2, 5}}, @@ -585,14 +1021,124 @@ std::array, 602> data_utf8 = {{ {"\U00000300\U00000308\U0000ac00", {768, 44032}, {4, 7}}, {"\U00000300\U0000ac01", {768, 44033}, {2, 5}}, {"\U00000300\U00000308\U0000ac01", {768, 44033}, {4, 7}}, + {"\U00000300\U00000900", {768}, {5}}, + {"\U00000300\U00000308\U00000900", {768}, {7}}, + {"\U00000300\U00000903", {768}, {5}}, + {"\U00000300\U00000308\U00000903", {768}, {7}}, + {"\U00000300\U00000904", {768, 2308}, {2, 5}}, + {"\U00000300\U00000308\U00000904", {768, 2308}, {4, 7}}, + {"\U00000300\U00000d4e", {768, 3406}, {2, 5}}, + {"\U00000300\U00000308\U00000d4e", {768, 3406}, {4, 7}}, + {"\U00000300\U00000915", {768, 2325}, {2, 5}}, + {"\U00000300\U00000308\U00000915", {768, 2325}, {4, 7}}, {"\U00000300\U0000231a", {768, 8986}, {2, 5}}, {"\U00000300\U00000308\U0000231a", {768, 8986}, {4, 7}}, {"\U00000300\U00000300", {768}, {4}}, {"\U00000300\U00000308\U00000300", {768}, {6}}, + {"\U00000300\U0000093c", {768}, {5}}, + {"\U00000300\U00000308\U0000093c", {768}, {7}}, + {"\U00000300\U0000094d", {768}, {5}}, + {"\U00000300\U00000308\U0000094d", {768}, {7}}, {"\U00000300\U0000200d", {768}, {5}}, {"\U00000300\U00000308\U0000200d", {768}, {7}}, {"\U00000300\U00000378", {768, 888}, {2, 4}}, {"\U00000300\U00000308\U00000378", {768, 888}, {4, 6}}, + {"\U0000093c\U00000020", {2364, 32}, {3, 4}}, + {"\U0000093c\U00000308\U00000020", {2364, 32}, {5, 6}}, + {"\U0000093c\U0000000d", {2364, 13}, {3, 4}}, + {"\U0000093c\U00000308\U0000000d", {2364, 13}, {5, 6}}, + {"\U0000093c\U0000000a", {2364, 10}, {3, 4}}, + {"\U0000093c\U00000308\U0000000a", {2364, 10}, {5, 6}}, + {"\U0000093c\U00000001", {2364, 1}, {3, 4}}, + {"\U0000093c\U00000308\U00000001", {2364, 1}, {5, 6}}, + {"\U0000093c\U0000034f", {2364}, {5}}, + {"\U0000093c\U00000308\U0000034f", {2364}, {7}}, + {"\U0000093c\U0001f1e6", {2364, 127462}, {3, 7}}, + {"\U0000093c\U00000308\U0001f1e6", {2364, 127462}, {5, 9}}, + {"\U0000093c\U00000600", {2364, 1536}, {3, 5}}, + {"\U0000093c\U00000308\U00000600", {2364, 1536}, {5, 7}}, + {"\U0000093c\U00000a03", {2364}, {6}}, + {"\U0000093c\U00000308\U00000a03", {2364}, {8}}, + {"\U0000093c\U00001100", {2364, 4352}, {3, 6}}, + {"\U0000093c\U00000308\U00001100", {2364, 4352}, {5, 8}}, + {"\U0000093c\U00001160", {2364, 4448}, {3, 6}}, + {"\U0000093c\U00000308\U00001160", {2364, 4448}, {5, 8}}, + {"\U0000093c\U000011a8", {2364, 4520}, {3, 6}}, + {"\U0000093c\U00000308\U000011a8", {2364, 4520}, {5, 8}}, + {"\U0000093c\U0000ac00", {2364, 44032}, {3, 6}}, + {"\U0000093c\U00000308\U0000ac00", {2364, 44032}, {5, 8}}, + {"\U0000093c\U0000ac01", {2364, 44033}, {3, 6}}, + {"\U0000093c\U00000308\U0000ac01", {2364, 44033}, {5, 8}}, + {"\U0000093c\U00000900", {2364}, {6}}, + {"\U0000093c\U00000308\U00000900", {2364}, {8}}, + {"\U0000093c\U00000903", {2364}, {6}}, + {"\U0000093c\U00000308\U00000903", {2364}, {8}}, + {"\U0000093c\U00000904", {2364, 2308}, {3, 6}}, + {"\U0000093c\U00000308\U00000904", {2364, 2308}, {5, 8}}, + {"\U0000093c\U00000d4e", {2364, 3406}, {3, 6}}, + {"\U0000093c\U00000308\U00000d4e", {2364, 3406}, {5, 8}}, + {"\U0000093c\U00000915", {2364, 2325}, {3, 6}}, + {"\U0000093c\U00000308\U00000915", {2364, 2325}, {5, 8}}, + {"\U0000093c\U0000231a", {2364, 8986}, {3, 6}}, + {"\U0000093c\U00000308\U0000231a", {2364, 8986}, {5, 8}}, + {"\U0000093c\U00000300", {2364}, {5}}, + {"\U0000093c\U00000308\U00000300", {2364}, {7}}, + {"\U0000093c\U0000093c", {2364}, {6}}, + {"\U0000093c\U00000308\U0000093c", {2364}, {8}}, + {"\U0000093c\U0000094d", {2364}, {6}}, + {"\U0000093c\U00000308\U0000094d", {2364}, {8}}, + {"\U0000093c\U0000200d", {2364}, {6}}, + {"\U0000093c\U00000308\U0000200d", {2364}, {8}}, + {"\U0000093c\U00000378", {2364, 888}, {3, 5}}, + {"\U0000093c\U00000308\U00000378", {2364, 888}, {5, 7}}, + {"\U0000094d\U00000020", {2381, 32}, {3, 4}}, + {"\U0000094d\U00000308\U00000020", {2381, 32}, {5, 6}}, + {"\U0000094d\U0000000d", {2381, 13}, {3, 4}}, + {"\U0000094d\U00000308\U0000000d", {2381, 13}, {5, 6}}, + {"\U0000094d\U0000000a", {2381, 10}, {3, 4}}, + {"\U0000094d\U00000308\U0000000a", {2381, 10}, {5, 6}}, + {"\U0000094d\U00000001", {2381, 1}, {3, 4}}, + {"\U0000094d\U00000308\U00000001", {2381, 1}, {5, 6}}, + {"\U0000094d\U0000034f", {2381}, {5}}, + {"\U0000094d\U00000308\U0000034f", {2381}, {7}}, + {"\U0000094d\U0001f1e6", {2381, 127462}, {3, 7}}, + {"\U0000094d\U00000308\U0001f1e6", {2381, 127462}, {5, 9}}, + {"\U0000094d\U00000600", {2381, 1536}, {3, 5}}, + {"\U0000094d\U00000308\U00000600", {2381, 1536}, {5, 7}}, + {"\U0000094d\U00000a03", {2381}, {6}}, + {"\U0000094d\U00000308\U00000a03", {2381}, {8}}, + {"\U0000094d\U00001100", {2381, 4352}, {3, 6}}, + {"\U0000094d\U00000308\U00001100", {2381, 4352}, {5, 8}}, + {"\U0000094d\U00001160", {2381, 4448}, {3, 6}}, + {"\U0000094d\U00000308\U00001160", {2381, 4448}, {5, 8}}, + {"\U0000094d\U000011a8", {2381, 4520}, {3, 6}}, + {"\U0000094d\U00000308\U000011a8", {2381, 4520}, {5, 8}}, + {"\U0000094d\U0000ac00", {2381, 44032}, {3, 6}}, + {"\U0000094d\U00000308\U0000ac00", {2381, 44032}, {5, 8}}, + {"\U0000094d\U0000ac01", {2381, 44033}, {3, 6}}, + {"\U0000094d\U00000308\U0000ac01", {2381, 44033}, {5, 8}}, + {"\U0000094d\U00000900", {2381}, {6}}, + {"\U0000094d\U00000308\U00000900", {2381}, {8}}, + {"\U0000094d\U00000903", {2381}, {6}}, + {"\U0000094d\U00000308\U00000903", {2381}, {8}}, + {"\U0000094d\U00000904", {2381, 2308}, {3, 6}}, + {"\U0000094d\U00000308\U00000904", {2381, 2308}, {5, 8}}, + {"\U0000094d\U00000d4e", {2381, 3406}, {3, 6}}, + {"\U0000094d\U00000308\U00000d4e", {2381, 3406}, {5, 8}}, + {"\U0000094d\U00000915", {2381, 2325}, {3, 6}}, + {"\U0000094d\U00000308\U00000915", {2381, 2325}, {5, 8}}, + {"\U0000094d\U0000231a", {2381, 8986}, {3, 6}}, + {"\U0000094d\U00000308\U0000231a", {2381, 8986}, {5, 8}}, + {"\U0000094d\U00000300", {2381}, {5}}, + {"\U0000094d\U00000308\U00000300", {2381}, {7}}, + {"\U0000094d\U0000093c", {2381}, {6}}, + {"\U0000094d\U00000308\U0000093c", {2381}, {8}}, + {"\U0000094d\U0000094d", {2381}, {6}}, + {"\U0000094d\U00000308\U0000094d", {2381}, {8}}, + {"\U0000094d\U0000200d", {2381}, {6}}, + {"\U0000094d\U00000308\U0000200d", {2381}, {8}}, + {"\U0000094d\U00000378", {2381, 888}, {3, 5}}, + {"\U0000094d\U00000308\U00000378", {2381, 888}, {5, 7}}, {"\U0000200d\U00000020", {8205, 32}, {3, 4}}, {"\U0000200d\U00000308\U00000020", {8205, 32}, {5, 6}}, {"\U0000200d\U0000000d", {8205, 13}, {3, 4}}, @@ -607,8 +1153,8 @@ std::array, 602> data_utf8 = {{ {"\U0000200d\U00000308\U0001f1e6", {8205, 127462}, {5, 9}}, {"\U0000200d\U00000600", {8205, 1536}, {3, 5}}, {"\U0000200d\U00000308\U00000600", {8205, 1536}, {5, 7}}, - {"\U0000200d\U00000903", {8205}, {6}}, - {"\U0000200d\U00000308\U00000903", {8205}, {8}}, + {"\U0000200d\U00000a03", {8205}, {6}}, + {"\U0000200d\U00000308\U00000a03", {8205}, {8}}, {"\U0000200d\U00001100", {8205, 4352}, {3, 6}}, {"\U0000200d\U00000308\U00001100", {8205, 4352}, {5, 8}}, {"\U0000200d\U00001160", {8205, 4448}, {3, 6}}, @@ -619,10 +1165,24 @@ std::array, 602> data_utf8 = {{ {"\U0000200d\U00000308\U0000ac00", {8205, 44032}, {5, 8}}, {"\U0000200d\U0000ac01", {8205, 44033}, {3, 6}}, {"\U0000200d\U00000308\U0000ac01", {8205, 44033}, {5, 8}}, + {"\U0000200d\U00000900", {8205}, {6}}, + {"\U0000200d\U00000308\U00000900", {8205}, {8}}, + {"\U0000200d\U00000903", {8205}, {6}}, + {"\U0000200d\U00000308\U00000903", {8205}, {8}}, + {"\U0000200d\U00000904", {8205, 2308}, {3, 6}}, + {"\U0000200d\U00000308\U00000904", {8205, 2308}, {5, 8}}, + {"\U0000200d\U00000d4e", {8205, 3406}, {3, 6}}, + {"\U0000200d\U00000308\U00000d4e", {8205, 3406}, {5, 8}}, + {"\U0000200d\U00000915", {8205, 2325}, {3, 6}}, + {"\U0000200d\U00000308\U00000915", {8205, 2325}, {5, 8}}, {"\U0000200d\U0000231a", {8205, 8986}, {3, 6}}, {"\U0000200d\U00000308\U0000231a", {8205, 8986}, {5, 8}}, {"\U0000200d\U00000300", {8205}, {5}}, {"\U0000200d\U00000308\U00000300", {8205}, {7}}, + {"\U0000200d\U0000093c", {8205}, {6}}, + {"\U0000200d\U00000308\U0000093c", {8205}, {8}}, + {"\U0000200d\U0000094d", {8205}, {6}}, + {"\U0000200d\U00000308\U0000094d", {8205}, {8}}, {"\U0000200d\U0000200d", {8205}, {6}}, {"\U0000200d\U00000308\U0000200d", {8205}, {8}}, {"\U0000200d\U00000378", {8205, 888}, {3, 5}}, @@ -641,8 +1201,8 @@ std::array, 602> data_utf8 = {{ {"\U00000378\U00000308\U0001f1e6", {888, 127462}, {4, 8}}, {"\U00000378\U00000600", {888, 1536}, {2, 4}}, {"\U00000378\U00000308\U00000600", {888, 1536}, {4, 6}}, - {"\U00000378\U00000903", {888}, {5}}, - {"\U00000378\U00000308\U00000903", {888}, {7}}, + {"\U00000378\U00000a03", {888}, {5}}, + {"\U00000378\U00000308\U00000a03", {888}, {7}}, {"\U00000378\U00001100", {888, 4352}, {2, 5}}, {"\U00000378\U00000308\U00001100", {888, 4352}, {4, 7}}, {"\U00000378\U00001160", {888, 4448}, {2, 5}}, @@ -653,10 +1213,24 @@ std::array, 602> data_utf8 = {{ {"\U00000378\U00000308\U0000ac00", {888, 44032}, {4, 7}}, {"\U00000378\U0000ac01", {888, 44033}, {2, 5}}, {"\U00000378\U00000308\U0000ac01", {888, 44033}, {4, 7}}, + {"\U00000378\U00000900", {888}, {5}}, + {"\U00000378\U00000308\U00000900", {888}, {7}}, + {"\U00000378\U00000903", {888}, {5}}, + {"\U00000378\U00000308\U00000903", {888}, {7}}, + {"\U00000378\U00000904", {888, 2308}, {2, 5}}, + {"\U00000378\U00000308\U00000904", {888, 2308}, {4, 7}}, + {"\U00000378\U00000d4e", {888, 3406}, {2, 5}}, + {"\U00000378\U00000308\U00000d4e", {888, 3406}, {4, 7}}, + {"\U00000378\U00000915", {888, 2325}, {2, 5}}, + {"\U00000378\U00000308\U00000915", {888, 2325}, {4, 7}}, {"\U00000378\U0000231a", {888, 8986}, {2, 5}}, {"\U00000378\U00000308\U0000231a", {888, 8986}, {4, 7}}, {"\U00000378\U00000300", {888}, {4}}, {"\U00000378\U00000308\U00000300", {888}, {6}}, + {"\U00000378\U0000093c", {888}, {5}}, + {"\U00000378\U00000308\U0000093c", {888}, {7}}, + {"\U00000378\U0000094d", {888}, {5}}, + {"\U00000378\U00000308\U0000094d", {888}, {7}}, {"\U00000378\U0000200d", {888}, {5}}, {"\U00000378\U00000308\U0000200d", {888}, {7}}, {"\U00000378\U00000378", {888, 888}, {2, 4}}, @@ -684,7 +1258,18 @@ std::array, 602> data_utf8 = {{ {"\U0001f6d1\U0000200d\U0001f6d1", {128721}, {11}}, {"\U00000061\U0000200d\U0001f6d1", {97, 128721}, {4, 8}}, {"\U00002701\U0000200d\U00002701", {9985}, {9}}, - {"\U00000061\U0000200d\U00002701", {97, 9985}, {4, 7}}}}; + {"\U00000061\U0000200d\U00002701", {97, 9985}, {4, 7}}, + {"\U00000915\U00000924", {2325, 2340}, {3, 6}}, + {"\U00000915\U0000094d\U00000924", {2325}, {9}}, + {"\U00000915\U0000094d\U0000094d\U00000924", {2325}, {12}}, + {"\U00000915\U0000094d\U0000200d\U00000924", {2325}, {12}}, + {"\U00000915\U0000093c\U0000200d\U0000094d\U00000924", {2325}, {15}}, + {"\U00000915\U0000093c\U0000094d\U0000200d\U00000924", {2325}, {15}}, + {"\U00000915\U0000094d\U00000924\U0000094d\U0000092f", {2325}, {15}}, + {"\U00000915\U0000094d\U00000061", {2325, 97}, {6, 7}}, + {"\U00000061\U0000094d\U00000924", {97, 2340}, {4, 7}}, + {"\U0000003f\U0000094d\U00000924", {63, 2340}, {4, 7}}, + {"\U00000915\U0000094d\U0000094d\U00000924", {2325}, {12}}}}; /// The data for UTF-16. /// @@ -692,7 +1277,7 @@ std::array, 602> data_utf8 = {{ /// since the size of the code units differ the breaks can contain different /// values. #ifndef TEST_HAS_NO_WIDE_CHARACTERS -std::array, 602> data_utf16 = {{ +std::array, 1187> data_utf16 = {{ {L"\U00000020\U00000020", {32, 32}, {1, 2}}, {L"\U00000020\U00000308\U00000020", {32, 32}, {2, 3}}, {L"\U00000020\U0000000d", {32, 13}, {1, 2}}, @@ -707,8 +1292,8 @@ std::array, 602> data_utf16 = {{ {L"\U00000020\U00000308\U0001f1e6", {32, 127462}, {2, 4}}, {L"\U00000020\U00000600", {32, 1536}, {1, 2}}, {L"\U00000020\U00000308\U00000600", {32, 1536}, {2, 3}}, - {L"\U00000020\U00000903", {32}, {2}}, - {L"\U00000020\U00000308\U00000903", {32}, {3}}, + {L"\U00000020\U00000a03", {32}, {2}}, + {L"\U00000020\U00000308\U00000a03", {32}, {3}}, {L"\U00000020\U00001100", {32, 4352}, {1, 2}}, {L"\U00000020\U00000308\U00001100", {32, 4352}, {2, 3}}, {L"\U00000020\U00001160", {32, 4448}, {1, 2}}, @@ -719,10 +1304,24 @@ std::array, 602> data_utf16 = {{ {L"\U00000020\U00000308\U0000ac00", {32, 44032}, {2, 3}}, {L"\U00000020\U0000ac01", {32, 44033}, {1, 2}}, {L"\U00000020\U00000308\U0000ac01", {32, 44033}, {2, 3}}, + {L"\U00000020\U00000900", {32}, {2}}, + {L"\U00000020\U00000308\U00000900", {32}, {3}}, + {L"\U00000020\U00000903", {32}, {2}}, + {L"\U00000020\U00000308\U00000903", {32}, {3}}, + {L"\U00000020\U00000904", {32, 2308}, {1, 2}}, + {L"\U00000020\U00000308\U00000904", {32, 2308}, {2, 3}}, + {L"\U00000020\U00000d4e", {32, 3406}, {1, 2}}, + {L"\U00000020\U00000308\U00000d4e", {32, 3406}, {2, 3}}, + {L"\U00000020\U00000915", {32, 2325}, {1, 2}}, + {L"\U00000020\U00000308\U00000915", {32, 2325}, {2, 3}}, {L"\U00000020\U0000231a", {32, 8986}, {1, 2}}, {L"\U00000020\U00000308\U0000231a", {32, 8986}, {2, 3}}, {L"\U00000020\U00000300", {32}, {2}}, {L"\U00000020\U00000308\U00000300", {32}, {3}}, + {L"\U00000020\U0000093c", {32}, {2}}, + {L"\U00000020\U00000308\U0000093c", {32}, {3}}, + {L"\U00000020\U0000094d", {32}, {2}}, + {L"\U00000020\U00000308\U0000094d", {32}, {3}}, {L"\U00000020\U0000200d", {32}, {2}}, {L"\U00000020\U00000308\U0000200d", {32}, {3}}, {L"\U00000020\U00000378", {32, 888}, {1, 2}}, @@ -741,8 +1340,8 @@ std::array, 602> data_utf16 = {{ {L"\U0000000d\U00000308\U0001f1e6", {13, 776, 127462}, {1, 2, 4}}, {L"\U0000000d\U00000600", {13, 1536}, {1, 2}}, {L"\U0000000d\U00000308\U00000600", {13, 776, 1536}, {1, 2, 3}}, - {L"\U0000000d\U00000903", {13, 2307}, {1, 2}}, - {L"\U0000000d\U00000308\U00000903", {13, 776}, {1, 3}}, + {L"\U0000000d\U00000a03", {13, 2563}, {1, 2}}, + {L"\U0000000d\U00000308\U00000a03", {13, 776}, {1, 3}}, {L"\U0000000d\U00001100", {13, 4352}, {1, 2}}, {L"\U0000000d\U00000308\U00001100", {13, 776, 4352}, {1, 2, 3}}, {L"\U0000000d\U00001160", {13, 4448}, {1, 2}}, @@ -753,10 +1352,24 @@ std::array, 602> data_utf16 = {{ {L"\U0000000d\U00000308\U0000ac00", {13, 776, 44032}, {1, 2, 3}}, {L"\U0000000d\U0000ac01", {13, 44033}, {1, 2}}, {L"\U0000000d\U00000308\U0000ac01", {13, 776, 44033}, {1, 2, 3}}, + {L"\U0000000d\U00000900", {13, 2304}, {1, 2}}, + {L"\U0000000d\U00000308\U00000900", {13, 776}, {1, 3}}, + {L"\U0000000d\U00000903", {13, 2307}, {1, 2}}, + {L"\U0000000d\U00000308\U00000903", {13, 776}, {1, 3}}, + {L"\U0000000d\U00000904", {13, 2308}, {1, 2}}, + {L"\U0000000d\U00000308\U00000904", {13, 776, 2308}, {1, 2, 3}}, + {L"\U0000000d\U00000d4e", {13, 3406}, {1, 2}}, + {L"\U0000000d\U00000308\U00000d4e", {13, 776, 3406}, {1, 2, 3}}, + {L"\U0000000d\U00000915", {13, 2325}, {1, 2}}, + {L"\U0000000d\U00000308\U00000915", {13, 776, 2325}, {1, 2, 3}}, {L"\U0000000d\U0000231a", {13, 8986}, {1, 2}}, {L"\U0000000d\U00000308\U0000231a", {13, 776, 8986}, {1, 2, 3}}, {L"\U0000000d\U00000300", {13, 768}, {1, 2}}, {L"\U0000000d\U00000308\U00000300", {13, 776}, {1, 3}}, + {L"\U0000000d\U0000093c", {13, 2364}, {1, 2}}, + {L"\U0000000d\U00000308\U0000093c", {13, 776}, {1, 3}}, + {L"\U0000000d\U0000094d", {13, 2381}, {1, 2}}, + {L"\U0000000d\U00000308\U0000094d", {13, 776}, {1, 3}}, {L"\U0000000d\U0000200d", {13, 8205}, {1, 2}}, {L"\U0000000d\U00000308\U0000200d", {13, 776}, {1, 3}}, {L"\U0000000d\U00000378", {13, 888}, {1, 2}}, @@ -775,8 +1388,8 @@ std::array, 602> data_utf16 = {{ {L"\U0000000a\U00000308\U0001f1e6", {10, 776, 127462}, {1, 2, 4}}, {L"\U0000000a\U00000600", {10, 1536}, {1, 2}}, {L"\U0000000a\U00000308\U00000600", {10, 776, 1536}, {1, 2, 3}}, - {L"\U0000000a\U00000903", {10, 2307}, {1, 2}}, - {L"\U0000000a\U00000308\U00000903", {10, 776}, {1, 3}}, + {L"\U0000000a\U00000a03", {10, 2563}, {1, 2}}, + {L"\U0000000a\U00000308\U00000a03", {10, 776}, {1, 3}}, {L"\U0000000a\U00001100", {10, 4352}, {1, 2}}, {L"\U0000000a\U00000308\U00001100", {10, 776, 4352}, {1, 2, 3}}, {L"\U0000000a\U00001160", {10, 4448}, {1, 2}}, @@ -787,10 +1400,24 @@ std::array, 602> data_utf16 = {{ {L"\U0000000a\U00000308\U0000ac00", {10, 776, 44032}, {1, 2, 3}}, {L"\U0000000a\U0000ac01", {10, 44033}, {1, 2}}, {L"\U0000000a\U00000308\U0000ac01", {10, 776, 44033}, {1, 2, 3}}, + {L"\U0000000a\U00000900", {10, 2304}, {1, 2}}, + {L"\U0000000a\U00000308\U00000900", {10, 776}, {1, 3}}, + {L"\U0000000a\U00000903", {10, 2307}, {1, 2}}, + {L"\U0000000a\U00000308\U00000903", {10, 776}, {1, 3}}, + {L"\U0000000a\U00000904", {10, 2308}, {1, 2}}, + {L"\U0000000a\U00000308\U00000904", {10, 776, 2308}, {1, 2, 3}}, + {L"\U0000000a\U00000d4e", {10, 3406}, {1, 2}}, + {L"\U0000000a\U00000308\U00000d4e", {10, 776, 3406}, {1, 2, 3}}, + {L"\U0000000a\U00000915", {10, 2325}, {1, 2}}, + {L"\U0000000a\U00000308\U00000915", {10, 776, 2325}, {1, 2, 3}}, {L"\U0000000a\U0000231a", {10, 8986}, {1, 2}}, {L"\U0000000a\U00000308\U0000231a", {10, 776, 8986}, {1, 2, 3}}, {L"\U0000000a\U00000300", {10, 768}, {1, 2}}, {L"\U0000000a\U00000308\U00000300", {10, 776}, {1, 3}}, + {L"\U0000000a\U0000093c", {10, 2364}, {1, 2}}, + {L"\U0000000a\U00000308\U0000093c", {10, 776}, {1, 3}}, + {L"\U0000000a\U0000094d", {10, 2381}, {1, 2}}, + {L"\U0000000a\U00000308\U0000094d", {10, 776}, {1, 3}}, {L"\U0000000a\U0000200d", {10, 8205}, {1, 2}}, {L"\U0000000a\U00000308\U0000200d", {10, 776}, {1, 3}}, {L"\U0000000a\U00000378", {10, 888}, {1, 2}}, @@ -809,8 +1436,8 @@ std::array, 602> data_utf16 = {{ {L"\U00000001\U00000308\U0001f1e6", {1, 776, 127462}, {1, 2, 4}}, {L"\U00000001\U00000600", {1, 1536}, {1, 2}}, {L"\U00000001\U00000308\U00000600", {1, 776, 1536}, {1, 2, 3}}, - {L"\U00000001\U00000903", {1, 2307}, {1, 2}}, - {L"\U00000001\U00000308\U00000903", {1, 776}, {1, 3}}, + {L"\U00000001\U00000a03", {1, 2563}, {1, 2}}, + {L"\U00000001\U00000308\U00000a03", {1, 776}, {1, 3}}, {L"\U00000001\U00001100", {1, 4352}, {1, 2}}, {L"\U00000001\U00000308\U00001100", {1, 776, 4352}, {1, 2, 3}}, {L"\U00000001\U00001160", {1, 4448}, {1, 2}}, @@ -821,10 +1448,24 @@ std::array, 602> data_utf16 = {{ {L"\U00000001\U00000308\U0000ac00", {1, 776, 44032}, {1, 2, 3}}, {L"\U00000001\U0000ac01", {1, 44033}, {1, 2}}, {L"\U00000001\U00000308\U0000ac01", {1, 776, 44033}, {1, 2, 3}}, + {L"\U00000001\U00000900", {1, 2304}, {1, 2}}, + {L"\U00000001\U00000308\U00000900", {1, 776}, {1, 3}}, + {L"\U00000001\U00000903", {1, 2307}, {1, 2}}, + {L"\U00000001\U00000308\U00000903", {1, 776}, {1, 3}}, + {L"\U00000001\U00000904", {1, 2308}, {1, 2}}, + {L"\U00000001\U00000308\U00000904", {1, 776, 2308}, {1, 2, 3}}, + {L"\U00000001\U00000d4e", {1, 3406}, {1, 2}}, + {L"\U00000001\U00000308\U00000d4e", {1, 776, 3406}, {1, 2, 3}}, + {L"\U00000001\U00000915", {1, 2325}, {1, 2}}, + {L"\U00000001\U00000308\U00000915", {1, 776, 2325}, {1, 2, 3}}, {L"\U00000001\U0000231a", {1, 8986}, {1, 2}}, {L"\U00000001\U00000308\U0000231a", {1, 776, 8986}, {1, 2, 3}}, {L"\U00000001\U00000300", {1, 768}, {1, 2}}, {L"\U00000001\U00000308\U00000300", {1, 776}, {1, 3}}, + {L"\U00000001\U0000093c", {1, 2364}, {1, 2}}, + {L"\U00000001\U00000308\U0000093c", {1, 776}, {1, 3}}, + {L"\U00000001\U0000094d", {1, 2381}, {1, 2}}, + {L"\U00000001\U00000308\U0000094d", {1, 776}, {1, 3}}, {L"\U00000001\U0000200d", {1, 8205}, {1, 2}}, {L"\U00000001\U00000308\U0000200d", {1, 776}, {1, 3}}, {L"\U00000001\U00000378", {1, 888}, {1, 2}}, @@ -843,8 +1484,8 @@ std::array, 602> data_utf16 = {{ {L"\U0000034f\U00000308\U0001f1e6", {847, 127462}, {2, 4}}, {L"\U0000034f\U00000600", {847, 1536}, {1, 2}}, {L"\U0000034f\U00000308\U00000600", {847, 1536}, {2, 3}}, - {L"\U0000034f\U00000903", {847}, {2}}, - {L"\U0000034f\U00000308\U00000903", {847}, {3}}, + {L"\U0000034f\U00000a03", {847}, {2}}, + {L"\U0000034f\U00000308\U00000a03", {847}, {3}}, {L"\U0000034f\U00001100", {847, 4352}, {1, 2}}, {L"\U0000034f\U00000308\U00001100", {847, 4352}, {2, 3}}, {L"\U0000034f\U00001160", {847, 4448}, {1, 2}}, @@ -855,10 +1496,24 @@ std::array, 602> data_utf16 = {{ {L"\U0000034f\U00000308\U0000ac00", {847, 44032}, {2, 3}}, {L"\U0000034f\U0000ac01", {847, 44033}, {1, 2}}, {L"\U0000034f\U00000308\U0000ac01", {847, 44033}, {2, 3}}, + {L"\U0000034f\U00000900", {847}, {2}}, + {L"\U0000034f\U00000308\U00000900", {847}, {3}}, + {L"\U0000034f\U00000903", {847}, {2}}, + {L"\U0000034f\U00000308\U00000903", {847}, {3}}, + {L"\U0000034f\U00000904", {847, 2308}, {1, 2}}, + {L"\U0000034f\U00000308\U00000904", {847, 2308}, {2, 3}}, + {L"\U0000034f\U00000d4e", {847, 3406}, {1, 2}}, + {L"\U0000034f\U00000308\U00000d4e", {847, 3406}, {2, 3}}, + {L"\U0000034f\U00000915", {847, 2325}, {1, 2}}, + {L"\U0000034f\U00000308\U00000915", {847, 2325}, {2, 3}}, {L"\U0000034f\U0000231a", {847, 8986}, {1, 2}}, {L"\U0000034f\U00000308\U0000231a", {847, 8986}, {2, 3}}, {L"\U0000034f\U00000300", {847}, {2}}, {L"\U0000034f\U00000308\U00000300", {847}, {3}}, + {L"\U0000034f\U0000093c", {847}, {2}}, + {L"\U0000034f\U00000308\U0000093c", {847}, {3}}, + {L"\U0000034f\U0000094d", {847}, {2}}, + {L"\U0000034f\U00000308\U0000094d", {847}, {3}}, {L"\U0000034f\U0000200d", {847}, {2}}, {L"\U0000034f\U00000308\U0000200d", {847}, {3}}, {L"\U0000034f\U00000378", {847, 888}, {1, 2}}, @@ -877,8 +1532,8 @@ std::array, 602> data_utf16 = {{ {L"\U0001f1e6\U00000308\U0001f1e6", {127462, 127462}, {3, 5}}, {L"\U0001f1e6\U00000600", {127462, 1536}, {2, 3}}, {L"\U0001f1e6\U00000308\U00000600", {127462, 1536}, {3, 4}}, - {L"\U0001f1e6\U00000903", {127462}, {3}}, - {L"\U0001f1e6\U00000308\U00000903", {127462}, {4}}, + {L"\U0001f1e6\U00000a03", {127462}, {3}}, + {L"\U0001f1e6\U00000308\U00000a03", {127462}, {4}}, {L"\U0001f1e6\U00001100", {127462, 4352}, {2, 3}}, {L"\U0001f1e6\U00000308\U00001100", {127462, 4352}, {3, 4}}, {L"\U0001f1e6\U00001160", {127462, 4448}, {2, 3}}, @@ -889,10 +1544,24 @@ std::array, 602> data_utf16 = {{ {L"\U0001f1e6\U00000308\U0000ac00", {127462, 44032}, {3, 4}}, {L"\U0001f1e6\U0000ac01", {127462, 44033}, {2, 3}}, {L"\U0001f1e6\U00000308\U0000ac01", {127462, 44033}, {3, 4}}, + {L"\U0001f1e6\U00000900", {127462}, {3}}, + {L"\U0001f1e6\U00000308\U00000900", {127462}, {4}}, + {L"\U0001f1e6\U00000903", {127462}, {3}}, + {L"\U0001f1e6\U00000308\U00000903", {127462}, {4}}, + {L"\U0001f1e6\U00000904", {127462, 2308}, {2, 3}}, + {L"\U0001f1e6\U00000308\U00000904", {127462, 2308}, {3, 4}}, + {L"\U0001f1e6\U00000d4e", {127462, 3406}, {2, 3}}, + {L"\U0001f1e6\U00000308\U00000d4e", {127462, 3406}, {3, 4}}, + {L"\U0001f1e6\U00000915", {127462, 2325}, {2, 3}}, + {L"\U0001f1e6\U00000308\U00000915", {127462, 2325}, {3, 4}}, {L"\U0001f1e6\U0000231a", {127462, 8986}, {2, 3}}, {L"\U0001f1e6\U00000308\U0000231a", {127462, 8986}, {3, 4}}, {L"\U0001f1e6\U00000300", {127462}, {3}}, {L"\U0001f1e6\U00000308\U00000300", {127462}, {4}}, + {L"\U0001f1e6\U0000093c", {127462}, {3}}, + {L"\U0001f1e6\U00000308\U0000093c", {127462}, {4}}, + {L"\U0001f1e6\U0000094d", {127462}, {3}}, + {L"\U0001f1e6\U00000308\U0000094d", {127462}, {4}}, {L"\U0001f1e6\U0000200d", {127462}, {3}}, {L"\U0001f1e6\U00000308\U0000200d", {127462}, {4}}, {L"\U0001f1e6\U00000378", {127462, 888}, {2, 3}}, @@ -911,8 +1580,8 @@ std::array, 602> data_utf16 = {{ {L"\U00000600\U00000308\U0001f1e6", {1536, 127462}, {2, 4}}, {L"\U00000600\U00000600", {1536}, {2}}, {L"\U00000600\U00000308\U00000600", {1536, 1536}, {2, 3}}, - {L"\U00000600\U00000903", {1536}, {2}}, - {L"\U00000600\U00000308\U00000903", {1536}, {3}}, + {L"\U00000600\U00000a03", {1536}, {2}}, + {L"\U00000600\U00000308\U00000a03", {1536}, {3}}, {L"\U00000600\U00001100", {1536}, {2}}, {L"\U00000600\U00000308\U00001100", {1536, 4352}, {2, 3}}, {L"\U00000600\U00001160", {1536}, {2}}, @@ -923,48 +1592,76 @@ std::array, 602> data_utf16 = {{ {L"\U00000600\U00000308\U0000ac00", {1536, 44032}, {2, 3}}, {L"\U00000600\U0000ac01", {1536}, {2}}, {L"\U00000600\U00000308\U0000ac01", {1536, 44033}, {2, 3}}, + {L"\U00000600\U00000900", {1536}, {2}}, + {L"\U00000600\U00000308\U00000900", {1536}, {3}}, + {L"\U00000600\U00000903", {1536}, {2}}, + {L"\U00000600\U00000308\U00000903", {1536}, {3}}, + {L"\U00000600\U00000904", {1536}, {2}}, + {L"\U00000600\U00000308\U00000904", {1536, 2308}, {2, 3}}, + {L"\U00000600\U00000d4e", {1536}, {2}}, + {L"\U00000600\U00000308\U00000d4e", {1536, 3406}, {2, 3}}, + {L"\U00000600\U00000915", {1536}, {2}}, + {L"\U00000600\U00000308\U00000915", {1536, 2325}, {2, 3}}, {L"\U00000600\U0000231a", {1536}, {2}}, {L"\U00000600\U00000308\U0000231a", {1536, 8986}, {2, 3}}, {L"\U00000600\U00000300", {1536}, {2}}, {L"\U00000600\U00000308\U00000300", {1536}, {3}}, + {L"\U00000600\U0000093c", {1536}, {2}}, + {L"\U00000600\U00000308\U0000093c", {1536}, {3}}, + {L"\U00000600\U0000094d", {1536}, {2}}, + {L"\U00000600\U00000308\U0000094d", {1536}, {3}}, {L"\U00000600\U0000200d", {1536}, {2}}, {L"\U00000600\U00000308\U0000200d", {1536}, {3}}, {L"\U00000600\U00000378", {1536}, {2}}, {L"\U00000600\U00000308\U00000378", {1536, 888}, {2, 3}}, - {L"\U00000903\U00000020", {2307, 32}, {1, 2}}, - {L"\U00000903\U00000308\U00000020", {2307, 32}, {2, 3}}, - {L"\U00000903\U0000000d", {2307, 13}, {1, 2}}, - {L"\U00000903\U00000308\U0000000d", {2307, 13}, {2, 3}}, - {L"\U00000903\U0000000a", {2307, 10}, {1, 2}}, - {L"\U00000903\U00000308\U0000000a", {2307, 10}, {2, 3}}, - {L"\U00000903\U00000001", {2307, 1}, {1, 2}}, - {L"\U00000903\U00000308\U00000001", {2307, 1}, {2, 3}}, - {L"\U00000903\U0000034f", {2307}, {2}}, - {L"\U00000903\U00000308\U0000034f", {2307}, {3}}, - {L"\U00000903\U0001f1e6", {2307, 127462}, {1, 3}}, - {L"\U00000903\U00000308\U0001f1e6", {2307, 127462}, {2, 4}}, - {L"\U00000903\U00000600", {2307, 1536}, {1, 2}}, - {L"\U00000903\U00000308\U00000600", {2307, 1536}, {2, 3}}, - {L"\U00000903\U00000903", {2307}, {2}}, - {L"\U00000903\U00000308\U00000903", {2307}, {3}}, - {L"\U00000903\U00001100", {2307, 4352}, {1, 2}}, - {L"\U00000903\U00000308\U00001100", {2307, 4352}, {2, 3}}, - {L"\U00000903\U00001160", {2307, 4448}, {1, 2}}, - {L"\U00000903\U00000308\U00001160", {2307, 4448}, {2, 3}}, - {L"\U00000903\U000011a8", {2307, 4520}, {1, 2}}, - {L"\U00000903\U00000308\U000011a8", {2307, 4520}, {2, 3}}, - {L"\U00000903\U0000ac00", {2307, 44032}, {1, 2}}, - {L"\U00000903\U00000308\U0000ac00", {2307, 44032}, {2, 3}}, - {L"\U00000903\U0000ac01", {2307, 44033}, {1, 2}}, - {L"\U00000903\U00000308\U0000ac01", {2307, 44033}, {2, 3}}, - {L"\U00000903\U0000231a", {2307, 8986}, {1, 2}}, - {L"\U00000903\U00000308\U0000231a", {2307, 8986}, {2, 3}}, - {L"\U00000903\U00000300", {2307}, {2}}, - {L"\U00000903\U00000308\U00000300", {2307}, {3}}, - {L"\U00000903\U0000200d", {2307}, {2}}, - {L"\U00000903\U00000308\U0000200d", {2307}, {3}}, - {L"\U00000903\U00000378", {2307, 888}, {1, 2}}, - {L"\U00000903\U00000308\U00000378", {2307, 888}, {2, 3}}, + {L"\U00000a03\U00000020", {2563, 32}, {1, 2}}, + {L"\U00000a03\U00000308\U00000020", {2563, 32}, {2, 3}}, + {L"\U00000a03\U0000000d", {2563, 13}, {1, 2}}, + {L"\U00000a03\U00000308\U0000000d", {2563, 13}, {2, 3}}, + {L"\U00000a03\U0000000a", {2563, 10}, {1, 2}}, + {L"\U00000a03\U00000308\U0000000a", {2563, 10}, {2, 3}}, + {L"\U00000a03\U00000001", {2563, 1}, {1, 2}}, + {L"\U00000a03\U00000308\U00000001", {2563, 1}, {2, 3}}, + {L"\U00000a03\U0000034f", {2563}, {2}}, + {L"\U00000a03\U00000308\U0000034f", {2563}, {3}}, + {L"\U00000a03\U0001f1e6", {2563, 127462}, {1, 3}}, + {L"\U00000a03\U00000308\U0001f1e6", {2563, 127462}, {2, 4}}, + {L"\U00000a03\U00000600", {2563, 1536}, {1, 2}}, + {L"\U00000a03\U00000308\U00000600", {2563, 1536}, {2, 3}}, + {L"\U00000a03\U00000a03", {2563}, {2}}, + {L"\U00000a03\U00000308\U00000a03", {2563}, {3}}, + {L"\U00000a03\U00001100", {2563, 4352}, {1, 2}}, + {L"\U00000a03\U00000308\U00001100", {2563, 4352}, {2, 3}}, + {L"\U00000a03\U00001160", {2563, 4448}, {1, 2}}, + {L"\U00000a03\U00000308\U00001160", {2563, 4448}, {2, 3}}, + {L"\U00000a03\U000011a8", {2563, 4520}, {1, 2}}, + {L"\U00000a03\U00000308\U000011a8", {2563, 4520}, {2, 3}}, + {L"\U00000a03\U0000ac00", {2563, 44032}, {1, 2}}, + {L"\U00000a03\U00000308\U0000ac00", {2563, 44032}, {2, 3}}, + {L"\U00000a03\U0000ac01", {2563, 44033}, {1, 2}}, + {L"\U00000a03\U00000308\U0000ac01", {2563, 44033}, {2, 3}}, + {L"\U00000a03\U00000900", {2563}, {2}}, + {L"\U00000a03\U00000308\U00000900", {2563}, {3}}, + {L"\U00000a03\U00000903", {2563}, {2}}, + {L"\U00000a03\U00000308\U00000903", {2563}, {3}}, + {L"\U00000a03\U00000904", {2563, 2308}, {1, 2}}, + {L"\U00000a03\U00000308\U00000904", {2563, 2308}, {2, 3}}, + {L"\U00000a03\U00000d4e", {2563, 3406}, {1, 2}}, + {L"\U00000a03\U00000308\U00000d4e", {2563, 3406}, {2, 3}}, + {L"\U00000a03\U00000915", {2563, 2325}, {1, 2}}, + {L"\U00000a03\U00000308\U00000915", {2563, 2325}, {2, 3}}, + {L"\U00000a03\U0000231a", {2563, 8986}, {1, 2}}, + {L"\U00000a03\U00000308\U0000231a", {2563, 8986}, {2, 3}}, + {L"\U00000a03\U00000300", {2563}, {2}}, + {L"\U00000a03\U00000308\U00000300", {2563}, {3}}, + {L"\U00000a03\U0000093c", {2563}, {2}}, + {L"\U00000a03\U00000308\U0000093c", {2563}, {3}}, + {L"\U00000a03\U0000094d", {2563}, {2}}, + {L"\U00000a03\U00000308\U0000094d", {2563}, {3}}, + {L"\U00000a03\U0000200d", {2563}, {2}}, + {L"\U00000a03\U00000308\U0000200d", {2563}, {3}}, + {L"\U00000a03\U00000378", {2563, 888}, {1, 2}}, + {L"\U00000a03\U00000308\U00000378", {2563, 888}, {2, 3}}, {L"\U00001100\U00000020", {4352, 32}, {1, 2}}, {L"\U00001100\U00000308\U00000020", {4352, 32}, {2, 3}}, {L"\U00001100\U0000000d", {4352, 13}, {1, 2}}, @@ -979,8 +1676,8 @@ std::array, 602> data_utf16 = {{ {L"\U00001100\U00000308\U0001f1e6", {4352, 127462}, {2, 4}}, {L"\U00001100\U00000600", {4352, 1536}, {1, 2}}, {L"\U00001100\U00000308\U00000600", {4352, 1536}, {2, 3}}, - {L"\U00001100\U00000903", {4352}, {2}}, - {L"\U00001100\U00000308\U00000903", {4352}, {3}}, + {L"\U00001100\U00000a03", {4352}, {2}}, + {L"\U00001100\U00000308\U00000a03", {4352}, {3}}, {L"\U00001100\U00001100", {4352}, {2}}, {L"\U00001100\U00000308\U00001100", {4352, 4352}, {2, 3}}, {L"\U00001100\U00001160", {4352}, {2}}, @@ -991,10 +1688,24 @@ std::array, 602> data_utf16 = {{ {L"\U00001100\U00000308\U0000ac00", {4352, 44032}, {2, 3}}, {L"\U00001100\U0000ac01", {4352}, {2}}, {L"\U00001100\U00000308\U0000ac01", {4352, 44033}, {2, 3}}, + {L"\U00001100\U00000900", {4352}, {2}}, + {L"\U00001100\U00000308\U00000900", {4352}, {3}}, + {L"\U00001100\U00000903", {4352}, {2}}, + {L"\U00001100\U00000308\U00000903", {4352}, {3}}, + {L"\U00001100\U00000904", {4352, 2308}, {1, 2}}, + {L"\U00001100\U00000308\U00000904", {4352, 2308}, {2, 3}}, + {L"\U00001100\U00000d4e", {4352, 3406}, {1, 2}}, + {L"\U00001100\U00000308\U00000d4e", {4352, 3406}, {2, 3}}, + {L"\U00001100\U00000915", {4352, 2325}, {1, 2}}, + {L"\U00001100\U00000308\U00000915", {4352, 2325}, {2, 3}}, {L"\U00001100\U0000231a", {4352, 8986}, {1, 2}}, {L"\U00001100\U00000308\U0000231a", {4352, 8986}, {2, 3}}, {L"\U00001100\U00000300", {4352}, {2}}, {L"\U00001100\U00000308\U00000300", {4352}, {3}}, + {L"\U00001100\U0000093c", {4352}, {2}}, + {L"\U00001100\U00000308\U0000093c", {4352}, {3}}, + {L"\U00001100\U0000094d", {4352}, {2}}, + {L"\U00001100\U00000308\U0000094d", {4352}, {3}}, {L"\U00001100\U0000200d", {4352}, {2}}, {L"\U00001100\U00000308\U0000200d", {4352}, {3}}, {L"\U00001100\U00000378", {4352, 888}, {1, 2}}, @@ -1013,8 +1724,8 @@ std::array, 602> data_utf16 = {{ {L"\U00001160\U00000308\U0001f1e6", {4448, 127462}, {2, 4}}, {L"\U00001160\U00000600", {4448, 1536}, {1, 2}}, {L"\U00001160\U00000308\U00000600", {4448, 1536}, {2, 3}}, - {L"\U00001160\U00000903", {4448}, {2}}, - {L"\U00001160\U00000308\U00000903", {4448}, {3}}, + {L"\U00001160\U00000a03", {4448}, {2}}, + {L"\U00001160\U00000308\U00000a03", {4448}, {3}}, {L"\U00001160\U00001100", {4448, 4352}, {1, 2}}, {L"\U00001160\U00000308\U00001100", {4448, 4352}, {2, 3}}, {L"\U00001160\U00001160", {4448}, {2}}, @@ -1025,10 +1736,24 @@ std::array, 602> data_utf16 = {{ {L"\U00001160\U00000308\U0000ac00", {4448, 44032}, {2, 3}}, {L"\U00001160\U0000ac01", {4448, 44033}, {1, 2}}, {L"\U00001160\U00000308\U0000ac01", {4448, 44033}, {2, 3}}, + {L"\U00001160\U00000900", {4448}, {2}}, + {L"\U00001160\U00000308\U00000900", {4448}, {3}}, + {L"\U00001160\U00000903", {4448}, {2}}, + {L"\U00001160\U00000308\U00000903", {4448}, {3}}, + {L"\U00001160\U00000904", {4448, 2308}, {1, 2}}, + {L"\U00001160\U00000308\U00000904", {4448, 2308}, {2, 3}}, + {L"\U00001160\U00000d4e", {4448, 3406}, {1, 2}}, + {L"\U00001160\U00000308\U00000d4e", {4448, 3406}, {2, 3}}, + {L"\U00001160\U00000915", {4448, 2325}, {1, 2}}, + {L"\U00001160\U00000308\U00000915", {4448, 2325}, {2, 3}}, {L"\U00001160\U0000231a", {4448, 8986}, {1, 2}}, {L"\U00001160\U00000308\U0000231a", {4448, 8986}, {2, 3}}, {L"\U00001160\U00000300", {4448}, {2}}, {L"\U00001160\U00000308\U00000300", {4448}, {3}}, + {L"\U00001160\U0000093c", {4448}, {2}}, + {L"\U00001160\U00000308\U0000093c", {4448}, {3}}, + {L"\U00001160\U0000094d", {4448}, {2}}, + {L"\U00001160\U00000308\U0000094d", {4448}, {3}}, {L"\U00001160\U0000200d", {4448}, {2}}, {L"\U00001160\U00000308\U0000200d", {4448}, {3}}, {L"\U00001160\U00000378", {4448, 888}, {1, 2}}, @@ -1047,8 +1772,8 @@ std::array, 602> data_utf16 = {{ {L"\U000011a8\U00000308\U0001f1e6", {4520, 127462}, {2, 4}}, {L"\U000011a8\U00000600", {4520, 1536}, {1, 2}}, {L"\U000011a8\U00000308\U00000600", {4520, 1536}, {2, 3}}, - {L"\U000011a8\U00000903", {4520}, {2}}, - {L"\U000011a8\U00000308\U00000903", {4520}, {3}}, + {L"\U000011a8\U00000a03", {4520}, {2}}, + {L"\U000011a8\U00000308\U00000a03", {4520}, {3}}, {L"\U000011a8\U00001100", {4520, 4352}, {1, 2}}, {L"\U000011a8\U00000308\U00001100", {4520, 4352}, {2, 3}}, {L"\U000011a8\U00001160", {4520, 4448}, {1, 2}}, @@ -1059,10 +1784,24 @@ std::array, 602> data_utf16 = {{ {L"\U000011a8\U00000308\U0000ac00", {4520, 44032}, {2, 3}}, {L"\U000011a8\U0000ac01", {4520, 44033}, {1, 2}}, {L"\U000011a8\U00000308\U0000ac01", {4520, 44033}, {2, 3}}, + {L"\U000011a8\U00000900", {4520}, {2}}, + {L"\U000011a8\U00000308\U00000900", {4520}, {3}}, + {L"\U000011a8\U00000903", {4520}, {2}}, + {L"\U000011a8\U00000308\U00000903", {4520}, {3}}, + {L"\U000011a8\U00000904", {4520, 2308}, {1, 2}}, + {L"\U000011a8\U00000308\U00000904", {4520, 2308}, {2, 3}}, + {L"\U000011a8\U00000d4e", {4520, 3406}, {1, 2}}, + {L"\U000011a8\U00000308\U00000d4e", {4520, 3406}, {2, 3}}, + {L"\U000011a8\U00000915", {4520, 2325}, {1, 2}}, + {L"\U000011a8\U00000308\U00000915", {4520, 2325}, {2, 3}}, {L"\U000011a8\U0000231a", {4520, 8986}, {1, 2}}, {L"\U000011a8\U00000308\U0000231a", {4520, 8986}, {2, 3}}, {L"\U000011a8\U00000300", {4520}, {2}}, {L"\U000011a8\U00000308\U00000300", {4520}, {3}}, + {L"\U000011a8\U0000093c", {4520}, {2}}, + {L"\U000011a8\U00000308\U0000093c", {4520}, {3}}, + {L"\U000011a8\U0000094d", {4520}, {2}}, + {L"\U000011a8\U00000308\U0000094d", {4520}, {3}}, {L"\U000011a8\U0000200d", {4520}, {2}}, {L"\U000011a8\U00000308\U0000200d", {4520}, {3}}, {L"\U000011a8\U00000378", {4520, 888}, {1, 2}}, @@ -1081,8 +1820,8 @@ std::array, 602> data_utf16 = {{ {L"\U0000ac00\U00000308\U0001f1e6", {44032, 127462}, {2, 4}}, {L"\U0000ac00\U00000600", {44032, 1536}, {1, 2}}, {L"\U0000ac00\U00000308\U00000600", {44032, 1536}, {2, 3}}, - {L"\U0000ac00\U00000903", {44032}, {2}}, - {L"\U0000ac00\U00000308\U00000903", {44032}, {3}}, + {L"\U0000ac00\U00000a03", {44032}, {2}}, + {L"\U0000ac00\U00000308\U00000a03", {44032}, {3}}, {L"\U0000ac00\U00001100", {44032, 4352}, {1, 2}}, {L"\U0000ac00\U00000308\U00001100", {44032, 4352}, {2, 3}}, {L"\U0000ac00\U00001160", {44032}, {2}}, @@ -1093,10 +1832,24 @@ std::array, 602> data_utf16 = {{ {L"\U0000ac00\U00000308\U0000ac00", {44032, 44032}, {2, 3}}, {L"\U0000ac00\U0000ac01", {44032, 44033}, {1, 2}}, {L"\U0000ac00\U00000308\U0000ac01", {44032, 44033}, {2, 3}}, + {L"\U0000ac00\U00000900", {44032}, {2}}, + {L"\U0000ac00\U00000308\U00000900", {44032}, {3}}, + {L"\U0000ac00\U00000903", {44032}, {2}}, + {L"\U0000ac00\U00000308\U00000903", {44032}, {3}}, + {L"\U0000ac00\U00000904", {44032, 2308}, {1, 2}}, + {L"\U0000ac00\U00000308\U00000904", {44032, 2308}, {2, 3}}, + {L"\U0000ac00\U00000d4e", {44032, 3406}, {1, 2}}, + {L"\U0000ac00\U00000308\U00000d4e", {44032, 3406}, {2, 3}}, + {L"\U0000ac00\U00000915", {44032, 2325}, {1, 2}}, + {L"\U0000ac00\U00000308\U00000915", {44032, 2325}, {2, 3}}, {L"\U0000ac00\U0000231a", {44032, 8986}, {1, 2}}, {L"\U0000ac00\U00000308\U0000231a", {44032, 8986}, {2, 3}}, {L"\U0000ac00\U00000300", {44032}, {2}}, {L"\U0000ac00\U00000308\U00000300", {44032}, {3}}, + {L"\U0000ac00\U0000093c", {44032}, {2}}, + {L"\U0000ac00\U00000308\U0000093c", {44032}, {3}}, + {L"\U0000ac00\U0000094d", {44032}, {2}}, + {L"\U0000ac00\U00000308\U0000094d", {44032}, {3}}, {L"\U0000ac00\U0000200d", {44032}, {2}}, {L"\U0000ac00\U00000308\U0000200d", {44032}, {3}}, {L"\U0000ac00\U00000378", {44032, 888}, {1, 2}}, @@ -1115,8 +1868,8 @@ std::array, 602> data_utf16 = {{ {L"\U0000ac01\U00000308\U0001f1e6", {44033, 127462}, {2, 4}}, {L"\U0000ac01\U00000600", {44033, 1536}, {1, 2}}, {L"\U0000ac01\U00000308\U00000600", {44033, 1536}, {2, 3}}, - {L"\U0000ac01\U00000903", {44033}, {2}}, - {L"\U0000ac01\U00000308\U00000903", {44033}, {3}}, + {L"\U0000ac01\U00000a03", {44033}, {2}}, + {L"\U0000ac01\U00000308\U00000a03", {44033}, {3}}, {L"\U0000ac01\U00001100", {44033, 4352}, {1, 2}}, {L"\U0000ac01\U00000308\U00001100", {44033, 4352}, {2, 3}}, {L"\U0000ac01\U00001160", {44033, 4448}, {1, 2}}, @@ -1127,14 +1880,268 @@ std::array, 602> data_utf16 = {{ {L"\U0000ac01\U00000308\U0000ac00", {44033, 44032}, {2, 3}}, {L"\U0000ac01\U0000ac01", {44033, 44033}, {1, 2}}, {L"\U0000ac01\U00000308\U0000ac01", {44033, 44033}, {2, 3}}, + {L"\U0000ac01\U00000900", {44033}, {2}}, + {L"\U0000ac01\U00000308\U00000900", {44033}, {3}}, + {L"\U0000ac01\U00000903", {44033}, {2}}, + {L"\U0000ac01\U00000308\U00000903", {44033}, {3}}, + {L"\U0000ac01\U00000904", {44033, 2308}, {1, 2}}, + {L"\U0000ac01\U00000308\U00000904", {44033, 2308}, {2, 3}}, + {L"\U0000ac01\U00000d4e", {44033, 3406}, {1, 2}}, + {L"\U0000ac01\U00000308\U00000d4e", {44033, 3406}, {2, 3}}, + {L"\U0000ac01\U00000915", {44033, 2325}, {1, 2}}, + {L"\U0000ac01\U00000308\U00000915", {44033, 2325}, {2, 3}}, {L"\U0000ac01\U0000231a", {44033, 8986}, {1, 2}}, {L"\U0000ac01\U00000308\U0000231a", {44033, 8986}, {2, 3}}, {L"\U0000ac01\U00000300", {44033}, {2}}, {L"\U0000ac01\U00000308\U00000300", {44033}, {3}}, + {L"\U0000ac01\U0000093c", {44033}, {2}}, + {L"\U0000ac01\U00000308\U0000093c", {44033}, {3}}, + {L"\U0000ac01\U0000094d", {44033}, {2}}, + {L"\U0000ac01\U00000308\U0000094d", {44033}, {3}}, {L"\U0000ac01\U0000200d", {44033}, {2}}, {L"\U0000ac01\U00000308\U0000200d", {44033}, {3}}, {L"\U0000ac01\U00000378", {44033, 888}, {1, 2}}, {L"\U0000ac01\U00000308\U00000378", {44033, 888}, {2, 3}}, + {L"\U00000900\U00000020", {2304, 32}, {1, 2}}, + {L"\U00000900\U00000308\U00000020", {2304, 32}, {2, 3}}, + {L"\U00000900\U0000000d", {2304, 13}, {1, 2}}, + {L"\U00000900\U00000308\U0000000d", {2304, 13}, {2, 3}}, + {L"\U00000900\U0000000a", {2304, 10}, {1, 2}}, + {L"\U00000900\U00000308\U0000000a", {2304, 10}, {2, 3}}, + {L"\U00000900\U00000001", {2304, 1}, {1, 2}}, + {L"\U00000900\U00000308\U00000001", {2304, 1}, {2, 3}}, + {L"\U00000900\U0000034f", {2304}, {2}}, + {L"\U00000900\U00000308\U0000034f", {2304}, {3}}, + {L"\U00000900\U0001f1e6", {2304, 127462}, {1, 3}}, + {L"\U00000900\U00000308\U0001f1e6", {2304, 127462}, {2, 4}}, + {L"\U00000900\U00000600", {2304, 1536}, {1, 2}}, + {L"\U00000900\U00000308\U00000600", {2304, 1536}, {2, 3}}, + {L"\U00000900\U00000a03", {2304}, {2}}, + {L"\U00000900\U00000308\U00000a03", {2304}, {3}}, + {L"\U00000900\U00001100", {2304, 4352}, {1, 2}}, + {L"\U00000900\U00000308\U00001100", {2304, 4352}, {2, 3}}, + {L"\U00000900\U00001160", {2304, 4448}, {1, 2}}, + {L"\U00000900\U00000308\U00001160", {2304, 4448}, {2, 3}}, + {L"\U00000900\U000011a8", {2304, 4520}, {1, 2}}, + {L"\U00000900\U00000308\U000011a8", {2304, 4520}, {2, 3}}, + {L"\U00000900\U0000ac00", {2304, 44032}, {1, 2}}, + {L"\U00000900\U00000308\U0000ac00", {2304, 44032}, {2, 3}}, + {L"\U00000900\U0000ac01", {2304, 44033}, {1, 2}}, + {L"\U00000900\U00000308\U0000ac01", {2304, 44033}, {2, 3}}, + {L"\U00000900\U00000900", {2304}, {2}}, + {L"\U00000900\U00000308\U00000900", {2304}, {3}}, + {L"\U00000900\U00000903", {2304}, {2}}, + {L"\U00000900\U00000308\U00000903", {2304}, {3}}, + {L"\U00000900\U00000904", {2304, 2308}, {1, 2}}, + {L"\U00000900\U00000308\U00000904", {2304, 2308}, {2, 3}}, + {L"\U00000900\U00000d4e", {2304, 3406}, {1, 2}}, + {L"\U00000900\U00000308\U00000d4e", {2304, 3406}, {2, 3}}, + {L"\U00000900\U00000915", {2304, 2325}, {1, 2}}, + {L"\U00000900\U00000308\U00000915", {2304, 2325}, {2, 3}}, + {L"\U00000900\U0000231a", {2304, 8986}, {1, 2}}, + {L"\U00000900\U00000308\U0000231a", {2304, 8986}, {2, 3}}, + {L"\U00000900\U00000300", {2304}, {2}}, + {L"\U00000900\U00000308\U00000300", {2304}, {3}}, + {L"\U00000900\U0000093c", {2304}, {2}}, + {L"\U00000900\U00000308\U0000093c", {2304}, {3}}, + {L"\U00000900\U0000094d", {2304}, {2}}, + {L"\U00000900\U00000308\U0000094d", {2304}, {3}}, + {L"\U00000900\U0000200d", {2304}, {2}}, + {L"\U00000900\U00000308\U0000200d", {2304}, {3}}, + {L"\U00000900\U00000378", {2304, 888}, {1, 2}}, + {L"\U00000900\U00000308\U00000378", {2304, 888}, {2, 3}}, + {L"\U00000903\U00000020", {2307, 32}, {1, 2}}, + {L"\U00000903\U00000308\U00000020", {2307, 32}, {2, 3}}, + {L"\U00000903\U0000000d", {2307, 13}, {1, 2}}, + {L"\U00000903\U00000308\U0000000d", {2307, 13}, {2, 3}}, + {L"\U00000903\U0000000a", {2307, 10}, {1, 2}}, + {L"\U00000903\U00000308\U0000000a", {2307, 10}, {2, 3}}, + {L"\U00000903\U00000001", {2307, 1}, {1, 2}}, + {L"\U00000903\U00000308\U00000001", {2307, 1}, {2, 3}}, + {L"\U00000903\U0000034f", {2307}, {2}}, + {L"\U00000903\U00000308\U0000034f", {2307}, {3}}, + {L"\U00000903\U0001f1e6", {2307, 127462}, {1, 3}}, + {L"\U00000903\U00000308\U0001f1e6", {2307, 127462}, {2, 4}}, + {L"\U00000903\U00000600", {2307, 1536}, {1, 2}}, + {L"\U00000903\U00000308\U00000600", {2307, 1536}, {2, 3}}, + {L"\U00000903\U00000a03", {2307}, {2}}, + {L"\U00000903\U00000308\U00000a03", {2307}, {3}}, + {L"\U00000903\U00001100", {2307, 4352}, {1, 2}}, + {L"\U00000903\U00000308\U00001100", {2307, 4352}, {2, 3}}, + {L"\U00000903\U00001160", {2307, 4448}, {1, 2}}, + {L"\U00000903\U00000308\U00001160", {2307, 4448}, {2, 3}}, + {L"\U00000903\U000011a8", {2307, 4520}, {1, 2}}, + {L"\U00000903\U00000308\U000011a8", {2307, 4520}, {2, 3}}, + {L"\U00000903\U0000ac00", {2307, 44032}, {1, 2}}, + {L"\U00000903\U00000308\U0000ac00", {2307, 44032}, {2, 3}}, + {L"\U00000903\U0000ac01", {2307, 44033}, {1, 2}}, + {L"\U00000903\U00000308\U0000ac01", {2307, 44033}, {2, 3}}, + {L"\U00000903\U00000900", {2307}, {2}}, + {L"\U00000903\U00000308\U00000900", {2307}, {3}}, + {L"\U00000903\U00000903", {2307}, {2}}, + {L"\U00000903\U00000308\U00000903", {2307}, {3}}, + {L"\U00000903\U00000904", {2307, 2308}, {1, 2}}, + {L"\U00000903\U00000308\U00000904", {2307, 2308}, {2, 3}}, + {L"\U00000903\U00000d4e", {2307, 3406}, {1, 2}}, + {L"\U00000903\U00000308\U00000d4e", {2307, 3406}, {2, 3}}, + {L"\U00000903\U00000915", {2307, 2325}, {1, 2}}, + {L"\U00000903\U00000308\U00000915", {2307, 2325}, {2, 3}}, + {L"\U00000903\U0000231a", {2307, 8986}, {1, 2}}, + {L"\U00000903\U00000308\U0000231a", {2307, 8986}, {2, 3}}, + {L"\U00000903\U00000300", {2307}, {2}}, + {L"\U00000903\U00000308\U00000300", {2307}, {3}}, + {L"\U00000903\U0000093c", {2307}, {2}}, + {L"\U00000903\U00000308\U0000093c", {2307}, {3}}, + {L"\U00000903\U0000094d", {2307}, {2}}, + {L"\U00000903\U00000308\U0000094d", {2307}, {3}}, + {L"\U00000903\U0000200d", {2307}, {2}}, + {L"\U00000903\U00000308\U0000200d", {2307}, {3}}, + {L"\U00000903\U00000378", {2307, 888}, {1, 2}}, + {L"\U00000903\U00000308\U00000378", {2307, 888}, {2, 3}}, + {L"\U00000904\U00000020", {2308, 32}, {1, 2}}, + {L"\U00000904\U00000308\U00000020", {2308, 32}, {2, 3}}, + {L"\U00000904\U0000000d", {2308, 13}, {1, 2}}, + {L"\U00000904\U00000308\U0000000d", {2308, 13}, {2, 3}}, + {L"\U00000904\U0000000a", {2308, 10}, {1, 2}}, + {L"\U00000904\U00000308\U0000000a", {2308, 10}, {2, 3}}, + {L"\U00000904\U00000001", {2308, 1}, {1, 2}}, + {L"\U00000904\U00000308\U00000001", {2308, 1}, {2, 3}}, + {L"\U00000904\U0000034f", {2308}, {2}}, + {L"\U00000904\U00000308\U0000034f", {2308}, {3}}, + {L"\U00000904\U0001f1e6", {2308, 127462}, {1, 3}}, + {L"\U00000904\U00000308\U0001f1e6", {2308, 127462}, {2, 4}}, + {L"\U00000904\U00000600", {2308, 1536}, {1, 2}}, + {L"\U00000904\U00000308\U00000600", {2308, 1536}, {2, 3}}, + {L"\U00000904\U00000a03", {2308}, {2}}, + {L"\U00000904\U00000308\U00000a03", {2308}, {3}}, + {L"\U00000904\U00001100", {2308, 4352}, {1, 2}}, + {L"\U00000904\U00000308\U00001100", {2308, 4352}, {2, 3}}, + {L"\U00000904\U00001160", {2308, 4448}, {1, 2}}, + {L"\U00000904\U00000308\U00001160", {2308, 4448}, {2, 3}}, + {L"\U00000904\U000011a8", {2308, 4520}, {1, 2}}, + {L"\U00000904\U00000308\U000011a8", {2308, 4520}, {2, 3}}, + {L"\U00000904\U0000ac00", {2308, 44032}, {1, 2}}, + {L"\U00000904\U00000308\U0000ac00", {2308, 44032}, {2, 3}}, + {L"\U00000904\U0000ac01", {2308, 44033}, {1, 2}}, + {L"\U00000904\U00000308\U0000ac01", {2308, 44033}, {2, 3}}, + {L"\U00000904\U00000900", {2308}, {2}}, + {L"\U00000904\U00000308\U00000900", {2308}, {3}}, + {L"\U00000904\U00000903", {2308}, {2}}, + {L"\U00000904\U00000308\U00000903", {2308}, {3}}, + {L"\U00000904\U00000904", {2308, 2308}, {1, 2}}, + {L"\U00000904\U00000308\U00000904", {2308, 2308}, {2, 3}}, + {L"\U00000904\U00000d4e", {2308, 3406}, {1, 2}}, + {L"\U00000904\U00000308\U00000d4e", {2308, 3406}, {2, 3}}, + {L"\U00000904\U00000915", {2308, 2325}, {1, 2}}, + {L"\U00000904\U00000308\U00000915", {2308, 2325}, {2, 3}}, + {L"\U00000904\U0000231a", {2308, 8986}, {1, 2}}, + {L"\U00000904\U00000308\U0000231a", {2308, 8986}, {2, 3}}, + {L"\U00000904\U00000300", {2308}, {2}}, + {L"\U00000904\U00000308\U00000300", {2308}, {3}}, + {L"\U00000904\U0000093c", {2308}, {2}}, + {L"\U00000904\U00000308\U0000093c", {2308}, {3}}, + {L"\U00000904\U0000094d", {2308}, {2}}, + {L"\U00000904\U00000308\U0000094d", {2308}, {3}}, + {L"\U00000904\U0000200d", {2308}, {2}}, + {L"\U00000904\U00000308\U0000200d", {2308}, {3}}, + {L"\U00000904\U00000378", {2308, 888}, {1, 2}}, + {L"\U00000904\U00000308\U00000378", {2308, 888}, {2, 3}}, + {L"\U00000d4e\U00000020", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000020", {3406, 32}, {2, 3}}, + {L"\U00000d4e\U0000000d", {3406, 13}, {1, 2}}, + {L"\U00000d4e\U00000308\U0000000d", {3406, 13}, {2, 3}}, + {L"\U00000d4e\U0000000a", {3406, 10}, {1, 2}}, + {L"\U00000d4e\U00000308\U0000000a", {3406, 10}, {2, 3}}, + {L"\U00000d4e\U00000001", {3406, 1}, {1, 2}}, + {L"\U00000d4e\U00000308\U00000001", {3406, 1}, {2, 3}}, + {L"\U00000d4e\U0000034f", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000034f", {3406}, {3}}, + {L"\U00000d4e\U0001f1e6", {3406}, {3}}, + {L"\U00000d4e\U00000308\U0001f1e6", {3406, 127462}, {2, 4}}, + {L"\U00000d4e\U00000600", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000600", {3406, 1536}, {2, 3}}, + {L"\U00000d4e\U00000a03", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000a03", {3406}, {3}}, + {L"\U00000d4e\U00001100", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00001100", {3406, 4352}, {2, 3}}, + {L"\U00000d4e\U00001160", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00001160", {3406, 4448}, {2, 3}}, + {L"\U00000d4e\U000011a8", {3406}, {2}}, + {L"\U00000d4e\U00000308\U000011a8", {3406, 4520}, {2, 3}}, + {L"\U00000d4e\U0000ac00", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000ac00", {3406, 44032}, {2, 3}}, + {L"\U00000d4e\U0000ac01", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000ac01", {3406, 44033}, {2, 3}}, + {L"\U00000d4e\U00000900", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000900", {3406}, {3}}, + {L"\U00000d4e\U00000903", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000903", {3406}, {3}}, + {L"\U00000d4e\U00000904", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000904", {3406, 2308}, {2, 3}}, + {L"\U00000d4e\U00000d4e", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000d4e", {3406, 3406}, {2, 3}}, + {L"\U00000d4e\U00000915", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000915", {3406, 2325}, {2, 3}}, + {L"\U00000d4e\U0000231a", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000231a", {3406, 8986}, {2, 3}}, + {L"\U00000d4e\U00000300", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000300", {3406}, {3}}, + {L"\U00000d4e\U0000093c", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000093c", {3406}, {3}}, + {L"\U00000d4e\U0000094d", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000094d", {3406}, {3}}, + {L"\U00000d4e\U0000200d", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000200d", {3406}, {3}}, + {L"\U00000d4e\U00000378", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000378", {3406, 888}, {2, 3}}, + {L"\U00000915\U00000020", {2325, 32}, {1, 2}}, + {L"\U00000915\U00000308\U00000020", {2325, 32}, {2, 3}}, + {L"\U00000915\U0000000d", {2325, 13}, {1, 2}}, + {L"\U00000915\U00000308\U0000000d", {2325, 13}, {2, 3}}, + {L"\U00000915\U0000000a", {2325, 10}, {1, 2}}, + {L"\U00000915\U00000308\U0000000a", {2325, 10}, {2, 3}}, + {L"\U00000915\U00000001", {2325, 1}, {1, 2}}, + {L"\U00000915\U00000308\U00000001", {2325, 1}, {2, 3}}, + {L"\U00000915\U0000034f", {2325}, {2}}, + {L"\U00000915\U00000308\U0000034f", {2325}, {3}}, + {L"\U00000915\U0001f1e6", {2325, 127462}, {1, 3}}, + {L"\U00000915\U00000308\U0001f1e6", {2325, 127462}, {2, 4}}, + {L"\U00000915\U00000600", {2325, 1536}, {1, 2}}, + {L"\U00000915\U00000308\U00000600", {2325, 1536}, {2, 3}}, + {L"\U00000915\U00000a03", {2325}, {2}}, + {L"\U00000915\U00000308\U00000a03", {2325}, {3}}, + {L"\U00000915\U00001100", {2325, 4352}, {1, 2}}, + {L"\U00000915\U00000308\U00001100", {2325, 4352}, {2, 3}}, + {L"\U00000915\U00001160", {2325, 4448}, {1, 2}}, + {L"\U00000915\U00000308\U00001160", {2325, 4448}, {2, 3}}, + {L"\U00000915\U000011a8", {2325, 4520}, {1, 2}}, + {L"\U00000915\U00000308\U000011a8", {2325, 4520}, {2, 3}}, + {L"\U00000915\U0000ac00", {2325, 44032}, {1, 2}}, + {L"\U00000915\U00000308\U0000ac00", {2325, 44032}, {2, 3}}, + {L"\U00000915\U0000ac01", {2325, 44033}, {1, 2}}, + {L"\U00000915\U00000308\U0000ac01", {2325, 44033}, {2, 3}}, + {L"\U00000915\U00000900", {2325}, {2}}, + {L"\U00000915\U00000308\U00000900", {2325}, {3}}, + {L"\U00000915\U00000903", {2325}, {2}}, + {L"\U00000915\U00000308\U00000903", {2325}, {3}}, + {L"\U00000915\U00000904", {2325, 2308}, {1, 2}}, + {L"\U00000915\U00000308\U00000904", {2325, 2308}, {2, 3}}, + {L"\U00000915\U00000d4e", {2325, 3406}, {1, 2}}, + {L"\U00000915\U00000308\U00000d4e", {2325, 3406}, {2, 3}}, + {L"\U00000915\U00000915", {2325, 2325}, {1, 2}}, + {L"\U00000915\U00000308\U00000915", {2325, 2325}, {2, 3}}, + {L"\U00000915\U0000231a", {2325, 8986}, {1, 2}}, + {L"\U00000915\U00000308\U0000231a", {2325, 8986}, {2, 3}}, + {L"\U00000915\U00000300", {2325}, {2}}, + {L"\U00000915\U00000308\U00000300", {2325}, {3}}, + {L"\U00000915\U0000093c", {2325}, {2}}, + {L"\U00000915\U00000308\U0000093c", {2325}, {3}}, + {L"\U00000915\U0000094d", {2325}, {2}}, + {L"\U00000915\U00000308\U0000094d", {2325}, {3}}, + {L"\U00000915\U0000200d", {2325}, {2}}, + {L"\U00000915\U00000308\U0000200d", {2325}, {3}}, + {L"\U00000915\U00000378", {2325, 888}, {1, 2}}, + {L"\U00000915\U00000308\U00000378", {2325, 888}, {2, 3}}, {L"\U0000231a\U00000020", {8986, 32}, {1, 2}}, {L"\U0000231a\U00000308\U00000020", {8986, 32}, {2, 3}}, {L"\U0000231a\U0000000d", {8986, 13}, {1, 2}}, @@ -1149,8 +2156,8 @@ std::array, 602> data_utf16 = {{ {L"\U0000231a\U00000308\U0001f1e6", {8986, 127462}, {2, 4}}, {L"\U0000231a\U00000600", {8986, 1536}, {1, 2}}, {L"\U0000231a\U00000308\U00000600", {8986, 1536}, {2, 3}}, - {L"\U0000231a\U00000903", {8986}, {2}}, - {L"\U0000231a\U00000308\U00000903", {8986}, {3}}, + {L"\U0000231a\U00000a03", {8986}, {2}}, + {L"\U0000231a\U00000308\U00000a03", {8986}, {3}}, {L"\U0000231a\U00001100", {8986, 4352}, {1, 2}}, {L"\U0000231a\U00000308\U00001100", {8986, 4352}, {2, 3}}, {L"\U0000231a\U00001160", {8986, 4448}, {1, 2}}, @@ -1161,10 +2168,24 @@ std::array, 602> data_utf16 = {{ {L"\U0000231a\U00000308\U0000ac00", {8986, 44032}, {2, 3}}, {L"\U0000231a\U0000ac01", {8986, 44033}, {1, 2}}, {L"\U0000231a\U00000308\U0000ac01", {8986, 44033}, {2, 3}}, + {L"\U0000231a\U00000900", {8986}, {2}}, + {L"\U0000231a\U00000308\U00000900", {8986}, {3}}, + {L"\U0000231a\U00000903", {8986}, {2}}, + {L"\U0000231a\U00000308\U00000903", {8986}, {3}}, + {L"\U0000231a\U00000904", {8986, 2308}, {1, 2}}, + {L"\U0000231a\U00000308\U00000904", {8986, 2308}, {2, 3}}, + {L"\U0000231a\U00000d4e", {8986, 3406}, {1, 2}}, + {L"\U0000231a\U00000308\U00000d4e", {8986, 3406}, {2, 3}}, + {L"\U0000231a\U00000915", {8986, 2325}, {1, 2}}, + {L"\U0000231a\U00000308\U00000915", {8986, 2325}, {2, 3}}, {L"\U0000231a\U0000231a", {8986, 8986}, {1, 2}}, {L"\U0000231a\U00000308\U0000231a", {8986, 8986}, {2, 3}}, {L"\U0000231a\U00000300", {8986}, {2}}, {L"\U0000231a\U00000308\U00000300", {8986}, {3}}, + {L"\U0000231a\U0000093c", {8986}, {2}}, + {L"\U0000231a\U00000308\U0000093c", {8986}, {3}}, + {L"\U0000231a\U0000094d", {8986}, {2}}, + {L"\U0000231a\U00000308\U0000094d", {8986}, {3}}, {L"\U0000231a\U0000200d", {8986}, {2}}, {L"\U0000231a\U00000308\U0000200d", {8986}, {3}}, {L"\U0000231a\U00000378", {8986, 888}, {1, 2}}, @@ -1183,8 +2204,8 @@ std::array, 602> data_utf16 = {{ {L"\U00000300\U00000308\U0001f1e6", {768, 127462}, {2, 4}}, {L"\U00000300\U00000600", {768, 1536}, {1, 2}}, {L"\U00000300\U00000308\U00000600", {768, 1536}, {2, 3}}, - {L"\U00000300\U00000903", {768}, {2}}, - {L"\U00000300\U00000308\U00000903", {768}, {3}}, + {L"\U00000300\U00000a03", {768}, {2}}, + {L"\U00000300\U00000308\U00000a03", {768}, {3}}, {L"\U00000300\U00001100", {768, 4352}, {1, 2}}, {L"\U00000300\U00000308\U00001100", {768, 4352}, {2, 3}}, {L"\U00000300\U00001160", {768, 4448}, {1, 2}}, @@ -1195,14 +2216,124 @@ std::array, 602> data_utf16 = {{ {L"\U00000300\U00000308\U0000ac00", {768, 44032}, {2, 3}}, {L"\U00000300\U0000ac01", {768, 44033}, {1, 2}}, {L"\U00000300\U00000308\U0000ac01", {768, 44033}, {2, 3}}, + {L"\U00000300\U00000900", {768}, {2}}, + {L"\U00000300\U00000308\U00000900", {768}, {3}}, + {L"\U00000300\U00000903", {768}, {2}}, + {L"\U00000300\U00000308\U00000903", {768}, {3}}, + {L"\U00000300\U00000904", {768, 2308}, {1, 2}}, + {L"\U00000300\U00000308\U00000904", {768, 2308}, {2, 3}}, + {L"\U00000300\U00000d4e", {768, 3406}, {1, 2}}, + {L"\U00000300\U00000308\U00000d4e", {768, 3406}, {2, 3}}, + {L"\U00000300\U00000915", {768, 2325}, {1, 2}}, + {L"\U00000300\U00000308\U00000915", {768, 2325}, {2, 3}}, {L"\U00000300\U0000231a", {768, 8986}, {1, 2}}, {L"\U00000300\U00000308\U0000231a", {768, 8986}, {2, 3}}, {L"\U00000300\U00000300", {768}, {2}}, {L"\U00000300\U00000308\U00000300", {768}, {3}}, + {L"\U00000300\U0000093c", {768}, {2}}, + {L"\U00000300\U00000308\U0000093c", {768}, {3}}, + {L"\U00000300\U0000094d", {768}, {2}}, + {L"\U00000300\U00000308\U0000094d", {768}, {3}}, {L"\U00000300\U0000200d", {768}, {2}}, {L"\U00000300\U00000308\U0000200d", {768}, {3}}, {L"\U00000300\U00000378", {768, 888}, {1, 2}}, {L"\U00000300\U00000308\U00000378", {768, 888}, {2, 3}}, + {L"\U0000093c\U00000020", {2364, 32}, {1, 2}}, + {L"\U0000093c\U00000308\U00000020", {2364, 32}, {2, 3}}, + {L"\U0000093c\U0000000d", {2364, 13}, {1, 2}}, + {L"\U0000093c\U00000308\U0000000d", {2364, 13}, {2, 3}}, + {L"\U0000093c\U0000000a", {2364, 10}, {1, 2}}, + {L"\U0000093c\U00000308\U0000000a", {2364, 10}, {2, 3}}, + {L"\U0000093c\U00000001", {2364, 1}, {1, 2}}, + {L"\U0000093c\U00000308\U00000001", {2364, 1}, {2, 3}}, + {L"\U0000093c\U0000034f", {2364}, {2}}, + {L"\U0000093c\U00000308\U0000034f", {2364}, {3}}, + {L"\U0000093c\U0001f1e6", {2364, 127462}, {1, 3}}, + {L"\U0000093c\U00000308\U0001f1e6", {2364, 127462}, {2, 4}}, + {L"\U0000093c\U00000600", {2364, 1536}, {1, 2}}, + {L"\U0000093c\U00000308\U00000600", {2364, 1536}, {2, 3}}, + {L"\U0000093c\U00000a03", {2364}, {2}}, + {L"\U0000093c\U00000308\U00000a03", {2364}, {3}}, + {L"\U0000093c\U00001100", {2364, 4352}, {1, 2}}, + {L"\U0000093c\U00000308\U00001100", {2364, 4352}, {2, 3}}, + {L"\U0000093c\U00001160", {2364, 4448}, {1, 2}}, + {L"\U0000093c\U00000308\U00001160", {2364, 4448}, {2, 3}}, + {L"\U0000093c\U000011a8", {2364, 4520}, {1, 2}}, + {L"\U0000093c\U00000308\U000011a8", {2364, 4520}, {2, 3}}, + {L"\U0000093c\U0000ac00", {2364, 44032}, {1, 2}}, + {L"\U0000093c\U00000308\U0000ac00", {2364, 44032}, {2, 3}}, + {L"\U0000093c\U0000ac01", {2364, 44033}, {1, 2}}, + {L"\U0000093c\U00000308\U0000ac01", {2364, 44033}, {2, 3}}, + {L"\U0000093c\U00000900", {2364}, {2}}, + {L"\U0000093c\U00000308\U00000900", {2364}, {3}}, + {L"\U0000093c\U00000903", {2364}, {2}}, + {L"\U0000093c\U00000308\U00000903", {2364}, {3}}, + {L"\U0000093c\U00000904", {2364, 2308}, {1, 2}}, + {L"\U0000093c\U00000308\U00000904", {2364, 2308}, {2, 3}}, + {L"\U0000093c\U00000d4e", {2364, 3406}, {1, 2}}, + {L"\U0000093c\U00000308\U00000d4e", {2364, 3406}, {2, 3}}, + {L"\U0000093c\U00000915", {2364, 2325}, {1, 2}}, + {L"\U0000093c\U00000308\U00000915", {2364, 2325}, {2, 3}}, + {L"\U0000093c\U0000231a", {2364, 8986}, {1, 2}}, + {L"\U0000093c\U00000308\U0000231a", {2364, 8986}, {2, 3}}, + {L"\U0000093c\U00000300", {2364}, {2}}, + {L"\U0000093c\U00000308\U00000300", {2364}, {3}}, + {L"\U0000093c\U0000093c", {2364}, {2}}, + {L"\U0000093c\U00000308\U0000093c", {2364}, {3}}, + {L"\U0000093c\U0000094d", {2364}, {2}}, + {L"\U0000093c\U00000308\U0000094d", {2364}, {3}}, + {L"\U0000093c\U0000200d", {2364}, {2}}, + {L"\U0000093c\U00000308\U0000200d", {2364}, {3}}, + {L"\U0000093c\U00000378", {2364, 888}, {1, 2}}, + {L"\U0000093c\U00000308\U00000378", {2364, 888}, {2, 3}}, + {L"\U0000094d\U00000020", {2381, 32}, {1, 2}}, + {L"\U0000094d\U00000308\U00000020", {2381, 32}, {2, 3}}, + {L"\U0000094d\U0000000d", {2381, 13}, {1, 2}}, + {L"\U0000094d\U00000308\U0000000d", {2381, 13}, {2, 3}}, + {L"\U0000094d\U0000000a", {2381, 10}, {1, 2}}, + {L"\U0000094d\U00000308\U0000000a", {2381, 10}, {2, 3}}, + {L"\U0000094d\U00000001", {2381, 1}, {1, 2}}, + {L"\U0000094d\U00000308\U00000001", {2381, 1}, {2, 3}}, + {L"\U0000094d\U0000034f", {2381}, {2}}, + {L"\U0000094d\U00000308\U0000034f", {2381}, {3}}, + {L"\U0000094d\U0001f1e6", {2381, 127462}, {1, 3}}, + {L"\U0000094d\U00000308\U0001f1e6", {2381, 127462}, {2, 4}}, + {L"\U0000094d\U00000600", {2381, 1536}, {1, 2}}, + {L"\U0000094d\U00000308\U00000600", {2381, 1536}, {2, 3}}, + {L"\U0000094d\U00000a03", {2381}, {2}}, + {L"\U0000094d\U00000308\U00000a03", {2381}, {3}}, + {L"\U0000094d\U00001100", {2381, 4352}, {1, 2}}, + {L"\U0000094d\U00000308\U00001100", {2381, 4352}, {2, 3}}, + {L"\U0000094d\U00001160", {2381, 4448}, {1, 2}}, + {L"\U0000094d\U00000308\U00001160", {2381, 4448}, {2, 3}}, + {L"\U0000094d\U000011a8", {2381, 4520}, {1, 2}}, + {L"\U0000094d\U00000308\U000011a8", {2381, 4520}, {2, 3}}, + {L"\U0000094d\U0000ac00", {2381, 44032}, {1, 2}}, + {L"\U0000094d\U00000308\U0000ac00", {2381, 44032}, {2, 3}}, + {L"\U0000094d\U0000ac01", {2381, 44033}, {1, 2}}, + {L"\U0000094d\U00000308\U0000ac01", {2381, 44033}, {2, 3}}, + {L"\U0000094d\U00000900", {2381}, {2}}, + {L"\U0000094d\U00000308\U00000900", {2381}, {3}}, + {L"\U0000094d\U00000903", {2381}, {2}}, + {L"\U0000094d\U00000308\U00000903", {2381}, {3}}, + {L"\U0000094d\U00000904", {2381, 2308}, {1, 2}}, + {L"\U0000094d\U00000308\U00000904", {2381, 2308}, {2, 3}}, + {L"\U0000094d\U00000d4e", {2381, 3406}, {1, 2}}, + {L"\U0000094d\U00000308\U00000d4e", {2381, 3406}, {2, 3}}, + {L"\U0000094d\U00000915", {2381, 2325}, {1, 2}}, + {L"\U0000094d\U00000308\U00000915", {2381, 2325}, {2, 3}}, + {L"\U0000094d\U0000231a", {2381, 8986}, {1, 2}}, + {L"\U0000094d\U00000308\U0000231a", {2381, 8986}, {2, 3}}, + {L"\U0000094d\U00000300", {2381}, {2}}, + {L"\U0000094d\U00000308\U00000300", {2381}, {3}}, + {L"\U0000094d\U0000093c", {2381}, {2}}, + {L"\U0000094d\U00000308\U0000093c", {2381}, {3}}, + {L"\U0000094d\U0000094d", {2381}, {2}}, + {L"\U0000094d\U00000308\U0000094d", {2381}, {3}}, + {L"\U0000094d\U0000200d", {2381}, {2}}, + {L"\U0000094d\U00000308\U0000200d", {2381}, {3}}, + {L"\U0000094d\U00000378", {2381, 888}, {1, 2}}, + {L"\U0000094d\U00000308\U00000378", {2381, 888}, {2, 3}}, {L"\U0000200d\U00000020", {8205, 32}, {1, 2}}, {L"\U0000200d\U00000308\U00000020", {8205, 32}, {2, 3}}, {L"\U0000200d\U0000000d", {8205, 13}, {1, 2}}, @@ -1217,8 +2348,8 @@ std::array, 602> data_utf16 = {{ {L"\U0000200d\U00000308\U0001f1e6", {8205, 127462}, {2, 4}}, {L"\U0000200d\U00000600", {8205, 1536}, {1, 2}}, {L"\U0000200d\U00000308\U00000600", {8205, 1536}, {2, 3}}, - {L"\U0000200d\U00000903", {8205}, {2}}, - {L"\U0000200d\U00000308\U00000903", {8205}, {3}}, + {L"\U0000200d\U00000a03", {8205}, {2}}, + {L"\U0000200d\U00000308\U00000a03", {8205}, {3}}, {L"\U0000200d\U00001100", {8205, 4352}, {1, 2}}, {L"\U0000200d\U00000308\U00001100", {8205, 4352}, {2, 3}}, {L"\U0000200d\U00001160", {8205, 4448}, {1, 2}}, @@ -1229,10 +2360,24 @@ std::array, 602> data_utf16 = {{ {L"\U0000200d\U00000308\U0000ac00", {8205, 44032}, {2, 3}}, {L"\U0000200d\U0000ac01", {8205, 44033}, {1, 2}}, {L"\U0000200d\U00000308\U0000ac01", {8205, 44033}, {2, 3}}, + {L"\U0000200d\U00000900", {8205}, {2}}, + {L"\U0000200d\U00000308\U00000900", {8205}, {3}}, + {L"\U0000200d\U00000903", {8205}, {2}}, + {L"\U0000200d\U00000308\U00000903", {8205}, {3}}, + {L"\U0000200d\U00000904", {8205, 2308}, {1, 2}}, + {L"\U0000200d\U00000308\U00000904", {8205, 2308}, {2, 3}}, + {L"\U0000200d\U00000d4e", {8205, 3406}, {1, 2}}, + {L"\U0000200d\U00000308\U00000d4e", {8205, 3406}, {2, 3}}, + {L"\U0000200d\U00000915", {8205, 2325}, {1, 2}}, + {L"\U0000200d\U00000308\U00000915", {8205, 2325}, {2, 3}}, {L"\U0000200d\U0000231a", {8205, 8986}, {1, 2}}, {L"\U0000200d\U00000308\U0000231a", {8205, 8986}, {2, 3}}, {L"\U0000200d\U00000300", {8205}, {2}}, {L"\U0000200d\U00000308\U00000300", {8205}, {3}}, + {L"\U0000200d\U0000093c", {8205}, {2}}, + {L"\U0000200d\U00000308\U0000093c", {8205}, {3}}, + {L"\U0000200d\U0000094d", {8205}, {2}}, + {L"\U0000200d\U00000308\U0000094d", {8205}, {3}}, {L"\U0000200d\U0000200d", {8205}, {2}}, {L"\U0000200d\U00000308\U0000200d", {8205}, {3}}, {L"\U0000200d\U00000378", {8205, 888}, {1, 2}}, @@ -1251,8 +2396,8 @@ std::array, 602> data_utf16 = {{ {L"\U00000378\U00000308\U0001f1e6", {888, 127462}, {2, 4}}, {L"\U00000378\U00000600", {888, 1536}, {1, 2}}, {L"\U00000378\U00000308\U00000600", {888, 1536}, {2, 3}}, - {L"\U00000378\U00000903", {888}, {2}}, - {L"\U00000378\U00000308\U00000903", {888}, {3}}, + {L"\U00000378\U00000a03", {888}, {2}}, + {L"\U00000378\U00000308\U00000a03", {888}, {3}}, {L"\U00000378\U00001100", {888, 4352}, {1, 2}}, {L"\U00000378\U00000308\U00001100", {888, 4352}, {2, 3}}, {L"\U00000378\U00001160", {888, 4448}, {1, 2}}, @@ -1263,10 +2408,24 @@ std::array, 602> data_utf16 = {{ {L"\U00000378\U00000308\U0000ac00", {888, 44032}, {2, 3}}, {L"\U00000378\U0000ac01", {888, 44033}, {1, 2}}, {L"\U00000378\U00000308\U0000ac01", {888, 44033}, {2, 3}}, + {L"\U00000378\U00000900", {888}, {2}}, + {L"\U00000378\U00000308\U00000900", {888}, {3}}, + {L"\U00000378\U00000903", {888}, {2}}, + {L"\U00000378\U00000308\U00000903", {888}, {3}}, + {L"\U00000378\U00000904", {888, 2308}, {1, 2}}, + {L"\U00000378\U00000308\U00000904", {888, 2308}, {2, 3}}, + {L"\U00000378\U00000d4e", {888, 3406}, {1, 2}}, + {L"\U00000378\U00000308\U00000d4e", {888, 3406}, {2, 3}}, + {L"\U00000378\U00000915", {888, 2325}, {1, 2}}, + {L"\U00000378\U00000308\U00000915", {888, 2325}, {2, 3}}, {L"\U00000378\U0000231a", {888, 8986}, {1, 2}}, {L"\U00000378\U00000308\U0000231a", {888, 8986}, {2, 3}}, {L"\U00000378\U00000300", {888}, {2}}, {L"\U00000378\U00000308\U00000300", {888}, {3}}, + {L"\U00000378\U0000093c", {888}, {2}}, + {L"\U00000378\U00000308\U0000093c", {888}, {3}}, + {L"\U00000378\U0000094d", {888}, {2}}, + {L"\U00000378\U00000308\U0000094d", {888}, {3}}, {L"\U00000378\U0000200d", {888}, {2}}, {L"\U00000378\U00000308\U0000200d", {888}, {3}}, {L"\U00000378\U00000378", {888, 888}, {1, 2}}, @@ -1294,14 +2453,25 @@ std::array, 602> data_utf16 = {{ {L"\U0001f6d1\U0000200d\U0001f6d1", {128721}, {5}}, {L"\U00000061\U0000200d\U0001f6d1", {97, 128721}, {2, 4}}, {L"\U00002701\U0000200d\U00002701", {9985}, {3}}, - {L"\U00000061\U0000200d\U00002701", {97, 9985}, {2, 3}}}}; + {L"\U00000061\U0000200d\U00002701", {97, 9985}, {2, 3}}, + {L"\U00000915\U00000924", {2325, 2340}, {1, 2}}, + {L"\U00000915\U0000094d\U00000924", {2325}, {3}}, + {L"\U00000915\U0000094d\U0000094d\U00000924", {2325}, {4}}, + {L"\U00000915\U0000094d\U0000200d\U00000924", {2325}, {4}}, + {L"\U00000915\U0000093c\U0000200d\U0000094d\U00000924", {2325}, {5}}, + {L"\U00000915\U0000093c\U0000094d\U0000200d\U00000924", {2325}, {5}}, + {L"\U00000915\U0000094d\U00000924\U0000094d\U0000092f", {2325}, {5}}, + {L"\U00000915\U0000094d\U00000061", {2325, 97}, {2, 3}}, + {L"\U00000061\U0000094d\U00000924", {97, 2340}, {2, 3}}, + {L"\U0000003f\U0000094d\U00000924", {63, 2340}, {2, 3}}, + {L"\U00000915\U0000094d\U0000094d\U00000924", {2325}, {4}}}}; /// The data for UTF-8. /// /// Note that most of the data for the UTF-16 and UTF-32 are identical. However /// since the size of the code units differ the breaks can contain different /// values. -std::array, 602> data_utf32 = {{ +std::array, 1187> data_utf32 = {{ {L"\U00000020\U00000020", {32, 32}, {1, 2}}, {L"\U00000020\U00000308\U00000020", {32, 32}, {2, 3}}, {L"\U00000020\U0000000d", {32, 13}, {1, 2}}, @@ -1316,8 +2486,8 @@ std::array, 602> data_utf32 = {{ {L"\U00000020\U00000308\U0001f1e6", {32, 127462}, {2, 3}}, {L"\U00000020\U00000600", {32, 1536}, {1, 2}}, {L"\U00000020\U00000308\U00000600", {32, 1536}, {2, 3}}, - {L"\U00000020\U00000903", {32}, {2}}, - {L"\U00000020\U00000308\U00000903", {32}, {3}}, + {L"\U00000020\U00000a03", {32}, {2}}, + {L"\U00000020\U00000308\U00000a03", {32}, {3}}, {L"\U00000020\U00001100", {32, 4352}, {1, 2}}, {L"\U00000020\U00000308\U00001100", {32, 4352}, {2, 3}}, {L"\U00000020\U00001160", {32, 4448}, {1, 2}}, @@ -1328,10 +2498,24 @@ std::array, 602> data_utf32 = {{ {L"\U00000020\U00000308\U0000ac00", {32, 44032}, {2, 3}}, {L"\U00000020\U0000ac01", {32, 44033}, {1, 2}}, {L"\U00000020\U00000308\U0000ac01", {32, 44033}, {2, 3}}, + {L"\U00000020\U00000900", {32}, {2}}, + {L"\U00000020\U00000308\U00000900", {32}, {3}}, + {L"\U00000020\U00000903", {32}, {2}}, + {L"\U00000020\U00000308\U00000903", {32}, {3}}, + {L"\U00000020\U00000904", {32, 2308}, {1, 2}}, + {L"\U00000020\U00000308\U00000904", {32, 2308}, {2, 3}}, + {L"\U00000020\U00000d4e", {32, 3406}, {1, 2}}, + {L"\U00000020\U00000308\U00000d4e", {32, 3406}, {2, 3}}, + {L"\U00000020\U00000915", {32, 2325}, {1, 2}}, + {L"\U00000020\U00000308\U00000915", {32, 2325}, {2, 3}}, {L"\U00000020\U0000231a", {32, 8986}, {1, 2}}, {L"\U00000020\U00000308\U0000231a", {32, 8986}, {2, 3}}, {L"\U00000020\U00000300", {32}, {2}}, {L"\U00000020\U00000308\U00000300", {32}, {3}}, + {L"\U00000020\U0000093c", {32}, {2}}, + {L"\U00000020\U00000308\U0000093c", {32}, {3}}, + {L"\U00000020\U0000094d", {32}, {2}}, + {L"\U00000020\U00000308\U0000094d", {32}, {3}}, {L"\U00000020\U0000200d", {32}, {2}}, {L"\U00000020\U00000308\U0000200d", {32}, {3}}, {L"\U00000020\U00000378", {32, 888}, {1, 2}}, @@ -1350,8 +2534,8 @@ std::array, 602> data_utf32 = {{ {L"\U0000000d\U00000308\U0001f1e6", {13, 776, 127462}, {1, 2, 3}}, {L"\U0000000d\U00000600", {13, 1536}, {1, 2}}, {L"\U0000000d\U00000308\U00000600", {13, 776, 1536}, {1, 2, 3}}, - {L"\U0000000d\U00000903", {13, 2307}, {1, 2}}, - {L"\U0000000d\U00000308\U00000903", {13, 776}, {1, 3}}, + {L"\U0000000d\U00000a03", {13, 2563}, {1, 2}}, + {L"\U0000000d\U00000308\U00000a03", {13, 776}, {1, 3}}, {L"\U0000000d\U00001100", {13, 4352}, {1, 2}}, {L"\U0000000d\U00000308\U00001100", {13, 776, 4352}, {1, 2, 3}}, {L"\U0000000d\U00001160", {13, 4448}, {1, 2}}, @@ -1362,10 +2546,24 @@ std::array, 602> data_utf32 = {{ {L"\U0000000d\U00000308\U0000ac00", {13, 776, 44032}, {1, 2, 3}}, {L"\U0000000d\U0000ac01", {13, 44033}, {1, 2}}, {L"\U0000000d\U00000308\U0000ac01", {13, 776, 44033}, {1, 2, 3}}, + {L"\U0000000d\U00000900", {13, 2304}, {1, 2}}, + {L"\U0000000d\U00000308\U00000900", {13, 776}, {1, 3}}, + {L"\U0000000d\U00000903", {13, 2307}, {1, 2}}, + {L"\U0000000d\U00000308\U00000903", {13, 776}, {1, 3}}, + {L"\U0000000d\U00000904", {13, 2308}, {1, 2}}, + {L"\U0000000d\U00000308\U00000904", {13, 776, 2308}, {1, 2, 3}}, + {L"\U0000000d\U00000d4e", {13, 3406}, {1, 2}}, + {L"\U0000000d\U00000308\U00000d4e", {13, 776, 3406}, {1, 2, 3}}, + {L"\U0000000d\U00000915", {13, 2325}, {1, 2}}, + {L"\U0000000d\U00000308\U00000915", {13, 776, 2325}, {1, 2, 3}}, {L"\U0000000d\U0000231a", {13, 8986}, {1, 2}}, {L"\U0000000d\U00000308\U0000231a", {13, 776, 8986}, {1, 2, 3}}, {L"\U0000000d\U00000300", {13, 768}, {1, 2}}, {L"\U0000000d\U00000308\U00000300", {13, 776}, {1, 3}}, + {L"\U0000000d\U0000093c", {13, 2364}, {1, 2}}, + {L"\U0000000d\U00000308\U0000093c", {13, 776}, {1, 3}}, + {L"\U0000000d\U0000094d", {13, 2381}, {1, 2}}, + {L"\U0000000d\U00000308\U0000094d", {13, 776}, {1, 3}}, {L"\U0000000d\U0000200d", {13, 8205}, {1, 2}}, {L"\U0000000d\U00000308\U0000200d", {13, 776}, {1, 3}}, {L"\U0000000d\U00000378", {13, 888}, {1, 2}}, @@ -1384,8 +2582,8 @@ std::array, 602> data_utf32 = {{ {L"\U0000000a\U00000308\U0001f1e6", {10, 776, 127462}, {1, 2, 3}}, {L"\U0000000a\U00000600", {10, 1536}, {1, 2}}, {L"\U0000000a\U00000308\U00000600", {10, 776, 1536}, {1, 2, 3}}, - {L"\U0000000a\U00000903", {10, 2307}, {1, 2}}, - {L"\U0000000a\U00000308\U00000903", {10, 776}, {1, 3}}, + {L"\U0000000a\U00000a03", {10, 2563}, {1, 2}}, + {L"\U0000000a\U00000308\U00000a03", {10, 776}, {1, 3}}, {L"\U0000000a\U00001100", {10, 4352}, {1, 2}}, {L"\U0000000a\U00000308\U00001100", {10, 776, 4352}, {1, 2, 3}}, {L"\U0000000a\U00001160", {10, 4448}, {1, 2}}, @@ -1396,10 +2594,24 @@ std::array, 602> data_utf32 = {{ {L"\U0000000a\U00000308\U0000ac00", {10, 776, 44032}, {1, 2, 3}}, {L"\U0000000a\U0000ac01", {10, 44033}, {1, 2}}, {L"\U0000000a\U00000308\U0000ac01", {10, 776, 44033}, {1, 2, 3}}, + {L"\U0000000a\U00000900", {10, 2304}, {1, 2}}, + {L"\U0000000a\U00000308\U00000900", {10, 776}, {1, 3}}, + {L"\U0000000a\U00000903", {10, 2307}, {1, 2}}, + {L"\U0000000a\U00000308\U00000903", {10, 776}, {1, 3}}, + {L"\U0000000a\U00000904", {10, 2308}, {1, 2}}, + {L"\U0000000a\U00000308\U00000904", {10, 776, 2308}, {1, 2, 3}}, + {L"\U0000000a\U00000d4e", {10, 3406}, {1, 2}}, + {L"\U0000000a\U00000308\U00000d4e", {10, 776, 3406}, {1, 2, 3}}, + {L"\U0000000a\U00000915", {10, 2325}, {1, 2}}, + {L"\U0000000a\U00000308\U00000915", {10, 776, 2325}, {1, 2, 3}}, {L"\U0000000a\U0000231a", {10, 8986}, {1, 2}}, {L"\U0000000a\U00000308\U0000231a", {10, 776, 8986}, {1, 2, 3}}, {L"\U0000000a\U00000300", {10, 768}, {1, 2}}, {L"\U0000000a\U00000308\U00000300", {10, 776}, {1, 3}}, + {L"\U0000000a\U0000093c", {10, 2364}, {1, 2}}, + {L"\U0000000a\U00000308\U0000093c", {10, 776}, {1, 3}}, + {L"\U0000000a\U0000094d", {10, 2381}, {1, 2}}, + {L"\U0000000a\U00000308\U0000094d", {10, 776}, {1, 3}}, {L"\U0000000a\U0000200d", {10, 8205}, {1, 2}}, {L"\U0000000a\U00000308\U0000200d", {10, 776}, {1, 3}}, {L"\U0000000a\U00000378", {10, 888}, {1, 2}}, @@ -1418,8 +2630,8 @@ std::array, 602> data_utf32 = {{ {L"\U00000001\U00000308\U0001f1e6", {1, 776, 127462}, {1, 2, 3}}, {L"\U00000001\U00000600", {1, 1536}, {1, 2}}, {L"\U00000001\U00000308\U00000600", {1, 776, 1536}, {1, 2, 3}}, - {L"\U00000001\U00000903", {1, 2307}, {1, 2}}, - {L"\U00000001\U00000308\U00000903", {1, 776}, {1, 3}}, + {L"\U00000001\U00000a03", {1, 2563}, {1, 2}}, + {L"\U00000001\U00000308\U00000a03", {1, 776}, {1, 3}}, {L"\U00000001\U00001100", {1, 4352}, {1, 2}}, {L"\U00000001\U00000308\U00001100", {1, 776, 4352}, {1, 2, 3}}, {L"\U00000001\U00001160", {1, 4448}, {1, 2}}, @@ -1430,10 +2642,24 @@ std::array, 602> data_utf32 = {{ {L"\U00000001\U00000308\U0000ac00", {1, 776, 44032}, {1, 2, 3}}, {L"\U00000001\U0000ac01", {1, 44033}, {1, 2}}, {L"\U00000001\U00000308\U0000ac01", {1, 776, 44033}, {1, 2, 3}}, + {L"\U00000001\U00000900", {1, 2304}, {1, 2}}, + {L"\U00000001\U00000308\U00000900", {1, 776}, {1, 3}}, + {L"\U00000001\U00000903", {1, 2307}, {1, 2}}, + {L"\U00000001\U00000308\U00000903", {1, 776}, {1, 3}}, + {L"\U00000001\U00000904", {1, 2308}, {1, 2}}, + {L"\U00000001\U00000308\U00000904", {1, 776, 2308}, {1, 2, 3}}, + {L"\U00000001\U00000d4e", {1, 3406}, {1, 2}}, + {L"\U00000001\U00000308\U00000d4e", {1, 776, 3406}, {1, 2, 3}}, + {L"\U00000001\U00000915", {1, 2325}, {1, 2}}, + {L"\U00000001\U00000308\U00000915", {1, 776, 2325}, {1, 2, 3}}, {L"\U00000001\U0000231a", {1, 8986}, {1, 2}}, {L"\U00000001\U00000308\U0000231a", {1, 776, 8986}, {1, 2, 3}}, {L"\U00000001\U00000300", {1, 768}, {1, 2}}, {L"\U00000001\U00000308\U00000300", {1, 776}, {1, 3}}, + {L"\U00000001\U0000093c", {1, 2364}, {1, 2}}, + {L"\U00000001\U00000308\U0000093c", {1, 776}, {1, 3}}, + {L"\U00000001\U0000094d", {1, 2381}, {1, 2}}, + {L"\U00000001\U00000308\U0000094d", {1, 776}, {1, 3}}, {L"\U00000001\U0000200d", {1, 8205}, {1, 2}}, {L"\U00000001\U00000308\U0000200d", {1, 776}, {1, 3}}, {L"\U00000001\U00000378", {1, 888}, {1, 2}}, @@ -1452,8 +2678,8 @@ std::array, 602> data_utf32 = {{ {L"\U0000034f\U00000308\U0001f1e6", {847, 127462}, {2, 3}}, {L"\U0000034f\U00000600", {847, 1536}, {1, 2}}, {L"\U0000034f\U00000308\U00000600", {847, 1536}, {2, 3}}, - {L"\U0000034f\U00000903", {847}, {2}}, - {L"\U0000034f\U00000308\U00000903", {847}, {3}}, + {L"\U0000034f\U00000a03", {847}, {2}}, + {L"\U0000034f\U00000308\U00000a03", {847}, {3}}, {L"\U0000034f\U00001100", {847, 4352}, {1, 2}}, {L"\U0000034f\U00000308\U00001100", {847, 4352}, {2, 3}}, {L"\U0000034f\U00001160", {847, 4448}, {1, 2}}, @@ -1464,10 +2690,24 @@ std::array, 602> data_utf32 = {{ {L"\U0000034f\U00000308\U0000ac00", {847, 44032}, {2, 3}}, {L"\U0000034f\U0000ac01", {847, 44033}, {1, 2}}, {L"\U0000034f\U00000308\U0000ac01", {847, 44033}, {2, 3}}, + {L"\U0000034f\U00000900", {847}, {2}}, + {L"\U0000034f\U00000308\U00000900", {847}, {3}}, + {L"\U0000034f\U00000903", {847}, {2}}, + {L"\U0000034f\U00000308\U00000903", {847}, {3}}, + {L"\U0000034f\U00000904", {847, 2308}, {1, 2}}, + {L"\U0000034f\U00000308\U00000904", {847, 2308}, {2, 3}}, + {L"\U0000034f\U00000d4e", {847, 3406}, {1, 2}}, + {L"\U0000034f\U00000308\U00000d4e", {847, 3406}, {2, 3}}, + {L"\U0000034f\U00000915", {847, 2325}, {1, 2}}, + {L"\U0000034f\U00000308\U00000915", {847, 2325}, {2, 3}}, {L"\U0000034f\U0000231a", {847, 8986}, {1, 2}}, {L"\U0000034f\U00000308\U0000231a", {847, 8986}, {2, 3}}, {L"\U0000034f\U00000300", {847}, {2}}, {L"\U0000034f\U00000308\U00000300", {847}, {3}}, + {L"\U0000034f\U0000093c", {847}, {2}}, + {L"\U0000034f\U00000308\U0000093c", {847}, {3}}, + {L"\U0000034f\U0000094d", {847}, {2}}, + {L"\U0000034f\U00000308\U0000094d", {847}, {3}}, {L"\U0000034f\U0000200d", {847}, {2}}, {L"\U0000034f\U00000308\U0000200d", {847}, {3}}, {L"\U0000034f\U00000378", {847, 888}, {1, 2}}, @@ -1486,8 +2726,8 @@ std::array, 602> data_utf32 = {{ {L"\U0001f1e6\U00000308\U0001f1e6", {127462, 127462}, {2, 3}}, {L"\U0001f1e6\U00000600", {127462, 1536}, {1, 2}}, {L"\U0001f1e6\U00000308\U00000600", {127462, 1536}, {2, 3}}, - {L"\U0001f1e6\U00000903", {127462}, {2}}, - {L"\U0001f1e6\U00000308\U00000903", {127462}, {3}}, + {L"\U0001f1e6\U00000a03", {127462}, {2}}, + {L"\U0001f1e6\U00000308\U00000a03", {127462}, {3}}, {L"\U0001f1e6\U00001100", {127462, 4352}, {1, 2}}, {L"\U0001f1e6\U00000308\U00001100", {127462, 4352}, {2, 3}}, {L"\U0001f1e6\U00001160", {127462, 4448}, {1, 2}}, @@ -1498,10 +2738,24 @@ std::array, 602> data_utf32 = {{ {L"\U0001f1e6\U00000308\U0000ac00", {127462, 44032}, {2, 3}}, {L"\U0001f1e6\U0000ac01", {127462, 44033}, {1, 2}}, {L"\U0001f1e6\U00000308\U0000ac01", {127462, 44033}, {2, 3}}, + {L"\U0001f1e6\U00000900", {127462}, {2}}, + {L"\U0001f1e6\U00000308\U00000900", {127462}, {3}}, + {L"\U0001f1e6\U00000903", {127462}, {2}}, + {L"\U0001f1e6\U00000308\U00000903", {127462}, {3}}, + {L"\U0001f1e6\U00000904", {127462, 2308}, {1, 2}}, + {L"\U0001f1e6\U00000308\U00000904", {127462, 2308}, {2, 3}}, + {L"\U0001f1e6\U00000d4e", {127462, 3406}, {1, 2}}, + {L"\U0001f1e6\U00000308\U00000d4e", {127462, 3406}, {2, 3}}, + {L"\U0001f1e6\U00000915", {127462, 2325}, {1, 2}}, + {L"\U0001f1e6\U00000308\U00000915", {127462, 2325}, {2, 3}}, {L"\U0001f1e6\U0000231a", {127462, 8986}, {1, 2}}, {L"\U0001f1e6\U00000308\U0000231a", {127462, 8986}, {2, 3}}, {L"\U0001f1e6\U00000300", {127462}, {2}}, {L"\U0001f1e6\U00000308\U00000300", {127462}, {3}}, + {L"\U0001f1e6\U0000093c", {127462}, {2}}, + {L"\U0001f1e6\U00000308\U0000093c", {127462}, {3}}, + {L"\U0001f1e6\U0000094d", {127462}, {2}}, + {L"\U0001f1e6\U00000308\U0000094d", {127462}, {3}}, {L"\U0001f1e6\U0000200d", {127462}, {2}}, {L"\U0001f1e6\U00000308\U0000200d", {127462}, {3}}, {L"\U0001f1e6\U00000378", {127462, 888}, {1, 2}}, @@ -1520,8 +2774,8 @@ std::array, 602> data_utf32 = {{ {L"\U00000600\U00000308\U0001f1e6", {1536, 127462}, {2, 3}}, {L"\U00000600\U00000600", {1536}, {2}}, {L"\U00000600\U00000308\U00000600", {1536, 1536}, {2, 3}}, - {L"\U00000600\U00000903", {1536}, {2}}, - {L"\U00000600\U00000308\U00000903", {1536}, {3}}, + {L"\U00000600\U00000a03", {1536}, {2}}, + {L"\U00000600\U00000308\U00000a03", {1536}, {3}}, {L"\U00000600\U00001100", {1536}, {2}}, {L"\U00000600\U00000308\U00001100", {1536, 4352}, {2, 3}}, {L"\U00000600\U00001160", {1536}, {2}}, @@ -1532,48 +2786,76 @@ std::array, 602> data_utf32 = {{ {L"\U00000600\U00000308\U0000ac00", {1536, 44032}, {2, 3}}, {L"\U00000600\U0000ac01", {1536}, {2}}, {L"\U00000600\U00000308\U0000ac01", {1536, 44033}, {2, 3}}, + {L"\U00000600\U00000900", {1536}, {2}}, + {L"\U00000600\U00000308\U00000900", {1536}, {3}}, + {L"\U00000600\U00000903", {1536}, {2}}, + {L"\U00000600\U00000308\U00000903", {1536}, {3}}, + {L"\U00000600\U00000904", {1536}, {2}}, + {L"\U00000600\U00000308\U00000904", {1536, 2308}, {2, 3}}, + {L"\U00000600\U00000d4e", {1536}, {2}}, + {L"\U00000600\U00000308\U00000d4e", {1536, 3406}, {2, 3}}, + {L"\U00000600\U00000915", {1536}, {2}}, + {L"\U00000600\U00000308\U00000915", {1536, 2325}, {2, 3}}, {L"\U00000600\U0000231a", {1536}, {2}}, {L"\U00000600\U00000308\U0000231a", {1536, 8986}, {2, 3}}, {L"\U00000600\U00000300", {1536}, {2}}, {L"\U00000600\U00000308\U00000300", {1536}, {3}}, + {L"\U00000600\U0000093c", {1536}, {2}}, + {L"\U00000600\U00000308\U0000093c", {1536}, {3}}, + {L"\U00000600\U0000094d", {1536}, {2}}, + {L"\U00000600\U00000308\U0000094d", {1536}, {3}}, {L"\U00000600\U0000200d", {1536}, {2}}, {L"\U00000600\U00000308\U0000200d", {1536}, {3}}, {L"\U00000600\U00000378", {1536}, {2}}, {L"\U00000600\U00000308\U00000378", {1536, 888}, {2, 3}}, - {L"\U00000903\U00000020", {2307, 32}, {1, 2}}, - {L"\U00000903\U00000308\U00000020", {2307, 32}, {2, 3}}, - {L"\U00000903\U0000000d", {2307, 13}, {1, 2}}, - {L"\U00000903\U00000308\U0000000d", {2307, 13}, {2, 3}}, - {L"\U00000903\U0000000a", {2307, 10}, {1, 2}}, - {L"\U00000903\U00000308\U0000000a", {2307, 10}, {2, 3}}, - {L"\U00000903\U00000001", {2307, 1}, {1, 2}}, - {L"\U00000903\U00000308\U00000001", {2307, 1}, {2, 3}}, - {L"\U00000903\U0000034f", {2307}, {2}}, - {L"\U00000903\U00000308\U0000034f", {2307}, {3}}, - {L"\U00000903\U0001f1e6", {2307, 127462}, {1, 2}}, - {L"\U00000903\U00000308\U0001f1e6", {2307, 127462}, {2, 3}}, - {L"\U00000903\U00000600", {2307, 1536}, {1, 2}}, - {L"\U00000903\U00000308\U00000600", {2307, 1536}, {2, 3}}, - {L"\U00000903\U00000903", {2307}, {2}}, - {L"\U00000903\U00000308\U00000903", {2307}, {3}}, - {L"\U00000903\U00001100", {2307, 4352}, {1, 2}}, - {L"\U00000903\U00000308\U00001100", {2307, 4352}, {2, 3}}, - {L"\U00000903\U00001160", {2307, 4448}, {1, 2}}, - {L"\U00000903\U00000308\U00001160", {2307, 4448}, {2, 3}}, - {L"\U00000903\U000011a8", {2307, 4520}, {1, 2}}, - {L"\U00000903\U00000308\U000011a8", {2307, 4520}, {2, 3}}, - {L"\U00000903\U0000ac00", {2307, 44032}, {1, 2}}, - {L"\U00000903\U00000308\U0000ac00", {2307, 44032}, {2, 3}}, - {L"\U00000903\U0000ac01", {2307, 44033}, {1, 2}}, - {L"\U00000903\U00000308\U0000ac01", {2307, 44033}, {2, 3}}, - {L"\U00000903\U0000231a", {2307, 8986}, {1, 2}}, - {L"\U00000903\U00000308\U0000231a", {2307, 8986}, {2, 3}}, - {L"\U00000903\U00000300", {2307}, {2}}, - {L"\U00000903\U00000308\U00000300", {2307}, {3}}, - {L"\U00000903\U0000200d", {2307}, {2}}, - {L"\U00000903\U00000308\U0000200d", {2307}, {3}}, - {L"\U00000903\U00000378", {2307, 888}, {1, 2}}, - {L"\U00000903\U00000308\U00000378", {2307, 888}, {2, 3}}, + {L"\U00000a03\U00000020", {2563, 32}, {1, 2}}, + {L"\U00000a03\U00000308\U00000020", {2563, 32}, {2, 3}}, + {L"\U00000a03\U0000000d", {2563, 13}, {1, 2}}, + {L"\U00000a03\U00000308\U0000000d", {2563, 13}, {2, 3}}, + {L"\U00000a03\U0000000a", {2563, 10}, {1, 2}}, + {L"\U00000a03\U00000308\U0000000a", {2563, 10}, {2, 3}}, + {L"\U00000a03\U00000001", {2563, 1}, {1, 2}}, + {L"\U00000a03\U00000308\U00000001", {2563, 1}, {2, 3}}, + {L"\U00000a03\U0000034f", {2563}, {2}}, + {L"\U00000a03\U00000308\U0000034f", {2563}, {3}}, + {L"\U00000a03\U0001f1e6", {2563, 127462}, {1, 2}}, + {L"\U00000a03\U00000308\U0001f1e6", {2563, 127462}, {2, 3}}, + {L"\U00000a03\U00000600", {2563, 1536}, {1, 2}}, + {L"\U00000a03\U00000308\U00000600", {2563, 1536}, {2, 3}}, + {L"\U00000a03\U00000a03", {2563}, {2}}, + {L"\U00000a03\U00000308\U00000a03", {2563}, {3}}, + {L"\U00000a03\U00001100", {2563, 4352}, {1, 2}}, + {L"\U00000a03\U00000308\U00001100", {2563, 4352}, {2, 3}}, + {L"\U00000a03\U00001160", {2563, 4448}, {1, 2}}, + {L"\U00000a03\U00000308\U00001160", {2563, 4448}, {2, 3}}, + {L"\U00000a03\U000011a8", {2563, 4520}, {1, 2}}, + {L"\U00000a03\U00000308\U000011a8", {2563, 4520}, {2, 3}}, + {L"\U00000a03\U0000ac00", {2563, 44032}, {1, 2}}, + {L"\U00000a03\U00000308\U0000ac00", {2563, 44032}, {2, 3}}, + {L"\U00000a03\U0000ac01", {2563, 44033}, {1, 2}}, + {L"\U00000a03\U00000308\U0000ac01", {2563, 44033}, {2, 3}}, + {L"\U00000a03\U00000900", {2563}, {2}}, + {L"\U00000a03\U00000308\U00000900", {2563}, {3}}, + {L"\U00000a03\U00000903", {2563}, {2}}, + {L"\U00000a03\U00000308\U00000903", {2563}, {3}}, + {L"\U00000a03\U00000904", {2563, 2308}, {1, 2}}, + {L"\U00000a03\U00000308\U00000904", {2563, 2308}, {2, 3}}, + {L"\U00000a03\U00000d4e", {2563, 3406}, {1, 2}}, + {L"\U00000a03\U00000308\U00000d4e", {2563, 3406}, {2, 3}}, + {L"\U00000a03\U00000915", {2563, 2325}, {1, 2}}, + {L"\U00000a03\U00000308\U00000915", {2563, 2325}, {2, 3}}, + {L"\U00000a03\U0000231a", {2563, 8986}, {1, 2}}, + {L"\U00000a03\U00000308\U0000231a", {2563, 8986}, {2, 3}}, + {L"\U00000a03\U00000300", {2563}, {2}}, + {L"\U00000a03\U00000308\U00000300", {2563}, {3}}, + {L"\U00000a03\U0000093c", {2563}, {2}}, + {L"\U00000a03\U00000308\U0000093c", {2563}, {3}}, + {L"\U00000a03\U0000094d", {2563}, {2}}, + {L"\U00000a03\U00000308\U0000094d", {2563}, {3}}, + {L"\U00000a03\U0000200d", {2563}, {2}}, + {L"\U00000a03\U00000308\U0000200d", {2563}, {3}}, + {L"\U00000a03\U00000378", {2563, 888}, {1, 2}}, + {L"\U00000a03\U00000308\U00000378", {2563, 888}, {2, 3}}, {L"\U00001100\U00000020", {4352, 32}, {1, 2}}, {L"\U00001100\U00000308\U00000020", {4352, 32}, {2, 3}}, {L"\U00001100\U0000000d", {4352, 13}, {1, 2}}, @@ -1588,8 +2870,8 @@ std::array, 602> data_utf32 = {{ {L"\U00001100\U00000308\U0001f1e6", {4352, 127462}, {2, 3}}, {L"\U00001100\U00000600", {4352, 1536}, {1, 2}}, {L"\U00001100\U00000308\U00000600", {4352, 1536}, {2, 3}}, - {L"\U00001100\U00000903", {4352}, {2}}, - {L"\U00001100\U00000308\U00000903", {4352}, {3}}, + {L"\U00001100\U00000a03", {4352}, {2}}, + {L"\U00001100\U00000308\U00000a03", {4352}, {3}}, {L"\U00001100\U00001100", {4352}, {2}}, {L"\U00001100\U00000308\U00001100", {4352, 4352}, {2, 3}}, {L"\U00001100\U00001160", {4352}, {2}}, @@ -1600,10 +2882,24 @@ std::array, 602> data_utf32 = {{ {L"\U00001100\U00000308\U0000ac00", {4352, 44032}, {2, 3}}, {L"\U00001100\U0000ac01", {4352}, {2}}, {L"\U00001100\U00000308\U0000ac01", {4352, 44033}, {2, 3}}, + {L"\U00001100\U00000900", {4352}, {2}}, + {L"\U00001100\U00000308\U00000900", {4352}, {3}}, + {L"\U00001100\U00000903", {4352}, {2}}, + {L"\U00001100\U00000308\U00000903", {4352}, {3}}, + {L"\U00001100\U00000904", {4352, 2308}, {1, 2}}, + {L"\U00001100\U00000308\U00000904", {4352, 2308}, {2, 3}}, + {L"\U00001100\U00000d4e", {4352, 3406}, {1, 2}}, + {L"\U00001100\U00000308\U00000d4e", {4352, 3406}, {2, 3}}, + {L"\U00001100\U00000915", {4352, 2325}, {1, 2}}, + {L"\U00001100\U00000308\U00000915", {4352, 2325}, {2, 3}}, {L"\U00001100\U0000231a", {4352, 8986}, {1, 2}}, {L"\U00001100\U00000308\U0000231a", {4352, 8986}, {2, 3}}, {L"\U00001100\U00000300", {4352}, {2}}, {L"\U00001100\U00000308\U00000300", {4352}, {3}}, + {L"\U00001100\U0000093c", {4352}, {2}}, + {L"\U00001100\U00000308\U0000093c", {4352}, {3}}, + {L"\U00001100\U0000094d", {4352}, {2}}, + {L"\U00001100\U00000308\U0000094d", {4352}, {3}}, {L"\U00001100\U0000200d", {4352}, {2}}, {L"\U00001100\U00000308\U0000200d", {4352}, {3}}, {L"\U00001100\U00000378", {4352, 888}, {1, 2}}, @@ -1622,8 +2918,8 @@ std::array, 602> data_utf32 = {{ {L"\U00001160\U00000308\U0001f1e6", {4448, 127462}, {2, 3}}, {L"\U00001160\U00000600", {4448, 1536}, {1, 2}}, {L"\U00001160\U00000308\U00000600", {4448, 1536}, {2, 3}}, - {L"\U00001160\U00000903", {4448}, {2}}, - {L"\U00001160\U00000308\U00000903", {4448}, {3}}, + {L"\U00001160\U00000a03", {4448}, {2}}, + {L"\U00001160\U00000308\U00000a03", {4448}, {3}}, {L"\U00001160\U00001100", {4448, 4352}, {1, 2}}, {L"\U00001160\U00000308\U00001100", {4448, 4352}, {2, 3}}, {L"\U00001160\U00001160", {4448}, {2}}, @@ -1634,10 +2930,24 @@ std::array, 602> data_utf32 = {{ {L"\U00001160\U00000308\U0000ac00", {4448, 44032}, {2, 3}}, {L"\U00001160\U0000ac01", {4448, 44033}, {1, 2}}, {L"\U00001160\U00000308\U0000ac01", {4448, 44033}, {2, 3}}, + {L"\U00001160\U00000900", {4448}, {2}}, + {L"\U00001160\U00000308\U00000900", {4448}, {3}}, + {L"\U00001160\U00000903", {4448}, {2}}, + {L"\U00001160\U00000308\U00000903", {4448}, {3}}, + {L"\U00001160\U00000904", {4448, 2308}, {1, 2}}, + {L"\U00001160\U00000308\U00000904", {4448, 2308}, {2, 3}}, + {L"\U00001160\U00000d4e", {4448, 3406}, {1, 2}}, + {L"\U00001160\U00000308\U00000d4e", {4448, 3406}, {2, 3}}, + {L"\U00001160\U00000915", {4448, 2325}, {1, 2}}, + {L"\U00001160\U00000308\U00000915", {4448, 2325}, {2, 3}}, {L"\U00001160\U0000231a", {4448, 8986}, {1, 2}}, {L"\U00001160\U00000308\U0000231a", {4448, 8986}, {2, 3}}, {L"\U00001160\U00000300", {4448}, {2}}, {L"\U00001160\U00000308\U00000300", {4448}, {3}}, + {L"\U00001160\U0000093c", {4448}, {2}}, + {L"\U00001160\U00000308\U0000093c", {4448}, {3}}, + {L"\U00001160\U0000094d", {4448}, {2}}, + {L"\U00001160\U00000308\U0000094d", {4448}, {3}}, {L"\U00001160\U0000200d", {4448}, {2}}, {L"\U00001160\U00000308\U0000200d", {4448}, {3}}, {L"\U00001160\U00000378", {4448, 888}, {1, 2}}, @@ -1656,8 +2966,8 @@ std::array, 602> data_utf32 = {{ {L"\U000011a8\U00000308\U0001f1e6", {4520, 127462}, {2, 3}}, {L"\U000011a8\U00000600", {4520, 1536}, {1, 2}}, {L"\U000011a8\U00000308\U00000600", {4520, 1536}, {2, 3}}, - {L"\U000011a8\U00000903", {4520}, {2}}, - {L"\U000011a8\U00000308\U00000903", {4520}, {3}}, + {L"\U000011a8\U00000a03", {4520}, {2}}, + {L"\U000011a8\U00000308\U00000a03", {4520}, {3}}, {L"\U000011a8\U00001100", {4520, 4352}, {1, 2}}, {L"\U000011a8\U00000308\U00001100", {4520, 4352}, {2, 3}}, {L"\U000011a8\U00001160", {4520, 4448}, {1, 2}}, @@ -1668,10 +2978,24 @@ std::array, 602> data_utf32 = {{ {L"\U000011a8\U00000308\U0000ac00", {4520, 44032}, {2, 3}}, {L"\U000011a8\U0000ac01", {4520, 44033}, {1, 2}}, {L"\U000011a8\U00000308\U0000ac01", {4520, 44033}, {2, 3}}, + {L"\U000011a8\U00000900", {4520}, {2}}, + {L"\U000011a8\U00000308\U00000900", {4520}, {3}}, + {L"\U000011a8\U00000903", {4520}, {2}}, + {L"\U000011a8\U00000308\U00000903", {4520}, {3}}, + {L"\U000011a8\U00000904", {4520, 2308}, {1, 2}}, + {L"\U000011a8\U00000308\U00000904", {4520, 2308}, {2, 3}}, + {L"\U000011a8\U00000d4e", {4520, 3406}, {1, 2}}, + {L"\U000011a8\U00000308\U00000d4e", {4520, 3406}, {2, 3}}, + {L"\U000011a8\U00000915", {4520, 2325}, {1, 2}}, + {L"\U000011a8\U00000308\U00000915", {4520, 2325}, {2, 3}}, {L"\U000011a8\U0000231a", {4520, 8986}, {1, 2}}, {L"\U000011a8\U00000308\U0000231a", {4520, 8986}, {2, 3}}, {L"\U000011a8\U00000300", {4520}, {2}}, {L"\U000011a8\U00000308\U00000300", {4520}, {3}}, + {L"\U000011a8\U0000093c", {4520}, {2}}, + {L"\U000011a8\U00000308\U0000093c", {4520}, {3}}, + {L"\U000011a8\U0000094d", {4520}, {2}}, + {L"\U000011a8\U00000308\U0000094d", {4520}, {3}}, {L"\U000011a8\U0000200d", {4520}, {2}}, {L"\U000011a8\U00000308\U0000200d", {4520}, {3}}, {L"\U000011a8\U00000378", {4520, 888}, {1, 2}}, @@ -1690,8 +3014,8 @@ std::array, 602> data_utf32 = {{ {L"\U0000ac00\U00000308\U0001f1e6", {44032, 127462}, {2, 3}}, {L"\U0000ac00\U00000600", {44032, 1536}, {1, 2}}, {L"\U0000ac00\U00000308\U00000600", {44032, 1536}, {2, 3}}, - {L"\U0000ac00\U00000903", {44032}, {2}}, - {L"\U0000ac00\U00000308\U00000903", {44032}, {3}}, + {L"\U0000ac00\U00000a03", {44032}, {2}}, + {L"\U0000ac00\U00000308\U00000a03", {44032}, {3}}, {L"\U0000ac00\U00001100", {44032, 4352}, {1, 2}}, {L"\U0000ac00\U00000308\U00001100", {44032, 4352}, {2, 3}}, {L"\U0000ac00\U00001160", {44032}, {2}}, @@ -1702,10 +3026,24 @@ std::array, 602> data_utf32 = {{ {L"\U0000ac00\U00000308\U0000ac00", {44032, 44032}, {2, 3}}, {L"\U0000ac00\U0000ac01", {44032, 44033}, {1, 2}}, {L"\U0000ac00\U00000308\U0000ac01", {44032, 44033}, {2, 3}}, + {L"\U0000ac00\U00000900", {44032}, {2}}, + {L"\U0000ac00\U00000308\U00000900", {44032}, {3}}, + {L"\U0000ac00\U00000903", {44032}, {2}}, + {L"\U0000ac00\U00000308\U00000903", {44032}, {3}}, + {L"\U0000ac00\U00000904", {44032, 2308}, {1, 2}}, + {L"\U0000ac00\U00000308\U00000904", {44032, 2308}, {2, 3}}, + {L"\U0000ac00\U00000d4e", {44032, 3406}, {1, 2}}, + {L"\U0000ac00\U00000308\U00000d4e", {44032, 3406}, {2, 3}}, + {L"\U0000ac00\U00000915", {44032, 2325}, {1, 2}}, + {L"\U0000ac00\U00000308\U00000915", {44032, 2325}, {2, 3}}, {L"\U0000ac00\U0000231a", {44032, 8986}, {1, 2}}, {L"\U0000ac00\U00000308\U0000231a", {44032, 8986}, {2, 3}}, {L"\U0000ac00\U00000300", {44032}, {2}}, {L"\U0000ac00\U00000308\U00000300", {44032}, {3}}, + {L"\U0000ac00\U0000093c", {44032}, {2}}, + {L"\U0000ac00\U00000308\U0000093c", {44032}, {3}}, + {L"\U0000ac00\U0000094d", {44032}, {2}}, + {L"\U0000ac00\U00000308\U0000094d", {44032}, {3}}, {L"\U0000ac00\U0000200d", {44032}, {2}}, {L"\U0000ac00\U00000308\U0000200d", {44032}, {3}}, {L"\U0000ac00\U00000378", {44032, 888}, {1, 2}}, @@ -1724,8 +3062,8 @@ std::array, 602> data_utf32 = {{ {L"\U0000ac01\U00000308\U0001f1e6", {44033, 127462}, {2, 3}}, {L"\U0000ac01\U00000600", {44033, 1536}, {1, 2}}, {L"\U0000ac01\U00000308\U00000600", {44033, 1536}, {2, 3}}, - {L"\U0000ac01\U00000903", {44033}, {2}}, - {L"\U0000ac01\U00000308\U00000903", {44033}, {3}}, + {L"\U0000ac01\U00000a03", {44033}, {2}}, + {L"\U0000ac01\U00000308\U00000a03", {44033}, {3}}, {L"\U0000ac01\U00001100", {44033, 4352}, {1, 2}}, {L"\U0000ac01\U00000308\U00001100", {44033, 4352}, {2, 3}}, {L"\U0000ac01\U00001160", {44033, 4448}, {1, 2}}, @@ -1736,14 +3074,268 @@ std::array, 602> data_utf32 = {{ {L"\U0000ac01\U00000308\U0000ac00", {44033, 44032}, {2, 3}}, {L"\U0000ac01\U0000ac01", {44033, 44033}, {1, 2}}, {L"\U0000ac01\U00000308\U0000ac01", {44033, 44033}, {2, 3}}, + {L"\U0000ac01\U00000900", {44033}, {2}}, + {L"\U0000ac01\U00000308\U00000900", {44033}, {3}}, + {L"\U0000ac01\U00000903", {44033}, {2}}, + {L"\U0000ac01\U00000308\U00000903", {44033}, {3}}, + {L"\U0000ac01\U00000904", {44033, 2308}, {1, 2}}, + {L"\U0000ac01\U00000308\U00000904", {44033, 2308}, {2, 3}}, + {L"\U0000ac01\U00000d4e", {44033, 3406}, {1, 2}}, + {L"\U0000ac01\U00000308\U00000d4e", {44033, 3406}, {2, 3}}, + {L"\U0000ac01\U00000915", {44033, 2325}, {1, 2}}, + {L"\U0000ac01\U00000308\U00000915", {44033, 2325}, {2, 3}}, {L"\U0000ac01\U0000231a", {44033, 8986}, {1, 2}}, {L"\U0000ac01\U00000308\U0000231a", {44033, 8986}, {2, 3}}, {L"\U0000ac01\U00000300", {44033}, {2}}, {L"\U0000ac01\U00000308\U00000300", {44033}, {3}}, + {L"\U0000ac01\U0000093c", {44033}, {2}}, + {L"\U0000ac01\U00000308\U0000093c", {44033}, {3}}, + {L"\U0000ac01\U0000094d", {44033}, {2}}, + {L"\U0000ac01\U00000308\U0000094d", {44033}, {3}}, {L"\U0000ac01\U0000200d", {44033}, {2}}, {L"\U0000ac01\U00000308\U0000200d", {44033}, {3}}, {L"\U0000ac01\U00000378", {44033, 888}, {1, 2}}, {L"\U0000ac01\U00000308\U00000378", {44033, 888}, {2, 3}}, + {L"\U00000900\U00000020", {2304, 32}, {1, 2}}, + {L"\U00000900\U00000308\U00000020", {2304, 32}, {2, 3}}, + {L"\U00000900\U0000000d", {2304, 13}, {1, 2}}, + {L"\U00000900\U00000308\U0000000d", {2304, 13}, {2, 3}}, + {L"\U00000900\U0000000a", {2304, 10}, {1, 2}}, + {L"\U00000900\U00000308\U0000000a", {2304, 10}, {2, 3}}, + {L"\U00000900\U00000001", {2304, 1}, {1, 2}}, + {L"\U00000900\U00000308\U00000001", {2304, 1}, {2, 3}}, + {L"\U00000900\U0000034f", {2304}, {2}}, + {L"\U00000900\U00000308\U0000034f", {2304}, {3}}, + {L"\U00000900\U0001f1e6", {2304, 127462}, {1, 2}}, + {L"\U00000900\U00000308\U0001f1e6", {2304, 127462}, {2, 3}}, + {L"\U00000900\U00000600", {2304, 1536}, {1, 2}}, + {L"\U00000900\U00000308\U00000600", {2304, 1536}, {2, 3}}, + {L"\U00000900\U00000a03", {2304}, {2}}, + {L"\U00000900\U00000308\U00000a03", {2304}, {3}}, + {L"\U00000900\U00001100", {2304, 4352}, {1, 2}}, + {L"\U00000900\U00000308\U00001100", {2304, 4352}, {2, 3}}, + {L"\U00000900\U00001160", {2304, 4448}, {1, 2}}, + {L"\U00000900\U00000308\U00001160", {2304, 4448}, {2, 3}}, + {L"\U00000900\U000011a8", {2304, 4520}, {1, 2}}, + {L"\U00000900\U00000308\U000011a8", {2304, 4520}, {2, 3}}, + {L"\U00000900\U0000ac00", {2304, 44032}, {1, 2}}, + {L"\U00000900\U00000308\U0000ac00", {2304, 44032}, {2, 3}}, + {L"\U00000900\U0000ac01", {2304, 44033}, {1, 2}}, + {L"\U00000900\U00000308\U0000ac01", {2304, 44033}, {2, 3}}, + {L"\U00000900\U00000900", {2304}, {2}}, + {L"\U00000900\U00000308\U00000900", {2304}, {3}}, + {L"\U00000900\U00000903", {2304}, {2}}, + {L"\U00000900\U00000308\U00000903", {2304}, {3}}, + {L"\U00000900\U00000904", {2304, 2308}, {1, 2}}, + {L"\U00000900\U00000308\U00000904", {2304, 2308}, {2, 3}}, + {L"\U00000900\U00000d4e", {2304, 3406}, {1, 2}}, + {L"\U00000900\U00000308\U00000d4e", {2304, 3406}, {2, 3}}, + {L"\U00000900\U00000915", {2304, 2325}, {1, 2}}, + {L"\U00000900\U00000308\U00000915", {2304, 2325}, {2, 3}}, + {L"\U00000900\U0000231a", {2304, 8986}, {1, 2}}, + {L"\U00000900\U00000308\U0000231a", {2304, 8986}, {2, 3}}, + {L"\U00000900\U00000300", {2304}, {2}}, + {L"\U00000900\U00000308\U00000300", {2304}, {3}}, + {L"\U00000900\U0000093c", {2304}, {2}}, + {L"\U00000900\U00000308\U0000093c", {2304}, {3}}, + {L"\U00000900\U0000094d", {2304}, {2}}, + {L"\U00000900\U00000308\U0000094d", {2304}, {3}}, + {L"\U00000900\U0000200d", {2304}, {2}}, + {L"\U00000900\U00000308\U0000200d", {2304}, {3}}, + {L"\U00000900\U00000378", {2304, 888}, {1, 2}}, + {L"\U00000900\U00000308\U00000378", {2304, 888}, {2, 3}}, + {L"\U00000903\U00000020", {2307, 32}, {1, 2}}, + {L"\U00000903\U00000308\U00000020", {2307, 32}, {2, 3}}, + {L"\U00000903\U0000000d", {2307, 13}, {1, 2}}, + {L"\U00000903\U00000308\U0000000d", {2307, 13}, {2, 3}}, + {L"\U00000903\U0000000a", {2307, 10}, {1, 2}}, + {L"\U00000903\U00000308\U0000000a", {2307, 10}, {2, 3}}, + {L"\U00000903\U00000001", {2307, 1}, {1, 2}}, + {L"\U00000903\U00000308\U00000001", {2307, 1}, {2, 3}}, + {L"\U00000903\U0000034f", {2307}, {2}}, + {L"\U00000903\U00000308\U0000034f", {2307}, {3}}, + {L"\U00000903\U0001f1e6", {2307, 127462}, {1, 2}}, + {L"\U00000903\U00000308\U0001f1e6", {2307, 127462}, {2, 3}}, + {L"\U00000903\U00000600", {2307, 1536}, {1, 2}}, + {L"\U00000903\U00000308\U00000600", {2307, 1536}, {2, 3}}, + {L"\U00000903\U00000a03", {2307}, {2}}, + {L"\U00000903\U00000308\U00000a03", {2307}, {3}}, + {L"\U00000903\U00001100", {2307, 4352}, {1, 2}}, + {L"\U00000903\U00000308\U00001100", {2307, 4352}, {2, 3}}, + {L"\U00000903\U00001160", {2307, 4448}, {1, 2}}, + {L"\U00000903\U00000308\U00001160", {2307, 4448}, {2, 3}}, + {L"\U00000903\U000011a8", {2307, 4520}, {1, 2}}, + {L"\U00000903\U00000308\U000011a8", {2307, 4520}, {2, 3}}, + {L"\U00000903\U0000ac00", {2307, 44032}, {1, 2}}, + {L"\U00000903\U00000308\U0000ac00", {2307, 44032}, {2, 3}}, + {L"\U00000903\U0000ac01", {2307, 44033}, {1, 2}}, + {L"\U00000903\U00000308\U0000ac01", {2307, 44033}, {2, 3}}, + {L"\U00000903\U00000900", {2307}, {2}}, + {L"\U00000903\U00000308\U00000900", {2307}, {3}}, + {L"\U00000903\U00000903", {2307}, {2}}, + {L"\U00000903\U00000308\U00000903", {2307}, {3}}, + {L"\U00000903\U00000904", {2307, 2308}, {1, 2}}, + {L"\U00000903\U00000308\U00000904", {2307, 2308}, {2, 3}}, + {L"\U00000903\U00000d4e", {2307, 3406}, {1, 2}}, + {L"\U00000903\U00000308\U00000d4e", {2307, 3406}, {2, 3}}, + {L"\U00000903\U00000915", {2307, 2325}, {1, 2}}, + {L"\U00000903\U00000308\U00000915", {2307, 2325}, {2, 3}}, + {L"\U00000903\U0000231a", {2307, 8986}, {1, 2}}, + {L"\U00000903\U00000308\U0000231a", {2307, 8986}, {2, 3}}, + {L"\U00000903\U00000300", {2307}, {2}}, + {L"\U00000903\U00000308\U00000300", {2307}, {3}}, + {L"\U00000903\U0000093c", {2307}, {2}}, + {L"\U00000903\U00000308\U0000093c", {2307}, {3}}, + {L"\U00000903\U0000094d", {2307}, {2}}, + {L"\U00000903\U00000308\U0000094d", {2307}, {3}}, + {L"\U00000903\U0000200d", {2307}, {2}}, + {L"\U00000903\U00000308\U0000200d", {2307}, {3}}, + {L"\U00000903\U00000378", {2307, 888}, {1, 2}}, + {L"\U00000903\U00000308\U00000378", {2307, 888}, {2, 3}}, + {L"\U00000904\U00000020", {2308, 32}, {1, 2}}, + {L"\U00000904\U00000308\U00000020", {2308, 32}, {2, 3}}, + {L"\U00000904\U0000000d", {2308, 13}, {1, 2}}, + {L"\U00000904\U00000308\U0000000d", {2308, 13}, {2, 3}}, + {L"\U00000904\U0000000a", {2308, 10}, {1, 2}}, + {L"\U00000904\U00000308\U0000000a", {2308, 10}, {2, 3}}, + {L"\U00000904\U00000001", {2308, 1}, {1, 2}}, + {L"\U00000904\U00000308\U00000001", {2308, 1}, {2, 3}}, + {L"\U00000904\U0000034f", {2308}, {2}}, + {L"\U00000904\U00000308\U0000034f", {2308}, {3}}, + {L"\U00000904\U0001f1e6", {2308, 127462}, {1, 2}}, + {L"\U00000904\U00000308\U0001f1e6", {2308, 127462}, {2, 3}}, + {L"\U00000904\U00000600", {2308, 1536}, {1, 2}}, + {L"\U00000904\U00000308\U00000600", {2308, 1536}, {2, 3}}, + {L"\U00000904\U00000a03", {2308}, {2}}, + {L"\U00000904\U00000308\U00000a03", {2308}, {3}}, + {L"\U00000904\U00001100", {2308, 4352}, {1, 2}}, + {L"\U00000904\U00000308\U00001100", {2308, 4352}, {2, 3}}, + {L"\U00000904\U00001160", {2308, 4448}, {1, 2}}, + {L"\U00000904\U00000308\U00001160", {2308, 4448}, {2, 3}}, + {L"\U00000904\U000011a8", {2308, 4520}, {1, 2}}, + {L"\U00000904\U00000308\U000011a8", {2308, 4520}, {2, 3}}, + {L"\U00000904\U0000ac00", {2308, 44032}, {1, 2}}, + {L"\U00000904\U00000308\U0000ac00", {2308, 44032}, {2, 3}}, + {L"\U00000904\U0000ac01", {2308, 44033}, {1, 2}}, + {L"\U00000904\U00000308\U0000ac01", {2308, 44033}, {2, 3}}, + {L"\U00000904\U00000900", {2308}, {2}}, + {L"\U00000904\U00000308\U00000900", {2308}, {3}}, + {L"\U00000904\U00000903", {2308}, {2}}, + {L"\U00000904\U00000308\U00000903", {2308}, {3}}, + {L"\U00000904\U00000904", {2308, 2308}, {1, 2}}, + {L"\U00000904\U00000308\U00000904", {2308, 2308}, {2, 3}}, + {L"\U00000904\U00000d4e", {2308, 3406}, {1, 2}}, + {L"\U00000904\U00000308\U00000d4e", {2308, 3406}, {2, 3}}, + {L"\U00000904\U00000915", {2308, 2325}, {1, 2}}, + {L"\U00000904\U00000308\U00000915", {2308, 2325}, {2, 3}}, + {L"\U00000904\U0000231a", {2308, 8986}, {1, 2}}, + {L"\U00000904\U00000308\U0000231a", {2308, 8986}, {2, 3}}, + {L"\U00000904\U00000300", {2308}, {2}}, + {L"\U00000904\U00000308\U00000300", {2308}, {3}}, + {L"\U00000904\U0000093c", {2308}, {2}}, + {L"\U00000904\U00000308\U0000093c", {2308}, {3}}, + {L"\U00000904\U0000094d", {2308}, {2}}, + {L"\U00000904\U00000308\U0000094d", {2308}, {3}}, + {L"\U00000904\U0000200d", {2308}, {2}}, + {L"\U00000904\U00000308\U0000200d", {2308}, {3}}, + {L"\U00000904\U00000378", {2308, 888}, {1, 2}}, + {L"\U00000904\U00000308\U00000378", {2308, 888}, {2, 3}}, + {L"\U00000d4e\U00000020", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000020", {3406, 32}, {2, 3}}, + {L"\U00000d4e\U0000000d", {3406, 13}, {1, 2}}, + {L"\U00000d4e\U00000308\U0000000d", {3406, 13}, {2, 3}}, + {L"\U00000d4e\U0000000a", {3406, 10}, {1, 2}}, + {L"\U00000d4e\U00000308\U0000000a", {3406, 10}, {2, 3}}, + {L"\U00000d4e\U00000001", {3406, 1}, {1, 2}}, + {L"\U00000d4e\U00000308\U00000001", {3406, 1}, {2, 3}}, + {L"\U00000d4e\U0000034f", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000034f", {3406}, {3}}, + {L"\U00000d4e\U0001f1e6", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0001f1e6", {3406, 127462}, {2, 3}}, + {L"\U00000d4e\U00000600", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000600", {3406, 1536}, {2, 3}}, + {L"\U00000d4e\U00000a03", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000a03", {3406}, {3}}, + {L"\U00000d4e\U00001100", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00001100", {3406, 4352}, {2, 3}}, + {L"\U00000d4e\U00001160", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00001160", {3406, 4448}, {2, 3}}, + {L"\U00000d4e\U000011a8", {3406}, {2}}, + {L"\U00000d4e\U00000308\U000011a8", {3406, 4520}, {2, 3}}, + {L"\U00000d4e\U0000ac00", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000ac00", {3406, 44032}, {2, 3}}, + {L"\U00000d4e\U0000ac01", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000ac01", {3406, 44033}, {2, 3}}, + {L"\U00000d4e\U00000900", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000900", {3406}, {3}}, + {L"\U00000d4e\U00000903", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000903", {3406}, {3}}, + {L"\U00000d4e\U00000904", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000904", {3406, 2308}, {2, 3}}, + {L"\U00000d4e\U00000d4e", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000d4e", {3406, 3406}, {2, 3}}, + {L"\U00000d4e\U00000915", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000915", {3406, 2325}, {2, 3}}, + {L"\U00000d4e\U0000231a", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000231a", {3406, 8986}, {2, 3}}, + {L"\U00000d4e\U00000300", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000300", {3406}, {3}}, + {L"\U00000d4e\U0000093c", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000093c", {3406}, {3}}, + {L"\U00000d4e\U0000094d", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000094d", {3406}, {3}}, + {L"\U00000d4e\U0000200d", {3406}, {2}}, + {L"\U00000d4e\U00000308\U0000200d", {3406}, {3}}, + {L"\U00000d4e\U00000378", {3406}, {2}}, + {L"\U00000d4e\U00000308\U00000378", {3406, 888}, {2, 3}}, + {L"\U00000915\U00000020", {2325, 32}, {1, 2}}, + {L"\U00000915\U00000308\U00000020", {2325, 32}, {2, 3}}, + {L"\U00000915\U0000000d", {2325, 13}, {1, 2}}, + {L"\U00000915\U00000308\U0000000d", {2325, 13}, {2, 3}}, + {L"\U00000915\U0000000a", {2325, 10}, {1, 2}}, + {L"\U00000915\U00000308\U0000000a", {2325, 10}, {2, 3}}, + {L"\U00000915\U00000001", {2325, 1}, {1, 2}}, + {L"\U00000915\U00000308\U00000001", {2325, 1}, {2, 3}}, + {L"\U00000915\U0000034f", {2325}, {2}}, + {L"\U00000915\U00000308\U0000034f", {2325}, {3}}, + {L"\U00000915\U0001f1e6", {2325, 127462}, {1, 2}}, + {L"\U00000915\U00000308\U0001f1e6", {2325, 127462}, {2, 3}}, + {L"\U00000915\U00000600", {2325, 1536}, {1, 2}}, + {L"\U00000915\U00000308\U00000600", {2325, 1536}, {2, 3}}, + {L"\U00000915\U00000a03", {2325}, {2}}, + {L"\U00000915\U00000308\U00000a03", {2325}, {3}}, + {L"\U00000915\U00001100", {2325, 4352}, {1, 2}}, + {L"\U00000915\U00000308\U00001100", {2325, 4352}, {2, 3}}, + {L"\U00000915\U00001160", {2325, 4448}, {1, 2}}, + {L"\U00000915\U00000308\U00001160", {2325, 4448}, {2, 3}}, + {L"\U00000915\U000011a8", {2325, 4520}, {1, 2}}, + {L"\U00000915\U00000308\U000011a8", {2325, 4520}, {2, 3}}, + {L"\U00000915\U0000ac00", {2325, 44032}, {1, 2}}, + {L"\U00000915\U00000308\U0000ac00", {2325, 44032}, {2, 3}}, + {L"\U00000915\U0000ac01", {2325, 44033}, {1, 2}}, + {L"\U00000915\U00000308\U0000ac01", {2325, 44033}, {2, 3}}, + {L"\U00000915\U00000900", {2325}, {2}}, + {L"\U00000915\U00000308\U00000900", {2325}, {3}}, + {L"\U00000915\U00000903", {2325}, {2}}, + {L"\U00000915\U00000308\U00000903", {2325}, {3}}, + {L"\U00000915\U00000904", {2325, 2308}, {1, 2}}, + {L"\U00000915\U00000308\U00000904", {2325, 2308}, {2, 3}}, + {L"\U00000915\U00000d4e", {2325, 3406}, {1, 2}}, + {L"\U00000915\U00000308\U00000d4e", {2325, 3406}, {2, 3}}, + {L"\U00000915\U00000915", {2325, 2325}, {1, 2}}, + {L"\U00000915\U00000308\U00000915", {2325, 2325}, {2, 3}}, + {L"\U00000915\U0000231a", {2325, 8986}, {1, 2}}, + {L"\U00000915\U00000308\U0000231a", {2325, 8986}, {2, 3}}, + {L"\U00000915\U00000300", {2325}, {2}}, + {L"\U00000915\U00000308\U00000300", {2325}, {3}}, + {L"\U00000915\U0000093c", {2325}, {2}}, + {L"\U00000915\U00000308\U0000093c", {2325}, {3}}, + {L"\U00000915\U0000094d", {2325}, {2}}, + {L"\U00000915\U00000308\U0000094d", {2325}, {3}}, + {L"\U00000915\U0000200d", {2325}, {2}}, + {L"\U00000915\U00000308\U0000200d", {2325}, {3}}, + {L"\U00000915\U00000378", {2325, 888}, {1, 2}}, + {L"\U00000915\U00000308\U00000378", {2325, 888}, {2, 3}}, {L"\U0000231a\U00000020", {8986, 32}, {1, 2}}, {L"\U0000231a\U00000308\U00000020", {8986, 32}, {2, 3}}, {L"\U0000231a\U0000000d", {8986, 13}, {1, 2}}, @@ -1758,8 +3350,8 @@ std::array, 602> data_utf32 = {{ {L"\U0000231a\U00000308\U0001f1e6", {8986, 127462}, {2, 3}}, {L"\U0000231a\U00000600", {8986, 1536}, {1, 2}}, {L"\U0000231a\U00000308\U00000600", {8986, 1536}, {2, 3}}, - {L"\U0000231a\U00000903", {8986}, {2}}, - {L"\U0000231a\U00000308\U00000903", {8986}, {3}}, + {L"\U0000231a\U00000a03", {8986}, {2}}, + {L"\U0000231a\U00000308\U00000a03", {8986}, {3}}, {L"\U0000231a\U00001100", {8986, 4352}, {1, 2}}, {L"\U0000231a\U00000308\U00001100", {8986, 4352}, {2, 3}}, {L"\U0000231a\U00001160", {8986, 4448}, {1, 2}}, @@ -1770,10 +3362,24 @@ std::array, 602> data_utf32 = {{ {L"\U0000231a\U00000308\U0000ac00", {8986, 44032}, {2, 3}}, {L"\U0000231a\U0000ac01", {8986, 44033}, {1, 2}}, {L"\U0000231a\U00000308\U0000ac01", {8986, 44033}, {2, 3}}, + {L"\U0000231a\U00000900", {8986}, {2}}, + {L"\U0000231a\U00000308\U00000900", {8986}, {3}}, + {L"\U0000231a\U00000903", {8986}, {2}}, + {L"\U0000231a\U00000308\U00000903", {8986}, {3}}, + {L"\U0000231a\U00000904", {8986, 2308}, {1, 2}}, + {L"\U0000231a\U00000308\U00000904", {8986, 2308}, {2, 3}}, + {L"\U0000231a\U00000d4e", {8986, 3406}, {1, 2}}, + {L"\U0000231a\U00000308\U00000d4e", {8986, 3406}, {2, 3}}, + {L"\U0000231a\U00000915", {8986, 2325}, {1, 2}}, + {L"\U0000231a\U00000308\U00000915", {8986, 2325}, {2, 3}}, {L"\U0000231a\U0000231a", {8986, 8986}, {1, 2}}, {L"\U0000231a\U00000308\U0000231a", {8986, 8986}, {2, 3}}, {L"\U0000231a\U00000300", {8986}, {2}}, {L"\U0000231a\U00000308\U00000300", {8986}, {3}}, + {L"\U0000231a\U0000093c", {8986}, {2}}, + {L"\U0000231a\U00000308\U0000093c", {8986}, {3}}, + {L"\U0000231a\U0000094d", {8986}, {2}}, + {L"\U0000231a\U00000308\U0000094d", {8986}, {3}}, {L"\U0000231a\U0000200d", {8986}, {2}}, {L"\U0000231a\U00000308\U0000200d", {8986}, {3}}, {L"\U0000231a\U00000378", {8986, 888}, {1, 2}}, @@ -1792,8 +3398,8 @@ std::array, 602> data_utf32 = {{ {L"\U00000300\U00000308\U0001f1e6", {768, 127462}, {2, 3}}, {L"\U00000300\U00000600", {768, 1536}, {1, 2}}, {L"\U00000300\U00000308\U00000600", {768, 1536}, {2, 3}}, - {L"\U00000300\U00000903", {768}, {2}}, - {L"\U00000300\U00000308\U00000903", {768}, {3}}, + {L"\U00000300\U00000a03", {768}, {2}}, + {L"\U00000300\U00000308\U00000a03", {768}, {3}}, {L"\U00000300\U00001100", {768, 4352}, {1, 2}}, {L"\U00000300\U00000308\U00001100", {768, 4352}, {2, 3}}, {L"\U00000300\U00001160", {768, 4448}, {1, 2}}, @@ -1804,14 +3410,124 @@ std::array, 602> data_utf32 = {{ {L"\U00000300\U00000308\U0000ac00", {768, 44032}, {2, 3}}, {L"\U00000300\U0000ac01", {768, 44033}, {1, 2}}, {L"\U00000300\U00000308\U0000ac01", {768, 44033}, {2, 3}}, + {L"\U00000300\U00000900", {768}, {2}}, + {L"\U00000300\U00000308\U00000900", {768}, {3}}, + {L"\U00000300\U00000903", {768}, {2}}, + {L"\U00000300\U00000308\U00000903", {768}, {3}}, + {L"\U00000300\U00000904", {768, 2308}, {1, 2}}, + {L"\U00000300\U00000308\U00000904", {768, 2308}, {2, 3}}, + {L"\U00000300\U00000d4e", {768, 3406}, {1, 2}}, + {L"\U00000300\U00000308\U00000d4e", {768, 3406}, {2, 3}}, + {L"\U00000300\U00000915", {768, 2325}, {1, 2}}, + {L"\U00000300\U00000308\U00000915", {768, 2325}, {2, 3}}, {L"\U00000300\U0000231a", {768, 8986}, {1, 2}}, {L"\U00000300\U00000308\U0000231a", {768, 8986}, {2, 3}}, {L"\U00000300\U00000300", {768}, {2}}, {L"\U00000300\U00000308\U00000300", {768}, {3}}, + {L"\U00000300\U0000093c", {768}, {2}}, + {L"\U00000300\U00000308\U0000093c", {768}, {3}}, + {L"\U00000300\U0000094d", {768}, {2}}, + {L"\U00000300\U00000308\U0000094d", {768}, {3}}, {L"\U00000300\U0000200d", {768}, {2}}, {L"\U00000300\U00000308\U0000200d", {768}, {3}}, {L"\U00000300\U00000378", {768, 888}, {1, 2}}, {L"\U00000300\U00000308\U00000378", {768, 888}, {2, 3}}, + {L"\U0000093c\U00000020", {2364, 32}, {1, 2}}, + {L"\U0000093c\U00000308\U00000020", {2364, 32}, {2, 3}}, + {L"\U0000093c\U0000000d", {2364, 13}, {1, 2}}, + {L"\U0000093c\U00000308\U0000000d", {2364, 13}, {2, 3}}, + {L"\U0000093c\U0000000a", {2364, 10}, {1, 2}}, + {L"\U0000093c\U00000308\U0000000a", {2364, 10}, {2, 3}}, + {L"\U0000093c\U00000001", {2364, 1}, {1, 2}}, + {L"\U0000093c\U00000308\U00000001", {2364, 1}, {2, 3}}, + {L"\U0000093c\U0000034f", {2364}, {2}}, + {L"\U0000093c\U00000308\U0000034f", {2364}, {3}}, + {L"\U0000093c\U0001f1e6", {2364, 127462}, {1, 2}}, + {L"\U0000093c\U00000308\U0001f1e6", {2364, 127462}, {2, 3}}, + {L"\U0000093c\U00000600", {2364, 1536}, {1, 2}}, + {L"\U0000093c\U00000308\U00000600", {2364, 1536}, {2, 3}}, + {L"\U0000093c\U00000a03", {2364}, {2}}, + {L"\U0000093c\U00000308\U00000a03", {2364}, {3}}, + {L"\U0000093c\U00001100", {2364, 4352}, {1, 2}}, + {L"\U0000093c\U00000308\U00001100", {2364, 4352}, {2, 3}}, + {L"\U0000093c\U00001160", {2364, 4448}, {1, 2}}, + {L"\U0000093c\U00000308\U00001160", {2364, 4448}, {2, 3}}, + {L"\U0000093c\U000011a8", {2364, 4520}, {1, 2}}, + {L"\U0000093c\U00000308\U000011a8", {2364, 4520}, {2, 3}}, + {L"\U0000093c\U0000ac00", {2364, 44032}, {1, 2}}, + {L"\U0000093c\U00000308\U0000ac00", {2364, 44032}, {2, 3}}, + {L"\U0000093c\U0000ac01", {2364, 44033}, {1, 2}}, + {L"\U0000093c\U00000308\U0000ac01", {2364, 44033}, {2, 3}}, + {L"\U0000093c\U00000900", {2364}, {2}}, + {L"\U0000093c\U00000308\U00000900", {2364}, {3}}, + {L"\U0000093c\U00000903", {2364}, {2}}, + {L"\U0000093c\U00000308\U00000903", {2364}, {3}}, + {L"\U0000093c\U00000904", {2364, 2308}, {1, 2}}, + {L"\U0000093c\U00000308\U00000904", {2364, 2308}, {2, 3}}, + {L"\U0000093c\U00000d4e", {2364, 3406}, {1, 2}}, + {L"\U0000093c\U00000308\U00000d4e", {2364, 3406}, {2, 3}}, + {L"\U0000093c\U00000915", {2364, 2325}, {1, 2}}, + {L"\U0000093c\U00000308\U00000915", {2364, 2325}, {2, 3}}, + {L"\U0000093c\U0000231a", {2364, 8986}, {1, 2}}, + {L"\U0000093c\U00000308\U0000231a", {2364, 8986}, {2, 3}}, + {L"\U0000093c\U00000300", {2364}, {2}}, + {L"\U0000093c\U00000308\U00000300", {2364}, {3}}, + {L"\U0000093c\U0000093c", {2364}, {2}}, + {L"\U0000093c\U00000308\U0000093c", {2364}, {3}}, + {L"\U0000093c\U0000094d", {2364}, {2}}, + {L"\U0000093c\U00000308\U0000094d", {2364}, {3}}, + {L"\U0000093c\U0000200d", {2364}, {2}}, + {L"\U0000093c\U00000308\U0000200d", {2364}, {3}}, + {L"\U0000093c\U00000378", {2364, 888}, {1, 2}}, + {L"\U0000093c\U00000308\U00000378", {2364, 888}, {2, 3}}, + {L"\U0000094d\U00000020", {2381, 32}, {1, 2}}, + {L"\U0000094d\U00000308\U00000020", {2381, 32}, {2, 3}}, + {L"\U0000094d\U0000000d", {2381, 13}, {1, 2}}, + {L"\U0000094d\U00000308\U0000000d", {2381, 13}, {2, 3}}, + {L"\U0000094d\U0000000a", {2381, 10}, {1, 2}}, + {L"\U0000094d\U00000308\U0000000a", {2381, 10}, {2, 3}}, + {L"\U0000094d\U00000001", {2381, 1}, {1, 2}}, + {L"\U0000094d\U00000308\U00000001", {2381, 1}, {2, 3}}, + {L"\U0000094d\U0000034f", {2381}, {2}}, + {L"\U0000094d\U00000308\U0000034f", {2381}, {3}}, + {L"\U0000094d\U0001f1e6", {2381, 127462}, {1, 2}}, + {L"\U0000094d\U00000308\U0001f1e6", {2381, 127462}, {2, 3}}, + {L"\U0000094d\U00000600", {2381, 1536}, {1, 2}}, + {L"\U0000094d\U00000308\U00000600", {2381, 1536}, {2, 3}}, + {L"\U0000094d\U00000a03", {2381}, {2}}, + {L"\U0000094d\U00000308\U00000a03", {2381}, {3}}, + {L"\U0000094d\U00001100", {2381, 4352}, {1, 2}}, + {L"\U0000094d\U00000308\U00001100", {2381, 4352}, {2, 3}}, + {L"\U0000094d\U00001160", {2381, 4448}, {1, 2}}, + {L"\U0000094d\U00000308\U00001160", {2381, 4448}, {2, 3}}, + {L"\U0000094d\U000011a8", {2381, 4520}, {1, 2}}, + {L"\U0000094d\U00000308\U000011a8", {2381, 4520}, {2, 3}}, + {L"\U0000094d\U0000ac00", {2381, 44032}, {1, 2}}, + {L"\U0000094d\U00000308\U0000ac00", {2381, 44032}, {2, 3}}, + {L"\U0000094d\U0000ac01", {2381, 44033}, {1, 2}}, + {L"\U0000094d\U00000308\U0000ac01", {2381, 44033}, {2, 3}}, + {L"\U0000094d\U00000900", {2381}, {2}}, + {L"\U0000094d\U00000308\U00000900", {2381}, {3}}, + {L"\U0000094d\U00000903", {2381}, {2}}, + {L"\U0000094d\U00000308\U00000903", {2381}, {3}}, + {L"\U0000094d\U00000904", {2381, 2308}, {1, 2}}, + {L"\U0000094d\U00000308\U00000904", {2381, 2308}, {2, 3}}, + {L"\U0000094d\U00000d4e", {2381, 3406}, {1, 2}}, + {L"\U0000094d\U00000308\U00000d4e", {2381, 3406}, {2, 3}}, + {L"\U0000094d\U00000915", {2381, 2325}, {1, 2}}, + {L"\U0000094d\U00000308\U00000915", {2381, 2325}, {2, 3}}, + {L"\U0000094d\U0000231a", {2381, 8986}, {1, 2}}, + {L"\U0000094d\U00000308\U0000231a", {2381, 8986}, {2, 3}}, + {L"\U0000094d\U00000300", {2381}, {2}}, + {L"\U0000094d\U00000308\U00000300", {2381}, {3}}, + {L"\U0000094d\U0000093c", {2381}, {2}}, + {L"\U0000094d\U00000308\U0000093c", {2381}, {3}}, + {L"\U0000094d\U0000094d", {2381}, {2}}, + {L"\U0000094d\U00000308\U0000094d", {2381}, {3}}, + {L"\U0000094d\U0000200d", {2381}, {2}}, + {L"\U0000094d\U00000308\U0000200d", {2381}, {3}}, + {L"\U0000094d\U00000378", {2381, 888}, {1, 2}}, + {L"\U0000094d\U00000308\U00000378", {2381, 888}, {2, 3}}, {L"\U0000200d\U00000020", {8205, 32}, {1, 2}}, {L"\U0000200d\U00000308\U00000020", {8205, 32}, {2, 3}}, {L"\U0000200d\U0000000d", {8205, 13}, {1, 2}}, @@ -1826,8 +3542,8 @@ std::array, 602> data_utf32 = {{ {L"\U0000200d\U00000308\U0001f1e6", {8205, 127462}, {2, 3}}, {L"\U0000200d\U00000600", {8205, 1536}, {1, 2}}, {L"\U0000200d\U00000308\U00000600", {8205, 1536}, {2, 3}}, - {L"\U0000200d\U00000903", {8205}, {2}}, - {L"\U0000200d\U00000308\U00000903", {8205}, {3}}, + {L"\U0000200d\U00000a03", {8205}, {2}}, + {L"\U0000200d\U00000308\U00000a03", {8205}, {3}}, {L"\U0000200d\U00001100", {8205, 4352}, {1, 2}}, {L"\U0000200d\U00000308\U00001100", {8205, 4352}, {2, 3}}, {L"\U0000200d\U00001160", {8205, 4448}, {1, 2}}, @@ -1838,10 +3554,24 @@ std::array, 602> data_utf32 = {{ {L"\U0000200d\U00000308\U0000ac00", {8205, 44032}, {2, 3}}, {L"\U0000200d\U0000ac01", {8205, 44033}, {1, 2}}, {L"\U0000200d\U00000308\U0000ac01", {8205, 44033}, {2, 3}}, + {L"\U0000200d\U00000900", {8205}, {2}}, + {L"\U0000200d\U00000308\U00000900", {8205}, {3}}, + {L"\U0000200d\U00000903", {8205}, {2}}, + {L"\U0000200d\U00000308\U00000903", {8205}, {3}}, + {L"\U0000200d\U00000904", {8205, 2308}, {1, 2}}, + {L"\U0000200d\U00000308\U00000904", {8205, 2308}, {2, 3}}, + {L"\U0000200d\U00000d4e", {8205, 3406}, {1, 2}}, + {L"\U0000200d\U00000308\U00000d4e", {8205, 3406}, {2, 3}}, + {L"\U0000200d\U00000915", {8205, 2325}, {1, 2}}, + {L"\U0000200d\U00000308\U00000915", {8205, 2325}, {2, 3}}, {L"\U0000200d\U0000231a", {8205, 8986}, {1, 2}}, {L"\U0000200d\U00000308\U0000231a", {8205, 8986}, {2, 3}}, {L"\U0000200d\U00000300", {8205}, {2}}, {L"\U0000200d\U00000308\U00000300", {8205}, {3}}, + {L"\U0000200d\U0000093c", {8205}, {2}}, + {L"\U0000200d\U00000308\U0000093c", {8205}, {3}}, + {L"\U0000200d\U0000094d", {8205}, {2}}, + {L"\U0000200d\U00000308\U0000094d", {8205}, {3}}, {L"\U0000200d\U0000200d", {8205}, {2}}, {L"\U0000200d\U00000308\U0000200d", {8205}, {3}}, {L"\U0000200d\U00000378", {8205, 888}, {1, 2}}, @@ -1860,8 +3590,8 @@ std::array, 602> data_utf32 = {{ {L"\U00000378\U00000308\U0001f1e6", {888, 127462}, {2, 3}}, {L"\U00000378\U00000600", {888, 1536}, {1, 2}}, {L"\U00000378\U00000308\U00000600", {888, 1536}, {2, 3}}, - {L"\U00000378\U00000903", {888}, {2}}, - {L"\U00000378\U00000308\U00000903", {888}, {3}}, + {L"\U00000378\U00000a03", {888}, {2}}, + {L"\U00000378\U00000308\U00000a03", {888}, {3}}, {L"\U00000378\U00001100", {888, 4352}, {1, 2}}, {L"\U00000378\U00000308\U00001100", {888, 4352}, {2, 3}}, {L"\U00000378\U00001160", {888, 4448}, {1, 2}}, @@ -1872,10 +3602,24 @@ std::array, 602> data_utf32 = {{ {L"\U00000378\U00000308\U0000ac00", {888, 44032}, {2, 3}}, {L"\U00000378\U0000ac01", {888, 44033}, {1, 2}}, {L"\U00000378\U00000308\U0000ac01", {888, 44033}, {2, 3}}, + {L"\U00000378\U00000900", {888}, {2}}, + {L"\U00000378\U00000308\U00000900", {888}, {3}}, + {L"\U00000378\U00000903", {888}, {2}}, + {L"\U00000378\U00000308\U00000903", {888}, {3}}, + {L"\U00000378\U00000904", {888, 2308}, {1, 2}}, + {L"\U00000378\U00000308\U00000904", {888, 2308}, {2, 3}}, + {L"\U00000378\U00000d4e", {888, 3406}, {1, 2}}, + {L"\U00000378\U00000308\U00000d4e", {888, 3406}, {2, 3}}, + {L"\U00000378\U00000915", {888, 2325}, {1, 2}}, + {L"\U00000378\U00000308\U00000915", {888, 2325}, {2, 3}}, {L"\U00000378\U0000231a", {888, 8986}, {1, 2}}, {L"\U00000378\U00000308\U0000231a", {888, 8986}, {2, 3}}, {L"\U00000378\U00000300", {888}, {2}}, {L"\U00000378\U00000308\U00000300", {888}, {3}}, + {L"\U00000378\U0000093c", {888}, {2}}, + {L"\U00000378\U00000308\U0000093c", {888}, {3}}, + {L"\U00000378\U0000094d", {888}, {2}}, + {L"\U00000378\U00000308\U0000094d", {888}, {3}}, {L"\U00000378\U0000200d", {888}, {2}}, {L"\U00000378\U00000308\U0000200d", {888}, {3}}, {L"\U00000378\U00000378", {888, 888}, {1, 2}}, @@ -1903,7 +3647,18 @@ std::array, 602> data_utf32 = {{ {L"\U0001f6d1\U0000200d\U0001f6d1", {128721}, {3}}, {L"\U00000061\U0000200d\U0001f6d1", {97, 128721}, {2, 3}}, {L"\U00002701\U0000200d\U00002701", {9985}, {3}}, - {L"\U00000061\U0000200d\U00002701", {97, 9985}, {2, 3}}}}; + {L"\U00000061\U0000200d\U00002701", {97, 9985}, {2, 3}}, + {L"\U00000915\U00000924", {2325, 2340}, {1, 2}}, + {L"\U00000915\U0000094d\U00000924", {2325}, {3}}, + {L"\U00000915\U0000094d\U0000094d\U00000924", {2325}, {4}}, + {L"\U00000915\U0000094d\U0000200d\U00000924", {2325}, {4}}, + {L"\U00000915\U0000093c\U0000200d\U0000094d\U00000924", {2325}, {5}}, + {L"\U00000915\U0000093c\U0000094d\U0000200d\U00000924", {2325}, {5}}, + {L"\U00000915\U0000094d\U00000924\U0000094d\U0000092f", {2325}, {5}}, + {L"\U00000915\U0000094d\U00000061", {2325, 97}, {2, 3}}, + {L"\U00000061\U0000094d\U00000924", {97, 2340}, {2, 3}}, + {L"\U0000003f\U0000094d\U00000924", {63, 2340}, {2, 3}}, + {L"\U00000915\U0000094d\U0000094d\U00000924", {2325}, {4}}}}; #endif // TEST_HAS_NO_WIDE_CHARACTERS #endif // LIBCXX_TEST_STD_UTILITIES_FORMAT_FORMAT_STRING_FORMAT_STRING_STD_EXTENDED_GRAPHEME_CLUSTER_H diff --git a/yass/third_party/libc++/trunk/test/libcxx/utilities/format/format.string/format.string.std/extended_grapheme_cluster.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/utilities/format/format.string/format.string.std/extended_grapheme_cluster.pass.cpp index 5f9873b51a..c1fdd1f209 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/utilities/format/format.string/format.string.std/extended_grapheme_cluster.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/utilities/format/format.string/format.string.std/extended_grapheme_cluster.pass.cpp @@ -53,6 +53,21 @@ static_assert(count_entries(cluster::__property::__LVT) == 10773); static_assert(count_entries(cluster::__property::__ZWJ) == 1); static_assert(count_entries(cluster::__property::__Extended_Pictographic) == 3537); +namespace inCB = std::__indic_conjunct_break; +constexpr int count_entries(inCB::__property property) { + return std::transform_reduce( + std::begin(inCB::__entries), std::end(inCB::__entries), 0, std::plus{}, [property](auto entry) { + if (static_cast(entry & 0b11) != property) + return 0; + + return 1 + static_cast((entry >> 2) & 0b1'1111'1111); + }); +} + +static_assert(count_entries(inCB::__property::__Linker) == 6); +static_assert(count_entries(inCB::__property::__Consonant) == 240); +static_assert(count_entries(inCB::__property::__Extend) == 884); + } // namespace template diff --git a/yass/third_party/libc++/trunk/test/libcxx/utilities/tuple/__tuple_like.compile.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/utilities/tuple/__tuple_like.compile.pass.cpp index b1d199865d..2c54fb5a10 100644 --- a/yass/third_party/libc++/trunk/test/libcxx/utilities/tuple/__tuple_like.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/libcxx/utilities/tuple/__tuple_like.compile.pass.cpp @@ -15,6 +15,7 @@ // template // concept tuple-like; // exposition only +#include <__tuple/tuple_like.h> #include #include #include diff --git a/yass/third_party/libc++/trunk/test/libcxx/utilities/utility/private_constructor_tag.compile.pass.cpp b/yass/third_party/libc++/trunk/test/libcxx/utilities/utility/private_constructor_tag.compile.pass.cpp new file mode 100644 index 0000000000..097e05f29c --- /dev/null +++ b/yass/third_party/libc++/trunk/test/libcxx/utilities/utility/private_constructor_tag.compile.pass.cpp @@ -0,0 +1,19 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// struct __private_constructor_tag{}; + +// The private constructor tag is intended to be a trivial type that can easily +// be used to mark a constructor exposition-only. +// +// Tests whether the type is trivial. + +#include <__utility/private_constructor_tag.h> +#include + +static_assert(std::is_trivial::value, ""); diff --git a/yass/third_party/libc++/trunk/test/std/algorithms/alg.nonmodifying/alg.contains/ranges.contains_subrange.pass.cpp b/yass/third_party/libc++/trunk/test/std/algorithms/alg.nonmodifying/alg.contains/ranges.contains_subrange.pass.cpp index d48ee9e4e7..761691c2af 100644 --- a/yass/third_party/libc++/trunk/test/std/algorithms/alg.nonmodifying/alg.contains/ranges.contains_subrange.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/algorithms/alg.nonmodifying/alg.contains/ranges.contains_subrange.pass.cpp @@ -309,6 +309,10 @@ constexpr bool test() { }); }); + assert(std::ranges::contains_subrange( + std::views::iota(0, 5), std::views::iota(0, 5) | std::views::filter([](int) { return true; }))); + assert(!std::ranges::contains_subrange(std::views::iota(0ULL, 42ULL), std::views::iota(0ULL, 1ULL << 32))); + return true; } diff --git a/yass/third_party/libc++/trunk/test/std/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp b/yass/third_party/libc++/trunk/test/std/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp index e7f3994d97..eb5f7cacdd 100644 --- a/yass/third_party/libc++/trunk/test/std/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp @@ -184,5 +184,33 @@ int main(int, char**) { } } + { // check the tail of the vectorized loop + for (size_t vec_size = 1; vec_size != 256; ++vec_size) { + { + std::vector lhs(vec_size); + std::vector rhs(vec_size); + + check(lhs, rhs, lhs.size()); + lhs.back() = 1; + check(lhs, rhs, lhs.size() - 1); + lhs.back() = 0; + rhs.back() = 1; + check(lhs, rhs, lhs.size() - 1); + rhs.back() = 0; + } + { + std::vector lhs(vec_size); + std::vector rhs(vec_size); + + check(lhs, rhs, lhs.size()); + lhs.back() = 1; + check(lhs, rhs, lhs.size() - 1); + lhs.back() = 0; + rhs.back() = 1; + check(lhs, rhs, lhs.size() - 1); + rhs.back() = 0; + } + } + } return 0; } diff --git a/yass/third_party/libc++/trunk/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_strong.pass.cpp b/yass/third_party/libc++/trunk/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_strong.pass.cpp index 0b09a7331f..2f84f26b9f 100644 --- a/yass/third_party/libc++/trunk/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_strong.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_strong.pass.cpp @@ -150,12 +150,12 @@ void test_impl() { test_seq_cst(store, load); auto store_one_arg = [](MaybeVolatile>& x, T old_val, T new_val) { - auto r = x.compare_exchange_strong(old_val, new_val, std::memory_order::seq_cst, std::memory_order_relaxed); + auto r = x.compare_exchange_strong(old_val, new_val, std::memory_order::seq_cst); assert(r); }; auto load_one_arg = [](MaybeVolatile>& x) { auto val = x.load(std::memory_order::relaxed); - while (!x.compare_exchange_strong(val, val, std::memory_order::seq_cst, std::memory_order_relaxed)) { + while (!x.compare_exchange_strong(val, val, std::memory_order::seq_cst)) { } return val; }; diff --git a/yass/third_party/libc++/trunk/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_weak.pass.cpp b/yass/third_party/libc++/trunk/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_weak.pass.cpp index f8a2f196c5..5a39ec761f 100644 --- a/yass/third_party/libc++/trunk/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_weak.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_weak.pass.cpp @@ -165,12 +165,12 @@ void test_impl() { auto store_one_arg = [](MaybeVolatile>& x, T old_val, T new_val) { // could fail spuriously, so put it in a loop - while (!x.compare_exchange_weak(old_val, new_val, std::memory_order::seq_cst, std::memory_order_relaxed)) { + while (!x.compare_exchange_weak(old_val, new_val, std::memory_order::seq_cst)) { } }; auto load_one_arg = [](MaybeVolatile>& x) { auto val = x.load(std::memory_order::relaxed); - while (!x.compare_exchange_weak(val, val, std::memory_order::seq_cst, std::memory_order_relaxed)) { + while (!x.compare_exchange_weak(val, val, std::memory_order::seq_cst)) { } return val; }; diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp.pass.cpp index b5ee0bfbec..701e6dfde5 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp_size.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp_size.pass.cpp index 4d0d673133..fd2ad66e10 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp_size.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp_size.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp.pass.cpp index 5898094973..c5fe349f24 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp_size.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp_size.pass.cpp index e13e20e20f..7d9c7d6c42 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp_size.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp_size.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/rdbuf.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/rdbuf.pass.cpp index 449114a0f6..f5ef29bcdb 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/rdbuf.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/rdbuf.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/str.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/str.pass.cpp index e7c063750f..63d3800290 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/str.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/str.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.verify.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.verify.cpp index 2ab252e934..d02f12d9eb 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.verify.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/depr.verify.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM + // // check that istrstream is marked deprecated diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/types.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/types.pass.cpp index be1a9e1251..526c4dc8b4 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/types.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.istrstream/types.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/cp_size_mode.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/cp_size_mode.pass.cpp index 8698983a7e..b9db1bf444 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/cp_size_mode.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/cp_size_mode.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp index abbf6af7e1..b67f0ab16e 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp index 854e68b172..e087c0686f 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/pcount.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/pcount.pass.cpp index 9830aeb6fc..73f20335d0 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/pcount.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/pcount.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/rdbuf.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/rdbuf.pass.cpp index f9a859dd8d..d8b55d9031 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/rdbuf.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/rdbuf.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp index 72f665af58..2867031533 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.verify.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.verify.cpp index e0c805fee1..9ec46509fa 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.verify.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.verify.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM + // // check that ostrstream is marked deprecated diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/types.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/types.pass.cpp index 6a71c44a90..e321444924 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/types.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.ostrstream/types.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/cp_size_mode.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/cp_size_mode.pass.cpp index a85e1328b3..54e09d3f30 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/cp_size_mode.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/cp_size_mode.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp index 390162ef0f..1e4c1209f7 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.dest/rdbuf.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.dest/rdbuf.pass.cpp index 3fe277a48c..99d58cc573 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.dest/rdbuf.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.dest/rdbuf.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp index 263fddef6c..6cc26bba7d 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/pcount.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/pcount.pass.cpp index b053cf128a..efe2c324eb 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/pcount.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/pcount.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp index 3d251d9a99..e1bc40c86e 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.verify.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.verify.cpp index 03655226a5..ab88d6d49a 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.verify.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/depr.verify.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM + // // check that strstream is marked deprecated diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/types.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/types.pass.cpp index fb543841e8..76094302a0 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/types.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstream/types.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ccp_size.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ccp_size.pass.cpp index 8f81707973..3d7f2ffcfe 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ccp_size.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ccp_size.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cp_size_cp.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cp_size_cp.pass.cpp index 25a9617dcd..0c4bf6214f 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cp_size_cp.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cp_size_cp.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cscp_size.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cscp_size.pass.cpp index fc3386ff55..e092883544 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cscp_size.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cscp_size.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cucp_size.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cucp_size.pass.cpp index a74c504fd2..7f5504dac1 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cucp_size.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cucp_size.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/custom_alloc.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/custom_alloc.pass.cpp index 756427df48..0aa7e1afcb 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/custom_alloc.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/custom_alloc.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/default.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/default.pass.cpp index 81924c995b..803be42fe7 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/default.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/default.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/scp_size_scp.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/scp_size_scp.pass.cpp index b8991a8fc4..35c1512e0a 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/scp_size_scp.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/scp_size_scp.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ucp_size_ucp.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ucp_size_ucp.pass.cpp index 1d3463f3ca..e71fa031eb 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ucp_size_ucp.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ucp_size_ucp.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/freeze.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/freeze.pass.cpp index 93eec8dde3..1276187d7f 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/freeze.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/freeze.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/overflow.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/overflow.pass.cpp index 5b973cff0c..fc79e787d3 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/overflow.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/overflow.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp index b64c9dcb44..b62c339241 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp index d6c8b8e7e1..68be8ddec0 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/overflow.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/overflow.pass.cpp index 37109c7e94..6a932dc00a 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/overflow.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/overflow.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/pbackfail.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/pbackfail.pass.cpp index 698953f712..484a726073 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/pbackfail.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/pbackfail.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekoff.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekoff.pass.cpp index d98e6f73f7..96900d89e4 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekoff.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekoff.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekpos.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekpos.pass.cpp index be88f5aecc..f3193d3520 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekpos.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekpos.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/setbuf.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/setbuf.pass.cpp index ce7612bc66..44e6704dcc 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/setbuf.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/setbuf.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/underflow.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/underflow.pass.cpp index 4fc79b575c..be916be479 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/underflow.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/underflow.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.verify.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.verify.cpp index a598acbba8..471b287e7f 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.verify.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.verify.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM + // // check that strstreambuf is marked deprecated diff --git a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/types.pass.cpp b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/types.pass.cpp index bc312cbbb2..aee126056c 100644 --- a/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/types.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/depr/depr.str.strstreams/depr.strstreambuf/types.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM // diff --git a/yass/third_party/libc++/trunk/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/generic_category.pass.cpp b/yass/third_party/libc++/trunk/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/generic_category.pass.cpp index 068202c6e4..d4bbde75ae 100644 --- a/yass/third_party/libc++/trunk/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/generic_category.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/generic_category.pass.cpp @@ -44,14 +44,19 @@ int main(int, char**) errno = E2BIG; // something that message will never generate const std::error_category& e_cat1 = std::generic_category(); const std::string msg = e_cat1.message(-1); - // Exact message format varies by platform. -#if defined(_AIX) - LIBCPP_ASSERT(msg.rfind("Error -1 occurred", 0) == 0); -#elif defined(_NEWLIB_VERSION) - LIBCPP_ASSERT(msg.empty()); -#else - LIBCPP_ASSERT(msg.rfind("Unknown error", 0) == 0); + // Exact message format varies by platform. We can't detect + // some of these (Musl in particular) using the preprocessor, + // so accept a few sensible messages. Newlib unfortunately + // responds with an empty message, which we probably want to + // treat as a failure code otherwise, but we can detect that + // with the preprocessor. + LIBCPP_ASSERT(msg.rfind("Error -1 occurred", 0) == 0 // AIX + || msg.rfind("No error information", 0) == 0 // Musl + || msg.rfind("Unknown error", 0) == 0 // Glibc +#if defined(_NEWLIB_VERSION) + || msg.empty() #endif + ); assert(errno == E2BIG); } diff --git a/yass/third_party/libc++/trunk/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp b/yass/third_party/libc++/trunk/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp index 42fdd1cb3b..eefbddd27a 100644 --- a/yass/third_party/libc++/trunk/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp @@ -50,14 +50,19 @@ int main(int, char**) { errno = E2BIG; // something that message will never generate const std::error_category& e_cat1 = std::system_category(); const std::string msg = e_cat1.message(-1); - // Exact message format varies by platform. -#if defined(_AIX) - LIBCPP_ASSERT(msg.rfind("Error -1 occurred", 0) == 0); -#elif defined(_NEWLIB_VERSION) - LIBCPP_ASSERT(msg.empty()); -#else - LIBCPP_ASSERT(msg.rfind("Unknown error", 0) == 0); + // Exact message format varies by platform. We can't detect + // some of these (Musl in particular) using the preprocessor, + // so accept a few sensible messages. Newlib unfortunately + // responds with an empty message, which we probably want to + // treat as a failure code otherwise, but we can detect that + // with the preprocessor. + LIBCPP_ASSERT(msg.rfind("Error -1 occurred", 0) == 0 // AIX + || msg.rfind("No error information", 0) == 0 // Musl + || msg.rfind("Unknown error", 0) == 0 // Glibc +#if defined(_NEWLIB_VERSION) + || msg.empty() #endif + ); assert(errno == E2BIG); } diff --git a/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/fstream.cons/path.pass.cpp b/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/fstream.cons/path.pass.cpp index bc75d04740..5edf22eaac 100644 --- a/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/fstream.cons/path.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/fstream.cons/path.pass.cpp @@ -15,17 +15,50 @@ // plate > // class basic_fstream -// explicit basic_fstream(const filesystem::path& s, -// ios_base::openmode mode = ios_base::in|ios_base::out); +// template +// explicit basic_fstream(const T& s, ios_base::openmode mode = ios_base::in); // Since C++17 +// Constraints: is_same_v is true #include #include #include +#include + #include "test_macros.h" +#include "test_iterators.h" #include "platform_support.h" namespace fs = std::filesystem; +template +constexpr bool test_non_convert_to_path() { + // String types + static_assert(!std::is_constructible_v>); + static_assert(!std::is_constructible_v>); + + // Char* pointers + if constexpr (!std::is_same_v) + static_assert(!std::is_constructible_v); + + // Iterators + static_assert(!std::is_convertible_v>); + + return true; +} + +static_assert(test_non_convert_to_path()); + +#if !defined(TEST_HAS_NO_WIDE_CHARACTERS) && !defined(TEST_HAS_OPEN_WITH_WCHAR) +static_assert(test_non_convert_to_path()); +#endif // !TEST_HAS_NO_WIDE_CHARACTERS && !TEST_HAS_OPEN_WITH_WCHAR + +#ifndef TEST_HAS_NO_CHAR8_T +static_assert(test_non_convert_to_path()); +#endif // TEST_HAS_NO_CHAR8_T + +static_assert(test_non_convert_to_path()); +static_assert(test_non_convert_to_path()); + int main(int, char**) { fs::path p = get_temp_file_name(); { diff --git a/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/ifstream.cons/path.pass.cpp b/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/ifstream.cons/path.pass.cpp index cfbb8419fe..2f27fd8e6e 100644 --- a/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/ifstream.cons/path.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/ifstream.cons/path.pass.cpp @@ -17,8 +17,9 @@ // template > // class basic_ifstream -// explicit basic_ifstream(const filesystem::path& s, -// ios_base::openmode mode = ios_base::in); +// template +// explicit basic_ifstream(const T& s, ios_base::openmode mode = ios_base::in); // Since C++17 +// Constraints: is_same_v is true #include #include @@ -26,9 +27,39 @@ #include #include "test_macros.h" +#include "test_iterators.h" namespace fs = std::filesystem; +template +constexpr bool test_non_convert_to_path() { + // String types + static_assert(!std::is_constructible_v>); + static_assert(!std::is_constructible_v>); + + // Char* pointers + if constexpr (!std::is_same_v) + static_assert(!std::is_constructible_v); + + // Iterators + static_assert(!std::is_convertible_v>); + + return true; +} + +static_assert(test_non_convert_to_path()); + +#if !defined(TEST_HAS_NO_WIDE_CHARACTERS) && !defined(TEST_HAS_OPEN_WITH_WCHAR) +static_assert(test_non_convert_to_path()); +#endif // !TEST_HAS_NO_WIDE_CHARACTERS && !TEST_HAS_OPEN_WITH_WCHAR + +#ifndef TEST_HAS_NO_CHAR8_T +static_assert(test_non_convert_to_path()); +#endif // TEST_HAS_NO_CHAR8_T + +static_assert(test_non_convert_to_path()); +static_assert(test_non_convert_to_path()); + int main(int, char**) { { fs::path p; diff --git a/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/ofstream.cons/path.pass.cpp b/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/ofstream.cons/path.pass.cpp index 316ed776a4..e55adfd83f 100644 --- a/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/ofstream.cons/path.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/input.output/file.streams/fstreams/ofstream.cons/path.pass.cpp @@ -15,7 +15,9 @@ // plate > // class basic_ofstream -// explicit basic_ofstream(const filesystem::path& s, ios_base::openmode mode = ios_base::out); +// template +// explicit basic_ifstream(const T& s, ios_base::openmode mode = ios_base::in); // Since C++17 +// Constraints: is_same_v is true #include #include @@ -24,9 +26,39 @@ #include "platform_support.h" #include "test_macros.h" +#include "test_iterators.h" namespace fs = std::filesystem; +template +constexpr bool test_non_convert_to_path() { + // String types + static_assert(!std::is_constructible_v>); + static_assert(!std::is_constructible_v>); + + // Char* pointers + if constexpr (!std::is_same_v) + static_assert(!std::is_constructible_v); + + // Iterators + static_assert(!std::is_convertible_v>); + + return true; +} + +static_assert(test_non_convert_to_path()); + +#if !defined(TEST_HAS_NO_WIDE_CHARACTERS) && !defined(TEST_HAS_OPEN_WITH_WCHAR) +static_assert(test_non_convert_to_path()); +#endif // !TEST_HAS_NO_WIDE_CHARACTERS && !TEST_HAS_OPEN_WITH_WCHAR + +#ifndef TEST_HAS_NO_CHAR8_T +static_assert(test_non_convert_to_path()); +#endif // TEST_HAS_NO_CHAR8_T + +static_assert(test_non_convert_to_path()); +static_assert(test_non_convert_to_path()); + int main(int, char**) { fs::path p = get_temp_file_name(); { diff --git a/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.formatted.print/locale-specific_form.pass.cpp b/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.formatted.print/locale-specific_form.pass.cpp index 6b62e2f175..2e19e38e2e 100644 --- a/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.formatted.print/locale-specific_form.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.formatted.print/locale-specific_form.pass.cpp @@ -26,6 +26,7 @@ // void print(ostream& os, format_string fmt, Args&&... args); // template // void println(ostream& os, format_string fmt, Args&&... args); +// void println(ostream& os); // since C++26 // // void vprint_unicode(ostream& os, string_view fmt, format_args args); // void vprint_nonunicode(ostream& os, string_view fmt, format_args args); @@ -67,7 +68,7 @@ test(std::stringstream& stream, std::string expected, test_format_string(args)...); std::string out = stream.str(); TEST_REQUIRE(out == expected, @@ -111,6 +112,7 @@ static void test(std::string expected, std::locale loc, test_format_string { string_type do_truename() const override { return "gültig"; } string_type do_falsename() const override { return "ungültig"; } @@ -2188,12 +2190,47 @@ static void test_floating_point() { test_floating_point_default_precision(); } +static void test_println_blank_line(std::stringstream& stream) { + std::string expected{'\n'}; + stream.str(""); + + std::println(stream); + std::string out = stream.str(); + TEST_REQUIRE(out == expected, + TEST_WRITE_CONCATENATED("\nExpected output (blank line) ", expected, "\nActual output ", out, '\n')); +} + +static void test_println_blank_line(std::locale loc) { + std::stringstream stream; + stream.imbue(loc); + test_println_blank_line(stream); +} + +static void test_println_blank_line() { + std::locale::global(std::locale(LOCALE_en_US_UTF_8)); + assert(std::locale().name() == LOCALE_en_US_UTF_8); + std::stringstream stream; + test_println_blank_line(stream); + + std::locale loc = std::locale(std::locale(), new numpunct()); + std::locale::global(loc); + test_println_blank_line(std::locale(LOCALE_en_US_UTF_8)); + +#ifndef TEST_HAS_NO_UNICODE + + std::locale loc_unicode = std::locale(std::locale(), new numpunct_unicode()); + test_println_blank_line(loc_unicode); + +#endif // TEST_HAS_NO_UNICODE +} + int main(int, char**) { test_bool(); test_integer(); test_floating_point(); test_floating_point(); test_floating_point(); + test_println_blank_line(); return 0; } diff --git a/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.formatted.print/println.pass.cpp b/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.formatted.print/println.pass.cpp index 479a3de0a9..19a02638a9 100644 --- a/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.formatted.print/println.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.formatted.print/println.pass.cpp @@ -17,6 +17,7 @@ // template // void println(ostream& os, format_string fmt, Args&&... args); +// void println(ostream& os); // since C++26 // [ostream.formatted.print]/3 // If the function is vprint_unicode and os is a stream that refers to @@ -55,8 +56,20 @@ auto test_exception = [](std::string_view, std::string_view, Args // The exceptions are tested by other functions that don't use the basic-format-string as fmt argument. }; +void test_println_blank_line() { + std::string expected{'\n'}; + + std::stringstream sstr; + std::println(sstr); + + std::string out = sstr.str(); + TEST_REQUIRE(out == expected, + TEST_WRITE_CONCATENATED("\nExpected output (blank line) ", expected, "\nActual output ", out, '\n')); +}; + int main(int, char**) { print_tests(test_file, test_exception); + test_println_blank_line(); return 0; } diff --git a/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/print.fun/no_file_description.pass.cpp b/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/print.fun/no_file_description.pass.cpp index f502616b67..ffa48c5e74 100644 --- a/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/print.fun/no_file_description.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/print.fun/no_file_description.pass.cpp @@ -25,8 +25,10 @@ // template // void print(FILE* stream, format_string fmt, Args&&... args); +// void println(); // Since C++26 // template // void println(FILE* stream, format_string fmt, Args&&... args); +// void println(FILE* stream); // Since C++26 // void vprint_unicode(FILE* stream, string_view fmt, format_args args); // void vprint_nonunicode(FILE* stream, string_view fmt, format_args args); @@ -63,6 +65,20 @@ static void test_println() { assert(std::string_view(buffer.data(), pos) == "hello world!\n"); } +static void test_println_blank_line() { + std::array buffer{0}; + + FILE* file = fmemopen(buffer.data(), buffer.size(), "wb"); + assert(file); + + std::println(file); + long pos = std::ftell(file); + std::fclose(file); + + assert(pos > 0); + assert(std::string_view(buffer.data(), pos) == "\n"); +} + static void test_vprint_unicode() { std::array buffer{0}; @@ -96,6 +112,7 @@ static void test_vprint_nonunicode() { int main(int, char**) { test_print(); test_println(); + test_println_blank_line(); test_vprint_unicode(); test_vprint_nonunicode(); diff --git a/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/print.fun/println.blank_line.sh.cpp b/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/print.fun/println.blank_line.sh.cpp new file mode 100644 index 0000000000..a262c28710 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/print.fun/println.blank_line.sh.cpp @@ -0,0 +1,50 @@ +//===----------------------------------------------------------------------===// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 +// UNSUPPORTED: no-filesystem +// UNSUPPORTED: executor-has-no-bash +// UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME + +// FIXME PRINT How to test println on Windows? +// XFAIL: msvc, target={{.+}}-windows-gnu + +// XFAIL: availability-fp_to_chars-missing + +// + +// void println(); + +// Testing this properly is quite hard; the function unconditionally +// writes to stdout. When stdout is redirected to a file it is no longer +// considered a terminal. The function is a small wrapper around +// +// template +// void println(FILE* stream, format_string fmt, Args&&... args); +// +// So do minimal tests for this function and rely on the FILE* overload +// to do more testing. +// +// The testing is based on the testing for std::cout. + +// TODO PRINT Use lit builtin echo + +// FILE_DEPENDENCIES: echo.sh +// RUN: %{build} +// RUN: %{exec} bash echo.sh -ne "println blank line test: \n" > %t.expected +// RUN: %{exec} "%t.exe" > %t.actual +// RUN: diff -u %t.actual %t.expected + +#include + +int main(int, char**) { + // On some configurations the `diff -u` test fails if we print a single blank line character `\n`, so we print some text first. + std::print("println blank line test: "); + std::println(); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/print.fun/println.file.pass.cpp b/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/print.fun/println.file.pass.cpp index 07272ebb57..2f088e7a7d 100644 --- a/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/print.fun/println.file.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/input.output/iostream.format/print.fun/println.file.pass.cpp @@ -129,6 +129,29 @@ static void test_new_line() { } } +static void test_println_blank_line() { + // Text does newline translation. + { + FILE* file = fopen(filename.c_str(), "w"); + assert(file); + + std::println(file); +#ifndef _WIN32 + assert(std::ftell(file) == 1); +#else + assert(std::ftell(file) == 2); +#endif + } + // Binary no newline translation. + { + FILE* file = fopen(filename.c_str(), "wb"); + assert(file); + + std::println(file); + assert(std::ftell(file) == 1); + } +} + int main(int, char**) { print_tests(test_file, test_exception); @@ -137,6 +160,7 @@ int main(int, char**) { #endif test_read_only(); test_new_line(); + test_println_blank_line(); return 0; } diff --git a/yass/third_party/libc++/trunk/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_count_sentinel.pass.cpp b/yass/third_party/libc++/trunk/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_count_sentinel.pass.cpp index a1c1564018..76439ef93a 100644 --- a/yass/third_party/libc++/trunk/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_count_sentinel.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_count_sentinel.pass.cpp @@ -21,9 +21,12 @@ #include "../types.h" template -constexpr void check_forward(int* first, int* last, std::iter_difference_t n, int* expected) { +constexpr void +check_forward(int* first, int* last, std::iter_difference_t n, int* expected, int expected_equals_count = -1) { using Difference = std::iter_difference_t; Difference const M = (expected - first); // expected travel distance + // `expected_equals_count` is only relevant when `Count` is true. + assert(Count || expected_equals_count == -1); { It it(first); @@ -42,6 +45,7 @@ constexpr void check_forward(int* first, int* last, std::iter_difference_t n // regardless of the iterator category. assert(it.stride_count() == M); assert(it.stride_displacement() == M); + assert(it.equals_count() == expected_equals_count); } } @@ -74,9 +78,20 @@ constexpr void check_forward_sized_sentinel(int* first, int* last, std::iter_dif } } -template -constexpr void check_backward(int* first, int* last, std::iter_difference_t n, int* expected) { - static_assert(std::random_access_iterator, "This test doesn't support non random access iterators"); +struct Expected { + int stride_count; + int stride_displacement; + int equals_count; +}; + +template +constexpr void +check_backward(int* first, int* last, std::iter_difference_t n, int* expected, Expected expected_counts) { + // Check preconditions for `advance` when called with negative `n` + // (see [range.iter.op.advance]). In addition, allow `n == 0`. + assert(n <= 0); + static_assert(std::bidirectional_iterator); + using Difference = std::iter_difference_t; Difference const M = (expected - last); // expected travel distance (which is negative) @@ -92,9 +107,14 @@ constexpr void check_backward(int* first, int* last, std::iter_difference_t { auto it = stride_counting_iterator(It(last)); auto sent = stride_counting_iterator(It(first)); + static_assert(std::bidirectional_iterator>); + static_assert(Count == !std::sized_sentinel_for); + (void)std::ranges::advance(it, n, sent); - assert(it.stride_count() <= 1); - assert(it.stride_displacement() <= 1); + + assert(it.stride_count() == expected_counts.stride_count); + assert(it.stride_displacement() == expected_counts.stride_displacement); + assert(it.equals_count() == expected_counts.equals_count); } } @@ -171,13 +191,17 @@ constexpr bool test() { { int* expected = n > size ? range + size : range + n; + int equals_count = n > size ? size + 1 : n; + + // clang-format off check_forward>( range, range+size, n, expected); check_forward>( range, range+size, n, expected); - check_forward>( range, range+size, n, expected); - check_forward>(range, range+size, n, expected); - check_forward>(range, range+size, n, expected); - check_forward>( range, range+size, n, expected); - check_forward( range, range+size, n, expected); + check_forward>( range, range+size, n, expected, equals_count); + check_forward>(range, range+size, n, expected, equals_count); + check_forward>(range, range+size, n, expected, equals_count); + check_forward>( range, range+size, n, expected, equals_count); + check_forward( range, range+size, n, expected, equals_count); + // clang-format on check_forward_sized_sentinel>( range, range+size, n, expected); check_forward_sized_sentinel>( range, range+size, n, expected); @@ -188,14 +212,32 @@ constexpr bool test() { check_forward_sized_sentinel( range, range+size, n, expected); } + // Input and forward iterators are not tested as the backwards case does + // not apply for them. { - // Note that we can only test ranges::advance with a negative n for iterators that - // are sized sentinels for themselves, because ranges::advance is UB otherwise. - // In particular, that excludes bidirectional_iterators since those are not sized sentinels. int* expected = n > size ? range : range + size - n; - check_backward>(range, range+size, -n, expected); - check_backward>( range, range+size, -n, expected); - check_backward( range, range+size, -n, expected); + { + Expected expected_counts = { + .stride_count = static_cast(range + size - expected), + .stride_displacement = -expected_counts.stride_count, + .equals_count = n > size ? size + 1 : n, + }; + + check_backward>(range, range + size, -n, expected, expected_counts); + } + { + Expected expected_counts = { + // If `n >= size`, the algorithm can just do `it = std::move(sent);` + // instead of doing iterator arithmetic. + .stride_count = (n >= size) ? 0 : 1, + .stride_displacement = (n >= size) ? 0 : 1, + .equals_count = 0, + }; + + check_backward>(range, range + size, -n, expected, expected_counts); + check_backward>(range, range + size, -n, expected, expected_counts); + check_backward(range, range + size, -n, expected, expected_counts); + } } } } diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/algorithm.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/algorithm.version.compile.pass.cpp index ece13b0a23..8ccd252115 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/algorithm.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/algorithm.version.compile.pass.cpp @@ -15,17 +15,18 @@ // Test the feature test macros defined by -/* Constant Value - __cpp_lib_clamp 201603L [C++17] - __cpp_lib_constexpr_algorithms 201806L [C++20] - __cpp_lib_freestanding_algorithm 202311L [C++26] - __cpp_lib_parallel_algorithm 201603L [C++17] - __cpp_lib_ranges 202207L [C++20] - __cpp_lib_ranges_contains 202207L [C++23] - __cpp_lib_ranges_starts_ends_with 202106L [C++23] - __cpp_lib_robust_nonmodifying_seq_ops 201304L [C++14] - __cpp_lib_sample 201603L [C++17] - __cpp_lib_shift 201806L [C++20] +/* Constant Value + __cpp_lib_clamp 201603L [C++17] + __cpp_lib_constexpr_algorithms 201806L [C++20] + __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26] + __cpp_lib_freestanding_algorithm 202311L [C++26] + __cpp_lib_parallel_algorithm 201603L [C++17] + __cpp_lib_ranges 202207L [C++20] + __cpp_lib_ranges_contains 202207L [C++23] + __cpp_lib_ranges_starts_ends_with 202106L [C++23] + __cpp_lib_robust_nonmodifying_seq_ops 201304L [C++14] + __cpp_lib_sample 201603L [C++17] + __cpp_lib_shift 201806L [C++20] */ #include @@ -41,6 +42,10 @@ # error "__cpp_lib_constexpr_algorithms should not be defined before c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_algorithm # error "__cpp_lib_freestanding_algorithm should not be defined before c++26" # endif @@ -83,6 +88,10 @@ # error "__cpp_lib_constexpr_algorithms should not be defined before c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_algorithm # error "__cpp_lib_freestanding_algorithm should not be defined before c++26" # endif @@ -131,6 +140,10 @@ # error "__cpp_lib_constexpr_algorithms should not be defined before c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_algorithm # error "__cpp_lib_freestanding_algorithm should not be defined before c++26" # endif @@ -194,6 +207,10 @@ # error "__cpp_lib_constexpr_algorithms should have the value 201806L in c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_algorithm # error "__cpp_lib_freestanding_algorithm should not be defined before c++26" # endif @@ -263,6 +280,10 @@ # error "__cpp_lib_constexpr_algorithms should have the value 201806L in c++23" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_algorithm # error "__cpp_lib_freestanding_algorithm should not be defined before c++26" # endif @@ -338,6 +359,19 @@ # error "__cpp_lib_constexpr_algorithms should have the value 201806L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26" +# endif +# if __cpp_lib_default_template_type_for_algorithm_values != 202403L +# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!" +# endif +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_freestanding_algorithm # error "__cpp_lib_freestanding_algorithm should be defined in c++26" diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp index 86315c23a4..c907b7d840 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp @@ -20,6 +20,7 @@ __cpp_lib_atomic_float 201711L [C++20] __cpp_lib_atomic_is_always_lock_free 201603L [C++17] __cpp_lib_atomic_lock_free_type_aliases 201907L [C++20] + __cpp_lib_atomic_min_max 202403L [C++26] __cpp_lib_atomic_ref 201806L [C++20] __cpp_lib_atomic_shared_ptr 201711L [C++20] __cpp_lib_atomic_value_initialization 201911L [C++20] @@ -48,6 +49,10 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20" # endif +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined before c++26" +# endif + # ifdef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should not be defined before c++20" # endif @@ -86,6 +91,10 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20" # endif +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined before c++26" +# endif + # ifdef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should not be defined before c++20" # endif @@ -127,6 +136,10 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20" # endif +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined before c++26" +# endif + # ifdef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should not be defined before c++20" # endif @@ -183,6 +196,10 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should have the value 201907L in c++20" # endif +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined before c++26" +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should be defined in c++20" @@ -278,6 +295,10 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should have the value 201907L in c++23" # endif +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined before c++26" +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should be defined in c++23" @@ -373,6 +394,19 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should have the value 201907L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should be defined in c++26" +# endif +# if __cpp_lib_atomic_min_max != 202403L +# error "__cpp_lib_atomic_min_max should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined because it is unimplemented in libc++!" +# endif +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should be defined in c++26" diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/deque.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/deque.version.compile.pass.cpp index 4a398e2306..720557f33e 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/deque.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/deque.version.compile.pass.cpp @@ -15,11 +15,12 @@ // Test the feature test macros defined by -/* Constant Value - __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] - __cpp_lib_erase_if 202002L [C++20] - __cpp_lib_nonmember_container_access 201411L [C++17] - __cpp_lib_ranges_to_container 202202L [C++23] +/* Constant Value + __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] + __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26] + __cpp_lib_erase_if 202002L [C++20] + __cpp_lib_nonmember_container_access 201411L [C++17] + __cpp_lib_ranges_to_container 202202L [C++23] */ #include @@ -31,6 +32,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -49,6 +54,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -70,6 +79,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++17" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -94,6 +107,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++20" # endif @@ -121,6 +138,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++23" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++23" # endif @@ -151,6 +172,19 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26" +# endif +# if __cpp_lib_default_template_type_for_algorithm_values != 202403L +# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++26" # endif diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/filesystem.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/filesystem.version.compile.pass.cpp index 3f03e8be9a..308cc2d43b 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/filesystem.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/filesystem.version.compile.pass.cpp @@ -17,9 +17,10 @@ // Test the feature test macros defined by -/* Constant Value - __cpp_lib_char8_t 201907L [C++20] - __cpp_lib_filesystem 201703L [C++17] +/* Constant Value + __cpp_lib_char8_t 201907L [C++20] + __cpp_lib_filesystem 201703L [C++17] + __cpp_lib_format_path 202403L [C++23] */ #include @@ -35,6 +36,10 @@ # error "__cpp_lib_filesystem should not be defined before c++17" # endif +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined before c++23" +# endif + #elif TEST_STD_VER == 14 # ifdef __cpp_lib_char8_t @@ -45,6 +50,10 @@ # error "__cpp_lib_filesystem should not be defined before c++17" # endif +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined before c++23" +# endif + #elif TEST_STD_VER == 17 # ifdef __cpp_lib_char8_t @@ -64,6 +73,10 @@ # endif # endif +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined before c++23" +# endif + #elif TEST_STD_VER == 20 # if defined(__cpp_char8_t) @@ -92,6 +105,10 @@ # endif # endif +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined before c++23" +# endif + #elif TEST_STD_VER == 23 # if defined(__cpp_char8_t) @@ -120,6 +137,19 @@ # endif # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_format_path +# error "__cpp_lib_format_path should be defined in c++23" +# endif +# if __cpp_lib_format_path != 202403L +# error "__cpp_lib_format_path should have the value 202403L in c++23" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined because it is unimplemented in libc++!" +# endif +# endif + #elif TEST_STD_VER > 23 # if defined(__cpp_char8_t) @@ -148,5 +178,18 @@ # endif # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_format_path +# error "__cpp_lib_format_path should be defined in c++26" +# endif +# if __cpp_lib_format_path != 202403L +# error "__cpp_lib_format_path should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined because it is unimplemented in libc++!" +# endif +# endif + #endif // TEST_STD_VER > 23 diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/forward_list.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/forward_list.version.compile.pass.cpp index b163943114..9305cf0c54 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/forward_list.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/forward_list.version.compile.pass.cpp @@ -15,13 +15,14 @@ // Test the feature test macros defined by -/* Constant Value - __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] - __cpp_lib_erase_if 202002L [C++20] - __cpp_lib_incomplete_container_elements 201505L [C++17] - __cpp_lib_list_remove_return_type 201806L [C++20] - __cpp_lib_nonmember_container_access 201411L [C++17] - __cpp_lib_ranges_to_container 202202L [C++23] +/* Constant Value + __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] + __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26] + __cpp_lib_erase_if 202002L [C++20] + __cpp_lib_incomplete_container_elements 201505L [C++17] + __cpp_lib_list_remove_return_type 201806L [C++20] + __cpp_lib_nonmember_container_access 201411L [C++17] + __cpp_lib_ranges_to_container 202202L [C++23] */ #include @@ -33,6 +34,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -59,6 +64,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -88,6 +97,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++17" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -123,6 +136,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++20" # endif @@ -164,6 +181,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++23" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++23" # endif @@ -208,6 +229,19 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26" +# endif +# if __cpp_lib_default_template_type_for_algorithm_values != 202403L +# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++26" # endif diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/functional.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/functional.version.compile.pass.cpp index 72c96c62b6..aeb09a30b4 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/functional.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/functional.version.compile.pass.cpp @@ -17,7 +17,6 @@ /* Constant Value __cpp_lib_bind_back 202202L [C++23] - 202306L [C++26] __cpp_lib_bind_front 201907L [C++20] 202306L [C++26] __cpp_lib_boyer_moore_searcher 201603L [C++17] @@ -29,6 +28,7 @@ __cpp_lib_move_only_function 202110L [C++23] __cpp_lib_not_fn 201603L [C++17] __cpp_lib_ranges 202207L [C++20] + __cpp_lib_reference_wrapper 202403L [C++26] __cpp_lib_result_of_sfinae 201210L [C++14] __cpp_lib_transparent_operators 201210L [C++14] 201510L [C++17] @@ -84,6 +84,10 @@ # error "__cpp_lib_ranges should not be defined before c++20" # endif +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined before c++26" +# endif + # ifdef __cpp_lib_result_of_sfinae # error "__cpp_lib_result_of_sfinae should not be defined before c++14" # endif @@ -142,6 +146,10 @@ # error "__cpp_lib_ranges should not be defined before c++20" # endif +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined before c++26" +# endif + # ifndef __cpp_lib_result_of_sfinae # error "__cpp_lib_result_of_sfinae should be defined in c++14" # endif @@ -215,6 +223,10 @@ # error "__cpp_lib_ranges should not be defined before c++20" # endif +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined before c++26" +# endif + # ifndef __cpp_lib_result_of_sfinae # error "__cpp_lib_result_of_sfinae should be defined in c++17" # endif @@ -297,6 +309,10 @@ # error "__cpp_lib_ranges should have the value 202207L in c++20" # endif +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined before c++26" +# endif + # ifndef __cpp_lib_result_of_sfinae # error "__cpp_lib_result_of_sfinae should be defined in c++20" # endif @@ -320,17 +336,11 @@ #elif TEST_STD_VER == 23 -# if !defined(_LIBCPP_VERSION) -# ifndef __cpp_lib_bind_back -# error "__cpp_lib_bind_back should be defined in c++23" -# endif -# if __cpp_lib_bind_back != 202202L -# error "__cpp_lib_bind_back should have the value 202202L in c++23" -# endif -# else // _LIBCPP_VERSION -# ifdef __cpp_lib_bind_back -# error "__cpp_lib_bind_back should not be defined because it is unimplemented in libc++!" -# endif +# ifndef __cpp_lib_bind_back +# error "__cpp_lib_bind_back should be defined in c++23" +# endif +# if __cpp_lib_bind_back != 202202L +# error "__cpp_lib_bind_back should have the value 202202L in c++23" # endif # ifndef __cpp_lib_bind_front @@ -403,6 +413,10 @@ # error "__cpp_lib_ranges should have the value 202207L in c++23" # endif +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined before c++26" +# endif + # ifndef __cpp_lib_result_of_sfinae # error "__cpp_lib_result_of_sfinae should be defined in c++23" # endif @@ -426,17 +440,11 @@ #elif TEST_STD_VER > 23 -# if !defined(_LIBCPP_VERSION) -# ifndef __cpp_lib_bind_back -# error "__cpp_lib_bind_back should be defined in c++26" -# endif -# if __cpp_lib_bind_back != 202306L -# error "__cpp_lib_bind_back should have the value 202306L in c++26" -# endif -# else // _LIBCPP_VERSION -# ifdef __cpp_lib_bind_back -# error "__cpp_lib_bind_back should not be defined because it is unimplemented in libc++!" -# endif +# ifndef __cpp_lib_bind_back +# error "__cpp_lib_bind_back should be defined in c++26" +# endif +# if __cpp_lib_bind_back != 202202L +# error "__cpp_lib_bind_back should have the value 202202L in c++26" # endif # ifndef __cpp_lib_bind_front @@ -527,6 +535,19 @@ # error "__cpp_lib_ranges should have the value 202207L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should be defined in c++26" +# endif +# if __cpp_lib_reference_wrapper != 202403L +# error "__cpp_lib_reference_wrapper should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_result_of_sfinae # error "__cpp_lib_result_of_sfinae should be defined in c++26" # endif diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/list.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/list.version.compile.pass.cpp index 48bff77f91..12225612b8 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/list.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/list.version.compile.pass.cpp @@ -15,13 +15,14 @@ // Test the feature test macros defined by -/* Constant Value - __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] - __cpp_lib_erase_if 202002L [C++20] - __cpp_lib_incomplete_container_elements 201505L [C++17] - __cpp_lib_list_remove_return_type 201806L [C++20] - __cpp_lib_nonmember_container_access 201411L [C++17] - __cpp_lib_ranges_to_container 202202L [C++23] +/* Constant Value + __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] + __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26] + __cpp_lib_erase_if 202002L [C++20] + __cpp_lib_incomplete_container_elements 201505L [C++17] + __cpp_lib_list_remove_return_type 201806L [C++20] + __cpp_lib_nonmember_container_access 201411L [C++17] + __cpp_lib_ranges_to_container 202202L [C++23] */ #include @@ -33,6 +34,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -59,6 +64,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -88,6 +97,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++17" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -123,6 +136,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++20" # endif @@ -164,6 +181,10 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++23" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++23" # endif @@ -208,6 +229,19 @@ # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26" +# endif +# if __cpp_lib_default_template_type_for_algorithm_values != 202403L +# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++26" # endif diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/optional.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/optional.version.compile.pass.cpp index 99716d8f16..15350a949e 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/optional.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/optional.version.compile.pass.cpp @@ -16,6 +16,7 @@ // Test the feature test macros defined by /* Constant Value + __cpp_lib_constrained_equality 202403L [C++26] __cpp_lib_freestanding_optional 202311L [C++26] __cpp_lib_optional 201606L [C++17] 202110L [C++23] @@ -26,6 +27,10 @@ #if TEST_STD_VER < 14 +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_optional # error "__cpp_lib_freestanding_optional should not be defined before c++26" # endif @@ -36,6 +41,10 @@ #elif TEST_STD_VER == 14 +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_optional # error "__cpp_lib_freestanding_optional should not be defined before c++26" # endif @@ -46,6 +55,10 @@ #elif TEST_STD_VER == 17 +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_optional # error "__cpp_lib_freestanding_optional should not be defined before c++26" # endif @@ -59,6 +72,10 @@ #elif TEST_STD_VER == 20 +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_optional # error "__cpp_lib_freestanding_optional should not be defined before c++26" # endif @@ -72,6 +89,10 @@ #elif TEST_STD_VER == 23 +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_optional # error "__cpp_lib_freestanding_optional should not be defined before c++26" # endif @@ -85,6 +106,19 @@ #elif TEST_STD_VER > 23 +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should be defined in c++26" +# endif +# if __cpp_lib_constrained_equality != 202403L +# error "__cpp_lib_constrained_equality should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!" +# endif +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_freestanding_optional # error "__cpp_lib_freestanding_optional should be defined in c++26" diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/random.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/random.version.compile.pass.cpp new file mode 100644 index 0000000000..1f138d948c --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/random.version.compile.pass.cpp @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// WARNING: This test was generated by generate_feature_test_macro_components.py +// and should not be edited manually. +// +// clang-format off + +// + +// Test the feature test macros defined by + +/* Constant Value + __cpp_lib_generate_random 202403L [C++26] +*/ + +#include +#include "test_macros.h" + +#if TEST_STD_VER < 14 + +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined before c++26" +# endif + +#elif TEST_STD_VER == 14 + +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined before c++26" +# endif + +#elif TEST_STD_VER == 17 + +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined before c++26" +# endif + +#elif TEST_STD_VER == 20 + +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined before c++26" +# endif + +#elif TEST_STD_VER == 23 + +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined before c++26" +# endif + +#elif TEST_STD_VER > 23 + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should be defined in c++26" +# endif +# if __cpp_lib_generate_random != 202403L +# error "__cpp_lib_generate_random should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined because it is unimplemented in libc++!" +# endif +# endif + +#endif // TEST_STD_VER > 23 + diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp index aa3a4964ad..30feacd796 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp @@ -15,17 +15,19 @@ // Test the feature test macros defined by -/* Constant Value - __cpp_lib_ranges 202207L [C++20] - __cpp_lib_ranges_as_const 202207L [C++23] - __cpp_lib_ranges_as_rvalue 202207L [C++23] - __cpp_lib_ranges_chunk 202202L [C++23] - __cpp_lib_ranges_chunk_by 202202L [C++23] - __cpp_lib_ranges_join_with 202202L [C++23] - __cpp_lib_ranges_repeat 202207L [C++23] - __cpp_lib_ranges_slide 202202L [C++23] - __cpp_lib_ranges_to_container 202202L [C++23] - __cpp_lib_ranges_zip 202110L [C++23] +/* Constant Value + __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26] + __cpp_lib_ranges 202207L [C++20] + __cpp_lib_ranges_as_const 202207L [C++23] + __cpp_lib_ranges_as_rvalue 202207L [C++23] + __cpp_lib_ranges_chunk 202202L [C++23] + __cpp_lib_ranges_chunk_by 202202L [C++23] + __cpp_lib_ranges_concat 202403L [C++26] + __cpp_lib_ranges_join_with 202202L [C++23] + __cpp_lib_ranges_repeat 202207L [C++23] + __cpp_lib_ranges_slide 202202L [C++23] + __cpp_lib_ranges_to_container 202202L [C++23] + __cpp_lib_ranges_zip 202110L [C++23] */ #include @@ -33,6 +35,10 @@ #if TEST_STD_VER < 14 +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_ranges # error "__cpp_lib_ranges should not be defined before c++20" # endif @@ -53,6 +59,10 @@ # error "__cpp_lib_ranges_chunk_by should not be defined before c++23" # endif +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined before c++26" +# endif + # ifdef __cpp_lib_ranges_join_with # error "__cpp_lib_ranges_join_with should not be defined before c++23" # endif @@ -75,6 +85,10 @@ #elif TEST_STD_VER == 14 +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_ranges # error "__cpp_lib_ranges should not be defined before c++20" # endif @@ -95,6 +109,10 @@ # error "__cpp_lib_ranges_chunk_by should not be defined before c++23" # endif +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined before c++26" +# endif + # ifdef __cpp_lib_ranges_join_with # error "__cpp_lib_ranges_join_with should not be defined before c++23" # endif @@ -117,6 +135,10 @@ #elif TEST_STD_VER == 17 +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_ranges # error "__cpp_lib_ranges should not be defined before c++20" # endif @@ -137,6 +159,10 @@ # error "__cpp_lib_ranges_chunk_by should not be defined before c++23" # endif +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined before c++26" +# endif + # ifdef __cpp_lib_ranges_join_with # error "__cpp_lib_ranges_join_with should not be defined before c++23" # endif @@ -159,6 +185,10 @@ #elif TEST_STD_VER == 20 +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_ranges # error "__cpp_lib_ranges should be defined in c++20" # endif @@ -182,6 +212,10 @@ # error "__cpp_lib_ranges_chunk_by should not be defined before c++23" # endif +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined before c++26" +# endif + # ifdef __cpp_lib_ranges_join_with # error "__cpp_lib_ranges_join_with should not be defined before c++23" # endif @@ -204,6 +238,10 @@ #elif TEST_STD_VER == 23 +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_ranges # error "__cpp_lib_ranges should be defined in c++23" # endif @@ -251,6 +289,10 @@ # error "__cpp_lib_ranges_chunk_by should have the value 202202L in c++23" # endif +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined before c++26" +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_ranges_join_with # error "__cpp_lib_ranges_join_with should be defined in c++23" @@ -306,6 +348,19 @@ #elif TEST_STD_VER > 23 +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26" +# endif +# if __cpp_lib_default_template_type_for_algorithm_values != 202403L +# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_ranges # error "__cpp_lib_ranges should be defined in c++26" # endif @@ -353,6 +408,19 @@ # error "__cpp_lib_ranges_chunk_by should have the value 202202L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should be defined in c++26" +# endif +# if __cpp_lib_ranges_concat != 202403L +# error "__cpp_lib_ranges_concat should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined because it is unimplemented in libc++!" +# endif +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_ranges_join_with # error "__cpp_lib_ranges_join_with should be defined in c++26" diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp index b5770f8fbe..8d944a194f 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp @@ -15,20 +15,21 @@ // Test the feature test macros defined by -/* Constant Value - __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] - __cpp_lib_char8_t 201907L [C++20] - __cpp_lib_constexpr_string 201907L [C++20] - __cpp_lib_erase_if 202002L [C++20] - __cpp_lib_nonmember_container_access 201411L [C++17] - __cpp_lib_ranges_to_container 202202L [C++23] - __cpp_lib_starts_ends_with 201711L [C++20] - __cpp_lib_string_contains 202011L [C++23] - __cpp_lib_string_resize_and_overwrite 202110L [C++23] - __cpp_lib_string_udls 201304L [C++14] - __cpp_lib_string_view 201606L [C++17] - 201803L [C++20] - __cpp_lib_to_string 202306L [C++23] +/* Constant Value + __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] + __cpp_lib_char8_t 201907L [C++20] + __cpp_lib_constexpr_string 201907L [C++20] + __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26] + __cpp_lib_erase_if 202002L [C++20] + __cpp_lib_nonmember_container_access 201411L [C++17] + __cpp_lib_ranges_to_container 202202L [C++23] + __cpp_lib_starts_ends_with 201711L [C++20] + __cpp_lib_string_contains 202011L [C++23] + __cpp_lib_string_resize_and_overwrite 202110L [C++23] + __cpp_lib_string_udls 201304L [C++14] + __cpp_lib_string_view 201606L [C++17] + 201803L [C++20] + __cpp_lib_to_string 202306L [C++23] */ #include @@ -48,6 +49,10 @@ # error "__cpp_lib_constexpr_string should not be defined before c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -98,6 +103,10 @@ # error "__cpp_lib_constexpr_string should not be defined before c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -154,6 +163,10 @@ # error "__cpp_lib_constexpr_string should not be defined before c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -228,6 +241,10 @@ # error "__cpp_lib_constexpr_string should have the value 201907L in c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++20" # endif @@ -308,6 +325,10 @@ # error "__cpp_lib_constexpr_string should have the value 201907L in c++23" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++23" # endif @@ -406,6 +427,19 @@ # error "__cpp_lib_constexpr_string should have the value 201907L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26" +# endif +# if __cpp_lib_default_template_type_for_algorithm_values != 202403L +# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++26" # endif diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/tuple.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/tuple.version.compile.pass.cpp index ce17aef3ec..6dd2e968fb 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/tuple.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/tuple.version.compile.pass.cpp @@ -15,15 +15,16 @@ // Test the feature test macros defined by -/* Constant Value - __cpp_lib_apply 201603L [C++17] - __cpp_lib_constexpr_tuple 201811L [C++20] - __cpp_lib_make_from_tuple 201606L [C++17] - __cpp_lib_ranges_zip 202110L [C++23] - __cpp_lib_tuple_element_t 201402L [C++14] - __cpp_lib_tuple_like 202207L [C++23] - 202311L [C++26] - __cpp_lib_tuples_by_type 201304L [C++14] +/* Constant Value + __cpp_lib_apply 201603L [C++17] + __cpp_lib_constexpr_tuple 201811L [C++20] + __cpp_lib_constrained_equality 202403L [C++26] + __cpp_lib_make_from_tuple 201606L [C++17] + __cpp_lib_ranges_zip 202110L [C++23] + __cpp_lib_tuple_element_t 201402L [C++14] + __cpp_lib_tuple_like 202207L [C++23] + 202311L [C++26] + __cpp_lib_tuples_by_type 201304L [C++14] */ #include @@ -39,6 +40,10 @@ # error "__cpp_lib_constexpr_tuple should not be defined before c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_make_from_tuple # error "__cpp_lib_make_from_tuple should not be defined before c++17" # endif @@ -69,6 +74,10 @@ # error "__cpp_lib_constexpr_tuple should not be defined before c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_make_from_tuple # error "__cpp_lib_make_from_tuple should not be defined before c++17" # endif @@ -108,6 +117,10 @@ # error "__cpp_lib_constexpr_tuple should not be defined before c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifndef __cpp_lib_make_from_tuple # error "__cpp_lib_make_from_tuple should be defined in c++17" # endif @@ -153,6 +166,10 @@ # error "__cpp_lib_constexpr_tuple should have the value 201811L in c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifndef __cpp_lib_make_from_tuple # error "__cpp_lib_make_from_tuple should be defined in c++20" # endif @@ -198,6 +215,10 @@ # error "__cpp_lib_constexpr_tuple should have the value 201811L in c++23" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifndef __cpp_lib_make_from_tuple # error "__cpp_lib_make_from_tuple should be defined in c++23" # endif @@ -261,6 +282,19 @@ # error "__cpp_lib_constexpr_tuple should have the value 201811L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should be defined in c++26" +# endif +# if __cpp_lib_constrained_equality != 202403L +# error "__cpp_lib_constrained_equality should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_make_from_tuple # error "__cpp_lib_make_from_tuple should be defined in c++26" # endif diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/utility.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/utility.version.compile.pass.cpp index dd56f8d535..ab0988f1d4 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/utility.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/utility.version.compile.pass.cpp @@ -19,6 +19,7 @@ __cpp_lib_as_const 201510L [C++17] __cpp_lib_constexpr_algorithms 201806L [C++20] __cpp_lib_constexpr_utility 201811L [C++20] + __cpp_lib_constrained_equality 202403L [C++26] __cpp_lib_exchange_function 201304L [C++14] __cpp_lib_forward_like 202207L [C++23] __cpp_lib_integer_comparison_functions 202002L [C++20] @@ -48,6 +49,10 @@ # error "__cpp_lib_constexpr_utility should not be defined before c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_exchange_function # error "__cpp_lib_exchange_function should not be defined before c++14" # endif @@ -98,6 +103,10 @@ # error "__cpp_lib_constexpr_utility should not be defined before c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifndef __cpp_lib_exchange_function # error "__cpp_lib_exchange_function should be defined in c++14" # endif @@ -160,6 +169,10 @@ # error "__cpp_lib_constexpr_utility should not be defined before c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifndef __cpp_lib_exchange_function # error "__cpp_lib_exchange_function should be defined in c++17" # endif @@ -228,6 +241,10 @@ # error "__cpp_lib_constexpr_utility should have the value 201811L in c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifndef __cpp_lib_exchange_function # error "__cpp_lib_exchange_function should be defined in c++20" # endif @@ -299,6 +316,10 @@ # error "__cpp_lib_constexpr_utility should have the value 201811L in c++23" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifndef __cpp_lib_exchange_function # error "__cpp_lib_exchange_function should be defined in c++23" # endif @@ -397,6 +418,19 @@ # error "__cpp_lib_constexpr_utility should have the value 201811L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should be defined in c++26" +# endif +# if __cpp_lib_constrained_equality != 202403L +# error "__cpp_lib_constrained_equality should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_exchange_function # error "__cpp_lib_exchange_function should be defined in c++26" # endif diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/variant.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/variant.version.compile.pass.cpp index 3e65b1445d..4dcc477696 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/variant.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/variant.version.compile.pass.cpp @@ -16,6 +16,7 @@ // Test the feature test macros defined by /* Constant Value + __cpp_lib_constrained_equality 202403L [C++26] __cpp_lib_freestanding_variant 202311L [C++26] __cpp_lib_variant 202102L [C++17] */ @@ -25,6 +26,10 @@ #if TEST_STD_VER < 14 +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_variant # error "__cpp_lib_freestanding_variant should not be defined before c++26" # endif @@ -35,6 +40,10 @@ #elif TEST_STD_VER == 14 +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_variant # error "__cpp_lib_freestanding_variant should not be defined before c++26" # endif @@ -45,6 +54,10 @@ #elif TEST_STD_VER == 17 +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_variant # error "__cpp_lib_freestanding_variant should not be defined before c++26" # endif @@ -58,6 +71,10 @@ #elif TEST_STD_VER == 20 +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_variant # error "__cpp_lib_freestanding_variant should not be defined before c++26" # endif @@ -71,6 +88,10 @@ #elif TEST_STD_VER == 23 +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_freestanding_variant # error "__cpp_lib_freestanding_variant should not be defined before c++26" # endif @@ -84,6 +105,19 @@ #elif TEST_STD_VER > 23 +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should be defined in c++26" +# endif +# if __cpp_lib_constrained_equality != 202403L +# error "__cpp_lib_constrained_equality should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!" +# endif +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_freestanding_variant # error "__cpp_lib_freestanding_variant should be defined in c++26" diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/vector.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/vector.version.compile.pass.cpp index 6eee936b4e..3d0a956e6c 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/vector.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/vector.version.compile.pass.cpp @@ -15,13 +15,14 @@ // Test the feature test macros defined by -/* Constant Value - __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] - __cpp_lib_constexpr_vector 201907L [C++20] - __cpp_lib_erase_if 202002L [C++20] - __cpp_lib_incomplete_container_elements 201505L [C++17] - __cpp_lib_nonmember_container_access 201411L [C++17] - __cpp_lib_ranges_to_container 202202L [C++23] +/* Constant Value + __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] + __cpp_lib_constexpr_vector 201907L [C++20] + __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26] + __cpp_lib_erase_if 202002L [C++20] + __cpp_lib_incomplete_container_elements 201505L [C++17] + __cpp_lib_nonmember_container_access 201411L [C++17] + __cpp_lib_ranges_to_container 202202L [C++23] */ #include @@ -37,6 +38,10 @@ # error "__cpp_lib_constexpr_vector should not be defined before c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -63,6 +68,10 @@ # error "__cpp_lib_constexpr_vector should not be defined before c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -92,6 +101,10 @@ # error "__cpp_lib_constexpr_vector should not be defined before c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++20" # endif @@ -130,6 +143,10 @@ # error "__cpp_lib_constexpr_vector should have the value 201907L in c++20" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++20" # endif @@ -171,6 +188,10 @@ # error "__cpp_lib_constexpr_vector should have the value 201907L in c++23" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++23" # endif @@ -215,6 +236,19 @@ # error "__cpp_lib_constexpr_vector should have the value 201907L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26" +# endif +# if __cpp_lib_default_template_type_for_algorithm_values != 202403L +# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++26" # endif diff --git a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp index 5501587915..3ec548f56c 100644 --- a/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp @@ -15,217 +15,223 @@ // Test the feature test macros defined by -/* Constant Value - __cpp_lib_adaptor_iterator_pair_constructor 202106L [C++23] - __cpp_lib_addressof_constexpr 201603L [C++17] - __cpp_lib_allocate_at_least 202302L [C++23] - __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] - __cpp_lib_any 201606L [C++17] - __cpp_lib_apply 201603L [C++17] - __cpp_lib_array_constexpr 201603L [C++17] - 201811L [C++20] - __cpp_lib_as_const 201510L [C++17] - __cpp_lib_associative_heterogeneous_erasure 202110L [C++23] - __cpp_lib_associative_heterogeneous_insertion 202306L [C++26] - __cpp_lib_assume_aligned 201811L [C++20] - __cpp_lib_atomic_flag_test 201907L [C++20] - __cpp_lib_atomic_float 201711L [C++20] - __cpp_lib_atomic_is_always_lock_free 201603L [C++17] - __cpp_lib_atomic_lock_free_type_aliases 201907L [C++20] - __cpp_lib_atomic_ref 201806L [C++20] - __cpp_lib_atomic_shared_ptr 201711L [C++20] - __cpp_lib_atomic_value_initialization 201911L [C++20] - __cpp_lib_atomic_wait 201907L [C++20] - __cpp_lib_barrier 201907L [C++20] - __cpp_lib_bind_back 202202L [C++23] - 202306L [C++26] - __cpp_lib_bind_front 201907L [C++20] - 202306L [C++26] - __cpp_lib_bit_cast 201806L [C++20] - __cpp_lib_bitops 201907L [C++20] - __cpp_lib_bitset 202306L [C++26] - __cpp_lib_bool_constant 201505L [C++17] - __cpp_lib_bounded_array_traits 201902L [C++20] - __cpp_lib_boyer_moore_searcher 201603L [C++17] - __cpp_lib_byte 201603L [C++17] - __cpp_lib_byteswap 202110L [C++23] - __cpp_lib_char8_t 201907L [C++20] - __cpp_lib_chrono 201611L [C++17] - __cpp_lib_chrono_udls 201304L [C++14] - __cpp_lib_clamp 201603L [C++17] - __cpp_lib_complex_udls 201309L [C++14] - __cpp_lib_concepts 202002L [C++20] - __cpp_lib_constexpr_algorithms 201806L [C++20] - __cpp_lib_constexpr_bitset 202207L [C++23] - __cpp_lib_constexpr_charconv 202207L [C++23] - __cpp_lib_constexpr_cmath 202202L [C++23] - __cpp_lib_constexpr_complex 201711L [C++20] - __cpp_lib_constexpr_dynamic_alloc 201907L [C++20] - __cpp_lib_constexpr_functional 201907L [C++20] - __cpp_lib_constexpr_iterator 201811L [C++20] - __cpp_lib_constexpr_memory 201811L [C++20] - 202202L [C++23] - __cpp_lib_constexpr_numeric 201911L [C++20] - __cpp_lib_constexpr_string 201907L [C++20] - __cpp_lib_constexpr_string_view 201811L [C++20] - __cpp_lib_constexpr_tuple 201811L [C++20] - __cpp_lib_constexpr_typeinfo 202106L [C++23] - __cpp_lib_constexpr_utility 201811L [C++20] - __cpp_lib_constexpr_vector 201907L [C++20] - __cpp_lib_copyable_function 202306L [C++26] - __cpp_lib_coroutine 201902L [C++20] - __cpp_lib_debugging 202311L [C++26] - __cpp_lib_destroying_delete 201806L [C++20] - __cpp_lib_enable_shared_from_this 201603L [C++17] - __cpp_lib_endian 201907L [C++20] - __cpp_lib_erase_if 202002L [C++20] - __cpp_lib_exchange_function 201304L [C++14] - __cpp_lib_execution 201603L [C++17] - 201902L [C++20] - __cpp_lib_expected 202211L [C++23] - __cpp_lib_filesystem 201703L [C++17] - __cpp_lib_format 202106L [C++20] - __cpp_lib_format_ranges 202207L [C++23] - __cpp_lib_format_uchar 202311L [C++20] - __cpp_lib_formatters 202302L [C++23] - __cpp_lib_forward_like 202207L [C++23] - __cpp_lib_freestanding_algorithm 202311L [C++26] - __cpp_lib_freestanding_array 202311L [C++26] - __cpp_lib_freestanding_cstring 202306L [C++26] - __cpp_lib_freestanding_expected 202311L [C++26] - __cpp_lib_freestanding_mdspan 202311L [C++26] - __cpp_lib_freestanding_optional 202311L [C++26] - __cpp_lib_freestanding_string_view 202311L [C++26] - __cpp_lib_freestanding_variant 202311L [C++26] - __cpp_lib_fstream_native_handle 202306L [C++26] - __cpp_lib_function_ref 202306L [C++26] - __cpp_lib_gcd_lcm 201606L [C++17] - __cpp_lib_generic_associative_lookup 201304L [C++14] - __cpp_lib_generic_unordered_lookup 201811L [C++20] - __cpp_lib_hardware_interference_size 201703L [C++17] - __cpp_lib_has_unique_object_representations 201606L [C++17] - __cpp_lib_hazard_pointer 202306L [C++26] - __cpp_lib_hypot 201603L [C++17] - __cpp_lib_incomplete_container_elements 201505L [C++17] - __cpp_lib_int_pow2 202002L [C++20] - __cpp_lib_integer_comparison_functions 202002L [C++20] - __cpp_lib_integer_sequence 201304L [C++14] - __cpp_lib_integral_constant_callable 201304L [C++14] - __cpp_lib_interpolate 201902L [C++20] - __cpp_lib_invoke 201411L [C++17] - __cpp_lib_invoke_r 202106L [C++23] - __cpp_lib_ios_noreplace 202207L [C++23] - __cpp_lib_is_aggregate 201703L [C++17] - __cpp_lib_is_constant_evaluated 201811L [C++20] - __cpp_lib_is_final 201402L [C++14] - __cpp_lib_is_invocable 201703L [C++17] - __cpp_lib_is_layout_compatible 201907L [C++20] - __cpp_lib_is_nothrow_convertible 201806L [C++20] - __cpp_lib_is_null_pointer 201309L [C++14] - __cpp_lib_is_pointer_interconvertible 201907L [C++20] - __cpp_lib_is_scoped_enum 202011L [C++23] - __cpp_lib_is_swappable 201603L [C++17] - __cpp_lib_jthread 201911L [C++20] - __cpp_lib_latch 201907L [C++20] - __cpp_lib_launder 201606L [C++17] - __cpp_lib_linalg 202311L [C++26] - __cpp_lib_list_remove_return_type 201806L [C++20] - __cpp_lib_logical_traits 201510L [C++17] - __cpp_lib_make_from_tuple 201606L [C++17] - __cpp_lib_make_reverse_iterator 201402L [C++14] - __cpp_lib_make_unique 201304L [C++14] - __cpp_lib_map_try_emplace 201411L [C++17] - __cpp_lib_math_constants 201907L [C++20] - __cpp_lib_math_special_functions 201603L [C++17] - __cpp_lib_mdspan 202207L [C++23] - __cpp_lib_memory_resource 201603L [C++17] - __cpp_lib_move_iterator_concept 202207L [C++20] - __cpp_lib_move_only_function 202110L [C++23] - __cpp_lib_node_extract 201606L [C++17] - __cpp_lib_nonmember_container_access 201411L [C++17] - __cpp_lib_not_fn 201603L [C++17] - __cpp_lib_null_iterators 201304L [C++14] - __cpp_lib_optional 201606L [C++17] - 202110L [C++23] - __cpp_lib_out_ptr 202106L [C++23] - 202311L [C++26] - __cpp_lib_parallel_algorithm 201603L [C++17] - __cpp_lib_polymorphic_allocator 201902L [C++20] - __cpp_lib_print 202207L [C++23] - __cpp_lib_quoted_string_io 201304L [C++14] - __cpp_lib_ranges 202207L [C++20] - __cpp_lib_ranges_as_const 202207L [C++23] - __cpp_lib_ranges_as_rvalue 202207L [C++23] - __cpp_lib_ranges_chunk 202202L [C++23] - __cpp_lib_ranges_chunk_by 202202L [C++23] - __cpp_lib_ranges_contains 202207L [C++23] - __cpp_lib_ranges_iota 202202L [C++23] - __cpp_lib_ranges_join_with 202202L [C++23] - __cpp_lib_ranges_repeat 202207L [C++23] - __cpp_lib_ranges_slide 202202L [C++23] - __cpp_lib_ranges_starts_ends_with 202106L [C++23] - __cpp_lib_ranges_to_container 202202L [C++23] - __cpp_lib_ranges_zip 202110L [C++23] - __cpp_lib_ratio 202306L [C++26] - __cpp_lib_raw_memory_algorithms 201606L [C++17] - __cpp_lib_rcu 202306L [C++26] - __cpp_lib_reference_from_temporary 202202L [C++23] - __cpp_lib_remove_cvref 201711L [C++20] - __cpp_lib_result_of_sfinae 201210L [C++14] - __cpp_lib_robust_nonmodifying_seq_ops 201304L [C++14] - __cpp_lib_sample 201603L [C++17] - __cpp_lib_saturation_arithmetic 202311L [C++26] - __cpp_lib_scoped_lock 201703L [C++17] - __cpp_lib_semaphore 201907L [C++20] - __cpp_lib_shared_mutex 201505L [C++17] - __cpp_lib_shared_ptr_arrays 201611L [C++17] - 201707L [C++20] - __cpp_lib_shared_ptr_weak_type 201606L [C++17] - __cpp_lib_shared_timed_mutex 201402L [C++14] - __cpp_lib_shift 201806L [C++20] - __cpp_lib_smart_ptr_for_overwrite 202002L [C++20] - __cpp_lib_smart_ptr_owner_equality 202306L [C++26] - __cpp_lib_source_location 201907L [C++20] - __cpp_lib_span 202002L [C++20] - __cpp_lib_span_at 202311L [C++26] - __cpp_lib_span_initializer_list 202311L [C++26] - __cpp_lib_spanstream 202106L [C++23] - __cpp_lib_ssize 201902L [C++20] - __cpp_lib_sstream_from_string_view 202306L [C++26] - __cpp_lib_stacktrace 202011L [C++23] - __cpp_lib_starts_ends_with 201711L [C++20] - __cpp_lib_stdatomic_h 202011L [C++23] - __cpp_lib_string_contains 202011L [C++23] - __cpp_lib_string_resize_and_overwrite 202110L [C++23] - __cpp_lib_string_udls 201304L [C++14] - __cpp_lib_string_view 201606L [C++17] - 201803L [C++20] - __cpp_lib_submdspan 202306L [C++26] - __cpp_lib_syncbuf 201803L [C++20] - __cpp_lib_text_encoding 202306L [C++26] - __cpp_lib_three_way_comparison 201907L [C++20] - __cpp_lib_to_address 201711L [C++20] - __cpp_lib_to_array 201907L [C++20] - __cpp_lib_to_chars 201611L [C++17] - 202306L [C++26] - __cpp_lib_to_string 202306L [C++23] - __cpp_lib_to_underlying 202102L [C++23] - __cpp_lib_transformation_trait_aliases 201304L [C++14] - __cpp_lib_transparent_operators 201210L [C++14] - 201510L [C++17] - __cpp_lib_tuple_element_t 201402L [C++14] - __cpp_lib_tuple_like 202207L [C++23] - 202311L [C++26] - __cpp_lib_tuples_by_type 201304L [C++14] - __cpp_lib_type_identity 201806L [C++20] - __cpp_lib_type_trait_variable_templates 201510L [C++17] - __cpp_lib_uncaught_exceptions 201411L [C++17] - __cpp_lib_unordered_map_try_emplace 201411L [C++17] - __cpp_lib_unreachable 202202L [C++23] - __cpp_lib_unwrap_ref 201811L [C++20] - __cpp_lib_variant 202102L [C++17] - __cpp_lib_void_t 201411L [C++17] - __cpp_lib_within_lifetime 202306L [C++26] +/* Constant Value + __cpp_lib_adaptor_iterator_pair_constructor 202106L [C++23] + __cpp_lib_addressof_constexpr 201603L [C++17] + __cpp_lib_allocate_at_least 202302L [C++23] + __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] + __cpp_lib_any 201606L [C++17] + __cpp_lib_apply 201603L [C++17] + __cpp_lib_array_constexpr 201603L [C++17] + 201811L [C++20] + __cpp_lib_as_const 201510L [C++17] + __cpp_lib_associative_heterogeneous_erasure 202110L [C++23] + __cpp_lib_associative_heterogeneous_insertion 202306L [C++26] + __cpp_lib_assume_aligned 201811L [C++20] + __cpp_lib_atomic_flag_test 201907L [C++20] + __cpp_lib_atomic_float 201711L [C++20] + __cpp_lib_atomic_is_always_lock_free 201603L [C++17] + __cpp_lib_atomic_lock_free_type_aliases 201907L [C++20] + __cpp_lib_atomic_min_max 202403L [C++26] + __cpp_lib_atomic_ref 201806L [C++20] + __cpp_lib_atomic_shared_ptr 201711L [C++20] + __cpp_lib_atomic_value_initialization 201911L [C++20] + __cpp_lib_atomic_wait 201907L [C++20] + __cpp_lib_barrier 201907L [C++20] + __cpp_lib_bind_back 202202L [C++23] + __cpp_lib_bind_front 201907L [C++20] + 202306L [C++26] + __cpp_lib_bit_cast 201806L [C++20] + __cpp_lib_bitops 201907L [C++20] + __cpp_lib_bitset 202306L [C++26] + __cpp_lib_bool_constant 201505L [C++17] + __cpp_lib_bounded_array_traits 201902L [C++20] + __cpp_lib_boyer_moore_searcher 201603L [C++17] + __cpp_lib_byte 201603L [C++17] + __cpp_lib_byteswap 202110L [C++23] + __cpp_lib_char8_t 201907L [C++20] + __cpp_lib_chrono 201611L [C++17] + __cpp_lib_chrono_udls 201304L [C++14] + __cpp_lib_clamp 201603L [C++17] + __cpp_lib_complex_udls 201309L [C++14] + __cpp_lib_concepts 202002L [C++20] + __cpp_lib_constexpr_algorithms 201806L [C++20] + __cpp_lib_constexpr_bitset 202207L [C++23] + __cpp_lib_constexpr_charconv 202207L [C++23] + __cpp_lib_constexpr_cmath 202202L [C++23] + __cpp_lib_constexpr_complex 201711L [C++20] + __cpp_lib_constexpr_dynamic_alloc 201907L [C++20] + __cpp_lib_constexpr_functional 201907L [C++20] + __cpp_lib_constexpr_iterator 201811L [C++20] + __cpp_lib_constexpr_memory 201811L [C++20] + 202202L [C++23] + __cpp_lib_constexpr_numeric 201911L [C++20] + __cpp_lib_constexpr_string 201907L [C++20] + __cpp_lib_constexpr_string_view 201811L [C++20] + __cpp_lib_constexpr_tuple 201811L [C++20] + __cpp_lib_constexpr_typeinfo 202106L [C++23] + __cpp_lib_constexpr_utility 201811L [C++20] + __cpp_lib_constexpr_vector 201907L [C++20] + __cpp_lib_constrained_equality 202403L [C++26] + __cpp_lib_copyable_function 202306L [C++26] + __cpp_lib_coroutine 201902L [C++20] + __cpp_lib_debugging 202311L [C++26] + __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26] + __cpp_lib_destroying_delete 201806L [C++20] + __cpp_lib_enable_shared_from_this 201603L [C++17] + __cpp_lib_endian 201907L [C++20] + __cpp_lib_erase_if 202002L [C++20] + __cpp_lib_exchange_function 201304L [C++14] + __cpp_lib_execution 201603L [C++17] + 201902L [C++20] + __cpp_lib_expected 202211L [C++23] + __cpp_lib_filesystem 201703L [C++17] + __cpp_lib_format 202106L [C++20] + __cpp_lib_format_path 202403L [C++23] + __cpp_lib_format_ranges 202207L [C++23] + __cpp_lib_format_uchar 202311L [C++20] + __cpp_lib_formatters 202302L [C++23] + __cpp_lib_forward_like 202207L [C++23] + __cpp_lib_freestanding_algorithm 202311L [C++26] + __cpp_lib_freestanding_array 202311L [C++26] + __cpp_lib_freestanding_cstring 202306L [C++26] + __cpp_lib_freestanding_expected 202311L [C++26] + __cpp_lib_freestanding_mdspan 202311L [C++26] + __cpp_lib_freestanding_optional 202311L [C++26] + __cpp_lib_freestanding_string_view 202311L [C++26] + __cpp_lib_freestanding_variant 202311L [C++26] + __cpp_lib_fstream_native_handle 202306L [C++26] + __cpp_lib_function_ref 202306L [C++26] + __cpp_lib_gcd_lcm 201606L [C++17] + __cpp_lib_generate_random 202403L [C++26] + __cpp_lib_generic_associative_lookup 201304L [C++14] + __cpp_lib_generic_unordered_lookup 201811L [C++20] + __cpp_lib_hardware_interference_size 201703L [C++17] + __cpp_lib_has_unique_object_representations 201606L [C++17] + __cpp_lib_hazard_pointer 202306L [C++26] + __cpp_lib_hypot 201603L [C++17] + __cpp_lib_incomplete_container_elements 201505L [C++17] + __cpp_lib_int_pow2 202002L [C++20] + __cpp_lib_integer_comparison_functions 202002L [C++20] + __cpp_lib_integer_sequence 201304L [C++14] + __cpp_lib_integral_constant_callable 201304L [C++14] + __cpp_lib_interpolate 201902L [C++20] + __cpp_lib_invoke 201411L [C++17] + __cpp_lib_invoke_r 202106L [C++23] + __cpp_lib_ios_noreplace 202207L [C++23] + __cpp_lib_is_aggregate 201703L [C++17] + __cpp_lib_is_constant_evaluated 201811L [C++20] + __cpp_lib_is_final 201402L [C++14] + __cpp_lib_is_invocable 201703L [C++17] + __cpp_lib_is_layout_compatible 201907L [C++20] + __cpp_lib_is_nothrow_convertible 201806L [C++20] + __cpp_lib_is_null_pointer 201309L [C++14] + __cpp_lib_is_pointer_interconvertible 201907L [C++20] + __cpp_lib_is_scoped_enum 202011L [C++23] + __cpp_lib_is_swappable 201603L [C++17] + __cpp_lib_jthread 201911L [C++20] + __cpp_lib_latch 201907L [C++20] + __cpp_lib_launder 201606L [C++17] + __cpp_lib_linalg 202311L [C++26] + __cpp_lib_list_remove_return_type 201806L [C++20] + __cpp_lib_logical_traits 201510L [C++17] + __cpp_lib_make_from_tuple 201606L [C++17] + __cpp_lib_make_reverse_iterator 201402L [C++14] + __cpp_lib_make_unique 201304L [C++14] + __cpp_lib_map_try_emplace 201411L [C++17] + __cpp_lib_math_constants 201907L [C++20] + __cpp_lib_math_special_functions 201603L [C++17] + __cpp_lib_mdspan 202207L [C++23] + __cpp_lib_memory_resource 201603L [C++17] + __cpp_lib_move_iterator_concept 202207L [C++20] + __cpp_lib_move_only_function 202110L [C++23] + __cpp_lib_node_extract 201606L [C++17] + __cpp_lib_nonmember_container_access 201411L [C++17] + __cpp_lib_not_fn 201603L [C++17] + __cpp_lib_null_iterators 201304L [C++14] + __cpp_lib_optional 201606L [C++17] + 202110L [C++23] + __cpp_lib_out_ptr 202106L [C++23] + 202311L [C++26] + __cpp_lib_parallel_algorithm 201603L [C++17] + __cpp_lib_polymorphic_allocator 201902L [C++20] + __cpp_lib_print 202207L [C++23] + __cpp_lib_quoted_string_io 201304L [C++14] + __cpp_lib_ranges 202207L [C++20] + __cpp_lib_ranges_as_const 202207L [C++23] + __cpp_lib_ranges_as_rvalue 202207L [C++23] + __cpp_lib_ranges_chunk 202202L [C++23] + __cpp_lib_ranges_chunk_by 202202L [C++23] + __cpp_lib_ranges_concat 202403L [C++26] + __cpp_lib_ranges_contains 202207L [C++23] + __cpp_lib_ranges_iota 202202L [C++23] + __cpp_lib_ranges_join_with 202202L [C++23] + __cpp_lib_ranges_repeat 202207L [C++23] + __cpp_lib_ranges_slide 202202L [C++23] + __cpp_lib_ranges_starts_ends_with 202106L [C++23] + __cpp_lib_ranges_to_container 202202L [C++23] + __cpp_lib_ranges_zip 202110L [C++23] + __cpp_lib_ratio 202306L [C++26] + __cpp_lib_raw_memory_algorithms 201606L [C++17] + __cpp_lib_rcu 202306L [C++26] + __cpp_lib_reference_from_temporary 202202L [C++23] + __cpp_lib_reference_wrapper 202403L [C++26] + __cpp_lib_remove_cvref 201711L [C++20] + __cpp_lib_result_of_sfinae 201210L [C++14] + __cpp_lib_robust_nonmodifying_seq_ops 201304L [C++14] + __cpp_lib_sample 201603L [C++17] + __cpp_lib_saturation_arithmetic 202311L [C++26] + __cpp_lib_scoped_lock 201703L [C++17] + __cpp_lib_semaphore 201907L [C++20] + __cpp_lib_shared_mutex 201505L [C++17] + __cpp_lib_shared_ptr_arrays 201611L [C++17] + 201707L [C++20] + __cpp_lib_shared_ptr_weak_type 201606L [C++17] + __cpp_lib_shared_timed_mutex 201402L [C++14] + __cpp_lib_shift 201806L [C++20] + __cpp_lib_smart_ptr_for_overwrite 202002L [C++20] + __cpp_lib_smart_ptr_owner_equality 202306L [C++26] + __cpp_lib_source_location 201907L [C++20] + __cpp_lib_span 202002L [C++20] + __cpp_lib_span_at 202311L [C++26] + __cpp_lib_span_initializer_list 202311L [C++26] + __cpp_lib_spanstream 202106L [C++23] + __cpp_lib_ssize 201902L [C++20] + __cpp_lib_sstream_from_string_view 202306L [C++26] + __cpp_lib_stacktrace 202011L [C++23] + __cpp_lib_starts_ends_with 201711L [C++20] + __cpp_lib_stdatomic_h 202011L [C++23] + __cpp_lib_string_contains 202011L [C++23] + __cpp_lib_string_resize_and_overwrite 202110L [C++23] + __cpp_lib_string_udls 201304L [C++14] + __cpp_lib_string_view 201606L [C++17] + 201803L [C++20] + __cpp_lib_submdspan 202306L [C++26] + __cpp_lib_syncbuf 201803L [C++20] + __cpp_lib_text_encoding 202306L [C++26] + __cpp_lib_three_way_comparison 201907L [C++20] + __cpp_lib_to_address 201711L [C++20] + __cpp_lib_to_array 201907L [C++20] + __cpp_lib_to_chars 201611L [C++17] + 202306L [C++26] + __cpp_lib_to_string 202306L [C++23] + __cpp_lib_to_underlying 202102L [C++23] + __cpp_lib_transformation_trait_aliases 201304L [C++14] + __cpp_lib_transparent_operators 201210L [C++14] + 201510L [C++17] + __cpp_lib_tuple_element_t 201402L [C++14] + __cpp_lib_tuple_like 202207L [C++23] + 202311L [C++26] + __cpp_lib_tuples_by_type 201304L [C++14] + __cpp_lib_type_identity 201806L [C++20] + __cpp_lib_type_trait_variable_templates 201510L [C++17] + __cpp_lib_uncaught_exceptions 201411L [C++17] + __cpp_lib_unordered_map_try_emplace 201411L [C++17] + __cpp_lib_unreachable 202202L [C++23] + __cpp_lib_unwrap_ref 201811L [C++20] + __cpp_lib_variant 202102L [C++17] + __cpp_lib_void_t 201411L [C++17] + __cpp_lib_within_lifetime 202306L [C++26] */ #include @@ -293,6 +299,10 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20" # endif +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined before c++26" +# endif + # ifdef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should not be defined before c++20" # endif @@ -441,6 +451,10 @@ # error "__cpp_lib_constexpr_vector should not be defined before c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_copyable_function # error "__cpp_lib_copyable_function should not be defined before c++26" # endif @@ -453,6 +467,10 @@ # error "__cpp_lib_debugging should not be defined before c++26" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_destroying_delete # error "__cpp_lib_destroying_delete should not be defined before c++20" # endif @@ -489,6 +507,10 @@ # error "__cpp_lib_format should not be defined before c++20" # endif +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined before c++23" +# endif + # ifdef __cpp_lib_format_ranges # error "__cpp_lib_format_ranges should not be defined before c++23" # endif @@ -549,6 +571,10 @@ # error "__cpp_lib_gcd_lcm should not be defined before c++17" # endif +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined before c++26" +# endif + # ifdef __cpp_lib_generic_associative_lookup # error "__cpp_lib_generic_associative_lookup should not be defined before c++14" # endif @@ -773,6 +799,10 @@ # error "__cpp_lib_ranges_chunk_by should not be defined before c++23" # endif +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined before c++26" +# endif + # ifdef __cpp_lib_ranges_contains # error "__cpp_lib_ranges_contains should not be defined before c++23" # endif @@ -821,6 +851,10 @@ # error "__cpp_lib_reference_from_temporary should not be defined before c++23" # endif +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined before c++26" +# endif + # ifdef __cpp_lib_remove_cvref # error "__cpp_lib_remove_cvref should not be defined before c++20" # endif @@ -1087,6 +1121,10 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20" # endif +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined before c++26" +# endif + # ifdef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should not be defined before c++20" # endif @@ -1241,6 +1279,10 @@ # error "__cpp_lib_constexpr_vector should not be defined before c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_copyable_function # error "__cpp_lib_copyable_function should not be defined before c++26" # endif @@ -1253,6 +1295,10 @@ # error "__cpp_lib_debugging should not be defined before c++26" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_destroying_delete # error "__cpp_lib_destroying_delete should not be defined before c++20" # endif @@ -1292,6 +1338,10 @@ # error "__cpp_lib_format should not be defined before c++20" # endif +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined before c++23" +# endif + # ifdef __cpp_lib_format_ranges # error "__cpp_lib_format_ranges should not be defined before c++23" # endif @@ -1352,6 +1402,10 @@ # error "__cpp_lib_gcd_lcm should not be defined before c++17" # endif +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined before c++26" +# endif + # ifndef __cpp_lib_generic_associative_lookup # error "__cpp_lib_generic_associative_lookup should be defined in c++14" # endif @@ -1609,6 +1663,10 @@ # error "__cpp_lib_ranges_chunk_by should not be defined before c++23" # endif +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined before c++26" +# endif + # ifdef __cpp_lib_ranges_contains # error "__cpp_lib_ranges_contains should not be defined before c++23" # endif @@ -1657,6 +1715,10 @@ # error "__cpp_lib_reference_from_temporary should not be defined before c++23" # endif +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined before c++26" +# endif + # ifdef __cpp_lib_remove_cvref # error "__cpp_lib_remove_cvref should not be defined before c++20" # endif @@ -1974,6 +2036,10 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20" # endif +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined before c++26" +# endif + # ifdef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should not be defined before c++20" # endif @@ -2143,6 +2209,10 @@ # error "__cpp_lib_constexpr_vector should not be defined before c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_copyable_function # error "__cpp_lib_copyable_function should not be defined before c++26" # endif @@ -2155,6 +2225,10 @@ # error "__cpp_lib_debugging should not be defined before c++26" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # ifdef __cpp_lib_destroying_delete # error "__cpp_lib_destroying_delete should not be defined before c++20" # endif @@ -2215,6 +2289,10 @@ # error "__cpp_lib_format should not be defined before c++20" # endif +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined before c++23" +# endif + # ifdef __cpp_lib_format_ranges # error "__cpp_lib_format_ranges should not be defined before c++23" # endif @@ -2278,6 +2356,10 @@ # error "__cpp_lib_gcd_lcm should have the value 201606L in c++17" # endif +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined before c++26" +# endif + # ifndef __cpp_lib_generic_associative_lookup # error "__cpp_lib_generic_associative_lookup should be defined in c++17" # endif @@ -2616,6 +2698,10 @@ # error "__cpp_lib_ranges_chunk_by should not be defined before c++23" # endif +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined before c++26" +# endif + # ifdef __cpp_lib_ranges_contains # error "__cpp_lib_ranges_contains should not be defined before c++23" # endif @@ -2667,6 +2753,10 @@ # error "__cpp_lib_reference_from_temporary should not be defined before c++23" # endif +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined before c++26" +# endif + # ifdef __cpp_lib_remove_cvref # error "__cpp_lib_remove_cvref should not be defined before c++20" # endif @@ -3056,6 +3146,10 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should have the value 201907L in c++20" # endif +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined before c++26" +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should be defined in c++20" @@ -3324,6 +3418,10 @@ # error "__cpp_lib_constexpr_vector should have the value 201907L in c++20" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_copyable_function # error "__cpp_lib_copyable_function should not be defined before c++26" # endif @@ -3339,6 +3437,10 @@ # error "__cpp_lib_debugging should not be defined before c++26" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # if TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L # ifndef __cpp_lib_destroying_delete # error "__cpp_lib_destroying_delete should be defined in c++20" @@ -3423,6 +3525,10 @@ # endif # endif +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined before c++23" +# endif + # ifdef __cpp_lib_format_ranges # error "__cpp_lib_format_ranges should not be defined before c++23" # endif @@ -3489,6 +3595,10 @@ # error "__cpp_lib_gcd_lcm should have the value 201606L in c++20" # endif +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined before c++26" +# endif + # ifndef __cpp_lib_generic_associative_lookup # error "__cpp_lib_generic_associative_lookup should be defined in c++20" # endif @@ -3902,6 +4012,10 @@ # error "__cpp_lib_ranges_chunk_by should not be defined before c++23" # endif +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined before c++26" +# endif + # ifdef __cpp_lib_ranges_contains # error "__cpp_lib_ranges_contains should not be defined before c++23" # endif @@ -3953,6 +4067,10 @@ # error "__cpp_lib_reference_from_temporary should not be defined before c++23" # endif +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined before c++26" +# endif + # ifndef __cpp_lib_remove_cvref # error "__cpp_lib_remove_cvref should be defined in c++20" # endif @@ -4423,6 +4541,10 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should have the value 201907L in c++23" # endif +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined before c++26" +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should be defined in c++23" @@ -4482,17 +4604,11 @@ # endif # endif -# if !defined(_LIBCPP_VERSION) -# ifndef __cpp_lib_bind_back -# error "__cpp_lib_bind_back should be defined in c++23" -# endif -# if __cpp_lib_bind_back != 202202L -# error "__cpp_lib_bind_back should have the value 202202L in c++23" -# endif -# else // _LIBCPP_VERSION -# ifdef __cpp_lib_bind_back -# error "__cpp_lib_bind_back should not be defined because it is unimplemented in libc++!" -# endif +# ifndef __cpp_lib_bind_back +# error "__cpp_lib_bind_back should be defined in c++23" +# endif +# if __cpp_lib_bind_back != 202202L +# error "__cpp_lib_bind_back should have the value 202202L in c++23" # endif # ifndef __cpp_lib_bind_front @@ -4721,6 +4837,10 @@ # error "__cpp_lib_constexpr_vector should have the value 201907L in c++23" # endif +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined before c++26" +# endif + # ifdef __cpp_lib_copyable_function # error "__cpp_lib_copyable_function should not be defined before c++26" # endif @@ -4736,6 +4856,10 @@ # error "__cpp_lib_debugging should not be defined before c++26" # endif +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26" +# endif + # if TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L # ifndef __cpp_lib_destroying_delete # error "__cpp_lib_destroying_delete should be defined in c++23" @@ -4823,6 +4947,19 @@ # endif # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_format_path +# error "__cpp_lib_format_path should be defined in c++23" +# endif +# if __cpp_lib_format_path != 202403L +# error "__cpp_lib_format_path should have the value 202403L in c++23" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_format_ranges # error "__cpp_lib_format_ranges should be defined in c++23" # endif @@ -4904,6 +5041,10 @@ # error "__cpp_lib_gcd_lcm should have the value 201606L in c++23" # endif +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined before c++26" +# endif + # ifndef __cpp_lib_generic_associative_lookup # error "__cpp_lib_generic_associative_lookup should be defined in c++23" # endif @@ -5374,6 +5515,10 @@ # error "__cpp_lib_ranges_chunk_by should have the value 202202L in c++23" # endif +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined before c++26" +# endif + # ifndef __cpp_lib_ranges_contains # error "__cpp_lib_ranges_contains should be defined in c++23" # endif @@ -5482,6 +5627,10 @@ # endif # endif +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined before c++26" +# endif + # ifndef __cpp_lib_remove_cvref # error "__cpp_lib_remove_cvref should be defined in c++23" # endif @@ -6012,6 +6161,19 @@ # error "__cpp_lib_atomic_lock_free_type_aliases should have the value 201907L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should be defined in c++26" +# endif +# if __cpp_lib_atomic_min_max != 202403L +# error "__cpp_lib_atomic_min_max should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined because it is unimplemented in libc++!" +# endif +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should be defined in c++26" @@ -6071,17 +6233,11 @@ # endif # endif -# if !defined(_LIBCPP_VERSION) -# ifndef __cpp_lib_bind_back -# error "__cpp_lib_bind_back should be defined in c++26" -# endif -# if __cpp_lib_bind_back != 202306L -# error "__cpp_lib_bind_back should have the value 202306L in c++26" -# endif -# else // _LIBCPP_VERSION -# ifdef __cpp_lib_bind_back -# error "__cpp_lib_bind_back should not be defined because it is unimplemented in libc++!" -# endif +# ifndef __cpp_lib_bind_back +# error "__cpp_lib_bind_back should be defined in c++26" +# endif +# if __cpp_lib_bind_back != 202202L +# error "__cpp_lib_bind_back should have the value 202202L in c++26" # endif # ifndef __cpp_lib_bind_front @@ -6313,6 +6469,19 @@ # error "__cpp_lib_constexpr_vector should have the value 201907L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should be defined in c++26" +# endif +# if __cpp_lib_constrained_equality != 202403L +# error "__cpp_lib_constrained_equality should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!" +# endif +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_copyable_function # error "__cpp_lib_copyable_function should be defined in c++26" @@ -6346,6 +6515,19 @@ # endif # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26" +# endif +# if __cpp_lib_default_template_type_for_algorithm_values != 202403L +# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!" +# endif +# endif + # if TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L # ifndef __cpp_lib_destroying_delete # error "__cpp_lib_destroying_delete should be defined in c++26" @@ -6433,6 +6615,19 @@ # endif # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_format_path +# error "__cpp_lib_format_path should be defined in c++26" +# endif +# if __cpp_lib_format_path != 202403L +# error "__cpp_lib_format_path should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_format_ranges # error "__cpp_lib_format_ranges should be defined in c++26" # endif @@ -6604,6 +6799,19 @@ # error "__cpp_lib_gcd_lcm should have the value 201606L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should be defined in c++26" +# endif +# if __cpp_lib_generate_random != 202403L +# error "__cpp_lib_generate_random should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_generic_associative_lookup # error "__cpp_lib_generic_associative_lookup should be defined in c++26" # endif @@ -7092,6 +7300,19 @@ # error "__cpp_lib_ranges_chunk_by should have the value 202202L in c++26" # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should be defined in c++26" +# endif +# if __cpp_lib_ranges_concat != 202403L +# error "__cpp_lib_ranges_concat should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_ranges_contains # error "__cpp_lib_ranges_contains should be defined in c++26" # endif @@ -7212,6 +7433,19 @@ # endif # endif +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should be defined in c++26" +# endif +# if __cpp_lib_reference_wrapper != 202403L +# error "__cpp_lib_reference_wrapper should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should not be defined because it is unimplemented in libc++!" +# endif +# endif + # ifndef __cpp_lib_remove_cvref # error "__cpp_lib_remove_cvref should be defined in c++26" # endif diff --git a/yass/third_party/libc++/trunk/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp index 8637a93300..16e4ea7fd3 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp @@ -13,15 +13,11 @@ // iter_type put(iter_type s, ios_base& iob, char_type fill, long double v) const; // XFAIL: win32-broken-printf-g-precision -// XFAIL: LIBCXX-PICOLIBC-FIXME - -// Needs more investigation, but this is probably failing on Android M (API 23) -// and up because the printf formatting of NAN changed. -// XFAIL: LIBCXX-ANDROID-FIXME && !android-device-api={{21|22}} #include #include #include +#include #include #include #include "test_macros.h" @@ -8934,11 +8930,10 @@ void test4() char str[200]; std::locale lc = std::locale::classic(); std::locale lg(lc, new my_numpunct); -#ifdef _AIX - std::string inf = "INF"; -#else - std::string inf = "inf"; -#endif + + // This should match the underlying C library + std::snprintf(str, sizeof(str), "%f", INFINITY); + std::string inf = str; const my_facet f(1); { @@ -10727,24 +10722,24 @@ void test5() std::locale lc = std::locale::classic(); std::locale lg(lc, new my_numpunct); const my_facet f(1); -#if defined(_AIX) - std::string nan= "NaNQ"; - std::string NaN = "NaNQ"; - std::string nan_padding25 = "*********************"; - std::string pnan_sign = "+"; - std::string pnan_padding25 = "********************"; -#else - std::string nan= "nan"; - std::string NaN = "NAN"; - std::string nan_padding25 = "**********************"; -#if defined(TEST_HAS_GLIBC) || defined(_WIN32) - std::string pnan_sign = "+"; - std::string pnan_padding25 = "*********************"; -#else - std::string pnan_sign = ""; - std::string pnan_padding25 = "**********************"; -#endif -#endif + + // The output here depends on the underlying C library, so work out what + // that does. + std::snprintf(str, sizeof(str), "%f", std::nan("")); + std::string nan = str; + + std::snprintf(str, sizeof(str), "%F", std::nan("")); + std::string NaN = str; + + std::snprintf(str, sizeof(str), "%+f", std::nan("")); + std::string pnan_sign; + if (str[0] == '+') { + pnan_sign = "+"; + } + + std::string nan_padding25 = std::string(25 - nan.length(), '*'); + std::string pnan_padding25 = std::string(25 - nan.length() - pnan_sign.length(), '*'); + { long double v = std::nan(""); std::ios ios(0); diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp index e99a85a873..fbc0bb4ace 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wbuffer_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/overflow.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/overflow.pass.cpp index 5a5a3f5a34..91ebd9eb9b 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/overflow.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/overflow.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wbuffer_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp index 926f661a2d..28e54cec36 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wbuffer_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/rdbuf.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/rdbuf.pass.cpp index cdbabafcdf..b53516b4df 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/rdbuf.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/rdbuf.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wbuffer_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/seekoff.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/seekoff.pass.cpp index 87d9061dd6..1947e811c5 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/seekoff.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/seekoff.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wbuffer_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/state.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/state.pass.cpp index fe77d9b3bc..6ae7c9d66d 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/state.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/state.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wbuffer_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/test.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/test.pass.cpp index 01a112e03e..1a45036215 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/test.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/test.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wbuffer_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp index 0e6f77fff9..65ec28cdd9 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wbuffer_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/converted.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/converted.pass.cpp index 9627d2ca33..5585ec86d7 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/converted.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/converted.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wstring_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt.pass.cpp index 76ccd1ac9f..90dd81885a 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wstring_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt_state.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt_state.pass.cpp index 454576d803..e55b21169d 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt_state.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt_state.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wstring_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_copy.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_copy.pass.cpp index 3d7d8c601c..27f878463b 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_copy.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_copy.pass.cpp @@ -12,7 +12,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wstring_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_err_string.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_err_string.pass.cpp index e5da324196..937a276af0 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_err_string.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_err_string.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wstring_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/depr.verify.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/depr.verify.cpp index c520d34a23..f8bd156bdd 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/depr.verify.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/depr.verify.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT + // UNSUPPORTED: c++03, c++11, c++14, c++26 // UNSUPPORTED: no-wide-characters diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp index f745cbc202..59939e1cf7 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wstring_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/state.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/state.pass.cpp index d7e1989e6a..f59730c5b2 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/state.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/state.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wstring_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp index 19ffdd57d2..8c5348477a 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // wstring_convert diff --git a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/types.pass.cpp b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/types.pass.cpp index 1987a06a90..bec4f7a1d8 100644 --- a/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/types.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/localization/locales/locale.convenience/conversions/conversions.string/types.pass.cpp @@ -8,7 +8,7 @@ // -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT // template, diff --git a/yass/third_party/libc++/trunk/test/std/numerics/rand/rand.util/rand.util.seedseq/generate.mandates.verify.cpp b/yass/third_party/libc++/trunk/test/std/numerics/rand/rand.util/rand.util.seedseq/generate.mandates.verify.cpp new file mode 100644 index 0000000000..a8ea31b680 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/numerics/rand/rand.util/rand.util.seedseq/generate.mandates.verify.cpp @@ -0,0 +1,58 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// class seed_seq; + +// template +// void generate(RandomAccessIterator begin, RandomAccessIterator end); + +// Check the following requirement: https://eel.is/c++draft/rand.util.seedseq#7 +// +// Mandates: iterator_traits::value_type is an unsigned integer +// type capable of accommodating 32-bit quantities. + +// UNSUPPORTED: c++03 +// REQUIRES: stdlib=libc++ + +#include +#include + +#include "test_macros.h" + +void f() { + std::seed_seq seq; + + // Not an integral type + { + double* p = nullptr; + seq.generate(p, p); // expected-error-re@*:* {{static assertion failed{{.+}}: [rand.util.seedseq]/7 requires{{.+}}}} + // expected-error@*:* 0+ {{invalid operands to}} + } + + // Not an unsigned type + { + long long* p = nullptr; + seq.generate(p, p); // expected-error-re@*:* {{static assertion failed{{.+}}: [rand.util.seedseq]/7 requires{{.+}}}} + } + + // Not a 32-bit type + { +#if UCHAR_MAX < UINT32_MAX + unsigned char* p = nullptr; + seq.generate(p, p); // expected-error-re@*:* {{static assertion failed{{.+}}: [rand.util.seedseq]/7 requires{{.+}}}} +#endif + } + + // Everything satisfied + { + unsigned long* p = nullptr; + seq.generate(p, p); // no diagnostic + } +} diff --git a/yass/third_party/libc++/trunk/test/std/ranges/range.adaptors/range.elements/range.concept.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/ranges/range.adaptors/range.elements/range.concept.compile.pass.cpp index 7de72ecc0a..a49e692d58 100644 --- a/yass/third_party/libc++/trunk/test/std/ranges/range.adaptors/range.elements/range.concept.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/ranges/range.adaptors/range.elements/range.concept.compile.pass.cpp @@ -52,7 +52,6 @@ static_assert(!std::ranges::input_range*>>, 0>); // !tuple-like -LIBCPP_STATIC_ASSERT(!std::__tuple_like); static_assert(!HasElementsView, 1>); // !(N < tuple_size_v) diff --git a/yass/third_party/libc++/trunk/test/std/ranges/range.utility/range.subrange/operator.pair_like.pass.cpp b/yass/third_party/libc++/trunk/test/std/ranges/range.utility/range.subrange/operator.pair_like.pass.cpp index 2641a9ad94..82f5dd801e 100644 --- a/yass/third_party/libc++/trunk/test/std/ranges/range.utility/range.subrange/operator.pair_like.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/ranges/range.utility/range.subrange/operator.pair_like.pass.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "test_macros.h" diff --git a/yass/third_party/libc++/trunk/test/std/ranges/range.utility/range.utility.conv/to_deduction.pass.cpp b/yass/third_party/libc++/trunk/test/std/ranges/range.utility/range.utility.conv/to_deduction.pass.cpp index f84cedbc12..58307bd88d 100644 --- a/yass/third_party/libc++/trunk/test/std/ranges/range.utility/range.utility.conv/to_deduction.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/ranges/range.utility/range.utility.conv/to_deduction.pass.cpp @@ -9,7 +9,7 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 // There is a bug in older versions of Clang that causes trouble with constraints in classes like // `ContainerWithDirectCtr`. -// XFAIL: clang-16, apple-clang-15 +// XFAIL: apple-clang-15 // template class C, input_range R, class... Args> // constexpr auto to(R&& r, Args&&... args); // Since C++23 diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/leap_seconds.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/leap_seconds.pass.cpp new file mode 100644 index 0000000000..4fcdf6fab9 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/leap_seconds.pass.cpp @@ -0,0 +1,75 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// Tests the loaded leap seconds match +// https://eel.is/c++draft/time.zone.leap.overview#2 +// +// At the moment of writing that list is the actual list. +// If in the future more leap seconds are added, the returned list may have more + +#include +#include +#include +#include +#include + +using namespace std::literals::chrono_literals; + +// The list of leap seconds matching +// https://eel.is/c++draft/time.zone.leap.overview#2 +// At the moment of writing that list is the actual list in the IANA database. +// If in the future more leap seconds can be added. +static const std::array leap_seconds = { + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1972y / std::chrono::January / 1}}, 10s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1972y / std::chrono::July / 1}}, 11s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1973y / std::chrono::January / 1}}, 12s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1974y / std::chrono::January / 1}}, 13s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1975y / std::chrono::January / 1}}, 14s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1976y / std::chrono::January / 1}}, 15s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1977y / std::chrono::January / 1}}, 16s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1978y / std::chrono::January / 1}}, 17s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1979y / std::chrono::January / 1}}, 18s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1980y / std::chrono::January / 1}}, 19s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1981y / std::chrono::July / 1}}, 20s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1982y / std::chrono::July / 1}}, 21s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1983y / std::chrono::July / 1}}, 22s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1985y / std::chrono::July / 1}}, 23s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1988y / std::chrono::January / 1}}, 24s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1990y / std::chrono::January / 1}}, 25s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1991y / std::chrono::January / 1}}, 26s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1992y / std::chrono::July / 1}}, 27s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1993y / std::chrono::July / 1}}, 28s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1994y / std::chrono::July / 1}}, 29s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1996y / std::chrono::January / 1}}, 30s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1997y / std::chrono::July / 1}}, 31s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1999y / std::chrono::January / 1}}, 32s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{2006y / std::chrono::January / 1}}, 33s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{2009y / std::chrono::January / 1}}, 34s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{2012y / std::chrono::July / 1}}, 35s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{2015y / std::chrono::July / 1}}, 36s), + std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{2017y / std::chrono::January / 1}}, 37s)}; + +int main(int, const char**) { + const std::chrono::tzdb& tzdb = std::chrono::get_tzdb(); + + assert(tzdb.leap_seconds.size() >= leap_seconds.size()); + assert((std::ranges::equal( + leap_seconds, + tzdb.leap_seconds | std::ranges::views::take(leap_seconds.size()), + [](const auto& lhs, const auto& rhs) { return lhs.first == rhs.date() && lhs.second == rhs.value(); }))); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.access/current_zone.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.access/current_zone.pass.cpp new file mode 100644 index 0000000000..d85c8ba526 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.access/current_zone.pass.cpp @@ -0,0 +1,77 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// const time_zone* current_zone(); + +#include +#include +#include +#include + +#include "test_macros.h" +#include "assert_macros.h" +#include "concat_macros.h" + +#ifdef _WIN32 +static void set_tz(std::string zone) { + // Note Windows does not have setenv, only putenv + // https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/putenv-s-wputenv-s?view=msvc-170 + // Unlike POSIX it does not mention the string of putenv becomes part + // of the environment. + + int status = _putenv_s("TZ", zone.c_str(), 1); + assert(status == 0); +} + +#else +static void set_tz(const std::string& zone) { + int status = setenv("TZ", zone.c_str(), 1); + assert(status == 0); +} +#endif + +static void test_zone(const std::string& zone) { + set_tz(zone); + const std::chrono::time_zone* tz = std::chrono::current_zone(); + assert(tz); + assert(tz->name() == zone); +} + +static void test_link(const std::string& link, std::string_view zone) { + set_tz(link); + const std::chrono::time_zone* tz = std::chrono::current_zone(); + assert(tz); + assert(tz->name() == zone); +} + +int main(int, const char**) { + const std::chrono::time_zone* tz = std::chrono::current_zone(); + // Returns a valid time zone, the value depends on the OS settings. + assert(tz); + // setting the environment to an invalid value returns the value of + // the OS setting. + set_tz("This is not a time zone"); + assert(tz == std::chrono::current_zone()); + + const std::chrono::tzdb& db = std::chrono::get_tzdb(); + for (const auto& zone : db.zones) + test_zone(std::string{zone.name()}); + + for (const auto& link : db.links) + test_link(std::string{link.name()}, link.target()); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.access/get_tzdb.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.access/get_tzdb.pass.cpp index b6204c615d..470a722d0b 100644 --- a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.access/get_tzdb.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.access/get_tzdb.pass.cpp @@ -35,5 +35,8 @@ int main(int, const char**) { assert(std::ranges::is_sorted(db.links)); assert(std::ranges::adjacent_find(db.links) == db.links.end()); // is unique? + assert(!db.leap_seconds.empty()); + assert(std::ranges::is_sorted(db.leap_seconds)); + return 0; } diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.access/locate_zone.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.access/locate_zone.pass.cpp new file mode 100644 index 0000000000..c3142a86bf --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.access/locate_zone.pass.cpp @@ -0,0 +1,62 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// const time_zone* locate_zone(string_view tz_name); + +#include +#include +#include + +#include "test_macros.h" +#include "assert_macros.h" +#include "concat_macros.h" + +static void test_zone(std::string_view zone) { + const std::chrono::time_zone* tz = std::chrono::locate_zone(zone); + assert(tz); + assert(tz->name() == zone); +} + +static void test_link(std::string_view link, std::string_view zone) { + const std::chrono::time_zone* tz = std::chrono::locate_zone(link); + assert(tz); + assert(tz->name() == zone); +} + +static void test_exception([[maybe_unused]] std::string_view zone) { + TEST_VALIDATE_EXCEPTION( + std::runtime_error, + [&]([[maybe_unused]] const std::runtime_error& e) { + std::string_view what{"tzdb: requested time zone not found"}; + TEST_LIBCPP_REQUIRE( + e.what() == what, + TEST_WRITE_CONCATENATED("\nExpected exception ", what, "\nActual exception ", e.what(), '\n')); + }, + TEST_IGNORE_NODISCARD std::chrono::locate_zone(zone)); +} + +int main(int, const char**) { + const std::chrono::tzdb& db = std::chrono::get_tzdb(); + for (const auto& zone : db.zones) + test_zone(zone.name()); + + for (const auto& link : db.links) + test_link(link.name(), link.target()); + + test_exception("This is not a time zone"); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/current_zone.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/current_zone.pass.cpp new file mode 100644 index 0000000000..7b4218cc84 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/current_zone.pass.cpp @@ -0,0 +1,79 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// struct tzdb + +// const time_zone* current_zone() const; + +#include +#include +#include +#include + +#include "test_macros.h" +#include "assert_macros.h" +#include "concat_macros.h" + +#ifdef _WIN32 +static void set_tz(std::string zone) { + // Note Windows does not have setenv, only putenv + // https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/putenv-s-wputenv-s?view=msvc-170 + // Unlike POSIX it does not mention the string of putenv becomes part + // of the environment. + + int status = _putenv_s("TZ", zone.c_str(), 1); + assert(status == 0); +} + +#else +static void set_tz(const std::string& zone) { + int status = setenv("TZ", zone.c_str(), 1); + assert(status == 0); +} +#endif + +static void test_zone(const std::string& zone) { + set_tz(zone); + const std::chrono::time_zone* tz = std::chrono::get_tzdb().current_zone(); + assert(tz); + assert(tz->name() == zone); +} + +static void test_link(const std::string& link, std::string_view zone) { + set_tz(link); + const std::chrono::time_zone* tz = std::chrono::get_tzdb().current_zone(); + assert(tz); + assert(tz->name() == zone); +} + +int main(int, const char**) { + const std::chrono::time_zone* tz = std::chrono::get_tzdb().current_zone(); + // Returns a valid time zone, the value depends on the OS settings. + assert(tz); + // setting the environment to an invalid value returns the value of + // the OS setting. + set_tz("This is not a time zone"); + assert(tz == std::chrono::get_tzdb().current_zone()); + + const std::chrono::tzdb& db = std::chrono::get_tzdb(); + for (const auto& zone : db.zones) + test_zone(std::string{zone.name()}); + + for (const auto& link : db.links) + test_link(std::string{link.name()}, link.target()); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp new file mode 100644 index 0000000000..12987f6c89 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// struct tzdb + +// const time_zone* locate_zone(string_view tz_name) const; + +#include +#include +#include + +#include "test_macros.h" +#include "assert_macros.h" +#include "concat_macros.h" + +static void test_zone(std::string_view zone) { + const std::chrono::time_zone* tz = std::chrono::get_tzdb().locate_zone(zone); + assert(tz); + assert(tz->name() == zone); +} + +static void test_link(std::string_view link, std::string_view zone) { + const std::chrono::time_zone* tz = std::chrono::get_tzdb().locate_zone(link); + assert(tz); + assert(tz->name() == zone); +} + +static void test_exception([[maybe_unused]] std::string_view zone) { + TEST_VALIDATE_EXCEPTION( + std::runtime_error, + [&]([[maybe_unused]] const std::runtime_error& e) { + std::string_view what{"tzdb: requested time zone not found"}; + TEST_LIBCPP_REQUIRE( + e.what() == what, + TEST_WRITE_CONCATENATED("\nExpected exception ", what, "\nActual exception ", e.what(), '\n')); + }, + TEST_IGNORE_NODISCARD std::chrono::get_tzdb().locate_zone(zone)); +} + +int main(int, const char**) { + const std::chrono::tzdb& db = std::chrono::get_tzdb(); + for (const auto& zone : db.zones) + test_zone(zone.name()); + + for (const auto& link : db.links) + test_link(link.name(), link.target()); + + test_exception("This is not a time zone"); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/tzdb.members.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/tzdb.members.pass.cpp index 51c6d364c9..af95274e33 100644 --- a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/tzdb.members.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/tzdb.members.pass.cpp @@ -37,11 +37,9 @@ int main(int, const char**) { tzdb.version = "version"; assert(tzdb.version == "version"); - [[maybe_unused]] std::vector& zones = tzdb.zones; - + [[maybe_unused]] std::vector& zones = tzdb.zones; [[maybe_unused]] std::vector& links = tzdb.links; - - // TODO TZDB add the leap data member + [[maybe_unused]] std::vector& leap_seconds = tzdb.leap_seconds; return 0; } diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.info/time.zone.info.sys/sys_info.members.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.info/time.zone.info.sys/sys_info.members.pass.cpp new file mode 100644 index 0000000000..2510792c22 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.info/time.zone.info.sys/sys_info.members.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 + +// XFAIL: libcpp-has-no-incomplete-tzdb + +// + +// struct sys_info { +// sys_seconds begin; +// sys_seconds end; +// seconds offset; +// minutes save; +// string abbrev; +// }; + +// Validates whether: +// - The members are present as non-const members. +// - The struct is an aggregate. + +#include +#include +#include + +int main(int, const char**) { + static_assert(std::is_aggregate_v); + + std::chrono::sys_info sys_info{ + .begin = std::chrono::sys_seconds::min(), + .end = std::chrono::sys_seconds::max(), + .offset = std::chrono::seconds(0), + .save = std::chrono::minutes(0), + .abbrev = "UTC"}; + + [[maybe_unused]] std::chrono::sys_seconds& begin = sys_info.begin; + [[maybe_unused]] std::chrono::sys_seconds& end = sys_info.end; + [[maybe_unused]] std::chrono::seconds& offset = sys_info.offset; + [[maybe_unused]] std::chrono::minutes& save = sys_info.save; + [[maybe_unused]] std::string& abbrev = sys_info.abbrev; + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/assign.copy.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/assign.copy.pass.cpp new file mode 100644 index 0000000000..6918ed6be5 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/assign.copy.pass.cpp @@ -0,0 +1,69 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// class leap_second +// { +// leap_second& operator=(const leap_second&) = default; +// +// ... +// }; + +#include +#include +#include +#include +#include + +#include "test_chrono_leap_second.h" + +constexpr bool test() { + std::chrono::leap_second a = + test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1}); + std::chrono::leap_second b = + test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{10}}, std::chrono::seconds{15}); + + // operator== only compares the date member. + assert(a.date() != b.date()); + assert(a.value() != b.value()); + + { + std::same_as decltype(auto) result(b = a); + assert(std::addressof(result) == std::addressof(b)); + + assert(a.date() == b.date()); + assert(a.value() == b.value()); + } + + { + // Tests an rvalue uses the copy assignment. + std::same_as decltype(auto) result(b = std::move(a)); + assert(std::addressof(result) == std::addressof(b)); + + assert(a.date() == b.date()); + assert(a.value() == b.value()); + } + + return true; +} + +int main(int, const char**) { + static_assert(std::is_copy_assignable_v); + + test(); + static_assert(test()); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/cons.copy.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/cons.copy.pass.cpp new file mode 100644 index 0000000000..3dad08968d --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/cons.copy.pass.cpp @@ -0,0 +1,67 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// class leap_second +// { +// leap_second(const leap_second&) = default; +// +// ... +// }; + +#include +#include +#include + +#include "test_chrono_leap_second.h" + +constexpr bool test() { + std::chrono::leap_second a = + test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1}); + + { + std::chrono::leap_second b = a; + + // operator== only compares the date member. + assert(a.date() == b.date()); + assert(a.value() == b.value()); + } + +#ifdef _LIBCPP_VERSION + { + // Tests an rvalue uses the copy constructor. + // Since implementations are allowed to add additional constructors this is + // a libc++ specific test. + std::chrono::leap_second b = std::move(a); + + // operator== only compares the date member. + assert(a.date() == b.date()); + assert(a.value() == b.value()); + } + // libc++ does not provide a default constructor. + static_assert(!std::is_default_constructible_v); +#endif // _LIBCPP_VERSION + + return true; +} + +int main(int, const char**) { + static_assert(std::copy_constructible); + + test(); + static_assert(test()); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/members/date.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/members/date.pass.cpp new file mode 100644 index 0000000000..6f9fe1c47d --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/members/date.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// class leap_second; + +// constexpr sys_seconds date() const noexcept; + +#include +#include + +#include "test_macros.h" + +#include "test_chrono_leap_second.h" + +constexpr void test(const std::chrono::leap_second leap_second, std::chrono::sys_seconds expected) { + std::same_as auto date = leap_second.date(); + assert(date == expected); + static_assert(noexcept(leap_second.date())); +} + +constexpr bool test() { + test(test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1}), + std::chrono::sys_seconds{std::chrono::seconds{0}}); + + return true; +} + +int main(int, const char**) { + test(); + static_assert(test()); + + // test with the real tzdb + const std::chrono::tzdb& tzdb = std::chrono::get_tzdb(); + assert(!tzdb.leap_seconds.empty()); + test(tzdb.leap_seconds[0], tzdb.leap_seconds[0].date()); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/members/value.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/members/value.pass.cpp new file mode 100644 index 0000000000..652e51ef0b --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/members/value.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// class leap_second; + +// constexpr seconds value() const noexcept; + +#include +#include + +#include "test_macros.h" + +#include "test_chrono_leap_second.h" + +constexpr void test(const std::chrono::leap_second leap_second, std::chrono::seconds expected) { + std::same_as auto value = leap_second.value(); + assert(value == expected); + static_assert(noexcept(leap_second.value())); +} + +constexpr bool test() { + test(test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1}), + std::chrono::seconds{1}); + + return true; +} + +int main(int, const char**) { + test(); + static_assert(test()); + + // test with the real tzdb + const std::chrono::tzdb& tzdb = std::chrono::get_tzdb(); + assert(!tzdb.leap_seconds.empty()); + test(tzdb.leap_seconds[0], tzdb.leap_seconds[0].value()); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/nonmembers/comparison.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/nonmembers/comparison.pass.cpp new file mode 100644 index 0000000000..bf6855ea63 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.leap/nonmembers/comparison.pass.cpp @@ -0,0 +1,83 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// TODO TZDB test whether this can be enabled with gcc 14. +// UNSUPPORTED: gcc-13 + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// class leap_second; + +//constexpr bool operator==(const leap_second& x, const leap_second& y); // C++20 +//constexpr strong_ordering operator<=>(const leap_second& x, const leap_second& y); +// +//template +// constexpr bool operator==(const leap_second& x, const sys_time& y); +//template +// constexpr bool operator< (const leap_second& x, const sys_time& y); +//template +// constexpr bool operator< (const sys_time& x, const leap_second& y); +//template +// constexpr bool operator> (const leap_second& x, const sys_time& y); +//template +// constexpr bool operator> (const sys_time& x, const leap_second& y); +//template +// constexpr bool operator<=(const leap_second& x, const sys_time& y); +//template +// constexpr bool operator<=(const sys_time& x, const leap_second& y); +//template +// constexpr bool operator>=(const leap_second& x, const sys_time& y); +//template +// constexpr bool operator>=(const sys_time& x, const leap_second& y); +//template +// requires three_way_comparable_with> +// constexpr auto operator<=>(const leap_second& x, const sys_time& y); + +#include +#include + +#include "test_macros.h" +#include "test_comparisons.h" + +#include "test_chrono_leap_second.h" + +constexpr void test_comparison(const std::chrono::leap_second lhs, const std::chrono::leap_second rhs) { + AssertOrderReturn(); + assert(testOrder(lhs, rhs, std::strong_ordering::less)); + + AssertOrderReturn(); + assert(testOrder(lhs, rhs.date(), std::strong_ordering::less)); + + AssertOrderReturn(); + assert(testOrder(lhs.date(), rhs, std::strong_ordering::less)); +} + +constexpr bool test() { + test_comparison(test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1}), + test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{1}}, std::chrono::seconds{2})); + + return true; +} + +int main(int, const char**) { + test(); + static_assert(test()); + + // test with the real tzdb + const std::chrono::tzdb& tzdb = std::chrono::get_tzdb(); + assert(tzdb.leap_seconds.size() > 2); + test_comparison(tzdb.leap_seconds[0], tzdb.leap_seconds[1]); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.timezone/time.zone.members/get_info.sys_time.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.timezone/time.zone.members/get_info.sys_time.pass.cpp new file mode 100644 index 0000000000..2ad4089685 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.timezone/time.zone.members/get_info.sys_time.pass.cpp @@ -0,0 +1,1374 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// + +// class time_zone; + +// template +// sys_info get_info(const sys_time<_Duration>& time) const; + +// This test uses the system provided database. This makes the test portable, +// but may cause failures when the database information changes. Historic data +// may change if new facts are uncovered, future data may change when regions +// change their time zone or daylight saving time. Most tests will not look in +// the future to attempt to avoid issues. All tests list the data on which they +// are based, this makes debugging easier upon failure; including to see whether +// the provided data has not been changed +// +// +// The data in the tests can be validated by using the zdump tool. For +// example +// zdump -v Asia/Hong_Kong +// show all transistions in the Hong Kong time zone. Or +// zdump -c1970,1980 -v Asia/Hong_Kong +// shows all transitions in Hong Kong between 1970 and 1980. + +#include +#include +#include +#include + +#include "test_macros.h" +#include "assert_macros.h" +#include "concat_macros.h" + +/***** ***** HELPERS ***** *****/ + +[[nodiscard]] static std::chrono::sys_seconds to_sys_seconds( + std::chrono::year year, + std::chrono::month month, + std::chrono::day day, + std::chrono::hours h = std::chrono::hours(0), + std::chrono::minutes m = std::chrono::minutes{0}, + std::chrono::seconds s = std::chrono::seconds{0}) { + std::chrono::year_month_day result{year, month, day}; + + return std::chrono::time_point_cast(static_cast(result)) + h + m + s; +} + +static void assert_equal(const std::chrono::sys_info& lhs, const std::chrono::sys_info& rhs) { + TEST_REQUIRE(lhs.begin == rhs.begin, + TEST_WRITE_CONCATENATED("\nBegin:\nExpected output ", lhs.begin, "\nActual output ", rhs.begin, '\n')); + TEST_REQUIRE(lhs.end == rhs.end, + TEST_WRITE_CONCATENATED("\nEnd:\nExpected output ", lhs.end, "\nActual output ", rhs.end, '\n')); + TEST_REQUIRE( + lhs.offset == rhs.offset, + TEST_WRITE_CONCATENATED("\nOffset:\nExpected output ", lhs.offset, "\nActual output ", rhs.offset, '\n')); + TEST_REQUIRE(lhs.save == rhs.save, + TEST_WRITE_CONCATENATED("\nSave:\nExpected output ", lhs.save, "\nActual output ", rhs.save, '\n')); + TEST_REQUIRE( + lhs.abbrev == rhs.abbrev, + TEST_WRITE_CONCATENATED("\nAbbrev:\nExpected output ", lhs.abbrev, "\nActual output ", rhs.abbrev, '\n')); +} + +static void assert_equal(std::string_view expected, const std::chrono::sys_info& value) { + // Note the output of operator<< is implementation defined, use this + // format to keep the test portable. + std::string result = std::format( + "[{}, {}) {:%T} {:%Q%q} {}", + value.begin, + value.end, + std::chrono::hh_mm_ss{value.offset}, + value.save, + value.abbrev); + + TEST_REQUIRE(expected == result, + TEST_WRITE_CONCATENATED("\nExpected output ", expected, "\nActual output ", result, '\n')); +} + +static void +assert_range(std::string_view expected, const std::chrono::sys_info& begin, const std::chrono::sys_info& end) { + assert_equal(expected, begin); + assert_equal(expected, end); +} + +static void assert_cycle( + std::string_view expected_1, + const std::chrono::sys_info& begin_1, + const std::chrono::sys_info& end_1, + std::string_view expected_2, + const std::chrono::sys_info& begin_2, + const std::chrono::sys_info& end_2 + +) { + assert_range(expected_1, begin_1, end_1); + assert_range(expected_2, begin_2, end_2); +} + +/***** ***** TESTS ***** *****/ + +static void test_gmt() { + // Simple zone always valid, no rule entries, lookup using a link. + // L Etc/GMT GMT + // Z Etc/GMT 0 - GMT + + const std::chrono::time_zone* tz = std::chrono::locate_zone("GMT"); + + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), + std::chrono::sys_seconds::max(), + std::chrono::seconds(0), + std::chrono::minutes(0), + "GMT"), + tz->get_info(std::chrono::sys_seconds::min())); + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), + std::chrono::sys_seconds::max(), + std::chrono::seconds(0), + std::chrono::minutes(0), + "GMT"), + tz->get_info(std::chrono::sys_seconds(std::chrono::seconds{0}))); + + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), + std::chrono::sys_seconds::max(), + std::chrono::seconds(0), + std::chrono::minutes(0), + "GMT"), + tz->get_info(std::chrono::sys_seconds::max() - std::chrono::seconds{1})); // max is not valid +} + +static void test_durations() { + // Doesn't test a location, instead tests whether different duration + // specializations work. + const std::chrono::time_zone* tz = std::chrono::locate_zone("GMT"); + + // Using the GMT zone means every call gives the same result. + std::chrono::sys_info expected( + std::chrono::sys_seconds::min(), + std::chrono::sys_seconds::max(), + std::chrono::seconds(0), + std::chrono::minutes(0), + "GMT"); + + assert_equal(expected, tz->get_info(std::chrono::sys_time{})); + assert_equal(expected, tz->get_info(std::chrono::sys_time{})); + assert_equal(expected, tz->get_info(std::chrono::sys_time{})); + assert_equal(expected, tz->get_info(std::chrono::sys_time{})); + assert_equal(expected, tz->get_info(std::chrono::sys_time{})); + assert_equal(expected, tz->get_info(std::chrono::sys_time{})); + assert_equal(expected, tz->get_info(std::chrono::sys_time{})); + assert_equal(expected, tz->get_info(std::chrono::sys_time{})); + assert_equal(expected, tz->get_info(std::chrono::sys_time{})); + assert_equal(expected, tz->get_info(std::chrono::sys_time{})); + assert_equal(expected, tz->get_info(std::chrono::sys_time{})); +} + +static void test_indian_kerguelen() { + // One change, no rules, no dst changes. + + // Z Indian/Kerguelen 0 - -00 1950 + // 5 - +05 + + const std::chrono::time_zone* tz = std::chrono::locate_zone("Indian/Kerguelen"); + + std::chrono::sys_seconds transition = + to_sys_seconds(std::chrono::year(1950), std::chrono::January, std::chrono::day(1)); + + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), // + transition, // + std::chrono::seconds(0), // + std::chrono::minutes(0), // + "-00"), // + tz->get_info(std::chrono::sys_seconds::min())); + + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), // + transition, // + std::chrono::seconds(0), // + std::chrono::minutes(0), // + "-00"), // + tz->get_info(transition - std::chrono::seconds{1})); + + assert_equal( + std::chrono::sys_info( + transition, // + std::chrono::sys_seconds::max(), // + std::chrono::hours(5), // + std::chrono::minutes(0), // + "+05"), // + tz->get_info(transition)); +} + +static void test_antarctica_syowa() { + // One change, no rules, no dst changes + // This change uses an ON field with a day number + // + // There don't seem to be rule-less zones that use last day or a + // contrained day + + // Z Antarctica/Syowa 0 - -00 1957 Ja 29 + // 3 - +03 + + const std::chrono::time_zone* tz = std::chrono::locate_zone("Antarctica/Syowa"); + + std::chrono::sys_seconds transition = + to_sys_seconds(std::chrono::year(1957), std::chrono::January, std::chrono::day(29)); + + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), // + transition, // + std::chrono::seconds(0), // + std::chrono::minutes(0), // + "-00"), // + tz->get_info(std::chrono::sys_seconds::min())); + + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), // + transition, // + std::chrono::seconds(0), // + std::chrono::minutes(0), // + "-00"), // + tz->get_info(transition - std::chrono::seconds(1))); + + assert_equal( + std::chrono::sys_info( + transition, // + std::chrono::sys_seconds::max(), // + std::chrono::hours(3), // + std::chrono::minutes(0), // + "+03"), // + tz->get_info(transition)); +} + +static void test_asia_hong_kong() { + // A more typical entry, first some hard-coded entires and then at the + // end a rules based entry. This rule is valid for its entire period + // + // Z Asia/Hong_Kong 7:36:42 - LMT 1904 O 30 0:36:42 + // 8 - HKT 1941 Jun 15 3 + // 8 1 HKST 1941 O 1 4 + // 8 0:30 HKWT 1941 D 25 + // 9 - JST 1945 N 18 2 + // 8 HK HK%sT + // + // R HK 1946 o - Ap 21 0 1 S + // R HK 1946 o - D 1 3:30s 0 - + // R HK 1947 o - Ap 13 3:30s 1 S + // R HK 1947 o - N 30 3:30s 0 - + // R HK 1948 o - May 2 3:30s 1 S + // R HK 1948 1952 - O Su>=28 3:30s 0 - + // R HK 1949 1953 - Ap Su>=1 3:30 1 S + // R HK 1953 1964 - O Su>=31 3:30 0 - + // R HK 1954 1964 - Mar Su>=18 3:30 1 S + // R HK 1965 1976 - Ap Su>=16 3:30 1 S + // R HK 1965 1976 - O Su>=16 3:30 0 - + // R HK 1973 o - D 30 3:30 1 S + // R HK 1979 o - May 13 3:30 1 S + // R HK 1979 o - O 21 3:30 0 - + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("Asia/Hong_Kong"); + + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), + to_sys_seconds(1904y, std::chrono::October, 29d, 17h), // 7:36:42 - LMT 1904 O 30 0:36:42 + 7h + 36min + 42s, + 0min, + "LMT"), + tz->get_info(std::chrono::sys_seconds::min())); + + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), + to_sys_seconds(1904y, std::chrono::October, 29d, 17h), // 7:36:42 - LMT 1904 O 30 0:36:42 + 7h + 36min + 42s, + 0min, + "LMT"), + tz->get_info(to_sys_seconds(1904y, std::chrono::October, 29d, 16h, 59min, 59s))); + + assert_range("[1904-10-29 17:00:00, 1941-06-14 19:00:00) 08:00:00 0min HKT", // 8 - HKT 1941 Jun 15 3 + tz->get_info(to_sys_seconds(1904y, std::chrono::October, 29d, 17h)), + tz->get_info(to_sys_seconds(1941y, std::chrono::June, 14d, 18h, 59min, 59s))); + + assert_range("[1941-06-14 19:00:00, 1941-09-30 19:00:00) 09:00:00 60min HKST", // 8 1 HKST 1941 O 1 4 + tz->get_info(to_sys_seconds(1941y, std::chrono::June, 14d, 19h)), + tz->get_info(to_sys_seconds(1941y, std::chrono::September, 30d, 18h, 59min, 59s))); + + assert_range("[1941-09-30 19:00:00, 1941-12-24 15:30:00) 08:30:00 30min HKWT", // 8 0:30 HKWT 1941 D 25 + tz->get_info(to_sys_seconds(1941y, std::chrono::September, 30d, 19h)), + tz->get_info(to_sys_seconds(1941y, std::chrono::December, 24d, 15h, 29min, 59s))); + + assert_range("[1941-12-24 15:30:00, 1945-11-17 17:00:00) 09:00:00 0min JST", // 9 - JST 1945 N 18 2 + tz->get_info(to_sys_seconds(1941y, std::chrono::December, 24d, 15h, 30min)), + tz->get_info(to_sys_seconds(1945y, std::chrono::November, 17d, 16h, 59min, 59s))); + + assert_range("[1945-11-17 17:00:00, 1946-04-20 16:00:00) 08:00:00 0min HKT", // 8 HK%sT + tz->get_info(to_sys_seconds(1945y, std::chrono::November, 17d, 17h)), + tz->get_info(to_sys_seconds(1946y, std::chrono::April, 20d, 15h, 59min, 59s))); + + assert_cycle( // 8 HK%sT + "[1946-04-20 16:00:00, 1946-11-30 19:30:00) 09:00:00 60min HKST", + tz->get_info(to_sys_seconds(1946y, std::chrono::April, 20d, 16h)), // 1946 o Ap 21 0 1 S + tz->get_info(to_sys_seconds(1946y, std::chrono::November, 30d, 19h, 29min, 59s)), // 1946 o D 1 3:30s 0 - + "[1946-11-30 19:30:00, 1947-04-12 19:30:00) 08:00:00 0min HKT", + tz->get_info(to_sys_seconds(1946y, std::chrono::November, 30d, 19h, 30min)), // 1946 o D 1 3:30s 0 - + tz->get_info(to_sys_seconds(1947y, std::chrono::April, 12d, 19h, 29min, 59s))); // 1947 o Ap 13 3:30s 1 S + + assert_cycle( // 8 HK%sT + "[1947-04-12 19:30:00, 1947-11-29 19:30:00) 09:00:00 60min HKST", + tz->get_info(to_sys_seconds(1947y, std::chrono::April, 12d, 19h, 30min)), // 1947 o Ap 13 3:30s 1 S + tz->get_info(to_sys_seconds(1947y, std::chrono::November, 29d, 19h, 29min, 59s)), // 1947 o N 30 3:30s 0 - + "[1947-11-29 19:30:00, 1948-05-01 19:30:00) 08:00:00 0min HKT", + tz->get_info(to_sys_seconds(1947y, std::chrono::November, 29d, 19h, 30min)), // 1947 o N 30 3:30s 0 - + tz->get_info(to_sys_seconds(1948y, std::chrono::May, 1d, 19h, 29min, 59s))); // 1948 o May 2 3:30s 1 S + + assert_cycle( // 8 HK%sT + "[1948-05-01 19:30:00, 1948-10-30 19:30:00) 09:00:00 60min HKST", + tz->get_info(to_sys_seconds(1948y, std::chrono::May, 1d, 19h, 30min)), // 1948 o May 2 3:30s 1 S + tz->get_info(to_sys_seconds(1948y, std::chrono::October, 30d, 19h, 29min, 59s)), // 1948 1952 O Su>=28 3:30s 0 - + "[1948-10-30 19:30:00, 1949-04-02 19:30:00) 08:00:00 0min HKT", + tz->get_info(to_sys_seconds(1948y, std::chrono::October, 30d, 19h, 30min)), // 1948 1952 O Su>=28 3:30s 0 - + tz->get_info(to_sys_seconds(1949y, std::chrono::April, 2d, 19h, 29min, 59s))); // 1949 1953 Ap Su>=1 3:30 1 S + + assert_cycle( // 8 HK%sT + "[1949-04-02 19:30:00, 1949-10-29 19:30:00) 09:00:00 60min HKST", + tz->get_info(to_sys_seconds(1949y, std::chrono::April, 2d, 19h, 30min)), // 1949 1953 Ap Su>=1 3:30 1 S + tz->get_info(to_sys_seconds(1949y, std::chrono::October, 29d, 19h, 29min, 59s)), // 1948 1952 O Su>=28 3:30s 0 + "[1949-10-29 19:30:00, 1950-04-01 19:30:00) 08:00:00 0min HKT", + tz->get_info(to_sys_seconds(1949y, std::chrono::October, 29d, 19h, 30min)), // 1948 1952 O Su>=28 3:30s 0 + tz->get_info(to_sys_seconds(1950y, std::chrono::April, 1d, 19h, 29min, 59s))); // 1949 1953 Ap Su>=1 3:30 1 S + + assert_range( + "[1953-10-31 18:30:00, 1954-03-20 19:30:00) 08:00:00 0min HKT", + tz->get_info(to_sys_seconds(1953y, std::chrono::October, 31d, 18h, 30min)), // 1953 1964 - O Su>=31 3:30 0 - + tz->get_info(to_sys_seconds(1954y, std::chrono::March, 20d, 19h, 29min, 59s))); // 1954 1964 - Mar Su>=18 3:30 1 S + + assert_cycle( // 8 HK%sT + "[1953-04-04 19:30:00, 1953-10-31 18:30:00) 09:00:00 60min HKST", + tz->get_info(to_sys_seconds(1953y, std::chrono::April, 4d, 19h, 30min)), // 1949 1953 Ap Su>=1 3:30 1 S + tz->get_info(to_sys_seconds(1953y, std::chrono::October, 31d, 18h, 29min, 59s)), // 1953 1964 - O Su>=31 3:30 0 - + "[1953-10-31 18:30:00, 1954-03-20 19:30:00) 08:00:00 0min HKT", + tz->get_info(to_sys_seconds(1953y, std::chrono::October, 31d, 18h, 30min)), // 1953 1964 - O Su>=31 3:30 0 - + tz->get_info(to_sys_seconds(1954y, std::chrono::March, 20d, 19h, 29min, 59s))); // 1954 1964 - Mar Su>=18 3:30 1 S + + assert_cycle( // 8 HK%sT + "[1972-04-15 19:30:00, 1972-10-21 18:30:00) 09:00:00 60min HKST", + tz->get_info(to_sys_seconds(1972y, std::chrono::April, 19d, 19h, 30min)), // 1965 1976 - Ap Su>=16 3:30 1 S + tz->get_info(to_sys_seconds(1972y, std::chrono::October, 21d, 18h, 29min, 59s)), // 1965 1976 - O Su>=16 3:30 0 - + "[1972-10-21 18:30:00, 1973-04-21 19:30:00) 08:00:00 0min HKT", + tz->get_info(to_sys_seconds(1972y, std::chrono::October, 21d, 18h, 30min)), // 1965 1976 - O Su>=16 3:30 0 - + tz->get_info(to_sys_seconds(1973y, std::chrono::April, 21d, 19h, 29min, 59s))); // 1965 1976 - Ap Su>=16 3:30 1 S + + assert_range( // 8 HK%sT + "[1973-04-21 19:30:00, 1973-10-20 18:30:00) 09:00:00 60min HKST", + tz->get_info(to_sys_seconds(1973y, std::chrono::April, 21d, 19h, 30min)), // 1965 1976 - Ap Su>=16 3:30 1 S + tz->get_info(to_sys_seconds(1973y, std::chrono::October, 20d, 18h, 29min, 59s))); // 1965 1976 - O Su>=16 3:30 0 - + + assert_range( // 8 HK%sT, test "1973 o - D 30 3:30 1 S" + "[1973-10-20 18:30:00, 1973-12-29 19:30:00) 08:00:00 0min HKT", + tz->get_info(to_sys_seconds(1973y, std::chrono::October, 20d, 18h, 30min)), // 1965 1976 - O Su>=16 3:30 + tz->get_info(to_sys_seconds(1973y, std::chrono::December, 29d, 19h, 29min, 59s))); // 1973 o - D 30 3:30 1 S + + assert_range( // 8 HK%sT + "[1973-12-29 19:30:00, 1974-10-19 18:30:00) 09:00:00 60min HKST", + tz->get_info(to_sys_seconds(1973y, std::chrono::December, 29d, 19h, 30min)), // 1973 o - D 30 3:30 1 S + tz->get_info(to_sys_seconds(1974y, std::chrono::October, 19d, 18h, 29min, 59s))); // 1965 1976 - O Su>=16 3:30 + + assert_range( // 8 HK%sT, between 1973 and 1979 no rule is active so falls back to default + "[1976-04-17 19:30:00, 1976-10-16 18:30:00) 09:00:00 60min HKST", + tz->get_info(to_sys_seconds(1976y, std::chrono::April, 17d, 19h, 30min)), // 1965 1976 - Ap Su>=16 3:30 1 S + tz->get_info(to_sys_seconds(1976y, std::chrono::October, 16d, 18h, 29min, 59s))); // 1965 1976 - O Su>=16 3:30 0 - + + assert_range( // 8 HK%sT, between 1973 and 1979 no rule is active so falls back to default + "[1976-10-16 18:30:00, 1979-05-12 19:30:00) 08:00:00 0min HKT", + tz->get_info(to_sys_seconds(1976y, std::chrono::October, 16d, 18h, 30min)), // 1965 1976 - O Su>=16 3:30 0 - + tz->get_info(to_sys_seconds(1979y, std::chrono::May, 12d, 19h, 29min, 59s))); // 1979 o - May 13 3:30 1 S + + assert_range( // 8 HK%sT + "[1979-05-12 19:30:00, 1979-10-20 18:30:00) 09:00:00 60min HKST", + tz->get_info(to_sys_seconds(1979y, std::chrono::May, 12d, 19h, 30min)), // 1979 o - May 13 3:30 1 S + tz->get_info(to_sys_seconds(1979y, std::chrono::October, 20d, 18h, 29min, 59s))); // 1979 o - O 21 3:30 0 - + + assert_equal( + std::chrono::sys_info( + to_sys_seconds(1979y, std::chrono::October, 20d, 18h, 30min), + std::chrono::sys_seconds::max(), + 8h, + std::chrono::minutes(0), + "HKT"), + tz->get_info(to_sys_seconds(1979y, std::chrono::October, 20d, 18h, 30min))); + + assert_equal( + std::chrono::sys_info( + to_sys_seconds(1979y, std::chrono::October, 20d, 18h, 30min), + std::chrono::sys_seconds::max(), + 8h, + std::chrono::minutes(0), + "HKT"), + tz->get_info(std::chrono::sys_seconds::max() - std::chrono::seconds{1})); // max is not valid +} + +static void test_europe_berlin() { + // A more typical entry, first some hard-coded entires and then at the + // end a rules based entry. This rule is valid for its entire period + // + + // Z Europe/Berlin 0:53:28 - LMT 1893 Ap + // 1 c CE%sT 1945 May 24 2 + // 1 So CE%sT 1946 + // 1 DE CE%sT 1980 + // 1 E CE%sT + // + // R c 1916 o - Ap 30 23 1 S + // R c 1916 o - O 1 1 0 - + // R c 1917 1918 - Ap M>=15 2s 1 S + // R c 1917 1918 - S M>=15 2s 0 - + // R c 1940 o - Ap 1 2s 1 S + // R c 1942 o - N 2 2s 0 - + // R c 1943 o - Mar 29 2s 1 S + // R c 1943 o - O 4 2s 0 - + // R c 1944 1945 - Ap M>=1 2s 1 S + // R c 1944 o - O 2 2s 0 - + // R c 1945 o - S 16 2s 0 - + // R c 1977 1980 - Ap Su>=1 2s 1 S + // R c 1977 o - S lastSu 2s 0 - + // R c 1978 o - O 1 2s 0 - + // R c 1979 1995 - S lastSu 2s 0 - + // R c 1981 ma - Mar lastSu 2s 1 S + // R c 1996 ma - O lastSu 2s 0 - + // + // R So 1945 o - May 24 2 2 M + // R So 1945 o - S 24 3 1 S + // R So 1945 o - N 18 2s 0 - + // + // R DE 1946 o - Ap 14 2s 1 S + // R DE 1946 o - O 7 2s 0 - + // R DE 1947 1949 - O Su>=1 2s 0 - + // R DE 1947 o - Ap 6 3s 1 S + // R DE 1947 o - May 11 2s 2 M + // R DE 1947 o - Jun 29 3 1 S + // R DE 1948 o - Ap 18 2s 1 S + // R DE 1949 o - Ap 10 2s 1 S + // + // R E 1977 1980 - Ap Su>=1 1u 1 S + // R E 1977 o - S lastSu 1u 0 - + // R E 1978 o - O 1 1u 0 - + // R E 1979 1995 - S lastSu 1u 0 - + // R E 1981 ma - Mar lastSu 1u 1 S + // R E 1996 ma - O lastSu 1u 0 - + // + // Note the European Union decided to stop the seasonal change in + // 2021. In 2023 seasonal changes are still in effect. + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("Europe/Berlin"); + + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), + to_sys_seconds(1893y, std::chrono::March, 31d, 23h, 6min, 32s), // 0:53:28 - LMT 1893 Ap + 53min + 28s, + 0min, + "LMT"), + tz->get_info(std::chrono::sys_seconds::min())); + + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), + to_sys_seconds(1893y, std::chrono::March, 31d, 23h, 6min, 32s), // 0:53:28 - LMT 1893 Ap + 53min + 28s, + 0min, + "LMT"), + tz->get_info(to_sys_seconds(1893y, std::chrono::March, 31d, 23h, 6min, 31s))); + + assert_range( + // 1 CE%sT before 1916 o - Ap 30 23 1 S + "[1893-03-31 23:06:32, 1916-04-30 22:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(1893y, std::chrono::March, 31d, 23h, 6min, 32s)), + tz->get_info(to_sys_seconds(1916y, std::chrono::April, 30d, 21h, 59min, 59s))); + + assert_cycle( + // 1 CE%sT + "[1916-04-30 22:00:00, 1916-09-30 23:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(1916y, std::chrono::April, 30d, 22h)), // 1916 o - Ap 30 23 1 S + tz->get_info(to_sys_seconds(1916y, std::chrono::September, 30d, 22h, 59min, 59s)), // o - O 1 1 0 - + "[1916-09-30 23:00:00, 1917-04-16 01:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(1916y, std::chrono::September, 30d, 23h)), // o - O 1 1 0 - + tz->get_info(to_sys_seconds(1917y, std::chrono::April, 16d, 0h, 59min, 59s))); // 1917 1918 - Ap M>=15 2s 1 S + + assert_cycle( + // 1 CE%sT + "[1917-04-16 01:00:00, 1917-09-17 01:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(1917y, std::chrono::April, 16d, 1h)), // 1917 1918 Ap M>=15 2s 1 S + tz->get_info(to_sys_seconds(1917y, std::chrono::September, 17d, 0h, 59min, 59s)), // 1917 1918 S M>=15 2s 0 - + "[1917-09-17 01:00:00, 1918-04-15 01:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(1917y, std::chrono::September, 17d, 1h)), // 1917 1918 S M>=15 2s 0 - + tz->get_info(to_sys_seconds(1918y, std::chrono::April, 15d, 0h, 59min, 59s))); // 1917 1918 Ap M>=15 2s 1 S + + assert_cycle( + // 1 CE%sT (The cycle is more than 1 year) + "[1918-04-15 01:00:00, 1918-09-16 01:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(1918y, std::chrono::April, 15d, 1h)), // 1917 1918 Ap M>=15 2s 1 S + tz->get_info(to_sys_seconds(1918y, std::chrono::September, 16d, 0h, 59min, 59s)), // 1917 1918 S M>=15 2s 0 - + "[1918-09-16 01:00:00, 1940-04-01 01:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(1918y, std::chrono::September, 16d, 1h)), // 1917 1918 S M>=15 2s 0 - + tz->get_info(to_sys_seconds(1940y, std::chrono::April, 1d, 0h, 59min, 59s))); // 1940 o Ap 1 2s 1 S + + assert_cycle( + // 1 CE%sT (The cycle is more than 1 year) + "[1940-04-01 01:00:00, 1942-11-02 01:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(1940y, std::chrono::April, 1d, 1h)), // 1940 o Ap 1 2s 1 S + tz->get_info(to_sys_seconds(1942y, std::chrono::November, 2d, 0h, 59min, 59s)), // 1942 o N 2 2s 0 - + "[1942-11-02 01:00:00, 1943-03-29 01:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(1942y, std::chrono::November, 2d, 1h)), // 1942 o N 2 2s 0 - + tz->get_info(to_sys_seconds(1943y, std::chrono::March, 29d, 0h, 59min, 59s))); // 1943 o Mar 29 2s 1 S + + assert_range( + // Here the zone changes from c (C-Eur) to So (SovietZone). + // The rule c ends on 1945-09-16, instead it ends at the zone change date/time + // There is a tricky part in the time + // "1 c CE%sT" has an offset of 1 at the moment the rule + // ends there is a save of 60 minutes. This means the + // local offset to UTC is 2 hours. The rule ends at + // 1945-05-24 02:00:00 local time, which is + // 1945-05-24 00:00:00 UTC. + "[1945-04-02 01:00:00, 1945-05-24 00:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(1945y, std::chrono::April, 2d, 1h)), // 1 CE%sT & 1945 Ap M>=1 2s 1 S + tz->get_info(to_sys_seconds(1945y, std::chrono::May, 23d, 23h, 59min, 59s))); // 1 c CE%sT & 1945 May 24 2 + + assert_range( // -- + "[1945-05-24 00:00:00, 1945-09-24 00:00:00) 03:00:00 120min CEMT", + tz->get_info(to_sys_seconds(1945y, std::chrono::May, 24d)), // 1 c CE%sT & 1945 May 24 2 + tz->get_info(to_sys_seconds(1945y, std::chrono::September, 23d, 23h, 59min, 59s))); // 1945 o S 24 3 1 S + + assert_range( + // 1 c CE%sT 1945 May 24 2 + "[1945-09-24 00:00:00, 1945-11-18 01:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(1945y, std::chrono::September, 24d)), // 1945 o S 24 3 1 S + tz->get_info(to_sys_seconds(1945y, std::chrono::November, 18d, 0h, 59min, 59s))); // 1945 o N 18 2s 0 - + assert_range( // -- + // Merges 2 continuations + "[1945-11-18 01:00:00, 1946-04-14 01:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(1945y, std::chrono::November, 18d, 1h)), // 1 c CE%sT & 1945 o N 18 2s 0 - + tz->get_info(to_sys_seconds(1946y, std::chrono::April, 14d, 0h, 59min, 59s))); // 1 So CE%sT & 1946 o Ap 14 2s 1 S + + assert_range( + // 1 DE CE%sT 1980 + "[1946-04-14 01:00:00, 1946-10-07 01:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(1946y, std::chrono::April, 14d, 1h)), // 1946 o Ap 14 2s 1 S + tz->get_info(to_sys_seconds(1946y, std::chrono::October, 7d, 0h, 59min, 59s))); // 1946 o O 7 2s 0 - + + // Note 1947 is an interesting year with 4 rules + // R DE 1947 1949 - O Su>=1 2s 0 - + // R DE 1947 o - Ap 6 3s 1 S + // R DE 1947 o - May 11 2s 2 M + // R DE 1947 o - Jun 29 3 1 S + assert_range( + // 1 DE CE%sT 1980 + "[1946-10-07 01:00:00, 1947-04-06 02:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(1946y, std::chrono::October, 7d, 1h)), // 1946 o O 7 2s 0 - + tz->get_info(to_sys_seconds(1947y, std::chrono::April, 6d, 1h, 59min, 59s))); // 1947 o Ap 6 3s 1 S + + assert_range( + // 1 DE CE%sT 1980 + "[1947-04-06 02:00:00, 1947-05-11 01:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(1947y, std::chrono::April, 6d, 2h)), // 1947 o Ap 6 3s 1 S + tz->get_info(to_sys_seconds(1947y, std::chrono::May, 11d, 0h, 59min, 59s))); // 1947 o May 11 2s 2 M + + assert_range( + // 1 DE CE%sT 1980 + "[1947-05-11 01:00:00, 1947-06-29 00:00:00) 03:00:00 120min CEMT", + tz->get_info(to_sys_seconds(1947y, std::chrono::May, 11d, 1h)), // 1947 o May 11 2s 2 M + tz->get_info(to_sys_seconds(1947y, std::chrono::June, 28d, 23h, 59min, 59s))); // 1947 o Jun 29 3 1 S + + assert_cycle( + // 1 DE CE%sT 1980 + "[1947-06-29 00:00:00, 1947-10-05 01:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(1947y, std::chrono::June, 29d)), // 1947 o Jun 29 3 1 S + tz->get_info(to_sys_seconds(1947y, std::chrono::October, 5d, 0h, 59min, 59s)), // 1947 1949 O Su>=1 2s 0 - + "[1947-10-05 01:00:00, 1948-04-18 01:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(1947y, std::chrono::October, 5d, 1h)), // 1947 1949 O Su>=1 2s 0 - + tz->get_info(to_sys_seconds(1948y, std::chrono::April, 18d, 0h, 59min, 59s))); // 1948 o Ap 18 2s 1 S + + assert_cycle( + // 1 DE CE%sT 1980 + "[1948-04-18 01:00:00, 1948-10-03 01:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(1948y, std::chrono::April, 18d, 1h)), // 1948 o Ap 18 2s 1 S + tz->get_info(to_sys_seconds(1948y, std::chrono::October, 3d, 0h, 59min, 59s)), // 1947 1949 O Su>=1 2s 0 - + "[1948-10-03 01:00:00, 1949-04-10 01:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(1948y, std::chrono::October, 3d, 1h)), // 1947 1949 O Su>=1 2s 0 - + tz->get_info(to_sys_seconds(1949y, std::chrono::April, 10d, 0h, 59min, 59s))); // 1949 o Ap 10 2s 1 S + + assert_cycle( // Note the end time is in a different continuation. + "[1949-04-10 01:00:00, 1949-10-02 01:00:00) 02:00:00 60min CEST", // 1 DE CE%sT 1980 + tz->get_info(to_sys_seconds(1949y, std::chrono::April, 10d, 1h)), // 1949 o Ap 10 2s 1 S + tz->get_info(to_sys_seconds(1949y, std::chrono::October, 2d, 0h, 59min, 59s)), // 1947 1949 O Su>=1 2s 0 - + "[1949-10-02 01:00:00, 1980-04-06 01:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(1949y, std::chrono::October, 2d, 1h)), // 1947 1949 O Su>=1 2s 0 - + tz->get_info( // 1 E CE%sT + to_sys_seconds(1980y, std::chrono::April, 6d, 0h, 59min, 59s))); // 1977 1980 Ap Su>=1 1u 1 S + + assert_cycle( + // 1 E CE%sT + "[2020-03-29 01:00:00, 2020-10-25 01:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(2020y, std::chrono::March, 29d, 1h)), // 1981 ma Mar lastSu 1u 1 S + tz->get_info(to_sys_seconds(2020y, std::chrono::October, 25d, 0h, 59min, 59s)), // 1996 ma O lastSu 1u 0 - + "[2020-10-25 01:00:00, 2021-03-28 01:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(2020y, std::chrono::October, 25d, 1h)), // 1996 ma O lastSu 1u 0 - + tz->get_info(to_sys_seconds(2021y, std::chrono::March, 28d, 0h, 59min, 59s))); // 1981 ma Mar lastSu 1u 1 S + + assert_cycle( + // 1 E CE%sT + "[2021-03-28 01:00:00, 2021-10-31 01:00:00) 02:00:00 60min CEST", + tz->get_info(to_sys_seconds(2021y, std::chrono::March, 28d, 1h)), // 1981 ma Mar lastSu 1u 1 S + tz->get_info(to_sys_seconds(2021y, std::chrono::October, 31d, 0h, 59min, 59s)), // 1996 ma O lastSu 1u 0 - + "[2021-10-31 01:00:00, 2022-03-27 01:00:00) 01:00:00 0min CET", + tz->get_info(to_sys_seconds(2021y, std::chrono::October, 31d, 1h)), // 1996 ma O lastSu 1u 0 - + tz->get_info(to_sys_seconds(2022y, std::chrono::March, 27d, 0h, 59min, 59s))); // 1981 ma Mar lastSu 1u 1 S +} + +static void test_america_st_johns() { + // A more typical entry, + // Uses letters both when DST is ative and not and has multiple + // letters. Uses negetive offsets. + // Switches several times between their own and Canadian rules + // Switches the stdoff from -3:30:52 to -3:30 while observing the same rule + + // Z America/St_Johns -3:30:52 - LMT 1884 + // -3:30:52 j N%sT 1918 + // -3:30:52 C N%sT 1919 + // -3:30:52 j N%sT 1935 Mar 30 + // -3:30 j N%sT 1942 May 11 + // -3:30 C N%sT 1946 + // -3:30 j N%sT 2011 N + // -3:30 C N%sT + // + // R j 1917 o - Ap 8 2 1 D + // R j 1917 o - S 17 2 0 S + // R j 1919 o - May 5 23 1 D + // R j 1919 o - Au 12 23 0 S + // R j 1920 1935 - May Su>=1 23 1 D + // R j 1920 1935 - O lastSu 23 0 S + // R j 1936 1941 - May M>=9 0 1 D + // R j 1936 1941 - O M>=2 0 0 S + // R j 1946 1950 - May Su>=8 2 1 D + // R j 1946 1950 - O Su>=2 2 0 S + // R j 1951 1986 - Ap lastSu 2 1 D + // R j 1951 1959 - S lastSu 2 0 S + // R j 1960 1986 - O lastSu 2 0 S + // R j 1987 o - Ap Su>=1 0:1 1 D + // R j 1987 2006 - O lastSu 0:1 0 S + // R j 1988 o - Ap Su>=1 0:1 2 DD + // R j 1989 2006 - Ap Su>=1 0:1 1 D + // R j 2007 2011 - Mar Su>=8 0:1 1 D + // R j 2007 2010 - N Su>=1 0:1 0 S + // + // R C 1918 o - Ap 14 2 1 D + // R C 1918 o - O 27 2 0 S + // R C 1942 o - F 9 2 1 W + // R C 1945 o - Au 14 23u 1 P + // R C 1945 o - S 30 2 0 S + // R C 1974 1986 - Ap lastSu 2 1 D + // R C 1974 2006 - O lastSu 2 0 S + // R C 1987 2006 - Ap Su>=1 2 1 D + // R C 2007 ma - Mar Su>=8 2 1 D + // R C 2007 ma - N Su>=1 2 0 S + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("America/St_Johns"); + + assert_equal( // -- + std::chrono::sys_info( + std::chrono::sys_seconds::min(), + to_sys_seconds(1884y, std::chrono::January, 1d, 3h, 30min, 52s), // -3:30:52 - LMT 1884 + -(3h + 30min + 52s), + 0min, + "LMT"), + tz->get_info(std::chrono::sys_seconds::min())); + + assert_equal( // -- + std::chrono::sys_info( + std::chrono::sys_seconds::min(), + to_sys_seconds(1884y, std::chrono::January, 1d, 3h, 30min, 52s), // -3:30:52 - LMT 1884 + -(3h + 30min + 52s), + 0min, + "LMT"), + tz->get_info(to_sys_seconds(1884y, std::chrono::January, 1d, 3h, 30min, 51s))); + + assert_range( // -3:30:52 j N%sT 1918 + "[1884-01-01 03:30:52, 1917-04-08 05:30:52) -03:30:52 0min NST", + tz->get_info(to_sys_seconds(1884y, std::chrono::January, 1d, 3h, 30min, 52s)), // no rule active + tz->get_info(to_sys_seconds(1917y, std::chrono::April, 8d, 5h, 30min, 51s))); // 1917 o Ap 8 2 1 D + + assert_range( // -3:30:52 j N%sT 1918 + "[1917-04-08 05:30:52, 1917-09-17 04:30:52) -02:30:52 60min NDT", + tz->get_info(to_sys_seconds(1917y, std::chrono::April, 8d, 5h, 30min, 52s)), // 1917 o Ap 8 2 1 D + tz->get_info(to_sys_seconds(1917y, std::chrono::September, 17d, 4h, 30min, 51s))); // 1917 o S 17 2 0 S + + assert_range("[1917-09-17 04:30:52, 1918-04-14 05:30:52) -03:30:52 0min NST", + tz->get_info( // -3:30:52 j N%sT 1918 + to_sys_seconds(1917y, std::chrono::September, 17d, 4h, 30min, 52s)), // 1917 o S 17 2 0 S + tz->get_info( // -3:30:52 C N%sT 1919 + to_sys_seconds(1918y, std::chrono::April, 14d, 5h, 30min, 51s))); // 1918 o Ap 14 2 1 D + + assert_range( // -3:30:52 C N%sT 1919 + "[1918-04-14 05:30:52, 1918-10-27 04:30:52) -02:30:52 60min NDT", + tz->get_info(to_sys_seconds(1918y, std::chrono::April, 14d, 5h, 30min, 52s)), // 1918 o Ap 14 2 1 D + tz->get_info(to_sys_seconds(1918y, std::chrono::October, 27d, 4h, 30min, 51s))); // 1918 o O 27 2 0 S + + assert_range("[1918-10-27 04:30:52, 1919-05-06 02:30:52) -03:30:52 0min NST", + tz->get_info( // -3:30:52 C N%sT 1919 + to_sys_seconds(1918y, std::chrono::October, 27d, 4h, 30min, 52s)), // 1918 o O 27 2 0 S + tz->get_info( // -3:30:52 j N%sT 1935 Mar 30 + to_sys_seconds(1919y, std::chrono::May, 6d, 2h, 30min, 51s))); // 1919 o May 5 23 1 D + + assert_range( // -3:30:52 j N%sT 1935 Mar 30 + "[1934-10-29 01:30:52, 1935-03-30 03:30:52) -03:30:52 0min NST", + tz->get_info(to_sys_seconds(1934y, std::chrono::October, 29d, 1h, 30min, 52s)), // 1920 1935 O lastSu 23 0 S + tz->get_info(to_sys_seconds(1935y, std::chrono::March, 30d, 3h, 30min, 51s))); // 1920 1935 May Su>=1 23 1 D + + assert_range( // -3:30 j N%sT 1942 May 11 + // Changed the stdoff while the same rule remains active. + "[1935-03-30 03:30:52, 1935-05-06 02:30:00) -03:30:00 0min NST", + tz->get_info(to_sys_seconds(1935y, std::chrono::March, 30d, 3h, 30min, 52s)), // 1920 1935 O lastSu 23 0 S + tz->get_info(to_sys_seconds(1935y, std::chrono::May, 6d, 2h, 29min, 59s))); // 1920 1935 May Su>=1 23 1 D + + assert_range( // -3:30 j N%sT 1942 May 11 + "[1935-05-06 02:30:00, 1935-10-28 01:30:00) -02:30:00 60min NDT", + tz->get_info(to_sys_seconds(1935y, std::chrono::May, 6d, 2h, 30min, 0s)), // 1920 1935 May Su>=1 23 1 D + tz->get_info(to_sys_seconds(1935y, std::chrono::October, 28d, 1h, 29min, 59s))); // 1920 1935 O lastSu 23 0 S + + assert_range( // -3:30 j N%sT 1942 May 11 + "[1941-10-06 02:30:00, 1942-05-11 03:30:00) -03:30:00 0min NST", + tz->get_info(to_sys_seconds(1941y, std::chrono::October, 6d, 2h, 30min, 0s)), // 1936 1941 O M>=2 0 0 S + tz->get_info(to_sys_seconds(1942y, std::chrono::May, 11d, 3h, 29min, 59s))); // 1946 1950 May Su>=8 2 1 D + + assert_range( // -3:30 C N%sT 1946 + "[1942-05-11 03:30:00, 1945-08-14 23:00:00) -02:30:00 60min NWT", + tz->get_info(to_sys_seconds(1942y, std::chrono::May, 11d, 3h, 30min, 0s)), // 1942 o F 9 2 1 W + tz->get_info(to_sys_seconds(1945y, std::chrono::August, 14d, 22h, 59min, 59s))); // 1945 o Au 14 23u 1 P + + assert_range( // -3:30 C N%sT 1946 + "[1945-08-14 23:00:00, 1945-09-30 04:30:00) -02:30:00 60min NPT", + tz->get_info(to_sys_seconds(1945y, std::chrono::August, 14d, 23h, 0min, 0s)), // 1945 o Au 14 23u 1 P + tz->get_info(to_sys_seconds(1945y, std::chrono::September, 30d, 4h, 29min, 59s))); // 1945 o S 30 2 0 S + + assert_range( + "[1945-09-30 04:30:00, 1946-05-12 05:30:00) -03:30:00 0min NST", + tz->get_info( + to_sys_seconds(1945y, std::chrono::September, 30d, 4h, 30min, 0s)), // -3:30 C N%sT 1946 & 945 o S 30 2 0 S + tz->get_info(to_sys_seconds( + 1946y, std::chrono::May, 12d, 5h, 29min, 59s))); // -3:30 j N%sT 2011 N & 1946 1950 May Su>=8 2 1 D + + assert_range( // -3:30 j N%sT 2011 N + "[1988-04-03 03:31:00, 1988-10-30 01:31:00) -01:30:00 120min NDDT", + tz->get_info(to_sys_seconds(1988y, std::chrono::April, 3d, 3h, 31min, 0s)), // 1988 o Ap Su>=1 0:1 2 DD + tz->get_info(to_sys_seconds(1988y, std::chrono::October, 30d, 1h, 30min, 59s))); // 1987 2006 O lastSu 0:1 0 S + + assert_range("[2011-03-13 03:31:00, 2011-11-06 04:30:00) -02:30:00 60min NDT", + tz->get_info( // -3:30 j N%sT 2011 N + to_sys_seconds(2011y, std::chrono::March, 13d, 3h, 31min, 0s)), // 2007 2011 Mar Su>=8 0:1 1 D + tz->get_info( // -3:30 C N%sT + to_sys_seconds(2011y, std::chrono::November, 6d, 04h, 29min, 59s))); // 2007 ma N Su>=1 2 0 S +} + +static void test_get_at_standard_time_universal() { + // Z Asia/Barnaul 5:35 - LMT 1919 D 10 + // ... + // 7 R +07/+08 1995 May 28 + // 6 R +06/+07 2011 Mar 27 2s + // ... + // + // ... + // R R 1985 2010 - Mar lastSu 2s 1 S + // R R 1996 2010 - O lastSu 2s 0 - + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("Asia/Barnaul"); + + assert_equal( + std::chrono::sys_info( + to_sys_seconds(2010y, std::chrono::October, 30d, 20h), + to_sys_seconds(2011y, std::chrono::March, 26d, 20h), + 6h, + 0min, + "+06"), + tz->get_info(to_sys_seconds(2010y, std::chrono::October, 31d, 10h))); +} + +static void test_get_at_standard_time_standard() { + // Z Africa/Bissau -1:2:20 - LMT 1912 Ja 1 1u + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Bissau"); + + assert_equal( + std::chrono::sys_info( + std::chrono::sys_seconds::min(), + to_sys_seconds(1912y, std::chrono::January, 1d, 1h), + -(1h + 2min + 20s), + 0min, + "LMT"), + tz->get_info(std::chrono::sys_seconds::min())); +} + +static void test_get_at_save_universal() { + // Z America/Tijuana -7:48:4 - LMT 1922 Ja 1 0:11:56 + // -7 - MST 1924 + // -8 - PST 1927 Jun 10 23 + // -7 - MST 1930 N 15 + // -8 - PST 1931 Ap + // -8 1 PDT 1931 S 30 + // -8 - PST 1942 Ap 24 + // -8 1 PWT 1945 Au 14 23u + // ... + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Tijuana"); + + assert_equal( + std::chrono::sys_info( + to_sys_seconds(1942y, std::chrono::April, 24d, 8h), + to_sys_seconds(1945y, std::chrono::August, 14d, 23h), + -7h, + 60min, + "PWT"), + tz->get_info(to_sys_seconds(1942y, std::chrono::April, 24d, 8h))); +} + +static void test_get_at_rule_standard() { + // Z Antarctica/Macquarie 0 - -00 1899 N + // 10 - AEST 1916 O 1 2 + // 10 1 AEDT 1917 F + // 10 AU AE%sT 1919 Ap 1 0s + // ... + // + // R AU 1917 o - Ja 1 2s 1 D + // R AU 1917 o - Mar lastSu 2s 0 S + // R AU 1942 o - Ja 1 2s 1 D + // ... + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("Antarctica/Macquarie"); + + // Another rule where the S propagates? + assert_equal( + std::chrono::sys_info( + to_sys_seconds(1916y, std::chrono::September, 30d, 16h), + to_sys_seconds(1917y, std::chrono::March, 24d, 16h), + 11h, + 60min, + "AEDT"), + tz->get_info(to_sys_seconds(1916y, std::chrono::September, 30d, 16h))); +} + +static void test_get_at_rule_universal() { + // Z America/Nuuk -3:26:56 - LMT 1916 Jul 28 + // -3 - -03 1980 Ap 6 2 + // -3 E -03/-02 2023 O 29 1u + // -2 E -02/-01 + // + // R E 1977 1980 - Ap Su>=1 1u 1 S + // R E 1977 o - S lastSu 1u 0 - + // R E 1978 o - O 1 1u 0 - + // R E 1979 1995 - S lastSu 1u 0 - + // R E 1981 ma - Mar lastSu 1u 1 S + // R E 1996 ma - O lastSu 1u 0 - + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Nuuk"); + + assert_equal( + std::chrono::sys_info( + to_sys_seconds(1980y, std::chrono::April, 6d, 5h), + to_sys_seconds(1980y, std::chrono::September, 28d, 1h), + -2h, + 60min, + "-02"), + tz->get_info(to_sys_seconds(1980y, std::chrono::April, 6d, 5h))); +} + +static void test_format_with_alternatives_west() { + // Z America/Nuuk -3:26:56 - LMT 1916 Jul 28 + // -3 - -03 1980 Ap 6 2 + // -3 E -03/-02 2023 O 29 1u + // -2 E -02/-01 + // + // ... + // R E 1981 ma - Mar lastSu 1u 1 S + // R E 1996 ma - O lastSu 1u 0 - + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Nuuk"); + + assert_cycle( // -3 E -03/-02 + "[2019-10-27 01:00:00, 2020-03-29 01:00:00) -03:00:00 0min -03", + tz->get_info(to_sys_seconds(2019y, std::chrono::October, 27d, 1h)), // 1981 ma Mar lastSu 1u 1 S + tz->get_info(to_sys_seconds(2020y, std::chrono::March, 29d, 0h, 59min, 59s)), // 1996 ma O lastSu 1u 0 - + "[2020-03-29 01:00:00, 2020-10-25 01:00:00) -02:00:00 60min -02", + tz->get_info(to_sys_seconds(2020y, std::chrono::March, 29d, 1h)), // 1996 ma O lastSu 1u 0 - + tz->get_info(to_sys_seconds(2020y, std::chrono::October, 25d, 0h, 59min, 59s))); // 1981 ma Mar lastSu 1u 1 S +} + +static void test_format_with_alternatives_east() { + // Z Asia/Barnaul 5:35 - LMT 1919 D 10 + // ... + // 6 R +06/+07 2011 Mar 27 2s + // ... + // + // ... + // R R 1985 2010 - Mar lastSu 2s 1 S + // R R 1996 2010 - O lastSu 2s 0 - + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("Asia/Barnaul"); + + assert_cycle( // 6 R +06/+07 2011 Mar 27 2s + "[2000-03-25 20:00:00, 2000-10-28 20:00:00) 07:00:00 60min +07", + tz->get_info(to_sys_seconds(2000y, std::chrono::March, 25d, 20h)), // 1985 2010 Mar lastSu 2s 1 S + tz->get_info(to_sys_seconds(2000y, std::chrono::October, 28d, 19h, 59min, 59s)), // 1996 2010 O lastSu 2s 0 - + "[2000-10-28 20:00:00, 2001-03-24 20:00:00) 06:00:00 0min +06", + tz->get_info(to_sys_seconds(2000y, std::chrono::October, 28d, 20h)), // 1996 2010 O lastSu 2s 0 - + tz->get_info(to_sys_seconds(2001y, std::chrono::March, 24d, 19h, 59min, 59s))); // 1985 2010 Mar lastSu 2s 1 S +} + +static void test_africa_algiers() { + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Algiers"); + + assert_equal( + std::chrono::sys_info( + to_sys_seconds(1977y, std::chrono::October, 20d, 23h), + to_sys_seconds(1978y, std::chrono::March, 24d), + 1h, + std::chrono::minutes(0), + "CET"), + tz->get_info(to_sys_seconds(1977y, std::chrono::October, 20d, 23h))); + + assert_range("[1977-05-06 00:00:00, 1977-10-20 23:00:00) 01:00:00 60min WEST", // 0 d WE%sT 1977 O 21 + tz->get_info(to_sys_seconds(1977y, std::chrono::May, 6d)), + tz->get_info(to_sys_seconds(1977y, std::chrono::October, 20d, 22h, 59min, 59s))); + + assert_range("[1977-10-20 23:00:00, 1978-03-24 00:00:00) 01:00:00 0min CET", // 1 d CE%sT 1979 O 26 + tz->get_info(to_sys_seconds(1977y, std::chrono::October, 20d, 23h)), + tz->get_info(to_sys_seconds(1978y, std::chrono::March, 23d, 23h, 59min, 59s))); +} + +static void test_africa_casablanca() { + // Z Africa/Casablanca -0:30:20 - LMT 1913 O 26 + // 0 M +00/+01 1984 Mar 16 + // 1 - +01 1986 + // 0 M +00/+01 2018 O 28 3 + // 1 M +01/+00 + // + // ... + // R M 2013 2018 - O lastSu 3 0 - + // R M 2014 2018 - Mar lastSu 2 1 - + // R M 2014 o - Jun 28 3 0 - + // R M 2014 o - Au 2 2 1 - + // R M 2015 o - Jun 14 3 0 - + // R M 2015 o - Jul 19 2 1 - + // R M 2016 o - Jun 5 3 0 - + // R M 2016 o - Jul 10 2 1 - + // R M 2017 o - May 21 3 0 - + // R M 2017 o - Jul 2 2 1 - + // R M 2018 o - May 13 3 0 - + // R M 2018 o - Jun 17 2 1 - + // R M 2019 o - May 5 3 -1 - + // R M 2019 o - Jun 9 2 0 - + // R M 2020 o - Ap 19 3 -1 - + // ... + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Casablanca"); + + assert_range("[2018-06-17 02:00:00, 2018-10-28 02:00:00) 01:00:00 60min +01", + tz->get_info(to_sys_seconds(2018y, std::chrono::June, 17d, 2h)), + tz->get_info(to_sys_seconds(2018y, std::chrono::October, 28d, 1h, 59min, 59s))); + + assert_range("[2018-10-28 02:00:00, 2019-05-05 02:00:00) 01:00:00 0min +01", + tz->get_info( // 1 M +01/+00 & R M 2018 o - Jun 17 2 1 - + to_sys_seconds(2018y, std::chrono::October, 28d, 2h)), + tz->get_info( // 1 M +01/+00 & R M 2019 o - May 5 3 -1 - + to_sys_seconds(2019y, std::chrono::May, 5d, 1h, 59min, 59s))); + + // 1 M +01/+00 + // Note the SAVE contains a negative value + assert_range("[2019-05-05 02:00:00, 2019-06-09 02:00:00) 00:00:00 -60min +00", + tz->get_info(to_sys_seconds(2019y, std::chrono::May, 5d, 2h)), // R M 2019 o - May 5 3 -1 - + tz->get_info(to_sys_seconds(2019y, std::chrono::June, 9d, 1h, 59min, 59s))); // R M 2019 o - Jun 9 2 0 - + + assert_range("[2019-06-09 02:00:00, 2020-04-19 02:00:00) 01:00:00 0min +01", + tz->get_info( // 1 M +01/+00 & R M 2019 o - Jun 9 2 0 - + to_sys_seconds(2019y, std::chrono::June, 9d, 2h)), + tz->get_info( // 1 M +01/+00 & R M 2020 o - Ap 19 3 -1 - + to_sys_seconds(2020y, std::chrono::April, 19d, 1h, 59min, 59s))); // +} + +static void test_africa_ceuta() { + // Z Africa/Ceuta -0:21:16 - LMT 1900 D 31 23:38:44 + // 0 - WET 1918 May 6 23 + // 0 1 WEST 1918 O 7 23 + // 0 - WET 1924 + // 0 s WE%sT 1929 + // 0 - WET 1967 + // 0 Sp WE%sT 1984 Mar 16 + // 1 - CET 1986 + // 1 E CE%sT + // + // ... + // R s 1926 o - Ap 17 23 1 S + // R s 1926 1929 - O Sa>=1 24s 0 - + // R s 1927 o - Ap 9 23 1 S + // R s 1928 o - Ap 15 0 1 S + // R s 1929 o - Ap 20 23 1 S + // R s 1937 o - Jun 16 23 1 S + // ... + // + // R Sp 1967 o - Jun 3 12 1 S + // R Sp 1967 o - O 1 0 0 - + // R Sp 1974 o - Jun 24 0 1 S + // R Sp 1974 o - S 1 0 0 - + // R Sp 1976 1977 - May 1 0 1 S + // R Sp 1976 o - Au 1 0 0 - + // R Sp 1977 o - S 28 0 0 - + // R Sp 1978 o - Jun 1 0 1 S + // R Sp 1978 o - Au 4 0 0 - + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Ceuta"); + + assert_range( + + "[1928-10-07 00:00:00, 1967-06-03 12:00:00) 00:00:00 0min WET", + tz->get_info(to_sys_seconds(1928y, std::chrono::October, 7d)), // 0 s WE%sT 1929 & 1926 1929 O Sa>=1 24s 0 - + tz->get_info( // No transitions in "0 - WET 1967" + to_sys_seconds(1967y, std::chrono::June, 3d, 11h, 59min, 59s))); // 0 - WET 1967 & 1967 o Jun 3 12 1 S +} + +static void test_africa_freetown() { + // Z Africa/Freetown -0:53 - LMT 1882 + // -0:53 - FMT 1913 Jul + // -1 SL %s 1939 S 5 + // -1 - -01 1941 D 6 24 + // 0 - GMT + // + // R SL 1932 o - D 1 0 0:20 -0040 + // R SL 1933 1938 - Mar 31 24 0 -01 + // R SL 1933 1939 - Au 31 24 0:20 -0040 + // R SL 1939 o - May 31 24 0 -01 + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Freetown"); + + // When a continuation has a named rule, the tranisition time determined by + // the active rule can be wrong. The next continuation may set the clock to an + // earlier time. This is tested for San Luis. This tests the rule is not used + // when the rule is not a named rule. + // + // Fixes: + // Expected output [1882-01-01 00:53:00, 1913-07-01 00:53:00) -00:53:00 0min FMT + // Actual output [1882-01-01 00:53:00, 1913-07-01 00:46:00) -00:53:00 0min FMT + + assert_range("[1882-01-01 00:53:00, 1913-07-01 00:53:00) -00:53:00 0min FMT", + tz->get_info(to_sys_seconds(1882y, std::chrono::January, 1d, 0h, 53min)), // -0:53 - FMT 1913 Jul + tz->get_info( // -1 SL %s 1939 S 5 & before first rule + to_sys_seconds(1913y, std::chrono::July, 1d, 0h, 52min, 59s))); + + // Tests whether the "-1 SL %s 1939 S 5" until gets the proper local time + // adjustment. + assert_range("[1939-09-01 01:00:00, 1939-09-05 00:40:00) -00:40:00 20min -0040", + tz->get_info( // -1 SL %s 1939 S 5 & R SL 1933 1939 - Au 31 24 0:20 -0040 + to_sys_seconds(1939y, std::chrono::September, 1d, 1h)), + tz->get_info( // -1 - -01 1941 D 6 24 + to_sys_seconds(1939y, std::chrono::September, 5d, 0h, 39min, 59s))); +} + +static void test_africa_windhoek() { + // Tests the LETTER/S used before the first rule per + // https://data.iana.org/time-zones/tz-how-to.html + // If switching to a named rule before any transition has happened, + // assume standard time (SAVE zero), and use the LETTER data from + // the earliest transition with a SAVE of zero. + + // Z Africa/Windhoek 1:8:24 - LMT 1892 F 8 + // 1:30 - +0130 1903 Mar + // 2 - SAST 1942 S 20 2 + // 2 1 SAST 1943 Mar 21 2 + // 2 - SAST 1990 Mar 21 + // 2 NA %s + // + // R NA 1994 o - Mar 21 0 -1 WAT + // R NA 1994 2017 - S Su>=1 2 0 CAT + // R NA 1995 2017 - Ap Su>=1 2 -1 WAT + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Windhoek"); + + assert_range( // 2 - EET 2012 N 10 2 + "[1990-03-20 22:00:00, 1994-03-20 22:00:00) 02:00:00 0min CAT", + tz->get_info(to_sys_seconds(1990y, std::chrono::March, 20d, 22h)), + tz->get_info(to_sys_seconds(1994y, std::chrono::March, 20d, 21h, 59min, 59s))); +} + +static void test_america_adak() { + // Z America/Adak 12:13:22 - LMT 1867 O 19 12:44:35 + // ... + // -11 u B%sT 1983 O 30 2 + // -10 u AH%sT 1983 N 30 + // -10 u H%sT + // + // ... + // R u 1945 o - S 30 2 0 S + // R u 1967 2006 - O lastSu 2 0 S + // R u 1967 1973 - Ap lastSu 2 1 D + // R u 1974 o - Ja 6 2 1 D + // R u 1975 o - F lastSu 2 1 D + // R u 1976 1986 - Ap lastSu 2 1 D + // R u 1987 2006 - Ap Su>=1 2 1 D + // ... + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Adak"); + + assert_range( // 2 - EET 2012 N 10 2 + "[1983-10-30 12:00:00, 1983-11-30 10:00:00) -10:00:00 0min AHST", + tz->get_info(to_sys_seconds(1983y, std::chrono::October, 30d, 12h)), // -11 u B%sT 1983 O 30 2 + tz->get_info(to_sys_seconds(1983y, std::chrono::November, 30d, 9h, 59min, 59s))); // -10 u AH%sT 1983 N 30 +} + +static void test_america_auncion() { + // R y 2013 ma - Mar Su>=22 0 0 - + // Z America/Asuncion -3:50:40 - LMT 1890 + // -3:50:40 - AMT 1931 O 10 + // -4 - -04 1972 O + // -3 - -03 1974 Ap + // -4 y -04/-03 + // + // R y 1975 1988 - O 1 0 1 - + // R y 1975 1978 - Mar 1 0 0 - + // R y 1979 1991 - Ap 1 0 0 - + // ... + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Asuncion"); + + assert_range("[1974-04-01 03:00:00, 1975-10-01 04:00:00) -04:00:00 0min -04", + tz->get_info(to_sys_seconds(1974y, std::chrono::April, 1d, 3h)), + tz->get_info(to_sys_seconds(1975y, std::chrono::October, 1d, 3h, 59min, 59s))); + + assert_range("[1975-10-01 04:00:00, 1976-03-01 03:00:00) -03:00:00 60min -03", + tz->get_info(to_sys_seconds(1975y, std::chrono::October, 1d, 4h)), + tz->get_info(to_sys_seconds(1976y, std::chrono::March, 1d, 2h, 59min, 59s))); +} + +static void test_america_ciudad_juarez() { + // Z America/Ciudad_Juarez -7:5:56 - LMT 1922 Ja 1 7u + // -7 - MST 1927 Jun 10 23 + // -6 - CST 1930 N 15 + // -7 m MST 1932 Ap + // -6 - CST 1996 + // -6 m C%sT 1998 + // ... + // + // R m 1939 o - F 5 0 1 D + // R m 1939 o - Jun 25 0 0 S + // R m 1940 o - D 9 0 1 D + // R m 1941 o - Ap 1 0 0 S + // R m 1943 o - D 16 0 1 W + // R m 1944 o - May 1 0 0 S + // R m 1950 o - F 12 0 1 D + // R m 1950 o - Jul 30 0 0 S + // R m 1996 2000 - Ap Su>=1 2 1 D + // R m 1996 2000 - O lastSu 2 0 S + // ... + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Ciudad_Juarez"); + + // 1996 has a similar issue, instead of __time the __until end before + // the first rule in 1939. Between the two usages of RULE Mexico + // a different continuation RULE is active + assert_range("[1996-04-07 08:00:00, 1996-10-27 07:00:00) -05:00:00 60min CDT", + tz->get_info(to_sys_seconds(1996y, std::chrono::April, 7d, 8h)), + tz->get_info(to_sys_seconds(1996y, std::chrono::October, 27d, 6h, 59min, 59s))); +} + +static void test_america_argentina_buenos_aires() { + // Z America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 O 31 + // -4:16:48 - CMT 1920 May + // -4 - -04 1930 D + // -4 A -04/-03 1969 O 5 + // -3 A -03/-02 1999 O 3 + // -4 A -04/-03 2000 Mar 3 + // -3 A -03/-02 + // + // ... + // R A 1989 1992 - O Su>=15 0 1 - + // R A 1999 o - O Su>=1 0 1 - + // R A 2000 o - Mar 3 0 0 - + // R A 2007 o - D 30 0 1 - + // ... + + // The 1999 switch uses the same rule, but with a different stdoff. + // R A 1999 o - O Su>=1 0 1 - + // stdoff -3 -> 1999-10-03 03:00:00 + // stdoff -4 -> 1999-10-03 04:00:00 + // This generates an invalid entry and this is evaluated as a transition. + // Looking at the zdump like output in libc++ this generates jumps in + // the UTC time + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Argentina/Buenos_Aires"); + + assert_range("[1999-10-03 03:00:00, 2000-03-03 03:00:00) -03:00:00 60min -03", + tz->get_info(to_sys_seconds(1999y, std::chrono::October, 3d, 3h)), + tz->get_info(to_sys_seconds(2000y, std::chrono::March, 3d, 2h, 59min, 59s))); + assert_range("[2000-03-03 03:00:00, 2007-12-30 03:00:00) -03:00:00 0min -03", + tz->get_info(to_sys_seconds(2000y, std::chrono::March, 3d, 3h)), + tz->get_info(to_sys_seconds(2007y, std::chrono::December, 30d, 2h, 59min, 59s))); +} + +static void test_america_argentina_la_rioja() { + // Z America/Argentina/La_Rioja -4:27:24 - LMT 1894 O 31 + // ... + // -4 A -04/-03 1969 O 5 + // -3 A -03/-02 1991 Mar + // -4 - -04 1991 May 7 + // -3 A -03/-02 1999 O 3 + // ... + // + // ... + // R A 1988 o - D 1 0 1 - + // R A 1989 1993 - Mar Su>=1 0 0 - + // R A 1989 1992 - O Su>=15 0 1 - + // R A 1999 o - O Su>=1 0 1 - + // ... + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Argentina/La_Rioja"); + + assert_range("[1990-10-21 03:00:00, 1991-03-01 02:00:00) -02:00:00 60min -02", + tz->get_info(to_sys_seconds(1990y, std::chrono::October, 21d, 3h)), + tz->get_info(to_sys_seconds(1991y, std::chrono::March, 1d, 1h, 59min, 59s))); +} + +static void test_america_argentina_san_luis() { + // Z America/Argentina/San_Luis -4:25:24 - LMT 1894 O 31 + // ... + // -4 A -04/-03 1969 O 5 + // -3 A -03/-02 1990 + // -3 1 -02 1990 Mar 14 + // -4 - -04 1990 O 15 + // -4 1 -03 1991 Mar + // -4 - -04 1991 Jun + // -3 - -03 1999 O 3 + // -4 1 -03 2000 Mar 3 + // -4 - -04 2004 Jul 25 + // -3 A -03/-02 2008 Ja 21 + // -4 Sa -04/-03 2009 O 11 + // -3 - -03 + // + // ... + // R A 1988 o - D 1 0 1 - + // R A 1989 1993 - Mar Su>=1 0 0 - + // R A 1989 1992 - O Su>=15 0 1 - + // R A 1999 o - O Su>=1 0 1 - + // R A 2000 o - Mar 3 0 0 - + // R A 2007 o - D 30 0 1 - + // R A 2008 2009 - Mar Su>=15 0 0 - + // R A 2008 o - O Su>=15 0 1 - + // + // R Sa 2008 2009 - Mar Su>=8 0 0 - + // R Sa 2007 2008 - O Su>=8 0 1 - + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Argentina/San_Luis"); + + assert_range("[1989-10-15 03:00:00, 1990-03-14 02:00:00) -02:00:00 60min -02", + tz->get_info( // -3 A -03/-02 1990 & R A 1989 1992 - O Su>=15 0 1 - + to_sys_seconds(1989y, std::chrono::October, 15d, 3h)), + tz->get_info( // UNTIL -3 1 -02 1990 Mar 14 + to_sys_seconds(1990y, std::chrono::March, 14d, 1h, 59min, 59s))); + + assert_range("[2008-01-21 02:00:00, 2008-03-09 03:00:00) -03:00:00 60min -03", + tz->get_info(to_sys_seconds(2008y, std::chrono::January, 21d, 2h)), + tz->get_info(to_sys_seconds(2008y, std::chrono::March, 9d, 2h, 59min, 59s))); +} + +static void test_america_indiana_knox() { + // Z America/Indiana/Knox -5:46:30 - LMT 1883 N 18 12:13:30 + // -6 u C%sT 1947 + // -6 St C%sT 1962 Ap 29 2 + // -5 - EST 1963 O 27 2 + // -6 u C%sT 1991 O 27 2 + // -5 - EST 2006 Ap 2 2 + // -6 u C%sT + // + // ... + // R u 1976 1986 - Ap lastSu 2 1 D + // R u 1987 2006 - Ap Su>=1 2 1 D + // R u 2007 ma - Mar Su>=8 2 1 D + // R u 2007 ma - N Su>=1 2 0 S + + using namespace std::literals::chrono_literals; + const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Indiana/Knox"); + + // The continuations + // -5 - EST + // -6 u C%sT + // have different offsets. The start time of the first active rule in + // RULE u should use the offset at the end of -5 - EST. + assert_range("[2006-04-02 07:00:00, 2006-10-29 07:00:00) -05:00:00 60min CDT", + tz->get_info(to_sys_seconds(2006y, std::chrono::April, 2d, 7h)), + tz->get_info(to_sys_seconds(2006y, std::chrono::October, 29d, 6h, 59min, 59s))); +} + +int main(int, const char**) { + // Basic tests + test_gmt(); + test_durations(); + test_indian_kerguelen(); + test_antarctica_syowa(); + test_asia_hong_kong(); + test_europe_berlin(); + + test_america_st_johns(); + + // Small tests for not-yet tested conditions + test_get_at_standard_time_universal(); + test_get_at_standard_time_standard(); + test_get_at_save_universal(); + test_get_at_rule_standard(); + test_get_at_rule_universal(); + + test_format_with_alternatives_west(); + test_format_with_alternatives_east(); + + // Tests based on bugs found + test_africa_algiers(); + test_africa_casablanca(); + test_africa_ceuta(); + test_africa_freetown(); + test_africa_windhoek(); + test_america_adak(); + test_america_argentina_buenos_aires(); + test_america_argentina_la_rioja(); + test_america_argentina_san_luis(); + test_america_auncion(); + test_america_ciudad_juarez(); + test_america_indiana_knox(); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.timezone/time.zone.members/sys_info.zdump.pass.cpp b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.timezone/time.zone.members/sys_info.zdump.pass.cpp new file mode 100644 index 0000000000..05328e2256 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/time/time.zone/time.zone.timezone/time.zone.members/sys_info.zdump.pass.cpp @@ -0,0 +1,129 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: no-filesystem, no-localization, no-tzdb, has-no-zdump + +// XFAIL: libcpp-has-no-incomplete-tzdb +// XFAIL: availability-tzdb-missing + +// TODO TZDB Investigate +// XFAIL: target={{armv(7|8)l-linux-gnueabihf}} + +#include +#include +#include +#include + +#include "filesystem_test_helper.h" +#include "assert_macros.h" +#include "concat_macros.h" + +// The year range to validate. The dates used in practice are expected to be +// inside the tested range. +constexpr std::chrono::year first{1800}; +constexpr std::chrono::year last{2100}; + +// A custom sys_info class that also stores the name of the time zone. +// Its formatter matches the output of zdump. +struct sys_info : public std::chrono::sys_info { + sys_info(std::string_view name_, std::chrono::sys_info info) : std::chrono::sys_info{info}, name{name_} {} + + std::string name; +}; + +template <> +struct std::formatter { + template + constexpr typename ParseContext::iterator parse(ParseContext& ctx) { + return ctx.begin(); + } + + template + typename FormatContext::iterator format(const sys_info& info, FormatContext& ctx) const { + using namespace std::literals::chrono_literals; + + // Every "sys_info" entry of zdump consists of 2 lines. + // - 1 for first second of the range + // - 1 for last second of the range + // For example: + // Africa/Casablanca Sun Mar 25 02:00:00 2018 UT = Sun Mar 25 03:00:00 2018 +01 isdst=1 gmtoff=3600 + // Africa/Casablanca Sun May 13 01:59:59 2018 UT = Sun May 13 02:59:59 2018 +01 isdst=1 gmtoff=3600 + + if (info.begin != std::chrono::sys_seconds::min()) + ctx.advance_to(std::format_to( + ctx.out(), + "{} {:%a %b %e %H:%M:%S %Y} UT = {:%a %b %e %H:%M:%S %Y} {} isdst={:d} gmtoff={:%Q}\n", + info.name, + info.begin, + info.begin + info.offset, + info.abbrev, + info.save != 0s, + info.offset)); + + if (info.end != std::chrono::sys_seconds::max()) + ctx.advance_to(std::format_to( + ctx.out(), + "{} {:%a %b %e %H:%M:%S %Y} UT = {:%a %b %e %H:%M:%S %Y} {} isdst={:d} gmtoff={:%Q}\n", + info.name, + info.end - 1s, + info.end - 1s + info.offset, + info.abbrev, + info.save != 0s, + info.offset)); + + return ctx.out(); + } +}; + +void process(std::ostream& stream, const std::chrono::time_zone& zone) { + using namespace std::literals::chrono_literals; + + constexpr auto begin = std::chrono::time_point_cast( + static_cast(std::chrono::year_month_day{first, std::chrono::January, 1d})); + constexpr auto end = std::chrono::time_point_cast( + static_cast(std::chrono::year_month_day{last, std::chrono::January, 1d})); + + std::chrono::sys_seconds s = begin; + do { + sys_info info{zone.name(), zone.get_info(s)}; + + if (info.end >= end) + info.end = std::chrono::sys_seconds::max(); + + stream << std::format("{}", info); + s = info.end; + } while (s != std::chrono::sys_seconds::max()); +} + +// This test compares the output of the zdump against the output based on the +// standard library implementation. It tests all available time zones and +// validates them. The specification of how to use the IANA database is limited +// and the real database contains quite a number of "interesting" cases. +int main(int, const char**) { + scoped_test_env env; + const std::string file = env.create_file("zdump.txt"); + + const std::chrono::tzdb& tzdb = std::chrono::get_tzdb(); + for (const auto& zone : tzdb.zones) { + std::stringstream libcxx; + process(libcxx, zone); + + int result = std::system(std::format("zdump -V -c{},{} {} > {}", first, last, zone.name(), file).c_str()); + assert(result == 0); + + std::stringstream zdump; + zdump << std::ifstream(file).rdbuf(); + + TEST_REQUIRE( + libcxx.str() == zdump.str(), + TEST_WRITE_CONCATENATED("\nTZ=", zone.name(), "\nlibc++\n", libcxx.str(), "|\n\nzdump\n", zdump.str(), "|")); + } + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/what.noexcept.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/base.compile.pass.cpp similarity index 56% rename from yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/what.noexcept.compile.pass.cpp rename to yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/base.compile.pass.cpp index e6d050b212..545215a3b1 100644 --- a/yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/what.noexcept.compile.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/base.compile.pass.cpp @@ -7,19 +7,12 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 -// const char* what() const noexcept override; +// Make sure std::bad_expected_access inherits from std::bad_expected_access. #include -#include +#include -template -concept WhatNoexcept = - requires(const T& t) { - { t.what() } noexcept; - }; +struct Foo {}; -struct foo{}; - -static_assert(!WhatNoexcept); -static_assert(WhatNoexcept>); -static_assert(WhatNoexcept>); +static_assert(std::is_base_of_v, std::bad_expected_access>); +static_assert(std::is_base_of_v, std::bad_expected_access>); diff --git a/yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/void-specialization.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/void-specialization.pass.cpp new file mode 100644 index 0000000000..092e115310 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/void-specialization.pass.cpp @@ -0,0 +1,83 @@ +//===----------------------------------------------------------------------===// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 + +// template<> +// class bad_expected_access : public exception { +// protected: +// bad_expected_access() noexcept; +// bad_expected_access(const bad_expected_access&) noexcept; +// bad_expected_access(bad_expected_access&&) noexcept; +// bad_expected_access& operator=(const bad_expected_access&) noexcept; +// bad_expected_access& operator=(bad_expected_access&&) noexcept; +// ~bad_expected_access(); +// +// public: +// const char* what() const noexcept override; +// }; + +#include +#include +#include +#include +#include + +#include "test_macros.h" + +struct Inherit : std::bad_expected_access {}; + +int main(int, char**) { + // base class + static_assert(std::is_base_of_v>); + + // default constructor + { + Inherit exc; + ASSERT_NOEXCEPT(Inherit()); + } + + // copy constructor + { + Inherit exc; + Inherit copy(exc); + ASSERT_NOEXCEPT(Inherit(exc)); + } + + // move constructor + { + Inherit exc; + Inherit copy(std::move(exc)); + ASSERT_NOEXCEPT(Inherit(std::move(exc))); + } + + // copy assignment + { + Inherit exc; + Inherit copy; + [[maybe_unused]] Inherit& result = (copy = exc); + ASSERT_NOEXCEPT(copy = exc); + } + + // move assignment + { + Inherit exc; + Inherit copy; + [[maybe_unused]] Inherit& result = (copy = std::move(exc)); + ASSERT_NOEXCEPT(copy = std::move(exc)); + } + + // what() + { + Inherit exc; + char const* what = exc.what(); + assert(what != nullptr); + ASSERT_NOEXCEPT(exc.what()); + } + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/what.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/what.pass.cpp new file mode 100644 index 0000000000..bc5e356161 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/utilities/expected/expected.bad/what.pass.cpp @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 + +// const char* what() const noexcept override; + +#include +#include +#include + +#include "test_macros.h" + +struct Foo {}; + +int main(int, char**) { + { + std::bad_expected_access const exc(99); + char const* what = exc.what(); + assert(what != nullptr); + ASSERT_NOEXCEPT(exc.what()); + } + { + std::bad_expected_access const exc(Foo{}); + char const* what = exc.what(); + assert(what != nullptr); + ASSERT_NOEXCEPT(exc.what()); + } + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit.pass.cpp index 994ccc70a3..284b03c32c 100644 --- a/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit.pass.cpp @@ -8,7 +8,7 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME // The tested functionality needs deducing this. -// UNSUPPORTED: clang-16 || clang-17 +// UNSUPPORTED: clang-17 // XFAIL: apple-clang // diff --git a/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit.return_type.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit.return_type.pass.cpp index b2c40d1604..4c60cb0e9a 100644 --- a/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit.return_type.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit.return_type.pass.cpp @@ -8,7 +8,7 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME // The tested functionality needs deducing this. -// UNSUPPORTED: clang-16 || clang-17 +// UNSUPPORTED: clang-17 // XFAIL: apple-clang // diff --git a/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit_format_arg.deprecated.verify.cpp b/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit_format_arg.deprecated.verify.cpp index acd9228369..6a3896c896 100644 --- a/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit_format_arg.deprecated.verify.cpp +++ b/yass/third_party/libc++/trunk/test/std/utilities/format/format.arguments/format.arg/visit_format_arg.deprecated.verify.cpp @@ -7,7 +7,7 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME -// UNSUPPORTED: clang-16 || clang-17 +// UNSUPPORTED: clang-17 // XFAIL: apple-clang // diff --git a/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind.partial/bind_back.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind.partial/bind_back.pass.cpp new file mode 100644 index 0000000000..01a96348d5 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind.partial/bind_back.pass.cpp @@ -0,0 +1,381 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 + +// + +// template +// constexpr unspecified bind_back(F&& f, Args&&... args); + +#include + +#include +#include +#include +#include + +#include "callable_types.h" +#include "types.h" + +constexpr void test_basic_bindings() { + { // Bind arguments, call without arguments + { + auto f = std::bind_back(MakeTuple{}); + assert(f() == std::make_tuple()); + } + { + auto f = std::bind_back(MakeTuple{}, Elem<1>{}); + assert(f() == std::make_tuple(Elem<1>{})); + } + { + auto f = std::bind_back(MakeTuple{}, Elem<1>{}, Elem<2>{}); + assert(f() == std::make_tuple(Elem<1>{}, Elem<2>{})); + } + { + auto f = std::bind_back(MakeTuple{}, Elem<1>{}, Elem<2>{}, Elem<3>{}); + assert(f() == std::make_tuple(Elem<1>{}, Elem<2>{}, Elem<3>{})); + } + } + + { // Bind no arguments, call with arguments + { + auto f = std::bind_back(MakeTuple{}); + assert(f(Elem<1>{}) == std::make_tuple(Elem<1>{})); + } + { + auto f = std::bind_back(MakeTuple{}); + assert(f(Elem<1>{}, Elem<2>{}) == std::make_tuple(Elem<1>{}, Elem<2>{})); + } + { + auto f = std::bind_back(MakeTuple{}); + assert(f(Elem<1>{}, Elem<2>{}, Elem<3>{}) == std::make_tuple(Elem<1>{}, Elem<2>{}, Elem<3>{})); + } + } + + { // Bind arguments, call with arguments + { + auto f = std::bind_back(MakeTuple{}, Elem<1>{}); + assert(f(Elem<10>{}) == std::make_tuple(Elem<10>{}, Elem<1>{})); + } + { + auto f = std::bind_back(MakeTuple{}, Elem<1>{}, Elem<2>{}); + assert(f(Elem<10>{}) == std::make_tuple(Elem<10>{}, Elem<1>{}, Elem<2>{})); + } + { + auto f = std::bind_back(MakeTuple{}, Elem<1>{}, Elem<2>{}, Elem<3>{}); + assert(f(Elem<10>{}) == std::make_tuple(Elem<10>{}, Elem<1>{}, Elem<2>{}, Elem<3>{})); + } + + { + auto f = std::bind_back(MakeTuple{}, Elem<1>{}); + assert(f(Elem<10>{}, Elem<11>{}) == std::make_tuple(Elem<10>{}, Elem<11>{}, Elem<1>{})); + } + { + auto f = std::bind_back(MakeTuple{}, Elem<1>{}, Elem<2>{}); + assert(f(Elem<10>{}, Elem<11>{}) == std::make_tuple(Elem<10>{}, Elem<11>{}, Elem<1>{}, Elem<2>{})); + } + { + auto f = std::bind_back(MakeTuple{}, Elem<1>{}, Elem<2>{}, Elem<3>{}); + assert(f(Elem<10>{}, Elem<11>{}) == std::make_tuple(Elem<10>{}, Elem<11>{}, Elem<1>{}, Elem<2>{}, Elem<3>{})); + } + { + auto f = std::bind_back(MakeTuple{}, Elem<1>{}, Elem<2>{}, Elem<3>{}); + assert(f(Elem<10>{}, Elem<11>{}, Elem<12>{}) == + std::make_tuple(Elem<10>{}, Elem<11>{}, Elem<12>{}, Elem<1>{}, Elem<2>{}, Elem<3>{})); + } + } + + { // Basic tests with fundamental types + int n = 2; + int m = 1; + int sum = 0; + auto add = [](int x, int y) { return x + y; }; + auto add_n = [](int a, int b, int c, int d, int e, int f) { return a + b + c + d + e + f; }; + auto add_ref = [&](int x, int y) -> int& { return sum = x + y; }; + auto add_rref = [&](int x, int y) -> int&& { return std::move(sum = x + y); }; + + auto a = std::bind_back(add, m, n); + assert(a() == 3); + + auto b = std::bind_back(add_n, m, n, m, m, m, m); + assert(b() == 7); + + auto c = std::bind_back(add_n, n, m); + assert(c(1, 1, 1, 1) == 7); + + auto d = std::bind_back(add_ref, n, m); + std::same_as decltype(auto) dresult(d()); + assert(dresult == 3); + + auto e = std::bind_back(add_rref, n, m); + std::same_as decltype(auto) eresult(e()); + assert(eresult == 3); + + auto f = std::bind_back(add, n); + assert(f(3) == 5); + + auto g = std::bind_back(add, n, 1); + assert(g() == 3); + + auto h = std::bind_back(add_n, 1, 1, 1); + assert(h(2, 2, 2) == 9); + + auto i = std::bind_back(add_ref, n); + std::same_as decltype(auto) iresult(i(5)); + assert(iresult == 7); + + auto j = std::bind_back(add_rref, m); + std::same_as decltype(auto) jresult(j(4)); + assert(jresult == 5); + } +} + +constexpr void test_edge_cases() { + { // Make sure we don't treat std::reference_wrapper specially. + auto sub = [](std::reference_wrapper a, std::reference_wrapper b) { return a.get() - b.get(); }; + + int i = 1; + int j = 2; + auto f = std::bind_back(sub, std::ref(i)); + assert(f(std::ref(j)) == 1); + } + + { // Make sure we can call a function that's a pointer to a member function. + struct MemberFunction { + constexpr int foo(int x, int y) { return x * y; } + }; + + MemberFunction value; + auto fn = std::bind_back(&MemberFunction::foo, 2, 3); + assert(fn(value) == 6); + } + + { // Make sure we can call a function that's a pointer to a member object. + struct MemberObject { + int obj; + }; + + MemberObject value{.obj = 3}; + auto fn = std::bind_back(&MemberObject::obj); + assert(fn(value) == 3); + } +} + +constexpr void test_passing_arguments() { + { // Make sure that we copy the bound arguments into the unspecified-type. + auto add = [](int x, int y) { return x + y; }; + int n = 2; + auto f = std::bind_back(add, n, 1); + n = 100; + assert(f() == 3); + } + + { // Make sure we pass the bound arguments to the function object + // with the right value category. + { + auto was_copied = [](CopyMoveInfo info) { return info.copy_kind == CopyMoveInfo::copy; }; + CopyMoveInfo info; + auto f = std::bind_back(was_copied, info); + assert(f()); + } + + { + auto was_moved = [](CopyMoveInfo info) { return info.copy_kind == CopyMoveInfo::move; }; + CopyMoveInfo info; + auto f = std::bind_back(was_moved, info); + assert(std::move(f)()); + } + } +} + +constexpr void test_function_objects() { + { // Make sure we call the correctly cv-ref qualified operator() + // based on the value category of the bind_back unspecified-type. + struct X { + constexpr int operator()() & { return 1; } + constexpr int operator()() const& { return 2; } + constexpr int operator()() && { return 3; } + constexpr int operator()() const&& { return 4; } + }; + + auto f = std::bind_back(X{}); + using F = decltype(f); + assert(static_cast(f)() == 1); + assert(static_cast(f)() == 2); + assert(static_cast(f)() == 3); + assert(static_cast(f)() == 4); + } + + // Make sure the `bind_back` unspecified-type does not model invocable + // when the call would select a differently-qualified operator(). + // + // For example, if the call to `operator()() &` is ill-formed, the call to the unspecified-type + // should be ill-formed and not fall back to the `operator()() const&` overload. + { // Make sure we delete the & overload when the underlying call isn't valid. + { + struct X { + void operator()() & = delete; + void operator()() const&; + void operator()() &&; + void operator()() const&&; + }; + + using F = decltype(std::bind_back(X{})); + static_assert(!std::invocable); + static_assert(std::invocable); + static_assert(std::invocable); + static_assert(std::invocable); + } + + // There's no way to make sure we delete the const& overload when the underlying call isn't valid, + // so we can't check this one. + + { // Make sure we delete the && overload when the underlying call isn't valid. + struct X { + void operator()() &; + void operator()() const&; + void operator()() && = delete; + void operator()() const&&; + }; + + using F = decltype(std::bind_back(X{})); + static_assert(std::invocable); + static_assert(std::invocable); + static_assert(!std::invocable); + static_assert(std::invocable); + } + + { // Make sure we delete the const&& overload when the underlying call isn't valid. + struct X { + void operator()() &; + void operator()() const&; + void operator()() &&; + void operator()() const&& = delete; + }; + + using F = decltype(std::bind_back(X{})); + static_assert(std::invocable); + static_assert(std::invocable); + static_assert(std::invocable); + static_assert(!std::invocable); + } + } + + { // Extra value category tests + struct X {}; + + { + struct Y { + void operator()(X&&) const&; + void operator()(X&&) && = delete; + }; + + using F = decltype(std::bind_back(Y{})); + static_assert(std::invocable); + static_assert(!std::invocable); + } + + { + struct Y { + void operator()(const X&) const; + void operator()(X&&) const = delete; + }; + + using F = decltype(std::bind_back(Y{}, X{})); + static_assert(std::invocable); + static_assert(!std::invocable); + } + } +} + +constexpr void test_return_type() { + { // Test properties of the constructor of the unspecified-type returned by bind_back. + { // Test move constructor when function is move only. + MoveOnlyCallable value(true); + auto f = std::bind_back(std::move(value), 1); + assert(f()); + assert(f(1, 2, 3)); + + auto f1 = std::move(f); + assert(!f()); + assert(f1()); + assert(f1(1, 2, 3)); + + using F = decltype(f); + static_assert(std::is_move_constructible::value); + static_assert(!std::is_copy_constructible::value); + static_assert(!std::is_move_assignable::value); + static_assert(!std::is_copy_assignable::value); + } + + { // Test move constructor when function is copyable but not assignable. + CopyCallable value(true); + auto f = std::bind_back(value, 1); + assert(f()); + assert(f(1, 2, 3)); + + auto f1 = std::move(f); + assert(!f()); + assert(f1()); + assert(f1(1, 2, 3)); + + auto f2 = std::bind_back(std::move(value), 1); + assert(f1()); + assert(f2()); + assert(f2(1, 2, 3)); + + using F = decltype(f); + static_assert(std::is_move_constructible::value); + static_assert(std::is_copy_constructible::value); + static_assert(!std::is_move_assignable::value); + static_assert(!std::is_copy_assignable::value); + } + + { // Test constructors when function is copy assignable. + using F = decltype(std::bind_back(std::declval(), 1)); + static_assert(std::is_move_constructible::value); + static_assert(std::is_copy_constructible::value); + static_assert(std::is_move_assignable::value); + static_assert(std::is_copy_assignable::value); + } + + { // Test constructors when function is move assignable only. + using F = decltype(std::bind_back(std::declval(), 1)); + static_assert(std::is_move_constructible::value); + static_assert(!std::is_copy_constructible::value); + static_assert(std::is_move_assignable::value); + static_assert(!std::is_copy_assignable::value); + } + } + + { // Make sure bind_back's unspecified type's operator() is SFINAE-friendly. + using F = decltype(std::bind_back(std::declval(), 1)); + static_assert(!std::is_invocable::value); + static_assert(std::is_invocable::value); + static_assert(!std::is_invocable::value); + static_assert(!std::is_invocable::value); + } +} + +constexpr bool test() { + test_basic_bindings(); + test_edge_cases(); + test_passing_arguments(); + test_function_objects(); + test_return_type(); + + return true; +} + +int main(int, char**) { + test(); + static_assert(test()); + + return 0; +} diff --git a/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind.partial/bind_back.verify.cpp b/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind.partial/bind_back.verify.cpp new file mode 100644 index 0000000000..eb100c15f5 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind.partial/bind_back.verify.cpp @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 + +// + +// template +// constexpr unspecified bind_back(F&& f, Args&&... args); + +#include + +#include "types.h" + +constexpr int pass(int n) { return n; } + +void test() { + { // Test calling constexpr function from non-constexpr `bind_back` result + auto f1 = std::bind_back(pass, 1); + static_assert(f1() == 1); // expected-error {{static assertion expression is not an integral constant expression}} + } + + { // Test calling `bind_back` with template function + auto f1 = std::bind_back(do_nothing, 2); + // expected-error@-1 {{no matching function for call to 'bind_back'}} + } + + { // Mandates: is_constructible_v, F> + struct F { + F() = default; + F(const F&) = default; + F(F&) = delete; + + void operator()() {} + }; + + F f; + auto f1 = std::bind_back(f); + // expected-error-re@*:* {{static assertion failed{{.*}}bind_back requires decay_t to be constructible from F}} + } + + { // Mandates: is_move_constructible_v> + struct F { + F() = default; + F(const F&) = default; + F(F&&) = delete; + + void operator()() {} + }; + + F f; + auto f1 = std::bind_back(f); + // expected-error-re@*:* {{static assertion failed{{.*}}bind_back requires decay_t to be move constructible}} + } + + { // Mandates: (is_constructible_v, Args> && ...) + struct Arg { + Arg() = default; + Arg(const Arg&) = default; + Arg(Arg&) = delete; + }; + + Arg x; + auto f = std::bind_back([](const Arg&) {}, x); + // expected-error-re@*:* {{static assertion failed{{.*}}bind_back requires all decay_t to be constructible from respective Args}} + // expected-error@*:* {{no matching constructor for initialization}} + } + + { // Mandates: (is_move_constructible_v> && ...) + struct Arg { + Arg() = default; + Arg(const Arg&) = default; + Arg(Arg&&) = delete; + }; + + Arg x; + auto f = std::bind_back([](Arg&) {}, x); + // expected-error-re@*:* {{static assertion failed{{.*}}bind_back requires all decay_t to be move constructible}} + } +} diff --git a/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind.partial/types.h b/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind.partial/types.h new file mode 100644 index 0000000000..76ed4d478b --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind.partial/types.h @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef TEST_STD_UTILITIES_FUNCTION_OBJECTS_FUNC_BIND_PARTIAL_TYPES_H +#define TEST_STD_UTILITIES_FUNCTION_OBJECTS_FUNC_BIND_PARTIAL_TYPES_H + +#include +#include + +struct MakeTuple { + template + constexpr auto operator()(Args&&... args) const { + return std::make_tuple(std::forward(args)...); + } +}; + +template +struct Elem { + template + constexpr bool operator==(const Elem&) const { + return X == Y; + } +}; + +struct CopyMoveInfo { + enum { none, copy, move } copy_kind; + + constexpr CopyMoveInfo() : copy_kind(none) {} + constexpr CopyMoveInfo(const CopyMoveInfo&) : copy_kind(copy) {} + constexpr CopyMoveInfo(CopyMoveInfo&&) : copy_kind(move) {} +}; + +template +T do_nothing(T t) { + return t; +} + +#endif // TEST_STD_UTILITIES_FUNCTION_OBJECTS_FUNC_BIND_PARTIAL_TYPES_H diff --git a/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind_front/bind_front.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind_front/bind_front.pass.cpp index 6eb4e4a46e..0dee6a95f6 100644 --- a/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind_front/bind_front.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/utilities/function.objects/func.bind_front/bind_front.pass.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -142,12 +143,13 @@ constexpr bool test() { // Basic tests with fundamental types { - int n = 2; - int m = 1; - auto add = [](int x, int y) { return x + y; }; - auto addN = [](int a, int b, int c, int d, int e, int f) { - return a + b + c + d + e + f; - }; + int n = 2; + int m = 1; + int sum = 0; + auto add = [](int x, int y) { return x + y; }; + auto addN = [](int a, int b, int c, int d, int e, int f) { return a + b + c + d + e + f; }; + auto add_ref = [&](int x, int y) -> int& { return sum = x + y; }; + auto add_rref = [&](int x, int y) -> int&& { return std::move(sum = x + y); }; auto a = std::bind_front(add, m, n); assert(a() == 3); @@ -158,6 +160,14 @@ constexpr bool test() { auto c = std::bind_front(addN, n, m); assert(c(1, 1, 1, 1) == 7); + auto d = std::bind_front(add_ref, n, m); + std::same_as decltype(auto) dresult(d()); + assert(dresult == 3); + + auto e = std::bind_front(add_rref, n, m); + std::same_as decltype(auto) eresult(e()); + assert(eresult == 3); + auto f = std::bind_front(add, n); assert(f(3) == 5); @@ -166,6 +176,14 @@ constexpr bool test() { auto h = std::bind_front(addN, 1, 1, 1); assert(h(2, 2, 2) == 9); + + auto i = std::bind_front(add_ref, n); + std::same_as decltype(auto) iresult(i(5)); + assert(iresult == 7); + + auto j = std::bind_front(add_rref, m); + std::same_as decltype(auto) jresult(j(4)); + assert(jresult == 5); } // Make sure we don't treat std::reference_wrapper specially. diff --git a/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_incomplete.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_incomplete.pass.cpp index cb8d3e7bde..7585911e2e 100644 --- a/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_incomplete.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_incomplete.pass.cpp @@ -16,9 +16,10 @@ // UNSUPPORTED: c++03 -#include #include +#include #include +#include #include "test_macros.h" diff --git a/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_structured_bindings.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_structured_bindings.pass.cpp index 937d47a387..2324da3ad5 100644 --- a/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_structured_bindings.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_structured_bindings.pass.cpp @@ -16,10 +16,10 @@ // UNSUPPORTED: c++03, c++11, c++14 -#include #include -#include #include +#include +#include #include "test_macros.h" diff --git a/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_value_sfinae.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_value_sfinae.pass.cpp index 6ea92ea856..7574bd47e3 100644 --- a/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_value_sfinae.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_value_sfinae.pass.cpp @@ -17,7 +17,7 @@ // UNSUPPORTED: c++03 #include -#include +#include #include "test_macros.h" diff --git a/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/robust_against_adl.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/robust_against_adl.pass.cpp index c54f2b722d..bea6d94992 100644 --- a/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/robust_against_adl.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/robust_against_adl.pass.cpp @@ -8,7 +8,7 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 // The tested functionality needs deducing this. -// UNSUPPORTED: clang-16 || clang-17 +// UNSUPPORTED: clang-17 // XFAIL: apple-clang // diff --git a/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/visit.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/visit.pass.cpp index d0c909985b..857e85d008 100644 --- a/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/visit.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/visit.pass.cpp @@ -8,7 +8,7 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 // The tested functionality needs deducing this. -// UNSUPPORTED: clang-16 || clang-17 +// UNSUPPORTED: clang-17 // XFAIL: apple-clang // diff --git a/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/visit_return_type.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/visit_return_type.pass.cpp index 3312197d8d..2c1cbb06e7 100644 --- a/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/visit_return_type.pass.cpp +++ b/yass/third_party/libc++/trunk/test/std/utilities/variant/variant.visit.member/visit_return_type.pass.cpp @@ -8,7 +8,7 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 // The tested functionality needs deducing this. -// UNSUPPORTED: clang-16 || clang-17 +// UNSUPPORTED: clang-17 // XFAIL: apple-clang // diff --git a/yass/third_party/libc++/trunk/test/support/test_chrono_leap_second.h b/yass/third_party/libc++/trunk/test/support/test_chrono_leap_second.h new file mode 100644 index 0000000000..be5ce760bf --- /dev/null +++ b/yass/third_party/libc++/trunk/test/support/test_chrono_leap_second.h @@ -0,0 +1,47 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef SUPPORT_TEST_CHRONO_LEAP_SECOND_HPP +#define SUPPORT_TEST_CHRONO_LEAP_SECOND_HPP + +// Contains helper functions to create a std::chrono::leap_second. +// +// Since the standard doesn't specify how a @ref std::chrono::leap_second is +// constructed this is implementation defined. To make the public API tests of +// the class generic this header defines helper functions to create the +// required object. +// +// Note This requires every standard library implementation to write their own +// helper function. Vendors are encouraged to create a pull request at +// https://github.com/llvm/llvm-project so their specific implementation can be +// part of this file. + +#include "test_macros.h" + +#if TEST_STD_VER < 20 +# error "The format header requires at least C++20" +#endif + +#include + +#ifdef _LIBCPP_VERSION + +# include <__utility/private_constructor_tag.h> + +inline constexpr std::chrono::leap_second +test_leap_second_create(const std::chrono::sys_seconds& date, const std::chrono::seconds& value) { + return std::chrono::leap_second{std::__private_constructor_tag{}, date, value}; +} + +#else // _LIBCPP_VERSION +# error \ + "Please create a vendor specific version of the test typedef and file a PR at https://github.com/llvm/llvm-project" +#endif // _LIBCPP_VERSION + +#endif // SUPPORT_TEST_CHRONO_LEAP_SECOND_HPP diff --git a/yass/third_party/libc++/trunk/test/support/test_iterators.h b/yass/third_party/libc++/trunk/test/support/test_iterators.h index c92ce37534..7ffb74990f 100644 --- a/yass/third_party/libc++/trunk/test/support/test_iterators.h +++ b/yass/third_party/libc++/trunk/test/support/test_iterators.h @@ -725,11 +725,14 @@ struct common_input_iterator { # endif // TEST_STD_VER >= 20 // Iterator adaptor that counts the number of times the iterator has had a successor/predecessor -// operation called. Has two recorders: +// operation or an equality comparison operation called. Has three recorders: // * `stride_count`, which records the total number of calls to an op++, op--, op+=, or op-=. // * `stride_displacement`, which records the displacement of the calls. This means that both // op++/op+= will increase the displacement counter by 1, and op--/op-= will decrease the // displacement counter by 1. +// * `equals_count`, which records the total number of calls to an op== or op!=. If compared +// against a sentinel object, that sentinel object must call the `record_equality_comparison` +// function so that the comparison is counted correctly. template class stride_counting_iterator { public: @@ -754,6 +757,8 @@ public: constexpr difference_type stride_displacement() const { return stride_displacement_; } + constexpr difference_type equals_count() const { return equals_count_; } + constexpr decltype(auto) operator*() const { return *It(base_); } constexpr decltype(auto) operator[](difference_type n) const { return It(base_)[n]; } @@ -838,10 +843,13 @@ public: return base(x) - base(y); } + constexpr void record_equality_comparison() const { ++equals_count_; } + constexpr bool operator==(stride_counting_iterator const& other) const requires std::sentinel_for { - return It(base_) == It(other.base_); + record_equality_comparison(); + return It(base_) == It(other.base_); } friend constexpr bool operator<(stride_counting_iterator const& x, stride_counting_iterator const& y) @@ -875,6 +883,7 @@ private: decltype(base(std::declval())) base_; difference_type stride_count_ = 0; difference_type stride_displacement_ = 0; + mutable difference_type equals_count_ = 0; }; template stride_counting_iterator(It) -> stride_counting_iterator; @@ -887,7 +896,14 @@ class sentinel_wrapper { public: explicit sentinel_wrapper() = default; constexpr explicit sentinel_wrapper(const It& it) : base_(base(it)) {} - constexpr bool operator==(const It& other) const { return base_ == base(other); } + constexpr bool operator==(const It& other) const { + // If supported, record statistics about the equality operator call + // inside `other`. + if constexpr (requires { other.record_equality_comparison(); }) { + other.record_equality_comparison(); + } + return base_ == base(other); + } friend constexpr It base(const sentinel_wrapper& s) { return It(s.base_); } private: decltype(base(std::declval())) base_; diff --git a/yass/third_party/libc++/trunk/test/support/test_macros.h b/yass/third_party/libc++/trunk/test/support/test_macros.h index 24f69c758f..7b2dcbb52d 100644 --- a/yass/third_party/libc++/trunk/test/support/test_macros.h +++ b/yass/third_party/libc++/trunk/test/support/test_macros.h @@ -385,6 +385,10 @@ inline Tp const& DoNotOptimize(Tp const& value) { # define TEST_HAS_NO_UNICODE #endif +#if defined(_LIBCPP_HAS_OPEN_WITH_WCHAR) +# define TEST_HAS_OPEN_WITH_WCHAR +#endif + #if defined(_LIBCPP_HAS_NO_INT128) || defined(_MSVC_STL_VERSION) # define TEST_HAS_NO_INT128 #endif diff --git a/yass/third_party/libc++/trunk/utils/CMakeLists.txt b/yass/third_party/libc++/trunk/utils/CMakeLists.txt index 19bb9851c8..7a573535e1 100644 --- a/yass/third_party/libc++/trunk/utils/CMakeLists.txt +++ b/yass/third_party/libc++/trunk/utils/CMakeLists.txt @@ -48,6 +48,13 @@ add_custom_target(libcxx-generate-width-estimation-table "${LIBCXX_SOURCE_DIR}/include/__format/width_estimation_table.h" COMMENT "Generate the width estimation header") +add_custom_target(libcxx-indic-conjunct-break-table + COMMAND + "${Python3_EXECUTABLE}" + "${LIBCXX_SOURCE_DIR}/utils/generate_indic_conjunct_break_table.py" + "${LIBCXX_SOURCE_DIR}/include/__format/indic_conjunct_break_table.h" + COMMENT "Generate the Indic Conjunct Break header") + add_custom_target(libcxx-generate-iwyu-mapping COMMAND "${Python3_EXECUTABLE}" @@ -63,5 +70,6 @@ add_custom_target(libcxx-generate-files libcxx-generate-extended-grapheme-cluster-tests libcxx-generate-escaped-output-table libcxx-generate-width-estimation-table + libcxx-indic-conjunct-break-table libcxx-generate-iwyu-mapping COMMENT "Create all the auto-generated files in libc++ and its tests.") diff --git a/yass/third_party/libc++/trunk/utils/ci/Dockerfile b/yass/third_party/libc++/trunk/utils/ci/Dockerfile index db88da20b9..c77f6c435b 100644 --- a/yass/third_party/libc++/trunk/utils/ci/Dockerfile +++ b/yass/third_party/libc++/trunk/utils/ci/Dockerfile @@ -72,33 +72,32 @@ RUN sudo apt-get update \ RUN sudo apt-get update \ && sudo apt-get install -y \ - python3 \ - python3-distutils \ - python3-psutil \ - git \ - gdb \ - ccache \ - gpg \ - wget \ bash \ + ccache \ curl \ - python3 \ - python3-dev \ - libpython3-dev \ - uuid-dev \ - libncurses5-dev \ - swig3.0 \ - libxml2-dev \ - libedit-dev \ + gdb \ + git \ + gpg \ language-pack-en \ language-pack-fr \ language-pack-ja \ language-pack-ru \ language-pack-zh-hans \ + libedit-dev \ + libncurses5-dev \ + libpython3-dev \ + libxml2-dev \ lsb-release \ - wget \ - unzip \ + make \ + python3 \ + python3-dev \ + python3-distutils \ + python3-psutil \ software-properties-common \ + swig4.0 \ + unzip \ + uuid-dev \ + wget \ && sudo rm -rf /var/lib/apt/lists/* diff --git a/yass/third_party/libc++/trunk/utils/ci/oss-fuzz.sh b/yass/third_party/libc++/trunk/utils/ci/oss-fuzz.sh index e5723406a9..03b59b2940 100755 --- a/yass/third_party/libc++/trunk/utils/ci/oss-fuzz.sh +++ b/yass/third_party/libc++/trunk/utils/ci/oss-fuzz.sh @@ -23,7 +23,7 @@ for test in libcxx/test/libcxx/fuzzing/*.pass.cpp; do exe="$(basename ${test})" exe="${exe%.pass.cpp}" ${CXX} ${CXXFLAGS} \ - -std=c++14 \ + -std=c++20 \ -DLIBCPP_OSS_FUZZ \ -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS \ -nostdinc++ -cxx-isystem ${INSTALL}/include/c++/v1 \ diff --git a/yass/third_party/libc++/trunk/utils/ci/run-buildbot b/yass/third_party/libc++/trunk/utils/ci/run-buildbot index 2905745355..a6f3eb1743 100755 --- a/yass/third_party/libc++/trunk/utils/ci/run-buildbot +++ b/yass/third_party/libc++/trunk/utils/ci/run-buildbot @@ -374,7 +374,7 @@ bootstrapping-build) -B "${BUILD_DIR}" \ -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \ -DLLVM_ENABLE_PROJECTS="clang" \ -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \ diff --git a/yass/third_party/libc++/trunk/utils/data/unicode/DerivedCoreProperties.txt b/yass/third_party/libc++/trunk/utils/data/unicode/DerivedCoreProperties.txt index 8b482b5c10..220c55685d 100644 --- a/yass/third_party/libc++/trunk/utils/data/unicode/DerivedCoreProperties.txt +++ b/yass/third_party/libc++/trunk/utils/data/unicode/DerivedCoreProperties.txt @@ -1,6 +1,6 @@ -# DerivedCoreProperties-15.0.0.txt -# Date: 2022-08-05, 22:17:05 GMT -# © 2022 Unicode®, Inc. +# DerivedCoreProperties-15.1.0.txt +# Date: 2023-08-07, 15:21:24 GMT +# © 2023 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see https://www.unicode.org/terms_of_use.html # @@ -1397,11 +1397,12 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 2B740..2B81D ; Alphabetic # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Alphabetic # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; Alphabetic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; Alphabetic # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; Alphabetic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; Alphabetic # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..323AF ; Alphabetic # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 137765 +# Total code points: 138387 # ================================================ @@ -6853,11 +6854,12 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 2B740..2B81D ; ID_Start # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; ID_Start # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; ID_Start # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; ID_Start # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; ID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; ID_Start # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..323AF ; ID_Start # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 136345 +# Total code points: 136967 # ================================================ @@ -7438,6 +7440,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 1FE0..1FEC ; ID_Continue # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA 1FF2..1FF4 ; ID_Continue # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI 1FF6..1FFC ; ID_Continue # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +200C..200D ; ID_Continue # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER 203F..2040 ; ID_Continue # Pc [2] UNDERTIE..CHARACTER TIE 2054 ; ID_Continue # Pc INVERTED UNDERTIE 2071 ; ID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER I @@ -7504,6 +7507,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 309D..309E ; ID_Continue # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK 309F ; ID_Continue # Lo HIRAGANA DIGRAPH YORI 30A1..30FA ; ID_Continue # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FB ; ID_Continue # Po KATAKANA MIDDLE DOT 30FC..30FE ; ID_Continue # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK 30FF ; ID_Continue # Lo KATAKANA DIGRAPH KOTO 3105..312F ; ID_Continue # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN @@ -7683,6 +7687,7 @@ FF10..FF19 ; ID_Continue # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NIN FF21..FF3A ; ID_Continue # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z FF3F ; ID_Continue # Pc FULLWIDTH LOW LINE FF41..FF5A ; ID_Continue # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF65 ; ID_Continue # Po HALFWIDTH KATAKANA MIDDLE DOT FF66..FF6F ; ID_Continue # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU FF70 ; ID_Continue # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK FF71..FF9D ; ID_Continue # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N @@ -8207,12 +8212,13 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 2B740..2B81D ; ID_Continue # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; ID_Continue # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; ID_Continue # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; ID_Continue # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; ID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; ID_Continue # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..323AF ; ID_Continue # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF E0100..E01EF ; ID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 139482 +# Total code points: 140108 # ================================================ @@ -8962,11 +8968,12 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 2B740..2B81D ; XID_Start # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; XID_Start # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; XID_Start # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; XID_Start # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; XID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; XID_Start # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..323AF ; XID_Start # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 136322 +# Total code points: 136944 # ================================================ @@ -9543,6 +9550,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 1FE0..1FEC ; XID_Continue # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA 1FF2..1FF4 ; XID_Continue # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI 1FF6..1FFC ; XID_Continue # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +200C..200D ; XID_Continue # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER 203F..2040 ; XID_Continue # Pc [2] UNDERTIE..CHARACTER TIE 2054 ; XID_Continue # Pc INVERTED UNDERTIE 2071 ; XID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER I @@ -9608,6 +9616,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 309D..309E ; XID_Continue # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK 309F ; XID_Continue # Lo HIRAGANA DIGRAPH YORI 30A1..30FA ; XID_Continue # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FB ; XID_Continue # Po KATAKANA MIDDLE DOT 30FC..30FE ; XID_Continue # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK 30FF ; XID_Continue # Lo KATAKANA DIGRAPH KOTO 3105..312F ; XID_Continue # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN @@ -9793,6 +9802,7 @@ FF10..FF19 ; XID_Continue # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NI FF21..FF3A ; XID_Continue # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z FF3F ; XID_Continue # Pc FULLWIDTH LOW LINE FF41..FF5A ; XID_Continue # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF65 ; XID_Continue # Po HALFWIDTH KATAKANA MIDDLE DOT FF66..FF6F ; XID_Continue # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU FF70 ; XID_Continue # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK FF71..FF9D ; XID_Continue # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N @@ -10317,12 +10327,13 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 2B740..2B81D ; XID_Continue # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; XID_Continue # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; XID_Continue # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; XID_Continue # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; XID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; XID_Continue # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..323AF ; XID_Continue # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF E0100..E01EF ; XID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 139463 +# Total code points: 140089 # ================================================ @@ -10335,6 +10346,15 @@ E0100..E01EF ; XID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTO # - FFF9..FFFB (Interlinear annotation format characters) # - 13430..13440 (Egyptian hieroglyph format characters) # - Prepended_Concatenation_Mark (Exceptional format characters that should be visible) +# +# There are currently no stability guarantees for DICP. However, the +# values of DICP interact with the derivation of XID_Continue +# and NFKC_CF, for which there are stability guarantees. +# Maintainers of this property should note that in the +# unlikely case that the DICP value changes for an existing character +# which is also XID_Continue=Yes, then exceptions must be put +# in place to ensure that the NFKC_CF mapping value for that +# existing character does not change. 00AD ; Default_Ignorable_Code_Point # Cf SOFT HYPHEN 034F ; Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER @@ -11602,7 +11622,7 @@ E0100..E01EF ; Grapheme_Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELE 2E80..2E99 ; Grapheme_Base # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP 2E9B..2EF3 ; Grapheme_Base # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE 2F00..2FD5 ; Grapheme_Base # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE -2FF0..2FFB ; Grapheme_Base # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +2FF0..2FFF ; Grapheme_Base # So [16] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION 3000 ; Grapheme_Base # Zs IDEOGRAPHIC SPACE 3001..3003 ; Grapheme_Base # Po [3] IDEOGRAPHIC COMMA..DITTO MARK 3004 ; Grapheme_Base # So JAPANESE INDUSTRIAL STANDARD SYMBOL @@ -11657,6 +11677,7 @@ E0100..E01EF ; Grapheme_Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELE 3196..319F ; Grapheme_Base # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK 31A0..31BF ; Grapheme_Base # Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH 31C0..31E3 ; Grapheme_Base # So [36] CJK STROKE T..CJK STROKE Q +31EF ; Grapheme_Base # So IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION 31F0..31FF ; Grapheme_Base # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO 3200..321E ; Grapheme_Base # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU 3220..3229 ; Grapheme_Base # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN @@ -12497,11 +12518,12 @@ FFFC..FFFD ; Grapheme_Base # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEME 2B740..2B81D ; Grapheme_Base # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Grapheme_Base # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; Grapheme_Base # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; Grapheme_Base # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; Grapheme_Base # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; Grapheme_Base # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..323AF ; Grapheme_Base # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 146986 +# Total code points: 147613 # ================================================ @@ -12572,4 +12594,239 @@ ABED ; Grapheme_Link # Mn MEETEI MAYEK APUN IYEK # Total code points: 65 +# ================================================ + +# Derived Property: Indic_Conjunct_Break +# Generated from the Grapheme_Cluster_Break, Indic_Syllabic_Category, +# Canonical_Combining_Class, and Script properties as described in UAX #44: +# https://www.unicode.org/reports/tr44/. + +# All code points not explicitly listed for Indic_Conjunct_Break +# have the value None. + +# @missing: 0000..10FFFF; InCB; None + +# ================================================ + +# Indic_Conjunct_Break=Linker + +094D ; InCB; Linker # Mn DEVANAGARI SIGN VIRAMA +09CD ; InCB; Linker # Mn BENGALI SIGN VIRAMA +0ACD ; InCB; Linker # Mn GUJARATI SIGN VIRAMA +0B4D ; InCB; Linker # Mn ORIYA SIGN VIRAMA +0C4D ; InCB; Linker # Mn TELUGU SIGN VIRAMA +0D4D ; InCB; Linker # Mn MALAYALAM SIGN VIRAMA + +# Total code points: 6 + +# ================================================ + +# Indic_Conjunct_Break=Consonant + +0915..0939 ; InCB; Consonant # Lo [37] DEVANAGARI LETTER KA..DEVANAGARI LETTER HA +0958..095F ; InCB; Consonant # Lo [8] DEVANAGARI LETTER QA..DEVANAGARI LETTER YYA +0978..097F ; InCB; Consonant # Lo [8] DEVANAGARI LETTER MARWARI DDA..DEVANAGARI LETTER BBA +0995..09A8 ; InCB; Consonant # Lo [20] BENGALI LETTER KA..BENGALI LETTER NA +09AA..09B0 ; InCB; Consonant # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; InCB; Consonant # Lo BENGALI LETTER LA +09B6..09B9 ; InCB; Consonant # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09DC..09DD ; InCB; Consonant # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF ; InCB; Consonant # Lo BENGALI LETTER YYA +09F0..09F1 ; InCB; Consonant # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +0A95..0AA8 ; InCB; Consonant # Lo [20] GUJARATI LETTER KA..GUJARATI LETTER NA +0AAA..0AB0 ; InCB; Consonant # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; InCB; Consonant # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; InCB; Consonant # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0AF9 ; InCB; Consonant # Lo GUJARATI LETTER ZHA +0B15..0B28 ; InCB; Consonant # Lo [20] ORIYA LETTER KA..ORIYA LETTER NA +0B2A..0B30 ; InCB; Consonant # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; InCB; Consonant # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; InCB; Consonant # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B5C..0B5D ; InCB; Consonant # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F ; InCB; Consonant # Lo ORIYA LETTER YYA +0B71 ; InCB; Consonant # Lo ORIYA LETTER WA +0C15..0C28 ; InCB; Consonant # Lo [20] TELUGU LETTER KA..TELUGU LETTER NA +0C2A..0C39 ; InCB; Consonant # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C58..0C5A ; InCB; Consonant # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0D15..0D3A ; InCB; Consonant # Lo [38] MALAYALAM LETTER KA..MALAYALAM LETTER TTTA + +# Total code points: 240 + +# ================================================ + +# Indic_Conjunct_Break=Extend + +0300..034E ; InCB; Extend # Mn [79] COMBINING GRAVE ACCENT..COMBINING UPWARDS ARROW BELOW +0350..036F ; InCB; Extend # Mn [32] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING LATIN SMALL LETTER X +0483..0487 ; InCB; Extend # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +0591..05BD ; InCB; Extend # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BF ; InCB; Extend # Mn HEBREW POINT RAFE +05C1..05C2 ; InCB; Extend # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4..05C5 ; InCB; Extend # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C7 ; InCB; Extend # Mn HEBREW POINT QAMATS QATAN +0610..061A ; InCB; Extend # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +064B..065F ; InCB; Extend # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +0670 ; InCB; Extend # Mn ARABIC LETTER SUPERSCRIPT ALEF +06D6..06DC ; InCB; Extend # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DF..06E4 ; InCB; Extend # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E7..06E8 ; InCB; Extend # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06EA..06ED ; InCB; Extend # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +0711 ; InCB; Extend # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0730..074A ; InCB; Extend # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +07EB..07F3 ; InCB; Extend # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07FD ; InCB; Extend # Mn NKO DANTAYALAN +0816..0819 ; InCB; Extend # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081B..0823 ; InCB; Extend # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0825..0827 ; InCB; Extend # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0829..082D ; InCB; Extend # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0859..085B ; InCB; Extend # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +0898..089F ; InCB; Extend # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA +08CA..08E1 ; InCB; Extend # Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA +08E3..08FF ; InCB; Extend # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA +093C ; InCB; Extend # Mn DEVANAGARI SIGN NUKTA +0951..0954 ; InCB; Extend # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT +09BC ; InCB; Extend # Mn BENGALI SIGN NUKTA +09FE ; InCB; Extend # Mn BENGALI SANDHI MARK +0A3C ; InCB; Extend # Mn GURMUKHI SIGN NUKTA +0ABC ; InCB; Extend # Mn GUJARATI SIGN NUKTA +0B3C ; InCB; Extend # Mn ORIYA SIGN NUKTA +0C3C ; InCB; Extend # Mn TELUGU SIGN NUKTA +0C55..0C56 ; InCB; Extend # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0CBC ; InCB; Extend # Mn KANNADA SIGN NUKTA +0D3B..0D3C ; InCB; Extend # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0E38..0E3A ; InCB; Extend # Mn [3] THAI CHARACTER SARA U..THAI CHARACTER PHINTHU +0E48..0E4B ; InCB; Extend # Mn [4] THAI CHARACTER MAI EK..THAI CHARACTER MAI CHATTAWA +0EB8..0EBA ; InCB; Extend # Mn [3] LAO VOWEL SIGN U..LAO SIGN PALI VIRAMA +0EC8..0ECB ; InCB; Extend # Mn [4] LAO TONE MAI EK..LAO TONE MAI CATAWA +0F18..0F19 ; InCB; Extend # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F35 ; InCB; Extend # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F37 ; InCB; Extend # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F39 ; InCB; Extend # Mn TIBETAN MARK TSA -PHRU +0F71..0F72 ; InCB; Extend # Mn [2] TIBETAN VOWEL SIGN AA..TIBETAN VOWEL SIGN I +0F74 ; InCB; Extend # Mn TIBETAN VOWEL SIGN U +0F7A..0F7D ; InCB; Extend # Mn [4] TIBETAN VOWEL SIGN E..TIBETAN VOWEL SIGN OO +0F80 ; InCB; Extend # Mn TIBETAN VOWEL SIGN REVERSED I +0F82..0F84 ; InCB; Extend # Mn [3] TIBETAN SIGN NYI ZLA NAA DA..TIBETAN MARK HALANTA +0F86..0F87 ; InCB; Extend # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0FC6 ; InCB; Extend # Mn TIBETAN SYMBOL PADMA GDAN +1037 ; InCB; Extend # Mn MYANMAR SIGN DOT BELOW +1039..103A ; InCB; Extend # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +108D ; InCB; Extend # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +135D..135F ; InCB; Extend # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1714 ; InCB; Extend # Mn TAGALOG SIGN VIRAMA +17D2 ; InCB; Extend # Mn KHMER SIGN COENG +17DD ; InCB; Extend # Mn KHMER SIGN ATTHACAN +18A9 ; InCB; Extend # Mn MONGOLIAN LETTER ALI GALI DAGALGA +1939..193B ; InCB; Extend # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1A17..1A18 ; InCB; Extend # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A60 ; InCB; Extend # Mn TAI THAM SIGN SAKOT +1A75..1A7C ; InCB; Extend # Mn [8] TAI THAM SIGN TONE-1..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; InCB; Extend # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1AB0..1ABD ; InCB; Extend # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABF..1ACE ; InCB; Extend # Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T +1B34 ; InCB; Extend # Mn BALINESE SIGN REREKAN +1B6B..1B73 ; InCB; Extend # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1BAB ; InCB; Extend # Mn SUNDANESE SIGN VIRAMA +1BE6 ; InCB; Extend # Mn BATAK SIGN TOMPI +1C37 ; InCB; Extend # Mn LEPCHA SIGN NUKTA +1CD0..1CD2 ; InCB; Extend # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD4..1CE0 ; InCB; Extend # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE2..1CE8 ; InCB; Extend # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CED ; InCB; Extend # Mn VEDIC SIGN TIRYAK +1CF4 ; InCB; Extend # Mn VEDIC TONE CANDRA ABOVE +1CF8..1CF9 ; InCB; Extend # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1DC0..1DFF ; InCB; Extend # Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +200D ; InCB; Extend # Cf ZERO WIDTH JOINER +20D0..20DC ; InCB; Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20E1 ; InCB; Extend # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E5..20F0 ; InCB; Extend # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +2CEF..2CF1 ; InCB; Extend # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2D7F ; InCB; Extend # Mn TIFINAGH CONSONANT JOINER +2DE0..2DFF ; InCB; Extend # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +302A..302D ; InCB; Extend # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F ; InCB; Extend # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3099..309A ; InCB; Extend # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +A66F ; InCB; Extend # Mn COMBINING CYRILLIC VZMET +A674..A67D ; InCB; Extend # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A69E..A69F ; InCB; Extend # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6F0..A6F1 ; InCB; Extend # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A82C ; InCB; Extend # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA +A8E0..A8F1 ; InCB; Extend # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A92B..A92D ; InCB; Extend # Mn [3] KAYAH LI TONE PLOPHU..KAYAH LI TONE CALYA PLOPHU +A9B3 ; InCB; Extend # Mn JAVANESE SIGN CECAK TELU +AAB0 ; InCB; Extend # Mn TAI VIET MAI KANG +AAB2..AAB4 ; InCB; Extend # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB7..AAB8 ; InCB; Extend # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AABE..AABF ; InCB; Extend # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC1 ; InCB; Extend # Mn TAI VIET TONE MAI THO +AAF6 ; InCB; Extend # Mn MEETEI MAYEK VIRAMA +ABED ; InCB; Extend # Mn MEETEI MAYEK APUN IYEK +FB1E ; InCB; Extend # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FE20..FE2F ; InCB; Extend # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +101FD ; InCB; Extend # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +102E0 ; InCB; Extend # Mn COPTIC EPACT THOUSANDS MARK +10376..1037A ; InCB; Extend # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10A0D ; InCB; Extend # Mn KHAROSHTHI SIGN DOUBLE RING BELOW +10A0F ; InCB; Extend # Mn KHAROSHTHI SIGN VISARGA +10A38..10A3A ; InCB; Extend # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; InCB; Extend # Mn KHAROSHTHI VIRAMA +10AE5..10AE6 ; InCB; Extend # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10D24..10D27 ; InCB; Extend # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10EAB..10EAC ; InCB; Extend # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EFD..10EFF ; InCB; Extend # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA +10F46..10F50 ; InCB; Extend # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +10F82..10F85 ; InCB; Extend # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW +11070 ; InCB; Extend # Mn BRAHMI SIGN OLD TAMIL VIRAMA +1107F ; InCB; Extend # Mn BRAHMI NUMBER JOINER +110BA ; InCB; Extend # Mn KAITHI SIGN NUKTA +11100..11102 ; InCB; Extend # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11133..11134 ; InCB; Extend # Mn [2] CHAKMA VIRAMA..CHAKMA MAAYYAA +11173 ; InCB; Extend # Mn MAHAJANI SIGN NUKTA +111CA ; InCB; Extend # Mn SHARADA SIGN NUKTA +11236 ; InCB; Extend # Mn KHOJKI SIGN NUKTA +112E9..112EA ; InCB; Extend # Mn [2] KHUDAWADI SIGN NUKTA..KHUDAWADI SIGN VIRAMA +1133B..1133C ; InCB; Extend # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +11366..1136C ; InCB; Extend # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; InCB; Extend # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11446 ; InCB; Extend # Mn NEWA SIGN NUKTA +1145E ; InCB; Extend # Mn NEWA SANDHI MARK +114C3 ; InCB; Extend # Mn TIRHUTA SIGN NUKTA +115C0 ; InCB; Extend # Mn SIDDHAM SIGN NUKTA +116B7 ; InCB; Extend # Mn TAKRI SIGN NUKTA +1172B ; InCB; Extend # Mn AHOM SIGN KILLER +1183A ; InCB; Extend # Mn DOGRA SIGN NUKTA +1193E ; InCB; Extend # Mn DIVES AKURU VIRAMA +11943 ; InCB; Extend # Mn DIVES AKURU SIGN NUKTA +11A34 ; InCB; Extend # Mn ZANABAZAR SQUARE SIGN VIRAMA +11A47 ; InCB; Extend # Mn ZANABAZAR SQUARE SUBJOINER +11A99 ; InCB; Extend # Mn SOYOMBO SUBJOINER +11D42 ; InCB; Extend # Mn MASARAM GONDI SIGN NUKTA +11D44..11D45 ; InCB; Extend # Mn [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA +11D97 ; InCB; Extend # Mn GUNJALA GONDI VIRAMA +11F42 ; InCB; Extend # Mn KAWI CONJOINER +16AF0..16AF4 ; InCB; Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16B30..16B36 ; InCB; Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +1BC9E ; InCB; Extend # Mn DUPLOYAN DOUBLE MARK +1D165 ; InCB; Extend # Mc MUSICAL SYMBOL COMBINING STEM +1D167..1D169 ; InCB; Extend # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16E..1D172 ; InCB; Extend # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 +1D17B..1D182 ; InCB; Extend # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; InCB; Extend # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; InCB; Extend # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D242..1D244 ; InCB; Extend # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1E000..1E006 ; InCB; Extend # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; InCB; Extend # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; InCB; Extend # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; InCB; Extend # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; InCB; Extend # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E08F ; InCB; Extend # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +1E130..1E136 ; InCB; Extend # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D +1E2AE ; InCB; Extend # Mn TOTO SIGN RISING TONE +1E2EC..1E2EF ; InCB; Extend # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI +1E4EC..1E4EF ; InCB; Extend # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH +1E8D0..1E8D6 ; InCB; Extend # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E944..1E94A ; InCB; Extend # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA + +# Total code points: 884 + # EOF diff --git a/yass/third_party/libc++/trunk/utils/data/unicode/DerivedGeneralCategory.txt b/yass/third_party/libc++/trunk/utils/data/unicode/DerivedGeneralCategory.txt index c6013ef25d..285ffa8fb8 100644 --- a/yass/third_party/libc++/trunk/utils/data/unicode/DerivedGeneralCategory.txt +++ b/yass/third_party/libc++/trunk/utils/data/unicode/DerivedGeneralCategory.txt @@ -1,6 +1,6 @@ -# DerivedGeneralCategory-15.0.0.txt -# Date: 2022-04-26, 23:14:35 GMT -# © 2022 Unicode®, Inc. +# DerivedGeneralCategory-15.1.0.txt +# Date: 2023-07-28, 23:34:02 GMT +# © 2023 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see https://www.unicode.org/terms_of_use.html # @@ -284,13 +284,12 @@ 2E9A ; Cn # 2EF4..2EFF ; Cn # [12] .. 2FD6..2FEF ; Cn # [26] .. -2FFC..2FFF ; Cn # [4] .. 3040 ; Cn # 3097..3098 ; Cn # [2] .. 3100..3104 ; Cn # [5] .. 3130 ; Cn # 318F ; Cn # -31E4..31EF ; Cn # [12] .. +31E4..31EE ; Cn # [11] .. 321F ; Cn # A48D..A48F ; Cn # [3] .. A4C7..A4CF ; Cn # [9] .. @@ -713,7 +712,8 @@ FFFE..FFFF ; Cn # [2] .. 2B73A..2B73F ; Cn # [6] .. 2B81E..2B81F ; Cn # [2] .. 2CEA2..2CEAF ; Cn # [14] .. -2EBE1..2F7FF ; Cn # [3103] .. +2EBE1..2EBEF ; Cn # [15] .. +2EE5E..2F7FF ; Cn # [2466] .. 2FA1E..2FFFF ; Cn # [1506] .. 3134B..3134F ; Cn # [5] .. 323B0..E0000 ; Cn # [711761] .. @@ -723,7 +723,7 @@ E01F0..EFFFF ; Cn # [65040] .. FFFFE..FFFFF ; Cn # [2] .. 10FFFE..10FFFF; Cn # [2] .. -# Total code points: 825345 +# Total code points: 824718 # ================================================ @@ -2649,11 +2649,12 @@ FFDA..FFDC ; Lo # [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I 2B740..2B81D ; Lo # [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Lo # [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; Lo # [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; Lo # [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; Lo # [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; Lo # [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..323AF ; Lo # [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 131612 +# Total code points: 132234 # ================================================ @@ -4092,7 +4093,7 @@ FFE3 ; Sk # FULLWIDTH MACRON 2E80..2E99 ; So # [26] CJK RADICAL REPEAT..CJK RADICAL RAP 2E9B..2EF3 ; So # [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE 2F00..2FD5 ; So # [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE -2FF0..2FFB ; So # [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +2FF0..2FFF ; So # [16] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION 3004 ; So # JAPANESE INDUSTRIAL STANDARD SYMBOL 3012..3013 ; So # [2] POSTAL MARK..GETA MARK 3020 ; So # POSTAL MARK FACE @@ -4101,6 +4102,7 @@ FFE3 ; Sk # FULLWIDTH MACRON 3190..3191 ; So # [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK 3196..319F ; So # [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK 31C0..31E3 ; So # [36] CJK STROKE T..CJK STROKE Q +31EF ; So # IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION 3200..321E ; So # [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU 322A..3247 ; So # [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO 3250 ; So # PARTNERSHIP SIGN @@ -4191,7 +4193,7 @@ FFFC..FFFD ; So # [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER 1FB00..1FB92 ; So # [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK 1FB94..1FBCA ; So # [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON -# Total code points: 6634 +# Total code points: 6639 # ================================================ diff --git a/yass/third_party/libc++/trunk/utils/data/unicode/EastAsianWidth.txt b/yass/third_party/libc++/trunk/utils/data/unicode/EastAsianWidth.txt index 38b7076c02..02df4df475 100644 --- a/yass/third_party/libc++/trunk/utils/data/unicode/EastAsianWidth.txt +++ b/yass/third_party/libc++/trunk/utils/data/unicode/EastAsianWidth.txt @@ -1,11 +1,11 @@ -# EastAsianWidth-15.0.0.txt -# Date: 2022-05-24, 17:40:20 GMT [KW, LI] -# © 2022 Unicode®, Inc. +# EastAsianWidth-15.1.0.txt +# Date: 2023-07-28, 23:34:08 GMT +# © 2023 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see https://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # # East_Asian_Width Property # @@ -30,2590 +30,2592 @@ # Character ranges are specified as for other property files in the # Unicode Character Database. # -# For legacy reasons, there are no spaces before or after the semicolon -# which separates the two fields. The comments following the number sign -# "#" list the General_Category property value or the L& alias of the -# derived value LC, the Unicode character name or names, and, in lines -# with ranges of code points, the code point count in square brackets. +# The comments following the number sign "#" list the General_Category +# property value or the L& alias of the derived value LC, the Unicode +# character name or names, and, in lines with ranges of code points, +# the code point count in square brackets. # # For more information, see UAX #11: East Asian Width, # at https://www.unicode.org/reports/tr11/ # # @missing: 0000..10FFFF; N -0000..001F;N # Cc [32] .. -0020;Na # Zs SPACE -0021..0023;Na # Po [3] EXCLAMATION MARK..NUMBER SIGN -0024;Na # Sc DOLLAR SIGN -0025..0027;Na # Po [3] PERCENT SIGN..APOSTROPHE -0028;Na # Ps LEFT PARENTHESIS -0029;Na # Pe RIGHT PARENTHESIS -002A;Na # Po ASTERISK -002B;Na # Sm PLUS SIGN -002C;Na # Po COMMA -002D;Na # Pd HYPHEN-MINUS -002E..002F;Na # Po [2] FULL STOP..SOLIDUS -0030..0039;Na # Nd [10] DIGIT ZERO..DIGIT NINE -003A..003B;Na # Po [2] COLON..SEMICOLON -003C..003E;Na # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN -003F..0040;Na # Po [2] QUESTION MARK..COMMERCIAL AT -0041..005A;Na # Lu [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -005B;Na # Ps LEFT SQUARE BRACKET -005C;Na # Po REVERSE SOLIDUS -005D;Na # Pe RIGHT SQUARE BRACKET -005E;Na # Sk CIRCUMFLEX ACCENT -005F;Na # Pc LOW LINE -0060;Na # Sk GRAVE ACCENT -0061..007A;Na # Ll [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -007B;Na # Ps LEFT CURLY BRACKET -007C;Na # Sm VERTICAL LINE -007D;Na # Pe RIGHT CURLY BRACKET -007E;Na # Sm TILDE -007F;N # Cc -0080..009F;N # Cc [32] .. -00A0;N # Zs NO-BREAK SPACE -00A1;A # Po INVERTED EXCLAMATION MARK -00A2..00A3;Na # Sc [2] CENT SIGN..POUND SIGN -00A4;A # Sc CURRENCY SIGN -00A5;Na # Sc YEN SIGN -00A6;Na # So BROKEN BAR -00A7;A # Po SECTION SIGN -00A8;A # Sk DIAERESIS -00A9;N # So COPYRIGHT SIGN -00AA;A # Lo FEMININE ORDINAL INDICATOR -00AB;N # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -00AC;Na # Sm NOT SIGN -00AD;A # Cf SOFT HYPHEN -00AE;A # So REGISTERED SIGN -00AF;Na # Sk MACRON -00B0;A # So DEGREE SIGN -00B1;A # Sm PLUS-MINUS SIGN -00B2..00B3;A # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE -00B4;A # Sk ACUTE ACCENT -00B5;N # Ll MICRO SIGN -00B6..00B7;A # Po [2] PILCROW SIGN..MIDDLE DOT -00B8;A # Sk CEDILLA -00B9;A # No SUPERSCRIPT ONE -00BA;A # Lo MASCULINE ORDINAL INDICATOR -00BB;N # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -00BC..00BE;A # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS -00BF;A # Po INVERTED QUESTION MARK -00C0..00C5;N # Lu [6] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER A WITH RING ABOVE -00C6;A # Lu LATIN CAPITAL LETTER AE -00C7..00CF;N # Lu [9] LATIN CAPITAL LETTER C WITH CEDILLA..LATIN CAPITAL LETTER I WITH DIAERESIS -00D0;A # Lu LATIN CAPITAL LETTER ETH -00D1..00D6;N # Lu [6] LATIN CAPITAL LETTER N WITH TILDE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D7;A # Sm MULTIPLICATION SIGN -00D8;A # Lu LATIN CAPITAL LETTER O WITH STROKE -00D9..00DD;N # Lu [5] LATIN CAPITAL LETTER U WITH GRAVE..LATIN CAPITAL LETTER Y WITH ACUTE -00DE..00E1;A # L& [4] LATIN CAPITAL LETTER THORN..LATIN SMALL LETTER A WITH ACUTE -00E2..00E5;N # Ll [4] LATIN SMALL LETTER A WITH CIRCUMFLEX..LATIN SMALL LETTER A WITH RING ABOVE -00E6;A # Ll LATIN SMALL LETTER AE -00E7;N # Ll LATIN SMALL LETTER C WITH CEDILLA -00E8..00EA;A # Ll [3] LATIN SMALL LETTER E WITH GRAVE..LATIN SMALL LETTER E WITH CIRCUMFLEX -00EB;N # Ll LATIN SMALL LETTER E WITH DIAERESIS -00EC..00ED;A # Ll [2] LATIN SMALL LETTER I WITH GRAVE..LATIN SMALL LETTER I WITH ACUTE -00EE..00EF;N # Ll [2] LATIN SMALL LETTER I WITH CIRCUMFLEX..LATIN SMALL LETTER I WITH DIAERESIS -00F0;A # Ll LATIN SMALL LETTER ETH -00F1;N # Ll LATIN SMALL LETTER N WITH TILDE -00F2..00F3;A # Ll [2] LATIN SMALL LETTER O WITH GRAVE..LATIN SMALL LETTER O WITH ACUTE -00F4..00F6;N # Ll [3] LATIN SMALL LETTER O WITH CIRCUMFLEX..LATIN SMALL LETTER O WITH DIAERESIS -00F7;A # Sm DIVISION SIGN -00F8..00FA;A # Ll [3] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER U WITH ACUTE -00FB;N # Ll LATIN SMALL LETTER U WITH CIRCUMFLEX -00FC;A # Ll LATIN SMALL LETTER U WITH DIAERESIS -00FD;N # Ll LATIN SMALL LETTER Y WITH ACUTE -00FE;A # Ll LATIN SMALL LETTER THORN -00FF;N # Ll LATIN SMALL LETTER Y WITH DIAERESIS -0100;N # Lu LATIN CAPITAL LETTER A WITH MACRON -0101;A # Ll LATIN SMALL LETTER A WITH MACRON -0102..0110;N # L& [15] LATIN CAPITAL LETTER A WITH BREVE..LATIN CAPITAL LETTER D WITH STROKE -0111;A # Ll LATIN SMALL LETTER D WITH STROKE -0112;N # Lu LATIN CAPITAL LETTER E WITH MACRON -0113;A # Ll LATIN SMALL LETTER E WITH MACRON -0114..011A;N # L& [7] LATIN CAPITAL LETTER E WITH BREVE..LATIN CAPITAL LETTER E WITH CARON -011B;A # Ll LATIN SMALL LETTER E WITH CARON -011C..0125;N # L& [10] LATIN CAPITAL LETTER G WITH CIRCUMFLEX..LATIN SMALL LETTER H WITH CIRCUMFLEX -0126..0127;A # L& [2] LATIN CAPITAL LETTER H WITH STROKE..LATIN SMALL LETTER H WITH STROKE -0128..012A;N # L& [3] LATIN CAPITAL LETTER I WITH TILDE..LATIN CAPITAL LETTER I WITH MACRON -012B;A # Ll LATIN SMALL LETTER I WITH MACRON -012C..0130;N # L& [5] LATIN CAPITAL LETTER I WITH BREVE..LATIN CAPITAL LETTER I WITH DOT ABOVE -0131..0133;A # L& [3] LATIN SMALL LETTER DOTLESS I..LATIN SMALL LIGATURE IJ -0134..0137;N # L& [4] LATIN CAPITAL LETTER J WITH CIRCUMFLEX..LATIN SMALL LETTER K WITH CEDILLA -0138;A # Ll LATIN SMALL LETTER KRA -0139..013E;N # L& [6] LATIN CAPITAL LETTER L WITH ACUTE..LATIN SMALL LETTER L WITH CARON -013F..0142;A # L& [4] LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN SMALL LETTER L WITH STROKE -0143;N # Lu LATIN CAPITAL LETTER N WITH ACUTE -0144;A # Ll LATIN SMALL LETTER N WITH ACUTE -0145..0147;N # L& [3] LATIN CAPITAL LETTER N WITH CEDILLA..LATIN CAPITAL LETTER N WITH CARON -0148..014B;A # L& [4] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER ENG -014C;N # Lu LATIN CAPITAL LETTER O WITH MACRON -014D;A # Ll LATIN SMALL LETTER O WITH MACRON -014E..0151;N # L& [4] LATIN CAPITAL LETTER O WITH BREVE..LATIN SMALL LETTER O WITH DOUBLE ACUTE -0152..0153;A # L& [2] LATIN CAPITAL LIGATURE OE..LATIN SMALL LIGATURE OE -0154..0165;N # L& [18] LATIN CAPITAL LETTER R WITH ACUTE..LATIN SMALL LETTER T WITH CARON -0166..0167;A # L& [2] LATIN CAPITAL LETTER T WITH STROKE..LATIN SMALL LETTER T WITH STROKE -0168..016A;N # L& [3] LATIN CAPITAL LETTER U WITH TILDE..LATIN CAPITAL LETTER U WITH MACRON -016B;A # Ll LATIN SMALL LETTER U WITH MACRON -016C..017F;N # L& [20] LATIN CAPITAL LETTER U WITH BREVE..LATIN SMALL LETTER LONG S -0180..01BA;N # L& [59] LATIN SMALL LETTER B WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL -01BB;N # Lo LATIN LETTER TWO WITH STROKE -01BC..01BF;N # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN -01C0..01C3;N # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -01C4..01CD;N # L& [10] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER A WITH CARON -01CE;A # Ll LATIN SMALL LETTER A WITH CARON -01CF;N # Lu LATIN CAPITAL LETTER I WITH CARON -01D0;A # Ll LATIN SMALL LETTER I WITH CARON -01D1;N # Lu LATIN CAPITAL LETTER O WITH CARON -01D2;A # Ll LATIN SMALL LETTER O WITH CARON -01D3;N # Lu LATIN CAPITAL LETTER U WITH CARON -01D4;A # Ll LATIN SMALL LETTER U WITH CARON -01D5;N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON -01D6;A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND MACRON -01D7;N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE -01D8;A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE -01D9;N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON -01DA;A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND CARON -01DB;N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE -01DC;A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE -01DD..024F;N # L& [115] LATIN SMALL LETTER TURNED E..LATIN SMALL LETTER Y WITH STROKE -0250;N # Ll LATIN SMALL LETTER TURNED A -0251;A # Ll LATIN SMALL LETTER ALPHA -0252..0260;N # Ll [15] LATIN SMALL LETTER TURNED ALPHA..LATIN SMALL LETTER G WITH HOOK -0261;A # Ll LATIN SMALL LETTER SCRIPT G -0262..0293;N # Ll [50] LATIN LETTER SMALL CAPITAL G..LATIN SMALL LETTER EZH WITH CURL -0294;N # Lo LATIN LETTER GLOTTAL STOP -0295..02AF;N # Ll [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02C1;N # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP -02C2..02C3;N # Sk [2] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER RIGHT ARROWHEAD -02C4;A # Sk MODIFIER LETTER UP ARROWHEAD -02C5;N # Sk MODIFIER LETTER DOWN ARROWHEAD -02C6;N # Lm MODIFIER LETTER CIRCUMFLEX ACCENT -02C7;A # Lm CARON -02C8;N # Lm MODIFIER LETTER VERTICAL LINE -02C9..02CB;A # Lm [3] MODIFIER LETTER MACRON..MODIFIER LETTER GRAVE ACCENT -02CC;N # Lm MODIFIER LETTER LOW VERTICAL LINE -02CD;A # Lm MODIFIER LETTER LOW MACRON -02CE..02CF;N # Lm [2] MODIFIER LETTER LOW GRAVE ACCENT..MODIFIER LETTER LOW ACUTE ACCENT -02D0;A # Lm MODIFIER LETTER TRIANGULAR COLON -02D1;N # Lm MODIFIER LETTER HALF TRIANGULAR COLON -02D2..02D7;N # Sk [6] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN -02D8..02DB;A # Sk [4] BREVE..OGONEK -02DC;N # Sk SMALL TILDE -02DD;A # Sk DOUBLE ACUTE ACCENT -02DE;N # Sk MODIFIER LETTER RHOTIC HOOK -02DF;A # Sk MODIFIER LETTER CROSS ACCENT -02E0..02E4;N # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02E5..02EB;N # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK -02EC;N # Lm MODIFIER LETTER VOICING -02ED;N # Sk MODIFIER LETTER UNASPIRATED -02EE;N # Lm MODIFIER LETTER DOUBLE APOSTROPHE -02EF..02FF;N # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW -0300..036F;A # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X -0370..0373;N # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI -0374;N # Lm GREEK NUMERAL SIGN -0375;N # Sk GREEK LOWER NUMERAL SIGN -0376..0377;N # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA -037A;N # Lm GREEK YPOGEGRAMMENI -037B..037D;N # Ll [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL -037E;N # Po GREEK QUESTION MARK -037F;N # Lu GREEK CAPITAL LETTER YOT -0384..0385;N # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS -0386;N # Lu GREEK CAPITAL LETTER ALPHA WITH TONOS -0387;N # Po GREEK ANO TELEIA -0388..038A;N # Lu [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C;N # Lu GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..0390;N # L& [3] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS -0391..03A1;A # Lu [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO -03A3..03A9;A # Lu [7] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER OMEGA -03AA..03B0;N # L& [7] GREEK CAPITAL LETTER IOTA WITH DIALYTIKA..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS -03B1..03C1;A # Ll [17] GREEK SMALL LETTER ALPHA..GREEK SMALL LETTER RHO -03C2;N # Ll GREEK SMALL LETTER FINAL SIGMA -03C3..03C9;A # Ll [7] GREEK SMALL LETTER SIGMA..GREEK SMALL LETTER OMEGA -03CA..03F5;N # L& [44] GREEK SMALL LETTER IOTA WITH DIALYTIKA..GREEK LUNATE EPSILON SYMBOL -03F6;N # Sm GREEK REVERSED LUNATE EPSILON SYMBOL -03F7..03FF;N # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL -0400;N # Lu CYRILLIC CAPITAL LETTER IE WITH GRAVE -0401;A # Lu CYRILLIC CAPITAL LETTER IO -0402..040F;N # Lu [14] CYRILLIC CAPITAL LETTER DJE..CYRILLIC CAPITAL LETTER DZHE -0410..044F;A # L& [64] CYRILLIC CAPITAL LETTER A..CYRILLIC SMALL LETTER YA -0450;N # Ll CYRILLIC SMALL LETTER IE WITH GRAVE -0451;A # Ll CYRILLIC SMALL LETTER IO -0452..0481;N # L& [48] CYRILLIC SMALL LETTER DJE..CYRILLIC SMALL LETTER KOPPA -0482;N # So CYRILLIC THOUSANDS SIGN -0483..0487;N # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE -0488..0489;N # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -048A..04FF;N # L& [118] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER HA WITH STROKE -0500..052F;N # L& [48] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER EL WITH DESCENDER -0531..0556;N # Lu [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559;N # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING -055A..055F;N # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK -0560..0588;N # Ll [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE -0589;N # Po ARMENIAN FULL STOP -058A;N # Pd ARMENIAN HYPHEN -058D..058E;N # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN -058F;N # Sc ARMENIAN DRAM SIGN -0591..05BD;N # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG -05BE;N # Pd HEBREW PUNCTUATION MAQAF -05BF;N # Mn HEBREW POINT RAFE -05C0;N # Po HEBREW PUNCTUATION PASEQ -05C1..05C2;N # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C3;N # Po HEBREW PUNCTUATION SOF PASUQ -05C4..05C5;N # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C6;N # Po HEBREW PUNCTUATION NUN HAFUKHA -05C7;N # Mn HEBREW POINT QAMATS QATAN -05D0..05EA;N # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05EF..05F2;N # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD -05F3..05F4;N # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM -0600..0605;N # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE -0606..0608;N # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY -0609..060A;N # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN -060B;N # Sc AFGHANI SIGN -060C..060D;N # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR -060E..060F;N # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA -0610..061A;N # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA -061B;N # Po ARABIC SEMICOLON -061C;N # Cf ARABIC LETTER MARK -061D..061F;N # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK -0620..063F;N # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE -0640;N # Lm ARABIC TATWEEL -0641..064A;N # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -064B..065F;N # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW -0660..0669;N # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE -066A..066D;N # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR -066E..066F;N # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0670;N # Mn ARABIC LETTER SUPERSCRIPT ALEF -0671..06D3;N # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D4;N # Po ARABIC FULL STOP -06D5;N # Lo ARABIC LETTER AE -06D6..06DC;N # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06DD;N # Cf ARABIC END OF AYAH -06DE;N # So ARABIC START OF RUB EL HIZB -06DF..06E4;N # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA -06E5..06E6;N # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH -06E7..06E8;N # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06E9;N # So ARABIC PLACE OF SAJDAH -06EA..06ED;N # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -06EE..06EF;N # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06F0..06F9;N # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE -06FA..06FC;N # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FD..06FE;N # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN -06FF;N # Lo ARABIC LETTER HEH WITH INVERTED V -0700..070D;N # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS -070F;N # Cf SYRIAC ABBREVIATION MARK -0710;N # Lo SYRIAC LETTER ALAPH -0711;N # Mn SYRIAC LETTER SUPERSCRIPT ALAPH -0712..072F;N # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -0730..074A;N # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -074D..074F;N # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE -0750..077F;N # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE -0780..07A5;N # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU -07A6..07B0;N # Mn [11] THAANA ABAFILI..THAANA SUKUN -07B1;N # Lo THAANA LETTER NAA -07C0..07C9;N # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE -07CA..07EA;N # Lo [33] NKO LETTER A..NKO LETTER JONA RA -07EB..07F3;N # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE -07F4..07F5;N # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE -07F6;N # So NKO SYMBOL OO DENNEN -07F7..07F9;N # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK -07FA;N # Lm NKO LAJANYALAN -07FD;N # Mn NKO DANTAYALAN -07FE..07FF;N # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN -0800..0815;N # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF -0816..0819;N # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH -081A;N # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT -081B..0823;N # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A -0824;N # Lm SAMARITAN MODIFIER LETTER SHORT A -0825..0827;N # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U -0828;N # Lm SAMARITAN MODIFIER LETTER I -0829..082D;N # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA -0830..083E;N # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU -0840..0858;N # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN -0859..085B;N # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK -085E;N # Po MANDAIC PUNCTUATION -0860..086A;N # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA -0870..0887;N # Lo [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT -0888;N # Sk ARABIC RAISED ROUND DOT -0889..088E;N # Lo [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL -0890..0891;N # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE -0898..089F;N # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA -08A0..08C8;N # Lo [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF -08C9;N # Lm ARABIC SMALL FARSI YEH -08CA..08E1;N # Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA -08E2;N # Cf ARABIC DISPUTED END OF AYAH -08E3..08FF;N # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA -0900..0902;N # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA -0903;N # Mc DEVANAGARI SIGN VISARGA -0904..0939;N # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093A;N # Mn DEVANAGARI VOWEL SIGN OE -093B;N # Mc DEVANAGARI VOWEL SIGN OOE -093C;N # Mn DEVANAGARI SIGN NUKTA -093D;N # Lo DEVANAGARI SIGN AVAGRAHA -093E..0940;N # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0941..0948;N # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -0949..094C;N # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -094D;N # Mn DEVANAGARI SIGN VIRAMA -094E..094F;N # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW -0950;N # Lo DEVANAGARI OM -0951..0957;N # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE -0958..0961;N # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0962..0963;N # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0964..0965;N # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA -0966..096F;N # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE -0970;N # Po DEVANAGARI ABBREVIATION SIGN -0971;N # Lm DEVANAGARI SIGN HIGH SPACING DOT -0972..097F;N # Lo [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA -0980;N # Lo BENGALI ANJI -0981;N # Mn BENGALI SIGN CANDRABINDU -0982..0983;N # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -0985..098C;N # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990;N # Lo [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8;N # Lo [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0;N # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2;N # Lo BENGALI LETTER LA -09B6..09B9;N # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BC;N # Mn BENGALI SIGN NUKTA -09BD;N # Lo BENGALI SIGN AVAGRAHA -09BE..09C0;N # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II -09C1..09C4;N # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09C7..09C8;N # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC;N # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -09CD;N # Mn BENGALI SIGN VIRAMA -09CE;N # Lo BENGALI LETTER KHANDA TA -09D7;N # Mc BENGALI AU LENGTH MARK -09DC..09DD;N # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1;N # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09E2..09E3;N # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -09E6..09EF;N # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE -09F0..09F1;N # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL -09F2..09F3;N # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN -09F4..09F9;N # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN -09FA;N # So BENGALI ISSHAR -09FB;N # Sc BENGALI GANDA MARK -09FC;N # Lo BENGALI LETTER VEDIC ANUSVARA -09FD;N # Po BENGALI ABBREVIATION SIGN -09FE;N # Mn BENGALI SANDHI MARK -0A01..0A02;N # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI -0A03;N # Mc GURMUKHI SIGN VISARGA -0A05..0A0A;N # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10;N # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28;N # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30;N # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33;N # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36;N # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39;N # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A3C;N # Mn GURMUKHI SIGN NUKTA -0A3E..0A40;N # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A41..0A42;N # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48;N # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4D;N # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA -0A51;N # Mn GURMUKHI SIGN UDAAT -0A59..0A5C;N # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E;N # Lo GURMUKHI LETTER FA -0A66..0A6F;N # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE -0A70..0A71;N # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A72..0A74;N # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR -0A75;N # Mn GURMUKHI SIGN YAKASH -0A76;N # Po GURMUKHI ABBREVIATION SIGN -0A81..0A82;N # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0A83;N # Mc GUJARATI SIGN VISARGA -0A85..0A8D;N # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91;N # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8;N # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0;N # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3;N # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9;N # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABC;N # Mn GUJARATI SIGN NUKTA -0ABD;N # Lo GUJARATI SIGN AVAGRAHA -0ABE..0AC0;N # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC1..0AC5;N # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8;N # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0AC9;N # Mc GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC;N # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0ACD;N # Mn GUJARATI SIGN VIRAMA -0AD0;N # Lo GUJARATI OM -0AE0..0AE1;N # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0AE2..0AE3;N # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0AE6..0AEF;N # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE -0AF0;N # Po GUJARATI ABBREVIATION SIGN -0AF1;N # Sc GUJARATI RUPEE SIGN -0AF9;N # Lo GUJARATI LETTER ZHA -0AFA..0AFF;N # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE -0B01;N # Mn ORIYA SIGN CANDRABINDU -0B02..0B03;N # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B05..0B0C;N # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10;N # Lo [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28;N # Lo [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30;N # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33;N # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39;N # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3C;N # Mn ORIYA SIGN NUKTA -0B3D;N # Lo ORIYA SIGN AVAGRAHA -0B3E;N # Mc ORIYA VOWEL SIGN AA -0B3F;N # Mn ORIYA VOWEL SIGN I -0B40;N # Mc ORIYA VOWEL SIGN II -0B41..0B44;N # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR -0B47..0B48;N # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C;N # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0B4D;N # Mn ORIYA SIGN VIRAMA -0B55..0B56;N # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK -0B57;N # Mc ORIYA AU LENGTH MARK -0B5C..0B5D;N # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61;N # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B62..0B63;N # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL -0B66..0B6F;N # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE -0B70;N # So ORIYA ISSHAR -0B71;N # Lo ORIYA LETTER WA -0B72..0B77;N # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS -0B82;N # Mn TAMIL SIGN ANUSVARA -0B83;N # Lo TAMIL SIGN VISARGA -0B85..0B8A;N # Lo [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90;N # Lo [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95;N # Lo [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A;N # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C;N # Lo TAMIL LETTER JA -0B9E..0B9F;N # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4;N # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA;N # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB9;N # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA -0BBE..0BBF;N # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I -0BC0;N # Mn TAMIL VOWEL SIGN II -0BC1..0BC2;N # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8;N # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC;N # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0BCD;N # Mn TAMIL SIGN VIRAMA -0BD0;N # Lo TAMIL OM -0BD7;N # Mc TAMIL AU LENGTH MARK -0BE6..0BEF;N # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE -0BF0..0BF2;N # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND -0BF3..0BF8;N # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN -0BF9;N # Sc TAMIL RUPEE SIGN -0BFA;N # So TAMIL NUMBER SIGN -0C00;N # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE -0C01..0C03;N # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C04;N # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE -0C05..0C0C;N # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10;N # Lo [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28;N # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C39;N # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA -0C3C;N # Mn TELUGU SIGN NUKTA -0C3D;N # Lo TELUGU SIGN AVAGRAHA -0C3E..0C40;N # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C41..0C44;N # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C46..0C48;N # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4D;N # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -0C55..0C56;N # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C58..0C5A;N # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA -0C5D;N # Lo TELUGU LETTER NAKAARA POLLU -0C60..0C61;N # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C62..0C63;N # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL -0C66..0C6F;N # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE -0C77;N # Po TELUGU SIGN SIDDHAM -0C78..0C7E;N # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR -0C7F;N # So TELUGU SIGN TUUMU -0C80;N # Lo KANNADA SIGN SPACING CANDRABINDU -0C81;N # Mn KANNADA SIGN CANDRABINDU -0C82..0C83;N # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0C84;N # Po KANNADA SIGN SIDDHAM -0C85..0C8C;N # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90;N # Lo [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8;N # Lo [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3;N # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9;N # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBC;N # Mn KANNADA SIGN NUKTA -0CBD;N # Lo KANNADA SIGN AVAGRAHA -0CBE;N # Mc KANNADA VOWEL SIGN AA -0CBF;N # Mn KANNADA VOWEL SIGN I -0CC0..0CC4;N # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR -0CC6;N # Mn KANNADA VOWEL SIGN E -0CC7..0CC8;N # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB;N # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0CCC..0CCD;N # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA -0CD5..0CD6;N # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CDD..0CDE;N # Lo [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA -0CE0..0CE1;N # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0CE2..0CE3;N # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0CE6..0CEF;N # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE -0CF1..0CF2;N # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA -0CF3;N # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT -0D00..0D01;N # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU -0D02..0D03;N # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D04..0D0C;N # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L -0D0E..0D10;N # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D3A;N # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA -0D3B..0D3C;N # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA -0D3D;N # Lo MALAYALAM SIGN AVAGRAHA -0D3E..0D40;N # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II -0D41..0D44;N # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR -0D46..0D48;N # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C;N # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D4D;N # Mn MALAYALAM SIGN VIRAMA -0D4E;N # Lo MALAYALAM LETTER DOT REPH -0D4F;N # So MALAYALAM SIGN PARA -0D54..0D56;N # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL -0D57;N # Mc MALAYALAM AU LENGTH MARK -0D58..0D5E;N # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH -0D5F..0D61;N # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL -0D62..0D63;N # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL -0D66..0D6F;N # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D70..0D78;N # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS -0D79;N # So MALAYALAM DATE MARK -0D7A..0D7F;N # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K -0D81;N # Mn SINHALA SIGN CANDRABINDU -0D82..0D83;N # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0D85..0D96;N # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1;N # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB;N # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD;N # Lo SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6;N # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0DCA;N # Mn SINHALA SIGN AL-LAKUNA -0DCF..0DD1;N # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD2..0DD4;N # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6;N # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA -0DD8..0DDF;N # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA -0DE6..0DEF;N # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE -0DF2..0DF3;N # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0DF4;N # Po SINHALA PUNCTUATION KUNDDALIYA -0E01..0E30;N # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E31;N # Mn THAI CHARACTER MAI HAN-AKAT -0E32..0E33;N # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E34..0E3A;N # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E3F;N # Sc THAI CURRENCY SYMBOL BAHT -0E40..0E45;N # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E46;N # Lm THAI CHARACTER MAIYAMOK -0E47..0E4E;N # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN -0E4F;N # Po THAI CHARACTER FONGMAN -0E50..0E59;N # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE -0E5A..0E5B;N # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT -0E81..0E82;N # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84;N # Lo LAO LETTER KHO TAM -0E86..0E8A;N # Lo [5] LAO LETTER PALI GHA..LAO LETTER SO TAM -0E8C..0EA3;N # Lo [24] LAO LETTER PALI JHA..LAO LETTER LO LING -0EA5;N # Lo LAO LETTER LO LOOT -0EA7..0EB0;N # Lo [10] LAO LETTER WO..LAO VOWEL SIGN A -0EB1;N # Mn LAO VOWEL SIGN MAI KAN -0EB2..0EB3;N # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EB4..0EBC;N # Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO -0EBD;N # Lo LAO SEMIVOWEL SIGN NYO -0EC0..0EC4;N # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC6;N # Lm LAO KO LA -0EC8..0ECE;N # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN -0ED0..0ED9;N # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE -0EDC..0EDF;N # Lo [4] LAO HO NO..LAO LETTER KHMU NYO -0F00;N # Lo TIBETAN SYLLABLE OM -0F01..0F03;N # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA -0F04..0F12;N # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD -0F13;N # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN -0F14;N # Po TIBETAN MARK GTER TSHEG -0F15..0F17;N # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS -0F18..0F19;N # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F1A..0F1F;N # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG -0F20..0F29;N # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE -0F2A..0F33;N # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO -0F34;N # So TIBETAN MARK BSDUS RTAGS -0F35;N # Mn TIBETAN MARK NGAS BZUNG NYI ZLA -0F36;N # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN -0F37;N # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F38;N # So TIBETAN MARK CHE MGO -0F39;N # Mn TIBETAN MARK TSA -PHRU -0F3A;N # Ps TIBETAN MARK GUG RTAGS GYON -0F3B;N # Pe TIBETAN MARK GUG RTAGS GYAS -0F3C;N # Ps TIBETAN MARK ANG KHANG GYON -0F3D;N # Pe TIBETAN MARK ANG KHANG GYAS -0F3E..0F3F;N # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES -0F40..0F47;N # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6C;N # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA -0F71..0F7E;N # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -0F7F;N # Mc TIBETAN SIGN RNAM BCAD -0F80..0F84;N # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA -0F85;N # Po TIBETAN MARK PALUTA -0F86..0F87;N # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -0F88..0F8C;N # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN -0F8D..0F97;N # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA -0F99..0FBC;N # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FBE..0FC5;N # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE -0FC6;N # Mn TIBETAN SYMBOL PADMA GDAN -0FC7..0FCC;N # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL -0FCE..0FCF;N # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM -0FD0..0FD4;N # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA -0FD5..0FD8;N # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS -0FD9..0FDA;N # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS -1000..102A;N # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU -102B..102C;N # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA -102D..1030;N # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1031;N # Mc MYANMAR VOWEL SIGN E -1032..1037;N # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW -1038;N # Mc MYANMAR SIGN VISARGA -1039..103A;N # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT -103B..103C;N # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA -103D..103E;N # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA -103F;N # Lo MYANMAR LETTER GREAT SA -1040..1049;N # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE -104A..104F;N # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE -1050..1055;N # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -1056..1057;N # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -1058..1059;N # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -105A..105D;N # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE -105E..1060;N # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA -1061;N # Lo MYANMAR LETTER SGAW KAREN SHA -1062..1064;N # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO -1065..1066;N # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA -1067..106D;N # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 -106E..1070;N # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA -1071..1074;N # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE -1075..1081;N # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA -1082;N # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA -1083..1084;N # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E -1085..1086;N # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y -1087..108C;N # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 -108D;N # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE -108E;N # Lo MYANMAR LETTER RUMAI PALAUNG FA -108F;N # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 -1090..1099;N # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE -109A..109C;N # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A -109D;N # Mn MYANMAR VOWEL SIGN AITON AI -109E..109F;N # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION -10A0..10C5;N # Lu [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10C7;N # Lu GEORGIAN CAPITAL LETTER YN -10CD;N # Lu GEORGIAN CAPITAL LETTER AEN -10D0..10FA;N # Ll [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN -10FB;N # Po GEORGIAN PARAGRAPH SEPARATOR -10FC;N # Lm MODIFIER LETTER GEORGIAN NAR -10FD..10FF;N # Ll [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN -1100..115F;W # Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER -1160..11FF;N # Lo [160] HANGUL JUNGSEONG FILLER..HANGUL JONGSEONG SSANGNIEUN -1200..1248;N # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA -124A..124D;N # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256;N # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258;N # Lo ETHIOPIC SYLLABLE QHWA -125A..125D;N # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1288;N # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA -128A..128D;N # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12B0;N # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA -12B2..12B5;N # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE;N # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0;N # Lo ETHIOPIC SYLLABLE KXWA -12C2..12C5;N # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12D6;N # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..1310;N # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA -1312..1315;N # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..135A;N # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA -135D..135F;N # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK -1360..1368;N # Po [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR -1369..137C;N # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND -1380..138F;N # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE -1390..1399;N # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT -13A0..13F5;N # Lu [86] CHEROKEE LETTER A..CHEROKEE LETTER MV -13F8..13FD;N # Ll [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV -1400;N # Pd CANADIAN SYLLABICS HYPHEN -1401..166C;N # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166D;N # So CANADIAN SYLLABICS CHI SIGN -166E;N # Po CANADIAN SYLLABICS FULL STOP -166F..167F;N # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W -1680;N # Zs OGHAM SPACE MARK -1681..169A;N # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH -169B;N # Ps OGHAM FEATHER MARK -169C;N # Pe OGHAM REVERSED FEATHER MARK -16A0..16EA;N # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EB..16ED;N # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION -16EE..16F0;N # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL -16F1..16F8;N # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC -1700..1711;N # Lo [18] TAGALOG LETTER A..TAGALOG LETTER HA -1712..1714;N # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA -1715;N # Mc TAGALOG SIGN PAMUDPOD -171F;N # Lo TAGALOG LETTER ARCHAIC RA -1720..1731;N # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1732..1733;N # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U -1734;N # Mc HANUNOO SIGN PAMUDPOD -1735..1736;N # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION -1740..1751;N # Lo [18] BUHID LETTER A..BUHID LETTER HA -1752..1753;N # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U -1760..176C;N # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770;N # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1772..1773;N # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U -1780..17B3;N # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17B4..17B5;N # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA -17B6;N # Mc KHMER VOWEL SIGN AA -17B7..17BD;N # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17BE..17C5;N # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C6;N # Mn KHMER SIGN NIKAHIT -17C7..17C8;N # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -17C9..17D3;N # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT -17D4..17D6;N # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH -17D7;N # Lm KHMER SIGN LEK TOO -17D8..17DA;N # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT -17DB;N # Sc KHMER CURRENCY SYMBOL RIEL -17DC;N # Lo KHMER SIGN AVAKRAHASANYA -17DD;N # Mn KHMER SIGN ATTHACAN -17E0..17E9;N # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE -17F0..17F9;N # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON -1800..1805;N # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS -1806;N # Pd MONGOLIAN TODO SOFT HYPHEN -1807..180A;N # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU -180B..180D;N # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -180E;N # Cf MONGOLIAN VOWEL SEPARATOR -180F;N # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR -1810..1819;N # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE -1820..1842;N # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1843;N # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN -1844..1878;N # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS -1880..1884;N # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA -1885..1886;N # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA -1887..18A8;N # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA -18A9;N # Mn MONGOLIAN LETTER ALI GALI DAGALGA -18AA;N # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA -18B0..18F5;N # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S -1900..191E;N # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA -1920..1922;N # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1923..1926;N # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1927..1928;N # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1929..192B;N # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931;N # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1932;N # Mn LIMBU SMALL LETTER ANUSVARA -1933..1938;N # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -1939..193B;N # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I -1940;N # So LIMBU SIGN LOO -1944..1945;N # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK -1946..194F;N # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE -1950..196D;N # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974;N # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 -1980..19AB;N # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA -19B0..19C9;N # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 -19D0..19D9;N # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE -19DA;N # No NEW TAI LUE THAM DIGIT ONE -19DE..19DF;N # So [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV -19E0..19FF;N # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC -1A00..1A16;N # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA -1A17..1A18;N # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U -1A19..1A1A;N # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O -1A1B;N # Mn BUGINESE VOWEL SIGN AE -1A1E..1A1F;N # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION -1A20..1A54;N # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA -1A55;N # Mc TAI THAM CONSONANT SIGN MEDIAL RA -1A56;N # Mn TAI THAM CONSONANT SIGN MEDIAL LA -1A57;N # Mc TAI THAM CONSONANT SIGN LA TANG LAI -1A58..1A5E;N # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA -1A60;N # Mn TAI THAM SIGN SAKOT -1A61;N # Mc TAI THAM VOWEL SIGN A -1A62;N # Mn TAI THAM VOWEL SIGN MAI SAT -1A63..1A64;N # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA -1A65..1A6C;N # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW -1A6D..1A72;N # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI -1A73..1A7C;N # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN -1A7F;N # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT -1A80..1A89;N # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE -1A90..1A99;N # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE -1AA0..1AA6;N # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA -1AA7;N # Lm TAI THAM SIGN MAI YAMOK -1AA8..1AAD;N # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG -1AB0..1ABD;N # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW -1ABE;N # Me COMBINING PARENTHESES OVERLAY -1ABF..1ACE;N # Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T -1B00..1B03;N # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG -1B04;N # Mc BALINESE SIGN BISAH -1B05..1B33;N # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA -1B34;N # Mn BALINESE SIGN REREKAN -1B35;N # Mc BALINESE VOWEL SIGN TEDUNG -1B36..1B3A;N # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA -1B3B;N # Mc BALINESE VOWEL SIGN RA REPA TEDUNG -1B3C;N # Mn BALINESE VOWEL SIGN LA LENGA -1B3D..1B41;N # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG -1B42;N # Mn BALINESE VOWEL SIGN PEPET -1B43..1B44;N # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG -1B45..1B4C;N # Lo [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA -1B50..1B59;N # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE -1B5A..1B60;N # Po [7] BALINESE PANTI..BALINESE PAMENENG -1B61..1B6A;N # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE -1B6B..1B73;N # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG -1B74..1B7C;N # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING -1B7D..1B7E;N # Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG -1B80..1B81;N # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR -1B82;N # Mc SUNDANESE SIGN PANGWISAD -1B83..1BA0;N # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA -1BA1;N # Mc SUNDANESE CONSONANT SIGN PAMINGKAL -1BA2..1BA5;N # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU -1BA6..1BA7;N # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG -1BA8..1BA9;N # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG -1BAA;N # Mc SUNDANESE SIGN PAMAAEH -1BAB..1BAD;N # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA -1BAE..1BAF;N # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA -1BB0..1BB9;N # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE -1BBA..1BBF;N # Lo [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M -1BC0..1BE5;N # Lo [38] BATAK LETTER A..BATAK LETTER U -1BE6;N # Mn BATAK SIGN TOMPI -1BE7;N # Mc BATAK VOWEL SIGN E -1BE8..1BE9;N # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE -1BEA..1BEC;N # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O -1BED;N # Mn BATAK VOWEL SIGN KARO O -1BEE;N # Mc BATAK VOWEL SIGN U -1BEF..1BF1;N # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H -1BF2..1BF3;N # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN -1BFC..1BFF;N # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT -1C00..1C23;N # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A -1C24..1C2B;N # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU -1C2C..1C33;N # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T -1C34..1C35;N # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG -1C36..1C37;N # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA -1C3B..1C3F;N # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK -1C40..1C49;N # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE -1C4D..1C4F;N # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA -1C50..1C59;N # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE -1C5A..1C77;N # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH -1C78..1C7D;N # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD -1C7E..1C7F;N # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD -1C80..1C88;N # Ll [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK -1C90..1CBA;N # Lu [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN -1CBD..1CBF;N # Lu [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN -1CC0..1CC7;N # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA -1CD0..1CD2;N # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA -1CD3;N # Po VEDIC SIGN NIHSHVASA -1CD4..1CE0;N # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA -1CE1;N # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA -1CE2..1CE8;N # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL -1CE9..1CEC;N # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL -1CED;N # Mn VEDIC SIGN TIRYAK -1CEE..1CF3;N # Lo [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA -1CF4;N # Mn VEDIC TONE CANDRA ABOVE -1CF5..1CF6;N # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA -1CF7;N # Mc VEDIC SIGN ATIKRAMA -1CF8..1CF9;N # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE -1CFA;N # Lo VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA -1D00..1D2B;N # Ll [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL -1D2C..1D6A;N # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI -1D6B..1D77;N # Ll [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G -1D78;N # Lm MODIFIER LETTER CYRILLIC EN -1D79..1D7F;N # Ll [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE -1D80..1D9A;N # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK -1D9B..1DBF;N # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA -1DC0..1DFF;N # Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW -1E00..1EFF;N # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP -1F00..1F15;N # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F18..1F1D;N # Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F45;N # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F48..1F4D;N # Lu [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57;N # Ll [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F59;N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B;N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D;N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F..1F7D;N # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1FB4;N # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FBC;N # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBD;N # Sk GREEK KORONIS -1FBE;N # Ll GREEK PROSGEGRAMMENI -1FBF..1FC1;N # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI -1FC2..1FC4;N # Ll [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FCC;N # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FCD..1FCF;N # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI -1FD0..1FD3;N # Ll [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FDB;N # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA -1FDD..1FDF;N # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI -1FE0..1FEC;N # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FED..1FEF;N # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA -1FF2..1FF4;N # Ll [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FFC;N # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -1FFD..1FFE;N # Sk [2] GREEK OXIA..GREEK DASIA -2000..200A;N # Zs [11] EN QUAD..HAIR SPACE -200B..200F;N # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK -2010;A # Pd HYPHEN -2011..2012;N # Pd [2] NON-BREAKING HYPHEN..FIGURE DASH -2013..2015;A # Pd [3] EN DASH..HORIZONTAL BAR -2016;A # Po DOUBLE VERTICAL LINE -2017;N # Po DOUBLE LOW LINE -2018;A # Pi LEFT SINGLE QUOTATION MARK -2019;A # Pf RIGHT SINGLE QUOTATION MARK -201A;N # Ps SINGLE LOW-9 QUOTATION MARK -201B;N # Pi SINGLE HIGH-REVERSED-9 QUOTATION MARK -201C;A # Pi LEFT DOUBLE QUOTATION MARK -201D;A # Pf RIGHT DOUBLE QUOTATION MARK -201E;N # Ps DOUBLE LOW-9 QUOTATION MARK -201F;N # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK -2020..2022;A # Po [3] DAGGER..BULLET -2023;N # Po TRIANGULAR BULLET -2024..2027;A # Po [4] ONE DOT LEADER..HYPHENATION POINT -2028;N # Zl LINE SEPARATOR -2029;N # Zp PARAGRAPH SEPARATOR -202A..202E;N # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE -202F;N # Zs NARROW NO-BREAK SPACE -2030;A # Po PER MILLE SIGN -2031;N # Po PER TEN THOUSAND SIGN -2032..2033;A # Po [2] PRIME..DOUBLE PRIME -2034;N # Po TRIPLE PRIME -2035;A # Po REVERSED PRIME -2036..2038;N # Po [3] REVERSED DOUBLE PRIME..CARET -2039;N # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK -203A;N # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -203B;A # Po REFERENCE MARK -203C..203D;N # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG -203E;A # Po OVERLINE -203F..2040;N # Pc [2] UNDERTIE..CHARACTER TIE -2041..2043;N # Po [3] CARET INSERTION POINT..HYPHEN BULLET -2044;N # Sm FRACTION SLASH -2045;N # Ps LEFT SQUARE BRACKET WITH QUILL -2046;N # Pe RIGHT SQUARE BRACKET WITH QUILL -2047..2051;N # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY -2052;N # Sm COMMERCIAL MINUS SIGN -2053;N # Po SWUNG DASH -2054;N # Pc INVERTED UNDERTIE -2055..205E;N # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS -205F;N # Zs MEDIUM MATHEMATICAL SPACE -2060..2064;N # Cf [5] WORD JOINER..INVISIBLE PLUS -2066..206F;N # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES -2070;N # No SUPERSCRIPT ZERO -2071;N # Lm SUPERSCRIPT LATIN SMALL LETTER I -2074;A # No SUPERSCRIPT FOUR -2075..2079;N # No [5] SUPERSCRIPT FIVE..SUPERSCRIPT NINE -207A..207C;N # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN -207D;N # Ps SUPERSCRIPT LEFT PARENTHESIS -207E;N # Pe SUPERSCRIPT RIGHT PARENTHESIS -207F;A # Lm SUPERSCRIPT LATIN SMALL LETTER N -2080;N # No SUBSCRIPT ZERO -2081..2084;A # No [4] SUBSCRIPT ONE..SUBSCRIPT FOUR -2085..2089;N # No [5] SUBSCRIPT FIVE..SUBSCRIPT NINE -208A..208C;N # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN -208D;N # Ps SUBSCRIPT LEFT PARENTHESIS -208E;N # Pe SUBSCRIPT RIGHT PARENTHESIS -2090..209C;N # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T -20A0..20A8;N # Sc [9] EURO-CURRENCY SIGN..RUPEE SIGN -20A9;H # Sc WON SIGN -20AA..20AB;N # Sc [2] NEW SHEQEL SIGN..DONG SIGN -20AC;A # Sc EURO SIGN -20AD..20C0;N # Sc [20] KIP SIGN..SOM SIGN -20D0..20DC;N # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -20DD..20E0;N # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH -20E1;N # Mn COMBINING LEFT RIGHT ARROW ABOVE -20E2..20E4;N # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE -20E5..20F0;N # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE -2100..2101;N # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT -2102;N # Lu DOUBLE-STRUCK CAPITAL C -2103;A # So DEGREE CELSIUS -2104;N # So CENTRE LINE SYMBOL -2105;A # So CARE OF -2106;N # So CADA UNA -2107;N # Lu EULER CONSTANT -2108;N # So SCRUPLE -2109;A # So DEGREE FAHRENHEIT -210A..2112;N # L& [9] SCRIPT SMALL G..SCRIPT CAPITAL L -2113;A # Ll SCRIPT SMALL L -2114;N # So L B BAR SYMBOL -2115;N # Lu DOUBLE-STRUCK CAPITAL N -2116;A # So NUMERO SIGN -2117;N # So SOUND RECORDING COPYRIGHT -2118;N # Sm SCRIPT CAPITAL P -2119..211D;N # Lu [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -211E..2120;N # So [3] PRESCRIPTION TAKE..SERVICE MARK -2121..2122;A # So [2] TELEPHONE SIGN..TRADE MARK SIGN -2123;N # So VERSICLE -2124;N # Lu DOUBLE-STRUCK CAPITAL Z -2125;N # So OUNCE SIGN -2126;A # Lu OHM SIGN -2127;N # So INVERTED OHM SIGN -2128;N # Lu BLACK-LETTER CAPITAL Z -2129;N # So TURNED GREEK SMALL LETTER IOTA -212A;N # Lu KELVIN SIGN -212B;A # Lu ANGSTROM SIGN -212C..212D;N # Lu [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C -212E;N # So ESTIMATED SYMBOL -212F..2134;N # L& [6] SCRIPT SMALL E..SCRIPT SMALL O -2135..2138;N # Lo [4] ALEF SYMBOL..DALET SYMBOL -2139;N # Ll INFORMATION SOURCE -213A..213B;N # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN -213C..213F;N # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI -2140..2144;N # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y -2145..2149;N # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J -214A;N # So PROPERTY LINE -214B;N # Sm TURNED AMPERSAND -214C..214D;N # So [2] PER SIGN..AKTIESELSKAB -214E;N # Ll TURNED SMALL F -214F;N # So SYMBOL FOR SAMARITAN SOURCE -2150..2152;N # No [3] VULGAR FRACTION ONE SEVENTH..VULGAR FRACTION ONE TENTH -2153..2154;A # No [2] VULGAR FRACTION ONE THIRD..VULGAR FRACTION TWO THIRDS -2155..215A;N # No [6] VULGAR FRACTION ONE FIFTH..VULGAR FRACTION FIVE SIXTHS -215B..215E;A # No [4] VULGAR FRACTION ONE EIGHTH..VULGAR FRACTION SEVEN EIGHTHS -215F;N # No FRACTION NUMERATOR ONE -2160..216B;A # Nl [12] ROMAN NUMERAL ONE..ROMAN NUMERAL TWELVE -216C..216F;N # Nl [4] ROMAN NUMERAL FIFTY..ROMAN NUMERAL ONE THOUSAND -2170..2179;A # Nl [10] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL TEN -217A..2182;N # Nl [9] SMALL ROMAN NUMERAL ELEVEN..ROMAN NUMERAL TEN THOUSAND -2183..2184;N # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C -2185..2188;N # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND -2189;A # No VULGAR FRACTION ZERO THIRDS -218A..218B;N # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE -2190..2194;A # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW -2195..2199;A # So [5] UP DOWN ARROW..SOUTH WEST ARROW -219A..219B;N # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE -219C..219F;N # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW -21A0;N # Sm RIGHTWARDS TWO HEADED ARROW -21A1..21A2;N # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL -21A3;N # Sm RIGHTWARDS ARROW WITH TAIL -21A4..21A5;N # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR -21A6;N # Sm RIGHTWARDS ARROW FROM BAR -21A7..21AD;N # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW -21AE;N # Sm LEFT RIGHT ARROW WITH STROKE -21AF..21B7;N # So [9] DOWNWARDS ZIGZAG ARROW..CLOCKWISE TOP SEMICIRCLE ARROW -21B8..21B9;A # So [2] NORTH WEST ARROW TO LONG BAR..LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR -21BA..21CD;N # So [20] ANTICLOCKWISE OPEN CIRCLE ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE -21CE..21CF;N # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE -21D0..21D1;N # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW -21D2;A # Sm RIGHTWARDS DOUBLE ARROW -21D3;N # So DOWNWARDS DOUBLE ARROW -21D4;A # Sm LEFT RIGHT DOUBLE ARROW -21D5..21E6;N # So [18] UP DOWN DOUBLE ARROW..LEFTWARDS WHITE ARROW -21E7;A # So UPWARDS WHITE ARROW -21E8..21F3;N # So [12] RIGHTWARDS WHITE ARROW..UP DOWN WHITE ARROW -21F4..21FF;N # Sm [12] RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW -2200;A # Sm FOR ALL -2201;N # Sm COMPLEMENT -2202..2203;A # Sm [2] PARTIAL DIFFERENTIAL..THERE EXISTS -2204..2206;N # Sm [3] THERE DOES NOT EXIST..INCREMENT -2207..2208;A # Sm [2] NABLA..ELEMENT OF -2209..220A;N # Sm [2] NOT AN ELEMENT OF..SMALL ELEMENT OF -220B;A # Sm CONTAINS AS MEMBER -220C..220E;N # Sm [3] DOES NOT CONTAIN AS MEMBER..END OF PROOF -220F;A # Sm N-ARY PRODUCT -2210;N # Sm N-ARY COPRODUCT -2211;A # Sm N-ARY SUMMATION -2212..2214;N # Sm [3] MINUS SIGN..DOT PLUS -2215;A # Sm DIVISION SLASH -2216..2219;N # Sm [4] SET MINUS..BULLET OPERATOR -221A;A # Sm SQUARE ROOT -221B..221C;N # Sm [2] CUBE ROOT..FOURTH ROOT -221D..2220;A # Sm [4] PROPORTIONAL TO..ANGLE -2221..2222;N # Sm [2] MEASURED ANGLE..SPHERICAL ANGLE -2223;A # Sm DIVIDES -2224;N # Sm DOES NOT DIVIDE -2225;A # Sm PARALLEL TO -2226;N # Sm NOT PARALLEL TO -2227..222C;A # Sm [6] LOGICAL AND..DOUBLE INTEGRAL -222D;N # Sm TRIPLE INTEGRAL -222E;A # Sm CONTOUR INTEGRAL -222F..2233;N # Sm [5] SURFACE INTEGRAL..ANTICLOCKWISE CONTOUR INTEGRAL -2234..2237;A # Sm [4] THEREFORE..PROPORTION -2238..223B;N # Sm [4] DOT MINUS..HOMOTHETIC -223C..223D;A # Sm [2] TILDE OPERATOR..REVERSED TILDE -223E..2247;N # Sm [10] INVERTED LAZY S..NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO -2248;A # Sm ALMOST EQUAL TO -2249..224B;N # Sm [3] NOT ALMOST EQUAL TO..TRIPLE TILDE -224C;A # Sm ALL EQUAL TO -224D..2251;N # Sm [5] EQUIVALENT TO..GEOMETRICALLY EQUAL TO -2252;A # Sm APPROXIMATELY EQUAL TO OR THE IMAGE OF -2253..225F;N # Sm [13] IMAGE OF OR APPROXIMATELY EQUAL TO..QUESTIONED EQUAL TO -2260..2261;A # Sm [2] NOT EQUAL TO..IDENTICAL TO -2262..2263;N # Sm [2] NOT IDENTICAL TO..STRICTLY EQUIVALENT TO -2264..2267;A # Sm [4] LESS-THAN OR EQUAL TO..GREATER-THAN OVER EQUAL TO -2268..2269;N # Sm [2] LESS-THAN BUT NOT EQUAL TO..GREATER-THAN BUT NOT EQUAL TO -226A..226B;A # Sm [2] MUCH LESS-THAN..MUCH GREATER-THAN -226C..226D;N # Sm [2] BETWEEN..NOT EQUIVALENT TO -226E..226F;A # Sm [2] NOT LESS-THAN..NOT GREATER-THAN -2270..2281;N # Sm [18] NEITHER LESS-THAN NOR EQUAL TO..DOES NOT SUCCEED -2282..2283;A # Sm [2] SUBSET OF..SUPERSET OF -2284..2285;N # Sm [2] NOT A SUBSET OF..NOT A SUPERSET OF -2286..2287;A # Sm [2] SUBSET OF OR EQUAL TO..SUPERSET OF OR EQUAL TO -2288..2294;N # Sm [13] NEITHER A SUBSET OF NOR EQUAL TO..SQUARE CUP -2295;A # Sm CIRCLED PLUS -2296..2298;N # Sm [3] CIRCLED MINUS..CIRCLED DIVISION SLASH -2299;A # Sm CIRCLED DOT OPERATOR -229A..22A4;N # Sm [11] CIRCLED RING OPERATOR..DOWN TACK -22A5;A # Sm UP TACK -22A6..22BE;N # Sm [25] ASSERTION..RIGHT ANGLE WITH ARC -22BF;A # Sm RIGHT TRIANGLE -22C0..22FF;N # Sm [64] N-ARY LOGICAL AND..Z NOTATION BAG MEMBERSHIP -2300..2307;N # So [8] DIAMETER SIGN..WAVY LINE -2308;N # Ps LEFT CEILING -2309;N # Pe RIGHT CEILING -230A;N # Ps LEFT FLOOR -230B;N # Pe RIGHT FLOOR -230C..2311;N # So [6] BOTTOM RIGHT CROP..SQUARE LOZENGE -2312;A # So ARC -2313..2319;N # So [7] SEGMENT..TURNED NOT SIGN -231A..231B;W # So [2] WATCH..HOURGLASS -231C..231F;N # So [4] TOP LEFT CORNER..BOTTOM RIGHT CORNER -2320..2321;N # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL -2322..2328;N # So [7] FROWN..KEYBOARD -2329;W # Ps LEFT-POINTING ANGLE BRACKET -232A;W # Pe RIGHT-POINTING ANGLE BRACKET -232B..237B;N # So [81] ERASE TO THE LEFT..NOT CHECK MARK -237C;N # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW -237D..239A;N # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL -239B..23B3;N # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM -23B4..23DB;N # So [40] TOP SQUARE BRACKET..FUSE -23DC..23E1;N # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -23E2..23E8;N # So [7] WHITE TRAPEZIUM..DECIMAL EXPONENT SYMBOL -23E9..23EC;W # So [4] BLACK RIGHT-POINTING DOUBLE TRIANGLE..BLACK DOWN-POINTING DOUBLE TRIANGLE -23ED..23EF;N # So [3] BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR..BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR -23F0;W # So ALARM CLOCK -23F1..23F2;N # So [2] STOPWATCH..TIMER CLOCK -23F3;W # So HOURGLASS WITH FLOWING SAND -23F4..23FF;N # So [12] BLACK MEDIUM LEFT-POINTING TRIANGLE..OBSERVER EYE SYMBOL -2400..2426;N # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO -2440..244A;N # So [11] OCR HOOK..OCR DOUBLE BACKSLASH -2460..249B;A # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP -249C..24E9;A # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z -24EA;N # No CIRCLED DIGIT ZERO -24EB..24FF;A # No [21] NEGATIVE CIRCLED NUMBER ELEVEN..NEGATIVE CIRCLED DIGIT ZERO -2500..254B;A # So [76] BOX DRAWINGS LIGHT HORIZONTAL..BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL -254C..254F;N # So [4] BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL..BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL -2550..2573;A # So [36] BOX DRAWINGS DOUBLE HORIZONTAL..BOX DRAWINGS LIGHT DIAGONAL CROSS -2574..257F;N # So [12] BOX DRAWINGS LIGHT LEFT..BOX DRAWINGS HEAVY UP AND LIGHT DOWN -2580..258F;A # So [16] UPPER HALF BLOCK..LEFT ONE EIGHTH BLOCK -2590..2591;N # So [2] RIGHT HALF BLOCK..LIGHT SHADE -2592..2595;A # So [4] MEDIUM SHADE..RIGHT ONE EIGHTH BLOCK -2596..259F;N # So [10] QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT -25A0..25A1;A # So [2] BLACK SQUARE..WHITE SQUARE -25A2;N # So WHITE SQUARE WITH ROUNDED CORNERS -25A3..25A9;A # So [7] WHITE SQUARE CONTAINING BLACK SMALL SQUARE..SQUARE WITH DIAGONAL CROSSHATCH FILL -25AA..25B1;N # So [8] BLACK SMALL SQUARE..WHITE PARALLELOGRAM -25B2..25B3;A # So [2] BLACK UP-POINTING TRIANGLE..WHITE UP-POINTING TRIANGLE -25B4..25B5;N # So [2] BLACK UP-POINTING SMALL TRIANGLE..WHITE UP-POINTING SMALL TRIANGLE -25B6;A # So BLACK RIGHT-POINTING TRIANGLE -25B7;A # Sm WHITE RIGHT-POINTING TRIANGLE -25B8..25BB;N # So [4] BLACK RIGHT-POINTING SMALL TRIANGLE..WHITE RIGHT-POINTING POINTER -25BC..25BD;A # So [2] BLACK DOWN-POINTING TRIANGLE..WHITE DOWN-POINTING TRIANGLE -25BE..25BF;N # So [2] BLACK DOWN-POINTING SMALL TRIANGLE..WHITE DOWN-POINTING SMALL TRIANGLE -25C0;A # So BLACK LEFT-POINTING TRIANGLE -25C1;A # Sm WHITE LEFT-POINTING TRIANGLE -25C2..25C5;N # So [4] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE LEFT-POINTING POINTER -25C6..25C8;A # So [3] BLACK DIAMOND..WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND -25C9..25CA;N # So [2] FISHEYE..LOZENGE -25CB;A # So WHITE CIRCLE -25CC..25CD;N # So [2] DOTTED CIRCLE..CIRCLE WITH VERTICAL FILL -25CE..25D1;A # So [4] BULLSEYE..CIRCLE WITH RIGHT HALF BLACK -25D2..25E1;N # So [16] CIRCLE WITH LOWER HALF BLACK..LOWER HALF CIRCLE -25E2..25E5;A # So [4] BLACK LOWER RIGHT TRIANGLE..BLACK UPPER RIGHT TRIANGLE -25E6..25EE;N # So [9] WHITE BULLET..UP-POINTING TRIANGLE WITH RIGHT HALF BLACK -25EF;A # So LARGE CIRCLE -25F0..25F7;N # So [8] WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT -25F8..25FC;N # Sm [5] UPPER LEFT TRIANGLE..BLACK MEDIUM SQUARE -25FD..25FE;W # Sm [2] WHITE MEDIUM SMALL SQUARE..BLACK MEDIUM SMALL SQUARE -25FF;N # Sm LOWER RIGHT TRIANGLE -2600..2604;N # So [5] BLACK SUN WITH RAYS..COMET -2605..2606;A # So [2] BLACK STAR..WHITE STAR -2607..2608;N # So [2] LIGHTNING..THUNDERSTORM -2609;A # So SUN -260A..260D;N # So [4] ASCENDING NODE..OPPOSITION -260E..260F;A # So [2] BLACK TELEPHONE..WHITE TELEPHONE -2610..2613;N # So [4] BALLOT BOX..SALTIRE -2614..2615;W # So [2] UMBRELLA WITH RAIN DROPS..HOT BEVERAGE -2616..261B;N # So [6] WHITE SHOGI PIECE..BLACK RIGHT POINTING INDEX -261C;A # So WHITE LEFT POINTING INDEX -261D;N # So WHITE UP POINTING INDEX -261E;A # So WHITE RIGHT POINTING INDEX -261F..263F;N # So [33] WHITE DOWN POINTING INDEX..MERCURY -2640;A # So FEMALE SIGN -2641;N # So EARTH -2642;A # So MALE SIGN -2643..2647;N # So [5] JUPITER..PLUTO -2648..2653;W # So [12] ARIES..PISCES -2654..265F;N # So [12] WHITE CHESS KING..BLACK CHESS PAWN -2660..2661;A # So [2] BLACK SPADE SUIT..WHITE HEART SUIT -2662;N # So WHITE DIAMOND SUIT -2663..2665;A # So [3] BLACK CLUB SUIT..BLACK HEART SUIT -2666;N # So BLACK DIAMOND SUIT -2667..266A;A # So [4] WHITE CLUB SUIT..EIGHTH NOTE -266B;N # So BEAMED EIGHTH NOTES -266C..266D;A # So [2] BEAMED SIXTEENTH NOTES..MUSIC FLAT SIGN -266E;N # So MUSIC NATURAL SIGN -266F;A # Sm MUSIC SHARP SIGN -2670..267E;N # So [15] WEST SYRIAC CROSS..PERMANENT PAPER SIGN -267F;W # So WHEELCHAIR SYMBOL -2680..2692;N # So [19] DIE FACE-1..HAMMER AND PICK -2693;W # So ANCHOR -2694..269D;N # So [10] CROSSED SWORDS..OUTLINED WHITE STAR -269E..269F;A # So [2] THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT -26A0;N # So WARNING SIGN -26A1;W # So HIGH VOLTAGE SIGN -26A2..26A9;N # So [8] DOUBLED FEMALE SIGN..HORIZONTAL MALE WITH STROKE SIGN -26AA..26AB;W # So [2] MEDIUM WHITE CIRCLE..MEDIUM BLACK CIRCLE -26AC..26BC;N # So [17] MEDIUM SMALL WHITE CIRCLE..SESQUIQUADRATE -26BD..26BE;W # So [2] SOCCER BALL..BASEBALL -26BF;A # So SQUARED KEY -26C0..26C3;N # So [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING -26C4..26C5;W # So [2] SNOWMAN WITHOUT SNOW..SUN BEHIND CLOUD -26C6..26CD;A # So [8] RAIN..DISABLED CAR -26CE;W # So OPHIUCHUS -26CF..26D3;A # So [5] PICK..CHAINS -26D4;W # So NO ENTRY -26D5..26E1;A # So [13] ALTERNATE ONE-WAY LEFT WAY TRAFFIC..RESTRICTED LEFT ENTRY-2 -26E2;N # So ASTRONOMICAL SYMBOL FOR URANUS -26E3;A # So HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE -26E4..26E7;N # So [4] PENTAGRAM..INVERTED PENTAGRAM -26E8..26E9;A # So [2] BLACK CROSS ON SHIELD..SHINTO SHRINE -26EA;W # So CHURCH -26EB..26F1;A # So [7] CASTLE..UMBRELLA ON GROUND -26F2..26F3;W # So [2] FOUNTAIN..FLAG IN HOLE -26F4;A # So FERRY -26F5;W # So SAILBOAT -26F6..26F9;A # So [4] SQUARE FOUR CORNERS..PERSON WITH BALL -26FA;W # So TENT -26FB..26FC;A # So [2] JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL -26FD;W # So FUEL PUMP -26FE..26FF;A # So [2] CUP ON BLACK SQUARE..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE -2700..2704;N # So [5] BLACK SAFETY SCISSORS..WHITE SCISSORS -2705;W # So WHITE HEAVY CHECK MARK -2706..2709;N # So [4] TELEPHONE LOCATION SIGN..ENVELOPE -270A..270B;W # So [2] RAISED FIST..RAISED HAND -270C..2727;N # So [28] VICTORY HAND..WHITE FOUR POINTED STAR -2728;W # So SPARKLES -2729..273C;N # So [20] STRESS OUTLINED WHITE STAR..OPEN CENTRE TEARDROP-SPOKED ASTERISK -273D;A # So HEAVY TEARDROP-SPOKED ASTERISK -273E..274B;N # So [14] SIX PETALLED BLACK AND WHITE FLORETTE..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -274C;W # So CROSS MARK -274D;N # So SHADOWED WHITE CIRCLE -274E;W # So NEGATIVE SQUARED CROSS MARK -274F..2752;N # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE -2753..2755;W # So [3] BLACK QUESTION MARK ORNAMENT..WHITE EXCLAMATION MARK ORNAMENT -2756;N # So BLACK DIAMOND MINUS WHITE X -2757;W # So HEAVY EXCLAMATION MARK SYMBOL -2758..2767;N # So [16] LIGHT VERTICAL BAR..ROTATED FLORAL HEART BULLET -2768;N # Ps MEDIUM LEFT PARENTHESIS ORNAMENT -2769;N # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT -276A;N # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT -276B;N # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT -276C;N # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT -276D;N # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT -276E;N # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT -276F;N # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT -2770;N # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT -2771;N # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT -2772;N # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT -2773;N # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT -2774;N # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT -2775;N # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT -2776..277F;A # No [10] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED NUMBER TEN -2780..2793;N # No [20] DINGBAT CIRCLED SANS-SERIF DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN -2794;N # So HEAVY WIDE-HEADED RIGHTWARDS ARROW -2795..2797;W # So [3] HEAVY PLUS SIGN..HEAVY DIVISION SIGN -2798..27AF;N # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27B0;W # So CURLY LOOP -27B1..27BE;N # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW -27BF;W # So DOUBLE CURLY LOOP -27C0..27C4;N # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET -27C5;N # Ps LEFT S-SHAPED BAG DELIMITER -27C6;N # Pe RIGHT S-SHAPED BAG DELIMITER -27C7..27E5;N # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK -27E6;Na # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET -27E7;Na # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET -27E8;Na # Ps MATHEMATICAL LEFT ANGLE BRACKET -27E9;Na # Pe MATHEMATICAL RIGHT ANGLE BRACKET -27EA;Na # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET -27EB;Na # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET -27EC;Na # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET -27ED;Na # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET -27EE;N # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS -27EF;N # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS -27F0..27FF;N # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW -2800..28FF;N # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 -2900..297F;N # Sm [128] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..DOWN FISH TAIL -2980..2982;N # Sm [3] TRIPLE VERTICAL BAR DELIMITER..Z NOTATION TYPE COLON -2983;N # Ps LEFT WHITE CURLY BRACKET -2984;N # Pe RIGHT WHITE CURLY BRACKET -2985;Na # Ps LEFT WHITE PARENTHESIS -2986;Na # Pe RIGHT WHITE PARENTHESIS -2987;N # Ps Z NOTATION LEFT IMAGE BRACKET -2988;N # Pe Z NOTATION RIGHT IMAGE BRACKET -2989;N # Ps Z NOTATION LEFT BINDING BRACKET -298A;N # Pe Z NOTATION RIGHT BINDING BRACKET -298B;N # Ps LEFT SQUARE BRACKET WITH UNDERBAR -298C;N # Pe RIGHT SQUARE BRACKET WITH UNDERBAR -298D;N # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER -298E;N # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -298F;N # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -2990;N # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER -2991;N # Ps LEFT ANGLE BRACKET WITH DOT -2992;N # Pe RIGHT ANGLE BRACKET WITH DOT -2993;N # Ps LEFT ARC LESS-THAN BRACKET -2994;N # Pe RIGHT ARC GREATER-THAN BRACKET -2995;N # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET -2996;N # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET -2997;N # Ps LEFT BLACK TORTOISE SHELL BRACKET -2998;N # Pe RIGHT BLACK TORTOISE SHELL BRACKET -2999..29D7;N # Sm [63] DOTTED FENCE..BLACK HOURGLASS -29D8;N # Ps LEFT WIGGLY FENCE -29D9;N # Pe RIGHT WIGGLY FENCE -29DA;N # Ps LEFT DOUBLE WIGGLY FENCE -29DB;N # Pe RIGHT DOUBLE WIGGLY FENCE -29DC..29FB;N # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS -29FC;N # Ps LEFT-POINTING CURVED ANGLE BRACKET -29FD;N # Pe RIGHT-POINTING CURVED ANGLE BRACKET -29FE..29FF;N # Sm [2] TINY..MINY -2A00..2AFF;N # Sm [256] N-ARY CIRCLED DOT OPERATOR..N-ARY WHITE VERTICAL BAR -2B00..2B1A;N # So [27] NORTH EAST WHITE ARROW..DOTTED SQUARE -2B1B..2B1C;W # So [2] BLACK LARGE SQUARE..WHITE LARGE SQUARE -2B1D..2B2F;N # So [19] BLACK VERY SMALL SQUARE..WHITE VERTICAL ELLIPSE -2B30..2B44;N # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET -2B45..2B46;N # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW -2B47..2B4C;N # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -2B4D..2B4F;N # So [3] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..SHORT BACKSLANTED SOUTH ARROW -2B50;W # So WHITE MEDIUM STAR -2B51..2B54;N # So [4] BLACK SMALL STAR..WHITE RIGHT-POINTING PENTAGON -2B55;W # So HEAVY LARGE CIRCLE -2B56..2B59;A # So [4] HEAVY OVAL WITH OVAL INSIDE..HEAVY CIRCLED SALTIRE -2B5A..2B73;N # So [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR -2B76..2B95;N # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW -2B97..2BFF;N # So [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL -2C00..2C5F;N # L& [96] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC SMALL LETTER CAUDATE CHRIVI -2C60..2C7B;N # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E -2C7C..2C7D;N # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V -2C7E..2C7F;N # Lu [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL -2C80..2CE4;N # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI -2CE5..2CEA;N # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA -2CEB..2CEE;N # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA -2CEF..2CF1;N # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS -2CF2..2CF3;N # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI -2CF9..2CFC;N # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER -2CFD;N # No COPTIC FRACTION ONE HALF -2CFE..2CFF;N # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER -2D00..2D25;N # Ll [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE -2D27;N # Ll GEORGIAN SMALL LETTER YN -2D2D;N # Ll GEORGIAN SMALL LETTER AEN -2D30..2D67;N # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO -2D6F;N # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK -2D70;N # Po TIFINAGH SEPARATOR MARK -2D7F;N # Mn TIFINAGH CONSONANT JOINER -2D80..2D96;N # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE -2DA0..2DA6;N # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO -2DA8..2DAE;N # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO -2DB0..2DB6;N # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO -2DB8..2DBE;N # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO -2DC0..2DC6;N # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO -2DC8..2DCE;N # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO -2DD0..2DD6;N # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO -2DD8..2DDE;N # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO -2DE0..2DFF;N # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS -2E00..2E01;N # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER -2E02;N # Pi LEFT SUBSTITUTION BRACKET -2E03;N # Pf RIGHT SUBSTITUTION BRACKET -2E04;N # Pi LEFT DOTTED SUBSTITUTION BRACKET -2E05;N # Pf RIGHT DOTTED SUBSTITUTION BRACKET -2E06..2E08;N # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER -2E09;N # Pi LEFT TRANSPOSITION BRACKET -2E0A;N # Pf RIGHT TRANSPOSITION BRACKET -2E0B;N # Po RAISED SQUARE -2E0C;N # Pi LEFT RAISED OMISSION BRACKET -2E0D;N # Pf RIGHT RAISED OMISSION BRACKET -2E0E..2E16;N # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE -2E17;N # Pd DOUBLE OBLIQUE HYPHEN -2E18..2E19;N # Po [2] INVERTED INTERROBANG..PALM BRANCH -2E1A;N # Pd HYPHEN WITH DIAERESIS -2E1B;N # Po TILDE WITH RING ABOVE -2E1C;N # Pi LEFT LOW PARAPHRASE BRACKET -2E1D;N # Pf RIGHT LOW PARAPHRASE BRACKET -2E1E..2E1F;N # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW -2E20;N # Pi LEFT VERTICAL BAR WITH QUILL -2E21;N # Pf RIGHT VERTICAL BAR WITH QUILL -2E22;N # Ps TOP LEFT HALF BRACKET -2E23;N # Pe TOP RIGHT HALF BRACKET -2E24;N # Ps BOTTOM LEFT HALF BRACKET -2E25;N # Pe BOTTOM RIGHT HALF BRACKET -2E26;N # Ps LEFT SIDEWAYS U BRACKET -2E27;N # Pe RIGHT SIDEWAYS U BRACKET -2E28;N # Ps LEFT DOUBLE PARENTHESIS -2E29;N # Pe RIGHT DOUBLE PARENTHESIS -2E2A..2E2E;N # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK -2E2F;N # Lm VERTICAL TILDE -2E30..2E39;N # Po [10] RING POINT..TOP HALF SECTION SIGN -2E3A..2E3B;N # Pd [2] TWO-EM DASH..THREE-EM DASH -2E3C..2E3F;N # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM -2E40;N # Pd DOUBLE HYPHEN -2E41;N # Po REVERSED COMMA -2E42;N # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK -2E43..2E4F;N # Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER -2E50..2E51;N # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR -2E52..2E54;N # Po [3] TIRONIAN SIGN CAPITAL ET..MEDIEVAL QUESTION MARK -2E55;N # Ps LEFT SQUARE BRACKET WITH STROKE -2E56;N # Pe RIGHT SQUARE BRACKET WITH STROKE -2E57;N # Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE -2E58;N # Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE -2E59;N # Ps TOP HALF LEFT PARENTHESIS -2E5A;N # Pe TOP HALF RIGHT PARENTHESIS -2E5B;N # Ps BOTTOM HALF LEFT PARENTHESIS -2E5C;N # Pe BOTTOM HALF RIGHT PARENTHESIS -2E5D;N # Pd OBLIQUE HYPHEN -2E80..2E99;W # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP -2E9B..2EF3;W # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE -2F00..2FD5;W # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE -2FF0..2FFB;W # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID -3000;F # Zs IDEOGRAPHIC SPACE -3001..3003;W # Po [3] IDEOGRAPHIC COMMA..DITTO MARK -3004;W # So JAPANESE INDUSTRIAL STANDARD SYMBOL -3005;W # Lm IDEOGRAPHIC ITERATION MARK -3006;W # Lo IDEOGRAPHIC CLOSING MARK -3007;W # Nl IDEOGRAPHIC NUMBER ZERO -3008;W # Ps LEFT ANGLE BRACKET -3009;W # Pe RIGHT ANGLE BRACKET -300A;W # Ps LEFT DOUBLE ANGLE BRACKET -300B;W # Pe RIGHT DOUBLE ANGLE BRACKET -300C;W # Ps LEFT CORNER BRACKET -300D;W # Pe RIGHT CORNER BRACKET -300E;W # Ps LEFT WHITE CORNER BRACKET -300F;W # Pe RIGHT WHITE CORNER BRACKET -3010;W # Ps LEFT BLACK LENTICULAR BRACKET -3011;W # Pe RIGHT BLACK LENTICULAR BRACKET -3012..3013;W # So [2] POSTAL MARK..GETA MARK -3014;W # Ps LEFT TORTOISE SHELL BRACKET -3015;W # Pe RIGHT TORTOISE SHELL BRACKET -3016;W # Ps LEFT WHITE LENTICULAR BRACKET -3017;W # Pe RIGHT WHITE LENTICULAR BRACKET -3018;W # Ps LEFT WHITE TORTOISE SHELL BRACKET -3019;W # Pe RIGHT WHITE TORTOISE SHELL BRACKET -301A;W # Ps LEFT WHITE SQUARE BRACKET -301B;W # Pe RIGHT WHITE SQUARE BRACKET -301C;W # Pd WAVE DASH -301D;W # Ps REVERSED DOUBLE PRIME QUOTATION MARK -301E..301F;W # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK -3020;W # So POSTAL MARK FACE -3021..3029;W # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -302A..302D;W # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK -302E..302F;W # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK -3030;W # Pd WAVY DASH -3031..3035;W # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF -3036..3037;W # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL -3038..303A;W # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -303B;W # Lm VERTICAL IDEOGRAPHIC ITERATION MARK -303C;W # Lo MASU MARK -303D;W # Po PART ALTERNATION MARK -303E;W # So IDEOGRAPHIC VARIATION INDICATOR -303F;N # So IDEOGRAPHIC HALF FILL SPACE -3041..3096;W # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -3099..309A;W # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -309B..309C;W # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -309D..309E;W # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F;W # Lo HIRAGANA DIGRAPH YORI -30A0;W # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN -30A1..30FA;W # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FB;W # Po KATAKANA MIDDLE DOT -30FC..30FE;W # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK -30FF;W # Lo KATAKANA DIGRAPH KOTO -3105..312F;W # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN -3131..318E;W # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -3190..3191;W # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK -3192..3195;W # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK -3196..319F;W # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK -31A0..31BF;W # Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH -31C0..31E3;W # So [36] CJK STROKE T..CJK STROKE Q -31F0..31FF;W # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -3200..321E;W # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU -3220..3229;W # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN -322A..3247;W # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO -3248..324F;A # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE -3250;W # So PARTNERSHIP SIGN -3251..325F;W # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE -3260..327F;W # So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL -3280..3289;W # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN -328A..32B0;W # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT -32B1..32BF;W # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY -32C0..32FF;W # So [64] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..SQUARE ERA NAME REIWA -3300..33FF;W # So [256] SQUARE APAATO..SQUARE GAL -3400..4DBF;W # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF -4DC0..4DFF;N # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION -4E00..9FFF;W # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF -A000..A014;W # Lo [21] YI SYLLABLE IT..YI SYLLABLE E -A015;W # Lm YI SYLLABLE WU -A016..A48C;W # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR -A490..A4C6;W # So [55] YI RADICAL QOT..YI RADICAL KE -A4D0..A4F7;N # Lo [40] LISU LETTER BA..LISU LETTER OE -A4F8..A4FD;N # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU -A4FE..A4FF;N # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP -A500..A60B;N # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG -A60C;N # Lm VAI SYLLABLE LENGTHENER -A60D..A60F;N # Po [3] VAI COMMA..VAI QUESTION MARK -A610..A61F;N # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG -A620..A629;N # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE -A62A..A62B;N # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO -A640..A66D;N # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O -A66E;N # Lo CYRILLIC LETTER MULTIOCULAR O -A66F;N # Mn COMBINING CYRILLIC VZMET -A670..A672;N # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN -A673;N # Po SLAVONIC ASTERISK -A674..A67D;N # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK -A67E;N # Po CYRILLIC KAVYKA -A67F;N # Lm CYRILLIC PAYEROK -A680..A69B;N # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O -A69C..A69D;N # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN -A69E..A69F;N # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E -A6A0..A6E5;N # Lo [70] BAMUM LETTER A..BAMUM LETTER KI -A6E6..A6EF;N # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM -A6F0..A6F1;N # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS -A6F2..A6F7;N # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK -A700..A716;N # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR -A717..A71F;N # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK -A720..A721;N # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE -A722..A76F;N # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON -A770;N # Lm MODIFIER LETTER US -A771..A787;N # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T -A788;N # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT -A789..A78A;N # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN -A78B..A78E;N # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT -A78F;N # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7CA;N # L& [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY -A7D0..A7D1;N # L& [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G -A7D3;N # Ll LATIN SMALL LETTER DOUBLE THORN -A7D5..A7D9;N # L& [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S -A7F2..A7F4;N # Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q -A7F5..A7F6;N # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H -A7F7;N # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I -A7F8..A7F9;N # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE -A7FA;N # Ll LATIN LETTER SMALL CAPITAL TURNED M -A7FB..A7FF;N # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M -A800..A801;N # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I -A802;N # Mn SYLOTI NAGRI SIGN DVISVARA -A803..A805;N # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O -A806;N # Mn SYLOTI NAGRI SIGN HASANTA -A807..A80A;N # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO -A80B;N # Mn SYLOTI NAGRI SIGN ANUSVARA -A80C..A822;N # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO -A823..A824;N # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I -A825..A826;N # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E -A827;N # Mc SYLOTI NAGRI VOWEL SIGN OO -A828..A82B;N # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 -A82C;N # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA -A830..A835;N # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS -A836..A837;N # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK -A838;N # Sc NORTH INDIC RUPEE MARK -A839;N # So NORTH INDIC QUANTITY MARK -A840..A873;N # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU -A874..A877;N # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD -A880..A881;N # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA -A882..A8B3;N # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA -A8B4..A8C3;N # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A8C4..A8C5;N # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU -A8CE..A8CF;N # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA -A8D0..A8D9;N # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE -A8E0..A8F1;N # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA -A8F2..A8F7;N # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA -A8F8..A8FA;N # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET -A8FB;N # Lo DEVANAGARI HEADSTROKE -A8FC;N # Po DEVANAGARI SIGN SIDDHAM -A8FD..A8FE;N # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY -A8FF;N # Mn DEVANAGARI VOWEL SIGN AY -A900..A909;N # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE -A90A..A925;N # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO -A926..A92D;N # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU -A92E..A92F;N # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA -A930..A946;N # Lo [23] REJANG LETTER KA..REJANG LETTER A -A947..A951;N # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R -A952..A953;N # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA -A95F;N # Po REJANG SECTION MARK -A960..A97C;W # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH -A980..A982;N # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR -A983;N # Mc JAVANESE SIGN WIGNYAN -A984..A9B2;N # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA -A9B3;N # Mn JAVANESE SIGN CECAK TELU -A9B4..A9B5;N # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG -A9B6..A9B9;N # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT -A9BA..A9BB;N # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE -A9BC..A9BD;N # Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET -A9BE..A9C0;N # Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON -A9C1..A9CD;N # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH -A9CF;N # Lm JAVANESE PANGRANGKEP -A9D0..A9D9;N # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE -A9DE..A9DF;N # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN -A9E0..A9E4;N # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA -A9E5;N # Mn MYANMAR SIGN SHAN SAW -A9E6;N # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION -A9E7..A9EF;N # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA -A9F0..A9F9;N # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE -A9FA..A9FE;N # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA -AA00..AA28;N # Lo [41] CHAM LETTER A..CHAM LETTER HA -AA29..AA2E;N # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE -AA2F..AA30;N # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI -AA31..AA32;N # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE -AA33..AA34;N # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA -AA35..AA36;N # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA -AA40..AA42;N # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG -AA43;N # Mn CHAM CONSONANT SIGN FINAL NG -AA44..AA4B;N # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS -AA4C;N # Mn CHAM CONSONANT SIGN FINAL M -AA4D;N # Mc CHAM CONSONANT SIGN FINAL H -AA50..AA59;N # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE -AA5C..AA5F;N # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA -AA60..AA6F;N # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA -AA70;N # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION -AA71..AA76;N # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM -AA77..AA79;N # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO -AA7A;N # Lo MYANMAR LETTER AITON RA -AA7B;N # Mc MYANMAR SIGN PAO KAREN TONE -AA7C;N # Mn MYANMAR SIGN TAI LAING TONE-2 -AA7D;N # Mc MYANMAR SIGN TAI LAING TONE-5 -AA7E..AA7F;N # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA -AA80..AAAF;N # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O -AAB0;N # Mn TAI VIET MAI KANG -AAB1;N # Lo TAI VIET VOWEL AA -AAB2..AAB4;N # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U -AAB5..AAB6;N # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O -AAB7..AAB8;N # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA -AAB9..AABD;N # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN -AABE..AABF;N # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK -AAC0;N # Lo TAI VIET TONE MAI NUENG -AAC1;N # Mn TAI VIET TONE MAI THO -AAC2;N # Lo TAI VIET TONE MAI SONG -AADB..AADC;N # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG -AADD;N # Lm TAI VIET SYMBOL SAM -AADE..AADF;N # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI -AAE0..AAEA;N # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA -AAEB;N # Mc MEETEI MAYEK VOWEL SIGN II -AAEC..AAED;N # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI -AAEE..AAEF;N # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU -AAF0..AAF1;N # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM -AAF2;N # Lo MEETEI MAYEK ANJI -AAF3..AAF4;N # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK -AAF5;N # Mc MEETEI MAYEK VOWEL SIGN VISARGA -AAF6;N # Mn MEETEI MAYEK VIRAMA -AB01..AB06;N # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO -AB09..AB0E;N # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO -AB11..AB16;N # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO -AB20..AB26;N # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO -AB28..AB2E;N # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO -AB30..AB5A;N # Ll [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG -AB5B;N # Sk MODIFIER BREVE WITH INVERTED BREVE -AB5C..AB5F;N # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK -AB60..AB68;N # Ll [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE -AB69;N # Lm MODIFIER LETTER SMALL TURNED W -AB6A..AB6B;N # Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK -AB70..ABBF;N # Ll [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA -ABC0..ABE2;N # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM -ABE3..ABE4;N # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP -ABE5;N # Mn MEETEI MAYEK VOWEL SIGN ANAP -ABE6..ABE7;N # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP -ABE8;N # Mn MEETEI MAYEK VOWEL SIGN UNAP -ABE9..ABEA;N # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG -ABEB;N # Po MEETEI MAYEK CHEIKHEI -ABEC;N # Mc MEETEI MAYEK LUM IYEK -ABED;N # Mn MEETEI MAYEK APUN IYEK -ABF0..ABF9;N # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE -AC00..D7A3;W # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -D7B0..D7C6;N # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E -D7CB..D7FB;N # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH -D800..DB7F;N # Cs [896] .. -DB80..DBFF;N # Cs [128] .. -DC00..DFFF;N # Cs [1024] .. -E000..F8FF;A # Co [6400] .. -F900..FA6D;W # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D -FA6E..FA6F;W # Cn [2] .. -FA70..FAD9;W # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 -FADA..FAFF;W # Cn [38] .. -FB00..FB06;N # Ll [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FB13..FB17;N # Ll [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH -FB1D;N # Lo HEBREW LETTER YOD WITH HIRIQ -FB1E;N # Mn HEBREW POINT JUDEO-SPANISH VARIKA -FB1F..FB28;N # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB29;N # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN -FB2A..FB36;N # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C;N # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E;N # Lo HEBREW LETTER MEM WITH DAGESH -FB40..FB41;N # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44;N # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FB4F;N # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED -FB50..FBB1;N # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBB2..FBC2;N # Sk [17] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL WASLA ABOVE -FBD3..FD3D;N # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD3E;N # Pe ORNATE LEFT PARENTHESIS -FD3F;N # Ps ORNATE RIGHT PARENTHESIS -FD40..FD4F;N # So [16] ARABIC LIGATURE RAHIMAHU ALLAAH..ARABIC LIGATURE RAHIMAHUM ALLAAH -FD50..FD8F;N # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7;N # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDCF;N # So ARABIC LIGATURE SALAAMUHU ALAYNAA -FDF0..FDFB;N # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU -FDFC;N # Sc RIAL SIGN -FDFD..FDFF;N # So [3] ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM..ARABIC LIGATURE AZZA WA JALL -FE00..FE0F;A # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE10..FE16;W # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK -FE17;W # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET -FE18;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET -FE19;W # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS -FE20..FE2F;N # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF -FE30;W # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER -FE31..FE32;W # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH -FE33..FE34;W # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -FE35;W # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -FE36;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -FE37;W # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -FE38;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -FE39;W # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET -FE3A;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET -FE3B;W # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET -FE3C;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET -FE3D;W # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET -FE3E;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET -FE3F;W # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET -FE40;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET -FE41;W # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET -FE42;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET -FE43;W # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET -FE44;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET -FE45..FE46;W # Po [2] SESAME DOT..WHITE SESAME DOT -FE47;W # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -FE48;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET -FE49..FE4C;W # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE -FE4D..FE4F;W # Pc [3] DASHED LOW LINE..WAVY LOW LINE -FE50..FE52;W # Po [3] SMALL COMMA..SMALL FULL STOP -FE54..FE57;W # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK -FE58;W # Pd SMALL EM DASH -FE59;W # Ps SMALL LEFT PARENTHESIS -FE5A;W # Pe SMALL RIGHT PARENTHESIS -FE5B;W # Ps SMALL LEFT CURLY BRACKET -FE5C;W # Pe SMALL RIGHT CURLY BRACKET -FE5D;W # Ps SMALL LEFT TORTOISE SHELL BRACKET -FE5E;W # Pe SMALL RIGHT TORTOISE SHELL BRACKET -FE5F..FE61;W # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK -FE62;W # Sm SMALL PLUS SIGN -FE63;W # Pd SMALL HYPHEN-MINUS -FE64..FE66;W # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN -FE68;W # Po SMALL REVERSE SOLIDUS -FE69;W # Sc SMALL DOLLAR SIGN -FE6A..FE6B;W # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT -FE70..FE74;N # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM -FE76..FEFC;N # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FEFF;N # Cf ZERO WIDTH NO-BREAK SPACE -FF01..FF03;F # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN -FF04;F # Sc FULLWIDTH DOLLAR SIGN -FF05..FF07;F # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE -FF08;F # Ps FULLWIDTH LEFT PARENTHESIS -FF09;F # Pe FULLWIDTH RIGHT PARENTHESIS -FF0A;F # Po FULLWIDTH ASTERISK -FF0B;F # Sm FULLWIDTH PLUS SIGN -FF0C;F # Po FULLWIDTH COMMA -FF0D;F # Pd FULLWIDTH HYPHEN-MINUS -FF0E..FF0F;F # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS -FF10..FF19;F # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE -FF1A..FF1B;F # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON -FF1C..FF1E;F # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN -FF1F..FF20;F # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT -FF21..FF3A;F # Lu [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -FF3B;F # Ps FULLWIDTH LEFT SQUARE BRACKET -FF3C;F # Po FULLWIDTH REVERSE SOLIDUS -FF3D;F # Pe FULLWIDTH RIGHT SQUARE BRACKET -FF3E;F # Sk FULLWIDTH CIRCUMFLEX ACCENT -FF3F;F # Pc FULLWIDTH LOW LINE -FF40;F # Sk FULLWIDTH GRAVE ACCENT -FF41..FF5A;F # Ll [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z -FF5B;F # Ps FULLWIDTH LEFT CURLY BRACKET -FF5C;F # Sm FULLWIDTH VERTICAL LINE -FF5D;F # Pe FULLWIDTH RIGHT CURLY BRACKET -FF5E;F # Sm FULLWIDTH TILDE -FF5F;F # Ps FULLWIDTH LEFT WHITE PARENTHESIS -FF60;F # Pe FULLWIDTH RIGHT WHITE PARENTHESIS -FF61;H # Po HALFWIDTH IDEOGRAPHIC FULL STOP -FF62;H # Ps HALFWIDTH LEFT CORNER BRACKET -FF63;H # Pe HALFWIDTH RIGHT CORNER BRACKET -FF64..FF65;H # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT -FF66..FF6F;H # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF70;H # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF71..FF9D;H # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N -FF9E..FF9F;H # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -FFA0..FFBE;H # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7;H # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF;H # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7;H # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC;H # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I -FFE0..FFE1;F # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN -FFE2;F # Sm FULLWIDTH NOT SIGN -FFE3;F # Sk FULLWIDTH MACRON -FFE4;F # So FULLWIDTH BROKEN BAR -FFE5..FFE6;F # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN -FFE8;H # So HALFWIDTH FORMS LIGHT VERTICAL -FFE9..FFEC;H # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW -FFED..FFEE;H # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE -FFF9..FFFB;N # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR -FFFC;N # So OBJECT REPLACEMENT CHARACTER -FFFD;A # So REPLACEMENT CHARACTER -10000..1000B;N # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026;N # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A;N # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D;N # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D;N # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D;N # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA;N # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 -10100..10102;N # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK -10107..10133;N # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND -10137..1013F;N # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT -10140..10174;N # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS -10175..10178;N # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN -10179..10189;N # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN -1018A..1018B;N # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN -1018C..1018E;N # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN -10190..1019C;N # So [13] ROMAN SEXTANS SIGN..ASCIA SYMBOL -101A0;N # So GREEK SYMBOL TAU RHO -101D0..101FC;N # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND -101FD;N # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE -10280..1029C;N # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X -102A0..102D0;N # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 -102E0;N # Mn COPTIC EPACT THOUSANDS MARK -102E1..102FB;N # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED -10300..1031F;N # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS -10320..10323;N # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY -1032D..1032F;N # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE -10330..10340;N # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA -10341;N # Nl GOTHIC LETTER NINETY -10342..10349;N # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL -1034A;N # Nl GOTHIC LETTER NINE HUNDRED -10350..10375;N # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA -10376..1037A;N # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII -10380..1039D;N # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU -1039F;N # Po UGARITIC WORD DIVIDER -103A0..103C3;N # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA -103C8..103CF;N # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH -103D0;N # Po OLD PERSIAN WORD DIVIDER -103D1..103D5;N # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED -10400..1044F;N # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW -10450..1047F;N # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW -10480..1049D;N # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO -104A0..104A9;N # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE -104B0..104D3;N # Lu [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA -104D8..104FB;N # Ll [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA -10500..10527;N # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE -10530..10563;N # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW -1056F;N # Po CAUCASIAN ALBANIAN CITATION MARK -10570..1057A;N # Lu [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA -1057C..1058A;N # Lu [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE -1058C..10592;N # Lu [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE -10594..10595;N # Lu [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE -10597..105A1;N # Ll [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA -105A3..105B1;N # Ll [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE -105B3..105B9;N # Ll [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE -105BB..105BC;N # Ll [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE -10600..10736;N # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 -10740..10755;N # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE -10760..10767;N # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 -10780..10785;N # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK -10787..107B0;N # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK -107B2..107BA;N # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL -10800..10805;N # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808;N # Lo CYPRIOT SYLLABLE JO -1080A..10835;N # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838;N # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C;N # Lo CYPRIOT SYLLABLE ZA -1083F;N # Lo CYPRIOT SYLLABLE ZO -10840..10855;N # Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW -10857;N # Po IMPERIAL ARAMAIC SECTION SIGN -10858..1085F;N # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND -10860..10876;N # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW -10877..10878;N # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON -10879..1087F;N # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY -10880..1089E;N # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW -108A7..108AF;N # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED -108E0..108F2;N # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH -108F4..108F5;N # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW -108FB..108FF;N # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED -10900..10915;N # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU -10916..1091B;N # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE -1091F;N # Po PHOENICIAN WORD SEPARATOR -10920..10939;N # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C -1093F;N # Po LYDIAN TRIANGULAR MARK -10980..1099F;N # Lo [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 -109A0..109B7;N # Lo [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA -109BC..109BD;N # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF -109BE..109BF;N # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN -109C0..109CF;N # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY -109D2..109FF;N # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS -10A00;N # Lo KHAROSHTHI LETTER A -10A01..10A03;N # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R -10A05..10A06;N # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O -10A0C..10A0F;N # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA -10A10..10A13;N # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA -10A15..10A17;N # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA -10A19..10A35;N # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA -10A38..10A3A;N # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW -10A3F;N # Mn KHAROSHTHI VIRAMA -10A40..10A48;N # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF -10A50..10A58;N # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES -10A60..10A7C;N # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH -10A7D..10A7E;N # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY -10A7F;N # Po OLD SOUTH ARABIAN NUMERIC INDICATOR -10A80..10A9C;N # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH -10A9D..10A9F;N # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY -10AC0..10AC7;N # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW -10AC8;N # So MANICHAEAN SIGN UD -10AC9..10AE4;N # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW -10AE5..10AE6;N # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW -10AEB..10AEF;N # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED -10AF0..10AF6;N # Po [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER -10B00..10B35;N # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE -10B39..10B3F;N # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION -10B40..10B55;N # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW -10B58..10B5F;N # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND -10B60..10B72;N # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW -10B78..10B7F;N # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND -10B80..10B91;N # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW -10B99..10B9C;N # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT -10BA9..10BAF;N # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED -10C00..10C48;N # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH -10C80..10CB2;N # Lu [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US -10CC0..10CF2;N # Ll [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US -10CFA..10CFF;N # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND -10D00..10D23;N # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA -10D24..10D27;N # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI -10D30..10D39;N # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE -10E60..10E7E;N # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS -10E80..10EA9;N # Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET -10EAB..10EAC;N # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK -10EAD;N # Pd YEZIDI HYPHENATION MARK -10EB0..10EB1;N # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE -10EFD..10EFF;N # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA -10F00..10F1C;N # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL -10F1D..10F26;N # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF -10F27;N # Lo OLD SOGDIAN LIGATURE AYIN-DALETH -10F30..10F45;N # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN -10F46..10F50;N # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW -10F51..10F54;N # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED -10F55..10F59;N # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT -10F70..10F81;N # Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH -10F82..10F85;N # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW -10F86..10F89;N # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS -10FB0..10FC4;N # Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW -10FC5..10FCB;N # No [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED -10FE0..10FF6;N # Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH -11000;N # Mc BRAHMI SIGN CANDRABINDU -11001;N # Mn BRAHMI SIGN ANUSVARA -11002;N # Mc BRAHMI SIGN VISARGA -11003..11037;N # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA -11038..11046;N # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA -11047..1104D;N # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS -11052..11065;N # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND -11066..1106F;N # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE -11070;N # Mn BRAHMI SIGN OLD TAMIL VIRAMA -11071..11072;N # Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O -11073..11074;N # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O -11075;N # Lo BRAHMI LETTER OLD TAMIL LLA -1107F;N # Mn BRAHMI NUMBER JOINER -11080..11081;N # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA -11082;N # Mc KAITHI SIGN VISARGA -11083..110AF;N # Lo [45] KAITHI LETTER A..KAITHI LETTER HA -110B0..110B2;N # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II -110B3..110B6;N # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI -110B7..110B8;N # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU -110B9..110BA;N # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA -110BB..110BC;N # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN -110BD;N # Cf KAITHI NUMBER SIGN -110BE..110C1;N # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA -110C2;N # Mn KAITHI VOWEL SIGN VOCALIC R -110CD;N # Cf KAITHI NUMBER SIGN ABOVE -110D0..110E8;N # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE -110F0..110F9;N # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE -11100..11102;N # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA -11103..11126;N # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA -11127..1112B;N # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU -1112C;N # Mc CHAKMA VOWEL SIGN E -1112D..11134;N # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA -11136..1113F;N # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE -11140..11143;N # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK -11144;N # Lo CHAKMA LETTER LHAA -11145..11146;N # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI -11147;N # Lo CHAKMA LETTER VAA -11150..11172;N # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA -11173;N # Mn MAHAJANI SIGN NUKTA -11174..11175;N # Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK -11176;N # Lo MAHAJANI LIGATURE SHRI -11180..11181;N # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA -11182;N # Mc SHARADA SIGN VISARGA -11183..111B2;N # Lo [48] SHARADA LETTER A..SHARADA LETTER HA -111B3..111B5;N # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II -111B6..111BE;N # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O -111BF..111C0;N # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA -111C1..111C4;N # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM -111C5..111C8;N # Po [4] SHARADA DANDA..SHARADA SEPARATOR -111C9..111CC;N # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK -111CD;N # Po SHARADA SUTRA MARK -111CE;N # Mc SHARADA VOWEL SIGN PRISHTHAMATRA E -111CF;N # Mn SHARADA SIGN INVERTED CANDRABINDU -111D0..111D9;N # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE -111DA;N # Lo SHARADA EKAM -111DB;N # Po SHARADA SIGN SIDDHAM -111DC;N # Lo SHARADA HEADSTROKE -111DD..111DF;N # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 -111E1..111F4;N # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND -11200..11211;N # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA -11213..1122B;N # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA -1122C..1122E;N # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II -1122F..11231;N # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI -11232..11233;N # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU -11234;N # Mn KHOJKI SIGN ANUSVARA -11235;N # Mc KHOJKI SIGN VIRAMA -11236..11237;N # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA -11238..1123D;N # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN -1123E;N # Mn KHOJKI SIGN SUKUN -1123F..11240;N # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I -11241;N # Mn KHOJKI VOWEL SIGN VOCALIC R -11280..11286;N # Lo [7] MULTANI LETTER A..MULTANI LETTER GA -11288;N # Lo MULTANI LETTER GHA -1128A..1128D;N # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA -1128F..1129D;N # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA -1129F..112A8;N # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA -112A9;N # Po MULTANI SECTION MARK -112B0..112DE;N # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA -112DF;N # Mn KHUDAWADI SIGN ANUSVARA -112E0..112E2;N # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II -112E3..112EA;N # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA -112F0..112F9;N # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE -11300..11301;N # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU -11302..11303;N # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA -11305..1130C;N # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L -1130F..11310;N # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI -11313..11328;N # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA -1132A..11330;N # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA -11332..11333;N # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA -11335..11339;N # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA -1133B..1133C;N # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA -1133D;N # Lo GRANTHA SIGN AVAGRAHA -1133E..1133F;N # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I -11340;N # Mn GRANTHA VOWEL SIGN II -11341..11344;N # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR -11347..11348;N # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI -1134B..1134D;N # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA -11350;N # Lo GRANTHA OM -11357;N # Mc GRANTHA AU LENGTH MARK -1135D..11361;N # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL -11362..11363;N # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL -11366..1136C;N # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX -11370..11374;N # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA -11400..11434;N # Lo [53] NEWA LETTER A..NEWA LETTER HA -11435..11437;N # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II -11438..1143F;N # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI -11440..11441;N # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU -11442..11444;N # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA -11445;N # Mc NEWA SIGN VISARGA -11446;N # Mn NEWA SIGN NUKTA -11447..1144A;N # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI -1144B..1144F;N # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN -11450..11459;N # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE -1145A..1145B;N # Po [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK -1145D;N # Po NEWA INSERTION SIGN -1145E;N # Mn NEWA SANDHI MARK -1145F..11461;N # Lo [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA -11480..114AF;N # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA -114B0..114B2;N # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II -114B3..114B8;N # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL -114B9;N # Mc TIRHUTA VOWEL SIGN E -114BA;N # Mn TIRHUTA VOWEL SIGN SHORT E -114BB..114BE;N # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU -114BF..114C0;N # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA -114C1;N # Mc TIRHUTA SIGN VISARGA -114C2..114C3;N # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA -114C4..114C5;N # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG -114C6;N # Po TIRHUTA ABBREVIATION SIGN -114C7;N # Lo TIRHUTA OM -114D0..114D9;N # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE -11580..115AE;N # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA -115AF..115B1;N # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II -115B2..115B5;N # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR -115B8..115BB;N # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU -115BC..115BD;N # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA -115BE;N # Mc SIDDHAM SIGN VISARGA -115BF..115C0;N # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA -115C1..115D7;N # Po [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES -115D8..115DB;N # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U -115DC..115DD;N # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU -11600..1162F;N # Lo [48] MODI LETTER A..MODI LETTER LLA -11630..11632;N # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II -11633..1163A;N # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI -1163B..1163C;N # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU -1163D;N # Mn MODI SIGN ANUSVARA -1163E;N # Mc MODI SIGN VISARGA -1163F..11640;N # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA -11641..11643;N # Po [3] MODI DANDA..MODI ABBREVIATION SIGN -11644;N # Lo MODI SIGN HUVA -11650..11659;N # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE -11660..1166C;N # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT -11680..116AA;N # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA -116AB;N # Mn TAKRI SIGN ANUSVARA -116AC;N # Mc TAKRI SIGN VISARGA -116AD;N # Mn TAKRI VOWEL SIGN AA -116AE..116AF;N # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II -116B0..116B5;N # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU -116B6;N # Mc TAKRI SIGN VIRAMA -116B7;N # Mn TAKRI SIGN NUKTA -116B8;N # Lo TAKRI LETTER ARCHAIC KHA -116B9;N # Po TAKRI ABBREVIATION SIGN -116C0..116C9;N # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE -11700..1171A;N # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA -1171D..1171F;N # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA -11720..11721;N # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA -11722..11725;N # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU -11726;N # Mc AHOM VOWEL SIGN E -11727..1172B;N # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER -11730..11739;N # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE -1173A..1173B;N # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY -1173C..1173E;N # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI -1173F;N # So AHOM SYMBOL VI -11740..11746;N # Lo [7] AHOM LETTER CA..AHOM LETTER LLA -11800..1182B;N # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA -1182C..1182E;N # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II -1182F..11837;N # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA -11838;N # Mc DOGRA SIGN VISARGA -11839..1183A;N # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA -1183B;N # Po DOGRA ABBREVIATION SIGN -118A0..118DF;N # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO -118E0..118E9;N # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE -118EA..118F2;N # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY -118FF;N # Lo WARANG CITI OM -11900..11906;N # Lo [7] DIVES AKURU LETTER A..DIVES AKURU LETTER E -11909;N # Lo DIVES AKURU LETTER O -1190C..11913;N # Lo [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA -11915..11916;N # Lo [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA -11918..1192F;N # Lo [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA -11930..11935;N # Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E -11937..11938;N # Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O -1193B..1193C;N # Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU -1193D;N # Mc DIVES AKURU SIGN HALANTA -1193E;N # Mn DIVES AKURU VIRAMA -1193F;N # Lo DIVES AKURU PREFIXED NASAL SIGN -11940;N # Mc DIVES AKURU MEDIAL YA -11941;N # Lo DIVES AKURU INITIAL RA -11942;N # Mc DIVES AKURU MEDIAL RA -11943;N # Mn DIVES AKURU SIGN NUKTA -11944..11946;N # Po [3] DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK -11950..11959;N # Nd [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE -119A0..119A7;N # Lo [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR -119AA..119D0;N # Lo [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA -119D1..119D3;N # Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II -119D4..119D7;N # Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR -119DA..119DB;N # Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI -119DC..119DF;N # Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA -119E0;N # Mn NANDINAGARI SIGN VIRAMA -119E1;N # Lo NANDINAGARI SIGN AVAGRAHA -119E2;N # Po NANDINAGARI SIGN SIDDHAM -119E3;N # Lo NANDINAGARI HEADSTROKE -119E4;N # Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E -11A00;N # Lo ZANABAZAR SQUARE LETTER A -11A01..11A0A;N # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK -11A0B..11A32;N # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA -11A33..11A38;N # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA -11A39;N # Mc ZANABAZAR SQUARE SIGN VISARGA -11A3A;N # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA -11A3B..11A3E;N # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA -11A3F..11A46;N # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK -11A47;N # Mn ZANABAZAR SQUARE SUBJOINER -11A50;N # Lo SOYOMBO LETTER A -11A51..11A56;N # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE -11A57..11A58;N # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU -11A59..11A5B;N # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK -11A5C..11A89;N # Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA -11A8A..11A96;N # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA -11A97;N # Mc SOYOMBO SIGN VISARGA -11A98..11A99;N # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER -11A9A..11A9C;N # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD -11A9D;N # Lo SOYOMBO MARK PLUTA -11A9E..11AA2;N # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 -11AB0..11ABF;N # Lo [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA -11AC0..11AF8;N # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL -11B00..11B09;N # Po [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU -11C00..11C08;N # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L -11C0A..11C2E;N # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA -11C2F;N # Mc BHAIKSUKI VOWEL SIGN AA -11C30..11C36;N # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L -11C38..11C3D;N # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA -11C3E;N # Mc BHAIKSUKI SIGN VISARGA -11C3F;N # Mn BHAIKSUKI SIGN VIRAMA -11C40;N # Lo BHAIKSUKI SIGN AVAGRAHA -11C41..11C45;N # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 -11C50..11C59;N # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE -11C5A..11C6C;N # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK -11C70..11C71;N # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD -11C72..11C8F;N # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A -11C92..11CA7;N # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA -11CA9;N # Mc MARCHEN SUBJOINED LETTER YA -11CAA..11CB0;N # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA -11CB1;N # Mc MARCHEN VOWEL SIGN I -11CB2..11CB3;N # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E -11CB4;N # Mc MARCHEN VOWEL SIGN O -11CB5..11CB6;N # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU -11D00..11D06;N # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E -11D08..11D09;N # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O -11D0B..11D30;N # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA -11D31..11D36;N # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R -11D3A;N # Mn MASARAM GONDI VOWEL SIGN E -11D3C..11D3D;N # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O -11D3F..11D45;N # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA -11D46;N # Lo MASARAM GONDI REPHA -11D47;N # Mn MASARAM GONDI RA-KARA -11D50..11D59;N # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE -11D60..11D65;N # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU -11D67..11D68;N # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI -11D6A..11D89;N # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA -11D8A..11D8E;N # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU -11D90..11D91;N # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI -11D93..11D94;N # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU -11D95;N # Mn GUNJALA GONDI SIGN ANUSVARA -11D96;N # Mc GUNJALA GONDI SIGN VISARGA -11D97;N # Mn GUNJALA GONDI VIRAMA -11D98;N # Lo GUNJALA GONDI OM -11DA0..11DA9;N # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE -11EE0..11EF2;N # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA -11EF3..11EF4;N # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U -11EF5..11EF6;N # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O -11EF7..11EF8;N # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION -11F00..11F01;N # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA -11F02;N # Lo KAWI SIGN REPHA -11F03;N # Mc KAWI SIGN VISARGA -11F04..11F10;N # Lo [13] KAWI LETTER A..KAWI LETTER O -11F12..11F33;N # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA -11F34..11F35;N # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA -11F36..11F3A;N # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R -11F3E..11F3F;N # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI -11F40;N # Mn KAWI VOWEL SIGN EU -11F41;N # Mc KAWI SIGN KILLER -11F42;N # Mn KAWI CONJOINER -11F43..11F4F;N # Po [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL -11F50..11F59;N # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE -11FB0;N # Lo LISU LETTER YHA -11FC0..11FD4;N # No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH -11FD5..11FDC;N # So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI -11FDD..11FE0;N # Sc [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN -11FE1..11FF1;N # So [17] TAMIL SIGN PAARAM..TAMIL SIGN VAKAIYARAA -11FFF;N # Po TAMIL PUNCTUATION END OF TEXT -12000..12399;N # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U -12400..1246E;N # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM -12470..12474;N # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON -12480..12543;N # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU -12F90..12FF0;N # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 -12FF1..12FF2;N # Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 -13000..1342F;N # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D -13430..1343F;N # Cf [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE -13440;N # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY -13441..13446;N # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN -13447..13455;N # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED -14400..14646;N # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 -16800..16A38;N # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ -16A40..16A5E;N # Lo [31] MRO LETTER TA..MRO LETTER TEK -16A60..16A69;N # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE -16A6E..16A6F;N # Po [2] MRO DANDA..MRO DOUBLE DANDA -16A70..16ABE;N # Lo [79] TANGSA LETTER OZ..TANGSA LETTER ZA -16AC0..16AC9;N # Nd [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE -16AD0..16AED;N # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I -16AF0..16AF4;N # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE -16AF5;N # Po BASSA VAH FULL STOP -16B00..16B2F;N # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU -16B30..16B36;N # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM -16B37..16B3B;N # Po [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM -16B3C..16B3F;N # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB -16B40..16B43;N # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM -16B44;N # Po PAHAWH HMONG SIGN XAUS -16B45;N # So PAHAWH HMONG SIGN CIM TSOV ROG -16B50..16B59;N # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE -16B5B..16B61;N # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS -16B63..16B77;N # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS -16B7D..16B8F;N # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ -16E40..16E7F;N # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y -16E80..16E96;N # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM -16E97..16E9A;N # Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH -16F00..16F4A;N # Lo [75] MIAO LETTER PA..MIAO LETTER RTE -16F4F;N # Mn MIAO SIGN CONSONANT MODIFIER BAR -16F50;N # Lo MIAO LETTER NASALIZATION -16F51..16F87;N # Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI -16F8F..16F92;N # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW -16F93..16F9F;N # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 -16FE0..16FE1;W # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK -16FE2;W # Po OLD CHINESE HOOK MARK -16FE3;W # Lm OLD CHINESE ITERATION MARK -16FE4;W # Mn KHITAN SMALL SCRIPT FILLER -16FF0..16FF1;W # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY -17000..187F7;W # Lo [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7 -18800..18AFF;W # Lo [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768 -18B00..18CD5;W # Lo [470] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CD5 -18D00..18D08;W # Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 -1AFF0..1AFF3;W # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 -1AFF5..1AFFB;W # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 -1AFFD..1AFFE;W # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 -1B000..1B0FF;W # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 -1B100..1B122;W # Lo [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU -1B132;W # Lo HIRAGANA LETTER SMALL KO -1B150..1B152;W # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO -1B155;W # Lo KATAKANA LETTER SMALL KO -1B164..1B167;W # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N -1B170..1B2FB;W # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB -1BC00..1BC6A;N # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M -1BC70..1BC7C;N # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK -1BC80..1BC88;N # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL -1BC90..1BC99;N # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW -1BC9C;N # So DUPLOYAN SIGN O WITH CROSS -1BC9D..1BC9E;N # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK -1BC9F;N # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP -1BCA0..1BCA3;N # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP -1CF00..1CF2D;N # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT -1CF30..1CF46;N # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG -1CF50..1CFC3;N # So [116] ZNAMENNY NEUME KRYUK..ZNAMENNY NEUME PAUK -1D000..1D0F5;N # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO -1D100..1D126;N # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 -1D129..1D164;N # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE -1D165..1D166;N # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -1D167..1D169;N # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 -1D16A..1D16C;N # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 -1D16D..1D172;N # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 -1D173..1D17A;N # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE -1D17B..1D182;N # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -1D183..1D184;N # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN -1D185..1D18B;N # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D18C..1D1A9;N # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH -1D1AA..1D1AD;N # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -1D1AE..1D1EA;N # So [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON -1D200..1D241;N # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 -1D242..1D244;N # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME -1D245;N # So GREEK MUSICAL LEIMMA -1D2C0..1D2D3;N # No [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN -1D2E0..1D2F3;N # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN -1D300..1D356;N # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING -1D360..1D378;N # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE -1D400..1D454;N # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G -1D456..1D49C;N # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F;N # Lu [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2;N # Lu MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6;N # Lu [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC;N # Lu [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B9;N # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D -1D4BB;N # Ll MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3;N # Ll [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D505;N # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A;N # Lu [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514;N # Lu [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C;N # Lu [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D51E..1D539;N # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E;N # Lu [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544;N # Lu [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546;N # Lu MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550;N # Lu [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5;N # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J -1D6A8..1D6C0;N # Lu [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6C1;N # Sm MATHEMATICAL BOLD NABLA -1D6C2..1D6DA;N # Ll [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DB;N # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL -1D6DC..1D6FA;N # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FB;N # Sm MATHEMATICAL ITALIC NABLA -1D6FC..1D714;N # Ll [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D715;N # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL -1D716..1D734;N # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D735;N # Sm MATHEMATICAL BOLD ITALIC NABLA -1D736..1D74E;N # Ll [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D74F;N # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL -1D750..1D76E;N # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D76F;N # Sm MATHEMATICAL SANS-SERIF BOLD NABLA -1D770..1D788;N # Ll [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D789;N # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL -1D78A..1D7A8;N # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7A9;N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA -1D7AA..1D7C2;N # Ll [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C3;N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL -1D7C4..1D7CB;N # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA -1D7CE..1D7FF;N # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE -1D800..1D9FF;N # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD -1DA00..1DA36;N # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN -1DA37..1DA3A;N # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE -1DA3B..1DA6C;N # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT -1DA6D..1DA74;N # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING -1DA75;N # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS -1DA76..1DA83;N # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH -1DA84;N # Mn SIGNWRITING LOCATION HEAD NECK -1DA85..1DA86;N # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS -1DA87..1DA8B;N # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS -1DA9B..1DA9F;N # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 -1DAA1..1DAAF;N # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 -1DF00..1DF09;N # Ll [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK -1DF0A;N # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK -1DF0B..1DF1E;N # Ll [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL -1DF25..1DF2A;N # Ll [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK -1E000..1E006;N # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE -1E008..1E018;N # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU -1E01B..1E021;N # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI -1E023..1E024;N # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS -1E026..1E02A;N # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA -1E030..1E06D;N # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE -1E08F;N # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -1E100..1E12C;N # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W -1E130..1E136;N # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D -1E137..1E13D;N # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER -1E140..1E149;N # Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE -1E14E;N # Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ -1E14F;N # So NYIAKENG PUACHUE HMONG CIRCLED CA -1E290..1E2AD;N # Lo [30] TOTO LETTER PA..TOTO LETTER A -1E2AE;N # Mn TOTO SIGN RISING TONE -1E2C0..1E2EB;N # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH -1E2EC..1E2EF;N # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI -1E2F0..1E2F9;N # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE -1E2FF;N # Sc WANCHO NGUN SIGN -1E4D0..1E4EA;N # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL -1E4EB;N # Lm NAG MUNDARI SIGN OJOD -1E4EC..1E4EF;N # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH -1E4F0..1E4F9;N # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE -1E7E0..1E7E6;N # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO -1E7E8..1E7EB;N # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE -1E7ED..1E7EE;N # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE -1E7F0..1E7FE;N # Lo [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE -1E800..1E8C4;N # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON -1E8C7..1E8CF;N # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE -1E8D0..1E8D6;N # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS -1E900..1E943;N # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA -1E944..1E94A;N # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA -1E94B;N # Lm ADLAM NASALIZATION MARK -1E950..1E959;N # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE -1E95E..1E95F;N # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK -1EC71..1ECAB;N # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE -1ECAC;N # So INDIC SIYAQ PLACEHOLDER -1ECAD..1ECAF;N # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS -1ECB0;N # Sc INDIC SIYAQ RUPEE MARK -1ECB1..1ECB4;N # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK -1ED01..1ED2D;N # No [45] OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ NUMBER NINETY THOUSAND -1ED2E;N # So OTTOMAN SIYAQ MARRATAN -1ED2F..1ED3D;N # No [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH -1EE00..1EE03;N # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL -1EE05..1EE1F;N # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF -1EE21..1EE22;N # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM -1EE24;N # Lo ARABIC MATHEMATICAL INITIAL HEH -1EE27;N # Lo ARABIC MATHEMATICAL INITIAL HAH -1EE29..1EE32;N # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF -1EE34..1EE37;N # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH -1EE39;N # Lo ARABIC MATHEMATICAL INITIAL DAD -1EE3B;N # Lo ARABIC MATHEMATICAL INITIAL GHAIN -1EE42;N # Lo ARABIC MATHEMATICAL TAILED JEEM -1EE47;N # Lo ARABIC MATHEMATICAL TAILED HAH -1EE49;N # Lo ARABIC MATHEMATICAL TAILED YEH -1EE4B;N # Lo ARABIC MATHEMATICAL TAILED LAM -1EE4D..1EE4F;N # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN -1EE51..1EE52;N # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF -1EE54;N # Lo ARABIC MATHEMATICAL TAILED SHEEN -1EE57;N # Lo ARABIC MATHEMATICAL TAILED KHAH -1EE59;N # Lo ARABIC MATHEMATICAL TAILED DAD -1EE5B;N # Lo ARABIC MATHEMATICAL TAILED GHAIN -1EE5D;N # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON -1EE5F;N # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF -1EE61..1EE62;N # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM -1EE64;N # Lo ARABIC MATHEMATICAL STRETCHED HEH -1EE67..1EE6A;N # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF -1EE6C..1EE72;N # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF -1EE74..1EE77;N # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH -1EE79..1EE7C;N # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH -1EE7E;N # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH -1EE80..1EE89;N # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH -1EE8B..1EE9B;N # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN -1EEA1..1EEA3;N # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL -1EEA5..1EEA9;N # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH -1EEAB..1EEBB;N # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN -1EEF0..1EEF1;N # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL -1F000..1F003;N # So [4] MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND -1F004;W # So MAHJONG TILE RED DRAGON -1F005..1F02B;N # So [39] MAHJONG TILE GREEN DRAGON..MAHJONG TILE BACK -1F030..1F093;N # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 -1F0A0..1F0AE;N # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES -1F0B1..1F0BF;N # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER -1F0C1..1F0CE;N # So [14] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD KING OF DIAMONDS -1F0CF;W # So PLAYING CARD BLACK JOKER -1F0D1..1F0F5;N # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 -1F100..1F10A;A # No [11] DIGIT ZERO FULL STOP..DIGIT NINE COMMA -1F10B..1F10C;N # No [2] DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO -1F10D..1F10F;N # So [3] CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH -1F110..1F12D;A # So [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD -1F12E..1F12F;N # So [2] CIRCLED WZ..COPYLEFT SYMBOL -1F130..1F169;A # So [58] SQUARED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z -1F16A..1F16F;N # So [6] RAISED MC SIGN..CIRCLED HUMAN FIGURE -1F170..1F18D;A # So [30] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED SA -1F18E;W # So NEGATIVE SQUARED AB -1F18F..1F190;A # So [2] NEGATIVE SQUARED WC..SQUARE DJ -1F191..1F19A;W # So [10] SQUARED CL..SQUARED VS -1F19B..1F1AC;A # So [18] SQUARED THREE D..SQUARED VOD -1F1AD;N # So MASK WORK SYMBOL -1F1E6..1F1FF;N # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z -1F200..1F202;W # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA -1F210..1F23B;W # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D -1F240..1F248;W # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 -1F250..1F251;W # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT -1F260..1F265;W # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI -1F300..1F320;W # So [33] CYCLONE..SHOOTING STAR -1F321..1F32C;N # So [12] THERMOMETER..WIND BLOWING FACE -1F32D..1F335;W # So [9] HOT DOG..CACTUS -1F336;N # So HOT PEPPER -1F337..1F37C;W # So [70] TULIP..BABY BOTTLE -1F37D;N # So FORK AND KNIFE WITH PLATE -1F37E..1F393;W # So [22] BOTTLE WITH POPPING CORK..GRADUATION CAP -1F394..1F39F;N # So [12] HEART WITH TIP ON THE LEFT..ADMISSION TICKETS -1F3A0..1F3CA;W # So [43] CAROUSEL HORSE..SWIMMER -1F3CB..1F3CE;N # So [4] WEIGHT LIFTER..RACING CAR -1F3CF..1F3D3;W # So [5] CRICKET BAT AND BALL..TABLE TENNIS PADDLE AND BALL -1F3D4..1F3DF;N # So [12] SNOW CAPPED MOUNTAIN..STADIUM -1F3E0..1F3F0;W # So [17] HOUSE BUILDING..EUROPEAN CASTLE -1F3F1..1F3F3;N # So [3] WHITE PENNANT..WAVING WHITE FLAG -1F3F4;W # So WAVING BLACK FLAG -1F3F5..1F3F7;N # So [3] ROSETTE..LABEL -1F3F8..1F3FA;W # So [3] BADMINTON RACQUET AND SHUTTLECOCK..AMPHORA -1F3FB..1F3FF;W # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400..1F43E;W # So [63] RAT..PAW PRINTS -1F43F;N # So CHIPMUNK -1F440;W # So EYES -1F441;N # So EYE -1F442..1F4FC;W # So [187] EAR..VIDEOCASSETTE -1F4FD..1F4FE;N # So [2] FILM PROJECTOR..PORTABLE STEREO -1F4FF..1F53D;W # So [63] PRAYER BEADS..DOWN-POINTING SMALL RED TRIANGLE -1F53E..1F54A;N # So [13] LOWER RIGHT SHADOWED WHITE CIRCLE..DOVE OF PEACE -1F54B..1F54E;W # So [4] KAABA..MENORAH WITH NINE BRANCHES -1F54F;N # So BOWL OF HYGIEIA -1F550..1F567;W # So [24] CLOCK FACE ONE OCLOCK..CLOCK FACE TWELVE-THIRTY -1F568..1F579;N # So [18] RIGHT SPEAKER..JOYSTICK -1F57A;W # So MAN DANCING -1F57B..1F594;N # So [26] LEFT HAND TELEPHONE RECEIVER..REVERSED VICTORY HAND -1F595..1F596;W # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS -1F597..1F5A3;N # So [13] WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX -1F5A4;W # So BLACK HEART -1F5A5..1F5FA;N # So [86] DESKTOP COMPUTER..WORLD MAP -1F5FB..1F5FF;W # So [5] MOUNT FUJI..MOYAI -1F600..1F64F;W # So [80] GRINNING FACE..PERSON WITH FOLDED HANDS -1F650..1F67F;N # So [48] NORTH WEST POINTING LEAF..REVERSE CHECKER BOARD -1F680..1F6C5;W # So [70] ROCKET..LEFT LUGGAGE -1F6C6..1F6CB;N # So [6] TRIANGLE WITH ROUNDED CORNERS..COUCH AND LAMP -1F6CC;W # So SLEEPING ACCOMMODATION -1F6CD..1F6CF;N # So [3] SHOPPING BAGS..BED -1F6D0..1F6D2;W # So [3] PLACE OF WORSHIP..SHOPPING TROLLEY -1F6D3..1F6D4;N # So [2] STUPA..PAGODA -1F6D5..1F6D7;W # So [3] HINDU TEMPLE..ELEVATOR -1F6DC..1F6DF;W # So [4] WIRELESS..RING BUOY -1F6E0..1F6EA;N # So [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE -1F6EB..1F6EC;W # So [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING -1F6F0..1F6F3;N # So [4] SATELLITE..PASSENGER SHIP -1F6F4..1F6FC;W # So [9] SCOOTER..ROLLER SKATE -1F700..1F776;N # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE -1F77B..1F77F;N # So [5] HAUMEA..ORCUS -1F780..1F7D9;N # So [90] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NINE POINTED WHITE STAR -1F7E0..1F7EB;W # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE -1F7F0;W # So HEAVY EQUALS SIGN -1F800..1F80B;N # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -1F810..1F847;N # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW -1F850..1F859;N # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW -1F860..1F887;N # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW -1F890..1F8AD;N # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F8B0..1F8B1;N # So [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST -1F900..1F90B;N # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT -1F90C..1F93A;W # So [47] PINCHED FINGERS..FENCER -1F93B;N # So MODERN PENTATHLON -1F93C..1F945;W # So [10] WRESTLERS..GOAL NET -1F946;N # So RIFLE -1F947..1F9FF;W # So [185] FIRST PLACE MEDAL..NAZAR AMULET -1FA00..1FA53;N # So [84] NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP -1FA60..1FA6D;N # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER -1FA70..1FA7C;W # So [13] BALLET SHOES..CRUTCH -1FA80..1FA88;W # So [9] YO-YO..FLUTE -1FA90..1FABD;W # So [46] RINGED PLANET..WING -1FABF..1FAC5;W # So [7] GOOSE..PERSON WITH CROWN -1FACE..1FADB;W # So [14] MOOSE..PEA POD -1FAE0..1FAE8;W # So [9] MELTING FACE..SHAKING FACE -1FAF0..1FAF8;W # So [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND -1FB00..1FB92;N # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK -1FB94..1FBCA;N # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON -1FBF0..1FBF9;N # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE -20000..2A6DF;W # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A6E0..2A6FF;W # Cn [32] .. -2A700..2B739;W # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 -2B73A..2B73F;W # Cn [6] .. -2B740..2B81D;W # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D -2B81E..2B81F;W # Cn [2] .. -2B820..2CEA1;W # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 -2CEA2..2CEAF;W # Cn [14] .. -2CEB0..2EBE0;W # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 -2EBE1..2F7FF;W # Cn [3103] .. -2F800..2FA1D;W # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -2FA1E..2FA1F;W # Cn [2] .. -2FA20..2FFFD;W # Cn [1502] .. -30000..3134A;W # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A -3134B..3134F;W # Cn [5] .. -31350..323AF;W # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -323B0..3FFFD;W # Cn [56398] .. -E0001;N # Cf LANGUAGE TAG -E0020..E007F;N # Cf [96] TAG SPACE..CANCEL TAG -E0100..E01EF;A # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -F0000..FFFFD;A # Co [65534] .. -100000..10FFFD;A # Co [65534] .. +0000..001F ; N # Cc [32] .. +0020 ; Na # Zs SPACE +0021..0023 ; Na # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Na # Sc DOLLAR SIGN +0025..0027 ; Na # Po [3] PERCENT SIGN..APOSTROPHE +0028 ; Na # Ps LEFT PARENTHESIS +0029 ; Na # Pe RIGHT PARENTHESIS +002A ; Na # Po ASTERISK +002B ; Na # Sm PLUS SIGN +002C ; Na # Po COMMA +002D ; Na # Pd HYPHEN-MINUS +002E..002F ; Na # Po [2] FULL STOP..SOLIDUS +0030..0039 ; Na # Nd [10] DIGIT ZERO..DIGIT NINE +003A..003B ; Na # Po [2] COLON..SEMICOLON +003C..003E ; Na # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; Na # Po [2] QUESTION MARK..COMMERCIAL AT +0041..005A ; Na # Lu [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +005B ; Na # Ps LEFT SQUARE BRACKET +005C ; Na # Po REVERSE SOLIDUS +005D ; Na # Pe RIGHT SQUARE BRACKET +005E ; Na # Sk CIRCUMFLEX ACCENT +005F ; Na # Pc LOW LINE +0060 ; Na # Sk GRAVE ACCENT +0061..007A ; Na # Ll [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +007B ; Na # Ps LEFT CURLY BRACKET +007C ; Na # Sm VERTICAL LINE +007D ; Na # Pe RIGHT CURLY BRACKET +007E ; Na # Sm TILDE +007F ; N # Cc +0080..009F ; N # Cc [32] .. +00A0 ; N # Zs NO-BREAK SPACE +00A1 ; A # Po INVERTED EXCLAMATION MARK +00A2..00A3 ; Na # Sc [2] CENT SIGN..POUND SIGN +00A4 ; A # Sc CURRENCY SIGN +00A5 ; Na # Sc YEN SIGN +00A6 ; Na # So BROKEN BAR +00A7 ; A # Po SECTION SIGN +00A8 ; A # Sk DIAERESIS +00A9 ; N # So COPYRIGHT SIGN +00AA ; A # Lo FEMININE ORDINAL INDICATOR +00AB ; N # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; Na # Sm NOT SIGN +00AD ; A # Cf SOFT HYPHEN +00AE ; A # So REGISTERED SIGN +00AF ; Na # Sk MACRON +00B0 ; A # So DEGREE SIGN +00B1 ; A # Sm PLUS-MINUS SIGN +00B2..00B3 ; A # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B4 ; A # Sk ACUTE ACCENT +00B5 ; N # Ll MICRO SIGN +00B6..00B7 ; A # Po [2] PILCROW SIGN..MIDDLE DOT +00B8 ; A # Sk CEDILLA +00B9 ; A # No SUPERSCRIPT ONE +00BA ; A # Lo MASCULINE ORDINAL INDICATOR +00BB ; N # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC..00BE ; A # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF ; A # Po INVERTED QUESTION MARK +00C0..00C5 ; N # Lu [6] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER A WITH RING ABOVE +00C6 ; A # Lu LATIN CAPITAL LETTER AE +00C7..00CF ; N # Lu [9] LATIN CAPITAL LETTER C WITH CEDILLA..LATIN CAPITAL LETTER I WITH DIAERESIS +00D0 ; A # Lu LATIN CAPITAL LETTER ETH +00D1..00D6 ; N # Lu [6] LATIN CAPITAL LETTER N WITH TILDE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D7 ; A # Sm MULTIPLICATION SIGN +00D8 ; A # Lu LATIN CAPITAL LETTER O WITH STROKE +00D9..00DD ; N # Lu [5] LATIN CAPITAL LETTER U WITH GRAVE..LATIN CAPITAL LETTER Y WITH ACUTE +00DE..00E1 ; A # L& [4] LATIN CAPITAL LETTER THORN..LATIN SMALL LETTER A WITH ACUTE +00E2..00E5 ; N # Ll [4] LATIN SMALL LETTER A WITH CIRCUMFLEX..LATIN SMALL LETTER A WITH RING ABOVE +00E6 ; A # Ll LATIN SMALL LETTER AE +00E7 ; N # Ll LATIN SMALL LETTER C WITH CEDILLA +00E8..00EA ; A # Ll [3] LATIN SMALL LETTER E WITH GRAVE..LATIN SMALL LETTER E WITH CIRCUMFLEX +00EB ; N # Ll LATIN SMALL LETTER E WITH DIAERESIS +00EC..00ED ; A # Ll [2] LATIN SMALL LETTER I WITH GRAVE..LATIN SMALL LETTER I WITH ACUTE +00EE..00EF ; N # Ll [2] LATIN SMALL LETTER I WITH CIRCUMFLEX..LATIN SMALL LETTER I WITH DIAERESIS +00F0 ; A # Ll LATIN SMALL LETTER ETH +00F1 ; N # Ll LATIN SMALL LETTER N WITH TILDE +00F2..00F3 ; A # Ll [2] LATIN SMALL LETTER O WITH GRAVE..LATIN SMALL LETTER O WITH ACUTE +00F4..00F6 ; N # Ll [3] LATIN SMALL LETTER O WITH CIRCUMFLEX..LATIN SMALL LETTER O WITH DIAERESIS +00F7 ; A # Sm DIVISION SIGN +00F8..00FA ; A # Ll [3] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER U WITH ACUTE +00FB ; N # Ll LATIN SMALL LETTER U WITH CIRCUMFLEX +00FC ; A # Ll LATIN SMALL LETTER U WITH DIAERESIS +00FD ; N # Ll LATIN SMALL LETTER Y WITH ACUTE +00FE ; A # Ll LATIN SMALL LETTER THORN +00FF ; N # Ll LATIN SMALL LETTER Y WITH DIAERESIS +0100 ; N # Lu LATIN CAPITAL LETTER A WITH MACRON +0101 ; A # Ll LATIN SMALL LETTER A WITH MACRON +0102..0110 ; N # L& [15] LATIN CAPITAL LETTER A WITH BREVE..LATIN CAPITAL LETTER D WITH STROKE +0111 ; A # Ll LATIN SMALL LETTER D WITH STROKE +0112 ; N # Lu LATIN CAPITAL LETTER E WITH MACRON +0113 ; A # Ll LATIN SMALL LETTER E WITH MACRON +0114..011A ; N # L& [7] LATIN CAPITAL LETTER E WITH BREVE..LATIN CAPITAL LETTER E WITH CARON +011B ; A # Ll LATIN SMALL LETTER E WITH CARON +011C..0125 ; N # L& [10] LATIN CAPITAL LETTER G WITH CIRCUMFLEX..LATIN SMALL LETTER H WITH CIRCUMFLEX +0126..0127 ; A # L& [2] LATIN CAPITAL LETTER H WITH STROKE..LATIN SMALL LETTER H WITH STROKE +0128..012A ; N # L& [3] LATIN CAPITAL LETTER I WITH TILDE..LATIN CAPITAL LETTER I WITH MACRON +012B ; A # Ll LATIN SMALL LETTER I WITH MACRON +012C..0130 ; N # L& [5] LATIN CAPITAL LETTER I WITH BREVE..LATIN CAPITAL LETTER I WITH DOT ABOVE +0131..0133 ; A # L& [3] LATIN SMALL LETTER DOTLESS I..LATIN SMALL LIGATURE IJ +0134..0137 ; N # L& [4] LATIN CAPITAL LETTER J WITH CIRCUMFLEX..LATIN SMALL LETTER K WITH CEDILLA +0138 ; A # Ll LATIN SMALL LETTER KRA +0139..013E ; N # L& [6] LATIN CAPITAL LETTER L WITH ACUTE..LATIN SMALL LETTER L WITH CARON +013F..0142 ; A # L& [4] LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN SMALL LETTER L WITH STROKE +0143 ; N # Lu LATIN CAPITAL LETTER N WITH ACUTE +0144 ; A # Ll LATIN SMALL LETTER N WITH ACUTE +0145..0147 ; N # L& [3] LATIN CAPITAL LETTER N WITH CEDILLA..LATIN CAPITAL LETTER N WITH CARON +0148..014B ; A # L& [4] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER ENG +014C ; N # Lu LATIN CAPITAL LETTER O WITH MACRON +014D ; A # Ll LATIN SMALL LETTER O WITH MACRON +014E..0151 ; N # L& [4] LATIN CAPITAL LETTER O WITH BREVE..LATIN SMALL LETTER O WITH DOUBLE ACUTE +0152..0153 ; A # L& [2] LATIN CAPITAL LIGATURE OE..LATIN SMALL LIGATURE OE +0154..0165 ; N # L& [18] LATIN CAPITAL LETTER R WITH ACUTE..LATIN SMALL LETTER T WITH CARON +0166..0167 ; A # L& [2] LATIN CAPITAL LETTER T WITH STROKE..LATIN SMALL LETTER T WITH STROKE +0168..016A ; N # L& [3] LATIN CAPITAL LETTER U WITH TILDE..LATIN CAPITAL LETTER U WITH MACRON +016B ; A # Ll LATIN SMALL LETTER U WITH MACRON +016C..017F ; N # L& [20] LATIN CAPITAL LETTER U WITH BREVE..LATIN SMALL LETTER LONG S +0180..01BA ; N # L& [59] LATIN SMALL LETTER B WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; N # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; N # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; N # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..01CD ; N # L& [10] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER A WITH CARON +01CE ; A # Ll LATIN SMALL LETTER A WITH CARON +01CF ; N # Lu LATIN CAPITAL LETTER I WITH CARON +01D0 ; A # Ll LATIN SMALL LETTER I WITH CARON +01D1 ; N # Lu LATIN CAPITAL LETTER O WITH CARON +01D2 ; A # Ll LATIN SMALL LETTER O WITH CARON +01D3 ; N # Lu LATIN CAPITAL LETTER U WITH CARON +01D4 ; A # Ll LATIN SMALL LETTER U WITH CARON +01D5 ; N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D6 ; A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D7 ; N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D8 ; A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D9 ; N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DA ; A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DB ; N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DC ; A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DD..024F ; N # L& [115] LATIN SMALL LETTER TURNED E..LATIN SMALL LETTER Y WITH STROKE +0250 ; N # Ll LATIN SMALL LETTER TURNED A +0251 ; A # Ll LATIN SMALL LETTER ALPHA +0252..0260 ; N # Ll [15] LATIN SMALL LETTER TURNED ALPHA..LATIN SMALL LETTER G WITH HOOK +0261 ; A # Ll LATIN SMALL LETTER SCRIPT G +0262..0293 ; N # Ll [50] LATIN LETTER SMALL CAPITAL G..LATIN SMALL LETTER EZH WITH CURL +0294 ; N # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; N # Ll [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1 ; N # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C3 ; N # Sk [2] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER RIGHT ARROWHEAD +02C4 ; A # Sk MODIFIER LETTER UP ARROWHEAD +02C5 ; N # Sk MODIFIER LETTER DOWN ARROWHEAD +02C6 ; N # Lm MODIFIER LETTER CIRCUMFLEX ACCENT +02C7 ; A # Lm CARON +02C8 ; N # Lm MODIFIER LETTER VERTICAL LINE +02C9..02CB ; A # Lm [3] MODIFIER LETTER MACRON..MODIFIER LETTER GRAVE ACCENT +02CC ; N # Lm MODIFIER LETTER LOW VERTICAL LINE +02CD ; A # Lm MODIFIER LETTER LOW MACRON +02CE..02CF ; N # Lm [2] MODIFIER LETTER LOW GRAVE ACCENT..MODIFIER LETTER LOW ACUTE ACCENT +02D0 ; A # Lm MODIFIER LETTER TRIANGULAR COLON +02D1 ; N # Lm MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02D7 ; N # Sk [6] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN +02D8..02DB ; A # Sk [4] BREVE..OGONEK +02DC ; N # Sk SMALL TILDE +02DD ; A # Sk DOUBLE ACUTE ACCENT +02DE ; N # Sk MODIFIER LETTER RHOTIC HOOK +02DF ; A # Sk MODIFIER LETTER CROSS ACCENT +02E0..02E4 ; N # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02EB ; N # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; N # Lm MODIFIER LETTER VOICING +02ED ; N # Sk MODIFIER LETTER UNASPIRATED +02EE ; N # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; N # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0300..036F ; A # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +0370..0373 ; N # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374 ; N # Lm GREEK NUMERAL SIGN +0375 ; N # Sk GREEK LOWER NUMERAL SIGN +0376..0377 ; N # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; N # Lm GREEK YPOGEGRAMMENI +037B..037D ; N # Ll [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037E ; N # Po GREEK QUESTION MARK +037F ; N # Lu GREEK CAPITAL LETTER YOT +0384..0385 ; N # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0386 ; N # Lu GREEK CAPITAL LETTER ALPHA WITH TONOS +0387 ; N # Po GREEK ANO TELEIA +0388..038A ; N # Lu [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; N # Lu GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..0390 ; N # L& [3] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391..03A1 ; A # Lu [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO +03A3..03A9 ; A # Lu [7] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER OMEGA +03AA..03B0 ; N # L& [7] GREEK CAPITAL LETTER IOTA WITH DIALYTIKA..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03B1..03C1 ; A # Ll [17] GREEK SMALL LETTER ALPHA..GREEK SMALL LETTER RHO +03C2 ; N # Ll GREEK SMALL LETTER FINAL SIGMA +03C3..03C9 ; A # Ll [7] GREEK SMALL LETTER SIGMA..GREEK SMALL LETTER OMEGA +03CA..03F5 ; N # L& [44] GREEK SMALL LETTER IOTA WITH DIALYTIKA..GREEK LUNATE EPSILON SYMBOL +03F6 ; N # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +03F7..03FF ; N # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400 ; N # Lu CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401 ; A # Lu CYRILLIC CAPITAL LETTER IO +0402..040F ; N # Lu [14] CYRILLIC CAPITAL LETTER DJE..CYRILLIC CAPITAL LETTER DZHE +0410..044F ; A # L& [64] CYRILLIC CAPITAL LETTER A..CYRILLIC SMALL LETTER YA +0450 ; N # Ll CYRILLIC SMALL LETTER IE WITH GRAVE +0451 ; A # Ll CYRILLIC SMALL LETTER IO +0452..0481 ; N # L& [48] CYRILLIC SMALL LETTER DJE..CYRILLIC SMALL LETTER KOPPA +0482 ; N # So CYRILLIC THOUSANDS SIGN +0483..0487 ; N # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +0488..0489 ; N # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +048A..04FF ; N # L& [118] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER HA WITH STROKE +0500..052F ; N # L& [48] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; N # Lu [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; N # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F ; N # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0560..0588 ; N # Ll [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +0589 ; N # Po ARMENIAN FULL STOP +058A ; N # Pd ARMENIAN HYPHEN +058D..058E ; N # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN +058F ; N # Sc ARMENIAN DRAM SIGN +0591..05BD ; N # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BE ; N # Pd HEBREW PUNCTUATION MAQAF +05BF ; N # Mn HEBREW POINT RAFE +05C0 ; N # Po HEBREW PUNCTUATION PASEQ +05C1..05C2 ; N # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C3 ; N # Po HEBREW PUNCTUATION SOF PASUQ +05C4..05C5 ; N # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C6 ; N # Po HEBREW PUNCTUATION NUN HAFUKHA +05C7 ; N # Mn HEBREW POINT QAMATS QATAN +05D0..05EA ; N # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; N # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4 ; N # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +0600..0605 ; N # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +0606..0608 ; N # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY +0609..060A ; N # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN +060B ; N # Sc AFGHANI SIGN +060C..060D ; N # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR +060E..060F ; N # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +0610..061A ; N # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +061B ; N # Po ARABIC SEMICOLON +061C ; N # Cf ARABIC LETTER MARK +061D..061F ; N # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK +0620..063F ; N # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640 ; N # Lm ARABIC TATWEEL +0641..064A ; N # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +064B..065F ; N # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +0660..0669 ; N # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066A..066D ; N # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR +066E..066F ; N # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0670 ; N # Mn ARABIC LETTER SUPERSCRIPT ALEF +0671..06D3 ; N # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ; N # Po ARABIC FULL STOP +06D5 ; N # Lo ARABIC LETTER AE +06D6..06DC ; N # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DD ; N # Cf ARABIC END OF AYAH +06DE ; N # So ARABIC START OF RUB EL HIZB +06DF..06E4 ; N # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6 ; N # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; N # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06E9 ; N # So ARABIC PLACE OF SAJDAH +06EA..06ED ; N # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF ; N # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; N # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC ; N # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE ; N # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ; N # Lo ARABIC LETTER HEH WITH INVERTED V +0700..070D ; N # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070F ; N # Cf SYRIAC ABBREVIATION MARK +0710 ; N # Lo SYRIAC LETTER ALAPH +0711 ; N # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F ; N # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A ; N # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..074F ; N # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE +0750..077F ; N # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE +0780..07A5 ; N # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU +07A6..07B0 ; N # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1 ; N # Lo THAANA LETTER NAA +07C0..07C9 ; N # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE +07CA..07EA ; N # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07EB..07F3 ; N # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5 ; N # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07F6 ; N # So NKO SYMBOL OO DENNEN +07F7..07F9 ; N # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK +07FA ; N # Lm NKO LAJANYALAN +07FD ; N # Mn NKO DANTAYALAN +07FE..07FF ; N # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN +0800..0815 ; N # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +0816..0819 ; N # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081A ; N # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823 ; N # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824 ; N # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827 ; N # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828 ; N # Lm SAMARITAN MODIFIER LETTER I +0829..082D ; N # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0830..083E ; N # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU +0840..0858 ; N # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0859..085B ; N # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +085E ; N # Po MANDAIC PUNCTUATION +0860..086A ; N # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +0870..0887 ; N # Lo [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT +0888 ; N # Sk ARABIC RAISED ROUND DOT +0889..088E ; N # Lo [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL +0890..0891 ; N # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE +0898..089F ; N # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA +08A0..08C8 ; N # Lo [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF +08C9 ; N # Lm ARABIC SMALL FARSI YEH +08CA..08E1 ; N # Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA +08E2 ; N # Cf ARABIC DISPUTED END OF AYAH +08E3..08FF ; N # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA +0900..0902 ; N # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA +0903 ; N # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; N # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093A ; N # Mn DEVANAGARI VOWEL SIGN OE +093B ; N # Mc DEVANAGARI VOWEL SIGN OOE +093C ; N # Mn DEVANAGARI SIGN NUKTA +093D ; N # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; N # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; N # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; N # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D ; N # Mn DEVANAGARI SIGN VIRAMA +094E..094F ; N # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950 ; N # Lo DEVANAGARI OM +0951..0957 ; N # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE +0958..0961 ; N # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963 ; N # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0964..0965 ; N # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0966..096F ; N # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0970 ; N # Po DEVANAGARI ABBREVIATION SIGN +0971 ; N # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..097F ; N # Lo [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA +0980 ; N # Lo BENGALI ANJI +0981 ; N # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; N # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; N # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; N # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; N # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; N # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; N # Lo BENGALI LETTER LA +09B6..09B9 ; N # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC ; N # Mn BENGALI SIGN NUKTA +09BD ; N # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; N # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; N # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; N # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; N # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD ; N # Mn BENGALI SIGN VIRAMA +09CE ; N # Lo BENGALI LETTER KHANDA TA +09D7 ; N # Mc BENGALI AU LENGTH MARK +09DC..09DD ; N # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; N # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3 ; N # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF ; N # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; N # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09F3 ; N # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +09F4..09F9 ; N # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; N # So BENGALI ISSHAR +09FB ; N # Sc BENGALI GANDA MARK +09FC ; N # Lo BENGALI LETTER VEDIC ANUSVARA +09FD ; N # Po BENGALI ABBREVIATION SIGN +09FE ; N # Mn BENGALI SANDHI MARK +0A01..0A02 ; N # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; N # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; N # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; N # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; N # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; N # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; N # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; N # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; N # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C ; N # Mn GURMUKHI SIGN NUKTA +0A3E..0A40 ; N # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; N # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; N # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; N # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51 ; N # Mn GURMUKHI SIGN UDAAT +0A59..0A5C ; N # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; N # Lo GURMUKHI LETTER FA +0A66..0A6F ; N # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71 ; N # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74 ; N # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A75 ; N # Mn GURMUKHI SIGN YAKASH +0A76 ; N # Po GURMUKHI ABBREVIATION SIGN +0A81..0A82 ; N # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; N # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; N # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; N # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; N # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; N # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; N # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; N # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC ; N # Mn GUJARATI SIGN NUKTA +0ABD ; N # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; N # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; N # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; N # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; N # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; N # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD ; N # Mn GUJARATI SIGN VIRAMA +0AD0 ; N # Lo GUJARATI OM +0AE0..0AE1 ; N # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3 ; N # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF ; N # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF0 ; N # Po GUJARATI ABBREVIATION SIGN +0AF1 ; N # Sc GUJARATI RUPEE SIGN +0AF9 ; N # Lo GUJARATI LETTER ZHA +0AFA..0AFF ; N # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0B01 ; N # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; N # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; N # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; N # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; N # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; N # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; N # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; N # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C ; N # Mn ORIYA SIGN NUKTA +0B3D ; N # Lo ORIYA SIGN AVAGRAHA +0B3E ; N # Mc ORIYA VOWEL SIGN AA +0B3F ; N # Mn ORIYA VOWEL SIGN I +0B40 ; N # Mc ORIYA VOWEL SIGN II +0B41..0B44 ; N # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48 ; N # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; N # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D ; N # Mn ORIYA SIGN VIRAMA +0B55..0B56 ; N # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK +0B57 ; N # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; N # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; N # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63 ; N # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B66..0B6F ; N # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70 ; N # So ORIYA ISSHAR +0B71 ; N # Lo ORIYA LETTER WA +0B72..0B77 ; N # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS +0B82 ; N # Mn TAMIL SIGN ANUSVARA +0B83 ; N # Lo TAMIL SIGN VISARGA +0B85..0B8A ; N # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; N # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; N # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; N # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; N # Lo TAMIL LETTER JA +0B9E..0B9F ; N # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; N # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; N # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; N # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF ; N # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; N # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; N # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; N # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; N # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD ; N # Mn TAMIL SIGN VIRAMA +0BD0 ; N # Lo TAMIL OM +0BD7 ; N # Mc TAMIL AU LENGTH MARK +0BE6..0BEF ; N # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0BF0..0BF2 ; N # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BF8 ; N # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BF9 ; N # Sc TAMIL RUPEE SIGN +0BFA ; N # So TAMIL NUMBER SIGN +0C00 ; N # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; N # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; N # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C05..0C0C ; N # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; N # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; N # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; N # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3C ; N # Mn TELUGU SIGN NUKTA +0C3D ; N # Lo TELUGU SIGN AVAGRAHA +0C3E..0C40 ; N # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; N # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; N # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; N # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; N # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C58..0C5A ; N # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C5D ; N # Lo TELUGU LETTER NAKAARA POLLU +0C60..0C61 ; N # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63 ; N # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C66..0C6F ; N # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C77 ; N # Po TELUGU SIGN SIDDHAM +0C78..0C7E ; N # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +0C7F ; N # So TELUGU SIGN TUUMU +0C80 ; N # Lo KANNADA SIGN SPACING CANDRABINDU +0C81 ; N # Mn KANNADA SIGN CANDRABINDU +0C82..0C83 ; N # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C84 ; N # Po KANNADA SIGN SIDDHAM +0C85..0C8C ; N # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; N # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; N # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; N # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; N # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC ; N # Mn KANNADA SIGN NUKTA +0CBD ; N # Lo KANNADA SIGN AVAGRAHA +0CBE ; N # Mc KANNADA VOWEL SIGN AA +0CBF ; N # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; N # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; N # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; N # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; N # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD ; N # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6 ; N # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDD..0CDE ; N # Lo [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA +0CE0..0CE1 ; N # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE2..0CE3 ; N # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CE6..0CEF ; N # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0CF1..0CF2 ; N # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; N # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT +0D00..0D01 ; N # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; N # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D04..0D0C ; N # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; N # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; N # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3B..0D3C ; N # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D3D ; N # Lo MALAYALAM SIGN AVAGRAHA +0D3E..0D40 ; N # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D44 ; N # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D46..0D48 ; N # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; N # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4D ; N # Mn MALAYALAM SIGN VIRAMA +0D4E ; N # Lo MALAYALAM LETTER DOT REPH +0D4F ; N # So MALAYALAM SIGN PARA +0D54..0D56 ; N # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D57 ; N # Mc MALAYALAM AU LENGTH MARK +0D58..0D5E ; N # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH +0D5F..0D61 ; N # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D62..0D63 ; N # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D66..0D6F ; N # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D70..0D78 ; N # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS +0D79 ; N # So MALAYALAM DATE MARK +0D7A..0D7F ; N # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +0D81 ; N # Mn SINHALA SIGN CANDRABINDU +0D82..0D83 ; N # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; N # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; N # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; N # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; N # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; N # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA ; N # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1 ; N # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; N # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; N # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; N # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DE6..0DEF ; N # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF2..0DF3 ; N # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 ; N # Po SINHALA PUNCTUATION KUNDDALIYA +0E01..0E30 ; N # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31 ; N # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33 ; N # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A ; N # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E3F ; N # Sc THAI CURRENCY SYMBOL BAHT +0E40..0E45 ; N # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; N # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E ; N # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E4F ; N # Po THAI CHARACTER FONGMAN +0E50..0E59 ; N # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B ; N # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0E81..0E82 ; N # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; N # Lo LAO LETTER KHO TAM +0E86..0E8A ; N # Lo [5] LAO LETTER PALI GHA..LAO LETTER SO TAM +0E8C..0EA3 ; N # Lo [24] LAO LETTER PALI JHA..LAO LETTER LO LING +0EA5 ; N # Lo LAO LETTER LO LOOT +0EA7..0EB0 ; N # Lo [10] LAO LETTER WO..LAO VOWEL SIGN A +0EB1 ; N # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3 ; N # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EBC ; N # Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO +0EBD ; N # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; N # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; N # Lm LAO KO LA +0EC8..0ECE ; N # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN +0ED0..0ED9 ; N # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDF ; N # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00 ; N # Lo TIBETAN SYLLABLE OM +0F01..0F03 ; N # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04..0F12 ; N # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD +0F13 ; N # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14 ; N # Po TIBETAN MARK GTER TSHEG +0F15..0F17 ; N # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18..0F19 ; N # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A..0F1F ; N # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29 ; N # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33 ; N # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34 ; N # So TIBETAN MARK BSDUS RTAGS +0F35 ; N # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F36 ; N # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37 ; N # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38 ; N # So TIBETAN MARK CHE MGO +0F39 ; N # Mn TIBETAN MARK TSA -PHRU +0F3A ; N # Ps TIBETAN MARK GUG RTAGS GYON +0F3B ; N # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C ; N # Ps TIBETAN MARK ANG KHANG GYON +0F3D ; N # Pe TIBETAN MARK ANG KHANG GYAS +0F3E..0F3F ; N # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; N # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; N # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F71..0F7E ; N # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; N # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84 ; N # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F85 ; N # Po TIBETAN MARK PALUTA +0F86..0F87 ; N # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8C ; N # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0F8D..0F97 ; N # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; N # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE..0FC5 ; N # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +0FC6 ; N # Mn TIBETAN SYMBOL PADMA GDAN +0FC7..0FCC ; N # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE..0FCF ; N # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM +0FD0..0FD4 ; N # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD5..0FD8 ; N # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS +0FD9..0FDA ; N # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS +1000..102A ; N # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C ; N # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030 ; N # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; N # Mc MYANMAR VOWEL SIGN E +1032..1037 ; N # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1038 ; N # Mc MYANMAR SIGN VISARGA +1039..103A ; N # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103B..103C ; N # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E ; N # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +103F ; N # Lo MYANMAR LETTER GREAT SA +1040..1049 ; N # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104F ; N # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +1050..1055 ; N # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; N # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; N # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105A..105D ; N # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +105E..1060 ; N # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1061 ; N # Lo MYANMAR LETTER SGAW KAREN SHA +1062..1064 ; N # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1065..1066 ; N # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..106D ; N # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +106E..1070 ; N # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1071..1074 ; N # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1075..1081 ; N # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1082 ; N # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084 ; N # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086 ; N # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C ; N # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; N # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108E ; N # Lo MYANMAR LETTER RUMAI PALAUNG FA +108F ; N # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +1090..1099 ; N # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +109A..109C ; N # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D ; N # Mn MYANMAR VOWEL SIGN AITON AI +109E..109F ; N # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION +10A0..10C5 ; N # Lu [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; N # Lu GEORGIAN CAPITAL LETTER YN +10CD ; N # Lu GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; N # Ll [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FB ; N # Po GEORGIAN PARAGRAPH SEPARATOR +10FC ; N # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; N # Ll [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..115F ; W # Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER +1160..11FF ; N # Lo [160] HANGUL JUNGSEONG FILLER..HANGUL JONGSEONG SSANGNIEUN +1200..1248 ; N # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA +124A..124D ; N # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; N # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; N # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; N # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; N # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; N # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; N # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; N # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; N # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; N # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; N # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; N # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; N # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; N # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; N # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135D..135F ; N # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1360..1368 ; N # Po [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +1369..137C ; N # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND +1380..138F ; N # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +1390..1399 ; N # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +13A0..13F5 ; N # Lu [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; N # Ll [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1400 ; N # Pd CANADIAN SYLLABICS HYPHEN +1401..166C ; N # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D ; N # So CANADIAN SYLLABICS CHI SIGN +166E ; N # Po CANADIAN SYLLABICS FULL STOP +166F..167F ; N # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1680 ; N # Zs OGHAM SPACE MARK +1681..169A ; N # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B ; N # Ps OGHAM FEATHER MARK +169C ; N # Pe OGHAM REVERSED FEATHER MARK +16A0..16EA ; N # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EB..16ED ; N # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +16EE..16F0 ; N # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; N # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..1711 ; N # Lo [18] TAGALOG LETTER A..TAGALOG LETTER HA +1712..1714 ; N # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1715 ; N # Mc TAGALOG SIGN PAMUDPOD +171F ; N # Lo TAGALOG LETTER ARCHAIC RA +1720..1731 ; N # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1733 ; N # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U +1734 ; N # Mc HANUNOO SIGN PAMUDPOD +1735..1736 ; N # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1740..1751 ; N # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753 ; N # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1760..176C ; N # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; N # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773 ; N # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +1780..17B3 ; N # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; N # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6 ; N # Mc KHMER VOWEL SIGN AA +17B7..17BD ; N # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; N # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; N # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; N # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3 ; N # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D4..17D6 ; N # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17D7 ; N # Lm KHMER SIGN LEK TOO +17D8..17DA ; N # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT +17DB ; N # Sc KHMER CURRENCY SYMBOL RIEL +17DC ; N # Lo KHMER SIGN AVAKRAHASANYA +17DD ; N # Mn KHMER SIGN ATTHACAN +17E0..17E9 ; N # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +17F0..17F9 ; N # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +1800..1805 ; N # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS +1806 ; N # Pd MONGOLIAN TODO SOFT HYPHEN +1807..180A ; N # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +180B..180D ; N # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; N # Cf MONGOLIAN VOWEL SEPARATOR +180F ; N # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR +1810..1819 ; N # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; N # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; N # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; N # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; N # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; N # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; N # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 ; N # Mn MONGOLIAN LETTER ALI GALI DAGALGA +18AA ; N # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +18B0..18F5 ; N # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +1900..191E ; N # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1920..1922 ; N # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; N # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; N # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; N # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; N # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; N # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; N # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B ; N # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1940 ; N # So LIMBU SIGN LOO +1944..1945 ; N # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..194F ; N # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE +1950..196D ; N # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; N # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB ; N # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; N # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19D0..19D9 ; N # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA ; N # No NEW TAI LUE THAM DIGIT ONE +19DE..19DF ; N # So [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV +19E0..19FF ; N # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC +1A00..1A16 ; N # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18 ; N # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A ; N # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; N # Mn BUGINESE VOWEL SIGN AE +1A1E..1A1F ; N # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION +1A20..1A54 ; N # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55 ; N # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; N # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; N # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E ; N # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60 ; N # Mn TAI THAM SIGN SAKOT +1A61 ; N # Mc TAI THAM VOWEL SIGN A +1A62 ; N # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64 ; N # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C ; N # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72 ; N # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A7C ; N # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; N # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1A80..1A89 ; N # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +1A90..1A99 ; N # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1AA0..1AA6 ; N # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA +1AA7 ; N # Lm TAI THAM SIGN MAI YAMOK +1AA8..1AAD ; N # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG +1AB0..1ABD ; N # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE ; N # Me COMBINING PARENTHESES OVERLAY +1ABF..1ACE ; N # Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T +1B00..1B03 ; N # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04 ; N # Mc BALINESE SIGN BISAH +1B05..1B33 ; N # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B34 ; N # Mn BALINESE SIGN REREKAN +1B35 ; N # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A ; N # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B ; N # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; N # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41 ; N # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; N # Mn BALINESE VOWEL SIGN PEPET +1B43..1B44 ; N # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1B45..1B4C ; N # Lo [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA +1B50..1B59 ; N # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B5A..1B60 ; N # Po [7] BALINESE PANTI..BALINESE PAMENENG +1B61..1B6A ; N # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE +1B6B..1B73 ; N # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B74..1B7C ; N # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1B7D..1B7E ; N # Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG +1B80..1B81 ; N # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82 ; N # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0 ; N # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1 ; N # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5 ; N # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7 ; N # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9 ; N # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAA ; N # Mc SUNDANESE SIGN PAMAAEH +1BAB..1BAD ; N # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BAF ; N # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BB0..1BB9 ; N # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +1BBA..1BBF ; N # Lo [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M +1BC0..1BE5 ; N # Lo [38] BATAK LETTER A..BATAK LETTER U +1BE6 ; N # Mn BATAK SIGN TOMPI +1BE7 ; N # Mc BATAK VOWEL SIGN E +1BE8..1BE9 ; N # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC ; N # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED ; N # Mn BATAK VOWEL SIGN KARO O +1BEE ; N # Mc BATAK VOWEL SIGN U +1BEF..1BF1 ; N # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1BF2..1BF3 ; N # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1BFC..1BFF ; N # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT +1C00..1C23 ; N # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B ; N # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33 ; N # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35 ; N # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36..1C37 ; N # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C3B..1C3F ; N # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C40..1C49 ; N # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4D..1C4F ; N # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C50..1C59 ; N # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +1C5A..1C77 ; N # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; N # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C7E..1C7F ; N # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +1C80..1C88 ; N # Ll [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; N # Lu [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; N # Lu [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1CC0..1CC7 ; N # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA +1CD0..1CD2 ; N # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD3 ; N # Po VEDIC SIGN NIHSHVASA +1CD4..1CE0 ; N # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE1 ; N # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE2..1CE8 ; N # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CE9..1CEC ; N # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CED ; N # Mn VEDIC SIGN TIRYAK +1CEE..1CF3 ; N # Lo [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA +1CF4 ; N # Mn VEDIC TONE CANDRA ABOVE +1CF5..1CF6 ; N # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7 ; N # Mc VEDIC SIGN ATIKRAMA +1CF8..1CF9 ; N # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1CFA ; N # Lo VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA +1D00..1D2B ; N # Ll [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; N # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; N # Ll [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; N # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D7F ; N # Ll [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE +1D80..1D9A ; N # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; N # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1DC0..1DFF ; N # Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1E00..1EFF ; N # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP +1F00..1F15 ; N # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; N # Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; N # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; N # Lu [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; N # Ll [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; N # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; N # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; N # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD ; N # Sk GREEK KORONIS +1FBE ; N # Ll GREEK PROSGEGRAMMENI +1FBF..1FC1 ; N # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4 ; N # Ll [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; N # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF ; N # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3 ; N # Ll [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; N # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF ; N # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC ; N # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF ; N # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4 ; N # Ll [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; N # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD..1FFE ; N # Sk [2] GREEK OXIA..GREEK DASIA +2000..200A ; N # Zs [11] EN QUAD..HAIR SPACE +200B..200F ; N # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK +2010 ; A # Pd HYPHEN +2011..2012 ; N # Pd [2] NON-BREAKING HYPHEN..FIGURE DASH +2013..2015 ; A # Pd [3] EN DASH..HORIZONTAL BAR +2016 ; A # Po DOUBLE VERTICAL LINE +2017 ; N # Po DOUBLE LOW LINE +2018 ; A # Pi LEFT SINGLE QUOTATION MARK +2019 ; A # Pf RIGHT SINGLE QUOTATION MARK +201A ; N # Ps SINGLE LOW-9 QUOTATION MARK +201B ; N # Pi SINGLE HIGH-REVERSED-9 QUOTATION MARK +201C ; A # Pi LEFT DOUBLE QUOTATION MARK +201D ; A # Pf RIGHT DOUBLE QUOTATION MARK +201E ; N # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; N # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2022 ; A # Po [3] DAGGER..BULLET +2023 ; N # Po TRIANGULAR BULLET +2024..2027 ; A # Po [4] ONE DOT LEADER..HYPHENATION POINT +2028 ; N # Zl LINE SEPARATOR +2029 ; N # Zp PARAGRAPH SEPARATOR +202A..202E ; N # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +202F ; N # Zs NARROW NO-BREAK SPACE +2030 ; A # Po PER MILLE SIGN +2031 ; N # Po PER TEN THOUSAND SIGN +2032..2033 ; A # Po [2] PRIME..DOUBLE PRIME +2034 ; N # Po TRIPLE PRIME +2035 ; A # Po REVERSED PRIME +2036..2038 ; N # Po [3] REVERSED DOUBLE PRIME..CARET +2039 ; N # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; N # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B ; A # Po REFERENCE MARK +203C..203D ; N # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +203E ; A # Po OVERLINE +203F..2040 ; N # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043 ; N # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; N # Sm FRACTION SLASH +2045 ; N # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; N # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; N # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; N # Sm COMMERCIAL MINUS SIGN +2053 ; N # Po SWUNG DASH +2054 ; N # Pc INVERTED UNDERTIE +2055..205E ; N # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +205F ; N # Zs MEDIUM MATHEMATICAL SPACE +2060..2064 ; N # Cf [5] WORD JOINER..INVISIBLE PLUS +2066..206F ; N # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES +2070 ; N # No SUPERSCRIPT ZERO +2071 ; N # Lm SUPERSCRIPT LATIN SMALL LETTER I +2074 ; A # No SUPERSCRIPT FOUR +2075..2079 ; N # No [5] SUPERSCRIPT FIVE..SUPERSCRIPT NINE +207A..207C ; N # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; N # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; N # Pe SUPERSCRIPT RIGHT PARENTHESIS +207F ; A # Lm SUPERSCRIPT LATIN SMALL LETTER N +2080 ; N # No SUBSCRIPT ZERO +2081..2084 ; A # No [4] SUBSCRIPT ONE..SUBSCRIPT FOUR +2085..2089 ; N # No [5] SUBSCRIPT FIVE..SUBSCRIPT NINE +208A..208C ; N # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; N # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; N # Pe SUBSCRIPT RIGHT PARENTHESIS +2090..209C ; N # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +20A0..20A8 ; N # Sc [9] EURO-CURRENCY SIGN..RUPEE SIGN +20A9 ; H # Sc WON SIGN +20AA..20AB ; N # Sc [2] NEW SHEQEL SIGN..DONG SIGN +20AC ; A # Sc EURO SIGN +20AD..20C0 ; N # Sc [20] KIP SIGN..SOM SIGN +20D0..20DC ; N # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20DD..20E0 ; N # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 ; N # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E4 ; N # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20F0 ; N # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +2100..2101 ; N # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2102 ; N # Lu DOUBLE-STRUCK CAPITAL C +2103 ; A # So DEGREE CELSIUS +2104 ; N # So CENTRE LINE SYMBOL +2105 ; A # So CARE OF +2106 ; N # So CADA UNA +2107 ; N # Lu EULER CONSTANT +2108 ; N # So SCRUPLE +2109 ; A # So DEGREE FAHRENHEIT +210A..2112 ; N # L& [9] SCRIPT SMALL G..SCRIPT CAPITAL L +2113 ; A # Ll SCRIPT SMALL L +2114 ; N # So L B BAR SYMBOL +2115 ; N # Lu DOUBLE-STRUCK CAPITAL N +2116 ; A # So NUMERO SIGN +2117 ; N # So SOUND RECORDING COPYRIGHT +2118 ; N # Sm SCRIPT CAPITAL P +2119..211D ; N # Lu [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +211E..2120 ; N # So [3] PRESCRIPTION TAKE..SERVICE MARK +2121..2122 ; A # So [2] TELEPHONE SIGN..TRADE MARK SIGN +2123 ; N # So VERSICLE +2124 ; N # Lu DOUBLE-STRUCK CAPITAL Z +2125 ; N # So OUNCE SIGN +2126 ; A # Lu OHM SIGN +2127 ; N # So INVERTED OHM SIGN +2128 ; N # Lu BLACK-LETTER CAPITAL Z +2129 ; N # So TURNED GREEK SMALL LETTER IOTA +212A ; N # Lu KELVIN SIGN +212B ; A # Lu ANGSTROM SIGN +212C..212D ; N # Lu [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212E ; N # So ESTIMATED SYMBOL +212F..2134 ; N # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138 ; N # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; N # Ll INFORMATION SOURCE +213A..213B ; N # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +213C..213F ; N # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2140..2144 ; N # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149 ; N # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214A ; N # So PROPERTY LINE +214B ; N # Sm TURNED AMPERSAND +214C..214D ; N # So [2] PER SIGN..AKTIESELSKAB +214E ; N # Ll TURNED SMALL F +214F ; N # So SYMBOL FOR SAMARITAN SOURCE +2150..2152 ; N # No [3] VULGAR FRACTION ONE SEVENTH..VULGAR FRACTION ONE TENTH +2153..2154 ; A # No [2] VULGAR FRACTION ONE THIRD..VULGAR FRACTION TWO THIRDS +2155..215A ; N # No [6] VULGAR FRACTION ONE FIFTH..VULGAR FRACTION FIVE SIXTHS +215B..215E ; A # No [4] VULGAR FRACTION ONE EIGHTH..VULGAR FRACTION SEVEN EIGHTHS +215F ; N # No FRACTION NUMERATOR ONE +2160..216B ; A # Nl [12] ROMAN NUMERAL ONE..ROMAN NUMERAL TWELVE +216C..216F ; N # Nl [4] ROMAN NUMERAL FIFTY..ROMAN NUMERAL ONE THOUSAND +2170..2179 ; A # Nl [10] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL TEN +217A..2182 ; N # Nl [9] SMALL ROMAN NUMERAL ELEVEN..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; N # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; N # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2189 ; A # No VULGAR FRACTION ZERO THIRDS +218A..218B ; N # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE +2190..2194 ; A # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; A # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; N # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; N # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; N # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; N # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; N # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; N # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; N # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; N # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; N # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21B7 ; N # So [9] DOWNWARDS ZIGZAG ARROW..CLOCKWISE TOP SEMICIRCLE ARROW +21B8..21B9 ; A # So [2] NORTH WEST ARROW TO LONG BAR..LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +21BA..21CD ; N # So [20] ANTICLOCKWISE OPEN CIRCLE ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; N # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; N # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; A # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; N # So DOWNWARDS DOUBLE ARROW +21D4 ; A # Sm LEFT RIGHT DOUBLE ARROW +21D5..21E6 ; N # So [18] UP DOWN DOUBLE ARROW..LEFTWARDS WHITE ARROW +21E7 ; A # So UPWARDS WHITE ARROW +21E8..21F3 ; N # So [12] RIGHTWARDS WHITE ARROW..UP DOWN WHITE ARROW +21F4..21FF ; N # Sm [12] RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW +2200 ; A # Sm FOR ALL +2201 ; N # Sm COMPLEMENT +2202..2203 ; A # Sm [2] PARTIAL DIFFERENTIAL..THERE EXISTS +2204..2206 ; N # Sm [3] THERE DOES NOT EXIST..INCREMENT +2207..2208 ; A # Sm [2] NABLA..ELEMENT OF +2209..220A ; N # Sm [2] NOT AN ELEMENT OF..SMALL ELEMENT OF +220B ; A # Sm CONTAINS AS MEMBER +220C..220E ; N # Sm [3] DOES NOT CONTAIN AS MEMBER..END OF PROOF +220F ; A # Sm N-ARY PRODUCT +2210 ; N # Sm N-ARY COPRODUCT +2211 ; A # Sm N-ARY SUMMATION +2212..2214 ; N # Sm [3] MINUS SIGN..DOT PLUS +2215 ; A # Sm DIVISION SLASH +2216..2219 ; N # Sm [4] SET MINUS..BULLET OPERATOR +221A ; A # Sm SQUARE ROOT +221B..221C ; N # Sm [2] CUBE ROOT..FOURTH ROOT +221D..2220 ; A # Sm [4] PROPORTIONAL TO..ANGLE +2221..2222 ; N # Sm [2] MEASURED ANGLE..SPHERICAL ANGLE +2223 ; A # Sm DIVIDES +2224 ; N # Sm DOES NOT DIVIDE +2225 ; A # Sm PARALLEL TO +2226 ; N # Sm NOT PARALLEL TO +2227..222C ; A # Sm [6] LOGICAL AND..DOUBLE INTEGRAL +222D ; N # Sm TRIPLE INTEGRAL +222E ; A # Sm CONTOUR INTEGRAL +222F..2233 ; N # Sm [5] SURFACE INTEGRAL..ANTICLOCKWISE CONTOUR INTEGRAL +2234..2237 ; A # Sm [4] THEREFORE..PROPORTION +2238..223B ; N # Sm [4] DOT MINUS..HOMOTHETIC +223C..223D ; A # Sm [2] TILDE OPERATOR..REVERSED TILDE +223E..2247 ; N # Sm [10] INVERTED LAZY S..NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2248 ; A # Sm ALMOST EQUAL TO +2249..224B ; N # Sm [3] NOT ALMOST EQUAL TO..TRIPLE TILDE +224C ; A # Sm ALL EQUAL TO +224D..2251 ; N # Sm [5] EQUIVALENT TO..GEOMETRICALLY EQUAL TO +2252 ; A # Sm APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253..225F ; N # Sm [13] IMAGE OF OR APPROXIMATELY EQUAL TO..QUESTIONED EQUAL TO +2260..2261 ; A # Sm [2] NOT EQUAL TO..IDENTICAL TO +2262..2263 ; N # Sm [2] NOT IDENTICAL TO..STRICTLY EQUIVALENT TO +2264..2267 ; A # Sm [4] LESS-THAN OR EQUAL TO..GREATER-THAN OVER EQUAL TO +2268..2269 ; N # Sm [2] LESS-THAN BUT NOT EQUAL TO..GREATER-THAN BUT NOT EQUAL TO +226A..226B ; A # Sm [2] MUCH LESS-THAN..MUCH GREATER-THAN +226C..226D ; N # Sm [2] BETWEEN..NOT EQUIVALENT TO +226E..226F ; A # Sm [2] NOT LESS-THAN..NOT GREATER-THAN +2270..2281 ; N # Sm [18] NEITHER LESS-THAN NOR EQUAL TO..DOES NOT SUCCEED +2282..2283 ; A # Sm [2] SUBSET OF..SUPERSET OF +2284..2285 ; N # Sm [2] NOT A SUBSET OF..NOT A SUPERSET OF +2286..2287 ; A # Sm [2] SUBSET OF OR EQUAL TO..SUPERSET OF OR EQUAL TO +2288..2294 ; N # Sm [13] NEITHER A SUBSET OF NOR EQUAL TO..SQUARE CUP +2295 ; A # Sm CIRCLED PLUS +2296..2298 ; N # Sm [3] CIRCLED MINUS..CIRCLED DIVISION SLASH +2299 ; A # Sm CIRCLED DOT OPERATOR +229A..22A4 ; N # Sm [11] CIRCLED RING OPERATOR..DOWN TACK +22A5 ; A # Sm UP TACK +22A6..22BE ; N # Sm [25] ASSERTION..RIGHT ANGLE WITH ARC +22BF ; A # Sm RIGHT TRIANGLE +22C0..22FF ; N # Sm [64] N-ARY LOGICAL AND..Z NOTATION BAG MEMBERSHIP +2300..2307 ; N # So [8] DIAMETER SIGN..WAVY LINE +2308 ; N # Ps LEFT CEILING +2309 ; N # Pe RIGHT CEILING +230A ; N # Ps LEFT FLOOR +230B ; N # Pe RIGHT FLOOR +230C..2311 ; N # So [6] BOTTOM RIGHT CROP..SQUARE LOZENGE +2312 ; A # So ARC +2313..2319 ; N # So [7] SEGMENT..TURNED NOT SIGN +231A..231B ; W # So [2] WATCH..HOURGLASS +231C..231F ; N # So [4] TOP LEFT CORNER..BOTTOM RIGHT CORNER +2320..2321 ; N # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; N # So [7] FROWN..KEYBOARD +2329 ; W # Ps LEFT-POINTING ANGLE BRACKET +232A ; W # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B ; N # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; N # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; N # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; N # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4..23DB ; N # So [40] TOP SQUARE BRACKET..FUSE +23DC..23E1 ; N # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET +23E2..23E8 ; N # So [7] WHITE TRAPEZIUM..DECIMAL EXPONENT SYMBOL +23E9..23EC ; W # So [4] BLACK RIGHT-POINTING DOUBLE TRIANGLE..BLACK DOWN-POINTING DOUBLE TRIANGLE +23ED..23EF ; N # So [3] BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR..BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR +23F0 ; W # So ALARM CLOCK +23F1..23F2 ; N # So [2] STOPWATCH..TIMER CLOCK +23F3 ; W # So HOURGLASS WITH FLOWING SAND +23F4..23FF ; N # So [12] BLACK MEDIUM LEFT-POINTING TRIANGLE..OBSERVER EYE SYMBOL +2400..2426 ; N # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO +2440..244A ; N # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +2460..249B ; A # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP +249C..24E9 ; A # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EA ; N # No CIRCLED DIGIT ZERO +24EB..24FF ; A # No [21] NEGATIVE CIRCLED NUMBER ELEVEN..NEGATIVE CIRCLED DIGIT ZERO +2500..254B ; A # So [76] BOX DRAWINGS LIGHT HORIZONTAL..BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C..254F ; N # So [4] BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL..BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550..2573 ; A # So [36] BOX DRAWINGS DOUBLE HORIZONTAL..BOX DRAWINGS LIGHT DIAGONAL CROSS +2574..257F ; N # So [12] BOX DRAWINGS LIGHT LEFT..BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2580..258F ; A # So [16] UPPER HALF BLOCK..LEFT ONE EIGHTH BLOCK +2590..2591 ; N # So [2] RIGHT HALF BLOCK..LIGHT SHADE +2592..2595 ; A # So [4] MEDIUM SHADE..RIGHT ONE EIGHTH BLOCK +2596..259F ; N # So [10] QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0..25A1 ; A # So [2] BLACK SQUARE..WHITE SQUARE +25A2 ; N # So WHITE SQUARE WITH ROUNDED CORNERS +25A3..25A9 ; A # So [7] WHITE SQUARE CONTAINING BLACK SMALL SQUARE..SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA..25B1 ; N # So [8] BLACK SMALL SQUARE..WHITE PARALLELOGRAM +25B2..25B3 ; A # So [2] BLACK UP-POINTING TRIANGLE..WHITE UP-POINTING TRIANGLE +25B4..25B5 ; N # So [2] BLACK UP-POINTING SMALL TRIANGLE..WHITE UP-POINTING SMALL TRIANGLE +25B6 ; A # So BLACK RIGHT-POINTING TRIANGLE +25B7 ; A # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25BB ; N # So [4] BLACK RIGHT-POINTING SMALL TRIANGLE..WHITE RIGHT-POINTING POINTER +25BC..25BD ; A # So [2] BLACK DOWN-POINTING TRIANGLE..WHITE DOWN-POINTING TRIANGLE +25BE..25BF ; N # So [2] BLACK DOWN-POINTING SMALL TRIANGLE..WHITE DOWN-POINTING SMALL TRIANGLE +25C0 ; A # So BLACK LEFT-POINTING TRIANGLE +25C1 ; A # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25C5 ; N # So [4] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE LEFT-POINTING POINTER +25C6..25C8 ; A # So [3] BLACK DIAMOND..WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9..25CA ; N # So [2] FISHEYE..LOZENGE +25CB ; A # So WHITE CIRCLE +25CC..25CD ; N # So [2] DOTTED CIRCLE..CIRCLE WITH VERTICAL FILL +25CE..25D1 ; A # So [4] BULLSEYE..CIRCLE WITH RIGHT HALF BLACK +25D2..25E1 ; N # So [16] CIRCLE WITH LOWER HALF BLACK..LOWER HALF CIRCLE +25E2..25E5 ; A # So [4] BLACK LOWER RIGHT TRIANGLE..BLACK UPPER RIGHT TRIANGLE +25E6..25EE ; N # So [9] WHITE BULLET..UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25EF ; A # So LARGE CIRCLE +25F0..25F7 ; N # So [8] WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FC ; N # Sm [5] UPPER LEFT TRIANGLE..BLACK MEDIUM SQUARE +25FD..25FE ; W # Sm [2] WHITE MEDIUM SMALL SQUARE..BLACK MEDIUM SMALL SQUARE +25FF ; N # Sm LOWER RIGHT TRIANGLE +2600..2604 ; N # So [5] BLACK SUN WITH RAYS..COMET +2605..2606 ; A # So [2] BLACK STAR..WHITE STAR +2607..2608 ; N # So [2] LIGHTNING..THUNDERSTORM +2609 ; A # So SUN +260A..260D ; N # So [4] ASCENDING NODE..OPPOSITION +260E..260F ; A # So [2] BLACK TELEPHONE..WHITE TELEPHONE +2610..2613 ; N # So [4] BALLOT BOX..SALTIRE +2614..2615 ; W # So [2] UMBRELLA WITH RAIN DROPS..HOT BEVERAGE +2616..261B ; N # So [6] WHITE SHOGI PIECE..BLACK RIGHT POINTING INDEX +261C ; A # So WHITE LEFT POINTING INDEX +261D ; N # So WHITE UP POINTING INDEX +261E ; A # So WHITE RIGHT POINTING INDEX +261F..263F ; N # So [33] WHITE DOWN POINTING INDEX..MERCURY +2640 ; A # So FEMALE SIGN +2641 ; N # So EARTH +2642 ; A # So MALE SIGN +2643..2647 ; N # So [5] JUPITER..PLUTO +2648..2653 ; W # So [12] ARIES..PISCES +2654..265F ; N # So [12] WHITE CHESS KING..BLACK CHESS PAWN +2660..2661 ; A # So [2] BLACK SPADE SUIT..WHITE HEART SUIT +2662 ; N # So WHITE DIAMOND SUIT +2663..2665 ; A # So [3] BLACK CLUB SUIT..BLACK HEART SUIT +2666 ; N # So BLACK DIAMOND SUIT +2667..266A ; A # So [4] WHITE CLUB SUIT..EIGHTH NOTE +266B ; N # So BEAMED EIGHTH NOTES +266C..266D ; A # So [2] BEAMED SIXTEENTH NOTES..MUSIC FLAT SIGN +266E ; N # So MUSIC NATURAL SIGN +266F ; A # Sm MUSIC SHARP SIGN +2670..267E ; N # So [15] WEST SYRIAC CROSS..PERMANENT PAPER SIGN +267F ; W # So WHEELCHAIR SYMBOL +2680..2692 ; N # So [19] DIE FACE-1..HAMMER AND PICK +2693 ; W # So ANCHOR +2694..269D ; N # So [10] CROSSED SWORDS..OUTLINED WHITE STAR +269E..269F ; A # So [2] THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT +26A0 ; N # So WARNING SIGN +26A1 ; W # So HIGH VOLTAGE SIGN +26A2..26A9 ; N # So [8] DOUBLED FEMALE SIGN..HORIZONTAL MALE WITH STROKE SIGN +26AA..26AB ; W # So [2] MEDIUM WHITE CIRCLE..MEDIUM BLACK CIRCLE +26AC..26BC ; N # So [17] MEDIUM SMALL WHITE CIRCLE..SESQUIQUADRATE +26BD..26BE ; W # So [2] SOCCER BALL..BASEBALL +26BF ; A # So SQUARED KEY +26C0..26C3 ; N # So [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING +26C4..26C5 ; W # So [2] SNOWMAN WITHOUT SNOW..SUN BEHIND CLOUD +26C6..26CD ; A # So [8] RAIN..DISABLED CAR +26CE ; W # So OPHIUCHUS +26CF..26D3 ; A # So [5] PICK..CHAINS +26D4 ; W # So NO ENTRY +26D5..26E1 ; A # So [13] ALTERNATE ONE-WAY LEFT WAY TRAFFIC..RESTRICTED LEFT ENTRY-2 +26E2 ; N # So ASTRONOMICAL SYMBOL FOR URANUS +26E3 ; A # So HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE +26E4..26E7 ; N # So [4] PENTAGRAM..INVERTED PENTAGRAM +26E8..26E9 ; A # So [2] BLACK CROSS ON SHIELD..SHINTO SHRINE +26EA ; W # So CHURCH +26EB..26F1 ; A # So [7] CASTLE..UMBRELLA ON GROUND +26F2..26F3 ; W # So [2] FOUNTAIN..FLAG IN HOLE +26F4 ; A # So FERRY +26F5 ; W # So SAILBOAT +26F6..26F9 ; A # So [4] SQUARE FOUR CORNERS..PERSON WITH BALL +26FA ; W # So TENT +26FB..26FC ; A # So [2] JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL +26FD ; W # So FUEL PUMP +26FE..26FF ; A # So [2] CUP ON BLACK SQUARE..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE +2700..2704 ; N # So [5] BLACK SAFETY SCISSORS..WHITE SCISSORS +2705 ; W # So WHITE HEAVY CHECK MARK +2706..2709 ; N # So [4] TELEPHONE LOCATION SIGN..ENVELOPE +270A..270B ; W # So [2] RAISED FIST..RAISED HAND +270C..2727 ; N # So [28] VICTORY HAND..WHITE FOUR POINTED STAR +2728 ; W # So SPARKLES +2729..273C ; N # So [20] STRESS OUTLINED WHITE STAR..OPEN CENTRE TEARDROP-SPOKED ASTERISK +273D ; A # So HEAVY TEARDROP-SPOKED ASTERISK +273E..274B ; N # So [14] SIX PETALLED BLACK AND WHITE FLORETTE..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274C ; W # So CROSS MARK +274D ; N # So SHADOWED WHITE CIRCLE +274E ; W # So NEGATIVE SQUARED CROSS MARK +274F..2752 ; N # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE +2753..2755 ; W # So [3] BLACK QUESTION MARK ORNAMENT..WHITE EXCLAMATION MARK ORNAMENT +2756 ; N # So BLACK DIAMOND MINUS WHITE X +2757 ; W # So HEAVY EXCLAMATION MARK SYMBOL +2758..2767 ; N # So [16] LIGHT VERTICAL BAR..ROTATED FLORAL HEART BULLET +2768 ; N # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; N # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; N # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; N # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; N # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; N # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; N # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; N # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; N # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; N # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; N # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; N # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; N # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; N # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776..277F ; A # No [10] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED NUMBER TEN +2780..2793 ; N # No [20] DINGBAT CIRCLED SANS-SERIF DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794 ; N # So HEAVY WIDE-HEADED RIGHTWARDS ARROW +2795..2797 ; W # So [3] HEAVY PLUS SIGN..HEAVY DIVISION SIGN +2798..27AF ; N # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B0 ; W # So CURLY LOOP +27B1..27BE ; N # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW +27BF ; W # So DOUBLE CURLY LOOP +27C0..27C4 ; N # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; N # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; N # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27E5 ; N # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; Na # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Na # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Na # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Na # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Na # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Na # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; Na # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; Na # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; N # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; N # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF ; N # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2800..28FF ; N # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2900..297F ; N # Sm [128] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..DOWN FISH TAIL +2980..2982 ; N # Sm [3] TRIPLE VERTICAL BAR DELIMITER..Z NOTATION TYPE COLON +2983 ; N # Ps LEFT WHITE CURLY BRACKET +2984 ; N # Pe RIGHT WHITE CURLY BRACKET +2985 ; Na # Ps LEFT WHITE PARENTHESIS +2986 ; Na # Pe RIGHT WHITE PARENTHESIS +2987 ; N # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; N # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; N # Ps Z NOTATION LEFT BINDING BRACKET +298A ; N # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; N # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; N # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; N # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; N # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; N # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; N # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; N # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; N # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; N # Ps LEFT ARC LESS-THAN BRACKET +2994 ; N # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; N # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; N # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; N # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; N # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; N # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; N # Ps LEFT WIGGLY FENCE +29D9 ; N # Pe RIGHT WIGGLY FENCE +29DA ; N # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; N # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; N # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; N # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; N # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..29FF ; N # Sm [2] TINY..MINY +2A00..2AFF ; N # Sm [256] N-ARY CIRCLED DOT OPERATOR..N-ARY WHITE VERTICAL BAR +2B00..2B1A ; N # So [27] NORTH EAST WHITE ARROW..DOTTED SQUARE +2B1B..2B1C ; W # So [2] BLACK LARGE SQUARE..WHITE LARGE SQUARE +2B1D..2B2F ; N # So [19] BLACK VERY SMALL SQUARE..WHITE VERTICAL ELLIPSE +2B30..2B44 ; N # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +2B45..2B46 ; N # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW +2B47..2B4C ; N # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D..2B4F ; N # So [3] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..SHORT BACKSLANTED SOUTH ARROW +2B50 ; W # So WHITE MEDIUM STAR +2B51..2B54 ; N # So [4] BLACK SMALL STAR..WHITE RIGHT-POINTING PENTAGON +2B55 ; W # So HEAVY LARGE CIRCLE +2B56..2B59 ; A # So [4] HEAVY OVAL WITH OVAL INSIDE..HEAVY CIRCLED SALTIRE +2B5A..2B73 ; N # So [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B76..2B95 ; N # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW +2B97..2BFF ; N # So [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL +2C00..2C5F ; N # L& [96] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC SMALL LETTER CAUDATE CHRIVI +2C60..2C7B ; N # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; N # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2C7F ; N # Lu [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C80..2CE4 ; N # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI +2CE5..2CEA ; N # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +2CEB..2CEE ; N # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CEF..2CF1 ; N # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2CF2..2CF3 ; N # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2CF9..2CFC ; N # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER +2CFD ; N # No COPTIC FRACTION ONE HALF +2CFE..2CFF ; N # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER +2D00..2D25 ; N # Ll [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; N # Ll GEORGIAN SMALL LETTER YN +2D2D ; N # Ll GEORGIAN SMALL LETTER AEN +2D30..2D67 ; N # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; N # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D70 ; N # Po TIFINAGH SEPARATOR MARK +2D7F ; N # Mn TIFINAGH CONSONANT JOINER +2D80..2D96 ; N # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; N # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; N # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; N # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; N # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; N # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; N # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; N # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; N # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +2DE0..2DFF ; N # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +2E00..2E01 ; N # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; N # Pi LEFT SUBSTITUTION BRACKET +2E03 ; N # Pf RIGHT SUBSTITUTION BRACKET +2E04 ; N # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; N # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08 ; N # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09 ; N # Pi LEFT TRANSPOSITION BRACKET +2E0A ; N # Pf RIGHT TRANSPOSITION BRACKET +2E0B ; N # Po RAISED SQUARE +2E0C ; N # Pi LEFT RAISED OMISSION BRACKET +2E0D ; N # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E16 ; N # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +2E17 ; N # Pd DOUBLE OBLIQUE HYPHEN +2E18..2E19 ; N # Po [2] INVERTED INTERROBANG..PALM BRANCH +2E1A ; N # Pd HYPHEN WITH DIAERESIS +2E1B ; N # Po TILDE WITH RING ABOVE +2E1C ; N # Pi LEFT LOW PARAPHRASE BRACKET +2E1D ; N # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E1F ; N # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +2E20 ; N # Pi LEFT VERTICAL BAR WITH QUILL +2E21 ; N # Pf RIGHT VERTICAL BAR WITH QUILL +2E22 ; N # Ps TOP LEFT HALF BRACKET +2E23 ; N # Pe TOP RIGHT HALF BRACKET +2E24 ; N # Ps BOTTOM LEFT HALF BRACKET +2E25 ; N # Pe BOTTOM RIGHT HALF BRACKET +2E26 ; N # Ps LEFT SIDEWAYS U BRACKET +2E27 ; N # Pe RIGHT SIDEWAYS U BRACKET +2E28 ; N # Ps LEFT DOUBLE PARENTHESIS +2E29 ; N # Pe RIGHT DOUBLE PARENTHESIS +2E2A..2E2E ; N # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK +2E2F ; N # Lm VERTICAL TILDE +2E30..2E39 ; N # Po [10] RING POINT..TOP HALF SECTION SIGN +2E3A..2E3B ; N # Pd [2] TWO-EM DASH..THREE-EM DASH +2E3C..2E3F ; N # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM +2E40 ; N # Pd DOUBLE HYPHEN +2E41 ; N # Po REVERSED COMMA +2E42 ; N # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E4F ; N # Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER +2E50..2E51 ; N # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR +2E52..2E54 ; N # Po [3] TIRONIAN SIGN CAPITAL ET..MEDIEVAL QUESTION MARK +2E55 ; N # Ps LEFT SQUARE BRACKET WITH STROKE +2E56 ; N # Pe RIGHT SQUARE BRACKET WITH STROKE +2E57 ; N # Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE +2E58 ; N # Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE +2E59 ; N # Ps TOP HALF LEFT PARENTHESIS +2E5A ; N # Pe TOP HALF RIGHT PARENTHESIS +2E5B ; N # Ps BOTTOM HALF LEFT PARENTHESIS +2E5C ; N # Pe BOTTOM HALF RIGHT PARENTHESIS +2E5D ; N # Pd OBLIQUE HYPHEN +2E80..2E99 ; W # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; W # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; W # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +2FF0..2FFF ; W # So [16] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION +3000 ; F # Zs IDEOGRAPHIC SPACE +3001..3003 ; W # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3004 ; W # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3005 ; W # Lm IDEOGRAPHIC ITERATION MARK +3006 ; W # Lo IDEOGRAPHIC CLOSING MARK +3007 ; W # Nl IDEOGRAPHIC NUMBER ZERO +3008 ; W # Ps LEFT ANGLE BRACKET +3009 ; W # Pe RIGHT ANGLE BRACKET +300A ; W # Ps LEFT DOUBLE ANGLE BRACKET +300B ; W # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; W # Ps LEFT CORNER BRACKET +300D ; W # Pe RIGHT CORNER BRACKET +300E ; W # Ps LEFT WHITE CORNER BRACKET +300F ; W # Pe RIGHT WHITE CORNER BRACKET +3010 ; W # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; W # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; W # So [2] POSTAL MARK..GETA MARK +3014 ; W # Ps LEFT TORTOISE SHELL BRACKET +3015 ; W # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; W # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; W # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; W # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; W # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; W # Ps LEFT WHITE SQUARE BRACKET +301B ; W # Pe RIGHT WHITE SQUARE BRACKET +301C ; W # Pd WAVE DASH +301D ; W # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; W # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; W # So POSTAL MARK FACE +3021..3029 ; W # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +302A..302D ; W # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F ; W # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3030 ; W # Pd WAVY DASH +3031..3035 ; W # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3036..3037 ; W # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +3038..303A ; W # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; W # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; W # Lo MASU MARK +303D ; W # Po PART ALTERNATION MARK +303E ; W # So IDEOGRAPHIC VARIATION INDICATOR +303F ; N # So IDEOGRAPHIC HALF FILL SPACE +3041..3096 ; W # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +3099..309A ; W # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B..309C ; W # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E ; W # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; W # Lo HIRAGANA DIGRAPH YORI +30A0 ; W # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30A1..30FA ; W # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FB ; W # Po KATAKANA MIDDLE DOT +30FC..30FE ; W # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +30FF ; W # Lo KATAKANA DIGRAPH KOTO +3105..312F ; W # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +3131..318E ; W # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +3190..3191 ; W # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +3192..3195 ; W # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +3196..319F ; W # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +31A0..31BF ; W # Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH +31C0..31E3 ; W # So [36] CJK STROKE T..CJK STROKE Q +31EF ; W # So IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION +31F0..31FF ; W # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3200..321E ; W # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3220..3229 ; W # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3247 ; W # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO +3248..324F ; A # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE +3250 ; W # So PARTNERSHIP SIGN +3251..325F ; W # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +3260..327F ; W # So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL +3280..3289 ; W # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0 ; W # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF ; W # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32C0..32FF ; W # So [64] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..SQUARE ERA NAME REIWA +3300..33FF ; W # So [256] SQUARE APAATO..SQUARE GAL +3400..4DBF ; W # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF +4DC0..4DFF ; N # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +4E00..9FFF ; W # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF +A000..A014 ; W # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; W # Lm YI SYLLABLE WU +A016..A48C ; W # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A490..A4C6 ; W # So [55] YI RADICAL QOT..YI RADICAL KE +A4D0..A4F7 ; N # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; N # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A4FE..A4FF ; N # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +A500..A60B ; N # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; N # Lm VAI SYLLABLE LENGTHENER +A60D..A60F ; N # Po [3] VAI COMMA..VAI QUESTION MARK +A610..A61F ; N # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A620..A629 ; N # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE +A62A..A62B ; N # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D ; N # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; N # Lo CYRILLIC LETTER MULTIOCULAR O +A66F ; N # Mn COMBINING CYRILLIC VZMET +A670..A672 ; N # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN +A673 ; N # Po SLAVONIC ASTERISK +A674..A67D ; N # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A67E ; N # Po CYRILLIC KAVYKA +A67F ; N # Lm CYRILLIC PAYEROK +A680..A69B ; N # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; N # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F ; N # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6A0..A6E5 ; N # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; N # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F0..A6F1 ; N # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A6F2..A6F7 ; N # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK +A700..A716 ; N # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F ; N # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; N # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A722..A76F ; N # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; N # Lm MODIFIER LETTER US +A771..A787 ; N # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A788 ; N # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; N # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +A78B..A78E ; N # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; N # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7CA ; N # L& [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY +A7D0..A7D1 ; N # L& [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G +A7D3 ; N # Ll LATIN SMALL LETTER DOUBLE THORN +A7D5..A7D9 ; N # L& [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S +A7F2..A7F4 ; N # Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q +A7F5..A7F6 ; N # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H +A7F7 ; N # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; N # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; N # Ll LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A7FF ; N # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M +A800..A801 ; N # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I +A802 ; N # Mn SYLOTI NAGRI SIGN DVISVARA +A803..A805 ; N # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A806 ; N # Mn SYLOTI NAGRI SIGN HASANTA +A807..A80A ; N # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80B ; N # Mn SYLOTI NAGRI SIGN ANUSVARA +A80C..A822 ; N # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824 ; N # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; N # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; N # Mc SYLOTI NAGRI VOWEL SIGN OO +A828..A82B ; N # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 +A82C ; N # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA +A830..A835 ; N # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS +A836..A837 ; N # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK +A838 ; N # Sc NORTH INDIC RUPEE MARK +A839 ; N # So NORTH INDIC QUANTITY MARK +A840..A873 ; N # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A874..A877 ; N # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD +A880..A881 ; N # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A882..A8B3 ; N # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8B4..A8C3 ; N # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C4..A8C5 ; N # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +A8CE..A8CF ; N # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A8D0..A8D9 ; N # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE +A8E0..A8F1 ; N # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A8F2..A8F7 ; N # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8F8..A8FA ; N # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET +A8FB ; N # Lo DEVANAGARI HEADSTROKE +A8FC ; N # Po DEVANAGARI SIGN SIDDHAM +A8FD..A8FE ; N # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A8FF ; N # Mn DEVANAGARI VOWEL SIGN AY +A900..A909 ; N # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +A90A..A925 ; N # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A926..A92D ; N # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A92E..A92F ; N # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA +A930..A946 ; N # Lo [23] REJANG LETTER KA..REJANG LETTER A +A947..A951 ; N # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952..A953 ; N # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +A95F ; N # Po REJANG SECTION MARK +A960..A97C ; W # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A980..A982 ; N # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983 ; N # Mc JAVANESE SIGN WIGNYAN +A984..A9B2 ; N # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B3 ; N # Mn JAVANESE SIGN CECAK TELU +A9B4..A9B5 ; N # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9 ; N # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB ; N # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC..A9BD ; N # Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET +A9BE..A9C0 ; N # Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON +A9C1..A9CD ; N # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH +A9CF ; N # Lm JAVANESE PANGRANGKEP +A9D0..A9D9 ; N # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +A9DE..A9DF ; N # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN +A9E0..A9E4 ; N # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E5 ; N # Mn MYANMAR SIGN SHAN SAW +A9E6 ; N # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; N # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9F0..A9F9 ; N # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +A9FA..A9FE ; N # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28 ; N # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA29..AA2E ; N # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30 ; N # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32 ; N # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34 ; N # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36 ; N # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA40..AA42 ; N # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA43 ; N # Mn CHAM CONSONANT SIGN FINAL NG +AA44..AA4B ; N # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4C ; N # Mn CHAM CONSONANT SIGN FINAL M +AA4D ; N # Mc CHAM CONSONANT SIGN FINAL H +AA50..AA59 ; N # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +AA5C..AA5F ; N # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA +AA60..AA6F ; N # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; N # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; N # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA77..AA79 ; N # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO +AA7A ; N # Lo MYANMAR LETTER AITON RA +AA7B ; N # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; N # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; N # Mc MYANMAR SIGN TAI LAING TONE-5 +AA7E..AA7F ; N # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA +AA80..AAAF ; N # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O +AAB0 ; N # Mn TAI VIET MAI KANG +AAB1 ; N # Lo TAI VIET VOWEL AA +AAB2..AAB4 ; N # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB5..AAB6 ; N # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB7..AAB8 ; N # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AAB9..AABD ; N # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AABE..AABF ; N # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC0 ; N # Lo TAI VIET TONE MAI NUENG +AAC1 ; N # Mn TAI VIET TONE MAI THO +AAC2 ; N # Lo TAI VIET TONE MAI SONG +AADB..AADC ; N # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; N # Lm TAI VIET SYMBOL SAM +AADE..AADF ; N # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI +AAE0..AAEA ; N # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB ; N # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED ; N # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF ; N # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF0..AAF1 ; N # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +AAF2 ; N # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; N # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5 ; N # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AAF6 ; N # Mn MEETEI MAYEK VIRAMA +AB01..AB06 ; N # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; N # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; N # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; N # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; N # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A ; N # Ll [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5B ; N # Sk MODIFIER BREVE WITH INVERTED BREVE +AB5C..AB5F ; N # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB68 ; N # Ll [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE +AB69 ; N # Lm MODIFIER LETTER SMALL TURNED W +AB6A..AB6B ; N # Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK +AB70..ABBF ; N # Ll [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2 ; N # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4 ; N # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; N # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7 ; N # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; N # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA ; N # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +ABEB ; N # Po MEETEI MAYEK CHEIKHEI +ABEC ; N # Mc MEETEI MAYEK LUM IYEK +ABED ; N # Mn MEETEI MAYEK APUN IYEK +ABF0..ABF9 ; N # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE +AC00..D7A3 ; W # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7B0..D7C6 ; N # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; N # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +D800..DB7F ; N # Cs [896] .. +DB80..DBFF ; N # Cs [128] .. +DC00..DFFF ; N # Cs [1024] .. +E000..F8FF ; A # Co [6400] .. +F900..FA6D ; W # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA6E..FA6F ; W # Cn [2] .. +FA70..FAD9 ; W # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FADA..FAFF ; W # Cn [38] .. +FB00..FB06 ; N # Ll [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; N # Ll [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D ; N # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E ; N # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28 ; N # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB29 ; N # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A..FB36 ; N # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; N # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; N # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; N # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; N # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FB4F ; N # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED +FB50..FBB1 ; N # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB2..FBC2 ; N # Sk [17] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL WASLA ABOVE +FBD3..FD3D ; N # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD3E ; N # Pe ORNATE LEFT PARENTHESIS +FD3F ; N # Ps ORNATE RIGHT PARENTHESIS +FD40..FD4F ; N # So [16] ARABIC LIGATURE RAHIMAHU ALLAAH..ARABIC LIGATURE RAHIMAHUM ALLAAH +FD50..FD8F ; N # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; N # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDCF ; N # So ARABIC LIGATURE SALAAMUHU ALAYNAA +FDF0..FDFB ; N # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; N # Sc RIAL SIGN +FDFD..FDFF ; N # So [3] ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM..ARABIC LIGATURE AZZA WA JALL +FE00..FE0F ; A # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE10..FE16 ; W # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; W # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE20..FE2F ; N # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FE30 ; W # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32 ; W # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; W # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46 ; W # Po [2] SESAME DOT..WHITE SESAME DOT +FE47 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C ; W # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; W # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE50..FE52 ; W # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; W # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FE58 ; W # Pd SMALL EM DASH +FE59 ; W # Ps SMALL LEFT PARENTHESIS +FE5A ; W # Pe SMALL RIGHT PARENTHESIS +FE5B ; W # Ps SMALL LEFT CURLY BRACKET +FE5C ; W # Pe SMALL RIGHT CURLY BRACKET +FE5D ; W # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; W # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61 ; W # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62 ; W # Sm SMALL PLUS SIGN +FE63 ; W # Pd SMALL HYPHEN-MINUS +FE64..FE66 ; W # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; W # Po SMALL REVERSE SOLIDUS +FE69 ; W # Sc SMALL DOLLAR SIGN +FE6A..FE6B ; W # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT +FE70..FE74 ; N # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; N # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFF ; N # Cf ZERO WIDTH NO-BREAK SPACE +FF01..FF03 ; F # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN +FF04 ; F # Sc FULLWIDTH DOLLAR SIGN +FF05..FF07 ; F # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE +FF08 ; F # Ps FULLWIDTH LEFT PARENTHESIS +FF09 ; F # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A ; F # Po FULLWIDTH ASTERISK +FF0B ; F # Sm FULLWIDTH PLUS SIGN +FF0C ; F # Po FULLWIDTH COMMA +FF0D ; F # Pd FULLWIDTH HYPHEN-MINUS +FF0E..FF0F ; F # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS +FF10..FF19 ; F # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B ; F # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E ; F # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F..FF20 ; F # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +FF21..FF3A ; F # Lu [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF3B ; F # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C ; F # Po FULLWIDTH REVERSE SOLIDUS +FF3D ; F # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; F # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; F # Pc FULLWIDTH LOW LINE +FF40 ; F # Sk FULLWIDTH GRAVE ACCENT +FF41..FF5A ; F # Ll [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF5B ; F # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C ; F # Sm FULLWIDTH VERTICAL LINE +FF5D ; F # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E ; F # Sm FULLWIDTH TILDE +FF5F ; F # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; F # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; H # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; H # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; H # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64..FF65 ; H # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT +FF66..FF6F ; H # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; H # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; H # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF9E..FF9F ; H # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0..FFBE ; H # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; H # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; H # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; H # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; H # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +FFE0..FFE1 ; F # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +FFE2 ; F # Sm FULLWIDTH NOT SIGN +FFE3 ; F # Sk FULLWIDTH MACRON +FFE4 ; F # So FULLWIDTH BROKEN BAR +FFE5..FFE6 ; F # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN +FFE8 ; H # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC ; H # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE ; H # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFF9..FFFB ; N # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC ; N # So OBJECT REPLACEMENT CHARACTER +FFFD ; A # So REPLACEMENT CHARACTER +10000..1000B ; N # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; N # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; N # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; N # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; N # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; N # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; N # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10100..10102 ; N # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK +10107..10133 ; N # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F ; N # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +10140..10174 ; N # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175..10178 ; N # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN +10179..10189 ; N # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN +1018A..1018B ; N # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN +1018C..1018E ; N # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN +10190..1019C ; N # So [13] ROMAN SEXTANS SIGN..ASCIA SYMBOL +101A0 ; N # So GREEK SYMBOL TAU RHO +101D0..101FC ; N # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND +101FD ; N # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +10280..1029C ; N # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0 ; N # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +102E0 ; N # Mn COPTIC EPACT THOUSANDS MARK +102E1..102FB ; N # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED +10300..1031F ; N # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +10320..10323 ; N # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +1032D..1032F ; N # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE +10330..10340 ; N # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA +10341 ; N # Nl GOTHIC LETTER NINETY +10342..10349 ; N # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; N # Nl GOTHIC LETTER NINE HUNDRED +10350..10375 ; N # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10376..1037A ; N # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10380..1039D ; N # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F ; N # Po UGARITIC WORD DIVIDER +103A0..103C3 ; N # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; N # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D0 ; N # Po OLD PERSIAN WORD DIVIDER +103D1..103D5 ; N # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F ; N # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10450..1047F ; N # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW +10480..1049D ; N # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO +104A0..104A9 ; N # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +104B0..104D3 ; N # Lu [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; N # Ll [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10500..10527 ; N # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE +10530..10563 ; N # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +1056F ; N # Po CAUCASIAN ALBANIAN CITATION MARK +10570..1057A ; N # Lu [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA +1057C..1058A ; N # Lu [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE +1058C..10592 ; N # Lu [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE +10594..10595 ; N # Lu [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE +10597..105A1 ; N # Ll [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA +105A3..105B1 ; N # Ll [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE +105B3..105B9 ; N # Ll [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE +105BB..105BC ; N # Ll [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE +10600..10736 ; N # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; N # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; N # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10780..10785 ; N # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK +10787..107B0 ; N # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2..107BA ; N # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +10800..10805 ; N # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; N # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; N # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; N # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; N # Lo CYPRIOT SYLLABLE ZA +1083F ; N # Lo CYPRIOT SYLLABLE ZO +10840..10855 ; N # Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW +10857 ; N # Po IMPERIAL ARAMAIC SECTION SIGN +10858..1085F ; N # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10860..10876 ; N # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10877..10878 ; N # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON +10879..1087F ; N # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY +10880..1089E ; N # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108A7..108AF ; N # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED +108E0..108F2 ; N # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; N # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +108FB..108FF ; N # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED +10900..10915 ; N # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10916..1091B ; N # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE +1091F ; N # Po PHOENICIAN WORD SEPARATOR +10920..10939 ; N # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +1093F ; N # Po LYDIAN TRIANGULAR MARK +10980..1099F ; N # Lo [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 +109A0..109B7 ; N # Lo [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA +109BC..109BD ; N # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF +109BE..109BF ; N # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +109C0..109CF ; N # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY +109D2..109FF ; N # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A00 ; N # Lo KHAROSHTHI LETTER A +10A01..10A03 ; N # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; N # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; N # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13 ; N # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; N # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; N # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A38..10A3A ; N # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; N # Mn KHAROSHTHI VIRAMA +10A40..10A48 ; N # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF +10A50..10A58 ; N # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES +10A60..10A7C ; N # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A7D..10A7E ; N # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY +10A7F ; N # Po OLD SOUTH ARABIAN NUMERIC INDICATOR +10A80..10A9C ; N # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10A9D..10A9F ; N # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY +10AC0..10AC7 ; N # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC8 ; N # So MANICHAEAN SIGN UD +10AC9..10AE4 ; N # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10AE5..10AE6 ; N # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10AEB..10AEF ; N # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED +10AF0..10AF6 ; N # Po [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER +10B00..10B35 ; N # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B39..10B3F ; N # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B40..10B55 ; N # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B58..10B5F ; N # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B60..10B72 ; N # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B78..10B7F ; N # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B80..10B91 ; N # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10B99..10B9C ; N # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10BA9..10BAF ; N # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED +10C00..10C48 ; N # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2 ; N # Lu [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; N # Ll [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10CFA..10CFF ; N # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND +10D00..10D23 ; N # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27 ; N # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D30..10D39 ; N # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE +10E60..10E7E ; N # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +10E80..10EA9 ; N # Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET +10EAB..10EAC ; N # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EAD ; N # Pd YEZIDI HYPHENATION MARK +10EB0..10EB1 ; N # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +10EFD..10EFF ; N # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA +10F00..10F1C ; N # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F1D..10F26 ; N # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF +10F27 ; N # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45 ; N # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +10F46..10F50 ; N # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +10F51..10F54 ; N # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED +10F55..10F59 ; N # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +10F70..10F81 ; N # Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH +10F82..10F85 ; N # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW +10F86..10F89 ; N # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS +10FB0..10FC4 ; N # Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW +10FC5..10FCB ; N # No [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED +10FE0..10FF6 ; N # Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH +11000 ; N # Mc BRAHMI SIGN CANDRABINDU +11001 ; N # Mn BRAHMI SIGN ANUSVARA +11002 ; N # Mc BRAHMI SIGN VISARGA +11003..11037 ; N # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11038..11046 ; N # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +11047..1104D ; N # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS +11052..11065 ; N # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +11066..1106F ; N # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +11070 ; N # Mn BRAHMI SIGN OLD TAMIL VIRAMA +11071..11072 ; N # Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O +11073..11074 ; N # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O +11075 ; N # Lo BRAHMI LETTER OLD TAMIL LLA +1107F ; N # Mn BRAHMI NUMBER JOINER +11080..11081 ; N # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA +11082 ; N # Mc KAITHI SIGN VISARGA +11083..110AF ; N # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2 ; N # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6 ; N # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8 ; N # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110B9..110BA ; N # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +110BB..110BC ; N # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN +110BD ; N # Cf KAITHI NUMBER SIGN +110BE..110C1 ; N # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +110C2 ; N # Mn KAITHI VOWEL SIGN VOCALIC R +110CD ; N # Cf KAITHI NUMBER SIGN ABOVE +110D0..110E8 ; N # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110F0..110F9 ; N # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE +11100..11102 ; N # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11103..11126 ; N # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11127..1112B ; N # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C ; N # Mc CHAKMA VOWEL SIGN E +1112D..11134 ; N # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11136..1113F ; N # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11140..11143 ; N # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK +11144 ; N # Lo CHAKMA LETTER LHAA +11145..11146 ; N # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11147 ; N # Lo CHAKMA LETTER VAA +11150..11172 ; N # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11173 ; N # Mn MAHAJANI SIGN NUKTA +11174..11175 ; N # Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK +11176 ; N # Lo MAHAJANI LIGATURE SHRI +11180..11181 ; N # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182 ; N # Mc SHARADA SIGN VISARGA +11183..111B2 ; N # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5 ; N # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE ; N # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF..111C0 ; N # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +111C1..111C4 ; N # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111C5..111C8 ; N # Po [4] SHARADA DANDA..SHARADA SEPARATOR +111C9..111CC ; N # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +111CD ; N # Po SHARADA SUTRA MARK +111CE ; N # Mc SHARADA VOWEL SIGN PRISHTHAMATRA E +111CF ; N # Mn SHARADA SIGN INVERTED CANDRABINDU +111D0..111D9 ; N # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA ; N # Lo SHARADA EKAM +111DB ; N # Po SHARADA SIGN SIDDHAM +111DC ; N # Lo SHARADA HEADSTROKE +111DD..111DF ; N # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 +111E1..111F4 ; N # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND +11200..11211 ; N # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; N # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E ; N # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231 ; N # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233 ; N # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234 ; N # Mn KHOJKI SIGN ANUSVARA +11235 ; N # Mc KHOJKI SIGN VIRAMA +11236..11237 ; N # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +11238..1123D ; N # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN +1123E ; N # Mn KHOJKI SIGN SUKUN +1123F..11240 ; N # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I +11241 ; N # Mn KHOJKI VOWEL SIGN VOCALIC R +11280..11286 ; N # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; N # Lo MULTANI LETTER GHA +1128A..1128D ; N # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; N # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; N # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112A9 ; N # Po MULTANI SECTION MARK +112B0..112DE ; N # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112DF ; N # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2 ; N # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112EA ; N # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +112F0..112F9 ; N # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +11300..11301 ; N # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303 ; N # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C ; N # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; N # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; N # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; N # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; N # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; N # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133B..1133C ; N # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +1133D ; N # Lo GRANTHA SIGN AVAGRAHA +1133E..1133F ; N # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340 ; N # Mn GRANTHA VOWEL SIGN II +11341..11344 ; N # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; N # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134D ; N # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +11350 ; N # Lo GRANTHA OM +11357 ; N # Mc GRANTHA AU LENGTH MARK +1135D..11361 ; N # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11362..11363 ; N # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11366..1136C ; N # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; N # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11400..11434 ; N # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; N # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; N # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; N # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444 ; N # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445 ; N # Mc NEWA SIGN VISARGA +11446 ; N # Mn NEWA SIGN NUKTA +11447..1144A ; N # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +1144B..1144F ; N # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN +11450..11459 ; N # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145A..1145B ; N # Po [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK +1145D ; N # Po NEWA INSERTION SIGN +1145E ; N # Mn NEWA SANDHI MARK +1145F..11461 ; N # Lo [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA +11480..114AF ; N # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114B0..114B2 ; N # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +114B3..114B8 ; N # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; N # Mc TIRHUTA VOWEL SIGN E +114BA ; N # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE ; N # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0 ; N # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1 ; N # Mc TIRHUTA SIGN VISARGA +114C2..114C3 ; N # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +114C4..114C5 ; N # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C6 ; N # Po TIRHUTA ABBREVIATION SIGN +114C7 ; N # Lo TIRHUTA OM +114D0..114D9 ; N # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE +11580..115AE ; N # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115AF..115B1 ; N # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5 ; N # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB ; N # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD ; N # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE ; N # Mc SIDDHAM SIGN VISARGA +115BF..115C0 ; N # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115C1..115D7 ; N # Po [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +115D8..115DB ; N # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +115DC..115DD ; N # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11600..1162F ; N # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632 ; N # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A ; N # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C ; N # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D ; N # Mn MODI SIGN ANUSVARA +1163E ; N # Mc MODI SIGN VISARGA +1163F..11640 ; N # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +11641..11643 ; N # Po [3] MODI DANDA..MODI ABBREVIATION SIGN +11644 ; N # Lo MODI SIGN HUVA +11650..11659 ; N # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE +11660..1166C ; N # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT +11680..116AA ; N # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +116AB ; N # Mn TAKRI SIGN ANUSVARA +116AC ; N # Mc TAKRI SIGN VISARGA +116AD ; N # Mn TAKRI VOWEL SIGN AA +116AE..116AF ; N # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5 ; N # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B6 ; N # Mc TAKRI SIGN VIRAMA +116B7 ; N # Mn TAKRI SIGN NUKTA +116B8 ; N # Lo TAKRI LETTER ARCHAIC KHA +116B9 ; N # Po TAKRI ABBREVIATION SIGN +116C0..116C9 ; N # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE +11700..1171A ; N # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +1171D..1171F ; N # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721 ; N # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725 ; N # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726 ; N # Mc AHOM VOWEL SIGN E +11727..1172B ; N # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11730..11739 ; N # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +1173A..1173B ; N # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY +1173C..1173E ; N # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +1173F ; N # So AHOM SYMBOL VI +11740..11746 ; N # Lo [7] AHOM LETTER CA..AHOM LETTER LLA +11800..1182B ; N # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E ; N # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837 ; N # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838 ; N # Mc DOGRA SIGN VISARGA +11839..1183A ; N # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +1183B ; N # Po DOGRA ABBREVIATION SIGN +118A0..118DF ; N # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118E0..118E9 ; N # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +118EA..118F2 ; N # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY +118FF ; N # Lo WARANG CITI OM +11900..11906 ; N # Lo [7] DIVES AKURU LETTER A..DIVES AKURU LETTER E +11909 ; N # Lo DIVES AKURU LETTER O +1190C..11913 ; N # Lo [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA +11915..11916 ; N # Lo [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA +11918..1192F ; N # Lo [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA +11930..11935 ; N # Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E +11937..11938 ; N # Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O +1193B..1193C ; N # Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU +1193D ; N # Mc DIVES AKURU SIGN HALANTA +1193E ; N # Mn DIVES AKURU VIRAMA +1193F ; N # Lo DIVES AKURU PREFIXED NASAL SIGN +11940 ; N # Mc DIVES AKURU MEDIAL YA +11941 ; N # Lo DIVES AKURU INITIAL RA +11942 ; N # Mc DIVES AKURU MEDIAL RA +11943 ; N # Mn DIVES AKURU SIGN NUKTA +11944..11946 ; N # Po [3] DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK +11950..11959 ; N # Nd [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE +119A0..119A7 ; N # Lo [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR +119AA..119D0 ; N # Lo [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA +119D1..119D3 ; N # Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II +119D4..119D7 ; N # Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR +119DA..119DB ; N # Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI +119DC..119DF ; N # Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA +119E0 ; N # Mn NANDINAGARI SIGN VIRAMA +119E1 ; N # Lo NANDINAGARI SIGN AVAGRAHA +119E2 ; N # Po NANDINAGARI SIGN SIDDHAM +119E3 ; N # Lo NANDINAGARI HEADSTROKE +119E4 ; N # Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E +11A00 ; N # Lo ZANABAZAR SQUARE LETTER A +11A01..11A0A ; N # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32 ; N # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A33..11A38 ; N # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; N # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; N # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E ; N # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A3F..11A46 ; N # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A47 ; N # Mn ZANABAZAR SQUARE SUBJOINER +11A50 ; N # Lo SOYOMBO LETTER A +11A51..11A56 ; N # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; N # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; N # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A89 ; N # Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96 ; N # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; N # Mc SOYOMBO SIGN VISARGA +11A98..11A99 ; N # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11A9A..11A9C ; N # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9D ; N # Lo SOYOMBO MARK PLUTA +11A9E..11AA2 ; N # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 +11AB0..11ABF ; N # Lo [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA +11AC0..11AF8 ; N # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11B00..11B09 ; N # Po [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU +11C00..11C08 ; N # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; N # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; N # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; N # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; N # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; N # Mc BHAIKSUKI SIGN VISARGA +11C3F ; N # Mn BHAIKSUKI SIGN VIRAMA +11C40 ; N # Lo BHAIKSUKI SIGN AVAGRAHA +11C41..11C45 ; N # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C50..11C59 ; N # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C ; N # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK +11C70..11C71 ; N # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD +11C72..11C8F ; N # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7 ; N # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; N # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; N # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; N # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; N # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; N # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; N # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D00..11D06 ; N # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; N # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; N # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36 ; N # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; N # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; N # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; N # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D46 ; N # Lo MASARAM GONDI REPHA +11D47 ; N # Mn MASARAM GONDI RA-KARA +11D50..11D59 ; N # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE +11D60..11D65 ; N # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; N # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; N # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E ; N # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91 ; N # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94 ; N # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95 ; N # Mn GUNJALA GONDI SIGN ANUSVARA +11D96 ; N # Mc GUNJALA GONDI SIGN VISARGA +11D97 ; N # Mn GUNJALA GONDI VIRAMA +11D98 ; N # Lo GUNJALA GONDI OM +11DA0..11DA9 ; N # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +11EE0..11EF2 ; N # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11EF3..11EF4 ; N # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6 ; N # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11EF7..11EF8 ; N # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F00..11F01 ; N # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02 ; N # Lo KAWI SIGN REPHA +11F03 ; N # Mc KAWI SIGN VISARGA +11F04..11F10 ; N # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; N # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35 ; N # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; N # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; N # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; N # Mn KAWI VOWEL SIGN EU +11F41 ; N # Mc KAWI SIGN KILLER +11F42 ; N # Mn KAWI CONJOINER +11F43..11F4F ; N # Po [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL +11F50..11F59 ; N # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE +11FB0 ; N # Lo LISU LETTER YHA +11FC0..11FD4 ; N # No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH +11FD5..11FDC ; N # So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI +11FDD..11FE0 ; N # Sc [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN +11FE1..11FF1 ; N # So [17] TAMIL SIGN PAARAM..TAMIL SIGN VAKAIYARAA +11FFF ; N # Po TAMIL PUNCTUATION END OF TEXT +12000..12399 ; N # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; N # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12470..12474 ; N # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +12480..12543 ; N # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12F90..12FF0 ; N # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 +12FF1..12FF2 ; N # Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 +13000..1342F ; N # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13430..1343F ; N # Cf [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE +13440 ; N # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13441..13446 ; N # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN +13447..13455 ; N # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED +14400..14646 ; N # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +16800..16A38 ; N # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E ; N # Lo [31] MRO LETTER TA..MRO LETTER TEK +16A60..16A69 ; N # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE +16A6E..16A6F ; N # Po [2] MRO DANDA..MRO DOUBLE DANDA +16A70..16ABE ; N # Lo [79] TANGSA LETTER OZ..TANGSA LETTER ZA +16AC0..16AC9 ; N # Nd [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE +16AD0..16AED ; N # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AF0..16AF4 ; N # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16AF5 ; N # Po BASSA VAH FULL STOP +16B00..16B2F ; N # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B30..16B36 ; N # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B37..16B3B ; N # Po [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM +16B3C..16B3F ; N # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB +16B40..16B43 ; N # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B44 ; N # Po PAHAWH HMONG SIGN XAUS +16B45 ; N # So PAHAWH HMONG SIGN CIM TSOV ROG +16B50..16B59 ; N # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B5B..16B61 ; N # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS +16B63..16B77 ; N # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; N # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F ; N # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16E80..16E96 ; N # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM +16E97..16E9A ; N # Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH +16F00..16F4A ; N # Lo [75] MIAO LETTER PA..MIAO LETTER RTE +16F4F ; N # Mn MIAO SIGN CONSONANT MODIFIER BAR +16F50 ; N # Lo MIAO LETTER NASALIZATION +16F51..16F87 ; N # Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI +16F8F..16F92 ; N # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16F93..16F9F ; N # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0..16FE1 ; W # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +16FE2 ; W # Po OLD CHINESE HOOK MARK +16FE3 ; W # Lm OLD CHINESE ITERATION MARK +16FE4 ; W # Mn KHITAN SMALL SCRIPT FILLER +16FF0..16FF1 ; W # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +17000..187F7 ; W # Lo [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7 +18800..18AFF ; W # Lo [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768 +18B00..18CD5 ; W # Lo [470] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CD5 +18D00..18D08 ; W # Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 +1AFF0..1AFF3 ; W # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 +1AFF5..1AFFB ; W # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 +1AFFD..1AFFE ; W # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 +1B000..1B0FF ; W # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 +1B100..1B122 ; W # Lo [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU +1B132 ; W # Lo HIRAGANA LETTER SMALL KO +1B150..1B152 ; W # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; W # Lo KATAKANA LETTER SMALL KO +1B164..1B167 ; W # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +1B170..1B2FB ; W # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1BC00..1BC6A ; N # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; N # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; N # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; N # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9C ; N # So DUPLOYAN SIGN O WITH CROSS +1BC9D..1BC9E ; N # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1BC9F ; N # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1BCA0..1BCA3 ; N # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1CF00..1CF2D ; N # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT +1CF30..1CF46 ; N # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1CF50..1CFC3 ; N # So [116] ZNAMENNY NEUME KRYUK..ZNAMENNY NEUME PAUK +1D000..1D0F5 ; N # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126 ; N # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D129..1D164 ; N # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D166 ; N # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167..1D169 ; N # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A..1D16C ; N # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D..1D172 ; N # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D173..1D17A ; N # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D17B..1D182 ; N # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D183..1D184 ; N # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D185..1D18B ; N # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C..1D1A9 ; N # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AA..1D1AD ; N # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D1AE..1D1EA ; N # So [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON +1D200..1D241 ; N # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242..1D244 ; N # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D245 ; N # So GREEK MUSICAL LEIMMA +1D2C0..1D2D3 ; N # No [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN +1D2E0..1D2F3 ; N # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN +1D300..1D356 ; N # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D360..1D378 ; N # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE +1D400..1D454 ; N # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; N # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; N # Lu [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; N # Lu MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; N # Lu [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; N # Lu [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; N # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; N # Ll MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; N # Ll [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; N # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; N # Lu [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; N # Lu [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; N # Lu [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; N # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; N # Lu [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; N # Lu [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; N # Lu MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; N # Lu [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; N # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; N # Lu [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; N # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; N # Ll [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; N # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; N # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; N # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; N # Ll [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; N # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; N # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; N # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; N # Ll [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; N # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; N # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; N # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; N # Ll [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; N # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; N # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; N # Ll [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7CB ; N # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; N # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1D800..1D9FF ; N # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD +1DA00..1DA36 ; N # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA37..1DA3A ; N # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE +1DA3B..1DA6C ; N # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA6D..1DA74 ; N # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA75 ; N # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA76..1DA83 ; N # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH +1DA84 ; N # Mn SIGNWRITING LOCATION HEAD NECK +1DA85..1DA86 ; N # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS +1DA87..1DA8B ; N # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS +1DA9B..1DA9F ; N # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +1DAA1..1DAAF ; N # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1DF00..1DF09 ; N # Ll [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK +1DF0A ; N # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK +1DF0B..1DF1E ; N # Ll [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; N # Ll [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E000..1E006 ; N # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; N # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; N # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; N # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; N # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E030..1E06D ; N # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F ; N # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +1E100..1E12C ; N # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W +1E130..1E136 ; N # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D +1E137..1E13D ; N # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER +1E140..1E149 ; N # Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE +1E14E ; N # Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ +1E14F ; N # So NYIAKENG PUACHUE HMONG CIRCLED CA +1E290..1E2AD ; N # Lo [30] TOTO LETTER PA..TOTO LETTER A +1E2AE ; N # Mn TOTO SIGN RISING TONE +1E2C0..1E2EB ; N # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH +1E2EC..1E2EF ; N # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI +1E2F0..1E2F9 ; N # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE +1E2FF ; N # Sc WANCHO NGUN SIGN +1E4D0..1E4EA ; N # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; N # Lm NAG MUNDARI SIGN OJOD +1E4EC..1E4EF ; N # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH +1E4F0..1E4F9 ; N # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE +1E7E0..1E7E6 ; N # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO +1E7E8..1E7EB ; N # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE +1E7ED..1E7EE ; N # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE +1E7F0..1E7FE ; N # Lo [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE +1E800..1E8C4 ; N # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E8C7..1E8CF ; N # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE +1E8D0..1E8D6 ; N # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E900..1E943 ; N # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E944..1E94A ; N # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1E94B ; N # Lm ADLAM NASALIZATION MARK +1E950..1E959 ; N # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95E..1E95F ; N # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK +1EC71..1ECAB ; N # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE +1ECAC ; N # So INDIC SIYAQ PLACEHOLDER +1ECAD..1ECAF ; N # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS +1ECB0 ; N # Sc INDIC SIYAQ RUPEE MARK +1ECB1..1ECB4 ; N # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK +1ED01..1ED2D ; N # No [45] OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ NUMBER NINETY THOUSAND +1ED2E ; N # So OTTOMAN SIYAQ MARRATAN +1ED2F..1ED3D ; N # No [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH +1EE00..1EE03 ; N # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; N # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; N # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; N # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; N # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; N # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; N # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; N # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; N # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; N # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; N # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; N # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; N # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; N # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; N # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; N # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; N # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; N # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; N # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; N # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; N # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; N # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; N # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; N # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; N # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; N # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; N # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; N # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; N # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; N # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; N # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; N # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; N # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1EEF0..1EEF1 ; N # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +1F000..1F003 ; N # So [4] MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND +1F004 ; W # So MAHJONG TILE RED DRAGON +1F005..1F02B ; N # So [39] MAHJONG TILE GREEN DRAGON..MAHJONG TILE BACK +1F030..1F093 ; N # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 +1F0A0..1F0AE ; N # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES +1F0B1..1F0BF ; N # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER +1F0C1..1F0CE ; N # So [14] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD KING OF DIAMONDS +1F0CF ; W # So PLAYING CARD BLACK JOKER +1F0D1..1F0F5 ; N # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 +1F100..1F10A ; A # No [11] DIGIT ZERO FULL STOP..DIGIT NINE COMMA +1F10B..1F10C ; N # No [2] DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +1F10D..1F10F ; N # So [3] CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH +1F110..1F12D ; A # So [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD +1F12E..1F12F ; N # So [2] CIRCLED WZ..COPYLEFT SYMBOL +1F130..1F169 ; A # So [58] SQUARED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F16A..1F16F ; N # So [6] RAISED MC SIGN..CIRCLED HUMAN FIGURE +1F170..1F18D ; A # So [30] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED SA +1F18E ; W # So NEGATIVE SQUARED AB +1F18F..1F190 ; A # So [2] NEGATIVE SQUARED WC..SQUARE DJ +1F191..1F19A ; W # So [10] SQUARED CL..SQUARED VS +1F19B..1F1AC ; A # So [18] SQUARED THREE D..SQUARED VOD +1F1AD ; N # So MASK WORK SYMBOL +1F1E6..1F1FF ; N # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z +1F200..1F202 ; W # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA +1F210..1F23B ; W # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D +1F240..1F248 ; W # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F250..1F251 ; W # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT +1F260..1F265 ; W # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +1F300..1F320 ; W # So [33] CYCLONE..SHOOTING STAR +1F321..1F32C ; N # So [12] THERMOMETER..WIND BLOWING FACE +1F32D..1F335 ; W # So [9] HOT DOG..CACTUS +1F336 ; N # So HOT PEPPER +1F337..1F37C ; W # So [70] TULIP..BABY BOTTLE +1F37D ; N # So FORK AND KNIFE WITH PLATE +1F37E..1F393 ; W # So [22] BOTTLE WITH POPPING CORK..GRADUATION CAP +1F394..1F39F ; N # So [12] HEART WITH TIP ON THE LEFT..ADMISSION TICKETS +1F3A0..1F3CA ; W # So [43] CAROUSEL HORSE..SWIMMER +1F3CB..1F3CE ; N # So [4] WEIGHT LIFTER..RACING CAR +1F3CF..1F3D3 ; W # So [5] CRICKET BAT AND BALL..TABLE TENNIS PADDLE AND BALL +1F3D4..1F3DF ; N # So [12] SNOW CAPPED MOUNTAIN..STADIUM +1F3E0..1F3F0 ; W # So [17] HOUSE BUILDING..EUROPEAN CASTLE +1F3F1..1F3F3 ; N # So [3] WHITE PENNANT..WAVING WHITE FLAG +1F3F4 ; W # So WAVING BLACK FLAG +1F3F5..1F3F7 ; N # So [3] ROSETTE..LABEL +1F3F8..1F3FA ; W # So [3] BADMINTON RACQUET AND SHUTTLECOCK..AMPHORA +1F3FB..1F3FF ; W # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400..1F43E ; W # So [63] RAT..PAW PRINTS +1F43F ; N # So CHIPMUNK +1F440 ; W # So EYES +1F441 ; N # So EYE +1F442..1F4FC ; W # So [187] EAR..VIDEOCASSETTE +1F4FD..1F4FE ; N # So [2] FILM PROJECTOR..PORTABLE STEREO +1F4FF..1F53D ; W # So [63] PRAYER BEADS..DOWN-POINTING SMALL RED TRIANGLE +1F53E..1F54A ; N # So [13] LOWER RIGHT SHADOWED WHITE CIRCLE..DOVE OF PEACE +1F54B..1F54E ; W # So [4] KAABA..MENORAH WITH NINE BRANCHES +1F54F ; N # So BOWL OF HYGIEIA +1F550..1F567 ; W # So [24] CLOCK FACE ONE OCLOCK..CLOCK FACE TWELVE-THIRTY +1F568..1F579 ; N # So [18] RIGHT SPEAKER..JOYSTICK +1F57A ; W # So MAN DANCING +1F57B..1F594 ; N # So [26] LEFT HAND TELEPHONE RECEIVER..REVERSED VICTORY HAND +1F595..1F596 ; W # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F597..1F5A3 ; N # So [13] WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX +1F5A4 ; W # So BLACK HEART +1F5A5..1F5FA ; N # So [86] DESKTOP COMPUTER..WORLD MAP +1F5FB..1F5FF ; W # So [5] MOUNT FUJI..MOYAI +1F600..1F64F ; W # So [80] GRINNING FACE..PERSON WITH FOLDED HANDS +1F650..1F67F ; N # So [48] NORTH WEST POINTING LEAF..REVERSE CHECKER BOARD +1F680..1F6C5 ; W # So [70] ROCKET..LEFT LUGGAGE +1F6C6..1F6CB ; N # So [6] TRIANGLE WITH ROUNDED CORNERS..COUCH AND LAMP +1F6CC ; W # So SLEEPING ACCOMMODATION +1F6CD..1F6CF ; N # So [3] SHOPPING BAGS..BED +1F6D0..1F6D2 ; W # So [3] PLACE OF WORSHIP..SHOPPING TROLLEY +1F6D3..1F6D4 ; N # So [2] STUPA..PAGODA +1F6D5..1F6D7 ; W # So [3] HINDU TEMPLE..ELEVATOR +1F6DC..1F6DF ; W # So [4] WIRELESS..RING BUOY +1F6E0..1F6EA ; N # So [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE +1F6EB..1F6EC ; W # So [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING +1F6F0..1F6F3 ; N # So [4] SATELLITE..PASSENGER SHIP +1F6F4..1F6FC ; W # So [9] SCOOTER..ROLLER SKATE +1F700..1F776 ; N # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE +1F77B..1F77F ; N # So [5] HAUMEA..ORCUS +1F780..1F7D9 ; N # So [90] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NINE POINTED WHITE STAR +1F7E0..1F7EB ; W # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE +1F7F0 ; W # So HEAVY EQUALS SIGN +1F800..1F80B ; N # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F810..1F847 ; N # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +1F850..1F859 ; N # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW +1F860..1F887 ; N # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F890..1F8AD ; N # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS +1F8B0..1F8B1 ; N # So [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST +1F900..1F90B ; N # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F90C..1F93A ; W # So [47] PINCHED FINGERS..FENCER +1F93B ; N # So MODERN PENTATHLON +1F93C..1F945 ; W # So [10] WRESTLERS..GOAL NET +1F946 ; N # So RIFLE +1F947..1F9FF ; W # So [185] FIRST PLACE MEDAL..NAZAR AMULET +1FA00..1FA53 ; N # So [84] NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP +1FA60..1FA6D ; N # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER +1FA70..1FA7C ; W # So [13] BALLET SHOES..CRUTCH +1FA80..1FA88 ; W # So [9] YO-YO..FLUTE +1FA90..1FABD ; W # So [46] RINGED PLANET..WING +1FABF..1FAC5 ; W # So [7] GOOSE..PERSON WITH CROWN +1FACE..1FADB ; W # So [14] MOOSE..PEA POD +1FAE0..1FAE8 ; W # So [9] MELTING FACE..SHAKING FACE +1FAF0..1FAF8 ; W # So [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND +1FB00..1FB92 ; N # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK +1FB94..1FBCA ; N # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON +1FBF0..1FBF9 ; N # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE +20000..2A6DF ; W # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF +2A6E0..2A6FF ; W # Cn [32] .. +2A700..2B739 ; W # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 +2B73A..2B73F ; W # Cn [6] .. +2B740..2B81D ; W # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B81E..2B81F ; W # Cn [2] .. +2B820..2CEA1 ; W # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEA2..2CEAF ; W # Cn [14] .. +2CEB0..2EBE0 ; W # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBE1..2EBEF ; W # Cn [15] .. +2EBF0..2EE5D ; W # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D +2EE5E..2F7FF ; W # Cn [2466] .. +2F800..2FA1D ; W # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +2FA1E..2FA1F ; W # Cn [2] .. +2FA20..2FFFD ; W # Cn [1502] .. +30000..3134A ; W # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +3134B..3134F ; W # Cn [5] .. +31350..323AF ; W # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF +323B0..3FFFD ; W # Cn [56398] .. +E0001 ; N # Cf LANGUAGE TAG +E0020..E007F ; N # Cf [96] TAG SPACE..CANCEL TAG +E0100..E01EF ; A # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +F0000..FFFFD ; A # Co [65534] .. +100000..10FFFD ; A # Co [65534] .. # EOF diff --git a/yass/third_party/libc++/trunk/utils/data/unicode/GraphemeBreakProperty.txt b/yass/third_party/libc++/trunk/utils/data/unicode/GraphemeBreakProperty.txt index a12b5eef1e..12453cbdb5 100644 --- a/yass/third_party/libc++/trunk/utils/data/unicode/GraphemeBreakProperty.txt +++ b/yass/third_party/libc++/trunk/utils/data/unicode/GraphemeBreakProperty.txt @@ -1,6 +1,6 @@ -# GraphemeBreakProperty-15.0.0.txt -# Date: 2022-04-27, 17:07:38 GMT -# © 2022 Unicode®, Inc. +# GraphemeBreakProperty-15.1.0.txt +# Date: 2023-01-05, 20:34:41 GMT +# © 2023 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see https://www.unicode.org/terms_of_use.html # diff --git a/yass/third_party/libc++/trunk/utils/data/unicode/GraphemeBreakTest.txt b/yass/third_party/libc++/trunk/utils/data/unicode/GraphemeBreakTest.txt index 3c73f97b7b..4c1ed512e4 100644 --- a/yass/third_party/libc++/trunk/utils/data/unicode/GraphemeBreakTest.txt +++ b/yass/third_party/libc++/trunk/utils/data/unicode/GraphemeBreakTest.txt @@ -1,6 +1,6 @@ -# GraphemeBreakTest-15.0.0.txt -# Date: 2022-02-26, 00:38:37 GMT -# © 2022 Unicode®, Inc. +# GraphemeBreakTest-15.1.0.txt +# Date: 2023-08-07, 15:52:55 GMT +# © 2023 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see https://www.unicode.org/terms_of_use.html # @@ -36,8 +36,8 @@ ÷ 0020 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0020 ÷ 0600 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 0020 × 0308 ÷ 0600 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0020 × 0903 ÷ # ÷ [0.2] SPACE (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0020 × 0308 × 0903 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0020 × 0A03 ÷ # ÷ [0.2] SPACE (Other) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0020 × 0308 × 0A03 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0020 ÷ 1100 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 0020 × 0308 ÷ 1100 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 0020 ÷ 1160 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -48,10 +48,24 @@ ÷ 0020 × 0308 ÷ AC00 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 0020 ÷ AC01 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 0020 × 0308 ÷ AC01 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0020 × 0900 ÷ # ÷ [0.2] SPACE (Other) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0020 × 0308 × 0900 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0020 × 0903 ÷ # ÷ [0.2] SPACE (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0020 × 0308 × 0903 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0020 ÷ 0904 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0020 × 0308 ÷ 0904 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0020 ÷ 0D4E ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0020 × 0308 ÷ 0D4E ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0020 ÷ 0915 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0020 × 0308 ÷ 0915 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 0020 ÷ 231A ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 0020 × 0308 ÷ 231A ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 0020 × 0300 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 0020 × 0308 × 0300 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0020 × 093C ÷ # ÷ [0.2] SPACE (Other) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0020 × 0308 × 093C ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0020 × 094D ÷ # ÷ [0.2] SPACE (Other) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0020 × 0308 × 094D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 0020 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0020 × 0308 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0020 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] (Other) ÷ [0.3] @@ -70,8 +84,8 @@ ÷ 000D ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 000D ÷ 0600 ÷ # ÷ [0.2] (CR) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 000D ÷ 0903 ÷ # ÷ [0.2] (CR) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 000D ÷ 0308 × 0903 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 000D ÷ 0A03 ÷ # ÷ [0.2] (CR) ÷ [4.0] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 000D ÷ 0308 × 0A03 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 000D ÷ 1100 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 000D ÷ 1160 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -82,10 +96,24 @@ ÷ 000D ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 000D ÷ AC01 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 000D ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 000D ÷ 0900 ÷ # ÷ [0.2] (CR) ÷ [4.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 000D ÷ 0308 × 0900 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 000D ÷ 0903 ÷ # ÷ [0.2] (CR) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 000D ÷ 0308 × 0903 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 000D ÷ 0904 ÷ # ÷ [0.2] (CR) ÷ [4.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0904 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 000D ÷ 0D4E ÷ # ÷ [0.2] (CR) ÷ [4.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0D4E ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 000D ÷ 0915 ÷ # ÷ [0.2] (CR) ÷ [4.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0915 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 000D ÷ 231A ÷ # ÷ [0.2] (CR) ÷ [4.0] WATCH (ExtPict) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 000D ÷ 0300 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 000D ÷ 0308 × 0300 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 000D ÷ 093C ÷ # ÷ [0.2] (CR) ÷ [4.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 000D ÷ 0308 × 093C ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 000D ÷ 094D ÷ # ÷ [0.2] (CR) ÷ [4.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 000D ÷ 0308 × 094D ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 000D ÷ 200D ÷ # ÷ [0.2] (CR) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 000D ÷ 0308 × 200D ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 000D ÷ 0378 ÷ # ÷ [0.2] (CR) ÷ [4.0] (Other) ÷ [0.3] @@ -104,8 +132,8 @@ ÷ 000A ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 000A ÷ 0600 ÷ # ÷ [0.2] (LF) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 000A ÷ 0903 ÷ # ÷ [0.2] (LF) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 000A ÷ 0308 × 0903 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 000A ÷ 0A03 ÷ # ÷ [0.2] (LF) ÷ [4.0] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 000A ÷ 0308 × 0A03 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 000A ÷ 1100 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 000A ÷ 1160 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -116,10 +144,24 @@ ÷ 000A ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 000A ÷ AC01 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 000A ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 000A ÷ 0900 ÷ # ÷ [0.2] (LF) ÷ [4.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 000A ÷ 0308 × 0900 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 000A ÷ 0903 ÷ # ÷ [0.2] (LF) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 000A ÷ 0308 × 0903 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 000A ÷ 0904 ÷ # ÷ [0.2] (LF) ÷ [4.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0904 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 000A ÷ 0D4E ÷ # ÷ [0.2] (LF) ÷ [4.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0D4E ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 000A ÷ 0915 ÷ # ÷ [0.2] (LF) ÷ [4.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0915 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 000A ÷ 231A ÷ # ÷ [0.2] (LF) ÷ [4.0] WATCH (ExtPict) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 000A ÷ 0300 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 000A ÷ 0308 × 0300 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 000A ÷ 093C ÷ # ÷ [0.2] (LF) ÷ [4.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 000A ÷ 0308 × 093C ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 000A ÷ 094D ÷ # ÷ [0.2] (LF) ÷ [4.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 000A ÷ 0308 × 094D ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 000A ÷ 200D ÷ # ÷ [0.2] (LF) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 000A ÷ 0308 × 200D ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 000A ÷ 0378 ÷ # ÷ [0.2] (LF) ÷ [4.0] (Other) ÷ [0.3] @@ -138,8 +180,8 @@ ÷ 0001 ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0001 ÷ 0600 ÷ # ÷ [0.2] (Control) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 0001 ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0001 ÷ 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0001 ÷ 0308 × 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0001 ÷ 0A03 ÷ # ÷ [0.2] (Control) ÷ [4.0] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0001 ÷ 0308 × 0A03 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0001 ÷ 1100 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 0001 ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 0001 ÷ 1160 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -150,10 +192,24 @@ ÷ 0001 ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 0001 ÷ AC01 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 0001 ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0001 ÷ 0900 ÷ # ÷ [0.2] (Control) ÷ [4.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0001 ÷ 0308 × 0900 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0001 ÷ 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0001 ÷ 0308 × 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0001 ÷ 0904 ÷ # ÷ [0.2] (Control) ÷ [4.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 0904 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0001 ÷ 0D4E ÷ # ÷ [0.2] (Control) ÷ [4.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 0D4E ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0001 ÷ 0915 ÷ # ÷ [0.2] (Control) ÷ [4.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 0915 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 0001 ÷ 231A ÷ # ÷ [0.2] (Control) ÷ [4.0] WATCH (ExtPict) ÷ [0.3] ÷ 0001 ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 0001 ÷ 0300 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 0001 ÷ 0308 × 0300 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0001 ÷ 093C ÷ # ÷ [0.2] (Control) ÷ [4.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0001 ÷ 0308 × 093C ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0001 ÷ 094D ÷ # ÷ [0.2] (Control) ÷ [4.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0001 ÷ 0308 × 094D ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 0001 ÷ 200D ÷ # ÷ [0.2] (Control) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0001 ÷ 0308 × 200D ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0001 ÷ 0378 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Other) ÷ [0.3] @@ -172,8 +228,8 @@ ÷ 034F × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 034F ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 034F × 0308 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 034F × 0903 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 034F × 0308 × 0903 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 034F × 0A03 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 034F × 0308 × 0A03 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 034F ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 034F × 0308 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 034F ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -184,10 +240,24 @@ ÷ 034F × 0308 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 034F ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 034F × 0308 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 034F × 0900 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 034F × 0308 × 0900 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 034F × 0903 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 034F × 0308 × 0903 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 034F ÷ 0904 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 034F × 0308 ÷ 0904 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 034F ÷ 0D4E ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 034F × 0308 ÷ 0D4E ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 034F ÷ 0915 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 034F × 0308 ÷ 0915 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 034F ÷ 231A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 034F × 0308 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 034F × 0300 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 034F × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 034F × 093C ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 034F × 0308 × 093C ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 034F × 094D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 034F × 0308 × 094D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 034F × 200D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 034F × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 034F ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] (Other) ÷ [0.3] @@ -206,8 +276,8 @@ ÷ 1F1E6 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 1F1E6 ÷ 0600 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 1F1E6 × 0308 ÷ 0600 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 1F1E6 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 1F1E6 × 0308 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1F1E6 × 0A03 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1F1E6 × 0308 × 0A03 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 1F1E6 ÷ 1100 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 1F1E6 × 0308 ÷ 1100 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 1F1E6 ÷ 1160 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -218,10 +288,24 @@ ÷ 1F1E6 × 0308 ÷ AC00 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 1F1E6 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 1F1E6 × 0308 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1F1E6 × 0900 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1F1E6 × 0308 × 0900 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1F1E6 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 1F1E6 × 0308 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 1F1E6 ÷ 0904 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0904 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 1F1E6 ÷ 0D4E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0D4E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1F1E6 ÷ 0915 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0915 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 1F1E6 ÷ 231A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 1F1E6 × 0308 ÷ 231A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 1F1E6 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 1F1E6 × 0308 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 1F1E6 × 093C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 1F1E6 × 0308 × 093C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 1F1E6 × 094D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 1F1E6 × 0308 × 094D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 1F1E6 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 1F1E6 × 0308 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 1F1E6 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] (Other) ÷ [0.3] @@ -240,8 +324,8 @@ ÷ 0600 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0600 × 0600 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 0600 × 0308 ÷ 0600 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0600 × 0903 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0600 × 0308 × 0903 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0600 × 0A03 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0600 × 0308 × 0A03 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0600 × 1100 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 0600 × 0308 ÷ 1100 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 0600 × 1160 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -252,48 +336,76 @@ ÷ 0600 × 0308 ÷ AC00 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 0600 × AC01 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 0600 × 0308 ÷ AC01 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0600 × 0900 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0600 × 0308 × 0900 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0600 × 0903 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0600 × 0308 × 0903 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0600 × 0904 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0600 × 0308 ÷ 0904 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0600 × 0D4E ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0600 × 0308 ÷ 0D4E ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0600 × 0915 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0600 × 0308 ÷ 0915 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 0600 × 231A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] WATCH (ExtPict) ÷ [0.3] ÷ 0600 × 0308 ÷ 231A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 0600 × 0300 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 0600 × 0308 × 0300 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0600 × 093C ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0600 × 0308 × 093C ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0600 × 094D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0600 × 0308 × 094D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 0600 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0600 × 0308 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0600 × 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] (Other) ÷ [0.3] ÷ 0600 × 0308 ÷ 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0903 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0903 × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0903 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (CR) ÷ [0.3] -÷ 0903 × 0308 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 0903 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (LF) ÷ [0.3] -÷ 0903 × 0308 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 0903 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (Control) ÷ [0.3] -÷ 0903 × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 0903 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0903 × 0308 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0903 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0903 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0903 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0903 × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0903 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0903 × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0903 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0903 × 0308 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0903 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0903 × 0308 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0903 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0903 × 0308 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0903 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0903 × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0903 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0903 × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0903 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0903 × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0903 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0903 × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0903 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0903 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0903 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] (Other) ÷ [0.3] -÷ 0903 × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0A03 ÷ 0020 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0A03 × 0308 ÷ 0020 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0A03 ÷ 000D ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [5.0] (CR) ÷ [0.3] +÷ 0A03 × 0308 ÷ 000D ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0A03 ÷ 000A ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [5.0] (LF) ÷ [0.3] +÷ 0A03 × 0308 ÷ 000A ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0A03 ÷ 0001 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [5.0] (Control) ÷ [0.3] +÷ 0A03 × 0308 ÷ 0001 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0A03 × 034F ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0A03 × 0308 × 034F ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0A03 ÷ 1F1E6 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0A03 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0A03 ÷ 0600 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0A03 × 0308 ÷ 0600 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0A03 × 0A03 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0A03 × 0308 × 0A03 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0A03 ÷ 1100 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0A03 × 0308 ÷ 1100 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0A03 ÷ 1160 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0A03 × 0308 ÷ 1160 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0A03 ÷ 11A8 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0A03 × 0308 ÷ 11A8 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0A03 ÷ AC00 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0A03 × 0308 ÷ AC00 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0A03 ÷ AC01 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0A03 × 0308 ÷ AC01 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0A03 × 0900 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0A03 × 0308 × 0900 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0A03 × 0903 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0A03 × 0308 × 0903 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0A03 ÷ 0904 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0A03 × 0308 ÷ 0904 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0A03 ÷ 0D4E ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0A03 × 0308 ÷ 0D4E ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0A03 ÷ 0915 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0A03 × 0308 ÷ 0915 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0A03 ÷ 231A ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0A03 × 0308 ÷ 231A ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0A03 × 0300 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0A03 × 0308 × 0300 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0A03 × 093C ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0A03 × 0308 × 093C ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0A03 × 094D ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0A03 × 0308 × 094D ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0A03 × 200D ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0A03 × 0308 × 200D ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0A03 ÷ 0378 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [999.0] (Other) ÷ [0.3] +÷ 0A03 × 0308 ÷ 0378 ÷ # ÷ [0.2] GURMUKHI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] ÷ 1100 ÷ 0020 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 1100 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 1100 ÷ 000D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] (CR) ÷ [0.3] @@ -308,8 +420,8 @@ ÷ 1100 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 1100 ÷ 0600 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 1100 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 1100 × 0903 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 1100 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1100 × 0A03 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1100 × 0308 × 0A03 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 1100 × 1100 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 1100 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 1100 × 1160 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -320,10 +432,24 @@ ÷ 1100 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 1100 × AC01 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 1100 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1100 × 0900 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1100 × 0308 × 0900 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1100 × 0903 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 1100 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 1100 ÷ 0904 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 1100 × 0308 ÷ 0904 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 1100 ÷ 0D4E ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1100 × 0308 ÷ 0D4E ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1100 ÷ 0915 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 1100 × 0308 ÷ 0915 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 1100 ÷ 231A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 1100 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 1100 × 0300 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 1100 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 1100 × 093C ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 1100 × 0308 × 093C ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 1100 × 094D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 1100 × 0308 × 094D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 1100 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 1100 × 0308 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 1100 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] (Other) ÷ [0.3] @@ -342,8 +468,8 @@ ÷ 1160 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 1160 ÷ 0600 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 1160 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 1160 × 0903 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 1160 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1160 × 0A03 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1160 × 0308 × 0A03 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 1160 ÷ 1100 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 1160 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 1160 × 1160 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [7.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -354,10 +480,24 @@ ÷ 1160 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 1160 ÷ AC01 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 1160 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1160 × 0900 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1160 × 0308 × 0900 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1160 × 0903 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 1160 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 1160 ÷ 0904 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 1160 × 0308 ÷ 0904 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 1160 ÷ 0D4E ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1160 × 0308 ÷ 0D4E ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 1160 ÷ 0915 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 1160 × 0308 ÷ 0915 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 1160 ÷ 231A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 1160 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 1160 × 0300 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 1160 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 1160 × 093C ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 1160 × 0308 × 093C ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 1160 × 094D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 1160 × 0308 × 094D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 1160 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 1160 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 1160 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] (Other) ÷ [0.3] @@ -376,8 +516,8 @@ ÷ 11A8 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 11A8 ÷ 0600 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 11A8 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 11A8 × 0903 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 11A8 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 11A8 × 0A03 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 11A8 × 0308 × 0A03 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 11A8 ÷ 1100 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 11A8 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 11A8 ÷ 1160 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -388,10 +528,24 @@ ÷ 11A8 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 11A8 ÷ AC01 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 11A8 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 11A8 × 0900 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 11A8 × 0308 × 0900 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 11A8 × 0903 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 11A8 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 11A8 ÷ 0904 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 11A8 × 0308 ÷ 0904 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 11A8 ÷ 0D4E ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 11A8 × 0308 ÷ 0D4E ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 11A8 ÷ 0915 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 11A8 × 0308 ÷ 0915 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 11A8 ÷ 231A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 11A8 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 11A8 × 0300 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 11A8 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 11A8 × 093C ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 11A8 × 0308 × 093C ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 11A8 × 094D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 11A8 × 0308 × 094D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 11A8 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 11A8 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 11A8 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] (Other) ÷ [0.3] @@ -410,8 +564,8 @@ ÷ AC00 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ AC00 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ AC00 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ AC00 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ AC00 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ AC00 × 0A03 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ AC00 × 0308 × 0A03 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ AC00 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ AC00 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ AC00 × 1160 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [7.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -422,10 +576,24 @@ ÷ AC00 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ AC00 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ AC00 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ AC00 × 0900 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ AC00 × 0308 × 0900 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ AC00 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ AC00 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ AC00 ÷ 0904 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ AC00 × 0308 ÷ 0904 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ AC00 ÷ 0D4E ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ AC00 × 0308 ÷ 0D4E ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ AC00 ÷ 0915 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ AC00 × 0308 ÷ 0915 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ AC00 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ AC00 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ AC00 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ AC00 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ AC00 × 093C ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ AC00 × 0308 × 093C ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ AC00 × 094D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ AC00 × 0308 × 094D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ AC00 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ AC00 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ AC00 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] (Other) ÷ [0.3] @@ -444,8 +612,8 @@ ÷ AC01 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ AC01 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ AC01 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ AC01 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ AC01 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ AC01 × 0A03 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ AC01 × 0308 × 0A03 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ AC01 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ AC01 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ AC01 ÷ 1160 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -456,14 +624,268 @@ ÷ AC01 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ AC01 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ AC01 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ AC01 × 0900 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ AC01 × 0308 × 0900 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ AC01 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ AC01 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ AC01 ÷ 0904 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ AC01 × 0308 ÷ 0904 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ AC01 ÷ 0D4E ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ AC01 × 0308 ÷ 0D4E ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ AC01 ÷ 0915 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ AC01 × 0308 ÷ 0915 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ AC01 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ AC01 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ AC01 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ AC01 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ AC01 × 093C ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ AC01 × 0308 × 093C ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ AC01 × 094D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ AC01 × 0308 × 094D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ AC01 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ AC01 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ AC01 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] (Other) ÷ [0.3] ÷ AC01 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0900 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0900 × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0900 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [5.0] (CR) ÷ [0.3] +÷ 0900 × 0308 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0900 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [5.0] (LF) ÷ [0.3] +÷ 0900 × 0308 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0900 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [5.0] (Control) ÷ [0.3] +÷ 0900 × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0900 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0900 × 0308 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0900 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0900 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0900 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0900 × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0900 × 0A03 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0900 × 0308 × 0A03 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0900 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0900 × 0308 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0900 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0900 × 0308 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0900 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0900 × 0308 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0900 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0900 × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0900 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0900 × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0900 × 0900 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0900 × 0308 × 0900 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0900 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0900 × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0900 ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0900 × 0308 ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0900 ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0900 × 0308 ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0900 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0900 × 0308 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0900 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0900 × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0900 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0900 × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0900 × 093C ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0900 × 0308 × 093C ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0900 × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0900 × 0308 × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0900 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0900 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0900 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [999.0] (Other) ÷ [0.3] +÷ 0900 × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0903 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0903 × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0903 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [5.0] (CR) ÷ [0.3] +÷ 0903 × 0308 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0903 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [5.0] (LF) ÷ [0.3] +÷ 0903 × 0308 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0903 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [5.0] (Control) ÷ [0.3] +÷ 0903 × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0903 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0903 × 0308 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0903 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0903 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0903 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0903 × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0903 × 0A03 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0903 × 0308 × 0A03 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0903 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0903 × 0308 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0903 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0903 × 0308 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0903 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0903 × 0308 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0903 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0903 × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0903 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0903 × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0903 × 0900 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0903 × 0308 × 0900 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0903 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0903 × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0903 ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0903 × 0308 ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0903 ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0903 × 0308 ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0903 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0903 × 0308 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0903 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0903 × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0903 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0903 × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0903 × 093C ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0903 × 0308 × 093C ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0903 × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0903 × 0308 × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0903 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0903 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0903 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] (Other) ÷ [0.3] +÷ 0903 × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0904 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0904 × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0904 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [5.0] (CR) ÷ [0.3] +÷ 0904 × 0308 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0904 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [5.0] (LF) ÷ [0.3] +÷ 0904 × 0308 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0904 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [5.0] (Control) ÷ [0.3] +÷ 0904 × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0904 × 034F ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0904 × 0308 × 034F ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0904 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0904 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0904 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0904 × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0904 × 0A03 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0904 × 0308 × 0A03 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0904 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0904 × 0308 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0904 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0904 × 0308 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0904 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0904 × 0308 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0904 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0904 × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0904 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0904 × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0904 × 0900 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0904 × 0308 × 0900 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0904 × 0903 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0904 × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0904 ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0904 × 0308 ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0904 ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0904 × 0308 ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0904 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0904 × 0308 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0904 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0904 × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0904 × 0300 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0904 × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0904 × 093C ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0904 × 0308 × 093C ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0904 × 094D ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0904 × 0308 × 094D ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0904 × 200D ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0904 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0904 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [999.0] (Other) ÷ [0.3] +÷ 0904 × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0D4E × 0020 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] SPACE (Other) ÷ [0.3] +÷ 0D4E × 0308 ÷ 0020 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0D4E ÷ 000D ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [5.0] (CR) ÷ [0.3] +÷ 0D4E × 0308 ÷ 000D ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0D4E ÷ 000A ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [5.0] (LF) ÷ [0.3] +÷ 0D4E × 0308 ÷ 000A ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0D4E ÷ 0001 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [5.0] (Control) ÷ [0.3] +÷ 0D4E × 0308 ÷ 0001 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0D4E × 034F ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0D4E × 0308 × 034F ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0D4E × 1F1E6 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0D4E × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0D4E × 0600 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0D4E × 0308 ÷ 0600 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0D4E × 0A03 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0D4E × 0308 × 0A03 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0D4E × 1100 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0D4E × 0308 ÷ 1100 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0D4E × 1160 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0D4E × 0308 ÷ 1160 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0D4E × 11A8 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0D4E × 0308 ÷ 11A8 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0D4E × AC00 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0D4E × 0308 ÷ AC00 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0D4E × AC01 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0D4E × 0308 ÷ AC01 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0D4E × 0900 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0D4E × 0308 × 0900 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0D4E × 0903 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0D4E × 0308 × 0903 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0D4E × 0904 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0D4E × 0308 ÷ 0904 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0D4E × 0D4E ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0D4E × 0308 ÷ 0D4E ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0D4E × 0915 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0D4E × 0308 ÷ 0915 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0D4E × 231A ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] WATCH (ExtPict) ÷ [0.3] +÷ 0D4E × 0308 ÷ 231A ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0D4E × 0300 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0D4E × 0308 × 0300 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0D4E × 093C ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0D4E × 0308 × 093C ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0D4E × 094D ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0D4E × 0308 × 094D ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0D4E × 200D ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0D4E × 0308 × 200D ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0D4E × 0378 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.2] (Other) ÷ [0.3] +÷ 0D4E × 0308 ÷ 0378 ÷ # ÷ [0.2] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0915 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0915 × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0915 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [5.0] (CR) ÷ [0.3] +÷ 0915 × 0308 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0915 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [5.0] (LF) ÷ [0.3] +÷ 0915 × 0308 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0915 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [5.0] (Control) ÷ [0.3] +÷ 0915 × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0915 × 034F ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0915 × 0308 × 034F ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0915 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0915 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0915 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0915 × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0915 × 0A03 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0915 × 0308 × 0A03 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0915 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0915 × 0308 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0915 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0915 × 0308 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0915 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0915 × 0308 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0915 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0915 × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0915 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0915 × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0915 × 0900 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0915 × 0308 × 0900 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0915 × 0903 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0915 × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0915 ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0915 × 0308 ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0915 ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0915 × 0308 ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0915 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0915 × 0308 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0915 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0915 × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0915 × 0300 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0915 × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0915 × 093C ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0915 × 0308 × 093C ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0915 × 094D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0915 × 0308 × 094D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0915 × 200D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0915 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0915 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] (Other) ÷ [0.3] +÷ 0915 × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] ÷ 231A ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 231A × 0308 ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 231A ÷ 000D ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] (CR) ÷ [0.3] @@ -478,8 +900,8 @@ ÷ 231A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 231A ÷ 0600 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 231A × 0308 ÷ 0600 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 231A × 0903 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 231A × 0308 × 0903 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 231A × 0A03 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 231A × 0308 × 0A03 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 231A ÷ 1100 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 231A × 0308 ÷ 1100 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 231A ÷ 1160 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -490,10 +912,24 @@ ÷ 231A × 0308 ÷ AC00 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 231A ÷ AC01 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 231A × 0308 ÷ AC01 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 231A × 0900 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 231A × 0308 × 0900 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 231A × 0903 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 231A × 0308 × 0903 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 231A ÷ 0904 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 231A × 0308 ÷ 0904 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 231A ÷ 0D4E ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 231A × 0308 ÷ 0D4E ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 231A ÷ 0915 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 231A × 0308 ÷ 0915 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 231A ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 231A × 0308 ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 231A × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 231A × 0308 × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 231A × 093C ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 231A × 0308 × 093C ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 231A × 094D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 231A × 0308 × 094D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 231A × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 231A × 0308 × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 231A ÷ 0378 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] (Other) ÷ [0.3] @@ -512,8 +948,8 @@ ÷ 0300 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0300 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 0300 × 0308 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0300 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0300 × 0308 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0300 × 0A03 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0300 × 0308 × 0A03 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0300 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 0300 × 0308 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 0300 ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -524,14 +960,124 @@ ÷ 0300 × 0308 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 0300 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 0300 × 0308 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0300 × 0900 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0300 × 0308 × 0900 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0300 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0300 × 0308 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0300 ÷ 0904 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0300 × 0308 ÷ 0904 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0300 ÷ 0D4E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0300 × 0308 ÷ 0D4E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0300 ÷ 0915 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0300 × 0308 ÷ 0915 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 0300 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 0300 × 0308 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 0300 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 0300 × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0300 × 093C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0300 × 0308 × 093C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0300 × 094D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0300 × 0308 × 094D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 0300 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0300 × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0300 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] ÷ 0300 × 0308 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 093C ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 093C × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 093C ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 093C × 0308 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 093C ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 093C × 0308 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 093C ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 093C × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 093C × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 093C × 0308 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 093C ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 093C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 093C ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 093C × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 093C × 0A03 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 093C × 0308 × 0A03 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 093C ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 093C × 0308 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 093C ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 093C × 0308 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 093C ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 093C × 0308 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 093C ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 093C × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 093C ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 093C × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 093C × 0900 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 093C × 0308 × 0900 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 093C × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 093C × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 093C ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 093C × 0308 ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 093C ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 093C × 0308 ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 093C ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 093C × 0308 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 093C ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 093C × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 093C × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 093C × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 093C × 093C ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 093C × 0308 × 093C ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 093C × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 093C × 0308 × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 093C × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 093C × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 093C ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 093C × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 094D ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 094D × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 094D ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 094D × 0308 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 094D ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 094D × 0308 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 094D ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 094D × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 094D × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 094D × 0308 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 094D ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 094D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 094D ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 094D × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 094D × 0A03 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 094D × 0308 × 0A03 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 094D ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 094D × 0308 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 094D ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 094D × 0308 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 094D ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 094D × 0308 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 094D ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 094D × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 094D ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 094D × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 094D × 0900 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 094D × 0308 × 0900 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 094D × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 094D × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 094D ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 094D × 0308 ÷ 0904 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 094D ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 094D × 0308 ÷ 0D4E ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 094D ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 094D × 0308 ÷ 0915 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 094D ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 094D × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 094D × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 094D × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 094D × 093C ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 094D × 0308 × 093C ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 094D × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 094D × 0308 × 094D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 094D × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 094D × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 094D ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 094D × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] ÷ 200D ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 200D × 0308 ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 200D ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] @@ -546,8 +1092,8 @@ ÷ 200D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 200D ÷ 0600 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 200D × 0308 ÷ 0600 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 200D × 0903 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 200D × 0308 × 0903 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 200D × 0A03 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 200D × 0308 × 0A03 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 200D ÷ 1100 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 200D × 0308 ÷ 1100 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 200D ÷ 1160 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -558,10 +1104,24 @@ ÷ 200D × 0308 ÷ AC00 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 200D ÷ AC01 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 200D × 0308 ÷ AC01 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 200D × 0900 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 200D × 0308 × 0900 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 200D × 0903 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 200D × 0308 × 0903 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 200D ÷ 0904 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 200D × 0308 ÷ 0904 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 200D ÷ 0D4E ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 200D × 0308 ÷ 0D4E ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 200D ÷ 0915 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 200D × 0308 ÷ 0915 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 200D ÷ 231A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 200D × 0308 ÷ 231A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 200D × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 200D × 0308 × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 200D × 093C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 200D × 0308 × 093C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 200D × 094D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 200D × 0308 × 094D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 200D × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 200D × 0308 × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 200D ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] @@ -580,8 +1140,8 @@ ÷ 0378 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0378 ÷ 0600 ÷ # ÷ [0.2] (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 0378 × 0308 ÷ 0600 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0378 × 0903 ÷ # ÷ [0.2] (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0378 × 0308 × 0903 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0378 × 0A03 ÷ # ÷ [0.2] (Other) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0378 × 0308 × 0A03 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] GURMUKHI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0378 ÷ 1100 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 0378 × 0308 ÷ 1100 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ÷ 0378 ÷ 1160 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] @@ -592,10 +1152,24 @@ ÷ 0378 × 0308 ÷ AC00 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 0378 ÷ AC01 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 0378 × 0308 ÷ AC01 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0378 × 0900 ÷ # ÷ [0.2] (Other) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0378 × 0308 × 0900 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN INVERTED CANDRABINDU (Extend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0378 × 0903 ÷ # ÷ [0.2] (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0378 × 0308 × 0903 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [0.3] +÷ 0378 ÷ 0904 ÷ # ÷ [0.2] (Other) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0378 × 0308 ÷ 0904 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER SHORT A (ConjunctLinkingScripts) ÷ [0.3] +÷ 0378 ÷ 0D4E ÷ # ÷ [0.2] (Other) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0378 × 0308 ÷ 0D4E ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] MALAYALAM LETTER DOT REPH (Prepend_ConjunctLinkingScripts) ÷ [0.3] +÷ 0378 ÷ 0915 ÷ # ÷ [0.2] (Other) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0378 × 0308 ÷ 0915 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] ÷ 0378 ÷ 231A ÷ # ÷ [0.2] (Other) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 0378 × 0308 ÷ 231A ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ÷ 0378 × 0300 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ÷ 0378 × 0308 × 0300 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0378 × 093C ÷ # ÷ [0.2] (Other) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0378 × 0308 × 093C ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) ÷ [0.3] +÷ 0378 × 094D ÷ # ÷ [0.2] (Other) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] +÷ 0378 × 0308 × 094D ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [0.3] ÷ 0378 × 200D ÷ # ÷ [0.2] (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0378 × 0308 × 200D ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0378 ÷ 0378 ÷ # ÷ [0.2] (Other) ÷ [999.0] (Other) ÷ [0.3] @@ -614,7 +1188,7 @@ ÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 × 1F1E9 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER D (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] ÷ 0061 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0061 × 0308 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] -÷ 0061 × 0903 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 × 0903 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark_ConjunctLinkingScripts) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] ÷ 0061 ÷ 0600 × 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) × [9.2] LATIN SMALL LETTER B (Other) ÷ [0.3] ÷ 1F476 × 1F3FF ÷ 1F476 ÷ # ÷ [0.2] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) ÷ [0.3] ÷ 0061 × 1F3FF ÷ 1F476 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) ÷ [0.3] @@ -624,7 +1198,18 @@ ÷ 0061 × 200D ÷ 1F6D1 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] ÷ 2701 × 200D × 2701 ÷ # ÷ [0.2] UPPER BLADE SCISSORS (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] UPPER BLADE SCISSORS (Other) ÷ [0.3] ÷ 0061 × 200D ÷ 2701 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] UPPER BLADE SCISSORS (Other) ÷ [0.3] +÷ 0915 ÷ 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) ÷ [999.0] DEVANAGARI LETTER TA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0915 × 094D × 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0915 × 094D × 094D × 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0915 × 094D × 200D × 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0915 × 093C × 200D × 094D × 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0915 × 093C × 094D × 200D × 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN NUKTA (Extend_ConjunctLinkingScripts_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0915 × 094D × 0924 × 094D × 092F ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.3] DEVANAGARI LETTER YA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0915 × 094D ÷ 0061 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] LATIN SMALL LETTER A (Other) ÷ [0.3] +÷ 0061 × 094D ÷ 0924 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER TA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 003F × 094D ÷ 0924 ÷ # ÷ [0.2] QUESTION MARK (Other) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) ÷ [999.0] DEVANAGARI LETTER TA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] +÷ 0915 × 094D × 094D × 0924 ÷ # ÷ [0.2] DEVANAGARI LETTER KA (ConjunctLinkingScripts_LinkingConsonant) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.0] DEVANAGARI SIGN VIRAMA (Extend_ConjunctLinkingScripts_ConjunctLinker_ExtCccZwj) × [9.3] DEVANAGARI LETTER TA (ConjunctLinkingScripts_LinkingConsonant) ÷ [0.3] # -# Lines: 602 +# Lines: 1187 # # EOF diff --git a/yass/third_party/libc++/trunk/utils/data/unicode/emoji-data.txt b/yass/third_party/libc++/trunk/utils/data/unicode/emoji-data.txt index 7942fc89a3..0ba10e9ce4 100644 --- a/yass/third_party/libc++/trunk/utils/data/unicode/emoji-data.txt +++ b/yass/third_party/libc++/trunk/utils/data/unicode/emoji-data.txt @@ -1,16 +1,16 @@ # emoji-data.txt -# Date: 2022-08-02, 00:26:10 GMT -# © 2022 Unicode®, Inc. +# Date: 2023-02-01, 02:22:54 GMT +# © 2023 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see https://www.unicode.org/terms_of_use.html # # Emoji Data for UTS #51 -# Used with Emoji Version 15.0 and subsequent minor revisions (if any) +# Used with Emoji Version 15.1 and subsequent minor revisions (if any) # # For documentation and usage, see https://www.unicode.org/reports/tr51 # -# Format: -# ; # +# Format: +# ; # # Note: there is no guarantee as to the structure of whitespace or comments # # Characters and sequences are listed in code point order. Users should be shown a more natural order. diff --git a/yass/third_party/libc++/trunk/utils/generate_extended_grapheme_cluster_table.py b/yass/third_party/libc++/trunk/utils/generate_extended_grapheme_cluster_table.py index 6a598399ce..76d1e78e92 100755 --- a/yass/third_party/libc++/trunk/utils/generate_extended_grapheme_cluster_table.py +++ b/yass/third_party/libc++/trunk/utils/generate_extended_grapheme_cluster_table.py @@ -289,25 +289,16 @@ def generate_cpp_data(prop_name: str, ranges: list[PropertyRange]) -> str: def generate_data_tables() -> str: """ Generate Unicode data for inclusion into from - GraphemeBreakProperty.txt and emoji-data.txt. + - https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt + - https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt + - https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt - GraphemeBreakProperty.txt can be found at - https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt - - emoji-data.txt can be found at - https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt - - Both files are expected to be in the same directory as this script. + These files are expected to be stored in the same directory as this script. """ - gbp_data_path = ( - Path(__file__).absolute().parent - / "data" - / "unicode" - / "GraphemeBreakProperty.txt" - ) - emoji_data_path = ( - Path(__file__).absolute().parent / "data" / "unicode" / "emoji-data.txt" - ) + root = Path(__file__).absolute().parent / "data" / "unicode" + gbp_data_path = root / "GraphemeBreakProperty.txt" + emoji_data_path = root / "emoji-data.txt" + gbp_ranges = list() emoji_ranges = list() with gbp_data_path.open(encoding="utf-8") as f: diff --git a/yass/third_party/libc++/trunk/utils/generate_feature_test_macro_components.py b/yass/third_party/libc++/trunk/utils/generate_feature_test_macro_components.py index c55f5c7d19..f2b8d55c0e 100755 --- a/yass/third_party/libc++/trunk/utils/generate_feature_test_macro_components.py +++ b/yass/third_party/libc++/trunk/utils/generate_feature_test_macro_components.py @@ -170,6 +170,12 @@ feature_test_macros = [ "values": {"c++20": 201907}, "headers": ["atomic"], }, + { + "name": "__cpp_lib_atomic_min_max", + "values": {"c++26": 202403}, # P0493R5: Atomic minimum/maximum + "headers": ["atomic"], + "unimplemented": True, + }, { "name": "__cpp_lib_atomic_ref", "values": {"c++20": 201806}, @@ -205,10 +211,9 @@ feature_test_macros = [ "name": "__cpp_lib_bind_back", "values": { "c++23": 202202, - "c++26": 202306, # P2714R1 Bind front and back to NTTP callables + # "c++26": 202306, # P2714R1 Bind front and back to NTTP callables }, "headers": ["functional"], - "unimplemented": True, }, { "name": "__cpp_lib_bind_front", @@ -386,6 +391,12 @@ feature_test_macros = [ "values": {"c++20": 201907}, "headers": ["vector"], }, + { + "name": "__cpp_lib_constrained_equality", + "values": {"c++26": 202403}, # P2944R3: Comparisons for reference_wrapper + "headers": ["optional", "tuple", "utility", "variant"], + "unimplemented": True, + }, { "name": "__cpp_lib_copyable_function", "values": {"c++26": 202306}, # P2548R6 copyable_function @@ -399,10 +410,19 @@ feature_test_macros = [ }, { "name": "__cpp_lib_debugging", - "values": {"c++26": 202311}, # P2546R5 Debugging Support + "values": { + "c++26": 202311, # P2546R5 Debugging Support + # "c++26": 202403, # P2810R4: is_debugger_present is_replaceable + }, "headers": ["debugging"], "unimplemented": True, }, + { + "name": "__cpp_lib_default_template_type_for_algorithm_values", + "values": {"c++26": 202403}, # P2248R8: Enabling list-initialization for algorithms + "headers": ["algorithm", "deque", "forward_list", "list", "ranges", "string", "vector"], + "unimplemented": True, + }, { "name": "__cpp_lib_destroying_delete", "values": {"c++20": 201806}, @@ -476,6 +496,12 @@ feature_test_macros = [ "headers": ["format"], "unimplemented": True, }, + { + "name": "__cpp_lib_format_path", + "values": {"c++23": 202403}, # P2845R8: Formatting of std::filesystem::path + "headers": ["filesystem"], + "unimplemented": True, + }, { "name": "__cpp_lib_format_ranges", "values": {"c++23": 202207}, @@ -586,6 +612,12 @@ feature_test_macros = [ "values": {"c++17": 201606}, "headers": ["numeric"], }, + { + "name": "__cpp_lib_generate_random", + "values": {"c++26": 202403}, # P1068R11: Vector API for random number generation + "headers": ["random"], + "unimplemented": True, + }, { "name": "__cpp_lib_generic_associative_lookup", "values": {"c++14": 201304}, @@ -874,7 +906,10 @@ feature_test_macros = [ }, { "name": "__cpp_lib_print", - "values": {"c++23": 202207}, + "values": { + "c++23": 202207, + # "c++26": 202403, # P3107R5: Permit an efficient implementation of std::print + }, "headers": ["ostream", "print"], }, { @@ -914,6 +949,12 @@ feature_test_macros = [ "values": {"c++23": 202202}, "headers": ["ranges"], }, + { + "name": "__cpp_lib_ranges_concat", + "values": {"c++26": 202403}, # P2542R8: views::concat + "headers": ["ranges"], + "unimplemented": True, + }, { "name": "__cpp_lib_ranges_contains", "values": {"c++23": 202207}, @@ -995,6 +1036,12 @@ feature_test_macros = [ "headers": ["type_traits"], "unimplemented": True, }, + { + "name": "__cpp_lib_reference_wrapper", + "values": {"c++26": 202403}, # P2944R3: Comparisons for reference_wrapper + "headers": ["functional"], + "unimplemented": True, + }, { "name": "__cpp_lib_remove_cvref", "values": {"c++20": 201711}, @@ -1152,12 +1199,19 @@ feature_test_macros = [ }, { "name": "__cpp_lib_string_view", - "values": {"c++17": 201606, "c++20": 201803}, + "values": { + "c++17": 201606, + "c++20": 201803, + # "c++26": 202403, # P2591R5: Concatenation of strings and string views + }, "headers": ["string", "string_view"], }, { "name": "__cpp_lib_submdspan", - "values": {"c++26": 202306}, # P2630R4 submdspan + "values": { + "c++26": 202306, # P2630R4: submdspan + # "c++26": 202403, # P2642R6: Padded mdspan layouts + }, "headers": ["mdspan"], "unimplemented": True, }, @@ -1297,25 +1351,11 @@ feature_test_macros = [ ] assert feature_test_macros == sorted(feature_test_macros, key=lambda tc: tc["name"]) -assert all(tc["headers"] == sorted(tc["headers"]) for tc in feature_test_macros) -assert all( - ("libcxx_guard" in tc) == ("test_suite_guard" in tc) for tc in feature_test_macros -) -assert all( - all( - key - in [ - "name", - "values", - "headers", - "libcxx_guard", - "test_suite_guard", - "unimplemented", - ] - for key in tc.keys() - ) - for tc in feature_test_macros -) +for tc in feature_test_macros: + assert tc["headers"] == sorted(tc["headers"]), tc + assert ("libcxx_guard" in tc) == ("test_suite_guard" in tc), tc + valid_keys = ["name", "values", "headers", "libcxx_guard", "test_suite_guard", "unimplemented"] + assert all(key in valid_keys for key in tc.keys()), tc # Map from each header to the Lit annotations that should be used for # tests that include that header. diff --git a/yass/third_party/libc++/trunk/utils/generate_indic_conjunct_break_table.py b/yass/third_party/libc++/trunk/utils/generate_indic_conjunct_break_table.py new file mode 100755 index 0000000000..762dfa73b5 --- /dev/null +++ b/yass/third_party/libc++/trunk/utils/generate_indic_conjunct_break_table.py @@ -0,0 +1,309 @@ +#!/usr/bin/env python +# ===----------------------------------------------------------------------===## +# +# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +# See https://llvm.org/LICENSE.txt for license information. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +# +# ===----------------------------------------------------------------------===## + +# The code is based on +# https://github.com/microsoft/STL/blob/main/tools/unicode_properties_parse/grapheme_break_property_data_gen.py +# +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +from io import StringIO +from pathlib import Path +from dataclasses import dataclass +from typing import Optional +import re +import sys + + +@dataclass +class PropertyRange: + lower: int = -1 + upper: int = -1 + prop: str = None + + +@dataclass +class Entry: + lower: int = -1 + offset: int = -1 + prop: int = -1 + + +LINE_REGEX = re.compile( + r"^(?P[0-9A-F]{4,5})(?:\.\.(?P[0-9A-F]{4,5}))?\s*;\s*InCB;\s*(?P\w+)" +) + +def parsePropertyLine(inputLine: str) -> Optional[PropertyRange]: + result = PropertyRange() + if m := LINE_REGEX.match(inputLine): + lower_str, upper_str, result.prop = m.group("lower", "upper", "prop") + result.lower = int(lower_str, base=16) + result.upper = result.lower + if upper_str is not None: + result.upper = int(upper_str, base=16) + return result + + else: + return None + + + +def compactPropertyRanges(input: list[PropertyRange]) -> list[PropertyRange]: + """ + Merges consecutive ranges with the same property to one range. + + Merging the ranges results in fewer ranges in the output table, + reducing binary and improving lookup performance. + """ + result = list() + for x in input: + if ( + len(result) + and result[-1].prop == x.prop + and result[-1].upper + 1 == x.lower + ): + result[-1].upper = x.upper + continue + result.append(x) + return result + + +PROP_VALUE_ENUMERATOR_TEMPLATE = " __{}" +PROP_VALUE_ENUM_TEMPLATE = """ +enum class __property : uint8_t {{ + // Values generated from the data files. +{enumerators}, + + // The code unit has none of above properties. + __none +}}; +""" + +DATA_ARRAY_TEMPLATE = """ +/// The entries of the indic conjunct break property table. +/// +/// The data is generated from +/// - https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt +/// +/// The data has 3 values +/// - bits [0, 1] The property. One of the values generated from the datafiles +/// of \\ref __property +/// - bits [2, 10] The size of the range. +/// - bits [11, 31] The lower bound code point of the range. The upper bound of +/// the range is lower bound + size. +/// +/// The 9 bits for the size allow a maximum range of 512 elements. Some ranges +/// in the Unicode tables are larger. They are stored in multiple consecutive +/// ranges in the data table. An alternative would be to store the sizes in a +/// separate 16-bit value. The original MSVC STL code had such an approach, but +/// this approach uses less space for the data and is about 4% faster in the +/// following benchmark. +/// libcxx/benchmarks/std_format_spec_string_unicode.bench.cpp +// clang-format off +_LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[{size}] = {{ +{entries}}}; +// clang-format on + +/// Returns the indic conjuct break property of a code point. +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr __property __get_property(const char32_t __code_point) noexcept {{ + // The algorithm searches for the upper bound of the range and, when found, + // steps back one entry. This algorithm is used since the code point can be + // anywhere in the range. After a lower bound is found the next step is to + // compare whether the code unit is indeed in the range. + // + // Since the entry contains a code unit, size, and property the code point + // being sought needs to be adjusted. Just shifting the code point to the + // proper position doesn't work; suppose an entry has property 0, size 1, + // and lower bound 3. This results in the entry 0x1810. + // When searching for code point 3 it will search for 0x1800, find 0x1810 + // and moves to the previous entry. Thus the lower bound value will never + // be found. + // The simple solution is to set the bits belonging to the property and + // size. Then the upper bound for code point 3 will return the entry after + // 0x1810. After moving to the previous entry the algorithm arrives at the + // correct entry. + ptrdiff_t __i = std::ranges::upper_bound(__entries, (__code_point << 11) | 0x7ffu) - __entries; + if (__i == 0) + return __property::__none; + + --__i; + uint32_t __upper_bound = (__entries[__i] >> 11) + ((__entries[__i] >> 2) & 0b1'1111'1111); + if (__code_point <= __upper_bound) + return static_cast<__property>(__entries[__i] & 0b11); + + return __property::__none; +}} +""" + +MSVC_FORMAT_UCD_TABLES_HPP_TEMPLATE = """ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// WARNING, this entire header is generated by +// utils/generate_indic_conjunct_break_table.py +// DO NOT MODIFY! + +// UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE +// +// See Terms of Use +// for definitions of Unicode Inc.'s Data Files and Software. +// +// NOTICE TO USER: Carefully read the following legal agreement. +// BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S +// DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), +// YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +// TERMS AND CONDITIONS OF THIS AGREEMENT. +// IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE +// THE DATA FILES OR SOFTWARE. +// +// COPYRIGHT AND PERMISSION NOTICE +// +// Copyright (c) 1991-2022 Unicode, Inc. All rights reserved. +// Distributed under the Terms of Use in https://www.unicode.org/copyright.html. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Unicode data files and any associated documentation +// (the "Data Files") or Unicode software and any associated documentation +// (the "Software") to deal in the Data Files or Software +// without restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, and/or sell copies of +// the Data Files or Software, and to permit persons to whom the Data Files +// or Software are furnished to do so, provided that either +// (a) this copyright and permission notice appear with all copies +// of the Data Files or Software, or +// (b) this copyright and permission notice appear in associated +// Documentation. +// +// THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT OF THIRD PARTY RIGHTS. +// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +// NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +// DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THE DATA FILES OR SOFTWARE. +// +// Except as contained in this notice, the name of a copyright holder +// shall not be used in advertising or otherwise to promote the sale, +// use or other dealings in these Data Files or Software without prior +// written authorization of the copyright holder. + +#ifndef _LIBCPP___FORMAT_INDIC_CONJUNCT_BREAK_TABLE_H +#define _LIBCPP___FORMAT_INDIC_CONJUNCT_BREAK_TABLE_H + +#include <__algorithm/ranges_upper_bound.h> +#include <__config> +#include <__iterator/access.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER >= 20 + +namespace __indic_conjunct_break {{ +{content} +}} // namespace __indic_conjunct_break + +#endif //_LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_INDIC_CONJUNCT_BREAK_TABLE_H""" + + +def property_ranges_to_table( + ranges: list[PropertyRange], props: list[str] +) -> list[Entry]: + assert len(props) < 4 + result = list[Entry]() + high = -1 + for range in sorted(ranges, key=lambda x: x.lower): + # Validate overlapping ranges + assert range.lower > high + high = range.upper + + while True: + e = Entry(range.lower, range.upper - range.lower, props.index(range.prop)) + if e.offset <= 511: + result.append(e) + break + e.offset = 511 + result.append(e) + range.lower += 512 + return result + + +cpp_entrytemplate = " 0x{:08x}" + + +def generate_cpp_data(prop_name: str, ranges: list[PropertyRange]) -> str: + result = StringIO() + prop_values = sorted(set(x.prop for x in ranges)) + table = property_ranges_to_table(ranges, prop_values) + enumerator_values = [PROP_VALUE_ENUMERATOR_TEMPLATE.format(x) for x in prop_values] + result.write( + PROP_VALUE_ENUM_TEMPLATE.format(enumerators=",\n".join(enumerator_values)) + ) + result.write( + DATA_ARRAY_TEMPLATE.format( + prop_name=prop_name, + size=len(table), + entries=",\n".join( + [ + cpp_entrytemplate.format(x.lower << 11 | x.offset << 2 | x.prop) + for x in table + ] + ), + ) + ) + + return result.getvalue() + + +def generate_data_tables() -> str: + """ + Generate Unicode data for inclusion into from + - https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt + + These files are expected to be stored in the same directory as this script. + """ + root = Path(__file__).absolute().parent / "data" / "unicode" + derived_core_path = root / "DerivedCoreProperties.txt" + + indic_conjunct_break = list() + with derived_core_path.open(encoding="utf-8") as f: + indic_conjunct_break_ranges = compactPropertyRanges( + [x for line in f if (x := parsePropertyLine(line))] + ) + + indic_conjunct_break_data = generate_cpp_data("Grapheme_Break", indic_conjunct_break_ranges) + return "\n".join([indic_conjunct_break_data]) + + +if __name__ == "__main__": + if len(sys.argv) == 2: + sys.stdout = open(sys.argv[1], "w") + print( + MSVC_FORMAT_UCD_TABLES_HPP_TEMPLATE.lstrip().format( + content=generate_data_tables() + ) + ) diff --git a/yass/third_party/libc++/trunk/utils/generate_iwyu_mapping.py b/yass/third_party/libc++/trunk/utils/generate_iwyu_mapping.py index 8ab7b86299..2265438ab4 100644 --- a/yass/third_party/libc++/trunk/utils/generate_iwyu_mapping.py +++ b/yass/third_party/libc++/trunk/utils/generate_iwyu_mapping.py @@ -11,6 +11,7 @@ def IWYU_mapping(header: str) -> typing.Optional[typing.List[str]]: "__debug_utils/.+", "__fwd/get[.]h", "__support/.+", + "__utility/private_constructor_tag.h", ] if any(re.match(pattern, header) for pattern in ignore): return None diff --git a/yass/third_party/libc++/trunk/utils/libcxx/test/features.py b/yass/third_party/libc++/trunk/utils/libcxx/test/features.py index 0793c34fd7..6ff1630954 100644 --- a/yass/third_party/libc++/trunk/utils/libcxx/test/features.py +++ b/yass/third_party/libc++/trunk/utils/libcxx/test/features.py @@ -286,6 +286,12 @@ DEFAULT_FEATURES = [ # Avoid building on platforms that don't support modules properly. or not hasCompileFlag(cfg, "-Wno-reserved-module-identifier"), ), + # The time zone validation tests compare the output of zdump against the + # output generated by 's time zone support. + Feature( + name="has-no-zdump", + when=lambda cfg: runScriptExitCode(cfg, ["zdump --version"]) != 0, + ), ] # Deduce and add the test features that that are implied by the #defines in diff --git a/yass/third_party/libc++abi/trunk/CMakeLists.txt b/yass/third_party/libc++abi/trunk/CMakeLists.txt index da998d2221..52ba52f343 100644 --- a/yass/third_party/libc++abi/trunk/CMakeLists.txt +++ b/yass/third_party/libc++abi/trunk/CMakeLists.txt @@ -5,6 +5,7 @@ #=============================================================================== cmake_minimum_required(VERSION 3.20.0) +set(LLVM_SUBPROJECT_TITLE "libc++abi") set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake") @@ -182,14 +183,15 @@ set(LIBCXXABI_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE STRING "Path where built libc++abi runtime libraries should be installed.") if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) - set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR}) - set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) - set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE STRING - "Path where built libc++abi libraries should be installed.") - if(LIBCXX_LIBDIR_SUBDIR) - string(APPEND LIBCXXABI_LIBRARY_DIR /${LIBCXXABI_LIBDIR_SUBDIR}) - string(APPEND LIBCXXABI_INSTALL_LIBRARY_DIR /${LIBCXXABI_LIBDIR_SUBDIR}) + set(LIBCXXABI_TARGET_SUBDIR ${LLVM_DEFAULT_TARGET_TRIPLE}) + if(LIBCXXABI_LIBDIR_SUBDIR) + string(APPEND LIBCXXABI_TARGET_SUBDIR /${LIBCXXABI_LIBDIR_SUBDIR}) endif() + set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR}) + set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LIBCXXABI_TARGET_SUBDIR}) + set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LIBCXXABI_TARGET_SUBDIR} CACHE STRING + "Path where built libc++abi libraries should be installed.") + unset(LIBCXXABI_TARGET_SUBDIR) else() if(LLVM_LIBRARY_OUTPUT_INTDIR) set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR}) @@ -442,6 +444,9 @@ if (NOT "${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}" STREQUAL "") include_directories("${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}") endif() +add_custom_target(cxxabi-test-depends + COMMENT "Build dependencies required to run the libc++abi test suite.") + # Add source code. This also contains all of the logic for deciding linker flags # soname, etc... add_subdirectory(include) diff --git a/yass/third_party/libc++abi/trunk/include/cxxabi.h b/yass/third_party/libc++abi/trunk/include/cxxabi.h index d070118175..0e3969084e 100644 --- a/yass/third_party/libc++abi/trunk/include/cxxabi.h +++ b/yass/third_party/libc++abi/trunk/include/cxxabi.h @@ -48,13 +48,17 @@ extern _LIBCXXABI_FUNC_VIS void __cxa_free_exception(void *thrown_exception) throw(); // This function is an LLVM extension, which mirrors the same extension in libsupc++ and libcxxrt extern _LIBCXXABI_FUNC_VIS __cxa_exception* +#ifdef __wasm__ +// In Wasm, a destructor returns its argument +__cxa_init_primary_exception(void* object, std::type_info* tinfo, void*(_LIBCXXABI_DTOR_FUNC* dest)(void*)) throw(); +#else __cxa_init_primary_exception(void* object, std::type_info* tinfo, void(_LIBCXXABI_DTOR_FUNC* dest)(void*)) throw(); +#endif // 2.4.3 Throwing the Exception Object extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_throw(void *thrown_exception, std::type_info *tinfo, -#ifdef __USING_WASM_EXCEPTIONS__ - // In Wasm, a destructor returns its argument +#ifdef __wasm__ void *(_LIBCXXABI_DTOR_FUNC *dest)(void *)); #else void (_LIBCXXABI_DTOR_FUNC *dest)(void *)); diff --git a/yass/third_party/libc++abi/trunk/src/CMakeLists.txt b/yass/third_party/libc++abi/trunk/src/CMakeLists.txt index c8cc93de50..c54ced4dc3 100644 --- a/yass/third_party/libc++abi/trunk/src/CMakeLists.txt +++ b/yass/third_party/libc++abi/trunk/src/CMakeLists.txt @@ -304,6 +304,7 @@ endif() # Add a meta-target for both libraries. add_custom_target(cxxabi DEPENDS ${LIBCXXABI_BUILD_TARGETS}) +add_dependencies(cxxabi-test-depends cxxabi cxx) if (LIBCXXABI_INSTALL_LIBRARY) install(TARGETS ${LIBCXXABI_INSTALL_TARGETS} diff --git a/yass/third_party/libc++abi/trunk/src/cxa_exception.cpp b/yass/third_party/libc++abi/trunk/src/cxa_exception.cpp index 65e9f4504d..ff69a4c65e 100644 --- a/yass/third_party/libc++abi/trunk/src/cxa_exception.cpp +++ b/yass/third_party/libc++abi/trunk/src/cxa_exception.cpp @@ -207,7 +207,12 @@ void __cxa_free_exception(void *thrown_object) throw() { } __cxa_exception* __cxa_init_primary_exception(void* object, std::type_info* tinfo, +#ifdef __wasm__ +// In Wasm, a destructor returns its argument + void *(_LIBCXXABI_DTOR_FUNC* dest)(void*)) throw() { +#else void(_LIBCXXABI_DTOR_FUNC* dest)(void*)) throw() { +#endif __cxa_exception* exception_header = cxa_exception_from_thrown_object(object); exception_header->referenceCount = 0; exception_header->unexpectedHandler = std::get_unexpected(); @@ -267,7 +272,7 @@ will call terminate, assuming that there was no handler for the exception. */ void -#ifdef __USING_WASM_EXCEPTIONS__ +#ifdef __wasm__ // In Wasm, a destructor returns its argument __cxa_throw(void *thrown_object, std::type_info *tinfo, void *(_LIBCXXABI_DTOR_FUNC *dest)(void *)) { #else diff --git a/yass/third_party/libc++abi/trunk/src/cxa_exception.h b/yass/third_party/libc++abi/trunk/src/cxa_exception.h index 10712f6f47..aba08f2992 100644 --- a/yass/third_party/libc++abi/trunk/src/cxa_exception.h +++ b/yass/third_party/libc++abi/trunk/src/cxa_exception.h @@ -43,7 +43,7 @@ struct _LIBCXXABI_HIDDEN __cxa_exception { // Manage the exception object itself. std::type_info *exceptionType; -#ifdef __USING_WASM_EXCEPTIONS__ +#ifdef __wasm__ // In Wasm, a destructor returns its argument void *(_LIBCXXABI_DTOR_FUNC *exceptionDestructor)(void *); #else diff --git a/yass/third_party/libc++abi/trunk/src/cxa_guard_impl.h b/yass/third_party/libc++abi/trunk/src/cxa_guard_impl.h index 7b140d3c36..320501cb85 100644 --- a/yass/third_party/libc++abi/trunk/src/cxa_guard_impl.h +++ b/yass/third_party/libc++abi/trunk/src/cxa_guard_impl.h @@ -47,6 +47,9 @@ #include "__cxxabi_config.h" #include "include/atomic_support.h" // from libc++ #if defined(__has_include) +# if __has_include() +# include +# endif # if __has_include() # include # endif @@ -411,7 +414,18 @@ private: // Futex Implementation //===----------------------------------------------------------------------===// -#if defined(SYS_futex) +#if defined(__OpenBSD__) +void PlatformFutexWait(int* addr, int expect) { + constexpr int WAIT = 0; + futex(reinterpret_cast(addr), WAIT, expect, NULL, NULL); + __tsan_acquire(addr); +} +void PlatformFutexWake(int* addr) { + constexpr int WAKE = 1; + __tsan_release(addr); + futex(reinterpret_cast(addr), WAKE, INT_MAX, NULL, NULL); +} +#elif defined(SYS_futex) void PlatformFutexWait(int* addr, int expect) { constexpr int WAIT = 0; syscall(SYS_futex, addr, WAIT, expect, 0); diff --git a/yass/third_party/libc++abi/trunk/src/cxa_personality.cpp b/yass/third_party/libc++abi/trunk/src/cxa_personality.cpp index d95d781319..843a18a4cb 100644 --- a/yass/third_party/libc++abi/trunk/src/cxa_personality.cpp +++ b/yass/third_party/libc++abi/trunk/src/cxa_personality.cpp @@ -70,7 +70,7 @@ extern "C" EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD, +------------------+--+-----+-----+------------------------+--------------------------+ | callSiteTableLength | (ULEB128) | Call Site Table length, used to find Action table | +---------------------+-----------+---------------------------------------------------+ -#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__USING_WASM_EXCEPTIONS__) +#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__WASM_EXCEPTIONS__) +---------------------+-----------+------------------------------------------------+ | Beginning of Call Site Table The current ip lies within the | | ... (start, length) range of one of these | @@ -84,7 +84,7 @@ extern "C" EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD, | +-------------+---------------------------------+------------------------------+ | | ... | +----------------------------------------------------------------------------------+ -#else // __USING_SJLJ_EXCEPTIONS__ || __USING_WASM_EXCEPTIONS__ +#else // __USING_SJLJ_EXCEPTIONS__ || __WASM_EXCEPTIONS__ +---------------------+-----------+------------------------------------------------+ | Beginning of Call Site Table The current ip is a 1-based index into | | ... this table. Or it is -1 meaning no | @@ -97,7 +97,7 @@ extern "C" EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD, | +-------------+---------------------------------+------------------------------+ | | ... | +----------------------------------------------------------------------------------+ -#endif // __USING_SJLJ_EXCEPTIONS__ || __USING_WASM_EXCEPTIONS__ +#endif // __USING_SJLJ_EXCEPTIONS__ || __WASM_EXCEPTIONS__ +---------------------------------------------------------------------+ | Beginning of Action Table ttypeIndex == 0 : cleanup | | ... ttypeIndex > 0 : catch | @@ -547,7 +547,7 @@ void set_registers(_Unwind_Exception* unwind_exception, _Unwind_Context* context, const scan_results& results) { -#if defined(__USING_SJLJ_EXCEPTIONS__) || defined(__USING_WASM_EXCEPTIONS__) +#if defined(__USING_SJLJ_EXCEPTIONS__) || defined(__WASM_EXCEPTIONS__) #define __builtin_eh_return_data_regno(regno) regno #elif defined(__ibmxl__) // IBM xlclang++ compiler does not support __builtin_eh_return_data_regno. @@ -642,7 +642,7 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions, // Get beginning current frame's code (as defined by the // emitted dwarf code) uintptr_t funcStart = _Unwind_GetRegionStart(context); -#if defined(__USING_SJLJ_EXCEPTIONS__) || defined(__USING_WASM_EXCEPTIONS__) +#if defined(__USING_SJLJ_EXCEPTIONS__) || defined(__WASM_EXCEPTIONS__) if (ip == uintptr_t(-1)) { // no action @@ -652,9 +652,9 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions, else if (ip == 0) call_terminate(native_exception, unwind_exception); // ip is 1-based index into call site table -#else // !__USING_SJLJ_EXCEPTIONS__ && !__USING_WASM_EXCEPTIONS__ +#else // !__USING_SJLJ_EXCEPTIONS__ && !__WASM_EXCEPTIONS__ uintptr_t ipOffset = ip - funcStart; -#endif // !__USING_SJLJ_EXCEPTIONS__ && !__USING_WASM_EXCEPTIONS__ +#endif // !__USING_SJLJ_EXCEPTIONS__ && !__WASM_EXCEPTIONS__ const uint8_t* classInfo = NULL; // Note: See JITDwarfEmitter::EmitExceptionTable(...) for corresponding // dwarf emission @@ -675,7 +675,7 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions, // Walk call-site table looking for range that // includes current PC. uint8_t callSiteEncoding = *lsda++; -#if defined(__USING_SJLJ_EXCEPTIONS__) || defined(__USING_WASM_EXCEPTIONS__) +#if defined(__USING_SJLJ_EXCEPTIONS__) || defined(__WASM_EXCEPTIONS__) (void)callSiteEncoding; // When using SjLj/Wasm exceptions, callSiteEncoding is never used #endif uint32_t callSiteTableLength = static_cast(readULEB128(&lsda)); @@ -686,7 +686,7 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions, while (callSitePtr < callSiteTableEnd) { // There is one entry per call site. -#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__USING_WASM_EXCEPTIONS__) +#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__WASM_EXCEPTIONS__) // The call sites are non-overlapping in [start, start+length) // The call sites are ordered in increasing value of start uintptr_t start = readEncodedPointer(&callSitePtr, callSiteEncoding); @@ -694,15 +694,15 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions, uintptr_t landingPad = readEncodedPointer(&callSitePtr, callSiteEncoding); uintptr_t actionEntry = readULEB128(&callSitePtr); if ((start <= ipOffset) && (ipOffset < (start + length))) -#else // __USING_SJLJ_EXCEPTIONS__ || __USING_WASM_EXCEPTIONS__ +#else // __USING_SJLJ_EXCEPTIONS__ || __WASM_EXCEPTIONS__ // ip is 1-based index into this table uintptr_t landingPad = readULEB128(&callSitePtr); uintptr_t actionEntry = readULEB128(&callSitePtr); if (--ip == 0) -#endif // __USING_SJLJ_EXCEPTIONS__ || __USING_WASM_EXCEPTIONS__ +#endif // __USING_SJLJ_EXCEPTIONS__ || __WASM_EXCEPTIONS__ { // Found the call site containing ip. -#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__USING_WASM_EXCEPTIONS__) +#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__WASM_EXCEPTIONS__) if (landingPad == 0) { // No handler here @@ -710,9 +710,9 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions, return; } landingPad = (uintptr_t)lpStart + landingPad; -#else // __USING_SJLJ_EXCEPTIONS__ || __USING_WASM_EXCEPTIONS__ +#else // __USING_SJLJ_EXCEPTIONS__ || __WASM_EXCEPTIONS__ ++landingPad; -#endif // __USING_SJLJ_EXCEPTIONS__ || __USING_WASM_EXCEPTIONS__ +#endif // __USING_SJLJ_EXCEPTIONS__ || __WASM_EXCEPTIONS__ results.landingPad = landingPad; if (actionEntry == 0) { @@ -838,7 +838,7 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions, action += actionOffset; } // there is no break out of this loop, only return } -#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__USING_WASM_EXCEPTIONS__) +#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__WASM_EXCEPTIONS__) else if (ipOffset < start) { // There is no call site for this ip @@ -846,7 +846,7 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions, // Possible stack corruption. call_terminate(native_exception, unwind_exception); } -#endif // !__USING_SJLJ_EXCEPTIONS__ && !__USING_WASM_EXCEPTIONS__ +#endif // !__USING_SJLJ_EXCEPTIONS__ && !__WASM_EXCEPTIONS__ } // there might be some tricky cases which break out of this loop // It is possible that no eh table entry specify how to handle @@ -903,7 +903,7 @@ _UA_CLEANUP_PHASE */ #if !defined(_LIBCXXABI_ARM_EHABI) -#ifdef __USING_WASM_EXCEPTIONS__ +#ifdef __WASM_EXCEPTIONS__ _Unwind_Reason_Code __gxx_personality_wasm0 #elif defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__) static _Unwind_Reason_Code __gxx_personality_imp @@ -972,7 +972,7 @@ __gxx_personality_v0 exc->languageSpecificData = results.languageSpecificData; exc->catchTemp = reinterpret_cast(results.landingPad); exc->adjustedPtr = results.adjustedPtr; -#ifdef __USING_WASM_EXCEPTIONS__ +#ifdef __WASM_EXCEPTIONS__ // Wasm only uses a single phase (_UA_SEARCH_PHASE), so save the // results here. set_registers(unwind_exception, context, results); diff --git a/yass/third_party/libc++abi/trunk/test/CMakeLists.txt b/yass/third_party/libc++abi/trunk/test/CMakeLists.txt index 586927189c..8e3048f2ff 100644 --- a/yass/third_party/libc++abi/trunk/test/CMakeLists.txt +++ b/yass/third_party/libc++abi/trunk/test/CMakeLists.txt @@ -10,20 +10,11 @@ endmacro() pythonize_bool(LIBCXXABI_USE_LLVM_UNWINDER) -if (LIBCXXABI_ENABLE_SHARED) - set(LIBCXXABI_TEST_DEPS cxxabi_shared) -else() - set(LIBCXXABI_TEST_DEPS cxxabi_static) -endif() - -list(APPEND LIBCXXABI_TEST_DEPS cxx) -if (LIBCXXABI_USE_LLVM_UNWINDER AND TARGET unwind) - list(APPEND LIBCXXABI_TEST_DEPS unwind) -endif() - set(AUTO_GEN_COMMENT "## Autogenerated by libcxxabi configuration.\n# Do not edit!") set(SERIALIZED_LIT_PARAMS "# Lit parameters serialized here for llvm-lit to pick them up\n") +serialize_lit_string_param(SERIALIZED_LIT_PARAMS compiler "${CMAKE_CXX_COMPILER}") + if (NOT LIBCXXABI_ENABLE_EXCEPTIONS) serialize_lit_param(SERIALIZED_LIT_PARAMS enable_exceptions False) endif() @@ -57,4 +48,4 @@ configure_lit_site_cfg( add_lit_testsuite(check-cxxabi "Running libcxxabi tests" ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS ${LIBCXXABI_TEST_DEPS}) + DEPENDS cxxabi-test-depends) diff --git a/yass/third_party/libc++abi/trunk/test/catch_member_function_pointer_02.pass.cpp b/yass/third_party/libc++abi/trunk/test/catch_member_function_pointer_02.pass.cpp index c4a07c1297..b4b8ce8234 100644 --- a/yass/third_party/libc++abi/trunk/test/catch_member_function_pointer_02.pass.cpp +++ b/yass/third_party/libc++abi/trunk/test/catch_member_function_pointer_02.pass.cpp @@ -15,7 +15,7 @@ // GCC supports noexcept function types but this test still fails. // This is likely a bug in their implementation. Investigation needed. -// XFAIL: gcc-13 +// XFAIL: gcc-13, gcc-14 #include diff --git a/yass/third_party/libc++abi/trunk/test/configs/cmake-bridge.cfg.in b/yass/third_party/libc++abi/trunk/test/configs/cmake-bridge.cfg.in index 1d0f51d374..3fefc6a7fd 100644 --- a/yass/third_party/libc++abi/trunk/test/configs/cmake-bridge.cfg.in +++ b/yass/third_party/libc++abi/trunk/test/configs/cmake-bridge.cfg.in @@ -26,7 +26,6 @@ config.test_exec_root = os.path.join('@CMAKE_BINARY_DIR@', 'test') # TODO: This is a non-standard Lit attribute and we should have another way of accessing this. config.host_triple = '@LLVM_HOST_TRIPLE@' -config.substitutions.append(('%{cxx}', '@CMAKE_CXX_COMPILER@')) config.substitutions.append(('%{libcxx}', '@LIBCXXABI_LIBCXX_PATH@')) config.substitutions.append(('%{include}', '@LIBCXXABI_SOURCE_DIR@/include')) config.substitutions.append(('%{cxx-include}', '@LIBCXXABI_HEADER_DIR@/include/c++/v1')) diff --git a/yass/third_party/libunwind/trunk/CMakeLists.txt b/yass/third_party/libunwind/trunk/CMakeLists.txt index 806d5a783e..b22ade0a7d 100644 --- a/yass/third_party/libunwind/trunk/CMakeLists.txt +++ b/yass/third_party/libunwind/trunk/CMakeLists.txt @@ -3,6 +3,7 @@ #=============================================================================== cmake_minimum_required(VERSION 3.20.0) +set(LLVM_SUBPROJECT_TITLE "libunwind") set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake") @@ -129,13 +130,14 @@ set(LIBUNWIND_SHARED_OUTPUT_NAME "unwind" CACHE STRING "Output name for the shar set(LIBUNWIND_STATIC_OUTPUT_NAME "unwind" CACHE STRING "Output name for the static libunwind runtime library.") if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) - set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) - set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE STRING - "Path where built libunwind libraries should be installed.") - if(LIBCXX_LIBDIR_SUBDIR) - string(APPEND LIBUNWIND_LIBRARY_DIR /${LIBUNWIND_LIBDIR_SUBDIR}) - string(APPEND LIBUNWIND_INSTALL_LIBRARY_DIR /${LIBUNWIND_LIBDIR_SUBDIR}) + set(LIBUNWIND_TARGET_SUBDIR ${LLVM_DEFAULT_TARGET_TRIPLE}) + if(LIBUNWIND_LIBDIR_SUBDIR) + string(APPEND LIBUNWIND_TARGET_SUBDIR /${LIBUNWIND_LIBDIR_SUBDIR}) endif() + set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LIBUNWIND_TARGET_SUBDIR}) + set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LIBUNWIND_TARGET_SUBDIR} CACHE STRING + "Path where built libunwind libraries should be installed.") + unset(LIBUNWIND_TARGET_SUBDIR) else() if(LLVM_LIBRARY_OUTPUT_INTDIR) set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) diff --git a/yass/third_party/libunwind/trunk/include/__libunwind_config.h b/yass/third_party/libunwind/trunk/include/__libunwind_config.h index 8db336b2d7..028b9e3baa 100644 --- a/yass/third_party/libunwind/trunk/include/__libunwind_config.h +++ b/yass/third_party/libunwind/trunk/include/__libunwind_config.h @@ -180,6 +180,10 @@ #endif #define _LIBUNWIND_HIGHEST_DWARF_REGISTER \ _LIBUNWIND_HIGHEST_DWARF_REGISTER_LOONGARCH +#elif defined(__wasm__) +// Unused +#define _LIBUNWIND_CONTEXT_SIZE 0 +#define _LIBUNWIND_CURSOR_SIZE 0 # else # error "Unsupported architecture." # endif diff --git a/yass/third_party/libunwind/trunk/src/Unwind-wasm.c b/yass/third_party/libunwind/trunk/src/Unwind-wasm.c index f7f39d38b5..b18b32c5d1 100644 --- a/yass/third_party/libunwind/trunk/src/Unwind-wasm.c +++ b/yass/third_party/libunwind/trunk/src/Unwind-wasm.c @@ -14,7 +14,7 @@ #include "config.h" -#ifdef __USING_WASM_EXCEPTIONS__ +#ifdef __WASM_EXCEPTIONS__ #include "unwind.h" #include @@ -120,4 +120,4 @@ _Unwind_GetRegionStart(struct _Unwind_Context *context) { return 0; } -#endif // defined(__USING_WASM_EXCEPTIONS__) +#endif // defined(__WASM_EXCEPTIONS__) diff --git a/yass/third_party/libunwind/trunk/src/UnwindCursor.hpp b/yass/third_party/libunwind/trunk/src/UnwindCursor.hpp index 7753936a58..66fe8e2a32 100644 --- a/yass/third_party/libunwind/trunk/src/UnwindCursor.hpp +++ b/yass/third_party/libunwind/trunk/src/UnwindCursor.hpp @@ -2416,7 +2416,7 @@ int UnwindCursor::stepWithTBTable(pint_t pc, tbtable *TBTable, } // Reset LR in the current context. - newRegisters.setLR(NULL); + newRegisters.setLR(static_cast(NULL)); _LIBUNWIND_TRACE_UNWINDING( "Extract info from lastStack=%p, returnAddress=%p", diff --git a/yass/third_party/libunwind/trunk/src/UnwindLevel1.c b/yass/third_party/libunwind/trunk/src/UnwindLevel1.c index 05d0f2cb0a..48e7bc3b9e 100644 --- a/yass/third_party/libunwind/trunk/src/UnwindLevel1.c +++ b/yass/third_party/libunwind/trunk/src/UnwindLevel1.c @@ -31,7 +31,8 @@ #include "libunwind_ext.h" #include "unwind.h" -#if !defined(_LIBUNWIND_ARM_EHABI) && !defined(__USING_SJLJ_EXCEPTIONS__) +#if !defined(_LIBUNWIND_ARM_EHABI) && !defined(__USING_SJLJ_EXCEPTIONS__) && \ + !defined(__wasm__) #ifndef _LIBUNWIND_SUPPORT_SEH_UNWIND diff --git a/yass/third_party/libunwind/trunk/src/UnwindRegistersRestore.S b/yass/third_party/libunwind/trunk/src/UnwindRegistersRestore.S index 42c2488fc7..67d9e05711 100644 --- a/yass/third_party/libunwind/trunk/src/UnwindRegistersRestore.S +++ b/yass/third_party/libunwind/trunk/src/UnwindRegistersRestore.S @@ -20,7 +20,7 @@ .text #endif -#if !defined(__USING_SJLJ_EXCEPTIONS__) +#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__wasm__) #if defined(__i386__) DEFINE_LIBUNWIND_FUNCTION(__libunwind_Registers_x86_jumpto) @@ -1232,7 +1232,7 @@ DEFINE_LIBUNWIND_FUNCTION(_ZN9libunwind19Registers_loongarch6jumptoEv) #endif -#endif /* !defined(__USING_SJLJ_EXCEPTIONS__) */ +#endif /* !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__wasm__) */ NO_EXEC_STACK_DIRECTIVE diff --git a/yass/third_party/libunwind/trunk/src/UnwindRegistersSave.S b/yass/third_party/libunwind/trunk/src/UnwindRegistersSave.S index 19a0e87d68..5bf6055fe4 100644 --- a/yass/third_party/libunwind/trunk/src/UnwindRegistersSave.S +++ b/yass/third_party/libunwind/trunk/src/UnwindRegistersSave.S @@ -20,7 +20,7 @@ .text #endif -#if !defined(__USING_SJLJ_EXCEPTIONS__) +#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__wasm__) #if defined(__i386__) @@ -1177,6 +1177,6 @@ DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext) WEAK_ALIAS(__unw_getcontext, unw_getcontext) -#endif /* !defined(__USING_SJLJ_EXCEPTIONS__) */ +#endif /* !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__wasm__) */ NO_EXEC_STACK_DIRECTIVE diff --git a/yass/third_party/libunwind/trunk/src/libunwind.cpp b/yass/third_party/libunwind/trunk/src/libunwind.cpp index 217dde9098..cf39ec5f7d 100644 --- a/yass/third_party/libunwind/trunk/src/libunwind.cpp +++ b/yass/third_party/libunwind/trunk/src/libunwind.cpp @@ -26,7 +26,7 @@ #include #endif -#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__USING_WASM_EXCEPTIONS__) +#if !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__wasm__) #include "AddressSpace.hpp" #include "UnwindCursor.hpp" @@ -347,8 +347,7 @@ void __unw_remove_dynamic_eh_frame_section(unw_word_t eh_frame_start) { } #endif // defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND) -#endif // !defined(__USING_SJLJ_EXCEPTIONS__) && - // !defined(__USING_WASM_EXCEPTIONS__) +#endif // !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__wasm__) #ifdef __APPLE__ diff --git a/yass/third_party/libunwind/trunk/test/CMakeLists.txt b/yass/third_party/libunwind/trunk/test/CMakeLists.txt index 21dfbb0a84..19f055f6f9 100644 --- a/yass/third_party/libunwind/trunk/test/CMakeLists.txt +++ b/yass/third_party/libunwind/trunk/test/CMakeLists.txt @@ -15,6 +15,8 @@ pythonize_bool(LIBUNWIND_USES_ARM_EHABI) set(AUTO_GEN_COMMENT "## Autogenerated by libunwind configuration.\n# Do not edit!") set(SERIALIZED_LIT_PARAMS "# Lit parameters serialized here for llvm-lit to pick them up\n") +serialize_lit_string_param(SERIALIZED_LIT_PARAMS compiler "${CMAKE_CXX_COMPILER}") + if (LIBUNWIND_EXECUTOR) message(DEPRECATION "LIBUNWIND_EXECUTOR is deprecated, please add executor=... to LIBUNWIND_TEST_PARAMS") serialize_lit_string_param(SERIALIZED_LIT_PARAMS executor "${LIBUNWIND_EXECUTOR}") @@ -45,4 +47,4 @@ configure_lit_site_cfg( add_lit_testsuite(check-unwind "Running libunwind tests" ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS unwind ${LIBUNWIND_TEST_DEPS}) + DEPENDS unwind) diff --git a/yass/third_party/libunwind/trunk/test/configs/cmake-bridge.cfg.in b/yass/third_party/libunwind/trunk/test/configs/cmake-bridge.cfg.in index c5f34c87ab..7fc7a3da42 100644 --- a/yass/third_party/libunwind/trunk/test/configs/cmake-bridge.cfg.in +++ b/yass/third_party/libunwind/trunk/test/configs/cmake-bridge.cfg.in @@ -29,7 +29,5 @@ if not @LIBUNWIND_ENABLE_THREADS@: config.available_features.add('libunwind-no-threads') # Add substitutions for bootstrapping the test suite configuration -import shlex -config.substitutions.append(('%{cxx}', shlex.quote('@CMAKE_CXX_COMPILER@'))) config.substitutions.append(('%{include}', '@LIBUNWIND_SOURCE_DIR@/include')) config.substitutions.append(('%{lib}', '@LIBUNWIND_LIBRARY_DIR@')) diff --git a/yass/third_party/quiche/CMakeLists.txt b/yass/third_party/quiche/CMakeLists.txt index 3968abcb71..2d5ad954d2 100644 --- a/yass/third_party/quiche/CMakeLists.txt +++ b/yass/third_party/quiche/CMakeLists.txt @@ -669,6 +669,7 @@ set(quiche_quic_SOURCES src/quiche/quic/core/uber_received_packet_manager.cc src/quiche/quic/core/uber_received_packet_manager.h src/quiche/quic/core/web_transport_stats.cc + src/quiche/quic/core/web_transport_write_blocked_list.cc src/quiche/quic/core/web_transport_interface.h src/quiche/quic/platform/api/quic_bug_tracker.h src/quiche/quic/platform/api/quic_client_stats.h diff --git a/yass/third_party/quiche/src/build/source_list.bzl b/yass/third_party/quiche/src/build/source_list.bzl index 67a610ad14..f8f6e7e67d 100644 --- a/yass/third_party/quiche/src/build/source_list.bzl +++ b/yass/third_party/quiche/src/build/source_list.bzl @@ -357,6 +357,7 @@ quiche_core_hdrs = [ "quic/core/uber_received_packet_manager.h", "quic/core/web_transport_interface.h", "quic/core/web_transport_stats.h", + "quic/core/web_transport_write_blocked_list.h", "quic/platform/api/quic_bug_tracker.h", "quic/platform/api/quic_client_stats.h", "quic/platform/api/quic_export.h", @@ -674,6 +675,7 @@ quiche_core_srcs = [ "quic/core/uber_quic_stream_id_manager.cc", "quic/core/uber_received_packet_manager.cc", "quic/core/web_transport_stats.cc", + "quic/core/web_transport_write_blocked_list.cc", "quic/platform/api/quic_socket_address.cc", "spdy/core/array_output_buffer.cc", "spdy/core/hpack/hpack_constants.cc", @@ -795,6 +797,7 @@ quiche_test_support_hdrs = [ "quic/test_tools/mock_clock.h", "quic/test_tools/mock_connection_id_generator.h", "quic/test_tools/mock_load_balancer_encoder.h", + "quic/test_tools/mock_quic_connection_alarms.h", "quic/test_tools/mock_quic_dispatcher.h", "quic/test_tools/mock_quic_session_visitor.h", "quic/test_tools/mock_quic_spdy_client_stream.h", @@ -1303,6 +1306,7 @@ quiche_tests_srcs = [ "quic/core/tls_server_handshaker_test.cc", "quic/core/uber_quic_stream_id_manager_test.cc", "quic/core/uber_received_packet_manager_test.cc", + "quic/core/web_transport_write_blocked_list_test.cc", "quic/platform/api/quic_socket_address_test.cc", "quic/test_tools/crypto_test_utils_test.cc", "quic/test_tools/quic_test_utils_test.cc", diff --git a/yass/third_party/quiche/src/build/source_list.gni b/yass/third_party/quiche/src/build/source_list.gni index afc2300de4..f203a7a9d5 100644 --- a/yass/third_party/quiche/src/build/source_list.gni +++ b/yass/third_party/quiche/src/build/source_list.gni @@ -357,6 +357,7 @@ quiche_core_hdrs = [ "src/quiche/quic/core/uber_received_packet_manager.h", "src/quiche/quic/core/web_transport_interface.h", "src/quiche/quic/core/web_transport_stats.h", + "src/quiche/quic/core/web_transport_write_blocked_list.h", "src/quiche/quic/platform/api/quic_bug_tracker.h", "src/quiche/quic/platform/api/quic_client_stats.h", "src/quiche/quic/platform/api/quic_export.h", @@ -674,6 +675,7 @@ quiche_core_srcs = [ "src/quiche/quic/core/uber_quic_stream_id_manager.cc", "src/quiche/quic/core/uber_received_packet_manager.cc", "src/quiche/quic/core/web_transport_stats.cc", + "src/quiche/quic/core/web_transport_write_blocked_list.cc", "src/quiche/quic/platform/api/quic_socket_address.cc", "src/quiche/spdy/core/array_output_buffer.cc", "src/quiche/spdy/core/hpack/hpack_constants.cc", @@ -795,6 +797,7 @@ quiche_test_support_hdrs = [ "src/quiche/quic/test_tools/mock_clock.h", "src/quiche/quic/test_tools/mock_connection_id_generator.h", "src/quiche/quic/test_tools/mock_load_balancer_encoder.h", + "src/quiche/quic/test_tools/mock_quic_connection_alarms.h", "src/quiche/quic/test_tools/mock_quic_dispatcher.h", "src/quiche/quic/test_tools/mock_quic_session_visitor.h", "src/quiche/quic/test_tools/mock_quic_spdy_client_stream.h", @@ -1304,6 +1307,7 @@ quiche_tests_srcs = [ "src/quiche/quic/core/tls_server_handshaker_test.cc", "src/quiche/quic/core/uber_quic_stream_id_manager_test.cc", "src/quiche/quic/core/uber_received_packet_manager_test.cc", + "src/quiche/quic/core/web_transport_write_blocked_list_test.cc", "src/quiche/quic/platform/api/quic_socket_address_test.cc", "src/quiche/quic/test_tools/crypto_test_utils_test.cc", "src/quiche/quic/test_tools/quic_test_utils_test.cc", diff --git a/yass/third_party/quiche/src/build/source_list.json b/yass/third_party/quiche/src/build/source_list.json index b49530e6c2..c5edd4dd6e 100644 --- a/yass/third_party/quiche/src/build/source_list.json +++ b/yass/third_party/quiche/src/build/source_list.json @@ -356,6 +356,7 @@ "quiche/quic/core/uber_received_packet_manager.h", "quiche/quic/core/web_transport_interface.h", "quiche/quic/core/web_transport_stats.h", + "quiche/quic/core/web_transport_write_blocked_list.h", "quiche/quic/platform/api/quic_bug_tracker.h", "quiche/quic/platform/api/quic_client_stats.h", "quiche/quic/platform/api/quic_export.h", @@ -673,6 +674,7 @@ "quiche/quic/core/uber_quic_stream_id_manager.cc", "quiche/quic/core/uber_received_packet_manager.cc", "quiche/quic/core/web_transport_stats.cc", + "quiche/quic/core/web_transport_write_blocked_list.cc", "quiche/quic/platform/api/quic_socket_address.cc", "quiche/spdy/core/array_output_buffer.cc", "quiche/spdy/core/hpack/hpack_constants.cc", @@ -794,6 +796,7 @@ "quiche/quic/test_tools/mock_clock.h", "quiche/quic/test_tools/mock_connection_id_generator.h", "quiche/quic/test_tools/mock_load_balancer_encoder.h", + "quiche/quic/test_tools/mock_quic_connection_alarms.h", "quiche/quic/test_tools/mock_quic_dispatcher.h", "quiche/quic/test_tools/mock_quic_session_visitor.h", "quiche/quic/test_tools/mock_quic_spdy_client_stream.h", @@ -1303,6 +1306,7 @@ "quiche/quic/core/tls_server_handshaker_test.cc", "quiche/quic/core/uber_quic_stream_id_manager_test.cc", "quiche/quic/core/uber_received_packet_manager_test.cc", + "quiche/quic/core/web_transport_write_blocked_list_test.cc", "quiche/quic/platform/api/quic_socket_address_test.cc", "quiche/quic/test_tools/crypto_test_utils_test.cc", "quiche/quic/test_tools/quic_test_utils_test.cc", diff --git a/yass/third_party/quiche/src/quiche/balsa/balsa_headers_sequence.cc b/yass/third_party/quiche/src/quiche/balsa/balsa_headers_sequence.cc index 137ae83b0c..7512610bd6 100644 --- a/yass/third_party/quiche/src/quiche/balsa/balsa_headers_sequence.cc +++ b/yass/third_party/quiche/src/quiche/balsa/balsa_headers_sequence.cc @@ -1,6 +1,7 @@ #include "quiche/balsa/balsa_headers_sequence.h" #include +#include #include "quiche/balsa/balsa_headers.h" diff --git a/yass/third_party/quiche/src/quiche/binary_http/binary_http_message.cc b/yass/third_party/quiche/src/quiche/binary_http/binary_http_message.cc index 325c0f3297..b29fb8ae7f 100644 --- a/yass/third_party/quiche/src/quiche/binary_http/binary_http_message.cc +++ b/yass/third_party/quiche/src/quiche/binary_http/binary_http_message.cc @@ -1,9 +1,11 @@ #include "quiche/binary_http/binary_http_message.h" +#include #include #include #include #include +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/binary_http/binary_http_message_test.cc b/yass/third_party/quiche/src/quiche/binary_http/binary_http_message_test.cc index 848aa8fa8a..eb81e80f5b 100644 --- a/yass/third_party/quiche/src/quiche/binary_http/binary_http_message_test.cc +++ b/yass/third_party/quiche/src/quiche/binary_http/binary_http_message_test.cc @@ -2,6 +2,7 @@ #include #include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/common/btree_scheduler.h b/yass/third_party/quiche/src/quiche/common/btree_scheduler.h index 75312a3438..3db2a6ce92 100644 --- a/yass/third_party/quiche/src/quiche/common/btree_scheduler.h +++ b/yass/third_party/quiche/src/quiche/common/btree_scheduler.h @@ -49,6 +49,8 @@ class QUICHE_NO_EXPORT BTreeScheduler { bool HasScheduled() const { return !schedule_.empty(); } // Returns the number of currently scheduled streams. size_t NumScheduled() const { return schedule_.size(); } + // Returns the total number of currently registered streams. + size_t NumRegistered() const { return streams_.size(); } // Counts the number of scheduled entries in the range [min, max]. If either // min or max is omitted, negative or positive infinity is assumed. @@ -91,7 +93,7 @@ class QUICHE_NO_EXPORT BTreeScheduler { ABSL_ATTRIBUTE_NO_UNIQUE_ADDRESS Priority priority; // If present, the sequence number with which the stream is currently // scheduled. If absent, indicates that the stream is not scheduled. - std::optional current_sequence_number; + std::optional current_sequence_number = std::nullopt; bool scheduled() const { return current_sequence_number.has_value(); } }; diff --git a/yass/third_party/quiche/src/quiche/common/btree_scheduler_test.cc b/yass/third_party/quiche/src/quiche/common/btree_scheduler_test.cc index c26e2d03df..7aef405650 100644 --- a/yass/third_party/quiche/src/quiche/common/btree_scheduler_test.cc +++ b/yass/third_party/quiche/src/quiche/common/btree_scheduler_test.cc @@ -5,6 +5,9 @@ #include "quiche/common/btree_scheduler.h" #include +#include +#include +#include #include "absl/status/status.h" #include "absl/status/statusor.h" diff --git a/yass/third_party/quiche/src/quiche/common/http/http_header_block.cc b/yass/third_party/quiche/src/quiche/common/http/http_header_block.cc index 06ad992b03..b0aa4cb674 100644 --- a/yass/third_party/quiche/src/quiche/common/http/http_header_block.cc +++ b/yass/third_party/quiche/src/quiche/common/http/http_header_block.cc @@ -7,6 +7,8 @@ #include #include +#include +#include #include #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/common/http/http_header_block_test.cc b/yass/third_party/quiche/src/quiche/common/http/http_header_block_test.cc index 9139078ae0..9a05bb996e 100644 --- a/yass/third_party/quiche/src/quiche/common/http/http_header_block_test.cc +++ b/yass/third_party/quiche/src/quiche/common/http/http_header_block_test.cc @@ -5,6 +5,7 @@ #include "quiche/common/http/http_header_block.h" #include +#include #include #include "quiche/common/platform/api/quiche_test.h" diff --git a/yass/third_party/quiche/src/quiche/common/masque/connect_udp_datagram_payload.cc b/yass/third_party/quiche/src/quiche/common/masque/connect_udp_datagram_payload.cc index ae01817eea..9f519a2bff 100644 --- a/yass/third_party/quiche/src/quiche/common/masque/connect_udp_datagram_payload.cc +++ b/yass/third_party/quiche/src/quiche/common/masque/connect_udp_datagram_payload.cc @@ -6,6 +6,7 @@ #include #include +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/common/platform/api/quiche_file_utils.cc b/yass/third_party/quiche/src/quiche/common/platform/api/quiche_file_utils.cc index d039f28f48..578d64c28f 100644 --- a/yass/third_party/quiche/src/quiche/common/platform/api/quiche_file_utils.cc +++ b/yass/third_party/quiche/src/quiche/common/platform/api/quiche_file_utils.cc @@ -1,6 +1,8 @@ #include "quiche/common/platform/api/quiche_file_utils.h" #include +#include +#include #include "quiche_platform_impl/quiche_file_utils_impl.h" diff --git a/yass/third_party/quiche/src/quiche/common/platform/api/quiche_file_utils_test.cc b/yass/third_party/quiche/src/quiche/common/platform/api/quiche_file_utils_test.cc index 3d7a7b87da..261b2f3c6b 100644 --- a/yass/third_party/quiche/src/quiche/common/platform/api/quiche_file_utils_test.cc +++ b/yass/third_party/quiche/src/quiche/common/platform/api/quiche_file_utils_test.cc @@ -1,6 +1,7 @@ #include "quiche/common/platform/api/quiche_file_utils.h" #include +#include #include #include "absl/algorithm/container.h" diff --git a/yass/third_party/quiche/src/quiche/common/platform/api/quiche_mem_slice_test.cc b/yass/third_party/quiche/src/quiche/common/platform/api/quiche_mem_slice_test.cc index 6c0aa12b59..3d08d1e819 100644 --- a/yass/third_party/quiche/src/quiche/common/platform/api/quiche_mem_slice_test.cc +++ b/yass/third_party/quiche/src/quiche/common/platform/api/quiche_mem_slice_test.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/strings/string_view.h" #include "quiche/common/platform/api/quiche_test.h" diff --git a/yass/third_party/quiche/src/quiche/common/platform/api/quiche_reference_counted_test.cc b/yass/third_party/quiche/src/quiche/common/platform/api/quiche_reference_counted_test.cc index 7c05d7ac19..8f990f4558 100644 --- a/yass/third_party/quiche/src/quiche/common/platform/api/quiche_reference_counted_test.cc +++ b/yass/third_party/quiche/src/quiche/common/platform/api/quiche_reference_counted_test.cc @@ -4,6 +4,8 @@ #include "quiche/common/platform/api/quiche_reference_counted.h" +#include + #include "quiche/common/platform/api/quiche_test.h" namespace quiche { diff --git a/yass/third_party/quiche/src/quiche/common/platform/api/quiche_stack_trace_test.cc b/yass/third_party/quiche/src/quiche/common/platform/api/quiche_stack_trace_test.cc index f99b709296..084e74823c 100644 --- a/yass/third_party/quiche/src/quiche/common/platform/api/quiche_stack_trace_test.cc +++ b/yass/third_party/quiche/src/quiche/common/platform/api/quiche_stack_trace_test.cc @@ -1,6 +1,7 @@ #include "quiche/common/platform/api/quiche_stack_trace.h" #include +#include #include "absl/base/attributes.h" #include "absl/base/optimization.h" diff --git a/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_default_proof_providers_impl.cc b/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_default_proof_providers_impl.cc index 57bcb81871..1fc42abca8 100644 --- a/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_default_proof_providers_impl.cc +++ b/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_default_proof_providers_impl.cc @@ -6,8 +6,10 @@ #include #include +#include #include #include +#include #include "quiche/quic/core/crypto/certificate_view.h" #include "quiche/quic/core/crypto/proof_source.h" diff --git a/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.cc b/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.cc index f727425381..78544d8c86 100644 --- a/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.cc +++ b/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.cc @@ -17,6 +17,9 @@ #include #include #include +#include +#include +#include #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_time_utils_impl.cc b/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_time_utils_impl.cc index a3505709d2..6efd50127a 100644 --- a/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_time_utils_impl.cc +++ b/yass/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_time_utils_impl.cc @@ -4,6 +4,8 @@ #include "quiche_platform_impl/quiche_time_utils_impl.h" +#include + #include "openssl/time.h" namespace quiche { diff --git a/yass/third_party/quiche/src/quiche/common/print_elements_test.cc b/yass/third_party/quiche/src/quiche/common/print_elements_test.cc index 17f1b1ce29..54b0231fc4 100644 --- a/yass/third_party/quiche/src/quiche/common/print_elements_test.cc +++ b/yass/third_party/quiche/src/quiche/common/print_elements_test.cc @@ -4,6 +4,7 @@ #include "quiche/common/print_elements.h" +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/common/quiche_buffer_allocator.cc b/yass/third_party/quiche/src/quiche/common/quiche_buffer_allocator.cc index 9d53d9dada..b431a35239 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_buffer_allocator.cc +++ b/yass/third_party/quiche/src/quiche/common/quiche_buffer_allocator.cc @@ -4,6 +4,7 @@ #include "quiche/common/quiche_buffer_allocator.h" +#include #include #include "quiche/common/platform/api/quiche_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/common/quiche_callbacks_test.cc b/yass/third_party/quiche/src/quiche/common/quiche_callbacks_test.cc index 4d83d35ded..ccd1978b3c 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_callbacks_test.cc +++ b/yass/third_party/quiche/src/quiche/common/quiche_callbacks_test.cc @@ -1,6 +1,8 @@ #include "quiche/common/quiche_callbacks.h" #include +#include +#include #include "quiche/common/platform/api/quiche_test.h" diff --git a/yass/third_party/quiche/src/quiche/common/quiche_circular_deque_test.cc b/yass/third_party/quiche/src/quiche/common/quiche_circular_deque_test.cc index a239cd5d13..9278420ce6 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_circular_deque_test.cc +++ b/yass/third_party/quiche/src/quiche/common/quiche_circular_deque_test.cc @@ -8,7 +8,9 @@ #include #include #include +#include #include +#include #include "quiche/common/platform/api/quiche_logging.h" #include "quiche/common/platform/api/quiche_test.h" diff --git a/yass/third_party/quiche/src/quiche/common/quiche_data_reader.cc b/yass/third_party/quiche/src/quiche/common/quiche_data_reader.cc index 15ad2f9c55..76f2de9bdc 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_data_reader.cc +++ b/yass/third_party/quiche/src/quiche/common/quiche_data_reader.cc @@ -5,6 +5,7 @@ #include "quiche/common/quiche_data_reader.h" #include +#include #include "absl/strings/numbers.h" #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/common/quiche_data_reader.h b/yass/third_party/quiche/src/quiche/common/quiche_data_reader.h index d50c040b69..4f8d46abb4 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_data_reader.h +++ b/yass/third_party/quiche/src/quiche/common/quiche_data_reader.h @@ -172,7 +172,7 @@ class QUICHE_EXPORT QuicheDataReader { // Truncates the reader down by reducing its internal length. // If called immediately after calling this, BytesRemaining will - // return |truncation_length|. If truncation_length is less than the + // return |truncation_length|. If truncation_length is greater than the // current value of BytesRemaining, this does nothing and returns false. bool TruncateRemaining(size_t truncation_length); diff --git a/yass/third_party/quiche/src/quiche/common/quiche_data_writer.cc b/yass/third_party/quiche/src/quiche/common/quiche_data_writer.cc index 98b5c37e5a..bf49f596d2 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_data_writer.cc +++ b/yass/third_party/quiche/src/quiche/common/quiche_data_writer.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/common/quiche_data_writer_test.cc b/yass/third_party/quiche/src/quiche/common/quiche_data_writer_test.cc index eb143502b1..745e1efce6 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_data_writer_test.cc +++ b/yass/third_party/quiche/src/quiche/common/quiche_data_writer_test.cc @@ -6,6 +6,8 @@ #include #include +#include +#include #include "absl/base/macros.h" #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/common/quiche_feature_flags_list.h b/yass/third_party/quiche/src/quiche/common/quiche_feature_flags_list.h index 5e28f029b0..b6784b136c 100755 --- a/yass/third_party/quiche/src/quiche/common/quiche_feature_flags_list.h +++ b/yass/third_party/quiche/src/quiche/common/quiche_feature_flags_list.h @@ -12,9 +12,11 @@ QUICHE_FLAG(bool, quiche_reloadable_flag_http2_add_hpack_overhead_bytes2, false, QUICHE_FLAG(bool, quiche_reloadable_flag_quic_act_upon_invalid_header, true, "If true, reject or send error response code upon receiving invalid request or response headers.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_add_stream_info_to_idle_close_detail, false, "If true, include stream information in idle timeout connection close detail.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_allow_client_enabled_bbr_v2, true, "If true, allow client to enable BBRv2 on server via connection option 'B2ON'.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_bbr2_enable_bbpd_by_default, false, "If true, QUIC BBR2 will use a 0.91 PROBE_DOWN gain by default.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_bbr2_extra_acked_window, false, "When true, the BBR4 copt sets the extra_acked window to 20 RTTs and BBR5 sets it to 40 RTTs.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_bbr2_probe_two_rounds, true, "When true, the BB2U copt causes BBR2 to wait two rounds with out draining the queue before exiting PROBE_UP and BB2S has the same effect in STARTUP.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_bbr2_simplify_inflight_hi, true, "When true, the BBHI copt causes QUIC BBRv2 to use a simpler algorithm for raising inflight_hi in PROBE_UP.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_better_qpack_compression, false, "If true, use improved QPACK compression algorithm.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_block_until_settings_received_copt, true, "If enabled and a BSUS connection is received, blocks server connections until SETTINGS frame is received.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_can_send_ack_frequency, true, "If true, ack frequency frame can be sent from server to client.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_conservative_bursts, false, "If true, set burst token to 2 in cwnd bootstrapping experiment.") @@ -29,13 +31,12 @@ QUICHE_FLAG(bool, quiche_reloadable_flag_quic_disable_version_q046, false, "If t QUICHE_FLAG(bool, quiche_reloadable_flag_quic_disable_version_rfcv1, false, "If true, disable QUIC version h3 (RFCv1).") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_discard_initial_packet_with_key_dropped, false, "If true, discard INITIAL packet if the key has been dropped.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_enable_disable_resumption, true, "If true, disable resumption when receiving NRES connection option.") -QUICHE_FLAG(bool, quiche_reloadable_flag_quic_enable_http3_metadata_decoding, true, "If true, the HTTP/3 decoder will decode METADATA frames and not treat them as Unknown.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_enable_mtu_discovery_at_server, false, "If true, QUIC will default enable MTU discovery at server, with a target of 1450 bytes.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_enable_server_on_wire_ping, true, "If true, enable server retransmittable on wire PING.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_enable_version_rfcv2, false, "When true, support RFC9369.") -QUICHE_FLAG(bool, quiche_reloadable_flag_quic_gfe_allow_alps_new_codepoint, false, "If true, allow quic to use new ALPS codepoint to negotiate during handshake for H3 if client sends new ALPS codepoint.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_gfe_allow_alps_new_codepoint, true, "If true, allow quic to use new ALPS codepoint to negotiate during handshake for H3 if client sends new ALPS codepoint.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_ignore_gquic_probing, true, "If true, QUIC server will not respond to gQUIC probing packet(PING + PADDING) but treat it as a regular packet.") -QUICHE_FLAG(bool, quiche_reloadable_flag_quic_limit_new_streams_per_loop_2, false, "If true, when the peer sends connection options \\\'SLP1\\\', \\\'SLP2\\\' and \\\'SLPF\\\', internet facing GFEs will only allow a limited number of new requests to be processed per event loop, and postpone the rest to the following event loops. Also guard QuicConnection to iterate through all decrypters at each encryption level to get cipher id for a request.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_limit_new_streams_per_loop_2, true, "If true, when the peer sends connection options \\\'SLP1\\\', \\\'SLP2\\\' and \\\'SLPF\\\', internet facing GFEs will only allow a limited number of new requests to be processed per event loop, and postpone the rest to the following event loops. Also guard QuicConnection to iterate through all decrypters at each encryption level to get cipher id for a request.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_new_error_code_when_packets_buffered_too_long, true, "If true, dispatcher sends error code QUIC_HANDSHAKE_FAILED_PACKETS_BUFFERED_TOO_LONG when handshake fails due to packets buffered for too long.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_no_path_degrading_before_handshake_confirmed, true, "If true, an endpoint does not detect path degrading or blackholing until handshake gets confirmed.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_no_write_control_frame_upon_connection_close, false, "If trrue, early return before write control frame in OnCanWrite() if the connection is already closed.") @@ -49,7 +50,7 @@ QUICHE_FLAG(bool, quiche_reloadable_flag_quic_test_peer_addr_change_after_normal QUICHE_FLAG(bool, quiche_reloadable_flag_quic_testonly_default_false, false, "A testonly reloadable flag that will always default to false.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_testonly_default_true, true, "A testonly reloadable flag that will always default to true.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_use_received_client_addresses_cache, true, "If true, use a LRU cache to record client addresses of packets received on server's original address.") -QUICHE_FLAG(bool, quiche_restart_flag_quic_opport_bundle_qpack_decoder_data5, false, "If true, bundle qpack decoder data with other frames opportunistically.") +QUICHE_FLAG(bool, quiche_restart_flag_quic_opport_bundle_qpack_decoder_data5, true, "If true, bundle qpack decoder data with other frames opportunistically.") QUICHE_FLAG(bool, quiche_restart_flag_quic_support_ect1, false, "When true, allows sending of QUIC packets marked ECT(1). A different flag (TBD) will actually utilize this capability to send ECT(1).") QUICHE_FLAG(bool, quiche_restart_flag_quic_support_release_time_for_gso, false, "If true, QuicGsoBatchWriter will support release time if it is available and the process has the permission to do so.") QUICHE_FLAG(bool, quiche_restart_flag_quic_testonly_default_false, false, "A testonly restart flag that will always default to false.") diff --git a/yass/third_party/quiche/src/quiche/common/quiche_linked_hash_map_test.cc b/yass/third_party/quiche/src/quiche/common/quiche_linked_hash_map_test.cc index 0aa9c54bfc..1a3aa79761 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_linked_hash_map_test.cc +++ b/yass/third_party/quiche/src/quiche/common/quiche_linked_hash_map_test.cc @@ -7,6 +7,7 @@ #include "quiche/common/quiche_linked_hash_map.h" #include +#include #include #include "quiche/common/platform/api/quiche_test.h" diff --git a/yass/third_party/quiche/src/quiche/common/quiche_mem_slice_storage.cc b/yass/third_party/quiche/src/quiche/common/quiche_mem_slice_storage.cc index 4b304af9bb..4a118e5375 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_mem_slice_storage.cc +++ b/yass/third_party/quiche/src/quiche/common/quiche_mem_slice_storage.cc @@ -4,6 +4,9 @@ #include "quiche/common/quiche_mem_slice_storage.h" +#include +#include + #include "quiche/quic/core/quic_utils.h" namespace quiche { diff --git a/yass/third_party/quiche/src/quiche/common/quiche_mem_slice_storage_test.cc b/yass/third_party/quiche/src/quiche/common/quiche_mem_slice_storage_test.cc index 8b7ed1a4d0..f3b75887bf 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_mem_slice_storage_test.cc +++ b/yass/third_party/quiche/src/quiche/common/quiche_mem_slice_storage_test.cc @@ -4,6 +4,8 @@ #include "quiche/common/quiche_mem_slice_storage.h" +#include + #include "quiche/common/platform/api/quiche_test.h" #include "quiche/common/simple_buffer_allocator.h" diff --git a/yass/third_party/quiche/src/quiche/common/quiche_simple_arena.cc b/yass/third_party/quiche/src/quiche/common/quiche_simple_arena.cc index b8706a72b3..dea646763a 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_simple_arena.cc +++ b/yass/third_party/quiche/src/quiche/common/quiche_simple_arena.cc @@ -6,6 +6,7 @@ #include #include +#include #include "quiche/common/platform/api/quiche_logging.h" diff --git a/yass/third_party/quiche/src/quiche/common/quiche_text_utils.cc b/yass/third_party/quiche/src/quiche/common/quiche_text_utils.cc index 23b03e87ac..5202ab3ea3 100644 --- a/yass/third_party/quiche/src/quiche/common/quiche_text_utils.cc +++ b/yass/third_party/quiche/src/quiche/common/quiche_text_utils.cc @@ -4,6 +4,10 @@ #include "quiche/common/quiche_text_utils.h" +#include +#include +#include + #include "absl/strings/escaping.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" diff --git a/yass/third_party/quiche/src/quiche/common/simple_buffer_allocator_test.cc b/yass/third_party/quiche/src/quiche/common/simple_buffer_allocator_test.cc index c23d6b7ba9..7dead5b62b 100644 --- a/yass/third_party/quiche/src/quiche/common/simple_buffer_allocator_test.cc +++ b/yass/third_party/quiche/src/quiche/common/simple_buffer_allocator_test.cc @@ -4,6 +4,8 @@ #include "quiche/common/simple_buffer_allocator.h" +#include + #include "quiche/common/platform/api/quiche_test.h" namespace quiche { diff --git a/yass/third_party/quiche/src/quiche/common/structured_headers_generated_test.cc b/yass/third_party/quiche/src/quiche/common/structured_headers_generated_test.cc index d9b1dc64fd..c9be2a8952 100644 --- a/yass/third_party/quiche/src/quiche/common/structured_headers_generated_test.cc +++ b/yass/third_party/quiche/src/quiche/common/structured_headers_generated_test.cc @@ -2,6 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include +#include +#include + #include "quiche/common/platform/api/quiche_test.h" #include "quiche/common/structured_headers.h" diff --git a/yass/third_party/quiche/src/quiche/common/structured_headers_test.cc b/yass/third_party/quiche/src/quiche/common/structured_headers_test.cc index e8310f173b..a34b6418a2 100644 --- a/yass/third_party/quiche/src/quiche/common/structured_headers_test.cc +++ b/yass/third_party/quiche/src/quiche/common/structured_headers_test.cc @@ -9,6 +9,7 @@ #include #include #include +#include #include "quiche/common/platform/api/quiche_test.h" diff --git a/yass/third_party/quiche/src/quiche/common/test_tools/quiche_test_utils.cc b/yass/third_party/quiche/src/quiche/common/test_tools/quiche_test_utils.cc index 0d8f26416c..20882c2183 100644 --- a/yass/third_party/quiche/src/quiche/common/test_tools/quiche_test_utils.cc +++ b/yass/third_party/quiche/src/quiche/common/test_tools/quiche_test_utils.cc @@ -4,6 +4,8 @@ #include "quiche/common/test_tools/quiche_test_utils.h" +#include +#include #include #include "quiche/common/platform/api/quiche_googleurl.h" diff --git a/yass/third_party/quiche/src/quiche/common/wire_serialization_test.cc b/yass/third_party/quiche/src/quiche/common/wire_serialization_test.cc index 98713d4e53..5a69a07d6c 100644 --- a/yass/third_party/quiche/src/quiche/common/wire_serialization_test.cc +++ b/yass/third_party/quiche/src/quiche/common/wire_serialization_test.cc @@ -4,9 +4,11 @@ #include "quiche/common/wire_serialization.h" +#include #include #include #include +#include #include "absl/status/status.h" #include "absl/status/statusor.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/adapter_impl_comparison_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/adapter_impl_comparison_test.cc index 3e4392dfba..39acd78f68 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/adapter_impl_comparison_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/adapter_impl_comparison_test.cc @@ -1,3 +1,7 @@ +#include +#include +#include + #include "quiche/http2/adapter/http2_protocol.h" #include "quiche/http2/adapter/nghttp2_adapter.h" #include "quiche/http2/adapter/oghttp2_adapter.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor.cc b/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor.cc index 7f2f4a41d3..eda177345c 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor.cc @@ -1,5 +1,7 @@ #include "quiche/http2/adapter/callback_visitor.h" +#include + #include "absl/strings/escaping.h" #include "quiche/http2/adapter/http2_util.h" #include "quiche/http2/adapter/nghttp2.h" @@ -107,6 +109,22 @@ int64_t CallbackVisitor::OnReadyToSend(absl::string_view serialized) { } } +Http2VisitorInterface::DataFrameHeaderInfo +CallbackVisitor::OnReadyToSendDataForStream(Http2StreamId /*stream_id*/, + size_t /*max_length*/) { + QUICHE_LOG(FATAL) + << "Not implemented; should not be used with nghttp2 callbacks."; + return {}; +} + +bool CallbackVisitor::SendDataFrame(Http2StreamId /*stream_id*/, + absl::string_view /*frame_header*/, + size_t /*payload_bytes*/) { + QUICHE_LOG(FATAL) + << "Not implemented; should not be used with nghttp2 callbacks."; + return false; +} + void CallbackVisitor::OnConnectionError(ConnectionError /*error*/) { QUICHE_VLOG(1) << "OnConnectionError not implemented"; } diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor.h b/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor.h index 2f2336b27a..f1d7a3ac66 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor.h +++ b/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor.h @@ -29,6 +29,10 @@ class QUICHE_EXPORT CallbackVisitor : public Http2VisitorInterface { void* user_data); int64_t OnReadyToSend(absl::string_view serialized) override; + DataFrameHeaderInfo OnReadyToSendDataForStream(Http2StreamId stream_id, + size_t max_length) override; + bool SendDataFrame(Http2StreamId stream_id, absl::string_view frame_header, + size_t payload_bytes) override; void OnConnectionError(ConnectionError error) override; bool OnFrameHeader(Http2StreamId stream_id, size_t length, uint8_t type, uint8_t flags) override; diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor_test.cc index 0da51a8946..064ca679ad 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/callback_visitor_test.cc @@ -1,5 +1,7 @@ #include "quiche/http2/adapter/callback_visitor.h" +#include + #include "absl/container/flat_hash_map.h" #include "quiche/http2/adapter/http2_protocol.h" #include "quiche/http2/adapter/mock_nghttp2_callbacks.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/chunked_buffer.cc b/yass/third_party/quiche/src/quiche/http2/adapter/chunked_buffer.cc index f941042d3a..5ccb882a40 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/chunked_buffer.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/chunked_buffer.cc @@ -1,6 +1,9 @@ #include "quiche/http2/adapter/chunked_buffer.h" #include +#include +#include +#include namespace http2 { namespace adapter { diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/chunked_buffer_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/chunked_buffer_test.cc index 66f3a264ef..091b5f2e47 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/chunked_buffer_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/chunked_buffer_test.cc @@ -1,5 +1,10 @@ #include "quiche/http2/adapter/chunked_buffer.h" +#include +#include +#include +#include + #include "absl/strings/str_join.h" #include "absl/strings/string_view.h" #include "quiche/common/platform/api/quiche_test.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/event_forwarder.cc b/yass/third_party/quiche/src/quiche/http2/adapter/event_forwarder.cc index 62a57c6f49..58ca5385cd 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/event_forwarder.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/event_forwarder.cc @@ -1,5 +1,8 @@ #include "quiche/http2/adapter/event_forwarder.h" +#include +#include + namespace http2 { namespace adapter { diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/header_validator.cc b/yass/third_party/quiche/src/quiche/http2/adapter/header_validator.cc index d3643f7c43..c2bfe58072 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/header_validator.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/header_validator.cc @@ -2,6 +2,7 @@ #include #include +#include #include "absl/strings/ascii.h" #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/header_validator_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/header_validator_test.cc index e3a4c68bd4..6916f7e6bb 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/header_validator_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/header_validator_test.cc @@ -1,6 +1,7 @@ #include "quiche/http2/adapter/header_validator.h" #include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/http2_protocol.cc b/yass/third_party/quiche/src/quiche/http2/adapter/http2_protocol.cc index 6469d324fd..63b74f686d 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/http2_protocol.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/http2_protocol.cc @@ -1,5 +1,8 @@ #include "quiche/http2/adapter/http2_protocol.h" +#include +#include + #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/http2_visitor_interface.h b/yass/third_party/quiche/src/quiche/http2/adapter/http2_visitor_interface.h index fa8491d879..531c0afcd3 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/http2_visitor_interface.h +++ b/yass/third_party/quiche/src/quiche/http2/adapter/http2_visitor_interface.h @@ -7,6 +7,7 @@ #include "absl/strings/string_view.h" #include "quiche/http2/adapter/http2_protocol.h" #include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/platform/api/quiche_logging.h" namespace http2 { namespace adapter { @@ -60,6 +61,34 @@ class QUICHE_EXPORT Http2VisitorInterface { // bytes were actually sent. May return kSendBlocked or kSendError. virtual int64_t OnReadyToSend(absl::string_view serialized) = 0; + struct DataFrameHeaderInfo { + int64_t payload_length; + bool end_data; + bool end_stream; // If true, also implies end_data. + }; + // Called when the codec is ready to construct a DATA frame header. The + // implementation should return the number of bytes ready to send, and whether + // it's the end of the message body data. If the implementation returns 0 + // bytes and also `end_data` is false, then the stream is deferred until + // resumed by the application. `payload_length` must be at most `max_length`. + // A `payload_length` of -1 indicates that this stream has encountered an + // unrecoverable error. + virtual DataFrameHeaderInfo OnReadyToSendDataForStream( + Http2StreamId /*stream_id*/, size_t /*max_length*/) { + QUICHE_LOG(FATAL) << "Not implemented"; + return DataFrameHeaderInfo{}; + } + + // Called when the codec is ready to send a DATA frame. The implementation + // should send the `frame_header` and specified number of payload bytes. + // Returning false indicates an unrecoverable error. + virtual bool SendDataFrame(Http2StreamId /*stream_id*/, + absl::string_view /*frame_header*/, + size_t /*payload_bytes*/) { + QUICHE_LOG(FATAL) << "Not implemented."; + return false; + } + // Called when a connection-level error has occurred. enum class ConnectionError { // The peer sent an invalid connection preface. diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/mock_http2_visitor.h b/yass/third_party/quiche/src/quiche/http2/adapter/mock_http2_visitor.h index 86345d3651..40d3c807ff 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/mock_http2_visitor.h +++ b/yass/third_party/quiche/src/quiche/http2/adapter/mock_http2_visitor.h @@ -33,6 +33,12 @@ class QUICHE_NO_EXPORT MockHttp2Visitor : public Http2VisitorInterface { MOCK_METHOD(int64_t, OnReadyToSend, (absl::string_view serialized), (override)); + MOCK_METHOD(DataFrameHeaderInfo, OnReadyToSendDataForStream, + (Http2StreamId stream_id, size_t max_length), (override)); + MOCK_METHOD(bool, SendDataFrame, + (Http2StreamId stream_id, absl::string_view frame_header, + size_t payload_bytes), + (override)); MOCK_METHOD(void, OnConnectionError, (ConnectionError error), (override)); MOCK_METHOD(bool, OnFrameHeader, (Http2StreamId stream_id, size_t length, uint8_t type, diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2.h b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2.h index d793dad98b..496cd06315 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2.h +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2.h @@ -3,9 +3,13 @@ #include +#include "nghttp2/nghttp2ver.h" + #if NGHTTP2_VERSION_NUM < 0x013c00 // Required to build on Windows. using ssize_t = ptrdiff_t; +#else +#define NGHTTP2_NO_SSIZE_T #endif #include "nghttp2/nghttp2.h" // IWYU pragma: export diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter.cc b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter.cc index ae1e7642eb..de9dd2e77e 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter.cc @@ -1,6 +1,10 @@ #include "quiche/http2/adapter/nghttp2_adapter.h" +#include +#include #include +#include +#include #include "absl/algorithm/container.h" #include "absl/strings/str_cat.h" @@ -24,6 +28,30 @@ namespace { using ConnectionError = Http2VisitorInterface::ConnectionError; +const size_t kFrameHeaderSize = 9; + +// A nghttp2-style `nghttp2_data_source_read_callback`. +#if NGHTTP2_VERSION_NUM >= 0x013c00 +nghttp2_ssize +#else +ssize_t +#endif +DataFrameReadCallback(nghttp2_session* /* session */, int32_t stream_id, + uint8_t* /* buf */, size_t length, + uint32_t* data_flags, nghttp2_data_source* source, + void* /* user_data */) { + NgHttp2Adapter* adapter = reinterpret_cast(source->ptr); + return adapter->DelegateReadCallback(stream_id, length, data_flags); +} + +// A nghttp2-style `nghttp2_send_data_callback`. +int DataFrameSendCallback(nghttp2_session* /* session */, nghttp2_frame* frame, + const uint8_t* framehd, size_t length, + nghttp2_data_source* source, void* /* user_data */) { + NgHttp2Adapter* adapter = reinterpret_cast(source->ptr); + return adapter->DelegateSendCallback(frame->hd.stream_id, framehd, length); +} + } // anonymous namespace // A metadata source that notifies the owning NgHttp2Adapter upon completion or @@ -236,16 +264,23 @@ int32_t NgHttp2Adapter::SubmitRequest( absl::Span headers, std::unique_ptr data_source, bool end_stream, void* stream_user_data) { - QUICHE_DCHECK_EQ(end_stream, data_source == nullptr); auto nvs = GetNghttp2Nvs(headers); #if NGHTTP2_VERSION_NUM >= 0x013c00 - std::unique_ptr provider = - MakeDataProvider(data_source.get()); + std::unique_ptr provider; #else - std::unique_ptr provider = - MakeDataProvider(data_source.get()); + std::unique_ptr provider; #endif + if (data_source != nullptr || !end_stream) { +#if NGHTTP2_VERSION_NUM >= 0x013c00 + provider = std::make_unique(); +#else + provider = std::make_unique(); +#endif + provider->source.ptr = this; + provider->read_callback = &DataFrameReadCallback; + } + #if NGHTTP2_VERSION_NUM >= 0x013c00 int32_t result = nghttp2_submit_request2(session_->raw_ptr(), nullptr, nvs.data(), @@ -255,6 +290,9 @@ int32_t NgHttp2Adapter::SubmitRequest( nghttp2_submit_request(session_->raw_ptr(), nullptr, nvs.data(), nvs.size(), provider.get(), stream_user_data); #endif + if (data_source != nullptr) { + sources_.emplace(result, std::move(data_source)); + } QUICHE_VLOG(1) << "Submitted request with " << nvs.size() << " request headers and user data " << stream_user_data << "; resulted in stream " << result; @@ -269,17 +307,24 @@ int NgHttp2Adapter::SubmitResponse(Http2StreamId stream_id, absl::Span headers, std::unique_ptr data_source, bool end_stream) { - QUICHE_DCHECK_EQ(end_stream, data_source == nullptr); auto nvs = GetNghttp2Nvs(headers); #if NGHTTP2_VERSION_NUM >= 0x013c00 - std::unique_ptr provider = - MakeDataProvider(data_source.get()); + std::unique_ptr provider; #else - std::unique_ptr provider = - MakeDataProvider(data_source.get()); + std::unique_ptr provider; #endif - - sources_.emplace(stream_id, std::move(data_source)); + if (data_source != nullptr || !end_stream) { +#if NGHTTP2_VERSION_NUM >= 0x013c00 + provider = std::make_unique(); +#else + provider = std::make_unique(); +#endif + provider->source.ptr = this; + provider->read_callback = &DataFrameReadCallback; + } + if (data_source != nullptr) { + sources_.emplace(stream_id, std::move(data_source)); + } #if NGHTTP2_VERSION_NUM >= 0x013c00 int result = nghttp2_submit_response2(session_->raw_ptr(), stream_id, @@ -333,6 +378,43 @@ void NgHttp2Adapter::RemoveStream(Http2StreamId stream_id) { sources_.erase(stream_id); } +#if NGHTTP2_VERSION_NUM >= 0x013c00 +nghttp2_ssize +#else +ssize_t +#endif +NgHttp2Adapter::DelegateReadCallback(int32_t stream_id, + size_t max_length, + uint32_t* data_flags) { + auto it = sources_.find(stream_id); + if (it == sources_.end()) { + // A DataFrameSource is not available for this stream; forward to the + // visitor. + return callbacks::VisitorReadCallback(visitor_, stream_id, max_length, + data_flags); + } else { + // A DataFrameSource is available for this stream. + return callbacks::DataFrameSourceReadCallback(*it->second, max_length, + data_flags); + } +} + +int NgHttp2Adapter::DelegateSendCallback(int32_t stream_id, + const uint8_t* framehd, + size_t length) { + auto it = sources_.find(stream_id); + if (it == sources_.end()) { + // A DataFrameSource is not available for this stream; forward to the + // visitor. + visitor_.SendDataFrame(stream_id, ToStringView(framehd, kFrameHeaderSize), + length); + } else { + // A DataFrameSource is available for this stream. + it->second->Send(ToStringView(framehd, kFrameHeaderSize), length); + } + return 0; +} + NgHttp2Adapter::NgHttp2Adapter(Http2VisitorInterface& visitor, Perspective perspective, const nghttp2_option* options) @@ -363,9 +445,9 @@ void NgHttp2Adapter::Initialize() { options_ = owned_options; } - session_ = - std::make_unique(perspective_, callbacks::Create(), - options_, static_cast(&visitor_)); + session_ = std::make_unique( + perspective_, callbacks::Create(&DataFrameSendCallback), options_, + static_cast(&visitor_)); if (owned_options != nullptr) { nghttp2_option_del(owned_options); } diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter.h b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter.h index 6f4b405ba8..7ab02835b1 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter.h +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter.h @@ -105,6 +105,20 @@ class QUICHE_EXPORT NgHttp2Adapter : public Http2Adapter { return 0; } + // Delegates a DATA frame read callback to either the visitor or a registered + // DataFrameSource. +#if NGHTTP2_VERSION_NUM >= 0x013c00 + nghttp2_ssize +#else + ssize_t +#endif + DelegateReadCallback(int32_t stream_id, size_t max_length, uint32_t* data_flags); + + // Delegates a DATA frame send callback to either the visitor or a registered + // DataFrameSource. + int DelegateSendCallback(int32_t stream_id, const uint8_t* framehd, + size_t length); + private: class NotifyingMetadataSource; diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter_test.cc index d5811dfe64..6bf8c1fd1b 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter_test.cc @@ -1,6 +1,8 @@ #include "quiche/http2/adapter/nghttp2_adapter.h" #include +#include +#include #include "quiche/http2/adapter/http2_protocol.h" #include "quiche/http2/adapter/http2_visitor_interface.h" @@ -146,7 +148,9 @@ TEST(NgHttp2AdapterTest, ClientHandlesFrames) { adapter->SetStreamUserData(stream_id2, const_cast(kSentinel2)); adapter->SetStreamUserData(stream_id3, nullptr); - EXPECT_EQ(adapter->sources_size(), 3); + // These requests did not include a body, so they do not have corresponding + // DataFrameSources. + EXPECT_EQ(adapter->sources_size(), 0); EXPECT_CALL(visitor, OnBeforeFrameSent(HEADERS, stream_id1, _, 0x5)); EXPECT_CALL(visitor, OnFrameSent(HEADERS, stream_id1, _, 0x5, 0)); @@ -231,9 +235,6 @@ TEST(NgHttp2AdapterTest, ClientHandlesFrames) { EXPECT_EQ(kInitialFlowControlWindowSize, adapter->GetStreamReceiveWindowSize(stream_id3)); - // One stream was closed. - EXPECT_EQ(adapter->sources_size(), 2); - // Connection window should be the same as the first stream. EXPECT_EQ(adapter->GetReceiveWindowSize(), adapter->GetStreamReceiveWindowSize(stream_id1)); @@ -279,7 +280,6 @@ TEST(NgHttp2AdapterTest, ClientHandlesFrames) { // After receiving END_STREAM for 1 and RST_STREAM for 5, the session no // longer expects reads. EXPECT_FALSE(adapter->want_read()); - EXPECT_EQ(adapter->sources_size(), 0); // Client will not have anything else to write. EXPECT_FALSE(adapter->want_write()); @@ -878,7 +878,12 @@ TEST(NgHttp2AdapterTest, ClientHandlesTrailers) { EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); } -TEST(NgHttp2AdapterTest, ClientSendsTrailers) { +class NgHttp2AdapterDataTest : public quiche::test::QuicheTestWithParam { +}; + +INSTANTIATE_TEST_SUITE_P(BothValues, NgHttp2AdapterDataTest, testing::Bool()); + +TEST_P(NgHttp2AdapterDataTest, ClientSendsTrailers) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor); @@ -890,15 +895,19 @@ TEST(NgHttp2AdapterTest, ClientSendsTrailers) { {":authority", "example.com"}, {":path", "/this/is/request/one"}}); + const Http2StreamId kStreamId = 1; const std::string kBody = "This is an example request body."; - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); + visitor.AppendPayloadForStream(kStreamId, kBody); + visitor.SetEndData(kStreamId, false); + auto body1 = std::make_unique(visitor, kStreamId); // nghttp2 does not require that the data source indicate the end of data // before trailers are enqueued. - const int32_t stream_id1 = - adapter->SubmitRequest(headers1, std::move(body1), false, nullptr); + const int32_t stream_id1 = adapter->SubmitRequest( + headers1, GetParam() ? nullptr : std::move(body1), false, nullptr); ASSERT_GT(stream_id1, 0); + EXPECT_EQ(stream_id1, kStreamId); + EXPECT_EQ(adapter->sources_size(), GetParam() ? 0 : 1); EXPECT_CALL(visitor, OnBeforeFrameSent(HEADERS, stream_id1, _, 0x4)); EXPECT_CALL(visitor, OnFrameSent(HEADERS, stream_id1, _, 0x4, 0)); @@ -2042,7 +2051,7 @@ TEST(NgHttp2AdapterTest, ClientRejects101Response) { SpdyFrameType::RST_STREAM})); } -TEST(NgHttp2AdapterTest, ClientSubmitRequest) { +TEST_P(NgHttp2AdapterDataTest, ClientSubmitRequest) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor); int result = adapter->Send(); @@ -2078,16 +2087,17 @@ TEST(NgHttp2AdapterTest, ClientSubmitRequest) { EXPECT_FALSE(adapter->want_write()); const char* kSentinel = ""; const absl::string_view kBody = "This is an example request body."; - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload(kBody); - body1->EndData(); - int stream_id = adapter->SubmitRequest( - ToHeaders({{":method", "POST"}, - {":scheme", "http"}, - {":authority", "example.com"}, - {":path", "/this/is/request/one"}}), - std::move(body1), false, const_cast(kSentinel)); - EXPECT_GT(stream_id, 0); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); + int stream_id = + adapter->SubmitRequest(ToHeaders({{":method", "POST"}, + {":scheme", "http"}, + {":authority", "example.com"}, + {":path", "/this/is/request/one"}}), + GetParam() ? nullptr : std::move(body1), false, + const_cast(kSentinel)); + ASSERT_EQ(1, stream_id); EXPECT_TRUE(adapter->want_write()); EXPECT_CALL(visitor, OnBeforeFrameSent(HEADERS, stream_id, _, 0x4)); @@ -2892,7 +2902,7 @@ TEST(NgHttp2AdapterTest, ClientSubmitMetadataWithFailureSending) { })); } -TEST(NgHttp2AdapterTest, ClientObeysMaxConcurrentStreams) { +TEST_P(NgHttp2AdapterDataTest, ClientObeysMaxConcurrentStreams) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor); int result = adapter->Send(); @@ -2929,15 +2939,15 @@ TEST(NgHttp2AdapterTest, ClientObeysMaxConcurrentStreams) { EXPECT_FALSE(adapter->want_write()); const absl::string_view kBody = "This is an example request body."; - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload(kBody); - body1->EndData(); - const int stream_id = - adapter->SubmitRequest(ToHeaders({{":method", "POST"}, - {":scheme", "http"}, - {":authority", "example.com"}, - {":path", "/this/is/request/one"}}), - std::move(body1), false, nullptr); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); + const int stream_id = adapter->SubmitRequest( + ToHeaders({{":method", "POST"}, + {":scheme", "http"}, + {":authority", "example.com"}, + {":path", "/this/is/request/one"}}), + GetParam() ? nullptr : std::move(body1), false, nullptr); EXPECT_GT(stream_id, 0); EXPECT_TRUE(adapter->want_write()); @@ -3009,7 +3019,7 @@ TEST(NgHttp2AdapterTest, ClientObeysMaxConcurrentStreams) { EXPECT_FALSE(adapter->want_write()); } -TEST(NgHttp2AdapterTest, ClientReceivesInitialWindowSetting) { +TEST_P(NgHttp2AdapterDataTest, ClientReceivesInitialWindowSetting) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor); @@ -3045,15 +3055,15 @@ TEST(NgHttp2AdapterTest, ClientReceivesInitialWindowSetting) { visitor.Clear(); const std::string kLongBody = std::string(81000, 'c'); - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload(kLongBody); - body1->EndData(); - const int stream_id = - adapter->SubmitRequest(ToHeaders({{":method", "POST"}, - {":scheme", "http"}, - {":authority", "example.com"}, - {":path", "/this/is/request/one"}}), - std::move(body1), false, nullptr); + visitor.AppendPayloadForStream(1, kLongBody); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, true); + const int stream_id = adapter->SubmitRequest( + ToHeaders({{":method", "POST"}, + {":scheme", "http"}, + {":authority", "example.com"}, + {":path", "/this/is/request/one"}}), + GetParam() ? nullptr : std::move(body1), false, nullptr); EXPECT_GT(stream_id, 0); EXPECT_TRUE(adapter->want_write()); @@ -3071,7 +3081,8 @@ TEST(NgHttp2AdapterTest, ClientReceivesInitialWindowSetting) { SpdyFrameType::DATA, SpdyFrameType::DATA})); } -TEST(NgHttp2AdapterTest, ClientReceivesInitialWindowSettingAfterStreamStart) { +TEST_P(NgHttp2AdapterDataTest, + ClientReceivesInitialWindowSettingAfterStreamStart) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor); @@ -3098,15 +3109,15 @@ TEST(NgHttp2AdapterTest, ClientReceivesInitialWindowSettingAfterStreamStart) { visitor.Clear(); const std::string kLongBody = std::string(81000, 'c'); - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload(kLongBody); - body1->EndData(); - const int stream_id = - adapter->SubmitRequest(ToHeaders({{":method", "POST"}, - {":scheme", "http"}, - {":authority", "example.com"}, - {":path", "/this/is/request/one"}}), - std::move(body1), false, nullptr); + visitor.AppendPayloadForStream(1, kLongBody); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); + const int stream_id = adapter->SubmitRequest( + ToHeaders({{":method", "POST"}, + {":scheme", "http"}, + {":authority", "example.com"}, + {":path", "/this/is/request/one"}}), + GetParam() ? nullptr : std::move(body1), false, nullptr); EXPECT_GT(stream_id, 0); EXPECT_TRUE(adapter->want_write()); @@ -3676,7 +3687,7 @@ TEST(NgHttp2AdapterTest, ConnectionErrorOnControlFrameSent) { EXPECT_FALSE(adapter->want_write()); } -TEST(NgHttp2AdapterTest, ConnectionErrorOnDataFrameSent) { +TEST_P(NgHttp2AdapterDataTest, ConnectionErrorOnDataFrameSent) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); @@ -3705,11 +3716,12 @@ TEST(NgHttp2AdapterTest, ConnectionErrorOnDataFrameSent) { const int64_t read_result = adapter->ProcessBytes(frames); EXPECT_EQ(static_cast(read_result), frames.size()); - auto body = std::make_unique(visitor, true); - body->AppendPayload("Here is some data, which will lead to a fatal error"); - TestDataFrameSource* body_ptr = body.get(); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + auto body = std::make_unique(visitor, 1); + visitor.AppendPayloadForStream( + 1, "Here is some data, which will lead to a fatal error"); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(0, submit_result); EXPECT_TRUE(adapter->want_write()); @@ -3727,15 +3739,6 @@ TEST(NgHttp2AdapterTest, ConnectionErrorOnDataFrameSent) { int send_result = adapter->Send(); EXPECT_LT(send_result, 0); - // The test data source got a signal that the first chunk of data was sent - // successfully, so discarded that data internally. However, due to the send - // error, the next Send() from nghttp2 will try to send that exact same data - // again. Without this line appending the exact same data back to the data - // source, the test crashes. It is not clear how the data source would know to - // not discard the data, unless told by the session? This is not intuitive. - body_ptr->AppendPayload( - "Here is some data, which will lead to a fatal error"); - // Apparently nghttp2 retries sending the frames that had failed before. EXPECT_TRUE(adapter->want_write()); EXPECT_CALL(visitor, OnFrameSent(DATA, 1, _, 0x0, 0)); @@ -4087,7 +4090,7 @@ TEST(NgHttp2AdapterTest, ServerHandlesHostHeader) { // Tests the case where the response body is in the progress of being sent while // trailers are queued. -TEST(NgHttp2AdapterTest, ServerSubmitsTrailersWhileDataDeferred) { +TEST_P(NgHttp2AdapterDataTest, ServerSubmitsTrailersWhileDataDeferred) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); @@ -4138,12 +4141,11 @@ TEST(NgHttp2AdapterTest, ServerSubmitsTrailersWhileDataDeferred) { // The body source must indicate that the end of the body is not the end of // the stream. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); - auto* body1_ptr = body1.get(); + visitor.AppendPayloadForStream(1, kBody); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); @@ -4174,8 +4176,8 @@ TEST(NgHttp2AdapterTest, ServerSubmitsTrailersWhileDataDeferred) { visitor.Clear(); // Resuming the stream results in the library wanting to write again. - body1_ptr->AppendPayload(kBody); - body1_ptr->EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, true); adapter->ResumeStream(1); EXPECT_TRUE(adapter->want_write()); @@ -4187,7 +4189,7 @@ TEST(NgHttp2AdapterTest, ServerSubmitsTrailersWhileDataDeferred) { EXPECT_FALSE(adapter->want_write()); } -TEST(NgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStream) { +TEST_P(NgHttp2AdapterDataTest, ServerSubmitsTrailersWithDataEndStream) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); @@ -4224,12 +4226,13 @@ TEST(NgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStream) { // Send a body that will end with the END_STREAM flag. const absl::string_view kBody = "This is an example response body."; - auto body = std::make_unique(visitor, /*has_fin=*/true); - body->AppendPayload(kBody); - body->EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, true); + auto body = std::make_unique(visitor, 1); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(submit_result, 0); const std::vector
trailers = @@ -4255,7 +4258,8 @@ TEST(NgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStream) { SpdyFrameType::HEADERS})); } -TEST(NgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStreamAndDeferral) { +TEST_P(NgHttp2AdapterDataTest, + ServerSubmitsTrailersWithDataEndStreamAndDeferral) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); @@ -4293,12 +4297,12 @@ TEST(NgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStreamAndDeferral) { // Send a body that will end with the END_STREAM flag. Don't end the body here // so that more body can be added later. const absl::string_view kBody = "This is an example response body."; - auto body = std::make_unique(visitor, /*has_fin=*/true); - body->AppendPayload(kBody); - TestDataFrameSource& body_ref = *body; + visitor.AppendPayloadForStream(1, kBody); + auto body = std::make_unique(visitor, 1); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(submit_result, 0); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, 0, ACK_FLAG)); @@ -4321,8 +4325,8 @@ TEST(NgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStreamAndDeferral) { // Add more body and signal the end of data. Resuming the stream should allow // the new body to be sent, though nghttp2 does not send the body. - body_ref.AppendPayload(kBody); - body_ref.EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, false); adapter->ResumeStream(1); // For some reason, nghttp2 drops the new body and goes straight to writing @@ -5226,7 +5230,7 @@ TEST(NgHttpAdapterTest, ServerReceivesGoAway) { EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::HEADERS})); } -TEST(NgHttp2AdapterTest, ServerSubmitResponse) { +TEST_P(NgHttp2AdapterDataTest, ServerSubmitResponse) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); EXPECT_FALSE(adapter->want_write()); @@ -5284,13 +5288,13 @@ TEST(NgHttp2AdapterTest, ServerSubmitResponse) { const absl::string_view kBody = "This is an example response body."; // A data fin is not sent so that the stream remains open, and the flow // control state can be verified. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); + visitor.AppendPayloadForStream(1, kBody); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "404"}, {"x-comment", "I have no idea what you're talking about."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); @@ -5321,7 +5325,7 @@ TEST(NgHttp2AdapterTest, ServerSubmitResponse) { EXPECT_GT(adapter->GetHpackEncoderDynamicTableSize(), 0); } -TEST(NgHttp2AdapterTest, ServerSubmitResponseWithResetFromClient) { +TEST_P(NgHttp2AdapterDataTest, ServerSubmitResponseWithResetFromClient) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); EXPECT_FALSE(adapter->want_write()); @@ -5366,25 +5370,34 @@ TEST(NgHttp2AdapterTest, ServerSubmitResponseWithResetFromClient) { EXPECT_FALSE(adapter->want_write()); const absl::string_view kBody = "This is an example response body."; - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload(kBody); + visitor.AppendPayloadForStream(1, kBody); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "404"}, {"x-comment", "I have no idea what you're talking about."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); + EXPECT_EQ(adapter->sources_size(), GetParam() ? 0 : 1); // Client resets the stream before the server can send the response. const std::string reset = TestFrameSequence().RstStream(1, Http2ErrorCode::CANCEL).Serialize(); EXPECT_CALL(visitor, OnFrameHeader(1, 4, RST_STREAM, 0)); EXPECT_CALL(visitor, OnRstStream(1, Http2ErrorCode::CANCEL)); - EXPECT_CALL(visitor, OnCloseStream(1, Http2ErrorCode::CANCEL)); + EXPECT_CALL(visitor, OnCloseStream(1, Http2ErrorCode::CANCEL)) + .WillOnce( + [&adapter](Http2StreamId stream_id, Http2ErrorCode /*error_code*/) { + adapter->RemoveStream(stream_id); + return true; + }); const int64_t reset_result = adapter->ProcessBytes(reset); EXPECT_EQ(reset.size(), static_cast(reset_result)); + // The stream's data source is dropped. + EXPECT_EQ(adapter->sources_size(), 0); + // Outbound HEADERS and DATA are dropped. EXPECT_CALL(visitor, OnBeforeFrameSent(HEADERS, 1, _, _)).Times(0); EXPECT_CALL(visitor, OnFrameSent(HEADERS, 1, _, _, _)).Times(0); @@ -5444,7 +5457,7 @@ TEST(NgHttp2AdapterTest, ServerSendsShutdown) { EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY})); } -TEST(NgHttp2AdapterTest, ServerSendsTrailers) { +TEST_P(NgHttp2AdapterDataTest, ServerSendsTrailers) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); EXPECT_FALSE(adapter->want_write()); @@ -5493,12 +5506,12 @@ TEST(NgHttp2AdapterTest, ServerSendsTrailers) { // The body source must indicate that the end of the body is not the end of // the stream. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); - body1->EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, false); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); @@ -5627,7 +5640,7 @@ TEST(NgHttp2AdapterTest, ClientSendsMetadataWithContinuation) { absl::StrJoin(visitor.GetMetadata(1), "")); } -TEST(NgHttp2AdapterTest, RepeatedHeaderNames) { +TEST_P(NgHttp2AdapterDataTest, RepeatedHeaderNames) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); EXPECT_FALSE(adapter->want_write()); @@ -5667,12 +5680,12 @@ TEST(NgHttp2AdapterTest, RepeatedHeaderNames) { const std::vector
headers1 = ToHeaders( {{":status", "200"}, {"content-length", "10"}, {"content-length", "10"}}); - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload("perfection"); - body1->EndData(); + visitor.AppendPayloadForStream(1, "perfection"); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); - int submit_result = - adapter->SubmitResponse(1, headers1, std::move(body1), false); + int submit_result = adapter->SubmitResponse( + 1, headers1, GetParam() ? nullptr : std::move(body1), false); ASSERT_EQ(0, submit_result); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x1)); @@ -5689,7 +5702,7 @@ TEST(NgHttp2AdapterTest, RepeatedHeaderNames) { SpdyFrameType::DATA})); } -TEST(NgHttp2AdapterTest, ServerRespondsToRequestWithTrailers) { +TEST_P(NgHttp2AdapterDataTest, ServerRespondsToRequestWithTrailers) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); EXPECT_FALSE(adapter->want_write()); @@ -5726,11 +5739,10 @@ TEST(NgHttp2AdapterTest, ServerRespondsToRequestWithTrailers) { EXPECT_EQ(frames.size(), static_cast(result)); const std::vector
headers1 = ToHeaders({{":status", "200"}}); - auto body1 = std::make_unique(visitor, true); - TestDataFrameSource* body1_ptr = body1.get(); + auto body1 = std::make_unique(visitor, 1); - int submit_result = - adapter->SubmitResponse(1, headers1, std::move(body1), false); + int submit_result = adapter->SubmitResponse( + 1, headers1, GetParam() ? nullptr : std::move(body1), false); ASSERT_EQ(0, submit_result); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x1)); @@ -5760,7 +5772,7 @@ TEST(NgHttp2AdapterTest, ServerRespondsToRequestWithTrailers) { result = adapter->ProcessBytes(more_frames); EXPECT_EQ(more_frames.size(), static_cast(result)); - body1_ptr->EndData(); + visitor.SetEndData(1, true); EXPECT_EQ(true, adapter->ResumeStream(1)); EXPECT_CALL(visitor, OnFrameSent(DATA, 1, 0, 0x1, 0)); @@ -5771,7 +5783,7 @@ TEST(NgHttp2AdapterTest, ServerRespondsToRequestWithTrailers) { EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::DATA})); } -TEST(NgHttp2AdapterTest, ServerSubmitsResponseWithDataSourceError) { +TEST_P(NgHttp2AdapterDataTest, ServerSubmitsResponseWithDataSourceError) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); EXPECT_FALSE(adapter->want_write()); @@ -5804,11 +5816,12 @@ TEST(NgHttp2AdapterTest, ServerSubmitsResponseWithDataSourceError) { const int64_t result = adapter->ProcessBytes(frames); EXPECT_EQ(frames.size(), static_cast(result)); - auto body1 = std::make_unique(visitor, false); - body1->SimulateError(); + visitor.SimulateError(1); + auto body1 = std::make_unique(visitor, 1); + int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); @@ -6001,7 +6014,7 @@ TEST(NgHttp2AdapterTest, ServerHandlesMultipleContentLength) { EXPECT_EQ(frames.size(), static_cast(result)); } -TEST(NgHttp2AdapterTest, ServerSendsInvalidTrailers) { +TEST_P(NgHttp2AdapterDataTest, ServerSendsInvalidTrailers) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); EXPECT_FALSE(adapter->want_write()); @@ -6038,12 +6051,12 @@ TEST(NgHttp2AdapterTest, ServerSendsInvalidTrailers) { // The body source must indicate that the end of the body is not the end of // the stream. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); - body1->EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, false); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); @@ -6856,7 +6869,7 @@ TEST(NgHttp2AdapterTest, ServerAllowsProtocolPseudoheaderAfterAck) { EXPECT_FALSE(adapter->want_write()); } -TEST(NgHttp2AdapterTest, SkipsSendingFramesForRejectedStream) { +TEST_P(NgHttp2AdapterDataTest, SkipsSendingFramesForRejectedStream) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); @@ -6886,11 +6899,13 @@ TEST(NgHttp2AdapterTest, SkipsSendingFramesForRejectedStream) { const int64_t initial_result = adapter->ProcessBytes(initial_frames); EXPECT_EQ(static_cast(initial_result), initial_frames.size()); - auto body = std::make_unique(visitor, true); - body->AppendPayload("Here is some data, which will be completely ignored!"); + visitor.AppendPayloadForStream( + 1, "Here is some data, which will be completely ignored!"); + auto body = std::make_unique(visitor, 1); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(0, submit_result); auto source = std::make_unique(ToHeaderBlock(ToHeaders( @@ -6924,7 +6939,7 @@ TEST(NgHttp2AdapterTest, SkipsSendingFramesForRejectedStream) { SpdyFrameType::RST_STREAM})); } -TEST(NgHttp2AdapterTest, ServerQueuesMetadataWithStreamReset) { +TEST_P(NgHttp2AdapterDataTest, ServerQueuesMetadataWithStreamReset) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); @@ -6953,11 +6968,13 @@ TEST(NgHttp2AdapterTest, ServerQueuesMetadataWithStreamReset) { const int64_t initial_result = adapter->ProcessBytes(initial_frames); EXPECT_EQ(static_cast(initial_result), initial_frames.size()); - auto body = std::make_unique(visitor, true); - body->AppendPayload("Here is some data, which will be completely ignored!"); + visitor.AppendPayloadForStream( + 1, "Here is some data, which will be completely ignored!"); + auto body = std::make_unique(visitor, 1); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(0, submit_result); auto source = std::make_unique(ToHeaderBlock(ToHeaders( @@ -7070,7 +7087,7 @@ TEST(NgHttp2AdapterTest, ConnectionErrorWithBlackholeSinkingData) { EXPECT_EQ(static_cast(next_result), next_frame.size()); } -TEST(NgHttp2AdapterTest, ServerDoesNotSendFramesAfterImmediateGoAway) { +TEST_P(NgHttp2AdapterDataTest, ServerDoesNotSendFramesAfterImmediateGoAway) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); @@ -7103,10 +7120,11 @@ TEST(NgHttp2AdapterTest, ServerDoesNotSendFramesAfterImmediateGoAway) { EXPECT_EQ(static_cast(read_result), frames.size()); // Submit a response for the stream. - auto body = std::make_unique(visitor, true); - body->AppendPayload("This data is doomed to never be written."); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + visitor.AppendPayloadForStream(1, "This data is doomed to never be written."); + auto body = std::make_unique(visitor, 1); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(0, submit_result); // Submit a WINDOW_UPDATE frame. @@ -7752,7 +7770,7 @@ TEST(OgHttp2AdapterTest, ServerConsumesDataWithPadding) { SpdyFrameType::WINDOW_UPDATE})); } -TEST(NgHttp2AdapterTest, NegativeFlowControlStreamResumption) { +TEST_P(NgHttp2AdapterDataTest, NegativeFlowControlStreamResumption) { TestVisitor visitor; auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor); @@ -7791,11 +7809,11 @@ TEST(NgHttp2AdapterTest, NegativeFlowControlStreamResumption) { EXPECT_EQ(static_cast(read_result), frames.size()); // Submit a response for the stream. - auto body = std::make_unique(visitor, true); - TestDataFrameSource& body_ref = *body; - body_ref.AppendPayload(std::string(70000, 'a')); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + visitor.AppendPayloadForStream(1, std::string(70000, 'a')); + auto body = std::make_unique(visitor, 1); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(0, submit_result); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x1)); @@ -7823,7 +7841,7 @@ TEST(NgHttp2AdapterTest, NegativeFlowControlStreamResumption) { // nghttp2 does not expose the fact that the send window size is negative. EXPECT_EQ(adapter->GetStreamSendWindowSize(1), 0); - body_ref.AppendPayload("Stream should be resumed."); + visitor.AppendPayloadForStream(1, "Stream should be resumed."); adapter->ResumeStream(1); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x1)); diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_callbacks.cc b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_callbacks.cc index 16bb8e6a39..8c30338925 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_callbacks.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_callbacks.cc @@ -2,6 +2,7 @@ #include #include +#include #include "absl/strings/string_view.h" #include "quiche/http2/adapter/data_source.h" @@ -358,7 +359,8 @@ int OnError(nghttp2_session* /*session*/, int /*lib_error_code*/, return 0; } -nghttp2_session_callbacks_unique_ptr Create() { +nghttp2_session_callbacks_unique_ptr Create( + nghttp2_send_data_callback send_data_callback) { nghttp2_session_callbacks* callbacks; nghttp2_session_callbacks_new(&callbacks); @@ -386,8 +388,8 @@ nghttp2_session_callbacks_unique_ptr Create() { nghttp2_session_callbacks_set_on_invalid_frame_recv_callback( callbacks, &OnInvalidFrameReceived); nghttp2_session_callbacks_set_error_callback2(callbacks, &OnError); - nghttp2_session_callbacks_set_send_data_callback( - callbacks, &DataFrameSourceSendCallback); + nghttp2_session_callbacks_set_send_data_callback(callbacks, + send_data_callback); #if NGHTTP2_VERSION_NUM >= 0x013c00 nghttp2_session_callbacks_set_pack_extension_callback2( callbacks, &OnPackExtensionCallback); diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_callbacks.h b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_callbacks.h index bee44d5a88..6323b66b9a 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_callbacks.h +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_callbacks.h @@ -91,7 +91,8 @@ OnPackExtensionCallback(nghttp2_session* session, uint8_t* buf, int OnError(nghttp2_session* session, int lib_error_code, const char* msg, size_t len, void* user_data); -nghttp2_session_callbacks_unique_ptr Create(); +nghttp2_session_callbacks_unique_ptr Create( + nghttp2_send_data_callback send_data_callback); } // namespace callbacks } // namespace adapter diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider.cc b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider.cc index f41d20901e..5c57244429 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider.cc @@ -9,8 +9,28 @@ namespace http2 { namespace adapter { namespace callbacks { -namespace { -const size_t kFrameHeaderSize = 9; +#if NGHTTP2_VERSION_NUM >= 0x013c00 +nghttp2_ssize +#else +ssize_t +#endif +VisitorReadCallback(Http2VisitorInterface& visitor, int32_t stream_id, + size_t max_length, uint32_t* data_flags) { + *data_flags |= NGHTTP2_DATA_FLAG_NO_COPY; + auto [payload_length, end_data, end_stream] = + visitor.OnReadyToSendDataForStream(stream_id, max_length); + if (payload_length == 0 && !end_data) { + return NGHTTP2_ERR_DEFERRED; + } else if (payload_length == DataFrameSource::kError) { + return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE; + } + if (end_data) { + *data_flags |= NGHTTP2_DATA_FLAG_EOF; + } + if (!end_stream) { + *data_flags |= NGHTTP2_DATA_FLAG_NO_END_STREAM; + } + return payload_length; } #if NGHTTP2_VERSION_NUM >= 0x013c00 @@ -18,14 +38,10 @@ nghttp2_ssize #else ssize_t #endif -DataFrameSourceReadCallback(nghttp2_session* /* session */, - int32_t /* stream_id */, uint8_t* /* buf */, - size_t length, uint32_t* data_flags, - nghttp2_data_source* source, - void* /* user_data */) { +DataFrameSourceReadCallback(DataFrameSource& source, size_t length, + uint32_t* data_flags) { *data_flags |= NGHTTP2_DATA_FLAG_NO_COPY; - auto* frame_source = static_cast(source->ptr); - auto [result_length, done] = frame_source->SelectPayloadLength(length); + auto [result_length, done] = source.SelectPayloadLength(length); if (result_length == 0 && !done) { return NGHTTP2_ERR_DEFERRED; } else if (result_length == DataFrameSource::kError) { @@ -34,42 +50,12 @@ DataFrameSourceReadCallback(nghttp2_session* /* session */, if (done) { *data_flags |= NGHTTP2_DATA_FLAG_EOF; } - if (!frame_source->send_fin()) { + if (!source.send_fin()) { *data_flags |= NGHTTP2_DATA_FLAG_NO_END_STREAM; } return result_length; } -int DataFrameSourceSendCallback(nghttp2_session* /* session */, - nghttp2_frame* /* frame */, - const uint8_t* framehd, size_t length, - nghttp2_data_source* source, - void* /* user_data */) { - auto* frame_source = static_cast(source->ptr); - frame_source->Send(ToStringView(framehd, kFrameHeaderSize), length); - return 0; -} - } // namespace callbacks - -#if NGHTTP2_VERSION_NUM >= 0x013c00 -std::unique_ptr MakeDataProvider( -#else -std::unique_ptr MakeDataProvider( -#endif - DataFrameSource* source) { - if (source == nullptr) { - return nullptr; - } -#if NGHTTP2_VERSION_NUM >= 0x013c00 - auto provider = std::make_unique(); -#else - auto provider = std::make_unique(); -#endif - provider->source.ptr = source; - provider->read_callback = &callbacks::DataFrameSourceReadCallback; - return provider; -} - } // namespace adapter } // namespace http2 diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider.h b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider.h index f165ac591a..9aa3ef335b 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider.h +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider.h @@ -5,44 +5,34 @@ #include #include "quiche/http2/adapter/data_source.h" +#include "quiche/http2/adapter/http2_visitor_interface.h" #include "quiche/http2/adapter/nghttp2.h" namespace http2 { namespace adapter { namespace callbacks { -// Assumes |source| is a DataFrameSource. +// A callback that returns DATA frame payload size and associated flags, given a +// Http2VisitorInterface. #if NGHTTP2_VERSION_NUM >= 0x013c00 nghttp2_ssize #else ssize_t #endif -DataFrameSourceReadCallback(nghttp2_session* /*session */, - int32_t /* stream_id */, uint8_t* /* buf */, - size_t length, uint32_t* data_flags, - nghttp2_data_source* source, - void* /* user_data */); +VisitorReadCallback(Http2VisitorInterface& visitor, int32_t stream_id, + size_t max_length, uint32_t* data_flags); -int DataFrameSourceSendCallback(nghttp2_session* /* session */, - nghttp2_frame* /* frame */, - const uint8_t* framehd, size_t length, - nghttp2_data_source* source, - void* /* user_data */); +// A callback that returns DATA frame payload size and associated flags, given a +// DataFrameSource. +#if NGHTTP2_VERSION_NUM >= 0x013c00 +nghttp2_ssize +#else +ssize_t +#endif +DataFrameSourceReadCallback(DataFrameSource& source, size_t length, + uint32_t* data_flags); } // namespace callbacks - -#if NGHTTP2_VERSION_NUM >= 0x013c00 -// Transforms a DataFrameSource into a nghttp2_data_provider2. Does not take -// ownership of |source|. Returns nullptr if |source| is nullptr. -std::unique_ptr MakeDataProvider( - DataFrameSource* source); -#else -// Transforms a DataFrameSource into a nghttp2_data_provider. Does not take -// ownership of |source|. Returns nullptr if |source| is nullptr. -std::unique_ptr MakeDataProvider( - DataFrameSource* source); -#endif - } // namespace adapter } // namespace http2 diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider_test.cc index 981403258e..6ebc8b9b93 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_data_provider_test.cc @@ -1,5 +1,6 @@ #include "quiche/http2/adapter/nghttp2_data_provider.h" +#include "quiche/http2/adapter/nghttp2_util.h" #include "quiche/http2/adapter/test_utils.h" #include "quiche/common/platform/api/quiche_test.h" @@ -9,104 +10,175 @@ namespace test { const size_t kFrameHeaderSize = 9; -// Verifies that a nghttp2_data_provider derived from a DataFrameSource works -// correctly with nghttp2-style callbacks when the amount of data read is less -// than what the source provides. -TEST(DataProviderTest, ReadLessThanSourceProvides) { - TestVisitor visitor; - TestDataFrameSource source(visitor, true); - source.AppendPayload("Example payload"); - source.EndData(); - auto provider = MakeDataProvider(&source); - uint32_t data_flags = 0; +// Verifies that the DataFrameSource read callback works correctly when the +// amount of data read is less than what the source provides. +TEST(DataFrameSourceTest, ReadLessThanSourceProvides) { const int32_t kStreamId = 1; + TestVisitor visitor; + visitor.AppendPayloadForStream(kStreamId, "Example payload"); + visitor.SetEndData(kStreamId, true); + VisitorDataSource source(visitor, kStreamId); + uint32_t data_flags = 0; const size_t kReadLength = 10; // Read callback selects a payload length given an upper bound. ssize_t result = - provider->read_callback(nullptr, kStreamId, nullptr, kReadLength, - &data_flags, &provider->source, nullptr); + callbacks::DataFrameSourceReadCallback(source, kReadLength, &data_flags); ASSERT_EQ(kReadLength, result); - EXPECT_EQ(NGHTTP2_DATA_FLAG_NO_COPY, data_flags); + EXPECT_EQ(NGHTTP2_DATA_FLAG_NO_COPY | NGHTTP2_DATA_FLAG_NO_END_STREAM, + data_flags); const uint8_t framehd[kFrameHeaderSize] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // Sends the frame header and some payload bytes. - int send_result = callbacks::DataFrameSourceSendCallback( - nullptr, nullptr, framehd, result, &provider->source, nullptr); - EXPECT_EQ(0, send_result); + source.Send(ToStringView(framehd, kFrameHeaderSize), result); // Data accepted by the visitor includes a frame header and kReadLength bytes // of payload. EXPECT_EQ(visitor.data().size(), kFrameHeaderSize + kReadLength); } -// Verifies that a nghttp2_data_provider derived from a DataFrameSource works -// correctly with nghttp2-style callbacks when the amount of data read is more -// than what the source provides. -TEST(DataProviderTest, ReadMoreThanSourceProvides) { - TestVisitor visitor; - const absl::string_view kPayload = "Example payload"; - TestDataFrameSource source(visitor, true); - source.AppendPayload(kPayload); - source.EndData(); - auto provider = MakeDataProvider(&source); - uint32_t data_flags = 0; +// Verifies that the Visitor read callback works correctly when the amount of +// data read is less than what the source provides. +TEST(VisitorTest, ReadLessThanSourceProvides) { const int32_t kStreamId = 1; + TestVisitor visitor; + visitor.AppendPayloadForStream(kStreamId, "Example payload"); + visitor.SetEndData(kStreamId, true); + uint32_t data_flags = 0; + const size_t kReadLength = 10; + // Read callback selects a payload length given an upper bound. + ssize_t result = callbacks::VisitorReadCallback(visitor, kStreamId, + kReadLength, &data_flags); + ASSERT_EQ(kReadLength, result); + EXPECT_EQ(NGHTTP2_DATA_FLAG_NO_COPY | NGHTTP2_DATA_FLAG_NO_END_STREAM, + data_flags); + + const uint8_t framehd[kFrameHeaderSize] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; + // Sends the frame header and some payload bytes. + visitor.SendDataFrame(kStreamId, ToStringView(framehd, kFrameHeaderSize), + result); + // Data accepted by the visitor includes a frame header and kReadLength bytes + // of payload. + EXPECT_EQ(visitor.data().size(), kFrameHeaderSize + kReadLength); +} + +// Verifies that the DataFrameSource read callback works correctly when the +// amount of data read is more than what the source provides. +TEST(DataFrameSourceTest, ReadMoreThanSourceProvides) { + const int32_t kStreamId = 1; + const absl::string_view kPayload = "Example payload"; + TestVisitor visitor; + visitor.AppendPayloadForStream(kStreamId, kPayload); + visitor.SetEndData(kStreamId, true); + VisitorDataSource source(visitor, kStreamId); + uint32_t data_flags = 0; const size_t kReadLength = 30; // Read callback selects a payload length given an upper bound. ssize_t result = - provider->read_callback(nullptr, kStreamId, nullptr, kReadLength, - &data_flags, &provider->source, nullptr); + callbacks::DataFrameSourceReadCallback(source, kReadLength, &data_flags); ASSERT_EQ(kPayload.size(), result); EXPECT_EQ(NGHTTP2_DATA_FLAG_NO_COPY | NGHTTP2_DATA_FLAG_EOF, data_flags); const uint8_t framehd[kFrameHeaderSize] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // Sends the frame header and some payload bytes. - int send_result = callbacks::DataFrameSourceSendCallback( - nullptr, nullptr, framehd, result, &provider->source, nullptr); - EXPECT_EQ(0, send_result); + source.Send(ToStringView(framehd, kFrameHeaderSize), result); // Data accepted by the visitor includes a frame header and the entire // payload. EXPECT_EQ(visitor.data().size(), kFrameHeaderSize + kPayload.size()); } -// Verifies that a nghttp2_data_provider derived from a DataFrameSource works -// correctly with nghttp2-style callbacks when the source is blocked. -TEST(DataProviderTest, ReadFromBlockedSource) { +// Verifies that the Visitor read callback works correctly when the amount of +// data read is more than what the source provides. +TEST(VisitorTest, ReadMoreThanSourceProvides) { + const int32_t kStreamId = 1; + const absl::string_view kPayload = "Example payload"; + TestVisitor visitor; + visitor.AppendPayloadForStream(kStreamId, kPayload); + visitor.SetEndData(kStreamId, true); + VisitorDataSource source(visitor, kStreamId); + uint32_t data_flags = 0; + const size_t kReadLength = 30; + // Read callback selects a payload length given an upper bound. + ssize_t result = callbacks::VisitorReadCallback(visitor, kStreamId, + kReadLength, &data_flags); + ASSERT_EQ(kPayload.size(), result); + EXPECT_EQ(NGHTTP2_DATA_FLAG_NO_COPY | NGHTTP2_DATA_FLAG_EOF, data_flags); + + const uint8_t framehd[kFrameHeaderSize] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; + // Sends the frame header and some payload bytes. + visitor.SendDataFrame(kStreamId, ToStringView(framehd, kFrameHeaderSize), + result); + // Data accepted by the visitor includes a frame header and the entire + // payload. + EXPECT_EQ(visitor.data().size(), kFrameHeaderSize + kPayload.size()); +} + +// Verifies that the DataFrameSource read callback works correctly when the +// source is blocked. +TEST(DataFrameSourceTest, ReadFromBlockedSource) { + const int32_t kStreamId = 1; TestVisitor visitor; // Source has no payload, but also no fin, so it's blocked. - TestDataFrameSource source(visitor, false); - auto provider = MakeDataProvider(&source); + VisitorDataSource source(visitor, kStreamId); uint32_t data_flags = 0; - const int32_t kStreamId = 1; const size_t kReadLength = 10; ssize_t result = - provider->read_callback(nullptr, kStreamId, nullptr, kReadLength, - &data_flags, &provider->source, nullptr); + callbacks::DataFrameSourceReadCallback(source, kReadLength, &data_flags); // Read operation is deferred, since the source is blocked. EXPECT_EQ(NGHTTP2_ERR_DEFERRED, result); } -// Verifies that a nghttp2_data_provider derived from a DataFrameSource works -// correctly with nghttp2-style callbacks when the source provides only fin and -// no data. -TEST(DataProviderTest, ReadFromZeroLengthSource) { - TestVisitor visitor; - // Empty payload and fin=true indicates the source is done. - TestDataFrameSource source(visitor, true); - source.EndData(); - auto provider = MakeDataProvider(&source); - uint32_t data_flags = 0; +// Verifies that the Visitor read callback works correctly when the source is +// blocked. +TEST(VisitorTest, ReadFromBlockedSource) { const int32_t kStreamId = 1; + TestVisitor visitor; + // Stream has no payload, but also no fin, so it's blocked. + uint32_t data_flags = 0; + const size_t kReadLength = 10; + ssize_t result = callbacks::VisitorReadCallback(visitor, kStreamId, + kReadLength, &data_flags); + // Read operation is deferred, since the source is blocked. + EXPECT_EQ(NGHTTP2_ERR_DEFERRED, result); +} + +// Verifies that the DataFrameSource read callback works correctly when the +// source provides only fin and no data. +TEST(DataFrameSourceTest, ReadFromZeroLengthSource) { + const int32_t kStreamId = 1; + TestVisitor visitor; + visitor.SetEndData(kStreamId, true); + // Empty payload and fin=true indicates the source is done. + VisitorDataSource source(visitor, kStreamId); + uint32_t data_flags = 0; const size_t kReadLength = 10; ssize_t result = - provider->read_callback(nullptr, kStreamId, nullptr, kReadLength, - &data_flags, &provider->source, nullptr); + callbacks::DataFrameSourceReadCallback(source, kReadLength, &data_flags); ASSERT_EQ(0, result); EXPECT_EQ(NGHTTP2_DATA_FLAG_NO_COPY | NGHTTP2_DATA_FLAG_EOF, data_flags); const uint8_t framehd[kFrameHeaderSize] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; - int send_result = callbacks::DataFrameSourceSendCallback( - nullptr, nullptr, framehd, result, &provider->source, nullptr); - EXPECT_EQ(0, send_result); + source.Send(ToStringView(framehd, kFrameHeaderSize), result); + // Data accepted by the visitor includes a frame header with fin and zero + // bytes of payload. + EXPECT_EQ(visitor.data().size(), kFrameHeaderSize); +} + +// Verifies that the Visitor read callback works correctly when the source +// provides only fin and no data. +TEST(VisitorTest, ReadFromZeroLengthSource) { + const int32_t kStreamId = 1; + TestVisitor visitor; + // Empty payload and fin=true indicates the source is done. + visitor.SetEndData(kStreamId, true); + uint32_t data_flags = 0; + const size_t kReadLength = 10; + ssize_t result = callbacks::VisitorReadCallback(visitor, kStreamId, + kReadLength, &data_flags); + ASSERT_EQ(0, result); + EXPECT_EQ(NGHTTP2_DATA_FLAG_NO_COPY | NGHTTP2_DATA_FLAG_EOF, data_flags); + + const uint8_t framehd[kFrameHeaderSize] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; + visitor.SendDataFrame(kStreamId, ToStringView(framehd, kFrameHeaderSize), + result); // Data accepted by the visitor includes a frame header with fin and zero // bytes of payload. EXPECT_EQ(visitor.data().size(), kFrameHeaderSize); diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_session_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_session_test.cc index ab3f3378da..3e60a9f78a 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_session_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_session_test.cc @@ -1,5 +1,8 @@ #include "quiche/http2/adapter/nghttp2_session.h" +#include +#include + #include "quiche/http2/adapter/mock_http2_visitor.h" #include "quiche/http2/adapter/nghttp2_callbacks.h" #include "quiche/http2/adapter/nghttp2_util.h" @@ -37,7 +40,7 @@ class NgHttp2SessionTest : public quiche::test::QuicheTest { void TearDown() override { nghttp2_option_del(options_); } nghttp2_session_callbacks_unique_ptr CreateCallbacks() { - nghttp2_session_callbacks_unique_ptr callbacks = callbacks::Create(); + nghttp2_session_callbacks_unique_ptr callbacks = callbacks::Create(nullptr); return callbacks; } diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_test.cc index e38c193079..e117077ebf 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_test.cc @@ -1,5 +1,9 @@ #include "quiche/http2/adapter/nghttp2.h" +#include +#include +#include + #include "absl/strings/str_cat.h" #include "quiche/http2/adapter/mock_nghttp2_callbacks.h" #include "quiche/http2/adapter/nghttp2_test_utils.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_test_utils.cc b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_test_utils.cc index 0de00d85d3..4c835d455d 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_test_utils.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_test_utils.cc @@ -1,5 +1,9 @@ #include "quiche/http2/adapter/nghttp2_test_utils.h" +#include +#include +#include + #include "quiche/http2/adapter/nghttp2_util.h" #include "quiche/common/quiche_endian.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.cc b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.cc index 0d5dc5e41d..7e252cc86b 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.cc @@ -1,7 +1,11 @@ #include "quiche/http2/adapter/nghttp2_util.h" #include +#include #include +#include +#include +#include #include "absl/strings/str_join.h" #include "absl/strings/string_view.h" @@ -161,8 +165,13 @@ InvalidFrameError ToInvalidFrameError(int error) { class Nghttp2DataFrameSource : public DataFrameSource { public: +#if NGHTTP2_VERSION_NUM >= 0x013c00 + Nghttp2DataFrameSource(nghttp2_data_provider2 provider, + nghttp2_send_data_callback send_data, void* user_data) +#else Nghttp2DataFrameSource(nghttp2_data_provider provider, nghttp2_send_data_callback send_data, void* user_data) +#endif : provider_(std::move(provider)), send_data_(std::move(send_data)), user_data_(user_data) {} @@ -207,15 +216,25 @@ class Nghttp2DataFrameSource : public DataFrameSource { bool send_fin() const override { return send_fin_; } private: +#if NGHTTP2_VERSION_NUM >= 0x013c00 + nghttp2_data_provider2 provider_; +#else nghttp2_data_provider provider_; +#endif nghttp2_send_data_callback send_data_; void* user_data_; bool send_fin_ = false; }; +#if NGHTTP2_VERSION_NUM >= 0x013c00 +std::unique_ptr MakeZeroCopyDataFrameSource( + nghttp2_data_provider2 provider, void* user_data, + nghttp2_send_data_callback send_data) { +#else std::unique_ptr MakeZeroCopyDataFrameSource( nghttp2_data_provider provider, void* user_data, nghttp2_send_data_callback send_data) { +#endif return std::make_unique( std::move(provider), std::move(send_data), user_data); } diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.h b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.h index 423ad1bb7c..aea0737beb 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.h +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.h @@ -64,9 +64,15 @@ Http2VisitorInterface::InvalidFrameError ToInvalidFrameError(int error); // Transforms a nghttp2_data_provider into a DataFrameSource. Assumes that // |provider| uses the zero-copy nghttp2_data_source_read_callback API. Unsafe // otherwise. +#if NGHTTP2_VERSION_NUM >= 0x013c00 +std::unique_ptr MakeZeroCopyDataFrameSource( + nghttp2_data_provider2 provider, void* user_data, + nghttp2_send_data_callback send_data); +#else std::unique_ptr MakeZeroCopyDataFrameSource( nghttp2_data_provider provider, void* user_data, nghttp2_send_data_callback send_data); +#endif void LogBeforeSend(const nghttp2_frame& frame); diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util_test.cc index 9ac6ef6879..69b85f5f0d 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/nghttp2_util_test.cc @@ -1,5 +1,8 @@ #include "quiche/http2/adapter/nghttp2_util.h" +#include +#include + #include "quiche/http2/adapter/nghttp2_test_utils.h" #include "quiche/http2/adapter/test_utils.h" #include "quiche/common/platform/api/quiche_test.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/noop_header_validator.cc b/yass/third_party/quiche/src/quiche/http2/adapter/noop_header_validator.cc index f39342d5bc..81c1d8a18f 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/noop_header_validator.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/noop_header_validator.cc @@ -1,5 +1,7 @@ #include "quiche/http2/adapter/noop_header_validator.h" +#include + #include "absl/strings/escaping.h" #include "quiche/common/platform/api/quiche_logging.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/noop_header_validator_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/noop_header_validator_test.cc index 65cc763399..000c2df0db 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/noop_header_validator_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/noop_header_validator_test.cc @@ -1,5 +1,6 @@ #include "quiche/http2/adapter/noop_header_validator.h" +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.cc b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.cc index e232307a9e..998e309864 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.cc @@ -1,6 +1,8 @@ #include "quiche/http2/adapter/oghttp2_adapter.h" #include +#include +#include #include "absl/memory/memory.h" #include "absl/strings/str_cat.h" @@ -134,7 +136,6 @@ int32_t OgHttp2Adapter::SubmitRequest( absl::Span headers, std::unique_ptr data_source, bool end_stream, void* user_data) { - QUICHE_DCHECK_EQ(end_stream, data_source == nullptr); return session_->SubmitRequest(headers, std::move(data_source), end_stream, user_data); } @@ -143,7 +144,6 @@ int OgHttp2Adapter::SubmitResponse(Http2StreamId stream_id, absl::Span headers, std::unique_ptr data_source, bool end_stream) { - QUICHE_DCHECK_EQ(end_stream, data_source == nullptr); return session_->SubmitResponse(stream_id, headers, std::move(data_source), end_stream); } diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_metadata_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_metadata_test.cc index 6928bcd6b8..e09a6814be 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_metadata_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_metadata_test.cc @@ -1,14 +1,14 @@ -#include "quiche/http2/adapter/oghttp2_adapter.h" - #include #include #include +#include #include #include "absl/strings/str_join.h" #include "quiche/http2/adapter/http2_protocol.h" #include "quiche/http2/adapter/http2_visitor_interface.h" #include "quiche/http2/adapter/mock_http2_visitor.h" +#include "quiche/http2/adapter/oghttp2_adapter.h" #include "quiche/http2/adapter/oghttp2_util.h" #include "quiche/http2/adapter/test_frame_sequence.h" #include "quiche/http2/adapter/test_utils.h" @@ -366,13 +366,13 @@ TEST(OgHttp2AdapterTest, ClientSendsMetadataAfterFlowControlBlock) { {":path", "/this/is/request/one"}}); const std::string kBody = std::string(100 * 1024, 'a'); - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); - body1->EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, false); + auto body1 = std::make_unique(visitor, 1); const int32_t stream_id1 = adapter->SubmitRequest(headers1, std::move(body1), false, nullptr); - ASSERT_GT(stream_id1, 0); + ASSERT_EQ(stream_id1, 1); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0)); @@ -580,9 +580,9 @@ TEST(OgHttp2AdapterTest, ServerQueuesMetadataThenTrailers) { // The body source must indicate that the end of the body is not the end of // the stream. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); - body1->EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, false); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}), std::move(body1), false); diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_test.cc index 05d7f6de0f..a854e4d0d7 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_test.cc @@ -1,6 +1,7 @@ #include "quiche/http2/adapter/oghttp2_adapter.h" #include +#include #include #include #include @@ -1402,7 +1403,12 @@ TEST(OgHttp2AdapterTest, ClientHandlesTrailers) { EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); } -TEST(OgHttp2AdapterTest, ClientSendsTrailers) { +class OgHttp2AdapterDataTest : public quiche::test::QuicheTestWithParam { +}; + +INSTANTIATE_TEST_SUITE_P(BothValues, OgHttp2AdapterDataTest, testing::Bool()); + +TEST_P(OgHttp2AdapterDataTest, ClientSendsTrailers) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kClient; @@ -1417,13 +1423,13 @@ TEST(OgHttp2AdapterTest, ClientSendsTrailers) { {":path", "/this/is/request/one"}}); const std::string kBody = "This is an example request body."; - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); - body1->EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, false); + auto body1 = std::make_unique(visitor, 1); - const int32_t stream_id1 = - adapter->SubmitRequest(headers1, std::move(body1), false, nullptr); - ASSERT_GT(stream_id1, 0); + const int32_t stream_id1 = adapter->SubmitRequest( + headers1, GetParam() ? nullptr : std::move(body1), false, nullptr); + ASSERT_EQ(stream_id1, 1); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0)); @@ -2626,7 +2632,7 @@ TEST(OgHttp2AdapterTest, ClientRejects101Response) { SpdyFrameType::RST_STREAM})); } -TEST(OgHttp2AdapterTest, ClientObeysMaxConcurrentStreams) { +TEST_P(OgHttp2AdapterDataTest, ClientObeysMaxConcurrentStreams) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kClient; @@ -2676,16 +2682,16 @@ TEST(OgHttp2AdapterTest, ClientObeysMaxConcurrentStreams) { visitor.Clear(); const std::string kBody = "This is an example request body."; - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload(kBody); - body1->EndData(); - const int stream_id = - adapter->SubmitRequest(ToHeaders({{":method", "POST"}, - {":scheme", "http"}, - {":authority", "example.com"}, - {":path", "/this/is/request/one"}}), - std::move(body1), false, nullptr); - EXPECT_GT(stream_id, 0); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); + const int stream_id = adapter->SubmitRequest( + ToHeaders({{":method", "POST"}, + {":scheme", "http"}, + {":authority", "example.com"}, + {":path", "/this/is/request/one"}}), + GetParam() ? nullptr : std::move(body1), false, nullptr); + ASSERT_EQ(stream_id, 1); EXPECT_TRUE(adapter->want_write()); EXPECT_CALL(visitor, @@ -2758,7 +2764,7 @@ TEST(OgHttp2AdapterTest, ClientObeysMaxConcurrentStreams) { EXPECT_FALSE(adapter->want_write()); } -TEST(OgHttp2AdapterTest, ClientReceivesInitialWindowSetting) { +TEST_P(OgHttp2AdapterDataTest, ClientReceivesInitialWindowSetting) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kClient; @@ -2799,15 +2805,15 @@ TEST(OgHttp2AdapterTest, ClientReceivesInitialWindowSetting) { visitor.Clear(); const std::string kLongBody = std::string(81000, 'c'); - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload(kLongBody); - body1->EndData(); - const int stream_id = - adapter->SubmitRequest(ToHeaders({{":method", "POST"}, - {":scheme", "http"}, - {":authority", "example.com"}, - {":path", "/this/is/request/one"}}), - std::move(body1), false, nullptr); + visitor.AppendPayloadForStream(1, kLongBody); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); + const int stream_id = adapter->SubmitRequest( + ToHeaders({{":method", "POST"}, + {":scheme", "http"}, + {":authority", "example.com"}, + {":path", "/this/is/request/one"}}), + GetParam() ? nullptr : std::move(body1), false, nullptr); EXPECT_GT(stream_id, 0); EXPECT_TRUE(adapter->want_write()); @@ -2825,7 +2831,8 @@ TEST(OgHttp2AdapterTest, ClientReceivesInitialWindowSetting) { SpdyFrameType::DATA, SpdyFrameType::DATA})); } -TEST(OgHttp2AdapterTest, ClientReceivesInitialWindowSettingAfterStreamStart) { +TEST_P(OgHttp2AdapterDataTest, + ClientReceivesInitialWindowSettingAfterStreamStart) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kClient; @@ -2856,15 +2863,15 @@ TEST(OgHttp2AdapterTest, ClientReceivesInitialWindowSettingAfterStreamStart) { visitor.Clear(); const std::string kLongBody = std::string(81000, 'c'); - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload(kLongBody); - body1->EndData(); - const int stream_id = - adapter->SubmitRequest(ToHeaders({{":method", "POST"}, - {":scheme", "http"}, - {":authority", "example.com"}, - {":path", "/this/is/request/one"}}), - std::move(body1), false, nullptr); + visitor.AppendPayloadForStream(1, kLongBody); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); + const int stream_id = adapter->SubmitRequest( + ToHeaders({{":method", "POST"}, + {":scheme", "http"}, + {":authority", "example.com"}, + {":path", "/this/is/request/one"}}), + GetParam() ? nullptr : std::move(body1), false, nullptr); EXPECT_GT(stream_id, 0); EXPECT_TRUE(adapter->want_write()); @@ -3448,7 +3455,7 @@ TEST(OgHttp2AdapterTest, ClientReceivesDataOnClosedStream) { EXPECT_FALSE(adapter->want_write()); } -TEST(OgHttp2AdapterTest, ClientEncountersFlowControlBlock) { +TEST_P(OgHttp2AdapterDataTest, ClientEncountersFlowControlBlock) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kClient; @@ -3463,12 +3470,12 @@ TEST(OgHttp2AdapterTest, ClientEncountersFlowControlBlock) { {":path", "/this/is/request/one"}}); const std::string kBody = std::string(100 * 1024, 'a'); - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); - body1->EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, false); + auto body1 = std::make_unique(visitor, 1); - const int32_t stream_id1 = - adapter->SubmitRequest(headers1, std::move(body1), false, nullptr); + const int32_t stream_id1 = adapter->SubmitRequest( + headers1, GetParam() ? nullptr : std::move(body1), false, nullptr); ASSERT_GT(stream_id1, 0); const std::vector
headers2 = @@ -3477,13 +3484,13 @@ TEST(OgHttp2AdapterTest, ClientEncountersFlowControlBlock) { {":authority", "example.com"}, {":path", "/this/is/request/two"}}); - auto body2 = std::make_unique(visitor, false); - body2->AppendPayload(kBody); - body2->EndData(); + visitor.AppendPayloadForStream(3, kBody); + visitor.SetEndData(3, false); + auto body2 = std::make_unique(visitor, 3); - const int32_t stream_id2 = - adapter->SubmitRequest(headers2, std::move(body2), false, nullptr); - ASSERT_GT(stream_id2, 0); + const int32_t stream_id2 = adapter->SubmitRequest( + headers2, GetParam() ? nullptr : std::move(body2), false, nullptr); + ASSERT_EQ(stream_id2, 3); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0)); @@ -3531,7 +3538,7 @@ TEST(OgHttp2AdapterTest, ClientEncountersFlowControlBlock) { EXPECT_EQ(0, result); } -TEST(OgHttp2AdapterTest, ClientSendsTrailersAfterFlowControlBlock) { +TEST_P(OgHttp2AdapterDataTest, ClientSendsTrailersAfterFlowControlBlock) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kClient; @@ -3545,12 +3552,12 @@ TEST(OgHttp2AdapterTest, ClientSendsTrailersAfterFlowControlBlock) { {":authority", "example.com"}, {":path", "/this/is/request/one"}}); - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload("Really small body."); - body1->EndData(); + visitor.AppendPayloadForStream(1, "Really small body."); + visitor.SetEndData(1, false); + auto body1 = std::make_unique(visitor, 1); - const int32_t stream_id1 = - adapter->SubmitRequest(headers1, std::move(body1), false, nullptr); + const int32_t stream_id1 = adapter->SubmitRequest( + headers1, GetParam() ? nullptr : std::move(body1), false, nullptr); ASSERT_GT(stream_id1, 0); const std::vector
headers2 = @@ -3560,12 +3567,12 @@ TEST(OgHttp2AdapterTest, ClientSendsTrailersAfterFlowControlBlock) { {":path", "/this/is/request/two"}}); const std::string kBody = std::string(100 * 1024, 'a'); - auto body2 = std::make_unique(visitor, false); - body2->AppendPayload(kBody); - body2->EndData(); + visitor.AppendPayloadForStream(3, kBody); + visitor.SetEndData(3, false); + auto body2 = std::make_unique(visitor, 3); - const int32_t stream_id2 = - adapter->SubmitRequest(headers2, std::move(body2), false, nullptr); + const int32_t stream_id2 = adapter->SubmitRequest( + headers2, GetParam() ? nullptr : std::move(body2), false, nullptr); ASSERT_GT(stream_id2, 0); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); @@ -4192,7 +4199,7 @@ TEST(OgHttp2AdapterTest, ConnectionErrorOnControlFrameSent) { EXPECT_LT(send_result, 0); } -TEST(OgHttp2AdapterTest, ConnectionErrorOnDataFrameSent) { +TEST_P(OgHttp2AdapterDataTest, ConnectionErrorOnDataFrameSent) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -4224,11 +4231,12 @@ TEST(OgHttp2AdapterTest, ConnectionErrorOnDataFrameSent) { const int64_t read_result = adapter->ProcessBytes(frames); EXPECT_EQ(static_cast(read_result), frames.size()); - auto body = std::make_unique(visitor, true); - body->AppendPayload("Here is some data, which will lead to a fatal error"); - TestDataFrameSource* body_ptr = body.get(); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + visitor.AppendPayloadForStream( + 1, "Here is some data, which will lead to a fatal error"); + auto body = std::make_unique(visitor, 1); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(0, submit_result); EXPECT_TRUE(adapter->want_write()); @@ -4249,7 +4257,8 @@ TEST(OgHttp2AdapterTest, ConnectionErrorOnDataFrameSent) { int send_result = adapter->Send(); EXPECT_LT(send_result, 0); - body_ptr->AppendPayload("After the fatal error, data will be sent no more"); + visitor.AppendPayloadForStream( + 1, "After the fatal error, data will be sent no more"); EXPECT_FALSE(adapter->want_write()); @@ -4295,7 +4304,7 @@ TEST(OgHttp2AdapterTest, ClientSendsContinuation) { EXPECT_EQ(frames.size(), static_cast(result)); } -TEST(OgHttp2AdapterTest, RepeatedHeaderNames) { +TEST_P(OgHttp2AdapterDataTest, RepeatedHeaderNames) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -4337,12 +4346,12 @@ TEST(OgHttp2AdapterTest, RepeatedHeaderNames) { const std::vector
headers1 = ToHeaders( {{":status", "200"}, {"content-length", "10"}, {"content-length", "10"}}); - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload("perfection"); - body1->EndData(); + visitor.AppendPayloadForStream(1, "perfection"); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); - int submit_result = - adapter->SubmitResponse(1, headers1, std::move(body1), false); + int submit_result = adapter->SubmitResponse( + 1, headers1, GetParam() ? nullptr : std::move(body1), false); ASSERT_EQ(0, submit_result); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); @@ -4361,7 +4370,7 @@ TEST(OgHttp2AdapterTest, RepeatedHeaderNames) { SpdyFrameType::HEADERS, SpdyFrameType::DATA})); } -TEST(OgHttp2AdapterTest, ServerRespondsToRequestWithTrailers) { +TEST_P(OgHttp2AdapterDataTest, ServerRespondsToRequestWithTrailers) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -4400,11 +4409,10 @@ TEST(OgHttp2AdapterTest, ServerRespondsToRequestWithTrailers) { EXPECT_EQ(frames.size(), static_cast(result)); const std::vector
headers1 = ToHeaders({{":status", "200"}}); - auto body1 = std::make_unique(visitor, true); - TestDataFrameSource* body1_ptr = body1.get(); + auto body1 = std::make_unique(visitor, 1); - int submit_result = - adapter->SubmitResponse(1, headers1, std::move(body1), false); + int submit_result = adapter->SubmitResponse( + 1, headers1, GetParam() ? nullptr : std::move(body1), false); ASSERT_EQ(0, submit_result); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); @@ -4437,7 +4445,7 @@ TEST(OgHttp2AdapterTest, ServerRespondsToRequestWithTrailers) { result = adapter->ProcessBytes(more_frames); EXPECT_EQ(more_frames.size(), static_cast(result)); - body1_ptr->EndData(); + visitor.SetEndData(1, true); EXPECT_EQ(true, adapter->ResumeStream(1)); EXPECT_CALL(visitor, OnFrameSent(DATA, 1, 0, END_STREAM, 0)); @@ -4565,7 +4573,7 @@ TEST(OgHttp2AdapterTest, ServerVisitorRejectsHeaders) { SpdyFrameType::RST_STREAM})); } -TEST(OgHttp2AdapterTest, ServerSubmitsResponseWithDataSourceError) { +TEST_P(OgHttp2AdapterDataTest, ServerSubmitsResponseWithDataSourceError) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -4600,11 +4608,11 @@ TEST(OgHttp2AdapterTest, ServerSubmitsResponseWithDataSourceError) { const int64_t result = adapter->ProcessBytes(frames); EXPECT_EQ(frames.size(), static_cast(result)); - auto body1 = std::make_unique(visitor, false); - body1->SimulateError(); + visitor.SimulateError(1); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); @@ -4862,7 +4870,7 @@ TEST(OgHttp2AdapterTest, ServerHandlesMultipleContentLength) { EXPECT_EQ(frames.size(), static_cast(result)); } -TEST(OgHttp2AdapterTest, ServerSendsInvalidTrailers) { +TEST_P(OgHttp2AdapterDataTest, ServerSendsInvalidTrailers) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -4901,12 +4909,12 @@ TEST(OgHttp2AdapterTest, ServerSendsInvalidTrailers) { // The body source must indicate that the end of the body is not the end of // the stream. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); - body1->EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, false); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); @@ -5157,11 +5165,11 @@ TEST(OgHttp2AdapterTest, ServerHandlesHostHeaderWithLaxValidation) { // Tests the case where the response body is in the progress of being sent while // trailers are queued. -TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWhileDataDeferred) { - TestVisitor visitor; +TEST_P(OgHttp2AdapterDataTest, ServerSubmitsTrailersWhileDataDeferred) { OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; for (const bool add_more_body_data : {true, false}) { + TestVisitor visitor; auto adapter = OgHttp2Adapter::Create(visitor, options); const std::string frames = TestFrameSequence() @@ -5213,12 +5221,11 @@ TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWhileDataDeferred) { // The body source must indicate that the end of the body is not the end of // the stream. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); - auto* body1_ptr = body1.get(); + visitor.AppendPayloadForStream(1, kBody); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); @@ -5232,7 +5239,7 @@ TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWhileDataDeferred) { EXPECT_FALSE(adapter->want_write()); if (add_more_body_data) { - body1_ptr->AppendPayload(" More body! This is ignored."); + visitor.AppendPayloadForStream(1, " More body! This is ignored."); } int trailer_result = adapter->SubmitTrailer(1, ToHeaders({{"final-status", "a-ok"}})); @@ -5256,7 +5263,7 @@ TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWhileDataDeferred) { // Tests the case where the response body and trailers become blocked by flow // control while the stream is writing. Regression test for // https://github.com/envoyproxy/envoy/issues/31710 -TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWithFlowControlBlockage) { +TEST_P(OgHttp2AdapterDataTest, ServerSubmitsTrailersWithFlowControlBlockage) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -5306,12 +5313,11 @@ TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWithFlowControlBlockage) { // The body source must indicate that the end of the body is not the end of // the stream. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); - auto* body1_ptr = body1.get(); + visitor.AppendPayloadForStream(1, kBody); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); @@ -5328,7 +5334,7 @@ TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWithFlowControlBlockage) { visitor.Clear(); EXPECT_FALSE(adapter->want_write()); - body1_ptr->AppendPayload(std::string(6000, 'b')); + visitor.AppendPayloadForStream(1, std::string(6000, 'b')); // The next response body data payload is larger than the available stream // flow control window. EXPECT_LT(adapter->GetStreamSendWindowSize(1), 6000); @@ -5373,7 +5379,7 @@ TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWithFlowControlBlockage) { EXPECT_FALSE(adapter->want_write()); } -TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStream) { +TEST_P(OgHttp2AdapterDataTest, ServerSubmitsTrailersWithDataEndStream) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -5412,12 +5418,13 @@ TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStream) { // Send a body that will end with the END_STREAM flag. const absl::string_view kBody = "This is an example response body."; - auto body = std::make_unique(visitor, /*has_fin=*/true); - body->AppendPayload(kBody); - body->EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, true); + auto body = std::make_unique(visitor, 1); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(submit_result, 0); const std::vector
trailers = @@ -5443,7 +5450,8 @@ TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStream) { SpdyFrameType::HEADERS, SpdyFrameType::DATA})); } -TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStreamAndDeferral) { +TEST_P(OgHttp2AdapterDataTest, + ServerSubmitsTrailersWithDataEndStreamAndDeferral) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -5483,12 +5491,12 @@ TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStreamAndDeferral) { // Send a body that will end with the END_STREAM flag. Don't end the body here // so that more body can be added later. const absl::string_view kBody = "This is an example response body."; - auto body = std::make_unique(visitor, /*has_fin=*/true); - body->AppendPayload(kBody); - TestDataFrameSource& body_ref = *body; + visitor.AppendPayloadForStream(1, kBody); + auto body = std::make_unique(visitor, 1); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(submit_result, 0); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); @@ -5513,8 +5521,8 @@ TEST(OgHttp2AdapterTest, ServerSubmitsTrailersWithDataEndStreamAndDeferral) { // Add more body and signal the end of data. Resuming the stream should allow // the new body to be sent. - body_ref.AppendPayload(kBody); - body_ref.EndData(); + visitor.AppendPayloadForStream(1, kBody); + visitor.SetEndData(1, true); adapter->ResumeStream(1); // The new body should be sent, but because it has END_STREAM, it would not be @@ -6406,7 +6414,7 @@ TEST(OgHttpAdapterTest, ServerReceivesGoAway) { SpdyFrameType::HEADERS})); } -TEST(OgHttp2AdapterTest, ServerSubmitResponse) { +TEST_P(OgHttp2AdapterDataTest, ServerSubmitResponse) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -6469,13 +6477,13 @@ TEST(OgHttp2AdapterTest, ServerSubmitResponse) { const absl::string_view kBody = "This is an example response body."; // A data fin is not sent so that the stream remains open, and the flow // control state can be verified. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload(kBody); + visitor.AppendPayloadForStream(1, kBody); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "404"}, {"x-comment", "I have no idea what you're talking about."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); @@ -6506,7 +6514,7 @@ TEST(OgHttp2AdapterTest, ServerSubmitResponse) { EXPECT_GT(adapter->GetHpackEncoderDynamicTableSize(), 0); } -TEST(OgHttp2AdapterTest, ServerSubmitResponseWithResetFromClient) { +TEST_P(OgHttp2AdapterDataTest, ServerSubmitResponseWithResetFromClient) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -6556,13 +6564,13 @@ TEST(OgHttp2AdapterTest, ServerSubmitResponseWithResetFromClient) { EXPECT_FALSE(adapter->want_write()); const absl::string_view kBody = "This is an example response body."; - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload(kBody); + visitor.AppendPayloadForStream(1, kBody); + auto body1 = std::make_unique(visitor, 1); int submit_result = adapter->SubmitResponse( 1, ToHeaders({{":status", "404"}, {"x-comment", "I have no idea what you're talking about."}}), - std::move(body1), false); + GetParam() ? nullptr : std::move(body1), false); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->want_write()); @@ -6647,18 +6655,26 @@ TEST(OgHttp2AdapterTest, ServerRejectsStreamData) { EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY})); } +using OgHttp2AdapterInteractionDataTest = OgHttp2AdapterDataTest; + +INSTANTIATE_TEST_SUITE_P(BothValues, OgHttp2AdapterInteractionDataTest, + testing::Bool()); // Exercises a naive mutually recursive test client and server. This test fails // without recursion guards in OgHttp2Session. -TEST(OgHttp2AdapterInteractionTest, ClientServerInteractionTest) { - testing::NiceMock client_visitor; +TEST_P(OgHttp2AdapterInteractionDataTest, ClientServerInteractionTest) { + TestVisitor client_visitor; OgHttp2Adapter::Options client_options; client_options.perspective = Perspective::kClient; auto client_adapter = OgHttp2Adapter::Create(client_visitor, client_options); - testing::NiceMock server_visitor; + TestVisitor server_visitor; OgHttp2Adapter::Options server_options; server_options.perspective = Perspective::kServer; auto server_adapter = OgHttp2Adapter::Create(server_visitor, server_options); + EXPECT_CALL(client_visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); + EXPECT_CALL(client_visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0x0)); + EXPECT_CALL(client_visitor, OnBeforeFrameSent(HEADERS, 1, _, 0x5)); + EXPECT_CALL(client_visitor, OnFrameSent(HEADERS, 1, _, 0x5, 0x0)); // Feeds bytes sent from the client into the server's ProcessBytes. EXPECT_CALL(client_visitor, OnReadyToSend(_)) .WillRepeatedly( @@ -6682,17 +6698,18 @@ TEST(OgHttp2AdapterInteractionTest, ClientServerInteractionTest) { &client_visitor](Http2StreamId stream_id) { if (stream_id < 10) { const Http2StreamId new_stream_id = stream_id + 2; - auto body = - std::make_unique(client_visitor, true); - body->AppendPayload("This is an example request body."); - body->EndData(); + client_visitor.AppendPayloadForStream( + new_stream_id, "This is an example request body."); + client_visitor.SetEndData(new_stream_id, true); + auto body = std::make_unique(client_visitor, + new_stream_id); const int created_stream_id = client_adapter->SubmitRequest( ToHeaders({{":method", "GET"}, {":scheme", "http"}, {":authority", "example.com"}, {":path", absl::StrCat("/this/is/request/", new_stream_id)}}), - std::move(body), false, nullptr); + GetParam() ? nullptr : std::move(body), false, nullptr); EXPECT_EQ(new_stream_id, created_stream_id); client_adapter->Send(); } @@ -7352,7 +7369,7 @@ TEST(OgHttp2AdapterTest, ServerAllowsProtocolPseudoheaderAfterAck) { EXPECT_FALSE(adapter->want_write()); } -TEST(OgHttp2AdapterTest, SkipsSendingFramesForRejectedStream) { +TEST_P(OgHttp2AdapterDataTest, SkipsSendingFramesForRejectedStream) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -7385,11 +7402,13 @@ TEST(OgHttp2AdapterTest, SkipsSendingFramesForRejectedStream) { const int64_t initial_result = adapter->ProcessBytes(initial_frames); EXPECT_EQ(static_cast(initial_result), initial_frames.size()); - auto body = std::make_unique(visitor, true); - body->AppendPayload("Here is some data, which will be completely ignored!"); + visitor.AppendPayloadForStream( + 1, "Here is some data, which will be completely ignored!"); + auto body = std::make_unique(visitor, 1); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(0, submit_result); auto source = std::make_unique(ToHeaderBlock(ToHeaders( @@ -7534,7 +7553,7 @@ TEST(OgHttp2AdapterTest, ConnectionErrorWithoutBlackholingData) { EXPECT_LT(next_result, 0); } -TEST(OgHttp2AdapterTest, ServerDoesNotSendFramesAfterImmediateGoAway) { +TEST_P(OgHttp2AdapterDataTest, ServerDoesNotSendFramesAfterImmediateGoAway) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -7570,10 +7589,11 @@ TEST(OgHttp2AdapterTest, ServerDoesNotSendFramesAfterImmediateGoAway) { EXPECT_EQ(static_cast(read_result), frames.size()); // Submit a response for the stream. - auto body = std::make_unique(visitor, true); - body->AppendPayload("This data is doomed to never be written."); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + visitor.AppendPayloadForStream(1, "This data is doomed to never be written."); + auto body = std::make_unique(visitor, 1); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(0, submit_result); // Submit a WINDOW_UPDATE frame. @@ -8405,7 +8425,7 @@ TEST(OgHttp2AdapterTest, NoopHeaderValidatorTest) { EXPECT_EQ(frames.size(), static_cast(result)); } -TEST(OgHttp2AdapterTest, NegativeFlowControlStreamResumption) { +TEST_P(OgHttp2AdapterDataTest, NegativeFlowControlStreamResumption) { TestVisitor visitor; OgHttp2Adapter::Options options; options.perspective = Perspective::kServer; @@ -8447,11 +8467,11 @@ TEST(OgHttp2AdapterTest, NegativeFlowControlStreamResumption) { EXPECT_EQ(static_cast(read_result), frames.size()); // Submit a response for the stream. - auto body = std::make_unique(visitor, true); - TestDataFrameSource& body_ref = *body; - body_ref.AppendPayload(std::string(70000, 'a')); - int submit_result = adapter->SubmitResponse( - 1, ToHeaders({{":status", "200"}}), std::move(body), false); + visitor.AppendPayloadForStream(1, std::string(70000, 'a')); + auto body = std::make_unique(visitor, 1); + int submit_result = + adapter->SubmitResponse(1, ToHeaders({{":status", "200"}}), + GetParam() ? nullptr : std::move(body), false); ASSERT_EQ(0, submit_result); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); @@ -8481,7 +8501,7 @@ TEST(OgHttp2AdapterTest, NegativeFlowControlStreamResumption) { EXPECT_TRUE(adapter->want_write()); EXPECT_LT(adapter->GetStreamSendWindowSize(1), 0); - body_ref.AppendPayload("Stream should be resumed."); + visitor.AppendPayloadForStream(1, "Stream should be resumed."); adapter->ResumeStream(1); EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, ACK_FLAG)); diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc index f47385c115..770e6791b2 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc @@ -1,8 +1,12 @@ #include "quiche/http2/adapter/oghttp2_session.h" +#include #include +#include #include #include +#include +#include #include #include @@ -24,6 +28,7 @@ namespace adapter { namespace { using ConnectionError = Http2VisitorInterface::ConnectionError; +using DataFrameHeaderInfo = Http2VisitorInterface::DataFrameHeaderInfo; using SpdyFramerError = Http2DecoderAdapter::SpdyFramerError; using ::spdy::SpdySettingsIR; @@ -683,11 +688,13 @@ int OgHttp2Session::SubmitResponseInternal( QUICHE_LOG(ERROR) << "Unable to find stream " << stream_id; return -501; // NGHTTP2_ERR_INVALID_ARGUMENT } - QUICHE_DCHECK_EQ(end_stream, data_source == nullptr); - if (!end_stream) { + if (data_source != nullptr) { // Add data source to stream state iter->second.outbound_body = std::move(data_source); write_scheduler_.MarkStreamReady(stream_id, false); + } else if (!end_stream) { + iter->second.check_visitor_for_body = true; + write_scheduler_.MarkStreamReady(stream_id, false); } SendHeaders(stream_id, ToHeaderBlock(headers), end_stream); return 0; @@ -870,9 +877,11 @@ OgHttp2Session::SendResult OgHttp2Session::WriteForStream( static_cast(max_frame_payload_)}); while (connection_can_write == SendResult::SEND_OK && available_window > 0 && IsReadyToWriteData(state)) { - DataFrameInfo info = GetDataFrameInfo(stream_id, available_window, state); + DataFrameHeaderInfo info = + GetDataFrameInfo(stream_id, available_window, state); QUICHE_VLOG(2) << "WriteForStream | length: " << info.payload_length << " end_data: " << info.end_data + << " end_stream: " << info.end_stream << " trailers: " << state.trailers.get(); if (info.payload_length == 0 && !info.end_data && state.trailers == nullptr) { @@ -888,9 +897,9 @@ OgHttp2Session::SendResult OgHttp2Session::WriteForStream( // No more work on the stream; it has been closed. break; } - if (info.payload_length > 0 || info.send_fin) { + if (info.payload_length > 0 || info.end_stream) { spdy::SpdyDataIR data(stream_id); - data.set_fin(info.send_fin); + data.set_fin(info.end_stream); data.SetDataShallow(info.payload_length); spdy::SpdySerializedFrame header = spdy::SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField( @@ -907,13 +916,13 @@ OgHttp2Session::SendResult OgHttp2Session::WriteForStream( state.send_window -= info.payload_length; available_window = std::min({connection_send_window_, state.send_window, static_cast(max_frame_payload_)}); - if (info.send_fin) { + if (info.end_stream) { state.half_closed_local = true; MaybeFinWithRstStream(it); } const bool ok = AfterFrameSent(/* DATA */ 0, stream_id, info.payload_length, - info.send_fin ? END_STREAM_FLAG : 0x0, 0); + info.end_stream ? END_STREAM_FLAG : 0x0, 0); if (!ok) { LatchErrorAndNotify(Http2ErrorCode::INTERNAL_ERROR, ConnectionError::kSendError); @@ -930,7 +939,7 @@ OgHttp2Session::SendResult OgHttp2Session::WriteForStream( // send, it's okay to send the trailers. if (state.trailers != nullptr) { auto block_ptr = std::move(state.trailers); - if (info.send_fin) { + if (info.end_stream) { QUICHE_LOG(ERROR) << "Sent fin; can't send trailers."; // TODO(birenroy,diannahu): Consider queuing a RST_STREAM @@ -1023,8 +1032,6 @@ int OgHttp2Session::SubmitTrailer(Http2StreamId stream_id, // Enqueue trailers immediately. SendTrailers(stream_id, ToHeaderBlock(trailers)); } else { - QUICHE_LOG_IF(ERROR, state.outbound_body->send_fin()) - << "DataFrameSource will send fin, preventing trailers!"; // Save trailers so they can be written once data is done. state.trailers = std::make_unique(ToHeaderBlock(trailers)); @@ -1825,10 +1832,12 @@ void OgHttp2Session::StartRequest(Http2StreamId stream_id, } auto iter = CreateStream(stream_id); - QUICHE_DCHECK_EQ(end_stream, data_source == nullptr); - if (!end_stream) { + if (data_source != nullptr) { iter->second.outbound_body = std::move(data_source); write_scheduler_.MarkStreamReady(stream_id, false); + } else if (!end_stream) { + iter->second.check_visitor_for_body = true; + write_scheduler_.MarkStreamReady(stream_id, false); } iter->second.user_data = user_data; for (const auto& [name, value] : headers) { @@ -2060,33 +2069,50 @@ void OgHttp2Session::UpdateStreamReceiveWindowSizes(uint32_t new_value) { } bool OgHttp2Session::HasMoreData(const StreamState& stream_state) const { - return stream_state.outbound_body != nullptr; + return stream_state.outbound_body != nullptr || + stream_state.check_visitor_for_body; } bool OgHttp2Session::IsReadyToWriteData(const StreamState& stream_state) const { - return stream_state.outbound_body != nullptr && !stream_state.data_deferred; + return HasMoreData(stream_state) && !stream_state.data_deferred; } void OgHttp2Session::AbandonData(StreamState& stream_state) { stream_state.outbound_body = nullptr; + stream_state.check_visitor_for_body = false; } -OgHttp2Session::DataFrameInfo OgHttp2Session::GetDataFrameInfo( - Http2StreamId /*stream_id*/, size_t flow_control_available, +OgHttp2Session::DataFrameHeaderInfo OgHttp2Session::GetDataFrameInfo( + Http2StreamId stream_id, size_t flow_control_available, StreamState& stream_state) { - DataFrameInfo info; - std::tie(info.payload_length, info.end_data) = - stream_state.outbound_body->SelectPayloadLength(flow_control_available); - info.send_fin = - info.end_data ? stream_state.outbound_body->send_fin() : false; - return info; + if (stream_state.outbound_body != nullptr) { + DataFrameHeaderInfo info; + std::tie(info.payload_length, info.end_data) = + stream_state.outbound_body->SelectPayloadLength(flow_control_available); + info.end_stream = + info.end_data ? stream_state.outbound_body->send_fin() : false; + return info; + } else if (stream_state.check_visitor_for_body) { + DataFrameHeaderInfo info = + visitor_.OnReadyToSendDataForStream(stream_id, flow_control_available); + info.end_data = info.end_data || info.end_stream; + return info; + } + QUICHE_LOG(DFATAL) << "GetDataFrameInfo for stream " << stream_id + << " but no body available!"; + return {/*payload_length=*/0, /*end_data=*/true, /*end_stream=*/true}; } -bool OgHttp2Session::SendDataFrame(Http2StreamId /*stream_id*/, +bool OgHttp2Session::SendDataFrame(Http2StreamId stream_id, absl::string_view frame_header, size_t payload_length, StreamState& stream_state) { - return stream_state.outbound_body->Send(frame_header, payload_length); + if (stream_state.outbound_body != nullptr) { + return stream_state.outbound_body->Send(frame_header, payload_length); + } else { + QUICHE_DCHECK(stream_state.check_visitor_for_body); + return visitor_.SendDataFrame(stream_id, frame_header, payload_length); + } } } // namespace adapter diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.h b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.h index 3f370192b7..ab1373741a 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.h +++ b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.h @@ -249,6 +249,7 @@ class QUICHE_EXPORT OgHttp2Session : public Http2Session, int32_t send_window; std::optional received_header_type; std::optional remaining_content_length; + bool check_visitor_for_body = false; bool half_closed_local = false; bool half_closed_remote = false; // Indicates that `outbound_body` temporarily cannot produce data. @@ -470,14 +471,10 @@ class QUICHE_EXPORT OgHttp2Session : public Http2Session, void AbandonData(StreamState& stream_state); // Gathers information required to construct a DATA frame header. - struct DataFrameInfo { - int64_t payload_length; - bool end_data; - bool send_fin; - }; - DataFrameInfo GetDataFrameInfo(Http2StreamId stream_id, - size_t flow_control_available, - StreamState& stream_state); + using DataFrameHeaderInfo = Http2VisitorInterface::DataFrameHeaderInfo; + DataFrameHeaderInfo GetDataFrameInfo(Http2StreamId stream_id, + size_t flow_control_available, + StreamState& stream_state); // Invokes the appropriate API to send a DATA frame header and payload. bool SendDataFrame(Http2StreamId stream_id, absl::string_view frame_header, diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session_test.cc index 182168dea7..9e29388593 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/oghttp2_session_test.cc @@ -1,6 +1,8 @@ #include "quiche/http2/adapter/oghttp2_session.h" #include +#include +#include #include "quiche/http2/adapter/mock_http2_visitor.h" #include "quiche/http2/adapter/test_frame_sequence.h" @@ -52,7 +54,7 @@ TEST(OgHttp2SessionTest, ClientConstructionWithMaxStreams) { } TEST(OgHttp2SessionTest, ClientHandlesFrames) { - testing::StrictMock visitor; + TestVisitor visitor; OgHttp2Session::Options options; options.perspective = Perspective::kClient; OgHttp2Session session(visitor, options); @@ -88,16 +90,16 @@ TEST(OgHttp2SessionTest, ClientHandlesFrames) { // Submit a request to ensure the first stream is created. const char* kSentinel1 = "arbitrary pointer 1"; - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload("This is an example request body."); - body1->EndData(); + visitor.AppendPayloadForStream(1, "This is an example request body."); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); int stream_id = session.SubmitRequest( ToHeaders({{":method", "POST"}, {":scheme", "http"}, {":authority", "example.com"}, {":path", "/this/is/request/one"}}), std::move(body1), false, const_cast(kSentinel1)); - EXPECT_EQ(stream_id, 1); + ASSERT_EQ(stream_id, 1); // Submit another request to ensure the next stream is created. int stream_id2 = @@ -274,16 +276,16 @@ TEST(OgHttp2SessionTest, ClientSubmitRequest) { EXPECT_EQ(0, session.GetHpackEncoderDynamicTableSize()); const char* kSentinel1 = "arbitrary pointer 1"; - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload("This is an example request body."); - body1->EndData(); + visitor.AppendPayloadForStream(1, "This is an example request body."); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); int stream_id = session.SubmitRequest( ToHeaders({{":method", "POST"}, {":scheme", "http"}, {":authority", "example.com"}, {":path", "/this/is/request/one"}}), std::move(body1), false, const_cast(kSentinel1)); - EXPECT_GT(stream_id, 0); + ASSERT_EQ(stream_id, 1); EXPECT_TRUE(session.want_write()); EXPECT_EQ(kSentinel1, session.GetStreamUserData(stream_id)); @@ -385,16 +387,16 @@ TEST(OgHttp2SessionTest, ClientSubmitRequestWithLargePayload) { EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); visitor.Clear(); - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload(std::string(20000, 'a')); - body1->EndData(); + visitor.AppendPayloadForStream(1, std::string(20000, 'a')); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); int stream_id = session.SubmitRequest(ToHeaders({{":method", "POST"}, {":scheme", "http"}, {":authority", "example.com"}, {":path", "/this/is/request/one"}}), std::move(body1), false, nullptr); - EXPECT_GT(stream_id, 0); + ASSERT_EQ(stream_id, 1); EXPECT_TRUE(session.want_write()); EXPECT_CALL(visitor, OnBeforeFrameSent(HEADERS, stream_id, _, 0x4)); @@ -420,8 +422,7 @@ TEST(OgHttp2SessionTest, ClientSubmitRequestWithReadBlock) { EXPECT_FALSE(session.want_write()); const char* kSentinel1 = "arbitrary pointer 1"; - auto body1 = std::make_unique(visitor, true); - TestDataFrameSource* body_ref = body1.get(); + auto body1 = std::make_unique(visitor, 1); int stream_id = session.SubmitRequest( ToHeaders({{":method", "POST"}, {":scheme", "http"}, @@ -449,8 +450,8 @@ TEST(OgHttp2SessionTest, ClientSubmitRequestWithReadBlock) { visitor.Clear(); EXPECT_FALSE(session.want_write()); - body_ref->AppendPayload("This is an example request body."); - body_ref->EndData(); + visitor.AppendPayloadForStream(1, "This is an example request body."); + visitor.SetEndData(1, true); EXPECT_TRUE(session.ResumeStream(stream_id)); EXPECT_TRUE(session.want_write()); @@ -476,8 +477,7 @@ TEST(OgHttp2SessionTest, ClientSubmitRequestEmptyDataWithFin) { EXPECT_FALSE(session.want_write()); const char* kSentinel1 = "arbitrary pointer 1"; - auto body1 = std::make_unique(visitor, true); - TestDataFrameSource* body_ref = body1.get(); + auto body1 = std::make_unique(visitor, 1); int stream_id = session.SubmitRequest( ToHeaders({{":method", "POST"}, {":scheme", "http"}, @@ -505,7 +505,7 @@ TEST(OgHttp2SessionTest, ClientSubmitRequestEmptyDataWithFin) { visitor.Clear(); EXPECT_FALSE(session.want_write()); - body_ref->EndData(); + visitor.SetEndData(1, true); EXPECT_TRUE(session.ResumeStream(stream_id)); EXPECT_TRUE(session.want_write()); @@ -531,9 +531,9 @@ TEST(OgHttp2SessionTest, ClientSubmitRequestWithWriteBlock) { EXPECT_FALSE(session.want_write()); const char* kSentinel1 = "arbitrary pointer 1"; - auto body1 = std::make_unique(visitor, true); - body1->AppendPayload("This is an example request body."); - body1->EndData(); + visitor.AppendPayloadForStream(1, "This is an example request body."); + visitor.SetEndData(1, true); + auto body1 = std::make_unique(visitor, 1); int stream_id = session.SubmitRequest( ToHeaders({{":method", "POST"}, {":scheme", "http"}, @@ -805,8 +805,8 @@ TEST(OgHttp2SessionTest, ServerSubmitResponse) { EXPECT_FALSE(session.want_write()); // A data fin is not sent so that the stream remains open, and the flow // control state can be verified. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload("This is an example response body."); + visitor.AppendPayloadForStream(1, "This is an example response body."); + auto body1 = std::make_unique(visitor, 1); int submit_result = session.SubmitResponse( 1, ToHeaders({{":status", "404"}, @@ -896,9 +896,9 @@ TEST(OgHttp2SessionTest, ServerSendsTrailers) { // The body source must indicate that the end of the body is not the end of // the stream. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload("This is an example response body."); - body1->EndData(); + visitor.AppendPayloadForStream(1, "This is an example response body."); + visitor.SetEndData(1, false); + auto body1 = std::make_unique(visitor, 1); int submit_result = session.SubmitResponse( 1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}), std::move(body1), false); @@ -988,9 +988,9 @@ TEST(OgHttp2SessionTest, ServerQueuesTrailersWithResponse) { // The body source must indicate that the end of the body is not the end of // the stream. - auto body1 = std::make_unique(visitor, false); - body1->AppendPayload("This is an example response body."); - body1->EndData(); + visitor.AppendPayloadForStream(1, "This is an example response body."); + visitor.SetEndData(1, false); + auto body1 = std::make_unique(visitor, 1); int submit_result = session.SubmitResponse( 1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}), std::move(body1), false); diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor.cc b/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor.cc index d55045f3c8..0b989f0833 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor.cc @@ -13,6 +13,22 @@ int64_t RecordingHttp2Visitor::OnReadyToSend(absl::string_view serialized) { return serialized.size(); } +Http2VisitorInterface::DataFrameHeaderInfo +RecordingHttp2Visitor::OnReadyToSendDataForStream(Http2StreamId stream_id, + size_t max_length) { + events_.push_back(absl::StrFormat("OnReadyToSendDataForStream %d %d", + stream_id, max_length)); + return {70000, true, true}; +} + +bool RecordingHttp2Visitor::SendDataFrame(Http2StreamId stream_id, + absl::string_view /*frame_header*/, + size_t payload_bytes) { + events_.push_back( + absl::StrFormat("SendDataFrame %d %d", stream_id, payload_bytes)); + return true; +} + void RecordingHttp2Visitor::OnConnectionError(ConnectionError error) { events_.push_back( absl::StrFormat("OnConnectionError %s", ConnectionErrorToString(error))); diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor.h b/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor.h index d796fe721b..b7835ee653 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor.h +++ b/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor.h @@ -21,6 +21,10 @@ class QUICHE_NO_EXPORT RecordingHttp2Visitor : public Http2VisitorInterface { // From Http2VisitorInterface int64_t OnReadyToSend(absl::string_view serialized) override; + DataFrameHeaderInfo OnReadyToSendDataForStream(Http2StreamId stream_id, + size_t max_length) override; + bool SendDataFrame(Http2StreamId stream_id, absl::string_view frame_header, + size_t payload_bytes) override; void OnConnectionError(ConnectionError error) override; bool OnFrameHeader(Http2StreamId stream_id, size_t length, uint8_t type, uint8_t flags) override; diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor_test.cc index bf2dee2016..a979a66cee 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/recording_http2_visitor_test.cc @@ -1,6 +1,7 @@ #include "quiche/http2/adapter/recording_http2_visitor.h" #include +#include #include "quiche/http2/adapter/http2_protocol.h" #include "quiche/http2/adapter/http2_visitor_interface.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/test_frame_sequence.cc b/yass/third_party/quiche/src/quiche/http2/adapter/test_frame_sequence.cc index fab40834c7..bae140db9d 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/test_frame_sequence.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/test_frame_sequence.cc @@ -2,6 +2,9 @@ #include #include +#include +#include +#include #include "quiche/http2/adapter/http2_util.h" #include "quiche/http2/adapter/oghttp2_util.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/test_utils.cc b/yass/third_party/quiche/src/quiche/http2/adapter/test_utils.cc index 76416abb42..83445e0c8e 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/test_utils.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/test_utils.cc @@ -1,7 +1,9 @@ #include "quiche/http2/adapter/test_utils.h" +#include #include #include +#include #include "absl/strings/str_format.h" #include "quiche/http2/adapter/http2_visitor_interface.h" @@ -18,72 +20,101 @@ using ConnectionError = Http2VisitorInterface::ConnectionError; } // anonymous namespace -TestDataFrameSource::TestDataFrameSource(Http2VisitorInterface& visitor, - bool has_fin) - : visitor_(visitor), has_fin_(has_fin) {} - -void TestDataFrameSource::AppendPayload(absl::string_view payload) { - QUICHE_CHECK(!end_data_); - if (!payload.empty()) { - payload_fragments_.push_back(std::string(payload)); - current_fragment_ = payload_fragments_.front(); +TestVisitor::DataFrameHeaderInfo TestVisitor::OnReadyToSendDataForStream( + Http2StreamId stream_id, size_t max_length) { + auto it = data_map_.find(stream_id); + if (it == data_map_.end()) { + QUICHE_DVLOG(1) << "Source not in map; returning blocked."; + return {0, false, false}; } + DataPayload& payload = it->second; + if (payload.return_error) { + QUICHE_DVLOG(1) << "Simulating error response for stream " << stream_id; + return {DataFrameSource::kError, false, false}; + } + const absl::string_view prefix = payload.data.GetPrefix(); + const size_t frame_length = std::min(max_length, prefix.size()); + const bool is_final_fragment = payload.data.Read().size() <= 1; + const bool end_data = + payload.end_data && is_final_fragment && frame_length == prefix.size(); + const bool end_stream = payload.end_stream && end_data; + return {static_cast(frame_length), end_data, end_stream}; } -void TestDataFrameSource::EndData() { end_data_ = true; } - -std::pair TestDataFrameSource::SelectPayloadLength( - size_t max_length) { - if (return_error_) { - return {DataFrameSource::kError, false}; - } - // The stream is done if there's no more data, or if |max_length| is at least - // as large as the remaining data. - const bool end_data = end_data_ && (current_fragment_.empty() || - (payload_fragments_.size() == 1 && - max_length >= current_fragment_.size())); - const int64_t length = std::min(max_length, current_fragment_.size()); - return {length, end_data}; -} - -bool TestDataFrameSource::Send(absl::string_view frame_header, - size_t payload_length) { - QUICHE_LOG_IF(DFATAL, payload_length > current_fragment_.size()) - << "payload_length: " << payload_length - << " current_fragment_size: " << current_fragment_.size(); - const std::string concatenated = - absl::StrCat(frame_header, current_fragment_.substr(0, payload_length)); - const int64_t result = visitor_.OnReadyToSend(concatenated); - if (result < 0) { - // Write encountered error. - visitor_.OnConnectionError(ConnectionError::kSendError); - current_fragment_ = {}; - payload_fragments_.clear(); - return false; - } else if (result == 0) { - // Write blocked. - return false; - } else if (static_cast(result) < concatenated.size()) { - // Probably need to handle this better within this test class. - QUICHE_LOG(DFATAL) - << "DATA frame not fully flushed. Connection will be corrupt!"; - visitor_.OnConnectionError(ConnectionError::kSendError); - current_fragment_ = {}; - payload_fragments_.clear(); +bool TestVisitor::SendDataFrame(Http2StreamId stream_id, + absl::string_view frame_header, + size_t payload_bytes) { + // Sends the frame header. + const int64_t frame_result = OnReadyToSend(frame_header); + if (frame_result < 0 || + static_cast(frame_result) != frame_header.size()) { return false; } - if (payload_length > 0) { - current_fragment_.remove_prefix(payload_length); - } - if (current_fragment_.empty() && !payload_fragments_.empty()) { - payload_fragments_.erase(payload_fragments_.begin()); - if (!payload_fragments_.empty()) { - current_fragment_ = payload_fragments_.front(); + auto it = data_map_.find(stream_id); + if (it == data_map_.end()) { + if (payload_bytes > 0) { + // No bytes available to send; error condition. + return false; + } else { + return true; } } + DataPayload& payload = it->second; + absl::string_view frame_payload = payload.data.GetPrefix(); + if (frame_payload.size() < payload_bytes) { + // Not enough bytes available to send; error condition. + return false; + } + frame_payload = frame_payload.substr(0, payload_bytes); + // Sends the frame payload. + const int64_t payload_result = OnReadyToSend(frame_payload); + if (payload_result < 0 || + static_cast(payload_result) != frame_payload.size()) { + return false; + } + payload.data.RemovePrefix(payload_bytes); return true; } +void TestVisitor::AppendPayloadForStream(Http2StreamId stream_id, + absl::string_view payload) { + // Allocates and appends a chunk of memory to hold `payload`, in case the test + // is depending on specific DATA frame boundaries. + auto char_data = std::unique_ptr(new char[payload.size()]); + std::copy(payload.begin(), payload.end(), char_data.get()); + data_map_[stream_id].data.Append(std::move(char_data), payload.size()); +} + +void TestVisitor::SetEndData(Http2StreamId stream_id, bool end_stream) { + DataPayload& payload = data_map_[stream_id]; + payload.end_data = true; + payload.end_stream = end_stream; +} + +void TestVisitor::SimulateError(Http2StreamId stream_id) { + DataPayload& payload = data_map_[stream_id]; + payload.return_error = true; +} + +VisitorDataSource::VisitorDataSource(Http2VisitorInterface& visitor, + Http2StreamId stream_id) + : visitor_(visitor), stream_id_(stream_id) {} + +bool VisitorDataSource::send_fin() const { return has_fin_; } + +std::pair VisitorDataSource::SelectPayloadLength( + size_t max_length) { + auto [payload_length, end_data, end_stream] = + visitor_.OnReadyToSendDataForStream(stream_id_, max_length); + has_fin_ = end_stream; + return {payload_length, end_data}; +} + +bool VisitorDataSource::Send(absl::string_view frame_header, + size_t payload_length) { + return visitor_.SendDataFrame(stream_id_, frame_header, payload_length); +} + std::string EncodeHeaders(const spdy::Http2HeaderBlock& entries) { spdy::HpackEncoder encoder; encoder.DisableCompression(); diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/test_utils.h b/yass/third_party/quiche/src/quiche/http2/adapter/test_utils.h index 3d5e2ed4cf..5c7a6872cc 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/test_utils.h +++ b/yass/third_party/quiche/src/quiche/http2/adapter/test_utils.h @@ -7,6 +7,7 @@ #include "absl/container/flat_hash_map.h" #include "absl/strings/string_view.h" +#include "quiche/http2/adapter/chunked_buffer.h" #include "quiche/http2/adapter/data_source.h" #include "quiche/http2/adapter/http2_protocol.h" #include "quiche/http2/adapter/mock_http2_visitor.h" @@ -58,6 +59,17 @@ class QUICHE_NO_EXPORT TestVisitor } } + DataFrameHeaderInfo OnReadyToSendDataForStream(Http2StreamId stream_id, + size_t max_length) override; + bool SendDataFrame(Http2StreamId stream_id, absl::string_view frame_header, + size_t payload_bytes) override; + + // Test methods to manipulate the data frame payload to send for a stream. + void AppendPayloadForStream(Http2StreamId stream_id, + absl::string_view payload); + void SetEndData(Http2StreamId stream_id, bool end_stream); + void SimulateError(Http2StreamId stream_id); + const std::string& data() { return data_; } void Clear() { data_.clear(); } @@ -69,36 +81,34 @@ class QUICHE_NO_EXPORT TestVisitor void set_has_write_error() { has_write_error_ = true; } private: + struct DataPayload { + ChunkedBuffer data; + bool end_data = false; + bool end_stream = false; + bool return_error = false; + }; std::string data_; absl::flat_hash_map> metadata_map_; + absl::flat_hash_map data_map_; size_t send_limit_ = std::numeric_limits::max(); bool is_write_blocked_ = false; bool has_write_error_ = false; }; -// A test DataFrameSource. Starts out in the empty, blocked state. -class QUICHE_NO_EXPORT TestDataFrameSource : public DataFrameSource { +// A DataFrameSource that invokes visitor methods. +class QUICHE_NO_EXPORT VisitorDataSource : public DataFrameSource { public: - TestDataFrameSource(Http2VisitorInterface& visitor, bool has_fin); - - void AppendPayload(absl::string_view payload); - void EndData(); - void SimulateError() { return_error_ = true; } + VisitorDataSource(Http2VisitorInterface& visitor, Http2StreamId stream_id); std::pair SelectPayloadLength(size_t max_length) override; bool Send(absl::string_view frame_header, size_t payload_length) override; - bool send_fin() const override { return has_fin_; } + bool send_fin() const override; private: Http2VisitorInterface& visitor_; - std::vector payload_fragments_; - absl::string_view current_fragment_; + const Http2StreamId stream_id_; // Whether the stream should end with the final frame of data. - const bool has_fin_; - // Whether |payload_fragments_| contains the final segment of data. - bool end_data_ = false; - // Whether SelectPayloadLength() should return an error. - bool return_error_ = false; + bool has_fin_ = false; }; class QUICHE_NO_EXPORT TestMetadataSource : public MetadataSource { diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/test_utils_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/test_utils_test.cc index 9abeead631..8af0fd41ab 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/test_utils_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/test_utils_test.cc @@ -1,6 +1,8 @@ #include "quiche/http2/adapter/test_utils.h" #include +#include +#include #include "quiche/common/platform/api/quiche_test.h" #include "quiche/spdy/core/spdy_framer.h" diff --git a/yass/third_party/quiche/src/quiche/http2/adapter/window_manager_test.cc b/yass/third_party/quiche/src/quiche/http2/adapter/window_manager_test.cc index f6617c5677..12f091d662 100644 --- a/yass/third_party/quiche/src/quiche/http2/adapter/window_manager_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/adapter/window_manager_test.cc @@ -1,5 +1,6 @@ #include "quiche/http2/adapter/window_manager.h" +#include #include #include "absl/functional/bind_front.h" diff --git a/yass/third_party/quiche/src/quiche/http2/core/http2_trace_logging.cc b/yass/third_party/quiche/src/quiche/http2/core/http2_trace_logging.cc index 7d6a883add..30988a9248 100644 --- a/yass/third_party/quiche/src/quiche/http2/core/http2_trace_logging.cc +++ b/yass/third_party/quiche/src/quiche/http2/core/http2_trace_logging.cc @@ -2,6 +2,9 @@ #include #include +#include +#include +#include #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/http2/decoder/decode_status.cc b/yass/third_party/quiche/src/quiche/http2/decoder/decode_status.cc index c5887ad4b2..0aad77aed1 100644 --- a/yass/third_party/quiche/src/quiche/http2/decoder/decode_status.cc +++ b/yass/third_party/quiche/src/quiche/http2/decoder/decode_status.cc @@ -4,6 +4,8 @@ #include "quiche/http2/decoder/decode_status.h" +#include + #include "quiche/common/platform/api/quiche_bug_tracker.h" #include "quiche/common/platform/api/quiche_logging.h" diff --git a/yass/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder.cc b/yass/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder.cc index 14b34308ff..8748603930 100644 --- a/yass/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder.cc @@ -4,6 +4,8 @@ #include "quiche/http2/decoder/http2_frame_decoder.h" +#include + #include "quiche/http2/decoder/decode_status.h" #include "quiche/http2/hpack/varint/hpack_varint_decoder.h" #include "quiche/http2/http2_constants.h" diff --git a/yass/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder_test.cc b/yass/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder_test.cc index cd408805dd..c884e68b4b 100644 --- a/yass/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder_test.cc @@ -6,6 +6,7 @@ // Tests of Http2FrameDecoder. +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/altsvc_payload_decoder.cc b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/altsvc_payload_decoder.cc index 8602f703a1..67fc7b7162 100644 --- a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/altsvc_payload_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/altsvc_payload_decoder.cc @@ -6,6 +6,8 @@ #include +#include + #include "absl/base/macros.h" #include "quiche/http2/decoder/decode_buffer.h" #include "quiche/http2/decoder/http2_frame_decoder_listener.h" diff --git a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/data_payload_decoder.cc b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/data_payload_decoder.cc index e0c7ab0577..13837877e4 100644 --- a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/data_payload_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/data_payload_decoder.cc @@ -6,6 +6,8 @@ #include +#include + #include "absl/base/macros.h" #include "quiche/http2/decoder/decode_buffer.h" #include "quiche/http2/decoder/http2_frame_decoder_listener.h" diff --git a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/goaway_payload_decoder.cc b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/goaway_payload_decoder.cc index fca781c246..2ea52d9335 100644 --- a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/goaway_payload_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/goaway_payload_decoder.cc @@ -6,6 +6,8 @@ #include +#include + #include "absl/base/macros.h" #include "quiche/http2/decoder/decode_buffer.h" #include "quiche/http2/decoder/http2_frame_decoder_listener.h" diff --git a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/headers_payload_decoder.cc b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/headers_payload_decoder.cc index e3517ffabe..123c354c15 100644 --- a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/headers_payload_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/headers_payload_decoder.cc @@ -6,6 +6,8 @@ #include +#include + #include "absl/base/macros.h" #include "quiche/http2/decoder/decode_buffer.h" #include "quiche/http2/decoder/http2_frame_decoder_listener.h" diff --git a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/priority_update_payload_decoder.cc b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/priority_update_payload_decoder.cc index 2c74251c20..d07c183c8f 100644 --- a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/priority_update_payload_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/priority_update_payload_decoder.cc @@ -6,6 +6,8 @@ #include +#include + #include "absl/base/macros.h" #include "quiche/http2/decoder/decode_buffer.h" #include "quiche/http2/decoder/http2_frame_decoder_listener.h" diff --git a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/push_promise_payload_decoder.cc b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/push_promise_payload_decoder.cc index 50a403e112..60da74ea0d 100644 --- a/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/push_promise_payload_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/decoder/payload_decoders/push_promise_payload_decoder.cc @@ -6,6 +6,8 @@ #include +#include + #include "absl/base/macros.h" #include "quiche/http2/decoder/decode_buffer.h" #include "quiche/http2/decoder/http2_frame_decoder_listener.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_collector_test.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_collector_test.cc index 5edfe1c020..5d67d0da8a 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_collector_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_collector_test.cc @@ -4,6 +4,8 @@ #include "quiche/http2/test_tools/hpack_block_collector.h" +#include + // Tests of HpackBlockCollector. Not intended to be comprehensive, as // HpackBlockCollector is itself support for testing HpackBlockDecoder, and // should be pretty thoroughly exercised via the tests of HpackBlockDecoder. diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_decoder.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_decoder.cc index f47c806de6..80dc076ba4 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_decoder.cc @@ -5,6 +5,8 @@ #include "quiche/http2/hpack/decoder/hpack_block_decoder.h" #include +#include +#include #include "absl/strings/str_cat.h" #include "quiche/common/platform/api/quiche_flag_utils.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_decoder_test.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_decoder_test.cc index 1fc75509f0..14fd0879a5 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_decoder_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_decoder_test.cc @@ -7,6 +7,7 @@ // Tests of HpackBlockDecoder. #include +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_state.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_state.cc index 459a4758e4..f28c9294e8 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_state.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_state.cc @@ -4,6 +4,7 @@ #include "quiche/http2/hpack/decoder/hpack_decoder_state.h" +#include #include #include "quiche/http2/http2_constants.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_string_buffer.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_string_buffer.cc index ab2bb128dc..fb7e6b808f 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_string_buffer.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_string_buffer.cc @@ -4,6 +4,8 @@ #include "quiche/http2/hpack/decoder/hpack_decoder_string_buffer.h" +#include +#include #include #include "quiche/common/platform/api/quiche_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_string_buffer_test.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_string_buffer_test.cc index 4d98964a86..a54c51191e 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_string_buffer_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_string_buffer_test.cc @@ -7,6 +7,7 @@ // Tests of HpackDecoderStringBuffer. #include +#include #include #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_tables.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_tables.cc index 41cffa7575..fdd5cdd386 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_tables.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_tables.cc @@ -4,6 +4,11 @@ #include "quiche/http2/hpack/decoder/hpack_decoder_tables.h" +#include +#include +#include +#include + #include "absl/strings/str_cat.h" #include "quiche/http2/hpack/http2_hpack_constants.h" #include "quiche/common/platform/api/quiche_logging.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder.cc index 23ef25ab38..41edf54248 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder.cc @@ -7,6 +7,9 @@ #include #include +#include +#include +#include #include "absl/base/macros.h" #include "quiche/common/platform/api/quiche_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder_test.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder_test.cc index aefadd1d2e..684bd417ed 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder_test.cc @@ -7,6 +7,7 @@ // Tests of HpackEntryDecoder. #include +#include #include "quiche/http2/test_tools/hpack_block_builder.h" #include "quiche/http2/test_tools/hpack_entry_collector.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_type_decoder.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_type_decoder.cc index e5694d4641..4890177d23 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_type_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_type_decoder.cc @@ -4,6 +4,10 @@ #include "quiche/http2/hpack/decoder/hpack_entry_type_decoder.h" +#include +#include +#include + #include "absl/strings/str_cat.h" #include "quiche/common/platform/api/quiche_bug_tracker.h" #include "quiche/common/platform/api/quiche_flag_utils.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder.cc index f2a4bf8066..b5cba12eb4 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder.cc @@ -4,6 +4,9 @@ #include "quiche/http2/hpack/decoder/hpack_string_decoder.h" +#include +#include + #include "absl/strings/str_cat.h" namespace http2 { diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder_test.cc b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder_test.cc index 8a15e4b4f9..db3389d97a 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder_test.cc @@ -4,6 +4,8 @@ #include "quiche/http2/hpack/decoder/hpack_string_decoder.h" +#include + // Tests of HpackStringDecoder. #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/http2_hpack_constants.cc b/yass/third_party/quiche/src/quiche/http2/hpack/http2_hpack_constants.cc index e4a71b8fe9..759e37a2f0 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/http2_hpack_constants.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/http2_hpack_constants.cc @@ -4,6 +4,9 @@ #include "quiche/http2/hpack/http2_hpack_constants.h" +#include +#include + #include "absl/strings/str_cat.h" namespace http2 { diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_decoder.cc b/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_decoder.cc index 3727557d27..71abbbb478 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_decoder.cc @@ -6,6 +6,9 @@ #include #include +#include +#include +#include #include "quiche/common/platform/api/quiche_logging.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_encoder.cc b/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_encoder.cc index aa16ea34e0..0186dfcbf7 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_encoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_encoder.cc @@ -4,6 +4,8 @@ #include "quiche/http2/hpack/huffman/hpack_huffman_encoder.h" +#include + #include "quiche/http2/hpack/huffman/huffman_spec_tables.h" #include "quiche/common/platform/api/quiche_logging.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_transcoder_test.cc b/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_transcoder_test.cc index b3addbf44c..759680100c 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_transcoder_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_transcoder_test.cc @@ -6,6 +6,9 @@ #include +#include +#include + #include "absl/strings/string_view.h" #include "quiche/http2/decoder/decode_buffer.h" #include "quiche/http2/decoder/decode_status.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_decoder.cc b/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_decoder.cc index 48f5aa3769..da1c2f4965 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_decoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_decoder.cc @@ -4,6 +4,9 @@ #include "quiche/http2/hpack/varint/hpack_varint_decoder.h" +#include +#include + #include "absl/strings/str_cat.h" namespace http2 { diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_decoder_test.cc b/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_decoder_test.cc index a8655a801e..4c9cf5f8ca 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_decoder_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_decoder_test.cc @@ -10,6 +10,7 @@ #include #include +#include #include #include "absl/base/macros.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_encoder.cc b/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_encoder.cc index 07c5141916..790271d9a7 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_encoder.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_encoder.cc @@ -5,6 +5,7 @@ #include "quiche/http2/hpack/varint/hpack_varint_encoder.h" #include +#include #include "quiche/common/platform/api/quiche_logging.h" diff --git a/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_round_trip_test.cc b/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_round_trip_test.cc index d045d99180..fb61e5f635 100644 --- a/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_round_trip_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_round_trip_test.cc @@ -9,8 +9,11 @@ #include +#include #include +#include #include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/http2/http2_constants.cc b/yass/third_party/quiche/src/quiche/http2/http2_constants.cc index 704917567b..6792f835aa 100644 --- a/yass/third_party/quiche/src/quiche/http2/http2_constants.cc +++ b/yass/third_party/quiche/src/quiche/http2/http2_constants.cc @@ -4,6 +4,8 @@ #include "quiche/http2/http2_constants.h" +#include + #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/http2/http2_structures.cc b/yass/third_party/quiche/src/quiche/http2/http2_structures.cc index c77cfeb463..89b9c300c7 100644 --- a/yass/third_party/quiche/src/quiche/http2/http2_structures.cc +++ b/yass/third_party/quiche/src/quiche/http2/http2_structures.cc @@ -5,7 +5,9 @@ #include "quiche/http2/http2_structures.h" #include // For std::memcmp +#include #include +#include #include "absl/strings/escaping.h" #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/frame_parts.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/frame_parts.cc index 824c8648a1..382ba2ef66 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/frame_parts.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/frame_parts.cc @@ -5,6 +5,8 @@ #include "quiche/http2/test_tools/frame_parts.h" #include +#include +#include #include #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/frame_parts_collector.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/frame_parts_collector.cc index 2b8f6162c6..abd950a940 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/frame_parts_collector.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/frame_parts_collector.cc @@ -4,6 +4,7 @@ #include "quiche/http2/test_tools/frame_parts_collector.h" +#include #include #include "quiche/http2/test_tools/http2_structures_test_util.h" diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_block_collector.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_block_collector.cc index 643806182c..a0cafd48c1 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_block_collector.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_block_collector.cc @@ -6,6 +6,7 @@ #include #include +#include #include "quiche/http2/test_tools/verify_macros.h" #include "quiche/common/platform/api/quiche_logging.h" diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.cc index 77cfb6ecb3..3a3d1b5d73 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.cc @@ -4,6 +4,9 @@ #include "quiche/http2/test_tools/hpack_entry_collector.h" +#include +#include + #include "absl/strings/str_cat.h" #include "quiche/http2/hpack/http2_hpack_constants.h" #include "quiche/http2/test_tools/hpack_string_collector.h" diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_example_test.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_example_test.cc index a445a7854a..a6bdfae865 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_example_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_example_test.cc @@ -1,5 +1,7 @@ #include "quiche/http2/test_tools/hpack_example.h" +#include + // Tests of HpackExampleToStringOrDie. #include "quiche/common/platform/api/quiche_test.h" diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_string_collector.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_string_collector.cc index 1110c3ae8a..3121ea8843 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_string_collector.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/hpack_string_collector.cc @@ -8,6 +8,7 @@ #include #include +#include #include "absl/strings/escaping.h" #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/http2_constants_test_util.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/http2_constants_test_util.cc index ddb5cbdff6..203fddaa22 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/http2_constants_test_util.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/http2_constants_test_util.cc @@ -4,6 +4,8 @@ #include "quiche/http2/test_tools/http2_constants_test_util.h" +#include + namespace http2 { namespace test { diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/http2_random.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/http2_random.cc index 8ef8f98563..bfd487266c 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/http2_random.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/http2_random.cc @@ -1,5 +1,7 @@ #include "quiche/http2/test_tools/http2_random.h" +#include + #include "absl/strings/escaping.h" #include "openssl/chacha.h" #include "openssl/rand.h" diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/http2_random_test.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/http2_random_test.cc index 2cf5ba735a..d0e62c49ca 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/http2_random_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/http2_random_test.cc @@ -1,6 +1,8 @@ #include "quiche/http2/test_tools/http2_random.h" +#include #include +#include #include "quiche/common/platform/api/quiche_test.h" diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/payload_decoder_base_test_util.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/payload_decoder_base_test_util.cc index 702c72535e..431f7c5047 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/payload_decoder_base_test_util.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/payload_decoder_base_test_util.cc @@ -4,6 +4,8 @@ #include "quiche/http2/test_tools/payload_decoder_base_test_util.h" +#include + #include "quiche/http2/test_tools/frame_decoder_state_test_util.h" #include "quiche/http2/test_tools/http2_structures_test_util.h" #include "quiche/common/platform/api/quiche_test.h" diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/random_decoder_test_base_test.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/random_decoder_test_base_test.cc index f5fe67ed4d..1c7e6bdccf 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/random_decoder_test_base_test.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/random_decoder_test_base_test.cc @@ -3,6 +3,7 @@ #include #include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/http2/test_tools/random_util.cc b/yass/third_party/quiche/src/quiche/http2/test_tools/random_util.cc index cf171bb634..012f10671b 100644 --- a/yass/third_party/quiche/src/quiche/http2/test_tools/random_util.cc +++ b/yass/third_party/quiche/src/quiche/http2/test_tools/random_util.cc @@ -5,6 +5,7 @@ #include "quiche/http2/test_tools/random_util.h" #include +#include namespace http2 { namespace test { diff --git a/yass/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_integration_test.cc b/yass/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_integration_test.cc index 535b5857f7..9bce90e342 100644 --- a/yass/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_integration_test.cc +++ b/yass/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_integration_test.cc @@ -1,6 +1,7 @@ #include #include +#include #include "absl/strings/escaping.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response_test.cc b/yass/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response_test.cc index 4ff5f50900..bcb91a83bf 100644 --- a/yass/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response_test.cc +++ b/yass/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response_test.cc @@ -4,6 +4,7 @@ #include #include +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_header_key_config.cc b/yass/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_header_key_config.cc index 36932683f3..00507e7cca 100644 --- a/yass/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_header_key_config.cc +++ b/yass/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_header_key_config.cc @@ -2,7 +2,9 @@ #include #include +#include #include +#include #include #include "absl/memory/memory.h" diff --git a/yass/third_party/quiche/src/quiche/quic/bindings/quic_libevent.cc b/yass/third_party/quiche/src/quiche/quic/bindings/quic_libevent.cc index a053d3512f..144e8bba1d 100644 --- a/yass/third_party/quiche/src/quiche/quic/bindings/quic_libevent.cc +++ b/yass/third_party/quiche/src/quiche/quic/bindings/quic_libevent.cc @@ -5,6 +5,7 @@ #include "quiche/quic/bindings/quic_libevent.h" #include +#include #include "absl/time/time.h" #include "event2/event.h" diff --git a/yass/third_party/quiche/src/quiche/quic/bindings/quic_libevent_test.cc b/yass/third_party/quiche/src/quiche/quic/bindings/quic_libevent_test.cc index e6f2427f8a..c56557b6f4 100644 --- a/yass/third_party/quiche/src/quiche/quic/bindings/quic_libevent_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/bindings/quic_libevent_test.cc @@ -4,6 +4,7 @@ #include "quiche/quic/bindings/quic_libevent.h" +#include #include #include "absl/memory/memory.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_base.cc b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_base.cc index 666406f700..4b34030730 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_base.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_base.cc @@ -5,6 +5,9 @@ #include "quiche/quic/core/batch_writer/quic_batch_writer_base.h" #include +#include +#include +#include #include "quiche/quic/platform/api/quic_export.h" #include "quiche/quic/platform/api/quic_flags.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_buffer.cc b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_buffer.cc index 6fa7059b7f..4bfaa25854 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_buffer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_buffer.cc @@ -4,7 +4,9 @@ #include "quiche/quic/core/batch_writer/quic_batch_writer_buffer.h" +#include #include +#include namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_buffer_test.cc b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_buffer_test.cc index f3d04b5362..6691bc4990 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_buffer_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_buffer_test.cc @@ -4,8 +4,11 @@ #include "quiche/quic/core/batch_writer/quic_batch_writer_buffer.h" +#include #include #include +#include +#include #include "quiche/quic/core/quic_constants.h" #include "quiche/quic/platform/api/quic_ip_address.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_test.cc b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_test.cc index 4a0683088f..a46471db6f 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_batch_writer_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/batch_writer/quic_batch_writer_test.h" +#include + #include "quiche/quic/core/batch_writer/quic_gso_batch_writer.h" #include "quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_gso_batch_writer.cc b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_gso_batch_writer.cc index 6f45894cc4..6213e8602a 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_gso_batch_writer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_gso_batch_writer.cc @@ -7,6 +7,8 @@ #include #include +#include +#include #include "quiche/quic/core/quic_linux_socket_utils.h" #include "quiche/quic/platform/api/quic_server_stats.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_gso_batch_writer_test.cc b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_gso_batch_writer_test.cc index ecb4c8135a..88aa891a8e 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_gso_batch_writer_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_gso_batch_writer_test.cc @@ -10,6 +10,7 @@ #include #include #include +#include #include "quiche/quic/platform/api/quic_ip_address.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.cc b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.cc index 0c724b2724..0ed7e72c30 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.h" +#include +#include + namespace quic { QuicSendmmsgBatchWriter::QuicSendmmsgBatchWriter( diff --git a/yass/third_party/quiche/src/quiche/quic/core/chlo_extractor.cc b/yass/third_party/quiche/src/quiche/quic/core/chlo_extractor.cc index 800efbd7a0..94af81d154 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/chlo_extractor.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/chlo_extractor.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/chlo_extractor.h" +#include +#include + #include "absl/strings/match.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/crypto/crypto_framer.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/chlo_extractor_test.cc b/yass/third_party/quiche/src/quiche/quic/core/chlo_extractor_test.cc index 6b49fdcab6..c64a145244 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/chlo_extractor_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/chlo_extractor_test.cc @@ -7,6 +7,7 @@ #include #include #include +#include #include "absl/base/macros.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bandwidth_sampler.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bandwidth_sampler.cc index 6b93c13503..f41c80e172 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bandwidth_sampler.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bandwidth_sampler.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/congestion_control/bandwidth_sampler.h" #include +#include #include "quiche/quic/core/quic_types.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bandwidth_sampler_test.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bandwidth_sampler_test.cc index 7d3d54b80d..50027dd3e0 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bandwidth_sampler_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bandwidth_sampler_test.cc @@ -4,8 +4,10 @@ #include "quiche/quic/core/congestion_control/bandwidth_sampler.h" +#include #include #include +#include #include "quiche/quic/core/quic_bandwidth.h" #include "quiche/quic/core/quic_time.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_drain.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_drain.cc index c13e9d81e2..3d5d137a2e 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_drain.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_drain.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/congestion_control/bbr2_drain.h" +#include +#include + #include "quiche/quic/core/congestion_control/bbr2_sender.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc index ff614ab1b9..1584d022a3 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/congestion_control/bbr2_misc.h" +#include +#include + #include "quiche/quic/core/congestion_control/bandwidth_sampler.h" #include "quiche/quic/core/quic_bandwidth.h" #include "quiche/quic/core/quic_time.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_bw.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_bw.cc index cb07b9af71..2f6c037f9c 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_bw.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_bw.cc @@ -4,6 +4,10 @@ #include "quiche/quic/core/congestion_control/bbr2_probe_bw.h" +#include +#include +#include + #include "quiche/quic/core/congestion_control/bbr2_misc.h" #include "quiche/quic/core/congestion_control/bbr2_sender.h" #include "quiche/quic/core/quic_bandwidth.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_rtt.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_rtt.cc index f425fd4efa..f7ce3513c4 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_rtt.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_rtt.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/congestion_control/bbr2_probe_rtt.h" +#include +#include + #include "quiche/quic/core/congestion_control/bbr2_sender.h" #include "quiche/quic/core/quic_time.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_sender.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_sender.cc index 6f884d87a9..60869fbb83 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_sender.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_sender.cc @@ -4,7 +4,11 @@ #include "quiche/quic/core/congestion_control/bbr2_sender.h" +#include #include +#include +#include +#include #include "quiche/quic/core/congestion_control/bandwidth_sampler.h" #include "quiche/quic/core/congestion_control/bbr2_drain.h" @@ -193,7 +197,8 @@ void Bbr2Sender::ApplyConnectionOptions( if (ContainsQuicTag(connection_options, kB206)) { params_.startup_full_loss_count = params_.probe_bw_full_loss_count; } - if (ContainsQuicTag(connection_options, kBBPD)) { + if (GetQuicReloadableFlag(quic_bbr2_enable_bbpd_by_default) || + ContainsQuicTag(connection_options, kBBPD)) { // Derived constant to ensure fairness. params_.probe_bw_probe_down_pacing_gain = 0.91; } diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_simulator_test.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_simulator_test.cc index 76bd106258..7bae93d726 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_simulator_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_simulator_test.cc @@ -2,10 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include +#include #include #include #include +#include #include +#include #include "absl/strings/str_cat.h" #include "quiche/quic/core/congestion_control/bbr2_misc.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_startup.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_startup.cc index 3c84f514be..a7d327f6b1 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_startup.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_startup.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/congestion_control/bbr2_startup.h" +#include +#include + #include "quiche/quic/core/congestion_control/bbr2_misc.h" #include "quiche/quic/core/congestion_control/bbr2_sender.h" #include "quiche/quic/core/quic_bandwidth.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender.cc index 322e7aa5d9..34bb0689a3 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/congestion_control/bbr_sender.h" #include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender_test.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender_test.cc index 696e364560..607f11544b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender_test.cc @@ -7,6 +7,7 @@ #include #include #include +#include #include #include "quiche/quic/core/congestion_control/rtt_stats.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/cubic_bytes_test.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/cubic_bytes_test.cc index 4899d516b1..710cd8854b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/cubic_bytes_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/cubic_bytes_test.cc @@ -4,6 +4,7 @@ #include "quiche/quic/core/congestion_control/cubic_bytes.h" +#include #include #include "quiche/quic/platform/api/quic_flags.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/general_loss_algorithm.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/general_loss_algorithm.cc index b92dc09d02..6a841b64ad 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/general_loss_algorithm.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/general_loss_algorithm.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/congestion_control/general_loss_algorithm.h" +#include + #include "quiche/quic/core/congestion_control/rtt_stats.h" #include "quiche/quic/core/quic_packets.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/general_loss_algorithm_test.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/general_loss_algorithm_test.cc index 4ec8a52934..1bebb8a800 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/general_loss_algorithm_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/general_loss_algorithm_test.cc @@ -6,6 +6,8 @@ #include #include +#include +#include #include "quiche/quic/core/congestion_control/rtt_stats.h" #include "quiche/quic/core/quic_unacked_packet_map.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/pacing_sender.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/pacing_sender.cc index 0f709553f0..687bf479e6 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/pacing_sender.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/pacing_sender.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/congestion_control/pacing_sender.h" +#include + #include "quiche/quic/core/quic_bandwidth.h" #include "quiche/quic/platform/api/quic_flag_utils.h" #include "quiche/quic/platform/api/quic_flags.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/rtt_stats.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/rtt_stats.cc index c3b01039b1..9d937b636b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/rtt_stats.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/rtt_stats.cc @@ -4,6 +4,7 @@ #include "quiche/quic/core/congestion_control/rtt_stats.h" +#include #include // std::abs #include "quiche/quic/platform/api/quic_flag_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/rtt_stats_test.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/rtt_stats_test.cc index e18e9ba8ed..bbd1e3c400 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/rtt_stats_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/rtt_stats_test.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/congestion_control/rtt_stats.h" #include +#include #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/test_tools/quic_test_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_test.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_test.cc index 76e61a344b..e80bbdb425 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_test.cc @@ -5,8 +5,10 @@ #include #include #include +#include #include #include +#include #include "absl/strings/str_cat.h" #include "quiche/quic/core/congestion_control/rtt_stats.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/uber_loss_algorithm.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/uber_loss_algorithm.cc index cdd8547a57..1dd5b5f6f9 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/uber_loss_algorithm.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/uber_loss_algorithm.cc @@ -5,6 +5,8 @@ #include "quiche/quic/core/congestion_control/uber_loss_algorithm.h" #include +#include +#include #include "quiche/quic/core/crypto/crypto_protocol.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/uber_loss_algorithm_test.cc b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/uber_loss_algorithm_test.cc index e2ada18e4c..b9e9fc4cc0 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/congestion_control/uber_loss_algorithm_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/congestion_control/uber_loss_algorithm_test.cc @@ -7,6 +7,7 @@ #include #include #include +#include #include "quiche/quic/core/congestion_control/rtt_stats.h" #include "quiche/quic/core/crypto/crypto_protocol.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/aead_base_encrypter.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/aead_base_encrypter.cc index 481eaa970a..928343f89e 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/aead_base_encrypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/aead_base_encrypter.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/crypto/aead_base_encrypter.h" +#include + #include "absl/base/macros.h" #include "absl/strings/string_view.h" #include "openssl/crypto.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_encrypter_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_encrypter_test.cc index 2c04aa757e..5c986159cd 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_encrypter_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_encrypter_test.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/base/macros.h" #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_base_decrypter.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_base_decrypter.cc index 2962854c17..1a05286394 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_base_decrypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_base_decrypter.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/crypto/aes_base_decrypter.h" +#include + #include "absl/strings/string_view.h" #include "openssl/aes.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_base_encrypter.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_base_encrypter.cc index 89ab645664..f37fc2dc79 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_base_encrypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/aes_base_encrypter.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/crypto/aes_base_encrypter.h" +#include + #include "absl/strings/string_view.h" #include "openssl/aes.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/cert_compressor.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/cert_compressor.cc index 4357b9c7c8..51302c025b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/cert_compressor.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/cert_compressor.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/cert_compressor_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/cert_compressor_test.cc index d98f4c770f..57ecc68300 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/cert_compressor_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/cert_compressor_test.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/strings/escaping.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_util.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_util.cc index 1f2ce870eb..3e599870da 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_util.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_util.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/crypto/certificate_util.h" +#include +#include + #include "absl/strings/str_format.h" #include "absl/strings/str_split.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_util_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_util_test.cc index 06d5c4f727..4fee1796f9 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_util_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_util_test.cc @@ -4,6 +4,11 @@ #include "quiche/quic/core/crypto/certificate_util.h" +#include +#include +#include +#include + #include "openssl/ssl.h" #include "quiche/quic/core/crypto/certificate_view.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view.cc index 5e83ae70e2..f5e485e650 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view.cc @@ -6,9 +6,12 @@ #include #include +#include #include #include #include +#include +#include #include "absl/strings/escaping.h" #include "absl/strings/match.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view_der_fuzzer.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view_der_fuzzer.cc index 81c91eb943..2ed6606870 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view_der_fuzzer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view_der_fuzzer.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include #include #include "quiche/quic/core/crypto/certificate_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view_test.cc index 109a205f51..a1159e8940 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/certificate_view_test.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include "absl/algorithm/container.h" #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_encrypter.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_encrypter.cc index 1adad076d9..f259deaf7c 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_encrypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_encrypter.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/crypto/chacha20_poly1305_encrypter.h" +#include + #include "openssl/evp.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_tls_encrypter.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_tls_encrypter.cc index fe6f6b44ac..0d7c69b102 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_tls_encrypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_tls_encrypter.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/crypto/chacha20_poly1305_tls_encrypter.h" +#include + #include "openssl/evp.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_decrypter.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_decrypter.cc index a90c9eff98..d24bbc2699 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_decrypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_decrypter.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/crypto/chacha_base_decrypter.h" #include +#include #include "absl/base/macros.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_encrypter.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_encrypter.cc index 847345130b..68274da04b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_encrypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_encrypter.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/crypto/chacha_base_encrypter.h" +#include + #include "absl/base/macros.h" #include "absl/strings/string_view.h" #include "openssl/chacha.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/client_proof_source.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/client_proof_source.cc index 94c64909a7..71b4754505 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/client_proof_source.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/client_proof_source.cc @@ -4,6 +4,11 @@ #include "quiche/quic/core/crypto/client_proof_source.h" +#include +#include +#include +#include + #include "absl/strings/match.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/client_proof_source_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/client_proof_source_test.cc index 36b9dff09c..ed2a50dae6 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/client_proof_source_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/client_proof_source_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/crypto/client_proof_source.h" +#include + #include "quiche/quic/platform/api/quic_expect_bug.h" #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/test_tools/test_certificates.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_framer.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_framer.cc index 57a949ed6d..1fbe19e901 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_framer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_framer.cc @@ -4,6 +4,7 @@ #include "quiche/quic/core/crypto/crypto_framer.h" +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake_message_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake_message_test.cc index bdc051c2bd..ef0d740ad4 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake_message_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake_message_test.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/crypto/crypto_handshake_message.h" +#include +#include + #include "quiche/quic/core/crypto/crypto_handshake.h" #include "quiche/quic/core/crypto/crypto_protocol.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h index 243369b8c2..6d5750b71e 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h @@ -298,6 +298,7 @@ const QuicTag kNCMR = TAG('N', 'C', 'M', 'R'); // Do not attempt connection // Allows disabling defer_send_in_response_to_packets in QuicConnection. const QuicTag kDFER = TAG('D', 'F', 'E', 'R'); // Do not defer sending. +const QuicTag kCDFR = TAG('C', 'D', 'F', 'R'); // Defer sending on client. // Pacing options. const QuicTag kNPCO = TAG('N', 'P', 'C', 'O'); // No pacing offload. diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_secret_boxer.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_secret_boxer.cc index 2be495d92c..6860bec0b3 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_secret_boxer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_secret_boxer.cc @@ -5,7 +5,10 @@ #include "quiche/quic/core/crypto/crypto_secret_boxer.h" #include +#include #include +#include +#include #include "absl/strings/string_view.h" #include "openssl/aead.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_utils.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_utils.cc index f19c327771..ad224c225b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_utils.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_utils.cc @@ -4,9 +4,12 @@ #include "quiche/quic/core/crypto/crypto_utils.h" +#include #include +#include #include #include +#include #include "absl/base/macros.h" #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_utils_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_utils_test.cc index 6bc17cf4a6..707c3e2ab7 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_utils_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/crypto_utils_test.cc @@ -4,6 +4,7 @@ #include "quiche/quic/core/crypto/crypto_utils.h" +#include #include #include "absl/base/macros.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/curve25519_key_exchange.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/curve25519_key_exchange.cc index 5340b41107..e2401f9daa 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/curve25519_key_exchange.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/curve25519_key_exchange.cc @@ -6,6 +6,7 @@ #include #include +#include #include #include "absl/memory/memory.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/key_exchange.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/key_exchange.cc index 38dea001f1..45781daa64 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/key_exchange.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/key_exchange.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/crypto/key_exchange.h" +#include + #include "absl/strings/string_view.h" #include "quiche/quic/core/crypto/curve25519_key_exchange.h" #include "quiche/quic/core/crypto/p256_key_exchange.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/null_decrypter.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/null_decrypter.cc index af0c444769..f684491e08 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/null_decrypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/null_decrypter.cc @@ -5,6 +5,8 @@ #include "quiche/quic/core/crypto/null_decrypter.h" #include +#include +#include #include "absl/numeric/int128.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/null_encrypter.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/null_encrypter.cc index 87a3f32ac4..abaa458964 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/null_encrypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/null_encrypter.cc @@ -4,6 +4,10 @@ #include "quiche/quic/core/crypto/null_encrypter.h" +#include +#include +#include + #include "absl/numeric/int128.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_data_writer.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source.cc index b340bc546d..4114216a62 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source.cc @@ -4,7 +4,9 @@ #include "quiche/quic/core/crypto/proof_source.h" +#include #include +#include #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source_x509.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source_x509.cc index c14722bcc2..bd4378644e 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source_x509.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source_x509.cc @@ -6,6 +6,8 @@ #include #include +#include +#include #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source_x509_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source_x509_test.cc index 6db9c75ca1..666859c7d0 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source_x509_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_source_x509_test.cc @@ -5,6 +5,8 @@ #include "quiche/quic/core/crypto/proof_source_x509.h" #include +#include +#include #include "absl/strings/string_view.h" #include "openssl/ssl.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_verifier.h b/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_verifier.h index b7717848b3..fe4a80808c 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_verifier.h +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/proof_verifier.h @@ -74,7 +74,7 @@ class QUICHE_EXPORT ProofVerifier { // The signature uses SHA-256 as the hash function and PSS padding in the // case of RSA. virtual QuicAsyncStatus VerifyProof( - const std::string& hostname, const uint16_t port, + const std::string& hostname, uint16_t port, const std::string& server_config, QuicTransportVersion transport_version, absl::string_view chlo_hash, const std::vector& certs, const std::string& cert_sct, const std::string& signature, @@ -100,7 +100,7 @@ class QUICHE_EXPORT ProofVerifier { // will call back, on the original thread, via |callback| when complete. // In this case, the ProofVerifier will take ownership of |callback|. virtual QuicAsyncStatus VerifyCertChain( - const std::string& hostname, const uint16_t port, + const std::string& hostname, uint16_t port, const std::vector& certs, const std::string& ocsp_response, const std::string& cert_sct, const ProofVerifyContext* context, std::string* error_details, std::unique_ptr* details, diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache.cc index 32f115dca7..287d2c0cca 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache.cc @@ -4,6 +4,10 @@ #include "quiche/quic/core/crypto/quic_client_session_cache.h" +#include +#include +#include + #include "quiche/quic/core/quic_clock.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache_test.cc index 82877d6115..843851505e 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache_test.cc @@ -4,7 +4,10 @@ #include "quiche/quic/core/crypto/quic_client_session_cache.h" +#include #include +#include +#include #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/test_tools/mock_clock.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_compressed_certs_cache.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_compressed_certs_cache.cc index dabbf2402a..e4c6cafd75 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_compressed_certs_cache.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_compressed_certs_cache.cc @@ -4,7 +4,9 @@ #include "quiche/quic/core/crypto/quic_compressed_certs_cache.h" +#include #include +#include namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_compressed_certs_cache_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_compressed_certs_cache_test.cc index b98f9f2cbb..b68fa6500b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_compressed_certs_cache_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_compressed_certs_cache_test.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/crypto/quic_compressed_certs_cache.h" #include +#include #include "absl/strings/str_cat.h" #include "quiche/quic/core/crypto/cert_compressor.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.cc index 3458c6974d..e0026e8af1 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.cc @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include "absl/base/macros.h" #include "absl/memory/memory.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config_test.cc index 7556592f1c..03671118ff 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config_test.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/crypto/quic_crypto_client_config.h" #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/crypto/proof_verifier.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.cc index 39ba6f342e..7acc867dc8 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.cc @@ -10,6 +10,7 @@ #include #include #include +#include #include "absl/base/attributes.h" #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config_test.cc index ed7ffdb981..6b517f4d7d 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config_test.cc @@ -8,6 +8,8 @@ #include #include +#include +#include #include "absl/strings/match.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_decrypter.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_decrypter.cc index da0e809acb..3cd4485885 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_decrypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_decrypter.cc @@ -4,6 +4,7 @@ #include "quiche/quic/core/crypto/quic_decrypter.h" +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_encrypter.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_encrypter.cc index 151b8d058c..c9f571a435 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_encrypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/quic_encrypter.cc @@ -4,6 +4,7 @@ #include "quiche/quic/core/crypto/quic_encrypter.h" +#include #include #include "openssl/tls1.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/tls_client_connection.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/tls_client_connection.cc index 7436b23b9b..d70737d3a6 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/tls_client_connection.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/tls_client_connection.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/crypto/tls_client_connection.h" +#include +#include + namespace quic { TlsClientConnection::TlsClientConnection(SSL_CTX* ssl_ctx, Delegate* delegate, diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/tls_connection.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/tls_connection.cc index 1977aa9eb6..66e26b7904 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/tls_connection.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/tls_connection.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/crypto/tls_connection.h" +#include + #include "absl/strings/string_view.h" #include "openssl/ssl.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc index af655d2017..1aaa8209c3 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc @@ -4,11 +4,15 @@ #include "quiche/quic/core/crypto/transport_parameters.h" +#include #include #include #include #include +#include +#include #include +#include #include "absl/strings/escaping.h" #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters_test.cc index 62fffd6f32..b6d4b37296 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters_test.cc @@ -5,8 +5,11 @@ #include "quiche/quic/core/crypto/transport_parameters.h" #include +#include +#include #include #include +#include #include "absl/base/macros.h" #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.cc index fc8cffd402..a784fb6cbc 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include "absl/strings/escaping.h" #include "absl/strings/match.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier_test.cc b/yass/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier_test.cc index 11c769d76e..30b4959b03 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier_test.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.h" #include +#include #include "absl/strings/escaping.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.cc b/yass/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.cc index 4a22b63d5e..ab85baf7ad 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/deterministic_connection_id_generator.h" +#include + #include "quiche/quic/core/quic_utils.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator_test.cc b/yass/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator_test.cc index 47195cca41..4f99d93bc1 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator_test.cc @@ -5,6 +5,8 @@ #include "quiche/quic/core/deterministic_connection_id_generator.h" #include +#include +#include #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/test_tools/quic_test_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frame.cc index 1e42b7dfcd..ae6a2c953e 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frame.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/frames/quic_ack_frame.h" +#include +#include + #include "quiche/quic/core/quic_constants.h" #include "quiche/quic/core/quic_interval.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frequency_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frequency_frame.cc index 9d2fc31dad..7faf7f1fa2 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frequency_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frequency_frame.cc @@ -6,6 +6,7 @@ #include #include +#include namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_blocked_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_blocked_frame.cc index d06ec7bc96..3ee3d9b261 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_blocked_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_blocked_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_blocked_frame.h" +#include + #include "quiche/quic/core/quic_types.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_connection_close_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_connection_close_frame.cc index 640101e682..432c6571cf 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_connection_close_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_connection_close_frame.cc @@ -5,6 +5,8 @@ #include "quiche/quic/core/frames/quic_connection_close_frame.h" #include +#include +#include #include "quiche/quic/core/quic_constants.h" #include "quiche/quic/core/quic_error_codes.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_crypto_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_crypto_frame.cc index 11ccf6832e..0f3f8653b4 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_crypto_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_crypto_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_crypto_frame.h" +#include + #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_frame.cc index b0bf32913a..6002ecdc58 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_frame.cc @@ -4,6 +4,11 @@ #include "quiche/quic/core/frames/quic_frame.h" +#include +#include +#include +#include + #include "quiche/quic/core/frames/quic_new_connection_id_frame.h" #include "quiche/quic/core/frames/quic_reset_stream_at_frame.h" #include "quiche/quic/core/frames/quic_retire_connection_id_frame.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_frames_test.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_frames_test.cc index d585c68644..e41ff7a82b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_frames_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_frames_test.cc @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include +#include + #include "quiche/quic/core/frames/quic_ack_frame.h" #include "quiche/quic/core/frames/quic_blocked_frame.h" #include "quiche/quic/core/frames/quic_connection_close_frame.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_goaway_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_goaway_frame.cc index 19447e56b2..880fe95e25 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_goaway_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_goaway_frame.cc @@ -4,6 +4,7 @@ #include "quiche/quic/core/frames/quic_goaway_frame.h" +#include #include namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_handshake_done_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_handshake_done_frame.cc index e8a7110d7d..2cdd5b7f08 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_handshake_done_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_handshake_done_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_handshake_done_frame.h" +#include + namespace quic { QuicHandshakeDoneFrame::QuicHandshakeDoneFrame() diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_max_streams_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_max_streams_frame.cc index 594224b2fe..2cff8dfb17 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_max_streams_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_max_streams_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_max_streams_frame.h" +#include + namespace quic { QuicMaxStreamsFrame::QuicMaxStreamsFrame() diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.cc index 935d7ce39c..6d7cdf9a45 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/frames/quic_message_frame.h" +#include +#include + #include "quiche/quic/core/quic_constants.h" #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/common/platform/api/quiche_mem_slice.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_new_connection_id_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_new_connection_id_frame.cc index 2d3746051e..c3d36f733b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_new_connection_id_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_new_connection_id_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_new_connection_id_frame.h" +#include + namespace quic { QuicNewConnectionIdFrame::QuicNewConnectionIdFrame( diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_new_token_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_new_token_frame.cc index 7b5190d225..1fb1cd0081 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_new_token_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_new_token_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_new_token_frame.h" +#include + #include "absl/strings/escaping.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_padding_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_padding_frame.cc index 2170835cfa..9c83849306 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_padding_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_padding_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_padding_frame.h" +#include + namespace quic { std::ostream& operator<<(std::ostream& os, diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_path_challenge_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_path_challenge_frame.cc index 5f4f57b762..28d3b2b28a 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_path_challenge_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_path_challenge_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_path_challenge_frame.h" +#include + #include "absl/strings/escaping.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_path_response_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_path_response_frame.cc index 0f7a412196..5f280c3cca 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_path_response_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_path_response_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_path_response_frame.h" +#include + #include "absl/strings/escaping.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ping_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ping_frame.cc index c28e671fec..815cb90f2e 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ping_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_ping_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_ping_frame.h" +#include + namespace quic { QuicPingFrame::QuicPingFrame() : QuicInlinedFrame(PING_FRAME) {} diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_retire_connection_id_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_retire_connection_id_frame.cc index 93e7e49dda..cec3ee9b76 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_retire_connection_id_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_retire_connection_id_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_retire_connection_id_frame.h" +#include + namespace quic { QuicRetireConnectionIdFrame::QuicRetireConnectionIdFrame( diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_rst_stream_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_rst_stream_frame.cc index 124fad6da4..59befc19f5 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_rst_stream_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_rst_stream_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_rst_stream_frame.h" +#include + #include "quiche/quic/core/quic_error_codes.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stop_sending_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stop_sending_frame.cc index 057e60fa33..118643acfe 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stop_sending_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stop_sending_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_stop_sending_frame.h" +#include + #include "quiche/quic/core/quic_error_codes.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stop_waiting_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stop_waiting_frame.cc index 32941aadd2..345c68b561 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stop_waiting_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stop_waiting_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_stop_waiting_frame.h" +#include + #include "quiche/quic/core/quic_constants.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stream_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stream_frame.cc index c6988a0e8d..b25558b891 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stream_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_stream_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_stream_frame.h" +#include + #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_streams_blocked_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_streams_blocked_frame.cc index 6d6a6d2f6e..96cedf820b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_streams_blocked_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_streams_blocked_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_streams_blocked_frame.h" +#include + namespace quic { QuicStreamsBlockedFrame::QuicStreamsBlockedFrame() diff --git a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_window_update_frame.cc b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_window_update_frame.cc index 87795c3e49..d480dd6b26 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/frames/quic_window_update_frame.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/frames/quic_window_update_frame.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/frames/quic_window_update_frame.h" +#include + #include "quiche/quic/core/quic_types.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/end_to_end_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/end_to_end_test.cc index 09b7645c84..f3388ebf9e 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/end_to_end_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/end_to_end_test.cc @@ -2,10 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include +#include #include #include #include #include +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/http_constants.cc b/yass/third_party/quiche/src/quiche/quic/core/http/http_constants.cc index 4bd8d626dc..7dbb585583 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/http_constants.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/http_constants.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/http/http_constants.h" +#include + #include "absl/strings/str_cat.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder.cc b/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder.cc index 4ddcbcb520..1df14164c7 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder.cc @@ -4,7 +4,10 @@ #include "quiche/quic/core/http/http_decoder.h" +#include #include +#include +#include #include "absl/base/attributes.h" #include "absl/strings/string_view.h" @@ -43,9 +46,7 @@ HttpDecoder::HttpDecoder(Visitor* visitor) current_type_field_length_(0), remaining_type_field_length_(0), error_(QUIC_NO_ERROR), - error_detail_(""), - enable_metadata_decoding_( - GetQuicReloadableFlag(quic_enable_http3_metadata_decoding)) { + error_detail_("") { QUICHE_DCHECK(visitor_); } @@ -284,10 +285,8 @@ bool HttpDecoder::ReadFrameLength(QuicDataReader* reader) { continue_processing = visitor_->OnAcceptChFrameStart(header_length); break; default: - if (enable_metadata_decoding_ && - current_frame_type_ == - static_cast(HttpFrameType::METADATA)) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_enable_http3_metadata_decoding, 1, 3); + if (current_frame_type_ == + static_cast(HttpFrameType::METADATA)) { continue_processing = visitor_->OnMetadataFrameStart( header_length, current_frame_length_); break; @@ -386,10 +385,8 @@ bool HttpDecoder::ReadFramePayload(QuicDataReader* reader) { break; } default: { - if (enable_metadata_decoding_ && - current_frame_type_ == - static_cast(HttpFrameType::METADATA)) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_enable_http3_metadata_decoding, 2, 3); + if (current_frame_type_ == + static_cast(HttpFrameType::METADATA)) { QuicByteCount bytes_to_read = std::min( remaining_frame_length_, reader->BytesRemaining()); absl::string_view payload; @@ -456,10 +453,8 @@ bool HttpDecoder::FinishParsing() { break; } default: - if (enable_metadata_decoding_ && - current_frame_type_ == - static_cast(HttpFrameType::METADATA)) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_enable_http3_metadata_decoding, 3, 3); + if (current_frame_type_ == + static_cast(HttpFrameType::METADATA)) { continue_processing = visitor_->OnMetadataFrameEnd(); break; } diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder.h b/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder.h index a08c5621b9..6d305e4fbd 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder.h +++ b/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder.h @@ -282,9 +282,6 @@ class QUICHE_EXPORT HttpDecoder { std::array length_buffer_; // Remaining unparsed type field data. std::array type_buffer_; - - // Latched value of --quic_enable_http3_metadata_decoding. - const bool enable_metadata_decoding_; }; } // namespace quic diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder_test.cc index 4fe08c066b..b7f3255b24 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/http_decoder_test.cc @@ -498,9 +498,6 @@ TEST_F(HttpDecoderTest, HeadersFrame) { } TEST_F(HttpDecoderTest, MetadataFrame) { - if (!GetQuicReloadableFlag(quic_enable_http3_metadata_decoding)) { - return; - } InSequence s; std::string type_and_length_bytes; ASSERT_TRUE( diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/http_encoder.cc b/yass/third_party/quiche/src/quiche/quic/core/http/http_encoder.cc index de40d4af48..8ea61b9316 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/http_encoder.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/http_encoder.cc @@ -4,8 +4,12 @@ #include "quiche/quic/core/http/http_encoder.h" +#include #include #include +#include +#include +#include #include "quiche/quic/core/crypto/quic_random.h" #include "quiche/quic/core/quic_data_writer.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/http_encoder_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/http_encoder_test.cc index 6487992326..e252fc5f24 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/http_encoder_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/http_encoder_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/http/http_encoder.h" +#include + #include "absl/base/macros.h" #include "quiche/quic/platform/api/quic_flags.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/metadata_decoder_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/metadata_decoder_test.cc index 791a84de3f..7f913dbd23 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/metadata_decoder_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/metadata_decoder_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/http/metadata_decoder.h" +#include + #include "absl/strings/escaping.h" #include "quiche/quic/core/qpack/qpack_encoder.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream.cc index 9a53e66ca0..89a4a98ca3 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/http/quic_headers_stream.h" +#include +#include + #include "absl/base/macros.h" #include "quiche/quic/core/http/quic_spdy_session.h" #include "quiche/quic/core/quic_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream_test.cc index a086800a3f..20bad673c4 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream_test.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/http/quic_headers_stream.h" #include +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_receive_control_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_receive_control_stream_test.cc index e335d823c0..79773c08f5 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_receive_control_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_receive_control_stream_test.cc @@ -4,7 +4,9 @@ #include "quiche/quic/core/http/quic_receive_control_stream.h" +#include #include +#include #include "absl/memory/memory.h" #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream.cc index e9b06edb78..9c328aa9a1 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/base/macros.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream_test.cc index 922daa14ff..02b7cc2637 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream_test.cc @@ -4,8 +4,12 @@ #include "quiche/quic/core/http/quic_send_control_stream.h" +#include +#include +#include #include #include +#include #include "absl/strings/escaping.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc index 4aca5b57ca..4d22525f99 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc @@ -4,7 +4,13 @@ #include "quiche/quic/core/http/quic_server_session_base.h" +#include +#include +#include +#include +#include #include +#include #include "quiche/quic/core/proto/cached_network_parameters_proto.h" #include "quiche/quic/core/quic_connection.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base_test.cc index a811a4c47c..54b2d9566b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base_test.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include "absl/memory/memory.h" #include "quiche/quic/core/crypto/null_encrypter.h" @@ -568,8 +569,7 @@ TEST_P(QuicServerSessionBaseTest, BandwidthEstimates) { if (!VersionUsesHttp3(transport_version())) { session_->RegisterStreamPriority( QuicUtils::GetHeadersStreamId(transport_version()), - /*is_static=*/true, - QuicStreamPriority::Default(session_->priority_type())); + /*is_static=*/true, QuicStreamPriority()); } // Set some initial bandwidth values. diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc index 414e4331d5..9f01930708 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc @@ -4,6 +4,7 @@ #include "quiche/quic/core/http/quic_spdy_client_session.h" +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc index 2e51ead3c6..ad821ff2e5 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc @@ -4,7 +4,10 @@ #include "quiche/quic/core/http/quic_spdy_client_session_base.h" +#include +#include #include +#include #include "quiche/quic/core/quic_utils.h" #include "quiche/quic/platform/api/quic_flags.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.cc index 7d3a895820..d173277a0b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.cc @@ -4,6 +4,7 @@ #include "quiche/quic/core/http/quic_spdy_client_stream.h" +#include #include #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base.cc index 4e8d033cad..03025423d1 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/http/quic_spdy_server_stream_base.h" +#include +#include + #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/http/quic_spdy_session.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base_test.cc index 5864c612a6..d9a31bc8e2 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base_test.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/http/quic_spdy_server_stream_base.h" +#include +#include + #include "absl/memory/memory.h" #include "quiche/quic/core/crypto/null_encrypter.h" #include "quiche/quic/platform/api/quic_flags.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc index 7f7f8320f1..687e29efbe 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc @@ -9,6 +9,7 @@ #include #include #include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session_test.cc index 9903e7931b..f6406656bd 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session_test.cc @@ -6,6 +6,8 @@ #include #include +#include +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc index 035d21f30a..59405a67e7 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc @@ -213,9 +213,7 @@ QuicSpdyStream::QuicSpdyStream(QuicStreamId id, QuicSpdySession* spdy_session, decoder_(http_decoder_visitor_.get()), sequencer_offset_(0), is_decoder_processing_input_(false), - ack_listener_(nullptr), - last_sent_priority_( - QuicStreamPriority::Default(spdy_session->priority_type())) { + ack_listener_(nullptr) { QUICHE_DCHECK_EQ(session()->connection(), spdy_session->connection()); QUICHE_DCHECK_EQ(transport_version(), spdy_session->transport_version()); QUICHE_DCHECK(!QuicUtils::IsCryptoStreamId(transport_version(), id)); @@ -249,9 +247,7 @@ QuicSpdyStream::QuicSpdyStream(PendingStream* pending, decoder_(http_decoder_visitor_.get()), sequencer_offset_(sequencer()->NumBytesConsumed()), is_decoder_processing_input_(false), - ack_listener_(nullptr), - last_sent_priority_( - QuicStreamPriority::Default(spdy_session->priority_type())) { + ack_listener_(nullptr) { QUICHE_DCHECK_EQ(session()->connection(), spdy_session->connection()); QUICHE_DCHECK_EQ(transport_version(), spdy_session->transport_version()); QUICHE_DCHECK(!QuicUtils::IsCryptoStreamId(transport_version(), id())); @@ -534,9 +530,6 @@ void QuicSpdyStream::OnStreamHeadersPriority( const spdy::SpdyStreamPrecedence& precedence) { QUICHE_DCHECK_EQ(Perspective::IS_SERVER, session()->connection()->perspective()); - if (session()->priority_type() != QuicPriorityType::kHttp) { - return; - } SetPriority(QuicStreamPriority(HttpStreamPriority{ precedence.spdy3_priority(), HttpStreamPriority::kDefaultIncremental})); } @@ -591,10 +584,19 @@ void QuicSpdyStream::OnHeadersDecoded(QuicHeaderList headers, OnStreamHeaderList(/* fin = */ false, headers_payload_length_, headers); + header_decoding_delay_ = QuicTime::Delta::Zero(); + if (blocked_on_decoding_headers_) { blocked_on_decoding_headers_ = false; // Continue decoding HTTP/3 frames. OnDataAvailable(); + const QuicTime now = session()->GetClock()->ApproximateNow(); + if (!header_block_received_time_.IsInitialized() || + now < header_block_received_time_) { + QUICHE_BUG(QuicSpdyStream_time_flows_backwards); + } else { + header_decoding_delay_ = now - header_block_received_time_; + } } } @@ -613,7 +615,7 @@ void QuicSpdyStream::MaybeSendPriorityUpdateFrame() { session()->perspective() != Perspective::IS_CLIENT) { return; } - if (spdy_session_->priority_type() != QuicPriorityType::kHttp) { + if (priority().type() != QuicPriorityType::kHttp) { return; } @@ -724,8 +726,6 @@ void QuicSpdyStream::OnTrailingHeadersComplete( } void QuicSpdyStream::RegisterMetadataVisitor(MetadataVisitor* visitor) { - QUIC_BUG_IF(Metadata visitor requires http3 metadata flag, - !GetQuicReloadableFlag(quic_enable_http3_metadata_decoding)); metadata_visitor_ = visitor; } @@ -737,9 +737,6 @@ void QuicSpdyStream::OnPriorityFrame( const spdy::SpdyStreamPrecedence& precedence) { QUICHE_DCHECK_EQ(Perspective::IS_SERVER, session()->connection()->perspective()); - if (session()->priority_type() != QuicPriorityType::kHttp) { - return; - } SetPriority(QuicStreamPriority(HttpStreamPriority{ precedence.spdy3_priority(), HttpStreamPriority::kDefaultIncremental})); } @@ -1140,6 +1137,7 @@ bool QuicSpdyStream::OnHeadersFrameEnd() { // |qpack_decoded_headers_accumulator_| is already reset. if (qpack_decoded_headers_accumulator_) { blocked_on_decoding_headers_ = true; + header_block_received_time_ = session()->GetClock()->ApproximateNow(); return false; } @@ -1460,7 +1458,7 @@ void QuicSpdyStream::ConvertToWebTransportDataStream( QuicSpdyStream::WebTransportDataStream::WebTransportDataStream( QuicSpdyStream* stream, WebTransportSessionId session_id) : session_id(session_id), - adapter(stream->spdy_session_, stream, stream->sequencer()) {} + adapter(stream->spdy_session_, stream, stream->sequencer(), session_id) {} void QuicSpdyStream::HandleReceivedDatagram(absl::string_view payload) { if (datagram_visitor_ == nullptr) { diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h index d33abedfcc..c0b7588c36 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "absl/base/attributes.h" @@ -341,6 +342,14 @@ class QUICHE_EXPORT QuicSpdyStream void RegisterMetadataVisitor(MetadataVisitor* visitor); void UnregisterMetadataVisitor(); + // Returns how long header decoding was delayed due to waiting for data to + // arrive on the QPACK encoder stream. + // Returns zero if header block could be decoded as soon as it was received. + // Returns `nullopt` if header block is not decoded yet. + std::optional header_decoding_delay() const { + return header_decoding_delay_; + } + protected: // Called when the received headers are too large. By default this will // reset the stream. @@ -529,6 +538,15 @@ class QUICHE_EXPORT QuicSpdyStream // Empty if the headers are valid. std::string invalid_request_details_; + + // Time when entire header block was received. + // Only set if decoding was blocked. + QuicTime header_block_received_time_ = QuicTime::Zero(); + + // Header decoding delay due to waiting for data on the QPACK encoder stream. + // Zero if header block could be decoded as soon as it was received. + // `nullopt` if header block is not decoded yet. + std::optional header_decoding_delay_; }; } // namespace quic diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_body_manager_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_body_manager_test.cc index a5d21da160..51c458c2a4 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_body_manager_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_body_manager_test.cc @@ -7,6 +7,7 @@ #include #include #include +#include #include "absl/base/macros.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_test.cc index d16217f992..e3f42ca595 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_test.cc @@ -4,10 +4,13 @@ #include "quiche/quic/core/http/quic_spdy_stream.h" +#include +#include #include #include #include #include +#include #include "absl/base/macros.h" #include "absl/memory/memory.h" @@ -57,6 +60,7 @@ using testing::HasSubstr; using testing::Invoke; using testing::InvokeWithoutArgs; using testing::MatchesRegex; +using testing::Optional; using testing::Pair; using testing::Return; using testing::SaveArg; @@ -2250,6 +2254,8 @@ TEST_P(QuicSpdyStreamTest, ImmediateHeaderDecodingWithDynamicTableEntries) { // Deliver dynamic table entry to decoder. session_->qpack_decoder()->OnInsertWithoutNameReference("foo", "bar"); + EXPECT_EQ(std::nullopt, stream_->header_decoding_delay()); + // HEADERS frame referencing first dynamic table entry. std::string encoded_headers; ASSERT_TRUE(absl::HexStringToBytes("020080", &encoded_headers)); @@ -2276,6 +2282,9 @@ TEST_P(QuicSpdyStreamTest, ImmediateHeaderDecodingWithDynamicTableEntries) { EXPECT_THAT(stream_->header_list(), ElementsAre(Pair("foo", "bar"))); stream_->ConsumeHeaderList(); + EXPECT_THAT(stream_->header_decoding_delay(), + Optional(QuicTime::Delta::Zero())); + // DATA frame. std::string data = DataFrame(kDataFramePayload); EXPECT_CALL(debug_visitor, @@ -2333,6 +2342,7 @@ TEST_P(QuicSpdyStreamTest, BlockedHeaderDecoding) { // Decoding is blocked because dynamic table entry has not been received yet. EXPECT_FALSE(stream_->headers_decompressed()); + EXPECT_EQ(std::nullopt, stream_->header_decoding_delay()); auto decoder_send_stream = QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get()); @@ -2348,6 +2358,10 @@ TEST_P(QuicSpdyStreamTest, BlockedHeaderDecoding) { /* offset = */ 1, _, _, _)); } EXPECT_CALL(debug_visitor, OnHeadersDecoded(stream_->id(), _)); + + const QuicTime::Delta delay = QuicTime::Delta::FromSeconds(1); + helper_.GetClock()->AdvanceTime(delay); + // Deliver dynamic table entry to decoder. session_->qpack_decoder()->OnInsertWithoutNameReference("foo", "bar"); EXPECT_TRUE(stream_->headers_decompressed()); @@ -2356,6 +2370,8 @@ TEST_P(QuicSpdyStreamTest, BlockedHeaderDecoding) { EXPECT_THAT(stream_->header_list(), ElementsAre(Pair("foo", "bar"))); stream_->ConsumeHeaderList(); + EXPECT_THAT(stream_->header_decoding_delay(), Optional(delay)); + // DATA frame. std::string data = DataFrame(kDataFramePayload); EXPECT_CALL(debug_visitor, @@ -2786,8 +2802,7 @@ class MockMetadataVisitor : public QuicSpdyStream::MetadataVisitor { }; TEST_P(QuicSpdyStreamIncrementalConsumptionTest, ReceiveMetadataFrame) { - if (!UsesHttp3() || - !GetQuicReloadableFlag(quic_enable_http3_metadata_decoding)) { + if (!UsesHttp3()) { return; } StrictMock metadata_visitor; @@ -2824,8 +2839,7 @@ TEST_P(QuicSpdyStreamIncrementalConsumptionTest, ReceiveMetadataFrame) { TEST_P(QuicSpdyStreamIncrementalConsumptionTest, ResetDuringMultipleMetadataFrames) { - if (!UsesHttp3() || - !GetQuicReloadableFlag(quic_enable_http3_metadata_decoding)) { + if (!UsesHttp3()) { return; } StrictMock metadata_visitor; diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc b/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc index d1f477d47b..e3d4472f41 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc @@ -7,6 +7,9 @@ #include #include #include +#include +#include +#include #include "absl/strings/string_view.h" @@ -312,7 +315,7 @@ WebTransportHttp3UnidirectionalStream::WebTransportHttp3UnidirectionalStream( PendingStream* pending, QuicSpdySession* session) : QuicStream(pending, session, /*is_static=*/false), session_(session), - adapter_(session, this, sequencer()), + adapter_(session, this, sequencer(), std::nullopt), needs_to_send_preamble_(false) { sequencer()->set_level_triggered(true); } @@ -321,7 +324,7 @@ WebTransportHttp3UnidirectionalStream::WebTransportHttp3UnidirectionalStream( QuicStreamId id, QuicSpdySession* session, WebTransportSessionId session_id) : QuicStream(id, session, /*is_static=*/false, WRITE_UNIDIRECTIONAL), session_(session), - adapter_(session, this, sequencer()), + adapter_(session, this, sequencer(), session_id), session_id_(session_id), needs_to_send_preamble_(true) {} @@ -372,6 +375,7 @@ bool WebTransportHttp3UnidirectionalStream::ReadSessionId() { } sequencer()->MarkConsumed(session_id_length); session_id_ = session_id; + adapter_.SetSessionId(session_id); session_->AssociateIncomingWebTransportStreamWithSession(session_id, id()); return true; } diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_stream_adapter.cc b/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_stream_adapter.cc index de21723ddb..5f84081dd6 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_stream_adapter.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_stream_adapter.cc @@ -5,6 +5,8 @@ #include "quiche/quic/core/http/web_transport_stream_adapter.h" #include +#include +#include #include #include @@ -16,6 +18,7 @@ #include "quiche/quic/core/quic_error_codes.h" #include "quiche/quic/core/quic_session.h" #include "quiche/quic/core/quic_stream.h" +#include "quiche/quic/core/quic_stream_priority.h" #include "quiche/quic/core/quic_stream_sequencer.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/core/web_transport_interface.h" @@ -29,8 +32,13 @@ namespace quic { WebTransportStreamAdapter::WebTransportStreamAdapter( - QuicSession* session, QuicStream* stream, QuicStreamSequencer* sequencer) - : session_(session), stream_(stream), sequencer_(sequencer) {} + QuicSession* session, QuicStream* stream, QuicStreamSequencer* sequencer, + std::optional session_id) + : session_(session), stream_(stream), sequencer_(sequencer) { + if (session_id.has_value()) { + SetSessionId(*session_id); + } +} WebTransportStream::ReadResult WebTransportStreamAdapter::Read( absl::Span buffer) { @@ -195,4 +203,40 @@ void WebTransportStreamAdapter::SendStopSending(WebTransportStreamError error) { QUIC_STREAM_CANCELLED, WebTransportErrorToHttp3(error))); } +void WebTransportStreamAdapter::SetPriority( + const webtransport::StreamPriority& priority) { + if (session_->priority_type() != QuicPriorityType::kWebTransport) { + return; + } + // If no session is yet available, associate with an invalid control stream; + // this will effectively result in the stream being associated with a fake + // session that has default urgency. + QuicStreamId session_id = + session_id_.value_or(std::numeric_limits::max()); + stream_->SetPriority(QuicStreamPriority(WebTransportStreamPriority{ + session_id, priority.send_group_id, priority.send_order})); +} + +void WebTransportStreamAdapter::SetSessionId(QuicStreamId id) { + session_id_ = id; + + if (session_->priority_type() != QuicPriorityType::kWebTransport) { + return; + } + // Inform the write scheduler that the stream now needs to be associated + // with a specific session. + QuicStreamPriority old_priority = stream_->priority(); + switch (old_priority.type()) { + case QuicPriorityType::kHttp: + stream_->SetPriority( + QuicStreamPriority(WebTransportStreamPriority{id, 0, 0})); + break; + case QuicPriorityType::kWebTransport: + stream_->SetPriority(QuicStreamPriority(WebTransportStreamPriority{ + id, old_priority.web_transport().send_group_number, + old_priority.web_transport().send_order})); + break; + } +} + } // namespace quic diff --git a/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_stream_adapter.h b/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_stream_adapter.h index 004a62f5c2..94f3ba4b0b 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_stream_adapter.h +++ b/yass/third_party/quiche/src/quiche/quic/core/http/web_transport_stream_adapter.h @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -17,6 +18,7 @@ #include "quiche/quic/core/quic_error_codes.h" #include "quiche/quic/core/quic_session.h" #include "quiche/quic/core/quic_stream.h" +#include "quiche/quic/core/quic_stream_priority.h" #include "quiche/quic/core/quic_stream_sequencer.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/core/web_transport_interface.h" @@ -31,7 +33,8 @@ namespace quic { class QUICHE_EXPORT WebTransportStreamAdapter : public webtransport::Stream { public: WebTransportStreamAdapter(QuicSession* session, QuicStream* stream, - QuicStreamSequencer* sequencer); + QuicStreamSequencer* sequencer, + std::optional session_id); // WebTransportStream implementation. ABSL_MUST_USE_RESULT ReadResult Read(absl::Span output) override; @@ -60,12 +63,16 @@ class QUICHE_EXPORT WebTransportStreamAdapter : public webtransport::Stream { stream_->Reset(QUIC_STREAM_CANCELLED); } + void SetPriority(const webtransport::StreamPriority& priority) override; + WebTransportStreamVisitor* visitor() override { return visitor_.get(); } // Calls that need to be passed from the corresponding QuicStream methods. void OnDataAvailable(); void OnCanWriteNewData(); + void SetSessionId(QuicStreamId id); + private: absl::Status CheckBeforeStreamWrite() const; @@ -73,6 +80,7 @@ class QUICHE_EXPORT WebTransportStreamAdapter : public webtransport::Stream { QuicStream* stream_; // Unowned. QuicStreamSequencer* sequencer_; // Unowned. std::unique_ptr visitor_; + std::optional session_id_; bool fin_read_ = false; }; diff --git a/yass/third_party/quiche/src/quiche/quic/core/io/quic_all_event_loops_test.cc b/yass/third_party/quiche/src/quiche/quic/core/io/quic_all_event_loops_test.cc index 386feb42c0..ebc776b160 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/io/quic_all_event_loops_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/io/quic_all_event_loops_test.cc @@ -14,6 +14,10 @@ #include #include +#include +#include +#include + #include "absl/cleanup/cleanup.h" #include "absl/memory/memory.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.cc b/yass/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.cc index cedd4de187..aafe414869 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.cc @@ -6,7 +6,10 @@ #include #include +#include #include +#include +#include #include "absl/types/span.h" #include "quiche/quic/core/io/quic_event_loop.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop_test.cc b/yass/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop_test.cc index 50f5a04ccc..502757d0f1 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop_test.cc @@ -9,6 +9,8 @@ #include #include +#include +#include #include #include "absl/memory/memory.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/legacy_quic_stream_id_manager_test.cc b/yass/third_party/quiche/src/quiche/quic/core/legacy_quic_stream_id_manager_test.cc index 1dcc0574f2..a6c2cf7a02 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/legacy_quic_stream_id_manager_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/legacy_quic_stream_id_manager_test.cc @@ -4,7 +4,9 @@ #include "quiche/quic/core/legacy_quic_stream_id_manager.h" +#include #include +#include #include "absl/strings/str_cat.h" #include "quiche/quic/core/quic_types.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_decoder_fuzzer.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_decoder_fuzzer.cc index 8927604ce8..0286a730d1 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_decoder_fuzzer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_decoder_fuzzer.cc @@ -6,7 +6,11 @@ #include #include +#include #include +#include +#include +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_encoder_stream_receiver_fuzzer.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_encoder_stream_receiver_fuzzer.cc index 53aaa63ade..c447559c97 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_encoder_stream_receiver_fuzzer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_encoder_stream_receiver_fuzzer.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/qpack/qpack_encoder_stream_receiver.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc index 36f7feff0b..a2ca2d0e29 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc @@ -7,6 +7,11 @@ #include #include #include +#include +#include +#include +#include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_blocking_manager.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_blocking_manager.h index ade3ee6011..4181eb4580 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_blocking_manager.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_blocking_manager.h @@ -22,8 +22,8 @@ class QpackBlockingManagerPeer; } // namespace test // Class to keep track of blocked streams and blocking dynamic table entries: -// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#blocked-decoding -// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#blocked-insertion +// https://rfc-editor.org/rfc/rfc9204.html#section-2.2.1. +// https://rfc-editor.org/rfc/rfc9204.html#section-2.1.2 class QUICHE_EXPORT QpackBlockingManager { public: using IndexSet = std::multiset; @@ -62,7 +62,7 @@ class QUICHE_EXPORT QpackBlockingManager { uint64_t smallest_blocking_index() const; // Returns the Known Received Count as defined at - // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#known-received-count. + // https://rfc-editor.org/rfc/rfc9204.html#section-2.1.4. uint64_t known_received_count() const { return known_received_count_; } // Required Insert Count for set of indices. diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator.cc index f2588fd467..428abe0d85 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/qpack/qpack_decoded_headers_accumulator.h" +#include + #include "absl/strings/string_view.h" #include "quiche/quic/core/qpack/qpack_decoder.h" #include "quiche/quic/core/qpack/qpack_header_table.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.cc index b5b581d66a..f128fc963a 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.cc @@ -4,6 +4,7 @@ #include "quiche/quic/core/qpack/qpack_decoder.h" +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.h index 3dda666a0b..0ec3a32b41 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.h @@ -121,7 +121,7 @@ class QUICHE_EXPORT QpackDecoder // acknowledgement for (through Header Acknowledgement and Insert Count // Increment instructions). The encoder must keep track of it in order to be // able to send Insert Count Increment instructions. See - // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#known-received-count. + // https://rfc-editor.org/rfc/rfc9204.html#section-2.1.4. uint64_t known_received_count_; }; diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_receiver.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_receiver.h index 0151d5fe11..9b858b996c 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_receiver.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_receiver.h @@ -23,7 +23,7 @@ class QUICHE_EXPORT QpackDecoderStreamReceiver public QpackStreamReceiver { public: // An interface for handling instructions decoded from the decoder stream, see - // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#rfc.section.5.3 + // https://rfc-editor.org/rfc/rfc9204.html#section-4.4. class QUICHE_EXPORT Delegate { public: virtual ~Delegate() = default; diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_receiver_test.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_receiver_test.cc index 0acb0fda06..73ae7d245a 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_receiver_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_receiver_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/qpack/qpack_decoder_stream_receiver.h" +#include + #include "absl/strings/escaping.h" #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_sender.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_sender.h index 32b19b3a3e..0b2bb3aed0 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_sender.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_sender.h @@ -23,7 +23,7 @@ class QUICHE_EXPORT QpackDecoderStreamSender { QpackDecoderStreamSender& operator=(const QpackDecoderStreamSender&) = delete; // Methods for serializing and buffering instructions, see - // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#rfc.section.5.3 + // https://rfc-editor.org/rfc/rfc9204.html#section-4.4. // 5.3.1 Insert Count Increment void SendInsertCountIncrement(uint64_t increment); diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_test.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_test.cc index 321445b78c..853ab541bc 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_test.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/qpack/qpack_decoder.h" #include +#include #include #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.cc index a4b48fe5c2..4433861fe8 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/qpack/qpack_encoder.h" #include +#include #include #include "absl/strings/str_cat.h" @@ -26,7 +27,7 @@ namespace { // with name reference) will be added to the dynamic table instead. This allows // the number of references to the draining entry to go to zero faster, so that // it can be evicted. See -// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#avoiding-blocked-insertions. +// https://rfc-editor.org/rfc/rfc9204.html#section-2.1.1.1. // TODO(bnc): Fine tune. const float kDrainingFraction = 0.25; @@ -120,54 +121,53 @@ QpackEncoder::Representations QpackEncoder::FirstPassEncode( absl::string_view name = header.first; absl::string_view value = header.second; - bool is_static; - uint64_t index; + QpackEncoderHeaderTable::MatchResult match_result = + header_table_.FindHeaderField(name, value); - auto match_type = - header_table_.FindHeaderField(name, value, &is_static, &index); - - switch (match_type) { - case QpackEncoderHeaderTable::MatchType::kNameAndValue: - if (is_static) { + switch (match_result.match_type) { + case QpackEncoderHeaderTable::MatchType::kNameAndValue: { + if (match_result.is_static) { // Refer to entry directly. - representations.push_back( - EncodeIndexedHeaderField(is_static, index, referred_indices)); + representations.push_back(EncodeIndexedHeaderField( + match_result.is_static, match_result.index, referred_indices)); break; } - if (index >= draining_index) { - // If allowed, refer to entry directly. - if (!blocking_allowed && index >= known_received_count) { + if (match_result.index >= draining_index) { + if (!blocking_allowed && match_result.index >= known_received_count) { blocked_stream_limit_exhausted = true; } else { - representations.push_back( - EncodeIndexedHeaderField(is_static, index, referred_indices)); + // Refer to entry directly. + representations.push_back(EncodeIndexedHeaderField( + match_result.is_static, match_result.index, referred_indices)); smallest_non_evictable_index = - std::min(smallest_non_evictable_index, index); + std::min(smallest_non_evictable_index, match_result.index); header_table_.set_dynamic_table_entry_referenced(); break; } } else { - // Entry is draining, needs to be duplicated. + // No new references should be added for entry to allow it to drain. + // Duplicate entry instead if possible. if (!blocking_allowed) { blocked_stream_limit_exhausted = true; } else if (QpackEntry::Size(name, value) > header_table_.MaxInsertSizeWithoutEvictingGivenEntry( - std::min(smallest_non_evictable_index, index))) { + std::min(smallest_non_evictable_index, + match_result.index))) { dynamic_table_insertion_blocked = true; } else { if (can_write_to_encoder_stream) { - // If allowed, duplicate entry and refer to it. encoder_stream_sender_.SendDuplicate( QpackAbsoluteIndexToEncoderStreamRelativeIndex( - index, header_table_.inserted_entry_count())); + match_result.index, + header_table_.inserted_entry_count())); uint64_t new_index = header_table_.InsertEntry(name, value); representations.push_back(EncodeIndexedHeaderField( - is_static, new_index, referred_indices)); + match_result.is_static, new_index, referred_indices)); smallest_non_evictable_index = - std::min(smallest_non_evictable_index, index); + std::min(smallest_non_evictable_index, match_result.index); header_table_.set_dynamic_table_entry_referenced(); break; @@ -175,25 +175,45 @@ QpackEncoder::Representations QpackEncoder::FirstPassEncode( } } - // Encode entry as string literals. - // TODO(b/112770235): Use already acknowledged entry with lower index if - // exists. - // TODO(b/112770235): Use static entry name with literal value if - // dynamic entry exists but cannot be used. - representations.push_back(EncodeLiteralHeaderField(name, value)); + // Match cannot be used. - break; + if (!better_compression_) { + // Encode entry as string literals. + representations.push_back(EncodeLiteralHeaderField(name, value)); + break; + } - case QpackEncoderHeaderTable::MatchType::kName: - if (is_static) { + QUIC_RELOADABLE_FLAG_COUNT(quic_better_qpack_compression); + + QpackEncoderHeaderTable::MatchResult match_result_name_only = + header_table_.FindHeaderName(name); + + // If no name match found, or if the matching entry is the same as the + // previous one (which could not be used), then encode header line as + // string literals. + if (match_result_name_only.match_type != + QpackEncoderHeaderTable::MatchType::kName || + (match_result_name_only.is_static == match_result.is_static && + match_result_name_only.index == match_result.index)) { + representations.push_back(EncodeLiteralHeaderField(name, value)); + break; + } + + match_result = match_result_name_only; + + ABSL_FALLTHROUGH_INTENDED; + } + + case QpackEncoderHeaderTable::MatchType::kName: { + if (match_result.is_static) { if (blocking_allowed && QpackEntry::Size(name, value) <= header_table_.MaxInsertSizeWithoutEvictingGivenEntry( smallest_non_evictable_index)) { // If allowed, insert entry into dynamic table and refer to it. if (can_write_to_encoder_stream) { - encoder_stream_sender_.SendInsertWithNameReference(is_static, - index, value); + encoder_stream_sender_.SendInsertWithNameReference( + match_result.is_static, match_result.index, value); uint64_t new_index = header_table_.InsertEntry(name, value); representations.push_back(EncodeIndexedHeaderField( /* is_static = */ false, new_index, referred_indices)); @@ -206,7 +226,8 @@ QpackEncoder::Representations QpackEncoder::FirstPassEncode( // Emit literal field with name reference. representations.push_back(EncodeLiteralHeaderFieldWithNameReference( - is_static, index, value, referred_indices)); + match_result.is_static, match_result.index, value, + referred_indices)); break; } @@ -215,49 +236,47 @@ QpackEncoder::Representations QpackEncoder::FirstPassEncode( blocked_stream_limit_exhausted = true; } else if (QpackEntry::Size(name, value) > header_table_.MaxInsertSizeWithoutEvictingGivenEntry( - std::min(smallest_non_evictable_index, index))) { + std::min(smallest_non_evictable_index, + match_result.index))) { dynamic_table_insertion_blocked = true; } else { // If allowed, insert entry with name reference and refer to it. if (can_write_to_encoder_stream) { encoder_stream_sender_.SendInsertWithNameReference( - is_static, + match_result.is_static, QpackAbsoluteIndexToEncoderStreamRelativeIndex( - index, header_table_.inserted_entry_count()), + match_result.index, header_table_.inserted_entry_count()), value); uint64_t new_index = header_table_.InsertEntry(name, value); representations.push_back(EncodeIndexedHeaderField( - is_static, new_index, referred_indices)); + match_result.is_static, new_index, referred_indices)); smallest_non_evictable_index = - std::min(smallest_non_evictable_index, index); + std::min(smallest_non_evictable_index, match_result.index); header_table_.set_dynamic_table_entry_referenced(); break; } } - if ((blocking_allowed || index < known_received_count) && - index >= draining_index) { + if ((blocking_allowed || match_result.index < known_received_count) && + match_result.index >= draining_index) { // If allowed, refer to entry name directly, with literal value. representations.push_back(EncodeLiteralHeaderFieldWithNameReference( - is_static, index, value, referred_indices)); + match_result.is_static, match_result.index, value, + referred_indices)); smallest_non_evictable_index = - std::min(smallest_non_evictable_index, index); + std::min(smallest_non_evictable_index, match_result.index); header_table_.set_dynamic_table_entry_referenced(); break; } - // Encode entry as string literals. - // TODO(b/112770235): Use already acknowledged entry with lower index if - // exists. - // TODO(b/112770235): Use static entry name with literal value if - // dynamic entry exists but cannot be used. representations.push_back(EncodeLiteralHeaderField(name, value)); break; + } - case QpackEncoderHeaderTable::MatchType::kNoMatch: + case QpackEncoderHeaderTable::MatchType::kNoMatch: { // If allowed, insert entry and refer to it. if (!blocking_allowed) { blocked_stream_limit_exhausted = true; @@ -285,6 +304,7 @@ QpackEncoder::Representations QpackEncoder::FirstPassEncode( representations.push_back(EncodeLiteralHeaderField(name, value)); break; + } } } diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.h index 0c2ffbf1fc..ae1d440548 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.h @@ -20,6 +20,7 @@ #include "quiche/quic/core/quic_types.h" #include "quiche/quic/platform/api/quic_export.h" #include "quiche/quic/platform/api/quic_exported_stats.h" +#include "quiche/quic/platform/api/quic_flags.h" #include "quiche/spdy/core/http2_header_block.h" namespace quic { @@ -154,6 +155,10 @@ class QUICHE_EXPORT QpackEncoder : public QpackDecoderStreamReceiver::Delegate { uint64_t maximum_blocked_streams_; QpackBlockingManager blocking_manager_; int header_list_count_; + + // Latched value of reloadable_flag_quic_better_qpack_compression. + const bool better_compression_ = + GetQuicReloadableFlag(quic_better_qpack_compression); }; // QpackEncoder::DecoderStreamErrorDelegate implementation that does nothing. diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_receiver.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_receiver.h index d1b485cb80..7ebd317c6d 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_receiver.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_receiver.h @@ -22,7 +22,7 @@ class QUICHE_EXPORT QpackEncoderStreamReceiver public QpackStreamReceiver { public: // An interface for handling instructions decoded from the encoder stream, see - // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#rfc.section.5.2 + // https://rfc-editor.org/rfc/rfc9204.html#section-4.3. class QUICHE_EXPORT Delegate { public: virtual ~Delegate() = default; diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_receiver_test.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_receiver_test.cc index 401281fe56..8085ca34ac 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_receiver_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_receiver_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/qpack/qpack_encoder_stream_receiver.h" +#include + #include "absl/strings/escaping.h" #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_sender.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_sender.h index 958da7eefa..df5d2006c2 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_sender.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_sender.h @@ -24,7 +24,7 @@ class QUICHE_EXPORT QpackEncoderStreamSender { QpackEncoderStreamSender& operator=(const QpackEncoderStreamSender&) = delete; // Methods for serializing and buffering instructions, see - // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#rfc.section.5.2 + // https://rfc-editor.org/rfc/rfc9204.html#section-4.3. // 5.2.1. Insert With Name Reference void SendInsertWithNameReference(bool is_static, uint64_t name_index, diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_test.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_test.cc index 5b775cd103..c8ed4624f0 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_test.cc @@ -10,6 +10,7 @@ #include "absl/strings/escaping.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" +#include "quiche/quic/core/qpack/qpack_instruction_encoder.h" #include "quiche/quic/platform/api/quic_flags.h" #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/test_tools/qpack/qpack_encoder_peer.h" @@ -30,6 +31,18 @@ namespace { // stream. constexpr uint64_t kTooManyBytesBuffered = 1024 * 1024; +std::string PrintToString(const testing::TestParamInfo& info) { + switch (info.param) { + case HuffmanEncoding::kEnabled: + return "HuffmanEnabled"; + case HuffmanEncoding::kDisabled: + return "HuffmanDisabled"; + } + + QUICHE_NOTREACHED(); + return "InvalidValue"; +} + // Mock QpackEncoder::DecoderStreamErrorDelegate implementation. class MockDecoderStreamErrorDelegate : public QpackEncoder::DecoderStreamErrorDelegate { @@ -41,10 +54,11 @@ class MockDecoderStreamErrorDelegate (override)); }; -class QpackEncoderTest : public QuicTestWithParam { +class QpackEncoderTest : public QuicTestWithParam { protected: QpackEncoderTest() - : encoder_(&decoder_stream_error_delegate_, HuffmanEncoding()), + : huffman_encoding_(GetParam()), + encoder_(&decoder_stream_error_delegate_, huffman_encoding_), encoder_stream_sent_byte_count_(0) { encoder_.set_qpack_stream_sender_delegate(&encoder_stream_sender_delegate_); encoder_.SetMaximumBlockedStreams(1); @@ -52,10 +66,8 @@ class QpackEncoderTest : public QuicTestWithParam { ~QpackEncoderTest() override = default; - bool DisableHuffmanEncoding() { return GetParam(); } - HuffmanEncoding HuffmanEncoding() { - return DisableHuffmanEncoding() ? HuffmanEncoding::kDisabled - : HuffmanEncoding::kEnabled; + bool HuffmanEnabled() const { + return huffman_encoding_ == HuffmanEncoding::kEnabled; } std::string Encode(const spdy::Http2HeaderBlock& header_list) { @@ -63,14 +75,17 @@ class QpackEncoderTest : public QuicTestWithParam { &encoder_stream_sent_byte_count_); } + const HuffmanEncoding huffman_encoding_; StrictMock decoder_stream_error_delegate_; StrictMock encoder_stream_sender_delegate_; QpackEncoder encoder_; QuicByteCount encoder_stream_sent_byte_count_; }; -INSTANTIATE_TEST_SUITE_P(DisableHuffmanEncoding, QpackEncoderTest, - testing::Values(false, true)); +INSTANTIATE_TEST_SUITE_P(HuffmanEncoding, QpackEncoderTest, + ::testing::ValuesIn({HuffmanEncoding::kEnabled, + HuffmanEncoding::kDisabled}), + PrintToString); TEST_P(QpackEncoderTest, Empty) { EXPECT_CALL(encoder_stream_sender_delegate_, NumBytesBuffered()) @@ -91,10 +106,10 @@ TEST_P(QpackEncoderTest, EmptyName) { std::string output = Encode(header_list); std::string expected_output; - if (DisableHuffmanEncoding()) { - ASSERT_TRUE(absl::HexStringToBytes("00002003666f6f", &expected_output)); - } else { + if (HuffmanEnabled()) { ASSERT_TRUE(absl::HexStringToBytes("0000208294e7", &expected_output)); + } else { + ASSERT_TRUE(absl::HexStringToBytes("00002003666f6f", &expected_output)); } EXPECT_EQ(expected_output, output); } @@ -107,10 +122,10 @@ TEST_P(QpackEncoderTest, EmptyValue) { std::string output = Encode(header_list); std::string expected_output; - if (DisableHuffmanEncoding()) { - ASSERT_TRUE(absl::HexStringToBytes("000023666f6f00", &expected_output)); - } else { + if (HuffmanEnabled()) { ASSERT_TRUE(absl::HexStringToBytes("00002a94e700", &expected_output)); + } else { + ASSERT_TRUE(absl::HexStringToBytes("000023666f6f00", &expected_output)); } EXPECT_EQ(expected_output, output); } @@ -135,11 +150,11 @@ TEST_P(QpackEncoderTest, Simple) { std::string output = Encode(header_list); std::string expected_output; - if (DisableHuffmanEncoding()) { + if (HuffmanEnabled()) { + ASSERT_TRUE(absl::HexStringToBytes("00002a94e703626172", &expected_output)); + } else { ASSERT_TRUE( absl::HexStringToBytes("000023666f6f03626172", &expected_output)); - } else { - ASSERT_TRUE(absl::HexStringToBytes("00002a94e703626172", &expected_output)); } EXPECT_EQ(expected_output, output); } @@ -154,14 +169,14 @@ TEST_P(QpackEncoderTest, Multiple) { std::string output = Encode(header_list); std::string expected_output_hex; - if (DisableHuffmanEncoding()) { - expected_output_hex = - "0000" // prefix - "23666f6f03626172"; // foo: bar - } else { + if (HuffmanEnabled()) { expected_output_hex = "0000" // prefix "2a94e703626172"; // foo: bar + } else { + expected_output_hex = + "0000" // prefix + "23666f6f03626172"; // foo: bar } expected_output_hex += "27005a5a5a5a5a5a5a" // 7 octet long header name, the smallest number @@ -199,12 +214,12 @@ TEST_P(QpackEncoderTest, StaticTable) { std::string output = Encode(header_list); std::string expected_output; - if (DisableHuffmanEncoding()) { - ASSERT_TRUE(absl::HexStringToBytes( - "0000d45f1008636f6d70726573735c03666f6f", &expected_output)); - } else { + if (HuffmanEnabled()) { ASSERT_TRUE(absl::HexStringToBytes("0000d45f108621e9aec2a11f5c8294e7", &expected_output)); + } else { + ASSERT_TRUE(absl::HexStringToBytes( + "0000d45f1008636f6d70726573735c03666f6f", &expected_output)); } EXPECT_EQ(expected_output, output); } @@ -226,7 +241,7 @@ TEST_P(QpackEncoderTest, DecoderStreamError) { OnDecoderStreamError(QUIC_QPACK_DECODER_STREAM_INTEGER_TOO_LARGE, Eq("Encoded integer too large."))); - QpackEncoder encoder(&decoder_stream_error_delegate_, HuffmanEncoding()); + QpackEncoder encoder(&decoder_stream_error_delegate_, huffman_encoding_); encoder.set_qpack_stream_sender_delegate(&encoder_stream_sender_delegate_); std::string input; ASSERT_TRUE(absl::HexStringToBytes("ffffffffffffffffffffff", &input)); @@ -241,20 +256,20 @@ TEST_P(QpackEncoderTest, SplitAlongNullCharacter) { std::string output = Encode(header_list); std::string expected_output; - if (DisableHuffmanEncoding()) { - ASSERT_TRUE( - absl::HexStringToBytes("0000" // prefix - "23666f6f03626172" // foo: bar - "23666f6f03626172" // foo: bar - "23666f6f0362617a", // foo: bar - &expected_output)); - } else { + if (HuffmanEnabled()) { ASSERT_TRUE( absl::HexStringToBytes("0000" // prefix "2a94e703626172" // foo: bar "2a94e703626172" // foo: bar "2a94e70362617a", // foo: baz &expected_output)); + } else { + ASSERT_TRUE( + absl::HexStringToBytes("0000" // prefix + "23666f6f03626172" // foo: bar + "23666f6f03626172" // foo: bar + "23666f6f0362617a", // foo: bar + &expected_output)); } EXPECT_EQ(expected_output, output); } @@ -332,14 +347,14 @@ TEST_P(QpackEncoderTest, DynamicTable) { ASSERT_TRUE(absl::HexStringToBytes("3fe11f", &set_dyanamic_table_capacity)); // Insert three entries into the dynamic table. std::string insert_entries_hex; - if (DisableHuffmanEncoding()) { - insert_entries_hex = - "43" // insert without name reference - "666f6f"; // Huffman-encoded name "foo" - } else { + if (HuffmanEnabled()) { insert_entries_hex = "62" // insert without name reference - "94e7"; // Huffman-encoded name "foo" + "94e7"; // Huffman-encoded literal name "foo" + } else { + insert_entries_hex = + "43" // insert without name reference + "666f6f"; // literal name "foo" } insert_entries_hex += "03626172" // value "bar" @@ -383,16 +398,16 @@ TEST_P(QpackEncoderTest, SmallDynamicTable) { ASSERT_TRUE(absl::HexStringToBytes("3f07", &set_dyanamic_table_capacity)); // Insert one entry into the dynamic table. std::string insert_entry; - if (DisableHuffmanEncoding()) { + if (HuffmanEnabled()) { ASSERT_TRUE( - absl::HexStringToBytes("43" // insert without name reference - "666f6f" // Huffman-encoded name "foo" + absl::HexStringToBytes("62" // insert without name reference + "94e7" // Huffman-encoded literal name "foo" "03626172", // value "bar" &insert_entry)); } else { ASSERT_TRUE( - absl::HexStringToBytes("62" // insert without name reference - "94e7" // Huffman-encoded name "foo" + absl::HexStringToBytes("43" // insert without name reference + "666f6f" // literal name "foo" "03626172", // value "bar" &insert_entry)); } @@ -431,16 +446,16 @@ TEST_P(QpackEncoderTest, BlockedStream) { ASSERT_TRUE(absl::HexStringToBytes("3fe11f", &set_dyanamic_table_capacity)); // Insert one entry into the dynamic table. std::string insert_entry1; - if (DisableHuffmanEncoding()) { + if (HuffmanEnabled()) { ASSERT_TRUE( - absl::HexStringToBytes("43" // insert without name reference - "666f6f" // Huffman-encoded name "foo" + absl::HexStringToBytes("62" // insert without name reference + "94e7" // Huffman-encoded literal name "foo" "03626172", // value "bar" &insert_entry1)); } else { ASSERT_TRUE( - absl::HexStringToBytes("62" // insert without name reference - "94e7" // Huffman-encoded name "foo" + absl::HexStringToBytes("43" // insert without name reference + "666f6f" // literal name "foo" "03626172", // value "bar" &insert_entry1)); } @@ -467,12 +482,12 @@ TEST_P(QpackEncoderTest, BlockedStream) { header_list2["bar"] = "baz"; // no match std::string entries; - if (DisableHuffmanEncoding()) { + if (HuffmanEnabled()) { ASSERT_TRUE( absl::HexStringToBytes("0000" // prefix - "23666f6f" // literal name "foo" + "2a94e7" // literal name "foo" "03626172" // with literal value "bar" - "23666f6f" // literal name "foo" + "2a94e7" // literal name "foo" "0362617a" // with literal value "baz" "55" // name of static entry 5 "0362617a" // with literal value "baz" @@ -482,9 +497,9 @@ TEST_P(QpackEncoderTest, BlockedStream) { } else { ASSERT_TRUE( absl::HexStringToBytes("0000" // prefix - "2a94e7" // literal name "foo" + "23666f6f" // literal name "foo" "03626172" // with literal value "bar" - "2a94e7" // literal name "foo" + "23666f6f" // literal name "foo" "0362617a" // with literal value "baz" "55" // name of static entry 5 "0362617a" // with literal value "baz" @@ -527,28 +542,54 @@ TEST_P(QpackEncoderTest, BlockedStream) { // Stream 3 is blocked. Stream 4 is not allowed to block, but it can // reference already acknowledged dynamic entry 0. std::string expected2; - if (DisableHuffmanEncoding()) { - ASSERT_TRUE( - absl::HexStringToBytes("0200" // prefix - "80" // dynamic entry 0 - "23666f6f" // literal name "foo" - "0362617a" // with literal value "baz" - "26636f6f6b6965" // literal name "cookie" - "0362617a" // with literal value "baz" - "23626172" // literal name "bar" - "0362617a", // with literal value "baz" - &expected2)); + if (GetQuicReloadableFlag(quic_better_qpack_compression)) { + if (HuffmanEnabled()) { + ASSERT_TRUE( + absl::HexStringToBytes("0200" // prefix + "80" // dynamic entry 0 + "2a94e7" // literal name "foo" + "0362617a" // with literal value "baz" + "55" // name of static entry 5 + "0362617a" // with literal value "baz" + "23626172" // literal name "bar" + "0362617a", // with literal value "baz" + &expected2)); + } else { + ASSERT_TRUE( + absl::HexStringToBytes("0200" // prefix + "80" // dynamic entry 0 + "23666f6f" // literal name "foo" + "0362617a" // with literal value "baz" + "55" // name of static entry 5 + "0362617a" // with literal value "baz" + "23626172" // literal name "bar" + "0362617a", // with literal value "baz" + &expected2)); + } } else { - ASSERT_TRUE( - absl::HexStringToBytes("0200" // prefix - "80" // dynamic entry 0 - "2a94e7" // literal name "foo" - "0362617a" // with literal value "baz" - "2c21cfd4c5" // literal name "cookie" - "0362617a" // with literal value "baz" - "23626172" // literal name "bar" - "0362617a", // with literal value "baz" - &expected2)); + if (HuffmanEnabled()) { + ASSERT_TRUE( + absl::HexStringToBytes("0200" // prefix + "80" // dynamic entry 0 + "2a94e7" // literal name "foo" + "0362617a" // with literal value "baz" + "2c21cfd4c5" // literal name "cookie" + "0362617a" // with literal value "baz" + "23626172" // literal name "bar" + "0362617a", // with literal value "baz" + &expected2)); + } else { + ASSERT_TRUE( + absl::HexStringToBytes("0200" // prefix + "80" // dynamic entry 0 + "23666f6f" // literal name "foo" + "0362617a" // with literal value "baz" + "26636f6f6b6965" // literal name "cookie" + "0362617a" // with literal value "baz" + "23626172" // literal name "bar" + "0362617a", // with literal value "baz" + &expected2)); + } } EXPECT_EQ(expected2, encoder_.EncodeHeaderList(/* stream_id = */ 4, header_list2, @@ -653,10 +694,10 @@ TEST_P(QpackEncoderTest, Draining) { std::string entries = "0000" // prefix "2374776f"; // literal name "two" - if (DisableHuffmanEncoding()) { - entries += "03666f6f"; // literal name "foo" - } else { + if (HuffmanEnabled()) { entries += "8294e7"; // literal value "foo" + } else { + entries += "03666f6f"; // literal name "foo" } entries += "2374776f" // literal name "two" @@ -692,12 +733,12 @@ TEST_P(QpackEncoderTest, EncoderStreamWritesDisallowedThenAllowed) { // No Set Dynamic Table Capacity or Insert instructions are sent. // Headers are encoded as string literals. std::string entries; - if (DisableHuffmanEncoding()) { + if (HuffmanEnabled()) { ASSERT_TRUE( absl::HexStringToBytes("0000" // prefix - "23666f6f" // literal name "foo" + "2a94e7" // literal name "foo" "03626172" // with literal value "bar" - "23666f6f" // literal name "foo" + "2a94e7" // literal name "foo" "0362617a" // with literal value "baz" "55" // name of static entry 5 "0362617a", // with literal value "baz" @@ -705,9 +746,9 @@ TEST_P(QpackEncoderTest, EncoderStreamWritesDisallowedThenAllowed) { } else { ASSERT_TRUE( absl::HexStringToBytes("0000" // prefix - "2a94e7" // literal name "foo" + "23666f6f" // literal name "foo" "03626172" // with literal value "bar" - "2a94e7" // literal name "foo" + "23666f6f" // literal name "foo" "0362617a" // with literal value "baz" "55" // name of static entry 5 "0362617a", // with literal value "baz" @@ -734,14 +775,14 @@ TEST_P(QpackEncoderTest, EncoderStreamWritesDisallowedThenAllowed) { ASSERT_TRUE(absl::HexStringToBytes("3fe11f", &set_dyanamic_table_capacity)); // Insert three entries into the dynamic table. std::string insert_entries_hex; - if (DisableHuffmanEncoding()) { - insert_entries_hex = - "43" // insert without name reference - "666f6f"; // name "foo" - } else { + if (HuffmanEnabled()) { insert_entries_hex = "62" // insert without name reference - "94e7"; // Huffman-encoded name "foo" + "94e7"; // Huffman-encoded literal name "foo" + } else { + insert_entries_hex = + "43" // insert without name reference + "666f6f"; // literal name "foo" } insert_entries_hex += "03626172" // value "bar" @@ -783,14 +824,14 @@ TEST_P(QpackEncoderTest, EncoderStreamWritesAllowedThenDisallowed) { ASSERT_TRUE(absl::HexStringToBytes("3fe11f", &set_dyanamic_table_capacity)); // Insert three entries into the dynamic table. std::string insert_entries_hex; - if (DisableHuffmanEncoding()) { - insert_entries_hex = - "43" // insert without name reference - "666f6f"; // name "foo" - } else { + if (HuffmanEnabled()) { insert_entries_hex = "62" // insert without name reference - "94e7"; // Huffman-encoded name "foo" + "94e7"; // Huffman-encoded literal name "foo" + } else { + insert_entries_hex = + "43" // insert without name reference + "666f6f"; // literal name "foo" } insert_entries_hex += "03626172" // value "bar" @@ -861,16 +902,16 @@ TEST_P(QpackEncoderTest, UnackedEntryCannotBeEvicted) { ASSERT_TRUE(absl::HexStringToBytes("3f09", &set_dyanamic_table_capacity)); // Insert one entry into the dynamic table. std::string insert_entries1; - if (DisableHuffmanEncoding()) { + if (HuffmanEnabled()) { ASSERT_TRUE( - absl::HexStringToBytes("43" // insert without name reference - "666f6f" // Huffman-encoded name "foo" + absl::HexStringToBytes("62" // insert without name reference + "94e7" // Huffman-encoded literal name "foo" "03626172", // value "bar" &insert_entries1)); } else { ASSERT_TRUE( - absl::HexStringToBytes("62" // insert without name reference - "94e7" // Huffman-encoded name "foo" + absl::HexStringToBytes("43" // insert without name reference + "666f6f" // literal name "foo" "03626172", // value "bar" &insert_entries1)); } @@ -912,6 +953,178 @@ TEST_P(QpackEncoderTest, UnackedEntryCannotBeEvicted) { EXPECT_EQ(0u, header_table->dropped_entry_count()); } +// Header name and value match an entry in the dynamic table, but that entry +// cannot be used. If there is an entry with matching name in the static table, +// use that. +TEST_P(QpackEncoderTest, UseStaticTableNameOnlyMatch) { + EXPECT_CALL(encoder_stream_sender_delegate_, NumBytesBuffered()) + .WillRepeatedly(Return(0)); + encoder_.SetMaximumBlockedStreams(2); + encoder_.SetMaximumDynamicTableCapacity(4096); + encoder_.SetDynamicTableCapacity(4096); + + spdy::Http2HeaderBlock header_list; + header_list[":method"] = "bar"; + + // Set Dynamic Table Capacity instruction. + std::string set_dyanamic_table_capacity; + ASSERT_TRUE(absl::HexStringToBytes("3fe11f", &set_dyanamic_table_capacity)); + + // Insert one entry into the dynamic table. + std::string insert_entry1; + ASSERT_TRUE( + absl::HexStringToBytes("cf" // insert with name of static table entry 15 + "03626172", // literal value "bar" + &insert_entry1)); + EXPECT_CALL(encoder_stream_sender_delegate_, + WriteStreamData(Eq( + absl::StrCat(set_dyanamic_table_capacity, insert_entry1)))); + + std::string expected_output; + ASSERT_TRUE( + absl::HexStringToBytes("0200" // prefix + "80", // dynamic entry 0 + &expected_output)); + EXPECT_EQ(expected_output, + encoder_.EncodeHeaderList(/* stream_id = */ 1, header_list, + &encoder_stream_sent_byte_count_)); + EXPECT_EQ(insert_entry1.size(), encoder_stream_sent_byte_count_); + + // Stream 2 uses the same dynamic entry. + EXPECT_EQ(expected_output, + encoder_.EncodeHeaderList(/* stream_id = */ 2, header_list, + &encoder_stream_sent_byte_count_)); + EXPECT_EQ(0u, encoder_stream_sent_byte_count_); + + // Streams 1 and 2 are blocked, therefore stream 3 is not allowed to refer to + // the existing dynamic table entry, nor to add a new entry to the dynamic + // table. + if (GetQuicReloadableFlag(quic_better_qpack_compression)) { + ASSERT_TRUE(absl::HexStringToBytes( + "0000" // prefix + "5f00" // name reference to static table entry 15 + "03626172", // literal value "bar" + &expected_output)); + } else { + if (HuffmanEnabled()) { + ASSERT_TRUE(absl::HexStringToBytes( + "0000" // prefix + "2db9495339e4" // Huffman-encoded literal name ":method" + "03626172", // literal value "bar" + &expected_output)); + } else { + ASSERT_TRUE( + absl::HexStringToBytes("0000" // prefix + "27003a6d6574686f64" // literal name ":method" + "03626172", // literal value "bar" + &expected_output)); + } + } + EXPECT_EQ(expected_output, + encoder_.EncodeHeaderList(/* stream_id = */ 3, header_list, + &encoder_stream_sent_byte_count_)); +} + +// Header name and value match an entry in the dynamic table, but that entry +// cannot be used. If there is an entry with matching name in the dynamic table +// that can be used, do so. +TEST_P(QpackEncoderTest, UseDynamicTableNameOnlyMatch) { + EXPECT_CALL(encoder_stream_sender_delegate_, NumBytesBuffered()) + .WillRepeatedly(Return(0)); + spdy::Http2HeaderBlock header_list1; + header_list1["one"] = "foo"; + header_list1["two"] = "foo"; + header_list1["three"] = "foo"; + header_list1["four"] = "foo"; + header_list1["five"] = "foo"; + header_list1["six"] = "foo"; + header_list1["seven"] = "foo"; + header_list1["eight"] = "foo"; + header_list1["nine"] = "foo"; + header_list1["ten"] = "foo"; + + // Make just enough room in the dynamic table for the header list, + // plus another entry using the name of the first one, + // This will ensure that the oldest entries are draining. + uint64_t maximum_dynamic_table_capacity = 0; + for (const auto& header_field : header_list1) { + maximum_dynamic_table_capacity += + QpackEntry::Size(header_field.first, header_field.second); + } + maximum_dynamic_table_capacity += QpackEntry::Size("one", "bar"); + encoder_.SetMaximumDynamicTableCapacity(maximum_dynamic_table_capacity); + encoder_.SetDynamicTableCapacity(maximum_dynamic_table_capacity); + + // Set Dynamic Table Capacity instruction and insert ten entries into the + // dynamic table. + EXPECT_CALL(encoder_stream_sender_delegate_, WriteStreamData(_)); + + std::string expected_output; + ASSERT_TRUE( + absl::HexStringToBytes("0b00" // prefix + "89888786858483828180", // dynamic entries + &expected_output)); + EXPECT_EQ(expected_output, Encode(header_list1)); + + // Entry has the same name as the first one. + spdy::Http2HeaderBlock header_list2; + header_list2["one"] = "bar"; + + ASSERT_TRUE(absl::HexStringToBytes( + "89" // insert entry with same name as dynamic table entry 9 + "03626172", // and literal value "bar" + &expected_output)); + EXPECT_CALL(encoder_stream_sender_delegate_, + WriteStreamData(Eq(expected_output))); + + ASSERT_TRUE( + absl::HexStringToBytes("0c00" // prefix + "80", // most recent dynamic table entry + &expected_output)); + EXPECT_EQ(expected_output, Encode(header_list2)); + + // Entry is identical to the first one, which is draining, and has the same + // name but different value as the last one, which is not draining. + spdy::Http2HeaderBlock header_list3; + header_list3["one"] = "foo"; + + if (GetQuicReloadableFlag(quic_better_qpack_compression)) { + // Entry matches name and value of oldest dynamic table entry, which cannot + // be used. Use the name of the most recent dynamic table entry instead, and + // encode value as string literal. + if (HuffmanEnabled()) { + ASSERT_TRUE(absl::HexStringToBytes( + "0c00" // prefix + "40" // name as dynamic table entry 0 + "8294e7", // Huffman-encoded literal value "foo" + &expected_output)); + } else { + ASSERT_TRUE( + absl::HexStringToBytes("0c00" // prefix + "40" // name as dynamic table entry 0 + "03666f6f", // literal value "foo" + &expected_output)); + } + } else { + // Entry matches name and value of oldest dynamic table entry, which cannot + // be used. Encode both name and value as string literal instead. + if (HuffmanEnabled()) { + ASSERT_TRUE( + absl::HexStringToBytes("0000" // prefix + "2a3d45" // literal name "one" + "8294e7", // literal value "foo" + &expected_output)); + } else { + ASSERT_TRUE( + absl::HexStringToBytes("0000" // prefix + "236f6e65" // literal name "one" + "03666f6f", // literal value "foo" + &expected_output)); + } + } + EXPECT_EQ(expected_output, Encode(header_list3)); +} + } // namespace } // namespace test } // namespace quic diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table.cc index d5b834df5f..2eabb18dca 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/qpack/qpack_header_table.h" +#include + #include "absl/strings/string_view.h" #include "quiche/quic/core/qpack/qpack_static_table.h" #include "quiche/quic/platform/api/quic_logging.h" @@ -51,44 +53,50 @@ uint64_t QpackEncoderHeaderTable::InsertEntry(absl::string_view name, return index; } -QpackEncoderHeaderTable::MatchType QpackEncoderHeaderTable::FindHeaderField( - absl::string_view name, absl::string_view value, bool* is_static, - uint64_t* index) const { +QpackEncoderHeaderTable::MatchResult QpackEncoderHeaderTable::FindHeaderField( + absl::string_view name, absl::string_view value) const { QpackLookupEntry query{name, value}; // Look for exact match in static table. auto index_it = static_index_.find(query); if (index_it != static_index_.end()) { - *index = index_it->second; - *is_static = true; - return MatchType::kNameAndValue; + return {/* match_type = */ MatchType::kNameAndValue, + /* is_static = */ true, + /* index = */ index_it->second}; } // Look for exact match in dynamic table. index_it = dynamic_index_.find(query); if (index_it != dynamic_index_.end()) { - *index = index_it->second; - *is_static = false; - return MatchType::kNameAndValue; + return {/* match_type = */ MatchType::kNameAndValue, + /* is_static = */ false, + /* index = */ index_it->second}; } + return FindHeaderName(name); +} + +QpackEncoderHeaderTable::MatchResult QpackEncoderHeaderTable::FindHeaderName( + absl::string_view name) const { // Look for name match in static table. auto name_index_it = static_name_index_.find(name); if (name_index_it != static_name_index_.end()) { - *index = name_index_it->second; - *is_static = true; - return MatchType::kName; + return {/* match_type = */ MatchType::kName, + /* is_static = */ true, + /* index = */ name_index_it->second}; } // Look for name match in dynamic table. name_index_it = dynamic_name_index_.find(name); if (name_index_it != dynamic_name_index_.end()) { - *index = name_index_it->second; - *is_static = false; - return MatchType::kName; + return {/* match_type = */ MatchType::kName, + /* is_static = */ false, + /* index = */ name_index_it->second}; } - return MatchType::kNoMatch; + return {/* match_type = */ MatchType::kNoMatch, + /* is_static = */ false, + /* index = */ 0}; } uint64_t QpackEncoderHeaderTable::MaxInsertSizeWithoutEvictingGivenEntry( diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table.h index 9b87fccfd1..748c11b84d 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table.h @@ -246,7 +246,22 @@ class QUICHE_EXPORT QpackEncoderHeaderTable : public QpackHeaderTableBase { public: // Result of header table lookup. - enum class MatchType { kNameAndValue, kName, kNoMatch }; + enum class MatchType { + kNameAndValue, // Returned entry matches name and value. + kName, // Returned entry matches name only. + kNoMatch // No matching entry found. + }; + + // Return type of FindHeaderField() and FindHeaderName(), describing the + // nature of the match, and the location and index of the matching entry. + // The value of `is_static` and `index` is undefined if + // `match_type == MatchType::kNoMatch`. + struct MatchResult { + MatchType match_type; + bool is_static; + // `index` is zero-based for both static and dynamic table entries. + uint64_t index; + }; QpackEncoderHeaderTable(); ~QpackEncoderHeaderTable() override = default; @@ -254,11 +269,20 @@ class QUICHE_EXPORT QpackEncoderHeaderTable uint64_t InsertEntry(absl::string_view name, absl::string_view value) override; - // Returns the absolute index of an entry with matching name and value if such - // exists, otherwise one with matching name is such exists. |index| is zero - // based for both the static and the dynamic table. - MatchType FindHeaderField(absl::string_view name, absl::string_view value, - bool* is_static, uint64_t* index) const; + // FindHeaderField() and FindHeaderName() both prefer static table entries to + // dynamic ones. They both prefer lower index entries within the static table, + // and higher index (more recent) entries within the dynamic table. + + // Returns `kNameAndValue` and an entry with matching name and value if such + // exists. + // Otherwise, returns `kName` and an entry with matching name is such exists. + // Otherwise, returns `kNoMatch`. + MatchResult FindHeaderField(absl::string_view name, + absl::string_view value) const; + + // Returns `kName` and an entry with matching name is such exists. + // Otherwise, returns `kNoMatch`. + MatchResult FindHeaderName(absl::string_view name) const; // Returns the size of the largest entry that could be inserted into the // dynamic table without evicting entry |index|. |index| might be larger than @@ -267,7 +291,7 @@ class QUICHE_EXPORT QpackEncoderHeaderTable uint64_t MaxInsertSizeWithoutEvictingGivenEntry(uint64_t index) const; // Returns the draining index described at - // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#avoiding-blocked-insertions. + // https://rfc-editor.org/rfc/rfc9204.html#section-2.1.1.1. // Entries with an index larger than or equal to the draining index take up // approximately |1.0 - draining_fraction| of dynamic table capacity. The // remaining capacity is taken up by draining entries and unused space. diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table_test.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table_test.cc index 3450e667e8..c4331a629c 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/qpack/qpack_header_table.h" +#include +#include #include #include "absl/base/macros.h" @@ -12,14 +14,19 @@ #include "quiche/quic/platform/api/quic_test.h" #include "quiche/spdy/core/hpack/hpack_entry.h" -using ::testing::Mock; -using ::testing::StrictMock; - namespace quic { namespace test { namespace { -const uint64_t kMaximumDynamicTableCapacityForTesting = 1024 * 1024; +using ::testing::_; +using ::testing::FieldsAre; +using ::testing::Mock; +using ::testing::StrictMock; + +constexpr uint64_t kMaximumDynamicTableCapacityForTesting = 1024 * 1024; +// Values for `is_static` argument. +constexpr bool kStaticEntry = true; +constexpr bool kDynamicEntry = false; template class QpackHeaderTableTest : public QuicTest { @@ -95,33 +102,29 @@ TYPED_TEST(QpackHeaderTableTest, EntryFitsDynamicTableCapacity) { class QpackEncoderHeaderTableTest : public QpackHeaderTableTest { protected: + // Redefine MatchType with values identical to + // QpackEncoderHeaderTable::MatchType for brevity. + // (Using declarations cannot be used with enum class until C++20.) + enum MatchType { kNameAndValue, kName, kNoMatch }; + ~QpackEncoderHeaderTableTest() override = default; - void ExpectMatch(absl::string_view name, absl::string_view value, - QpackEncoderHeaderTable::MatchType expected_match_type, - bool expected_is_static, uint64_t expected_index) const { - // Initialize outparams to a value different from the expected to ensure - // that FindHeaderField() sets them. - bool is_static = !expected_is_static; - uint64_t index = expected_index + 1; + std::tuple FindHeaderField( + absl::string_view name, absl::string_view value) const { + QpackEncoderHeaderTable::MatchResult match_result = + table_.FindHeaderField(name, value); - QpackEncoderHeaderTable::MatchType matchtype = - table_.FindHeaderField(name, value, &is_static, &index); - - EXPECT_EQ(expected_match_type, matchtype) << name << ": " << value; - EXPECT_EQ(expected_is_static, is_static) << name << ": " << value; - EXPECT_EQ(expected_index, index) << name << ": " << value; + return {static_cast(match_result.match_type), + match_result.is_static, match_result.index}; } - void ExpectNoMatch(absl::string_view name, absl::string_view value) const { - bool is_static = false; - uint64_t index = 0; + std::tuple FindHeaderName( + absl::string_view name) const { + QpackEncoderHeaderTable::MatchResult match_result = + table_.FindHeaderName(name); - QpackEncoderHeaderTable::MatchType matchtype = - table_.FindHeaderField(name, value, &is_static, &index); - - EXPECT_EQ(QpackEncoderHeaderTable::MatchType::kNoMatch, matchtype) - << name << ": " << value; + return {static_cast(match_result.match_type), + match_result.is_static, match_result.index}; } uint64_t MaxInsertSizeWithoutEvictingGivenEntry(uint64_t index) const { @@ -135,86 +138,104 @@ class QpackEncoderHeaderTableTest TEST_F(QpackEncoderHeaderTableTest, FindStaticHeaderField) { // A header name that has multiple entries with different values. - ExpectMatch(":method", "GET", - QpackEncoderHeaderTable::MatchType::kNameAndValue, true, 17u); + EXPECT_THAT(FindHeaderField(":method", "GET"), + FieldsAre(kNameAndValue, kStaticEntry, 17u)); - ExpectMatch(":method", "POST", - QpackEncoderHeaderTable::MatchType::kNameAndValue, true, 20u); + EXPECT_THAT(FindHeaderField(":method", "POST"), + FieldsAre(kNameAndValue, kStaticEntry, 20u)); - ExpectMatch(":method", "TRACE", QpackEncoderHeaderTable::MatchType::kName, - true, 15u); + // ":method: TRACE" does not exist in the static table. + // Both following calls return the lowest index with key ":method". + EXPECT_THAT(FindHeaderField(":method", "TRACE"), + FieldsAre(kName, kStaticEntry, 15u)); + + EXPECT_THAT(FindHeaderName(":method"), FieldsAre(kName, kStaticEntry, 15u)); // A header name that has a single entry with non-empty value. - ExpectMatch("accept-encoding", "gzip, deflate, br", - QpackEncoderHeaderTable::MatchType::kNameAndValue, true, 31u); + EXPECT_THAT(FindHeaderField("accept-encoding", "gzip, deflate, br"), + FieldsAre(kNameAndValue, kStaticEntry, 31u)); - ExpectMatch("accept-encoding", "compress", - QpackEncoderHeaderTable::MatchType::kName, true, 31u); + EXPECT_THAT(FindHeaderField("accept-encoding", "compress"), + FieldsAre(kName, kStaticEntry, 31u)); - ExpectMatch("accept-encoding", "", QpackEncoderHeaderTable::MatchType::kName, - true, 31u); + EXPECT_THAT(FindHeaderField("accept-encoding", ""), + FieldsAre(kName, kStaticEntry, 31u)); + + EXPECT_THAT(FindHeaderName("accept-encoding"), + FieldsAre(kName, kStaticEntry, 31u)); // A header name that has a single entry with empty value. - ExpectMatch("location", "", QpackEncoderHeaderTable::MatchType::kNameAndValue, - true, 12u); + EXPECT_THAT(FindHeaderField("location", ""), + FieldsAre(kNameAndValue, kStaticEntry, 12u)); - ExpectMatch("location", "foo", QpackEncoderHeaderTable::MatchType::kName, - true, 12u); + EXPECT_THAT(FindHeaderField("location", "foo"), + FieldsAre(kName, kStaticEntry, 12u)); + + EXPECT_THAT(FindHeaderName("location"), FieldsAre(kName, kStaticEntry, 12u)); // No matching header name. - ExpectNoMatch("foo", ""); - ExpectNoMatch("foo", "bar"); + EXPECT_THAT(FindHeaderField("foo", ""), FieldsAre(kNoMatch, _, _)); + EXPECT_THAT(FindHeaderField("foo", "bar"), FieldsAre(kNoMatch, _, _)); + EXPECT_THAT(FindHeaderName("foo"), FieldsAre(kNoMatch, _, _)); } TEST_F(QpackEncoderHeaderTableTest, FindDynamicHeaderField) { // Dynamic table is initially entry. - ExpectNoMatch("foo", "bar"); - ExpectNoMatch("foo", "baz"); + EXPECT_THAT(FindHeaderField("foo", "bar"), FieldsAre(kNoMatch, _, _)); + EXPECT_THAT(FindHeaderField("foo", "baz"), FieldsAre(kNoMatch, _, _)); + EXPECT_THAT(FindHeaderName("foo"), FieldsAre(kNoMatch, _, _)); // Insert one entry. InsertEntry("foo", "bar"); // Match name and value. - ExpectMatch("foo", "bar", QpackEncoderHeaderTable::MatchType::kNameAndValue, - false, 0u); + EXPECT_THAT(FindHeaderField("foo", "bar"), + FieldsAre(kNameAndValue, kDynamicEntry, 0u)); // Match name only. - ExpectMatch("foo", "baz", QpackEncoderHeaderTable::MatchType::kName, false, - 0u); + EXPECT_THAT(FindHeaderField("foo", "baz"), + FieldsAre(kName, kDynamicEntry, 0u)); + EXPECT_THAT(FindHeaderName("foo"), FieldsAre(kName, kDynamicEntry, 0u)); // Insert an identical entry. FindHeaderField() should return the index of // the most recently inserted matching entry. InsertEntry("foo", "bar"); // Match name and value. - ExpectMatch("foo", "bar", QpackEncoderHeaderTable::MatchType::kNameAndValue, - false, 1u); + EXPECT_THAT(FindHeaderField("foo", "bar"), + FieldsAre(kNameAndValue, kDynamicEntry, 1u)); // Match name only. - ExpectMatch("foo", "baz", QpackEncoderHeaderTable::MatchType::kName, false, - 1u); + EXPECT_THAT(FindHeaderField("foo", "baz"), + FieldsAre(kName, kDynamicEntry, 1u)); + EXPECT_THAT(FindHeaderName("foo"), FieldsAre(kName, kDynamicEntry, 1u)); } TEST_F(QpackEncoderHeaderTableTest, FindHeaderFieldPrefersStaticTable) { // Insert an entry to the dynamic table that exists in the static table. InsertEntry(":method", "GET"); - // FindHeaderField() prefers static table if both have name-and-value match. - ExpectMatch(":method", "GET", - QpackEncoderHeaderTable::MatchType::kNameAndValue, true, 17u); + // FindHeaderField() prefers static table if both tables have name-and-value + // match. + EXPECT_THAT(FindHeaderField(":method", "GET"), + FieldsAre(kNameAndValue, kStaticEntry, 17u)); - // FindHeaderField() prefers static table if both have name match but no value - // match, and prefers the first entry with matching name. - ExpectMatch(":method", "TRACE", QpackEncoderHeaderTable::MatchType::kName, - true, 15u); + // FindHeaderField() prefers static table if both tables have name match but + // no value match, and prefers the first entry with matching name. + EXPECT_THAT(FindHeaderField(":method", "TRACE"), + FieldsAre(kName, kStaticEntry, 15u)); + + // FindHeaderName() prefers static table if both tables have a match, and + // prefers the first entry with matching name. + EXPECT_THAT(FindHeaderName(":method"), FieldsAre(kName, kStaticEntry, 15u)); // Add new entry to the dynamic table. InsertEntry(":method", "TRACE"); // FindHeaderField prefers name-and-value match in dynamic table over name // only match in static table. - ExpectMatch(":method", "TRACE", - QpackEncoderHeaderTable::MatchType::kNameAndValue, false, 1u); + EXPECT_THAT(FindHeaderField(":method", "TRACE"), + FieldsAre(kNameAndValue, kDynamicEntry, 1u)); } TEST_F(QpackEncoderHeaderTableTest, EvictByInsertion) { @@ -225,17 +246,17 @@ TEST_F(QpackEncoderHeaderTableTest, EvictByInsertion) { EXPECT_EQ(1u, inserted_entry_count()); EXPECT_EQ(0u, dropped_entry_count()); - ExpectMatch("foo", "bar", QpackEncoderHeaderTable::MatchType::kNameAndValue, - /* expected_is_static = */ false, 0u); + EXPECT_THAT(FindHeaderField("foo", "bar"), + FieldsAre(kNameAndValue, kDynamicEntry, 0u)); // Inserting second entry evicts the first one. InsertEntry("baz", "qux"); EXPECT_EQ(2u, inserted_entry_count()); EXPECT_EQ(1u, dropped_entry_count()); - ExpectNoMatch("foo", "bar"); - ExpectMatch("baz", "qux", QpackEncoderHeaderTable::MatchType::kNameAndValue, - /* expected_is_static = */ false, 1u); + EXPECT_THAT(FindHeaderField("foo", "bar"), FieldsAre(kNoMatch, _, _)); + EXPECT_THAT(FindHeaderField("baz", "qux"), + FieldsAre(kNameAndValue, kDynamicEntry, 1u)); } TEST_F(QpackEncoderHeaderTableTest, EvictByUpdateTableSize) { @@ -245,25 +266,25 @@ TEST_F(QpackEncoderHeaderTableTest, EvictByUpdateTableSize) { EXPECT_EQ(2u, inserted_entry_count()); EXPECT_EQ(0u, dropped_entry_count()); - ExpectMatch("foo", "bar", QpackEncoderHeaderTable::MatchType::kNameAndValue, - /* expected_is_static = */ false, 0u); - ExpectMatch("baz", "qux", QpackEncoderHeaderTable::MatchType::kNameAndValue, - /* expected_is_static = */ false, 1u); + EXPECT_THAT(FindHeaderField("foo", "bar"), + FieldsAre(kNameAndValue, kDynamicEntry, 0u)); + EXPECT_THAT(FindHeaderField("baz", "qux"), + FieldsAre(kNameAndValue, kDynamicEntry, 1u)); EXPECT_TRUE(SetDynamicTableCapacity(40)); EXPECT_EQ(2u, inserted_entry_count()); EXPECT_EQ(1u, dropped_entry_count()); - ExpectNoMatch("foo", "bar"); - ExpectMatch("baz", "qux", QpackEncoderHeaderTable::MatchType::kNameAndValue, - /* expected_is_static = */ false, 1u); + EXPECT_THAT(FindHeaderField("foo", "bar"), FieldsAre(kNoMatch, _, _)); + EXPECT_THAT(FindHeaderField("baz", "qux"), + FieldsAre(kNameAndValue, kDynamicEntry, 1u)); EXPECT_TRUE(SetDynamicTableCapacity(20)); EXPECT_EQ(2u, inserted_entry_count()); EXPECT_EQ(2u, dropped_entry_count()); - ExpectNoMatch("foo", "bar"); - ExpectNoMatch("baz", "qux"); + EXPECT_THAT(FindHeaderField("foo", "bar"), FieldsAre(kNoMatch, _, _)); + EXPECT_THAT(FindHeaderField("baz", "qux"), FieldsAre(kNoMatch, _, _)); } TEST_F(QpackEncoderHeaderTableTest, EvictOldestOfIdentical) { @@ -277,18 +298,18 @@ TEST_F(QpackEncoderHeaderTableTest, EvictOldestOfIdentical) { EXPECT_EQ(0u, dropped_entry_count()); // Find most recently inserted entry. - ExpectMatch("foo", "bar", QpackEncoderHeaderTable::MatchType::kNameAndValue, - /* expected_is_static = */ false, 1u); + EXPECT_THAT(FindHeaderField("foo", "bar"), + FieldsAre(kNameAndValue, kDynamicEntry, 1u)); // Inserting third entry evicts the first one, not the second. InsertEntry("baz", "qux"); EXPECT_EQ(3u, inserted_entry_count()); EXPECT_EQ(1u, dropped_entry_count()); - ExpectMatch("foo", "bar", QpackEncoderHeaderTable::MatchType::kNameAndValue, - /* expected_is_static = */ false, 1u); - ExpectMatch("baz", "qux", QpackEncoderHeaderTable::MatchType::kNameAndValue, - /* expected_is_static = */ false, 2u); + EXPECT_THAT(FindHeaderField("foo", "bar"), + FieldsAre(kNameAndValue, kDynamicEntry, 1u)); + EXPECT_THAT(FindHeaderField("baz", "qux"), + FieldsAre(kNameAndValue, kDynamicEntry, 2u)); } TEST_F(QpackEncoderHeaderTableTest, EvictOldestOfSameName) { @@ -302,18 +323,18 @@ TEST_F(QpackEncoderHeaderTableTest, EvictOldestOfSameName) { EXPECT_EQ(0u, dropped_entry_count()); // Find most recently inserted entry with matching name. - ExpectMatch("foo", "foo", QpackEncoderHeaderTable::MatchType::kName, - /* expected_is_static = */ false, 1u); + EXPECT_THAT(FindHeaderField("foo", "foo"), + FieldsAre(kName, kDynamicEntry, 1u)); // Inserting third entry evicts the first one, not the second. InsertEntry("baz", "qux"); EXPECT_EQ(3u, inserted_entry_count()); EXPECT_EQ(1u, dropped_entry_count()); - ExpectMatch("foo", "foo", QpackEncoderHeaderTable::MatchType::kName, - /* expected_is_static = */ false, 1u); - ExpectMatch("baz", "qux", QpackEncoderHeaderTable::MatchType::kNameAndValue, - /* expected_is_static = */ false, 2u); + EXPECT_THAT(FindHeaderField("foo", "foo"), + FieldsAre(kName, kDynamicEntry, 1u)); + EXPECT_THAT(FindHeaderField("baz", "qux"), + FieldsAre(kNameAndValue, kDynamicEntry, 2u)); } // Returns the size of the largest entry that could be inserted into the @@ -433,54 +454,53 @@ class QpackDecoderHeaderTableTest }; TEST_F(QpackDecoderHeaderTableTest, LookupStaticEntry) { - ExpectEntryAtIndex(/* is_static = */ true, 0, ":authority", ""); + ExpectEntryAtIndex(kStaticEntry, 0, ":authority", ""); - ExpectEntryAtIndex(/* is_static = */ true, 1, ":path", "/"); + ExpectEntryAtIndex(kStaticEntry, 1, ":path", "/"); // 98 is the last entry. - ExpectEntryAtIndex(/* is_static = */ true, 98, "x-frame-options", - "sameorigin"); + ExpectEntryAtIndex(kStaticEntry, 98, "x-frame-options", "sameorigin"); ASSERT_EQ(99u, QpackStaticTableVector().size()); - ExpectNoEntryAtIndex(/* is_static = */ true, 99); + ExpectNoEntryAtIndex(kStaticEntry, 99); } TEST_F(QpackDecoderHeaderTableTest, InsertAndLookupDynamicEntry) { // Dynamic table is initially entry. - ExpectNoEntryAtIndex(/* is_static = */ false, 0); - ExpectNoEntryAtIndex(/* is_static = */ false, 1); - ExpectNoEntryAtIndex(/* is_static = */ false, 2); - ExpectNoEntryAtIndex(/* is_static = */ false, 3); + ExpectNoEntryAtIndex(kDynamicEntry, 0); + ExpectNoEntryAtIndex(kDynamicEntry, 1); + ExpectNoEntryAtIndex(kDynamicEntry, 2); + ExpectNoEntryAtIndex(kDynamicEntry, 3); // Insert one entry. InsertEntry("foo", "bar"); - ExpectEntryAtIndex(/* is_static = */ false, 0, "foo", "bar"); + ExpectEntryAtIndex(kDynamicEntry, 0, "foo", "bar"); - ExpectNoEntryAtIndex(/* is_static = */ false, 1); - ExpectNoEntryAtIndex(/* is_static = */ false, 2); - ExpectNoEntryAtIndex(/* is_static = */ false, 3); + ExpectNoEntryAtIndex(kDynamicEntry, 1); + ExpectNoEntryAtIndex(kDynamicEntry, 2); + ExpectNoEntryAtIndex(kDynamicEntry, 3); // Insert a different entry. InsertEntry("baz", "bing"); - ExpectEntryAtIndex(/* is_static = */ false, 0, "foo", "bar"); + ExpectEntryAtIndex(kDynamicEntry, 0, "foo", "bar"); - ExpectEntryAtIndex(/* is_static = */ false, 1, "baz", "bing"); + ExpectEntryAtIndex(kDynamicEntry, 1, "baz", "bing"); - ExpectNoEntryAtIndex(/* is_static = */ false, 2); - ExpectNoEntryAtIndex(/* is_static = */ false, 3); + ExpectNoEntryAtIndex(kDynamicEntry, 2); + ExpectNoEntryAtIndex(kDynamicEntry, 3); // Insert an entry identical to the most recently inserted one. InsertEntry("baz", "bing"); - ExpectEntryAtIndex(/* is_static = */ false, 0, "foo", "bar"); + ExpectEntryAtIndex(kDynamicEntry, 0, "foo", "bar"); - ExpectEntryAtIndex(/* is_static = */ false, 1, "baz", "bing"); + ExpectEntryAtIndex(kDynamicEntry, 1, "baz", "bing"); - ExpectEntryAtIndex(/* is_static = */ false, 2, "baz", "bing"); + ExpectEntryAtIndex(kDynamicEntry, 2, "baz", "bing"); - ExpectNoEntryAtIndex(/* is_static = */ false, 3); + ExpectNoEntryAtIndex(kDynamicEntry, 3); } TEST_F(QpackDecoderHeaderTableTest, EvictByInsertion) { @@ -491,20 +511,20 @@ TEST_F(QpackDecoderHeaderTableTest, EvictByInsertion) { EXPECT_EQ(1u, inserted_entry_count()); EXPECT_EQ(0u, dropped_entry_count()); - ExpectEntryAtIndex(/* is_static = */ false, 0u, "foo", "bar"); + ExpectEntryAtIndex(kDynamicEntry, 0u, "foo", "bar"); // Inserting second entry evicts the first one. InsertEntry("baz", "qux"); EXPECT_EQ(2u, inserted_entry_count()); EXPECT_EQ(1u, dropped_entry_count()); - ExpectNoEntryAtIndex(/* is_static = */ false, 0u); - ExpectEntryAtIndex(/* is_static = */ false, 1u, "baz", "qux"); + ExpectNoEntryAtIndex(kDynamicEntry, 0u); + ExpectEntryAtIndex(kDynamicEntry, 1u, "baz", "qux"); } TEST_F(QpackDecoderHeaderTableTest, EvictByUpdateTableSize) { - ExpectNoEntryAtIndex(/* is_static = */ false, 0u); - ExpectNoEntryAtIndex(/* is_static = */ false, 1u); + ExpectNoEntryAtIndex(kDynamicEntry, 0u); + ExpectNoEntryAtIndex(kDynamicEntry, 1u); // Entry size is 3 + 3 + 32 = 38. InsertEntry("foo", "bar"); @@ -512,22 +532,22 @@ TEST_F(QpackDecoderHeaderTableTest, EvictByUpdateTableSize) { EXPECT_EQ(2u, inserted_entry_count()); EXPECT_EQ(0u, dropped_entry_count()); - ExpectEntryAtIndex(/* is_static = */ false, 0u, "foo", "bar"); - ExpectEntryAtIndex(/* is_static = */ false, 1u, "baz", "qux"); + ExpectEntryAtIndex(kDynamicEntry, 0u, "foo", "bar"); + ExpectEntryAtIndex(kDynamicEntry, 1u, "baz", "qux"); EXPECT_TRUE(SetDynamicTableCapacity(40)); EXPECT_EQ(2u, inserted_entry_count()); EXPECT_EQ(1u, dropped_entry_count()); - ExpectNoEntryAtIndex(/* is_static = */ false, 0u); - ExpectEntryAtIndex(/* is_static = */ false, 1u, "baz", "qux"); + ExpectNoEntryAtIndex(kDynamicEntry, 0u); + ExpectEntryAtIndex(kDynamicEntry, 1u, "baz", "qux"); EXPECT_TRUE(SetDynamicTableCapacity(20)); EXPECT_EQ(2u, inserted_entry_count()); EXPECT_EQ(2u, dropped_entry_count()); - ExpectNoEntryAtIndex(/* is_static = */ false, 0u); - ExpectNoEntryAtIndex(/* is_static = */ false, 1u); + ExpectNoEntryAtIndex(kDynamicEntry, 0u); + ExpectNoEntryAtIndex(kDynamicEntry, 1u); } TEST_F(QpackDecoderHeaderTableTest, EvictOldestOfIdentical) { @@ -540,18 +560,18 @@ TEST_F(QpackDecoderHeaderTableTest, EvictOldestOfIdentical) { EXPECT_EQ(2u, inserted_entry_count()); EXPECT_EQ(0u, dropped_entry_count()); - ExpectEntryAtIndex(/* is_static = */ false, 0u, "foo", "bar"); - ExpectEntryAtIndex(/* is_static = */ false, 1u, "foo", "bar"); - ExpectNoEntryAtIndex(/* is_static = */ false, 2u); + ExpectEntryAtIndex(kDynamicEntry, 0u, "foo", "bar"); + ExpectEntryAtIndex(kDynamicEntry, 1u, "foo", "bar"); + ExpectNoEntryAtIndex(kDynamicEntry, 2u); // Inserting third entry evicts the first one, not the second. InsertEntry("baz", "qux"); EXPECT_EQ(3u, inserted_entry_count()); EXPECT_EQ(1u, dropped_entry_count()); - ExpectNoEntryAtIndex(/* is_static = */ false, 0u); - ExpectEntryAtIndex(/* is_static = */ false, 1u, "foo", "bar"); - ExpectEntryAtIndex(/* is_static = */ false, 2u, "baz", "qux"); + ExpectNoEntryAtIndex(kDynamicEntry, 0u); + ExpectEntryAtIndex(kDynamicEntry, 1u, "foo", "bar"); + ExpectEntryAtIndex(kDynamicEntry, 2u, "baz", "qux"); } TEST_F(QpackDecoderHeaderTableTest, EvictOldestOfSameName) { @@ -564,18 +584,18 @@ TEST_F(QpackDecoderHeaderTableTest, EvictOldestOfSameName) { EXPECT_EQ(2u, inserted_entry_count()); EXPECT_EQ(0u, dropped_entry_count()); - ExpectEntryAtIndex(/* is_static = */ false, 0u, "foo", "bar"); - ExpectEntryAtIndex(/* is_static = */ false, 1u, "foo", "baz"); - ExpectNoEntryAtIndex(/* is_static = */ false, 2u); + ExpectEntryAtIndex(kDynamicEntry, 0u, "foo", "bar"); + ExpectEntryAtIndex(kDynamicEntry, 1u, "foo", "baz"); + ExpectNoEntryAtIndex(kDynamicEntry, 2u); // Inserting third entry evicts the first one, not the second. InsertEntry("baz", "qux"); EXPECT_EQ(3u, inserted_entry_count()); EXPECT_EQ(1u, dropped_entry_count()); - ExpectNoEntryAtIndex(/* is_static = */ false, 0u); - ExpectEntryAtIndex(/* is_static = */ false, 1u, "foo", "baz"); - ExpectEntryAtIndex(/* is_static = */ false, 2u, "baz", "qux"); + ExpectNoEntryAtIndex(kDynamicEntry, 0u); + ExpectEntryAtIndex(kDynamicEntry, 1u, "foo", "baz"); + ExpectEntryAtIndex(kDynamicEntry, 2u, "baz", "qux"); } TEST_F(QpackDecoderHeaderTableTest, RegisterObserver) { diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_index_conversions.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_index_conversions.h index f4987e452b..1eaa60401c 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_index_conversions.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_index_conversions.h @@ -5,9 +5,9 @@ // Utility methods to convert between absolute indexing (used in the dynamic // table), relative indexing used on the encoder stream, and relative indexing // and post-base indexing used on request streams (in header blocks). See: -// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#indexing -// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#relative-indexing -// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#post-base +// https://rfc-editor.org/rfc/rfc9204.html#section-3.2.4 +// https://rfc-editor.org/rfc/rfc9204.html#section-3.2.5 +// https://rfc-editor.org/rfc/rfc9204.html#section-3.2.6 #ifndef QUICHE_QUIC_CORE_QPACK_QPACK_INDEX_CONVERSIONS_H_ #define QUICHE_QUIC_CORE_QPACK_QPACK_INDEX_CONVERSIONS_H_ diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder.cc index bc22db00ef..f2ac768df6 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/qpack/qpack_instruction_decoder.h" #include +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder_test.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder_test.cc index 873b3d585f..a7b826200a 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder_test.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/qpack/qpack_instruction_decoder.h" #include +#include #include #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_encoder.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_encoder.cc index 60876d64de..aada6ae27c 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_encoder.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_encoder.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/qpack/qpack_instruction_encoder.h" #include +#include #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instructions.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instructions.cc index 9de0dcdea5..ac9deb9e24 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instructions.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instructions.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/qpack/qpack_instructions.h" #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instructions.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instructions.h index ab808748a4..09c5cc6ebd 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instructions.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_instructions.h @@ -86,7 +86,7 @@ struct QUICHE_EXPORT QpackInstruction { using QpackLanguage = std::vector; // Wire format defined in -// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#rfc.section.5 +// https://rfc-editor.org/rfc/rfc9204.html#section-4 // 5.2 Encoder stream instructions diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.cc index 5dc5a68cc2..cea557a733 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.cc @@ -6,6 +6,8 @@ #include #include +#include +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.h index cfca2bd0cb..a76839dbf6 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.h @@ -75,7 +75,7 @@ class QUICHE_EXPORT QpackProgressiveDecoder // Called when decoding is completed, with Required Insert Count of the // decoded header block. Required Insert Count is defined at - // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#blocked-streams. + // https://rfc-editor.org/rfc/rfc9204.html#section-4.5.1.1. virtual void OnDecodingCompleted(QuicStreamId stream_id, uint64_t required_insert_count) = 0; }; diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_receive_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_receive_stream_test.cc index e7560fa973..13f3ae5937 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_receive_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_receive_stream_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/qpack/qpack_receive_stream.h" +#include + #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_utils.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_required_insert_count.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_required_insert_count.h index 550cf27009..909994547c 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_required_insert_count.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_required_insert_count.h @@ -13,14 +13,14 @@ namespace quic { // Calculate Encoded Required Insert Count from Required Insert Count and // MaxEntries according to -// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#ric. +// https://rfc-editor.org/rfc/rfc9204.html#section-4.5.1.1. QUICHE_EXPORT uint64_t QpackEncodeRequiredInsertCount( uint64_t required_insert_count, uint64_t max_entries); // Calculate Required Insert Count from Encoded Required Insert Count, // MaxEntries, and total number of dynamic table insertions according to -// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#ric. Returns true -// on success, false on invalid input or overflow/underflow. +// https://rfc-editor.org/rfc/rfc9204.html#section-4.5.1.1. Returns true on +// success, false on invalid input or overflow/underflow. QUICHE_EXPORT bool QpackDecodeRequiredInsertCount( uint64_t encoded_required_insert_count, uint64_t max_entries, uint64_t total_number_of_inserts, uint64_t* required_insert_count); diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_send_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_send_stream_test.cc index acde4ef670..3315ee1824 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_send_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_send_stream_test.cc @@ -4,6 +4,10 @@ #include "quiche/quic/core/qpack/qpack_send_stream.h" +#include +#include +#include + #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/crypto/null_encrypter.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_static_table.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_static_table.cc index fc85667169..b057201b8a 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_static_table.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_static_table.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/qpack/qpack_static_table.h" +#include + #include "absl/base/macros.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_static_table.h b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_static_table.h index 7fc789587a..89ec2542c8 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_static_table.h +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/qpack_static_table.h @@ -17,7 +17,7 @@ using QpackStaticEntry = spdy::HpackStaticEntry; using QpackStaticTable = spdy::HpackStaticTable; // QPACK static table defined at -// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#static-table. +// https://rfc-editor.org/rfc/rfc9204.html#section-3.1. QUICHE_EXPORT const std::vector& QpackStaticTableVector(); // Returns a QpackStaticTable instance initialized with kQpackStaticTable. diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list.cc index faeccdf4ff..754b6734cd 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/qpack/value_splitting_header_list.h" +#include + #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list_test.cc b/yass/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list_test.cc index a3aae0af6f..555afd6936 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/qpack/value_splitting_header_list.h" +#include + #include "absl/base/macros.h" #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_alarm.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_alarm.cc index 029eefd177..beb97ee307 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_alarm.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_alarm.cc @@ -5,6 +5,8 @@ #include "quiche/quic/core/quic_alarm.h" #include +#include +#include #include "quiche/quic/platform/api/quic_bug_tracker.h" #include "quiche/quic/platform/api/quic_flag_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_alarm_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_alarm_test.cc index 5feef7872d..4ed47098b0 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_alarm_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_alarm_test.cc @@ -4,6 +4,11 @@ #include "quiche/quic/core/quic_alarm.h" +#include +#include +#include +#include + #include "quiche/quic/core/quic_connection_context.h" #include "quiche/quic/platform/api/quic_expect_bug.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_arena_scoped_ptr_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_arena_scoped_ptr_test.cc index fd6dd640f7..3340dcfe24 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_arena_scoped_ptr_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_arena_scoped_ptr_test.cc @@ -4,6 +4,10 @@ #include "quiche/quic/core/quic_arena_scoped_ptr.h" +#include +#include +#include + #include "quiche/quic/core/quic_one_block_arena.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_blocked_writer_list.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_blocked_writer_list.cc index 105d8b95d8..a6c16d5300 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_blocked_writer_list.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_blocked_writer_list.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_blocked_writer_list.h" +#include + #include "quiche/quic/platform/api/quic_bug_tracker.h" #include "quiche/quic/platform/api/quic_flag_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.cc index 3c31b6c94d..e65bad7e48 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.cc @@ -10,6 +10,7 @@ #include #include #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/connection_id_generator.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store_test.cc index f72abf6818..f2b98f55bd 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store_test.cc @@ -11,6 +11,7 @@ #include #include #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/connection_id_generator.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_chaos_protector_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_chaos_protector_test.cc index 9c312dba86..2131cb472d 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_chaos_protector_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_chaos_protector_test.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/frames/quic_crypto_frame.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_coalesced_packet.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_coalesced_packet.cc index 67091d6b5f..94180f88e7 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_coalesced_packet.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_coalesced_packet.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/quic_coalesced_packet.h" +#include +#include + #include "absl/memory/memory.h" #include "absl/strings/str_cat.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_coalesced_packet_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_coalesced_packet_test.cc index 00ba7d8e1c..61d30f78dd 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_coalesced_packet_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_coalesced_packet_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_coalesced_packet.h" +#include + #include "quiche/quic/platform/api/quic_expect_bug.h" #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/test_tools/quic_test_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_config.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_config.cc index 1ccba2e934..4fc4357e87 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_config.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_config.cc @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_config_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_config_test.cc index 499c64730b..1dcfe94aaf 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_config_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_config_test.cc @@ -6,6 +6,7 @@ #include #include +#include #include "quiche/quic/core/crypto/crypto_handshake_message.h" #include "quiche/quic/core/crypto/crypto_protocol.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_connection.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_connection.cc index 2c01aed5a5..a7143496e8 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_connection.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_connection.cc @@ -10,13 +10,17 @@ #include #include #include +#include #include #include #include #include +#include #include #include +#include #include +#include #include "absl/strings/escaping.h" #include "absl/strings/str_cat.h" @@ -179,8 +183,7 @@ QuicConnection::QuicConnection( pending_retransmission_alarm_(false), defer_send_in_response_to_packets_(false), arena_(), - alarms_(this, &context_, &idle_network_detector_, &blackhole_detector_, - &ping_manager_, *alarm_factory_, arena_), + alarms_(this, *alarm_factory_, arena_), visitor_(nullptr), debug_visitor_(nullptr), packet_creator_(server_connection_id, &framer_, random_generator_, this), @@ -505,6 +508,10 @@ void QuicConnection::SetFromConfig(const QuicConfig& config) { if (config.HasClientSentConnectionOption(kDFER, perspective_)) { defer_send_in_response_to_packets_ = false; } + if (perspective_ == Perspective::IS_CLIENT && + config.HasClientSentConnectionOption(kCDFR, perspective_)) { + defer_send_in_response_to_packets_ = true; + } if (config.HasClientRequestedIndependentOption(kINVC, perspective_)) { send_connection_close_for_invalid_version_ = true; @@ -827,6 +834,13 @@ void QuicConnection::RetireOriginalDestinationConnectionId() { } } +void QuicConnection::OnDiscardZeroRttDecryptionKeysAlarm() { + QUICHE_DCHECK(connected()); + QUIC_DLOG(INFO) << "0-RTT discard alarm fired"; + RemoveDecrypter(ENCRYPTION_ZERO_RTT); + RetireOriginalDestinationConnectionId(); +} + bool QuicConnection::ValidateServerConnectionId( const QuicPacketHeader& header) const { if (perspective_ == Perspective::IS_CLIENT && @@ -2689,7 +2703,10 @@ void QuicConnection::OnCanWrite() { } } -void QuicConnection::OnSendAlarm() { WriteIfNotBlocked(); } +void QuicConnection::OnSendAlarm() { + QUICHE_DCHECK(connected()); + WriteIfNotBlocked(); +} void QuicConnection::WriteIfNotBlocked() { if (framer().is_processing_packet()) { @@ -3976,6 +3993,17 @@ void QuicConnection::SendOrQueuePacket(SerializedPacket packet) { WritePacket(&packet); } +void QuicConnection::OnAckAlarm() { + QUICHE_DCHECK(ack_frame_updated()); + QUICHE_DCHECK(connected()); + QuicConnection::ScopedPacketFlusher flusher(this); + if (SupportsMultiplePacketNumberSpaces()) { + SendAllPendingAcks(); + } else { + SendAck(); + } +} + void QuicConnection::SendAck() { QUICHE_DCHECK(!SupportsMultiplePacketNumberSpaces()); QUIC_DVLOG(1) << ENDPOINT << "Sending an ACK proactively"; @@ -4049,7 +4077,8 @@ WriteResult QuicConnection::SendPacketToWriter( return result; } -void QuicConnection::OnRetransmissionTimeout() { +void QuicConnection::OnRetransmissionAlarm() { + QUICHE_DCHECK(connected()); ScopedRetransmissionTimeoutIndicator indicator(this); #ifndef NDEBUG if (sent_packet_manager_.unacked_packets().empty()) { @@ -4250,7 +4279,8 @@ void QuicConnection::RemoveDecrypter(EncryptionLevel level) { framer_.RemoveDecrypter(level); } -void QuicConnection::DiscardPreviousOneRttKeys() { +void QuicConnection::OnDiscardPreviousOneRttKeysAlarm() { + QUICHE_DCHECK(connected()); framer_.DiscardPreviousOneRttKeys(); } @@ -4305,6 +4335,12 @@ void QuicConnection::QueueUndecryptablePacket( } } +void QuicConnection::OnProcessUndecryptablePacketsAlarm() { + QUICHE_DCHECK(connected()); + ScopedPacketFlusher flusher(this); + MaybeProcessUndecryptablePackets(); +} + void QuicConnection::MaybeProcessUndecryptablePackets() { process_undecryptable_packets_alarm().Cancel(); @@ -5043,7 +5079,8 @@ void QuicConnection::DisableMtuDiscovery() { mtu_discovery_alarm().Cancel(); } -void QuicConnection::DiscoverMtu() { +void QuicConnection::OnMtuDiscoveryAlarm() { + QUICHE_DCHECK(connected()); QUICHE_DCHECK(!mtu_discovery_alarm().IsSet()); const QuicPacketNumber largest_sent_packet = @@ -7309,5 +7346,14 @@ bool QuicConnection::set_ecn_codepoint(QuicEcnCodepoint ecn_codepoint) { return true; } +void QuicConnection::OnIdleDetectorAlarm() { idle_network_detector_.OnAlarm(); } + +void QuicConnection::OnPingAlarm() { ping_manager_.OnAlarm(); } + +void QuicConnection::OnNetworkBlackholeDetectorAlarm() { + blackhole_detector_.OnAlarm(); +} + #undef ENDPOINT // undef for jumbo builds + } // namespace quic diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_connection.h b/yass/third_party/quiche/src/quiche/quic/core/quic_connection.h index 0565b1a6b8..91bc01d21d 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_connection.h +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_connection.h @@ -493,7 +493,8 @@ class QUICHE_EXPORT QuicConnection public QuicIdleNetworkDetector::Delegate, public QuicPathValidator::SendDelegate, public QuicConnectionIdManagerVisitorInterface, - public QuicPingManager::Delegate { + public QuicPingManager::Delegate, + public QuicConnectionAlarmsDelegate { public: // Constructs a new QuicConnection for |connection_id| and // |initial_peer_address| using |writer| to write packets. |owns_writer| @@ -638,7 +639,7 @@ class QUICHE_EXPORT QuicConnection bool IsMsgTooBig(const QuicPacketWriter* writer, const WriteResult& result); // Called from the SendAlarmDelegate to initiate writing data. - virtual void OnSendAlarm(); + void OnSendAlarm() override; // If the socket is not blocked, writes queued packets. void WriteIfNotBlocked(); @@ -802,7 +803,7 @@ class QUICHE_EXPORT QuicConnection // Probe the existing alternative path. Does not create a new alternative // path. This method is the callback for |multi_port_probing_alarm_|. - virtual void MaybeProbeMultiPortPath(); + void MaybeProbeMultiPortPath() override; // Accessors void set_visitor(QuicConnectionVisitorInterface* visitor) { @@ -874,12 +875,14 @@ class QUICHE_EXPORT QuicConnection return multi_port_stats_.get(); } + void OnAckAlarm() override; + // Sets up a packet with an QuicAckFrame and sends it out. void SendAck(); // Called when an RTO fires. Resets the retransmission alarm if there are // remaining unacked packets. - void OnRetransmissionTimeout(); + void OnRetransmissionAlarm() override; // Mark all sent 0-RTT encrypted packets for retransmission. Called when new // 0-RTT or 1-RTT key is available in gQUIC, or when 0-RTT is rejected in IETF @@ -929,7 +932,7 @@ class QUICHE_EXPORT QuicConnection void RemoveDecrypter(EncryptionLevel level); // Discard keys for the previous key phase. - void DiscardPreviousOneRttKeys(); + void OnDiscardPreviousOneRttKeysAlarm() override; // Returns true if it is currently allowed to initiate a key update. bool IsKeyUpdateAllowed() const; @@ -1023,7 +1026,7 @@ class QUICHE_EXPORT QuicConnection void DisableMtuDiscovery(); // Sends an MTU discovery packet and updates the MTU discovery alarm. - void DiscoverMtu(); + void OnMtuDiscoveryAlarm() override; // Sets the session notifier on the SentPacketManager. void SetSessionNotifier(SessionNotifierInterface* session_notifier); @@ -1119,6 +1122,7 @@ class QUICHE_EXPORT QuicConnection // Attempts to process any queued undecryptable packets. void MaybeProcessUndecryptablePackets(); + void OnProcessUndecryptablePacketsAlarm() override; // Queue a coalesced packet. void QueueCoalescedPacket(const QuicEncryptedPacket& packet); @@ -1285,7 +1289,7 @@ class QUICHE_EXPORT QuicConnection // Log QUIC_BUG if there is pending frames for the stream with |id|. void QuicBugIfHasPendingFrames(QuicStreamId id) const; - QuicConnectionContext* context() { return &context_; } + QuicConnectionContext* context() override { return &context_; } const QuicConnectionContext* context() const { return &context_; } void set_tracer(std::unique_ptr tracer) { @@ -1363,6 +1367,11 @@ class QUICHE_EXPORT QuicConnection return quic_limit_new_streams_per_loop_2_; } + void OnDiscardZeroRttDecryptionKeysAlarm() override; + void OnIdleDetectorAlarm() override; + void OnNetworkBlackholeDetectorAlarm() override; + void OnPingAlarm() override; + protected: // Calls cancel() on all the alarms owned by this connection. void CancelAllAlarms(); diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.cc index 64cd62f19a..347ede0cfe 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.cc @@ -6,12 +6,8 @@ #include "quiche/quic/core/quic_alarm.h" #include "quiche/quic/core/quic_alarm_factory.h" -#include "quiche/quic/core/quic_connection.h" #include "quiche/quic/core/quic_connection_context.h" -#include "quiche/quic/core/quic_idle_network_detector.h" -#include "quiche/quic/core/quic_network_blackhole_detector.h" #include "quiche/quic/core/quic_one_block_arena.h" -#include "quiche/quic/core/quic_ping_manager.h" #include "quiche/common/platform/api/quiche_logging.h" namespace quic { @@ -21,7 +17,7 @@ namespace { // Base class of all alarms owned by a QuicConnection. class QuicConnectionAlarmDelegate : public QuicAlarm::Delegate { public: - explicit QuicConnectionAlarmDelegate(QuicConnection* connection) + explicit QuicConnectionAlarmDelegate(QuicConnectionAlarmsDelegate* connection) : connection_(connection) {} QuicConnectionAlarmDelegate(const QuicConnectionAlarmDelegate&) = delete; QuicConnectionAlarmDelegate& operator=(const QuicConnectionAlarmDelegate&) = @@ -32,7 +28,7 @@ class QuicConnectionAlarmDelegate : public QuicAlarm::Delegate { } protected: - QuicConnection* connection_; + QuicConnectionAlarmsDelegate* connection_; }; // An alarm that is scheduled to send an ack if a timeout occurs. @@ -40,16 +36,7 @@ class AckAlarmDelegate : public QuicConnectionAlarmDelegate { public: using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - void OnAlarm() override { - QUICHE_DCHECK(connection_->ack_frame_updated()); - QUICHE_DCHECK(connection_->connected()); - QuicConnection::ScopedPacketFlusher flusher(connection_); - if (connection_->SupportsMultiplePacketNumberSpaces()) { - connection_->SendAllPendingAcks(); - } else { - connection_->SendAck(); - } - } + void OnAlarm() override { connection_->OnAckAlarm(); } }; // This alarm will be scheduled any time a data-bearing packet is sent out. @@ -59,10 +46,7 @@ class RetransmissionAlarmDelegate : public QuicConnectionAlarmDelegate { public: using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - void OnAlarm() override { - QUICHE_DCHECK(connection_->connected()); - connection_->OnRetransmissionTimeout(); - } + void OnAlarm() override { connection_->OnRetransmissionAlarm(); } }; // An alarm that is scheduled when the SentPacketManager requires a delay @@ -72,7 +56,6 @@ class SendAlarmDelegate : public QuicConnectionAlarmDelegate { using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; void OnAlarm() override { - QUICHE_DCHECK(connection_->connected()); connection_->OnSendAlarm(); } }; @@ -81,10 +64,7 @@ class MtuDiscoveryAlarmDelegate : public QuicConnectionAlarmDelegate { public: using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - void OnAlarm() override { - QUICHE_DCHECK(connection_->connected()); - connection_->DiscoverMtu(); - } + void OnAlarm() override { connection_->OnMtuDiscoveryAlarm(); } }; class ProcessUndecryptablePacketsAlarmDelegate @@ -92,11 +72,7 @@ class ProcessUndecryptablePacketsAlarmDelegate public: using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - void OnAlarm() override { - QUICHE_DCHECK(connection_->connected()); - QuicConnection::ScopedPacketFlusher flusher(connection_); - connection_->MaybeProcessUndecryptablePackets(); - } + void OnAlarm() override { connection_->OnProcessUndecryptablePacketsAlarm(); } }; class DiscardPreviousOneRttKeysAlarmDelegate @@ -104,10 +80,7 @@ class DiscardPreviousOneRttKeysAlarmDelegate public: using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - void OnAlarm() override { - QUICHE_DCHECK(connection_->connected()); - connection_->DiscardPreviousOneRttKeys(); - } + void OnAlarm() override { connection_->OnDiscardPreviousOneRttKeysAlarm(); } }; class DiscardZeroRttDecryptionKeysAlarmDelegate @@ -116,10 +89,7 @@ class DiscardZeroRttDecryptionKeysAlarmDelegate using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; void OnAlarm() override { - QUICHE_DCHECK(connection_->connected()); - QUIC_DLOG(INFO) << "0-RTT discard alarm fired"; - connection_->RemoveDecrypter(ENCRYPTION_ZERO_RTT); - connection_->RetireOriginalDestinationConnectionId(); + connection_->OnDiscardZeroRttDecryptionKeysAlarm(); } }; @@ -128,93 +98,73 @@ class MultiPortProbingAlarmDelegate : public QuicConnectionAlarmDelegate { using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; void OnAlarm() override { - QUICHE_DCHECK(connection_->connected()); QUIC_DLOG(INFO) << "Alternative path probing alarm fired"; connection_->MaybeProbeMultiPortPath(); } }; -class IdleDetectorAlarmDelegate : public QuicAlarm::DelegateWithContext { +class IdleDetectorAlarmDelegate : public QuicConnectionAlarmDelegate { public: - explicit IdleDetectorAlarmDelegate(QuicIdleNetworkDetector* detector, - QuicConnectionContext* context) - : QuicAlarm::DelegateWithContext(context), detector_(detector) {} + using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; + IdleDetectorAlarmDelegate(const IdleDetectorAlarmDelegate&) = delete; IdleDetectorAlarmDelegate& operator=(const IdleDetectorAlarmDelegate&) = delete; - void OnAlarm() override { detector_->OnAlarm(); } - - private: - QuicIdleNetworkDetector* detector_; + void OnAlarm() override { connection_->OnIdleDetectorAlarm(); } }; class NetworkBlackholeDetectorAlarmDelegate - : public QuicAlarm::DelegateWithContext { + : public QuicConnectionAlarmDelegate { public: - explicit NetworkBlackholeDetectorAlarmDelegate( - QuicNetworkBlackholeDetector* detector, QuicConnectionContext* context) - : QuicAlarm::DelegateWithContext(context), detector_(detector) {} + using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; + NetworkBlackholeDetectorAlarmDelegate( const NetworkBlackholeDetectorAlarmDelegate&) = delete; NetworkBlackholeDetectorAlarmDelegate& operator=( const NetworkBlackholeDetectorAlarmDelegate&) = delete; - void OnAlarm() override { detector_->OnAlarm(); } - - private: - QuicNetworkBlackholeDetector* detector_; + void OnAlarm() override { connection_->OnNetworkBlackholeDetectorAlarm(); } }; -class PingAlarmDelegate : public QuicAlarm::DelegateWithContext { +class PingAlarmDelegate : public QuicConnectionAlarmDelegate { public: - explicit PingAlarmDelegate(QuicPingManager* ping_manager, - QuicConnectionContext* context) - : QuicAlarm::DelegateWithContext(context), ping_manager_(ping_manager) {} + using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; + PingAlarmDelegate(const PingAlarmDelegate&) = delete; PingAlarmDelegate& operator=(const PingAlarmDelegate&) = delete; - void OnAlarm() override { ping_manager_->OnAlarm(); } - - private: - QuicPingManager* ping_manager_; + void OnAlarm() override { connection_->OnPingAlarm(); } }; } // namespace QuicConnectionAlarms::QuicConnectionAlarms( - QuicConnection* connection, QuicConnectionContext* context, - QuicIdleNetworkDetector* idle_network_detector, - QuicNetworkBlackholeDetector* network_blackhole_detector, - QuicPingManager* ping_manager, QuicAlarmFactory& alarm_factory, + QuicConnectionAlarmsDelegate* delegate, QuicAlarmFactory& alarm_factory, QuicConnectionArena& arena) : ack_alarm_(alarm_factory.CreateAlarm( - arena.New(connection), &arena)), + arena.New(delegate), &arena)), retransmission_alarm_(alarm_factory.CreateAlarm( - arena.New(connection), &arena)), + arena.New(delegate), &arena)), send_alarm_(alarm_factory.CreateAlarm( - arena.New(connection), &arena)), + arena.New(delegate), &arena)), mtu_discovery_alarm_(alarm_factory.CreateAlarm( - arena.New(connection), &arena)), + arena.New(delegate), &arena)), process_undecryptable_packets_alarm_(alarm_factory.CreateAlarm( - arena.New(connection), + arena.New(delegate), &arena)), discard_previous_one_rtt_keys_alarm_(alarm_factory.CreateAlarm( - arena.New(connection), - &arena)), + arena.New(delegate), &arena)), discard_zero_rtt_decryption_keys_alarm_(alarm_factory.CreateAlarm( - arena.New(connection), + arena.New(delegate), &arena)), multi_port_probing_alarm_(alarm_factory.CreateAlarm( - arena.New(connection), &arena)), + arena.New(delegate), &arena)), idle_network_detector_alarm_(alarm_factory.CreateAlarm( - arena.New(idle_network_detector, context), - &arena)), + arena.New(delegate), &arena)), network_blackhole_detector_alarm_(alarm_factory.CreateAlarm( - arena.New( - network_blackhole_detector, context), - &arena)), + arena.New(delegate), &arena)), ping_alarm_(alarm_factory.CreateAlarm( - arena.New(ping_manager, context), &arena)) {} + arena.New(delegate), &arena)) {} } // namespace quic diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.h b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.h index 303da24a31..b265fa1bd6 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.h +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.h @@ -9,22 +9,33 @@ #include "quiche/quic/core/quic_alarm_factory.h" #include "quiche/quic/core/quic_arena_scoped_ptr.h" #include "quiche/quic/core/quic_connection_context.h" -#include "quiche/quic/core/quic_idle_network_detector.h" -#include "quiche/quic/core/quic_network_blackhole_detector.h" #include "quiche/quic/core/quic_one_block_arena.h" -#include "quiche/quic/core/quic_ping_manager.h" +#include "quiche/common/platform/api/quiche_export.h" namespace quic { -class QuicConnection; +class QUICHE_EXPORT QuicConnectionAlarmsDelegate { + public: + virtual ~QuicConnectionAlarmsDelegate() = default; + + virtual void OnSendAlarm() = 0; + virtual void OnAckAlarm() = 0; + virtual void OnRetransmissionAlarm() = 0; + virtual void OnMtuDiscoveryAlarm() = 0; + virtual void OnProcessUndecryptablePacketsAlarm() = 0; + virtual void OnDiscardPreviousOneRttKeysAlarm() = 0; + virtual void OnDiscardZeroRttDecryptionKeysAlarm() = 0; + virtual void MaybeProbeMultiPortPath() = 0; + virtual void OnIdleDetectorAlarm() = 0; + virtual void OnNetworkBlackholeDetectorAlarm() = 0; + virtual void OnPingAlarm() = 0; + + virtual QuicConnectionContext* context() = 0; +}; class QUICHE_EXPORT QuicConnectionAlarms { public: - QuicConnectionAlarms(QuicConnection* connection, - QuicConnectionContext* context, - QuicIdleNetworkDetector* idle_network_detector, - QuicNetworkBlackholeDetector* network_blackhole_detector, - QuicPingManager* ping_manager, + QuicConnectionAlarms(QuicConnectionAlarmsDelegate* delegate, QuicAlarmFactory& alarm_factory, QuicConnectionArena& arena); diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_context_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_context_test.cc index 58eb61b3cf..1702fd66b3 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_context_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_context_test.cc @@ -4,6 +4,10 @@ #include "quiche/quic/core/quic_connection_context.h" +#include +#include +#include + #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/platform/api/quic_thread.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id.cc index 839097dafd..1dcc505c7a 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc index 9c0d3bd132..253d3bd377 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc @@ -4,7 +4,12 @@ #include "quiche/quic/core/quic_connection_id_manager.h" +#include #include +#include +#include +#include +#include #include "quiche/quic/core/quic_clock.h" #include "quiche/quic/core/quic_connection_id.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager_test.cc index eba37f157b..03af309dcc 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager_test.cc @@ -5,6 +5,9 @@ #include "quiche/quic/core/quic_connection_id_manager.h" #include +#include +#include +#include #include "quiche/quic/core/frames/quic_retire_connection_id_frame.h" #include "quiche/quic/core/quic_connection_id.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_stats.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_stats.cc index fd74285602..aa9f020c83 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_stats.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_stats.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_connection_stats.h" +#include + namespace quic { std::ostream& operator<<(std::ostream& os, const QuicConnectionStats& s) { diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_test.cc index 7f3208adb8..decb72d1b8 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_connection_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_connection_test.cc @@ -6,10 +6,13 @@ #include +#include #include #include +#include #include #include +#include #include "absl/base/macros.h" #include "absl/strings/str_cat.h" @@ -17367,11 +17370,11 @@ TEST_P(QuicConnectionTest, RtoDisablesEcnMarking) { QuicPacketCreatorPeer::SetPacketNumber( QuicConnectionPeer::GetPacketCreator(&connection_), 1); SendPing(); - connection_.OnRetransmissionTimeout(); + connection_.OnRetransmissionAlarm(); EXPECT_EQ(writer_->last_ecn_sent(), ECN_NOT_ECT); EXPECT_EQ(connection_.ecn_codepoint(), ECN_ECT1); // On 2nd RTO, QUIC abandons ECN. - connection_.OnRetransmissionTimeout(); + connection_.OnRetransmissionAlarm(); EXPECT_EQ(writer_->last_ecn_sent(), ECN_NOT_ECT); EXPECT_EQ(connection_.ecn_codepoint(), ECN_NOT_ECT); } @@ -17385,11 +17388,11 @@ TEST_P(QuicConnectionTest, RtoDoesntDisableEcnMarkingIfEcnAcked) { connection_.OnInFlightEcnPacketAcked(); SendPing(); // Because an ECN packet was acked, PTOs have no effect on ECN settings. - connection_.OnRetransmissionTimeout(); + connection_.OnRetransmissionAlarm(); QuicEcnCodepoint expected_codepoint = ECN_ECT1; EXPECT_EQ(writer_->last_ecn_sent(), expected_codepoint); EXPECT_EQ(connection_.ecn_codepoint(), expected_codepoint); - connection_.OnRetransmissionTimeout(); + connection_.OnRetransmissionAlarm(); EXPECT_EQ(writer_->last_ecn_sent(), expected_codepoint); EXPECT_EQ(connection_.ecn_codepoint(), expected_codepoint); } diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_control_frame_manager_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_control_frame_manager_test.cc index 7f02043426..2201c4ac8d 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_control_frame_manager_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_control_frame_manager_test.cc @@ -4,7 +4,9 @@ #include "quiche/quic/core/quic_control_frame_manager.h" +#include #include +#include #include "quiche/quic/core/crypto/null_encrypter.h" #include "quiche/quic/core/frames/quic_ack_frequency_frame.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.cc index 830f9f7f24..9cf4e6a3ad 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/strings/str_cat.h" #include "quiche/quic/core/crypto/crypto_protocol.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker_test.cc index b31ec18b98..19c89ccf1c 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker_test.cc @@ -4,7 +4,10 @@ #include "quiche/quic/core/quic_crypto_client_handshaker.h" +#include +#include #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/proto/crypto_server_config_proto.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream_test.cc index 28ccad947c..f3508f2e5d 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream_test.cc @@ -7,6 +7,7 @@ #include #include #include +#include #include "absl/base/macros.h" #include "quiche/quic/core/crypto/aes_128_gcm_12_encrypter.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream.cc index 2bd8fbdc96..087794f8e0 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/base/macros.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream_test.cc index 516a25f0e6..ce9cfe44c4 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream_test.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.cc index a3df09b728..05f9d2caae 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.cc @@ -4,6 +4,7 @@ #include "quiche/quic/core/quic_crypto_stream.h" +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_stream_test.cc index 9aa747f047..319ed1f7a1 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_crypto_stream_test.cc @@ -6,6 +6,7 @@ #include #include +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_data_writer_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_data_writer_test.cc index 9d454e93ab..40262d0d92 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_data_writer_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_data_writer_test.cc @@ -6,6 +6,8 @@ #include #include +#include +#include #include "absl/base/macros.h" #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.cc index d2137ef2e0..6fac3e09e3 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.cc @@ -4,6 +4,11 @@ #include "quiche/quic/core/quic_datagram_queue.h" +#include +#include +#include +#include + #include "absl/types/span.h" #include "quiche/quic/core/quic_constants.h" #include "quiche/quic/core/quic_session.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_datagram_queue_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_datagram_queue_test.cc index 6cbf09fc77..70b1b9c6ed 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_datagram_queue_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_datagram_queue_test.cc @@ -4,7 +4,10 @@ #include "quiche/quic/core/quic_datagram_queue.h" +#include #include +#include +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_default_packet_writer.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_default_packet_writer.cc index 7fd7400d8a..5b4bf273f8 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_default_packet_writer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_default_packet_writer.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_default_packet_writer.h" +#include + #include "quiche/quic/core/quic_udp_socket.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_dispatcher.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_dispatcher.cc index 02c69ceb90..424ac26fb4 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_dispatcher.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_dispatcher.cc @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -62,6 +63,7 @@ #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/quic/platform/api/quic_stack_trace.h" #include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/print_elements.h" #include "quiche/common/quiche_buffer_allocator.h" #include "quiche/common/quiche_callbacks.h" #include "quiche/common/quiche_text_utils.h" @@ -1290,7 +1292,11 @@ std::shared_ptr QuicDispatcher::CreateSessionFromChlo( << ", version:" << version << ", self_address:" << self_address << ", peer_address:" << peer_address << ", parsed_chlo:" << parsed_chlo - << ", other peer address: " << other_connection->peer_address(); + << ", other peer address: " << other_connection->peer_address() + << ", other CIDs: " + << quiche::PrintElements( + other_connection->GetActiveServerConnectionIds()) + << ", other stats: " << other_connection->GetStats(); } if (replaced_connection_id) { QUIC_CODE_COUNT(quic_replaced_connection_id_collision); diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_dispatcher_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_dispatcher_test.cc index 05e6e69bee..e54eea2fe2 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_dispatcher_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_dispatcher_test.cc @@ -4,8 +4,10 @@ #include "quiche/quic/core/quic_dispatcher.h" +#include #include #include +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc index c1af8b3901..51e11e85e9 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc @@ -6,6 +6,8 @@ #include #include +#include +#include #include "absl/strings/str_cat.h" #include "openssl/ssl.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_error_codes_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_error_codes_test.cc index 9297f6ea3f..056f8ee2d7 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_error_codes_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_error_codes_test.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/quic_error_codes.h" #include +#include #include "openssl/ssl.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_flags_list.h b/yass/third_party/quiche/src/quiche/quic/core/quic_flags_list.h index 2235cbec9a..e219224a39 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_flags_list.h +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_flags_list.h @@ -21,6 +21,8 @@ QUIC_FLAG(quic_reloadable_flag_quic_block_until_settings_received_copt, true) QUIC_FLAG(quic_reloadable_flag_quic_no_write_control_frame_upon_connection_close, true) // If true, HTTP/2 HEADERS frames will use two additional bytes of HPACK overhead per header in their SpdyHeadersIR::size() estimate. This flag is latched in SpdyHeadersIR to ensure a consistent size() value for a const SpdyHeadersIR regardless of flag state. QUIC_FLAG(quic_reloadable_flag_http2_add_hpack_overhead_bytes2, true) +// If true, QUIC BBR2 will use a 0.91 PROBE_DOWN gain by default. +QUIC_FLAG(quic_reloadable_flag_quic_bbr2_enable_bbpd_by_default, false) // If true, QUIC server will not respond to gQUIC probing packet(PING + PADDING) but treat it as a regular packet. QUIC_FLAG(quic_reloadable_flag_quic_ignore_gquic_probing, true) // If true, QUIC will default enable MTU discovery at server, with a target of 1450 bytes. @@ -40,7 +42,7 @@ QUIC_FLAG(quic_reloadable_flag_quic_gfe_allow_alps_new_codepoint, true) // If true, an endpoint does not detect path degrading or blackholing until handshake gets confirmed. QUIC_FLAG(quic_reloadable_flag_quic_no_path_degrading_before_handshake_confirmed, true) // If true, bundle qpack decoder data with other frames opportunistically. -QUIC_FLAG(quic_restart_flag_quic_opport_bundle_qpack_decoder_data5, false) +QUIC_FLAG(quic_restart_flag_quic_opport_bundle_qpack_decoder_data5, true) // If true, default-enable 5RTO blachole detection. QUIC_FLAG(quic_reloadable_flag_quic_default_enable_5rto_blackhole_detection2, true) // If true, disable QUIC version Q046. @@ -73,12 +75,12 @@ QUIC_FLAG(quic_reloadable_flag_quic_priority_respect_incremental, false) QUIC_FLAG(quic_reloadable_flag_quic_disable_batch_write, false) // If true, set burst token to 2 in cwnd bootstrapping experiment. QUIC_FLAG(quic_reloadable_flag_quic_conservative_bursts, false) -// If true, the HTTP/3 decoder will decode METADATA frames and not treat them as Unknown. -QUIC_FLAG(quic_reloadable_flag_quic_enable_http3_metadata_decoding, true) // If true, use BBRv2 as the default congestion controller. Takes precedence over --quic_default_to_bbr. QUIC_FLAG(quic_reloadable_flag_quic_default_to_bbr_v2, false) // If true, use a LRU cache to record client addresses of packets received on server\'s original address. QUIC_FLAG(quic_reloadable_flag_quic_use_received_client_addresses_cache, true) +// If true, use improved QPACK compression algorithm. +QUIC_FLAG(quic_reloadable_flag_quic_better_qpack_compression, true) // If true, uses conservative cwnd gain and pacing gain when cwnd gets bootstrapped. QUIC_FLAG(quic_reloadable_flag_quic_conservative_cwnd_and_pacing_gains, false) // If true, when TicketCrypter fails to encrypt a session ticket, quic::TlsServerHandshaker will send a placeholder ticket, instead of an empty one, to the client. diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_flow_controller.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_flow_controller.cc index 4acdd513f3..3120ca20ef 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_flow_controller.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_flow_controller.cc @@ -4,7 +4,9 @@ #include "quiche/quic/core/quic_flow_controller.h" +#include #include +#include #include "absl/strings/str_cat.h" #include "quiche/quic/core/quic_connection.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_framer.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_framer.cc index 9e3d9dde3f..4e037f5645 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_framer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_framer.cc @@ -6,6 +6,7 @@ #include +#include #include #include #include @@ -14,6 +15,7 @@ #include #include #include +#include #include "absl/base/attributes.h" #include "absl/base/macros.h" @@ -1759,8 +1761,18 @@ bool QuicFramer::ProcessIetfDataPacket(QuicDataReader* encrypted_reader, uint64_t full_packet_number; bool hp_removal_failed = false; if (version_.HasHeaderProtection()) { - if (!RemoveHeaderProtection(encrypted_reader, packet, header, - &full_packet_number, ad_storage)) { + EncryptionLevel expected_decryption_level = GetEncryptionLevel(*header); + QuicDecrypter* decrypter = decrypter_[expected_decryption_level].get(); + if (decrypter == nullptr) { + QUIC_DVLOG(1) + << ENDPOINT + << "No decrypter available for removing header protection at level " + << expected_decryption_level; + hp_removal_failed = true; + } else if (!RemoveHeaderProtection(encrypted_reader, packet, *decrypter, + perspective_, version_, + base_packet_number, header, + &full_packet_number, ad_storage)) { hp_removal_failed = true; } associated_data = absl::string_view(ad_storage.data(), ad_storage.size()); @@ -1868,6 +1880,12 @@ bool QuicFramer::ProcessIetfDataPacket(QuicDataReader* encrypted_reader, RecordDroppedPacketReason(DroppedPacketReason::DECRYPTION_FAILURE); return RaiseError(QUIC_DECRYPTION_FAILURE); } + + if (packet.length() > kMaxIncomingPacketSize) { + set_detailed_error("Packet too large."); + return RaiseError(QUIC_PACKET_TOO_LARGE); + } + QuicDataReader reader(decrypted_buffer, decrypted_length); // Update the largest packet number after we have decrypted the packet @@ -1886,11 +1904,6 @@ bool QuicFramer::ProcessIetfDataPacket(QuicDataReader* encrypted_reader, return true; } - if (packet.length() > kMaxIncomingPacketSize) { - set_detailed_error("Packet too large."); - return RaiseError(QUIC_PACKET_TOO_LARGE); - } - // Handle the payload. if (VersionHasIetfQuicFrames(version_.transport_version)) { current_received_frame_type_ = 0; @@ -2111,7 +2124,7 @@ const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( uint64_t QuicFramer::CalculatePacketNumberFromWire( QuicPacketNumberLength packet_number_length, - QuicPacketNumber base_packet_number, uint64_t packet_number) const { + QuicPacketNumber base_packet_number, uint64_t packet_number) { // The new packet number might have wrapped to the next epoch, or // it might have reverse wrapped to the previous epoch, or it might // remain in the same epoch. Select the packet number closest to the @@ -4301,23 +4314,15 @@ bool QuicFramer::ApplyHeaderProtection(EncryptionLevel level, char* buffer, bool QuicFramer::RemoveHeaderProtection( QuicDataReader* reader, const QuicEncryptedPacket& packet, + QuicDecrypter& decrypter, Perspective perspective, + const ParsedQuicVersion& version, QuicPacketNumber base_packet_number, QuicPacketHeader* header, uint64_t* full_packet_number, AssociatedDataStorage& associated_data) { - EncryptionLevel expected_decryption_level = GetEncryptionLevel(*header); - QuicDecrypter* decrypter = decrypter_[expected_decryption_level].get(); - if (decrypter == nullptr) { - QUIC_DVLOG(1) - << ENDPOINT - << "No decrypter available for removing header protection at level " - << expected_decryption_level; - return false; - } - bool has_diversification_nonce = header->form == IETF_QUIC_LONG_HEADER_PACKET && header->long_packet_type == ZERO_RTT_PROTECTED && - perspective_ == Perspective::IS_CLIENT && - version_.handshake_protocol == PROTOCOL_QUIC_CRYPTO; + perspective == Perspective::IS_CLIENT && + version.handshake_protocol == PROTOCOL_QUIC_CRYPTO; // Read a sample from the ciphertext and compute the mask to use for header // protection. @@ -4338,7 +4343,7 @@ bool QuicFramer::RemoveHeaderProtection( return false; } } - std::string mask = decrypter->GenerateHeaderProtectionMask(&sample_reader); + std::string mask = decrypter.GenerateHeaderProtectionMask(&sample_reader); QuicDataReader mask_reader(mask.data(), mask.size()); if (mask.empty()) { QUIC_DVLOG(1) << "Failed to compute mask"; @@ -4376,16 +4381,6 @@ bool QuicFramer::RemoveHeaderProtection( } } QuicDataReader packet_number_reader(pn_writer.data(), pn_writer.length()); - QuicPacketNumber base_packet_number; - if (supports_multiple_packet_number_spaces_) { - PacketNumberSpace pn_space = GetPacketNumberSpace(*header); - if (pn_space == NUM_PACKET_NUMBER_SPACES) { - return false; - } - base_packet_number = largest_decrypted_packet_numbers_[pn_space]; - } else { - base_packet_number = largest_packet_number_; - } if (!ProcessAndCalculatePacketNumber( &packet_number_reader, header->packet_number_length, base_packet_number, full_packet_number)) { @@ -4394,7 +4389,7 @@ bool QuicFramer::RemoveHeaderProtection( // Get the associated data, and apply the same unmasking operations to it. absl::string_view ad = GetAssociatedDataFromEncryptedPacket( - version_.transport_version, packet, + version.transport_version, packet, GetIncludedDestinationConnectionIdLength(*header), GetIncludedSourceConnectionIdLength(*header), header->version_flag, has_diversification_nonce, header->packet_number_length, @@ -6486,6 +6481,119 @@ QuicErrorCode QuicFramer::ParsePublicHeaderDispatcherShortHeaderLengthUnknown( retry_token, detailed_error); } +QuicErrorCode QuicFramer::TryDecryptInitialPacketDispatcher( + const QuicEncryptedPacket& packet, const ParsedQuicVersion& version, + PacketHeaderFormat format, QuicLongHeaderType long_packet_type, + const QuicConnectionId& destination_connection_id, + const QuicConnectionId& source_connection_id, + const std::optional& retry_token, + QuicPacketNumber largest_decrypted_inital_packet_number, + QuicDecrypter& decrypter, std::optional* packet_number) { + QUICHE_DCHECK(packet_number != nullptr); + packet_number->reset(); + + // TODO(wub): Remove the version check once RFCv2 is supported by + // ParsePublicHeaderDispatcherShortHeaderLengthUnknown. + if (version != ParsedQuicVersion::RFCv1() && + version != ParsedQuicVersion::Draft29()) { + return QUIC_NO_ERROR; + } + if (packet.length() == 0 || format != IETF_QUIC_LONG_HEADER_PACKET || + !VersionHasIetfQuicFrames(version.transport_version) || + long_packet_type != INITIAL) { + return QUIC_NO_ERROR; + } + + QuicPacketHeader header; + header.destination_connection_id = destination_connection_id; + header.destination_connection_id_included = + destination_connection_id.IsEmpty() ? CONNECTION_ID_ABSENT + : CONNECTION_ID_PRESENT; + header.source_connection_id = source_connection_id; + header.source_connection_id_included = source_connection_id.IsEmpty() + ? CONNECTION_ID_ABSENT + : CONNECTION_ID_PRESENT; + header.reset_flag = false; + header.version_flag = true; + header.has_possible_stateless_reset_token = false; + header.type_byte = packet.data()[0]; + header.version = version; + header.form = IETF_QUIC_LONG_HEADER_PACKET; + header.long_packet_type = INITIAL; + header.nonce = nullptr; + header.retry_token = retry_token.value_or(absl::string_view()); + header.retry_token_length_length = + QuicDataWriter::GetVarInt62Len(header.retry_token.length()); + + // In a initial packet, the 3 fields after the Retry Token are: + // - Packet Length (i) + // - Packet Number (8..32) + // - Packet Payload (8..) + // Normally, GetStartOfEncryptedData returns the offset of the payload, here + // we want the QuicDataReader to start reading from the packet length, so we + // - Pass a length_length of VARIABLE_LENGTH_INTEGER_LENGTH_0, + // - Pass a packet number length of PACKET_1BYTE_PACKET_NUMBER, + // - Subtract PACKET_1BYTE_PACKET_NUMBER from the return value of + // GetStartOfEncryptedData. + header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0; + // The real header.packet_number_length is populated after a successful return + // from RemoveHeaderProtection. + header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER; + + size_t remaining_packet_length_offset = + GetStartOfEncryptedData(version.transport_version, header) - + header.packet_number_length; + if (packet.length() <= remaining_packet_length_offset) { + return QUIC_INVALID_PACKET_HEADER; + } + QuicDataReader reader(packet.data() + remaining_packet_length_offset, + packet.length() - remaining_packet_length_offset); + + if (!reader.ReadVarInt62(&header.remaining_packet_length) || + // If |packet| is coalesced, truncate such that |reader| only sees the + // first QUIC packet. + !reader.TruncateRemaining(header.remaining_packet_length)) { + return QUIC_INVALID_PACKET_HEADER; + } + + header.length_length = + QuicDataWriter::GetVarInt62Len(header.remaining_packet_length); + + AssociatedDataStorage associated_data; + uint64_t full_packet_number; + if (!RemoveHeaderProtection(&reader, packet, decrypter, + Perspective::IS_SERVER, version, + largest_decrypted_inital_packet_number, &header, + &full_packet_number, associated_data)) { + return QUIC_INVALID_PACKET_HEADER; + } + + ABSL_CACHELINE_ALIGNED char stack_buffer[kMaxIncomingPacketSize]; + std::unique_ptr heap_buffer; + char* decrypted_buffer; + size_t decrypted_buffer_length; + if (packet.length() <= kMaxIncomingPacketSize) { + decrypted_buffer = stack_buffer; + decrypted_buffer_length = kMaxIncomingPacketSize; + } else { + heap_buffer = std::make_unique(packet.length()); + decrypted_buffer = heap_buffer.get(); + decrypted_buffer_length = packet.length(); + } + + size_t decrypted_length = 0; + if (!decrypter.DecryptPacket( + full_packet_number, + absl::string_view(associated_data.data(), associated_data.size()), + reader.ReadRemainingPayload(), decrypted_buffer, &decrypted_length, + decrypted_buffer_length)) { + return QUIC_DECRYPTION_FAILURE; + } + + (*packet_number) = full_packet_number; + return QUIC_NO_ERROR; +} + // static QuicErrorCode QuicFramer::ParsePublicHeaderGoogleQuic( QuicDataReader* reader, uint8_t* first_byte, PacketHeaderFormat* format, diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_framer.h b/yass/third_party/quiche/src/quiche/quic/core/quic_framer.h index 6d156769a6..60736ed6ef 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_framer.h +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_framer.h @@ -490,6 +490,24 @@ class QUICHE_EXPORT QuicFramer { std::optional* retry_token, std::string* detailed_error, ConnectionIdGeneratorInterface& generator); + // Attempts to parse the packet number and decrypt the packet payload at + // server for IETF Initial packets. Returns an error code if parsing or + // decrypting fails. Returns QUIC_NO_ERROR if + // - Parsing did not happen due to failed preconditions. In this case, + // *packet_number will be set to std::nullopt. This happens if + // - |version| is neither draft29 nor RFCv1. + // - |packet| is not a IETF Inital packet. + // - Parsing and decrypting succeeded. In this case, *packet_number will be + // the parsed packet number. + static QuicErrorCode TryDecryptInitialPacketDispatcher( + const QuicEncryptedPacket& packet, const ParsedQuicVersion& version, + PacketHeaderFormat format, QuicLongHeaderType long_packet_type, + const QuicConnectionId& destination_connection_id, + const QuicConnectionId& source_connection_id, + const std::optional& retry_token, + QuicPacketNumber largest_decrypted_inital_packet_number, + QuicDecrypter& decrypter, std::optional* packet_number); + // Serializes a packet containing |frames| into |buffer|. // Returns the length of the packet, which must not be longer than // |packet_length|. Returns 0 if it fails to serialize. @@ -794,11 +812,12 @@ class QUICHE_EXPORT QuicFramer { // written to |full_packet_number|. Finally, the header, with header // protection removed, is written to |associated_data| to be used in packet // decryption. |packet| is used in computing the asociated data. - bool RemoveHeaderProtection(QuicDataReader* reader, - const QuicEncryptedPacket& packet, - QuicPacketHeader* header, - uint64_t* full_packet_number, - AssociatedDataStorage& associated_data); + static bool RemoveHeaderProtection( + QuicDataReader* reader, const QuicEncryptedPacket& packet, + QuicDecrypter& decrypter, Perspective perspective, + const ParsedQuicVersion& version, QuicPacketNumber base_packet_number, + QuicPacketHeader* header, uint64_t* full_packet_number, + AssociatedDataStorage& associated_data); bool ProcessIetfDataPacket(QuicDataReader* encrypted_reader, QuicPacketHeader* header, @@ -844,7 +863,7 @@ class QUICHE_EXPORT QuicFramer { // First processes possibly truncated packet number. Calculates the full // packet number from the truncated one and the last seen packet number, and // stores it to |packet_number|. - bool ProcessAndCalculatePacketNumber( + static bool ProcessAndCalculatePacketNumber( QuicDataReader* reader, QuicPacketNumberLength packet_number_length, QuicPacketNumber base_packet_number, uint64_t* packet_number); bool ProcessFrameData(QuicDataReader* reader, const QuicPacketHeader& header); @@ -887,9 +906,9 @@ class QUICHE_EXPORT QuicFramer { // Returns the full packet number from the truncated // wire format version and the last seen packet number. - uint64_t CalculatePacketNumberFromWire( + static uint64_t CalculatePacketNumberFromWire( QuicPacketNumberLength packet_number_length, - QuicPacketNumber base_packet_number, uint64_t packet_number) const; + QuicPacketNumber base_packet_number, uint64_t packet_number); // Returns the QuicTime::Delta corresponding to the time from when the framer // was created. diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_framer_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_framer_test.cc index 7f4e53a845..c0d27d9b83 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_framer_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_framer_test.cc @@ -7,8 +7,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -42,6 +44,7 @@ using testing::_; using testing::ContainerEq; +using testing::Optional; using testing::Return; namespace quic { @@ -1094,6 +1097,8 @@ TEST_P(QuicFramerTest, LargePacket) { // Make sure the correct error is propagated. EXPECT_THAT(framer_.error(), IsError(QUIC_PACKET_TOO_LARGE)); EXPECT_EQ("Packet too large.", framer_.detailed_error()); + // Make sure the packet wasn't visited. + EXPECT_EQ(0, visitor_.packet_count_); } TEST_P(QuicFramerTest, LongPacketHeader) { @@ -13279,6 +13284,204 @@ TEST_P(QuicFramerTest, DispatcherParseClientVersionNegotiationProbePacket) { EXPECT_EQ("", detailed_error); } +TEST_P(QuicFramerTest, DispatcherParseClientInitialPacketNumber) { + // clang-format off + PacketFragments packet = { + // Type (Long header, INITIAL, 2B packet number) + {"Unable to read first byte.", + {0xC1}}, + // Version + {"Unable to read protocol version.", + {QUIC_VERSION_BYTES}}, + // Length-prefixed Destination connection_id + {"Unable to read destination connection ID.", + {0x08, 0x56, 0x4e, 0x20, 0x70, 0x6c, 0x7a, 0x20, 0x21}}, + // Length-prefixed Source connection_id + {"Unable to read source connection ID.", + {0x00}}, + // Retry token + {"", + {0x00}}, + // Length + {"", + {kVarInt62TwoBytes + 0x03, 0x04}}, + // Packet number + {"Unable to read packet number.", + {0x00, 0x02}}, + // Packet payload (padding) + {"", + std::vector(static_cast(kDefaultMaxPacketSize - 20), 0)} + }; + // clang-format on + + SetDecrypterLevel(ENCRYPTION_INITIAL); + std::unique_ptr encrypted( + AssemblePacketFromFragments(packet)); + ASSERT_EQ(encrypted->length(), kDefaultMaxPacketSize); + PacketHeaderFormat format; + QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE; + bool version_flag; + bool use_length_prefix; + QuicVersionLabel version_label; + std::optional retry_token; + ParsedQuicVersion parsed_version = UnsupportedQuicVersion(); + QuicConnectionId destination_connection_id, source_connection_id; + std::string detailed_error; + MockConnectionIdGenerator generator; + EXPECT_CALL(generator, ConnectionIdLength(_)).Times(0); + EXPECT_EQ(QUIC_NO_ERROR, + QuicFramer::ParsePublicHeaderDispatcherShortHeaderLengthUnknown( + *encrypted, &format, &long_packet_type, &version_flag, + &use_length_prefix, &version_label, &parsed_version, + &destination_connection_id, &source_connection_id, &retry_token, + &detailed_error, generator)); + EXPECT_EQ(parsed_version, version_); + if (parsed_version != ParsedQuicVersion::RFCv1() && + parsed_version != ParsedQuicVersion::Draft29()) { + return; + } + EXPECT_EQ(format, IETF_QUIC_LONG_HEADER_PACKET); + EXPECT_EQ(destination_connection_id.length(), 8); + EXPECT_EQ(long_packet_type, INITIAL); + EXPECT_TRUE(version_flag); + EXPECT_TRUE(use_length_prefix); + EXPECT_EQ(version_label, CreateQuicVersionLabel(version_)); + + EXPECT_EQ(source_connection_id.length(), 0); + EXPECT_TRUE(retry_token.value_or("").empty()); + EXPECT_EQ(detailed_error, ""); + + std::optional packet_number; + EXPECT_EQ(QUIC_NO_ERROR, + QuicFramer::TryDecryptInitialPacketDispatcher( + *encrypted, parsed_version, format, long_packet_type, + destination_connection_id, source_connection_id, retry_token, + /*largest_decrypted_inital_packet_number=*/QuicPacketNumber(), + *decrypter_, &packet_number)); + EXPECT_THAT(packet_number, Optional(2)); +} + +TEST_P(QuicFramerTest, + DispatcherParseClientInitialPacketNumberFromCoalescedPacket) { + if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) { + return; + } + SetDecrypterLevel(ENCRYPTION_INITIAL); + // clang-format off + unsigned char packet[] = { + // first coalesced packet + // Type (Long header, INITIAL, 4B packet number) + 0xC3, + // Version + QUIC_VERSION_BYTES, + // Destination connection ID length + 0x08, + // Destination connection ID + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // Source connection ID length + 0x00, + // Retry token + 0x00, + // Packet length + 0x1E, + // Packet number + 0x12, 0x34, 0x56, 0x78, + // Frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set) + 0x08 | 0x01 | 0x02 | 0x04, + // Stream id + kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04, + // Offset + kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54, + // Data length + kVarInt62OneByte + 0x0c, + // Data + 'h', 'e', 'l', 'l', + 'o', ' ', 'w', 'o', + 'r', 'l', 'd', '!', + // second coalesced packet + // Type (Long header, ZERO_RTT_PROTECTED, 4B packet number) + 0xD3, + // Version + QUIC_VERSION_BYTES, + // Destination connection ID length + 0x08, + // Destination connection ID + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // Source connection ID length + 0x00, + // Packet length + 0x1E, + // Packet number + 0x12, 0x34, 0x56, 0x79, + // Frame type (IETF_STREAM frame with FIN, LEN, and OFFSET bits set) + 0x08 | 0x01 | 0x02 | 0x04, + // Stream id + kVarInt62FourBytes + 0x00, 0x02, 0x03, 0x04, + // Offset + kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54, + // Data length + kVarInt62OneByte + 0x0c, + // Data + 'H', 'E', 'L', 'L', + 'O', '_', 'W', 'O', + 'R', 'L', 'D', '?', + }; + // clang-format on + const size_t first_packet_size = 47; + // If the first packet changes, the attempt to fix the first byte of the + // second packet will fail. + ASSERT_EQ(packet[first_packet_size], 0xD3); + + ReviseFirstByteByVersion(packet); + ReviseFirstByteByVersion(&packet[first_packet_size]); + unsigned char* p = packet; + size_t p_length = ABSL_ARRAYSIZE(packet); + + QuicEncryptedPacket encrypted(AsChars(p), p_length, false); + PacketHeaderFormat format; + QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE; + bool version_flag; + bool use_length_prefix; + QuicVersionLabel version_label; + std::optional retry_token; + ParsedQuicVersion parsed_version = UnsupportedQuicVersion(); + QuicConnectionId destination_connection_id, source_connection_id; + std::string detailed_error; + MockConnectionIdGenerator generator; + EXPECT_CALL(generator, ConnectionIdLength(_)).Times(0); + EXPECT_EQ(QUIC_NO_ERROR, + QuicFramer::ParsePublicHeaderDispatcherShortHeaderLengthUnknown( + encrypted, &format, &long_packet_type, &version_flag, + &use_length_prefix, &version_label, &parsed_version, + &destination_connection_id, &source_connection_id, &retry_token, + &detailed_error, generator)); + EXPECT_EQ(parsed_version, version_); + if (parsed_version != ParsedQuicVersion::RFCv1() && + parsed_version != ParsedQuicVersion::Draft29()) { + return; + } + EXPECT_EQ(format, IETF_QUIC_LONG_HEADER_PACKET); + EXPECT_EQ(destination_connection_id.length(), 8); + EXPECT_EQ(long_packet_type, INITIAL); + EXPECT_TRUE(version_flag); + EXPECT_TRUE(use_length_prefix); + EXPECT_EQ(version_label, CreateQuicVersionLabel(version_)); + + EXPECT_EQ(source_connection_id.length(), 0); + EXPECT_TRUE(retry_token.value_or("").empty()); + EXPECT_EQ(detailed_error, ""); + + std::optional packet_number; + EXPECT_EQ(QUIC_NO_ERROR, + QuicFramer::TryDecryptInitialPacketDispatcher( + encrypted, parsed_version, format, long_packet_type, + destination_connection_id, source_connection_id, retry_token, + /*largest_decrypted_inital_packet_number=*/QuicPacketNumber(), + *decrypter_, &packet_number)); + EXPECT_THAT(packet_number, Optional(0x12345678)); +} + TEST_P(QuicFramerTest, ParseServerVersionNegotiationProbeResponse) { // clang-format off const uint8_t packet[] = { diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_generic_session.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_generic_session.cc index 2b767cac8e..f142190276 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_generic_session.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_generic_session.cc @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -13,6 +14,7 @@ #include "quiche/quic/core/http/web_transport_stream_adapter.h" #include "quiche/quic/core/quic_crypto_client_stream.h" #include "quiche/quic/core/quic_session.h" +#include "quiche/quic/core/quic_stream_priority.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/core/quic_utils.h" #include "quiche/quic/core/quic_versions.h" @@ -57,7 +59,9 @@ class QUICHE_EXPORT QuicGenericStream : public QuicStream { QuicUtils::GetStreamType( id, session->connection()->perspective(), session->IsIncomingStream(id), session->version())), - adapter_(session, this, sequencer()) {} + adapter_(session, this, sequencer(), std::nullopt) { + adapter_.SetPriority(webtransport::StreamPriority{0, 0}); + } WebTransportStreamAdapter* adapter() { return &adapter_; } @@ -76,7 +80,8 @@ QuicGenericSessionBase::QuicGenericSessionBase( std::unique_ptr datagram_observer) : QuicSession(connection, owner, config, GetQuicVersionsForGenericSession(), /*num_expected_unidirectional_static_streams=*/0, - std::move(datagram_observer)), + std::move(datagram_observer), + QuicPriorityType::kWebTransport), alpn_(std::move(alpn)), visitor_(visitor), owns_connection_(owns_connection), diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_generic_session_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_generic_session_test.cc index ff32c4dc3e..a1b9d97e00 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_generic_session_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_generic_session_test.cc @@ -457,7 +457,7 @@ TEST_F(QuicGenericSessionTest, LoseDatagrams) { 4 * simulator::TestHarness::kServerBandwidth.TransferTime( 1000 * kMaxOutgoingPacketSize))); // Allow extra round-trips for the final flight of datagrams to arrive back. - test_harness_.simulator().RunFor(4 * simulator::TestHarness::kRtt); + test_harness_.simulator().RunFor(16 * simulator::TestHarness::kRtt); QuicPacketCount client_lost = client_->session()->GetDatagramStats().lost_outgoing; diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector.cc index fec69ddae1..211b2e1040 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_idle_network_detector.h" +#include + #include "quiche/quic/core/quic_constants.h" #include "quiche/quic/core/quic_time.h" #include "quiche/quic/platform/api/quic_flag_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector_test.cc index 6b5bfa8ea7..d34d8cb5c9 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector_test.cc @@ -10,6 +10,7 @@ #include "quiche/quic/platform/api/quic_expect_bug.h" #include "quiche/quic/platform/api/quic_flags.h" #include "quiche/quic/platform/api/quic_test.h" +#include "quiche/quic/test_tools/mock_quic_connection_alarms.h" #include "quiche/quic/test_tools/quic_test_utils.h" namespace quic { @@ -33,17 +34,19 @@ class MockDelegate : public QuicIdleNetworkDetector::Delegate { class QuicIdleNetworkDetectorTest : public QuicTest { public: QuicIdleNetworkDetectorTest() - : alarms_(nullptr, nullptr, &detector_, nullptr, nullptr, alarm_factory_, - arena_), + : alarms_(&connection_alarms_delegate_, alarm_factory_, arena_), detector_(&delegate_, clock_.Now() + QuicTimeDelta::FromSeconds(1), &alarms_.idle_network_detector_alarm()) { clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); alarm_ = static_cast( &alarms_.idle_network_detector_alarm()); + ON_CALL(connection_alarms_delegate_, OnIdleDetectorAlarm()) + .WillByDefault([&] { detector_.OnAlarm(); }); } protected: testing::StrictMock delegate_; + MockConnectionAlarmsDelegate connection_alarms_delegate_; QuicConnectionArena arena_; MockAlarmFactory alarm_factory_; QuicConnectionAlarms alarms_; diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_interval_deque.h b/yass/third_party/quiche/src/quiche/quic/core/quic_interval_deque.h index db7b2b0ace..f4de0485fd 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_interval_deque.h +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_interval_deque.h @@ -158,12 +158,13 @@ class QUICHE_NO_EXPORT QuicIntervalDeque { Iterator(std::size_t index, QuicIntervalDeque* deque) : index_(index), deque_(deque) {} // Only the ++ operator attempts to update the cached index. Other operators - // are used by |lower_bound| to binary search and are thus private. + // are used by |lower_bound| to binary search. Iterator& operator++() { // Don't increment when we are at the end. const std::size_t container_size = deque_->container_.size(); if (index_ >= container_size) { - QUIC_BUG(quic_bug_10862_1) << "Iterator out of bounds."; + QUIC_BUG(QuicIntervalDeque_operator_plus_plus_iterator_out_of_bounds) + << "Iterator out of bounds."; return *this; } index_++; @@ -186,6 +187,20 @@ class QUICHE_NO_EXPORT QuicIntervalDeque { ++(*this); return copy; } + Iterator& operator--() { + if (index_ == 0) { + QUIC_BUG(QuicIntervalDeque_operator_minus_minus_iterator_out_of_bounds) + << "Iterator out of bounds."; + return *this; + } + index_--; + return *this; + } + Iterator operator--(int) { + Iterator copy = *this; + --(*this); + return copy; + } reference operator*() { return deque_->container_[index_]; } reference operator*() const { return deque_->container_[index_]; } pointer operator->() { return &deque_->container_[index_]; } @@ -194,11 +209,13 @@ class QUICHE_NO_EXPORT QuicIntervalDeque { } bool operator!=(const Iterator& rhs) const { return !(*this == rhs); } Iterator& operator+=(difference_type amount) { + // `amount` might be negative, check for underflow. + QUICHE_DCHECK_GE(static_cast(index_), -amount); index_ += amount; - QUICHE_DCHECK_LE(0u, index_); QUICHE_DCHECK_LT(index_, deque_->Size()); return *this; } + Iterator& operator-=(difference_type amount) { return operator+=(-amount); } difference_type operator-(const Iterator& rhs) const { return static_cast(index_) - static_cast(rhs.index_); @@ -272,7 +289,8 @@ void QuicIntervalDeque::PushBack(const T& item) { template void QuicIntervalDeque::PopFront() { if (container_.size() == 0) { - QUIC_BUG(quic_bug_10862_2) << "Trying to pop from an empty container."; + QUIC_BUG(QuicIntervalDeque_PopFront_empty) + << "Trying to pop from an empty container."; return; } container_.pop_front(); @@ -355,7 +373,7 @@ void QuicIntervalDeque::PushBackUniversal(U&& item) { QuicInterval interval = item.interval(); // Adding an empty interval is a bug. if (interval.Empty()) { - QUIC_BUG(quic_bug_10862_3) + QUIC_BUG(QuicIntervalDeque_PushBackUniversal_empty) << "Trying to save empty interval to quiche::QuicheCircularDeque."; return; } diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_interval_deque_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_interval_deque_test.cc index 318059f286..b0ab1ef9c0 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_interval_deque_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_interval_deque_test.cc @@ -357,5 +357,44 @@ TEST_F(QuicIntervalDequeTest, IteratorEmpty) { EXPECT_EQ(it, qid.DataEnd()); } +// Test various iterator methods. +TEST_F(QuicIntervalDequeTest, IteratorMethods) { + auto it1 = qid_.DataBegin(); + auto it2 = qid_.DataBegin(); + + EXPECT_EQ(it1, it2); + EXPECT_TRUE(it1 == it2); + EXPECT_FALSE(it1 != it2); + + EXPECT_EQ(it1++, it2); + EXPECT_NE(it1, it2); + EXPECT_FALSE(it1 == it2); + EXPECT_TRUE(it1 != it2); + + it2++; + EXPECT_EQ(it1, it2); + + EXPECT_NE(++it1, it2); + + it1++; + it2 += 2; + EXPECT_EQ(it1, it2); + + EXPECT_EQ(it1--, it2); + EXPECT_EQ(it1, --it2); + + it1 += 24; + it1 -= 2; + it2 -= 1; + it2 += 23; + EXPECT_EQ(it1, it2); + + it1 = qid_.DataBegin(); + EXPECT_QUIC_BUG(it1--, "Iterator out of bounds."); + + it2 = qid_.DataEnd(); + EXPECT_QUIC_BUG(it2++, "Iterator out of bounds."); +} + } // namespace test } // namespace quic diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_interval_set_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_interval_set_test.cc index b3ac3e6637..b44d06b301 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_interval_set_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_interval_set_test.cc @@ -10,6 +10,7 @@ #include #include #include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_interval_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_interval_test.cc index 9a7c70d9c2..45f2242433 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_interval_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_interval_test.cc @@ -4,10 +4,12 @@ #include "quiche/quic/core/quic_interval.h" +#include #include #include #include #include +#include #include "quiche/quic/core/quic_time.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_linux_socket_utils.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_linux_socket_utils.cc index ba3541eee2..3dcc6a929a 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_linux_socket_utils.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_linux_socket_utils.cc @@ -8,6 +8,7 @@ #include #include +#include #include "quiche/quic/core/quic_syscall_wrapper.h" #include "quiche/quic/platform/api/quic_ip_address.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_lru_cache_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_lru_cache_test.cc index 91a7913b84..dda23e43cd 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_lru_cache_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_lru_cache_test.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/quic_lru_cache.h" +#include +#include + #include "quiche/quic/platform/api/quic_test.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_mtu_discovery.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_mtu_discovery.cc index 373239344f..62e1b664e6 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_mtu_discovery.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_mtu_discovery.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_mtu_discovery.h" +#include + #include "quiche/quic/platform/api/quic_flag_utils.h" #include "quiche/quic/platform/api/quic_stack_trace.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_network_blackhole_detector.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_network_blackhole_detector.cc index 9e85f73210..99e71faf44 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_network_blackhole_detector.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_network_blackhole_detector.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_network_blackhole_detector.h" +#include + #include "quiche/quic/core/quic_constants.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_network_blackhole_detector_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_network_blackhole_detector_test.cc index b43796c300..cad85346fb 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_network_blackhole_detector_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_network_blackhole_detector_test.cc @@ -7,6 +7,7 @@ #include "quiche/quic/core/quic_connection_alarms.h" #include "quiche/quic/core/quic_one_block_arena.h" #include "quiche/quic/platform/api/quic_test.h" +#include "quiche/quic/test_tools/mock_quic_connection_alarms.h" #include "quiche/quic/test_tools/quic_test_utils.h" namespace quic { @@ -34,8 +35,7 @@ const size_t kBlackholeDelayInSeconds = 10; class QuicNetworkBlackholeDetectorTest : public QuicTest { public: QuicNetworkBlackholeDetectorTest() - : alarms_(nullptr, nullptr, nullptr, &detector_, nullptr, alarm_factory_, - arena_), + : alarms_(&connection_alarms_delegate_, alarm_factory_, arena_), detector_(&delegate_, &alarms_.network_blackhole_detector_alarm()), alarm_(static_cast( QuicNetworkBlackholeDetectorPeer::GetAlarm(&detector_))), @@ -46,6 +46,8 @@ class QuicNetworkBlackholeDetectorTest : public QuicTest { blackhole_delay_( QuicTime::Delta::FromSeconds(kBlackholeDelayInSeconds)) { clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); + ON_CALL(connection_alarms_delegate_, OnNetworkBlackholeDetectorAlarm()) + .WillByDefault([&] { detector_.OnAlarm(); }); } protected: @@ -56,6 +58,7 @@ class QuicNetworkBlackholeDetectorTest : public QuicTest { } testing::StrictMock delegate_; + MockConnectionAlarmsDelegate connection_alarms_delegate_; QuicConnectionArena arena_; MockAlarmFactory alarm_factory_; QuicConnectionAlarms alarms_; diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_one_block_arena_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_one_block_arena_test.cc index 5c1079b773..94493dfc38 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_one_block_arena_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_one_block_arena_test.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/quic_one_block_arena.h" #include +#include #include "quiche/quic/platform/api/quic_expect_bug.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc index 021e637a22..aecfc73462 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_packet_creator_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_packet_creator_test.cc index 6aabdce6d6..b527b0953d 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_packet_creator_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_packet_creator_test.cc @@ -10,6 +10,7 @@ #include #include #include +#include #include "absl/base/macros.h" #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_packet_number.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_packet_number.cc index c7bda67439..dfbb2aba3a 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_packet_number.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_packet_number.cc @@ -6,6 +6,8 @@ #include #include +#include +#include #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_packet_writer_wrapper.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_packet_writer_wrapper.cc index 930d4fcef9..6a615566a7 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_packet_writer_wrapper.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_packet_writer_wrapper.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_packet_writer_wrapper.h" +#include + #include "quiche/quic/core/quic_types.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_packets.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_packets.cc index cbfddce9d2..26c59f0109 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_packets.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_packets.cc @@ -6,6 +6,8 @@ #include #include +#include +#include #include #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_packets_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_packets_test.cc index b30f4308e3..4b64be2c61 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_packets_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_packets_test.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/quic_packets.h" #include +#include #include "absl/memory/memory.h" #include "quiche/quic/core/quic_time.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_path_validator.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_path_validator.cc index 3185664403..c31366f714 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_path_validator.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_path_validator.cc @@ -4,6 +4,10 @@ #include "quiche/quic/core/quic_path_validator.h" +#include +#include +#include + #include "quiche/quic/core/quic_constants.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/platform/api/quic_socket_address.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc index 46bc4a712d..e0c7e20ca0 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_ping_manager.h" +#include + #include "quiche/quic/platform/api/quic_flags.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_ping_manager_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_ping_manager_test.cc index cc193b4fc3..fa65054693 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_ping_manager_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_ping_manager_test.cc @@ -7,6 +7,7 @@ #include "quiche/quic/core/quic_connection_alarms.h" #include "quiche/quic/core/quic_one_block_arena.h" #include "quiche/quic/platform/api/quic_test.h" +#include "quiche/quic/test_tools/mock_quic_connection_alarms.h" #include "quiche/quic/test_tools/quic_test_utils.h" namespace quic { @@ -38,16 +39,19 @@ class MockDelegate : public QuicPingManager::Delegate { class QuicPingManagerTest : public QuicTest { public: QuicPingManagerTest() - : alarms_(nullptr, nullptr, nullptr, nullptr, &manager_, alarm_factory_, - arena_), + : alarms_(&connection_alarms_delegate_, alarm_factory_, arena_), manager_(Perspective::IS_CLIENT, &delegate_, &alarms_.ping_alarm()), alarm_(static_cast( QuicPingManagerPeer::GetAlarm(&manager_))) { clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); + ON_CALL(connection_alarms_delegate_, OnPingAlarm()).WillByDefault([&] { + manager_.OnAlarm(); + }); } protected: testing::StrictMock delegate_; + MockConnectionAlarmsDelegate connection_alarms_delegate_; MockClock clock_; QuicConnectionArena arena_; MockAlarmFactory alarm_factory_; diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc index 5b8e3fa046..d4001173da 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc @@ -6,7 +6,11 @@ #include #include +#include +#include #include +#include +#include #include "quiche/quic/core/congestion_control/general_loss_algorithm.h" #include "quiche/quic/core/congestion_control/pacing_sender.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h b/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h index e2a707dcef..25dca88775 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h @@ -85,9 +85,6 @@ class QUICHE_EXPORT QuicSentPacketManager { QuicByteCount /*old_cwnd*/, QuicByteCount /*new_cwnd*/) {} - virtual void OnAdjustBurstSize(int /*old_burst_size*/, - int /*new_burst_size*/) {} - virtual void OnOvershootingDetected() {} virtual void OnConfigProcessed(const SendParameters& /*parameters*/) {} diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager_test.cc index cec69021cc..5e8c62b219 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager_test.cc @@ -4,8 +4,11 @@ #include "quiche/quic/core/quic_sent_packet_manager.h" +#include #include +#include #include +#include #include "absl/base/macros.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_session.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_session.cc index d6cdc73fd8..d8aa677571 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_session.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_session.cc @@ -4,9 +4,16 @@ #include "quiche/quic/core/quic_session.h" +#include #include +#include +#include +#include +#include +#include #include #include +#include #include "absl/memory/memory.h" #include "absl/strings/str_cat.h" @@ -22,6 +29,7 @@ #include "quiche/quic/core/quic_utils.h" #include "quiche/quic/core/quic_versions.h" #include "quiche/quic/core/quic_write_blocked_list.h" +#include "quiche/quic/core/web_transport_write_blocked_list.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" #include "quiche/quic/platform/api/quic_flag_utils.h" #include "quiche/quic/platform/api/quic_flags.h" @@ -76,6 +84,18 @@ class StreamCountResetAlarmDelegate : public QuicAlarm::Delegate { QuicSession* session_; }; +std::unique_ptr CreateWriteBlockedList( + QuicPriorityType priority_type) { + switch (priority_type) { + case QuicPriorityType::kHttp: + return std::make_unique(); + case QuicPriorityType::kWebTransport: + return std::make_unique(); + } + QUICHE_NOTREACHED(); + return nullptr; +} + } // namespace #define ENDPOINT \ @@ -92,11 +112,12 @@ QuicSession::QuicSession( QuicConnection* connection, Visitor* owner, const QuicConfig& config, const ParsedQuicVersionVector& supported_versions, QuicStreamCount num_expected_unidirectional_static_streams, - std::unique_ptr datagram_observer) + std::unique_ptr datagram_observer, + QuicPriorityType priority_type) : connection_(connection), perspective_(connection->perspective()), visitor_(owner), - write_blocked_streams_(std::make_unique()), + write_blocked_streams_(CreateWriteBlockedList(priority_type)), config_(config), stream_id_manager_(perspective(), connection->transport_version(), kDefaultMaxStreamsPerConnection, @@ -132,7 +153,8 @@ QuicSession::QuicSession( liveness_testing_in_progress_(false), stream_count_reset_alarm_( absl::WrapUnique(connection->alarm_factory()->CreateAlarm( - new StreamCountResetAlarmDelegate(this)))) { + new StreamCountResetAlarmDelegate(this)))), + priority_type_(priority_type) { closed_streams_clean_up_alarm_ = absl::WrapUnique(connection_->alarm_factory()->CreateAlarm( new ClosedStreamsCleanUpDelegate(this))); diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_session.h b/yass/third_party/quiche/src/quiche/quic/core/quic_session.h index 3ac68bd2b3..ba2013e296 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_session.h +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_session.h @@ -120,7 +120,8 @@ class QUICHE_EXPORT QuicSession const QuicConfig& config, const ParsedQuicVersionVector& supported_versions, QuicStreamCount num_expected_unidirectional_static_streams, - std::unique_ptr datagram_observer); + std::unique_ptr datagram_observer, + QuicPriorityType priority_type = QuicPriorityType::kHttp); QuicSession(const QuicSession&) = delete; QuicSession& operator=(const QuicSession&) = delete; @@ -687,7 +688,7 @@ class QUICHE_EXPORT QuicSession void OnStreamCountReset(); // Returns the priority type used by the streams in the session. - QuicPriorityType priority_type() const { return QuicPriorityType::kHttp; } + QuicPriorityType priority_type() const { return priority_type_; } protected: using StreamMap = @@ -985,7 +986,7 @@ class QUICHE_EXPORT QuicSession // A list of streams which need to write more data. Stream register // themselves in their constructor, and unregisterm themselves in their // destructors, so the write blocked list must outlive all streams. - std::unique_ptr write_blocked_streams_; + std::unique_ptr write_blocked_streams_; ClosedStreams closed_streams_; @@ -1091,6 +1092,8 @@ class QUICHE_EXPORT QuicSession // event loop. QuicStreamCount max_streams_accepted_per_loop_ = kMaxQuicStreamCount; std::unique_ptr stream_count_reset_alarm_; + + QuicPriorityType priority_type_; }; } // namespace quic diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_session_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_session_test.cc index dc87ae5a80..778b3e227c 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_session_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_session_test.cc @@ -5,10 +5,12 @@ #include "quiche/quic/core/quic_session.h" #include +#include #include #include #include #include +#include #include "absl/base/macros.h" #include "absl/memory/memory.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_stream.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_stream.cc index 4de14d7ddd..4fdb87a241 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_stream.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_stream.cc @@ -4,9 +4,11 @@ #include "quiche/quic/core/quic_stream.h" +#include #include #include #include +#include #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" @@ -343,7 +345,6 @@ QuicStream::QuicStream(QuicStreamId id, QuicSession* session, id_(id), session_(session), stream_delegate_(session), - priority_(QuicStreamPriority::Default(session->priority_type())), stream_bytes_read_(stream_bytes_read), stream_error_(QuicResetStreamError::NoError()), connection_error_(QUIC_NO_ERROR), diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_id_manager.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_id_manager.cc index abfff030f3..0129beaec4 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_id_manager.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_id_manager.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "quiche/quic/core/quic_stream_id_manager.h" +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_id_manager_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_id_manager_test.cc index f57a89f531..1f91d4d8c6 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_id_manager_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_id_manager_test.cc @@ -6,6 +6,7 @@ #include #include #include +#include #include "absl/strings/str_cat.h" #include "quiche/quic/core/quic_constants.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority.cc index e13c0ab34d..726cc1710e 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority.cc @@ -4,6 +4,10 @@ #include "quiche/quic/core/quic_stream_priority.h" +#include +#include +#include + #include "quiche/common/platform/api/quiche_bug_tracker.h" #include "quiche/common/structured_headers.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority.h b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority.h index 8b1df3c2e5..b1b35df32c 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority.h +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority.h @@ -15,6 +15,7 @@ #include "quiche/quic/core/quic_types.h" #include "quiche/common/platform/api/quiche_bug_tracker.h" #include "quiche/common/platform/api/quiche_export.h" +#include "quiche/web_transport/web_transport.h" namespace quic { @@ -42,27 +43,22 @@ struct QUICHE_EXPORT HttpStreamPriority { } }; -// Represents WebTransport priorities as defined by +// Represents the priorities of WebTransport nested data streams as defined in // . struct QUICHE_EXPORT WebTransportStreamPriority { - enum class StreamType : uint8_t { - // WebTransport data streams. - kData = 0, - // Regular HTTP traffic. Since we're currently only supporting dedicated - // HTTP/3 transport, this means that all HTTP traffic is control traffic, - // and thus should always go first. - kHttp = 1, - // Streams that the QUIC stack declares as static. - kStatic = 2, - }; - - // Allows prioritizing control streams over the data streams. - StreamType stream_type = StreamType::kData; + // The stream ID of the control stream for the WebTransport session to which + // this data stream belongs. + QuicStreamId session_id = 0; + // Number of the send group with which the stream is associated; see + // https://w3c.github.io/webtransport/#dom-webtransportsendstreamoptions-sendgroup + uint64_t send_group_number = 0; // https://w3c.github.io/webtransport/#dom-webtransportsendstreamoptions-sendorder - int64_t send_order = 0; + webtransport::SendOrder send_order = 0; bool operator==(const WebTransportStreamPriority& other) const { - return stream_type == other.stream_type && send_order == other.send_order; + return session_id == other.session_id && + send_group_number == other.send_group_number && + send_order == other.send_order; } bool operator!=(const WebTransportStreamPriority& other) const { return !(*this == other); @@ -73,24 +69,11 @@ struct QUICHE_EXPORT WebTransportStreamPriority { // scheduling QUIC streams. class QUICHE_EXPORT QuicStreamPriority { public: + QuicStreamPriority() : value_(HttpStreamPriority()) {} explicit QuicStreamPriority(HttpStreamPriority priority) : value_(priority) {} explicit QuicStreamPriority(WebTransportStreamPriority priority) : value_(priority) {} - static QuicStreamPriority Default(QuicPriorityType type) { - switch (type) { - case QuicPriorityType::kHttp: - return QuicStreamPriority(HttpStreamPriority()); - case QuicPriorityType::kWebTransport: - return QuicStreamPriority(WebTransportStreamPriority()); - } - - QUICHE_BUG(unhandled_quic_priority_type_518918225) - << "Tried to create QuicStreamPriority for unknown QuicPriorityType " - << type; - return QuicStreamPriority(HttpStreamPriority()); - } - QuicPriorityType type() const { return absl::visit(TypeExtractor(), value_); } HttpStreamPriority http() const { diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority_test.cc index 53f33123e1..342cd4583f 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_priority_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_stream_priority.h" +#include + #include "quiche/quic/core/quic_types.h" #include "quiche/common/platform/api/quiche_test.h" @@ -34,36 +36,27 @@ TEST(HttpStreamPriority, Equals) { TEST(WebTransportStreamPriority, DefaultConstructed) { WebTransportStreamPriority priority; - EXPECT_EQ(priority.stream_type, - WebTransportStreamPriority::StreamType::kData); + EXPECT_EQ(priority.session_id, 0); + EXPECT_EQ(priority.send_group_number, 0); EXPECT_EQ(priority.send_order, 0); } TEST(WebTransportStreamPriority, Equals) { EXPECT_EQ(WebTransportStreamPriority(), - (WebTransportStreamPriority{ - WebTransportStreamPriority::StreamType::kData, 0})); + (WebTransportStreamPriority{0, 0, 0})); EXPECT_NE(WebTransportStreamPriority(), - (WebTransportStreamPriority{ - WebTransportStreamPriority::StreamType::kData, 1})); + (WebTransportStreamPriority{1, 2, 3})); EXPECT_NE(WebTransportStreamPriority(), - (WebTransportStreamPriority{ - WebTransportStreamPriority::StreamType::kHttp, 0})); + (WebTransportStreamPriority{0, 0, 1})); } TEST(QuicStreamPriority, Default) { - EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kHttp).http(), - HttpStreamPriority()); - EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kWebTransport) - .web_transport(), - WebTransportStreamPriority()); + EXPECT_EQ(QuicStreamPriority().type(), QuicPriorityType::kHttp); + EXPECT_EQ(QuicStreamPriority().http(), HttpStreamPriority()); } TEST(QuicStreamPriority, Equals) { - EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kHttp), - QuicStreamPriority(HttpStreamPriority())); - EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kWebTransport), - QuicStreamPriority(WebTransportStreamPriority())); + EXPECT_EQ(QuicStreamPriority(), QuicStreamPriority(HttpStreamPriority())); } TEST(QuicStreamPriority, Type) { diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.cc index a8657b56a3..003a0403cd 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/quic_stream_send_buffer.h" #include +#include #include "quiche/quic/core/quic_data_writer.h" #include "quiche/quic/core/quic_interval.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_test.cc index f4d6b50b94..fbcd90aae7 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_test.cc @@ -5,6 +5,8 @@ #include "quiche/quic/core/quic_stream_send_buffer.h" #include +#include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_data_writer.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer_buffer.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer_buffer.cc index d364d61bcf..496055f9ac 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer_buffer.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer_buffer.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer_buffer_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer_buffer_test.cc index d1cdf341c1..789b9926c4 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer_buffer_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer_buffer_test.cc @@ -7,7 +7,9 @@ #include #include #include +#include #include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_test.cc index e1e607da56..a9cb1d5ea5 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_stream_test.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include "absl/base/macros.h" #include "absl/memory/memory.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_tag.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_tag.cc index e921dc4891..73d13d8a38 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_tag.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_tag.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/base/macros.h" #include "absl/strings/ascii.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_time_wait_list_manager.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_time_wait_list_manager.cc index 484d35efa0..5b31654b7e 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_time_wait_list_manager.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_time_wait_list_manager.cc @@ -7,7 +7,9 @@ #include #include +#include #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/crypto/crypto_protocol.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_time_wait_list_manager_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_time_wait_list_manager_test.cc index 9b2f36f0e5..48ef54592f 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_time_wait_list_manager_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_time_wait_list_manager_test.cc @@ -7,7 +7,9 @@ #include #include #include +#include #include +#include #include "quiche/quic/core/crypto/crypto_protocol.h" #include "quiche/quic/core/crypto/null_encrypter.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_trace_visitor_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_trace_visitor_test.cc index 5584ebe65e..9080f85760 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_trace_visitor_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_trace_visitor_test.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/quic_trace_visitor.h" +#include +#include + #include "quiche/quic/core/quic_constants.h" #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/test_tools/quic_test_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_transmission_info.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_transmission_info.cc index 6263216e23..29b571326f 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_transmission_info.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_transmission_info.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_transmission_info.h" +#include + #include "absl/strings/str_cat.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_types.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_types.cc index c190a786c3..e1507ad9d9 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_types.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_types.cc @@ -5,6 +5,9 @@ #include "quiche/quic/core/quic_types.h" #include +#include +#include +#include #include "absl/strings/str_cat.h" #include "quiche/quic/core/quic_error_codes.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_udp_socket.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_udp_socket.cc index 448467823f..221733760d 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_udp_socket.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_udp_socket.cc @@ -9,6 +9,8 @@ #include "quiche/quic/core/quic_udp_socket.h" +#include + #include "absl/base/optimization.h" #include "quiche/quic/core/io/socket.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map.cc index adebba4409..52f5b59e25 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map.cc @@ -7,6 +7,7 @@ #include #include #include +#include #include "absl/container/inlined_vector.h" #include "quiche/quic/core/quic_connection_stats.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map_test.cc index a8510db81b..0a3d8b8d39 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map_test.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/base/macros.h" #include "quiche/quic/core/frames/quic_stream_frame.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_utils_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_utils_test.cc index 7da2ea0755..e29f769c40 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_utils_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_utils_test.cc @@ -5,6 +5,7 @@ #include "quiche/quic/core/quic_utils.h" #include +#include #include "absl/base/macros.h" #include "absl/numeric/int128.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_version_manager.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_version_manager.cc index 9283c8720e..2b7f392113 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_version_manager.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_version_manager.cc @@ -5,6 +5,9 @@ #include "quiche/quic/core/quic_version_manager.h" #include +#include +#include +#include #include "absl/base/macros.h" #include "quiche/quic/core/quic_versions.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_versions.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_versions.cc index 23a4dcb62f..f40cc334a2 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_versions.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_versions.cc @@ -4,7 +4,10 @@ #include "quiche/quic/core/quic_versions.h" +#include +#include #include +#include #include "absl/base/macros.h" #include "absl/strings/numbers.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list.cc index 475bdc12d0..649c9fff00 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/quic_write_blocked_list.h" +#include + #include "quiche/quic/platform/api/quic_flag_utils.h" #include "quiche/quic/platform/api/quic_flags.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list.h b/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list.h index 3c3645f452..1a72c82c43 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list.h +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list.h @@ -13,6 +13,7 @@ #include "quiche/http2/core/priority_write_scheduler.h" #include "quiche/quic/core/quic_packets.h" #include "quiche/quic/core/quic_stream_priority.h" +#include "quiche/quic/core/quic_types.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" #include "quiche/quic/platform/api/quic_export.h" #include "quiche/quic/platform/api/quic_flags.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list_test.cc b/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list_test.cc index cd60e07916..2f63269334 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list_test.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/quic_write_blocked_list.h" +#include +#include + #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/test_tools/quic_test_utils.h" #include "quiche/common/platform/api/quiche_expect_bug.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.cc b/yass/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.cc index 34e5b51335..1ba0a20962 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.cc @@ -7,6 +7,9 @@ #include #include #include +#include +#include +#include #include #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor_test.cc b/yass/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor_test.cc index 4874689edb..238d7b40b4 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor_test.cc @@ -5,6 +5,10 @@ #include "quiche/quic/core/tls_chlo_extractor.h" #include +#include +#include +#include +#include #include "openssl/ssl.h" #include "quiche/quic/core/http/quic_spdy_client_session.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc b/yass/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc index 6fff29d76c..76cf4f28ae 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc @@ -4,8 +4,13 @@ #include "quiche/quic/core/tls_client_handshaker.h" +#include #include +#include +#include #include +#include +#include #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/tls_client_handshaker_test.cc b/yass/third_party/quiche/src/quiche/quic/core/tls_client_handshaker_test.cc index c6b0e77d2c..fa7a3c841d 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/tls_client_handshaker_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/tls_client_handshaker_test.cc @@ -2,9 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include #include +#include #include #include +#include #include "absl/base/macros.h" #include "openssl/hpke.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/tls_handshaker.cc b/yass/third_party/quiche/src/quiche/quic/core/tls_handshaker.cc index da4d063045..ff9bfe53e7 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/tls_handshaker.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/tls_handshaker.cc @@ -4,6 +4,11 @@ #include "quiche/quic/core/tls_handshaker.h" +#include +#include +#include +#include + #include "absl/base/macros.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/tls_server_handshaker_test.cc b/yass/third_party/quiche/src/quiche/quic/core/tls_server_handshaker_test.cc index 1d181c71f1..b76ea32c24 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/tls_server_handshaker_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/tls_server_handshaker_test.cc @@ -4,7 +4,9 @@ #include "quiche/quic/core/tls_server_handshaker.h" +#include #include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/core/uber_quic_stream_id_manager.cc b/yass/third_party/quiche/src/quiche/quic/core/uber_quic_stream_id_manager.cc index 4779b8fd36..356ac448b2 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/uber_quic_stream_id_manager.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/uber_quic_stream_id_manager.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/uber_quic_stream_id_manager.h" +#include + #include "quiche/quic/core/quic_session.h" #include "quiche/quic/core/quic_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/uber_quic_stream_id_manager_test.cc b/yass/third_party/quiche/src/quiche/quic/core/uber_quic_stream_id_manager_test.cc index 7297fc2d6a..de0fe155fc 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/uber_quic_stream_id_manager_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/uber_quic_stream_id_manager_test.cc @@ -4,6 +4,9 @@ #include "quiche/quic/core/uber_quic_stream_id_manager.h" +#include +#include + #include "quiche/quic/core/quic_utils.h" #include "quiche/quic/core/quic_versions.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/uber_received_packet_manager.cc b/yass/third_party/quiche/src/quiche/quic/core/uber_received_packet_manager.cc index ccfbc28da7..b82ab9cf10 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/uber_received_packet_manager.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/uber_received_packet_manager.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/uber_received_packet_manager.h" +#include + #include "quiche/quic/core/quic_types.h" #include "quiche/quic/core/quic_utils.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/uber_received_packet_manager_test.cc b/yass/third_party/quiche/src/quiche/quic/core/uber_received_packet_manager_test.cc index 1a85e8cad1..083d312831 100644 --- a/yass/third_party/quiche/src/quiche/quic/core/uber_received_packet_manager_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/core/uber_received_packet_manager_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/core/uber_received_packet_manager.h" +#include +#include #include #include "quiche/quic/core/congestion_control/rtt_stats.h" diff --git a/yass/third_party/quiche/src/quiche/quic/core/web_transport_write_blocked_list.cc b/yass/third_party/quiche/src/quiche/quic/core/web_transport_write_blocked_list.cc new file mode 100644 index 0000000000..9aaef0bf8c --- /dev/null +++ b/yass/third_party/quiche/src/quiche/quic/core/web_transport_write_blocked_list.cc @@ -0,0 +1,297 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/quic/core/web_transport_write_blocked_list.h" + +#include +#include +#include + +#include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "absl/strings/str_format.h" +#include "quiche/quic/core/quic_stream_priority.h" +#include "quiche/quic/core/quic_types.h" +#include "quiche/common/platform/api/quiche_bug_tracker.h" +#include "quiche/common/platform/api/quiche_logging.h" + +namespace quic { + +bool WebTransportWriteBlockedList::HasWriteBlockedDataStreams() const { + return main_schedule_.NumScheduledInPriorityRange( + std::nullopt, RemapUrgency(HttpStreamPriority::kMaximumUrgency, + /*is_http=*/true)) > 0; +} + +size_t WebTransportWriteBlockedList::NumBlockedSpecialStreams() const { + return main_schedule_.NumScheduledInPriorityRange( + RemapUrgency(kStaticUrgency, /*is_http=*/false), std::nullopt); +} + +size_t WebTransportWriteBlockedList::NumBlockedStreams() const { + size_t num_streams = main_schedule_.NumScheduled(); + for (const auto& [key, scheduler] : web_transport_session_schedulers_) { + if (scheduler.HasScheduled()) { + num_streams += scheduler.NumScheduled(); + // Account for the fact that the group itself has an entry in the main + // scheduler that does not correspond to any actual stream. + QUICHE_DCHECK(main_schedule_.IsScheduled(key)); + --num_streams; + } + } + return num_streams; +} + +void WebTransportWriteBlockedList::RegisterStream( + QuicStreamId stream_id, bool is_static_stream, + const QuicStreamPriority& raw_priority) { + QuicStreamPriority priority = + is_static_stream + ? QuicStreamPriority(HttpStreamPriority{kStaticUrgency, true}) + : raw_priority; + auto [unused, success] = priorities_.emplace(stream_id, priority); + if (!success) { + QUICHE_BUG(WTWriteBlocked_RegisterStream_already_registered) + << "Tried to register stream " << stream_id + << " that is already registered"; + return; + } + + if (priority.type() == QuicPriorityType::kHttp) { + absl::Status status = main_schedule_.Register( + ScheduleKey::HttpStream(stream_id), + RemapUrgency(priority.http().urgency, /*is_http=*/true)); + QUICHE_BUG_IF(WTWriteBlocked_RegisterStream_http_scheduler, !status.ok()) + << status; + return; + } + + QUICHE_DCHECK_EQ(priority.type(), QuicPriorityType::kWebTransport); + ScheduleKey group_key = ScheduleKey::WebTransportSession(priority); + auto [it, created_new] = + web_transport_session_schedulers_.try_emplace(group_key); + absl::Status status = + it->second.Register(stream_id, priority.web_transport().send_order); + QUICHE_BUG_IF(WTWriteBlocked_RegisterStream_data_scheduler, !status.ok()) + << status; + + // If the group is new, register it with the main scheduler. + if (created_new) { + // The IETF draft requires the priority of data streams associated with an + // individual session to be equivalent to the priority of the control + // stream. + auto session_priority_it = + priorities_.find(priority.web_transport().session_id); + // It is possible for a stream to be (re-)registered while the control + // stream is already gone. + QUICHE_DLOG_IF(WARNING, session_priority_it == priorities_.end()) + << "Stream " << stream_id << " is associated with session ID " + << priority.web_transport().session_id + << ", but the session control stream is not registered; assuming " + "default urgency."; + QuicStreamPriority session_priority = + session_priority_it != priorities_.end() ? session_priority_it->second + : QuicStreamPriority(); + + status = main_schedule_.Register( + group_key, + RemapUrgency(session_priority.http().urgency, /*is_http=*/false)); + QUICHE_BUG_IF(WTWriteBlocked_RegisterStream_main_scheduler, !status.ok()) + << status; + } +} + +void WebTransportWriteBlockedList::UnregisterStream(QuicStreamId stream_id) { + auto map_it = priorities_.find(stream_id); + if (map_it == priorities_.end()) { + QUICHE_BUG(WTWriteBlocked_UnregisterStream_not_found) + << "Stream " << stream_id << " not found"; + return; + } + QuicStreamPriority priority = map_it->second; + priorities_.erase(map_it); + + if (priority.type() != QuicPriorityType::kWebTransport) { + absl::Status status = + main_schedule_.Unregister(ScheduleKey::HttpStream(stream_id)); + QUICHE_BUG_IF(WTWriteBlocked_UnregisterStream_http, !status.ok()) << status; + return; + } + + ScheduleKey key = ScheduleKey::WebTransportSession(priority); + auto subscheduler_it = web_transport_session_schedulers_.find(key); + if (subscheduler_it == web_transport_session_schedulers_.end()) { + QUICHE_BUG(WTWriteBlocked_UnregisterStream_no_subscheduler) + << "Stream " << stream_id + << " is a WebTransport data stream, but has no scheduler for the " + "associated group"; + return; + } + Subscheduler& subscheduler = subscheduler_it->second; + absl::Status status = subscheduler.Unregister(stream_id); + QUICHE_BUG_IF(WTWriteBlocked_UnregisterStream_subscheduler_stream_failed, + !status.ok()) + << status; + + // If this is the last stream associated with the group, remove the group. + if (!subscheduler.HasRegistered()) { + status = main_schedule_.Unregister(key); + QUICHE_BUG_IF(WTWriteBlocked_UnregisterStream_subscheduler_failed, + !status.ok()) + << status; + + web_transport_session_schedulers_.erase(subscheduler_it); + } +} + +void WebTransportWriteBlockedList::UpdateStreamPriority( + QuicStreamId stream_id, const QuicStreamPriority& new_priority) { + UnregisterStream(stream_id); + RegisterStream(stream_id, /*is_static_stream=*/false, new_priority); + + if (new_priority.type() == QuicPriorityType::kHttp) { + for (auto& [key, subscheduler] : web_transport_session_schedulers_) { + QUICHE_DCHECK(key.has_group()); + if (key.stream() == stream_id) { + absl::Status status = + main_schedule_.UpdatePriority(key, new_priority.http().urgency); + QUICHE_BUG_IF(WTWriteBlocked_UpdateStreamPriority_subscheduler_failed, + !status.ok()) + << status; + } + } + } +} + +QuicStreamId WebTransportWriteBlockedList::PopFront() { + absl::StatusOr main_key = main_schedule_.PopFront(); + if (!main_key.ok()) { + QUICHE_BUG(WTWriteBlocked_PopFront_no_streams) + << "PopFront() called when no streams scheduled: " << main_key.status(); + return 0; + } + if (!main_key->has_group()) { + return main_key->stream(); + } + + auto it = web_transport_session_schedulers_.find(*main_key); + if (it == web_transport_session_schedulers_.end()) { + QUICHE_BUG(WTWriteBlocked_PopFront_no_subscheduler) + << "Subscheduler for WebTransport group " << main_key->DebugString() + << " not found"; + return 0; + } + Subscheduler& subscheduler = it->second; + absl::StatusOr result = subscheduler.PopFront(); + if (!result.ok()) { + QUICHE_BUG(WTWriteBlocked_PopFront_subscheduler_empty) + << "Subscheduler for group " << main_key->DebugString() + << " is empty while in the main schedule"; + return 0; + } + if (subscheduler.HasScheduled()) { + absl::Status status = main_schedule_.Schedule(*main_key); + QUICHE_BUG_IF(WTWriteBlocked_PopFront_reschedule_group, !status.ok()) + << status; + } + return *result; +} + +void WebTransportWriteBlockedList::AddStream(QuicStreamId stream_id) { + QuicStreamPriority priority = GetPriorityOfStream(stream_id); + absl::Status status; + switch (priority.type()) { + case QuicPriorityType::kHttp: + status = main_schedule_.Schedule(ScheduleKey::HttpStream(stream_id)); + QUICHE_BUG_IF(WTWriteBlocked_AddStream_http, !status.ok()) << status; + break; + case QuicPriorityType::kWebTransport: + status = + main_schedule_.Schedule(ScheduleKey::WebTransportSession(priority)); + QUICHE_BUG_IF(WTWriteBlocked_AddStream_wt_main, !status.ok()) << status; + + auto it = web_transport_session_schedulers_.find( + ScheduleKey::WebTransportSession(priority)); + if (it == web_transport_session_schedulers_.end()) { + QUICHE_BUG(WTWriteBlocked_AddStream_no_subscheduler) + << ScheduleKey::WebTransportSession(priority); + return; + } + Subscheduler& subscheduler = it->second; + status = subscheduler.Schedule(stream_id); + QUICHE_BUG_IF(WTWriteBlocked_AddStream_wt_sub, !status.ok()) << status; + break; + } +} + +bool WebTransportWriteBlockedList::IsStreamBlocked( + QuicStreamId stream_id) const { + QuicStreamPriority priority = GetPriorityOfStream(stream_id); + switch (priority.type()) { + case QuicPriorityType::kHttp: + return main_schedule_.IsScheduled(ScheduleKey::HttpStream(stream_id)); + case QuicPriorityType::kWebTransport: + auto it = web_transport_session_schedulers_.find( + ScheduleKey::WebTransportSession(priority)); + if (it == web_transport_session_schedulers_.end()) { + QUICHE_BUG(WTWriteBlocked_IsStreamBlocked_no_subscheduler) + << ScheduleKey::WebTransportSession(priority); + return false; + } + const Subscheduler& subscheduler = it->second; + return subscheduler.IsScheduled(stream_id); + } + QUICHE_NOTREACHED(); + return false; +} + +QuicStreamPriority WebTransportWriteBlockedList::GetPriorityOfStream( + QuicStreamId id) const { + auto it = priorities_.find(id); + if (it == priorities_.end()) { + QUICHE_BUG(WTWriteBlocked_GetPriorityOfStream_not_found) + << "Stream " << id << " not found"; + return QuicStreamPriority(); + } + return it->second; +} + +std::string WebTransportWriteBlockedList::ScheduleKey::DebugString() const { + return absl::StrFormat("(%d, %d)", stream_, group_); +} + +bool WebTransportWriteBlockedList::ShouldYield(QuicStreamId id) const { + QuicStreamPriority priority = GetPriorityOfStream(id); + if (priority.type() == QuicPriorityType::kHttp) { + absl::StatusOr should_yield = + main_schedule_.ShouldYield(ScheduleKey::HttpStream(id)); + QUICHE_BUG_IF(WTWriteBlocked_ShouldYield_http, !should_yield.ok()) + << should_yield.status(); + return *should_yield; + } + QUICHE_DCHECK_EQ(priority.type(), QuicPriorityType::kWebTransport); + absl::StatusOr should_yield = + main_schedule_.ShouldYield(ScheduleKey::WebTransportSession(priority)); + QUICHE_BUG_IF(WTWriteBlocked_ShouldYield_wt_main, !should_yield.ok()) + << should_yield.status(); + if (*should_yield) { + return true; + } + + auto it = web_transport_session_schedulers_.find( + ScheduleKey::WebTransportSession(priority)); + if (it == web_transport_session_schedulers_.end()) { + QUICHE_BUG(WTWriteBlocked_ShouldYield_subscheduler_not_found) + << "Subscheduler not found for " + << ScheduleKey::WebTransportSession(priority); + return false; + } + const Subscheduler& subscheduler = it->second; + + should_yield = subscheduler.ShouldYield(id); + QUICHE_BUG_IF(WTWriteBlocked_ShouldYield_wt_subscheduler, !should_yield.ok()) + << should_yield.status(); + return *should_yield; +} +} // namespace quic diff --git a/yass/third_party/quiche/src/quiche/quic/core/web_transport_write_blocked_list.h b/yass/third_party/quiche/src/quiche/quic/core/web_transport_write_blocked_list.h new file mode 100644 index 0000000000..8cf294b891 --- /dev/null +++ b/yass/third_party/quiche/src/quiche/quic/core/web_transport_write_blocked_list.h @@ -0,0 +1,156 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_CORE_WEB_TRANSPORT_WRITE_BLOCKED_LIST_H_ +#define QUICHE_QUIC_CORE_WEB_TRANSPORT_WRITE_BLOCKED_LIST_H_ + +#include +#include +#include +#include + +#include "absl/container/flat_hash_map.h" +#include "quiche/quic/core/quic_stream_priority.h" +#include "quiche/quic/core/quic_types.h" +#include "quiche/quic/core/quic_write_blocked_list.h" +#include "quiche/common/btree_scheduler.h" +#include "quiche/common/platform/api/quiche_export.h" +#include "quiche/web_transport/web_transport.h" + +namespace quic { + +// Scheduler that is capable of handling both regular HTTP/3 priorities and +// WebTransport priorities for multiple sessions at the same time. +// +// Here is a brief overview of the scheme: +// - At the top, there are HTTP/3 streams that are ordered by urgency as +// defined in RFC 9218. +// - The HTTP/3 connection can be a host to multiple WebTransport sessions. +// Those are identified by the ID of the HTTP/3 control stream that created +// the session; they also inherit the priority from that stream. +// - The sessions consist of send groups that all have equal priority. +// - The send groups have individual WebTransport data streams; each data +// stream has a send order, which is a strict priority expressed as int64. +// +// To simplify the implementation of an already excessively complex scheme, this +// class makes a couple of affordances: +// - Instead of first scheduling an individual session, then scheduling a +// group within it, it schedules session-group pairs at the top level. This +// is technically allowed by the spec, but it does mean that sessions with +// more groups may get more bandwidth. +// - Incremental priorities are not currently supported. +class QUICHE_EXPORT WebTransportWriteBlockedList + : public QuicWriteBlockedListInterface { + public: + // Handle static streams by treating them as streams of priority MAX + 1. + static constexpr int kStaticUrgency = HttpStreamPriority::kMaximumUrgency + 1; + + // QuicWriteBlockedListInterface implementation. + bool HasWriteBlockedDataStreams() const override; + size_t NumBlockedSpecialStreams() const override; + size_t NumBlockedStreams() const override; + + void RegisterStream(QuicStreamId stream_id, bool is_static_stream, + const QuicStreamPriority& raw_priority) override; + void UnregisterStream(QuicStreamId stream_id) override; + void UpdateStreamPriority(QuicStreamId stream_id, + const QuicStreamPriority& new_priority) override; + + bool ShouldYield(QuicStreamId id) const override; + QuicStreamPriority GetPriorityOfStream(QuicStreamId id) const override; + QuicStreamId PopFront() override; + void UpdateBytesForStream(QuicStreamId /*stream_id*/, + size_t /*bytes*/) override {} + void AddStream(QuicStreamId stream_id) override; + bool IsStreamBlocked(QuicStreamId stream_id) const override; + + size_t NumRegisteredGroups() const { + return web_transport_session_schedulers_.size(); + } + size_t NumRegisteredHttpStreams() const { + return main_schedule_.NumRegistered() - NumRegisteredGroups(); + } + + private: + // ScheduleKey represents anything that can be put into the main scheduler, + // which is either: + // - an HTTP/3 stream, or + // - an individual WebTransport session-send group pair. + class QUICHE_EXPORT ScheduleKey { + public: + static ScheduleKey HttpStream(QuicStreamId id) { + return ScheduleKey(id, kNoSendGroup); + } + static ScheduleKey WebTransportSession(QuicStreamId session_id, + webtransport::SendGroupId group_id) { + return ScheduleKey(session_id, group_id); + } + static ScheduleKey WebTransportSession(const QuicStreamPriority& priority) { + return ScheduleKey(priority.web_transport().session_id, + priority.web_transport().send_group_number); + } + + bool operator==(const ScheduleKey& other) const { + return stream_ == other.stream_ && group_ == other.group_; + } + bool operator!=(const ScheduleKey& other) const { + return !(*this == other); + } + + template + friend H AbslHashValue(H h, const ScheduleKey& key) { + return H::combine(std::move(h), key.stream_, key.group_); + } + + bool has_group() const { return group_ != kNoSendGroup; } + quic::QuicStreamId stream() const { return stream_; } + + std::string DebugString() const; + + friend inline std::ostream& operator<<(std::ostream& os, + const ScheduleKey& key) { + os << key.DebugString(); + return os; + } + + private: + static constexpr webtransport::SendGroupId kNoSendGroup = + std::numeric_limits::max(); + + explicit ScheduleKey(quic::QuicStreamId stream, + webtransport::SendGroupId group) + : stream_(stream), group_(group) {} + + quic::QuicStreamId stream_; + webtransport::SendGroupId group_; + }; + + // WebTransport requires individual sessions to have the same urgency as their + // control streams; in a naive implementation, that would mean that both would + // get the same urgency N, but we also want for the control streams to have + // higher priority than WebTransport user data. In order to achieve that, we + // enter control streams at urgency 2 * N + 1, and data streams at urgency + // 2 * N. + static constexpr int RemapUrgency(int urgency, bool is_http) { + return urgency * 2 + (is_http ? 1 : 0); + } + + // Scheduler for individual WebTransport send groups. + using Subscheduler = + quiche::BTreeScheduler; + + // Top-level scheduler used to multiplex WebTransport sessions and individual + // HTTP/3 streams. + quiche::BTreeScheduler main_schedule_; + // Records of priority for every stream; used when looking up WebTransport + // session associated with an individual stream. + absl::flat_hash_map priorities_; + // Schedulers for individual WebTransport send groups. + absl::flat_hash_map + web_transport_session_schedulers_; +}; + +} // namespace quic + +#endif // QUICHE_QUIC_CORE_WEB_TRANSPORT_WRITE_BLOCKED_LIST_H_ diff --git a/yass/third_party/quiche/src/quiche/quic/core/web_transport_write_blocked_list_test.cc b/yass/third_party/quiche/src/quiche/quic/core/web_transport_write_blocked_list_test.cc new file mode 100644 index 0000000000..5791c0df2a --- /dev/null +++ b/yass/third_party/quiche/src/quiche/quic/core/web_transport_write_blocked_list_test.cc @@ -0,0 +1,512 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/quic/core/web_transport_write_blocked_list.h" + +#include +#include +#include +#include +#include + +#include "absl/algorithm/container.h" +#include "quiche/quic/core/quic_stream_priority.h" +#include "quiche/quic/core/quic_types.h" +#include "quiche/quic/test_tools/quic_test_utils.h" +#include "quiche/common/platform/api/quiche_expect_bug.h" +#include "quiche/common/platform/api/quiche_test.h" + +namespace quic::test { +namespace { + +using ::testing::ElementsAre; +using ::testing::ElementsAreArray; + +class WebTransportWriteBlockedListTest : public ::quiche::test::QuicheTest { + protected: + void RegisterStaticStream(QuicStreamId id) { + list_.RegisterStream(id, /*is_static_stream=*/true, QuicStreamPriority()); + } + void RegisterHttpStream(QuicStreamId id, + int urgency = HttpStreamPriority::kDefaultUrgency) { + HttpStreamPriority priority; + priority.urgency = urgency; + list_.RegisterStream(id, /*is_static_stream=*/false, + QuicStreamPriority(priority)); + } + void RegisterWebTransportDataStream(QuicStreamId id, + WebTransportStreamPriority priority) { + list_.RegisterStream(id, /*is_static_stream=*/false, + QuicStreamPriority(priority)); + } + + std::vector PopAll() { + std::vector result; + size_t expected_count = list_.NumBlockedStreams(); + while (list_.NumBlockedStreams() > 0) { + EXPECT_TRUE(list_.HasWriteBlockedDataStreams() || + list_.HasWriteBlockedSpecialStream()); + result.push_back(list_.PopFront()); + EXPECT_EQ(list_.NumBlockedStreams(), --expected_count); + } + return result; + } + + WebTransportWriteBlockedList list_; +}; + +TEST_F(WebTransportWriteBlockedListTest, BasicHttpStreams) { + RegisterHttpStream(1); + RegisterHttpStream(2); + RegisterHttpStream(3, HttpStreamPriority::kDefaultUrgency + 1); + RegisterStaticStream(4); + + EXPECT_EQ(list_.GetPriorityOfStream(1), QuicStreamPriority()); + EXPECT_EQ(list_.GetPriorityOfStream(2), QuicStreamPriority()); + EXPECT_EQ(list_.GetPriorityOfStream(3).http().urgency, 4); + + EXPECT_EQ(list_.NumBlockedStreams(), 0); + EXPECT_EQ(list_.NumBlockedSpecialStreams(), 0); + list_.AddStream(1); + list_.AddStream(2); + list_.AddStream(3); + list_.AddStream(4); + EXPECT_EQ(list_.NumBlockedStreams(), 4); + EXPECT_EQ(list_.NumBlockedSpecialStreams(), 1); + + EXPECT_THAT(PopAll(), ElementsAre(4, 3, 1, 2)); + EXPECT_EQ(list_.NumBlockedStreams(), 0); + EXPECT_EQ(list_.NumBlockedSpecialStreams(), 0); + + list_.AddStream(2); + list_.AddStream(3); + list_.AddStream(4); + list_.AddStream(1); + EXPECT_THAT(PopAll(), ElementsAre(4, 3, 2, 1)); +} + +TEST_F(WebTransportWriteBlockedListTest, RegisterDuplicateStream) { + RegisterHttpStream(1); + EXPECT_QUICHE_BUG(RegisterHttpStream(1), "already registered"); +} + +TEST_F(WebTransportWriteBlockedListTest, UnregisterMissingStream) { + EXPECT_QUICHE_BUG(list_.UnregisterStream(1), "not found"); +} + +TEST_F(WebTransportWriteBlockedListTest, GetPriorityMissingStream) { + EXPECT_QUICHE_BUG(list_.GetPriorityOfStream(1), "not found"); +} + +TEST_F(WebTransportWriteBlockedListTest, PopFrontMissing) { + RegisterHttpStream(1); + list_.AddStream(1); + EXPECT_EQ(list_.PopFront(), 1); + EXPECT_QUICHE_BUG(list_.PopFront(), "no streams scheduled"); +} + +TEST_F(WebTransportWriteBlockedListTest, HasWriteBlockedDataStreams) { + RegisterStaticStream(1); + RegisterHttpStream(2); + + EXPECT_FALSE(list_.HasWriteBlockedDataStreams()); + list_.AddStream(1); + EXPECT_FALSE(list_.HasWriteBlockedDataStreams()); + list_.AddStream(2); + EXPECT_TRUE(list_.HasWriteBlockedDataStreams()); + EXPECT_EQ(list_.PopFront(), 1); + EXPECT_TRUE(list_.HasWriteBlockedDataStreams()); + EXPECT_EQ(list_.PopFront(), 2); + EXPECT_FALSE(list_.HasWriteBlockedDataStreams()); +} + +TEST_F(WebTransportWriteBlockedListTest, NestedStreams) { + RegisterHttpStream(1); + RegisterHttpStream(2); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(4, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(5, WebTransportStreamPriority{2, 0, 0}); + RegisterWebTransportDataStream(6, WebTransportStreamPriority{2, 0, 0}); + EXPECT_EQ(list_.NumBlockedStreams(), 0); + + list_.AddStream(3); + list_.AddStream(5); + list_.AddStream(4); + list_.AddStream(6); + EXPECT_EQ(list_.NumBlockedStreams(), 4); + EXPECT_THAT(PopAll(), ElementsAre(3, 5, 4, 6)); + EXPECT_EQ(list_.NumBlockedStreams(), 0); + + list_.AddStream(3); + list_.AddStream(4); + list_.AddStream(5); + EXPECT_EQ(list_.NumBlockedStreams(), 3); + EXPECT_THAT(PopAll(), ElementsAre(3, 5, 4)); + EXPECT_EQ(list_.NumBlockedStreams(), 0); + + list_.AddStream(4); + list_.AddStream(5); + list_.AddStream(6); + EXPECT_EQ(list_.NumBlockedStreams(), 3); + EXPECT_THAT(PopAll(), ElementsAre(4, 5, 6)); + EXPECT_EQ(list_.NumBlockedStreams(), 0); + + list_.AddStream(6); + list_.AddStream(3); + list_.AddStream(4); + list_.AddStream(5); + EXPECT_EQ(list_.NumBlockedStreams(), 4); + EXPECT_THAT(PopAll(), ElementsAre(6, 3, 5, 4)); + EXPECT_EQ(list_.NumBlockedStreams(), 0); + + list_.AddStream(6); + list_.AddStream(5); + list_.AddStream(4); + list_.AddStream(3); + EXPECT_EQ(list_.NumBlockedStreams(), 4); + EXPECT_THAT(PopAll(), ElementsAre(6, 4, 5, 3)); + EXPECT_EQ(list_.NumBlockedStreams(), 0); +} + +TEST_F(WebTransportWriteBlockedListTest, NestedStreamsWithHigherPriorityGroup) { + RegisterHttpStream(1, HttpStreamPriority::kDefaultUrgency + 1); + RegisterHttpStream(2); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(4, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(5, WebTransportStreamPriority{2, 0, 0}); + RegisterWebTransportDataStream(6, WebTransportStreamPriority{2, 0, 0}); + EXPECT_EQ(list_.NumBlockedStreams(), 0); + + list_.AddStream(3); + list_.AddStream(5); + list_.AddStream(4); + list_.AddStream(6); + EXPECT_EQ(list_.NumBlockedStreams(), 4); + EXPECT_THAT(PopAll(), ElementsAre(3, 4, 5, 6)); + EXPECT_EQ(list_.NumBlockedStreams(), 0); + + list_.AddStream(3); + list_.AddStream(4); + list_.AddStream(5); + EXPECT_EQ(list_.NumBlockedStreams(), 3); + EXPECT_THAT(PopAll(), ElementsAre(3, 4, 5)); + EXPECT_EQ(list_.NumBlockedStreams(), 0); + + list_.AddStream(4); + list_.AddStream(5); + list_.AddStream(6); + EXPECT_EQ(list_.NumBlockedStreams(), 3); + EXPECT_THAT(PopAll(), ElementsAre(4, 5, 6)); + EXPECT_EQ(list_.NumBlockedStreams(), 0); + + list_.AddStream(6); + list_.AddStream(3); + list_.AddStream(4); + list_.AddStream(5); + EXPECT_EQ(list_.NumBlockedStreams(), 4); + EXPECT_THAT(PopAll(), ElementsAre(3, 4, 6, 5)); + EXPECT_EQ(list_.NumBlockedStreams(), 0); + + list_.AddStream(6); + list_.AddStream(5); + list_.AddStream(4); + list_.AddStream(3); + EXPECT_EQ(list_.NumBlockedStreams(), 4); + EXPECT_THAT(PopAll(), ElementsAre(4, 3, 6, 5)); + EXPECT_EQ(list_.NumBlockedStreams(), 0); +} + +TEST_F(WebTransportWriteBlockedListTest, NestedStreamVsControlStream) { + RegisterHttpStream(1); + RegisterWebTransportDataStream(2, WebTransportStreamPriority{1, 0, 0}); + + list_.AddStream(2); + list_.AddStream(1); + EXPECT_THAT(PopAll(), ElementsAre(1, 2)); + + list_.AddStream(1); + list_.AddStream(2); + EXPECT_THAT(PopAll(), ElementsAre(1, 2)); +} + +TEST_F(WebTransportWriteBlockedListTest, NestedStreamsSendOrder) { + RegisterHttpStream(1); + RegisterWebTransportDataStream(2, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{1, 0, 100}); + RegisterWebTransportDataStream(4, WebTransportStreamPriority{1, 0, -100}); + + list_.AddStream(4); + list_.AddStream(3); + list_.AddStream(2); + list_.AddStream(1); + EXPECT_THAT(PopAll(), ElementsAre(1, 3, 2, 4)); +} + +TEST_F(WebTransportWriteBlockedListTest, NestedStreamsDifferentGroups) { + RegisterHttpStream(1); + RegisterWebTransportDataStream(2, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{1, 1, 100}); + RegisterWebTransportDataStream(4, WebTransportStreamPriority{1, 7, -100}); + + list_.AddStream(4); + list_.AddStream(3); + list_.AddStream(2); + list_.AddStream(1); + EXPECT_THAT(PopAll(), ElementsAre(1, 4, 3, 2)); + + list_.AddStream(1); + list_.AddStream(2); + list_.AddStream(3); + list_.AddStream(4); + EXPECT_THAT(PopAll(), ElementsAre(1, 2, 3, 4)); +} + +TEST_F(WebTransportWriteBlockedListTest, NestedStreamsDifferentSession) { + RegisterWebTransportDataStream(1, WebTransportStreamPriority{10, 0, 0}); + RegisterWebTransportDataStream(2, WebTransportStreamPriority{11, 0, 100}); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{12, 0, -100}); + + list_.AddStream(3); + list_.AddStream(2); + list_.AddStream(1); + EXPECT_THAT(PopAll(), ElementsAre(3, 2, 1)); + + list_.AddStream(1); + list_.AddStream(2); + list_.AddStream(3); + EXPECT_THAT(PopAll(), ElementsAre(1, 2, 3)); +} + +TEST_F(WebTransportWriteBlockedListTest, UnregisterScheduledStreams) { + RegisterHttpStream(1); + RegisterHttpStream(2); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(4, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(5, WebTransportStreamPriority{2, 0, 0}); + RegisterWebTransportDataStream(6, WebTransportStreamPriority{2, 0, 0}); + + EXPECT_EQ(list_.NumBlockedStreams(), 0); + for (QuicStreamId id : {1, 2, 3, 4, 5, 6}) { + list_.AddStream(id); + } + EXPECT_EQ(list_.NumBlockedStreams(), 6); + + list_.UnregisterStream(1); + EXPECT_EQ(list_.NumBlockedStreams(), 5); + list_.UnregisterStream(3); + EXPECT_EQ(list_.NumBlockedStreams(), 4); + list_.UnregisterStream(4); + EXPECT_EQ(list_.NumBlockedStreams(), 3); + list_.UnregisterStream(5); + EXPECT_EQ(list_.NumBlockedStreams(), 2); + list_.UnregisterStream(6); + EXPECT_EQ(list_.NumBlockedStreams(), 1); + list_.UnregisterStream(2); + EXPECT_EQ(list_.NumBlockedStreams(), 0); +} + +TEST_F(WebTransportWriteBlockedListTest, UnregisterUnscheduledStreams) { + RegisterHttpStream(1); + RegisterHttpStream(2); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(4, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(5, WebTransportStreamPriority{2, 0, 0}); + RegisterWebTransportDataStream(6, WebTransportStreamPriority{2, 0, 0}); + + EXPECT_EQ(list_.NumRegisteredHttpStreams(), 2); + EXPECT_EQ(list_.NumRegisteredGroups(), 2); + list_.UnregisterStream(1); + EXPECT_EQ(list_.NumRegisteredHttpStreams(), 1); + EXPECT_EQ(list_.NumRegisteredGroups(), 2); + list_.UnregisterStream(3); + EXPECT_EQ(list_.NumRegisteredHttpStreams(), 1); + EXPECT_EQ(list_.NumRegisteredGroups(), 2); + list_.UnregisterStream(4); + EXPECT_EQ(list_.NumRegisteredHttpStreams(), 1); + EXPECT_EQ(list_.NumRegisteredGroups(), 1); + + list_.UnregisterStream(5); + EXPECT_EQ(list_.NumRegisteredHttpStreams(), 1); + EXPECT_EQ(list_.NumRegisteredGroups(), 1); + list_.UnregisterStream(6); + EXPECT_EQ(list_.NumRegisteredHttpStreams(), 1); + EXPECT_EQ(list_.NumRegisteredGroups(), 0); + list_.UnregisterStream(2); + EXPECT_EQ(list_.NumRegisteredHttpStreams(), 0); + EXPECT_EQ(list_.NumRegisteredGroups(), 0); + + RegisterHttpStream(1); + RegisterHttpStream(2); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(4, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(5, WebTransportStreamPriority{2, 0, 0}); + RegisterWebTransportDataStream(6, WebTransportStreamPriority{2, 0, 0}); +} + +TEST_F(WebTransportWriteBlockedListTest, IsStreamBlocked) { + RegisterHttpStream(1); + RegisterWebTransportDataStream(2, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{9, 0, 0}); + + EXPECT_FALSE(list_.IsStreamBlocked(1)); + EXPECT_FALSE(list_.IsStreamBlocked(2)); + EXPECT_FALSE(list_.IsStreamBlocked(3)); + + list_.AddStream(3); + EXPECT_FALSE(list_.IsStreamBlocked(1)); + EXPECT_FALSE(list_.IsStreamBlocked(2)); + EXPECT_TRUE(list_.IsStreamBlocked(3)); + + list_.AddStream(1); + EXPECT_TRUE(list_.IsStreamBlocked(1)); + EXPECT_FALSE(list_.IsStreamBlocked(2)); + EXPECT_TRUE(list_.IsStreamBlocked(3)); + + ASSERT_EQ(list_.PopFront(), 1); + EXPECT_FALSE(list_.IsStreamBlocked(1)); + EXPECT_FALSE(list_.IsStreamBlocked(2)); + EXPECT_TRUE(list_.IsStreamBlocked(3)); +} + +TEST_F(WebTransportWriteBlockedListTest, UpdatePriorityHttp) { + RegisterHttpStream(1); + RegisterHttpStream(2); + RegisterHttpStream(3); + + list_.AddStream(1); + list_.AddStream(2); + list_.AddStream(3); + EXPECT_THAT(PopAll(), ElementsAre(1, 2, 3)); + + list_.UpdateStreamPriority( + 2, QuicStreamPriority( + HttpStreamPriority{HttpStreamPriority::kMaximumUrgency, false})); + + list_.AddStream(1); + list_.AddStream(2); + list_.AddStream(3); + EXPECT_THAT(PopAll(), ElementsAre(2, 1, 3)); +} + +TEST_F(WebTransportWriteBlockedListTest, UpdatePriorityWebTransport) { + RegisterWebTransportDataStream(1, WebTransportStreamPriority{0, 0, 0}); + RegisterWebTransportDataStream(2, WebTransportStreamPriority{0, 0, 0}); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{0, 0, 0}); + + list_.AddStream(1); + list_.AddStream(2); + list_.AddStream(3); + EXPECT_THAT(PopAll(), ElementsAre(1, 2, 3)); + + list_.UpdateStreamPriority( + 2, QuicStreamPriority(WebTransportStreamPriority{0, 0, 1})); + + list_.AddStream(1); + list_.AddStream(2); + list_.AddStream(3); + EXPECT_THAT(PopAll(), ElementsAre(2, 1, 3)); +} + +TEST_F(WebTransportWriteBlockedListTest, UpdatePriorityControlStream) { + RegisterHttpStream(1); + RegisterHttpStream(2); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(4, WebTransportStreamPriority{2, 0, 0}); + + list_.AddStream(3); + list_.AddStream(4); + EXPECT_THAT(PopAll(), ElementsAre(3, 4)); + list_.AddStream(4); + list_.AddStream(3); + EXPECT_THAT(PopAll(), ElementsAre(4, 3)); + + list_.UpdateStreamPriority( + 2, QuicStreamPriority( + HttpStreamPriority{HttpStreamPriority::kMaximumUrgency, false})); + + list_.AddStream(3); + list_.AddStream(4); + EXPECT_THAT(PopAll(), ElementsAre(4, 3)); + list_.AddStream(4); + list_.AddStream(3); + EXPECT_THAT(PopAll(), ElementsAre(4, 3)); +} + +TEST_F(WebTransportWriteBlockedListTest, ShouldYield) { + RegisterHttpStream(1); + RegisterWebTransportDataStream(2, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(3, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(4, WebTransportStreamPriority{1, 0, 10}); + + EXPECT_FALSE(list_.ShouldYield(1)); + EXPECT_FALSE(list_.ShouldYield(2)); + EXPECT_FALSE(list_.ShouldYield(3)); + EXPECT_FALSE(list_.ShouldYield(4)); + + list_.AddStream(1); + EXPECT_FALSE(list_.ShouldYield(1)); + EXPECT_TRUE(list_.ShouldYield(2)); + EXPECT_TRUE(list_.ShouldYield(3)); + EXPECT_TRUE(list_.ShouldYield(4)); + PopAll(); + + list_.AddStream(2); + EXPECT_FALSE(list_.ShouldYield(1)); + EXPECT_FALSE(list_.ShouldYield(2)); + EXPECT_TRUE(list_.ShouldYield(3)); + EXPECT_FALSE(list_.ShouldYield(4)); + PopAll(); + + list_.AddStream(4); + EXPECT_FALSE(list_.ShouldYield(1)); + EXPECT_TRUE(list_.ShouldYield(2)); + EXPECT_TRUE(list_.ShouldYield(3)); + EXPECT_FALSE(list_.ShouldYield(4)); + PopAll(); +} + +TEST_F(WebTransportWriteBlockedListTest, RandomizedTest) { + RegisterHttpStream(1); + RegisterHttpStream(2, HttpStreamPriority::kMinimumUrgency); + RegisterHttpStream(3, HttpStreamPriority::kMaximumUrgency); + RegisterWebTransportDataStream(4, WebTransportStreamPriority{1, 0, 0}); + RegisterWebTransportDataStream(5, WebTransportStreamPriority{2, 0, +1}); + RegisterWebTransportDataStream(6, WebTransportStreamPriority{2, 0, -1}); + RegisterWebTransportDataStream(7, WebTransportStreamPriority{3, 8, 0}); + RegisterWebTransportDataStream(8, WebTransportStreamPriority{3, 8, 100}); + RegisterWebTransportDataStream(9, WebTransportStreamPriority{3, 8, 20000}); + RegisterHttpStream(10, HttpStreamPriority::kDefaultUrgency + 1); + // The priorities of the streams above are arranged so that the priorities of + // all streams above are strictly ordered (i.e. there are no streams that + // would be round-robined). + constexpr std::array order = {3, 9, 8, 7, 10, + 1, 4, 2, 5, 6}; + + SimpleRandom random; + for (int i = 0; i < 1000; ++i) { + // Shuffle the streams. + std::vector pushed_streams(order.begin(), order.end()); + for (int j = pushed_streams.size() - 1; j > 0; --j) { + std::swap(pushed_streams[j], + pushed_streams[random.RandUint64() % (j + 1)]); + } + + size_t stream_count = 1 + random.RandUint64() % order.size(); + pushed_streams.resize(stream_count); + + for (QuicStreamId id : pushed_streams) { + list_.AddStream(id); + } + + std::vector expected_streams; + absl::c_copy_if( + order, std::back_inserter(expected_streams), [&](QuicStreamId id) { + return absl::c_find(pushed_streams, id) != pushed_streams.end(); + }); + ASSERT_THAT(PopAll(), ElementsAreArray(expected_streams)); + } +} + +} // namespace +} // namespace quic::test diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/icmp_reachable.cc b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/icmp_reachable.cc index 4ac7109b67..da5e1035d9 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/icmp_reachable.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/icmp_reachable.cc @@ -6,6 +6,8 @@ #include +#include + #include "absl/strings/string_view.h" #include "quiche/quic/core/crypto/quic_random.h" #include "quiche/quic/core/io/quic_event_loop.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/icmp_reachable_test.cc b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/icmp_reachable_test.cc index ae48ddc9bb..8e43bd04de 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/icmp_reachable_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/icmp_reachable_test.cc @@ -7,6 +7,7 @@ #include #include +#include #include "absl/container/node_hash_map.h" #include "quiche/quic/core/io/quic_default_event_loop.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/mock_qbone_tunnel.h b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/mock_qbone_tunnel.h index 409bc47642..a1d0254da3 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/mock_qbone_tunnel.h +++ b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/mock_qbone_tunnel.h @@ -33,6 +33,8 @@ class MockQboneTunnel : public QboneTunnelInterface { MOCK_METHOD(quic::QboneClient*, client, (), (override)); + MOCK_METHOD(bool, use_quarantine_mode, (), (const override)); + MOCK_METHOD(State, state, ()); MOCK_METHOD(std::string, HealthString, ()); diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/qbone_tunnel_info.cc b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/qbone_tunnel_info.cc index 0958956729..f47d222d79 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/qbone_tunnel_info.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/qbone_tunnel_info.cc @@ -4,6 +4,8 @@ #include "quiche/quic/qbone/bonnet/qbone_tunnel_info.h" +#include + namespace quic { QuicIpAddress QboneTunnelInfo::GetAddress() { diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/qbone_tunnel_interface.h b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/qbone_tunnel_interface.h index c4bd7b4bfa..920f213a4a 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/qbone_tunnel_interface.h +++ b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/qbone_tunnel_interface.h @@ -58,6 +58,8 @@ class QboneTunnelInterface : public quic::QboneClientControlStream::Handler { virtual QboneClient* client() = 0; + virtual bool use_quarantine_mode() const = 0; + virtual State state() = 0; virtual std::string HealthString() = 0; diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device.cc b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device.cc index 9b11d99e8c..a39aabfb66 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device.cc @@ -10,6 +10,9 @@ #include #include +#include +#include + #include "absl/cleanup/cleanup.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller.cc b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller.cc index 0473bc65a3..5169a77ab7 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller.cc @@ -6,6 +6,9 @@ #include +#include +#include + #include "absl/time/clock.h" #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/quic/qbone/qbone_constants.h" @@ -16,7 +19,7 @@ ABSL_FLAG(bool, qbone_tun_device_replace_default_routing_rules, true, "qbone interface to the qbone table. This is unnecessary in " "environments with no other ipv6 route."); -ABSL_FLAG(int, qbone_route_init_cwnd, 32, +ABSL_FLAG(int, qbone_route_init_cwnd, 0, "If non-zero, will add initcwnd to QBONE routing rules. Setting " "a value below 10 is dangerous and not recommended."); diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller_test.cc b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller_test.cc index 18488435da..fd15f316e2 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller_test.cc @@ -7,6 +7,9 @@ #include #include +#include +#include + #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/qbone/platform/mock_netlink.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_packet_exchanger.cc b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_packet_exchanger.cc index 6c9cb062bd..e5c2d76b3b 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_packet_exchanger.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_packet_exchanger.cc @@ -7,6 +7,8 @@ #include #include +#include +#include #include #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc index a6d3a39bfc..e6cb919286 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/qbone/bonnet/tun_device_packet_exchanger.h" +#include + #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/qbone/bonnet/mock_packet_exchanger_stats_interface.h" #include "quiche/quic/qbone/mock_qbone_client.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/platform/icmp_packet.cc b/yass/third_party/quiche/src/quiche/quic/qbone/platform/icmp_packet.cc index 49ff1f6c7c..c5fb620cc3 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/platform/icmp_packet.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/platform/icmp_packet.cc @@ -6,6 +6,8 @@ #include +#include + #include "absl/strings/string_view.h" #include "quiche/quic/core/internet_checksum.h" #include "quiche/common/quiche_callbacks.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/platform/ip_range.cc b/yass/third_party/quiche/src/quiche/quic/qbone/platform/ip_range.cc index 2ef1ef7e65..4f4c98b58a 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/platform/ip_range.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/platform/ip_range.cc @@ -4,6 +4,8 @@ #include "quiche/quic/qbone/platform/ip_range.h" +#include + #include "quiche/common/quiche_endian.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/platform/kernel_interface.h b/yass/third_party/quiche/src/quiche/quic/qbone/platform/kernel_interface.h index b7eb5d06eb..d126af2464 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/platform/kernel_interface.h +++ b/yass/third_party/quiche/src/quiche/quic/qbone/platform/kernel_interface.h @@ -12,6 +12,8 @@ #include #include +#include +#include #include #include @@ -29,6 +31,8 @@ class KernelInterface { virtual ssize_t read(int fd, void* buf, size_t count) = 0; virtual ssize_t recvfrom(int sockfd, void* buf, size_t len, int flags, struct sockaddr* src_addr, socklen_t* addrlen) = 0; + virtual int recvmmsg(int sockfd, struct mmsghdr* msgvec, unsigned int vlen, + int flags, struct timespec* timeout) = 0; virtual ssize_t sendmsg(int sockfd, const struct msghdr* msg, int flags) = 0; virtual ssize_t sendto(int sockfd, const void* buf, size_t len, int flags, const struct sockaddr* dest_addr, @@ -93,6 +97,11 @@ class ParametrizedKernel final : public KernelInterface { return syscall.RetryOnError(&::recvfrom, static_cast(-1), sockfd, buf, len, flags, src_addr, addrlen); } + int recvmmsg(int sockfd, struct mmsghdr* msgvec, unsigned int vlen, int flags, + struct timespec* timeout) override { + static Runner syscall("recvmmsg"); + return syscall.Run(&::recvmmsg, sockfd, msgvec, vlen, flags, timeout); + } ssize_t sendmsg(int sockfd, const struct msghdr* msg, int flags) override { static Runner syscall("sendmsg"); return syscall.RetryOnError(&::sendmsg, static_cast(-1), sockfd, diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/platform/mock_kernel.h b/yass/third_party/quiche/src/quiche/quic/qbone/platform/mock_kernel.h index a69446e2a6..aff8a83010 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/platform/mock_kernel.h +++ b/yass/third_party/quiche/src/quiche/quic/qbone/platform/mock_kernel.h @@ -5,6 +5,9 @@ #ifndef QUICHE_QUIC_QBONE_PLATFORM_MOCK_KERNEL_H_ #define QUICHE_QUIC_QBONE_PLATFORM_MOCK_KERNEL_H_ +#include +#include + #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/qbone/platform/kernel_interface.h" @@ -24,6 +27,10 @@ class MockKernel : public KernelInterface { (int sockfd, void*, size_t len, int flags, struct sockaddr*, socklen_t*), (override)); + MOCK_METHOD(int, recvmmsg, + (int sockfd, struct mmsghdr* msgvec, unsigned int vlen, int flags, + struct timespec* timeout), + (override)); MOCK_METHOD(ssize_t, sendmsg, (int sockfd, const struct msghdr*, int flags), (override)); MOCK_METHOD(ssize_t, sendto, diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/platform/netlink.cc b/yass/third_party/quiche/src/quiche/quic/qbone/platform/netlink.cc index 0f20576286..04567d903d 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/platform/netlink.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/platform/netlink.cc @@ -6,7 +6,10 @@ #include +#include +#include #include +#include #include "absl/base/attributes.h" #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/platform/netlink_test.cc b/yass/third_party/quiche/src/quiche/quic/qbone/platform/netlink_test.cc index b0ea1f0b8d..ad159c5261 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/platform/netlink_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/platform/netlink_test.cc @@ -4,7 +4,11 @@ #include "quiche/quic/qbone/platform/netlink.h" +#include +#include +#include #include +#include #include "absl/container/node_hash_set.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/platform/rtnetlink_message.cc b/yass/third_party/quiche/src/quiche/quic/qbone/platform/rtnetlink_message.cc index c85bf6f135..0789151dba 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/platform/rtnetlink_message.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/platform/rtnetlink_message.cc @@ -4,6 +4,7 @@ #include "quiche/quic/qbone/platform/rtnetlink_message.h" +#include #include namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/platform/rtnetlink_message_test.cc b/yass/third_party/quiche/src/quiche/quic/qbone/platform/rtnetlink_message_test.cc index 5757e88d33..98f291743d 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/platform/rtnetlink_message_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/platform/rtnetlink_message_test.cc @@ -6,6 +6,8 @@ #include +#include + #include "quiche/quic/platform/api/quic_ip_address.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client.cc index 032bda8d72..5c7113a861 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client.cc @@ -4,6 +4,7 @@ #include "quiche/quic/qbone/qbone_client.h" +#include #include diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client_session.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client_session.cc index 2ca4df223f..fa88c170b5 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client_session.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client_session.cc @@ -4,6 +4,7 @@ #include "quiche/quic/qbone/qbone_client_session.h" +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client_test.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client_test.cc index c77078da63..53acb22ff4 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_client_test.cc @@ -7,6 +7,9 @@ #include "quiche/quic/qbone/qbone_client.h" #include +#include +#include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/io/quic_default_event_loop.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.cc index 5ded99555e..18f8f030d4 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_session.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_exchanger.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_exchanger.cc index f582d6ed0d..aa99a78ddb 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_exchanger.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_exchanger.cc @@ -4,6 +4,8 @@ #include "quiche/quic/qbone/qbone_packet_exchanger.h" +#include +#include #include namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_exchanger_test.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_exchanger_test.cc index be6084159a..16639074e8 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_exchanger_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_exchanger_test.cc @@ -4,7 +4,11 @@ #include "quiche/quic/qbone/qbone_packet_exchanger.h" +#include +#include +#include #include +#include #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/qbone/mock_qbone_client.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor.cc index 1ddd02ba72..8ac86ee198 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor.cc @@ -10,6 +10,7 @@ #include #include +#include #include "absl/base/optimization.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test.cc index c35f28c706..ec424e22c3 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/qbone/qbone_packet_processor.h" +#include +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.cc index 9a731887fb..d486ac5807 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.cc @@ -6,6 +6,8 @@ #include +#include + namespace quic { std::string PrependIPv6HeaderForTest(const std::string& body, int hops) { diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_server_session.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_server_session.cc index cbe9583635..4c4ec18dd5 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_server_session.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_server_session.cc @@ -4,6 +4,7 @@ #include "quiche/quic/qbone/qbone_server_session.h" +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.cc index 36517b75f5..31cf8e1b38 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.cc @@ -7,6 +7,8 @@ #include #include +#include +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_session_test.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_session_test.cc index 46a41d9255..1a8fd31931 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_session_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_session_test.cc @@ -2,8 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include #include +#include +#include #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/io/quic_default_event_loop.h" diff --git a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_stream_test.cc index 7ab4dad5cd..a19707ee49 100644 --- a/yass/third_party/quiche/src/quiche/quic/qbone/qbone_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/qbone/qbone_stream_test.cc @@ -4,6 +4,9 @@ #include "quiche/quic/qbone/qbone_stream.h" +#include +#include +#include #include #include "absl/strings/string_view.h" @@ -68,10 +71,9 @@ class MockQuicSession : public QboneSessionBase { void RegisterReliableStream(QuicStreamId stream_id) { // The priority effectively does not matter. Put all streams on the same // priority. - write_blocked_streams()->RegisterStream( - stream_id, - /* is_static_stream = */ false, - QuicStreamPriority::Default(priority_type())); + write_blocked_streams()->RegisterStream(stream_id, + /* is_static_stream = */ false, + QuicStreamPriority()); } // The session take ownership of the stream. diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/crypto_test_utils_test.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/crypto_test_utils_test.cc index 51bcc9e52c..1c78944034 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/crypto_test_utils_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/crypto_test_utils_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/crypto_test_utils.h" +#include +#include #include #include "absl/strings/escaping.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/failing_proof_source.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/failing_proof_source.cc index 55ae06eaa1..f65b52802a 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/failing_proof_source.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/failing_proof_source.cc @@ -4,6 +4,9 @@ #include "quiche/quic/test_tools/failing_proof_source.h" +#include +#include + #include "absl/strings/string_view.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source.cc index 43c5a7257b..04e4e809a4 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/fake_proof_source.h" +#include +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/first_flight.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/first_flight.cc index 820dbbb1db..8a8316c73a 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/first_flight.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/first_flight.cc @@ -5,6 +5,7 @@ #include "quiche/quic/test_tools/first_flight.h" #include +#include #include #include "quiche/quic/core/crypto/quic_crypto_client_config.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/fuzzing/quic_framer_fuzzer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/fuzzing/quic_framer_fuzzer.cc index 7b1e09f68e..7251c1d772 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/fuzzing/quic_framer_fuzzer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/fuzzing/quic_framer_fuzzer.cc @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include + #include "absl/strings/string_view.h" #include "quiche/quic/core/crypto/crypto_framer.h" #include "quiche/quic/core/crypto/crypto_handshake_message.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/fuzzing/quic_framer_process_data_packet_fuzzer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/fuzzing/quic_framer_process_data_packet_fuzzer.cc index 0ee8c23621..9fff371b28 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/fuzzing/quic_framer_process_data_packet_fuzzer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/fuzzing/quic_framer_process_data_packet_fuzzer.cc @@ -5,8 +5,11 @@ #include #include +#include #include +#include #include +#include #include "absl/base/macros.h" #include "quiche/quic/core/crypto/null_decrypter.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/mock_quic_connection_alarms.h b/yass/third_party/quiche/src/quiche/quic/test_tools/mock_quic_connection_alarms.h new file mode 100644 index 0000000000..702cb8e9b8 --- /dev/null +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/mock_quic_connection_alarms.h @@ -0,0 +1,32 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_TEST_TOOLS_MOCK_QUIC_CONNECTION_ALARMS_H_ +#define QUICHE_QUIC_TEST_TOOLS_MOCK_QUIC_CONNECTION_ALARMS_H_ + +#include "quiche/quic/core/quic_connection_alarms.h" +#include "quiche/quic/platform/api/quic_test.h" + +namespace quic::test { + +class MockConnectionAlarmsDelegate : public QuicConnectionAlarmsDelegate { + public: + MOCK_METHOD(void, OnSendAlarm, (), (override)); + MOCK_METHOD(void, OnAckAlarm, (), (override)); + MOCK_METHOD(void, OnRetransmissionAlarm, (), (override)); + MOCK_METHOD(void, OnMtuDiscoveryAlarm, (), (override)); + MOCK_METHOD(void, OnProcessUndecryptablePacketsAlarm, (), (override)); + MOCK_METHOD(void, OnDiscardPreviousOneRttKeysAlarm, (), (override)); + MOCK_METHOD(void, OnDiscardZeroRttDecryptionKeysAlarm, (), (override)); + MOCK_METHOD(void, MaybeProbeMultiPortPath, (), (override)); + MOCK_METHOD(void, OnIdleDetectorAlarm, (), (override)); + MOCK_METHOD(void, OnNetworkBlackholeDetectorAlarm, (), (override)); + MOCK_METHOD(void, OnPingAlarm, (), (override)); + + QuicConnectionContext* context() override { return nullptr; } +}; + +} // namespace quic::test + +#endif // QUICHE_QUIC_TEST_TOOLS_MOCK_QUIC_CONNECTION_ALARMS_H_ diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/mock_quic_dispatcher.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/mock_quic_dispatcher.cc index 527047e9c7..99a876e2c0 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/mock_quic_dispatcher.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/mock_quic_dispatcher.cc @@ -4,6 +4,9 @@ #include "quiche/quic/test_tools/mock_quic_dispatcher.h" +#include +#include + #include "quiche/quic/test_tools/quic_test_utils.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/packet_dropping_test_writer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/packet_dropping_test_writer.cc index 598733830b..fa3eb737e4 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/packet_dropping_test_writer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/packet_dropping_test_writer.cc @@ -4,6 +4,9 @@ #include "quiche/quic/test_tools/packet_dropping_test_writer.h" +#include +#include + #include "quiche/quic/platform/api/quic_logging.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.cc index 2b39dcdf7c..ad8d4eb722 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.cc @@ -6,6 +6,7 @@ #include #include +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.cc index da7a865d26..73d50075ad 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.cc @@ -27,8 +27,11 @@ #include "quiche/quic/test_tools/qpack/qpack_offline_decoder.h" #include +#include +#include #include #include +#include #include "absl/strings/match.h" #include "absl/strings/numbers.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_coalesced_packet_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_coalesced_packet_peer.cc index eeb1621248..daa64f0416 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_coalesced_packet_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_coalesced_packet_peer.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/quic_coalesced_packet_peer.h" +#include + namespace quic { namespace test { diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_config_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_config_peer.cc index a3e9acc549..165fd72bba 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_config_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_config_peer.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/quic_config_peer.h" +#include + #include "quiche/quic/core/quic_config.h" #include "quiche/quic/core/quic_connection_id.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc index e21019b833..18c3bf0029 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc @@ -4,6 +4,9 @@ #include "quiche/quic/test_tools/quic_connection_peer.h" +#include +#include + #include "absl/strings/string_view.h" #include "quiche/quic/core/congestion_control/send_algorithm_interface.h" #include "quiche/quic/core/quic_packet_writer.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_crypto_server_config_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_crypto_server_config_peer.cc index 48c8aedde6..c63b0c592e 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_crypto_server_config_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_crypto_server_config_peer.cc @@ -4,6 +4,11 @@ #include "quiche/quic/test_tools/quic_crypto_server_config_peer.h" +#include +#include +#include +#include + #include "absl/strings/string_view.h" #include "quiche/quic/test_tools/mock_clock.h" #include "quiche/quic/test_tools/mock_random.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_dispatcher_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_dispatcher_peer.cc index f08c2d78bb..d4d7c071cb 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_dispatcher_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_dispatcher_peer.cc @@ -4,6 +4,11 @@ #include "quiche/quic/test_tools/quic_dispatcher_peer.h" +#include +#include +#include +#include + #include "quiche/quic/core/quic_dispatcher.h" #include "quiche/quic/core/quic_packet_writer_wrapper.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_framer_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_framer_peer.cc index 1c23468ecc..25e90a06aa 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_framer_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_framer_peer.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/quic_framer_peer.h" +#include + #include "quiche/quic/core/quic_framer.h" #include "quiche/quic/core/quic_packets.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.cc index f7f75ba71b..0847b32719 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.cc @@ -4,6 +4,10 @@ #include "quiche/quic/test_tools/quic_packet_creator_peer.h" +#include +#include +#include + #include "quiche/quic/core/frames/quic_frame.h" #include "quiche/quic/core/quic_packet_creator.h" #include "quiche/quic/core/quic_types.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_session_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_session_peer.cc index 981af9f08e..228f27d5e5 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_session_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_session_peer.cc @@ -4,6 +4,9 @@ #include "quiche/quic/test_tools/quic_session_peer.h" +#include +#include + #include "absl/container/flat_hash_map.h" #include "quiche/quic/core/quic_session.h" #include "quiche/quic/core/quic_stream.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.cc index 4da725435f..f42d9aea9e 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/quic_spdy_session_peer.h" +#include + #include "quiche/quic/core/http/quic_spdy_session.h" #include "quiche/quic/core/qpack/qpack_receive_stream.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_stream_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_stream_peer.cc index 15806b372a..972440b309 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_stream_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_stream_peer.cc @@ -4,13 +4,14 @@ #include "quiche/quic/test_tools/quic_spdy_stream_peer.h" +#include + #include "quiche/quic/core/http/quic_spdy_stream.h" #include "quiche/quic/test_tools/quic_test_utils.h" namespace quic { namespace test { -// static void QuicSpdyStreamPeer::set_ack_listener( QuicSpdyStream* stream, quiche::QuicheReferenceCountedPointer @@ -18,16 +19,19 @@ void QuicSpdyStreamPeer::set_ack_listener( stream->set_ack_listener(std::move(ack_listener)); } -// static const QuicIntervalSet& QuicSpdyStreamPeer::unacked_frame_headers_offsets(QuicSpdyStream* stream) { return stream->unacked_frame_headers_offsets_; } -// static bool QuicSpdyStreamPeer::OnHeadersFrameEnd(QuicSpdyStream* stream) { return stream->OnHeadersFrameEnd(); } +void QuicSpdyStreamPeer::set_header_decoding_delay(QuicSpdyStream* stream, + QuicTime::Delta delay) { + stream->header_decoding_delay_ = delay; +} + } // namespace test } // namespace quic diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_stream_peer.h b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_stream_peer.h index 8b5083d262..f5c2e4421f 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_stream_peer.h +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_stream_peer.h @@ -7,6 +7,7 @@ #include "quiche/quic/core/quic_ack_listener_interface.h" #include "quiche/quic/core/quic_interval_set.h" +#include "quiche/quic/core/quic_time.h" namespace quic { @@ -24,6 +25,8 @@ class QuicSpdyStreamPeer { static const QuicIntervalSet& unacked_frame_headers_offsets( QuicSpdyStream* stream); static bool OnHeadersFrameEnd(QuicSpdyStream* stream); + static void set_header_decoding_delay(QuicSpdyStream* stream, + QuicTime::Delta delay); }; } // namespace test diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_stream_sequencer_buffer_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_stream_sequencer_buffer_peer.cc index 679bd91ac5..56982e5041 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_stream_sequencer_buffer_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_stream_sequencer_buffer_peer.cc @@ -5,6 +5,8 @@ #include "quiche/quic/test_tools/quic_stream_sequencer_buffer_peer.h" #include +#include +#include #include "quiche/quic/platform/api/quic_flags.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.cc index 9f45e86bdd..a37ff368c6 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.cc @@ -6,6 +6,9 @@ #include #include +#include +#include +#include #include "absl/strings/str_cat.h" #include "absl/strings/str_split.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc index d0d0a2ec58..198906b33f 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc @@ -5,6 +5,8 @@ #include "quiche/quic/test_tools/quic_test_client.h" #include +#include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc index 1fb87c7581..a02b849b4e 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc @@ -4,6 +4,7 @@ #include "quiche/quic/test_tools/quic_test_server.h" +#include #include #include "absl/memory/memory.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc index 58277df00e..e3ec0a286f 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc @@ -7,7 +7,10 @@ #include #include #include +#include #include +#include +#include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils_test.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils_test.cc index 16ca977e99..e90f14f7eb 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/quic_test_utils.h" +#include + #include "quiche/quic/platform/api/quic_test.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_time_wait_list_manager_peer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_time_wait_list_manager_peer.cc index b8c38caa6e..9c39add8b2 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/quic_time_wait_list_manager_peer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/quic_time_wait_list_manager_peer.cc @@ -4,6 +4,9 @@ #include "quiche/quic/test_tools/quic_time_wait_list_manager_peer.h" +#include +#include + namespace quic { namespace test { diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_utils.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_utils.cc index 2ca17919a0..0171b297d1 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_utils.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_utils.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/send_algorithm_test_utils.h" +#include + #include "absl/strings/str_cat.h" #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/quic/platform/api/quic_test.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/server_thread.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/server_thread.cc index 1cafb8af80..9c561e4210 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/server_thread.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/server_thread.cc @@ -4,6 +4,9 @@ #include "quiche/quic/test_tools/server_thread.h" +#include +#include + #include "quiche/quic/core/quic_default_clock.h" #include "quiche/quic/core/quic_dispatcher.h" #include "quiche/quic/test_tools/crypto_test_utils.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simple_data_producer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simple_data_producer.cc index f0adc68b45..d788ec3994 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simple_data_producer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simple_data_producer.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/simple_data_producer.h" +#include +#include #include #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.cc index 54ae4b33da..6d177d160a 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.cc @@ -5,7 +5,10 @@ #include "quiche/quic/test_tools/simple_quic_framer.h" #include +#include +#include #include +#include #include "absl/memory/memory.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simple_session_cache.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simple_session_cache.cc index 05f433d538..977a1075f3 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simple_session_cache.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simple_session_cache.cc @@ -5,6 +5,8 @@ #include "quiche/quic/test_tools/simple_session_cache.h" #include +#include +#include #include "quiche/quic/core/crypto/quic_crypto_client_config.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier_test.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier_test.cc index 513394ccbf..0d488d262e 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/simple_session_notifier.h" +#include +#include #include #include "quiche/quic/core/crypto/null_encrypter.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/actor.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/actor.cc index 213d861e32..dcfda8da95 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/actor.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/actor.cc @@ -4,6 +4,9 @@ #include "quiche/quic/test_tools/simulator/actor.h" +#include +#include + #include "quiche/quic/test_tools/simulator/simulator.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/alarm_factory.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/alarm_factory.cc index 48939b53f4..066ae7a219 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/alarm_factory.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/alarm_factory.cc @@ -4,6 +4,10 @@ #include "quiche/quic/test_tools/simulator/alarm_factory.h" +#include +#include +#include + #include "absl/strings/str_format.h" #include "quiche/quic/core/quic_alarm.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/link.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/link.cc index e2a094bfe6..33854905ae 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/link.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/link.cc @@ -4,6 +4,11 @@ #include "quiche/quic/test_tools/simulator/link.h" +#include +#include +#include +#include + #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" #include "quiche/quic/test_tools/simulator/simulator.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/packet_filter.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/packet_filter.cc index fc07c1542a..ad682f72c9 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/packet_filter.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/packet_filter.cc @@ -4,6 +4,10 @@ #include "quiche/quic/test_tools/simulator/packet_filter.h" +#include +#include +#include + namespace quic { namespace simulator { diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/port.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/port.cc index bffc086fa5..b3eda68b2b 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/port.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/port.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/simulator/port.h" +#include + namespace quic { namespace simulator { diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/queue.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/queue.cc index 5a1eccf61a..885f814bf9 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/queue.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/queue.cc @@ -4,6 +4,10 @@ #include "quiche/quic/test_tools/simulator/queue.h" +#include +#include +#include + #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/quic/test_tools/simulator/simulator.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.cc index d4d580985c..1d26383dcd 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.cc @@ -4,7 +4,9 @@ #include "quiche/quic/test_tools/simulator/quic_endpoint.h" +#include #include +#include #include #include "quiche/quic/core/crypto/crypto_handshake_message.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_base.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_base.cc index 209994a174..78d285b604 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_base.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_base.cc @@ -5,7 +5,10 @@ #include "quiche/quic/test_tools/simulator/quic_endpoint_base.h" #include +#include +#include #include +#include #include "absl/strings/str_cat.h" #include "quiche/quic/core/crypto/crypto_handshake_message.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_test.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_test.cc index c247eb52aa..3b9171eafc 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_test.cc @@ -4,6 +4,7 @@ #include "quiche/quic/test_tools/simulator/quic_endpoint.h" +#include #include #include "quiche/quic/platform/api/quic_flags.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/simulator.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/simulator.cc index 49a0ae220f..e6726b5854 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/simulator.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/simulator.cc @@ -4,6 +4,8 @@ #include "quiche/quic/test_tools/simulator/simulator.h" +#include + #include "quiche/quic/core/crypto/quic_random.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/simulator_test.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/simulator_test.cc index 4ae04a7803..93197cf1d5 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/simulator_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/simulator_test.cc @@ -4,7 +4,10 @@ #include "quiche/quic/test_tools/simulator/simulator.h" +#include +#include #include +#include #include "absl/container/node_hash_map.h" #include "quiche/quic/platform/api/quic_logging.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/switch.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/switch.cc index fbd396e241..39c4e310e3 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/switch.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/switch.cc @@ -5,6 +5,8 @@ #include "quiche/quic/test_tools/simulator/switch.h" #include +#include +#include #include #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/traffic_policer.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/traffic_policer.cc index d701a16e36..7d031aa9ea 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/traffic_policer.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/simulator/traffic_policer.cc @@ -5,6 +5,8 @@ #include "quiche/quic/test_tools/simulator/traffic_policer.h" #include +#include +#include namespace quic { namespace simulator { diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/test_ticket_crypter.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/test_ticket_crypter.cc index 0a5ec49f41..c103138547 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/test_ticket_crypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/test_ticket_crypter.cc @@ -5,6 +5,9 @@ #include "quiche/quic/test_tools/test_ticket_crypter.h" #include +#include +#include +#include #include "absl/base/macros.h" #include "quiche/quic/core/crypto/quic_random.h" diff --git a/yass/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.cc b/yass/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.cc index e77a9f4fbd..4a28ff5ddc 100644 --- a/yass/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.cc +++ b/yass/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.cc @@ -5,6 +5,8 @@ #include "quiche/quic/test_tools/web_transport_resets_backend.h" #include +#include +#include #include "quiche/quic/core/web_transport_interface.h" #include "quiche/quic/tools/web_transport_test_visitors.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/connect_tunnel_test.cc b/yass/third_party/quiche/src/quiche/quic/tools/connect_tunnel_test.cc index f52afce355..9387502144 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/connect_tunnel_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/connect_tunnel_test.cc @@ -5,6 +5,8 @@ #include "quiche/quic/tools/connect_tunnel.h" #include +#include +#include #include #include "absl/container/flat_hash_set.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/connect_udp_tunnel.cc b/yass/third_party/quiche/src/quiche/quic/tools/connect_udp_tunnel.cc index 702963f48f..a4d215ccc0 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/connect_udp_tunnel.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/connect_udp_tunnel.cc @@ -5,6 +5,7 @@ #include "quiche/quic/tools/connect_udp_tunnel.h" #include +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/tools/connect_udp_tunnel_test.cc b/yass/third_party/quiche/src/quiche/quic/tools/connect_udp_tunnel_test.cc index 73b06c261a..45cb2ffe4c 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/connect_udp_tunnel_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/connect_udp_tunnel_test.cc @@ -6,6 +6,7 @@ #include #include +#include #include "absl/status/status.h" #include "absl/status/statusor.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/crypto_message_printer_bin.cc b/yass/third_party/quiche/src/quiche/quic/tools/crypto_message_printer_bin.cc index 82850d94a1..ef0315e634 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/crypto_message_printer_bin.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/crypto_message_printer_bin.cc @@ -9,6 +9,7 @@ #include #include +#include #include "absl/strings/escaping.h" #include "quiche/quic/core/crypto/crypto_framer.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/devious_baton.cc b/yass/third_party/quiche/src/quiche/quic/tools/devious_baton.cc index a06ce86a29..c4c0dd8181 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/devious_baton.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/devious_baton.cc @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include "absl/functional/bind_front.h" #include "absl/status/status.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/qpack_offline_decoder_bin.cc b/yass/third_party/quiche/src/quiche/quic/tools/qpack_offline_decoder_bin.cc index a5cbc856dd..737084c7d7 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/qpack_offline_decoder_bin.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/qpack_offline_decoder_bin.cc @@ -4,6 +4,8 @@ #include #include +#include +#include #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_flags.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_client_bin.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_client_bin.cc index ad2acf94a4..3e6dc15de3 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_client_bin.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_client_bin.cc @@ -43,6 +43,7 @@ #include #include #include +#include #include "quiche/quic/tools/quic_epoll_client_factory.h" #include "quiche/quic/tools/quic_toy_client.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc index f4b0bb20b8..d53df5f5ee 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc @@ -4,6 +4,11 @@ #include "quiche/quic/tools/quic_client_default_network_helper.h" +#include +#include +#include +#include + #include "absl/cleanup/cleanup.h" #include "quiche/quic/core/io/quic_event_loop.h" #include "quiche/quic/core/quic_default_packet_writer.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_client_interop_test_bin.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_client_interop_test_bin.cc index 990ae2be7b..4cb07e45f5 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_client_interop_test_bin.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_client_interop_test_bin.cc @@ -4,8 +4,10 @@ #include #include +#include #include #include +#include #include "absl/strings/str_cat.h" #include "quiche/quic/core/crypto/quic_client_session_cache.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc index d6b40f2a62..1a202a8cde 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc @@ -4,6 +4,7 @@ #include "quiche/quic/tools/quic_default_client.h" +#include #include #include "quiche/quic/core/quic_connection.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_default_client_test.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_default_client_test.cc index d58a24ae02..836faaa49f 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_default_client_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_default_client_test.cc @@ -12,6 +12,7 @@ #include #include +#include #include #include "absl/strings/match.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_epoll_client_factory.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_epoll_client_factory.cc index 1f66777967..2ecc0efaac 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_epoll_client_factory.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_epoll_client_factory.cc @@ -4,6 +4,8 @@ #include "quiche/quic/tools/quic_epoll_client_factory.h" +#include +#include #include #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc index 6b49979188..5a3e168ca7 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc @@ -4,7 +4,11 @@ #include "quiche/quic/tools/quic_memory_cache_backend.h" +#include +#include +#include #include +#include #include "absl/strings/match.h" #include "absl/strings/numbers.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend_test.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend_test.cc index 465df3de32..6f16ee33c5 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend_test.cc @@ -4,6 +4,8 @@ #include "quiche/quic/tools/quic_memory_cache_backend.h" +#include +#include #include #include "absl/strings/match.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_name_lookup.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_name_lookup.cc index dc1d918f5b..8bf2b96ea4 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_name_lookup.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_name_lookup.cc @@ -5,6 +5,7 @@ #include "quiche/quic/tools/quic_name_lookup.h" #include +#include #include #include "absl/strings/str_cat.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_packet_printer_bin.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_packet_printer_bin.cc index 314cc20ea6..95d0d1d887 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_packet_printer_bin.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_packet_printer_bin.cc @@ -27,6 +27,10 @@ // clang-format on #include +#include +#include +#include +#include #include "absl/strings/escaping.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_reject_reason_decoder_bin.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_reject_reason_decoder_bin.cc index 661e3d9122..8f9d525178 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_reject_reason_decoder_bin.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_reject_reason_decoder_bin.cc @@ -6,6 +6,8 @@ // Net.QuicClientHelloRejectReasons #include +#include +#include #include "absl/strings/numbers.h" #include "quiche/quic/core/crypto/crypto_handshake.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_server.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_server.cc index 21a91a0b2e..92c82c0955 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_server.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_server.cc @@ -6,6 +6,7 @@ #include #include +#include #include "quiche/quic/core/crypto/crypto_handshake.h" #include "quiche/quic/core/crypto/quic_random.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_server_bin.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_server_bin.cc index d823af0f74..3c1ccd6904 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_server_bin.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_server_bin.cc @@ -5,6 +5,7 @@ // A binary wrapper for QuicServer. It listens forever on --port // (default 6121) until it's killed or ctrl-cd to death. +#include #include #include "quiche/quic/tools/quic_server_factory.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_server_factory.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_server_factory.cc index 7aac48b1e3..c044c21e43 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_server_factory.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_server_factory.cc @@ -4,6 +4,7 @@ #include "quiche/quic/tools/quic_server_factory.h" +#include #include #include "quiche/quic/tools/quic_server.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_server_test.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_server_test.cc index facd42e7b0..1abb75c074 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_server_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_server_test.cc @@ -5,6 +5,8 @@ #include "quiche/quic/tools/quic_server.h" #include +#include +#include #include "absl/base/macros.h" #include "quiche/quic/core/crypto/quic_random.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.cc index da6400d46c..5dae254147 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.cc @@ -4,6 +4,7 @@ #include "quiche/quic/tools/quic_simple_client_session.h" +#include #include #include "quiche/quic/core/quic_path_validator.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_crypto_server_stream_helper.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_crypto_server_stream_helper.cc index 08d63b7ee0..871db8d30d 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_crypto_server_stream_helper.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_crypto_server_stream_helper.cc @@ -4,6 +4,8 @@ #include "quiche/quic/tools/quic_simple_crypto_server_stream_helper.h" +#include + #include "quiche/quic/core/quic_utils.h" namespace quic { diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_dispatcher.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_dispatcher.cc index f712f5adb2..e8d0d23aa1 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_dispatcher.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_dispatcher.cc @@ -4,6 +4,9 @@ #include "quiche/quic/tools/quic_simple_dispatcher.h" +#include +#include + #include "absl/strings/string_view.h" #include "quiche/quic/core/connection_id_generator.h" #include "quiche/quic/core/quic_types.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_session.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_session.cc index 1f82e11734..a15532b3a7 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_session.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_session.cc @@ -4,6 +4,7 @@ #include "quiche/quic/tools/quic_simple_server_session.h" +#include #include #include "absl/memory/memory.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc index 07c0defc40..b71b448538 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc @@ -4,9 +4,11 @@ #include "quiche/quic/tools/quic_simple_server_stream.h" +#include #include #include #include +#include #include #include "absl/strings/numbers.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream_test.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream_test.cc index 975a194d02..e34b709b02 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream_test.cc @@ -7,7 +7,9 @@ #include #include #include +#include #include +#include #include "absl/base/macros.h" #include "absl/memory/memory.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_spdy_client_base.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_spdy_client_base.cc index 55b66312b5..be166536bb 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_spdy_client_base.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_spdy_client_base.cc @@ -4,7 +4,11 @@ #include "quiche/quic/tools/quic_spdy_client_base.h" +#include +#include +#include #include +#include #include "absl/strings/numbers.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_tcp_like_trace_converter.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_tcp_like_trace_converter.cc index b3d5cec6ed..e06d39e626 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_tcp_like_trace_converter.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_tcp_like_trace_converter.cc @@ -4,6 +4,8 @@ #include "quiche/quic/tools/quic_tcp_like_trace_converter.h" +#include + #include "quiche/quic/core/quic_constants.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_toy_server.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_toy_server.cc index bfe9c89c69..1c3ec136b1 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_toy_server.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_toy_server.cc @@ -4,6 +4,8 @@ #include "quiche/quic/tools/quic_toy_server.h" +#include +#include #include #include #include diff --git a/yass/third_party/quiche/src/quiche/quic/tools/quic_url.cc b/yass/third_party/quiche/src/quiche/quic/tools/quic_url.cc index db52720902..7eaa8c0ac5 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/quic_url.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/quic_url.cc @@ -4,6 +4,8 @@ #include "quiche/quic/tools/quic_url.h" +#include + #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/simple_ticket_crypter.cc b/yass/third_party/quiche/src/quiche/quic/tools/simple_ticket_crypter.cc index ad9fea1a09..7f1f6e72e9 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/simple_ticket_crypter.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/simple_ticket_crypter.cc @@ -4,6 +4,10 @@ #include "quiche/quic/tools/simple_ticket_crypter.h" +#include +#include +#include + #include "openssl/aead.h" #include "openssl/rand.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/simple_ticket_crypter_test.cc b/yass/third_party/quiche/src/quiche/quic/tools/simple_ticket_crypter_test.cc index 0399047703..323dfb6b99 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/simple_ticket_crypter_test.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/simple_ticket_crypter_test.cc @@ -4,6 +4,9 @@ #include "quiche/quic/tools/simple_ticket_crypter.h" +#include +#include + #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/test_tools/mock_clock.h" diff --git a/yass/third_party/quiche/src/quiche/quic/tools/web_transport_test_server.cc b/yass/third_party/quiche/src/quiche/quic/tools/web_transport_test_server.cc index a7c1794048..359021e5b5 100644 --- a/yass/third_party/quiche/src/quiche/quic/tools/web_transport_test_server.cc +++ b/yass/third_party/quiche/src/quiche/quic/tools/web_transport_test_server.cc @@ -3,6 +3,8 @@ // found in the LICENSE file. #include +#include +#include #include "absl/status/status.h" #include "absl/status/statusor.h" diff --git a/yass/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.cc b/yass/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.cc index 1fff60d816..d921c2c22c 100644 --- a/yass/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.cc +++ b/yass/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.cc @@ -10,6 +10,7 @@ #include #include #include +#include #include "absl/strings/str_split.h" #include "absl/strings/string_view.h" diff --git a/yass/third_party/quiche/src/quiche/web_transport/complete_buffer_visitor.cc b/yass/third_party/quiche/src/quiche/web_transport/complete_buffer_visitor.cc index d0ef4718c9..45980c56d4 100644 --- a/yass/third_party/quiche/src/quiche/web_transport/complete_buffer_visitor.cc +++ b/yass/third_party/quiche/src/quiche/web_transport/complete_buffer_visitor.cc @@ -4,6 +4,7 @@ #include "quiche/web_transport/complete_buffer_visitor.h" +#include #include #include "quiche/common/platform/api/quiche_logging.h" diff --git a/yass/third_party/quiche/src/quiche/web_transport/encapsulated/encapsulated_web_transport.cc b/yass/third_party/quiche/src/quiche/web_transport/encapsulated/encapsulated_web_transport.cc index adbbb5364a..b6380e823f 100644 --- a/yass/third_party/quiche/src/quiche/web_transport/encapsulated/encapsulated_web_transport.cc +++ b/yass/third_party/quiche/src/quiche/web_transport/encapsulated/encapsulated_web_transport.cc @@ -783,4 +783,14 @@ void EncapsulatedSession::GarbageCollectStreams() { streams_to_garbage_collect_.clear(); } +void EncapsulatedSession::InnerStream::SetPriority( + const StreamPriority& priority) { + absl::Status status; + status = session_->scheduler_.UpdateSendGroup(id_, priority.send_group_id); + QUICHE_BUG_IF(EncapsulatedWebTransport_SetPriority_group, !status.ok()) + << status; + status = session_->scheduler_.UpdateSendOrder(id_, priority.send_order); + QUICHE_BUG_IF(EncapsulatedWebTransport_SetPriority_order, !status.ok()) + << status; +} } // namespace webtransport diff --git a/yass/third_party/quiche/src/quiche/web_transport/encapsulated/encapsulated_web_transport.h b/yass/third_party/quiche/src/quiche/web_transport/encapsulated/encapsulated_web_transport.h index 324726755e..0fe2b977a6 100644 --- a/yass/third_party/quiche/src/quiche/web_transport/encapsulated/encapsulated_web_transport.h +++ b/yass/third_party/quiche/src/quiche/web_transport/encapsulated/encapsulated_web_transport.h @@ -164,6 +164,8 @@ class QUICHE_EXPORT EncapsulatedSession void ResetDueToInternalError() override { ResetWithUserCode(0); } void MaybeResetDueToStreamObjectGone() override { ResetWithUserCode(0); } + void SetPriority(const StreamPriority& priority) override; + void CloseReadSide(std::optional error); void CloseWriteSide(std::optional error); bool CanBeGarbageCollected() const { diff --git a/yass/third_party/quiche/src/quiche/web_transport/test_tools/mock_web_transport.h b/yass/third_party/quiche/src/quiche/web_transport/test_tools/mock_web_transport.h index 9ebf2396ba..4cb3aafd05 100644 --- a/yass/third_party/quiche/src/quiche/web_transport/test_tools/mock_web_transport.h +++ b/yass/third_party/quiche/src/quiche/web_transport/test_tools/mock_web_transport.h @@ -52,6 +52,7 @@ class QUICHE_NO_EXPORT MockStream : public Stream { MOCK_METHOD(void, SendStopSending, (StreamErrorCode error), (override)); MOCK_METHOD(void, ResetDueToInternalError, (), (override)); MOCK_METHOD(void, MaybeResetDueToStreamObjectGone, (), (override)); + MOCK_METHOD(void, SetPriority, (const StreamPriority&), (override)); MOCK_METHOD(StreamVisitor*, visitor, (), (override)); MOCK_METHOD(void, SetVisitor, (std::unique_ptr visitor), (override)); diff --git a/yass/third_party/quiche/src/quiche/web_transport/web_transport.h b/yass/third_party/quiche/src/quiche/web_transport/web_transport.h index c008801a97..2c558ad229 100644 --- a/yass/third_party/quiche/src/quiche/web_transport/web_transport.h +++ b/yass/third_party/quiche/src/quiche/web_transport/web_transport.h @@ -155,6 +155,10 @@ class QUICHE_EXPORT Stream : public quiche::ReadStream, // garbage collected. virtual void MaybeResetDueToStreamObjectGone() = 0; + // Sets the send group and the send order of the stream as defined in + // https://w3c.github.io/webtransport/#dictdef-webtransportsendstreamoptions + virtual void SetPriority(const StreamPriority& priority) = 0; + virtual StreamVisitor* visitor() = 0; virtual void SetVisitor(std::unique_ptr visitor) = 0; }; diff --git a/yass/third_party/re2/.github/workflows/ci-bazel.yml b/yass/third_party/re2/.github/workflows/ci-bazel.yml index e49cd2ac7a..b0279bb295 100644 --- a/yass/third_party/re2/.github/workflows/ci-bazel.yml +++ b/yass/third_party/re2/.github/workflows/ci-bazel.yml @@ -14,8 +14,8 @@ jobs: env: BAZELISK_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v4.1.4 - - uses: bazel-contrib/setup-bazel@0.8.2 + - uses: actions/checkout@v4.1.6 + - uses: bazel-contrib/setup-bazel@0.8.4 with: bazelisk-version: '1.x' - run: .github/bazel.sh diff --git a/yass/third_party/re2/.github/workflows/ci-cmake.yml b/yass/third_party/re2/.github/workflows/ci-cmake.yml index 07ecdfbe05..113c1eafd3 100644 --- a/yass/third_party/re2/.github/workflows/ci-cmake.yml +++ b/yass/third_party/re2/.github/workflows/ci-cmake.yml @@ -7,26 +7,20 @@ permissions: jobs: build-linux: runs-on: ubuntu-latest - # The Benchmark package on Ubuntu 22.04 LTS is problematic whereas this - # Docker container is based on Debian bookworm and has a newer version. - container: gcc:13 strategy: fail-fast: false matrix: build_shared_libs: [OFF, ON] steps: - - uses: actions/checkout@v4.1.4 - - name: Install CMake - run: | - apt update -y - apt install -y cmake - shell: bash + - uses: actions/checkout@v4.1.6 - name: Install Abseil, GoogleTest and Benchmark run: | - apt update -y - apt install -y libabsl-dev libgtest-dev libbenchmark-dev + vcpkg update + vcpkg install abseil gtest benchmark shell: bash - - run: .github/cmake.sh -D BUILD_SHARED_LIBS=${{ matrix.build_shared_libs }} + - run: | + .github/cmake.sh -D BUILD_SHARED_LIBS=${{ matrix.build_shared_libs }} \ + -D CMAKE_TOOLCHAIN_FILE=/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake shell: bash build-macos: runs-on: macos-latest @@ -35,7 +29,7 @@ jobs: matrix: build_shared_libs: [OFF, ON] steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 - name: Install Abseil, GoogleTest and Benchmark run: | brew update @@ -50,7 +44,7 @@ jobs: matrix: build_shared_libs: [OFF, ON] steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 - name: Install Abseil, GoogleTest and Benchmark run: | vcpkg update diff --git a/yass/third_party/re2/.github/workflows/ci.yml b/yass/third_party/re2/.github/workflows/ci.yml index b83b4e52d4..9b5cb2ca6f 100644 --- a/yass/third_party/re2/.github/workflows/ci.yml +++ b/yass/third_party/re2/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: # (The other two flags are the default provided for CXXFLAGS in Makefile.) CXXFLAGS: -O3 -g -std=c++${{ matrix.ver }} steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 - name: Install Abseil, GoogleTest and Benchmark run: | brew update @@ -38,8 +38,9 @@ jobs: env: CC: clang-${{ matrix.ver }} CXX: clang++-${{ matrix.ver }} + PKG_CONFIG_PATH: /usr/local/share/vcpkg/installed/x64-linux/lib/pkgconfig steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 - name: Install Clang ${{ matrix.ver }} run: | # Avoid `Conflicts: python3-lldb-x.y` between packages. @@ -50,26 +51,28 @@ jobs: shell: bash - name: Install Abseil, GoogleTest and Benchmark run: | - sudo apt update -y - sudo apt install -y libabsl-dev libgtest-dev libbenchmark-dev + vcpkg update + vcpkg install abseil gtest benchmark shell: bash - run: make && make test shell: bash build-gcc: - runs-on: ubuntu-latest + # TODO(junyer): Switch back to `ubuntu-latest` when this becomes that. + runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: - ver: [11, 12, 13] + ver: [12, 13, 14] env: CC: gcc-${{ matrix.ver }} CXX: g++-${{ matrix.ver }} + PKG_CONFIG_PATH: /usr/local/share/vcpkg/installed/x64-linux/lib/pkgconfig steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 - name: Install Abseil, GoogleTest and Benchmark run: | - sudo apt update -y - sudo apt install -y libabsl-dev libgtest-dev libbenchmark-dev + vcpkg update + vcpkg install abseil gtest benchmark shell: bash - run: make && make test shell: bash diff --git a/yass/third_party/re2/.github/workflows/pages.yml b/yass/third_party/re2/.github/workflows/pages.yml index af2c45ddb8..297e897afc 100644 --- a/yass/third_party/re2/.github/workflows/pages.yml +++ b/yass/third_party/re2/.github/workflows/pages.yml @@ -17,8 +17,8 @@ jobs: # Bazel fails if the username is unknown. USER: runner steps: - - uses: actions/checkout@v4.1.4 - - uses: bazel-contrib/setup-bazel@0.8.2 + - uses: actions/checkout@v4.1.6 + - uses: bazel-contrib/setup-bazel@0.8.4 with: bazelisk-version: '1.x' - run: app/build.sh @@ -37,5 +37,5 @@ jobs: environment: github-pages runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 - uses: actions/deploy-pages@v4.0.5 diff --git a/yass/third_party/re2/.github/workflows/pr.yml b/yass/third_party/re2/.github/workflows/pr.yml index b8f94cdcba..af29512cd0 100644 --- a/yass/third_party/re2/.github/workflows/pr.yml +++ b/yass/third_party/re2/.github/workflows/pr.yml @@ -15,7 +15,7 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 - uses: actions/github-script@v7.0.1 with: script: | diff --git a/yass/third_party/re2/.github/workflows/python.yml b/yass/third_party/re2/.github/workflows/python.yml index 7607a2551c..b0f01644df 100644 --- a/yass/third_party/re2/.github/workflows/python.yml +++ b/yass/third_party/re2/.github/workflows/python.yml @@ -5,6 +5,10 @@ on: build: required: true type: number + force-sdist: + required: false + type: boolean + default: false permissions: contents: read jobs: @@ -31,11 +35,11 @@ jobs: # Bazel fails if the username is unknown. USER: runner steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 # Stash the timestamp for the commit SHA that triggered the workflow. - run: echo "timestamp=$(git log -1 --pretty=%ct)" >> "${GITHUB_ENV}" shell: bash - - uses: bazel-contrib/setup-bazel@0.8.2 + - uses: bazel-contrib/setup-bazel@0.8.4 with: bazelisk-version: '1.x' - name: Prepare Python ${{ matrix.ver }} environment @@ -87,11 +91,11 @@ jobs: # Otherwise, Python refuses to install the built wheel! SYSTEM_VERSION_COMPAT: 0 steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 # Stash the timestamp for the commit SHA that triggered the workflow. - run: echo "timestamp=$(git log -1 --pretty=%ct)" >> "${GITHUB_ENV}" shell: bash - - uses: bazel-contrib/setup-bazel@0.8.2 + - uses: bazel-contrib/setup-bazel@0.8.4 with: bazelisk-version: '1.x' - uses: actions/setup-python@v5.1.0 @@ -138,11 +142,11 @@ jobs: BAZEL_CPU: ${{ matrix.arch.bazel-name }}_windows PLAT_NAME: ${{ matrix.arch.python-name }} steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 # Stash the timestamp for the commit SHA that triggered the workflow. - run: echo "timestamp=$(git log -1 --pretty=%ct)" >> "${GITHUB_ENV}" shell: bash - - uses: bazel-contrib/setup-bazel@0.8.2 + - uses: bazel-contrib/setup-bazel@0.8.4 with: bazelisk-version: '1.x' # Lowercase the architecture name for `actions/setup-python`. @@ -190,7 +194,7 @@ jobs: id-token: write runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 # Stash the timestamp for the commit SHA that triggered the workflow. - run: echo "timestamp=$(git log -1 --pretty=%ct)" >> "${GITHUB_ENV}" shell: bash @@ -202,7 +206,7 @@ jobs: python -m pip install --upgrade pip python -m pip install --upgrade build wheel shell: bash - - if: inputs.build == 1 + - if: inputs.build == 1 || inputs.force-sdist == true name: Build source env: SOURCE_DATE_EPOCH: ${{ env.timestamp }} diff --git a/yass/third_party/re2/.github/workflows/release.yml b/yass/third_party/re2/.github/workflows/release.yml index 59bd537be0..25721ae053 100644 --- a/yass/third_party/re2/.github/workflows/release.yml +++ b/yass/third_party/re2/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4.1.6 - run: | gh release create "${GITHUB_REF_NAME}" \ --generate-notes --latest --verify-tag \ diff --git a/yass/third_party/re2/BUILD.bazel b/yass/third_party/re2/BUILD.bazel index a1664761fb..c765cfd516 100644 --- a/yass/third_party/re2/BUILD.bazel +++ b/yass/third_party/re2/BUILD.bazel @@ -42,7 +42,6 @@ cc_library( "re2/unicode_groups.cc", "re2/unicode_groups.h", "re2/walker-inl.h", - "util/logging.h", "util/rune.cc", "util/strutil.cc", "util/strutil.h", @@ -84,6 +83,9 @@ cc_library( "@abseil-cpp//absl/container:flat_hash_map", "@abseil-cpp//absl/container:flat_hash_set", "@abseil-cpp//absl/container:inlined_vector", + "@abseil-cpp//absl/hash", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", "@abseil-cpp//absl/strings", "@abseil-cpp//absl/strings:str_format", "@abseil-cpp//absl/synchronization", @@ -125,7 +127,6 @@ cc_library( "re2/unicode_casefold.h", "re2/unicode_groups.h", "re2/walker-inl.h", - "util/logging.h", "util/strutil.h", "util/utf.h", ], @@ -135,6 +136,8 @@ cc_library( "@abseil-cpp//absl/base", "@abseil-cpp//absl/base:core_headers", "@abseil-cpp//absl/flags:flag", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", "@abseil-cpp//absl/strings", "@abseil-cpp//absl/strings:str_format", "@googletest//:gtest", @@ -161,6 +164,9 @@ cc_test( deps = [ ":testing", "@abseil-cpp//absl/base:core_headers", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", + "@abseil-cpp//absl/strings", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -174,6 +180,8 @@ cc_test( ":re2", ":testing", "@abseil-cpp//absl/base:core_headers", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -186,6 +194,8 @@ cc_test( deps = [ ":testing", "@abseil-cpp//absl/base:core_headers", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -198,6 +208,8 @@ cc_test( deps = [ ":testing", "@abseil-cpp//absl/base:core_headers", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -211,6 +223,8 @@ cc_test( ":re2", ":testing", "@abseil-cpp//absl/base:core_headers", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", "@abseil-cpp//absl/strings", "@googletest//:gtest", "@googletest//:gtest_main", @@ -225,6 +239,9 @@ cc_test( ":re2", ":testing", "@abseil-cpp//absl/base:core_headers", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", + "@abseil-cpp//absl/types:optional", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -238,6 +255,9 @@ cc_test( ":re2", ":testing", "@abseil-cpp//absl/base:core_headers", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", + "@abseil-cpp//absl/strings", "@abseil-cpp//absl/strings:str_format", "@googletest//:gtest", "@googletest//:gtest_main", @@ -250,6 +270,8 @@ cc_test( srcs = ["re2/testing/regexp_test.cc"], deps = [ ":testing", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -262,6 +284,8 @@ cc_test( deps = [ ":testing", "@abseil-cpp//absl/base:core_headers", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -286,6 +310,8 @@ cc_test( deps = [ ":re2", ":testing", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -298,6 +324,8 @@ cc_test( deps = [ ":testing", "@abseil-cpp//absl/base:core_headers", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -309,6 +337,7 @@ cc_test( srcs = ["re2/testing/string_generator_test.cc"], deps = [ ":testing", + "@abseil-cpp//absl/strings", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -323,6 +352,9 @@ cc_test( ":testing", "@abseil-cpp//absl/base:core_headers", "@abseil-cpp//absl/flags:flag", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", + "@abseil-cpp//absl/strings", "@abseil-cpp//absl/strings:str_format", "@googletest//:gtest", "@googletest//:gtest_main", @@ -395,6 +427,9 @@ cc_binary( ":testing", "@abseil-cpp//absl/container:flat_hash_map", "@abseil-cpp//absl/flags:flag", + "@abseil-cpp//absl/log:absl_check", + "@abseil-cpp//absl/log:absl_log", + "@abseil-cpp//absl/strings", "@abseil-cpp//absl/strings:str_format", "@abseil-cpp//absl/synchronization", "@google_benchmark//:benchmark_main", diff --git a/yass/third_party/re2/CMakeLists.txt b/yass/third_party/re2/CMakeLists.txt index bdac5afd61..a2ade77a06 100644 --- a/yass/third_party/re2/CMakeLists.txt +++ b/yass/third_party/re2/CMakeLists.txt @@ -60,12 +60,15 @@ if(UNIX) endif() set(ABSL_DEPS + absl_absl_check + absl_absl_log absl_base absl_core_headers absl_fixed_array absl_flags absl_flat_hash_map absl_flat_hash_set + absl_hash absl_inlined_vector absl_optional absl_span @@ -150,7 +153,9 @@ if(UNIX) endif() foreach(dep ${ABSL_DEPS}) - string(REGEX REPLACE "^absl_" "absl::" dep ${dep}) + # Work around https://gitlab.kitware.com/cmake/cmake/-/issues/16899. >:( + string(PREPEND dep "^") + string(REGEX REPLACE "\\^absl_" "absl::" dep ${dep}) target_link_libraries(re2 PUBLIC ${dep}) endforeach() diff --git a/yass/third_party/re2/MODULE.bazel b/yass/third_party/re2/MODULE.bazel index 602097462a..995ebd1b5d 100644 --- a/yass/third_party/re2/MODULE.bazel +++ b/yass/third_party/re2/MODULE.bazel @@ -6,7 +6,7 @@ module( name = "re2", - version = "2024-05-01", + version = "2024-06-01", compatibility_level = 1, ) @@ -14,7 +14,7 @@ bazel_dep(name = "platforms", version = "0.0.10") bazel_dep(name = "apple_support", version = "1.15.1") bazel_dep(name = "rules_cc", version = "0.0.9") bazel_dep(name = "abseil-cpp", version = "20240116.2") -bazel_dep(name = "rules_python", version = "0.31.0") +bazel_dep(name = "rules_python", version = "0.32.2") bazel_dep(name = "pybind11_bazel", version = "2.12.0") # This is a temporary hack for `x64_x86_windows`. @@ -26,4 +26,4 @@ use_repo(cc_configure, "local_config_cc") # the root module (or when `--ignore_dev_dependency` is enabled). bazel_dep(name = "google_benchmark", version = "1.8.3", dev_dependency = True) bazel_dep(name = "googletest", version = "1.14.0.bcr.1", dev_dependency = True) -bazel_dep(name = "abseil-py", version = "1.4.0", dev_dependency = True) +bazel_dep(name = "abseil-py", version = "2.1.0", dev_dependency = True) diff --git a/yass/third_party/re2/Makefile b/yass/third_party/re2/Makefile index 65b52f6cab..e01529b2e1 100644 --- a/yass/third_party/re2/Makefile +++ b/yass/third_party/re2/Makefile @@ -4,12 +4,15 @@ # Build against Abseil. ABSL_DEPS=\ + absl_absl_check\ + absl_absl_log\ absl_base\ absl_core_headers\ absl_fixed_array\ absl_flags\ absl_flat_hash_map\ absl_flat_hash_set\ + absl_hash\ absl_inlined_vector\ absl_optional\ absl_span\ @@ -31,8 +34,8 @@ LDABSL=$(shell $(PKG_CONFIG) $(ABSL_DEPS) --libs | sed -e 's/-Wl / /g') # Build against GoogleTest and Benchmark for... testing and benchmarking. # Capture only the `-L` flags for now; we will pass the `-l` flags later. -CCGTEST=$(shell $(PKG_CONFIG) gtest --cflags) -LDGTEST=$(shell $(PKG_CONFIG) gtest --libs-only-L) +CCGTEST=$(shell $(PKG_CONFIG) gtest gtest_main --cflags) +LDGTEST=$(shell $(PKG_CONFIG) gtest gtest_main --libs-only-L) CCBENCHMARK=$(shell $(PKG_CONFIG) benchmark --cflags) LDBENCHMARK=$(shell $(PKG_CONFIG) benchmark --libs-only-L) @@ -113,7 +116,6 @@ INSTALL_HFILES=\ re2/stringpiece.h\ HFILES=\ - util/logging.h\ util/malloc_counter.h\ util/pcre.h\ util/strutil.h\ diff --git a/yass/third_party/re2/python/_re2.cc b/yass/third_party/re2/python/_re2.cc index 07e33cec21..22f092b230 100644 --- a/yass/third_party/re2/python/_re2.cc +++ b/yass/third_party/re2/python/_re2.cc @@ -2,15 +2,22 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +#include +#include + #include +#include #include #include #include #include -#include -#include #include "absl/strings/string_view.h" +#include "pybind11/buffer_info.h" +#include "pybind11/gil.h" +#include "pybind11/pybind11.h" +#include "pybind11/pytypes.h" +#include "pybind11/stl.h" // IWYU pragma: keep #include "re2/filtered_re2.h" #include "re2/re2.h" #include "re2/set.h" diff --git a/yass/third_party/re2/python/setup.py b/yass/third_party/re2/python/setup.py index 27782bf57b..7548c6ef61 100644 --- a/yass/third_party/re2/python/setup.py +++ b/yass/third_party/re2/python/setup.py @@ -192,7 +192,7 @@ ext_module = setuptools.Extension( setuptools.setup( name='google-re2', - version='1.1.20240501', + version='1.1.20240601', description='RE2 Python bindings', long_description=long_description, long_description_content_type='text/plain', diff --git a/yass/third_party/re2/re2/bitmap256.cc b/yass/third_party/re2/re2/bitmap256.cc index f6fbca3048..4b9eee4302 100644 --- a/yass/third_party/re2/re2/bitmap256.cc +++ b/yass/third_party/re2/re2/bitmap256.cc @@ -6,14 +6,14 @@ #include -#include "absl/base/macros.h" -#include "util/logging.h" +#include "absl/base/attributes.h" +#include "absl/log/absl_check.h" namespace re2 { int Bitmap256::FindNextSetBit(int c) const { - DCHECK_GE(c, 0); - DCHECK_LE(c, 255); + ABSL_DCHECK_GE(c, 0); + ABSL_DCHECK_LE(c, 255); // Check the word that contains the bit. Mask out any lower bits. int i = c / 64; diff --git a/yass/third_party/re2/re2/bitmap256.h b/yass/third_party/re2/re2/bitmap256.h index 293b31d85f..e16a570a51 100644 --- a/yass/third_party/re2/re2/bitmap256.h +++ b/yass/third_party/re2/re2/bitmap256.h @@ -5,13 +5,15 @@ #ifndef RE2_BITMAP256_H_ #define RE2_BITMAP256_H_ -#ifdef _MSC_VER -#include -#endif #include #include -#include "util/logging.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" + +#ifdef _MSC_VER +#include +#endif namespace re2 { @@ -28,16 +30,16 @@ class Bitmap256 { // Tests the bit with index c. bool Test(int c) const { - DCHECK_GE(c, 0); - DCHECK_LE(c, 255); + ABSL_DCHECK_GE(c, 0); + ABSL_DCHECK_LE(c, 255); return (words_[c / 64] & (uint64_t{1} << (c % 64))) != 0; } // Sets the bit with index c. void Set(int c) { - DCHECK_GE(c, 0); - DCHECK_LE(c, 255); + ABSL_DCHECK_GE(c, 0); + ABSL_DCHECK_LE(c, 255); words_[c / 64] |= (uint64_t{1} << (c % 64)); } @@ -49,7 +51,7 @@ class Bitmap256 { private: // Finds the least significant non-zero bit in n. static int FindLSBSet(uint64_t n) { - DCHECK_NE(n, 0); + ABSL_DCHECK_NE(n, 0); #if defined(__GNUC__) return __builtin_ctzll(n); #elif defined(_MSC_VER) && defined(_M_X64) diff --git a/yass/third_party/re2/re2/bitstate.cc b/yass/third_party/re2/re2/bitstate.cc index 38a0b87ccb..71f41c3838 100644 --- a/yass/third_party/re2/re2/bitstate.cc +++ b/yass/third_party/re2/re2/bitstate.cc @@ -20,10 +20,13 @@ #include #include #include + #include #include -#include "util/logging.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" +#include "absl/strings/string_view.h" #include "re2/pod_array.h" #include "re2/prog.h" #include "re2/regexp.h" @@ -107,9 +110,9 @@ void BitState::Push(int id, const char* p) { if (njob_ >= job_.size()) { GrowStack(); if (njob_ >= job_.size()) { - LOG(DFATAL) << "GrowStack() failed: " - << "njob_ = " << njob_ << ", " - << "job_.size() = " << job_.size(); + ABSL_LOG(DFATAL) << "GrowStack() failed: " + << "njob_ = " << njob_ << ", " + << "job_.size() = " << job_.size(); return; } } @@ -167,7 +170,7 @@ bool BitState::TrySearch(int id0, const char* p0) { Prog::Inst* ip = prog_->inst(id); switch (ip->opcode()) { default: - LOG(DFATAL) << "Unexpected opcode: " << ip->opcode(); + ABSL_LOG(DFATAL) << "Unexpected opcode: " << ip->opcode(); return false; case kInstFail: @@ -233,7 +236,7 @@ bool BitState::TrySearch(int id0, const char* p0) { CheckAndLoop: // Sanity check: id is the head of its list, which must // be the case if id-1 is the last of *its* list. :) - DCHECK(id == 0 || prog_->inst(id-1)->last()); + ABSL_DCHECK(id == 0 || prog_->inst(id-1)->last()); if (ShouldVisit(id, p)) goto Loop; break; diff --git a/yass/third_party/re2/re2/compile.cc b/yass/third_party/re2/re2/compile.cc index aa798872e4..95c1b32ddf 100644 --- a/yass/third_party/re2/re2/compile.cc +++ b/yass/third_party/re2/re2/compile.cc @@ -10,17 +10,20 @@ #include #include + +#include #include -#include "absl/base/macros.h" #include "absl/container/flat_hash_map.h" -#include "util/logging.h" -#include "util/utf.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" +#include "absl/strings/string_view.h" #include "re2/pod_array.h" #include "re2/prog.h" #include "re2/re2.h" #include "re2/regexp.h" #include "re2/walker-inl.h" +#include "util/utf.h" namespace re2 { @@ -522,8 +525,8 @@ void Compiler::AddSuffix(int id) { } int Compiler::AddSuffixRecursive(int root, int id) { - DCHECK(inst_[root].opcode() == kInstAlt || - inst_[root].opcode() == kInstByteRange); + ABSL_DCHECK(inst_[root].opcode() == kInstAlt || + inst_[root].opcode() == kInstByteRange); Frag f = FindByteRange(root, id); if (IsNoMatch(f)) { @@ -565,7 +568,7 @@ int Compiler::AddSuffixRecursive(int root, int id) { if (!IsCachedRuneByteSuffix(id)) { // The head should be the instruction most recently allocated, so free it // instead of leaving it unreachable. - DCHECK_EQ(id, ninst_-1); + ABSL_DCHECK_EQ(id, ninst_-1); inst_[id].out_opcode_ = 0; inst_[id].out1_ = 0; ninst_--; @@ -613,7 +616,7 @@ Frag Compiler::FindByteRange(int root, int id) { return NoMatch(); } - LOG(DFATAL) << "should never happen"; + ABSL_LOG(DFATAL) << "should never happen"; return NoMatch(); } @@ -738,7 +741,7 @@ void Compiler::AddRuneRangeUTF8(Rune lo, Rune hi, bool foldcase) { int n = runetochar(reinterpret_cast(ulo), &lo); int m = runetochar(reinterpret_cast(uhi), &hi); (void)m; // USED(m) - DCHECK_EQ(n, m); + ABSL_DCHECK_EQ(n, m); // The logic below encodes this thinking: // @@ -791,7 +794,7 @@ void Compiler::AddRuneRangeUTF8(Rune lo, Rune hi, bool foldcase) { Frag Compiler::Copy(Frag arg) { // We're using WalkExponential; there should be no copying. failed_ = true; - LOG(DFATAL) << "Compiler::Copy called!"; + ABSL_LOG(DFATAL) << "Compiler::Copy called!"; return NoMatch(); } @@ -918,7 +921,7 @@ Frag Compiler::PostVisit(Regexp* re, Frag, Frag, Frag* child_frags, if (cc->empty()) { // This can't happen. failed_ = true; - LOG(DFATAL) << "No ranges in char class"; + ABSL_LOG(DFATAL) << "No ranges in char class"; return NoMatch(); } @@ -976,7 +979,7 @@ Frag Compiler::PostVisit(Regexp* re, Frag, Frag, Frag* child_frags, return EmptyWidth(kEmptyNonWordBoundary); } failed_ = true; - LOG(DFATAL) << "Missing case in Compiler: " << re->op(); + ABSL_LOG(DFATAL) << "Missing case in Compiler: " << re->op(); return NoMatch(); } diff --git a/yass/third_party/re2/re2/dfa.cc b/yass/third_party/re2/re2/dfa.cc index e35fcb2819..1619614ea6 100644 --- a/yass/third_party/re2/re2/dfa.cc +++ b/yass/third_party/re2/re2/dfa.cc @@ -25,28 +25,32 @@ #include #include #include + #include #include #include -#include +#include #include #include #include +#include "absl/base/attributes.h" #include "absl/base/call_once.h" -#include "absl/base/macros.h" #include "absl/base/thread_annotations.h" #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h" +#include "absl/hash/hash.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" +#include "absl/strings/string_view.h" #include "absl/synchronization/mutex.h" #include "absl/types/span.h" -#include "util/logging.h" -#include "util/strutil.h" #include "re2/pod_array.h" #include "re2/prog.h" #include "re2/re2.h" #include "re2/sparse_set.h" +#include "util/strutil.h" // Silence "zero-sized array in struct/union" warning for DFA::State::next_. #ifdef _MSC_VER @@ -149,15 +153,15 @@ class DFA { struct StateHash { size_t operator()(const State* a) const { - DCHECK(a != NULL); + ABSL_DCHECK(a != NULL); return absl::Hash()(*a); } }; struct StateEqual { bool operator()(const State* a, const State* b) const { - DCHECK(a != NULL); - DCHECK(b != NULL); + ABSL_DCHECK(a != NULL); + ABSL_DCHECK(b != NULL); return *a == *b; } }; @@ -659,7 +663,7 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { break; } } - DCHECK_LE(n, q->size()); + ABSL_DCHECK_LE(n, q->size()); if (n > 0 && inst[n-1] == Mark) n--; @@ -847,7 +851,7 @@ void DFA::AddToQueue(Workq* q, int id, uint32_t flag) { stk[nstk++] = id; while (nstk > 0) { - DCHECK_LE(nstk, stack_.size()); + ABSL_DCHECK_LE(nstk, stack_.size()); id = stk[--nstk]; Loop: @@ -872,7 +876,7 @@ void DFA::AddToQueue(Workq* q, int id, uint32_t flag) { Prog::Inst* ip = prog_->inst(id); switch (ip->opcode()) { default: - LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); + ABSL_LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); break; case kInstByteRange: // just save these on the queue @@ -898,7 +902,7 @@ void DFA::AddToQueue(Workq* q, int id, uint32_t flag) { goto Loop; case kInstAltMatch: - DCHECK(!ip->last()); + ABSL_DCHECK(!ip->last()); id = id+1; goto Loop; @@ -961,7 +965,7 @@ void DFA::RunWorkqOnByte(Workq* oldq, Workq* newq, Prog::Inst* ip = prog_->inst(id); switch (ip->opcode()) { default: - LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); + ABSL_LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); break; case kInstFail: // never succeeds @@ -1029,14 +1033,14 @@ DFA::State* DFA::RunStateOnByte(State* state, int c) { return FullMatchState; } if (state == DeadState) { - LOG(DFATAL) << "DeadState in RunStateOnByte"; + ABSL_LOG(DFATAL) << "DeadState in RunStateOnByte"; return NULL; } if (state == NULL) { - LOG(DFATAL) << "NULL state in RunStateOnByte"; + ABSL_LOG(DFATAL) << "NULL state in RunStateOnByte"; return NULL; } - LOG(DFATAL) << "Unexpected special state in RunStateOnByte"; + ABSL_LOG(DFATAL) << "Unexpected special state in RunStateOnByte"; return NULL; } @@ -1267,7 +1271,7 @@ DFA::State* DFA::StateSaver::Restore() { absl::MutexLock l(&dfa_->mutex_); State* s = dfa_->CachedState(inst_, ninst_, flag_); if (s == NULL) - LOG(DFATAL) << "StateSaver failed to restore state."; + ABSL_LOG(DFATAL) << "StateSaver failed to restore state."; return s; } @@ -1451,13 +1455,13 @@ inline bool DFA::InlinedSearchLoop(SearchParams* params) { // Restore start and s so we can continue. if ((start = save_start.Restore()) == NULL || (s = save_s.Restore()) == NULL) { - // Restore already did LOG(DFATAL). + // Restore already did ABSL_LOG(DFATAL). params->failed = true; return false; } ns = RunStateOnByteUnlocked(s, c); if (ns == NULL) { - LOG(DFATAL) << "RunStateOnByteUnlocked failed after ResetCache"; + ABSL_LOG(DFATAL) << "RunStateOnByteUnlocked failed after ResetCache"; params->failed = true; return false; } @@ -1529,7 +1533,7 @@ inline bool DFA::InlinedSearchLoop(SearchParams* params) { } ns = RunStateOnByteUnlocked(s, lastbyte); if (ns == NULL) { - LOG(DFATAL) << "RunStateOnByteUnlocked failed after Reset"; + ABSL_LOG(DFATAL) << "RunStateOnByteUnlocked failed after Reset"; params->failed = true; return false; } @@ -1646,7 +1650,7 @@ bool DFA::AnalyzeSearch(SearchParams* params) { // Sanity check: make sure that text lies within context. if (BeginPtr(text) < BeginPtr(context) || EndPtr(text) > EndPtr(context)) { - LOG(DFATAL) << "context does not contain text"; + ABSL_LOG(DFATAL) << "context does not contain text"; params->start = DeadState; return true; } @@ -1694,7 +1698,7 @@ bool DFA::AnalyzeSearch(SearchParams* params) { ResetCache(params->cache_lock); if (!AnalyzeSearchHelper(params, info, flags)) { params->failed = true; - LOG(DFATAL) << "Failed to analyze start state."; + ABSL_LOG(DFATAL) << "Failed to analyze start state."; return false; } } @@ -1768,7 +1772,7 @@ bool DFA::Search(absl::string_view text, absl::string_view context, params.want_earliest_match = want_earliest_match; params.run_forward = run_forward; // matches should be null except when using RE2::Set. - DCHECK(matches == NULL || kind_ == Prog::kManyMatch); + ABSL_DCHECK(matches == NULL || kind_ == Prog::kManyMatch); params.matches = matches; if (!AnalyzeSearch(¶ms)) { diff --git a/yass/third_party/re2/re2/filtered_re2.cc b/yass/third_party/re2/re2/filtered_re2.cc index 1ce26a38e0..f0995a10b3 100644 --- a/yass/third_party/re2/re2/filtered_re2.cc +++ b/yass/third_party/re2/re2/filtered_re2.cc @@ -5,10 +5,13 @@ #include "re2/filtered_re2.h" #include + #include #include +#include -#include "util/logging.h" +#include "absl/log/absl_log.h" +#include "absl/strings/string_view.h" #include "re2/prefilter.h" #include "re2/prefilter_tree.h" @@ -52,8 +55,8 @@ RE2::ErrorCode FilteredRE2::Add(absl::string_view pattern, if (!re->ok()) { if (options.log_errors()) { - LOG(ERROR) << "Couldn't compile regular expression, skipping: " - << pattern << " due to error " << re->error(); + ABSL_LOG(ERROR) << "Couldn't compile regular expression, skipping: " + << pattern << " due to error " << re->error(); } delete re; } else { @@ -66,7 +69,7 @@ RE2::ErrorCode FilteredRE2::Add(absl::string_view pattern, void FilteredRE2::Compile(std::vector* atoms) { if (compiled_) { - LOG(ERROR) << "Compile called already."; + ABSL_LOG(ERROR) << "Compile called already."; return; } @@ -95,7 +98,7 @@ int FilteredRE2::SlowFirstMatch(absl::string_view text) const { int FilteredRE2::FirstMatch(absl::string_view text, const std::vector& atoms) const { if (!compiled_) { - LOG(DFATAL) << "FirstMatch called before Compile."; + ABSL_LOG(DFATAL) << "FirstMatch called before Compile."; return -1; } std::vector regexps; diff --git a/yass/third_party/re2/re2/fuzzing/re2_fuzzer.cc b/yass/third_party/re2/re2/fuzzing/re2_fuzzer.cc index 9a7af08a7f..8a8c2acc87 100644 --- a/yass/third_party/re2/re2/fuzzing/re2_fuzzer.cc +++ b/yass/third_party/re2/re2/fuzzing/re2_fuzzer.cc @@ -5,10 +5,12 @@ #include #include #include + #include #include #include +#include "absl/strings/string_view.h" #include "re2/filtered_re2.h" #include "re2/re2.h" #include "re2/regexp.h" diff --git a/yass/third_party/re2/re2/mimics_pcre.cc b/yass/third_party/re2/re2/mimics_pcre.cc index ac0c69d7e7..1724063667 100644 --- a/yass/third_party/re2/re2/mimics_pcre.cc +++ b/yass/third_party/re2/re2/mimics_pcre.cc @@ -22,7 +22,7 @@ // // Regexp::MimicsPCRE checks for any of these conditions. -#include "util/logging.h" +#include "absl/log/absl_log.h" #include "re2/regexp.h" #include "re2/walker-inl.h" @@ -44,7 +44,7 @@ class PCREWalker : public Regexp::Walker { virtual bool ShortVisit(Regexp* re, bool a) { // Should never be called: we use Walk(), not WalkExponential(). #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - LOG(DFATAL) << "PCREWalker::ShortVisit called"; + ABSL_LOG(DFATAL) << "PCREWalker::ShortVisit called"; #endif return a; } @@ -128,7 +128,7 @@ class EmptyStringWalker : public Regexp::Walker { virtual bool ShortVisit(Regexp* re, bool a) { // Should never be called: we use Walk(), not WalkExponential(). #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - LOG(DFATAL) << "EmptyStringWalker::ShortVisit called"; + ABSL_LOG(DFATAL) << "EmptyStringWalker::ShortVisit called"; #endif return a; } diff --git a/yass/third_party/re2/re2/nfa.cc b/yass/third_party/re2/re2/nfa.cc index a655884d70..a35976f250 100644 --- a/yass/third_party/re2/re2/nfa.cc +++ b/yass/third_party/re2/re2/nfa.cc @@ -26,14 +26,16 @@ #include #include + #include #include #include #include -#include +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" -#include "util/logging.h" +#include "absl/strings/string_view.h" #include "re2/pod_array.h" #include "re2/prog.h" #include "re2/regexp.h" @@ -172,17 +174,17 @@ NFA::Thread* NFA::AllocThread() { } NFA::Thread* NFA::Incref(Thread* t) { - DCHECK(t != NULL); + ABSL_DCHECK(t != NULL); t->ref++; return t; } void NFA::Decref(Thread* t) { - DCHECK(t != NULL); + ABSL_DCHECK(t != NULL); t->ref--; if (t->ref > 0) return; - DCHECK_EQ(t->ref, 0); + ABSL_DCHECK_EQ(t->ref, 0); t->next = freelist_; freelist_ = t; } @@ -208,7 +210,7 @@ void NFA::AddToThreadq(Threadq* q, int id0, int c, absl::string_view context, stk[nstk++] = {id0, NULL}; while (nstk > 0) { - DCHECK_LE(nstk, stack_.size()); + ABSL_DCHECK_LE(nstk, stack_.size()); AddState a = stk[--nstk]; Loop: @@ -238,7 +240,7 @@ void NFA::AddToThreadq(Threadq* q, int id0, int c, absl::string_view context, Prog::Inst* ip = prog_->inst(id); switch (ip->opcode()) { default: - LOG(DFATAL) << "unhandled " << ip->opcode() << " in AddToThreadq"; + ABSL_LOG(DFATAL) << "unhandled " << ip->opcode() << " in AddToThreadq"; break; case kInstFail: @@ -249,7 +251,7 @@ void NFA::AddToThreadq(Threadq* q, int id0, int c, absl::string_view context, t = Incref(t0); *tp = t; - DCHECK(!ip->last()); + ABSL_DCHECK(!ip->last()); a = {id+1, NULL}; goto Loop; @@ -350,7 +352,7 @@ int NFA::Step(Threadq* runq, Threadq* nextq, int c, absl::string_view context, switch (ip->opcode()) { default: // Should only see the values handled below. - LOG(DFATAL) << "Unhandled " << ip->opcode() << " in step"; + ABSL_LOG(DFATAL) << "Unhandled " << ip->opcode() << " in step"; break; case kInstByteRange: @@ -455,7 +457,7 @@ bool NFA::Search(absl::string_view text, absl::string_view context, // Sanity check: make sure that text lies within context. if (BeginPtr(text) < BeginPtr(context) || EndPtr(text) > EndPtr(context)) { - LOG(DFATAL) << "context does not contain text"; + ABSL_LOG(DFATAL) << "context does not contain text"; return false; } @@ -470,7 +472,7 @@ bool NFA::Search(absl::string_view text, absl::string_view context, } if (nsubmatch < 0) { - LOG(DFATAL) << "Bad args: nsubmatch=" << nsubmatch; + ABSL_LOG(DFATAL) << "Bad args: nsubmatch=" << nsubmatch; return false; } @@ -527,7 +529,7 @@ bool NFA::Search(absl::string_view text, absl::string_view context, // This is a no-op the first time around the loop because runq is empty. int id = Step(runq, nextq, p < etext_ ? p[0] & 0xFF : -1, context, p); - DCHECK_EQ(runq->size(), 0); + ABSL_DCHECK_EQ(runq->size(), 0); using std::swap; swap(nextq, runq); nextq->clear(); @@ -538,7 +540,8 @@ bool NFA::Search(absl::string_view text, absl::string_view context, Prog::Inst* ip = prog_->inst(id); switch (ip->opcode()) { default: - LOG(DFATAL) << "Unexpected opcode in short circuit: " << ip->opcode(); + ABSL_LOG(DFATAL) << "Unexpected opcode in short circuit: " + << ip->opcode(); break; case kInstCapture: @@ -599,7 +602,7 @@ bool NFA::Search(absl::string_view text, absl::string_view context, // This complements the special case in NFA::Step(). if (p == NULL) { (void) Step(runq, nextq, -1, context, p); - DCHECK_EQ(runq->size(), 0); + ABSL_DCHECK_EQ(runq->size(), 0); using std::swap; swap(nextq, runq); nextq->clear(); @@ -655,7 +658,7 @@ bool Prog::SearchNFA(absl::string_view text, absl::string_view context, // fanout holds the results and is also the work queue for the outer iteration. // reachable holds the reached nodes for the inner iteration. void Prog::Fanout(SparseArray* fanout) { - DCHECK_EQ(fanout->max_size(), size()); + ABSL_DCHECK_EQ(fanout->max_size(), size()); SparseSet reachable(size()); fanout->clear(); fanout->set_new(start(), 0); @@ -668,7 +671,8 @@ void Prog::Fanout(SparseArray* fanout) { Prog::Inst* ip = inst(id); switch (ip->opcode()) { default: - LOG(DFATAL) << "unhandled " << ip->opcode() << " in Prog::Fanout()"; + ABSL_LOG(DFATAL) << "unhandled " << ip->opcode() + << " in Prog::Fanout()"; break; case kInstByteRange: @@ -682,7 +686,7 @@ void Prog::Fanout(SparseArray* fanout) { break; case kInstAltMatch: - DCHECK(!ip->last()); + ABSL_DCHECK(!ip->last()); reachable.insert(id+1); break; diff --git a/yass/third_party/re2/re2/onepass.cc b/yass/third_party/re2/re2/onepass.cc index 7931cf911e..fb7f69431c 100644 --- a/yass/third_party/re2/re2/onepass.cc +++ b/yass/third_party/re2/re2/onepass.cc @@ -52,19 +52,21 @@ #include #include + #include #include #include -#include #include "absl/container/fixed_array.h" #include "absl/container/inlined_vector.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" -#include "util/logging.h" -#include "util/utf.h" +#include "absl/strings/string_view.h" #include "re2/pod_array.h" #include "re2/prog.h" #include "re2/sparse_set.h" +#include "util/utf.h" // Silence "zero-sized array in struct/union" warning for OneState::action. #ifdef _MSC_VER @@ -215,7 +217,7 @@ bool Prog::SearchOnePass(absl::string_view text, absl::string_view context, Anchor anchor, MatchKind kind, absl::string_view* match, int nmatch) { if (anchor != kAnchored && kind != kFullMatch) { - LOG(DFATAL) << "Cannot use SearchOnePass for unanchored matches."; + ABSL_LOG(DFATAL) << "Cannot use SearchOnePass for unanchored matches."; return false; } @@ -442,13 +444,13 @@ bool Prog::IsOnePass() { Prog::Inst* ip = inst(id); switch (ip->opcode()) { default: - LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); + ABSL_LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); break; case kInstAltMatch: // TODO(rsc): Ignoring kInstAltMatch optimization. // Should implement it in this engine, but it's subtle. - DCHECK(!ip->last()); + ABSL_DCHECK(!ip->last()); // If already on work queue, (1) is violated: bail out. if (!AddQ(&workq, id+1)) goto fail; @@ -460,7 +462,7 @@ bool Prog::IsOnePass() { if (nextindex == -1) { if (nalloc >= maxnodes) { if (ExtraDebug) - LOG(ERROR) << absl::StrFormat( + ABSL_LOG(ERROR) << absl::StrFormat( "Not OnePass: hit node limit %d >= %d", nalloc, maxnodes); goto fail; } @@ -485,7 +487,7 @@ bool Prog::IsOnePass() { node->action[b] = newact; } else if (act != newact) { if (ExtraDebug) - LOG(ERROR) << absl::StrFormat( + ABSL_LOG(ERROR) << absl::StrFormat( "Not OnePass: conflict on byte %#x at state %d", c, *it); goto fail; } @@ -506,7 +508,7 @@ bool Prog::IsOnePass() { node->action[b] = newact; } else if (act != newact) { if (ExtraDebug) - LOG(ERROR) << absl::StrFormat( + ABSL_LOG(ERROR) << absl::StrFormat( "Not OnePass: conflict on byte %#x at state %d", c, *it); goto fail; } @@ -547,7 +549,7 @@ bool Prog::IsOnePass() { // If already on work queue, (1) is violated: bail out. if (!AddQ(&workq, ip->out())) { if (ExtraDebug) - LOG(ERROR) << absl::StrFormat( + ABSL_LOG(ERROR) << absl::StrFormat( "Not OnePass: multiple paths %d -> %d", *it, ip->out()); goto fail; } @@ -558,7 +560,7 @@ bool Prog::IsOnePass() { if (matched) { // (3) is violated if (ExtraDebug) - LOG(ERROR) << absl::StrFormat( + ABSL_LOG(ERROR) << absl::StrFormat( "Not OnePass: multiple matches from %d", *it); goto fail; } @@ -579,9 +581,9 @@ bool Prog::IsOnePass() { } } - if (ExtraDebug) { // For debugging, dump one-pass NFA to LOG(ERROR). - LOG(ERROR) << "bytemap:\n" << DumpByteMap(); - LOG(ERROR) << "prog:\n" << Dump(); + if (ExtraDebug) { // For debugging, dump one-pass NFA to ABSL_LOG(ERROR). + ABSL_LOG(ERROR) << "bytemap:\n" << DumpByteMap(); + ABSL_LOG(ERROR) << "prog:\n" << Dump(); std::map idmap; for (int i = 0; i < size; i++) @@ -606,7 +608,7 @@ bool Prog::IsOnePass() { idmap[node->action[i] >> kIndexShift]); } } - LOG(ERROR) << "nodes:\n" << dump; + ABSL_LOG(ERROR) << "nodes:\n" << dump; } dfa_mem_ -= nalloc*statesize; diff --git a/yass/third_party/re2/re2/parse.cc b/yass/third_party/re2/re2/parse.cc index 2558b2a2e4..6f7a5612fa 100644 --- a/yass/third_party/re2/re2/parse.cc +++ b/yass/third_party/re2/re2/parse.cc @@ -16,24 +16,25 @@ // and recognizes the Perl escape sequences \d, \s, \w, \D, \S, and \W. // See regexp.h for rationale. -#include #include #include #include + #include -#include #include #include +#include "absl/base/attributes.h" #include "absl/base/macros.h" +#include "absl/log/absl_log.h" #include "absl/strings/ascii.h" -#include "util/logging.h" -#include "util/utf.h" +#include "absl/strings/string_view.h" #include "re2/pod_array.h" #include "re2/regexp.h" #include "re2/unicode_casefold.h" #include "re2/unicode_groups.h" #include "re2/walker-inl.h" +#include "util/utf.h" #if defined(RE2_USE_ICU) #include "unicode/uniset.h" @@ -360,7 +361,7 @@ static void AddFoldedRange(CharClassBuilder* cc, Rune lo, Rune hi, int depth) { // current Unicode tables. make_unicode_casefold.py checks that // the cycles are not too long, and we double-check here using depth. if (depth > 10) { - LOG(DFATAL) << "AddFoldedRange recurses too much."; + ABSL_LOG(DFATAL) << "AddFoldedRange recurses too much."; return; } @@ -579,7 +580,7 @@ int RepetitionWalker::PostVisit(Regexp* re, int parent_arg, int pre_arg, int RepetitionWalker::ShortVisit(Regexp* re, int parent_arg) { // Should never be called: we use Walk(), not WalkExponential(). #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - LOG(DFATAL) << "RepetitionWalker::ShortVisit called"; + ABSL_LOG(DFATAL) << "RepetitionWalker::ShortVisit called"; #endif return 0; } @@ -867,7 +868,7 @@ void Regexp::RemoveLeadingString(Regexp* re, int n) { case 0: case 1: // Impossible. - LOG(DFATAL) << "Concat of " << re->nsub(); + ABSL_LOG(DFATAL) << "Concat of " << re->nsub(); re->submany_ = NULL; re->op_ = kRegexpEmptyMatch; break; @@ -997,7 +998,7 @@ int Regexp::FactorAlternation(Regexp** sub, int nsub, ParseFlags flags) { i += iter->nsub; break; default: - LOG(DFATAL) << "unknown round: " << round; + ABSL_LOG(DFATAL) << "unknown round: " << round; break; } // If we are done, copy until the end of sub. @@ -1036,7 +1037,7 @@ int Regexp::FactorAlternation(Regexp** sub, int nsub, ParseFlags flags) { continue; } default: - LOG(DFATAL) << "unknown round: " << round; + ABSL_LOG(DFATAL) << "unknown round: " << round; break; } @@ -1213,8 +1214,8 @@ void FactorAlternationImpl::Round3(Regexp** sub, int nsub, ccb.AddRangeFlags(re->rune(), re->rune(), re->parse_flags()); } } else { - LOG(DFATAL) << "RE2: unexpected op: " << re->op() << " " - << re->ToString(); + ABSL_LOG(DFATAL) << "RE2: unexpected op: " << re->op() << " " + << re->ToString(); } re->Decref(); } @@ -1475,7 +1476,7 @@ static int UnHex(int c) { return c - 'A' + 10; if ('a' <= c && c <= 'f') return c - 'a' + 10; - LOG(DFATAL) << "Bad hex digit " << c; + ABSL_LOG(DFATAL) << "Bad hex digit " << c; return 0; } @@ -2095,7 +2096,7 @@ bool Regexp::ParseState::ParsePerlFlags(absl::string_view* s) { // Caller is supposed to check this. if (!(flags_ & PerlX) || t.size() < 2 || t[0] != '(' || t[1] != '?') { status_->set_code(kRegexpInternalError); - LOG(DFATAL) << "Bad call to ParseState::ParsePerlFlags"; + ABSL_LOG(DFATAL) << "Bad call to ParseState::ParsePerlFlags"; return false; } diff --git a/yass/third_party/re2/re2/prefilter.cc b/yass/third_party/re2/re2/prefilter.cc index 3c7886f834..decc412ba6 100644 --- a/yass/third_party/re2/re2/prefilter.cc +++ b/yass/third_party/re2/re2/prefilter.cc @@ -5,17 +5,19 @@ #include "re2/prefilter.h" #include -#include + #include #include #include +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" -#include "util/logging.h" -#include "util/utf.h" #include "re2/re2.h" +#include "re2/regexp.h" #include "re2/unicode_casefold.h" #include "re2/walker-inl.h" +#include "util/utf.h" namespace re2 { @@ -300,8 +302,8 @@ void Prefilter::CrossProduct(const SSet& a, const SSet& b, SSet* dst) { Prefilter::Info* Prefilter::Info::Concat(Info* a, Info* b) { if (a == NULL) return b; - DCHECK(a->is_exact_); - DCHECK(b && b->is_exact_); + ABSL_DCHECK(a->is_exact_); + ABSL_DCHECK(b && b->is_exact_); Info *ab = new Info(); CrossProduct(a->exact_, b->exact_, &ab->exact_); @@ -450,9 +452,9 @@ typedef CharClass::iterator CCIter; Prefilter::Info* Prefilter::Info::CClass(CharClass *cc, bool latin1) { if (ExtraDebug) { - LOG(ERROR) << "CharClassInfo:"; + ABSL_LOG(ERROR) << "CharClassInfo:"; for (CCIter i = cc->begin(); i != cc->end(); ++i) - LOG(ERROR) << " " << i->lo << "-" << i->hi; + ABSL_LOG(ERROR) << " " << i->lo << "-" << i->hi; } // If the class is too large, it's okay to overestimate. @@ -473,7 +475,7 @@ Prefilter::Info* Prefilter::Info::CClass(CharClass *cc, a->is_exact_ = true; if (ExtraDebug) - LOG(ERROR) << " = " << a->ToString(); + ABSL_LOG(ERROR) << " = " << a->ToString(); return a; } @@ -501,7 +503,7 @@ class Prefilter::Info::Walker : public Regexp::Walker { Prefilter::Info* Prefilter::BuildInfo(Regexp* re) { if (ExtraDebug) - LOG(ERROR) << "BuildPrefilter::Info: " << re->ToString(); + ABSL_LOG(ERROR) << "BuildPrefilter::Info: " << re->ToString(); bool latin1 = (re->parse_flags() & Regexp::Latin1) != 0; Prefilter::Info::Walker w(latin1); @@ -531,7 +533,7 @@ Prefilter::Info* Prefilter::Info::Walker::PostVisit( default: case kRegexpRepeat: info = EmptyString(); - LOG(DFATAL) << "Bad regexp op " << re->op(); + ABSL_LOG(DFATAL) << "Bad regexp op " << re->op(); break; case kRegexpNoMatch: @@ -634,8 +636,8 @@ Prefilter::Info* Prefilter::Info::Walker::PostVisit( } if (ExtraDebug) - LOG(ERROR) << "BuildInfo " << re->ToString() - << ": " << (info ? info->ToString() : ""); + ABSL_LOG(ERROR) << "BuildInfo " << re->ToString() + << ": " << (info ? info->ToString() : ""); return info; } @@ -662,7 +664,7 @@ Prefilter* Prefilter::FromRegexp(Regexp* re) { std::string Prefilter::DebugString() const { switch (op_) { default: - LOG(DFATAL) << "Bad op in Prefilter::DebugString: " << op_; + ABSL_LOG(DFATAL) << "Bad op in Prefilter::DebugString: " << op_; return absl::StrFormat("op%d", op_); case NONE: return "*no-matches*"; diff --git a/yass/third_party/re2/re2/prefilter.h b/yass/third_party/re2/re2/prefilter.h index 018691dcd6..2645790cf0 100644 --- a/yass/third_party/re2/re2/prefilter.h +++ b/yass/third_party/re2/re2/prefilter.h @@ -13,7 +13,8 @@ #include #include -#include "util/logging.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" namespace re2 { @@ -42,7 +43,7 @@ class Prefilter { // The children of the Prefilter node. std::vector* subs() { - DCHECK(op_ == AND || op_ == OR); + ABSL_DCHECK(op_ == AND || op_ == OR); return subs_; } diff --git a/yass/third_party/re2/re2/prefilter_tree.cc b/yass/third_party/re2/re2/prefilter_tree.cc index 299a680fbd..0a7bea9841 100644 --- a/yass/third_party/re2/re2/prefilter_tree.cc +++ b/yass/third_party/re2/re2/prefilter_tree.cc @@ -5,17 +5,17 @@ #include "re2/prefilter_tree.h" #include + #include #include -#include #include #include #include +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" -#include "util/logging.h" #include "re2/prefilter.h" -#include "re2/re2.h" namespace re2 { @@ -38,7 +38,7 @@ PrefilterTree::~PrefilterTree() { void PrefilterTree::Add(Prefilter* prefilter) { if (compiled_) { - LOG(DFATAL) << "Add called after Compile."; + ABSL_LOG(DFATAL) << "Add called after Compile."; return; } if (prefilter != NULL && !KeepNode(prefilter)) { @@ -51,7 +51,7 @@ void PrefilterTree::Add(Prefilter* prefilter) { void PrefilterTree::Compile(std::vector* atom_vec) { if (compiled_) { - LOG(DFATAL) << "Compile called already."; + ABSL_LOG(DFATAL) << "Compile called already."; return; } @@ -83,7 +83,7 @@ bool PrefilterTree::KeepNode(Prefilter* node) const { switch (node->op()) { default: - LOG(DFATAL) << "Unexpected op in KeepNode: " << node->op(); + ABSL_LOG(DFATAL) << "Unexpected op in KeepNode: " << node->op(); return false; case Prefilter::ALL: @@ -178,7 +178,7 @@ void PrefilterTree::AssignUniqueIds(NodeSet* nodes, int id = prefilter->unique_id(); switch (prefilter->op()) { default: - LOG(DFATAL) << "Unexpected op: " << prefilter->op(); + ABSL_LOG(DFATAL) << "Unexpected op: " << prefilter->op(); return; case Prefilter::ATOM: @@ -212,7 +212,7 @@ void PrefilterTree::AssignUniqueIds(NodeSet* nodes, if (prefilter_vec_[i] == NULL) continue; int id = CanonicalNode(nodes, prefilter_vec_[i])->unique_id(); - DCHECK_LE(0, id); + ABSL_DCHECK_LE(0, id); Entry* entry = &entries_[id]; entry->regexps.push_back(static_cast(i)); } @@ -277,7 +277,7 @@ void PrefilterTree::RegexpsGivenStrings( return; } - LOG(ERROR) << "RegexpsGivenStrings called before Compile."; + ABSL_LOG(ERROR) << "RegexpsGivenStrings called before Compile."; for (size_t i = 0; i < prefilter_vec_.size(); i++) regexps->push_back(static_cast(i)); } else { @@ -331,31 +331,31 @@ void PrefilterTree::PropagateMatch(const std::vector& atom_ids, // Debugging help. void PrefilterTree::PrintPrefilter(int regexpid) { - LOG(ERROR) << DebugNodeString(prefilter_vec_[regexpid]); + ABSL_LOG(ERROR) << DebugNodeString(prefilter_vec_[regexpid]); } void PrefilterTree::PrintDebugInfo(NodeSet* nodes) { - LOG(ERROR) << "#Unique Atoms: " << atom_index_to_id_.size(); - LOG(ERROR) << "#Unique Nodes: " << entries_.size(); + ABSL_LOG(ERROR) << "#Unique Atoms: " << atom_index_to_id_.size(); + ABSL_LOG(ERROR) << "#Unique Nodes: " << entries_.size(); for (size_t i = 0; i < entries_.size(); i++) { const std::vector& parents = entries_[i].parents; const std::vector& regexps = entries_[i].regexps; - LOG(ERROR) << "EntryId: " << i - << " N: " << parents.size() << " R: " << regexps.size(); + ABSL_LOG(ERROR) << "EntryId: " << i + << " N: " << parents.size() << " R: " << regexps.size(); for (int parent : parents) - LOG(ERROR) << parent; + ABSL_LOG(ERROR) << parent; } - LOG(ERROR) << "Set:"; + ABSL_LOG(ERROR) << "Set:"; for (NodeSet::const_iterator iter = nodes->begin(); iter != nodes->end(); ++iter) - LOG(ERROR) << "NodeId: " << (*iter)->unique_id(); + ABSL_LOG(ERROR) << "NodeId: " << (*iter)->unique_id(); } std::string PrefilterTree::DebugNodeString(Prefilter* node) const { std::string node_string = ""; if (node->op() == Prefilter::ATOM) { - DCHECK(!node->atom().empty()); + ABSL_DCHECK(!node->atom().empty()); node_string += node->atom(); } else { // Adding the operation disambiguates AND and OR nodes. diff --git a/yass/third_party/re2/re2/prefilter_tree.h b/yass/third_party/re2/re2/prefilter_tree.h index 71e7a294f9..885170df8a 100644 --- a/yass/third_party/re2/re2/prefilter_tree.h +++ b/yass/third_party/re2/re2/prefilter_tree.h @@ -20,9 +20,10 @@ #include #include "absl/container/flat_hash_set.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "re2/prefilter.h" #include "re2/sparse_array.h" -#include "util/logging.h" namespace re2 { @@ -62,15 +63,15 @@ class PrefilterTree { struct PrefilterHash { size_t operator()(const Prefilter* a) const { - DCHECK(a != NULL); + ABSL_DCHECK(a != NULL); return absl::Hash()(*a); } }; struct PrefilterEqual { bool operator()(const Prefilter* a, const Prefilter* b) const { - DCHECK(a != NULL); - DCHECK(b != NULL); + ABSL_DCHECK(a != NULL); + ABSL_DCHECK(b != NULL); return *a == *b; } }; diff --git a/yass/third_party/re2/re2/prog.cc b/yass/third_party/re2/re2/prog.cc index 6cadcfa83b..d3ff26eff3 100644 --- a/yass/third_party/re2/re2/prog.cc +++ b/yass/third_party/re2/re2/prog.cc @@ -7,35 +7,43 @@ #include "re2/prog.h" +#include +#include + +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" +#include "absl/strings/str_format.h" +#include "absl/strings/string_view.h" +#include "re2/bitmap256.h" +#include "re2/pod_array.h" +#include "re2/sparse_array.h" +#include "re2/sparse_set.h" + #if defined(__AVX2__) #include #ifdef _MSC_VER #include #endif #endif -#include -#include -#include -#include -#include - -#include "absl/base/macros.h" -#include "absl/strings/str_format.h" -#include "util/logging.h" -#include "re2/bitmap256.h" namespace re2 { // Constructors per Inst opcode void Prog::Inst::InitAlt(uint32_t out, uint32_t out1) { - DCHECK_EQ(out_opcode_, 0); + ABSL_DCHECK_EQ(out_opcode_, 0); set_out_opcode(out, kInstAlt); out1_ = out1; } void Prog::Inst::InitByteRange(int lo, int hi, int foldcase, uint32_t out) { - DCHECK_EQ(out_opcode_, 0); + ABSL_DCHECK_EQ(out_opcode_, 0); set_out_opcode(out, kInstByteRange); lo_ = lo & 0xFF; hi_ = hi & 0xFF; @@ -43,30 +51,30 @@ void Prog::Inst::InitByteRange(int lo, int hi, int foldcase, uint32_t out) { } void Prog::Inst::InitCapture(int cap, uint32_t out) { - DCHECK_EQ(out_opcode_, 0); + ABSL_DCHECK_EQ(out_opcode_, 0); set_out_opcode(out, kInstCapture); cap_ = cap; } void Prog::Inst::InitEmptyWidth(EmptyOp empty, uint32_t out) { - DCHECK_EQ(out_opcode_, 0); + ABSL_DCHECK_EQ(out_opcode_, 0); set_out_opcode(out, kInstEmptyWidth); empty_ = empty; } void Prog::Inst::InitMatch(int32_t id) { - DCHECK_EQ(out_opcode_, 0); + ABSL_DCHECK_EQ(out_opcode_, 0); set_opcode(kInstMatch); match_id_ = id; } void Prog::Inst::InitNop(uint32_t out) { - DCHECK_EQ(out_opcode_, 0); + ABSL_DCHECK_EQ(out_opcode_, 0); set_opcode(kInstNop); } void Prog::Inst::InitFail() { - DCHECK_EQ(out_opcode_, 0); + ABSL_DCHECK_EQ(out_opcode_, 0); set_opcode(kInstFail); } @@ -198,7 +206,7 @@ static bool IsMatch(Prog* prog, Prog::Inst* ip) { for (;;) { switch (ip->opcode()) { default: - LOG(DFATAL) << "Unexpected opcode in IsMatch: " << ip->opcode(); + ABSL_LOG(DFATAL) << "Unexpected opcode in IsMatch: " << ip->opcode(); return false; case kInstAlt: @@ -362,11 +370,11 @@ class ByteMapBuilder { }; void ByteMapBuilder::Mark(int lo, int hi) { - DCHECK_GE(lo, 0); - DCHECK_GE(hi, 0); - DCHECK_LE(lo, 255); - DCHECK_LE(hi, 255); - DCHECK_LE(lo, hi); + ABSL_DCHECK_GE(lo, 0); + ABSL_DCHECK_GE(hi, 0); + ABSL_DCHECK_LE(lo, 255); + ABSL_DCHECK_LE(hi, 255); + ABSL_DCHECK_LE(lo, hi); // Ignore any [0-255] ranges. They cause us to recolor every range, which // has no effect on the eventual result and is therefore a waste of time. @@ -511,7 +519,7 @@ void Prog::ComputeByteMap() { builder.Build(bytemap_, &bytemap_range_); if ((0)) { // For debugging, use trivial bytemap. - LOG(ERROR) << "Using trivial bytemap."; + ABSL_LOG(ERROR) << "Using trivial bytemap."; for (int i = 0; i < 256; i++) bytemap_[i] = static_cast(i); bytemap_range_ = 256; @@ -615,12 +623,12 @@ void Prog::Flatten() { size_t total = 0; for (int i = 0; i < kNumInst; i++) total += inst_count_[i]; - CHECK_EQ(total, flat.size()); + ABSL_CHECK_EQ(total, flat.size()); #endif // Remap start_unanchored and start. if (start_unanchored() == 0) { - DCHECK_EQ(start(), 0); + ABSL_DCHECK_EQ(start(), 0); } else if (start_unanchored() == start()) { set_start_unanchored(flatmap[1]); set_start(flatmap[1]); @@ -677,7 +685,7 @@ void Prog::MarkSuccessors(SparseArray* rootmap, Inst* ip = inst(id); switch (ip->opcode()) { default: - LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); + ABSL_LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); break; case kInstAltMatch: @@ -737,7 +745,7 @@ void Prog::MarkDominator(int root, SparseArray* rootmap, Inst* ip = inst(id); switch (ip->opcode()) { default: - LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); + ABSL_LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); break; case kInstAltMatch: @@ -804,7 +812,7 @@ void Prog::EmitList(int root, SparseArray* rootmap, Inst* ip = inst(id); switch (ip->opcode()) { default: - LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); + ABSL_LOG(DFATAL) << "unhandled opcode: " << ip->opcode(); break; case kInstAltMatch: @@ -1105,7 +1113,7 @@ const void* Prog::PrefixAccel_ShiftDFA(const void* data, size_t size) { #if defined(__AVX2__) // Finds the least significant non-zero bit in n. static int FindLSBSet(uint32_t n) { - DCHECK_NE(n, 0); + ABSL_DCHECK_NE(n, 0); #if defined(__GNUC__) return __builtin_ctz(n); #elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) @@ -1127,7 +1135,7 @@ static int FindLSBSet(uint32_t n) { #endif const void* Prog::PrefixAccel_FrontAndBack(const void* data, size_t size) { - DCHECK_GE(prefix_size_, 2); + ABSL_DCHECK_GE(prefix_size_, 2); if (size < prefix_size_) return NULL; // Don't bother searching the last prefix_size_-1 bytes for prefix_front_. @@ -1164,7 +1172,7 @@ const void* Prog::PrefixAccel_FrontAndBack(const void* data, size_t size) { const char* p0 = reinterpret_cast(data); for (const char* p = p0;; p++) { - DCHECK_GE(size, static_cast(p-p0)); + ABSL_DCHECK_GE(size, static_cast(p-p0)); p = reinterpret_cast(memchr(p, prefix_front_, size - (p-p0))); if (p == NULL || p[prefix_size_-1] == prefix_back_) return p; diff --git a/yass/third_party/re2/re2/prog.h b/yass/third_party/re2/re2/prog.h index 41923f3142..d0889bdca7 100644 --- a/yass/third_party/re2/re2/prog.h +++ b/yass/third_party/re2/re2/prog.h @@ -10,14 +10,16 @@ // expression symbolically. #include + #include #include -#include #include +#include #include "absl/base/call_once.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/string_view.h" -#include "util/logging.h" #include "re2/pod_array.h" #include "re2/re2.h" #include "re2/sparse_array.h" @@ -79,20 +81,44 @@ class Prog { // Getters int id(Prog* p) { return static_cast(this - p->inst_.data()); } - InstOp opcode() { return static_cast(out_opcode_&7); } - int last() { return (out_opcode_>>3)&1; } - int out() { return out_opcode_>>4; } - int out1() { DCHECK(opcode() == kInstAlt || opcode() == kInstAltMatch); return out1_; } - int cap() { DCHECK_EQ(opcode(), kInstCapture); return cap_; } - int lo() { DCHECK_EQ(opcode(), kInstByteRange); return lo_; } - int hi() { DCHECK_EQ(opcode(), kInstByteRange); return hi_; } - int foldcase() { DCHECK_EQ(opcode(), kInstByteRange); return hint_foldcase_&1; } - int hint() { DCHECK_EQ(opcode(), kInstByteRange); return hint_foldcase_>>1; } - int match_id() { DCHECK_EQ(opcode(), kInstMatch); return match_id_; } - EmptyOp empty() { DCHECK_EQ(opcode(), kInstEmptyWidth); return empty_; } + InstOp opcode() { return static_cast(out_opcode_ & 7); } + int last() { return (out_opcode_ >> 3) & 1; } + int out() { return out_opcode_ >> 4; } + int out1() { + ABSL_DCHECK(opcode() == kInstAlt || opcode() == kInstAltMatch); + return out1_; + } + int cap() { + ABSL_DCHECK_EQ(opcode(), kInstCapture); + return cap_; + } + int lo() { + ABSL_DCHECK_EQ(opcode(), kInstByteRange); + return lo_; + } + int hi() { + ABSL_DCHECK_EQ(opcode(), kInstByteRange); + return hi_; + } + int foldcase() { + ABSL_DCHECK_EQ(opcode(), kInstByteRange); + return hint_foldcase_ & 1; + } + int hint() { + ABSL_DCHECK_EQ(opcode(), kInstByteRange); + return hint_foldcase_ >> 1; + } + int match_id() { + ABSL_DCHECK_EQ(opcode(), kInstMatch); + return match_id_; + } + EmptyOp empty() { + ABSL_DCHECK_EQ(opcode(), kInstEmptyWidth); + return empty_; + } bool greedy(Prog* p) { - DCHECK_EQ(opcode(), kInstAltMatch); + ABSL_DCHECK_EQ(opcode(), kInstAltMatch); return p->inst(out())->opcode() == kInstByteRange || (p->inst(out())->opcode() == kInstNop && p->inst(p->inst(out())->out())->opcode() == kInstByteRange); @@ -100,7 +126,7 @@ class Prog { // Does this inst (an kInstByteRange) match c? inline bool Matches(int c) { - DCHECK_EQ(opcode(), kInstByteRange); + ABSL_DCHECK_EQ(opcode(), kInstByteRange); if (foldcase() && 'A' <= c && c <= 'Z') c += 'a' - 'A'; return lo_ <= c && c <= hi_; @@ -221,7 +247,7 @@ class Prog { // Accelerates to the first likely occurrence of the prefix. // Returns a pointer to the first byte or NULL if not found. const void* PrefixAccel(const void* data, size_t size) { - DCHECK(can_prefix_accel()); + ABSL_DCHECK(can_prefix_accel()); if (prefix_foldcase_) { return PrefixAccel_ShiftDFA(data, size); } else if (prefix_size_ != 1) { diff --git a/yass/third_party/re2/re2/re2.cc b/yass/third_party/re2/re2/re2.cc index 61d9d1f0c0..2e25b64f33 100644 --- a/yass/third_party/re2/re2/re2.cc +++ b/yass/third_party/re2/re2/re2.cc @@ -9,31 +9,36 @@ #include "re2/re2.h" -#include #include -#ifdef _MSC_VER -#include -#endif +#include #include #include #include + #include #include -#include +#include #include #include #include +#include "absl/base/call_once.h" #include "absl/base/macros.h" #include "absl/container/fixed_array.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/ascii.h" #include "absl/strings/str_format.h" -#include "util/logging.h" -#include "util/strutil.h" -#include "util/utf.h" +#include "absl/strings/string_view.h" #include "re2/prog.h" #include "re2/regexp.h" #include "re2/sparse_array.h" +#include "util/strutil.h" +#include "util/utf.h" + +#ifdef _MSC_VER +#include +#endif namespace re2 { @@ -158,7 +163,7 @@ int RE2::Options::ParseFlags() const { switch (encoding()) { default: if (log_errors()) - LOG(ERROR) << "Unknown encoding " << encoding(); + ABSL_LOG(ERROR) << "Unknown encoding " << encoding(); break; case RE2::Options::EncodingUTF8: break; @@ -229,8 +234,8 @@ void RE2::Init(absl::string_view pattern, const Options& options) { &status); if (entire_regexp_ == NULL) { if (options_.log_errors()) { - LOG(ERROR) << "Error parsing '" << trunc(*pattern_) << "': " - << status.Text(); + ABSL_LOG(ERROR) << "Error parsing '" << trunc(*pattern_) << "': " + << status.Text(); } error_ = new std::string(status.Text()); error_code_ = RegexpErrorToRE2(status.code()); @@ -254,7 +259,7 @@ void RE2::Init(absl::string_view pattern, const Options& options) { prog_ = suffix_regexp_->CompileToProg(options_.max_mem()*2/3); if (prog_ == NULL) { if (options_.log_errors()) - LOG(ERROR) << "Error compiling '" << trunc(*pattern_) << "'"; + ABSL_LOG(ERROR) << "Error compiling '" << trunc(*pattern_) << "'"; error_ = new std::string("pattern too large - compile failed"); error_code_ = RE2::ErrorPatternTooLarge; return; @@ -280,8 +285,8 @@ re2::Prog* RE2::ReverseProg() const { re->suffix_regexp_->CompileToReverseProg(re->options_.max_mem() / 3); if (re->rprog_ == NULL) { if (re->options_.log_errors()) - LOG(ERROR) << "Error reverse compiling '" << trunc(*re->pattern_) - << "'"; + ABSL_LOG(ERROR) << "Error reverse compiling '" << trunc(*re->pattern_) + << "'"; // We no longer touch error_ and error_code_ because failing to compile // the reverse Prog is not a showstopper: falling back to NFA execution // is fine. More importantly, an RE2 object is supposed to be logically @@ -327,7 +332,7 @@ int RE2::ReverseProgramSize() const { // Finds the most significant non-zero bit in n. static int FindMSBSet(uint32_t n) { - DCHECK_NE(n, 0); + ABSL_DCHECK_NE(n, 0); #if defined(__GNUC__) return 31 ^ __builtin_clz(n); #elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) @@ -453,8 +458,8 @@ bool RE2::Replace(std::string* str, if (!re.Rewrite(&s, rewrite, vec, nvec)) return false; - DCHECK_GE(vec[0].data(), str->data()); - DCHECK_LE(vec[0].data() + vec[0].size(), str->data() + str->size()); + ABSL_DCHECK_GE(vec[0].data(), str->data()); + ABSL_DCHECK_LE(vec[0].data() + vec[0].size(), str->data() + str->size()); str->replace(vec[0].data() - str->data(), vec[0].size(), s); return true; } @@ -653,16 +658,16 @@ bool RE2::Match(absl::string_view text, int nsubmatch) const { if (!ok()) { if (options_.log_errors()) - LOG(ERROR) << "Invalid RE2: " << *error_; + ABSL_LOG(ERROR) << "Invalid RE2: " << *error_; return false; } if (startpos > endpos || endpos > text.size()) { if (options_.log_errors()) - LOG(ERROR) << "RE2: invalid startpos, endpos pair. [" - << "startpos: " << startpos << ", " - << "endpos: " << endpos << ", " - << "text size: " << text.size() << "]"; + ABSL_LOG(ERROR) << "RE2: invalid startpos, endpos pair. [" + << "startpos: " << startpos << ", " + << "endpos: " << endpos << ", " + << "text size: " << text.size() << "]"; return false; } @@ -732,7 +737,7 @@ bool RE2::Match(absl::string_view text, bool skipped_test = false; switch (re_anchor) { default: - LOG(DFATAL) << "Unexpected re_anchor value: " << re_anchor; + ABSL_LOG(DFATAL) << "Unexpected re_anchor value: " << re_anchor; return false; case UNANCHORED: { @@ -750,11 +755,11 @@ bool RE2::Match(absl::string_view text, Prog::kLongestMatch, matchp, &dfa_failed, NULL)) { if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: " - << "pattern length " << pattern_->size() << ", " - << "program size " << prog->size() << ", " - << "list count " << prog->list_count() << ", " - << "bytemap range " << prog->bytemap_range(); + ABSL_LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog->size() << ", " + << "list count " << prog->list_count() << ", " + << "bytemap range " << prog->bytemap_range(); // Fall back to NFA below. skipped_test = true; break; @@ -770,11 +775,11 @@ bool RE2::Match(absl::string_view text, matchp, &dfa_failed, NULL)) { if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: " - << "pattern length " << pattern_->size() << ", " - << "program size " << prog_->size() << ", " - << "list count " << prog_->list_count() << ", " - << "bytemap range " << prog_->bytemap_range(); + ABSL_LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog_->size() << ", " + << "list count " << prog_->list_count() << ", " + << "bytemap range " << prog_->bytemap_range(); // Fall back to NFA below. skipped_test = true; break; @@ -796,17 +801,17 @@ bool RE2::Match(absl::string_view text, Prog::kLongestMatch, &match, &dfa_failed, NULL)) { if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: " - << "pattern length " << pattern_->size() << ", " - << "program size " << prog->size() << ", " - << "list count " << prog->list_count() << ", " - << "bytemap range " << prog->bytemap_range(); + ABSL_LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog->size() << ", " + << "list count " << prog->list_count() << ", " + << "bytemap range " << prog->bytemap_range(); // Fall back to NFA below. skipped_test = true; break; } if (options_.log_errors()) - LOG(ERROR) << "SearchDFA inconsistency"; + ABSL_LOG(ERROR) << "SearchDFA inconsistency"; return false; } break; @@ -839,11 +844,11 @@ bool RE2::Match(absl::string_view text, &match, &dfa_failed, NULL)) { if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: " - << "pattern length " << pattern_->size() << ", " - << "program size " << prog_->size() << ", " - << "list count " << prog_->list_count() << ", " - << "bytemap range " << prog_->bytemap_range(); + ABSL_LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog_->size() << ", " + << "list count " << prog_->list_count() << ", " + << "bytemap range " << prog_->bytemap_range(); // Fall back to NFA below. skipped_test = true; break; @@ -875,20 +880,20 @@ bool RE2::Match(absl::string_view text, if (can_one_pass && anchor != Prog::kUnanchored) { if (!prog_->SearchOnePass(subtext1, text, anchor, kind, submatch, ncap)) { if (!skipped_test && options_.log_errors()) - LOG(ERROR) << "SearchOnePass inconsistency"; + ABSL_LOG(ERROR) << "SearchOnePass inconsistency"; return false; } } else if (can_bit_state && subtext1.size() <= bit_state_text_max_size) { if (!prog_->SearchBitState(subtext1, text, anchor, kind, submatch, ncap)) { if (!skipped_test && options_.log_errors()) - LOG(ERROR) << "SearchBitState inconsistency"; + ABSL_LOG(ERROR) << "SearchBitState inconsistency"; return false; } } else { if (!prog_->SearchNFA(subtext1, text, anchor, kind, submatch, ncap)) { if (!skipped_test && options_.log_errors()) - LOG(ERROR) << "SearchNFA inconsistency"; + ABSL_LOG(ERROR) << "SearchNFA inconsistency"; return false; } } @@ -913,7 +918,7 @@ bool RE2::DoMatch(absl::string_view text, int n) const { if (!ok()) { if (options_.log_errors()) - LOG(ERROR) << "Invalid RE2: " << *error_; + ABSL_LOG(ERROR) << "Invalid RE2: " << *error_; return false; } @@ -1033,8 +1038,8 @@ bool RE2::Rewrite(std::string* out, int n = (c - '0'); if (n >= veclen) { if (options_.log_errors()) { - LOG(ERROR) << "invalid substitution \\" << n - << " from " << veclen << " groups"; + ABSL_LOG(ERROR) << "invalid substitution \\" << n + << " from " << veclen << " groups"; } return false; } @@ -1045,7 +1050,7 @@ bool RE2::Rewrite(std::string* out, out->push_back('\\'); } else { if (options_.log_errors()) - LOG(ERROR) << "invalid rewrite pattern: " << rewrite.data(); + ABSL_LOG(ERROR) << "invalid rewrite pattern: " << rewrite.data(); return false; } } diff --git a/yass/third_party/re2/re2/re2.h b/yass/third_party/re2/re2/re2.h index 13bf39fbe7..d797bc0404 100644 --- a/yass/third_party/re2/re2/re2.h +++ b/yass/third_party/re2/re2/re2.h @@ -50,10 +50,10 @@ // supplied pattern exactly. // // Example: successful match -// CHECK(RE2::FullMatch("hello", "h.*o")); +// ABSL_CHECK(RE2::FullMatch("hello", "h.*o")); // // Example: unsuccessful match (requires full match): -// CHECK(!RE2::FullMatch("hello", "e")); +// ABSL_CHECK(!RE2::FullMatch("hello", "e")); // // ----------------------------------------------------------------------- // UTF-8 AND THE MATCHING INTERFACE: @@ -62,8 +62,9 @@ // The RE2::Latin1 option causes them to be interpreted as Latin-1. // // Example: -// CHECK(RE2::FullMatch(utf8_string, RE2(utf8_pattern))); -// CHECK(RE2::FullMatch(latin1_string, RE2(latin1_pattern, RE2::Latin1))); +// ABSL_CHECK(RE2::FullMatch(utf8_string, RE2(utf8_pattern))); +// ABSL_CHECK(RE2::FullMatch(latin1_string, RE2(latin1_pattern, +// RE2::Latin1))); // // ----------------------------------------------------------------------- // SUBMATCH EXTRACTION: @@ -83,27 +84,27 @@ // Example: extracts "ruby" into "s" and 1234 into "i" // int i; // std::string s; -// CHECK(RE2::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s, &i)); +// ABSL_CHECK(RE2::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s, &i)); // // Example: extracts "ruby" into "s" and no value into "i" // absl::optional i; // std::string s; -// CHECK(RE2::FullMatch("ruby", "(\\w+)(?::(\\d+))?", &s, &i)); +// ABSL_CHECK(RE2::FullMatch("ruby", "(\\w+)(?::(\\d+))?", &s, &i)); // // Example: fails because string cannot be stored in integer -// CHECK(!RE2::FullMatch("ruby", "(.*)", &i)); +// ABSL_CHECK(!RE2::FullMatch("ruby", "(.*)", &i)); // // Example: fails because there aren't enough sub-patterns -// CHECK(!RE2::FullMatch("ruby:1234", "\\w+:\\d+", &s)); +// ABSL_CHECK(!RE2::FullMatch("ruby:1234", "\\w+:\\d+", &s)); // // Example: does not try to extract any extra sub-patterns -// CHECK(RE2::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s)); +// ABSL_CHECK(RE2::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s)); // // Example: does not try to extract into NULL -// CHECK(RE2::FullMatch("ruby:1234", "(\\w+):(\\d+)", NULL, &i)); +// ABSL_CHECK(RE2::FullMatch("ruby:1234", "(\\w+):(\\d+)", NULL, &i)); // // Example: integer overflow causes failure -// CHECK(!RE2::FullMatch("ruby:1234567891234", "\\w+:(\\d+)", &i)); +// ABSL_CHECK(!RE2::FullMatch("ruby:1234567891234", "\\w+:(\\d+)", &i)); // // NOTE(rsc): Asking for submatches slows successful matches quite a bit. // This may get a little faster in the future, but right now is slower @@ -117,12 +118,12 @@ // to match any substring of the text. // // Example: simple search for a string: -// CHECK(RE2::PartialMatch("hello", "ell")); +// ABSL_CHECK(RE2::PartialMatch("hello", "ell")); // // Example: find first number in a string // int number; -// CHECK(RE2::PartialMatch("x*100 + 20", "(\\d+)", &number)); -// CHECK_EQ(number, 100); +// ABSL_CHECK(RE2::PartialMatch("x*100 + 20", "(\\d+)", &number)); +// ABSL_CHECK_EQ(number, 100); // // ----------------------------------------------------------------------- // PRE-COMPILED REGULAR EXPRESSIONS @@ -203,27 +204,28 @@ // // Example: // int a, b, c, d; -// CHECK(RE2::FullMatch("100 40 0100 0x40", "(.*) (.*) (.*) (.*)", +// ABSL_CHECK(RE2::FullMatch("100 40 0100 0x40", "(.*) (.*) (.*) (.*)", // RE2::Octal(&a), RE2::Hex(&b), RE2::CRadix(&c), RE2::CRadix(&d)); // will leave 64 in a, b, c, and d. #include #include + #include #include #include #include #include -#if defined(__APPLE__) -#include -#endif - #include "absl/base/call_once.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "re2/stringpiece.h" +#if defined(__APPLE__) +#include +#endif + namespace re2 { class Prog; class Regexp; @@ -469,7 +471,7 @@ class RE2 { // text. E.g., // // std::string s = "yabba dabba doo"; - // CHECK(RE2::Replace(&s, "b+", "d")); + // ABSL_CHECK(RE2::Replace(&s, "b+", "d")); // // will leave "s" containing "yada dabba doo" // @@ -483,7 +485,7 @@ class RE2 { // of the pattern in the string with the rewrite. E.g. // // std::string s = "yabba dabba doo"; - // CHECK(RE2::GlobalReplace(&s, "b+", "d")); + // ABSL_CHECK(RE2::GlobalReplace(&s, "b+", "d")); // // will leave "s" containing "yada dada doo" // Replacements are not subject to re-matching. diff --git a/yass/third_party/re2/re2/regexp.cc b/yass/third_party/re2/re2/regexp.cc index 4ea81cfcdc..1e5ae9071d 100644 --- a/yass/third_party/re2/re2/regexp.cc +++ b/yass/third_party/re2/re2/regexp.cc @@ -10,6 +10,7 @@ #include #include #include + #include #include #include @@ -18,11 +19,12 @@ #include "absl/base/call_once.h" #include "absl/base/macros.h" #include "absl/container/flat_hash_map.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/synchronization/mutex.h" -#include "util/logging.h" -#include "util/utf.h" #include "re2/pod_array.h" #include "re2/walker-inl.h" +#include "util/utf.h" namespace re2 { @@ -45,7 +47,7 @@ Regexp::Regexp(RegexpOp op, ParseFlags parse_flags) // required Decref() to have handled them for us. Regexp::~Regexp() { if (nsub_ > 0) - LOG(DFATAL) << "Regexp not destroyed."; + ABSL_LOG(DFATAL) << "Regexp not destroyed."; switch (op_) { default: @@ -154,7 +156,7 @@ void Regexp::Destroy() { Regexp* re = stack; stack = re->down_; if (re->ref_ != 0) - LOG(DFATAL) << "Bad reference count " << re->ref_; + ABSL_LOG(DFATAL) << "Bad reference count " << re->ref_; if (re->nsub_ > 0) { Regexp** subs = re->sub(); for (int i = 0; i < re->nsub_; i++) { @@ -179,7 +181,7 @@ void Regexp::Destroy() { } void Regexp::AddRuneToString(Rune r) { - DCHECK(op_ == kRegexpLiteralString); + ABSL_DCHECK(op_ == kRegexpLiteralString); if (nrunes_ == 0) { // start with 8 runes_ = new Rune[8]; @@ -421,7 +423,7 @@ static bool TopEqual(Regexp* a, Regexp* b) { } } - LOG(DFATAL) << "Unexpected op in Regexp::Equal: " << a->op(); + ABSL_LOG(DFATAL) << "Unexpected op in Regexp::Equal: " << a->op(); return 0; } @@ -496,7 +498,7 @@ bool Regexp::Equal(Regexp* a, Regexp* b) { if (n == 0) break; - DCHECK_GE(n, 2); + ABSL_DCHECK_GE(n, 2); a = stk[n-2]; b = stk[n-1]; stk.resize(n-2); @@ -562,7 +564,7 @@ class NumCapturesWalker : public Regexp::Walker { virtual Ignored ShortVisit(Regexp* re, Ignored ignored) { // Should never be called: we use Walk(), not WalkExponential(). #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - LOG(DFATAL) << "NumCapturesWalker::ShortVisit called"; + ABSL_LOG(DFATAL) << "NumCapturesWalker::ShortVisit called"; #endif return ignored; } @@ -609,7 +611,7 @@ class NamedCapturesWalker : public Regexp::Walker { virtual Ignored ShortVisit(Regexp* re, Ignored ignored) { // Should never be called: we use Walk(), not WalkExponential(). #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - LOG(DFATAL) << "NamedCapturesWalker::ShortVisit called"; + ABSL_LOG(DFATAL) << "NamedCapturesWalker::ShortVisit called"; #endif return ignored; } @@ -653,7 +655,7 @@ class CaptureNamesWalker : public Regexp::Walker { virtual Ignored ShortVisit(Regexp* re, Ignored ignored) { // Should never be called: we use Walk(), not WalkExponential(). #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - LOG(DFATAL) << "CaptureNamesWalker::ShortVisit called"; + ABSL_LOG(DFATAL) << "CaptureNamesWalker::ShortVisit called"; #endif return ignored; } @@ -993,7 +995,7 @@ CharClass* CharClassBuilder::GetCharClass() { for (iterator it = begin(); it != end(); ++it) cc->ranges_[n++] = *it; cc->nranges_ = n; - DCHECK_LE(n, static_cast(ranges_.size())); + ABSL_DCHECK_LE(n, static_cast(ranges_.size())); cc->nrunes_ = nrunes_; cc->folds_ascii_ = FoldsASCII(); return cc; diff --git a/yass/third_party/re2/re2/regexp.h b/yass/third_party/re2/re2/regexp.h index df4989479a..531b42044b 100644 --- a/yass/third_party/re2/re2/regexp.h +++ b/yass/third_party/re2/re2/regexp.h @@ -88,12 +88,14 @@ #include #include + #include #include #include +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/string_view.h" -#include "util/logging.h" #include "util/utf.h" namespace re2 { @@ -332,15 +334,42 @@ class Regexp { return submany_; } - int min() { DCHECK_EQ(op_, kRegexpRepeat); return min_; } - int max() { DCHECK_EQ(op_, kRegexpRepeat); return max_; } - Rune rune() { DCHECK_EQ(op_, kRegexpLiteral); return rune_; } - CharClass* cc() { DCHECK_EQ(op_, kRegexpCharClass); return cc_; } - int cap() { DCHECK_EQ(op_, kRegexpCapture); return cap_; } - const std::string* name() { DCHECK_EQ(op_, kRegexpCapture); return name_; } - Rune* runes() { DCHECK_EQ(op_, kRegexpLiteralString); return runes_; } - int nrunes() { DCHECK_EQ(op_, kRegexpLiteralString); return nrunes_; } - int match_id() { DCHECK_EQ(op_, kRegexpHaveMatch); return match_id_; } + int min() { + ABSL_DCHECK_EQ(op_, kRegexpRepeat); + return min_; + } + int max() { + ABSL_DCHECK_EQ(op_, kRegexpRepeat); + return max_; + } + Rune rune() { + ABSL_DCHECK_EQ(op_, kRegexpLiteral); + return rune_; + } + CharClass* cc() { + ABSL_DCHECK_EQ(op_, kRegexpCharClass); + return cc_; + } + int cap() { + ABSL_DCHECK_EQ(op_, kRegexpCapture); + return cap_; + } + const std::string* name() { + ABSL_DCHECK_EQ(op_, kRegexpCapture); + return name_; + } + Rune* runes() { + ABSL_DCHECK_EQ(op_, kRegexpLiteralString); + return runes_; + } + int nrunes() { + ABSL_DCHECK_EQ(op_, kRegexpLiteralString); + return nrunes_; + } + int match_id() { + ABSL_DCHECK_EQ(op_, kRegexpHaveMatch); + return match_id_; + } // Increments reference count, returns object as convenience. Regexp* Incref(); @@ -515,7 +544,7 @@ class Regexp { // Allocate space for n sub-regexps. void AllocSub(int n) { - DCHECK(n >= 0 && static_cast(n) == n); + ABSL_DCHECK(n >= 0 && static_cast(n) == n); if (n > 1) submany_ = new Regexp*[n]; nsub_ = static_cast(n); diff --git a/yass/third_party/re2/re2/set.cc b/yass/third_party/re2/re2/set.cc index b9c918e077..caebd24e4e 100644 --- a/yass/third_party/re2/re2/set.cc +++ b/yass/third_party/re2/re2/set.cc @@ -5,15 +5,20 @@ #include "re2/set.h" #include + #include #include +#include #include +#include -#include "util/logging.h" +#include "absl/log/absl_log.h" +#include "absl/strings/string_view.h" #include "re2/pod_array.h" #include "re2/prog.h" #include "re2/re2.h" #include "re2/regexp.h" +#include "re2/sparse_set.h" namespace re2 { @@ -52,7 +57,7 @@ RE2::Set& RE2::Set::operator=(Set&& other) { int RE2::Set::Add(absl::string_view pattern, std::string* error) { if (compiled_) { - LOG(DFATAL) << "RE2::Set::Add() called after compiling"; + ABSL_LOG(DFATAL) << "RE2::Set::Add() called after compiling"; return -1; } @@ -64,7 +69,7 @@ int RE2::Set::Add(absl::string_view pattern, std::string* error) { if (error != NULL) *error = status.Text(); if (options_.log_errors()) - LOG(ERROR) << "Error parsing '" << pattern << "': " << status.Text(); + ABSL_LOG(ERROR) << "Error parsing '" << pattern << "': " << status.Text(); return -1; } @@ -91,7 +96,7 @@ int RE2::Set::Add(absl::string_view pattern, std::string* error) { bool RE2::Set::Compile() { if (compiled_) { - LOG(DFATAL) << "RE2::Set::Compile() called more than once"; + ABSL_LOG(DFATAL) << "RE2::Set::Compile() called more than once"; return false; } compiled_ = true; @@ -128,7 +133,7 @@ bool RE2::Set::Match(absl::string_view text, std::vector* v, if (!compiled_) { if (error_info != NULL) error_info->kind = kNotCompiled; - LOG(DFATAL) << "RE2::Set::Match() called before compiling"; + ABSL_LOG(DFATAL) << "RE2::Set::Match() called before compiling"; return false; } #ifdef RE2_HAVE_THREAD_LOCAL @@ -144,10 +149,10 @@ bool RE2::Set::Match(absl::string_view text, std::vector* v, NULL, &dfa_failed, matches.get()); if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: " - << "program size " << prog_->size() << ", " - << "list count " << prog_->list_count() << ", " - << "bytemap range " << prog_->bytemap_range(); + ABSL_LOG(ERROR) << "DFA out of memory: " + << "program size " << prog_->size() << ", " + << "list count " << prog_->list_count() << ", " + << "bytemap range " << prog_->bytemap_range(); if (error_info != NULL) error_info->kind = kOutOfMemory; return false; @@ -161,7 +166,7 @@ bool RE2::Set::Match(absl::string_view text, std::vector* v, if (matches->empty()) { if (error_info != NULL) error_info->kind = kInconsistent; - LOG(DFATAL) << "RE2::Set::Match() matched, but no matches returned?!"; + ABSL_LOG(DFATAL) << "RE2::Set::Match() matched, but no matches returned"; return false; } v->assign(matches->begin(), matches->end()); diff --git a/yass/third_party/re2/re2/simplify.cc b/yass/third_party/re2/re2/simplify.cc index cea100b08a..d0524aff54 100644 --- a/yass/third_party/re2/re2/simplify.cc +++ b/yass/third_party/re2/re2/simplify.cc @@ -6,14 +6,17 @@ // to use simple extended regular expression features. // Also sort and simplify character classes. +#include + #include #include -#include "util/logging.h" -#include "util/utf.h" +#include "absl/log/absl_log.h" +#include "absl/strings/string_view.h" #include "re2/pod_array.h" #include "re2/regexp.h" #include "re2/walker-inl.h" +#include "util/utf.h" namespace re2 { @@ -94,7 +97,7 @@ bool Regexp::ComputeSimple() { case kRegexpRepeat: return false; } - LOG(DFATAL) << "Case not handled in ComputeSimple: " << op_; + ABSL_LOG(DFATAL) << "Case not handled in ComputeSimple: " << op_; return false; } @@ -222,7 +225,7 @@ Regexp* CoalesceWalker::Copy(Regexp* re) { Regexp* CoalesceWalker::ShortVisit(Regexp* re, Regexp* parent_arg) { // Should never be called: we use Walk(), not WalkExponential(). #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - LOG(DFATAL) << "CoalesceWalker::ShortVisit called"; + ABSL_LOG(DFATAL) << "CoalesceWalker::ShortVisit called"; #endif return re->Incref(); } @@ -372,7 +375,7 @@ void CoalesceWalker::DoCoalesce(Regexp** r1ptr, Regexp** r2ptr) { default: nre->Decref(); - LOG(DFATAL) << "DoCoalesce failed: r1->op() is " << r1->op(); + ABSL_LOG(DFATAL) << "DoCoalesce failed: r1->op() is " << r1->op(); return; } @@ -433,7 +436,7 @@ void CoalesceWalker::DoCoalesce(Regexp** r1ptr, Regexp** r2ptr) { default: nre->Decref(); - LOG(DFATAL) << "DoCoalesce failed: r2->op() is " << r2->op(); + ABSL_LOG(DFATAL) << "DoCoalesce failed: r2->op() is " << r2->op(); return; } @@ -448,7 +451,7 @@ Regexp* SimplifyWalker::Copy(Regexp* re) { Regexp* SimplifyWalker::ShortVisit(Regexp* re, Regexp* parent_arg) { // Should never be called: we use Walk(), not WalkExponential(). #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - LOG(DFATAL) << "SimplifyWalker::ShortVisit called"; + ABSL_LOG(DFATAL) << "SimplifyWalker::ShortVisit called"; #endif return re->Incref(); } @@ -564,7 +567,7 @@ Regexp* SimplifyWalker::PostVisit(Regexp* re, } } - LOG(ERROR) << "Simplify case not handled: " << re->op(); + ABSL_LOG(ERROR) << "Simplify case not handled: " << re->op(); return re->Incref(); } @@ -661,7 +664,8 @@ Regexp* SimplifyWalker::SimplifyRepeat(Regexp* re, int min, int max, if (nre == NULL) { // Some degenerate case, like min > max, or min < max < 0. // This shouldn't happen, because the parser rejects such regexps. - LOG(DFATAL) << "Malformed repeat " << re->ToString() << " " << min << " " << max; + ABSL_LOG(DFATAL) << "Malformed repeat of " << re->ToString() + << " min " << min << " max " << max; return new Regexp(kRegexpNoMatch, f); } diff --git a/yass/third_party/re2/re2/sparse_array.h b/yass/third_party/re2/re2/sparse_array.h index 09ffe086b7..8174d9a0a6 100644 --- a/yass/third_party/re2/re2/sparse_array.h +++ b/yass/third_party/re2/re2/sparse_array.h @@ -88,22 +88,24 @@ // // A moved-from SparseArray will be empty. -// Doing this simplifies the logic below. -#ifndef __has_feature -#define __has_feature(x) 0 -#endif - #include #include -#if __has_feature(memory_sanitizer) -#include -#endif + #include #include #include #include "re2/pod_array.h" +// Doing this simplifies the logic below. +#ifndef __has_feature +#define __has_feature(x) 0 +#endif + +#if __has_feature(memory_sanitizer) +#include +#endif + namespace re2 { template diff --git a/yass/third_party/re2/re2/sparse_set.h b/yass/third_party/re2/re2/sparse_set.h index 06ed88d81b..c08e93d291 100644 --- a/yass/third_party/re2/re2/sparse_set.h +++ b/yass/third_party/re2/re2/sparse_set.h @@ -47,22 +47,24 @@ // // See sparse_array.h for implementation details. -// Doing this simplifies the logic below. -#ifndef __has_feature -#define __has_feature(x) 0 -#endif - #include #include -#if __has_feature(memory_sanitizer) -#include -#endif + #include #include #include #include "re2/pod_array.h" +// Doing this simplifies the logic below. +#ifndef __has_feature +#define __has_feature(x) 0 +#endif + +#if __has_feature(memory_sanitizer) +#include +#endif + namespace re2 { template diff --git a/yass/third_party/re2/re2/testing/backtrack.cc b/yass/third_party/re2/re2/testing/backtrack.cc index 90071bb0f7..7504e1a460 100644 --- a/yass/third_party/re2/re2/testing/backtrack.cc +++ b/yass/third_party/re2/re2/testing/backtrack.cc @@ -13,7 +13,7 @@ // THIS CODE SHOULD NEVER BE USED IN PRODUCTION: // - It uses a ton of memory. // - It uses a ton of stack. -// - It uses CHECK and LOG(FATAL). +// - It uses ABSL_CHECK() and ABSL_LOG(FATAL). // - It implements unanchored search by repeated anchored search. // // On the other hand, it is very simple and a good reference @@ -28,7 +28,9 @@ #include #include "absl/base/macros.h" -#include "util/logging.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" +#include "absl/strings/string_view.h" #include "re2/pod_array.h" #include "re2/prog.h" #include "re2/regexp.h" @@ -111,7 +113,7 @@ bool Backtracker::Search(absl::string_view text, absl::string_view context, endmatch_ = prog_->anchor_end(); submatch_ = submatch; nsubmatch_ = nsubmatch; - CHECK_LT(2*nsubmatch_, static_cast(ABSL_ARRAYSIZE(cap_))); + ABSL_CHECK_LT(2*nsubmatch_, static_cast(ABSL_ARRAYSIZE(cap_))); memset(cap_, 0, sizeof cap_); // We use submatch_[0] for our own bookkeeping, @@ -157,10 +159,10 @@ bool Backtracker::Visit(int id, const char* p) { // Check bitmap. If we've already explored from here, // either it didn't match or it did but we're hoping for a better match. // Either way, don't go down that road again. - CHECK(p <= text_.data() + text_.size()); + ABSL_CHECK(p <= text_.data() + text_.size()); int n = id * static_cast(text_.size()+1) + static_cast(p-text_.data()); - CHECK_LT(n/32, visited_.size()); + ABSL_CHECK_LT(n/32, visited_.size()); if (visited_[n/32] & (1 << (n&31))) return false; visited_[n/32] |= 1 << (n&31); @@ -188,7 +190,7 @@ bool Backtracker::Try(int id, const char* p) { Prog::Inst* ip = prog_->inst(id); switch (ip->opcode()) { default: - LOG(FATAL) << "Unexpected opcode: " << (int)ip->opcode(); + ABSL_LOG(FATAL) << "Unexpected opcode: " << ip->opcode(); return false; // not reached case kInstAltMatch: diff --git a/yass/third_party/re2/re2/testing/charclass_test.cc b/yass/third_party/re2/re2/testing/charclass_test.cc index ad95d6c264..efe38aec1c 100644 --- a/yass/third_party/re2/re2/testing/charclass_test.cc +++ b/yass/third_party/re2/re2/testing/charclass_test.cc @@ -9,8 +9,8 @@ #include "absl/base/macros.h" #include "absl/strings/str_format.h" #include "gtest/gtest.h" -#include "util/utf.h" #include "re2/regexp.h" +#include "util/utf.h" namespace re2 { diff --git a/yass/third_party/re2/re2/testing/compile_test.cc b/yass/third_party/re2/re2/testing/compile_test.cc index f6899d3d27..7ac01f9b10 100644 --- a/yass/third_party/re2/re2/testing/compile_test.cc +++ b/yass/third_party/re2/re2/testing/compile_test.cc @@ -4,13 +4,16 @@ // Test prog.cc, compile.cc +#include + #include #include "absl/base/macros.h" +#include "absl/log/absl_log.h" +#include "absl/strings/string_view.h" #include "gtest/gtest.h" -#include "util/logging.h" -#include "re2/regexp.h" #include "re2/prog.h" +#include "re2/regexp.h" namespace re2 { @@ -132,13 +135,13 @@ TEST(TestRegexpCompileToProg, Simple) { const re2::Test& t = tests[i]; Regexp* re = Regexp::Parse(t.regexp, Regexp::PerlX|Regexp::Latin1, NULL); if (re == NULL) { - LOG(ERROR) << "Cannot parse: " << t.regexp; + ABSL_LOG(ERROR) << "Cannot parse: " << t.regexp; failed++; continue; } Prog* prog = re->CompileToProg(0); if (prog == NULL) { - LOG(ERROR) << "Cannot compile: " << t.regexp; + ABSL_LOG(ERROR) << "Cannot compile: " << t.regexp; re->Decref(); failed++; continue; @@ -146,9 +149,9 @@ TEST(TestRegexpCompileToProg, Simple) { ASSERT_TRUE(re->CompileToProg(1) == NULL); std::string s = prog->Dump(); if (s != t.code) { - LOG(ERROR) << "Incorrect compiled code for: " << t.regexp; - LOG(ERROR) << "Want:\n" << t.code; - LOG(ERROR) << "Got:\n" << s; + ABSL_LOG(ERROR) << "Incorrect compiled code for: " << t.regexp; + ABSL_LOG(ERROR) << "Want:\n" << t.code; + ABSL_LOG(ERROR) << "Got:\n" << s; failed++; } delete prog; diff --git a/yass/third_party/re2/re2/testing/dfa_test.cc b/yass/third_party/re2/re2/testing/dfa_test.cc index b0759f7c7d..a8178c889a 100644 --- a/yass/third_party/re2/re2/testing/dfa_test.cc +++ b/yass/third_party/re2/re2/testing/dfa_test.cc @@ -2,22 +2,24 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +#include #include + #include #include #include #include "absl/base/macros.h" #include "absl/flags/flag.h" +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" +#include "absl/strings/string_view.h" #include "gtest/gtest.h" -#include "util/logging.h" -#include "util/malloc_counter.h" #include "re2/prog.h" #include "re2/re2.h" #include "re2/regexp.h" -#include "re2/testing/regexp_generator.h" #include "re2/testing/string_generator.h" +#include "util/malloc_counter.h" static const bool UsingMallocCounter = false; @@ -111,10 +113,10 @@ TEST(SingleThreaded, BuildEntireDFA) { delete prog; } if (UsingMallocCounter) { - //LOG(INFO) << "limit " << limit << ", " - // << "prog usage " << progusage << ", " - // << "DFA budget " << dfamem << ", " - // << "total " << usage; + //ABSL_LOG(INFO) << "limit " << limit << ", " + // << "prog usage " << progusage << ", " + // << "DFA budget " << dfamem << ", " + // << "total " << usage; // Tolerate +/- 10%. ASSERT_GT(usage, limit*9/10); ASSERT_LT(usage, limit*11/10); @@ -189,8 +191,8 @@ TEST(SingleThreaded, SearchDFA) { delete prog; } if (UsingMallocCounter) { - //LOG(INFO) << "usage " << usage << ", " - // << "peak usage " << peak_usage; + //ABSL_LOG(INFO) << "usage " << usage << ", " + // << "peak usage " << peak_usage; ASSERT_LT(usage, 1<SearchDFA(t.text, absl::string_view(), Prog::kUnanchored, Prog::kFirstMatch, NULL, &failed, NULL); if (matched != t.match) { - LOG(ERROR) << t.regexp << " on " << t.text << ": want " << t.match; + ABSL_LOG(ERROR) << t.regexp << " on " << t.text << ": want " << t.match; nfail++; } delete prog; @@ -360,8 +362,9 @@ TEST(DFA, Callback) { dump += match ? "]]" : "]"; }); if (dump != t.dump) { - LOG(ERROR) << t.regexp << " bytemap:\n" << prog->DumpByteMap(); - LOG(ERROR) << t.regexp << " dump:\ngot " << dump << "\nwant " << t.dump; + ABSL_LOG(ERROR) << t.regexp << " bytemap:\n" << prog->DumpByteMap(); + ABSL_LOG(ERROR) << t.regexp << " dump:\n" << "got " << dump << "\n" + << "want " << t.dump; nfail++; } delete prog; diff --git a/yass/third_party/re2/re2/testing/dump.cc b/yass/third_party/re2/re2/testing/dump.cc index 9e3c94a696..382ac208a0 100644 --- a/yass/third_party/re2/re2/testing/dump.cc +++ b/yass/third_party/re2/re2/testing/dump.cc @@ -19,11 +19,12 @@ #include #include "absl/base/macros.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" #include "gtest/gtest.h" -#include "util/logging.h" -#include "util/utf.h" #include "re2/regexp.h" +#include "util/utf.h" namespace re2 { @@ -129,7 +130,7 @@ static void DumpRegexpAppending(Regexp* re, std::string* s) { break; case kRegexpCapture: if (re->cap() == 0) - LOG(DFATAL) << "kRegexpCapture cap() == 0"; + ABSL_LOG(DFATAL) << "kRegexpCapture cap() == 0"; if (re->name()) { s->append(*re->name()); s->append(":"); @@ -161,7 +162,7 @@ static void DumpRegexpAppending(Regexp* re, std::string* s) { std::string Regexp::Dump() { // Make sure that we are being called from a unit test. // Should cause a link error if used outside of testing. - CHECK(!::testing::TempDir().empty()); + ABSL_CHECK(!::testing::TempDir().empty()); std::string s; DumpRegexpAppending(this, &s); diff --git a/yass/third_party/re2/re2/testing/exhaustive1_test.cc b/yass/third_party/re2/re2/testing/exhaustive1_test.cc index 933798995b..0056cf2329 100644 --- a/yass/third_party/re2/re2/testing/exhaustive1_test.cc +++ b/yass/third_party/re2/re2/testing/exhaustive1_test.cc @@ -9,6 +9,7 @@ #include "gtest/gtest.h" #include "re2/testing/exhaustive_tester.h" +#include "re2/testing/regexp_generator.h" namespace re2 { diff --git a/yass/third_party/re2/re2/testing/exhaustive2_test.cc b/yass/third_party/re2/re2/testing/exhaustive2_test.cc index 14f629d4a0..31079fb386 100644 --- a/yass/third_party/re2/re2/testing/exhaustive2_test.cc +++ b/yass/third_party/re2/re2/testing/exhaustive2_test.cc @@ -5,12 +5,13 @@ // Exhaustive testing of regular expression matching. #include -#include + #include #include #include "gtest/gtest.h" #include "re2/testing/exhaustive_tester.h" +#include "re2/testing/regexp_generator.h" namespace re2 { @@ -69,4 +70,3 @@ TEST(LineEnds, Exhaustive) { // } } // namespace re2 - diff --git a/yass/third_party/re2/re2/testing/exhaustive3_test.cc b/yass/third_party/re2/re2/testing/exhaustive3_test.cc index de703c00ee..afc387f9aa 100644 --- a/yass/third_party/re2/re2/testing/exhaustive3_test.cc +++ b/yass/third_party/re2/re2/testing/exhaustive3_test.cc @@ -5,13 +5,14 @@ // Exhaustive testing of regular expression matching. #include -#include + #include #include #include "gtest/gtest.h" -#include "util/utf.h" #include "re2/testing/exhaustive_tester.h" +#include "re2/testing/regexp_generator.h" +#include "util/utf.h" namespace re2 { @@ -97,4 +98,3 @@ TEST(InterestingUTF8, AB) { } } // namespace re2 - diff --git a/yass/third_party/re2/re2/testing/exhaustive_test.cc b/yass/third_party/re2/re2/testing/exhaustive_test.cc index 5e586f1fec..1bae2f3c7b 100644 --- a/yass/third_party/re2/re2/testing/exhaustive_test.cc +++ b/yass/third_party/re2/re2/testing/exhaustive_test.cc @@ -33,4 +33,3 @@ TEST(EgrepLiterals, UTF8) { } } // namespace re2 - diff --git a/yass/third_party/re2/re2/testing/exhaustive_tester.cc b/yass/third_party/re2/re2/testing/exhaustive_tester.cc index a57f700bcd..d8fa1ffa81 100644 --- a/yass/third_party/re2/re2/testing/exhaustive_tester.cc +++ b/yass/third_party/re2/re2/testing/exhaustive_tester.cc @@ -11,14 +11,23 @@ // the NFA, DFA, and a trivial backtracking implementation agree about // the location of the match. +#include "re2/testing/exhaustive_tester.h" + #include +#include +#include + #include "absl/base/macros.h" #include "absl/flags/flag.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" +#include "absl/strings/string_view.h" #include "gtest/gtest.h" -#include "util/logging.h" -#include "re2/testing/exhaustive_tester.h" +#include "re2/prog.h" +#include "re2/re2.h" +#include "re2/testing/regexp_generator.h" #include "re2/testing/tester.h" // For target `log' in the Makefile. @@ -40,7 +49,7 @@ static char* escape(absl::string_view sp) { *p++ = '\"'; for (size_t i = 0; i < sp.size(); i++) { if(p+5 >= buf+sizeof buf) - LOG(FATAL) << "ExhaustiveTester escape: too long"; + ABSL_LOG(FATAL) << "ExhaustiveTester escape: too long"; if(sp[i] == '\\' || sp[i] == '\"') { *p++ = '\\'; *p++ = sp[i]; @@ -82,7 +91,7 @@ void ExhaustiveTester::HandleRegexp(const std::string& const_regexp) { std::string regexp = const_regexp; if (!topwrapper_.empty()) { auto fmt = absl::ParsedFormat<'s'>::New(topwrapper_); - CHECK(fmt != nullptr); + ABSL_CHECK(fmt != nullptr); regexp = absl::StrFormat(*fmt, regexp); } @@ -95,7 +104,7 @@ void ExhaustiveTester::HandleRegexp(const std::string& const_regexp) { // Write out test cases and answers for use in testing // other implementations, such as Go's regexp package. if (randomstrings_) - LOG(ERROR) << "Cannot log with random strings."; + ABSL_LOG(ERROR) << "Cannot log with random strings."; if (regexps_ == 1) { // first absl::PrintF("strings\n"); strgen_.Reset(); diff --git a/yass/third_party/re2/re2/testing/exhaustive_tester.h b/yass/third_party/re2/re2/testing/exhaustive_tester.h index 906be0c8c7..8b0421d712 100644 --- a/yass/third_party/re2/re2/testing/exhaustive_tester.h +++ b/yass/third_party/re2/re2/testing/exhaustive_tester.h @@ -6,6 +6,7 @@ #define RE2_TESTING_EXHAUSTIVE_TESTER_H_ #include + #include #include diff --git a/yass/third_party/re2/re2/testing/filtered_re2_test.cc b/yass/third_party/re2/re2/testing/filtered_re2_test.cc index a8d2dfc72a..b951d7c7f0 100644 --- a/yass/third_party/re2/re2/testing/filtered_re2_test.cc +++ b/yass/third_party/re2/re2/testing/filtered_re2_test.cc @@ -2,17 +2,18 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +#include "re2/filtered_re2.h" + #include + #include -#include #include -#include #include +#include #include "absl/base/macros.h" +#include "absl/log/absl_log.h" #include "gtest/gtest.h" -#include "util/logging.h" -#include "re2/filtered_re2.h" #include "re2/re2.h" namespace re2 { @@ -172,13 +173,13 @@ bool CheckExpectedAtoms(const char* atoms[], pass = pass && expected[i] == v->atoms[i]; if (!pass) { - LOG(ERROR) << "Failed " << testname; - LOG(ERROR) << "Expected #atoms = " << expected.size(); + ABSL_LOG(ERROR) << "Failed " << testname; + ABSL_LOG(ERROR) << "Expected #atoms = " << expected.size(); for (size_t i = 0; i < expected.size(); i++) - LOG(ERROR) << expected[i]; - LOG(ERROR) << "Found #atoms = " << v->atoms.size(); + ABSL_LOG(ERROR) << expected[i]; + ABSL_LOG(ERROR) << "Found #atoms = " << v->atoms.size(); for (size_t i = 0; i < v->atoms.size(); i++) - LOG(ERROR) << v->atoms[i]; + ABSL_LOG(ERROR) << v->atoms[i]; } return pass; @@ -273,9 +274,9 @@ TEST(FilteredRE2Test, MatchTests) { atoms.push_back("yyy"); atoms.push_back("yyyzzz"); FindAtomIndices(v.atoms, atoms, &atom_ids); - LOG(INFO) << "S: " << atom_ids.size(); + ABSL_LOG(INFO) << "S: " << atom_ids.size(); for (size_t i = 0; i < atom_ids.size(); i++) - LOG(INFO) << "i: " << i << " : " << atom_ids[i]; + ABSL_LOG(INFO) << "i: " << i << " : " << atom_ids[i]; v.f.AllMatches(text, atom_ids, &matching_regexps); EXPECT_EQ(2, matching_regexps.size()); } diff --git a/yass/third_party/re2/re2/testing/mimics_pcre_test.cc b/yass/third_party/re2/re2/testing/mimics_pcre_test.cc index 829659d679..36a348f02b 100644 --- a/yass/third_party/re2/re2/testing/mimics_pcre_test.cc +++ b/yass/third_party/re2/re2/testing/mimics_pcre_test.cc @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +#include + #include "absl/base/macros.h" #include "gtest/gtest.h" -#include "util/logging.h" #include "re2/prog.h" #include "re2/regexp.h" diff --git a/yass/third_party/re2/re2/testing/null_walker.cc b/yass/third_party/re2/re2/testing/null_walker.cc index 745364b3c9..3e17bc39e3 100644 --- a/yass/third_party/re2/re2/testing/null_walker.cc +++ b/yass/third_party/re2/re2/testing/null_walker.cc @@ -2,8 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -#include "gtest/gtest.h" -#include "util/logging.h" +#include "absl/log/absl_log.h" #include "re2/regexp.h" #include "re2/walker-inl.h" @@ -21,7 +20,7 @@ class NullWalker : public Regexp::Walker { virtual bool ShortVisit(Regexp* re, bool a) { // Should never be called: we use Walk(), not WalkExponential(). #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - LOG(DFATAL) << "NullWalker::ShortVisit called"; + ABSL_LOG(DFATAL) << "NullWalker::ShortVisit called"; #endif return a; } diff --git a/yass/third_party/re2/re2/testing/parse_test.cc b/yass/third_party/re2/re2/testing/parse_test.cc index 95294d5fff..53ef24ec74 100644 --- a/yass/third_party/re2/re2/testing/parse_test.cc +++ b/yass/third_party/re2/re2/testing/parse_test.cc @@ -4,11 +4,13 @@ // Test parse.cc, dump.cc, and tostring.cc. +#include + #include #include "absl/base/macros.h" +#include "absl/log/absl_log.h" #include "gtest/gtest.h" -#include "util/logging.h" #include "re2/regexp.h" namespace re2 { @@ -520,7 +522,7 @@ TEST(TestToString, EquivalentParse) { std::string ss = nre->Dump(); std::string tt = nre->ToString(); if (s != ss || t != tt) - LOG(INFO) << "ToString(" << tests[i].regexp << ") = " << t; + ABSL_LOG(INFO) << "ToString(" << tests[i].regexp << ") = " << t; EXPECT_EQ(s, ss); EXPECT_EQ(t, tt); nre->Decref(); diff --git a/yass/third_party/re2/re2/testing/possible_match_test.cc b/yass/third_party/re2/re2/testing/possible_match_test.cc index fe199c6629..f217947d69 100644 --- a/yass/third_party/re2/re2/testing/possible_match_test.cc +++ b/yass/third_party/re2/re2/testing/possible_match_test.cc @@ -3,13 +3,15 @@ // license that can be found in the LICENSE file. #include + #include #include #include "absl/base/macros.h" +#include "absl/log/absl_log.h" #include "absl/strings/escaping.h" +#include "absl/strings/string_view.h" #include "gtest/gtest.h" -#include "util/logging.h" #include "re2/prog.h" #include "re2/re2.h" #include "re2/regexp.h" @@ -113,7 +115,7 @@ TEST(PossibleMatchRange, HandWritten) { const PrefixTest& t = tests[i]; std::string min, max; if (j == 0) { - LOG(INFO) << "Checking regexp=" << absl::CEscape(t.regexp); + ABSL_LOG(INFO) << "Checking regexp=" << absl::CEscape(t.regexp); Regexp* re = Regexp::Parse(t.regexp, Regexp::LikePerl, NULL); ASSERT_TRUE(re != NULL); Prog* prog = re->CompileToProg(0); @@ -202,7 +204,7 @@ class PossibleMatchTester : public RegexpGenerator { void PossibleMatchTester::HandleRegexp(const std::string& regexp) { regexps_++; - VLOG(3) << absl::CEscape(regexp); + ABSL_VLOG(3) << absl::CEscape(regexp); RE2 re(regexp, RE2::Latin1); ASSERT_EQ(re.error(), ""); @@ -214,7 +216,8 @@ void PossibleMatchTester::HandleRegexp(const std::string& regexp) { // complicated expressions. if(strstr(regexp.c_str(), "\\C*")) return; - LOG(QFATAL) << "PossibleMatchRange failed on: " << absl::CEscape(regexp); + ABSL_LOG(QFATAL) << "PossibleMatchRange failed on: " + << absl::CEscape(regexp); } strgen_.Reset(); @@ -241,8 +244,8 @@ TEST(PossibleMatchRange, Exhaustive) { RegexpGenerator::EgrepOps(), stringlen, Explode("ab4")); t.Generate(); - LOG(INFO) << t.regexps() << " regexps, " - << t.tests() << " tests"; + ABSL_LOG(INFO) << t.regexps() << " regexps, " + << t.tests() << " tests"; } } // namespace re2 diff --git a/yass/third_party/re2/re2/testing/random_test.cc b/yass/third_party/re2/re2/testing/random_test.cc index d076b39b17..6ff3587624 100644 --- a/yass/third_party/re2/re2/testing/random_test.cc +++ b/yass/third_party/re2/re2/testing/random_test.cc @@ -4,7 +4,6 @@ // Random testing of regular expression matching. -#include #include #include @@ -12,6 +11,7 @@ #include "absl/strings/str_format.h" #include "gtest/gtest.h" #include "re2/testing/exhaustive_tester.h" +#include "re2/testing/regexp_generator.h" ABSL_FLAG(int, regexpseed, 404, "Random regexp seed."); ABSL_FLAG(int, regexpcount, 100, "How many random regexps to generate."); diff --git a/yass/third_party/re2/re2/testing/re2_arg_test.cc b/yass/third_party/re2/re2/testing/re2_arg_test.cc index 78d4aee433..c895c30a98 100644 --- a/yass/third_party/re2/re2/testing/re2_arg_test.cc +++ b/yass/third_party/re2/re2/testing/re2_arg_test.cc @@ -11,8 +11,9 @@ #include #include "absl/base/macros.h" +#include "absl/log/absl_log.h" +#include "absl/types/optional.h" #include "gtest/gtest.h" -#include "util/logging.h" #include "re2/re2.h" namespace re2 { @@ -137,7 +138,7 @@ TEST(RE2ArgTest, Uint64Test) { TEST(RE2ArgTest, ParseFromTest) { struct { bool ParseFrom(const char* str, size_t n) { - LOG(INFO) << "str = " << str << ", n = " << n; + ABSL_LOG(INFO) << "str = " << str << ", n = " << n; return true; } } obj1; @@ -146,7 +147,7 @@ TEST(RE2ArgTest, ParseFromTest) { struct { bool ParseFrom(const char* str, size_t n) { - LOG(INFO) << "str = " << str << ", n = " << n; + ABSL_LOG(INFO) << "str = " << str << ", n = " << n; return false; } // Ensure that RE2::Arg works even with overloaded ParseFrom(). diff --git a/yass/third_party/re2/re2/testing/re2_test.cc b/yass/third_party/re2/re2/testing/re2_test.cc index ddf8dbf8fb..d46666bea9 100644 --- a/yass/third_party/re2/re2/testing/re2_test.cc +++ b/yass/third_party/re2/re2/testing/re2_test.cc @@ -5,26 +5,30 @@ // TODO: Test extractions for PartialMatch/Consume +#include "re2/re2.h" + #include #include #include #include + #include #include #include #include -#if !defined(_MSC_VER) && !defined(__CYGWIN__) && !defined(__MINGW32__) -#include -#include /* for sysconf */ -#endif #include "absl/base/macros.h" +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" +#include "absl/strings/string_view.h" #include "gtest/gtest.h" -#include "util/logging.h" -#include "re2/re2.h" #include "re2/regexp.h" +#if !defined(_MSC_VER) && !defined(__CYGWIN__) && !defined(__MINGW32__) +#include +#include +#endif + namespace re2 { TEST(RE2, HexTests) { @@ -773,7 +777,7 @@ TEST(RE2, NULTerminated) { v = static_cast(mmap(NULL, 2*pagesize, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0)); ASSERT_TRUE(v != reinterpret_cast(-1)); - LOG(INFO) << "Memory at " << (void*)v; + ABSL_LOG(INFO) << "Memory at " << reinterpret_cast(v); ASSERT_EQ(munmap(v + pagesize, pagesize), 0) << " error " << errno; v[pagesize - 1] = '1'; @@ -1562,7 +1566,7 @@ TEST(RE2, Bug18391750) { TEST(RE2, Bug18458852) { // Bug in parser accepting invalid (too large) rune, - // causing compiler to fail in DCHECK in UTF-8 + // causing compiler to fail in ABSL_DCHECK() in UTF-8 // character class code. const char b[] = { (char)0x28, (char)0x05, (char)0x05, (char)0x41, (char)0x41, (char)0x28, @@ -1598,7 +1602,7 @@ TEST(RE2, Bug18523943) { TEST(RE2, Bug21371806) { // Bug in parser accepting Unicode groups in Latin-1 mode, - // causing compiler to fail in DCHECK in prog.cc. + // causing compiler to fail in ABSL_DCHECK() in prog.cc. RE2::Options opt; opt.set_encoding(RE2::Options::EncodingLatin1); diff --git a/yass/third_party/re2/re2/testing/regexp_benchmark.cc b/yass/third_party/re2/re2/testing/regexp_benchmark.cc index 5352b31011..3b0a5330b5 100644 --- a/yass/third_party/re2/re2/testing/regexp_benchmark.cc +++ b/yass/third_party/re2/re2/testing/regexp_benchmark.cc @@ -7,20 +7,22 @@ #include #include #include + #include #include -#include #include "absl/container/flat_hash_map.h" #include "absl/flags/flag.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" +#include "absl/strings/string_view.h" #include "absl/synchronization/mutex.h" #include "benchmark/benchmark.h" -#include "util/logging.h" -#include "util/malloc_counter.h" #include "re2/prog.h" #include "re2/re2.h" #include "re2/regexp.h" +#include "util/malloc_counter.h" #include "util/pcre.h" namespace re2 { @@ -34,21 +36,22 @@ namespace re2 { void Test() { Regexp* re = Regexp::Parse("(\\d+)-(\\d+)-(\\d+)", Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); - CHECK(prog->IsOnePass()); - CHECK(prog->CanBitState()); + ABSL_CHECK(prog); + ABSL_CHECK(prog->IsOnePass()); + ABSL_CHECK(prog->CanBitState()); const char* text = "650-253-0001"; absl::string_view sp[4]; - CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); - CHECK_EQ(sp[0], "650-253-0001"); - CHECK_EQ(sp[1], "650"); - CHECK_EQ(sp[2], "253"); - CHECK_EQ(sp[3], "0001"); + ABSL_CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, + sp, 4)); + ABSL_CHECK_EQ(sp[0], "650-253-0001"); + ABSL_CHECK_EQ(sp[1], "650"); + ABSL_CHECK_EQ(sp[2], "253"); + ABSL_CHECK_EQ(sp[3], "0001"); delete prog; re->Decref(); - LOG(INFO) << "test passed\n"; + ABSL_LOG(INFO) << "test passed\n"; } void MemoryUsage() { @@ -57,23 +60,25 @@ void MemoryUsage() { { MallocCounter mc(MallocCounter::THIS_THREAD_ONLY); Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); - // Can't pass mc.HeapGrowth() and mc.PeakHeapGrowth() to LOG(INFO) directly, - // because LOG(INFO) might do a big allocation before they get evaluated. + ABSL_CHECK(re); + // Can't pass mc.HeapGrowth() and mc.PeakHeapGrowth() to ABSL_LOG(INFO) + // directly because ABSL_LOG(INFO) might do a big allocation before they + // get evaluated. absl::FPrintF(stderr, "Regexp: %7d bytes (peak=%d)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); mc.Reset(); Prog* prog = re->CompileToProg(0); - CHECK(prog); - CHECK(prog->IsOnePass()); - CHECK(prog->CanBitState()); + ABSL_CHECK(prog); + ABSL_CHECK(prog->IsOnePass()); + ABSL_CHECK(prog->CanBitState()); absl::FPrintF(stderr, "Prog: %7d bytes (peak=%d)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); mc.Reset(); absl::string_view sp[4]; - CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); + ABSL_CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 4)); absl::FPrintF(stderr, "Search: %7d bytes (peak=%d)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); delete prog; @@ -168,7 +173,7 @@ std::string RandomText(int64_t nbytes) { } return text; }(); - CHECK_LE(nbytes, 16<<20); + ABSL_CHECK_LE(nbytes, 16<<20); return text->substr(0, nbytes); } @@ -319,8 +324,8 @@ void FindAndConsume(benchmark::State& state) { for (auto _ : state) { absl::string_view t = s; absl::string_view u; - CHECK(RE2::FindAndConsume(&t, re, &u)); - CHECK_EQ(u, "Hello World"); + ABSL_CHECK(RE2::FindAndConsume(&t, re, &u)); + ABSL_CHECK_EQ(u, "Hello World"); } state.SetBytesProcessed(state.iterations() * state.range(0)); } @@ -660,7 +665,7 @@ BENCHMARK(Parse_CachedSplitBig2_RE2)->ThreadRange(1, NumCPUs()); void ParseRegexp(benchmark::State& state, const std::string& regexp) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); re->Decref(); } } @@ -668,9 +673,9 @@ void ParseRegexp(benchmark::State& state, const std::string& regexp) { void SimplifyRegexp(benchmark::State& state, const std::string& regexp) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Regexp* sre = re->Simplify(); - CHECK(sre); + ABSL_CHECK(sre); sre->Decref(); re->Decref(); } @@ -678,7 +683,7 @@ void SimplifyRegexp(benchmark::State& state, const std::string& regexp) { void NullWalkRegexp(benchmark::State& state, const std::string& regexp) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); for (auto _ : state) { re->NullWalk(); } @@ -688,11 +693,11 @@ void NullWalkRegexp(benchmark::State& state, const std::string& regexp) { void SimplifyCompileRegexp(benchmark::State& state, const std::string& regexp) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Regexp* sre = re->Simplify(); - CHECK(sre); + ABSL_CHECK(sre); Prog* prog = sre->CompileToProg(0); - CHECK(prog); + ABSL_CHECK(prog); delete prog; sre->Decref(); re->Decref(); @@ -702,9 +707,9 @@ void SimplifyCompileRegexp(benchmark::State& state, const std::string& regexp) { void CompileRegexp(benchmark::State& state, const std::string& regexp) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); + ABSL_CHECK(prog); delete prog; re->Decref(); } @@ -712,10 +717,10 @@ void CompileRegexp(benchmark::State& state, const std::string& regexp) { void CompileToProg(benchmark::State& state, const std::string& regexp) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); for (auto _ : state) { Prog* prog = re->CompileToProg(0); - CHECK(prog); + ABSL_CHECK(prog); delete prog; } re->Decref(); @@ -723,9 +728,9 @@ void CompileToProg(benchmark::State& state, const std::string& regexp) { void CompileByteMap(benchmark::State& state, const std::string& regexp) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); + ABSL_CHECK(prog); for (auto _ : state) { prog->ComputeByteMap(); } @@ -736,14 +741,14 @@ void CompileByteMap(benchmark::State& state, const std::string& regexp) { void CompilePCRE(benchmark::State& state, const std::string& regexp) { for (auto _ : state) { PCRE re(regexp, PCRE::UTF8); - CHECK_EQ(re.error(), ""); + ABSL_CHECK_EQ(re.error(), ""); } } void CompileRE2(benchmark::State& state, const std::string& regexp) { for (auto _ : state) { RE2 re(regexp); - CHECK_EQ(re.error(), ""); + ABSL_CHECK_EQ(re.error(), ""); } } @@ -862,14 +867,14 @@ void SearchDFA(benchmark::State& state, const char* regexp, bool expect_match) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); + ABSL_CHECK(prog); bool failed = false; - CHECK_EQ(prog->SearchDFA(text, absl::string_view(), anchor, - Prog::kFirstMatch, NULL, &failed, NULL), - expect_match); - CHECK(!failed); + ABSL_CHECK_EQ(prog->SearchDFA(text, absl::string_view(), anchor, + Prog::kFirstMatch, NULL, &failed, NULL), + expect_match); + ABSL_CHECK(!failed); delete prog; re->Decref(); } @@ -880,12 +885,12 @@ void SearchNFA(benchmark::State& state, const char* regexp, bool expect_match) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); - CHECK_EQ(prog->SearchNFA(text, absl::string_view(), anchor, - Prog::kFirstMatch, NULL, 0), - expect_match); + ABSL_CHECK(prog); + ABSL_CHECK_EQ(prog->SearchNFA(text, absl::string_view(), anchor, + Prog::kFirstMatch, NULL, 0), + expect_match); delete prog; re->Decref(); } @@ -896,12 +901,13 @@ void SearchOnePass(benchmark::State& state, const char* regexp, bool expect_match) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); - CHECK(prog->IsOnePass()); - CHECK_EQ(prog->SearchOnePass(text, text, anchor, Prog::kFirstMatch, NULL, 0), - expect_match); + ABSL_CHECK(prog); + ABSL_CHECK(prog->IsOnePass()); + ABSL_CHECK_EQ( + prog->SearchOnePass(text, text, anchor, Prog::kFirstMatch, NULL, 0), + expect_match); delete prog; re->Decref(); } @@ -912,12 +918,13 @@ void SearchBitState(benchmark::State& state, const char* regexp, bool expect_match) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); - CHECK(prog->CanBitState()); - CHECK_EQ(prog->SearchBitState(text, text, anchor, Prog::kFirstMatch, NULL, 0), - expect_match); + ABSL_CHECK(prog); + ABSL_CHECK(prog->CanBitState()); + ABSL_CHECK_EQ( + prog->SearchBitState(text, text, anchor, Prog::kFirstMatch, NULL, 0), + expect_match); delete prog; re->Decref(); } @@ -928,11 +935,12 @@ void SearchPCRE(benchmark::State& state, const char* regexp, bool expect_match) { for (auto _ : state) { PCRE re(regexp, PCRE::UTF8); - CHECK_EQ(re.error(), ""); - if (anchor == Prog::kAnchored) - CHECK_EQ(PCRE::FullMatch(text, re), expect_match); - else - CHECK_EQ(PCRE::PartialMatch(text, re), expect_match); + ABSL_CHECK_EQ(re.error(), ""); + if (anchor == Prog::kAnchored) { + ABSL_CHECK_EQ(PCRE::FullMatch(text, re), expect_match); + } else { + ABSL_CHECK_EQ(PCRE::PartialMatch(text, re), expect_match); + } } } @@ -941,11 +949,12 @@ void SearchRE2(benchmark::State& state, const char* regexp, bool expect_match) { for (auto _ : state) { RE2 re(regexp); - CHECK_EQ(re.error(), ""); - if (anchor == Prog::kAnchored) - CHECK_EQ(RE2::FullMatch(text, re), expect_match); - else - CHECK_EQ(RE2::PartialMatch(text, re), expect_match); + ABSL_CHECK_EQ(re.error(), ""); + if (anchor == Prog::kAnchored) { + ABSL_CHECK_EQ(RE2::FullMatch(text, re), expect_match); + } else { + ABSL_CHECK_EQ(RE2::PartialMatch(text, re), expect_match); + } } } @@ -960,9 +969,9 @@ Prog* GetCachedProg(const char* regexp) { Prog* prog = cache[regexp]; if (prog == NULL) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); prog = re->CompileToProg(int64_t{1}<<31); // mostly for the DFA - CHECK(prog); + ABSL_CHECK(prog); cache[regexp] = prog; re->Decref(); // We must call this here - while we have exclusive access. @@ -978,7 +987,7 @@ PCRE* GetCachedPCRE(const char* regexp) { PCRE* re = cache[regexp]; if (re == NULL) { re = new PCRE(regexp, PCRE::UTF8); - CHECK_EQ(re->error(), ""); + ABSL_CHECK_EQ(re->error(), ""); cache[regexp] = re; } return re; @@ -991,7 +1000,7 @@ RE2* GetCachedRE2(const char* regexp) { RE2* re = cache[regexp]; if (re == NULL) { re = new RE2(regexp); - CHECK_EQ(re->error(), ""); + ABSL_CHECK_EQ(re->error(), ""); cache[regexp] = re; } return re; @@ -1003,10 +1012,10 @@ void SearchCachedDFA(benchmark::State& state, const char* regexp, Prog* prog = GetCachedProg(regexp); for (auto _ : state) { bool failed = false; - CHECK_EQ(prog->SearchDFA(text, absl::string_view(), anchor, + ABSL_CHECK_EQ(prog->SearchDFA(text, absl::string_view(), anchor, Prog::kFirstMatch, NULL, &failed, NULL), expect_match); - CHECK(!failed); + ABSL_CHECK(!failed); } } @@ -1015,7 +1024,7 @@ void SearchCachedNFA(benchmark::State& state, const char* regexp, bool expect_match) { Prog* prog = GetCachedProg(regexp); for (auto _ : state) { - CHECK_EQ(prog->SearchNFA(text, absl::string_view(), anchor, + ABSL_CHECK_EQ(prog->SearchNFA(text, absl::string_view(), anchor, Prog::kFirstMatch, NULL, 0), expect_match); } @@ -1025,10 +1034,11 @@ void SearchCachedOnePass(benchmark::State& state, const char* regexp, absl::string_view text, Prog::Anchor anchor, bool expect_match) { Prog* prog = GetCachedProg(regexp); - CHECK(prog->IsOnePass()); + ABSL_CHECK(prog->IsOnePass()); for (auto _ : state) { - CHECK_EQ(prog->SearchOnePass(text, text, anchor, Prog::kFirstMatch, NULL, 0), - expect_match); + ABSL_CHECK_EQ( + prog->SearchOnePass(text, text, anchor, Prog::kFirstMatch, NULL, 0), + expect_match); } } @@ -1036,10 +1046,11 @@ void SearchCachedBitState(benchmark::State& state, const char* regexp, absl::string_view text, Prog::Anchor anchor, bool expect_match) { Prog* prog = GetCachedProg(regexp); - CHECK(prog->CanBitState()); + ABSL_CHECK(prog->CanBitState()); for (auto _ : state) { - CHECK_EQ(prog->SearchBitState(text, text, anchor, Prog::kFirstMatch, NULL, 0), - expect_match); + ABSL_CHECK_EQ( + prog->SearchBitState(text, text, anchor, Prog::kFirstMatch, NULL, 0), + expect_match); } } @@ -1048,10 +1059,11 @@ void SearchCachedPCRE(benchmark::State& state, const char* regexp, bool expect_match) { PCRE& re = *GetCachedPCRE(regexp); for (auto _ : state) { - if (anchor == Prog::kAnchored) - CHECK_EQ(PCRE::FullMatch(text, re), expect_match); - else - CHECK_EQ(PCRE::PartialMatch(text, re), expect_match); + if (anchor == Prog::kAnchored) { + ABSL_CHECK_EQ(PCRE::FullMatch(text, re), expect_match); + } else { + ABSL_CHECK_EQ(PCRE::PartialMatch(text, re), expect_match); + } } } @@ -1060,10 +1072,11 @@ void SearchCachedRE2(benchmark::State& state, const char* regexp, bool expect_match) { RE2& re = *GetCachedRE2(regexp); for (auto _ : state) { - if (anchor == Prog::kAnchored) - CHECK_EQ(RE2::FullMatch(text, re), expect_match); - else - CHECK_EQ(RE2::PartialMatch(text, re), expect_match); + if (anchor == Prog::kAnchored) { + ABSL_CHECK_EQ(RE2::FullMatch(text, re), expect_match); + } else { + ABSL_CHECK_EQ(RE2::PartialMatch(text, re), expect_match); + } } } @@ -1074,11 +1087,11 @@ void Parse3NFA(benchmark::State& state, const char* regexp, absl::string_view text) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); + ABSL_CHECK(prog); absl::string_view sp[4]; // 4 because sp[0] is whole match. - CHECK(prog->SearchNFA(text, absl::string_view(), Prog::kAnchored, + ABSL_CHECK(prog->SearchNFA(text, absl::string_view(), Prog::kAnchored, Prog::kFullMatch, sp, 4)); delete prog; re->Decref(); @@ -1089,12 +1102,13 @@ void Parse3OnePass(benchmark::State& state, const char* regexp, absl::string_view text) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); - CHECK(prog->IsOnePass()); + ABSL_CHECK(prog); + ABSL_CHECK(prog->IsOnePass()); absl::string_view sp[4]; // 4 because sp[0] is whole match. - CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); + ABSL_CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 4)); delete prog; re->Decref(); } @@ -1104,12 +1118,13 @@ void Parse3BitState(benchmark::State& state, const char* regexp, absl::string_view text) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); - CHECK(prog->CanBitState()); + ABSL_CHECK(prog); + ABSL_CHECK(prog->CanBitState()); absl::string_view sp[4]; // 4 because sp[0] is whole match. - CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); + ABSL_CHECK(prog->SearchBitState(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 4)); delete prog; re->Decref(); } @@ -1119,11 +1134,12 @@ void Parse3Backtrack(benchmark::State& state, const char* regexp, absl::string_view text) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); + ABSL_CHECK(prog); absl::string_view sp[4]; // 4 because sp[0] is whole match. - CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); + ABSL_CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 4)); delete prog; re->Decref(); } @@ -1133,9 +1149,9 @@ void Parse3PCRE(benchmark::State& state, const char* regexp, absl::string_view text) { for (auto _ : state) { PCRE re(regexp, PCRE::UTF8); - CHECK_EQ(re.error(), ""); + ABSL_CHECK_EQ(re.error(), ""); absl::string_view sp1, sp2, sp3; - CHECK(PCRE::FullMatch(text, re, &sp1, &sp2, &sp3)); + ABSL_CHECK(PCRE::FullMatch(text, re, &sp1, &sp2, &sp3)); } } @@ -1143,9 +1159,9 @@ void Parse3RE2(benchmark::State& state, const char* regexp, absl::string_view text) { for (auto _ : state) { RE2 re(regexp); - CHECK_EQ(re.error(), ""); + ABSL_CHECK_EQ(re.error(), ""); absl::string_view sp1, sp2, sp3; - CHECK(RE2::FullMatch(text, re, &sp1, &sp2, &sp3)); + ABSL_CHECK(RE2::FullMatch(text, re, &sp1, &sp2, &sp3)); } } @@ -1154,7 +1170,7 @@ void Parse3CachedNFA(benchmark::State& state, const char* regexp, Prog* prog = GetCachedProg(regexp); absl::string_view sp[4]; // 4 because sp[0] is whole match. for (auto _ : state) { - CHECK(prog->SearchNFA(text, absl::string_view(), Prog::kAnchored, + ABSL_CHECK(prog->SearchNFA(text, absl::string_view(), Prog::kAnchored, Prog::kFullMatch, sp, 4)); } } @@ -1162,20 +1178,22 @@ void Parse3CachedNFA(benchmark::State& state, const char* regexp, void Parse3CachedOnePass(benchmark::State& state, const char* regexp, absl::string_view text) { Prog* prog = GetCachedProg(regexp); - CHECK(prog->IsOnePass()); + ABSL_CHECK(prog->IsOnePass()); absl::string_view sp[4]; // 4 because sp[0] is whole match. for (auto _ : state) { - CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); + ABSL_CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 4)); } } void Parse3CachedBitState(benchmark::State& state, const char* regexp, absl::string_view text) { Prog* prog = GetCachedProg(regexp); - CHECK(prog->CanBitState()); + ABSL_CHECK(prog->CanBitState()); absl::string_view sp[4]; // 4 because sp[0] is whole match. for (auto _ : state) { - CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); + ABSL_CHECK(prog->SearchBitState(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 4)); } } @@ -1184,7 +1202,8 @@ void Parse3CachedBacktrack(benchmark::State& state, const char* regexp, Prog* prog = GetCachedProg(regexp); absl::string_view sp[4]; // 4 because sp[0] is whole match. for (auto _ : state) { - CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); + ABSL_CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 4)); } } @@ -1193,7 +1212,7 @@ void Parse3CachedPCRE(benchmark::State& state, const char* regexp, PCRE& re = *GetCachedPCRE(regexp); absl::string_view sp1, sp2, sp3; for (auto _ : state) { - CHECK(PCRE::FullMatch(text, re, &sp1, &sp2, &sp3)); + ABSL_CHECK(PCRE::FullMatch(text, re, &sp1, &sp2, &sp3)); } } @@ -1202,7 +1221,7 @@ void Parse3CachedRE2(benchmark::State& state, const char* regexp, RE2& re = *GetCachedRE2(regexp); absl::string_view sp1, sp2, sp3; for (auto _ : state) { - CHECK(RE2::FullMatch(text, re, &sp1, &sp2, &sp3)); + ABSL_CHECK(RE2::FullMatch(text, re, &sp1, &sp2, &sp3)); } } @@ -1213,12 +1232,12 @@ void Parse1NFA(benchmark::State& state, const char* regexp, absl::string_view text) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); + ABSL_CHECK(prog); absl::string_view sp[2]; // 2 because sp[0] is whole match. - CHECK(prog->SearchNFA(text, absl::string_view(), Prog::kAnchored, - Prog::kFullMatch, sp, 2)); + ABSL_CHECK(prog->SearchNFA(text, absl::string_view(), Prog::kAnchored, + Prog::kFullMatch, sp, 2)); delete prog; re->Decref(); } @@ -1228,12 +1247,13 @@ void Parse1OnePass(benchmark::State& state, const char* regexp, absl::string_view text) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); - CHECK(prog->IsOnePass()); + ABSL_CHECK(prog); + ABSL_CHECK(prog->IsOnePass()); absl::string_view sp[2]; // 2 because sp[0] is whole match. - CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2)); + ABSL_CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 2)); delete prog; re->Decref(); } @@ -1243,12 +1263,13 @@ void Parse1BitState(benchmark::State& state, const char* regexp, absl::string_view text) { for (auto _ : state) { Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); - CHECK(re); + ABSL_CHECK(re); Prog* prog = re->CompileToProg(0); - CHECK(prog); - CHECK(prog->CanBitState()); + ABSL_CHECK(prog); + ABSL_CHECK(prog->CanBitState()); absl::string_view sp[2]; // 2 because sp[0] is whole match. - CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2)); + ABSL_CHECK(prog->SearchBitState(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 2)); delete prog; re->Decref(); } @@ -1258,9 +1279,9 @@ void Parse1PCRE(benchmark::State& state, const char* regexp, absl::string_view text) { for (auto _ : state) { PCRE re(regexp, PCRE::UTF8); - CHECK_EQ(re.error(), ""); + ABSL_CHECK_EQ(re.error(), ""); absl::string_view sp1; - CHECK(PCRE::FullMatch(text, re, &sp1)); + ABSL_CHECK(PCRE::FullMatch(text, re, &sp1)); } } @@ -1268,9 +1289,9 @@ void Parse1RE2(benchmark::State& state, const char* regexp, absl::string_view text) { for (auto _ : state) { RE2 re(regexp); - CHECK_EQ(re.error(), ""); + ABSL_CHECK_EQ(re.error(), ""); absl::string_view sp1; - CHECK(RE2::FullMatch(text, re, &sp1)); + ABSL_CHECK(RE2::FullMatch(text, re, &sp1)); } } @@ -1279,7 +1300,7 @@ void Parse1CachedNFA(benchmark::State& state, const char* regexp, Prog* prog = GetCachedProg(regexp); absl::string_view sp[2]; // 2 because sp[0] is whole match. for (auto _ : state) { - CHECK(prog->SearchNFA(text, absl::string_view(), Prog::kAnchored, + ABSL_CHECK(prog->SearchNFA(text, absl::string_view(), Prog::kAnchored, Prog::kFullMatch, sp, 2)); } } @@ -1287,20 +1308,22 @@ void Parse1CachedNFA(benchmark::State& state, const char* regexp, void Parse1CachedOnePass(benchmark::State& state, const char* regexp, absl::string_view text) { Prog* prog = GetCachedProg(regexp); - CHECK(prog->IsOnePass()); + ABSL_CHECK(prog->IsOnePass()); absl::string_view sp[2]; // 2 because sp[0] is whole match. for (auto _ : state) { - CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2)); + ABSL_CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 2)); } } void Parse1CachedBitState(benchmark::State& state, const char* regexp, absl::string_view text) { Prog* prog = GetCachedProg(regexp); - CHECK(prog->CanBitState()); + ABSL_CHECK(prog->CanBitState()); absl::string_view sp[2]; // 2 because sp[0] is whole match. for (auto _ : state) { - CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2)); + ABSL_CHECK(prog->SearchBitState(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 2)); } } @@ -1309,7 +1332,8 @@ void Parse1CachedBacktrack(benchmark::State& state, const char* regexp, Prog* prog = GetCachedProg(regexp); absl::string_view sp[2]; // 2 because sp[0] is whole match. for (auto _ : state) { - CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2)); + ABSL_CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, + Prog::kFullMatch, sp, 2)); } } @@ -1318,7 +1342,7 @@ void Parse1CachedPCRE(benchmark::State& state, const char* regexp, PCRE& re = *GetCachedPCRE(regexp); absl::string_view sp1; for (auto _ : state) { - CHECK(PCRE::FullMatch(text, re, &sp1)); + ABSL_CHECK(PCRE::FullMatch(text, re, &sp1)); } } @@ -1327,7 +1351,7 @@ void Parse1CachedRE2(benchmark::State& state, const char* regexp, RE2& re = *GetCachedRE2(regexp); absl::string_view sp1; for (auto _ : state) { - CHECK(RE2::FullMatch(text, re, &sp1)); + ABSL_CHECK(RE2::FullMatch(text, re, &sp1)); } } @@ -1336,7 +1360,7 @@ void SearchParse2CachedPCRE(benchmark::State& state, const char* regexp, PCRE& re = *GetCachedPCRE(regexp); for (auto _ : state) { absl::string_view sp1, sp2; - CHECK(PCRE::PartialMatch(text, re, &sp1, &sp2)); + ABSL_CHECK(PCRE::PartialMatch(text, re, &sp1, &sp2)); } } @@ -1345,7 +1369,7 @@ void SearchParse2CachedRE2(benchmark::State& state, const char* regexp, RE2& re = *GetCachedRE2(regexp); for (auto _ : state) { absl::string_view sp1, sp2; - CHECK(RE2::PartialMatch(text, re, &sp1, &sp2)); + ABSL_CHECK(RE2::PartialMatch(text, re, &sp1, &sp2)); } } @@ -1354,7 +1378,7 @@ void SearchParse1CachedPCRE(benchmark::State& state, const char* regexp, PCRE& re = *GetCachedPCRE(regexp); for (auto _ : state) { absl::string_view sp1; - CHECK(PCRE::PartialMatch(text, re, &sp1)); + ABSL_CHECK(PCRE::PartialMatch(text, re, &sp1)); } } @@ -1363,7 +1387,7 @@ void SearchParse1CachedRE2(benchmark::State& state, const char* regexp, RE2& re = *GetCachedRE2(regexp); for (auto _ : state) { absl::string_view sp1; - CHECK(RE2::PartialMatch(text, re, &sp1)); + ABSL_CHECK(RE2::PartialMatch(text, re, &sp1)); } } @@ -1499,7 +1523,7 @@ void FullMatchPCRE(benchmark::State& state, const char *regexp) { s += "ABCDEFGHIJ"; PCRE re(regexp); for (auto _ : state) { - CHECK(PCRE::FullMatch(s, re)); + ABSL_CHECK(PCRE::FullMatch(s, re)); } state.SetBytesProcessed(state.iterations() * state.range(0)); } @@ -1509,19 +1533,31 @@ void FullMatchRE2(benchmark::State& state, const char *regexp) { s += "ABCDEFGHIJ"; RE2 re(regexp, RE2::Latin1); for (auto _ : state) { - CHECK(RE2::FullMatch(s, re)); + ABSL_CHECK(RE2::FullMatch(s, re)); } state.SetBytesProcessed(state.iterations() * state.range(0)); } -void FullMatch_DotStar_CachedPCRE(benchmark::State& state) { FullMatchPCRE(state, "(?s).*"); } -void FullMatch_DotStar_CachedRE2(benchmark::State& state) { FullMatchRE2(state, "(?s).*"); } +void FullMatch_DotStar_CachedPCRE(benchmark::State& state) { + FullMatchPCRE(state, "(?s).*"); +} +void FullMatch_DotStar_CachedRE2(benchmark::State& state) { + FullMatchRE2(state, "(?s).*"); +} -void FullMatch_DotStarDollar_CachedPCRE(benchmark::State& state) { FullMatchPCRE(state, "(?s).*$"); } -void FullMatch_DotStarDollar_CachedRE2(benchmark::State& state) { FullMatchRE2(state, "(?s).*$"); } +void FullMatch_DotStarDollar_CachedPCRE(benchmark::State& state) { + FullMatchPCRE(state, "(?s).*$"); +} +void FullMatch_DotStarDollar_CachedRE2(benchmark::State& state) { + FullMatchRE2(state, "(?s).*$"); +} -void FullMatch_DotStarCapture_CachedPCRE(benchmark::State& state) { FullMatchPCRE(state, "(?s)((.*)()()($))"); } -void FullMatch_DotStarCapture_CachedRE2(benchmark::State& state) { FullMatchRE2(state, "(?s)((.*)()()($))"); } +void FullMatch_DotStarCapture_CachedPCRE(benchmark::State& state) { + FullMatchPCRE(state, "(?s)((.*)()()($))"); +} +void FullMatch_DotStarCapture_CachedRE2(benchmark::State& state) { + FullMatchRE2(state, "(?s)((.*)()()($))"); +} #ifdef USEPCRE BENCHMARK_RANGE(FullMatch_DotStar_CachedPCRE, 8, 2<<20); @@ -1544,7 +1580,7 @@ void PossibleMatchRangeCommon(benchmark::State& state, const char* regexp) { std::string max; const int kMaxLen = 16; for (auto _ : state) { - CHECK(re.PossibleMatchRange(&min, &max, kMaxLen)); + ABSL_CHECK(re.PossibleMatchRange(&min, &max, kMaxLen)); } } diff --git a/yass/third_party/re2/re2/testing/regexp_generator.cc b/yass/third_party/re2/re2/testing/regexp_generator.cc index b1761ed937..a702e7d839 100644 --- a/yass/third_party/re2/re2/testing/regexp_generator.cc +++ b/yass/third_party/re2/re2/testing/regexp_generator.cc @@ -20,22 +20,26 @@ // Then RunPostfix turns each sequence into a regular expression // and passes the regexp to HandleRegexp. +#include "re2/testing/regexp_generator.h" + #include #include #include #include + #include +#include #include #include #include #include "absl/base/macros.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/escaping.h" #include "absl/strings/str_format.h" -#include "gtest/gtest.h" -#include "util/logging.h" +#include "absl/strings/string_view.h" #include "util/utf.h" -#include "re2/testing/regexp_generator.h" namespace re2 { @@ -196,13 +200,13 @@ void RegexpGenerator::RunPostfix(const std::vector& post) { for (size_t i = 0; i < post.size(); i++) { switch (CountArgs(post[i])) { default: - LOG(FATAL) << "Bad operator: " << post[i]; + ABSL_LOG(FATAL) << "Bad operator: " << post[i]; case 0: regexps.push(post[i]); break; case 1: { auto fmt = absl::ParsedFormat<'s'>::New(post[i]); - CHECK(fmt != nullptr); + ABSL_CHECK(fmt != nullptr); std::string a = regexps.top(); regexps.pop(); regexps.push("(?:" + absl::StrFormat(*fmt, a) + ")"); @@ -210,7 +214,7 @@ void RegexpGenerator::RunPostfix(const std::vector& post) { } case 2: { auto fmt = absl::ParsedFormat<'s', 's'>::New(post[i]); - CHECK(fmt != nullptr); + ABSL_CHECK(fmt != nullptr); std::string b = regexps.top(); regexps.pop(); std::string a = regexps.top(); @@ -232,7 +236,7 @@ void RegexpGenerator::RunPostfix(const std::vector& post) { absl::PrintF(" %s\n", absl::CEscape(regexps.top())); regexps.pop(); } - LOG(FATAL) << "Bad regexp program."; + ABSL_LOG(FATAL) << "Bad regexp program."; } HandleRegexp(regexps.top()); diff --git a/yass/third_party/re2/re2/testing/regexp_generator.h b/yass/third_party/re2/re2/testing/regexp_generator.h index e1be1a93da..bb2128da8d 100644 --- a/yass/third_party/re2/re2/testing/regexp_generator.h +++ b/yass/third_party/re2/re2/testing/regexp_generator.h @@ -9,6 +9,7 @@ // regular expressions within given parameters (see below for details). #include + #include #include #include diff --git a/yass/third_party/re2/re2/testing/regexp_test.cc b/yass/third_party/re2/re2/testing/regexp_test.cc index ef8f59d363..e971bd0b36 100644 --- a/yass/third_party/re2/re2/testing/regexp_test.cc +++ b/yass/third_party/re2/re2/testing/regexp_test.cc @@ -4,14 +4,15 @@ // Test parse.cc, dump.cc, and tostring.cc. +#include "re2/regexp.h" + #include + #include #include #include #include "gtest/gtest.h" -#include "util/logging.h" -#include "re2/regexp.h" namespace re2 { diff --git a/yass/third_party/re2/re2/testing/required_prefix_test.cc b/yass/third_party/re2/re2/testing/required_prefix_test.cc index 231fd34856..ab7f4121f8 100644 --- a/yass/third_party/re2/re2/testing/required_prefix_test.cc +++ b/yass/third_party/re2/re2/testing/required_prefix_test.cc @@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +#include + #include #include "absl/base/macros.h" #include "gtest/gtest.h" -#include "util/logging.h" #include "re2/prog.h" #include "re2/regexp.h" diff --git a/yass/third_party/re2/re2/testing/search_test.cc b/yass/third_party/re2/re2/testing/search_test.cc index 166652a2db..0d0cb78b1d 100644 --- a/yass/third_party/re2/re2/testing/search_test.cc +++ b/yass/third_party/re2/re2/testing/search_test.cc @@ -2,12 +2,15 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +#include + +#include +#include + #include "absl/base/macros.h" #include "gtest/gtest.h" -#include "re2/prog.h" -#include "re2/regexp.h" -#include "re2/testing/tester.h" #include "re2/testing/exhaustive_tester.h" +#include "re2/testing/tester.h" // For target `log' in the Makefile. #ifndef LOGGING diff --git a/yass/third_party/re2/re2/testing/set_test.cc b/yass/third_party/re2/re2/testing/set_test.cc index fdbc0b2c74..5962295e28 100644 --- a/yass/third_party/re2/re2/testing/set_test.cc +++ b/yass/third_party/re2/re2/testing/set_test.cc @@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +#include "re2/set.h" + #include -#include -#include + #include +#include #include "gtest/gtest.h" -#include "util/logging.h" #include "re2/re2.h" -#include "re2/set.h" namespace re2 { diff --git a/yass/third_party/re2/re2/testing/simplify_test.cc b/yass/third_party/re2/re2/testing/simplify_test.cc index 5b683f580c..efbe967458 100644 --- a/yass/third_party/re2/re2/testing/simplify_test.cc +++ b/yass/third_party/re2/re2/testing/simplify_test.cc @@ -5,11 +5,10 @@ // Test simplify.cc. #include -#include #include "absl/base/macros.h" +#include "absl/log/absl_log.h" #include "gtest/gtest.h" -#include "util/logging.h" #include "re2/regexp.h" namespace re2 { @@ -264,7 +263,7 @@ static Test tests[] = { TEST(TestSimplify, SimpleRegexps) { for (size_t i = 0; i < ABSL_ARRAYSIZE(tests); i++) { RegexpStatus status; - VLOG(1) << "Testing " << tests[i].regexp; + ABSL_VLOG(1) << "Testing " << tests[i].regexp; Regexp* re = Regexp::Parse(tests[i].regexp, Regexp::MatchNL | (Regexp::LikePerl & ~Regexp::OneLine), diff --git a/yass/third_party/re2/re2/testing/string_generator.cc b/yass/third_party/re2/re2/testing/string_generator.cc index 1891b14a7a..6e450a9429 100644 --- a/yass/third_party/re2/re2/testing/string_generator.cc +++ b/yass/third_party/re2/re2/testing/string_generator.cc @@ -6,14 +6,17 @@ // maxlen letters using the set of letters in alpha. // Fetch strings using a Java-like Next()/HasNext() interface. +#include "re2/testing/string_generator.h" + #include #include + +#include #include #include -#include "gtest/gtest.h" -#include "util/logging.h" -#include "re2/testing/string_generator.h" +#include "absl/log/absl_check.h" +#include "absl/strings/string_view.h" namespace re2 { @@ -82,7 +85,7 @@ bool StringGenerator::RandomDigits() { // after computing the string, so that it knows the answer // for subsequent HasNext() calls. absl::string_view StringGenerator::Next() { - CHECK(hasnext_); + ABSL_CHECK(hasnext_); if (generate_null_) { generate_null_ = false; sp_ = absl::string_view(); @@ -112,8 +115,8 @@ void StringGenerator::GenerateNULL() { } std::string DeBruijnString(int n) { - CHECK_GE(n, 1); - CHECK_LE(n, 29); + ABSL_CHECK_GE(n, 1); + ABSL_CHECK_LE(n, 29); const size_t size = size_t{1} << static_cast(n); const size_t mask = size - 1; std::vector did(size, false); @@ -131,10 +134,10 @@ std::string DeBruijnString(int n) { } else { s += '0'; } - CHECK(!did[bits]); + ABSL_CHECK(!did[bits]); did[bits] = true; } - CHECK_EQ(s.size(), static_cast(n - 1) + size); + ABSL_CHECK_EQ(s.size(), static_cast(n - 1) + size); return s; } diff --git a/yass/third_party/re2/re2/testing/string_generator.h b/yass/third_party/re2/re2/testing/string_generator.h index 0d6f5fcbad..acdb3d5f1f 100644 --- a/yass/third_party/re2/re2/testing/string_generator.h +++ b/yass/third_party/re2/re2/testing/string_generator.h @@ -10,6 +10,7 @@ // Fetch strings using a Java-like Next()/HasNext() interface. #include + #include #include #include diff --git a/yass/third_party/re2/re2/testing/string_generator_test.cc b/yass/third_party/re2/re2/testing/string_generator_test.cc index b1273d9f62..62868d5074 100644 --- a/yass/third_party/re2/re2/testing/string_generator_test.cc +++ b/yass/third_party/re2/re2/testing/string_generator_test.cc @@ -4,13 +4,17 @@ // Test StringGenerator. +#include "re2/testing/string_generator.h" + +#include #include + #include +#include "absl/strings/string_view.h" #include "gtest/gtest.h" -#include "util/utf.h" -#include "re2/testing/string_generator.h" #include "re2/testing/regexp_generator.h" +#include "util/utf.h" namespace re2 { diff --git a/yass/third_party/re2/re2/testing/tester.cc b/yass/third_party/re2/re2/testing/tester.cc index a094cb4ff6..72925e392d 100644 --- a/yass/third_party/re2/re2/testing/tester.cc +++ b/yass/third_party/re2/re2/testing/tester.cc @@ -4,20 +4,25 @@ // Regular expression engine tester -- test all the implementations against each other. +#include "re2/testing/tester.h" + #include #include #include + #include #include "absl/base/macros.h" #include "absl/flags/flag.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/escaping.h" #include "absl/strings/str_format.h" -#include "util/logging.h" -#include "re2/testing/tester.h" +#include "absl/strings/string_view.h" #include "re2/prog.h" #include "re2/re2.h" #include "re2/regexp.h" +#include "util/pcre.h" ABSL_FLAG(bool, dump_prog, false, "dump regexp program"); ABSL_FLAG(bool, log_okay, false, "log successful runs"); @@ -50,9 +55,9 @@ const char* engine_names[kEngineMax] = { // Returns the name of the engine. static const char* EngineName(Engine e) { - CHECK_GE(e, 0); - CHECK_LT(e, ABSL_ARRAYSIZE(engine_names)); - CHECK(engine_names[e] != NULL); + ABSL_CHECK_GE(e, 0); + ABSL_CHECK_LT(e, ABSL_ARRAYSIZE(engine_names)); + ABSL_CHECK(engine_names[e] != NULL); return engine_names[e]; } @@ -73,12 +78,12 @@ static uint32_t Engines() { } if (cached_engines == 0) - LOG(INFO) << "Warning: no engines enabled."; + ABSL_LOG(INFO) << "Warning: no engines enabled."; if (!UsingPCRE) cached_engines &= ~(1<(0); i < kEngineMax; i++) { if (cached_engines & (1<NumCaptures(); prog_ = regexp_->CompileToProg(0); if (prog_ == NULL) { - LOG(INFO) << "Cannot compile: " << absl::CEscape(regexp_str_); + ABSL_LOG(INFO) << "Cannot compile: " << absl::CEscape(regexp_str_); error_ = true; return; } if (absl::GetFlag(FLAGS_dump_prog)) { - LOG(INFO) << "Prog for " - << " regexp " - << absl::CEscape(regexp_str_) - << " (" << FormatKind(kind_) - << ", " << FormatMode(flags_) - << ")\n" - << prog_->Dump(); + ABSL_LOG(INFO) << "Prog for " + << " regexp " + << absl::CEscape(regexp_str_) + << " (" << FormatKind(kind_) + << ", " << FormatMode(flags_) + << ")\n" + << prog_->Dump(); } // Compile regexp to reversed prog. Only needed for DFA engines. if (Engines() & ((1<CompileToReverseProg(0); if (rprog_ == NULL) { - LOG(INFO) << "Cannot reverse compile: " << absl::CEscape(regexp_str_); + ABSL_LOG(INFO) << "Cannot reverse compile: " + << absl::CEscape(regexp_str_); error_ = true; return; } if (absl::GetFlag(FLAGS_dump_rprog)) - LOG(INFO) << rprog_->Dump(); + ABSL_LOG(INFO) << rprog_->Dump(); } // Create re string that will be used for RE and RE2. @@ -257,7 +263,7 @@ TestInstance::TestInstance(absl::string_view regexp_str, Prog::MatchKind kind, options.set_longest_match(true); re2_ = new RE2(re, options); if (!re2_->error().empty()) { - LOG(INFO) << "Cannot RE2: " << absl::CEscape(re); + ABSL_LOG(INFO) << "Cannot RE2: " << absl::CEscape(re); error_ = true; return; } @@ -283,7 +289,7 @@ TestInstance::TestInstance(absl::string_view regexp_str, Prog::MatchKind kind, // add one more layer of parens. re_ = new PCRE("("+re+")", o); if (!re_->error().empty()) { - LOG(INFO) << "Cannot PCRE: " << absl::CEscape(re); + ABSL_LOG(INFO) << "Cannot PCRE: " << absl::CEscape(re); error_ = true; return; } @@ -318,7 +324,7 @@ void TestInstance::RunSearch(Engine type, absl::string_view orig_text, switch (type) { default: - LOG(FATAL) << "Bad RunSearch type: " << (int)type; + ABSL_LOG(FATAL) << "Bad RunSearch type: " << (int)type; case kEngineBacktrack: if (prog_ == NULL) { @@ -366,9 +372,9 @@ void TestInstance::RunSearch(Engine type, absl::string_view orig_text, Prog::kAnchored, Prog::kLongestMatch, result->submatch, &result->skipped, NULL)) { - LOG(ERROR) << "Reverse DFA inconsistency: " - << absl::CEscape(regexp_str_) - << " on " << absl::CEscape(text); + ABSL_LOG(ERROR) << "Reverse DFA inconsistency: " + << absl::CEscape(regexp_str_) + << " on " << absl::CEscape(text); result->matched = false; } } @@ -520,16 +526,16 @@ bool TestInstance::RunCase(absl::string_view text, absl::string_view context, if (correct.skipped) { if (regexp_ == NULL) return true; - LOG(ERROR) << "Skipped backtracking! " << absl::CEscape(regexp_str_) - << " " << FormatMode(flags_); + ABSL_LOG(ERROR) << "Skipped backtracking! " << absl::CEscape(regexp_str_) + << " " << FormatMode(flags_); return false; } - VLOG(1) << "Try: regexp " << absl::CEscape(regexp_str_) - << " text " << absl::CEscape(text) - << " (" << FormatKind(kind_) - << ", " << FormatAnchor(anchor) - << ", " << FormatMode(flags_) - << ")"; + ABSL_VLOG(1) << "Try: regexp " << absl::CEscape(regexp_str_) + << " text " << absl::CEscape(text) + << " (" << FormatKind(kind_) + << ", " << FormatAnchor(anchor) + << ", " << FormatMode(flags_) + << ")"; // Compare the others. bool all_okay = true; @@ -560,22 +566,22 @@ bool TestInstance::RunCase(absl::string_view text, absl::string_view context, context, anchor); if (r.matched != correct.matched) { if (r.matched) { - LOG(INFO) << " Should not match (but does)."; + ABSL_LOG(INFO) << " Should not match (but does)."; } else { - LOG(INFO) << " Should match (but does not)."; + ABSL_LOG(INFO) << " Should match (but does not)."; continue; } } for (int i = 0; i < 1+num_captures_; i++) { if (r.submatch[i].data() != correct.submatch[i].data() || r.submatch[i].size() != correct.submatch[i].size()) { - LOG(INFO) << + ABSL_LOG(INFO) << absl::StrFormat(" $%d: should be %s is %s", i, FormatCapture(text, correct.submatch[i]), FormatCapture(text, r.submatch[i])); } else { - LOG(INFO) << + ABSL_LOG(INFO) << absl::StrFormat(" $%d: %s ok", i, FormatCapture(text, r.submatch[i])); } @@ -587,7 +593,7 @@ bool TestInstance::RunCase(absl::string_view text, absl::string_view context, // and that is desirable because we want to enforce a global limit. static int max_regexp_failures = absl::GetFlag(FLAGS_max_regexp_failures); if (max_regexp_failures > 0 && --max_regexp_failures == 0) - LOG(QFATAL) << "Too many regexp failures."; + ABSL_LOG(QFATAL) << "Too many regexp failures."; } return all_okay; @@ -596,7 +602,7 @@ bool TestInstance::RunCase(absl::string_view text, absl::string_view context, void TestInstance::LogMatch(const char* prefix, Engine e, absl::string_view text, absl::string_view context, Prog::Anchor anchor) { - LOG(INFO) << prefix + ABSL_LOG(INFO) << prefix << EngineName(e) << " regexp " << absl::CEscape(regexp_str_) diff --git a/yass/third_party/re2/re2/testing/tester.h b/yass/third_party/re2/re2/testing/tester.h index 59be5ea0af..9a87138e83 100644 --- a/yass/third_party/re2/re2/testing/tester.h +++ b/yass/third_party/re2/re2/testing/tester.h @@ -12,8 +12,8 @@ #include "absl/strings/string_view.h" #include "re2/prog.h" -#include "re2/regexp.h" #include "re2/re2.h" +#include "re2/regexp.h" #include "util/pcre.h" namespace re2 { diff --git a/yass/third_party/re2/re2/tostring.cc b/yass/third_party/re2/re2/tostring.cc index 33179fdeb8..24a530e643 100644 --- a/yass/third_party/re2/re2/tostring.cc +++ b/yass/third_party/re2/re2/tostring.cc @@ -6,13 +6,14 @@ // Tested by parse_test.cc #include + #include +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" -#include "util/logging.h" -#include "util/utf.h" #include "re2/regexp.h" #include "re2/walker-inl.h" +#include "util/utf.h" namespace re2 { @@ -101,7 +102,7 @@ int ToStringWalker::PreVisit(Regexp* re, int parent_arg, bool* stop) { case kRegexpCapture: t_->append("("); if (re->cap() == 0) - LOG(DFATAL) << "kRegexpCapture cap() == 0"; + ABSL_LOG(DFATAL) << "kRegexpCapture cap() == 0"; if (re->name()) { t_->append("?P<"); t_->append(*re->name()); @@ -184,7 +185,7 @@ int ToStringWalker::PostVisit(Regexp* re, int parent_arg, int pre_arg, if ((*t_)[t_->size()-1] == '|') t_->erase(t_->size()-1); else - LOG(DFATAL) << "Bad final char: " << t_; + ABSL_LOG(DFATAL) << "Bad final char: " << t_; if (prec < PrecAlternate) t_->append(")"); break; diff --git a/yass/third_party/re2/re2/walker-inl.h b/yass/third_party/re2/re2/walker-inl.h index 45763a7b26..2283d6daf4 100644 --- a/yass/third_party/re2/re2/walker-inl.h +++ b/yass/third_party/re2/re2/walker-inl.h @@ -16,7 +16,8 @@ #include #include "absl/base/macros.h" -#include "util/logging.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "re2/regexp.h" namespace re2 { @@ -147,7 +148,7 @@ template Regexp::Walker::~Walker() { // Logs DFATAL if stack is not already clear. template void Regexp::Walker::Reset() { if (!stack_.empty()) { - LOG(DFATAL) << "Stack not empty."; + ABSL_LOG(DFATAL) << "Stack not empty."; while (!stack_.empty()) { if (stack_.top().re->nsub_ > 1) delete[] stack_.top().child_args; @@ -161,7 +162,7 @@ template T Regexp::Walker::WalkInternal(Regexp* re, T top_arg, Reset(); if (re == NULL) { - LOG(DFATAL) << "Walk NULL"; + ABSL_LOG(DFATAL) << "Walk NULL"; return top_arg; } diff --git a/yass/third_party/re2/util/logging.h b/yass/third_party/re2/util/logging.h deleted file mode 100644 index 946962b39b..0000000000 --- a/yass/third_party/re2/util/logging.h +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2009 The RE2 Authors. All Rights Reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -#ifndef UTIL_LOGGING_H_ -#define UTIL_LOGGING_H_ - -// Simplified version of Google's logging. - -#include -#include -#include -#include -#include - -#include "absl/base/attributes.h" - -// Debug-only checking. -#define DCHECK(condition) assert(condition) -#define DCHECK_EQ(val1, val2) assert((val1) == (val2)) -#define DCHECK_NE(val1, val2) assert((val1) != (val2)) -#define DCHECK_LE(val1, val2) assert((val1) <= (val2)) -#define DCHECK_LT(val1, val2) assert((val1) < (val2)) -#define DCHECK_GE(val1, val2) assert((val1) >= (val2)) -#define DCHECK_GT(val1, val2) assert((val1) > (val2)) - -// Always-on checking -#define CHECK(x) if(x){}else LogMessageFatal(__FILE__, __LINE__).stream() << "Check failed: " #x -#define CHECK_LT(x, y) CHECK((x) < (y)) -#define CHECK_GT(x, y) CHECK((x) > (y)) -#define CHECK_LE(x, y) CHECK((x) <= (y)) -#define CHECK_GE(x, y) CHECK((x) >= (y)) -#define CHECK_EQ(x, y) CHECK((x) == (y)) -#define CHECK_NE(x, y) CHECK((x) != (y)) - -#define LOG_INFO LogMessage(__FILE__, __LINE__) -#define LOG_WARNING LogMessage(__FILE__, __LINE__) -#define LOG_ERROR LogMessage(__FILE__, __LINE__) -#define LOG_FATAL LogMessageFatal(__FILE__, __LINE__) -#define LOG_QFATAL LOG_FATAL - -// It seems that one of the Windows header files defines ERROR as 0. -#ifdef _WIN32 -#define LOG_0 LOG_INFO -#endif - -#ifdef NDEBUG -#define LOG_DFATAL LOG_ERROR -#else -#define LOG_DFATAL LOG_FATAL -#endif - -#define LOG(severity) LOG_ ## severity.stream() - -#define VLOG(x) if((x)>0){}else LOG_INFO.stream() - -class LogMessage { - public: - LogMessage(const char* file, int line) - : flushed_(false) { - stream() << file << ":" << line << ": "; - } - void Flush() { - stream() << "\n"; - std::string s = str_.str(); - size_t n = s.size(); - if (fwrite(s.data(), 1, n, stderr) < n) {} // shut up gcc - flushed_ = true; - } - ~LogMessage() { - if (!flushed_) { - Flush(); - } - } - std::ostream& stream() { return str_; } - - private: - bool flushed_; - std::ostringstream str_; - - LogMessage(const LogMessage&) = delete; - LogMessage& operator=(const LogMessage&) = delete; -}; - -// Silence "destructor never returns" warning for ~LogMessageFatal(). -// Since this is a header file, push and then pop to limit the scope. -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4722) -#endif - -class LogMessageFatal : public LogMessage { - public: - LogMessageFatal(const char* file, int line) - : LogMessage(file, line) {} - ABSL_ATTRIBUTE_NORETURN ~LogMessageFatal() { - Flush(); - abort(); - } - private: - LogMessageFatal(const LogMessageFatal&) = delete; - LogMessageFatal& operator=(const LogMessageFatal&) = delete; -}; - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#endif // UTIL_LOGGING_H_ diff --git a/yass/third_party/re2/util/pcre.cc b/yass/third_party/re2/util/pcre.cc index 27aee3dc48..94a88b7c94 100644 --- a/yass/third_party/re2/util/pcre.cc +++ b/yass/third_party/re2/util/pcre.cc @@ -16,8 +16,9 @@ #include #include "absl/flags/flag.h" +#include "absl/log/absl_check.h" +#include "absl/log/absl_log.h" #include "absl/strings/str_format.h" -#include "util/logging.h" #include "util/pcre.h" // Silence warnings about the wacky formatting in the operator() functions. @@ -25,7 +26,7 @@ #pragma GCC diagnostic ignored "-Wmisleading-indentation" #endif -#define PCREPORT(level) LOG(level) +#define PCREPORT(level) ABSL_LOG(level) // Default PCRE limits. // Defaults chosen to allow a plausible amount of CPU and diff --git a/yass/third_party/re2/util/pcre.h b/yass/third_party/re2/util/pcre.h index 846f30019e..c0e944e025 100644 --- a/yass/third_party/re2/util/pcre.h +++ b/yass/third_party/re2/util/pcre.h @@ -39,10 +39,10 @@ // supplied pattern exactly. // // Example: successful match -// CHECK(PCRE::FullMatch("hello", "h.*o")); +// ABSL_CHECK(PCRE::FullMatch("hello", "h.*o")); // // Example: unsuccessful match (requires full match): -// CHECK(!PCRE::FullMatch("hello", "e")); +// ABSL_CHECK(!PCRE::FullMatch("hello", "e")); // // ----------------------------------------------------------------------- // UTF-8 AND THE MATCHING INTERFACE: @@ -58,7 +58,7 @@ // // Example: // PCRE re(utf8_pattern, PCRE::UTF8); -// CHECK(PCRE::FullMatch(utf8_string, re)); +// ABSL_CHECK(PCRE::FullMatch(utf8_string, re)); // // ----------------------------------------------------------------------- // MATCHING WITH SUBSTRING EXTRACTION: @@ -68,22 +68,22 @@ // Example: extracts "ruby" into "s" and 1234 into "i" // int i; // std::string s; -// CHECK(PCRE::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s, &i)); +// ABSL_CHECK(PCRE::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s, &i)); // // Example: fails because string cannot be stored in integer -// CHECK(!PCRE::FullMatch("ruby", "(.*)", &i)); +// ABSL_CHECK(!PCRE::FullMatch("ruby", "(.*)", &i)); // // Example: fails because there aren't enough sub-patterns: -// CHECK(!PCRE::FullMatch("ruby:1234", "\\w+:\\d+", &s)); +// ABSL_CHECK(!PCRE::FullMatch("ruby:1234", "\\w+:\\d+", &s)); // // Example: does not try to extract any extra sub-patterns -// CHECK(PCRE::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s)); +// ABSL_CHECK(PCRE::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s)); // // Example: does not try to extract into NULL -// CHECK(PCRE::FullMatch("ruby:1234", "(\\w+):(\\d+)", NULL, &i)); +// ABSL_CHECK(PCRE::FullMatch("ruby:1234", "(\\w+):(\\d+)", NULL, &i)); // // Example: integer overflow causes failure -// CHECK(!PCRE::FullMatch("ruby:1234567891234", "\\w+:(\\d+)", &i)); +// ABSL_CHECK(!PCRE::FullMatch("ruby:1234567891234", "\\w+:(\\d+)", &i)); // // ----------------------------------------------------------------------- // PARTIAL MATCHES @@ -92,12 +92,12 @@ // to match any substring of the text. // // Example: simple search for a string: -// CHECK(PCRE::PartialMatch("hello", "ell")); +// ABSL_CHECK(PCRE::PartialMatch("hello", "ell")); // // Example: find first number in a string // int number; -// CHECK(PCRE::PartialMatch("x*100 + 20", "(\\d+)", &number)); -// CHECK_EQ(number, 100); +// ABSL_CHECK(PCRE::PartialMatch("x*100 + 20", "(\\d+)", &number)); +// ABSL_CHECK_EQ(number, 100); // // ----------------------------------------------------------------------- // PPCRE-COMPILED PCREGULAR EXPPCRESSIONS @@ -157,7 +157,7 @@ // // Example: // int a, b, c, d; -// CHECK(PCRE::FullMatch("100 40 0100 0x40", "(.*) (.*) (.*) (.*)", +// ABSL_CHECK(PCRE::FullMatch("100 40 0100 0x40", "(.*) (.*) (.*) (.*)", // Octal(&a), Hex(&b), CRadix(&c), CRadix(&d)); // will leave 64 in a, b, c, and d. @@ -379,7 +379,7 @@ class PCRE { // text. E.g., // // std::string s = "yabba dabba doo"; - // CHECK(PCRE::Replace(&s, "b+", "d")); + // ABSL_CHECK(PCRE::Replace(&s, "b+", "d")); // // will leave "s" containing "yada dabba doo" // @@ -393,7 +393,7 @@ class PCRE { // re-matching. E.g., // // std::string s = "yabba dabba doo"; - // CHECK(PCRE::GlobalReplace(&s, "b+", "d")); + // ABSL_CHECK(PCRE::GlobalReplace(&s, "b+", "d")); // // will leave "s" containing "yada dada doo" // @@ -417,7 +417,7 @@ class PCRE { // * The @p rewrite string doesn't have any syntax errors // ('\' followed by anything besides [0-9] and '\'). // Making this test will guarantee that "replace" and "extract" - // operations won't LOG(ERROR) or fail because of a bad rewrite + // operations won't ABSL_LOG(ERROR) or fail because of a bad rewrite // string. // @param rewrite The proposed rewrite string. // @param error An error message is recorded here, iff we return false. diff --git a/yass/third_party/sqlite/src/amalgamation/shell/shell.c b/yass/third_party/sqlite/src/amalgamation/shell/shell.c index 5230da9fce..078c2f15b1 100644 --- a/yass/third_party/sqlite/src/amalgamation/shell/shell.c +++ b/yass/third_party/sqlite/src/amalgamation/shell/shell.c @@ -14347,6 +14347,15 @@ int sqlite3_recover_finish(sqlite3_recover*); typedef struct DbdataTable DbdataTable; typedef struct DbdataCursor DbdataCursor; +typedef struct DbdataBuffer DbdataBuffer; + +/* +** Buffer type. +*/ +struct DbdataBuffer { + u8 *aBuf; + sqlite3_int64 nBuf; +}; /* Cursor object */ struct DbdataCursor { @@ -14363,7 +14372,7 @@ struct DbdataCursor { sqlite3_int64 iRowid; /* Only for the sqlite_dbdata table */ - u8 *pRec; /* Buffer containing current record */ + DbdataBuffer rec; sqlite3_int64 nRec; /* Size of pRec[] in bytes */ sqlite3_int64 nHdr; /* Size of header in bytes */ int iField; /* Current field number */ @@ -14408,6 +14417,31 @@ struct DbdataTable { " schema TEXT HIDDEN" \ ")" +/* +** Ensure the buffer passed as the first argument is at least nMin bytes +** in size. If an error occurs while attempting to resize the buffer, +** SQLITE_NOMEM is returned. Otherwise, SQLITE_OK. +*/ +static int dbdataBufferSize(DbdataBuffer *pBuf, sqlite3_int64 nMin){ + if( nMin>pBuf->nBuf ){ + sqlite3_int64 nNew = nMin+16384; + u8 *aNew = (u8*)sqlite3_realloc64(pBuf->aBuf, nNew); + + if( aNew==0 ) return SQLITE_NOMEM; + pBuf->aBuf = aNew; + pBuf->nBuf = nNew; + } + return SQLITE_OK; +} + +/* +** Release the allocation managed by buffer pBuf. +*/ +static void dbdataBufferFree(DbdataBuffer *pBuf){ + sqlite3_free(pBuf->aBuf); + memset(pBuf, 0, sizeof(*pBuf)); +} + /* ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual ** table. @@ -14548,8 +14582,7 @@ static void dbdataResetCursor(DbdataCursor *pCsr){ pCsr->iField = 0; pCsr->bOnePage = 0; sqlite3_free(pCsr->aPage); - sqlite3_free(pCsr->pRec); - pCsr->pRec = 0; + dbdataBufferFree(&pCsr->rec); pCsr->aPage = 0; } @@ -14692,62 +14725,74 @@ static void dbdataValue( u8 *pData, sqlite3_int64 nData ){ - if( eType>=0 && dbdataValueBytes(eType)<=nData ){ - switch( eType ){ - case 0: - case 10: - case 11: - sqlite3_result_null(pCtx); - break; - - case 8: - sqlite3_result_int(pCtx, 0); - break; - case 9: - sqlite3_result_int(pCtx, 1); - break; - - case 1: case 2: case 3: case 4: case 5: case 6: case 7: { - sqlite3_uint64 v = (signed char)pData[0]; - pData++; - switch( eType ){ - case 7: - case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; - case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; - case 4: v = (v<<8) + pData[0]; pData++; - case 3: v = (v<<8) + pData[0]; pData++; - case 2: v = (v<<8) + pData[0]; pData++; - } - - if( eType==7 ){ - double r; - memcpy(&r, &v, sizeof(r)); - sqlite3_result_double(pCtx, r); - }else{ - sqlite3_result_int64(pCtx, (sqlite3_int64)v); - } - break; - } - - default: { - int n = ((eType-12) / 2); - if( eType % 2 ){ - switch( enc ){ -#ifndef SQLITE_OMIT_UTF16 - case SQLITE_UTF16BE: - sqlite3_result_text16be(pCtx, (void*)pData, n, SQLITE_TRANSIENT); - break; - case SQLITE_UTF16LE: - sqlite3_result_text16le(pCtx, (void*)pData, n, SQLITE_TRANSIENT); - break; -#endif - default: - sqlite3_result_text(pCtx, (char*)pData, n, SQLITE_TRANSIENT); - break; + if( eType>=0 ){ + if( dbdataValueBytes(eType)<=nData ){ + switch( eType ){ + case 0: + case 10: + case 11: + sqlite3_result_null(pCtx); + break; + + case 8: + sqlite3_result_int(pCtx, 0); + break; + case 9: + sqlite3_result_int(pCtx, 1); + break; + + case 1: case 2: case 3: case 4: case 5: case 6: case 7: { + sqlite3_uint64 v = (signed char)pData[0]; + pData++; + switch( eType ){ + case 7: + case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; + case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; + case 4: v = (v<<8) + pData[0]; pData++; + case 3: v = (v<<8) + pData[0]; pData++; + case 2: v = (v<<8) + pData[0]; pData++; } - }else{ - sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT); + + if( eType==7 ){ + double r; + memcpy(&r, &v, sizeof(r)); + sqlite3_result_double(pCtx, r); + }else{ + sqlite3_result_int64(pCtx, (sqlite3_int64)v); + } + break; } + + default: { + int n = ((eType-12) / 2); + if( eType % 2 ){ + switch( enc ){ + #ifndef SQLITE_OMIT_UTF16 + case SQLITE_UTF16BE: + sqlite3_result_text16be(pCtx, (void*)pData, n, SQLITE_TRANSIENT); + break; + case SQLITE_UTF16LE: + sqlite3_result_text16le(pCtx, (void*)pData, n, SQLITE_TRANSIENT); + break; + #endif + default: + sqlite3_result_text(pCtx, (char*)pData, n, SQLITE_TRANSIENT); + break; + } + }else{ + sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT); + } + } + } + }else{ + if( eType==7 ){ + sqlite3_result_double(pCtx, 0.0); + }else if( eType<7 ){ + sqlite3_result_int(pCtx, 0); + }else if( eType%2 ){ + sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); + }else{ + sqlite3_result_blob(pCtx, "", 0, SQLITE_STATIC); } } } @@ -14810,7 +14855,7 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ } }else{ /* If there is no record loaded, load it now. */ - if( pCsr->pRec==0 ){ + if( pCsr->nRec==0 ){ int bHasRowid = 0; int nPointer = 0; sqlite3_int64 nPayload = 0; @@ -14854,6 +14899,7 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ }else{ iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload); if( nPayload>0x7fffff00 ) nPayload &= 0x3fff; + if( nPayload==0 ) nPayload = 1; } /* If this is a leaf intkey cell, load the rowid */ @@ -14888,13 +14934,12 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ /* Allocate space for payload. And a bit more to catch small buffer ** overruns caused by attempting to read a varint or similar from ** near the end of a corrupt record. */ - pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES); - if( pCsr->pRec==0 ) return SQLITE_NOMEM; - memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES); - pCsr->nRec = nPayload; + rc = dbdataBufferSize(&pCsr->rec, nPayload+DBDATA_PADDING_BYTES); + if( rc!=SQLITE_OK ) return rc; + assert( nPayload!=0 ); /* Load the nLocal bytes of payload */ - memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal); + memcpy(pCsr->rec.aBuf, &pCsr->aPage[iOff], nLocal); iOff += nLocal; /* Load content from overflow pages */ @@ -14912,19 +14957,22 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ nCopy = U-4; if( nCopy>nRem ) nCopy = nRem; - memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy); + memcpy(&pCsr->rec.aBuf[nPayload-nRem], &aOvfl[4], nCopy); nRem -= nCopy; pgnoOvfl = get_uint32(aOvfl); sqlite3_free(aOvfl); } + nPayload -= nRem; } + memset(&pCsr->rec.aBuf[nPayload], 0, DBDATA_PADDING_BYTES); + pCsr->nRec = nPayload; - iHdr = dbdataGetVarintU32(pCsr->pRec, &nHdr); + iHdr = dbdataGetVarintU32(pCsr->rec.aBuf, &nHdr); if( nHdr>nPayload ) nHdr = 0; pCsr->nHdr = nHdr; - pCsr->pHdrPtr = &pCsr->pRec[iHdr]; - pCsr->pPtr = &pCsr->pRec[pCsr->nHdr]; + pCsr->pHdrPtr = &pCsr->rec.aBuf[iHdr]; + pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nHdr]; pCsr->iField = (bHasRowid ? -1 : 0); } } @@ -14932,7 +14980,7 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ pCsr->iField++; if( pCsr->iField>0 ){ sqlite3_int64 iType; - if( pCsr->pHdrPtr>=&pCsr->pRec[pCsr->nRec] + if( pCsr->pHdrPtr>=&pCsr->rec.aBuf[pCsr->nRec] || pCsr->iField>=DBDATA_MX_FIELD ){ bNextPage = 1; @@ -14940,8 +14988,8 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ int szField = 0; pCsr->pHdrPtr += dbdataGetVarintU32(pCsr->pHdrPtr, &iType); szField = dbdataValueBytes(iType); - if( (pCsr->nRec - (pCsr->pPtr - pCsr->pRec))pPtr = &pCsr->pRec[pCsr->nRec]; + if( (pCsr->nRec - (pCsr->pPtr - pCsr->rec.aBuf))pPtr = &pCsr->rec.aBuf[pCsr->nRec]; }else{ pCsr->pPtr += szField; } @@ -14951,20 +14999,18 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ if( bNextPage ){ sqlite3_free(pCsr->aPage); - sqlite3_free(pCsr->pRec); pCsr->aPage = 0; - pCsr->pRec = 0; + pCsr->nRec = 0; if( pCsr->bOnePage ) return SQLITE_OK; pCsr->iPgno++; }else{ - if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){ + if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->rec.aBuf[pCsr->nHdr] ){ return SQLITE_OK; } /* Advance to the next cell. The next iteration of the loop will load ** the record and so on. */ - sqlite3_free(pCsr->pRec); - pCsr->pRec = 0; + pCsr->nRec = 0; pCsr->iCell++; } } @@ -15154,12 +15200,12 @@ static int dbdataColumn( case DBDATA_COLUMN_VALUE: { if( pCsr->iField<0 ){ sqlite3_result_int64(ctx, pCsr->iIntkey); - }else if( &pCsr->pRec[pCsr->nRec] >= pCsr->pPtr ){ + }else if( &pCsr->rec.aBuf[pCsr->nRec] >= pCsr->pPtr ){ sqlite3_int64 iType; dbdataGetVarintU32(pCsr->pHdrPtr, &iType); dbdataValue( ctx, pCsr->enc, iType, pCsr->pPtr, - &pCsr->pRec[pCsr->nRec] - pCsr->pPtr + &pCsr->rec.aBuf[pCsr->nRec] - pCsr->pPtr ); } break; diff --git a/yass/third_party/sqlite/src/amalgamation/sqlite3.c b/yass/third_party/sqlite/src/amalgamation/sqlite3.c index e7f7b27baa..7878abf16d 100644 --- a/yass/third_party/sqlite/src/amalgamation/sqlite3.c +++ b/yass/third_party/sqlite/src/amalgamation/sqlite3.c @@ -18,7 +18,7 @@ ** separate file. This file contains only code for the core SQLite library. ** ** The content in this amalgamation comes from Fossil check-in -** c0b03aa071b8b0936237d880e5c46eef604a with changes in files: +** a58bd3cd7e0eae429f4b0aa288be7cc7783b with changes in files: ** ** manifest.uuid */ @@ -463,7 +463,7 @@ extern "C" { */ #define SQLITE_VERSION "3.45.2" #define SQLITE_VERSION_NUMBER 3045002 -#define SQLITE_SOURCE_ID "2024-03-12 11:06:23 c0b03aa071b8b0936237d880e5c46eef604af4ef77d91f73984b3253267ab149" +#define SQLITE_SOURCE_ID "2024-03-12 11:06:23 a58bd3cd7e0eae429f4b0aa288be7cc7783b9798674bc0e4adde311f23a3e3cd" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -258507,6 +258507,15 @@ typedef unsigned int u32; typedef struct DbdataTable DbdataTable; typedef struct DbdataCursor DbdataCursor; +typedef struct DbdataBuffer DbdataBuffer; + +/* +** Buffer type. +*/ +struct DbdataBuffer { + u8 *aBuf; + sqlite3_int64 nBuf; +}; /* Cursor object */ struct DbdataCursor { @@ -258523,7 +258532,7 @@ struct DbdataCursor { sqlite3_int64 iRowid; /* Only for the sqlite_dbdata table */ - u8 *pRec; /* Buffer containing current record */ + DbdataBuffer rec; sqlite3_int64 nRec; /* Size of pRec[] in bytes */ sqlite3_int64 nHdr; /* Size of header in bytes */ int iField; /* Current field number */ @@ -258568,6 +258577,31 @@ struct DbdataTable { " schema TEXT HIDDEN" \ ")" +/* +** Ensure the buffer passed as the first argument is at least nMin bytes +** in size. If an error occurs while attempting to resize the buffer, +** SQLITE_NOMEM is returned. Otherwise, SQLITE_OK. +*/ +static int dbdataBufferSize(DbdataBuffer *pBuf, sqlite3_int64 nMin){ + if( nMin>pBuf->nBuf ){ + sqlite3_int64 nNew = nMin+16384; + u8 *aNew = (u8*)sqlite3_realloc64(pBuf->aBuf, nNew); + + if( aNew==0 ) return SQLITE_NOMEM; + pBuf->aBuf = aNew; + pBuf->nBuf = nNew; + } + return SQLITE_OK; +} + +/* +** Release the allocation managed by buffer pBuf. +*/ +static void dbdataBufferFree(DbdataBuffer *pBuf){ + sqlite3_free(pBuf->aBuf); + memset(pBuf, 0, sizeof(*pBuf)); +} + /* ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual ** table. @@ -258708,8 +258742,7 @@ static void dbdataResetCursor(DbdataCursor *pCsr){ pCsr->iField = 0; pCsr->bOnePage = 0; sqlite3_free(pCsr->aPage); - sqlite3_free(pCsr->pRec); - pCsr->pRec = 0; + dbdataBufferFree(&pCsr->rec); pCsr->aPage = 0; } @@ -258852,62 +258885,74 @@ static void dbdataValue( u8 *pData, sqlite3_int64 nData ){ - if( eType>=0 && dbdataValueBytes(eType)<=nData ){ - switch( eType ){ - case 0: - case 10: - case 11: - sqlite3_result_null(pCtx); - break; + if( eType>=0 ){ + if( dbdataValueBytes(eType)<=nData ){ + switch( eType ){ + case 0: + case 10: + case 11: + sqlite3_result_null(pCtx); + break; - case 8: - sqlite3_result_int(pCtx, 0); - break; - case 9: - sqlite3_result_int(pCtx, 1); - break; + case 8: + sqlite3_result_int(pCtx, 0); + break; + case 9: + sqlite3_result_int(pCtx, 1); + break; - case 1: case 2: case 3: case 4: case 5: case 6: case 7: { - sqlite3_uint64 v = (signed char)pData[0]; - pData++; - switch( eType ){ - case 7: - case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; - case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; - case 4: v = (v<<8) + pData[0]; pData++; - case 3: v = (v<<8) + pData[0]; pData++; - case 2: v = (v<<8) + pData[0]; pData++; - } - - if( eType==7 ){ - double r; - memcpy(&r, &v, sizeof(r)); - sqlite3_result_double(pCtx, r); - }else{ - sqlite3_result_int64(pCtx, (sqlite3_int64)v); - } - break; - } - - default: { - int n = ((eType-12) / 2); - if( eType % 2 ){ - switch( enc ){ -#ifndef SQLITE_OMIT_UTF16 - case SQLITE_UTF16BE: - sqlite3_result_text16be(pCtx, (void*)pData, n, SQLITE_TRANSIENT); - break; - case SQLITE_UTF16LE: - sqlite3_result_text16le(pCtx, (void*)pData, n, SQLITE_TRANSIENT); - break; -#endif - default: - sqlite3_result_text(pCtx, (char*)pData, n, SQLITE_TRANSIENT); - break; + case 1: case 2: case 3: case 4: case 5: case 6: case 7: { + sqlite3_uint64 v = (signed char)pData[0]; + pData++; + switch( eType ){ + case 7: + case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; + case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; + case 4: v = (v<<8) + pData[0]; pData++; + case 3: v = (v<<8) + pData[0]; pData++; + case 2: v = (v<<8) + pData[0]; pData++; } - }else{ - sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT); + + if( eType==7 ){ + double r; + memcpy(&r, &v, sizeof(r)); + sqlite3_result_double(pCtx, r); + }else{ + sqlite3_result_int64(pCtx, (sqlite3_int64)v); + } + break; } + + default: { + int n = ((eType-12) / 2); + if( eType % 2 ){ + switch( enc ){ + #ifndef SQLITE_OMIT_UTF16 + case SQLITE_UTF16BE: + sqlite3_result_text16be(pCtx, (void*)pData, n, SQLITE_TRANSIENT); + break; + case SQLITE_UTF16LE: + sqlite3_result_text16le(pCtx, (void*)pData, n, SQLITE_TRANSIENT); + break; + #endif + default: + sqlite3_result_text(pCtx, (char*)pData, n, SQLITE_TRANSIENT); + break; + } + }else{ + sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT); + } + } + } + }else{ + if( eType==7 ){ + sqlite3_result_double(pCtx, 0.0); + }else if( eType<7 ){ + sqlite3_result_int(pCtx, 0); + }else if( eType%2 ){ + sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); + }else{ + sqlite3_result_blob(pCtx, "", 0, SQLITE_STATIC); } } } @@ -258970,7 +259015,7 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ } }else{ /* If there is no record loaded, load it now. */ - if( pCsr->pRec==0 ){ + if( pCsr->nRec==0 ){ int bHasRowid = 0; int nPointer = 0; sqlite3_int64 nPayload = 0; @@ -259014,6 +259059,7 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ }else{ iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload); if( nPayload>0x7fffff00 ) nPayload &= 0x3fff; + if( nPayload==0 ) nPayload = 1; } /* If this is a leaf intkey cell, load the rowid */ @@ -259048,13 +259094,12 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ /* Allocate space for payload. And a bit more to catch small buffer ** overruns caused by attempting to read a varint or similar from ** near the end of a corrupt record. */ - pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES); - if( pCsr->pRec==0 ) return SQLITE_NOMEM; - memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES); - pCsr->nRec = nPayload; + rc = dbdataBufferSize(&pCsr->rec, nPayload+DBDATA_PADDING_BYTES); + if( rc!=SQLITE_OK ) return rc; + assert( nPayload!=0 ); /* Load the nLocal bytes of payload */ - memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal); + memcpy(pCsr->rec.aBuf, &pCsr->aPage[iOff], nLocal); iOff += nLocal; /* Load content from overflow pages */ @@ -259072,19 +259117,22 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ nCopy = U-4; if( nCopy>nRem ) nCopy = nRem; - memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy); + memcpy(&pCsr->rec.aBuf[nPayload-nRem], &aOvfl[4], nCopy); nRem -= nCopy; pgnoOvfl = get_uint32(aOvfl); sqlite3_free(aOvfl); } + nPayload -= nRem; } + memset(&pCsr->rec.aBuf[nPayload], 0, DBDATA_PADDING_BYTES); + pCsr->nRec = nPayload; - iHdr = dbdataGetVarintU32(pCsr->pRec, &nHdr); + iHdr = dbdataGetVarintU32(pCsr->rec.aBuf, &nHdr); if( nHdr>nPayload ) nHdr = 0; pCsr->nHdr = nHdr; - pCsr->pHdrPtr = &pCsr->pRec[iHdr]; - pCsr->pPtr = &pCsr->pRec[pCsr->nHdr]; + pCsr->pHdrPtr = &pCsr->rec.aBuf[iHdr]; + pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nHdr]; pCsr->iField = (bHasRowid ? -1 : 0); } } @@ -259092,7 +259140,7 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ pCsr->iField++; if( pCsr->iField>0 ){ sqlite3_int64 iType; - if( pCsr->pHdrPtr>=&pCsr->pRec[pCsr->nRec] + if( pCsr->pHdrPtr>=&pCsr->rec.aBuf[pCsr->nRec] || pCsr->iField>=DBDATA_MX_FIELD ){ bNextPage = 1; @@ -259100,8 +259148,8 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ int szField = 0; pCsr->pHdrPtr += dbdataGetVarintU32(pCsr->pHdrPtr, &iType); szField = dbdataValueBytes(iType); - if( (pCsr->nRec - (pCsr->pPtr - pCsr->pRec))pPtr = &pCsr->pRec[pCsr->nRec]; + if( (pCsr->nRec - (pCsr->pPtr - pCsr->rec.aBuf))pPtr = &pCsr->rec.aBuf[pCsr->nRec]; }else{ pCsr->pPtr += szField; } @@ -259111,20 +259159,18 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){ if( bNextPage ){ sqlite3_free(pCsr->aPage); - sqlite3_free(pCsr->pRec); pCsr->aPage = 0; - pCsr->pRec = 0; + pCsr->nRec = 0; if( pCsr->bOnePage ) return SQLITE_OK; pCsr->iPgno++; }else{ - if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){ + if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->rec.aBuf[pCsr->nHdr] ){ return SQLITE_OK; } /* Advance to the next cell. The next iteration of the loop will load ** the record and so on. */ - sqlite3_free(pCsr->pRec); - pCsr->pRec = 0; + pCsr->nRec = 0; pCsr->iCell++; } } @@ -259314,12 +259360,12 @@ static int dbdataColumn( case DBDATA_COLUMN_VALUE: { if( pCsr->iField<0 ){ sqlite3_result_int64(ctx, pCsr->iIntkey); - }else if( &pCsr->pRec[pCsr->nRec] >= pCsr->pPtr ){ + }else if( &pCsr->rec.aBuf[pCsr->nRec] >= pCsr->pPtr ){ sqlite3_int64 iType; dbdataGetVarintU32(pCsr->pHdrPtr, &iType); dbdataValue( ctx, pCsr->enc, iType, pCsr->pPtr, - &pCsr->pRec[pCsr->nRec] - pCsr->pPtr + &pCsr->rec.aBuf[pCsr->nRec] - pCsr->pPtr ); } break; diff --git a/yass/third_party/sqlite/src/amalgamation/sqlite3.h b/yass/third_party/sqlite/src/amalgamation/sqlite3.h index afe3715dde..8ace9daa2c 100644 --- a/yass/third_party/sqlite/src/amalgamation/sqlite3.h +++ b/yass/third_party/sqlite/src/amalgamation/sqlite3.h @@ -148,7 +148,7 @@ extern "C" { */ #define SQLITE_VERSION "3.45.2" #define SQLITE_VERSION_NUMBER 3045002 -#define SQLITE_SOURCE_ID "2024-03-12 11:06:23 c0b03aa071b8b0936237d880e5c46eef604af4ef77d91f73984b3253267ab149" +#define SQLITE_SOURCE_ID "2024-03-12 11:06:23 a58bd3cd7e0eae429f4b0aa288be7cc7783b9798674bc0e4adde311f23a3e3cd" /* ** CAPI3REF: Run-Time Library Version Numbers diff --git a/yass/tools/build.go b/yass/tools/build.go index cd450b19a2..e9ca373b83 100644 --- a/yass/tools/build.go +++ b/yass/tools/build.go @@ -248,6 +248,23 @@ func prebuildFindSourceDirectory() { glog.Fatalf("Cannot find top dir of the source tree") } + // pretend PATH + if runtime.GOOS == "windows" { + path := os.Getenv("PATH") + path = "C:\\Program Files (x86)\\NASM;" + path + path = "C:\\Program Files\\NASM;" + path + path = "C:\\Program Files (x86)\\WiX Toolset v3.14\\bin;" + path + path = "C:\\Program Files\\CMake\\bin;" + path + path = "C:\\Program Files (x86)\\NSIS;" + path + path = "C:\\Program Files (x86)\\7-Zip;" + path + path = "C:\\Program Files\\7-Zip;" + path + path = "C:\\ProgramData\\chocolatey\\bin;" + path + path = filepath.Join(projectDir, "third_party", "nasm") + ";" + path + path = filepath.Join(projectDir, "third_party", "wix311") + ";" + path + path = filepath.Join(projectDir, "third_party", "nsis") + ";" + path + os.Setenv("PATH", path) + } + if _, err = os.Stat(".git"); err == nil { cmd := exec.Command("git", "describe", "--abbrev=0", "--tags", "HEAD") var outb, errb bytes.Buffer @@ -2095,7 +2112,7 @@ func generateNSIS(output string, dllPaths []string) { } glog.Info("Feeding NSIS compiler...") if runtime.GOOS == "windows" { - cmdRun([]string{"C:\\Program Files (x86)\\NSIS\\makensis.exe", "/XSetCompressor /FINAL lzma", "yass.nsi"}, true) + cmdRun([]string{"makensis.exe", "/XSetCompressor /FINAL lzma", "yass.nsi"}, true) } else { cmdRun([]string{"makensis", "-XSetCompressor /FINAL lzma", "yass.nsi"}, true) } @@ -2104,7 +2121,7 @@ func generateNSIS(output string, dllPaths []string) { func generateNSISSystemInstaller(output string) { glog.Info("Feeding CPack NSIS compiler...") if runtime.GOOS == "windows" { - cmdRun([]string{"C:\\Program Files\\CMake\\bin\\cpack.exe"}, true) + cmdRun([]string{"cpack.exe"}, true) } else { cmdRun([]string{"cpack"}, true) } @@ -2317,7 +2334,7 @@ func postStateArchives() map[string][]string { func get7zPath() string { if runtime.GOOS == "windows" { - return "C:\\Program Files\\7-Zip\\7z.exe" + return "7z.exe" } else { return "7z" } diff --git a/yass/yass.spec.in b/yass/yass.spec.in index 84600faac8..1ae9d4b5f5 100644 --- a/yass/yass.spec.in +++ b/yass/yass.spec.in @@ -259,6 +259,9 @@ for embedded devices and low end boxes. %systemd_postun_with_restart yass-redir.service %changelog +* Mon Jun 3 2024 Chilledheart - 1.10.5-1 + - miscellaneous fixes + - fix gtk3 wayland app icon issue * Fri May 31 2024 Chilledheart - 1.10.4-1 - miscellaneous fixes * Sun May 26 2024 Chilledheart - 1.10.3-1 diff --git a/yt-dlp/README.md b/yt-dlp/README.md index e8cd6d3a06..42ffd9b520 100644 --- a/yt-dlp/README.md +++ b/yt-dlp/README.md @@ -262,7 +262,7 @@ You can also run `make yt-dlp` instead to compile only the binary without updati ### Standalone Py2Exe Builds (Windows) -While we provide the option to build with [py2exe](https://www.py2exe.org), it is recommended to build [using PyInstaller](#standalone-pyinstaller-builds) instead since the py2exe builds **cannot contain `pycryptodomex`/`certifi` and need VC++14** on the target computer to run. +While we provide the option to build with [py2exe](https://www.py2exe.org), it is recommended to build [using PyInstaller](#standalone-pyinstaller-builds) instead since the py2exe builds **cannot contain `pycryptodomex`/`certifi`/`requests` and need VC++14** on the target computer to run. If you wish to build it anyway, install Python (if it is not already installed) and you can run the following commands: diff --git a/yt-dlp/bundle/py2exe.py b/yt-dlp/bundle/py2exe.py index 2811674925..5fbe55e465 100755 --- a/yt-dlp/bundle/py2exe.py +++ b/yt-dlp/bundle/py2exe.py @@ -42,9 +42,9 @@ def main(): # py2exe cannot import Crypto 'Crypto', 'Cryptodome', - # py2exe appears to confuse this with our socks library. - # We don't use pysocks and urllib3.contrib.socks would fail to import if tried. - 'urllib3.contrib.socks' + # requests >=2.32.0 breaks py2exe builds due to certifi dependency + 'requests', + 'urllib3' ], 'dll_excludes': ['w9xpopen.exe', 'crypt32.dll'], # Modules that are only imported dynamically must be added here diff --git a/yt-dlp/pyproject.toml b/yt-dlp/pyproject.toml index b746fbc964..da6403ec7c 100644 --- a/yt-dlp/pyproject.toml +++ b/yt-dlp/pyproject.toml @@ -46,7 +46,7 @@ dependencies = [ "certifi", "mutagen", "pycryptodomex", - "requests>=2.31.0,<3", + "requests>=2.32.2,<3", "urllib3>=1.26.17,<3", "websockets>=12.0", ] @@ -82,7 +82,6 @@ pyinstaller = [ ] py2exe = [ "py2exe>=0.12", - "requests==2.31.*", ] [project.urls] diff --git a/yt-dlp/yt_dlp/networking/_requests.py b/yt-dlp/yt_dlp/networking/_requests.py index 6397a2c0ca..bf6fa634dd 100644 --- a/yt-dlp/yt_dlp/networking/_requests.py +++ b/yt-dlp/yt_dlp/networking/_requests.py @@ -21,8 +21,8 @@ urllib3_version = tuple(int_or_none(x, default=0) for x in urllib3.__version__.s if urllib3_version < (1, 26, 17): raise ImportError('Only urllib3 >= 1.26.17 is supported') -if requests.__build__ < 0x023100: - raise ImportError('Only requests >= 2.31.0 is supported') +if requests.__build__ < 0x023202: + raise ImportError('Only requests >= 2.32.2 is supported') import requests.adapters import requests.utils @@ -182,14 +182,9 @@ class RequestsHTTPAdapter(requests.adapters.HTTPAdapter): return super().proxy_manager_for(proxy, **proxy_kwargs, **self._pm_args, **extra_kwargs) # Skip `requests` internal verification; we use our own SSLContext - # requests 2.31.0+ def cert_verify(*args, **kwargs): pass - # requests 2.31.0-2.32.1 - def _get_connection(self, request, *_, proxies=None, **__): - return self.get_connection(request.url, proxies) - # requests 2.32.2+: Reimplementation without `_urllib3_request_context` def get_connection_with_tls_context(self, request, verify, proxies=None, cert=None): url = urllib3.util.parse_url(request.url).url